/**
* CAN Test. This program sends a CAN message once every second. The ID of the
* message is increased each time for testing purposes.
*
* @date 2006-11-21
* @author Jimmy Myhrman
*
*/
/*-----------------------------------------------------------------------------
* Includes
*---------------------------------------------------------------------------*/
/* system files */
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <stdio.h>
/* lib files */
#include <can.h>
#include <serial.h>
#include <timebase.h>
#include <irreceiver.h>
/*-----------------------------------------------------------------------------
* Main Program
*---------------------------------------------------------------------------*/
int main(void) {
Timebase_Init();
Serial_Init();
sei();
DDRD |= (1<<PD5);
PORTD &= ~(1<<PD5);
IRDDR &= ~(1<<IRBIT);
printf("\n------------------------------------------------------------\n");
printf( " CAN Test: Periodic Transmission\n");
printf( "------------------------------------------------------------\n");
if (Can_Init() != CAN_OK) {
}
else {
}
uint32_t timeStamp = 0;
Can_Message_t txMsg;
Can_Message_t rxMsg;
txMsg.Id = 2;
uint8_t ir_protocol, ir_address, ir_command;
/* main loop */
while (1) {
/* service the CAN routines */
Can_Service();
if (IRPIN & (1<<IRBIT)) {
PORTD |= (1<<PD5);
} else {
PORTD &= ~(1<<PD5);
}
if (checkIr(&ir_protocol, &ir_address, &ir_command) == IR_OK) {
txMsg.Data.bytes[0] = 0x00;
txMsg.Data.bytes[1] = ir_protocol;
txMsg.Data.bytes[2] = ir_address;
txMsg.Data.bytes[3] = ir_command;
txMsg.DataLength = 4;
Can_Send(&txMsg);
}
/* send CAN message and check for CAN errors once every second */
if (Timebase_PassedTimeMillis(timeStamp) >= 2000) {
timeStamp = Timebase_CurrentTime();
txMsg.DataLength = 0;
/* send txMsg */
Can_Send(&txMsg);
}
/* check if any messages have been received */
while (Can_Receive(&rxMsg) == CAN_OK) {
printf("MSG Received: ID=%lx, DLC=%u, EXT=%u, RTR=%u, ", rxMsg.
Id, (uint16_t)(rxMsg.
DataLength), (uint16_t)(rxMsg.
ExtendedFlag), (uint16_t)(rxMsg.
RemoteFlag));
for (uint8_t i=0; i<rxMsg.DataLength; i++) {
printf("%x ", rxMsg.
Data.
bytes[i
]);
}
}
}
return 0;
}