|
|
@@ -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));
|