Exemplo n.º 1
0
static void em_decode(struct gps_state *gps)
{
    if (packet_idx < 1) return;

#ifndef __arm__
    fprintf(stderr, "receiving %x\n", packet[0]);
#endif

    /* NMEA lines should start with a '$' */
    if (packet[0] == 'E') {
        /* recognize earthmate's 'EARTHA' message */
        if (packet_idx >= 6 && memcmp(packet, "EARTHA", 6) == 0)
            serial_send("EARTHA\r\n", 8);
        return;
    }

    draw_activity(0);

    /* verify checksum XXX */

    switch(INT16(&packet[0])) {
    case 1000: em_1000geodpos(gps); break;
    case 1002: em_1002chsum(gps); break;
    case 1003: em_1003sats(gps); break;
    }
}
Exemplo n.º 2
0
/* redraw activity */
static void statusbar_activity(SBAR_ITEM_REC *item, int ypos)
{
    WINDOW_REC *window;
    GList *tmp;
    gchar str[MAX_INT_STRLEN];
    int size_needed;
    gboolean act, det;

    size_needed = 0; act = det = FALSE;
    for (tmp = activity_list; tmp != NULL; tmp = tmp->next)
    {
	window = tmp->data;

	size_needed += 1+ltoa(str, window->refnum);

	if (!use_colors && window->new_data == NEWDATA_MSG_FORYOU)
	    det = TRUE;
	else
	    act = TRUE;
    }

    if (act) size_needed += 6; /* [Act: ], -1 */
    if (det) size_needed += 6; /* [Det: ], -1 */
    if (act && det) size_needed--;

    if (item->size != size_needed)
    {
        /* we need more (or less..) space! */
        statusbar_item_resize(item, size_needed);
        return;
    }

    if (item->size == 0)
        return;

    move(ypos, item->xpos);
    set_color((1 << 4)+3); addch('[');
    if (act) draw_activity("Act: ", TRUE, !det);
    if (act && det) addch(' ');
    if (det) draw_activity("Det: ", FALSE, TRUE);
    set_color((1 << 4)+3); addch(']');

    screen_refresh();
}
Exemplo n.º 3
0
static void taip_decode(struct gps_state *gps)
{
    char buf[10];
    double speed, b;

    draw_activity(0);

    if (strcmp(packet, "RTM") == 0) {
	// datestamp = ???
    } else if (strcmp(packet, "RPV") == 0) {
	if (packet[32] == '0') return;

	memcpy(buf, &packet[3], 5); buf[5] = '\0';
	gps->time = strtol(buf, NULL, 10); // + datestamp;

	memcpy(buf, &packet[8], 8); buf[8] = '\0';
	gps->lat = degtorad((double)strtol(buf, NULL, 10) / 100000.0);

	memcpy(buf, &packet[16], 9); buf[9] = '\0';
	gps->lon = degtorad((double)strtol(buf, NULL, 10) / 100000.0);
	gps->updated |= GPS_STATE_COORD;

	memcpy(buf, &packet[28], 3); buf[3] = '\0';
	gps->bearing = strtol(buf, NULL, 10);
	gps->updated |= GPS_STATE_BEARING;

	memcpy(buf, &packet[25], 3); buf[3] = '\0';
	speed = (double)strtol(buf, NULL, 10) * 0.44704; // * 1609.344 / 3600

	b = degtorad(gps->bearing);
	gps->spd_east  = sin(b) * speed;
	gps->spd_north = cos(b) * speed;
	gps->spd_up    = 0.0;
	gps->updated |= GPS_STATE_SPEED;

	if (packet[31] == '9')
	    gps->bearing = -1;
    }
}
Exemplo n.º 4
0
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
}