예제 #1
0
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));
}
예제 #2
0
파일: IGCParser.cpp 프로젝트: Advi42/XCSoar
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;
}
예제 #3
0
파일: Logger.cpp 프로젝트: Andy-1954/XCSoar
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;
}
예제 #4
0
파일: IGCParser.cpp 프로젝트: Advi42/XCSoar
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;
}