Subversion Repositories HomeAutomation

Rev

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

  1.  
  2. #include "sns_ds18x20.h"
  3.  
  4. void ConvertTemperature(void);
  5. void ConvertTemperature_callback(uint8_t timer);
  6. void ReadTemperature(void);
  7. void ReadTemperature_callback(uint8_t timer);
  8.  
  9. uint8_t NumberOfSensors = 0;
  10. uint16_t SensorIds[] = {0, 0, 0, 0};
  11. uint8_t FlagReadTemperature = 0, FlagConvertTemperature = 0, FlagSearchSensors = 0;
  12.  
  13. void ReadTemperature_callback(uint8_t timer)
  14. {
  15.     FlagReadTemperature = 1;
  16. }
  17.  
  18. void ReadTemperature(void)
  19. {
  20.     static uint8_t SearchSensorsTimeout = sns_ds18x20_SEARCH_TIMEOUT;
  21.     static uint8_t CurrentSensor = 0;
  22.     uint8_t subzero, cel, cel_frac_bits = 0;
  23.     StdCan_Msg_t txMsg;
  24.  
  25.     StdCan_Set_class(txMsg.Header, CAN_CLASS_MODULE_SNS);
  26.     StdCan_Set_direction(txMsg.Header, DIR_FROM_OWNER);
  27.     txMsg.Header.ModuleType = CAN_TYPE_MODULE_sns_ds18x20;
  28.     txMsg.Header.ModuleId = sns_ds18x20_ID;
  29.     txMsg.Header.Command = CAN_CMD_MODULE_PHYS_TEMPERATURE_CELSIUS;
  30.     txMsg.Length = 3;
  31.  
  32.     txMsg.Data[0] = SensorIds[CurrentSensor];
  33.  
  34.     if (DS18X20_read_meas(&gSensorIDs[CurrentSensor][0], &subzero, &cel, &cel_frac_bits) == DS18X20_OK)
  35.     {
  36.         int16_t temp = cel;
  37.  
  38.         temp = temp << 6;
  39.  
  40.         temp += (cel_frac_bits << 2);
  41.  
  42.         if (subzero)
  43.         {
  44.             temp = -temp;
  45.         }
  46.  
  47.         txMsg.Data[1] = (uint8_t)(temp >> 8);
  48.         txMsg.Data[2] = (uint8_t)(temp & 0xff);
  49.     }
  50.    
  51.     StdCan_Put(&txMsg);
  52.  
  53.     CurrentSensor++;
  54.     if (CurrentSensor < NumberOfSensors)
  55.         Timer_SetTimeout(sns_ds18x20_TIMER, sns_ds18x20_SEND_DELAY, TimerTypeOneShot, &ReadTemperature_callback);
  56.     else
  57.     {
  58.         SearchSensorsTimeout--;
  59.         if (SearchSensorsTimeout == 0)
  60.         {
  61.             SearchSensorsTimeout = sns_ds18x20_SEARCH_TIMEOUT;
  62.             FlagSearchSensors = 1;
  63.         }
  64.        
  65.         CurrentSensor = 0;
  66.  
  67.         Timer_SetTimeout(sns_ds18x20_TIMER, sns_ds18x20_SEND_PERIOD , TimerTypeOneShot, &ConvertTemperature_callback);
  68.     }
  69. }
  70.  
  71. void ConvertTemperature_callback(uint8_t timer)
  72. {
  73.     FlagConvertTemperature = 1;
  74. }
  75.  
  76. void ConvertTemperature(void)
  77. {
  78.     if (DS18X20_start_meas(DS18X20_POWER_PARASITE, NULL) == DS18X20_OK)
  79.     {
  80.         Timer_SetTimeout(sns_ds18x20_TIMER, DS18B20_TCONV_12BIT, TimerTypeOneShot, &ReadTemperature_callback);
  81.     }
  82. }
  83.  
  84. void sns_ds18x20_Init(void)
  85. {
  86.     /* Make sure there is no more then 4 sensors. */
  87.     FlagSearchSensors = 1;
  88.     NumberOfSensors = 0;
  89.    
  90.     Timer_SetTimeout(sns_ds18x20_TIMER, sns_ds18x20_SEND_PERIOD , TimerTypeFreeRunning, &ConvertTemperature_callback);
  91. }
  92.  
  93. void sns_ds18x20_Process(void)
  94. {
  95.     if (FlagConvertTemperature)
  96.     {
  97.         ConvertTemperature();
  98.         FlagConvertTemperature = 0;
  99.     }
  100.  
  101.     if (FlagSearchSensors)
  102.     {
  103.         NumberOfSensors = search_sensors();
  104.         uint8_t i, j;
  105.  
  106.         for(i = 0; i < NumberOfSensors; i++)
  107.         {
  108.             SensorIds[i] = 0;
  109.             for (j = 0; j < 7; j++)
  110.             {
  111.                 SensorIds[i] ^= gSensorIDs[i][j];  
  112.             }
  113.         }
  114.         FlagSearchSensors = 0;
  115.     }
  116.  
  117.     if (FlagReadTemperature)
  118.     {
  119.         ReadTemperature();
  120.         FlagReadTemperature = 0;
  121.     }
  122. }
  123.  
  124. void sns_ds18x20_HandleMessage(StdCan_Msg_t *rxMsg)
  125. {
  126. }
  127.  
  128. void sns_ds18x20_List(uint8_t ModuleSequenceNumber)
  129. {
  130.     StdCan_Msg_t txMsg;
  131.    
  132.     StdCan_Set_class(txMsg.Header, CAN_CLASS_MODULE_SNS);
  133.     StdCan_Set_direction(txMsg.Header, DIR_FROM_OWNER);
  134.     txMsg.Header.ModuleType = CAN_TYPE_MODULE_sns_ds18x20;
  135.     txMsg.Header.ModuleId = sns_ds18x20_ID;
  136.     txMsg.Header.Command = CAN_CMD_MODULE_NMT_LIST;
  137.     txMsg.Length = 6;
  138.  
  139.     txMsg.Data[0] = NODE_HW_ID_BYTE0;
  140.     txMsg.Data[1] = NODE_HW_ID_BYTE1;
  141.     txMsg.Data[2] = NODE_HW_ID_BYTE2;
  142.     txMsg.Data[3] = NODE_HW_ID_BYTE3;
  143.    
  144.     txMsg.Data[4] = NUMBER_OF_MODULES;
  145.     txMsg.Data[5] = ModuleSequenceNumber;
  146.    
  147.     StdCan_Put(&txMsg);
  148. }
  149.