Subversion Repositories HomeAutomation

Rev

Rev 168 | Blame | Last modification | View Log | SVN | RSS feed

  1. /**
  2.  * CAN Test. This program sends a CAN message once every second. The ID of the
  3.  * message is increased each time for testing purposes.
  4.  *
  5.  * @date    2006-11-21
  6.  * @author  Jimmy Myhrman
  7.  *  
  8.  */
  9.  
  10. /*-----------------------------------------------------------------------------
  11.  * Includes
  12.  *---------------------------------------------------------------------------*/
  13. /* system files */
  14. #include <avr/io.h>
  15. #include <avr/interrupt.h>
  16. #include <avr/wdt.h>
  17. #include <stdio.h>
  18. /* lib files */
  19. #include <can.h>
  20. #include <serial.h>
  21. #include <timebase.h>
  22. #include <irreceiver.h>
  23.  
  24. #define STATE_IDLE      0
  25. #define STATE_IR_REPEAT 1
  26.  
  27. /*-----------------------------------------------------------------------------
  28.  * Main Program
  29.  *---------------------------------------------------------------------------*/
  30. int main(void) {
  31.     Timebase_Init();
  32.     Serial_Init();
  33.     sei();
  34.    
  35.     #if defined(__AVR_ATmega88__)
  36.     // set the clock speed to 8MHz
  37.     // set the clock prescaler. First write CLKPCE to enable setting of clock the
  38.     // next four instructions.
  39.     CLKPR=(1<<CLKPCE);
  40.     CLKPR=0; // 8 MHZ
  41.     #endif
  42.    
  43.     IRDDR &= ~(1<<IRBIT);
  44.    
  45.     printf("\n------------------------------------------------------------\n");
  46.     printf(  "   CAN Test: Periodic Transmission\n");
  47.     printf(  "------------------------------------------------------------\n");
  48.    
  49.     printf("CanInit...");
  50.     if (Can_Init() != CAN_OK) {
  51.         printf("FAILED!\n");
  52.     }
  53.     else {
  54.         printf("OK!\n");
  55.     }
  56.    
  57.     uint32_t timeStamp = 0;
  58.     uint32_t irTimeoutTimeStamp = 0;
  59.    
  60.     Can_Message_t txMsg;
  61.     Can_Message_t rxMsg;
  62.     txMsg.Id = 1;
  63.    
  64.     uint8_t ir_protocol, ir_address, ir_command;
  65.     uint8_t state = STATE_IDLE;
  66.    
  67.     /* main loop */
  68.     while (1) {
  69.         /* service the CAN routines */
  70.         Can_Service();
  71.        
  72.         if (state == STATE_IDLE) {
  73.             if (checkIr(&ir_protocol, &ir_address, &ir_command) == IR_OK) {
  74.                 txMsg.Data.bytes[0] = 0x00;
  75.                 txMsg.Data.bytes[1] = ir_protocol;
  76.                 txMsg.Data.bytes[2] = ir_address;
  77.                 txMsg.Data.bytes[3] = ir_command;
  78.                 txMsg.DataLength = 4;
  79.                 Can_Send(&txMsg);
  80.                 irTimeoutTimeStamp = Timebase_CurrentTime();
  81.                 state = STATE_IR_REPEAT;
  82.             }
  83.         } else if (state == STATE_IR_REPEAT) {
  84.             //kolla efter ny ir, om ingen ny ir och timeout så sätt state till IDLE
  85.             if (Timebase_PassedTimeMillis(irTimeoutTimeStamp) >= 105) {     //getLastProtoTimeout()
  86.                 state = STATE_IDLE;
  87.                 txMsg.Data.bytes[0] = 0x0f;
  88.                 Can_Send(&txMsg);
  89.             }
  90.             if (checkIrIdle() == IR_OK) {       //funktion som borde finnas i irreceiver.c
  91.                 irTimeoutTimeStamp = Timebase_CurrentTime();
  92.             }
  93.         }
  94.        
  95.    
  96.         /* check if any messages have been received */
  97.         while (Can_Receive(&rxMsg) == CAN_OK) {
  98.             /*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));
  99.             printf("data={ ");
  100.             for (uint8_t i=0; i<rxMsg.DataLength; i++) {
  101.                 printf("%x ", rxMsg.Data.bytes[i]);
  102.             }
  103.             printf("}\n");*/
  104.         }
  105.     }
  106.    
  107.     return 0;
  108. }
  109.