Esempio n. 1
0
void menuTelemetryNMEA3(uint8_t event)
{
    switch(event)
    {
    case EVT_KEY_BREAK(KEY_LEFT):
        chainMenu(menuTelemetryNMEA2);
        return;
    case EVT_KEY_BREAK(KEY_RIGHT):
        chainMenu(menuTelemetryNMEA4);
        return;
    case EVT_KEY_LONG(KEY_UP):
        NMEA_DisableRXD();
        chainMenu(menuStatisticsView);
        return;
    case EVT_KEY_LONG(KEY_DOWN):
        NMEA_DisableRXD();
        chainMenu(menuMainView);
        return;
    }
    initval (LONG_BUF(0), PACK_RMC, SOG);
    initval (LONG_BUF(1), PACK_RMC, COG);
    initval (SHORT_BUF(2), PACK_GGA, SAT);			// -> sbuf[2]
    title ('3');
    lcd_puts        (   0*FW,   1*FH, PSTR("GrndSpeed[knt]  Sat"));
    if (rbuf[0][0])				// if first position is 00, buffer is empty, taken as false 
    {							// any other value is true
        uint8_t i = 0;
        while (rbuf[0][i])
        {
            if (rbuf[0][i] == '.')		// find decimal point and insert End of String 3 positions higher
            {
                rbuf[0][i+3] = 0;
                break;
            }
            i++;
        }
        lcd_putsAtt   (   2*FW,   2*FH, VALSTR(0), APSIZE);		// speed over ground
    }
    else
        lcd_putsAtt   (   2*FW,   2*FH, val_unknown, APSIZE);

    lcd_putcAtt   (  19*FW,   1*FH, sbuf[2], 0);			// satellites in view

    lcd_puts        (   1*FW,   4*FH, PSTR("Course over ground") );
    lcd_putsAtt       (   2*FW,   5*FH, VALSTR(1), APSIZE);		// course over ground
}
Esempio n. 2
0
void NMEA_EnableRXD (void)
{
    for (i = 0; i < NB_LONG_BUF; i++)
    {
        ibuf[i] = 0;
        rbuf[i][0] = 0;
        xpack[i] = 0;
        xval[i] = 0;
    }
    initval (LONG_BUF(2), PACK_GGA, TIM);	// always get UTC time for timer
    state = WAIT_PACKET;					// wait for the next packet
    UCSR0B |=  (1 << RXEN0);				// enable RX
    UCSR0B |=  (1 << RXCIE0);				// enable Interrupt
}
Esempio n. 3
0
void menuProcNMEA2(uint8_t event)
{
    static uint8_t ignore_break;


    switch(event)
    {
// Menu navigation
    case EVT_KEY_BREAK(KEY_LEFT):
        if (ignore_break==1)  {
		    ignore_break=0;
                break;}
        chainMenu(menuProcNMEA1);
        break;
    case EVT_KEY_BREAK(KEY_RIGHT):
          if (ignore_break==1) {
		     ignore_break=0;
                 break;}
        chainMenu(menuProcNMEA3);
        break;
    case EVT_KEY_LONG(KEY_UP):
        NMEA_DisableRXD();
        chainMenu(menuProcStatistic);
        break;
    case EVT_KEY_LONG(KEY_DOWN):
        NMEA_DisableRXD();
        chainMenu(menuProc0);
        break;

//Beep setting
    case EVT_KEY_LONG(KEY_LEFT):
	  ignore_break = 1;
        beep_on=0;
        audioDefevent(AU_MENUS); 						// short blip 
        break;
    case EVT_KEY_LONG(KEY_RIGHT):
	  ignore_break = 1;
        beep_on=1;
        audioDefevent(AU_MENUS); 						// short blip
        break;

//Altitude setting
	        /*      Set a home position for altitude. Normally used before starting
      	  the model when GPS has got a fix.
	        MENU[short]         		-->	alternating relative and absolute altitudes
		  MENU[long]			-->   set home altitude to current
		  EXIT[long]			-->   reset max altitude to 0

		  Switch ON / OFF short beep with positive lift
		  LEFT[long]			-->	Positive lift Beep off
		  RIGHT[long]			-->	Positive lift Beep on		*/


    case EVT_KEY_BREAK(KEY_MENU):
        if (ignore_break==1)  {
		    ignore_break=0;
                break;}

        if (!home_alt)				// umschalten zwischen absoluter und relativer Höhe
            home_alt = save_alt;
        else
            home_alt=0;	

	  if (save_alt==0)			// wenn noch keine Home Höhe gesetzt war, wird sie es jetzt, weil sonst
							// das Umschalten keine Wirkung zeigt
	      save_alt = home_alt = abs_alt;			// absolute altitude
        audioDefevent(AU_MENUS); 						// short blip for non negative lift
        break;

    case EVT_KEY_LONG(KEY_MENU):
	  ignore_break = 1;
        save_alt = home_alt = abs_alt;	// Home altitude auf aktuelle absolute Höhe setzen
        audioDefevent(AU_MENUS); 						// short blip for non negative lift
        break;

    case EVT_KEY_LONG(KEY_EXIT):		// Max Altitude auf 0 zurücksetzen
	  max_alt=0;
        audioDefevent(AU_MENUS); 						// short blip for non negative lift
        break;

    }
    title ('2');
    
    lcd_puts_P         (   1*FW,   1*FH, PSTR("Altitude Sat   Max"));


    lcd_puts_P         (   16*FW,   3*FH, PSTR("Home"));
    lcd_puts_P         (   2*FW,   4*FH, PSTR("Lift") );

    lcd_puts_P         (   16*FW,   5*FH, PSTR("Beep") );
    if (beep_on==1)
        lcd_puts_P         (   18*FW,   6*FH, PSTR("ON") );
    
    else	
        lcd_puts_P         (   17*FW,   6*FH, PSTR("OFF") );


    lcd_outdezNAtt(  20*FW,   4*FH, home_alt, PREC1, 6);		// display home_alt, small characters 

    if (xpack[0] != PACK_GGA)
        ggareceived = 0;

    initval (LONG_BUF(0), PACK_GGA, ALT);				// -> rbuf[0]
    initval (LONG_BUF(1), PACK_GGA, GEO);				// -> rbuf[1]
    initval (SHORT_BUF(0), PACK_GGA, MTR);			// -> sbuf[0]
    initval (SHORT_BUF(1), PACK_GGA, FIX);			// -> sbuf[1]
    initval (SHORT_BUF(2), PACK_GGA, SAT);			// -> sbuf[2]

    if (ggareceived)   // at least one second has elapsed
    {
        ggareceived = 0;

        /*      ALT and GEO have one single digit following the decimal point
        e.g. ALT=359.7   GEO=47.7
        The altitude over mean sea level is to be calculated as:
        altitude minus geoidal separation  
        */

        abs_alt = binary(rbuf[0]) - binary(rbuf[1]);		// alt - geo  that is absolute altitude

	  if (abs_alt> max_alt) max_alt=abs_alt;			// hold max altitude relative to 0 m

	  rel_alt=abs_alt - home_alt;					// alt - geo - home  altitude relative to home


        lift_alt = rel_alt - prev_alt;
        prev_alt = rel_alt;

        if ((lift_alt >= 0) && (sbuf[1]>0x30) && beep_on)			// GGA record must have Fix> 0	
            audioDefevent(AU_MENUS); 						// short blip for non negative lift

    }

    if (rbuf[0][0])	 {						
	  lcd_putcAtt   (  13*FW,   1*FH, sbuf[2], 0);				// satellites in view

	  if (sbuf[1]>0x30)	 {							// & GGA has FIX > 0


	        lcd_outdezNAtt(  10*FW,   2*FH, rel_alt, DBLSIZE|PREC1, 7);	// altitude
	
		  if (home_alt >= 0) 
			  lcd_outdezNAtt(  20*FW,   2*FH, (max_alt-home_alt), PREC1, 6);	// display small characters
		  else
			  lcd_outdezNAtt(  20*FW,   2*FH, max_alt, PREC1, 6);			// display small characters
	

	        lcd_putcAtt   (  11*FW,   3*FH, sbuf[0], 0);				// dimension [m]

      	  lcd_outdezNAtt(  10*FW,   5*FH, lift_alt, DBLSIZE|PREC1, 6);	// lift
	        lcd_putcAtt   (  11*FW,   6*FH, sbuf[0], 0);				// dimension [m/S]
      	  lcd_puts_P    (  12*FW,   6*FH, PSTR("/S") );
		}
    }
    else {
        lcd_putsAtt    (   2*FW,   2*FH, val_unknown, APSIZE);
        lcd_putsAtt    (   2*FW,   5*FH, val_unknown, APSIZE);
    }
}
Esempio n. 4
0
void menuProcNMEA1(uint8_t event)
{
    switch(event)						// new event received, branch accordingly
    {
    case EVT_KEY_BREAK(KEY_LEFT):
        chainMenu(menuProcNMEA4);
        break;
    case EVT_KEY_BREAK(KEY_RIGHT):
        chainMenu(menuProcNMEA2);
        break;
    case EVT_KEY_LONG(KEY_UP):
        NMEA_DisableRXD();
        chainMenu(menuProcStatistic);
        break;
    case EVT_KEY_LONG(KEY_DOWN):
        NMEA_DisableRXD();
        chainMenu(menuProc0);
        break;
    case EVT_KEY_FIRST(KEY_MENU):
        if (show_timer == 0) {
            show_timer = 1;
            if (gpstimer <= 0)
                gpstimer = bintime(rbuf[2]);
        }
        else
            show_timer = 0;
        break;
    case EVT_KEY_FIRST(KEY_EXIT):
        if ((show_timer == 1) &&(rbuf[2][0]))
            gpstimer = bintime(rbuf[2]);		// get actual GPS time ->resets timer to 00:00
        break;
    }
    /*
    How to use:

    You choose the values to be displayed using the function:

      initval(<number>, <packet>, <value>);
      -------------------------------------

    That means that "<value>" of "<packet>" is stored in the <number> buffer.
    The first <number> is 0.

    Here are the packet names and the associated value names:

    Position packet (beginning with "GGA"): "PACK_GGA"
    value names: "TIM", "LAT", "NOS", "LON", "EOW", "FIX", "SAT", "DIL", "ALT", "MTR", "GEO", "MET", "AGE", "DIF",

    Required minimum packet (beginning with "RMC"): "PACK_RMC"
       value names: "TIM", "NRW", "LT1", "NSO", "LN1", "EWE", "SOG", "COG", "DAT", "MAG", "EAW"

    The buffers are accessed using the macro "VALSTR(<n>)", where "<n>" is "0"
    for the first buffer, and "1" for the second buffer.

    When a value is missing, it is replaced by the contents of val_unknown ("?").
*/

    if (ggareceived)
    {
        gpstime=bintime(rbuf[2]);
        ggareceived=0;
    }

    initval (LONG_BUF(0), PACK_RMC, TIM);					// sets rbuf[0][.]
    initval (LONG_BUF(1), PACK_RMC, DAT);					// sets rbuf[1][.]
    initval (SHORT_BUF(0), PACK_RMC, NRW);				// sets sbuf[0]
    initval (SHORT_BUF(2), PACK_GGA, SAT);				// -> sbuf[2]


    title ('1');
    lcd_puts_P        (   2*FW,   1*FH, PSTR("UTC-Time      Sat"));

    if (rbuf[0][0]) {								// show always if data have been received
	  lcd_putcAtt   (  19*FW,   1*FH, sbuf[2], 0);				// satellites in view
        lcd_putsnAtt  (   2*FW,   2*FH, &rbuf[0][0], 2, APSIZE);		// hours
        lcd_putcAtt   (   6*FW,   2*FH, ':', DBLSIZE);			// ":"
        lcd_putsnAtt  (   8*FW,   2*FH, &rbuf[0][2], 2, APSIZE);		// minutes
        lcd_putcAtt   (  12*FW,   2*FH, ':', DBLSIZE);			// ":"
        lcd_putsnAtt  (  14*FW,   2*FH, &rbuf[0][4], 2, APSIZE);		// seconds
    }
    else
        lcd_putsAtt   (   2*FW,   2*FH, val_unknown, APSIZE);		// "?"

    if ((show_timer == 1) && rbuf[0][0])  {					// show the Timer when data have been received

        lcd_puts_P    (   2*FW,   4*FH, PSTR("Timer"));			// display "Timer"
        putsTime      (   5*FW,   5*FH, (gpstime-gpstimer), DBLSIZE, DBLSIZE);	// display difference as mm:ss
    }
    else
    {
        lcd_puts_P      ( 2*FW,   4*FH, PSTR("Date"));			// show the UTC Date	

        if (rbuf[1][0])	{
            lcd_putsnAtt( 2*FW,   5*FH, &rbuf[1][0], 2, APSIZE);		// year
            lcd_putcAtt ( 6*FW,   5*FH, '/', DBLSIZE);			// "/" 
            lcd_putsnAtt( 8*FW,   5*FH, &rbuf[1][2], 2, APSIZE);		// month
            lcd_putcAtt (12*FW,   5*FH, '/', DBLSIZE);			// "/"
            lcd_putsnAtt(14*FW,   5*FH, &rbuf[1][4], 2, APSIZE);		// day
        }
        else
            lcd_putsAtt   (   2*FW,   5*FH, val_unknown, APSIZE);		// "?"
    }
}
Esempio n. 5
0
//===============================================================================
void menuProcNMEA3(uint8_t event)
{
    passes +=1;
    count=increasing=0;

    switch(event)
    {
    case EVT_KEY_BREAK(KEY_LEFT):
        chainMenu(menuProcNMEA2);
        break;
    case EVT_KEY_BREAK(KEY_RIGHT):
        chainMenu(menuProcNMEA4);
        break;
    case EVT_KEY_LONG(KEY_UP):
        NMEA_DisableRXD();
        chainMenu(menuProcStatistic);
        break;
    case EVT_KEY_LONG(KEY_DOWN):
        NMEA_DisableRXD();

#if defined(OPEN9X)
        chainMenu(menuMainView);
#else
        chainMenu(menuProc0);
#endif

        break;
    }
    if (rmcreceived) {
	    rmcreceived=0;
	    passes=0;
	    initval (LONG_BUF(0), PACK_RMC, SOG);
	    initval (LONG_BUF(1), PACK_RMC, COG);
    }
    if (ggareceived) {
	    initval (SHORT_BUF(1), PACK_GGA, FIX);				// -> sbuf[1]
	    fixed=(sbuf[1]>0x30) ? ATTRIB : 0 ;
	    ggareceived=0;
//	    passes=0;
    }

    title ('3');
    my_lcd_puts        (   0*FW,   1*FH, PSTR("GrndSpeed[knt]  Sat"));
    my_lcd_puts        (   1*FW,   4*FH, PSTR("Course over ground") );
    if (rbuf[0][0])				// if first position is 00, buffer is empty, taken as false 
    {							// any other value is true
        uint8_t i = 0;
        while (rbuf[0][i])
        {
            if (rbuf[0][i] == '.')		// find decimal point and insert End of String 3 positions higher
            {
                rbuf[0][i+3] = 0;
                break;
            }
            i++;
        }
        lcd_putsAtt   (   2*FW,   2*FH, VALSTR(0), APSIZE);			// speed over ground
        lcd_putsAtt   (   2*FW,   5*FH, VALSTR(1), APSIZE);		// course over ground

	  initval (LONG_BUF(4), PACK_GGA, SAT);					// -> rbuf[4]			
	  lcd_putsnAtt  (19*FW,   1*FH, &rbuf[4][0], 2, 16+fixed);	// satellites in view, //?invers if Fixed	

    }
    question(9,3);		// large blinking Questionmark in case of timeout
}
Esempio n. 6
0
//==============================================================================
void menuProcNMEA2(uint8_t event)
{
    static int8_t set_home;
    passes +=1;

    switch(event)
    {
// Menu navigation
    case EVT_KEY_BREAK(KEY_LEFT):
        chainMenu(menuProcNMEA1);
        break;
  
    case EVT_KEY_BREAK(KEY_RIGHT):
        chainMenu(menuProcNMEA3);
        break;

//Beep setting
    case EVT_KEY_BREAK(KEY_UP):					
        killEvents(event);
	  beep_on = beep_on ^ 1;					// toggle Beep ON/OFF				
        audioDefevent(AU_MENUS); 					// short blip 
        break;

    case EVT_KEY_LONG(KEY_UP):
        NMEA_DisableRXD();
        chainMenu(menuProcStatistic);
        break;

//Voice setting
    case EVT_KEY_BREAK(KEY_DOWN):					// Switch Voice on/off
        killEvents(event);
	  beep_on = beep_on ^ 2;					// toggle Voice ON/OFF
        audioDefevent(AU_MENUS); 					// short blip
	  v_prev_alt=0;
	  prev_dist=0;
        break;

    case EVT_KEY_LONG(KEY_DOWN):
        NMEA_DisableRXD();

#if defined(OPEN9X)
        chainMenu(menuMainView);
#else
        chainMenu(menuProc0);
#endif

/*
        break;
//Beep setting
    case EVT_KEY_FIRST(KEY_UP):					
        killEvents(event);
	  beep_on = beep_on ^ 1;					// toggle Beep ON/OFF				
        audioDefevent(AU_MENUS); 					// short blip 
        break;

//Voice setting
    case EVT_KEY_FIRST(KEY_DOWN):					// Switch Voice on/off
        killEvents(event);
	  beep_on = beep_on ^ 2;					// toggle Voice ON/OFF
        audioDefevent(AU_MENUS); 					// short blip
	  v_prev_alt=0;
	  prev_dist=0;
        break;
*/
/*
Altitude setting:
	        Set a home position for altitude. Normally used before starting the model
		  when GPS has got a fix.

	        MENU[short]         		-->	alternating relative and absolute altitudes
		  MENU[long]			-->   set home altitude to current altitude
		  EXIT[long]			-->   reset max altitude to 0

	  Switch ON / OFF short beep with positive lift
		  DOWN[short]			-->	Toggle Positive lift Beep on/off

	  Switch ON / OFF voice for altitude and distance
		  UP[short]				-->	Toggle voice message of altitude and distance on/off		
*/


    case EVT_KEY_BREAK(KEY_MENU):		// Menu short
        if (!home_alt)				// umschalten zwischen absoluter und relativer Höhe
            home_alt = save_alt;
        else
            home_alt=0;	

	  if (save_alt==0)			// wenn noch keine Home Höhe gesetzt war, wird sie es jetzt, weil sonst
							// das Umschalten keine Wirkung zeigt
	      save_alt = home_alt = abs_alt;			// absolute altitude
        audioDefevent(AU_MENUS);  						// short blip for non negative lift
        break;

    case EVT_KEY_LONG(KEY_MENU):		// Menu long, set home position
        killEvents(event);
	  set_home=1;
        save_alt = home_alt =abs_alt ;				// Home altitude auf aktuelle absolute Höhe setzen 
	  max_alt=0;							// es ist irritierend, wenn max_alt bestehen bliebe
	  d_pass = max_pass>>1;

        audioDefevent(AU_MENUS); 						// short blip
        break;

    case EVT_KEY_BREAK(KEY_EXIT):		// Exit short resets max_alt and MaxDistance
	  MaxDistance = max_alt = 0;
        audioDefevent(AU_MENUS); 						// short blip
	  break;

    case EVT_KEY_LONG(KEY_EXIT):		// Exit long resets all distance and altitude values
        killEvents(event);
	 pilotLatitude=pilotLongitude=LastDistance=MaxDistance=save_alt = home_alt = abs_alt=max_alt=increasing=decreasing=0;
        audioDefevent(AU_MENUS); 						// short blip
        break;
    }


	title ('2');

	my_lcd_puts         (   1*FW,   1*FH, PSTR("Altitude Sat   Max"));
	my_lcd_puts         (   16*FW,   3*FH, PSTR("Home"));
	my_lcd_puts         (   1*FW,   4*FH, PSTR("Lift") );

	lcd_putsAtt (16*FW, 5*FH, PSTR("Beep"), ((beep_on==1)|(beep_on==3)));  
	lcd_putsAtt (16*FW, 6*FH, PSTR("Voice"), (beep_on >=2));  

/*
	lcd_putcAtt( 16*FW, 5*FH, 'B', ((beep_on==1)|(beep_on==3)));  	//first letter inverted if active
      my_lcd_puts(   17*FW,   5*FH, PSTR("eep") );

	lcd_putcAtt( 16*FW, 6*FH, 'V', (beep_on>=2)) ;				//first letter inverted if active
      my_lcd_puts( 17*FW, 6*FH, PSTR("oice") );
*/

      lcd_outdezNAtt(  20*FW,   4*FH, home_alt, PREC1, 6);		// display home_alt, small characters 

	rmcreceived=0;		// RMC Pack not used

//----------------------------------------
	if (ggareceived)   // at least one second has elapsed
	{
      	ggareceived = 0;
		passes=0;
		if (count < MaxCount) count +=1;


		initval (LONG_BUF(0), PACK_GGA, ALT);				// -> rbuf[0]
		initval (LONG_BUF(1), PACK_GGA, GEO);				// -> rbuf[1]

		initval (SHORT_BUF(0), PACK_GGA, MTR);			// -> sbuf[0]


		initval (SHORT_BUF(1), PACK_GGA, FIX);				// -> sbuf[1]
		initval (SHORT_BUF(2), PACK_GGA, SAT);				// -> sbuf[2]

		fixed=(sbuf[1]>0x30) ? ATTRIB : 0 ;
		satellites=sbuf[2];


        /*      ALT and GEO have one single digit following the decimal point
        e.g. ALT=359.7   GEO=47.7
        The altitude over mean sea level is to be calculated as:
        altitude minus geoidal separation  
        */

		abs_alt = binary(rbuf[0]) - binary(rbuf[1]);		// alt - geo  that is absolute altitude

		if (abs_alt> max_alt) max_alt=abs_alt;			// hold max altitude relative to 0 m

		rel_alt=abs_alt - home_alt;					// alt - geo - home  altitude relative to home


		initval (LONG_BUF(2), PACK_GGA, LAT);				// -> rbuf[2]
		gpsLatitude_bp=split((rbuf[2]),DP);				// Latitude before decimal point
		gpsLatitude_ap=split((rbuf[2]),EOS); 				// Latitude after decimal point


		initval (LONG_BUF(3), PACK_GGA, LON);				// -> rbuf[3]
		gpsLongitude_bp=split((rbuf[3]),DP);				// Longitude before decimal point
		gpsLongitude_ap=split((rbuf[3]),EOS); 				// Longitude after decimal point

		if ((a_pass >= max_pass) | ((a_pass + d_pass) > max2_pass))
		{	
			// Höhe ändert sich
			uint16_t alt_diff = (rel_alt > v_prev_alt) ? rel_alt - v_prev_alt: v_prev_alt - rel_alt ;

			if ((fixed) && (beep_on & 0x2) && (alt_diff >= 100))		// diff of 10 m
		  	{
	      		v_prev_alt = rel_alt;			// kann auch negativ sein
				if (rel_alt > 0)				// nur positive Werte ansagen. voice kann nicht negative
				{
					a_pass = 0;
					putVoiceQueue(V_ALTITUDE) ;						//!!!!!!!!!!!!!!!!
					voice_numeric(rel_alt/10, 0,V_METRES);				//!!!!!!!!!!!!!!!!
				}
			}
		}
		lift_alt = rel_alt - prev_alt;
		prev_alt = rel_alt;
											//!!!!!!!!!!!!!!
		if ((lift_alt >= 0) && (fixed) && (beep_on & 0x1))			// GGA record must have Fix> 0	
			audioDefevent(AU_MENUS); 						// short blip for non negative lift
											//!!!!!!!!!!!!!!!!!
	}
//----------------------------------------

// Shown value depends on home_alt.
// For home_alt=0 this is altitude relativeto sea level
// For home_alt > 0 this is altitude relative to home level

	lcd_outdezNAtt(  20*FW,   2*FH, (max_alt-home_alt), PREC1, 6);	// max_altitude rel 0 or home

//----------------------------------------
	if (pilotLatitude | (set_home))				// show distance only, when home position has been set
	{
		my_lcd_puts    (  11*FW,   4*FH, PSTR("Dist") );
		GpsDistance=getGpsDistance();


		if ((d_pass >= max_pass) | ((a_pass + d_pass) > max2_pass))
		{
			uint16_t dist_diff = (GpsDistance > prev_dist) ? GpsDistance - prev_dist: prev_dist - GpsDistance ;
			if ( (fixed) && (beep_on & 0x2) && (dist_diff >= 500) )		// diff of 50 m 
			{
				prev_dist=GpsDistance ;
				putVoiceQueue(V_DISTANCE) ;
				voice_numeric(GpsDistance/10, 0, V_METRES) ;
				d_pass = 0;
			}
		}
// GetGpsDistance intermittently returns a wrong, much to high value (e.g.3284.2 instead of 15.3)
// Try to catch it and avoid MaxDistance to go incorrectly high
// MaxDistance is only set, if two consecutive values are greater than MaxDistance

            if (count==MaxCount) 
		{
			if (set_home) 
			{
				LastDistance=MaxDistance=increasing=decreasing=0;
				getGpsPilotPosition();	
				pilotAltitude = abs_alt;
				set_home=0;
			}

			if (GpsDistance > MaxDistance) 
			{
				if (increasing)	
				{
					MaxDistance=LastDistance;
					increasing=0;
				}
				else	
				{
					increasing=1;
				}
		      }
     	      	else increasing=0;
	
			LastDistance=GpsDistance;
		      lcd_outdezNAtt(  15*FW,   5*FH, MaxDistance, PREC1, 6);   // Distance 
   		      lcd_outdezNAtt(  15*FW,   6*FH, GpsDistance, PREC1, 6);   // Distance 
           	}
		// on a communication loss, after a delay of some seconds, the last values are displayed
		else if (passes > 300) 
		{
			lcd_outdezNAtt(  15*FW,   5*FH, MaxDistance, PREC1, 6);   	// show last MaxDistance 
			lcd_outdezNAtt(  15*FW,   6*FH, LastDistance, PREC1, 6);   	// show LastDistance 
			lcd_putsAtt    ( 12*FW,  2*FH, val_unknown, 22);	// large blinking Questionmark above Dist.
		}
	}
//--------for Test only --------------------------------
/*
	initval (LONG_BUF(4), PACK_GGA, SAT);			// -> rbuf[4]	ER9X		open9x
	lcd_putsnAtt  (  12*FW,   2*FH, &rbuf[4][0], 2, 16);		//   small 		normal
	lcd_putsnAtt  (  12*FW,   3*FH, &rbuf[4][0], 2, 17);		//   invers		BLINK
	lcd_putsnAtt  (  12*FW,   4*FH, &rbuf[4][0], 2, 18);		//   blink		INVERS
	lcd_putsnAtt  (  12*FW,   5*FH, &rbuf[4][0], 2, 20);		//   big normal
*/
//----------------------------------------

#if defined(HUB)
	initval (LONG_BUF(5), PACK_LCL, RSSI);						// -> rbuf[4]			
	lcd_putsnAtt  (  12*FW,   3*FH, &rbuf[5][0], 3, 16);		//   small normal
	my_lcd_puts   (  14*FW,   3*FH, PSTR("%") );
#endif



	if (rbuf[0][0])	 
	{	
		initval (LONG_BUF(4), PACK_GGA, SAT);						// -> rbuf[4]			
		lcd_putsnAtt  (13*FW,   1*FH, &rbuf[4][0], 2, 16+fixed);	// satellites in view, //invers if Fixed	
		if (sbuf[1]>0x30)	
		{							// & GGA has FIX > "0"
			lcd_outdezNAtt(  10*FW,   2*FH, rel_alt, DBLSIZE|PREC1, 7);	// actual altitude
			lcd_putcAtt   (  10*FW,   3*FH, sbuf[0]+0x20, 0);	// dimension [m] as lower case

			lcd_outdezNAtt(  8*FW,   5*FH, lift_alt, DBLSIZE|PREC1, 6);	// lift

			my_lcd_puts    (  5*FW,   4*FH, PSTR("[ /s]") );
			lcd_putcAtt   (  6*FW,   4*FH, sbuf[0]+0x20, 0);	// dimension [m/s] as lower case
		}
	}
//----------------------------------------

//  in case we do not receive GGA packages(due to poor receiption) the passes count will increase accordingly.
    question(12,2);		// large blinking Questionmark in case of timeout
}
Esempio n. 7
0
void menuProcNMEA1(uint8_t event)
{
    if (rmcreceived) initval (LONG_BUF(0), PACK_RMC, TIM);		// sets rbuf[0][.]
    passes +=1;
    count=0;
    switch(event)						// new event received, branch accordingly
    {
    case EVT_KEY_BREAK(KEY_LEFT):
#if defined(HUB)
        chainMenu(menuProcNMEA5);
#else
        chainMenu(menuProcNMEA4);
#endif
        break;
    case EVT_KEY_BREAK(KEY_RIGHT):
        chainMenu(menuProcNMEA2);
        break;
    case EVT_KEY_LONG(KEY_UP):
        NMEA_DisableRXD();
        chainMenu(menuProcStatistic);
        break;
    case EVT_KEY_LONG(KEY_DOWN):
        NMEA_DisableRXD();

#if defined(OPEN9X)
        chainMenu(menuMainView);
#else
        chainMenu(menuProc0);
#endif

        break;
    case EVT_KEY_FIRST(KEY_MENU):
        if (show_timer == 0) {
            show_timer = 1;
            if (gpstimer <= 0)
                gpstimer = bintime(rbuf[0]);
        }
        else
            show_timer = 0;
        break;
    case EVT_KEY_FIRST(KEY_EXIT):
        if ((show_timer == 1) &&(rbuf[0][0])) {
            gpstimer = bintime(rbuf[0]);		// get actual GPS time ->resets timer to 00:00
		}
        break;
    }
    /*
    How to use:

    You choose the values to be displayed using the function:

      initval(<number>, <packet>, <value>);
      -------------------------------------

    That means that "<value>" of "<packet>" is stored in the <number> buffer.
    The first <number> is 0.

	$GPGGA,125109.272,5014.7262,N,01123.9966,E,2,07,1.2,624.7,M,47.7,M,1.9,0000*77
	$GPRMC,125109.272,A,5014.7262,N,01123.9966,E,33.439922,47.98,230711,,*09
    Here are the packet names and the associated value names:

    Position packet (beginning with "GGA"): "PACK_GGA"
    value names: "TIM", "LAT", "NOS", "LON", "EOW", "FIX", "SAT", "DIL", "ALT", "MTR", "GEO", "MET", "AGE", "DIF",

    Required minimum packet (beginning with "RMC"): "PACK_RMC"
       value names: "TIM", "NRW", "LT1", "NSO", "LN1", "EWE", "SOG", "COG", "DAT", "MAG", "EAW"

    The buffers are accessed using the macro "VALSTR(<n>)", where "<n>" is "0"
    for the first buffer, and "1" for the second buffer.

    sbuf is a single character buffer and contains the last value of a field ????
    rbuf[x][y] contains the full field

    When a value is missing, it is replaced by the contents of val_unknown ("?").
*/

    title ('1');
    my_lcd_puts        (   2*FW,   1*FH, PSTR("UTC-Time      Sat"));

    if (ggareceived) {
	  ggareceived=0;
	  passes=0;
	  initval (SHORT_BUF(1), PACK_GGA, FIX);				// -> sbuf[1]
	  fixed=(sbuf[1]>0x30) ? ATTRIB : 0 ;
    }

    if (rmcreceived) {
	  rmcreceived=0;
	  initval (LONG_BUF(1), PACK_RMC, DAT);					// sets rbuf[1][.]
	  gpstime=bintime(rbuf[0]);
    }

    if (rbuf[0][0]) {						// show always if RMC data have been received
	  initval (LONG_BUF(4), PACK_GGA, SAT);				// -> rbuf[4]			
	  lcd_putsnAtt  (  19*FW,   1*FH, &rbuf[4][0], 2, 16+fixed);	// satellites in view, invers if Fixed
	
     	  lcd_putsnAtt  (   2*FW,   2*FH, &rbuf[0][0], 2, APSIZE);		// hours
        lcd_putcAtt   (   6*FW,   2*FH, ':', DBLSIZE);			// ":"
     	  lcd_putsnAtt  (   8*FW,   2*FH, &rbuf[0][2], 2, APSIZE);		// minutes
        lcd_putcAtt   (  12*FW,   2*FH, ':', DBLSIZE);			// ":"
     	  lcd_putsnAtt  (  14*FW,   2*FH, &rbuf[0][4], 2, APSIZE);		// seconds
    }
    else
     	  lcd_putsAtt   (   2*FW,   2*FH, val_unknown, APSIZE);		// "?"


    if (show_timer)  {							// show the Timer when data have been received

        my_lcd_puts    (   2*FW,   4*FH, PSTR("Timer"));			// display "Timer"
     	  putsTime      (   5*FW,   5*FH, (gpstime-gpstimer), DBLSIZE, DBLSIZE);	// display difference as mm:ss
    }
    else
    {
     	  my_lcd_puts      ( 2*FW,   4*FH, PSTR("Date"));			// show the UTC Date	

        if (rbuf[1][0])	{
     	      lcd_putsnAtt( 2*FW,   5*FH, &rbuf[1][0], 2, APSIZE);		// year
           	lcd_putcAtt ( 6*FW,   5*FH, '/', DBLSIZE);			// "/" 
            lcd_putsnAtt( 8*FW,   5*FH, &rbuf[1][2], 2, APSIZE);		// month
     	      lcd_putcAtt (12*FW,   5*FH, '/', DBLSIZE);			// "/"
           	lcd_putsnAtt(14*FW,   5*FH, &rbuf[1][4], 2, APSIZE);		// day
        }
    } 
     question(9,3);		// large blinking Questionmark in case of timeout

}
Esempio n. 8
0
void menuProcNMEA5(uint8_t event)
{
    passes +=1;
    switch(event)
    {
    case EVT_KEY_BREAK(KEY_LEFT):
        chainMenu(menuProcNMEA4);
        break;
    case EVT_KEY_BREAK(KEY_RIGHT):
        chainMenu(menuProcNMEA1);
        break;
    case EVT_KEY_LONG(KEY_UP):
        NMEA_DisableRXD();
        chainMenu(menuProcStatistic);
        break;
    case EVT_KEY_LONG(KEY_DOWN):
        NMEA_DisableRXD();

#if defined(OPEN9X)
        chainMenu(menuMainView);
#else
        chainMenu(menuProc0);
#endif

        break;
    }

    title ('5');

    if (ggareceived) {
	    initval (SHORT_BUF(1), PACK_GGA, FIX);				// -> sbuf[1]
	    fixed=(sbuf[1]>0x30) ? ATTRIB : 0 ;
	    my_lcd_puts        (   0*FW,   1*FH, PSTR("HUB Data        Sat"));

	    initval (LONG_BUF(6), PACK_GGA, SAT);					// -> rbuf[4]			
	    lcd_putsnAtt  (19*FW,   1*FH, &rbuf[6][0], 2, 16+fixed);	// satellites in view, //?invers if Fixed	
	    ggareceived=0;
	    passes=0;
    }
	if (lclreceived) {
		    lclreceived=0;
	    }
	my_lcd_puts ( 0*FW,   3*FH, PSTR("V1=    V3=    V5="));    
	my_lcd_puts ( 0*FW,   4*FH, PSTR("V2=    V4=    V6="));   
	my_lcd_puts ( 0*FW,   7*FH, PSTR("RPM=        Sw="));  

      initval (LONG_BUF(0), PACK_LCL, VOLT1);					// -> rbuf[0]			
	if (rbuf[0][0])				// if first position is 00, buffer is empty, taken as false 
	    {							// any other value is true
	      lcd_outdezNAtt(   6*FW,   3*FH, binary(&rbuf[0][0]), PREC2, 3);		
      	initval (LONG_BUF(1), PACK_LCL, VOLT2);					// -> rbuf[1]			
	      lcd_outdezNAtt(   6*FW,   4*FH, binary(&rbuf[1][0]), PREC2, 3);		
      	initval (LONG_BUF(2), PACK_LCL, VOLT3);					// -> rbuf[2]			
	      lcd_outdezNAtt(   13*FW,   3*FH, binary(&rbuf[2][0]), PREC2, 4);		
      	initval (LONG_BUF(3), PACK_LCL, VOLT4);					// -> rbuf[3]			
	      lcd_outdezNAtt(   13*FW,   4*FH, binary(&rbuf[3][0]), PREC2, 4);		
      	initval (LONG_BUF(4), PACK_LCL, VOLT5);					// -> rbuf[4]			
	      lcd_outdezNAtt(   21*FW,   3*FH, binary(&rbuf[4][0]), PREC2, 4);		
      	initval (LONG_BUF(5), PACK_LCL, VOLT6);					// -> rbuf[5]		
	      lcd_outdezNAtt(   21*FW,   4*FH, binary(&rbuf[5][0]), PREC2, 4);		

      	initval (LONG_BUF(7), PACK_LCL, RPM);					// -> rbuf[7]			
	      lcd_outdezNAtt( 11*FW,   6*FH, binary(&rbuf[7][0]), DBLSIZE, 5);		


      	initval (LONG_BUF(8), PACK_LCL, DIGIN);					// -> rbuf[8]
		int32_t LongByte = binary(rbuf[8]) ;    
		// shift bit 5 to high order position; 
		int8_t MyByte=LongByte <<2;
		for (i=0;i<6;++i) {
			//if High order bit is ON value is negative, show number invers
			lcd_putsnAtt  ((15+i)*FW,   7*FH, &Switches[i], 1, 16+(MyByte < 0));		
			MyByte= MyByte <<1;
		}
	    }
    question(8,3);		// large blinking Questionmark in case of timeout
}
Esempio n. 9
0
//===============================================================================
void menuProcNMEA4(uint8_t event)
{
    passes +=1;
    switch(event)						// new event received, branch accordingly
    {
    case EVT_KEY_BREAK(KEY_LEFT):
        chainMenu(menuProcNMEA3);
        break;
    case EVT_KEY_BREAK(KEY_RIGHT):
#if defined(HUB)
        chainMenu(menuProcNMEA5);
#else
        chainMenu(menuProcNMEA1);
#endif
        break;
    case EVT_KEY_LONG(KEY_UP):
        NMEA_DisableRXD();
        chainMenu(menuProcStatistic);
        break;
    case EVT_KEY_LONG(KEY_DOWN):
        NMEA_DisableRXD();

#if defined(OPEN9X)
        chainMenu(menuMainView);
#else
        chainMenu(menuProc0);
#endif

        break;
    }

    if (ggareceived) {
	    ggareceived=0;
	    passes=0;

	    // expecting LAT value in POS packet to be stored in the first buffer
	    initval (LONG_BUF(0), PACK_GGA, LAT);
	    initval (SHORT_BUF(0), PACK_GGA, NOS);
	    // and LON value in POS packet stored in the second buffer
	    initval (LONG_BUF(1), PACK_GGA, LON);
	    initval (SHORT_BUF(3), PACK_GGA, EOW);

	    initval (SHORT_BUF(1), PACK_GGA, FIX);				// -> sbuf[1]
	    fixed=(sbuf[1]>0x30) ? ATTRIB : 0 ;
    }	

    // title of the screen
    title ('4');
    my_lcd_puts        (   3*FW,   1*FH, PSTR("Latitude     Sat"));    // line 1 column 3
    my_lcd_puts        (   3*FW,   4*FH, PSTR("Longitude"));   // line 4 column 5

    // first buffer into line 2 column 2
    if (rbuf[0][0])
    {
        lcd_putcAtt   (  13*FW,   1*FH, sbuf[0], 0);          // N or S

	  initval (LONG_BUF(4), PACK_GGA, SAT);					// -> rbuf[4]			
	  lcd_putsnAtt  (19*FW,   1*FH, &rbuf[4][0], 2, 16+fixed);	// satellites in view, //?invers if Fixed	

        lcd_putsnAtt  (   1*FW,   2*FH, rbuf[0], 2, APSIZE);
        lcd_putcAtt   (   5*FW,   2*FH, '@',0);
        lcd_putsAtt   (   6*FW,   2*FH, &rbuf[0][2], APSIZE);	// minutes with small decimal point

        lcd_putcAtt   (  13*FW,   4*FH, sbuf[3], 0);          // E or W
        lcd_putsnAtt  (   0*FW,   5*FH, rbuf[1], 3, APSIZE);
        lcd_putcAtt   (   6*FW,   5*FH, '@',0);
        lcd_putsAtt   (   7*FW,   5*FH, &rbuf[1][3], APSIZE);	// minutes with small decimal point

    }
    question(9,3);		// large blinking Questionmark in case of timeout


}