Subversion Repositories HomeAutomation

Rev

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

  1.  
  2. #include "sns_FOST02.h"
  3.  
  4.  
  5.  
  6. void GetTemperature(void);
  7. void GetTemperature_callback(uint8_t timer);
  8. void GetHydro(void);
  9. void GetHydro_callback(uint8_t timer);
  10.  
  11. uint8_t FlagGetTemperature = 0, FlagGetHydro = 0, byte1 = 0, byte2 = 0;
  12.  
  13. void GetTemperature_callback(uint8_t timer)
  14. {
  15.     FlagGetTemperature = 1;
  16. }
  17.  
  18. void GetHydroe_callback(uint8_t timer)
  19. {
  20.     FlagGetHydro = 1;
  21. }
  22.  
  23. void GetTemperature(void)
  24. {
  25.       if (getFOST02PinStatus() == 0) {
  26.                FOST_temp_measuring = 0;
  27.                txMsg.DataLength = 2;
  28.                getFOST02DataByte(&byte1, &byte2);
  29.                TmpV = (uint16_t) (byte1<<8) + byte2;
  30.                TmpV = TmpV << 4;
  31.                TmpV = TmpV/25;
  32.                TmpV= TmpV <<4;
  33.                TmpV = TmpV-0x2800;
  34.                txMsg.Data.bytes[1]= (uint8_t) (TmpV & 0x00FF);
  35.                txMsg.Data.bytes[0]= (uint8_t) ((TmpV >> 8) & 0x00FF);
  36.                // send txMsg
  37.                txMsg.Id = ((CAN_SNS << CAN_SHIFT_CLASS) | (SNS_TYPE_TEMPERATURE << CAN_SHIFT_SNS_TYPE) | (NODE_ID << CAN_SHIFT_SNS_SID));
  38.                         txMsg.Id |= ( HUMIDITY_TEMP_ID << CAN_SHIFT_SNS_ID); /* Set sensor id */
  39.                BIOS_CanSend(&txMsg);
  40.                txMsg.DataLength = 2;
  41.       }
  42.    
  43. }
  44.  
  45. void GetHydro(void)
  46. {
  47.     if (getFOST02PinStatus() == 0) {
  48.         StdCan_Msg_t txMsg;
  49.    
  50.         StdCan_Set_class(txMsg.Header, CAN_CLASS_MODULE_SNS);
  51.         StdCan_Set_direction(txMsg.Header, DIR_FROM_OWNER);
  52.         txMsg.Header.ModuleType = CAN_TYPE_MODULE_sns_FOST02;
  53.         txMsg.Header.ModuleId = sns_ds18x20_ID;
  54.         txMsg.Header.Command = CAN_CMD_MODULE_SNS_TEMPERATURE_CELSIUS;
  55.         txMsg.Length = 3;
  56.    
  57.         txMsg.Data[0] = SensorIds[CurrentSensor];
  58.    
  59.         if (DS18X20_read_meas(&gSensorIDs[CurrentSensor][0], &subzero, &cel, &cel_frac_bits) == DS18X20_OK)
  60.         {
  61.             if (subzero)
  62.             {
  63.                 txMsg.Data[1] = -cel-1;
  64.                 txMsg.Data[2] = ~(cel_frac_bits<<4);
  65.             }
  66.             else
  67.             {
  68.                 txMsg.Data[1] = cel;
  69.                 txMsg.Data[2] = (cel_frac_bits<<4);
  70.             }
  71.         }
  72.        
  73.         StdCan_Put(&txMsg);
  74.    
  75.    
  76.         FOST_hydr_measuring = 0;
  77.         txMsg.DataLength = 2;
  78.         getFOST02DataByte(&byte1, &byte2);
  79.         TmpV = HydroTable[byte2];
  80.         txMsg.Data.bytes[1]= (uint8_t) (TmpV & 0x00FF);
  81.         txMsg.Data.bytes[0]= (uint8_t) ((TmpV >> 8) & 0x00FF);
  82.  
  83.         txMsg.Id = ((CAN_SNS << CAN_SHIFT_CLASS) | (SNS_TYPE_HUMIDITY << CAN_SHIFT_SNS_TYPE) | (NODE_ID << CAN_SHIFT_SNS_SID));
  84.         txMsg.Id |= ( HUMIDITY_ID << CAN_SHIFT_SNS_ID);// Set sensor id
  85.         BIOS_CanSend(&txMsg);
  86.         txMsg.DataLength = 2;
  87.     }
  88. }
  89.  
  90.  
  91.  
  92.  
  93.         if( Timebase_PassedTimeMillis(timeStamp_FOST_temp) >= FOST_SEND_PERIOD_temp && FOST_temp_measuring == 0 && FOST_hydr_measuring == 0){
  94.             timeStamp_FOST_temp = Timebase_CurrentTime();
  95.             txMsg.Data.bytes[0] = sendCommand(0x03);
  96.             FOST_temp_measuring = 1;
  97.         }
  98.        
  99.        
  100.         if( Timebase_PassedTimeMillis(timeStamp_FOST_hydr) >= FOST_SEND_PERIOD_hydr && FOST_temp_measuring == 0 && FOST_hydr_measuring == 0){
  101.             timeStamp_FOST_hydr = Timebase_CurrentTime();
  102.             txMsg.Data.bytes[0] = sendCommand(0x05);
  103.             FOST_hydr_measuring = 1;
  104.         }
  105.        
  106.         if (FOST_temp_measuring == 1)
  107.         {
  108.            
  109.         }
  110.  
  111.        
  112.         if (FOST_hydr_measuring == 1)
  113.         {
  114.            
  115.            
  116.         }
  117.        
  118.        
  119.        
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133. uint8_t NumberOfSensors = 0;
  134. uint16_t SensorIds[] = {0, 0, 0, 0};
  135. uint8_t FlagReadTemperature = 0, FlagConvertTemperature = 0, FlagSearchSensors = 0;
  136.  
  137. void ReadTemperature_callback(uint8_t timer)
  138. {
  139.     FlagReadTemperature = 1;
  140. }
  141.  
  142. void ReadTemperature(void)
  143. {
  144.     static uint8_t SearchSensorsTimeout = sns_ds18x20_SEARCH_TIMEOUT;
  145.     static uint8_t CurrentSensor = 0;
  146.     uint8_t subzero, cel, cel_frac_bits = 0;
  147.     StdCan_Msg_t txMsg;
  148.  
  149.     StdCan_Set_class(txMsg.Header, CAN_CLASS_MODULE_SNS);
  150.     StdCan_Set_direction(txMsg.Header, DIR_FROM_OWNER);
  151.     txMsg.Header.ModuleType = CAN_TYPE_MODULE_sns_ds18x20;
  152.     txMsg.Header.ModuleId = sns_ds18x20_ID;
  153.     txMsg.Header.Command = CAN_CMD_MODULE_SNS_TEMPERATURE_CELSIUS;
  154.     txMsg.Length = 3;
  155.  
  156.     txMsg.Data[0] = SensorIds[CurrentSensor];
  157.  
  158.     if (DS18X20_read_meas(&gSensorIDs[CurrentSensor][0], &subzero, &cel, &cel_frac_bits) == DS18X20_OK)
  159.     {
  160.         if (subzero)
  161.         {
  162.             txMsg.Data[1] = -cel-1;
  163.             txMsg.Data[2] = ~(cel_frac_bits<<4);
  164.         }
  165.         else
  166.         {
  167.             txMsg.Data[1] = cel;
  168.             txMsg.Data[2] = (cel_frac_bits<<4);
  169.         }
  170.     }
  171.    
  172.     StdCan_Put(&txMsg);
  173.  
  174.     CurrentSensor++;
  175.     if (CurrentSensor < NumberOfSensors)
  176.         Timer_SetTimeout(sns_ds18x20_TIMER, sns_ds18x20_SEND_DELAY, TimerTypeOneShot, &ReadTemperature_callback);
  177.     else
  178.     {
  179.         SearchSensorsTimeout--;
  180.         if (SearchSensorsTimeout == 0)
  181.         {
  182.             SearchSensorsTimeout = sns_ds18x20_SEARCH_TIMEOUT;
  183.             FlagSearchSensors = 1;
  184.         }
  185.        
  186.         CurrentSensor = 0;
  187.  
  188.         Timer_SetTimeout(sns_ds18x20_TIMER, sns_ds18x20_SEND_PERIOD , TimerTypeOneShot, &ConvertTemperature_callback);
  189.     }
  190. }
  191.  
  192. void ConvertTemperature_callback(uint8_t timer)
  193. {
  194.     FlagConvertTemperature = 1;
  195. }
  196.  
  197. void ConvertTemperature(void)
  198. {
  199.     if (DS18X20_start_meas(DS18X20_POWER_PARASITE, NULL) == DS18X20_OK)
  200.     {
  201.         Timer_SetTimeout(sns_ds18x20_TIMER, DS18B20_TCONV_12BIT, TimerTypeOneShot, &ReadTemperature_callback);
  202.     }
  203. }
  204.  
  205. void sns_FOST02_Init(void)
  206. {
  207.     FlagGetTemperature = 0;
  208.     FlagGetHydro = 0;
  209.     FOST02Init();
  210.  
  211.     //Timer_SetTimeout(sns_ds18x20_TIMER, sns_ds18x20_SEND_PERIOD , TimerTypeFreeRunning, &ConvertTemperature_callback);
  212. }
  213.  
  214. void sns_FOST02_Process(void)
  215. {
  216.     if (FlagConvertTemperature)
  217.     {
  218.         ConvertTemperature();
  219.         FlagConvertTemperature = 0;
  220.     }
  221.  
  222.     if (FlagSearchSensors)
  223.     {
  224.         NumberOfSensors = search_sensors();
  225.         uint8_t i, j;
  226.  
  227.         for(i = 0; i < NumberOfSensors; i++)
  228.         {
  229.             SensorIds[i] = 0;
  230.             for (j = 0; j < 7; j++)
  231.             {
  232.                 SensorIds[i] ^= gSensorIDs[i][j];  
  233.             }
  234.         }
  235.         FlagSearchSensors = 0;
  236.     }
  237.  
  238.     if (FlagReadTemperature)
  239.     {
  240.         ReadTemperature();
  241.         FlagReadTemperature = 0;
  242.     }
  243. }
  244.  
  245. void sns_FOST02_HandleMessage(StdCan_Msg_t *rxMsg)
  246. {
  247. }
  248.  
  249. void sns_FOST02_List(uint8_t ModuleSequenceNumber)
  250. {
  251.     StdCan_Msg_t txMsg;
  252.    
  253.     StdCan_Set_class(txMsg.Header, CAN_CLASS_MODULE_SNS);
  254.     StdCan_Set_direction(txMsg.Header, DIR_FROM_OWNER);
  255.     txMsg.Header.ModuleType = CAN_TYPE_MODULE_sns_ds18x20;
  256.     txMsg.Header.ModuleId = sns_ds18x20_ID;
  257.     txMsg.Header.Command = CAN_CMD_MODULE_NMT_LIST;
  258.     txMsg.Length = 6;
  259.  
  260.     txMsg.Data[0] = NODE_HW_ID_BYTE0;
  261.     txMsg.Data[1] = NODE_HW_ID_BYTE1;
  262.     txMsg.Data[2] = NODE_HW_ID_BYTE2;
  263.     txMsg.Data[3] = NODE_HW_ID_BYTE3;
  264.    
  265.     txMsg.Data[4] = NUMBER_OF_MODULES;
  266.     txMsg.Data[5] = ModuleSequenceNumber;
  267.    
  268.     StdCan_Put(&txMsg);
  269. }
  270.