/*****************************************************************************
*
* CAN Test-APP
*
* Compiler : avr-gcc 4.3.0 / avr-libc 1.6.2 / AVR Studio 4.14
*
* AVR Memory Usage
* ----------------
* Device: at90can128
*
* Program:    1198 bytes (0.9% Full)
* (.text + .data + .bootloader)
*
* Data:         26 bytes (0.6% Full)
* (.data + .bss + .noinit)
*
*
* Build succeeded with 0 Warnings...
*
*
* by       : Thomas Fuchs, Wolfsburg, Germany
*            linux@cc-robotics.de
*
* License  : Copyright (c) 2009 Thomas Fuchs
*
* Tested with AT90CAN128
****************************************************************************/
#include <stdbool.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include <string.h>

#include "utils.h"

//  CPU speed
#define F_CPU 16000000UL  // ggf. im Projekt definieren!

//-----
// CAN
//-----
//  bitrates
#define	_10KBPS		0	// untested
#define	_20KBPS		1	// untested
#define	_50KBPS		2	// untested
#define	_100KBPS    3	
#define	_125KBPS    4	
#define	_250KBPS    5	
#define	_500KBPS    6
#define	_1MBPS		7	// untested

//  global structs and variables
//  Struktur der CAN-Botschaft
typedef struct
	{	
		uint16_t id;			//  MSG ID 11 Bit                  
		uint16_t msk;        	//  Mask for ID 11 Bit          
		uint8_t length;   		//  DLC length
		uint8_t data[8];  		//  Data field 8 Byte
	}CAN_messageType;           //  CAN 2.0 A message 11 Bit

CAN_messageType msg;
extern CAN_messageType recMsg;

//  external functions
//  externe Funktionen
extern bool initCAN(uint8_t bitrate);;
extern void can_tx(CAN_messageType msg);
extern void configRX();

/***************************************************************************/

//delay routine (milliseconds)
//Funktion um x Millisekunden zu warten
void delay_ms(uint16_t period)	 
{
	for(unsigned int i=0; i<=period; i++)
		_delay_ms(1);
}

// initializes all recommended interfaces
// Initialisierung
static bool initialize()
{

  // Init CAN interface
  // Init-Funktion für CAN aufrufen mit 100KBPS
  // mit Sicherheitsabfrage ob erfolgreich
  if(initCAN(_100KBPS));
    else return false;

  // Empfang konfigurieren
  configRX();

  // alle globalen Interrupts nach der Initialisierung einschalten
  sei();	//activate global interrups

  return true;
}

// main, progstart
// Start des Hauptprogramms
int main()
{
  //  Initialisieren
  while(!(initialize()));

  //  Testnachricht
  //---------------
  //  send: Test OK
  msg.length = 7;
  msg.id = 0x024;
  msg.data[0] = 0x54;
  msg.data[1] = 0x65;
  msg.data[2] = 0x73;
  msg.data[3] = 0x74;
  msg.data[4] = 0x20;
  msg.data[5] = 0x4F;
  msg.data[6] = 0x4B;

  // Funktion zum Senden mit der erstellten Nachricht aufrufen
  can_tx(msg);

  while (1)
  {
    // warte auf CAN-Nachricht per Interrupt...
  }
}

