#include "sensor_handle.h" #include "modbus_handle.h" #include "common.h" //#include 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"); 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; }