Subversion Repositories HomeAutomation

Rev

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

  1. /*********************************************************************
  2.  *
  3.  *                  Main application
  4.  *
  5.  *********************************************************************
  6.  * FileName:        $HeadURL: https://svn.auml.se/svn/HomeAutomation/trunk/EmbeddedSoftware/PIC/canLCD/Source/Main.c $
  7.  * Last changed:    $LastChangedDate: 2006-11-21 10:28:39 +0100 (Tue, 21 Nov 2006) $
  8.  * By:              $LastChangedBy: johboh $
  9.  * Revision:        $Revision: 140 $
  10.  ********************************************************************/
  11.  
  12.  
  13. #include <compiler.h>
  14. #include <stackTasks.h>
  15. #include <Tick.h>
  16. #include <funcdefs.h>
  17. #include <EEaccess.h>
  18.  
  19. #ifdef USE_LCD
  20.     #include "lcd.h"
  21. #endif
  22.  
  23. #ifdef USE_CAN
  24.     #include <CAN.h>
  25. #endif
  26.  
  27. static void mainInit(void);
  28.  
  29.  
  30. static int MY_ID = DEFAULT_ID;
  31. static BYTE MY_NID = DEFAULT_NID;
  32.  
  33. void main()
  34. {
  35.     static TICK t = 0;
  36.     CAN_MESSAGE outCm;
  37.  
  38.     // Inits
  39.  
  40.     mainInit();
  41.  
  42.     #ifdef USE_CAN
  43.         canInit();
  44.     #endif
  45.  
  46.     #ifdef USE_LCD
  47.         lcdInit();
  48.         lcdClear();
  49.         lcdPutrs("Welcome!");
  50.     #endif
  51.  
  52.     tickInit();
  53.  
  54.     // Read ID and NID if exist.
  55.     if (EERead(NODE_ID_EE)==NODE_HAS_ID)
  56.     {
  57.         MY_ID=(((WORD)EERead(NODE_ID_EE + 1))<<8)+EERead(NODE_ID_EE + 2);
  58.         MY_NID=EERead(NODE_ID_EE + 3);
  59.     }
  60.  
  61.     // Send user program startup heatbeat
  62.     outCm.funct                     = FUNCT_BOOTLOADER;
  63.     outCm.funcc                     = FUNCC_BOOT_HEARTBEAT;
  64.     outCm.nid                       = MY_NID;
  65.     outCm.sid                       = MY_ID;
  66.     outCm.data_length               = 1;
  67.     outCm.data[BOOT_DATA_HEARTBEAT_INDEX] = HEARTBEAT_USER_STARTUP;
  68.     while(!canSendMessage(outCm,PRIO_HIGH));
  69.  
  70.  
  71.     while(1)
  72.     {
  73.         static TICK t = 0;
  74.         static TICK heartbeat = 0;
  75.  
  76.        
  77.         if ((tickGet()-heartbeat)>TICK_SECOND*5)
  78.         {
  79.             // Send alive heartbeat
  80.             outCm.funct                     = FUNCT_BOOTLOADER;
  81.             outCm.funcc                     = FUNCC_BOOT_HEARTBEAT;
  82.             outCm.nid                       = MY_NID;
  83.             outCm.sid                       = MY_ID;
  84.             outCm.data_length               = 1;
  85.             outCm.data[BOOT_DATA_HEARTBEAT_INDEX] = HEARTBEAT_ALIVE;
  86.             while(!canSendMessage(outCm,PRIO_HIGH));
  87.            
  88.             heartbeat = tickGet();
  89.         }
  90.         if ((tickGet()-t)>TICK_SECOND)
  91.         {
  92.             LED0_IO=~LED0_IO;
  93.             t = tickGet();
  94.         }
  95.     }
  96. }
  97.  
  98.  
  99. #pragma interrupt high_isr
  100. void high_isr(void)
  101. {
  102.     ClrWdt();
  103.  
  104.     #ifdef USE_CAN
  105.         canISR();
  106.     #endif
  107.  
  108.     tickUpdate();
  109.  
  110. }
  111.  
  112.  
  113. #pragma interrupt low_isr
  114. void low_isr(void)
  115. {
  116.  
  117. }
  118.  
  119.  
  120.  
  121. /*
  122. *   Function: mainInit
  123. *
  124. *   Input:  none
  125. *   Output: none
  126. *   Pre-conditions: none
  127. *   Affects: Se code
  128. *   Depends: none.
  129. */
  130. void mainInit()
  131. {
  132.     LED0_TRIS=0;   
  133.  
  134.     // Enable Interrupts
  135.     INTCONbits.GIEH = 1;
  136.     INTCONbits.GIEL = 1;
  137.  
  138.     // Enable interrupt prirority
  139.     RCONbits.IPEN=1;
  140.    
  141.  
  142. }
  143.  
  144. /*
  145. *   Function: canParse
  146. *
  147. *   Input:  Received can message
  148. *   Output: none
  149. *   Pre-conditions: canInit and received packet.
  150. *   Affects: Sensors/actuators/etc. See code.
  151. *   Depends: none.
  152. */
  153. #ifdef USE_CAN
  154. void canParse(CAN_MESSAGE cm)
  155. {
  156.     CAN_MESSAGE outCm;
  157.  
  158.     ClrWdt();
  159.  
  160.     switch(cm.funct)
  161.     {
  162.         case FUNCT_BOOTLOADER:
  163.             if (cm.nid==MY_NID && ((((unsigned int)cm.data[BOOT_DATA_RID_HIGH_INDEX])<<8)+cm.data[BOOT_DATA_RID_LOW_INDEX])==MY_ID)
  164.             {
  165.                 switch(cm.funcc)
  166.                 {
  167.                     case FUNCC_BOOT_INIT: Reset(); break; //User whant to program me, reset me.
  168.                     case FUNCC_BOOT_SET_ID:
  169.                         // Change my ID and NID
  170.                         MY_ID=(((WORD)cm.data[BOOT_DATA_NEW_ID_HIGH_INDEX])<<8)+cm.data[BOOT_DATA_NEW_ID_LOW_INDEX];
  171.                         MY_NID=cm.data[BOOT_DATA_NEW_NID_INDEX];
  172.                         EEWrite(NODE_ID_EE+1,cm.data[BOOT_DATA_NEW_ID_HIGH_INDEX]);
  173.                         EEWrite(NODE_ID_EE+2,cm.data[BOOT_DATA_NEW_ID_LOW_INDEX]);
  174.                         EEWrite(NODE_ID_EE+3,cm.data[BOOT_DATA_NEW_NID_INDEX]);
  175.                         EEWrite(NODE_ID_EE,NODE_HAS_ID);
  176.                         // Send ack with new id.
  177.                         outCm.funct                     = FUNCT_BOOTLOADER;
  178.                         outCm.funcc                     = FUNCC_BOOT_ACK;
  179.                         outCm.nid                       = MY_NID;
  180.                         outCm.sid                       = MY_ID;
  181.                         outCm.data_length               = 8;
  182.                         outCm.data[BOOT_DATA_ERR_INDEX] = ACK_ERR_NO_ERROR;
  183.                         while(!canSendMessage(outCm,PRIO_HIGH));
  184.                     break;
  185.                 }
  186.             }
  187.  
  188.  
  189.         break;
  190.     }
  191. }
  192. #endif
  193.  
  194.  
  195.  
  196. // Below are mandantory when using bootloader
  197. // define DEBUG_MODE to use without bootloader.
  198.  
  199. #ifndef DEBUG_MODE
  200. extern void _startup (void);
  201. #pragma code _RESET_INTERRUPT_VECTOR = 0x001000
  202. void _reset (void)
  203. {
  204.     _asm goto _startup _endasm
  205. }
  206. #pragma code
  207. #endif
  208.  
  209. #pragma code _HIGH_INTERRUPT_VECTOR = 0x001008
  210. void _high_ISR (void)
  211. {
  212.     _asm GOTO high_isr _endasm
  213. }
  214. #pragma code
  215.  
  216. #pragma code _LOW_INTERRUPT_VECTOR = 0x001018
  217. void _low_ISR (void)
  218. {
  219.     _asm GOTO low_isr _endasm
  220. }
  221. #pragma code
  222.