BOOL DevLXMiniMap::LXMiniMapPutQNH(DeviceDescriptor_t *d, double NewQNH){ double xy = QNHAltitudeToQNEAltitude(1000.0); AltOffset = 1000.0 - xy; AltTimeoutWait = true; AlttimeOutTicker = GetTickCount(); TCHAR mcbuf[100]; _stprintf(mcbuf, TEXT("PFLX3,%.2f,,,,,,,,,,,,"),AltOffset * M2FT ); devWriteNMEAString(d, mcbuf); return(TRUE); }
/* * returns 0 if invalid, 999 if too high * EqMc is negative when no value is available, because recalculated and buffer still not usable */ double CalculateLDRotary(ldrotary_s *buf, NMEA_INFO *Basic, DERIVED_INFO *Calculated ) { double eff; #ifdef DEBUG_ROTARY short bcold; char ventabuffer[200]; FILE *fp; #endif double averias; double avertas; if ( Calculated->Circling || Calculated->OnGround || !Calculated->Flying ) { #ifdef DEBUG_ROTARY sprintf(ventabuffer,"Not Calculating, on ground or circling, or not flying\r\n"); if ((fp=fopen("DEBUG.TXT","a"))!= NULL) {;fprintf(fp,"%s\n",ventabuffer);fclose(fp);} #endif #if DEBUG_EQMC StartupStore(_T("... Circling, grounded or not flying, EqMc -1 (---)\n")); #endif Calculated->EqMc = -1; return(0); } if ( buf->start <0) { #ifdef DEBUG_ROTARY sprintf(ventabuffer,"Calculate: invalid buf start<0\r\n"); if ((fp=fopen("DEBUG.TXT","a"))!= NULL) {;fprintf(fp,"%s\n",ventabuffer);fclose(fp);} #endif #if DEBUG_EQMC StartupStore(_T("... Invalid buf start <0, EqMc -1 (---)\n")); #endif Calculated->EqMc = -1; return(0); } ldrotary_s bc; memcpy(&bc, buf, sizeof(ldrotary_s)); if (bc.valid == false ) { if (bc.start==0) { #if DEBUG_EQMC StartupStore(_T("... bc.valid is false, bc.start is 0, EqMc -1 (---)\n")); #endif Calculated->EqMc = -1; return(0); // unavailable } } // if ( bc.valid == true ) { // bcsize<=0 should NOT happen, but we check it for safety if ( (bc.valid == true) && bc.size>0 ) { averias = bc.totalias/bc.size; averias/=100; if (ISCAR) { Rotary_Speed=averias; } // We use GPS altitude to be sure that the tas is correct, we dont know in fact // if qnh is correct, while gps is generally accurate for the purpose. avertas=averias*AirDensityRatio(QNHAltitudeToQNEAltitude(Basic->Altitude)); // This is just to be sure we are not using an impossible part of the polar if (avertas>(GlidePolar::Vminsink()-8.3) && (avertas>0)) { // minsink - 30km/h Calculated->EqMc = GlidePolar::EquMC(averias); // Do not consider impossible MC values as Equivalent if (Calculated->EqMc>20) Calculated->EqMc=-1; } else { Calculated->EqMc=-1; #if DEBUG_EQMC StartupStore(_T(".......too slow for eqmc\n")); #endif } #if DEBUG_EQMC StartupStore(_T(".. eMC=%.2f (=%.1f) Averias=%f Avertas=%f kmh, sinktas=%.1f ms sinkmc0=%.1f ms Vbestld=%.1f Vminsink=%.1f\n"), Calculated->EqMc, Calculated->EqMc, averias*TOKPH, avertas*TOKPH,-1*GlidePolar::SinkRateFast(0,avertas), GlidePolar::SinkRateBestLd(), GlidePolar::Vbestld()*TOKPH, GlidePolar::Vminsink()*TOKPH); #endif } else { Calculated->EqMc=-1; #if DEBUG_EQMC StartupStore(_T(".... bc.valid=%d bc.size=%d <=0, no eqMc\n"), bc.valid,bc.start); #endif } Rotary_Distance=bc.totaldistance; if (bc.totalaltitude == 0 ) { return(INVALID_GR); // infinitum } eff= ((double)bc.totaldistance) / ((double)bc.totalaltitude); #ifdef DEBUG_ROTARY if (bc.valid && bc.start < (bc.size-1)) bcold=bc.start+1; else bcold=0; sprintf(ventabuffer,"bcstart=%d bcold=%d altnew=%d altold=%d altdiff=%d totaldistance=%d eff=%f\r\n", bc.start, bcold, bc.altitude[bc.start], bc.altitude[bcold], bc.totalaltitude, bc.totaldistance, eff); if ((fp=fopen("DEBUG.TXT","a"))!= NULL) {;fprintf(fp,"%s\n",ventabuffer);fclose(fp);} #endif if (eff>MAXEFFICIENCYSHOW) eff=INVALID_GR; return(eff); }