Explorar o código

MOD:增加干节点传感器及报警相关功能
(增加了一个数据更新锁)

chenyuanjie %!s(int64=2) %!d(string=hai) anos
pai
achega
47c3a998ee

+ 1 - 0
pro/CMakeLists.txt

@@ -58,6 +58,7 @@ set(PDU_SRC_LIST
 	${PROJECT_SOURCE_DIR}/src/lcd_drv.c
 	${PROJECT_SOURCE_DIR}/src/sensor_handle.c
 	${PROJECT_SOURCE_DIR}/src/cJSON.c
+	${PROJECT_SOURCE_DIR}/src/language_common.c
 	${PROJECT_SOURCE_DIR}/src/common.c
 	${PROJECT_SOURCE_DIR}/src/app.c
 	${PROJECT_SOURCE_DIR}/src/appweb_handle.c

+ 149 - 35
pro/src/app.c

@@ -51,7 +51,7 @@ void* power_thread(void* arg)
     _PowerDSManage_t* _powerDsManageTemp = NULL ;
     dev_search_last_Index(_globalDeviceManager->db, &nSaveIndex, strPower);       // 查询日志最大点
     dev_search_last_Index(_globalDeviceManager->db, &nSaveTacIndex, strTacPower); // 查询日志最大点
-    _globalDeviceManager->_global_alarmLanguage=create_hash_table(13);
+    _globalDeviceManager->_global_alarmLanguage=create_hash_table(18);
     InitHashTable(_globalDeviceManager->_global_alarmLanguage);
     unsigned int samp_time = _globalDeviceManager->_global_device_info->product_samp_time;
     unsigned int usleepTime = samp_time*1000;
@@ -142,6 +142,8 @@ void* power_thread(void* arg)
         }
         bool SaveDBFlag=false; //数据库存储记录,只要有通道存,就存一次总通道数据  
         int _chn = 0;
+        //数据刷新
+        pthread_mutex_lock(&__globalDeviceManage._power_update);
         list_for_each_entry(_globalPowerMangerTemp, &_globalDeviceManager->_globalPowerManger.list, list)
         {
             //获取通道类型
@@ -655,7 +657,7 @@ void* power_thread(void* arg)
                 log_d("ch%d insert data error.\n", _globalTotalPowerInfo.product_ch_id);
             }
         }
-        
+        pthread_mutex_unlock(&__globalDeviceManage._power_update);
   
         //判断阈值状态
 
@@ -697,6 +699,89 @@ int dev_sensor_init(GlobalDeviceManager *_globalDeviceManager)
     return 0;
 }
 
+/**
+ * @brief 传感器报警函数
+ *
+ * 根据给定的报警类型和全局传感器管理器,执行相应的传感器报警操作。
+ *
+ * @param _globalSensorMangerTemp 全局传感器管理器指针
+ * @param nAlarmType 报警类型(如SENSOR_VAL1_UPPER、SENSOR_VAL1_LOWER等)
+ */
+void sensor_alarm(GlobalSensorManger *_globalSensorMangerTemp, int nAlarmType)
+{
+    bool *penable = NULL;   //使能
+    bool *pSave = NULL;     //是否已报警
+    float *pValthreshold = NULL;//阈值
+    float *pValData = NULL;     //当前值
+    if (!_globalSensorMangerTemp)
+    {
+        return;
+    }
+    switch (nAlarmType)
+    {
+    case SENSOR_VAL1_UPPER:
+        penable = &_globalSensorMangerTemp->over_manager->sensor_val1_upper_enabled;
+        pValthreshold = &_globalSensorMangerTemp->over_manager->sensor_val1_upper_threshold;
+        pSave = &_globalSensorMangerTemp->warning_status.sensor_val1_upper;
+        pValData = &_globalSensorMangerTemp->Cur_sensor_info.val1;
+        break;
+    case SENSOR_VAL1_LOWER:
+        penable = &_globalSensorMangerTemp->over_manager->sensor_val1_lower_enabled;
+        pValthreshold = &_globalSensorMangerTemp->over_manager->sensor_val1_lower_threshold;
+        pSave = &_globalSensorMangerTemp->warning_status.sensor_val1_lower;
+        pValData = &_globalSensorMangerTemp->Cur_sensor_info.val1;
+        break;
+    case SENSOR_VAL2_UPPER:
+        penable = &_globalSensorMangerTemp->over_manager->sensor_val2_upper_enabled;
+        pValthreshold = &_globalSensorMangerTemp->over_manager->sensor_val2_upper_threshold;
+        pSave = &_globalSensorMangerTemp->warning_status.sensor_val2_upper;
+        pValData = &_globalSensorMangerTemp->Cur_sensor_info.val2;
+        break;
+    case SENSOR_VAL2_LOWER:
+        penable = &_globalSensorMangerTemp->over_manager->sensor_val2_lower_enabled;
+        pValthreshold = &_globalSensorMangerTemp->over_manager->sensor_val2_lower_threshold;
+        pSave = &_globalSensorMangerTemp->warning_status.sensor_val2_lower;
+        pValData = &_globalSensorMangerTemp->Cur_sensor_info.val2;
+        break;
+
+    default:
+        break;
+    }
+    if (!(pValthreshold && penable && pValData && pSave))
+    {
+        return;
+    }
+    if (nAlarmType == SENSOR_VAL1_UPPER || nAlarmType == SENSOR_VAL2_UPPER)//上限
+    {
+        if (*penable == 1 && *pValthreshold < *pValData)
+        {
+            if (!*pSave)
+            {
+                *pSave = true;
+                dev_sensor_Alarm_send_message(&__globalDeviceManage, _globalSensorMangerTemp, nAlarmType);
+            }
+        }
+        else
+        {
+            *pSave = false;
+        }
+    }
+    else    //下限
+    {
+        if (*penable == 1 && *pValthreshold > *pValData)
+        {
+            if (!*pSave)
+            {
+                *pSave = true;
+                dev_sensor_Alarm_send_message(&__globalDeviceManage, _globalSensorMangerTemp, nAlarmType);
+            }
+        }
+        else
+        {
+            *pSave = false;
+        }
+    }
+}
 
 /// @brief 传感器采集线程
 /// @param arg 
@@ -721,12 +806,31 @@ void* sensor_thread(void* arg)
     float humidity = 0.0;
     int nSaveIndex = 1;
     char strTable[] = "Table_SensorInfo";
+    char strTemp[64] = {0};
     dev_search_last_Index(_globalDeviceManager->db, &nSaveIndex, strTable); // 查询日志最大点
 
     // printf("asdasdasdasdasd   %d\n",nSaveIndex);
     int nMaxIndex = 2000000000;
     int nDeleteNumber = 1000 / 120000 * 3600 * 24 * 30 * 10; // 1/60s;
     //  printf("senseor   !!!!!\n");
+
+    //初始化GPIO
+    /*
+    log_d("GPIO 开始初始化");
+    list_for_each_entry(_globalSensorMangerTemp, &_globalDeviceManager->_globalSensorManger.list, list)
+    {
+        if (_globalSensorMangerTemp->sensor_interface_type == 2) // 干节点传感器
+        {
+            memset(strTemp, 0, sizeof(strTemp));
+            sprintf(strTemp, "echo %d > /sys/class/gpio/export",_globalSensorMangerTemp->sensor_addr+GPIO_PD11);
+            system(strTemp);
+            memset(strTemp, 0, sizeof(strTemp));
+            sprintf(strTemp, "echo in  > /sys/class/gpio/gpio%d/direction",_globalSensorMangerTemp->sensor_addr+GPIO_PD11);
+            system(strTemp);
+        }
+    }
+    log_d("GPIO 初始化成功");
+    */
     // 采集线程
     while (_globalDeviceManager->dev_samp_flag)
     {
@@ -739,7 +843,7 @@ void* sensor_thread(void* arg)
         {
             switch (_globalSensorMangerTemp->sensor_type)
             {
-            case 0: // 温湿度
+            case SENSOR_TYPE_TEMPERATURE: // 温湿度
             {
                 // printf("get \n");
                 float temperature = 0.0;
@@ -766,54 +870,64 @@ void* sensor_thread(void* arg)
                 _globalSensorInfo.sensor_id = _globalSensorMangerTemp->sensor_id;
                 _globalSensorInfo.val1 = temperature;
                 _globalSensorInfo.val2 = humidity;
-
-                // 写入数据库
-                gettimeofday(&tv, NULL);
-                time_t now;
-                time(&now);
-                t = localtime(&now);
-                char buffer[80];
-                strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);
-                memset(_globalSensorInfo.samp_time, 0, sizeof(_globalSensorInfo.samp_time));
-                strftime(_globalSensorInfo.samp_time, sizeof(_globalSensorInfo.samp_time), "%Y-%m-%d %H:%M:%S", t);
-                sprintf(buffer, ".%03d", tv.tv_usec / 1000);
-                strcat(_globalSensorInfo.samp_time, buffer);
-
-                if (difftime(now, _globalSensorInfo.product_log_time) > (10000 / 1000))
-                {
-                    _globalSensorInfo.product_log_time = now;
-                    // 插入数据库
-                    ret = dev_insert_sensor_info(_globalDeviceManager->db, &_globalSensorInfo, &nSaveIndex);
-                    if (ret != 0)
-                    {
-                        log_e("sensor_temp_write database error.");
-                    }
-                }
-                 _globalSensorMangerTemp->Cur_sensor_info=_globalSensorInfo;
+                _globalSensorInfo.product_log_time=_globalSensorMangerTemp->Cur_sensor_info.product_log_time;;
+                _globalSensorMangerTemp->Cur_sensor_info=_globalSensorInfo;
             }
             break;
-            case 1: // 烟雾
+            case SENSOR_TYPE_SMOKE: // 烟雾
+            case SENSOR_TYPE_WATER: // 水浸
+            case SENSOR_TYPE_DOOR: // 门禁 IO信号
             {
+                if (_globalSensorMangerTemp->sensor_interface_type==2)//干节点传感器
+                {
+                    int nStatus=0;
+                    g_switch_get_gpio_status(_globalSensorMangerTemp->sensor_addr+GPIO_PD11,&nStatus);
+                    _globalSensorMangerTemp->Cur_sensor_info.val1=nStatus;
+                }                
             }
             break;
-            case 2: // 水浸
+            case SENSOR_TYPE_GAS: // 气体
             {
+
             }
             break;
-            case 3: // 门禁 IO信号
+            case SENSOR_TYPE_AIR_PRESS: // 气流
             {
+
             }
             break;
-            case 4: // 气体
-            {
             }
-            break;
-            case 5: // 气流
+            // 通用功能
+            //  写入数据库
+            gettimeofday(&tv, NULL);
+            time_t now;
+            time(&now);
+            t = localtime(&now);
+            char buffer[80];
+            strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);
+            memset(_globalSensorMangerTemp->Cur_sensor_info.samp_time, 0, sizeof(_globalSensorMangerTemp->Cur_sensor_info.samp_time));
+            strftime(_globalSensorMangerTemp->Cur_sensor_info.samp_time, sizeof(_globalSensorMangerTemp->Cur_sensor_info.samp_time), "%Y-%m-%d %H:%M:%S", t);
+            sprintf(buffer, ".%03d", tv.tv_usec / 1000);
+            strcat(_globalSensorMangerTemp->Cur_sensor_info.samp_time, buffer);
+            if (difftime(now, _globalSensorMangerTemp->Cur_sensor_info.product_log_time) > (30000 / 1000))
             {
+                _globalSensorMangerTemp->Cur_sensor_info.product_log_time = now;
+                // 插入数据库
+                ret = dev_insert_sensor_info(_globalDeviceManager->db, &_globalSensorMangerTemp->Cur_sensor_info, &nSaveIndex);
+                if (ret != 0)
+                {
+                    log_e("sensor_temp_write database error.");
+                }
             }
-            break;
+            if (_globalSensorMangerTemp->sensor_status == 0)
+            {
+                sensor_alarm(_globalSensorMangerTemp, SENSOR_VAL1_UPPER);
+                sensor_alarm(_globalSensorMangerTemp, SENSOR_VAL1_LOWER);
+                sensor_alarm(_globalSensorMangerTemp, SENSOR_VAL2_UPPER);
+                sensor_alarm(_globalSensorMangerTemp, SENSOR_VAL2_LOWER);
             }
         }
+
         sleep(1);
     }
 #endif

+ 86 - 16
pro/src/appweb_handle.c

@@ -9,8 +9,7 @@
 #include "thread.h"
 #include "cfg.h"
 #include "cascade.h"
-
-
+#include "language_common.h"
 #define WEB_DEBUG 1
 
 typedef void (*http_fn_t)(void *arg);
@@ -251,9 +250,11 @@ void* update_thread(void* arg)
                     _OverAllPwrAckInfo _over_all_pwr_back_info_L3;
                     if (cur_dev_addr == 0)
                     {
+                        pthread_mutex_lock(&__globalDeviceManage._power_update); 
                         dev_search_latest_t_ac_power_statistic_info(0, 0, &_over_all_pwr_back_info_L1, gdm);
                         dev_search_latest_t_ac_power_statistic_info(0, 1, &_over_all_pwr_back_info_L2, gdm);
                         dev_search_latest_t_ac_power_statistic_info(0, 2, &_over_all_pwr_back_info_L3, gdm);
+                        pthread_mutex_unlock(&__globalDeviceManage._power_update);
                     }
                     else
                     {
@@ -271,7 +272,9 @@ void* update_thread(void* arg)
                 else
                 {
                     if(cur_dev_addr==0) {
+                        pthread_mutex_lock(&__globalDeviceManage._power_update); 
                         dev_search_latest_power_statistic_info(gdm);
+                        pthread_mutex_unlock(&__globalDeviceManage._power_update);
                     }
                     else {
                         cascade_lock();
@@ -287,7 +290,9 @@ void* update_thread(void* arg)
                 INIT_LIST_HEAD(&_over_chn_pwr_back_info.list);
 
                 if(cur_dev_addr==0) {
+                    pthread_mutex_lock(&__globalDeviceManage._power_update); 
                     dev_search_latest_power_All_info(gdm,&_over_chn_pwr_back_info);
+                    pthread_mutex_unlock(&__globalDeviceManage._power_update);
                 }
                 else {
                     cascade_lock();
@@ -312,7 +317,7 @@ void* update_thread(void* arg)
            // pthread_mutex_unlock(&Websocketlock); 
             //log_i("ws upload.");
         }
-        usleep(500*1000);
+        usleep(1000*1000);
     }
     pthread_exit(NULL);
 }
@@ -1031,7 +1036,9 @@ static void channelStatusMonitoring(void* conn)
        //未指定通道 检索所有通道
         if(product_chn_id==0)
         {
+            pthread_mutex_lock(&__globalDeviceManage._power_update); 
             dev_search_latest_power_All_info(&__globalDeviceManage,&_over_chn_pwr_back_info);
+            pthread_mutex_unlock(&__globalDeviceManage._power_update);
         }
         else //指定通道
         {
@@ -1530,6 +1537,8 @@ static void sensorStatusMonitoring(void* conn)
             //strcpy(_overSensorBackInfoTemp->comSlogan,_globalSensorManagerTemp->sensor_port_name);
 
             //485独有
+            _overSensorBackInfoTemp->connectionStatus = _globalSensorManagerTemp->sensor_status;
+            _overSensorBackInfoTemp->nodeNumber = __globalDeviceManage._globalSensorManger.sensor_node_number;
             if(_globalSensorManagerTemp->sensor_interface_type==1)
             {
                 _overSensorBackInfoTemp->sensorAddr = _globalSensorManagerTemp->sensor_addr ;
@@ -1538,10 +1547,11 @@ static void sensorStatusMonitoring(void* conn)
             }
             else
             {
-                 strcpy(_overSensorBackInfoTemp->sensorvaluech,"IN");
+                _overSensorBackInfoTemp->connectionStatus = -1;
+                strcpy(_overSensorBackInfoTemp->sensorvaluech, "IN");
+                _overSensorBackInfoTemp->nodeNumber =_globalSensorManagerTemp->sensor_addr;
             }
-            _overSensorBackInfoTemp->connectionStatus = _globalSensorManagerTemp->sensor_status;
-            _overSensorBackInfoTemp->nodeNumber = __globalDeviceManage._globalSensorManger.sensor_node_number;
+
             //拿数据
             memset(&_globalSensorInfo, 0, sizeof(_globalSensorInfo));
             switch(_globalSensorManagerTemp->sensor_type)
@@ -1553,6 +1563,7 @@ static void sensorStatusMonitoring(void* conn)
                 }break; 
                 case 1://烟雾传感器 1个值
                 {
+                    
                     _overSensorBackInfoTemp->alarmStatus = ! (bool) _globalSensorManagerTemp->Cur_sensor_info.val1; // 1/0 报警未报警
                 }break; 
                 case 2://水浸传感器 1个值  c
@@ -1560,7 +1571,7 @@ static void sensorStatusMonitoring(void* conn)
                     _overSensorBackInfoTemp->waterImmersionState = !(bool)_globalSensorManagerTemp->Cur_sensor_info.val1; // 1/0 报警未报警
                 }break; 
                 case 3://门禁传感器 
-                {
+                {                    
                     _overSensorBackInfoTemp->accessControlStatus =  !(bool)_globalSensorManagerTemp->Cur_sensor_info.val1; // 1/0 报警未报警
                 }break; 
                 case 4: //气体传感器 1个值
@@ -1660,6 +1671,7 @@ static void sensorStatusMonitoring(void* conn)
                 if (nSize<=64)
                 {
                     strcpy(_globalSensorMangerTemp->sensor_name, _over_all_sensor_request.sensorName);
+
                 }             
                 else{
                     //响应
@@ -1670,14 +1682,45 @@ static void sensorStatusMonitoring(void* conn)
                     return ;
                 }   
             }            
-            if(_over_all_sensor_request.comSlogan)
+            if(_over_all_sensor_request.cgqtd)
             {
-                strcpy(_globalSensorMangerTemp->sensor_port_name, _over_all_sensor_request.comSlogan);  
+                if (strcmp(_over_all_sensor_request.cgqtd, "RS485") == 0)
+                {
+                    _globalSensorMangerTemp->sensor_interface_type = 1;
+                    if (_over_all_sensor_request.comSlogan)
+                    {
+                        strcpy(_globalSensorMangerTemp->sensor_port_name, _over_all_sensor_request.comSlogan);
+                    }
+                }
+                else if (strcmp(_over_all_sensor_request.cgqtd, "IN1") == 0)
+                {
+                    _globalSensorMangerTemp->sensor_interface_type = 2;
+                    _globalSensorMangerTemp->sensor_addr = 0;
+                    strcpy(_globalSensorMangerTemp->sensor_port_name, _over_all_sensor_request.cgqtd);
+                }
+                else if (strcmp(_over_all_sensor_request.cgqtd, "IN2") == 0)
+                {
+                    _globalSensorMangerTemp->sensor_interface_type = 2;
+                    _globalSensorMangerTemp->sensor_addr = 1;
+                    strcpy(_globalSensorMangerTemp->sensor_port_name, _over_all_sensor_request.cgqtd);
+                }
+                else if (strcmp(_over_all_sensor_request.cgqtd, "IN3") == 0)
+                {
+                    _globalSensorMangerTemp->sensor_interface_type = 2;
+                    _globalSensorMangerTemp->sensor_addr = 2;
+                    strcpy(_globalSensorMangerTemp->sensor_port_name, _over_all_sensor_request.cgqtd);
+                }
+                else if (strcmp(_over_all_sensor_request.cgqtd, "IN4") == 0)
+                {
+                    _globalSensorMangerTemp->sensor_interface_type = 2;
+                    _globalSensorMangerTemp->sensor_addr = 3;
+                    strcpy(_globalSensorMangerTemp->sensor_port_name, _over_all_sensor_request.cgqtd);
+                }
             }
             
             //_globalSensorMangerTemp->sensor_baud = strtol(_over_all_sensor_request.sensorBaud, NULL, 10);
             //_globalSensorMangerTemp->sensor_addr = strtol(_over_all_sensor_request.sensorAddr, NULL, 10);
-            _globalSensorMangerTemp->sensor_status = 0;
+            //_globalSensorMangerTemp->sensor_status = 0;
             switch (_globalSensorMangerTemp->sensor_type)
             {
             case 0:
@@ -1690,7 +1733,7 @@ static void sensorStatusMonitoring(void* conn)
                 _globalSensorMangerTemp->sensor_val_count = 1;
                 break; // 水浸传感器 1个值
             case 3:
-                _globalSensorMangerTemp->sensor_val_count = 0;
+                _globalSensorMangerTemp->sensor_val_count = 1;
                 break; // 门禁传感器 没有值
             case 4:
                 _globalSensorMangerTemp->sensor_val_count = 1;
@@ -1744,7 +1787,7 @@ static void sensorStatusMonitoring(void* conn)
             case 0:_globalSensorMangerTemp->sensor_val_count = 2 ;break; //温湿度传感器 2个值
             case 1:_globalSensorMangerTemp->sensor_val_count = 1 ;break; //烟雾传感器 1个值
             case 2:_globalSensorMangerTemp->sensor_val_count = 1 ;break; //水浸传感器 1个值  
-            case 3:_globalSensorMangerTemp->sensor_val_count = 0 ;break; //门禁传感器 没有值
+            case 3:_globalSensorMangerTemp->sensor_val_count = 1 ;break; //门禁传感器 没有值
             case 4:_globalSensorMangerTemp->sensor_val_count = 1 ;break; //气体传感器 1个值
             case 5:_globalSensorMangerTemp->sensor_val_count = 2 ;break; //气压气流传感器 2个值
             case 6:_globalSensorMangerTemp->sensor_val_count = 0 ;break; //空调遥控器 没有值
@@ -2146,10 +2189,10 @@ static void alarmProtect(void *conn)
     {
         ack_str = alarm_sensor_threshold_to_json(&__globalDeviceManage._globalSensorManger);
     }
-    else if(strcmp(_alarm_request_info.type,"saveSensorThreshold")==0)//传感器阈值保存
+    else if(strcmp(_alarm_request_info.type,"update")==0)//传感器阈值保存
     {
         GlobalSensorManger* _globalSensorMangerSaveTemp;
-        int g_sensor_id = atoi(_alarm_request_info._sensor_info.sensorId);
+        int g_sensor_id = _alarm_request_info._sensor_info.sensorId;
         list_for_each_entry(_globalSensorMangerSaveTemp, &__globalDeviceManage._globalSensorManger.list, list)
         {
             //ID相等 记录信息
@@ -2158,8 +2201,35 @@ static void alarmProtect(void *conn)
                 break;
             }
         }  
-        _globalSensorMangerSaveTemp->over_manager->sensor_val1_upper_threshold = atof(_alarm_request_info._sensor_info.thresholdUpperValue);
-        _globalSensorMangerSaveTemp->over_manager->sensor_val2_upper_threshold = atof(_alarm_request_info._sensor_info.thresholdDownValue);        
+        switch (_globalSensorMangerSaveTemp->sensor_type)
+        {
+        case SENSOR_TYPE_TEMPERATURE:
+            if (strcmp(_alarm_request_info._sensor_info.thresholdType, language_temperature[__globalDeviceManage._global_device_info->product_language]) == 0)
+            {
+                _globalSensorMangerSaveTemp->over_manager->sensor_val1_upper_threshold = atof(_alarm_request_info._sensor_info.thresholdUpperValue);
+                _globalSensorMangerSaveTemp->over_manager->sensor_val1_lower_threshold = atof(_alarm_request_info._sensor_info.thresholdDownValue);
+                _globalSensorMangerSaveTemp->over_manager->sensor_val1_upper_enabled = 1;
+                _globalSensorMangerSaveTemp->over_manager->sensor_val1_lower_enabled = 1;
+            }
+            else if (strcmp(_alarm_request_info._sensor_info.thresholdType, language_humidity[__globalDeviceManage._global_device_info->product_language]) == 0)
+            {
+                _globalSensorMangerSaveTemp->over_manager->sensor_val2_upper_threshold = atof(_alarm_request_info._sensor_info.thresholdUpperValue);
+                _globalSensorMangerSaveTemp->over_manager->sensor_val2_lower_threshold = atof(_alarm_request_info._sensor_info.thresholdDownValue);
+                _globalSensorMangerSaveTemp->over_manager->sensor_val2_upper_enabled = 1;
+                _globalSensorMangerSaveTemp->over_manager->sensor_val2_lower_enabled = 1;
+            }
+
+            break;
+        case SENSOR_TYPE_SMOKE:
+        case SENSOR_TYPE_WATER:
+        case SENSOR_TYPE_DOOR:
+            break;
+        case SENSOR_TYPE_GAS:
+        case SENSOR_TYPE_AIR_PRESS:
+        default:
+            break;
+        }
+       
         //更新参数
         ret = dev_update_sensor_over_manage(__globalDeviceManage.db,
                                     __globalDeviceManage._global_device_info->product_id,

+ 19 - 0
pro/src/common.h

@@ -22,6 +22,7 @@
 #include "pduMIB_trap.h"
 #include "language_hashmap.h"
 #include "hlw8110_habdle.h"
+#include "language_common.h"
 #include <sys/shm.h>
 //#define RS485_TYPE
 
@@ -84,6 +85,14 @@ enum
     SENSOR_TYPE_GAS         = 4 , //气体传感器
     SENSOR_TYPE_AIR_PRESS   = 5   //气体、气压传感器
 };
+enum
+{
+    SENSOR_VAL1_UPPER = 0,
+    SENSOR_VAL1_LOWER = 1,
+    SENSOR_VAL2_UPPER = 2,
+    SENSOR_VAL2_LOWER = 3,
+
+};
 
 enum
 {
@@ -493,6 +502,14 @@ typedef struct
     char                sensor_val2_lower_threshold_ctrl_para;
 }GlobalSensorOverManage;
 
+//传感器报警状态表
+typedef struct
+{   
+    bool                sensor_val1_upper;
+    bool                sensor_val1_lower;
+    bool                sensor_val2_upper;
+    bool                sensor_val2_lower;
+}GlobalSensorOverInfo;
 //传感器管理总表
 typedef struct 
 {
@@ -509,6 +526,7 @@ typedef struct
     int                 sensor_node_number                         ;//节点号
     GlobalSensorInfo Cur_sensor_info ;
     GlobalSensorOverManage*  over_manager                          ;//超限管理   
+    GlobalSensorOverInfo warning_status;//报警状态
     struct list_head    list;   
 }GlobalSensorManger;
 ///////////////////////////////////////////////////////////////////////////////////
@@ -715,6 +733,7 @@ typedef struct
     struct modbus_slave_write_reg g_modebus_write;
     smartPDU_shm_data* g_shm_Data;
     pthread_mutex_t     _power_ds;        //定时器锁 
+    pthread_mutex_t     _power_update;        //数据刷新锁
     cascade_dc_mmap_t *dc_mmap;
     cascade_single_mmap_t *single_mmap;
 }GlobalDeviceManager;

+ 1 - 1
pro/src/hlw8110_habdle.h

@@ -70,7 +70,7 @@
 #define GPIO_VALUE_PATH GPIO_DIR_PATH "gpio%d/value"  
 #define GPIO_DIRECTION_PATH GPIO_DIR_PATH "gpio%d/direction"  
 #define GPIO_PE3 131
-
+#define GPIO_PD11 107
 //#define DEBUG
 
 #ifdef DEBUG

+ 180 - 21
pro/src/json_handle.c

@@ -4,7 +4,6 @@
 #include <time.h>
 #include "common.h"
 #include "list.h"
-#include "language_common.h"
 #include "cascade.h"
 
 #define TOTAL_COUNT 60 //计数长度
@@ -2062,8 +2061,6 @@ cJSON* json_to_sensor_manage(const char* str,_OverSensorRequest* _overSensorRequ
     if(cjson_type!=NULL)
         _overSensorRequest->type = cjson_type->valuestring;
 
-
-
     cJSON* cjson_productName = cJSON_GetObjectItem(cjson,"productName");
     if(cjson_productName!=NULL)
         _overSensorRequest->productName = cjson_productName->valuestring;
@@ -2100,6 +2097,10 @@ cJSON* json_to_sensor_manage(const char* str,_OverSensorRequest* _overSensorRequ
     if(cjson_comSlogan!=NULL)
         _overSensorRequest->comSlogan = cjson_comSlogan->valuestring;
 
+    cJSON* cjson_cgqtd = cJSON_GetObjectItem(cjson,"cgqtd");
+    if(cjson_cgqtd!=NULL)
+        _overSensorRequest->cgqtd = cjson_cgqtd->valuestring;
+
     cJSON* cjson_sensorAddr = cJSON_GetObjectItem(cjson,"sensorAddr");
     if(cjson_sensorAddr!=NULL)
         _overSensorRequest->sensorAddr = cjson_sensorAddr->valuestring;
@@ -2136,7 +2137,8 @@ char* over_all_sensor_info_to_json(_OverSensorBackInfo* _over_all_sensor_back_in
         //log_d("sensor_name:%s", _temp->sensorName);
         char temp[32] = {0};
         cJSON* data_filed = cJSON_CreateObject();
-        cJSON_AddNumberToObject(data_filed, "accessControlStatus",_temp->accessControlStatus);
+        sprintf(temp,"%d",_temp->accessControlStatus);
+        cJSON_AddStringToObject(data_filed, "accessControlStatus",temp);
         cJSON_AddNumberToObject(data_filed,"sensorAddr",_temp->sensorAddr);
         cJSON_AddStringToObject(data_filed,"cgqtd",_temp->sensorvaluech);
         cJSON_AddNumberToObject(data_filed,"airPressureValue",_temp->airPressureValue);
@@ -2146,8 +2148,15 @@ char* over_all_sensor_info_to_json(_OverSensorBackInfo* _over_all_sensor_back_in
         cJSON_AddNumberToObject(data_filed,"alarmStatus",_temp->alarmStatus);
         cJSON_AddNumberToObject(data_filed,"sensorBaud",_temp->sensorBaud);
         cJSON_AddStringToObject(data_filed,"comSlogan",_temp->comSlogan);
-        sprintf(temp,"%d",_temp->connectionStatus);
-        cJSON_AddStringToObject(data_filed,"connectionStatus",temp);        
+        if (_temp->connectionStatus >= 0)
+        {
+            sprintf(temp, "%d", _temp->connectionStatus);
+            cJSON_AddStringToObject(data_filed, "connectionStatus", temp);
+        }
+        else
+        {
+            cJSON_AddStringToObject(data_filed, "connectionStatus", "");
+        }
         cJSON_AddNumberToObject(data_filed,"gasConcentration",_temp->gasConcentration);
         sprintf(temp,"%0.2f",_temp->humidityValue);
         cJSON_AddStringToObject(data_filed,"humidityValue",temp);
@@ -2172,7 +2181,8 @@ char* over_all_sensor_info_to_json(_OverSensorBackInfo* _over_all_sensor_back_in
         //    break;
         //}
         cJSON_AddStringToObject(data_filed,"sensorName",_temp->sensorName);
-        cJSON_AddNumberToObject(data_filed,"sensorId",_temp->sensorId);
+        sprintf(temp, "%d", _temp->sensorId);
+        cJSON_AddStringToObject(data_filed,"sensorId",temp);
         sprintf(temp_buf,"%d",_temp->sensorType);
         cJSON_AddStringToObject(data_filed,"sensorType",temp_buf);
         //cJSON_AddNumberToObject(data_filed,"sensorType",_temp->sensorType);
@@ -2201,6 +2211,7 @@ char* over_sensor_history_info_to_json(_OverSensorBackInfo* _over_all_sensor_bac
     char* str = NULL;
     struct list_head *pos;
     _OverSensorBackInfo* _temp;
+    char temp[32] = {0};
     // 创建 JSON 对象
     cJSON* root = cJSON_CreateObject();   
     if(sensor_type == SENSOR_TYPE_VALUE)
@@ -2278,7 +2289,8 @@ char* over_sensor_history_info_to_json(_OverSensorBackInfo* _over_all_sensor_bac
                 cJSON_AddItemToArray(type_data_array,type_data_press);
                 cJSON_AddArrayToObject(data,type_data_array);
             }
-            cJSON_AddStringToObject(data,"sensorId",_over_all_sensor_back_info->sensorId);
+            sprintf(temp, "%d", _temp->sensorId);
+            cJSON_AddStringToObject(data,"sensorId",temp);
             cJSON_AddArrayToObject(data_root_array,data);
         }
     }
@@ -2304,7 +2316,8 @@ char* over_sensor_history_info_to_json(_OverSensorBackInfo* _over_all_sensor_bac
         cJSON_AddStringToObject(data_filed,"comSlogan",_over_all_sensor_back_info->comSlogan);
         cJSON_AddNumberToObject(data_filed, "connectionStatus",_over_all_sensor_back_info->connectionStatus);        
             cJSON_AddStringToObject(data_filed,"sensorName",_over_all_sensor_back_info->sensorName);
-        cJSON_AddNumberToObject(data_filed,"sensorId",_over_all_sensor_back_info->sensorId);
+        sprintf(temp, "%d", _over_all_sensor_back_info->sensorId);
+        cJSON_AddStringToObject(data_filed,"sensorId",temp);
         cJSON_AddNumberToObject(data_filed,"sensorType",_over_all_sensor_back_info->sensorType);
         cJSON_AddNumberToObject(data_filed, "waterImmersionState",_over_all_sensor_back_info->waterImmersionState);
         cJSON_AddItemToObject(data_root_array, "data", data_filed);
@@ -2539,8 +2552,10 @@ char* alarm_sensor_threshold_to_json(GlobalSensorManger* _globalSensorManger)
 {
     char* str = NULL;
     GlobalSensorManger* _globalSensorMangerTemp = NULL ;
+    char temp[32] = {0};
     // 创建 JSON 对象
     cJSON* root = cJSON_CreateObject();   
+    cJSON *data_filed = NULL;
     // 添加基本键值对
     cJSON_AddNumberToObject(root, "code", 200); 
     //创建数据
@@ -2549,15 +2564,69 @@ char* alarm_sensor_threshold_to_json(GlobalSensorManger* _globalSensorManger)
     //循环添加数据
     list_for_each_entry(_globalSensorMangerTemp, &_globalSensorManger->list, list)
     {
-        cJSON* data_filed = cJSON_CreateObject(); 
-        cJSON_AddNumberToObject(data_filed,"connectionStatus",_globalSensorMangerTemp->sensor_status);  
-        //cJSON_AddNumberToObject(data_filed,"connectionStatus",_globalSensorMangerTemp->sensor_status);
-        cJSON_AddStringToObject(data_filed,"sensorName",_globalSensorMangerTemp->sensor_name);
-        cJSON_AddNumberToObject(data_filed,"sensorId", _globalSensorMangerTemp->sensor_id);
-        cJSON_AddNumberToObject(data_filed,"sensorType",_globalSensorMangerTemp->sensor_type);
-        cJSON_AddNumberToObject(data_filed,"thresholdUpperValue",_globalSensorMangerTemp->over_manager->sensor_val1_upper_threshold);
-        cJSON_AddNumberToObject(data_filed,"thresholdDownValue",_globalSensorMangerTemp->over_manager->sensor_val1_lower_threshold);
-        cJSON_AddItemToObject(data_root_array, "data", data_filed);
+        switch (_globalSensorMangerTemp->sensor_type)
+        {
+        case SENSOR_TYPE_TEMPERATURE:
+            data_filed = cJSON_CreateObject();
+            sprintf(temp, "%d", _globalSensorMangerTemp->sensor_status);
+            cJSON_AddStringToObject(data_filed, "connectionStatus", temp);
+            cJSON_AddStringToObject(data_filed, "sensorName", _globalSensorMangerTemp->sensor_name);
+            sprintf(temp, "%d", _globalSensorMangerTemp->sensor_id);
+            cJSON_AddStringToObject(data_filed, "sensorId", temp);
+            cJSON_AddNumberToObject(data_filed, "sensorType", _globalSensorMangerTemp->sensor_type);
+            cJSON_AddStringToObject(data_filed, "thresholdType",language_temperature[__globalDeviceManage._global_device_info->product_language]);
+            sprintf(temp, "%0.2f", _globalSensorMangerTemp->over_manager->sensor_val1_upper_threshold);
+            cJSON_AddStringToObject(data_filed, "thresholdUpperValue", temp);
+            sprintf(temp, "%0.2f", _globalSensorMangerTemp->over_manager->sensor_val1_lower_threshold);
+            cJSON_AddStringToObject(data_filed, "thresholdDownValue", temp);
+            cJSON_AddItemToObject(data_root_array, "data", data_filed);
+            data_filed = cJSON_CreateObject();
+            sprintf(temp, "%d", _globalSensorMangerTemp->sensor_status);
+            cJSON_AddStringToObject(data_filed, "connectionStatus", temp);
+            cJSON_AddStringToObject(data_filed, "sensorName", _globalSensorMangerTemp->sensor_name);
+            sprintf(temp, "%d", _globalSensorMangerTemp->sensor_id);
+            cJSON_AddStringToObject(data_filed, "sensorId", temp);
+            cJSON_AddNumberToObject(data_filed, "sensorType", _globalSensorMangerTemp->sensor_type);
+            cJSON_AddStringToObject(data_filed, "thresholdType", language_humidity[__globalDeviceManage._global_device_info->product_language]);
+            sprintf(temp, "%0.2f", _globalSensorMangerTemp->over_manager->sensor_val2_upper_threshold);
+            cJSON_AddStringToObject(data_filed, "thresholdUpperValue", temp);
+            sprintf(temp, "%0.2f", _globalSensorMangerTemp->over_manager->sensor_val2_lower_threshold);
+            cJSON_AddStringToObject(data_filed, "thresholdDownValue", temp);
+            cJSON_AddItemToObject(data_root_array, "data", data_filed);
+            break;
+        case SENSOR_TYPE_SMOKE:
+        case SENSOR_TYPE_WATER:
+        case SENSOR_TYPE_DOOR:
+            data_filed = cJSON_CreateObject();
+            cJSON_AddStringToObject(data_filed, "connectionStatus", "");
+            cJSON_AddStringToObject(data_filed, "sensorName", _globalSensorMangerTemp->sensor_name);
+            sprintf(temp, "%d", _globalSensorMangerTemp->sensor_id);
+            cJSON_AddStringToObject(data_filed, "sensorId", temp);
+            cJSON_AddNumberToObject(data_filed, "sensorType", _globalSensorMangerTemp->sensor_type);
+            cJSON_AddStringToObject(data_filed, "thresholdType", "");
+            cJSON_AddStringToObject(data_filed, "thresholdUpperValue", "");
+            cJSON_AddStringToObject(data_filed, "thresholdDownValue", "");
+            cJSON_AddItemToObject(data_root_array, "data", data_filed);
+            break;
+        case SENSOR_TYPE_GAS:
+        case SENSOR_TYPE_AIR_PRESS:
+        default:
+            data_filed = cJSON_CreateObject();
+            cJSON_AddNumberToObject(data_filed, "connectionStatus", _globalSensorMangerTemp->sensor_status);
+            // cJSON_AddNumberToObject(data_filed,"connectionStatus",_globalSensorMangerTemp->sensor_status);
+            cJSON_AddStringToObject(data_filed, "sensorName", _globalSensorMangerTemp->sensor_name);
+            sprintf(temp, "%d", _globalSensorMangerTemp->sensor_id);
+            cJSON_AddStringToObject(data_filed, "sensorId", temp);
+            cJSON_AddNumberToObject(data_filed, "sensorType", _globalSensorMangerTemp->sensor_type);
+            cJSON_AddStringToObject(data_filed, "thresholdType", "");
+            sprintf(temp, "%0.2f", _globalSensorMangerTemp->over_manager->sensor_val1_upper_threshold);
+            cJSON_AddStringToObject(data_filed, "thresholdUpperValue", temp);
+            sprintf(temp, "%0.2f", _globalSensorMangerTemp->over_manager->sensor_val1_lower_threshold);
+            cJSON_AddStringToObject(data_filed, "thresholdDownValue", temp);
+            cJSON_AddItemToObject(data_root_array, "data", data_filed);
+            break;
+        }
+
     }
     //添加汇总
     cJSON_AddItemToObject(root, "data", data_root_array);
@@ -3037,7 +3106,16 @@ cJSON* json_to_alarm_manage(const char* str,_AlarmRequestInfo* _alarm_request_in
 
     cJSON* cjson_sensorId = cJSON_GetObjectItem(cjson,"sensorId");
     if(cjson_sensorId!=NULL)
-        _alarm_request_info->_sensor_info.sensorId = cjson_sensorId->valuestring ;  
+    {
+        if (cjson_sensorId->valuestring)
+        {
+            _alarm_request_info->_sensor_info.sensorId = atoi(cjson_sensorId->valuestring);  
+        }else{
+            _alarm_request_info->_sensor_info.sensorId = cjson_sensorId->valueint ;  
+        }
+        
+    }
+        
 
     cJSON* cjson_sensorName = cJSON_GetObjectItem(cjson,"sensorName");
     if(cjson_sensorName!=NULL)
@@ -3047,6 +3125,10 @@ cJSON* json_to_alarm_manage(const char* str,_AlarmRequestInfo* _alarm_request_in
     if(cjson_sensorType!=NULL)
         _alarm_request_info->_sensor_info.sensorType = cjson_sensorType->valuestring ;  
 
+    cJSON* cjson_thresholdType = cJSON_GetObjectItem(cjson,"thresholdType");
+    if(cjson_thresholdType!=NULL)
+        _alarm_request_info->_sensor_info.thresholdType = cjson_thresholdType->valuestring ;  
+
     cJSON* cjson_thresholdDownValue = cJSON_GetObjectItem(cjson,"thresholdDownValue");
     if(cjson_thresholdDownValue!=NULL)
         _alarm_request_info->_sensor_info.thresholdDownValue = cjson_thresholdDownValue->valuestring ;  
@@ -3792,6 +3874,17 @@ char* service_group_ack_to_json(GroupInfo* _globalgroupInfo)
     cJSON_Delete(root);
     return str;
 }
+/**
+ * @brief 发送设备告警信息
+ *
+ * 根据指定的告警类型,构建告警信息并发送。
+ *
+ * @param __globalDeviceManger 全局设备管理器指针
+ * @param __globalPowerTemp 全局电源管理器指针
+ * @param _AlarmType 告警类型
+ *
+ * @return 返回值为0表示发送成功,非0表示发送失败
+ */
 int dev_Alarm_send_message(GlobalDeviceManager* __globalDeviceManger,GlobalPowerManger* __globalPowerTemp,int _AlarmType)
 {
     char AlarmText[256];
@@ -3834,10 +3927,69 @@ int dev_Alarm_send_message(GlobalDeviceManager* __globalDeviceManger,GlobalPower
 
     char buffer[80];
     strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);    
-    //dev_insert_alarm_info(__globalDeviceManage.db,__globalPowerTemp->product_id,0,buffer,AlarmText);
+    dev_insert_alarm_info(__globalDeviceManage.db,__globalPowerTemp->product_id,0,buffer,AlarmText);
     return 0;
 }
 
+/**
+ * @brief 发送传感器告警信息
+ *
+ * 根据给定的全局设备管理器、全局传感器管理器和告警类型,发送传感器告警信息。
+ *
+ * @param __globalDeviceManger 全局设备管理器指针
+ * @param __globalPowerTemp 全局传感器管理器指针
+ * @param _AlarmType 告警类型
+ *
+ * @return 成功返回0,失败返回-1
+ */
+int dev_sensor_Alarm_send_message(GlobalDeviceManager* __globalDeviceManger,GlobalSensorManger* __globalPowerTemp,int _AlarmType)
+{
+    char AlarmText[256];
+    int languagesID=0;
+    struct tm* t ;
+    if (!__globalPowerTemp)
+    {
+        return -1;
+    }
+    
+    switch (__globalPowerTemp->sensor_type)
+    {
+    case SENSOR_TYPE_TEMPERATURE:
+    {
+        switch (_AlarmType)
+        {
+        case SENSOR_VAL1_UPPER:
+            sprintf(AlarmText, "%s |$温度$|$%s$", __globalPowerTemp->sensor_name, language_alarm_Up[languagesID]);
+            break;
+        case SENSOR_VAL1_LOWER:
+            sprintf(AlarmText, "%s |$温度$|$%s$", __globalPowerTemp->sensor_name, language_alarm_Down[languagesID]);
+            break;
+        case SENSOR_VAL2_UPPER:
+            sprintf(AlarmText, "%s |$湿度$|$%s$", __globalPowerTemp->sensor_name, language_alarm_Up[languagesID]);
+            break;
+        case SENSOR_VAL2_LOWER:
+            sprintf(AlarmText, "%s |$湿度$|$%s$", __globalPowerTemp->sensor_name, language_alarm_Down[languagesID]);
+            break;
+        default:
+            sprintf(AlarmText, "%s |$%s$", __globalPowerTemp->sensor_name, language_alarm_NULL_ERROR[languagesID]);
+            break;
+        }
+    }
+        break;
+    default:
+        sprintf(AlarmText,"%s |$%s$",__globalPowerTemp->sensor_name,language_alarm_NULL_ERROR[languagesID]);
+        break;
+    }
+    
+    time_t now;
+    time(&now);
+    t = localtime(&now);
+
+    char buffer[80];
+    strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", t);    
+    dev_insert_alarm_info(__globalDeviceManage.db,__globalPowerTemp->product_id,1,buffer,AlarmText);
+    return 0;
+}
 int GetRoleIDByUserName(char* _userName,UserInfo* __UserInfo_t)
 {
     int nRole = -1;
@@ -4082,5 +4234,12 @@ void InitHashTable(HashTable *table)
     insert_Newhash(table,language_alarm_Ctrl_ALL[0],language_alarm_Ctrl_ALL,nMaxSize);
     insert_Newhash(table,language_alarm_connect_ERROR[0],language_alarm_connect_ERROR,nMaxSize);
     insert_Newhash(table,language_alarm_Init_Success[0],language_alarm_Init_Success,nMaxSize);
-    insert_Newhash(table,language_alarm_NULL_ERROR[0],language_alarm_NULL_ERROR,nMaxSize);
+    insert_Newhash(table, language_alarm_NULL_ERROR[0], language_alarm_NULL_ERROR, nMaxSize);
+    //13
+    insert_Newhash(table, language_temperature[0], language_temperature, nMaxSize);
+    insert_Newhash(table, language_humidity[0], language_humidity, nMaxSize);
+    insert_Newhash(table, language_atmosphere_gas[0], language_atmosphere_gas, nMaxSize);
+    insert_Newhash(table, language_atmosphere_airflow[0], language_atmosphere_airflow, nMaxSize);
+    insert_Newhash(table, language_atmosphere_pressure[0], language_atmosphere_pressure, nMaxSize);
+    //18
 }

+ 4 - 1
pro/src/json_handle.h

@@ -192,6 +192,7 @@ typedef struct
     char* sensorType;
     char* sensorName;
     char* comSlogan;
+    char* cgqtd;
     char* sensorAddr;
     char* sensorBaud;
     char* connectionStatus;
@@ -245,9 +246,10 @@ typedef struct
 typedef struct 
 {
     char* connectionStatus  ;
-    char* sensorId;
+    int sensorId;
     char* sensorName;
     char* sensorType;
+    char* thresholdType;
     char* thresholdDownValue;
     char* thresholdUpperValue;
 }_Sensor_AlarmRequestInfo;
@@ -531,6 +533,7 @@ int json_to_switch_language(const char* str);
 
 //============================================================================
 int dev_Alarm_send_message(GlobalDeviceManager* __globalDeviceManger,GlobalPowerManger* __globalPowerTemp,int _AlarmType);
+int dev_sensor_Alarm_send_message(GlobalDeviceManager* __globalDeviceManger,GlobalSensorManger* __globalPowerTemp,int _AlarmType);
 
 void InitHashTable(HashTable *table);
 

+ 495 - 0
pro/src/language_common.c

@@ -0,0 +1,495 @@
+#include "language_common.h"
+
+const char language_root_name[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "管理员",
+    "Administrator",
+    "Администратор ",
+    " "
+};
+
+const char language_nick_name[LANGUAGE_TYPE][LANGUAGE_SIZE] =
+{
+    "张三",
+    "zhang san ",
+    " ",
+     " "
+};
+
+const char language_user_manage[LANGUAGE_TYPE][LANGUAGE_SIZE] =
+{
+    "用户管理",
+    "User Management",
+    "Управление пользователями ",
+    " "
+};
+
+const char language_role_manage[LANGUAGE_TYPE][LANGUAGE_SIZE] =
+{
+    "角色管理",
+    "Role Management",
+    "Управление ролями ",
+    " "
+};
+
+const char language_menu_manage[LANGUAGE_TYPE][LANGUAGE_SIZE] =
+{
+    "菜单管理",
+    "Menu Management",
+    "Управление меню ",
+    " "
+};
+
+const char language_power_monitor[LANGUAGE_TYPE][LANGUAGE_SIZE] =
+{
+    "电源监控",
+    "Power Monitor",
+    "Мониторинг питания",
+    " "
+};
+
+const char language_power_sts_monitor[LANGUAGE_TYPE][LANGUAGE_SIZE] =
+{
+    "总体状态监控",
+    "Device Monitor",
+    "Мониторинг устройств",
+    " "
+};
+
+const char language_power_channel_sts_monitor[LANGUAGE_TYPE][LANGUAGE_SIZE] =
+{
+    "通道状态监控",
+    "Device Channel Monitor",
+    "Мониторинг каналов устройств",
+    " "
+};
+
+const char language_power_switch_sts_monitor[LANGUAGE_TYPE][LANGUAGE_SIZE] =
+{
+    "开关状态监控",
+    "Device Switch Monitor",
+    "Монитор коммутатора оборудования",
+    " "
+};
+const char language_power_history_search[LANGUAGE_TYPE][LANGUAGE_SIZE] =
+{
+    "历史记录查询",
+    "Device History",
+    "История устройств",
+    " "
+};
+
+const char language_sensor_monitoring[LANGUAGE_TYPE][LANGUAGE_SIZE] =
+{
+    "传感器监控",
+    "Sensor monitoring",
+    "Мониторинг датчиков",
+    " "
+};
+
+const char language_sensor_status_monitoring[LANGUAGE_TYPE][LANGUAGE_SIZE] =
+{
+    "传感器状态监控",
+    "Sensor status monitoring",
+    "Мониторинг состояния датчиков",
+    " "
+};
+
+const char language_sensor_history_search[LANGUAGE_TYPE][LANGUAGE_SIZE] =
+{
+    "历史记录查询",
+    "Device History",
+    "История устройств",
+    " "
+};
+
+const char language_Alarm_protection[LANGUAGE_TYPE][LANGUAGE_SIZE] =
+{
+    "告警保护",
+    "Alarm protection",
+    "Защита от аварий",
+    " "
+};
+
+const char language_Alarm_System[LANGUAGE_TYPE][LANGUAGE_SIZE] =
+{
+    "系统告警",
+    "System alarm",
+    "Системная тревога",
+    " "
+};
+
+const char language_Alarm_Threshold_rule[LANGUAGE_TYPE][LANGUAGE_SIZE] =
+{
+    "阈值及规则设置",
+    "Threshold and rule Settings",
+    "Настройка порогов и правил",
+    " "
+};
+
+const char language_log_information[LANGUAGE_TYPE][LANGUAGE_SIZE] =
+{
+    "日志信息",
+    "log information",
+    "Информация о журнале",
+    " "
+};
+
+const char language_log_Alarm[LANGUAGE_TYPE][LANGUAGE_SIZE] =
+{
+    "告警日志",
+    "Alarm log",
+    "Журнал аварий",
+    " "
+};
+
+const char language_log_operation[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "操作日志",
+    "operation log",
+    "Журнал операций",
+    " "
+};
+
+const char language_log_running[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "运行日志",
+    "running log",
+    "Журнал работы",
+    " "
+};
+
+const char language_communication_management[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "通信管理",
+    "communication management",
+    "Управление связью",
+    " "
+};
+
+
+const char language_net_install[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "网口设置",
+    "net opening install",
+    "Установка сетевого порта",
+    " "
+} ;
+
+const char language_RS485_install[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "RS485设置",
+    "RS485 install",
+    "Установка RS485",
+    " "
+} ;
+
+const char language_serve_manage[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "服务管理",
+    "serve install",
+    "Установка службы ",
+    " "
+} ;
+
+
+const char language_SMTP_install[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "SMTP设置",
+    "SMTP install",
+    "Установка SMTP",
+    " "
+} ;
+
+const char language_SNMP_install[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "SNMP设置",
+    "SNMP install",
+    "Установка SNMP",
+    " "
+} ;
+
+const char language_SNMP_TRAP_install[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "SNMP TRAP设置",
+    "SNMP TRAP install",
+    "Установка SNMP TRAP",
+    " "
+} ;
+
+const char language_MQTT_iot_install[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "MQTT物联设置",
+    "MQTT iot install",
+    "Установка MQTT для IoT",
+    " "
+} ;
+
+const char language_NTP_install[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "NTP设置",
+    "NTP install",
+    "Установка NTP",
+    " "
+} ;
+
+const char language_Timing_install[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "定时设置",
+    "Timing install",
+    "Установка времени",
+    " "
+} ;
+
+const char language_Sequential_setting[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "时序设置",
+    "Sequential setting",
+    "Установка последовательности",
+    " "
+} ;
+
+const char language_Group_setting[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "分组设置",
+    "Group setting",
+    "Установка группы",
+    " "
+} ;
+
+const char language_maintenance_equipment[LANGUAGE_TYPE][LANGUAGE_SIZE] =
+{
+    "设备维护",
+    "maintenance of equipment",
+    "Обслуживание оборудования",
+    " "
+} ;
+
+const char language_Device_restart[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "设备重启",
+    "Device restart",
+    "Перезагрузка устройства",
+    " "
+} ;
+
+const char language_firmware_upgrade[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "固件升级",
+    "firmware upgrade",
+    "Обновление прошивки",
+    " "
+} ;
+
+const char language_back_factor_upgrade[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "恢复出厂设置",
+    "firmware upgrade",
+    "Восстановление заводских настроек",
+    " "
+} ;
+
+const char language_Configure_inport_export[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "配置导入/导出",
+    "Configure import/export",
+    "Импорт/экспорт конфигурации",
+    " "
+} ;
+
+const char language_after_sales_service[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "售后服务",
+    "after-sales service",
+    "Послепродажное обслуживание",
+    " "
+} ;
+
+const char language_about_Equipment[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "关于设备",
+    "About Equipment",
+    "О оборудовании",
+    " "
+} ;
+
+const char language_temperature[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "温度",
+    "temperature",
+    "Температура",
+    " "
+} ;
+
+const char language_humidity[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "湿度",
+    "humidity",
+    "Влажность",
+    " "
+} ;
+
+const char language_atmosphere_gas[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "气体",
+    "gas",
+    "Газ",
+    " "
+} ;
+
+const char language_atmosphere_airflow[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "气流",
+    "airflow",
+    "Поток воздуха",
+    " "
+} ;
+
+const char language_atmosphere_pressure[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "气压",
+    "atmospheric pressure",
+    "Атмосферное давление",
+    " "
+} ;
+
+const char language_log_Power[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "电源日志",
+    "Power log",
+    "Лог питания",
+    " "
+} ;
+
+const char language_opera_log_operation[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "操作日志",
+    "operation log",
+    "Лог операций",
+    " "
+} ;
+
+const char language_run_log_running[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "运行日志",
+    "running log",
+    "Лог работы",
+    " "
+} ;
+//============================================================================
+const char language_alarm_Ch[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "通道",
+    "channel ",
+    "Канал",
+    " "
+} ;
+
+const char language_alarm_V[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "电压",
+    "voltage ",
+    "Напряжение",
+    " "
+} ;
+
+const char language_alarm_A[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "电流",
+    "current ",
+    "Ток",
+    " "
+} ;
+
+const char language_alarm_W[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "功率",
+    "power ",
+    "Мощность"
+} ;
+
+const char language_alarm_P[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "耗电量",
+    "power consumption ",
+    "Потребление электроэнергии",
+    " "
+} ;
+
+const char language_alarm_Up[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "超过上限",
+    "out of up limit ",
+    "Превышение верхнего предела",
+    " "
+} ;
+const char language_alarm_Down[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "超过下限",
+    "out of down limit ",
+    "Превышение нижнего предела",
+    " "
+} ;
+
+const char language_alarm_ctrl_Open[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "开启",
+    "OPEN ",
+    "Открыть",
+    " "
+} ;
+
+const char language_alarm_ctrl_Close[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "关闭",
+    "CLOSE ",
+    "Закрыть",
+    " "
+} ;
+
+const char language_alarm_Ctrl_ALL[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "所有",
+    "all ",
+    "Все",
+    " "
+} ;
+
+const char language_alarm_connect_ERROR[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "连接错误",
+    "connect ERROR ",
+    "Ошибка подключения",
+    " "
+} ;
+const char language_alarm_Init_Success[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "初始化成功",
+    "INIT SUCCESS ",
+    "Инициализация успешна",
+    " "
+} ;
+
+const char language_alarm_NULL_ERROR[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "故障",
+    " ERROR! ",
+    " Ошибка",
+    " "
+} ;
+
+const char language_alarm_RS485_master[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "主机",
+    " Master",
+    " Главный",
+    " "
+} ;
+
+const char language_alarm_RS485_slave[LANGUAGE_TYPE][LANGUAGE_SIZE] = 
+{
+    "从机",
+    " Slave",
+    "Вспомогательный",
+    " "
+} ;

+ 122 - 493
pro/src/language_common.h

@@ -1,501 +1,130 @@
 #ifndef __LANGUAGE_COMMON_H
 #define __LANGUAGE_COMMON_H
 
-const char language_root_name[][64] = 
-{
-    "管理员",
-    "Administrator",
-    "Администратор ",
-    " "
-};
-
-const char language_nick_name[][64] =
-{
-    "张三",
-    "zhang san ",
-    " ",
-     " "
-};
-
-const char language_user_manage[][64] =
-{
-    "用户管理",
-    "User Management",
-    "Управление пользователями ",
-    " "
-};
-
-const char language_role_manage[][64] =
-{
-    "角色管理",
-    "Role Management",
-    "Управление ролями ",
-    " "
-};
-
-const char language_menu_manage[][64] =
-{
-    "菜单管理",
-    "Menu Management",
-    "Управление меню ",
-    " "
-};
-
-const char language_power_monitor[][64] =
-{
-    "电源监控",
-    "Power Monitor",
-    "Мониторинг питания",
-    " "
-};
-
-const char language_power_sts_monitor[][64] =
-{
-    "总体状态监控",
-    "Device Monitor",
-    "Мониторинг устройств",
-    " "
-};
-
-const char language_power_channel_sts_monitor[][64] =
-{
-    "通道状态监控",
-    "Device Channel Monitor",
-    "Мониторинг каналов устройств",
-    " "
-};
-
-const char language_power_switch_sts_monitor[][64] =
-{
-    "开关状态监控",
-    "Device Switch Monitor",
-    "Монитор коммутатора оборудования",
-    " "
-};
-const char language_power_history_search[][64] =
-{
-    "历史记录查询",
-    "Device History",
-    "История устройств",
-    " "
-};
-
-const char language_sensor_monitoring[][64] =
-{
-    "传感器监控",
-    "Sensor monitoring",
-    "Мониторинг датчиков",
-    " "
-};
-
-const char language_sensor_status_monitoring[][64] =
-{
-    "传感器状态监控",
-    "Sensor status monitoring",
-    "Мониторинг состояния датчиков",
-    " "
-};
-
-const char language_sensor_history_search[][64] =
-{
-    "历史记录查询",
-    "Device History",
-    "История устройств",
-    " "
-};
-
-const char language_Alarm_protection[][64] =
-{
-    "告警保护",
-    "Alarm protection",
-    "Защита от аварий",
-    " "
-};
-
-const char language_Alarm_System[][64] =
-{
-    "系统告警",
-    "System alarm",
-    "Системная тревога",
-    " "
-};
-
-const char language_Alarm_Threshold_rule[][64] =
-{
-    "阈值及规则设置",
-    "Threshold and rule Settings",
-    "Настройка порогов и правил",
-    " "
-};
-
-const char language_log_information[][64] =
-{
-    "日志信息",
-    "log information",
-    "Информация о журнале",
-    " "
-};
-
-const char language_log_Alarm[][64] =
-{
-    "告警日志",
-    "Alarm log",
-    "Журнал аварий",
-    " "
-};
-
-const char language_log_operation[][64] = 
-{
-    "操作日志",
-    "operation log",
-    "Журнал операций",
-    " "
-};
-
-const char language_log_running[][64] = 
-{
-    "运行日志",
-    "running log",
-    "Журнал работы",
-    " "
-};
-
-const char language_communication_management[][64] = 
-{
-    "通信管理",
-    "communication management",
-    "Управление связью",
-    " "
-};
-
-
-const char language_net_install[][64] = 
-{
-    "网口设置",
-    "net opening install",
-    "Установка сетевого порта",
-    " "
-} ;
-
-const char language_RS485_install[][64] = 
-{
-    "RS485设置",
-    "RS485 install",
-    "Установка RS485",
-    " "
-} ;
-
-const char language_serve_manage[][64] = 
-{
-    "服务管理",
-    "serve install",
-    "Установка службы ",
-    " "
-} ;
-
-
-const char language_SMTP_install[][64] = 
-{
-    "SMTP设置",
-    "SMTP install",
-    "Установка SMTP",
-    " "
-} ;
-
-const char language_SNMP_install[][64] = 
-{
-    "SNMP设置",
-    "SNMP install",
-    "Установка SNMP",
-    " "
-} ;
-
-const char language_SNMP_TRAP_install[][64] = 
-{
-    "SNMP TRAP设置",
-    "SNMP TRAP install",
-    "Установка SNMP TRAP",
-    " "
-} ;
-
-const char language_MQTT_iot_install[][64] = 
-{
-    "MQTT物联设置",
-    "MQTT iot install",
-    "Установка MQTT для IoT",
-    " "
-} ;
-
-const char language_NTP_install[][64] = 
-{
-    "NTP设置",
-    "NTP install",
-    "Установка NTP",
-    " "
-} ;
-
-const char language_Timing_install[][64] = 
-{
-    "定时设置",
-    "Timing install",
-    "Установка времени",
-    " "
-} ;
-
-const char language_Sequential_setting[][64] = 
-{
-    "时序设置",
-    "Sequential setting",
-    "Установка последовательности",
-    " "
-} ;
-
-const char language_Group_setting[][64] = 
-{
-    "分组设置",
-    "Group setting",
-    "Установка группы",
-    " "
-} ;
-
-const char language_maintenance_equipment[][64] =
-{
-    "设备维护",
-    "maintenance of equipment",
-    "Обслуживание оборудования",
-    " "
-} ;
-
-const char language_Device_restart[][64] = 
-{
-    "设备重启",
-    "Device restart",
-    "Перезагрузка устройства",
-    " "
-} ;
-
-const char language_firmware_upgrade[][64] = 
-{
-    "固件升级",
-    "firmware upgrade",
-    "Обновление прошивки",
-    " "
-} ;
-
-const char language_back_factor_upgrade[][64] = 
-{
-    "恢复出厂设置",
-    "firmware upgrade",
-    "Восстановление заводских настроек",
-    " "
-} ;
-
-const char language_Configure_inport_export[][64] = 
-{
-    "配置导入/导出",
-    "Configure import/export",
-    "Импорт/экспорт конфигурации",
-    " "
-} ;
-
-const char language_after_sales_service[][64] = 
-{
-    "售后服务",
-    "after-sales service",
-    "Послепродажное обслуживание",
-    " "
-} ;
-
-const char language_about_Equipment[][64] = 
-{
-    "关于设备",
-    "About Equipment",
-    "О оборудовании",
-    " "
-} ;
-
-const char language_temperature[][64] = 
-{
-    "温度",
-    "temperature",
-    "Температура",
-    " "
-} ;
-
-const char language_humidity[][64] = 
-{
-    "湿度",
-    "humidity",
-    "Влажность",
-    " "
-} ;
-
-const char language_atmosphere_gas[][64] = 
-{
-    "气体",
-    "gas",
-    "Газ",
-    " "
-} ;
-
-const char language_atmosphere_airflow[][64] = 
-{
-    "气流",
-    "airflow",
-    "Поток воздуха",
-    " "
-} ;
-
-const char language_atmosphere_pressure[][64] = 
-{
-    "气压",
-    "atmospheric pressure",
-    "Атмосферное давление",
-    " "
-} ;
-
-const char language_log_Power[][64] = 
-{
-    "电源日志",
-    "Power log",
-    "Лог питания",
-    " "
-} ;
-
-const char language_opera_log_operation[][64] = 
-{
-    "操作日志",
-    "operation log",
-    "Лог операций",
-    " "
-} ;
-
-const char language_run_log_running[][64] = 
-{
-    "运行日志",
-    "running log",
-    "Лог работы",
-    " "
-} ;
+#define LANGUAGE_TYPE 4
+#define LANGUAGE_SIZE 64
+extern const char language_root_name[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_nick_name[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_user_manage[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_role_manage[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_menu_manage[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_power_monitor[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_power_sts_monitor[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_power_channel_sts_monitor[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_power_switch_sts_monitor[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_power_history_search[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_sensor_monitoring[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_sensor_status_monitoring[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_sensor_history_search[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_Alarm_protection[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_Alarm_System[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_Alarm_Threshold_rule[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_log_information[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_log_Alarm[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_log_operation[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_log_running[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_communication_management[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_net_install[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_RS485_install[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_serve_manage[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_SMTP_install[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_SNMP_install[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_SNMP_TRAP_install[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_MQTT_iot_install[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_NTP_install[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_Timing_install[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_Sequential_setting[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_Group_setting[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_maintenance_equipment[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_Device_restart[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_firmware_upgrade[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_back_factor_upgrade[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_Configure_inport_export[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_after_sales_service[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_about_Equipment[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_temperature[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_humidity[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_atmosphere_gas[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_atmosphere_airflow[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_atmosphere_pressure[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_log_Power[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_opera_log_operation[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_run_log_running[LANGUAGE_TYPE][LANGUAGE_SIZE];
 //============================================================================
-const char language_alarm_Ch[][64] = 
-{
-    "通道",
-    "channel ",
-    "Канал",
-    " "
-} ;
-
-const char language_alarm_V[][64] = 
-{
-    "电压",
-    "voltage ",
-    "Напряжение",
-    " "
-} ;
-
-const char language_alarm_A[][64] = 
-{
-    "电流",
-    "current ",
-    "Ток",
-    " "
-} ;
-
-const char language_alarm_W[][64] = 
-{
-    "功率",
-    "power ",
-    "Мощность"
-} ;
-
-const char language_alarm_P[][64] = 
-{
-    "耗电量",
-    "power consumption ",
-    "Потребление электроэнергии",
-    " "
-} ;
-
-const char language_alarm_Up[][64] = 
-{
-    "超过上限",
-    "out of up limit ",
-    "Превышение верхнего предела",
-    " "
-} ;
-const char language_alarm_Down[][64] = 
-{
-    "超过下限",
-    "out of down limit ",
-    "Превышение нижнего предела",
-    " "
-} ;
-
-const char language_alarm_ctrl_Open[][64] = 
-{
-    "开启",
-    "OPEN ",
-    "Открыть",
-    " "
-} ;
-
-const char language_alarm_ctrl_Close[][64] = 
-{
-    "关闭",
-    "CLOSE ",
-    "Закрыть",
-    " "
-} ;
-
-const char language_alarm_Ctrl_ALL[][64] = 
-{
-    "所有",
-    "all ",
-    "Все",
-    " "
-} ;
-
-const char language_alarm_connect_ERROR[][64] = 
-{
-    "连接错误",
-    "connect ERROR ",
-    "Ошибка подключения",
-    " "
-} ;
-const char language_alarm_Init_Success[][64] = 
-{
-    "初始化成功",
-    "INIT SUCCESS ",
-    "Инициализация успешна",
-    " "
-} ;
-
-const char language_alarm_NULL_ERROR[][64] = 
-{
-    "故障",
-    " ERROR! ",
-    " Ошибка",
-    " "
-} ;
-
-const char language_alarm_RS485_master[][64] = 
-{
-    "主机",
-    " Master",
-    " Главный",
-    " "
-} ;
-
-const char language_alarm_RS485_slave[][64] = 
-{
-    "从机",
-    " Slave",
-    "Вспомогательный",
-    " "
-} ;
+extern const char language_alarm_Ch[LANGUAGE_TYPE][LANGUAGE_SIZE];
 
+extern const char language_alarm_V[LANGUAGE_TYPE][LANGUAGE_SIZE];
 
+extern const char language_alarm_A[LANGUAGE_TYPE][LANGUAGE_SIZE];
 
-#endif
+extern const char language_alarm_W[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_alarm_P[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_alarm_Up[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_alarm_Down[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_alarm_ctrl_Open[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_alarm_ctrl_Close[LANGUAGE_TYPE][LANGUAGE_SIZE];
 
+extern const char language_alarm_Ctrl_ALL[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_alarm_connect_ERROR[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_alarm_Init_Success[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_alarm_NULL_ERROR[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_alarm_RS485_master[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+extern const char language_alarm_RS485_slave[LANGUAGE_TYPE][LANGUAGE_SIZE];
+
+#endif

+ 46 - 14
pro/src/sqlite_handle.c

@@ -1511,8 +1511,8 @@ int dev_get_sensor_manage_info(sqlite3 *db,int product_id,GlobalSensorManger* _g
         _globalSensorMangerTemp->over_manager = (GlobalSensorOverManage*)malloc(sizeof(GlobalSensorOverManage));
         if(_globalSensorMangerTemp->over_manager==NULL)
             return -1 ;
-        _globalSensorMangerTemp->product_id = atoi(pResult[i*ncolumn+0]);
-        _globalSensorMangerTemp->sensor_id = atoi(pResult[i*ncolumn+1]);
+        _globalSensorMangerTemp->product_id = atoi(pResult[i*ncolumn+1]);
+        _globalSensorMangerTemp->sensor_id = atoi(pResult[i*ncolumn+0]);
         _globalSensorMangerTemp->sensor_type = atoi(pResult[i*ncolumn+2]);
         _globalSensorMangerTemp->sensor_interface_type = atoi(pResult[i*ncolumn+3]);
 
@@ -1526,7 +1526,14 @@ int dev_get_sensor_manage_info(sqlite3 *db,int product_id,GlobalSensorManger* _g
         else
         {
             _globalSensorMangerTemp->sensor_baud = 0 ;
-            _globalSensorMangerTemp->sensor_addr = 0 ;
+            if (pResult[i * ncolumn + 7])
+            {
+                _globalSensorMangerTemp->sensor_addr = atoi(pResult[i * ncolumn + 7]);
+            }
+            else
+            {
+                _globalSensorMangerTemp->sensor_addr = 0;
+            }
         }
         _globalSensorMangerTemp->sensor_status = 1;//atoi(pResult[i*ncolumn+8]);
         _globalSensorMangerTemp->sensor_val_count = atoi(pResult[i*ncolumn+9]);
@@ -1834,17 +1841,42 @@ int dev_update_sensor_over_manage(sqlite3 *db,int product_id,int sensor_id,Globa
     char** pResult = NULL;  //用来指向sql执行结果的指针
     char* err_msg=NULL;
     char select_sql[1024] = {0};
-    sprintf(select_sql,"UPDATE Table_SensorManage SET sensor_val1_u_enabled=%d,sensor_val1_u_threshold=%0.2f,sensor_val1_u_threshold_ctrl=%d,sensor_val1_u_threshold_ctrl_para=%d,sensor_val2_u_enabled=%d,sensor_val2_u_threshold=%0.2f,sensor_val2_u_threshold_ctrl=%d,sensor_val2_u_threshold_ctrl_para=%d WHERE product_id=%d AND product_ch_id=%d;",
-        _globalSensorManger->over_manager->sensor_val1_upper_enabled,
-        _globalSensorManger->over_manager->sensor_val1_upper_threshold,
-        _globalSensorManger->over_manager->sensor_val1_upper_threshold_ctrl,
-        _globalSensorManger->over_manager->sensor_val1_upper_threshold_ctrl_para,
-        _globalSensorManger->over_manager->sensor_val2_upper_enabled,
-        _globalSensorManger->over_manager->sensor_val2_upper_threshold,
-        _globalSensorManger->over_manager->sensor_val2_upper_threshold_ctrl,
-        _globalSensorManger->over_manager->sensor_val2_upper_threshold_ctrl_para, 
-        product_id,
-        sensor_id);
+    sprintf(select_sql, "UPDATE Table_SensorManage SET \
+    sensor_val1_u_enable=%d,\
+    sensor_val1_u_threshold=%0.2f,\
+    sensor_val1_over_u_threshold_ctrl=%d,\
+    sensor_val1_over_u_threshold_ctrl_para=%d,\
+    sensor_val1_l_enable=%d,\
+    sensor_val1_l_threshold=%0.2f,\
+    sensor_val1_over_l_threshold_ctrl=%d,\
+    sensor_val1_over_l_threshold_ctrl_para=%d,\
+    sensor_val2_u_enable=%d,\
+    sensor_val2_u_threshold=%0.2f,\
+    sensor_val2_over_u_threshold_ctrl=%d,\
+    sensor_val2_over_u_threshold_ctrl_para=%d,\
+    sensor_val2_l_enable=%d,\
+    sensor_val2_l_threshold=%0.2f,\
+    sensor_val2_over_l_threshold_ctrl=%d,\
+    sensor_val2_over_l_threshold_ctrl_para=%d\
+     WHERE product_id=%d AND sensor_id=%d;",
+            _globalSensorManger->over_manager->sensor_val1_upper_enabled,
+            _globalSensorManger->over_manager->sensor_val1_upper_threshold,
+            _globalSensorManger->over_manager->sensor_val1_upper_threshold_ctrl,
+            _globalSensorManger->over_manager->sensor_val1_upper_threshold_ctrl_para,
+            _globalSensorManger->over_manager->sensor_val1_lower_enabled,
+            _globalSensorManger->over_manager->sensor_val1_lower_threshold,
+            _globalSensorManger->over_manager->sensor_val1_lower_threshold_ctrl,
+            _globalSensorManger->over_manager->sensor_val1_lower_threshold_ctrl_para,
+            _globalSensorManger->over_manager->sensor_val2_upper_enabled,
+            _globalSensorManger->over_manager->sensor_val2_upper_threshold,
+            _globalSensorManger->over_manager->sensor_val2_upper_threshold_ctrl,
+            _globalSensorManger->over_manager->sensor_val2_upper_threshold_ctrl_para,
+            _globalSensorManger->over_manager->sensor_val2_lower_enabled,
+            _globalSensorManger->over_manager->sensor_val2_lower_threshold,
+            _globalSensorManger->over_manager->sensor_val2_lower_threshold_ctrl,
+            _globalSensorManger->over_manager->sensor_val2_lower_threshold_ctrl_para,
+            product_id,
+            sensor_id);
     res = sqlite_SQL_RUN(db, select_sql, &pResult, &nrow, &ncolumn, &err_msg);
     if(res != SQLITE_OK)
         return -1 ;   

+ 56 - 0
pro/src/switch_ctrl.c

@@ -2012,7 +2012,63 @@ int g_switch_set_t_ac_in_threshold(void* manger,int saddr,GlobalOverManager* _gl
     return ret;
 
 }
+/**
+ * @brief 获取 GPIO 状态
+ *
+ * 根据给定的 GPIO 编号,获取 GPIO 的状态(高电平或低电平)。
+ *
+ * @param ngpio GPIO 编号
+ * @param status 用于存储 GPIO 状态的指针
+ *
+ * @return 成功返回 0,失败返回非 0 错误码
+ */
+int g_switch_get_gpio_status(int ngpio,int* nStatus)
+{
+    char value_path[64];  
+    char buf[3];  // 用于存储读取到的GPIO值,通常为'0'或'1'  
+    ssize_t bytesRead;  
+    int fd;  
+    // 构造GPIO值的路径  
+    snprintf(value_path, sizeof(value_path), GPIO_VALUE_PATH, ngpio);  
+  
+    // 打开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;  
+    }  
+    if (nStatus==NULL)
+    {
+        perror("Failed to IO_nStatus NULL");  
+        close(fd);  
+        return -3;  
+    }
+    // 确保字符串以null终止  
+    buf[bytesRead] = '\0';  
+  
+    // 打印读取到的GPIO值  
+   // printf("GPIO %d value: %s\n", GPIO_PE3, buf);  
+    if (buf[0]=='0')
+    {
+        *nStatus=1;
+    }else{
+        *nStatus=0;
+    }
+    
 
+    // 关闭文件描述符  
+    close(fd);  
+  
+    return 0;  
+}
 int  ResetChmData()
 {
     //搜索子地址

+ 3 - 0
pro/src/switch_ctrl.h

@@ -151,6 +151,9 @@ int g_switch_set_t_ac_chn_ctrl(void* manger,int saddr,unsigned char chn,unsigned
 int g_switch_set_t_ac_phchn_ctrl(void* manger,int saddr,unsigned char chn,unsigned short sts);
 int g_switch_set_t_ac_ctrl(void* manger,int saddr,unsigned short* sts);
 
+//GPIO通道状态
+int g_switch_get_gpio_status(int ngpio,int* status);
+
 //根据类型选择处理
 int g_switch_set_all_start_time_delay(void* manger,int ntype,int saddr,unsigned char chn,unsigned int time);
 int g_switch_set_all_stop_time_delay(void* manger,int ntype,int saddr,unsigned char chn,unsigned int time);