예제 #1
0
// TODO: fix scope so only gui things can start it
void
LoggerImpl::StartLogger(const NMEAInfo &gps_info,
                        const LoggerSettings &settings,
                        const TCHAR *asset_number, const Declaration &decl)
{
  if (!settings.logger_id.empty())
    asset_number = settings.logger_id.c_str();

  // chars must be legal in file names
  char logger_id[4];
  unsigned asset_length = _tcslen(asset_number);
  for (unsigned i = 0; i < 3; i++)
    logger_id[i] = i < asset_length && IsAlphaNumericASCII(asset_number[i]) ?
                   asset_number[i] : _T('A');
  logger_id[3] = _T('\0');

  if (!StartLogger(gps_info, settings, logger_id))
    return;

  simulator = gps_info.location_available && !gps_info.gps.real;
  writer->WriteHeader(gps_info.date_time_utc, decl.pilot_name,
                      decl.aircraft_type, decl.aircraft_registration,
                      decl.competition_id,
                      logger_id, GetGPSDeviceName(), simulator);

  if (decl.Size()) {
    BrokenDateTime FirstDateTime = !pre_takeoff_buffer.empty()
      ? pre_takeoff_buffer.peek().date_time_utc
      : gps_info.date_time_utc;
    writer->StartDeclaration(FirstDateTime, decl.Size());

    for (unsigned i = 0; i< decl.Size(); ++i)
      writer->AddDeclaration(decl.GetLocation(i), decl.GetName(i));

    writer->EndDeclaration();
  }
}
예제 #2
0
파일: IGCParser.cpp 프로젝트: Advi42/XCSoar
static bool
CheckThreeAlphaNumeric(const char *src)
{
  return IsAlphaNumericASCII(src[0]) && IsAlphaNumericASCII(src[1]) &&
    IsAlphaNumericASCII(src[2]);
}
예제 #3
0
inline void
TTYKeyboard::HandleInputByte(char ch)
{
  switch (ch) {
  case 0x03:
    /* user has pressed Ctrl-C */
    input_state = InputState::NONE;
    queue.Push(Event::CLOSE);
    return;

  case ' ':
    input_state = InputState::NONE;
    queue.PushKeyPress(ch);
    return;

  case 0x0d:
    input_state = InputState::NONE;
    queue.PushKeyPress(KEY_RETURN);
    return;

  case 0x1b:
    if (input_state == InputState::ESCAPE)
      queue.PushKeyPress(KEY_ESCAPE);
    else
      input_state = InputState::ESCAPE;
    return;
  }

  switch (input_state) {
  case InputState::NONE:
    break;

  case InputState::ESCAPE:
    if (ch == '[')
      input_state = InputState::ESCAPE_BRACKET;
    else
      input_state = InputState::NONE;
    return;

  case InputState::ESCAPE_BRACKET:
    input_state = InputState::NONE;
    switch (ch) {
    case 'A':
      queue.PushKeyPress(KEY_UP);
      break;

    case 'B':
      queue.PushKeyPress(KEY_DOWN);
      break;

    case 'C':
      queue.PushKeyPress(KEY_RIGHT);
      break;

    case 'D':
      queue.PushKeyPress(KEY_LEFT);
      break;

    case '[':
      input_state = InputState::ESCAPE_BRACKET2;
      break;

    default:
      if (ch >= '0' && ch <= '9') {
        input_state = InputState::ESCAPE_NUMBER;
        input_number = ch - '0';
      } else
        input_state = InputState::NONE;
    }

    return;

  case InputState::ESCAPE_BRACKET2:
    switch (ch) {
    case 'A':
      queue.PushKeyPress(KEY_F1);
      break;

    case 'B':
      queue.PushKeyPress(KEY_F2);
      break;

    case 'C':
      queue.PushKeyPress(KEY_F3);
      break;

    case 'D':
      queue.PushKeyPress(KEY_F4);
      break;

    case 'E':
      queue.PushKeyPress(KEY_F5);
      break;

    default:
      input_state = InputState::NONE;
    }

    return;

  case InputState::ESCAPE_NUMBER:
    if (IsDigitASCII(ch))
      input_number = input_number * 10 + ch - '0';
    else {
      input_state = InputState::NONE;
      if (ch == '~') {
        if (input_number >= 11 && input_number <= 16)
          queue.PushKeyPress(KEY_F1 + input_number - 11);
        else if (input_number >= 17 && input_number <= 21)
          queue.PushKeyPress(KEY_F6 + input_number - 17);
        else if (input_number >= 23 && input_number <= 24)
          queue.PushKeyPress(KEY_F11 + input_number - 23);
      }
    }

    return;
  }

  if (IsAlphaNumericASCII(ch)) {
      queue.PushKeyPress(ch);
      return;
  }
}