bool EWDevice::AddWaypoint(const Waypoint &way_point, OperationEnvironment &env) { char EWRecord[100]; TCHAR IDString[12]; int DegLat, DegLon; double tmp, MinLat, MinLon; char NoS, EoW; // check for max 6 TP's if (ewDecelTpIndex > 6) return false; // copy at most 6 chars CopyString(IDString, way_point.name.c_str(), 7); // fill up with spaces while (_tcslen(IDString) < 6) _tcscat(IDString, _T(" ")); #if USESHORTTPNAME > 0 // truncate to short name _tcscpy(&IDString[3], _T(" ")); #endif // prepare lat tmp = (double)way_point.location.latitude.Degrees(); NoS = 'N'; if (tmp < 0) { NoS = 'S'; tmp = -tmp; } DegLat = (int)tmp; MinLat = (tmp - DegLat) * 60 * 1000; // prepare long tmp = (double)way_point.location.longitude.Degrees(); EoW = 'E'; if (tmp < 0) { EoW = 'W'; tmp = -tmp; } DegLon = (int)tmp; MinLon = (tmp - DegLon) * 60 * 1000; // Calc E/W and N/S flags // prepare flags const unsigned EoW_Flag = EoW == 'W' ? 0x08 : 0x04; const unsigned NoS_Flag = NoS == 'N' ? 0x01 : 0x02; // Do the calculation const unsigned EW_Flags = (short)(EoW_Flag | NoS_Flag); // setup command string sprintf(EWRecord, "#STP%02X%02X%02X%02X%02X%02X%02X%02X%02X%04X%02X%04X", ewDecelTpIndex, IDString[0], IDString[1], IDString[2], IDString[3], IDString[4], IDString[5], EW_Flags, DegLat, (int)MinLat / 10, DegLon, (int)MinLon / 10); WriteWithChecksum(port, EWRecord); // wait for response if (!port.ExpectString("OK\r", env)) return false; // increase TP index ewDecelTpIndex++; return true; }
bool EWDevice::DeclareInner(const struct Declaration &declaration, OperationEnvironment &env) { char sTmp[72]; ewDecelTpIndex = 0; if (!TryConnect(env)) return false; // send SetPilotInfo WriteWithChecksum(port, "#SPI"); env.Sleep(50); char sPilot[13], sGliderType[9], sGliderID[9]; convert_string(sPilot, sizeof(sPilot), declaration.pilot_name); convert_string(sGliderType, sizeof(sGliderType), declaration.aircraft_type); convert_string(sGliderID, sizeof(sGliderID), declaration.aircraft_registration); // build string (field 4-5 are GPS info, no idea what to write) sprintf(sTmp, "%-12s%-8s%-8s%-12s%-12s%-6s\r", sPilot, sGliderType, sGliderID, "" /* GPS Model */, "" /* GPS Serial No. */, "" /* Flight Date */ /* format unknown, left blank (GPS has a RTC) */); port.Write(sTmp); if (!port.ExpectString("OK\r", env)) return false; /* sprintf(sTmp, "#SUI%02d", 0); // send pilot name WriteWithChecksum(port, sTmp); env.Sleep(50); port.Write(PilotsName); port.Write('\r'); if (!port.ExpectString("OK\r")) return false; sprintf(sTmp, "#SUI%02d", 1); // send type of aircraft WriteWithChecksum(port, sTmp); env.Sleep(50); port.Write(Class); port.Write('\r'); if (!port.ExpectString("OK\r")) nDeclErrorCode = 1; sprintf(sTmp, "#SUI%02d", 2); // send aircraft ID WriteWithChecksum(port, sTmp); env.Sleep(50); port.Write(ID); port.Write('\r'); if (!port.ExpectString("OK\r")) return false; */ // clear all 6 TP's for (int i = 0; i < 6; i++) { sprintf(sTmp, "#CTP%02d", i); WriteWithChecksum(port, sTmp); if (!port.ExpectString("OK\r", env)) return false; } for (unsigned j = 0; j < declaration.Size(); ++j) if (!AddWaypoint(declaration.GetWaypoint(j), env)) return false; return true; }
bool EWDevice::AddWaypoint(const Waypoint &way_point) { char EWRecord[100]; TCHAR IDString[12]; int DegLat, DegLon; double tmp, MinLat, MinLon; char NoS, EoW; short EoW_Flag, NoS_Flag, EW_Flags; if (ewDecelTpIndex > 6){ // check for max 6 TP's return false; } CopyString(IDString, way_point.Name.c_str(), 7); // copy at most 6 chars while (_tcslen(IDString) < 6) // fill up with spaces _tcscat(IDString, _T(" ")); #if USESHORTTPNAME > 0 _tcscpy(&IDString[3], _T(" ")); // truncate to short name #endif // prepare lat tmp = way_point.Location.Latitude.value_degrees(); NoS = 'N'; if (tmp < 0) { NoS = 'S'; tmp = -tmp; } DegLat = (int)tmp; MinLat = (tmp - DegLat) * 60 * 1000; // prepare long tmp = way_point.Location.Longitude.value_degrees(); EoW = 'E'; if (tmp < 0) { EoW = 'W'; tmp = -tmp; } DegLon = (int)tmp; MinLon = (tmp - DegLon) * 60 * 1000; // Calc E/W and N/S flags // Clear flags EoW_Flag = 0; // prepare flags NoS_Flag = 0; EW_Flags = 0; if (EoW == 'W') { EoW_Flag = 0x08; } else { EoW_Flag = 0x04; } if (NoS == 'N') { NoS_Flag = 0x01; } else { NoS_Flag = 0x02; } // Do the calculation EW_Flags = (short)(EoW_Flag | NoS_Flag); // setup command string sprintf(EWRecord, "#STP%02X%02X%02X%02X%02X%02X%02X%02X%02X%04X%02X%04X", ewDecelTpIndex, IDString[0], IDString[1], IDString[2], IDString[3], IDString[4], IDString[5], EW_Flags, DegLat, (int)MinLat/10, DegLon, (int)MinLon/10); WriteWithChecksum(port, EWRecord); if (!port->ExpectString("OK\r")) // wait for response return false; ewDecelTpIndex = ewDecelTpIndex + 1; // increase TP index return true; }
bool EWDevice::AddWaypoint(const Waypoint &way_point, OperationEnvironment &env) { char EWRecord[100]; int DegLat, DegLon; double tmp, MinLat, MinLon; char NoS, EoW; // check for max 6 TP's if (ewDecelTpIndex > 6) return false; // copy at most 6 chars const WideToUTF8Converter name_utf8(way_point.name.c_str()); if (!name_utf8.IsValid()) return false; char IDString[12]; char *end = CopyTruncateString(IDString, 7, name_utf8); // fill up with spaces std::fill(end, IDString + 6, ' '); // prepare lat tmp = (double)way_point.location.latitude.Degrees(); NoS = 'N'; if (tmp < 0) { NoS = 'S'; tmp = -tmp; } DegLat = (int)tmp; MinLat = (tmp - DegLat) * 60 * 1000; // prepare long tmp = (double)way_point.location.longitude.Degrees(); EoW = 'E'; if (tmp < 0) { EoW = 'W'; tmp = -tmp; } DegLon = (int)tmp; MinLon = (tmp - DegLon) * 60 * 1000; // Calc E/W and N/S flags // prepare flags const unsigned EoW_Flag = EoW == 'W' ? 0x08 : 0x04; const unsigned NoS_Flag = NoS == 'N' ? 0x01 : 0x02; // Do the calculation const unsigned EW_Flags = (short)(EoW_Flag | NoS_Flag); // setup command string sprintf(EWRecord, "#STP%02X%02X%02X%02X%02X%02X%02X%02X%02X%04X%02X%04X", ewDecelTpIndex, IDString[0], IDString[1], IDString[2], IDString[3], IDString[4], IDString[5], EW_Flags, DegLat, (int)MinLat / 10, DegLon, (int)MinLon / 10); WriteWithChecksum(port, EWRecord); // wait for response if (!port.ExpectString("OK\r", env)) return false; // increase TP index ewDecelTpIndex++; return true; }
bool EWDevice::DeclareInner(const struct Declaration *decl, OperationEnvironment &env) { char sTmp[72]; ewDecelTpIndex = 0; if (!TryConnect()) return false; WriteWithChecksum(port, "#SPI"); // send SetPilotInfo env.Sleep(50); char sPilot[13], sGliderType[9], sGliderID[9]; convert_string(sPilot, sizeof(sPilot), decl->PilotName); convert_string(sGliderType, sizeof(sGliderType), decl->AircraftType); convert_string(sGliderID, sizeof(sGliderID), decl->AircraftReg); // build string (field 4-5 are GPS info, no idea what to write) sprintf(sTmp, "%-12s%-8s%-8s%-12s%-12s%-6s\r", sPilot, sGliderType, sGliderID, "", // GPS Model "", // GPS Serial No. "" // Flight Date, // format unknown, // left blank (GPS // has a RTC) ); port->Write(sTmp); if (!port->ExpectString("OK\r")) return false; /* sprintf(sTmp, "#SUI%02d", 0); // send pilot name WriteWithChecksum(port, sTmp); env.Sleep(50); port->Write(PilotsName); port->Write('\r'); if (!port->ExpectString("OK\r")) return false; sprintf(sTmp, "#SUI%02d", 1); // send type of aircraft WriteWithChecksum(port, sTmp); env.Sleep(50); port->Write(Class); port->Write('\r'); if (!port->ExpectString("OK\r")) nDeclErrorCode = 1; sprintf(sTmp, "#SUI%02d", 2); // send aircraft ID WriteWithChecksum(port, sTmp); env.Sleep(50); port->Write(ID); port->Write('\r'); if (!port->ExpectString("OK\r")) return false; */ for (int i=0; i<6; i++){ // clear all 6 TP's sprintf(sTmp, "#CTP%02d", i); WriteWithChecksum(port, sTmp); if (!port->ExpectString("OK\r")) return false; } for (unsigned j = 0; j < decl->size(); ++j) if (!AddWayPoint(decl->get_waypoint(j))) return false; return true; }