Subversion Repositories HomeAutomation

Rev

Rev 120 | Blame | Compare with Previous | Last modification | View Log | SVN | RSS feed

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