#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>

#include "can_vca.h"

vca_handle_t canhandle;
const char *candev = "/dev/can0";
/*--- handler on SIGINT signal : the program quit with CTL-C ---*/
void sortie(int sig)
{
	vca_close_handle(canhandle);
	printf("Terminated by user\n");
	exit(0);
}

int main(int argc, char *argv[])
{
	int n,ret;
	unsigned long i=1;
	struct canmsg_t readmsg;
	struct sigaction act;

    if(argc == 2 && argv[1][0] == '-' && argv[1][1] == 'h') {
        printf("SYNOPSIS:\n\treadcan [can_device]\nEXAMPLE:\n\treadcan /dev/can1\n\tdefault can_device is /dev/can0\n");
        exit(0);
    }

	/*------- register handler on SIGINT signal -------*/
	act.sa_handler=sortie;
	sigemptyset(&act.sa_mask);
	act.sa_flags=0;
	sigaction(SIGINT,&act,0);
	/*---------------------------------------*/	
    
    // open CAN handle on device /dev/can
    if(argc > 1) candev = argv[1];
	printf("Opening %s\n", candev);
	if (vca_open_handle(&canhandle, candev, NULL, 0) != VCA_OK) {
		perror("open");
		printf("Error opening %s\n", candev);
		exit(1);	
	}

	while (1) {
        // suspend and wait for message
        vca_wait(canhandle, 0, 0);
        // read message from VCA
		ret = vca_rec_msg_seq(canhandle, &readmsg, 1);
		if(ret < 0) {
			printf("Error reading message\n");
		}
		else if(ret == 0) {
			printf("No message arrived\n");
		}
		else {
			printf("Received message #%lu: id:%lX data:[",i,readmsg.id);
			for(n=0 ; n<readmsg.length ; n++) {
                if(n > 0) printf(" ");
                // %.2X precison 2 same as %02X for integers
				printf("%.2X", (unsigned char)readmsg.data[n]);
            }
			printf("]\n");
			i++;
		}
	}
	return 0;
}
