static BOOL EWMicroRecorderDeclare(PDeviceDescriptor_t d, Declaration_t *decl) { const WAYPOINT *wp; nDeclErrorCode = 0; // Must have at least two, max 12 waypoints if (decl->num_waypoints < 2 || decl->num_waypoints > 12) return FALSE; d->Com->StopRxThread(); d->Com->SetRxTimeout(500); // set RX timeout to 500[ms] if (!EWMicroRecorderTryConnect(d)) { return FALSE; } d->Com->WriteString(TEXT("\x18")); // start to upload file d->Com->WriteString(user_data); EWMicroRecorderPrintf(d, TEXT("%-15s %s\r\n"), TEXT("Pilot Name:"), decl->PilotName); EWMicroRecorderPrintf(d, TEXT("%-15s %s\r\n"), TEXT("Competition ID:"), decl->AircraftRego); EWMicroRecorderPrintf(d, TEXT("%-15s %s\r\n"), TEXT("Aircraft Type:"), decl->AircraftType); d->Com->WriteString(TEXT("Description: Declaration\r\n")); for (int i = 0; i < 11; i++) { wp = decl->waypoint[i]; if (i == 0) { EWMicroRecorderWriteWayPoint(d, wp, TEXT("Take Off LatLong:")); EWMicroRecorderWriteWayPoint(d, wp, TEXT("Start LatLon:")); } else if (i + 1 < decl->num_waypoints) { EWMicroRecorderWriteWayPoint(d, wp, TEXT("TP LatLon:")); } else { EWMicroRecorderPrintf(d, TEXT("%-17s %s\r\n"), TEXT("TP LatLon:"), TEXT("0000000N00000000E TURN POINT\r\n")); } } wp = decl->waypoint[decl->num_waypoints - 1]; EWMicroRecorderWriteWayPoint(d, wp, TEXT("Finish LatLon:")); EWMicroRecorderWriteWayPoint(d, wp, TEXT("Land LatLon:")); d->Com->WriteString(TEXT("\x03")); // finish sending user file if (!ExpectStringWait(d, TEXT("uploaded successfully"))) { // error! nDeclErrorCode = 1; } d->Com->WriteString(TEXT("!!\r\n")); // go back to NMEA mode d->Com->SetRxTimeout(0); // clear timeout d->Com->StartRxThread(); // restart RX thread return(nDeclErrorCode == 0); // return() TRUE on success }
bool EWMicroRecorderDevice::Declare(const Declaration *decl) { // Must have at least two, max 12 waypoints if (decl->size() < 2 || decl->size() > 12) return false; port->StopRxThread(); port->SetRxTimeout(500); // set RX timeout to 500[ms] if (!TryConnect()) return false; port->Write('\x18'); // start to upload file port->Write(user_data); EWMicroRecorderPrintf(port, _T("%-15s %s\r\n"), _T("Pilot Name:"), decl->PilotName); EWMicroRecorderPrintf(port, _T("%-15s %s\r\n"), _T("Competition ID:"), decl->AircraftRego); EWMicroRecorderPrintf(port, _T("%-15s %s\r\n"), _T("Aircraft Type:"), decl->AircraftType); port->Write("Description: Declaration\r\n"); for (unsigned i = 0; i < 11; i++) { if (i+1>= decl->size()) { EWMicroRecorderPrintf(port, _T("%-17s %s\r\n"), _T("TP LatLon:"), _T("0000000N00000000E TURN POINT\r\n")); } else { const Waypoint &wp = decl->waypoints[i]; if (i == 0) { EWMicroRecorderWriteWayPoint(port, wp, _T("Take Off LatLong:")); EWMicroRecorderWriteWayPoint(port, wp, _T("Start LatLon:")); } else if (i + 1 < decl->size()) { EWMicroRecorderWriteWayPoint(port, wp, _T("TP LatLon:")); } } } const Waypoint &wp = decl->waypoints[decl->size() - 1]; EWMicroRecorderWriteWayPoint(port, wp, _T("Finish LatLon:")); EWMicroRecorderWriteWayPoint(port, wp, _T("Land LatLon:")); port->Write('\x03'); // finish sending user file bool success = ExpectStringWait(port, "uploaded successfully"); port->Write("!!\r\n"); // go back to NMEA mode port->SetRxTimeout(0); // clear timeout port->StartRxThread(); // restart RX thread return success; }
static void EWMicroRecorderWriteWayPoint(Port *port, const Waypoint &way_point, const TCHAR *EWType) { int DegLat, DegLon; double tmp, MinLat, MinLon; TCHAR NoS, EoW; // prepare latitude tmp = way_point.Location.Latitude.value_degrees(); NoS = _T('N'); if (tmp < 0) { NoS = _T('S'); tmp = -tmp; } DegLat = (int)tmp; MinLat = (tmp - DegLat) * 60 * 1000; // prepare long tmp = way_point.Location.Longitude.value_degrees(); EoW = _T('E'); if (tmp < 0) { EoW = _T('W'); tmp = -tmp; } DegLon = (int)tmp; MinLon = (tmp - DegLon) * 60 * 1000; EWMicroRecorderPrintf(port, _T("%-17s %02d%05d%c%03d%05d%c %s\r\n"), EWType, DegLat, (int)MinLat, NoS, DegLon, (int)MinLon, EoW, way_point.Name.c_str()); }
static void EWMicroRecorderWriteWayPoint(PDeviceDescriptor_t d, const WAYPOINT *wp, const TCHAR* EWType) { int DegLat, DegLon; double tmp, MinLat, MinLon; TCHAR NoS, EoW; // prepare latitude tmp = wp->Location.Latitude; NoS = _T('N'); if (tmp < 0) { NoS = _T('S'); tmp = -tmp; } DegLat = (int)tmp; MinLat = (tmp - DegLat) * 60 * 1000; // prepare long tmp = wp->Location.Longitude; EoW = _T('E'); if (tmp < 0) { EoW = _T('W'); tmp = -tmp; } DegLon = (int)tmp; MinLon = (tmp - DegLon) * 60 * 1000; EWMicroRecorderPrintf(d, TEXT("%-17s %02d%05d%c%03d%05d%c %s\r\n"), EWType, DegLat, (int)MinLat, NoS, DegLon, (int)MinLon, EoW, wp->Name); }
static bool DeclareInner(Port &port, const Declaration &declaration, OperationEnvironment &env) { assert(declaration.size() >= 2); assert(declaration.size() <= 12); char user_data[2500]; if (!TryConnect(port, user_data) || env.IsCancelled()) return false; char *p = strstr(user_data, "USER DETAILS"); if (p != NULL) *p = 0; port.Write('\x18'); // start to upload file port.Write(user_data); port.Write("USER DETAILS\r\n--------------\r\n\r\n"); EWMicroRecorderPrintf(port, _T("%-15s %s\r\n"), _T("Pilot Name:"), declaration.PilotName.c_str()); EWMicroRecorderPrintf(port, _T("%-15s %s\r\n"), _T("Competition ID:"), declaration.CompetitionId.c_str()); EWMicroRecorderPrintf(port, _T("%-15s %s\r\n"), _T("Aircraft Type:"), declaration.AircraftType.c_str()); EWMicroRecorderPrintf(port, _T("%-15s %s\r\n"), _T("Aircraft ID:"), declaration.AircraftReg.c_str()); port.Write("\r\nFLIGHT DECLARATION\r\n-------------------\r\n\r\n"); EWMicroRecorderPrintf(port, _T("%-15s %s\r\n"), _T("Description:"), _T("XCSoar task declaration")); for (unsigned i = 0; i < 11; i++) { if (env.IsCancelled()) return false; if (i+1>= declaration.size()) { EWMicroRecorderPrintf(port, _T("%-17s %s\r\n"), _T("TP LatLon:"), _T("0000000N00000000E TURN POINT")); } else { const Waypoint &wp = declaration.get_waypoint(i); if (i == 0) { EWMicroRecorderWriteWaypoint(port, wp, _T("Take Off LatLong:")); EWMicroRecorderWriteWaypoint(port, wp, _T("Start LatLon:")); } else if (i + 1 < declaration.size()) { EWMicroRecorderWriteWaypoint(port, wp, _T("TP LatLon:")); } } } const Waypoint &wp = declaration.get_last_waypoint(); EWMicroRecorderWriteWaypoint(port, wp, _T("Finish LatLon:")); EWMicroRecorderWriteWaypoint(port, wp, _T("Land LatLon:")); if (env.IsCancelled()) return false; port.Write('\x03'); // finish sending user file return port.ExpectString("uploaded successfully"); }