Kaynağa Gözat

将所有传感器接口整合为1个

guohui 1 yıl önce
ebeveyn
işleme
197d1eddc6
1 değiştirilmiş dosya ile 58 ekleme ve 69 silme
  1. 58 69
      pro/src/sensor_handle.c

+ 58 - 69
pro/src/sensor_handle.c

@@ -4,6 +4,48 @@
 //#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");  
+        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 
@@ -63,55 +105,6 @@ int sensor_get_d_temperature_value_anderson(void* manger,int saddr,float* temp1,
 }
 
 
-/// @brief 获取IO状态
-/// @param saadr 
-/// @param sts 
-/// @return 
-int sensor_get_io_status(int saddr,unsigned char* sts)
-{
-    int val;
-    struct gpiod_line *line;
-    //获取系统IO状态
-    int ret = 0 ;
-    //获取GPIO引脚的值
-    //val = gpiod_line_get_value(line);
-
-    return 0;
-}
-
-/// @brief 设置IO输出状态
-/// @param saadr 
-/// @param sts 
-/// @return 
-int sensor_set_io_status(int saddr,unsigned char sts)
-{
-    int val;
-
-    return 0;
-}
-
-
-
-// int sensor_io_init(char* port_name,int saddr)
-// {
-//     int val;
-//     struct gpiod_chip *chip;
-//     struct gpiod_line *line;    
-//     chip = gpiod_chip_open_by_number(0);  // 0是设备编号,根据实际情况修改
-//     line = gpiod_chip_get_line(chip, X);  // 替换X为引脚编号
-
-//     //设置GPIO引脚的方向
-//     gpiod_line_request_output(line, "gpio-example", GPIOD_LINE_ACTIVE_STATE_HIGH);
-//     //设置GPIO引脚的值
-//     gpiod_line_set_value(line, 1);  // 设置为高电平
-//     //读取GPIO引脚的值
-//     val = gpiod_line_get_value(line);
-//     printf("GPIO value: %d\n", val);
-//     // 关闭GPIO设备
-//     gpiod_line_release(line);
-//     gpiod_chip_close(chip);
-
-// }
 
 int sensor_get_co2_value(void* manger,int saddr,float* temp)
 {
@@ -138,12 +131,10 @@ int sensor_get_data(int type, int subtype, int addr, sensor_dat_t *data)
     switch(type) {
         case SENSOR_TYPE_TEMP_HUMI:
         {
-            uint16_t tmp[2] = {0};
-
+            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 ;
@@ -159,8 +150,8 @@ int sensor_get_data(int type, int subtype, int addr, sensor_dat_t *data)
                     if (r <= 0) {
                         return -1;
                     }
-                    data->val[0] = data_temp[0]/10.0;   //温度值
-                    data->val[1] = data_temp[1]/10.0;   //湿度值
+                    data->val[0] = tmp[0]/10.0f;   //温度值
+                    data->val[1] = tmp[1]/10.0f;   //湿度值
                 }
                 break;
             }
@@ -168,26 +159,25 @@ int sensor_get_data(int type, int subtype, int addr, sensor_dat_t *data)
         break;
 
         case SENSOR_TYPE_SMOKE:
-        {
-
-        }
-        break;
-
         case SENSOR_TYPE_WATER:
-        {
-
-        }
-        break;
-
         case SENSOR_TYPE_ACCESS:
         {
-
+            r = gpio_get(GPIO_PD11);
+            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;
 
@@ -205,11 +195,10 @@ int sensor_get_data(int type, int subtype, int addr, sensor_dat_t *data)
 
         case SENSOR_TYPE_TEMP_DOUBLE:
         {
+            uint16_t tmp[2];
             switch(subtype) {
                 case SENSOR_TYPE_TEMP_HUMI_RSWSN01PVC:
                 {
-                    uint16_t tmp[2]={0};
-
                     r = g_modbus_read_input_reg(mm, addr, 0x0400, 1, &tmp[0]);
                     if (r <= 0) {
                         return -1;
@@ -229,10 +218,10 @@ int sensor_get_data(int type, int subtype, int addr, sensor_dat_t *data)
 
         case SENSOR_TYPE_TEMP:
         {
+            uint16_t tmp;
             switch(subtype) {
                 case SENSOR_TYPE_TEMP_BTG50H8EL3200:
                 {
-                    uint16_t tmp={0};
                     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));