Subversion Repositories HomeAutomation

Rev

Rev 1518 | Rev 1826 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | SVN | RSS feed

  1.  
  2. #include "sns_input.h"
  3. uint8_t pinStatus[8];
  4. #define HIGH        1
  5. #define LOW         2
  6. #define NOCHANGE    0
  7. #define HIGH_NOCH   3
  8. #define LOW_NOCH    4
  9.  
  10. #define IO_HIGH     1
  11. #define IO_LOW      0
  12.  
  13. /*
  14.  
  15. Callback function that is called from pin-change driver on AVR IO
  16. id gives which pin that changed, status is the new state of the changed pin
  17.  
  18. */
  19. void sns_input_pcint_callback(uint8_t id, uint8_t status)
  20. {
  21. #ifdef  sns_input_CH0
  22. #if sns_input_CH0PCA95xxIO==0
  23.     if (id == sns_input_PCINT_CH0) {
  24.       if (IO_LOW != status) {
  25.         pinStatus[0] = HIGH;
  26.       } else {
  27.         pinStatus[0] = LOW;
  28.       }
  29.     }
  30. #endif
  31. #endif
  32. #ifdef  sns_input_CH1
  33. #if sns_input_CH1PCA95xxIO==0
  34.     if (id == sns_input_PCINT_CH1) {
  35.       if (IO_LOW != status) {
  36.         pinStatus[1] = HIGH;
  37.       } else {
  38.         pinStatus[1] = LOW;
  39.       }
  40.     }
  41. #endif
  42. #endif
  43. #ifdef  sns_input_CH2
  44. #if sns_input_CH2PCA95xxIO==0
  45.     if (id == sns_input_PCINT_CH2) {
  46.       if (IO_LOW != status) {
  47.         pinStatus[2] = HIGH;
  48.       } else {
  49.         pinStatus[2] = LOW;
  50.       }
  51.     }
  52. #endif
  53. #endif
  54. #ifdef  sns_input_CH3
  55. #if sns_input_CH3PCA95xxIO==0
  56.     if (id == sns_input_PCINT_CH3) {
  57.       if (IO_LOW != status) {
  58.         pinStatus[3] = HIGH;
  59.       } else {
  60.         pinStatus[3] = LOW;
  61.       }
  62.     }
  63. #endif
  64. #endif
  65. #ifdef  sns_input_CH4
  66. #if sns_input_CH4PCA95xxIO==0
  67.     if (id == sns_input_PCINT_CH4) {
  68.       if (IO_LOW != status) {
  69.         pinStatus[4] = HIGH;
  70.       } else {
  71.         pinStatus[4] = LOW;
  72.       }
  73.     }
  74. #endif
  75. #endif
  76. #ifdef  sns_input_CH5
  77. #if sns_input_CH5PCA95xxIO==0
  78.     if (id == sns_input_PCINT_CH5) {
  79.       if (IO_LOW != status) {
  80.         pinStatus[5] = HIGH;
  81.       } else {
  82.         pinStatus[5] = LOW;
  83.       }
  84.     }
  85. #endif
  86. #endif
  87. #ifdef  sns_input_CH6
  88. #if sns_input_CH6PCA95xxIO==0
  89.     if (id == sns_input_PCINT_CH6) {
  90.       if (IO_LOW != status) {
  91.         pinStatus[6] = HIGH;
  92.       } else {
  93.         pinStatus[6] = LOW;
  94.       }
  95.     }
  96. #endif
  97. #endif
  98. #ifdef  sns_input_CH7
  99. #if sns_input_CH7PCA95xxIO==0
  100.     if (id == sns_input_PCINT_CH7) {
  101.       if (IO_LOW != status) {
  102.         pinStatus[7] = HIGH;
  103.       } else {
  104.         pinStatus[7] = LOW;
  105.       }
  106.     }
  107. #endif
  108. #endif
  109. }
  110.  
  111.  
  112. #if sns_input_ENABLE_PCA95xx==1
  113. /*
  114.  
  115. Callback function that is called from PCA95xx-driver when any pin has changed
  116. status is the pin status of all pins on PCA95xx
  117.  
  118. */
  119. void sns_input_PCA95xx_callback(uint16_t status)
  120. {
  121. #ifdef  sns_input_CH0
  122. #if sns_input_CH0PCA95xxIO==1
  123.     if (pinStatus[0] == LOW_NOCH && ((status>>sns_input_CH0)&0x1) == IO_HIGH) {
  124.         pinStatus[0] = HIGH;
  125.     } else if (pinStatus[0] == HIGH_NOCH && ((status>>sns_input_CH0)&0x1) == IO_LOW) {
  126.         pinStatus[0] = LOW;
  127.     }
  128. #endif
  129. #endif
  130. #ifdef  sns_input_CH1
  131. #if sns_input_CH1PCA95xxIO==1
  132.     if (pinStatus[1] == LOW_NOCH && ((status>>sns_input_CH1)&0x1) == IO_HIGH) {
  133.         pinStatus[1] = HIGH;
  134.     } else if (pinStatus[1] == HIGH_NOCH && ((status>>sns_input_CH1)&0x1) == IO_LOW) {
  135.         pinStatus[1] = LOW;
  136.     }
  137. #endif
  138. #endif
  139. #ifdef  sns_input_CH2
  140. #if sns_input_CH2PCA95xxIO==1
  141.     if (pinStatus[2] == LOW_NOCH && ((status>>sns_input_CH2)&0x1) == IO_HIGH) {
  142.         pinStatus[2] = HIGH;
  143.     } else if (pinStatus[2] == HIGH_NOCH && ((status>>sns_input_CH2)&0x1) == IO_LOW) {
  144.         pinStatus[2] = LOW;
  145.     }
  146. #endif
  147. #endif
  148. #ifdef  sns_input_CH3
  149. #if sns_input_CH3PCA95xxIO==1
  150.     if (pinStatus[3] == LOW_NOCH && ((status>>sns_input_CH3)&0x1) == IO_HIGH) {
  151.         pinStatus[3] = HIGH;
  152.     } else if (pinStatus[3] == HIGH_NOCH && ((status>>sns_input_CH3)&0x1) == IO_LOW) {
  153.         pinStatus[3] = LOW;
  154.     }
  155. #endif
  156. #endif
  157. #ifdef  sns_input_CH4
  158. #if sns_input_CH4PCA95xxIO==1
  159.     if (pinStatus[4] == LOW_NOCH && ((status>>sns_input_CH4)&0x1) == IO_HIGH) {
  160.         pinStatus[4] = HIGH;
  161.     } else if (pinStatus[4] == HIGH_NOCH && ((status>>sns_input_CH4)&0x1) == IO_LOW) {
  162.         pinStatus[4] = LOW;
  163.     }
  164. #endif
  165. #endif
  166.  
  167. #ifdef  sns_input_CH5
  168. #if sns_input_CH5PCA95xxIO==1
  169.     if (pinStatus[5] == LOW_NOCH && ((status>>sns_input_CH5)&0x1) == IO_HIGH) {
  170.         pinStatus[5] = HIGH;
  171.     } else if (pinStatus[5] == HIGH_NOCH && ((status>>sns_input_CH5)&0x1) == IO_LOW) {
  172.         pinStatus[5] = LOW;
  173.     }
  174. #endif
  175. #endif
  176. #ifdef  sns_input_CH6
  177. #if sns_input_CH0PCA95xxIO==1
  178.     if (pinStatus[6] == LOW_NOCH && ((status>>sns_input_CH6)&0x1) == IO_HIGH) {
  179.         pinStatus[6] = HIGH;
  180.     } else if (pinStatus[6] == HIGH_NOCH && ((status>>sns_input_CH6)&0x1) == IO_LOW) {
  181.         pinStatus[6] = LOW;
  182.     }
  183. #endif
  184. #endif
  185. #ifdef  sns_input_CH7
  186. #if sns_input_CH7PCA95xxIO==1
  187.     if (pinStatus[7] == LOW_NOCH && ((status>>sns_input_CH7)&0x1) == IO_HIGH) {
  188.         pinStatus[7] = HIGH;
  189.     } else if (pinStatus[7] == HIGH_NOCH && ((status>>sns_input_CH7)&0x1) == IO_LOW) {
  190.         pinStatus[7] = LOW;
  191.     }
  192. #endif
  193. #endif
  194.  
  195. }
  196. #endif
  197.  
  198.  
  199. #if sns_input_ENABLE_PCA95xx==1
  200. /*
  201.  
  202. Function that initiates status variables for PCA95xx pins
  203. called at statup
  204.  
  205. */
  206. void sns_input_setPCA95xxPinStatus(void)
  207. {
  208.     uint16_t status = Pca95xx_GetInputs();
  209. #ifdef  sns_input_CH0
  210. #if sns_input_CH0PCA95xxIO==1
  211.     if (((status>>sns_input_CH0)&0x1) != IO_LOW) {
  212.         pinStatus[0] = HIGH_NOCH;
  213.     } else {
  214.         pinStatus[0] = LOW_NOCH;
  215.     }
  216. #endif
  217. #endif
  218. #ifdef  sns_input_CH1
  219. #if sns_input_CH1PCA95xxIO==1
  220.     if (((status>>sns_input_CH1)&0x1) != IO_LOW) {
  221.         pinStatus[1] = HIGH_NOCH;
  222.     } else {
  223.         pinStatus[1] = LOW_NOCH;
  224.     }
  225. #endif
  226. #endif
  227. #ifdef  sns_input_CH2
  228. #if sns_input_CH2PCA95xxIO==1
  229.     if (((status>>sns_input_CH2)&0x1) != IO_LOW) {
  230.         pinStatus[2] = HIGH_NOCH;
  231.     } else {
  232.         pinStatus[2] = LOW_NOCH;
  233.     }
  234. #endif
  235. #endif
  236. #ifdef  sns_input_CH3
  237. #if sns_input_CH3PCA95xxIO==1
  238.     if (((status>>sns_input_CH3)&0x1) != IO_LOW) {
  239.         pinStatus[3] = HIGH_NOCH;
  240.     } else {
  241.         pinStatus[3] = LOW_NOCH;
  242.     }
  243. #endif
  244. #endif
  245. #ifdef  sns_input_CH4
  246. #if sns_input_CH4PCA95xxIO==1
  247.     if (((status>>sns_input_CH4)&0x1) != IO_LOW) {
  248.         pinStatus[4] = HIGH_NOCH;
  249.     } else {
  250.         pinStatus[4] = LOW_NOCH;
  251.     }
  252. #endif
  253. #endif
  254. #ifdef  sns_input_CH5
  255. #if sns_input_CH5PCA95xxIO==1
  256.     if (((status>>sns_input_CH5)&0x1) != IO_LOW) {
  257.         pinStatus[5] = HIGH_NOCH;
  258.     } else {
  259.         pinStatus[5] = LOW_NOCH;
  260.     }
  261. #endif
  262. #endif
  263. #ifdef  sns_input_CH6
  264. #if sns_input_CH6PCA95xxIO==1
  265.     if (((status>>sns_input_CH6)&0x1) != IO_LOW) {
  266.         pinStatus[6] = HIGH_NOCH;
  267.     } else {
  268.         pinStatus[6] = LOW_NOCH;
  269.     }
  270. #endif
  271. #endif
  272. #ifdef  sns_input_CH7
  273. #if sns_input_CH7PCA95xxIO==1
  274.     if (((status>>sns_input_CH7)&0x1) != IO_LOW) {
  275.         pinStatus[7] = HIGH_NOCH;
  276.     } else {
  277.         pinStatus[7] = LOW_NOCH;
  278.     }
  279. #endif
  280. #endif
  281. }
  282. #endif
  283.  
  284. void sns_input_Init(void)
  285. {
  286.     pinStatus[0] = NOCHANGE;
  287.     pinStatus[1] = NOCHANGE;
  288.     pinStatus[2] = NOCHANGE;
  289.     pinStatus[3] = NOCHANGE;
  290.     pinStatus[4] = NOCHANGE;
  291.     pinStatus[5] = NOCHANGE;
  292.     pinStatus[6] = NOCHANGE;
  293.     pinStatus[7] = NOCHANGE;
  294.     uint8_t index = 0;
  295.  
  296. #if sns_input_ENABLE_PCA95xx==1
  297.     Pca95xx_SetCallback(sns_input_PCA95XX_CALLBACK_INDEX, &sns_input_PCA95xx_callback);
  298.     Pca95xx_Init(0);
  299. #endif
  300.  
  301. #ifdef  sns_input_CH0
  302. #if sns_input_CH0PCA95xxIO==0
  303.     #if (sns_input_CH0_pullup == 1)
  304.         gpio_set_pullup(sns_input_CH0);
  305.     #else
  306.         gpio_clr_pullup(sns_input_CH0);
  307.     #endif
  308.         gpio_set_in(sns_input_CH0);
  309.         Pcint_SetCallbackPin(sns_input_PCINT_CH0, sns_input_CH0, &sns_input_pcint_callback);
  310. #else
  311.         Pca95xx_set_in(sns_input_CH0);
  312. #endif
  313.         index++;
  314. #endif
  315. #ifdef  sns_input_CH1
  316. #if sns_input_CH1PCA95xxIO==0
  317.     #if (sns_input_CH1_pullup == 1)
  318.         gpio_set_pullup(sns_input_CH1);
  319.     #else
  320.         gpio_clr_pullup(sns_input_CH1);
  321.     #endif     
  322.         gpio_set_in(sns_input_CH1);
  323.         Pcint_SetCallbackPin(sns_input_PCINT_CH1, sns_input_CH1, &sns_input_pcint_callback);
  324. #else
  325.         Pca95xx_set_in(sns_input_CH1);
  326. #endif
  327.         index++;
  328. #endif
  329. #ifdef  sns_input_CH2
  330. #if sns_input_CH2PCA95xxIO==0
  331.     #if (sns_input_CH2_pullup == 1)
  332.         gpio_set_pullup(sns_input_CH2);
  333.     #else
  334.         gpio_clr_pullup(sns_input_CH2);
  335.     #endif     
  336.         gpio_set_in(sns_input_CH2);
  337.         Pcint_SetCallbackPin(sns_input_PCINT_CH2, sns_input_CH2, &sns_input_pcint_callback);
  338. #else
  339.         Pca95xx_set_in(sns_input_CH2);
  340. #endif
  341.         index++;
  342. #endif
  343. #ifdef  sns_input_CH3
  344. #if sns_input_CH3PCA95xxIO==0
  345.     #if (sns_input_CH3_pullup == 1)
  346.         gpio_set_pullup(sns_input_CH3);
  347.     #else
  348.         gpio_clr_pullup(sns_input_CH3);
  349.     #endif     
  350.         gpio_set_in(sns_input_CH3);
  351.         Pcint_SetCallbackPin(sns_input_PCINT_CH3, sns_input_CH3, &sns_input_pcint_callback);
  352. #else
  353.         Pca95xx_set_in(sns_input_CH3);
  354. #endif
  355.         index++;
  356. #endif
  357. #ifdef  sns_input_CH4
  358. #if sns_input_CH4PCA95xxIO==0
  359.     #if (sns_input_CH4_pullup == 1)
  360.         gpio_set_pullup(sns_input_CH4);
  361.     #else
  362.         gpio_clr_pullup(sns_input_CH4);
  363.     #endif     
  364.         gpio_set_in(sns_input_CH4);
  365.         Pcint_SetCallbackPin(sns_input_PCINT_CH4, sns_input_CH4, &sns_input_pcint_callback);
  366. #else
  367.         Pca95xx_set_in(sns_input_CH4);
  368. #endif
  369.         index++;
  370. #endif
  371. #ifdef  sns_input_CH5
  372. #if sns_input_CH5PCA95xxIO==0
  373.     #if (sns_input_CH5_pullup == 1)
  374.         gpio_set_pullup(sns_input_CH5);
  375.     #else
  376.         gpio_clr_pullup(sns_input_CH5);
  377.     #endif     
  378.         gpio_set_in(sns_input_CH5);
  379.         Pcint_SetCallbackPin(sns_input_PCINT_CH5, sns_input_CH5, &sns_input_pcint_callback);
  380. #else
  381.         Pca95xx_set_in(sns_input_CH5);
  382. #endif
  383.         index++;
  384. #endif
  385. #ifdef  sns_input_CH6
  386. #if sns_input_CH6PCA95xxIO==0
  387.     #if (sns_input_CH6_pullup == 1)
  388.         gpio_set_pullup(sns_input_CH6);
  389.     #else
  390.         gpio_clr_pullup(sns_input_CH6);
  391.     #endif         
  392.         gpio_set_in(sns_input_CH6);
  393.         Pcint_SetCallbackPin(sns_input_PCINT_CH6, sns_input_CH6, &sns_input_pcint_callback);
  394. #else
  395.         Pca95xx_set_in(sns_input_CH6);
  396. #endif
  397.         index++;
  398. #endif
  399. #ifdef  sns_input_CH7
  400. #if sns_input_CH7PCA95xxIO==0
  401.     #if (sns_input_CH7_pullup == 1)
  402.         gpio_set_pullup(sns_input_CH7);
  403.     #else
  404.         gpio_clr_pullup(sns_input_CH7);
  405.     #endif     
  406.         gpio_set_in(sns_input_CH7);
  407.         Pcint_SetCallbackPin(sns_input_PCINT_CH7, sns_input_CH7, &sns_input_pcint_callback);
  408. #else
  409.         Pca95xx_set_in(sns_input_CH7);
  410. #endif
  411.         index++;
  412. #endif
  413.  
  414. #if sns_input_ENABLE_PCA95xx==1
  415.     sns_input_setPCA95xxPinStatus();
  416. #endif
  417.  
  418.     Timer_SetTimeout(sns_input_DEBOUNCE_TIMER, sns_input_DEBOUNCE_TIME_MS, TimerTypeFreeRunning, 0);
  419. }
  420.  
  421. void sns_input_Process(void)
  422. {
  423.     if (Timer_Expired(sns_input_DEBOUNCE_TIMER))
  424.     {
  425.         uint8_t index = 0;
  426.         for (index = 0; index < 8; index++) {
  427.             if (pinStatus[index] == LOW || pinStatus[index] == HIGH) {
  428.                 StdCan_Msg_t txMsg;
  429.                 StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_SNS);
  430.                 StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER);
  431.                 txMsg.Header.ModuleType = CAN_MODULE_TYPE_SNS_INPUT;
  432.                 txMsg.Header.ModuleId = sns_input_ID;
  433.                 txMsg.Header.Command = CAN_MODULE_CMD_PHYSICAL_PINSTATUS;
  434.                 txMsg.Length = 2;
  435.                 txMsg.Data[0] = index;
  436.                 if (pinStatus[index] == HIGH) {
  437.                     txMsg.Data[1] = CAN_MODULE_ENUM_PHYSICAL_PINSTATUS_STATUS_HIGH;
  438.                     pinStatus[index] = HIGH_NOCH;
  439.                 } else {
  440.                     txMsg.Data[1] = CAN_MODULE_ENUM_PHYSICAL_PINSTATUS_STATUS_LOW;
  441.                     pinStatus[index] = LOW_NOCH;
  442.                 }
  443.                 while (StdCan_Put(&txMsg) != StdCan_Ret_OK);
  444.             }
  445.         }
  446.     }
  447. }
  448.  
  449. void sns_input_HandleMessage(StdCan_Msg_t *rxMsg)
  450. {
  451.    
  452. }
  453.  
  454. void sns_input_List(uint8_t ModuleSequenceNumber)
  455. {
  456.     StdCan_Msg_t txMsg;
  457.    
  458.     StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_SNS);
  459.     StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER);
  460.     txMsg.Header.ModuleType = CAN_MODULE_TYPE_SNS_INPUT;
  461.     txMsg.Header.ModuleId = sns_input_ID;
  462.     txMsg.Header.Command = CAN_MODULE_CMD_GLOBAL_LIST;
  463.     txMsg.Length = 6;
  464.  
  465.     txMsg.Data[0] = NODE_HW_ID_BYTE0;
  466.     txMsg.Data[1] = NODE_HW_ID_BYTE1;
  467.     txMsg.Data[2] = NODE_HW_ID_BYTE2;
  468.     txMsg.Data[3] = NODE_HW_ID_BYTE3;
  469.    
  470.     txMsg.Data[4] = NUMBER_OF_MODULES;
  471.     txMsg.Data[5] = ModuleSequenceNumber;
  472.    
  473.     while (StdCan_Put(&txMsg) != StdCan_Ret_OK);
  474. }
  475.