static void OnBugsData(DataField *Sender, DataField::DataAccessKind_t Mode){ static double lastRead = -1; switch(Mode){ case DataField::daGet: lastRead = BUGS; Sender->Set(BUGS*100); break; case DataField::daChange: case DataField::daPut: if (fabs(lastRead-Sender->GetAsFloat()/100.0) >= 0.005) { lastRead = CheckSetBugs(Sender->GetAsFloat()/100.0); GlidePolar::SetBallast(); devPutBugs(devA(), BUGS); devPutBugs(devB(), BUGS); } break; case DataField::daInc: case DataField::daDec: case DataField::daSpecial: break; } }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /// 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_EXP::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_EXP_MacCreadyUpdateTimeout > 0) { LXV7_EXP_MacCreadyUpdateTimeout--; } else if (ParToDouble(sentence, 0, &fTmp)) { iTmp =(int) (fTmp*100.0+0.5f); fTmp = (double)(iTmp)/100.0; LXV7_EXP_bValid = true; if(fabs(MACCREADY - fTmp)> 0.001) { CheckSetMACCREADY(fTmp); iLXV7_EXP_RxUpdateTime =5; } } if(LXV7_EXP_BallastUpdateTimeout > 0) { LXV7_EXP_BallastUpdateTimeout--; } else if (ParToDouble(sentence, 1, &fTmp)) { fTmp -= 1.0; if( fabs(fTmp -BALLAST) >= 0.05) { CheckSetBallast(fTmp); iLXV7_EXP_RxUpdateTime = 5; } } if(LXV7_EXP_BugsUpdateTimeout > 0) { LXV7_EXP_BugsUpdateTimeout--; } else if(ParToDouble(sentence, 2, &fTmp)) { int iTmp2 = 100-(int)(fTmp+0.5); fTmp = (double)iTmp2/100.0; if( fabs(fTmp -BUGS) >= 0.03) { CheckSetBugs(fTmp); iLXV7_EXP_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()
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /// 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()
void GlidePolar::SetBallast() { LockFlightData(); double BallastWeight; BallastLitres = WEIGHTS[2] * BALLAST; BallastWeight = GetAUW(); if (WingArea>0.1) { WingLoading = BallastWeight/WingArea; } else { WingLoading = 0; } BallastWeight = (double)sqrt(BallastWeight); #if BUGSTOP LKASSERT(BUGS!=0); #endif CheckSetBugs(BUGS); double bugfactor = 1.0/BUGS; #if BUGSTOP LKASSERT(BallastWeight!=0); #endif if (BallastWeight==0) BallastWeight=1; polar_a = POLAR[0] / BallastWeight*bugfactor; polar_b = POLAR[1] * bugfactor; polar_c = POLAR[2] * BallastWeight*bugfactor; // do preliminary scan to find min sink and best LD // this speeds up mcready calculations because we have a reduced range // to search across. // this also limits speed to fly to logical values (will never try // to fly slower than min sink speed) minsink = 10000.0; bestld = 0.0; int i; // Rounding errors could make SAFTEYSPEED 0.00xx and not 0 // Now below 3kmh we consider the speed wrong // MAXSAFETYSPEED WAS 200, = 720kmh!! if ((SAFTEYSPEED<1)||(SAFTEYSPEED>=MAXSAFETYSPEED)) { SAFTEYSPEED=MAXSAFETYSPEED-1; } iSAFETYSPEED=(int)SAFTEYSPEED; // sinkratecache is an array for m/s values!! i is the speed in m/s for(i=4;i<=MAXSPEED;i++) { double vtrack = (double)i; // TAS along bearing in cruise double thesinkrate = -SinkRate(polar_a,polar_b,polar_c,0,0,vtrack); #if BUGSTOP LKASSERT(thesinkrate!=0); #endif if (thesinkrate==0) thesinkrate=0.001; double ld = vtrack/thesinkrate; if (ld>=bestld) { bestld = ld; Vbestld = i; } if (thesinkrate<= minsink) { minsink = thesinkrate; Vminsink = i; } sinkratecache[i] = -thesinkrate; } UnlockFlightData(); }
static BOOL PWES1(PDeviceDescriptor_t d, TCHAR *String, NMEA_INFO *pGPS) { /* Sent by Westerboer VW1150 combining data stream from Flarm and VW1020. RMZ is being sent too, which is a problem. $PWES1,22,25,1,18,1,6,385,5 A B C D E F G H I 0 A Device 21 = VW1000, 21 = VW 1010, 22 = VW1020, 23 = VW1030 1 B Mc *10 25 = 2.5 m/s 2 C Vario /STF switch 0= Vario , 1 = STF 3 D integration time 18 = 18 s 4 E damping 1,2,3 ??? 5 F volume 0..8 6 G Wing load 200..999, 385 = 38,5kg/m2 7 H Bugs 0..20% */ TCHAR ctemp[80]; double fTemp; int iTmp; // Get MC Ready NMEAParser::ExtractParameter(String,ctemp,1); iTmp = (int)StrToDouble(ctemp,NULL); fTemp = (double)iTmp/10.0f; if(fabs(fTemp-MACCREADY)> 0.05) { MACCREADY = fTemp; iWEST_RxUpdateTime = 5; } // Get STF switch NMEAParser::ExtractParameter(String,ctemp,2); iTmp = (int)StrToDouble(ctemp,NULL); #ifdef STF_SWITCH EnableExternalTriggerCruise = true; static int iOldVarioSwitch=0; if(iTmp != iOldVarioSwitch) { iOldVarioSwitch = iTmp; if(iTmp) { ExternalTriggerCruise = true; ExternalTriggerCircling = false; } else { ExternalTriggerCruise = false; ExternalTriggerCircling = true; } } #endif NMEAParser::ExtractParameter(String,ctemp,6); iTmp = (int)StrToDouble(ctemp,NULL); fTemp = (double)iTmp/ 10.0f; if(fabs(fTemp-GlidePolar::WingLoading )> 0.05) { GlidePolar::WingLoading = fTemp; iWEST_RxUpdateTime = 5; } NMEAParser::ExtractParameter(String,ctemp,7); iTmp = (int) StrToDouble(ctemp,NULL); fTemp = (double)(100-iTmp)/100.0f; if(fabs(fTemp-BUGS)> 0.005) { CheckSetBugs(fTemp); iWEST_RxUpdateTime = 5; } return TRUE; }
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()