//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /// Parses LXWP0 sentence. /// /// @param d device descriptor /// @param sentence received NMEA sentence /// @param info GPS info to be updated /// /// @retval true if the sentence has been parsed /// //static bool DevLXMiniMap::LXWP0(PDeviceDescriptor_t d, const TCHAR* sentence, NMEA_INFO* info) { // $LXWP0,logger_stored, airspeed, airaltitude, // v1[0],v1[1],v1[2],v1[3],v1[4],v1[5], hdg, windspeed*CS<CR><LF> // // 0 loger_stored : [Y|N] (not used in LX1600) // 1 IAS [km/h] ----> Condor uses TAS! // 2 baroaltitude [m] // 3-8 vario values [m/s] (last 6 measurements in last second) // 9 heading of plane (not used in LX1600) // 10 windcourse [deg] (not used in LX1600) // 11 windspeed [km/h] (not used in LX1600) // // e.g.: // $LXWP0,Y,222.3,1665.5,1.71,,,,,,239,174,10.1 TICKER = GetTickCount(); double alt, airspeed; if (ParToDouble(sentence, 1, &airspeed)) { airspeed /= TOKPH; info->TrueAirspeed = airspeed; info->AirspeedAvailable = TRUE; } if (ParToDouble(sentence, 2, &alt)) { info->IndicatedAirspeed = airspeed / AirDensityRatio(alt); if (d == pDevPrimaryBaroSource) { UpdateQNH(CalculateQNH(alt, alt + AltOffset)); UpdateBaroSource(info, 0, d, alt + AltOffset); /* if(FirstCheckBaroAlt) { FirstCheckBaroAlt = false; InputEvents::eventSetup(_T("Basic")); }*/ } } if (ParToDouble(sentence, 3, &info->Vario)) info->VarioAvailable = TRUE; if (ParToDouble(sentence, 10, &info->ExternalWindDirection) && ParToDouble(sentence, 11, &info->ExternalWindSpeed)) info->ExternalWindAvailable = TRUE; TriggerVarioUpdate(); return(true); } // LXWP0()
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /// Parses LXWP0 sentence. /// /// @param d device descriptor /// @param sentence received NMEA sentence /// @param info GPS info to be updated /// /// @retval true if the sentence has been parsed /// //static bool DevLX16xx::LXWP0(PDeviceDescriptor_t d, const TCHAR* sentence, NMEA_INFO* info) { // $LXWP0,logger_stored, airspeed, airaltitude, // v1[0],v1[1],v1[2],v1[3],v1[4],v1[5], hdg, windspeed*CS<CR><LF> // // 0 loger_stored : [Y|N] (not used in LX1600) // 1 IAS [km/h] ----> Condor uses TAS! // 2 baroaltitude [m] // 3-8 vario values [m/s] (last 6 measurements in last second) // 9 heading of plane (not used in LX1600) // 10 windcourse [deg] (not used in LX1600) // 11 windspeed [km/h] (not used in LX1600) // // e.g.: // $LXWP0,Y,222.3,1665.5,1.71,,,,,,239,174,10.1 double alt=0, airspeed=0; if (ParToDouble(sentence, 1, &airspeed)) { airspeed /= TOKPH; info->TrueAirspeed = airspeed; info->AirspeedAvailable = TRUE; } if(LX166AltitudeUpdateTimeout >0) LX166AltitudeUpdateTimeout--; else if (ParToDouble(sentence, 2, &alt)) { LX16xxAlt = (int) alt; if (airspeed>0) info->IndicatedAirspeed = airspeed / AirDensityRatio(alt); UpdateBaroSource( info, 0,d, QNEAltitudeToQNHAltitude(alt)); } if (ParToDouble(sentence, 3, &info->Vario)) info->VarioAvailable = TRUE; else info->VarioAvailable = FALSE; if (ParToDouble(sentence, 10, &info->ExternalWindDirection) && ParToDouble(sentence, 11, &info->ExternalWindSpeed)) { info->ExternalWindSpeed /= TOKPH; /* convert to m/s */ info->ExternalWindAvailable = TRUE; } TriggerVarioUpdate(); return(true); } // LXWP0()
bool DevLX16xx::LXWP4(PDeviceDescriptor_t d, const TCHAR* sentence, NMEA_INFO* info) { // $LXWP4 Sc, Netto, Relativ, gl.dif, leg speed, leg time, integrator, flight time, battery voltage*CS<CR><LF> // Sc float (m/s) // Netto float (m/s) // Relativ float (m/s) // Distance float (m) // gl.dif int (ft) // leg speed (km/h) // leg time (km/h) // integrator float (m/s) // flight time unsigned in seconds // battery voltage float (V) double Batt; if (ParToDouble(sentence, 9, &Batt)) { info->ExtBatt1_Voltage = Batt; } return(true); } // LXWP4()
bool PLXVS(PDeviceDescriptor_t d, const TCHAR* sentence, NMEA_INFO* info) { double Batt; double OAT; if (ParToDouble(sentence, 0, &OAT)) { info->OutsideAirTemperature = OAT; info->TemperatureAvailable = TRUE; } if (ParToDouble(sentence, 2, &Batt)) { info->ExtBatt1_Voltage = Batt; } return(true); } // PLXVS()
bool DevLXV7_EXP::PLXVF(PDeviceDescriptor_t d, const TCHAR* sentence, NMEA_INFO* info) { double alt, airspeed; if (ParToDouble(sentence, 1, &info->AccelX)) if (ParToDouble(sentence, 2, &info->AccelY)) if (ParToDouble(sentence, 3, &info->AccelZ)) info->AccelerationAvailable = true; if (ParToDouble(sentence, 5, &airspeed)) { // airspeed = 135.0/TOKPH; info->IndicatedAirspeed = airspeed; info->AirspeedAvailable = TRUE; } if (ParToDouble(sentence, 6, &alt)) { UpdateBaroSource( info, 0, d, AltitudeToQNHAltitude(alt)); info->TrueAirspeed = airspeed * AirDensityRatio(alt); } if (ParToDouble(sentence, 4, &info->Vario)) { info->VarioAvailable = TRUE; TriggerVarioUpdate(); } // Get STF switch double fTmp; if (ParToDouble(sentence, 7, &fTmp)) { int iTmp = (int)(fTmp+0.1); EnableExternalTriggerCruise = true; static int iOldVarioSwitch=0; if(iTmp != iOldVarioSwitch) { iOldVarioSwitch = iTmp; if(iTmp==1) { ExternalTriggerCruise = true; ExternalTriggerCircling = false; } else { ExternalTriggerCruise = false; ExternalTriggerCircling = true; } } } return(true); } // PLXVF()
bool DevLXV7::PLXVS(PDeviceDescriptor_t d, const TCHAR* sentence, NMEA_INFO* info) { double Batt; double OAT; if (ParToDouble(sentence, 0, &OAT)) { info->OutsideAirTemperature = OAT; info->TemperatureAvailable = TRUE; } #ifdef SLOW_DET // Get STF switch double fTmp; if (ParToDouble(sentence, 1, &fTmp)) { int iTmp = (int)(fTmp+0.1); EnableExternalTriggerCruise = true; static int iOldVarioSwitch=0; if(iTmp != iOldVarioSwitch) { iOldVarioSwitch = iTmp; if(iTmp==1) { ExternalTriggerCruise = true; ExternalTriggerCircling = false; } else { ExternalTriggerCruise = false; ExternalTriggerCircling = true; } } } #endif if (ParToDouble(sentence, 2, &Batt)) info->ExtBatt1_Voltage = Batt; return(true); } // PLXVS()
bool PLXVF(PDeviceDescriptor_t d, const TCHAR* sentence, NMEA_INFO* info) { double alt, airspeed; if (ParToDouble(sentence, 5, &airspeed)) { info->IndicatedAirspeed = airspeed; info->AirspeedAvailable = TRUE; } if (ParToDouble(sentence, 6, &alt)) { UpdateBaroSource( info, 0, d, AltitudeToQNHAltitude(alt)); info->TrueAirspeed = airspeed * AirDensityRatio(alt); } if (ParToDouble(sentence, 4, &info->Vario)) { info->VarioAvailable = TRUE; TriggerVarioUpdate(); } return(true); }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /// Parses LXWP3 sentence. /// /// @param d device descriptor /// @param sentence received NMEA sentence /// @param info GPS info to be updated /// /// @retval true if the sentence has been parsed /// //static bool DevLXMiniMap::LXWP3(PDeviceDescriptor_t d, const TCHAR* sentence, NMEA_INFO* info) { if(AltTimeoutWait) { if(abs(GetTickCount() - AlttimeOutTicker) > 4000) { AltTimeoutWait = false; } } else { double offsettmp = 0.0; ParToDouble(sentence, 0, &offsettmp); AltOffset = offsettmp * FT2M; } // $LXWP3,altioffset, scmode, variofil, tefilter, televel, varioavg, // variorange, sctab, sclow, scspeed, SmartDiff, // GliderName, time offset*CS<CR><LF> // // altioffset //offset necessary to set QNE in ft default=0 // scmode // methods for automatic SC switch index 0=EXTERNAL, 1=ON CIRCLING // 2=auto IAS default=1 // variofil // filtering of vario in seconds (float) default=1 // tefilter // filtering of TE compensation in seconds (float) 0 = no // filtering (default=0) // televel // level of TE compensation from 0 to 250 default=0 (%) default=0 // varioavg // averaging time in seconds for integrator default=25 // variorange // 2.5 5 or 10 (m/s or kts) (float) default=5.0 // sctab // area of silence in SC mode (float) 0-5.0 1.0= silence between // +1m/s and -1m/s default=1 // sclow // external switch/taster function 0=NORMAL 1=INVERTED 2=TASTER // default=1 // scspeed // speed of automatic switch from vario to sc mode if SCMODE==2 in // (km/h) default=110 // SmartDiff float (m/s/s) (Smart VARIO filtering) // GliderName // Glider name string max. 14 characters // time offset int in hours // nothing to do return(true); } // LXWP3()
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /// Parses LXWP2 sentence. /// /// @param d device descriptor /// @param sentence received NMEA sentence /// @param info GPS info to be updated /// /// @retval true if the sentence has been parsed /// //static bool DevLX::LXWP2(PDeviceDescriptor_t, const TCHAR* sentence, NMEA_INFO* info) { // $LXWP2,mccready,ballast,bugs,polar_a,polar_b,polar_c, audio volume // *CS<CR><LF> // // Mccready: float in m/s // Ballast: float 1.0 ... 1.5 // Bugs: 0 - 100% // polar_a: float polar_a=a/10000 w=a*v2+b*v+c // polar_b: float polar_b=b/100 v=(km/h/100) w=(m/s) // polar_c: float polar_c=c // audio volume 0 - 100% ParToDouble(sentence, 0, &info->MacReady); CheckSetMACCREADY(info->MacReady); return(true); } // LXWP2()
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /// Parses LXWP2 sentence. /// /// @param d device descriptor /// @param sentence received NMEA sentence /// @param info GPS info to be updated /// /// @retval true if the sentence has been parsed /// //static bool DevLX::LXWP2(PDeviceDescriptor_t, const TCHAR* sentence, NMEA_INFO*) { // $LXWP2,mccready,ballast,bugs,polar_a,polar_b,polar_c, audio volume // *CS<CR><LF> // // Mccready: float in m/s // Ballast: float 1.0 ... 1.5 // Bugs: 0 - 100% // polar_a: float polar_a=a/10000 w=a*v2+b*v+c // polar_b: float polar_b=b/100 v=(km/h/100) w=(m/s) // polar_c: float polar_c=c // audio volume 0 - 100% ParToDouble(sentence, 0, &MACCREADY); //?? why not info->MacReady = /* from XCSoar: ParToDouble(sentence, 2, &info->Bugs); info->Bugs = 100 - info->Bugs; */ return(true); } // LXWP2()
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /// Parses LXWP2 sentence. /// /// @param d device descriptor /// @param sentence received NMEA sentence /// @param info GPS info to be updated /// /// @retval true if the sentence has been parsed /// //static bool DevLXV7::LXWP2(PDeviceDescriptor_t, const TCHAR* sentence, NMEA_INFO*) { // $LXWP2,mccready,ballast,bugs,polar_a,polar_b,polar_c, audio volume // *CS<CR><LF> // // Mccready: float in m/s // Ballast: float 1.0 ... 1.5 // Bugs: 0 - 100% // polar_a: float polar_a=a/10000 w=a*v2+b*v+c // polar_b: float polar_b=b/100 v=(km/h/100) w=(m/s) // polar_c: float polar_c=c // audio volume 0 - 100% //float fBallast,fBugs, polar_a, polar_b, polar_c, fVolume; double fTmp; int iTmp; if(LXV7_MacCreadyUpdateTimeout > 0) { LXV7_MacCreadyUpdateTimeout--; } else if (ParToDouble(sentence, 0, &fTmp)) { iTmp =(int) (fTmp*100.0+0.5f); fTmp = (double)(iTmp)/100.0; LXV7_bValid = true; if(fabs(MACCREADY - fTmp)> 0.001) { MACCREADY = fTmp; iLXV7_RxUpdateTime =5; } } if(LXV7_BallastUpdateTimeout > 0) { LXV7_BallastUpdateTimeout--; } else if (ParToDouble(sentence, 1, &fTmp)) { fTmp -= 1.0; fTmp = (fTmp); if( fabs(fTmp -BALLAST) >= 0.05) { BALLAST = fTmp; iLXV7_RxUpdateTime = 5; } } if(LXV7_BugsUpdateTimeout > 0) { LXV7_BugsUpdateTimeout--; } else if(ParToDouble(sentence, 2, &fTmp)) { int iTmp = 100-(int)(fTmp+0.5); fTmp = (double)iTmp/100.0; if( fabs(fTmp -BUGS) >= 0.03) { BUGS = fTmp; iLXV7_RxUpdateTime = 5; } } /* if (ParToDouble(sentence, 3, &fTmp)) fPolar_a = fTmp; if (ParToDouble(sentence, 4, &fTmp)) fPolar_b = fTmp; if (ParToDouble(sentence, 5, &fTmp)) fPolar_c = fTmp; if (ParToDouble(sentence, 6, &fTmp)) { fVolume = fTmp; } */ return(true); } // LXWP2()
bool PVCOM_ProcessPEYI(PDeviceDescriptor_t d, const TCHAR *sentence, NMEA_INFO *info) { TSpaceInfo data = {0}; unsigned fieldIdx = 0; bool status = true; double value; if(status &= ParToDouble(sentence, fieldIdx++, &value)) data.eulerRoll = value; if(status &= ParToDouble(sentence, fieldIdx++, &value)) data.eulerPitch = value; if(status &= ParToDouble(sentence, fieldIdx++, &value)) data.rollRate = value; if(status &= ParToDouble(sentence, fieldIdx++, &value)) data.pitchRate = value; if(status &= ParToDouble(sentence, fieldIdx++, &value)) data.yawRate = value; if(status &= ParToDouble(sentence, fieldIdx++, &value)) data.accelX = value; if(status &= ParToDouble(sentence, fieldIdx++, &value)) data.accelY = value; if(status &= ParToDouble(sentence, fieldIdx++, &value)) data.accelZ = value; if(status &= ParToDouble(sentence, fieldIdx++, &value)) data.virosbandometer = value; if(status &= ParToDouble(sentence, fieldIdx++, &value)) data.trueHeading = value; if(status &= ParToDouble(sentence, fieldIdx++, &value)) data.magneticHeading = value; if(status &= ParToDouble(sentence, fieldIdx++, &value)) data.localDeclination = value; if(status) { info->GyroscopeAvailable = true; info->Pitch = data.eulerPitch; info->Roll = data.eulerRoll; info->MagneticHeadingAvailable = true; info->MagneticHeading = data.magneticHeading; info->AccelerationAvailable = false; //true; info->AccelX = data.accelX; info->AccelY = data.accelY; info->AccelZ = data.accelZ; } #ifdef TEST_TRI_PAGE static bool TRI_on = false; if( CURTYPE == IM_TRI) { if( TRI_on == false) DoStatusMessage(_T("TRI_ON")); TRI_on = true; } else { if( TRI_on == true) DoStatusMessage(_T("TRI_OFF")); TRI_on = false; } #endif /*********************************************************** * this is a hack, to prevent CPU overload on fast Gyro updates * should be solved with a own thread in case external * AHRS will become more common ***********************************************************/ if( CURTYPE == IM_TRI) /* refresh if TRI is active only */ { TriggerGPSUpdate(); } return status; }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /// Parses LXWP2 sentence. /// /// @param d device descriptor /// @param sentence received NMEA sentence /// @param info GPS info to be updated /// /// @retval true if the sentence has been parsed /// //static bool DevLX16xx::LXWP2(PDeviceDescriptor_t, const TCHAR* sentence, NMEA_INFO*) { // $LXWP2,mccready,ballast,bugs,polar_a,polar_b,polar_c, audio volume // *CS<CR><LF> // // Mccready: float in m/s // Ballast: float 1.0 ... 1.5 // Bugs: 0 - 100% // polar_a: float polar_a=a/10000 w=a*v2+b*v+c // polar_b: float polar_b=b/100 v=(km/h/100) w=(m/s) // polar_c: float polar_c=c // audio volume 0 - 100% //float fBallast,fBugs, polar_a, polar_b, polar_c, fVolume; double fTmp; int iTmp; if(MacCreadyUpdateTimeout > 0) { MacCreadyUpdateTimeout--; } else if (ParToDouble(sentence, 0, &fTmp)) { iTmp =(int) (fTmp*100.0+0.5f); fTmp = (double)(iTmp)/100.0; bValid = true; if(fabs(MACCREADY - fTmp)> 0.001) { CheckSetMACCREADY(fTmp); iLX16xx_RxUpdateTime =5; } } if(BallastUpdateTimeout > 0) { BallastUpdateTimeout--; } else if (ParToDouble(sentence, 1, &fTmp)) { double newBallast = CalculateBalastFromLX(fTmp); if(fabs(newBallast- BALLAST) > 0.01 ) { CheckSetBallast(newBallast); iLX16xx_RxUpdateTime = 5; } } if(BugsUpdateTimeout > 0) { BugsUpdateTimeout--; } else { if(ParToDouble(sentence, 2, &fTmp)) { double newBug = CalculateBugsFromLX(fTmp); if( fabs(newBug -BUGS) >= 0.03) { CheckSetBugs(newBug); iLX16xx_RxUpdateTime = 5; } } } if (ParToDouble(sentence, 3, &fTmp)) fPolar_a = fTmp; if (ParToDouble(sentence, 4, &fTmp)) fPolar_b = fTmp; if (ParToDouble(sentence, 5, &fTmp)) fPolar_c = fTmp; if (ParToDouble(sentence, 6, &fTmp)) { fVolume = fTmp; } return(true); } // LXWP2()
bool DevLXMiniMap::LXWP2(PDeviceDescriptor_t, const TCHAR* sentence, NMEA_INFO* info) { // $LXWP2,mccready,ballast,bugs,polar_a,polar_b,polar_c, audio volume // *CS<CR><LF> // // Mccready: float in m/s // Ballast: float 1.0 ... 1.5 // Bugs: 0 - 100% // polar_a: float polar_a=a/10000 w=a*v2+b*v+c // polar_b: float polar_b=b/100 v=(km/h/100) w=(m/s) // polar_c: float polar_c=c // audio volume 0 - 100% if(McReadyTimeout>0) { McReadyTimeout--; } else { ParToDouble(sentence, 0, &info->MacReady); CheckSetMACCREADY(info->MacReady); } if(BallastTimeout>0) { BallastTimeout--; } else { double tempBallastFactor; ParToDouble(sentence, 1, &tempBallastFactor); double newBallast = CalculateBalast(tempBallastFactor); if(fabs(newBallast- BALLAST) > 0.01 ) { CheckSetBallast(newBallast); } } if(BugsTimeout>0) { BugsTimeout--; } else { double tempBugs; ParToDouble(sentence, 2, &tempBugs); tempBugs = (100.0 - tempBugs)/100; if(fabs(tempBugs -BUGS) > 0.01) { CheckSetBugs(tempBugs); } } return(true); } // LXWP2()