Subversion Repositories HomeAutomation

Rev

Rev 121 | Rev 125 | Go to most recent revision | 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/trunk/EmbeddedSoftware/PIC/canIR/Source/Main.c $
  7.  * Last changed:    $LastChangedDate: 2006-11-18 21:08:42 +0100 (Sat, 18 Nov 2006) $
  8.  * By:              $LastChangedBy: johboh $
  9.  * Revision:        $Revision: 122 $
  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. #ifdef USE_IREC
  24.     #include <IRec.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_IREC
  47.         irecInit();
  48.     #endif
  49.  
  50.     tickInit();
  51.  
  52.     // Read ID and NID if exist.
  53.     if (EERead(NODE_ID_EE)==NODE_HAS_ID)
  54.     {
  55.         MY_ID=(((WORD)EERead(NODE_ID_EE + 1))<<8)+EERead(NODE_ID_EE + 2);
  56.         MY_NID=EERead(NODE_ID_EE + 3);
  57.     }
  58.  
  59.     // Send user program startup heatbeat
  60.     outCm.funct                     = FUNCT_BOOTLOADER;
  61.     outCm.funcc                     = FUNCC_BOOT_HEARTBEAT;
  62.     outCm.nid                       = MY_NID;
  63.     outCm.sid                       = MY_ID;
  64.     outCm.data_length               = 1;
  65.     outCm.data[BOOT_DATA_HEARTBEAT_INDEX] = HEARTBEAT_USER_STARTUP;
  66.     while(!canSendMessage(outCm,PRIO_HIGH));
  67.  
  68.  
  69.     while(1)
  70.     {
  71.         static TICK t = 0;
  72.         static TICK heartbeat = 0;
  73.  
  74.        
  75.         if ((tickGet()-heartbeat)>TICK_SECOND*5)
  76.         {
  77.             // Send alive heartbeat
  78.             outCm.funct                     = FUNCT_BOOTLOADER;
  79.             outCm.funcc                     = FUNCC_BOOT_HEARTBEAT;
  80.             outCm.nid                       = MY_NID;
  81.             outCm.sid                       = MY_ID;
  82.             outCm.data_length               = 1;
  83.             outCm.data[BOOT_DATA_HEARTBEAT_INDEX] = HEARTBEAT_ALIVE;
  84.             while(!canSendMessage(outCm,PRIO_HIGH));
  85.            
  86.             heartbeat = tickGet();
  87.         }
  88.         if ((tickGet()-t)>TICK_SECOND)
  89.         {
  90.             LED0_IO=~LED0_IO;
  91.             t = tickGet();
  92.         }
  93.     }
  94. }
  95.  
  96.  
  97. #pragma interrupt high_isr
  98. void high_isr(void)
  99. {
  100.     ClrWdt();
  101.  
  102.     #ifdef USE_CAN
  103.         canISR();
  104.     #endif
  105.  
  106.     #ifdef USE_IREC
  107.         irecISR();
  108.     #endif
  109.  
  110.     tickUpdate();
  111.  
  112. }
  113.  
  114.  
  115. #pragma interrupt low_isr
  116. void low_isr(void)
  117. {
  118.  
  119. }
  120.  
  121.  
  122.  
  123. /*
  124. *   Function: mainInit
  125. *
  126. *   Input:  none
  127. *   Output: none
  128. *   Pre-conditions: none
  129. *   Affects: Se code
  130. *   Depends: none.
  131. */
  132. void mainInit()
  133. {
  134.     LED0_TRIS=0;   
  135.  
  136.     // Enable Interrupts
  137.     INTCONbits.GIEH = 1;
  138.     INTCONbits.GIEL = 1;
  139.  
  140.     // Enable interrupt prirority
  141.     RCONbits.IPEN=1;
  142.    
  143.  
  144. }
  145.  
  146. /*
  147. *   Function: canParse
  148. *
  149. *   Input:  Received can message
  150. *   Output: none
  151. *   Pre-conditions: canInit and received packet.
  152. *   Affects: Sensors/actuators/etc. See code.
  153. *   Depends: none.
  154. */
  155. #ifdef USE_CAN
  156. void canParse(CAN_MESSAGE cm)
  157. {
  158.     CAN_MESSAGE outCm;
  159.  
  160.     ClrWdt();
  161.  
  162.     switch(cm.funct)
  163.     {
  164.         case FUNCT_BOOTLOADER:
  165.             if (cm.nid==MY_NID && ((((unsigned int)cm.data[BOOT_DATA_RID_HIGH_INDEX])<<8)+cm.data[BOOT_DATA_RID_LOW_INDEX])==MY_ID)
  166.             {
  167.                 switch(cm.funcc)
  168.                 {
  169.                     case FUNCC_BOOT_INIT: Reset(); break; //User whant to program me, reset me.
  170.                     case FUNCC_BOOT_SET_ID:
  171.                         // Change my ID and NID
  172.                         MY_ID=(((WORD)cm.data[BOOT_DATA_NEW_ID_HIGH_INDEX])<<8)+cm.data[BOOT_DATA_NEW_ID_LOW_INDEX];
  173.                         MY_NID=cm.data[BOOT_DATA_NEW_NID_INDEX];
  174.                         EEWrite(NODE_ID_EE+1,cm.data[BOOT_DATA_NEW_ID_HIGH_INDEX]);
  175.                         EEWrite(NODE_ID_EE+2,cm.data[BOOT_DATA_NEW_ID_LOW_INDEX]);
  176.                         EEWrite(NODE_ID_EE+3,cm.data[BOOT_DATA_NEW_NID_INDEX]);
  177.                         EEWrite(NODE_ID_EE,NODE_HAS_ID);
  178.                         // Send ack with new id.
  179.                         outCm.funct                     = FUNCT_BOOTLOADER;
  180.                         outCm.funcc                     = FUNCC_BOOT_ACK;
  181.                         outCm.nid                       = MY_NID;
  182.                         outCm.sid                       = MY_ID;
  183.                         outCm.data_length               = 8;
  184.                         outCm.data[BOOT_DATA_ERR_INDEX] = ACK_ERR_NO_ERROR;
  185.                         while(!canSendMessage(outCm,PRIO_HIGH));
  186.                     break;
  187.                 }
  188.             }
  189.  
  190.  
  191.         break;
  192.     }
  193. }
  194. #endif
  195.  
  196.  
  197. /*
  198. *   Function: irecParse
  199. *
  200. *   Input:  Received IR message
  201. *   Output: none
  202. *   Pre-conditions: irecInit
  203. *   Affects: Sensors/actuators/etc. See code.
  204. *   Depends: none.
  205. */
  206. #ifdef USE_IREC
  207. void irecParse(IR_TYPE type, BYTE toggle, BYTE addr, BYTE data)
  208. {
  209.     CAN_MESSAGE outCm;
  210.     outCm.funct         = 0x01;
  211.     outCm.funcc         = 0x01;
  212.     outCm.nid           = MY_NID;
  213.     outCm.sid           = MY_ID;
  214.     outCm.data_length   = 4;
  215.     outCm.data[3]       = type;
  216.     outCm.data[2]       = toggle;
  217.     outCm.data[1]       = addr;
  218.     outCm.data[0]       = data;
  219.    
  220.     while(!canSendMessage(outCm,PRIO_HIGH));
  221.  
  222.  
  223. }
  224. #endif
  225.  
  226. // Below are mandantory when using bootloader
  227. // define DEBUG_MODE to use without bootloader.
  228.  
  229. #ifndef DEBUG_MODE
  230. extern void _startup (void);
  231. #pragma code _RESET_INTERRUPT_VECTOR = 0x001000
  232. void _reset (void)
  233. {
  234.     _asm goto _startup _endasm
  235. }
  236. #pragma code
  237. #endif
  238.  
  239. #pragma code _HIGH_INTERRUPT_VECTOR = 0x001008
  240. void _high_ISR (void)
  241. {
  242.     _asm GOTO high_isr _endasm
  243. }
  244. #pragma code
  245.  
  246. #pragma code _LOW_INTERRUPT_VECTOR = 0x001018
  247. void _low_ISR (void)
  248. {
  249.     _asm GOTO low_isr _endasm
  250. }
  251. #pragma code
  252.