示例#1
0
文件: cfile.cpp 项目: paud/d2x-xl
void CFile::WriteVector (const CFixVector& v)
{
WriteFix (v [X]);
WriteFix (v [Y]);
WriteFix (v [Z]);
}
示例#2
0
bool
IMI::FlightDownload(Port &port, const RecordedFlightInfo &flight_info,
                    Path path, OperationEnvironment &env)
{
  if (!_connected)
    return false;

  MessageParser::Reset();

  Flight flight;
  if (!FlashRead(port, &flight, flight_info.internal.imi, sizeof(flight), env))
    return false;

  FILE *fileIGC = _tfopen(path.c_str(), _T("w+b"));
  if (fileIGC == nullptr)
    return false;

  unsigned fixesCount = COMM_MAX_PAYLOAD_SIZE / sizeof(Fix);
  Fix *fixBuffer = (Fix*)malloc(sizeof(Fix) * fixesCount);
  if (fixBuffer == nullptr)
    return false;

  bool ok = true;

  WriteHeader(flight.decl, flight.signature.tampered, fileIGC);

  int noenl = 0;
  if ((flight.decl.header.sensor & IMINO_ENL_MASK) != 0)
    noenl = 1;

  unsigned address = flight_info.internal.imi + sizeof(flight);

  unsigned fixesRemains = flight.finish.fixes;
  while (ok && fixesRemains) {
    unsigned fixesToRead = fixesRemains;
    if (fixesToRead > fixesCount)
      fixesToRead = fixesCount;

    if (!FlashRead(port, fixBuffer, address, fixesToRead * sizeof(Fix), env))
      ok = false;

    for (unsigned i = 0; ok && i < fixesToRead; i++) {
      const Fix *pFix = fixBuffer + i;
      if (IMIIS_FIX(pFix->id))
        WriteFix(*pFix, false, noenl, fileIGC);
    }

    address = address + fixesToRead * sizeof(Fix);
    fixesRemains -= fixesToRead;

    if (env.IsCancelled())
      // canceled by user
      ok = false;
  }

  free(fixBuffer);

  if (ok)
    WriteSignature(flight.signature, flight.decl.header.sn, fileIGC);

  fclose(fileIGC);

  if (!ok)
    File::Delete(Path(path));

  return ok;
}
示例#3
0
void
IMI::WriteFix(const Fix &fix, bool fromB2, int no_enl, FILE *file)
{
  bool append_line_break = false;

  unsigned offset = __builtin_offsetof(Fix, checksum);
  if (fix.checksum != FixChecksum(&fix, offset)) {
    fixBLastFull.id = 0;
    return;
  }

  if (fix.id == IMIFIX_ID_B_RECORD) {
    const FixB *fix_b = (const FixB *)&fix;
    AngleConverter angle;

    fputc('B', file);
    BrokenTime time = ConvertToDateTime(fix.time);
    fprintf(file, "%02d%02d%02d", time.hour, time.minute, time.second);

    angle.value = (IMIDWORD)fix_b->lat;
    fprintf(file, "%02d%05d", angle.degrees, angle.milliminutes);

    fputc((angle.sign) ? 'S' : 'N', file);

    angle.value = (IMIDWORD)fix_b->lon;
    fprintf(file, "%03d%05d", angle.degrees, angle.milliminutes);

    fputc((angle.sign) ? 'W' : 'E', file);

    fputc("VA??"[fix_b->fv], file);

    int alt = (int)fix_b->alt - 1000;
    fprintf(file, alt < 0 ? "%04d" : "%05d", alt);
    int gpsalt = (int)fix_b->gpsalt - 1000;
    fprintf(file, alt < 0 ? "%04d" : "%05d", gpsalt);

    fprintf(file, "%03d", fix_b->fxa);
    fprintf(file, "%02d", siu);

    if (!no_enl)
      fprintf(file, "%03d", fix_b->enl);

    append_line_break = true;

    if (!fromB2)
      memcpy(&fixBLastFull, &fix, sizeof(fixBLastFull));
  } else if (fix.id == IMIFIX_ID_B2_RECORD) {
    const FixB2 *fix_b2 = (const FixB2 *)&fix;
    if (SplitB2Fix(fix_b2, &fixBLastFull, &fixB1, &fixB2)) {
      WriteFix(*(Fix*)&fixB1, true, no_enl, file);
      WriteFix(*(Fix*)&fixB2, true, no_enl, file);
    }
  } else if (fix.id == IMIFIX_ID_K_RECORD) {
    const FixK *fix_k = (const FixK *)&fix;

    fputc('K', file);
    BrokenTime time = ConvertToDateTime(fix.time);
    fprintf(file, "%02d%02d%02d", time.hour, time.minute, time.second);

    fprintf(file, "%03d", fix_k->hdt);
    fprintf(file, "%03d", fix_k->gsp);
    append_line_break = true;
  } else if (fix.id == IMIFIX_ID_E_RECORD) {
    const FixE *fix_e = (const FixE *)&fix;
    if (fix_e->type == IMIFIX_E_TYPE_SATELLITES) {
      siu = 0;
      fputc('F', file);
      BrokenTime time = ConvertToDateTime(fix.time);
      fprintf(file, "%02d%02d%02d", time.hour, time.minute, time.second);

      for (unsigned i = 0; i < sizeof(fix_e->text); i++) {
        if (fix_e->text[i] > 0) {
          fprintf(file, "%02d", fix_e->text[i]);
          siu++;
        }
      }
      append_line_break = true;
    } else if (fix_e->type == IMIFIX_E_TYPE_COMMENT) {
      fputs("LIMI", file);
      BrokenTime time = ConvertToDateTime(fix.time);
      fprintf(file, "%02d%02d%02d", time.hour, time.minute, time.second);
      WriteString((const char *)fix_e->text, sizeof(fix_e->text), file);

      append_line_break = true;
    } else if (fix_e->type == IMIFIX_E_TYPE_PEV) {
      fputc('E', file);
      BrokenTime time = ConvertToDateTime(fix.time);
      fprintf(file, "%02d%02d%02d", time.hour, time.minute, time.second);
      WriteString((const char *)fix_e->text, sizeof(fix_e->text), file);

      append_line_break = true;
    } else if (fix_e->type == IMIFIX_E_TYPE_TASK) {
      fputc('E', file);
      BrokenTime time = ConvertToDateTime(fix.time);
      fprintf(file, "%02d%02d%02d", time.hour, time.minute, time.second);

      if (fix_e->text[0] == 1) {
        fputs("STA", file);
        WriteString((const char *)fix_e->text + 2, sizeof(fix_e->text) - 2, file);
      } else {
        if (fix_e->text[0] == 2)
          fputs("ONT", file);
        else if (fix_e->text[0] == 3)
          fputs("FIN", file);
        else
          fputs("TPC", file);

        fprintf(file, "%02d", fix_e->text[1]);
        WriteString((const char *)fix_e->text + 2, sizeof(fix_e->text) - 2, file);
      }

      append_line_break = true;
    }
  }

  if (append_line_break)
    fputs("\r\n", file);
}