static void TestFixTime() { BrokenTime time; ok1(!IGCParseTime("", time)); ok1(IGCParseTime("000000", time)); ok1(time == BrokenTime(00, 00, 00)); ok1(IGCParseTime("112238", time)); ok1(time == BrokenTime(11, 22, 38)); ok1(IGCParseTime("235959", time)); ok1(time == BrokenTime(23, 59, 59)); ok1(!IGCParseTime("235960", time)); ok1(!IGCParseTime("236059", time)); ok1(!IGCParseTime("240000", time)); ok1(IGCParseTime("0123375103117N00742367EV0049000487", time)); ok1(time == BrokenTime(01, 23, 37)); }
bool IGCParseDeclarationHeader(const char *line, IGCDeclarationHeader &header) { if (*line != 'C' || strlen(line) < 25) return false; if (!IGCParseDate(line + 1, header.datetime)) return false; if (!IGCParseTime(line + 7, header.datetime)) return false; if (!IGCParseDate(line + 13, header.flight_date)) header.flight_date.Clear(); if (!sscanf(line + 23, "%02u", &header.num_turnpoints) || header.num_turnpoints > 99) return false; std::copy(line + 19, line + 23, header.task_id); header.task_name = line + 25; return true; }
bool FlytecDevice::DownloadFlight(const RecordedFlightInfo &flight, Path path, OperationEnvironment &env) { port.StopRxThread(); PeriodClock status_clock; status_clock.Update(); // Request flight record char buffer[256]; sprintf(buffer, "$PBRTR,%02d", flight.internal.flytec); AppendNMEAChecksum(buffer); strcat(buffer, "\r\n"); port.Write(buffer); if (!ExpectXOff(port, env, 1000)) return false; // Open file writer FileHandle writer(path, _T("wb")); if (!writer.IsOpen()) return false; unsigned start_sec = flight.start_time.GetSecondOfDay(); unsigned end_sec = flight.end_time.GetSecondOfDay(); if (end_sec < start_sec) end_sec += 24 * 60 * 60; unsigned range = end_sec - start_sec; env.SetProgressRange(range); while (true) { // Check if the user cancelled the operation if (env.IsCancelled()) return false; // Receive the next line if (!ReceiveLine(port, buffer, ARRAY_SIZE(buffer), 1000)) return false; // XON was received if (StringIsEmpty(buffer)) break; if (status_clock.CheckUpdate(250) && *buffer == 'B') { // Parse the fix time BrokenTime time; if (IGCParseTime(buffer + 1, time)) { unsigned time_sec = time.GetSecondOfDay(); if (time_sec < start_sec) time_sec += 24 * 60 * 60; if (time_sec > end_sec + 5 * 60) time_sec = start_sec; unsigned position = time_sec - start_sec; if (position > range) position = range; env.SetProgressPosition(position); } } // Write line to the file writer.Write(buffer); } return true; }
bool IGCParseFix(const char *buffer, const IGCExtensions &extensions, IGCFix &fix) { if (*buffer != 'B') return false; BrokenTime time; if (!IGCParseTime(buffer + 1, time)) return false; char valid_char; int gps_altitude, pressure_altitude; if (sscanf(buffer + 24, "%c%05d%05d", &valid_char, &pressure_altitude, &gps_altitude) != 3) return false; if (valid_char == 'A') fix.gps_valid = true; else if (valid_char == 'V') fix.gps_valid = false; else return false; fix.gps_altitude = gps_altitude; fix.pressure_altitude = pressure_altitude; if (!IGCParseLocation(buffer + 7, fix.location)) return false; fix.time = time; fix.ClearExtensions(); const size_t line_length = strlen(buffer); for (auto i = extensions.begin(), end = extensions.end(); i != end; ++i) { const IGCExtension &extension = *i; assert(extension.start > 0); assert(extension.finish >= extension.start); if (extension.finish > line_length) /* exceeds the input line length */ continue; const char *start = buffer + extension.start - 1; const char *finish = buffer + extension.finish; if (StringIsEqual(extension.code, "ENL")) ParseExtensionValue(start, finish, fix.enl); else if (StringIsEqual(extension.code, "RPM")) ParseExtensionValue(start, finish, fix.rpm); else if (StringIsEqual(extension.code, "HDM")) ParseExtensionValue(start, finish, fix.hdm); else if (StringIsEqual(extension.code, "HDT")) ParseExtensionValue(start, finish, fix.hdt); else if (StringIsEqual(extension.code, "TRM")) ParseExtensionValue(start, finish, fix.trm); else if (StringIsEqual(extension.code, "TRT")) ParseExtensionValue(start, finish, fix.trt); else if (StringIsEqual(extension.code, "GSP")) ParseExtensionValueN(start, finish, 3, fix.gsp); else if (StringIsEqual(extension.code, "IAS")) ParseExtensionValueN(start, finish, 3, fix.ias); else if (StringIsEqual(extension.code, "TAS")) ParseExtensionValueN(start, finish, 3, fix.tas); else if (StringIsEqual(extension.code, "SIU")) ParseExtensionValue(start, finish, fix.siu); } return true; }