128 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <string.h>
 | 
						|
#include <stdarg.h>
 | 
						|
#include <inttypes.h>
 | 
						|
#include <sys/time.h>
 | 
						|
 | 
						|
#include <ncurses.h>
 | 
						|
 | 
						|
#include <hexagram/can.h>
 | 
						|
 | 
						|
static int usage(int argc, char **argv, const char *message, ...) {
 | 
						|
    if (message) {
 | 
						|
        va_list args;
 | 
						|
 | 
						|
        va_start(args, message);
 | 
						|
        vfprintf(stderr, message, args);
 | 
						|
         fprintf(stderr, "\n");
 | 
						|
        va_end(args);
 | 
						|
    }
 | 
						|
 | 
						|
    fprintf(stderr, "usage: %s canif\n", argv[0]);
 | 
						|
 | 
						|
    return 1;
 | 
						|
}
 | 
						|
 | 
						|
int main(int argc, char **argv) {
 | 
						|
    WINDOW *win;
 | 
						|
    hexagram_can_if *can_if;
 | 
						|
    struct can_frame frame;
 | 
						|
 | 
						|
    struct timeval now, last;
 | 
						|
 | 
						|
    if (argc != 2) {
 | 
						|
        return usage(argc, argv, NULL);
 | 
						|
    }
 | 
						|
 | 
						|
    if ((can_if = hexagram_can_if_open(argv[1])) == NULL) {
 | 
						|
        perror("hexagram_can_if_open()");
 | 
						|
 | 
						|
        goto error_can_if_open;
 | 
						|
    }
 | 
						|
 | 
						|
    gettimeofday(&now, NULL);
 | 
						|
    memcpy(&last, &now, sizeof(now));
 | 
						|
 | 
						|
    initscr();
 | 
						|
 | 
						|
    win = newwin(LINES, COLS, 0, 0);
 | 
						|
 | 
						|
    while (hexagram_can_if_read(can_if, &frame) >= 0) {
 | 
						|
        gettimeofday(&now, NULL);
 | 
						|
 | 
						|
        if (frame.can_id == 0x280) {
 | 
						|
            double rpm = 0.25 * (double)(frame.data[2] | (frame.data[3] << 8));
 | 
						|
 | 
						|
            wmove(win, 1, 0);
 | 
						|
 | 
						|
            wprintw(win, "%6.1lf RPM", rpm);
 | 
						|
        } else if (frame.can_id == 0x540) {
 | 
						|
            wmove(win, 7, 0);
 | 
						|
 | 
						|
            if ((frame.data[7] & 0xc) == 0xc) {
 | 
						|
                uint8_t gear = ((frame.data[7] & 0xf0) >> 4) - 2;
 | 
						|
 | 
						|
                wprintw(win, "1 2 3 4 5 6");
 | 
						|
 | 
						|
                wmove(win, 8, 0);
 | 
						|
                wprintw(win, "                   ");
 | 
						|
 | 
						|
                wmove(win, 8, gear * 2);
 | 
						|
 | 
						|
                wprintw(win, "_");
 | 
						|
            } else {
 | 
						|
                uint8_t pos = ((frame.data[7] & 0xf0) >> 4) - 2;
 | 
						|
 | 
						|
                wprintw(win, "P R N D S  ");
 | 
						|
 | 
						|
                wmove(win, 8, 0);
 | 
						|
                wprintw(win, "                   ");
 | 
						|
 | 
						|
                wmove(win, 8, pos * 2);
 | 
						|
 | 
						|
                wprintw(win, "_");
 | 
						|
            }
 | 
						|
        } else if (frame.can_id == 0x5a0) {
 | 
						|
            /*
 | 
						|
             * Speed is expressed in units of 0.001 wheel cycles per second
 | 
						|
             */
 | 
						|
            double rps = 0.001 * (double)((frame.data[1] >> 1)
 | 
						|
                                        | (frame.data[2] << 8));
 | 
						|
 | 
						|
            double kph = (2.032 * rps * 3600) / 1000.0;
 | 
						|
 | 
						|
            double g = 0.01 * (((double)frame.data[0]) - 127.0);
 | 
						|
 | 
						|
            wmove(win, 2, 0);
 | 
						|
            wprintw(win, "%6.1lf kph", kph);
 | 
						|
 | 
						|
            wmove(win, 4, 0);
 | 
						|
            wprintw(win, "%6.1lf  G lateral", g);
 | 
						|
        } else if (frame.can_id == 0x420) {
 | 
						|
            double temp = ((double)frame.data[1] - 100) / 2.0;
 | 
						|
 | 
						|
            wmove(win, 3, 0);
 | 
						|
 | 
						|
            wprintw(win, "%6.1lf °C ambient", temp);
 | 
						|
        } else if (frame.can_id == 0x320) {
 | 
						|
            double fuel = (double)(frame.data[2] & 0xf) / 16.0;
 | 
						|
 | 
						|
            wmove(win, 5, 0);
 | 
						|
            wprintw(win, "%5.0lf%% Fuel", fuel * 100.0);
 | 
						|
        }
 | 
						|
 | 
						|
        if (((now.tv_sec * 1000000) + now.tv_usec) - ((last.tv_sec * 1000000) + last.tv_usec) > 100000) {
 | 
						|
            memcpy(&last, &now, sizeof(now));
 | 
						|
 | 
						|
            wrefresh(win);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    hexagram_can_if_close(can_if);
 | 
						|
 | 
						|
    return 0;
 | 
						|
 | 
						|
error_can_if_open:
 | 
						|
    return 1;
 | 
						|
}
 |