Subversion Repositories HomeAutomation

Rev

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

  1.  
  2. #include "act_pcaPWM.h"
  3. #include "drivers/io/PCA9634.h"
  4.  
  5. static uint16_t setValue[8];
  6. static uint16_t isValue[8];
  7.  
  8. #ifdef act_pcaPWM_USEEEPROM
  9. #include "act_pcaPWM_eeprom.h"
  10. struct eeprom_act_pcaPWM EEMEM eeprom_act_pcaPWM =
  11. {
  12.     {
  13.         ///TODO: Define initialization values on the EEPROM variables here, this will generate a *.eep file that can be used to store this values to the node, can in future be done with a EEPROM module and the make-scrips. Write the values in the exact same order as the struct is defined in the *.h file.
  14.         0x0000, // ch 1
  15.         0x0000, // ch 2
  16.         0x0000, // ch 3
  17.         0x0000, // ch 4
  18.         0x0000, // ch 5
  19.         0x0000, // ch 6
  20.         0x0000, // ch 7
  21.         0x0000  // ch 8
  22.     },
  23.     0   // crc, must be a correct value, but this will also be handled by the EEPROM module or make scripts
  24. };
  25. #endif
  26.  
  27. void act_pcaPWM_Init(void)
  28. {
  29. #ifdef act_pcaPWM_USEEEPROM
  30.     if (EEDATA_OK)
  31.     {
  32.       setValue[0] = eeprom_read_word(EEDATA16.ch1);
  33.       setValue[1] = eeprom_read_word(EEDATA16.ch2);
  34.       setValue[2] = eeprom_read_word(EEDATA16.ch3);
  35.       setValue[3] = eeprom_read_word(EEDATA16.ch4);
  36.       setValue[4] = eeprom_read_word(EEDATA16.ch5);
  37.       setValue[5] = eeprom_read_word(EEDATA16.ch6);
  38.       setValue[6] = eeprom_read_word(EEDATA16.ch7);
  39.       setValue[7] = eeprom_read_word(EEDATA16.ch8);
  40.     } else
  41.     {   //The CRC of the EEPROM is not correct, store default values and update CRC
  42.       eeprom_write_word_crc(EEDATA16.ch1, 0x0000, WITHOUT_CRC);
  43.       eeprom_write_word_crc(EEDATA16.ch2, 0x0000, WITHOUT_CRC);
  44.       eeprom_write_word_crc(EEDATA16.ch3, 0x0000, WITHOUT_CRC);
  45.       eeprom_write_word_crc(EEDATA16.ch4, 0x0000, WITHOUT_CRC);
  46.       eeprom_write_word_crc(EEDATA16.ch5, 0x0000, WITHOUT_CRC);
  47.       eeprom_write_word_crc(EEDATA16.ch6, 0x0000, WITHOUT_CRC);
  48.       eeprom_write_word_crc(EEDATA16.ch7, 0x0000, WITHOUT_CRC);
  49.       eeprom_write_word_crc(EEDATA16.ch8, 0x0000, WITHOUT_CRC);
  50.       EEDATA_UPDATE_CRC;
  51.     }
  52. #endif
  53.  
  54.     pca9634_init(act_pcaPWM_I2C_ADDRESS);
  55.     for (uint8_t i=0; i<8; i++)
  56.     {
  57.         pca9634_setOpMode(i, PCA9634_OP_IND);
  58.         /* Set "current" value to something impossible to force an update at start */
  59.         isValue[i] = 10001;
  60.     }
  61.    
  62. #ifdef act_pcaPWM_OUTPUT_ENABLE_IO
  63.     gpio_set_out(act_pcaPWM_OUTPUT_ENABLE_IO);
  64.     gpio_clr_pin(act_pcaPWM_OUTPUT_ENABLE_IO);
  65. #endif
  66. #ifdef act_pcaPWM_LED_OVERRIDE_IO
  67.     gpio_set_out(act_pcaPWM_LED_OVERRIDE_IO);
  68.     gpio_clr_pin(act_pcaPWM_LED_OVERRIDE_IO);
  69. #endif
  70. }
  71.  
  72. void act_pcaPWM_Process(void)
  73. {
  74.  
  75.     for (uint8_t i=0; i < 8; i++)
  76.     {
  77.         if (setValue[i] != isValue[i])
  78.         {
  79.             isValue[i] = setValue[i];
  80.             pca9634_setDuty(i, isValue[i]*act_pcaPWM_FACT);
  81.             Timer_SetTimeout(act_pcaPWM_STORE_VALUE_TIMEOUT, act_pcaPWM_STORE_VALUE_TIMEOUT_TIME*1000, TimerTypeOneShot, 0);
  82.         }
  83.     }
  84.  
  85.     if (Timer_Expired(act_pcaPWM_STORE_VALUE_TIMEOUT))
  86.     {
  87.         if (isValue[0] != eeprom_read_word(EEDATA16.ch1))
  88.         {
  89.             eeprom_write_word_crc(EEDATA16.ch1, isValue[0], WITH_CRC);
  90.         }
  91.         if (isValue[1] != eeprom_read_word(EEDATA16.ch2))
  92.         {
  93.             eeprom_write_word_crc(EEDATA16.ch2, isValue[1], WITH_CRC);
  94.         }
  95.         if (isValue[2] != eeprom_read_word(EEDATA16.ch3))
  96.         {
  97.             eeprom_write_word_crc(EEDATA16.ch3, isValue[2], WITH_CRC);
  98.         }
  99.         if (isValue[3] != eeprom_read_word(EEDATA16.ch4))
  100.         {
  101.             eeprom_write_word_crc(EEDATA16.ch4, isValue[3], WITH_CRC);
  102.         }
  103.         if (isValue[4] != eeprom_read_word(EEDATA16.ch5))
  104.         {
  105.             eeprom_write_word_crc(EEDATA16.ch5, isValue[4], WITH_CRC);
  106.         }
  107.         if (isValue[5] != eeprom_read_word(EEDATA16.ch6))
  108.         {
  109.             eeprom_write_word_crc(EEDATA16.ch6, isValue[5], WITH_CRC);
  110.         }
  111.         if (isValue[6] != eeprom_read_word(EEDATA16.ch7))
  112.         {
  113.             eeprom_write_word_crc(EEDATA16.ch7, isValue[6], WITH_CRC);
  114.         }
  115.         if (isValue[7] != eeprom_read_word(EEDATA16.ch8))
  116.         {
  117.             eeprom_write_word_crc(EEDATA16.ch8, isValue[7], WITH_CRC);
  118.         }
  119.     }
  120.  
  121. }
  122.  
  123. void act_pcaPWM_HandleMessage(StdCan_Msg_t *rxMsg)
  124. {
  125.     if (    StdCan_Ret_class(rxMsg->Header) == CAN_MODULE_CLASS_ACT &&
  126.         StdCan_Ret_direction(rxMsg->Header) == DIRECTIONFLAG_TO_OWNER &&
  127.         rxMsg->Header.ModuleType == CAN_MODULE_TYPE_ACT_PCAPWM &&
  128.         rxMsg->Header.ModuleId == act_pcaPWM_ID)
  129.     {
  130.         uint8_t channel = 0;
  131.         switch (rxMsg->Header.Command)
  132.         {
  133.         case CAN_MODULE_CMD_PHYSICAL_PWM:
  134.             if (rxMsg->Length == 3) {
  135.                 channel = rxMsg->Data[0];
  136.                 setValue[channel] = (rxMsg->Data[1]<<8)+(rxMsg->Data[2]);
  137.             }
  138.            
  139.         break;
  140.         }
  141.     }
  142. }
  143.  
  144. void act_pcaPWM_List(uint8_t ModuleSequenceNumber)
  145. {
  146.     StdCan_Msg_t txMsg;
  147.  
  148.     StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_ACT);
  149.     StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER);
  150.     txMsg.Header.ModuleType = CAN_MODULE_TYPE_ACT_PCAPWM;
  151.     txMsg.Header.ModuleId = act_pcaPWM_ID;
  152.     txMsg.Header.Command = CAN_MODULE_CMD_GLOBAL_LIST;
  153.     txMsg.Length = 6;
  154.  
  155.     txMsg.Data[0] = NODE_HW_ID_BYTE0;
  156.     txMsg.Data[1] = NODE_HW_ID_BYTE1;
  157.     txMsg.Data[2] = NODE_HW_ID_BYTE2;
  158.     txMsg.Data[3] = NODE_HW_ID_BYTE3;
  159.  
  160.     txMsg.Data[4] = NUMBER_OF_MODULES;
  161.     txMsg.Data[5] = ModuleSequenceNumber;
  162.  
  163.     while (StdCan_Put(&txMsg) != StdCan_Ret_OK);
  164. }
  165.