Exemple #1
0
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);
}
Exemple #2
0
/*
 * 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);

}