Subversion Repositories HomeAutomation

Rev

Rev 103 | 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/canBase/Source/Main.c $
  7.  * Last changed:    $LastChangedDate: 2006-11-15 17:32:31 +0100 (Wed, 15 Nov 2006) $
  8.  * By:              $LastChangedBy: johboh $
  9.  * Revision:        $Revision: 108 $
  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.     while(1)
  52.     {
  53.         static TICK t = 0;
  54.         static TICK heartbeat = 0;
  55.  
  56.        
  57.         if ((tickGet()-heartbeat)>TICK_SECOND*5)
  58.         {
  59.             outCm.funct                     = FUNCT_BOOTLOADER;
  60.             outCm.funcc                     = FUNCC_BOOT_HEARTBEAT;
  61.             outCm.nid                       = MY_NID;
  62.             outCm.sid                       = MY_ID;
  63.             outCm.data_length               = 0;
  64.             while(!canSendMessage(outCm,PRIO_HIGH));
  65.            
  66.             heartbeat = tickGet();
  67.         }
  68.         if ((tickGet()-t)>TICK_SECOND)
  69.         {
  70.             LED0_IO=~LED0_IO;
  71.             t = tickGet();
  72.         }
  73.     }
  74. }
  75.  
  76.  
  77. #pragma interrupt high_isr
  78. void high_isr(void)
  79. {
  80.     ClrWdt();
  81.  
  82.     #ifdef USE_CAN
  83.         canISR();
  84.     #endif
  85.  
  86.     tickUpdate();
  87.  
  88. }
  89.  
  90.  
  91. #pragma interrupt low_isr
  92. void low_isr(void)
  93. {
  94.  
  95. }
  96.  
  97.  
  98.  
  99. /*
  100. *   Function: mainInit
  101. *
  102. *   Input:  none
  103. *   Output: none
  104. *   Pre-conditions: none
  105. *   Affects: Se code
  106. *   Depends: none.
  107. */
  108. void mainInit()
  109. {
  110.     LED0_TRIS=0;   
  111.  
  112.     // Enable Interrupts
  113.     INTCONbits.GIEH = 1;
  114.     INTCONbits.GIEL = 1;
  115.  
  116.     // Enable interrupt prirority
  117.     RCONbits.IPEN=1;
  118.    
  119.  
  120. }
  121.  
  122. /*
  123. *   Function: canParse
  124. *
  125. *   Input:  Received can message
  126. *   Output: none
  127. *   Pre-conditions: canInit and received packet.
  128. *   Affects: Sensors/actuators/etc. See code.
  129. *   Depends: none.
  130. */
  131. #ifdef USE_CAN
  132. void canParse(CAN_MESSAGE cm)
  133. {
  134.     CAN_MESSAGE outCm;
  135.  
  136.     ClrWdt();
  137.  
  138.     switch(cm.funct)
  139.     {
  140.         case FUNCT_BOOTLOADER:
  141.             if (cm.nid==MY_NID && ((((unsigned int)cm.data[BOOT_DATA_RID_HIGH_INDEX])<<8)+cm.data[BOOT_DATA_RID_LOW_INDEX])==MY_ID)
  142.             {
  143.                 switch(cm.funcc)
  144.                 {
  145.                     case FUNCC_BOOT_INIT: Reset(); break; //User whant to program me, reset me.
  146.                     case FUNCC_BOOT_SET_ID:
  147.                         // Change my ID and NID
  148.                         MY_ID=(((WORD)cm.data[BOOT_DATA_NEW_ID_HIGH])<<8)+cm.data[BOOT_DATA_NEW_ID_LOW];
  149.                         MY_NID=cm.data[BOOT_DATA_NEW_NID];
  150.                         EEWrite(NODE_ID_EE+1,cm.data[BOOT_DATA_NEW_ID_HIGH]);
  151.                         EEWrite(NODE_ID_EE+2,cm.data[BOOT_DATA_NEW_ID_LOW]);
  152.                         EEWrite(NODE_ID_EE+3,cm.data[BOOT_DATA_NEW_NID]);
  153.                         EEWrite(NODE_ID_EE,NODE_HAS_ID);
  154.                         // Send ack with new id.
  155.                         outCm.funct                     = FUNCT_BOOTLOADER;
  156.                         outCm.funcc                     = FUNCC_BOOT_ACK;
  157.                         outCm.nid                       = MY_NID;
  158.                         outCm.sid                       = MY_ID;
  159.                         outCm.data_length               = 8;
  160.                         outCm.data[BOOT_DATA_ERR_INDEX] = ACK_ERR_NO_ERROR;
  161.                         while(!canSendMessage(outCm,PRIO_HIGH));
  162.                     break;
  163.                 }
  164.             }
  165.  
  166.  
  167.         break;
  168.     }
  169. }
  170. #endif
  171.  
  172.  
  173. // Below are mandantory when using bootloader
  174. // define DEBUG_MODE to use without bootloader.
  175.  
  176. #ifndef DEBUG_MODE
  177. extern void _startup (void);
  178. #pragma code _RESET_INTERRUPT_VECTOR = 0x001000
  179. void _reset (void)
  180. {
  181.     _asm goto _startup _endasm
  182. }
  183. #pragma code
  184. #endif
  185.  
  186. #pragma code _HIGH_INTERRUPT_VECTOR = 0x001008
  187. void _high_ISR (void)
  188. {
  189.     _asm GOTO high_isr _endasm
  190. }
  191. #pragma code
  192.  
  193. #pragma code _LOW_INTERRUPT_VECTOR = 0x001018
  194. void _low_ISR (void)
  195. {
  196.     _asm GOTO low_isr _endasm
  197. }
  198. #pragma code
  199.