void CFile::WriteVector (const CFixVector& v) { WriteFix (v [X]); WriteFix (v [Y]); WriteFix (v [Z]); }
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; }
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); }