| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 |
- #include "sensor_handle.h"
- #include "modbus_handle.h"
- #include "common.h"
- //#include <gpiod.h>
- static int gpio_get(int gpio)
- {
- char value_path[64];
- char buf[3]; // 用于存储读取到的GPIO值,通常为'0'或'1'
- ssize_t bytesRead;
- int r,fd;
- // 构造GPIO值的路径
- snprintf(value_path, sizeof(value_path), GPIO_VALUE_PATH, gpio);
-
- // 打开GPIO值文件以读取
- fd = open(value_path, O_RDONLY);
- if (fd == -1) {
- perror("Failed to open GPIO value for reading sensor");
- return -1;
- }
-
- // 读取GPIO的值
- bytesRead = read(fd, buf, sizeof(buf) - 1);
- if (bytesRead == -1) {
- perror("Failed to read from GPIO value");
- close(fd);
- return -2;
- }
- // 确保字符串以null终止
- buf[bytesRead] = '\0';
-
- // 打印读取到的GPIO值
- // printf("GPIO %d value: %s\n", GPIO_PE3, buf);
- if (buf[0]=='0'){
- r = 1;
- } else{
- r = 0;
- }
- // 关闭文件描述符
- close(fd);
-
- return r;
- }
- /// @brief 获取温湿度值
- /// @param manger
- /// @param saddr
- /// @param temp
- /// @param humi
- /// @return
- int sensor_get_temperature_value(void* manger,int saddr,float* temp,float* humi)
- {
- int ret = 0 ;
- uint16_t data_temp[2] = {0};
- ret = g_modbus_read_x_reg(manger,saddr,0,2,data_temp);
- if(ret<=0)
- return -1 ;
- //解算湿度值
- *humi = data_temp[0]/10.0 ;
- //解算温度值
- *temp = data_temp[1]/10.0 ;
- return 0;
- }
- int sensor_get_temperature_value_anderson(void* manger,int saddr,float* temp,float* humi)
- {
- int ret = 0 ;
- uint16_t data_temp[2] = {0};
- ret = g_modbus_read_input_reg(manger,saddr,0,2,data_temp);
- if (ret <= 0)
- {
- return -1;
- }
- //解算湿度值
- *humi = data_temp[1]/10.0 ;
- //解算温度值
- *temp = data_temp[0]/10.0 ;
- return 0;
- }
- int sensor_get_d_temperature_value_anderson(void* manger,int saddr,float* temp1,float* temp2)
- {
- int ret = 0 ;
- uint16_t data_temp[1] = {0};
- #define ANDERSON_temp1 0x0400
- #define ANDERSON_temp2 0x0401
- ret = g_modbus_read_input_reg(manger,saddr,ANDERSON_temp1,1,data_temp);
- if (ret <= 0) {
- return -1;
- }
- //解算湿度值
- *temp1 = data_temp[0]/10.0 ;
- ret = g_modbus_read_input_reg(manger,saddr,ANDERSON_temp2,1,data_temp);
- if (ret <= 0){
- return -1;
- }
- //解算温度值
- *temp2 = data_temp[0]/10.0 ;
- return 0;
- }
- int sensor_get_co2_value(void* manger,int saddr,float* temp)
- {
- int ret = 0 ;
- uint16_t data_temp[1] = {0};
- ret = g_modbus_read_x_reg(manger,saddr,19,1,data_temp);
- if(ret<=0)
- return -1 ;
- //解算气体浓度值
- *temp = data_temp[0] ;
- return 0;
- }
- int sensor_get_data(int type, int subtype, int addr, int subaddr, sensor_dat_t *data)
- {
- int r=-1;
- Modbus_Manger *mm=&__globalDeviceManage.sensor_modbus_manager;
- if(!data) {
- return -1;
- }
- memset(data, 0, sizeof(sensor_dat_t));
- switch(type) {
- case SENSOR_TYPE_TEMP_HUMI:
- {
- uint16_t tmp[2];
- switch(subtype) {
- case SENSOR_TYPE_TEMP_HUMI_RSWSN01PVC:
- {
- r = g_modbus_read_x_reg(mm, addr, 0, 2, tmp);
- if(r<=0) {
- return -1 ;
- }
- data->val[0] = tmp[1]/10.0f; //湿度值
- data->val[1] = tmp[0]/10.0f; //湿度值
- }
- break;
- case SENSOR_TYPE_TEMP_HUMI_HKSHT301T1H536VRS485: //anderson
- {
- r = g_modbus_read_input_reg(mm, addr, 0, 2, tmp);
- if (r <= 0) {
- return -1;
- }
- data->val[0] = tmp[0]/10.0f; //温度值
- data->val[1] = tmp[1]/10.0f; //湿度值
- }
- break;
- }
- }
- break;
- case SENSOR_TYPE_SMOKE:
- case SENSOR_TYPE_WATER:
- case SENSOR_TYPE_ACCESS:
- {
- r = gpio_get(subaddr+GPIO_PE14);
- if(r<0) {
- return -1;
- }
- data->flag = r; //温度值
- }
- break;
- case SENSOR_TYPE_GAS:
- {
- uint16_t tmp;
- r = g_modbus_read_x_reg(mm, addr, 19, 1, &tmp);
- if(r<=0) {
- return -1 ;
- }
- data->val[0] = tmp; //气体浓度值
- }
- break;
- case SENSOR_TYPE_AIR_PRESS:
- {
- }
- break;
- case SENSOR_TYPE_AIR_COND:
- {
- }
- break;
- case SENSOR_TYPE_TEMP_DOUBLE:
- {
- uint16_t tmp[2];
- switch(subtype) {
- case SENSOR_TYPE_TEMP_HUMI_RSWSN01PVC:
- {
- r = g_modbus_read_input_reg(mm, addr, 0x0400, 1, &tmp[0]);
- if (r <= 0) {
- return -1;
- }
- r = g_modbus_read_input_reg(mm, addr, 0x0401, 1, &tmp[1]);
- if (r <= 0) {
- return -1;
- }
- data->val[0] = tmp[1]/10.0f; //解算温度值
- data->val[1] = tmp[0]/10.0f; //解算湿度值
- }
- break;
- }
- }
- break;
- case SENSOR_TYPE_TEMP:
- {
- uint16_t tmp;
- switch(subtype) {
- case SENSOR_TYPE_TEMP_BTG50H8EL3200:
- {
- r = g_modbus_read_x_reg(mm, addr, 0, 1, &tmp);
- if (r <= 0) {
- //printf("___ sensor BTG50H8EL3200 read failed, addr: %d, %s\n", addr, modbus_strerror(errno));
- return -1;
- }
- data->val[0] = tmp/10.0f - 50;
- //printf("___ BTG50H8EL3200 read: 0x%04x, temp: %0.2f\n", tmp, data->val[0]);
- }
- break;
- }
- }
- break;
- case SENSOR_TYPE_LEAK:
- {
- switch(subtype) {
- case SENSOR_TYPE_LEAK_XWDC01A:
- {
- uint16_t tmp[4]={0};
- r = g_modbus_read_input_reg(mm, addr, 0, 4, tmp);
- if (r <= 0) {
- //printf("___ sensor XWDC01A read failed, addr: %d, %s\n", addr, modbus_strerror(errno));
- return -1;
- }
- //printf("___ XWDC01A read: 0x%04x, 0x%04x, 0x%04x, 0x%04x\n", tmp[0],tmp[1],tmp[2],tmp[3]);
- data->flag = 0;
- if(tmp[0] || tmp[1]) {
- data->flag = 1;
- }
- }
- break;
- }
- }
- break;
- }
- return 0;
- }
|