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 }
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 }
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); } }
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); // "?" } }
//=============================================================================== 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 }
//============================================================================== 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 }
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 }
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 }
//=============================================================================== 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 }