/*
 * 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 <stdint.h>

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

#define CAN_ID 20;

void printCanMessage(can_t *msg);

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

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

	_delay_ms(500);

	if(!can_init(BITRATE_125_KBPS))
		uart_puts_P("CAN INIT NOK\r\n");
	else
		uart_puts_P("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();

	unsigned int zeichen;
	uint8_t recv[8] = {0};
	uint8_t n = 0;

	can_t r_msg, s_msg;

	s_msg.id = CAN_ID;
	s_msg.length = 1;
	s_msg.flags.extended = 1;
	s_msg.data[0] = 0xAA;

	while(1){

		zeichen = uart_getc();

		if(!(zeichen & UART_NO_DATA)){
			uart_putc(zeichen);
			PORTB ^= (1<<PB7);		// LED toogle
			recv[n++] = zeichen;
			if(n == 8){			// Auf acht Zeichen warten, dann per CAN senden
				s_msg.id = CAN_ID;
				s_msg.length = 8;
				for(int i = 0; i < n; i++){
					s_msg.data[i] = recv[i];
				}

				n = 0;

				if(can_check_free_buffer())
				{
					if(!can_send_message(&s_msg))
						uart_puts_P("failed\t");
					else
					uart_puts_P("send\t");
				}
				else
					uart_puts_P("no Free Buffer\r\n");
			}
			_delay_ms(1);
		}
	}

	while(1);
	return 0;
}

void printCanMessage(can_t *msg){
	char buffer[40];
	uart_puts_P("####################################\r\n");
	uart_puts_P("#\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_P("####################################\r\n");
}
