Exemple #1
0
bool
VolksloggerDevice::Declare(const Declaration *decl)
{
  ProgressGlue::Create(_("Comms with Volkslogger"));

  vl.set_port(port);
  nturnpoints = 0;

  int err;
  if((err = vl.open(1, 20, 1, 38400L)) != VLA_ERR_NOERR) {
    //    _isConnected = false;
  }
  else {
    //    _isConnected = true;
  }

  if (err == VLA_ERR_NOERR) {
    if ((err = vl.read_info()) == VLA_ERR_NOERR) {
      //      vl.read_db_and_declaration();
    }

    char temp[100];
    sprintf(temp, "%S", decl->PilotName);
    strncpy(vl.declaration.flightinfo.pilot, temp, 64);

    sprintf(temp, "%S", decl->AircraftRego);
    strncpy(vl.declaration.flightinfo.competitionid, temp, 3);

    sprintf(temp, "%S", decl->AircraftType);
    strncpy(vl.declaration.flightinfo.competitionclass, temp, 12);

#ifdef OLD_TASK
    if (way_points.verify_index(XCSoarInterface::SettingsComputer().HomeWaypoint)) {
      const WAYPOINT &way_point = way_points.get(XCSoarInterface::SettingsComputer().HomeWaypoint);

      sprintf(temp, "%S", way_point.Name);

      strncpy(vl.declaration.flightinfo.homepoint.name, temp, 6);
      vl.declaration.flightinfo.homepoint.lon = way_point.Location.Longitude;
      vl.declaration.flightinfo.homepoint.lat = way_point.Location.Latitude;
    }
#endif

  }

  if (err != VLA_ERR_NOERR)
    return false;

  unsigned i;
  for (i = 0; i < decl->size(); i++)
    VLDeclAddWayPoint(decl->waypoints[i]);

  vl.declaration.task.nturnpoints = (nturnpoints<=2)? 0: std::min(nturnpoints-2, (unsigned)12);

#ifdef OLD_TASK
  const SETTINGS_TASK settings = task.getSettings();

  // start..
  switch(settings.StartType) {
  case START_CIRCLE:
    vl.declaration.task.startpoint.oztyp = VLAPI_DATA::DCLWPT::OZTYP_CYLSKT;
    vl.declaration.task.startpoint.lw = min(1500,settings.StartRadius);
    vl.declaration.task.startpoint.rz = min(1500,settings.StartRadius);
    vl.declaration.task.startpoint.rs = 0;
    break;
  case START_LINE:
    vl.declaration.task.startpoint.oztyp = VLAPI_DATA::DCLWPT::OZTYP_LINE;
    vl.declaration.task.startpoint.lw = min(1500,settings.StartRadius*2);
    vl.declaration.task.startpoint.rs = 0;
    vl.declaration.task.startpoint.rz = 0;
    break;
  case START_SECTOR:
    vl.declaration.task.startpoint.oztyp = VLAPI_DATA::DCLWPT::OZTYP_CYLSKT;
    vl.declaration.task.startpoint.lw = min(1500,settings.StartRadius);
    vl.declaration.task.startpoint.rz = 0;
    vl.declaration.task.startpoint.rs = min(1500,settings.StartRadius);
    break;
  }
  vl.declaration.task.startpoint.ws = 360;

  // rest of task...
  for (i=0; i<nturnpoints; i++) {
    // note this is for non-aat only!
    switch (settings.SectorType) {
    case 0: // cylinder
      vl.declaration.task.turnpoints[i].oztyp = VLAPI_DATA::DCLWPT::OZTYP_CYLSKT;
      vl.declaration.task.turnpoints[i].rz = settings.SectorRadius;
      vl.declaration.task.turnpoints[i].rs = 0;
      vl.declaration.task.turnpoints[i].lw = 0;
      break;
    case 1: // sector
      vl.declaration.task.turnpoints[i].oztyp = VLAPI_DATA::DCLWPT::OZTYP_CYLSKT;
      vl.declaration.task.turnpoints[i].rz = 0;
      vl.declaration.task.turnpoints[i].rs = 15000;
      vl.declaration.task.turnpoints[i].lw = 0;
      break;
    case 2: // German DAe 0.5/10
      vl.declaration.task.turnpoints[i].oztyp = VLAPI_DATA::DCLWPT::OZTYP_CYLSKT;
      vl.declaration.task.turnpoints[i].rz = 500;
      vl.declaration.task.turnpoints[i].rs = 10000;
      vl.declaration.task.turnpoints[i].lw = 0;
      break;
    };
    vl.declaration.task.turnpoints[i].ws = 360; // auto direction

  }

  // Finish
  switch(settings.FinishType) {
  case FINISH_CIRCLE:
    vl.declaration.task.finishpoint.oztyp = VLAPI_DATA::DCLWPT::OZTYP_CYLSKT;
    vl.declaration.task.finishpoint.lw = min(1500,settings.FinishRadius);
    vl.declaration.task.finishpoint.rz = min(1500,settings.FinishRadius);
    vl.declaration.task.finishpoint.rs = 0;
    break;
  case FINISH_LINE:
    vl.declaration.task.finishpoint.oztyp = VLAPI_DATA::DCLWPT::OZTYP_LINE;
    vl.declaration.task.finishpoint.lw = settings.FinishRadius*2;
    vl.declaration.task.finishpoint.rz = 0;
    vl.declaration.task.finishpoint.rs = 0;
    break;
  case FINISH_SECTOR:
    vl.declaration.task.finishpoint.oztyp = VLAPI_DATA::DCLWPT::OZTYP_CYLSKT;
    vl.declaration.task.finishpoint.lw = min(1500,settings.FinishRadius);
    vl.declaration.task.finishpoint.rz = 0;
    vl.declaration.task.finishpoint.rs = min(1500,settings.FinishRadius);
    break;
  }
  vl.declaration.task.finishpoint.ws = 360;
#endif

  bool ok = (vl.write_db_and_declaration() == VLA_ERR_NOERR);

  vl.close(1);

  ProgressGlue::Close();

  return ok;
}
Exemple #2
0
BOOL VLDeclare(PDeviceDescriptor_t d, Declaration_t *decl, unsigned errBufferLen, TCHAR errBuffer[])
{
  vl.set_device(d);
  nturnpoints = 0;

  const unsigned BUFF_LEN = 128;
  TCHAR buffer[BUFF_LEN];
  int err = VLA_ERR_NOERR;

  // LKTOKEN  _@M1400_ = "Task declaration"
  // LKTOKEN  _@M1404_ = "Opening connection"
  _sntprintf(buffer, BUFF_LEN, _T("%s: %s..."), MsgToken(1400), MsgToken(1404));
  CreateProgressDialog(buffer);
  if((err = vl.open(1, 20, 1, 38400L)) != VLA_ERR_NOERR) {
    // LKTOKEN  _@M1411_ = "Device not connected!"
    _tcsncpy(errBuffer, MsgToken(1411), errBufferLen);
    return FALSE;
  }

  // LKTOKEN  _@M1400_ = "Task declaration"
  // LKTOKEN  _@M1405_ = "Testing connection"
  _sntprintf(buffer, BUFF_LEN, _T("%s: %s..."), MsgToken(1400), MsgToken(1405));
  CreateProgressDialog(buffer);
  if((err = vl.read_info()) != VLA_ERR_NOERR) {
    // LKTOKEN  _@M1414_ = "Device not responsive!"
    _tcsncpy(errBuffer, MsgToken(1414), errBufferLen);
    return FALSE;
  }

  TCHAR2usascii(decl->PilotName, vl.declaration.flightinfo.pilot, 66);
  vl.declaration.flightinfo.pilot[64]='\0';

  TCHAR2usascii(decl->AircraftRego, vl.declaration.flightinfo.gliderid, 8);
  vl.declaration.flightinfo.gliderid[7]='\0';

  TCHAR2usascii(decl->AircraftType, vl.declaration.flightinfo.glidertype, 13);
  vl.declaration.flightinfo.glidertype[12]='\0';

  TCHAR2usascii(decl->CompetitionID, vl.declaration.flightinfo.competitionid, 4);
  vl.declaration.flightinfo.competitionid[3]='\0'; // BUGFIX 100331

  TCHAR2usascii(decl->CompetitionClass, vl.declaration.flightinfo.competitionclass, 13);
  vl.declaration.flightinfo.competitionclass[12]='\0'; // BUGFIX 100331

  if (ValidWayPoint(HomeWaypoint)) {

    TCHAR2usascii(WayPointList[HomeWaypoint].Name, vl.declaration.flightinfo.homepoint.name, 7);
    vl.declaration.flightinfo.homepoint.name[6]='\0'; // BUGFIX 100331

    vl.declaration.flightinfo.homepoint.lon =
      WayPointList[HomeWaypoint].Longitude;
    vl.declaration.flightinfo.homepoint.lat =
      WayPointList[HomeWaypoint].Latitude;
  }

  int i;
  for (i = 0; i < decl->num_waypoints; i++)
    VLDeclAddWayPoint(d, decl->waypoint[i]);

  vl.declaration.task.nturnpoints = max(min(nturnpoints-2, 12), 0);

  LockTaskData();

  // start..
  switch(StartLine) {
  case 0: // cylinder
    vl.declaration.task.startpoint.oztyp = VLAPI_DATA::DCLWPT::OZTYP_CYLSKT;
    vl.declaration.task.startpoint.lw = min(1500,(int)StartRadius);
    vl.declaration.task.startpoint.rz = min(1500,(int)StartRadius);
    vl.declaration.task.startpoint.rs = 0;
    break;
  case 1: // line
    vl.declaration.task.startpoint.oztyp = VLAPI_DATA::DCLWPT::OZTYP_LINE;
    vl.declaration.task.startpoint.lw = StartRadius * 2;
    vl.declaration.task.startpoint.rs = 0;
    vl.declaration.task.startpoint.rz = 0;
    break;
  case 2: // fai sector
    vl.declaration.task.startpoint.oztyp = VLAPI_DATA::DCLWPT::OZTYP_CYLSKT;
    vl.declaration.task.startpoint.lw = min(15000,(int)StartRadius);
    vl.declaration.task.startpoint.rz = 0;
    vl.declaration.task.startpoint.rs = min(15000,(int)StartRadius);
    break;
  }
  vl.declaration.task.startpoint.ws = 360;

  // rest of task...
  for (i=0; i<nturnpoints; i++) {
    // note this is for non-aat only!
    switch (SectorType) {
    case 0: // cylinder
      vl.declaration.task.turnpoints[i].oztyp = VLAPI_DATA::DCLWPT::OZTYP_CYLSKT;
      vl.declaration.task.turnpoints[i].rz = min(1500,(int)SectorRadius);
      vl.declaration.task.turnpoints[i].rs = 0;
      vl.declaration.task.turnpoints[i].lw = 0;
      break;
    case 1: // sector
      vl.declaration.task.turnpoints[i].oztyp = VLAPI_DATA::DCLWPT::OZTYP_CYLSKT;
      vl.declaration.task.turnpoints[i].rz = 0;
      vl.declaration.task.turnpoints[i].rs = min(15000,(int)SectorRadius);
      vl.declaration.task.turnpoints[i].lw = 0;
      break;
    case 2: // German DAe 0.5/10
      vl.declaration.task.turnpoints[i].oztyp = VLAPI_DATA::DCLWPT::OZTYP_CYLSKT;
      vl.declaration.task.turnpoints[i].rz = 500;
      vl.declaration.task.turnpoints[i].rs = 10000;
      vl.declaration.task.turnpoints[i].lw = 0;
      break;
    };
    vl.declaration.task.turnpoints[i].ws = 360; // auto direction

  }

  // Finish
  switch(FinishLine) {
  case 0: // cylinder
    vl.declaration.task.finishpoint.oztyp = VLAPI_DATA::DCLWPT::OZTYP_CYLSKT;
    vl.declaration.task.finishpoint.lw = min(1500,(int)FinishRadius);
    vl.declaration.task.finishpoint.rz = min(1500,(int)FinishRadius);
    vl.declaration.task.finishpoint.rs = 0;
    break;
  case 1: // line
    vl.declaration.task.finishpoint.oztyp = VLAPI_DATA::DCLWPT::OZTYP_LINE;
    vl.declaration.task.finishpoint.lw = FinishRadius*2;
    vl.declaration.task.finishpoint.rz = 0;
    vl.declaration.task.finishpoint.rs = 0;
    break;
  case 2: // fai sector
    vl.declaration.task.finishpoint.oztyp = VLAPI_DATA::DCLWPT::OZTYP_CYLSKT;
    vl.declaration.task.finishpoint.lw = min(15000,(int)FinishRadius);
    vl.declaration.task.finishpoint.rz = 0;
    vl.declaration.task.finishpoint.rs = min(15000,(int)FinishRadius);
    break;
  }
  vl.declaration.task.finishpoint.ws = 360;

  UnlockTaskData();

  // LKTOKEN  _@M1400_ = "Task declaration"
  // LKTOKEN  _@M1403_ = "Sending  declaration"
  _sntprintf(buffer, BUFF_LEN, _T("%s: %s..."), MsgToken(1400), MsgToken(1403));
  CreateProgressDialog(buffer);
  if((err = vl.write_db_and_declaration()) != VLA_ERR_NOERR) {
    // LKTOKEN  _@M1415_ = "Declaration not accepted!"
    _tcsncpy(errBuffer, MsgToken(1415), errBufferLen);
  }

  // LKTOKEN  _@M1400_ = "Task declaration"
  // LKTOKEN  _@M1406_ = "Closing connection"
  _sntprintf(buffer, BUFF_LEN, _T("%s: %s..."), MsgToken(1400), MsgToken(1406));
  CreateProgressDialog(buffer);
  vl.close(1);

  return err == VLA_ERR_NOERR;
}