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; }
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; }