/*
 * CAN1.c
 *
 * Created: 26.01.2012 18:48:36
 *  Author: stormracer
 */

//#define F_CPU 16000000UL
#define BAUDRATE 9600

#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>

#include "uart.h"
#include "can.h"

#define CAN_ID 10;

void printCanMessage(can_t *msg);

int main(){
	DDRB |= (1<<PB7);

	uart_init(UART_BAUD_SELECT(BAUDRATE,F_CPU));
	uart_puts("Uart init OK\r\n");

	_delay_ms(500);

	if(!can_init(BITRATE_125_KBPS))
		uart_puts("CAN INIT NOK\r\n");
	else
		uart_puts("CAN INIT OK\r\n");

	can_filter_t filter = {
		.id = 0,
		.mask = 0,
		.flags = {
				.rtr = 0,
				.extended = 1
		}
	};

	can_set_filter(0, &filter);
	can_set_mode(NORMAL_MODE);

	sei();

	can_t r_msg, s_msg;
	can_error_register_t err;

	char tmp[8];

	while(1){
		/*err = can_read_error_register();
		uart_puts("Send:");
		itoa(err.rx,tmp,10);
		uart_puts(tmp);
		uart_puts("\r\n");
		uart_puts("Recv:");
		itoa(err.tx,tmp,10);
		uart_puts(tmp);
		uart_puts("\r\n");*/

		if(can_check_message()){

			can_get_message(&r_msg);
			printCanMessage(&r_msg);

			if(r_msg.id == 1 && r_msg.length == 1 && r_msg.data[0] == 0xAE){
				s_msg.id = CAN_ID;
				s_msg.flags.extended = 1;
				s_msg.length = 1;
				s_msg.data[0] = CAN_ID;

				can_send_message(&s_msg);
			}
		}

		_delay_ms(100);
		PORTB ^= (1<<PB7);
	}

	while(1);
	return 0;
}

void printCanMessage(can_t *msg){
	char buffer[40];
	uart_puts("####################################\r\n");
	uart_puts("#\r\n");
	sprintf(buffer,"# Id: %d\r\n", msg->id);
	uart_puts(buffer);
	sprintf(buffer,"# Length: %d\r\n", msg->length);
	uart_puts(buffer);
	sprintf(buffer,"# Data %X%X%X%X%X%X%X%X\r\n", msg->data[0],msg->data[1],msg->data[2],msg->data[3],msg->data[4],msg->data[5],msg->data[6],msg->data[7]);
	uart_puts(buffer);
	uart_puts("####################################\r\n");
}
