Esempio n. 1
0
void
FormatIGCFilenameLong(TCHAR* buffer, const BrokenDate &date,
                      const char *manufacturer, const char *logger_id,
                      unsigned flight_number)
{
  assert(manufacturer != NULL);
  assert(strlen(manufacturer) == 3);

  assert(logger_id != NULL);
  assert(strlen(logger_id) == 3);

  TCHAR manufacturer_t[4], logger_id_t[4];
  /* poor man's char->TCHAR converted; this works because we know
     we're dealing with ASCII only */
  std::copy(manufacturer, manufacturer + 4, manufacturer_t);
  std::copy(logger_id, logger_id + 4, logger_id_t);

  FormatIGCFilenameLong(buffer, date, manufacturer_t, logger_id_t,
                        flight_number);
}
Esempio n. 2
0
bool
LoggerImpl::StartLogger(const NMEAInfo &gps_info,
                        const LoggerSettings &settings,
                        const char *logger_id)
{
  assert(logger_id != NULL);
  assert(strlen(logger_id) == 3);

  /* finish the previous IGC file */
  StopLogger(gps_info);

  assert(writer == NULL);

  LocalPath(filename, _T("logs"));
  Directory::Create(filename);

  const BrokenDate today = gps_info.date_time_utc.IsDatePlausible()
    ? (const BrokenDate &)gps_info.date_time_utc
    : BrokenDate::TodayUTC();

  StaticString<64> name;
  for (int i = 1; i < 99; i++) {
    FormatIGCFilenameLong(name.buffer(), today, "XCS", logger_id, i);

    LocalPath(filename, _T("logs"), name);
    if (!File::Exists(filename))
      break;  // file not exist, we'll use this name
  }

  frecord.Reset();
  writer = new IGCWriter(filename);
  if (!writer->IsOpen()) {
    LogFormat(_T("Failed to create file %s"), filename);
    delete writer;
    writer = nullptr;
    return false;
  }

  LogFormat(_T("Logger Started: %s"), filename);
  return true;
}
Esempio n. 3
0
bool
LoggerImpl::StartLogger(const NMEAInfo &gps_info,
                        const LoggerSettings &settings,
                        const char *logger_id)
{
  assert(logger_id != nullptr);
  assert(strlen(logger_id) == 3);

  /* finish the previous IGC file */
  StopLogger(gps_info);

  assert(writer == nullptr);

  const auto logs_path = MakeLocalPath(_T("logs"));

  const BrokenDate today = gps_info.date_time_utc.IsDatePlausible()
    ? (const BrokenDate &)gps_info.date_time_utc
    : BrokenDate::TodayUTC();

  StaticString<64> name;
  for (int i = 1; i < 99; i++) {
    FormatIGCFilenameLong(name.buffer(), today, "XCS", logger_id, i);

    filename = AllocatedPath::Build(logs_path, name);
    if (!File::Exists(filename))
      break;  // file not exist, we'll use this name
  }

  frecord.Reset();

  try {
    writer = new IGCWriter(filename);
  } catch (...) {
    LogError(std::current_exception());
    return false;
  }

  LogFormat(_T("Logger Started: %s"), filename.c_str());
  return true;
}
Esempio n. 4
0
void
ExternalLogger::DownloadFlightFrom(DeviceDescriptor &device)
{
  MessageOperationEnvironment env;

  // Download the list of flights that the logger contains
  RecordedFlightList flight_list;
  switch (DoReadFlightList(device, flight_list)) {
  case TriStateJobResult::SUCCESS:
    break;

  case TriStateJobResult::ERROR:
    device.EnableNMEA(env);
    ShowMessageBox(_("Failed to download flight list."),
                _("Download flight"), MB_OK | MB_ICONERROR);
    return;

  case TriStateJobResult::CANCELLED:
    return;
  }

  // The logger seems to be empty -> cancel
  if (flight_list.empty()) {
    device.EnableNMEA(env);
    ShowMessageBox(_("Logger is empty."),
                _("Download flight"), MB_OK | MB_ICONINFORMATION);
    return;
  }

  while (true) {
    // Show list of the flights
    const RecordedFlightInfo *flight = ShowFlightList(flight_list);
    if (!flight)
      break;

    // Download chosen IGC file into temporary file
    TCHAR path[MAX_PATH];
    LocalPath(path, _T("logs"), _T("temp.igc"));
    switch (DoDownloadFlight(device, *flight, path)) {
    case TriStateJobResult::SUCCESS:
      break;

    case TriStateJobResult::ERROR:
      // Delete temporary file
      File::Delete(path);
      ShowMessageBox(_("Failed to download flight."),
                  _("Download flight"), MB_OK | MB_ICONERROR);
      continue;

    case TriStateJobResult::CANCELLED:
      // Delete temporary file
      File::Delete(path);
      continue;
    }

    /* read the IGC header and build the final IGC file name with it */

    IGCHeader header;
    BrokenDate date;
    ReadIGCMetaData(path, header, date);
    if (header.flight == 0)
      header.flight = GetFlightNumber(flight_list, *flight);

    TCHAR name[64];
    FormatIGCFilenameLong(name, date, header.manufacturer, header.id,
                          header.flight);

    TCHAR final_path[MAX_PATH];
    LocalPath(final_path, _T("logs"), name);

    // Remove a file with the same name if it exists
    if (File::Exists(final_path))
      File::Delete(final_path);

    // Rename the temporary file to the actual filename
    File::Rename(path, final_path);

    if (ShowMessageBox(_("Do you want to download another flight?"),
                    _("Download flight"), MB_YESNO | MB_ICONQUESTION) != IDYES)
      break;
  }

  device.EnableNMEA(env);
}
Esempio n. 5
0
void
ExternalLogger::DownloadFlightFrom(DeviceDescriptor &device)
{
    MessageOperationEnvironment env;

    // Download the list of flights that the logger contains
    RecordedFlightList flight_list;
    switch (DoReadFlightList(device, flight_list)) {
    case TriStateJobResult::SUCCESS:
        break;

    case TriStateJobResult::ERROR:
        device.EnableNMEA(env);
        ShowMessageBox(_("Failed to download flight list."),
                       _("Download flight"), MB_OK | MB_ICONERROR);
        return;

    case TriStateJobResult::CANCELLED:
        return;
    }

    // The logger seems to be empty -> cancel
    if (flight_list.empty()) {
        device.EnableNMEA(env);
        ShowMessageBox(_("Logger is empty."),
                       _("Download flight"), MB_OK | MB_ICONINFORMATION);
        return;
    }

    const auto logs_path = MakeLocalPath(_T("logs"));

    while (true) {
        // Show list of the flights
        const RecordedFlightInfo *flight = ShowFlightList(flight_list);
        if (!flight)
            break;

        // Download chosen IGC file into temporary file
        FileTransaction transaction(AllocatedPath::Build(logs_path,
                                    _T("temp.igc")));
        switch (DoDownloadFlight(device, *flight, transaction.GetTemporaryPath())) {
        case TriStateJobResult::SUCCESS:
            break;

        case TriStateJobResult::ERROR:
            ShowMessageBox(_("Failed to download flight."),
                           _("Download flight"), MB_OK | MB_ICONERROR);
            continue;

        case TriStateJobResult::CANCELLED:
            continue;
        }

        /* read the IGC header and build the final IGC file name with it */

        IGCHeader header;
        BrokenDate date;
        ReadIGCMetaData(transaction.GetTemporaryPath(), header, date);
        if (header.flight == 0)
            header.flight = GetFlightNumber(flight_list, *flight);

        TCHAR name[64];
        FormatIGCFilenameLong(name, date, header.manufacturer, header.id,
                              header.flight);

        transaction.SetPath(AllocatedPath::Build(logs_path, name));
        transaction.Commit();

        if (ShowMessageBox(_("Do you want to download another flight?"),
                           _("Download flight"), MB_YESNO | MB_ICONQUESTION) != IDYES)
            break;
    }

    device.EnableNMEA(env);
}