void * display_run(void *v) { struct display_run_args *d_args = v; ending_t ending = d_args->ending; controller_state_t cs = d_args->cs; (void)cs; graphics_init(); while (1) { if (ending_get(ending)) { break; } SDL_Delay(100); draw_display(); print_info("display looping"); } graphics_deinit(); print_info("display exiting"); return NULL; }
static void refresh_display(void) { struct xy pos; int i; do_refresh = 0; draw_clear(); draw_activity(1); switch (visual) { case VIEW_SATS: draw_sats(&gps_state); break; case VIEW_MAP: /* show map scale */ if (show_scale) draw_scale(); /* show gps coordinates */ if (show_gpscoords) draw_gpscoords(); vfdlib_setClipArea(0, 0, VFD_WIDTH - VFD_HEIGHT, VFD_HEIGHT); /* draw tracklog */ if (show_track) track_draw(); /* draw route we're following */ route_draw(&gps_coord.xy); /* highlight waypoints */ i = 0; while (route_getwp(i, &pos, NULL, NULL)) { draw_point(&pos, VFDSHADE_BRIGHT); if (i++ != nextwp) continue; /* add focus to next waypoint */ draw_mark(&pos, -1, VFDSHADE_MEDIUM); } /* draw our own location */ draw_mark(&gps_coord.xy, gps_bearing, VFDSHADE_BRIGHT); vfdlib_setClipArea(0, 0, VFD_WIDTH, VFD_HEIGHT); draw_info(); break; case VIEW_ROUTE: draw_wpstext(); break; } if (load_route) routes_list(); else if (menu) draw_msg(menu_msg[menu_pos]); else if (lastmenu) { char *msg=NULL; lastmenu--; switch(menu_pos) { case 2: switch (show_popups) { case 0: msg = "No Popups"; break; case 1: msg = "Popups"; break; case 2: msg = "Permanent Popups"; break; } break; case 3: msg = (show_metric?"Meters":"Miles"); break; case 4: msg = (show_gpscoords?"Coordinates":"No Coordinates"); break; case 5: msg = (show_time?"Time":"Distance"); break; case 6: msg = (show_track?"Track":"No Track"); break; case 7: switch (coord_format) { case 0: msg = "DDD Coords"; break; case 1: msg = "DMM Coords"; break; case 2: msg = "DMS Coords"; break; } break; } if (msg) draw_msg(msg); } draw_display(); #ifndef __arm__ { extern int stats_toTM; extern int stats_distance; extern int stats_bearing; fprintf(stderr, "conv stats: GPS>TM %d DIST %d HDG %d\n", stats_toTM, stats_distance, stats_bearing); stats_toTM = stats_distance = stats_bearing = 0; } #endif }
int main(int argc, char **argv) { const char *menu[] = { "GPSapp", NULL }; struct timeval timeout; int rc = 0; if (empeg_init() == -1) exit(0); /* set a default protocol, now we only complain when the user specifies an * unknown protocol in config.ini */ serial_protocol("NMEA"); /* For backward compatibility as the user can specify the protocol in * config.ini */ if (argc > 1) serial_protocol(argv[1]); init_gpsapp(); printf("GPS app started\n"); vfdlib_registerFont("empeg/lib/fonts/small.bf", 0); vfdlib_registerFont("empeg/lib/fonts/large.bf", 1); h0 = vfdlib_getTextHeight(0); route_init(); while (rc != -1) { if (empeg_waitmenu(menu) == -1) break; serial_open(); draw_msg("Waiting for data from GPS receiver"); draw_display(); while(1) { rc = handle_input(); if (rc) break; if (do_refresh) refresh_display(); /* pause a bit to avoid burning CPU cycles */ timeout.tv_sec = 0; timeout.tv_usec = 100000; select(0, NULL, NULL, NULL, &timeout); } #ifndef __arm__ break; #endif } serial_close(); route_init(); draw_msg("GPS app dying..."); draw_display(); sleep(5); vfdlib_unregisterAllFonts(); empeg_free(); exit(0); }