BOOL FlarmDeclare(PDeviceDescriptor_t d, Declaration_t *decl, unsigned errBufferLen, TCHAR errBuffer[]) { BOOL result = TRUE; #define BUFF_LEN 512 TCHAR Buffer[BUFF_LEN]; d->Com->StopRxThread(); d->Com->SetRxTimeout(500); // set RX timeout to 500[ms] _stprintf(Buffer,TEXT("PFLAC,S,PILOT,%s"),decl->PilotName); if (!FlarmDeclareSetGet(d,Buffer)) result = FALSE; _stprintf(Buffer,TEXT("PFLAC,S,GLIDERID,%s"),decl->AircraftRego); if(result) if (!FlarmDeclareSetGet(d,Buffer)) result = FALSE; _stprintf(Buffer,TEXT("PFLAC,S,GLIDERTYPE,%s"),decl->AircraftType); if(result) if (!FlarmDeclareSetGet(d,Buffer)) result = FALSE; _stprintf(Buffer,TEXT("PFLAC,S,COMPID,%s"),decl->CompetitionID); if(result) if (!FlarmDeclareSetGet(d,Buffer)) result = FALSE; _stprintf(Buffer,TEXT("PFLAC,S,COMPCLASS,%s"),decl->CompetitionClass); if(result) if (!FlarmDeclareSetGet(d,Buffer)) result = FALSE; _stprintf(Buffer,TEXT("PFLAC,S,NEWTASK,Task")); if(result) if (!FlarmDeclareSetGet(d,Buffer)) result = FALSE; _stprintf(Buffer,TEXT("PFLAC,S,ADDWP,0000000N,00000000E,TAKEOFF")); if(result) if (!FlarmDeclareSetGet(d,Buffer)) result = FALSE; if(result == TRUE) for (int i = 0; i < decl->num_waypoints; i++) { int DegLat, DegLon; double MinLat, MinLon; char NoS, EoW; DegLat = (int)decl->waypoint[i]->Latitude; MinLat = decl->waypoint[i]->Latitude - DegLat; NoS = 'N'; if((MinLat<0) || ((MinLat-DegLat==0) && (DegLat<0))) { NoS = 'S'; DegLat *= -1; MinLat *= -1; } MinLat *= 60; MinLat *= 1000; DegLon = (int)decl->waypoint[i]->Longitude; MinLon = decl->waypoint[i]->Longitude - DegLon; EoW = 'E'; if((MinLon<0) || ((MinLon-DegLon==0) && (DegLon<0))) { EoW = 'W'; DegLon *= -1; MinLon *= -1; } MinLon *=60; MinLon *= 1000; _stprintf(Buffer, TEXT("PFLAC,S,ADDWP,%02d%05.0f%c,%03d%05.0f%c,%s"), DegLat, MinLat, NoS, DegLon, MinLon, EoW, decl->waypoint[i]->Name); if (!FlarmDeclareSetGet(d,Buffer)) result = FALSE; } _stprintf(Buffer,TEXT("PFLAC,S,ADDWP,0000000N,00000000E,LANDING")); if(result) if (!FlarmDeclareSetGet(d,Buffer)) result = FALSE; // Reboot flarm to make declaration active, according to specs Sleep(100); devFormatNMEAString(Buffer, BUFF_LEN, TEXT("PFLAR,0") ); if(result == TRUE) d->Com->WriteString(Buffer); Sleep(100); d->Com->SetRxTimeout(RXTIMEOUT); // clear timeout d->Com->StartRxThread(); // restart RX thread return result; }
BOOL FlarmDeclare(PDeviceDescriptor_t d, Declaration_t *decl){ BOOL result = TRUE; TCHAR Buffer[256]; d->Com->StopRxThread(); d->Com->SetRxTimeout(500); // set RX timeout to 500[ms] _stprintf(Buffer,TEXT("PFLAC,S,PILOT,%s"),decl->PilotName); if (!FlarmDeclareSetGet(d,Buffer)) result = FALSE; _stprintf(Buffer,TEXT("PFLAC,S,GLIDERID,%s"),decl->AircraftRego); if (!FlarmDeclareSetGet(d,Buffer)) result = FALSE; _stprintf(Buffer,TEXT("PFLAC,S,GLIDERTYPE,%s"),decl->AircraftType); if (!FlarmDeclareSetGet(d,Buffer)) result = FALSE; _stprintf(Buffer,TEXT("PFLAC,S,NEWTASK,Task")); if (!FlarmDeclareSetGet(d,Buffer)) result = FALSE; _stprintf(Buffer,TEXT("PFLAC,S,ADDWP,0000000N,00000000E,TAKEOFF")); if (!FlarmDeclareSetGet(d,Buffer)) result = FALSE; for (int i = 0; i < decl->num_waypoints; i++) { int DegLat, DegLon; double tmp, MinLat, MinLon; char NoS, EoW; tmp = decl->waypoint[i]->Location.Latitude; NoS = 'N'; if(tmp < 0) { NoS = 'S'; tmp = -tmp; } DegLat = (int)tmp; MinLat = (tmp - DegLat) * 60 * 1000; tmp = decl->waypoint[i]->Location.Longitude; EoW = 'E'; if(tmp < 0) { EoW = 'W'; tmp = -tmp; } DegLon = (int)tmp; MinLon = (tmp - DegLon) * 60 * 1000; _stprintf(Buffer, TEXT("PFLAC,S,ADDWP,%02d%05.0f%c,%03d%05.0f%c,%s"), DegLat, MinLat, NoS, DegLon, MinLon, EoW, decl->waypoint[i]->Name); if (!FlarmDeclareSetGet(d,Buffer)) result = FALSE; } _stprintf(Buffer,TEXT("PFLAC,S,ADDWP,0000000N,00000000E,LANDING")); if (!FlarmDeclareSetGet(d,Buffer)) result = FALSE; // PFLAC,S,KEY,VALUE // Expect // PFLAC,A,blah // PFLAC,,COPIL: // PFLAC,,COMPID: // PFLAC,,COMPCLASS: // PFLAC,,NEWTASK: // PFLAC,,ADDWP: // TODO bug: JMW, FLARM Declaration checks // Note: FLARM must be power cycled to activate a declaration! // Only works on IGC approved devices // Total data size must not surpass 183 bytes // probably will issue PFLAC,ERROR if a problem? d->Com->SetRxTimeout(0); // clear timeout d->Com->StartRxThread(); // restart RX thread return result; }
BOOL FlarmDeclare(PDeviceDescriptor_t d, Declaration_t *decl, unsigned errBufferLen, TCHAR errBuffer[]) { BOOL result = TRUE; #define BUFF_LEN 512 TCHAR Buffer[BUFF_LEN]; // for(int i=0; i < 3; i++) { d->Com->StopRxThread(); d->Com->SetRxTimeout(100); // set RX timeout to 50[ms] _stprintf(Buffer,TEXT("PFLAC,S,PILOT,%s"),decl->PilotName); if (!FlarmDeclareSetGet(d,Buffer)) result = FALSE; _stprintf(Buffer,TEXT("PFLAC,S,GLIDERID,%s"),decl->AircraftRego); if(result) if (!FlarmDeclareSetGet(d,Buffer)) result = FALSE; _stprintf(Buffer,TEXT("PFLAC,S,GLIDERTYPE,%s"),decl->AircraftType); if(result) if (!FlarmDeclareSetGet(d,Buffer)) result = FALSE; _stprintf(Buffer,TEXT("PFLAC,S,COMPID,%s"),decl->CompetitionID); if(result) if (!FlarmDeclareSetGet(d,Buffer)) result = FALSE; _stprintf(Buffer,TEXT("PFLAC,S,COMPCLASS,%s"),decl->CompetitionClass); if(result) if (!FlarmDeclareSetGet(d,Buffer)) result = FALSE; _stprintf(Buffer,TEXT("PFLAC,S,NEWTASK,Tsk")); if(result) if (!FlarmDeclareSetGet(d,Buffer)) result = FALSE; _stprintf(Buffer,TEXT("PFLAC,S,ADDWP,0000000N,00000000E,TKOFF")); if(result) if (!FlarmDeclareSetGet(d,Buffer)) result = FALSE; if(result == TRUE) for (int j = 0; j < decl->num_waypoints; j++) { int DegLat, DegLon; double MinLat, MinLon; char NoS, EoW; DegLat = (int)decl->waypoint[j]->Latitude; MinLat = decl->waypoint[j]->Latitude - DegLat; NoS = 'N'; if((MinLat<0) || ((MinLat-DegLat==0) && (DegLat<0))) { NoS = 'S'; DegLat *= -1; MinLat *= -1; } MinLat *= 60; MinLat *= 1000; DegLon = (int)decl->waypoint[j]->Longitude; MinLon = decl->waypoint[j]->Longitude - DegLon; EoW = 'E'; if((MinLon<0) || ((MinLon-DegLon==0) && (DegLon<0))) { EoW = 'W'; DegLon *= -1; MinLon *= -1; } MinLon *=60; MinLon *= 1000; _stprintf(Buffer, TEXT("PFLAC,S,ADDWP,%02d%05.0f%c,%03d%05.0f%c,%s"), DegLat, MinLat, NoS, DegLon, MinLon, EoW, decl->waypoint[j]->Name); Buffer[38] = '\0'; // limit the wapointname to 5 char not to limit the no of waypoints for(int k =0; k < (int)_tcslen(Buffer); k++) //remove * not to conflict with checksum indicator if(Buffer[k]== (TCHAR)'*') Buffer[k] = '_'; if (!FlarmDeclareSetGet(d,Buffer)) result = FALSE; } _stprintf(Buffer,TEXT("PFLAC,S,ADDWP,0000000N,00000000E,LNDG")); if(result) if (!FlarmDeclareSetGet(d,Buffer)) result = FALSE; // Reboot flarm to make declaration active, according to specs Sleep(100); devFormatNMEAString(Buffer, BUFF_LEN, TEXT("PFLAR,0") ); if(result == TRUE) d->Com->WriteString(Buffer); Sleep(100); d->Com->SetRxTimeout(RXTIMEOUT); // clear timeout d->Com->StartRxThread(); // restart RX thread if(result == TRUE) return result; Sleep(100); } return false; // no success }