Sfoglia il codice sorgente

Merge branch 'master' of http://jiecheng2024.tpddns.cn:3000/liyuezong/SmartPDCode

guohui 1 anno fa
parent
commit
b8068bda9a

+ 202 - 22
ip/src/app.c

@@ -27,6 +27,10 @@
 #include <sys/types.h>
 #include <unistd.h>
 #include "hlw8110_handle.h"
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <net/if.h>
 
 static int keep_running;
 RETSIGTYPE stop_server(int __attribute__((unused)) a)
@@ -38,7 +42,6 @@ RETSIGTYPE stop_server(int __attribute__((unused)) a)
 
 
 
-
 /// @brief 电源数据采集线程
 /// @param arg 
 /// @return 
@@ -77,6 +80,7 @@ void* power_thread(void* arg)
     int nDeleteNumber=1000/sSaveTime*3600*24*30*10;
     bool isErrorBreak=false;
     _globalDeviceManager->_ReloadChm_flag=false;
+    int cnt = 1;
 
     //采集线程
     while (h->quit==0)
@@ -101,9 +105,9 @@ void* power_thread(void* arg)
             continue;
         }
 #if (1)
+
         memset(&_globalTotalPowerInfo, 0, sizeof(GlobalPowerInfo));
         memset(&_globalPowerWarningInfo, 0, sizeof(PowerWarningInfo));
-
         _globalDeviceManager->_all_ctrl_board[0]._PowerInfo[0].current = hlw8110_read_IA(__globalDeviceManage._RS485LowConfData);
         _globalDeviceManager->_all_ctrl_board[0]._PowerInfo[0].voltage = hlw8110_read_UV(__globalDeviceManage._RS485LowConfData);
         _globalDeviceManager->_all_ctrl_board[0]._PowerInfo[0].power = hwl8110_read_PA(__globalDeviceManage._RS485LowConfData);
@@ -117,10 +121,139 @@ void* power_thread(void* arg)
         int val = 0;
         hlw8110_read_Status(__globalDeviceManage._RS485LowConfData,&val);
         _globalDeviceManager->_all_ctrl_board[0]._PowerInfo[0].status = val;
+
+        _globalDeviceManager->mmp->data[0].current = _globalDeviceManager->_all_ctrl_board[0]._PowerInfo[0].current * 1000;
+        _globalDeviceManager->mmp->data[0].voltage = _globalDeviceManager->_all_ctrl_board[0]._PowerInfo[0].voltage * 1000;
+        _globalDeviceManager->mmp->data[0].power = _globalDeviceManager->_all_ctrl_board[0]._PowerInfo[0].power * 1000;
+        _globalDeviceManager->mmp->data[0].factor = _globalDeviceManager->_all_ctrl_board[0]._PowerInfo[0].factor * 1000;
+        _globalDeviceManager->mmp->data[0].freq = _globalDeviceManager->_all_ctrl_board[0]._PowerInfo[0].freq * 1000;
+        _globalDeviceManager->mmp->data[0].consumer = _globalDeviceManager->_all_ctrl_board[0]._PowerInfo[0].consumption * 1000;
+        _globalDeviceManager->mmp->data[0].status = _globalDeviceManager->_all_ctrl_board[0]._PowerInfo[0].status ;
+        _globalDeviceManager->mmp->data[0].saddr = 0;
+        _globalDeviceManager->mmp->data[0].temprature = _globalDeviceManager->g_modebus_read.temprature *100;
+        _globalDeviceManager->mmp->data[0].humidity = _globalDeviceManager->g_modebus_read.humidity *100;
+
+        dev_list_t dl;
+        cascade_get_dlist(&dl);
+
+        int flag = 0;
+
+
+        //shanchu
+
+
+        //add
+        for(int i = 1;i < dl.cnt;i++)
+        {
+            flag = 0;
+            list_for_each_entry(_globalPowerMangerTemp, &_globalDeviceManager->_globalPowerManger.list, list) 
+            {
+                int k = dl.slave[i].addr;
+                int p = _globalPowerMangerTemp->product_saddr;
+                if(_globalPowerMangerTemp->product_saddr == dl.slave[i].addr)
+                {
+                    //cunzai
+                    flag = 1;
+                    break;
+                }
+            }
+            if(flag)
+            {
+
+            }else
+            {
+                //add 
+                cnt++;
+                GlobalPowerManger *Temp = (GlobalPowerManger *)malloc(sizeof(GlobalPowerManger));
+                if (Temp == NULL)
+                {
+                    log_e("_globalPowerManger malloc error.\n");
+                    return NULL;
+                }
+                memset(Temp, 0, sizeof(GlobalPowerManger));
+                Temp->global_over_manager = (GlobalOverManager *)malloc(sizeof(GlobalOverManager));
+                if (Temp->global_over_manager == NULL)
+                {
+                    log_e("_globalPowerManger->global_over_manager malloc error.\n");
+                    return NULL;
+                }
+                memset(Temp->global_over_manager, 0, sizeof(GlobalOverManager));
+                ret = dev_get_power_manage_info(_globalDeviceManager->db,dl.slave[i].addr,dl.slave[i].addr,1,Temp);
+                if(ret == -1)
+                {
+                    Temp->product_id = dl.slave[i].addr;
+                    Temp->product_saddr   = dl.slave[i].addr;
+                    Temp->product_ch_id   = cnt;
+                    sprintf(Temp->product_ch_name, "CH%d", cnt);
+                    Temp->product_ch_addr = 1;
+                     if (dev_insert_power_manage_info(_globalDeviceManager->db,
+                                                          Temp->product_id,
+                                                          Temp->product_ch_id,
+                                                          Temp) != 0)
+                     {
+                         log_e("address %d chn %d data inserted error.\n", i, cnt);
+                         return NULL;
+                     }
+                }
+                list_add_tail(&Temp->list, &_globalDeviceManager->_globalPowerManger.list);
+            }
+        }
+        GlobalPowerManger *tmp,*pos;
+        list_for_each_entry_safe(tmp,pos,&_globalDeviceManager->_globalPowerManger.list,list)
+        {
+            if(tmp->product_saddr == 0 || tmp == NULL)
+                continue;
+            flag = 0;
+            for(int i = 1 ; i < dl.cnt; i++)
+            {
+                if(tmp->product_saddr == dl.slave[i].addr)
+                {
+                    flag = 1;
+                    break;
+                }
+
+            }
+            if(!flag)
+            {
+                    //current manager is not exsis!!!;
+                list_del(&tmp->list);
+                cnt --;
+                free(tmp);
+            }
+        }
+
+        cmd_data_t cmd;
+        cmd.cmd = CASCADE_CMD_GET_INFO;
+        cmd.obj = OBJ_OVERALL;
+
+        for(int i = 1;i < dl.cnt;i++)
+        {
+            cascade_request_saddr(&cmd,dl.slave[i].addr,i);
+            usleep(10000);
+        }
+        _globalDeviceManager->mmp->dev_chn = dl.cnt;
+        cmd.cmd = CASCADE_CMD_QUERY_CH;
+        cascade_free_dlist(&dl);
+
+        for(int i = 1; i < _globalDeviceManager->mmp->dev_chn;i++)
+        {
+            int board = _globalDeviceManager->mmp->data[i].saddr;   
+            _globalDeviceManager->_all_ctrl_board[board].product_type = 0;
+            _globalDeviceManager->_all_ctrl_board[board].product_saddr = _globalDeviceManager->mmp->data[i].saddr;
+            _globalDeviceManager->_all_ctrl_board[board].product_number = 1;
+            _globalDeviceManager->_all_ctrl_board[board]._PowerInfo->consumption = _globalDeviceManager->mmp->data[i].consumer/1000.0;
+            _globalDeviceManager->_all_ctrl_board[board]._PowerInfo->current     = _globalDeviceManager->mmp->data[i].current/1000.0;
+            _globalDeviceManager->_all_ctrl_board[board]._PowerInfo->factor      = _globalDeviceManager->mmp->data[i].factor/1000.0;
+            _globalDeviceManager->_all_ctrl_board[board]._PowerInfo->freq        = _globalDeviceManager->mmp->data[i].freq/1000.0;
+            _globalDeviceManager->_all_ctrl_board[board]._PowerInfo->voltage     = _globalDeviceManager->mmp->data[i].voltage/1000.0;
+            _globalDeviceManager->_all_ctrl_board[board]._PowerInfo->power       = _globalDeviceManager->mmp->data[i].power/1000.0;
+            _globalDeviceManager->_all_ctrl_board[board]._PowerInfo->status      = _globalDeviceManager->mmp->data[i].status;
+        }
+
+
         //warnning 
-        memcpy(&_globalPowerInfo._power_info,
-                   &_globalDeviceManager->_all_ctrl_board[0]._PowerInfo[0],
-                   sizeof(PowerInfo));
+        
+
 
 
         bool SaveDBFlag=false; //数据库存储记录,只要有通道存,就存一次总通道数据  
@@ -131,6 +264,8 @@ void* power_thread(void* arg)
         pthread_mutex_lock(&__globalDeviceManage._power_update);
         list_for_each_entry(_globalPowerMangerTemp, &_globalDeviceManager->_globalPowerManger.list, list) 
         {
+            memcpy(&_globalPowerInfo._power_info,&_globalDeviceManager->_all_ctrl_board[(int)_globalPowerMangerTemp->product_saddr]._PowerInfo[0],sizeof(PowerInfo));
+                   
             _globalTotalPowerInfo.product_id = _globalDeviceManager->_globalDevInfo.product_id;
             _globalTotalPowerInfo.product_ch_id = 0 ; //总电源通道信息为0
             _globalTotalPowerInfo.product_status = 0 ;
@@ -142,58 +277,58 @@ void* power_thread(void* arg)
             _globalTotalPowerInfo._power_info.factor = _globalTotalPowerInfo._power_info.factor > _globalPowerInfo._power_info.factor ? _globalTotalPowerInfo._power_info.factor : _globalPowerInfo._power_info.factor;
             _globalTotalPowerInfo._power_info.status = _globalPowerInfo._power_info.status;
             //补全信息
-            _globalPowerInfo.product_id = _globalDeviceManager->_globalDevInfo.product_id;
+            _globalPowerInfo.product_id = _globalPowerMangerTemp->product_id;
             _globalPowerInfo.product_ch_id = _globalPowerMangerTemp->product_ch_id ;
             _globalPowerInfo.product_status = _globalPowerInfo._power_info.status ;
 
                     //voltage
         if(_globalPowerMangerTemp->global_over_manager->product_vol_lower_enable)
         {
-            if(_globalDeviceManager->_all_ctrl_board[0]._PowerInfo[0].voltage > 
+            if(_globalDeviceManager->_all_ctrl_board[(int)_globalPowerMangerTemp->product_saddr]._PowerInfo[0].voltage > 
                                 _globalPowerMangerTemp->global_over_manager->product_vol_upper_threshold)
             {
-                 _globalDeviceManager->_all_ctrl_board[0]._PowerWarninginfo[0].w_voltage_up = 1;
+                 _globalDeviceManager->_all_ctrl_board[(int)_globalPowerMangerTemp->product_saddr]._PowerWarninginfo[0].w_voltage_up = 1;
             }
         }
         if(_globalPowerMangerTemp->global_over_manager->product_vol_lower_enable)
         {
-            if(_globalDeviceManager->_all_ctrl_board[0]._PowerInfo[0].voltage < 
+            if(_globalDeviceManager->_all_ctrl_board[(int)_globalPowerMangerTemp->product_saddr]._PowerInfo[0].voltage < 
                                 _globalPowerMangerTemp->global_over_manager->product_vol_lower_threshold)
             {
-                 _globalDeviceManager->_all_ctrl_board[0]._PowerWarninginfo[0].w_voltage_down = 1;
+                 _globalDeviceManager->_all_ctrl_board[(int)_globalPowerMangerTemp->product_saddr]._PowerWarninginfo[0].w_voltage_down = 1;
             }
         }
         //current
         if(_globalPowerMangerTemp->global_over_manager->product_cur_upper_enable)
         {
-            if(_globalDeviceManager->_all_ctrl_board[0]._PowerInfo[0].current >
+            if(_globalDeviceManager->_all_ctrl_board[(int)_globalPowerMangerTemp->product_saddr]._PowerInfo[0].current >
                                 _globalPowerMangerTemp->global_over_manager->product_cur_upper_threshold)
             {
-                _globalDeviceManager->_all_ctrl_board[0]._PowerWarninginfo[0].w_current = 1;
+                _globalDeviceManager->_all_ctrl_board[(int)_globalPowerMangerTemp->product_saddr]._PowerWarninginfo[0].w_current = 1;
             }
                
         }
         //power
         if(_globalPowerMangerTemp->global_over_manager->product_pwr_upper_enable)
         {
-            if(_globalDeviceManager->_all_ctrl_board[0]._PowerInfo[0].power >
+            if(_globalDeviceManager->_all_ctrl_board[(int)_globalPowerMangerTemp->product_saddr]._PowerInfo[0].power >
                                 _globalPowerMangerTemp->global_over_manager->product_pwr_upper_threshold)
             {
-                _globalDeviceManager->_all_ctrl_board[0]._PowerWarninginfo[0].w_power = 1;
+                _globalDeviceManager->_all_ctrl_board[(int)_globalPowerMangerTemp->product_saddr]._PowerWarninginfo[0].w_power = 1;
             }
         }
         //constmer
         if(_globalPowerMangerTemp->global_over_manager->product_pwrcon_upper_enable)
         {
-            if(_globalDeviceManager->_all_ctrl_board[0]._PowerInfo[0].consumption >
+            if(_globalDeviceManager->_all_ctrl_board[(int)_globalPowerMangerTemp->product_saddr]._PowerInfo[0].consumption >
                                 _globalPowerMangerTemp->global_over_manager->product_pwrcon_upper_threshold)
             {
-                _globalDeviceManager->_all_ctrl_board[0]._PowerWarninginfo[0].w_consumption = 1;
+                _globalDeviceManager->_all_ctrl_board[(int)_globalPowerMangerTemp->product_saddr]._PowerWarninginfo[0].w_consumption = 1;
             }
         }
 
             memcpy(&_globalPowerWarningInfo,
-            &_globalDeviceManager->_all_ctrl_board[0]._PowerWarninginfo[0],
+            &_globalDeviceManager->_all_ctrl_board[(int)_globalPowerMangerTemp->product_saddr]._PowerWarninginfo[0],
             sizeof(PowerWarningInfo));
 
             time_t now;
@@ -505,6 +640,9 @@ void sensor_alarm(GlobalSensorManger *_globalSensorMangerTemp, int nAlarmType)
     }
 }
 
+
+
+
 /// @brief 传感器采集线程
 /// @param arg 
 /// @return 
@@ -701,6 +839,11 @@ void* sensor_thread(void* arg)
 #endif
     pthread_exit(NULL);
 }
+
+
+
+
+
 void* shm_thread(void *arg)
 {
     int fd = 0;
@@ -864,6 +1007,32 @@ void* snmp_thread(void *arg)
 }
 
 
+static void get_mac(cascade_ip_mmap_t *mmp)
+{
+    struct ifreq ifreq;
+    int sock;
+    char *net = "eth0";
+
+    if((sock = socket(AF_INET,SOCK_STREAM,0))<0)
+    {
+        perror("socket");
+        return;
+    }
+    strcpy(ifreq.ifr_name,net);
+    if(ioctl(sock,SIOCGIFHWADDR,&ifreq)<0)
+    {
+            perror("ioctl");
+            return;
+    }
+    close(sock);
+    mmp->mac[0]=ifreq.ifr_hwaddr.sa_data[0];
+    mmp->mac[1]=ifreq.ifr_hwaddr.sa_data[1];
+    mmp->mac[2]=ifreq.ifr_hwaddr.sa_data[2];
+    mmp->mac[3]=ifreq.ifr_hwaddr.sa_data[3];
+    mmp->mac[4]=ifreq.ifr_hwaddr.sa_data[4];
+    mmp->mac[5]=ifreq.ifr_hwaddr.sa_data[5];
+}
+
 /// @brief 全局结构体初始化
 /// @param _globalDeviceManager 
 /// @return 
@@ -954,12 +1123,19 @@ int _global_device_manage_init(GlobalDeviceManager* _globalDeviceManager)
             log_i("all chn data inserted ok.\n");
         }        
     }
+    _globalDeviceManager->mmp = (cascade_ip_mmap_t *)malloc(sizeof(cascade_ip_mmap_t));
+    if(_globalDeviceManager->mmp == NULL)
+    {
+        log_e("mmp malloc error!!!!!\n");
+        return 0;        
+    }
+    get_mac(_globalDeviceManager->mmp);
 
     _globalDeviceManager->_RS485LowConfData = hlw8110_init();
     _globalDeviceManager->useSlaveCount++;
     _globalDeviceManager->_all_ctrl_board[0].product_saddr = 1;
     _globalDeviceManager->_all_ctrl_board[0].product_number = 1;
-    _globalDeviceManager->_all_ctrl_board[0].product_type = 9;
+    _globalDeviceManager->_all_ctrl_board[0].product_type = 0;
 
     GlobalPowerManger *_globalPowerMangerTemp = (GlobalPowerManger *)malloc(sizeof(GlobalPowerManger));
     if (_globalPowerMangerTemp == NULL)
@@ -1005,7 +1181,7 @@ int _global_device_manage_init(GlobalDeviceManager* _globalDeviceManager)
     }
 
     list_add_tail(&_globalPowerMangerTemp->list, &_globalDeviceManager->_globalPowerManger.list);
-
+    
     int nGroups=CHANNEL_DELAY_SEC;
     char strLog[200]={"MODBUS"};
     dev_Alarm_Run_message(_globalDeviceManager,language_alarm_Init_Success[0],strLog);
@@ -1019,7 +1195,7 @@ int _global_device_manage_init(GlobalDeviceManager* _globalDeviceManager)
     
 
 
-    //INIT_LIST_HEAD(&_globalDeviceManager->_globalSensorManger.list);
+    INIT_LIST_HEAD(&_globalDeviceManager->_globalSensorManger.list);
     ret = dev_get_sensor_manage_info(_globalDeviceManager->db,
                                     _globalDeviceManager->_globalDevInfo.product_id,
                                     &_globalDeviceManager->_globalSensorManger);
@@ -1029,14 +1205,13 @@ int _global_device_manage_init(GlobalDeviceManager* _globalDeviceManager)
 #if(OS_HANDWARE==1)
     _globalDeviceManager->dev_samp_flag = true;
     thread_start(THREAD_ID_POWER, power_thread, _globalDeviceManager, 10*MB, 0);
-    thread_start(THREAD_ID_SENSOR, sensor_thread, _globalDeviceManager, 5*MB, 0);
+    //thread_start(THREAD_ID_SENSOR, ip_cascade_thread, _globalDeviceManager, 5*MB, 0);
     thread_start(THREAD_ID_SHMW, shm_thread, _globalDeviceManager, 5*MB, 0);
 
     //thread_start(THREAD_ID_BREAKER_SCANNER,breaker_scanner_thread,_globalDeviceManager,1*MB,0);
     //thread_start(THREAD_ID_BREAKER, breaker_thread, _globalDeviceManager, 5*MB, 0);
 
     dev_Alarm_Run_message(_globalDeviceManager,language_alarm_Init_Success[0],"Server Thread");
-    
 #endif
     //创建传感器采集控制线程
 
@@ -1086,7 +1261,12 @@ int _global_device_manage_init(GlobalDeviceManager* _globalDeviceManager)
     appweb_init();
 
     cascade_init();
+
+    sensor_or_cascade_init();
+    
+
     //netswitch_init();
+    
     smtp_init();
 
     //通知smartUPG,app已经运行起来

+ 7 - 3
ip/src/appweb_handle.c

@@ -1384,7 +1384,7 @@ static void channelStatusMonitoring(void* conn)
             if (strlen(_over_chn_pwr_request.productChName)<32)
             {
                 strcpy(_globalPowerMangerTemp->product_ch_name, _over_chn_pwr_request.productChName);
-                if (dev_update_power_manage_genera_info(__globalDeviceManage.db, __globalDeviceManage._globalDevInfo.product_id, _globalPowerMangerTemp->product_ch_id, _globalPowerMangerTemp) != 0)
+                if (dev_update_power_manage_genera_info(__globalDeviceManage.db, _globalPowerMangerTemp->product_id, _globalPowerMangerTemp->product_ch_id, _globalPowerMangerTemp) != 0)
                 {
                     log_e("update pwr general data err.");
                 }
@@ -2728,9 +2728,12 @@ static void alarmProtect(void *conn)
         
         //拿到参数保存
         //GlobalPowerManger* _globalPowerMangerSaveTemp ;
-        // int g_pwr_ch_id = atoi(_alarm_request_info._pwr_info.productChId);
+        //int g_pwr_ch_id = atoi(_alarm_request_info._pwr_info.productChId);
         int g_pwr_ch_id = _alarm_request_info._pwr_info.productChId;
         ack_str=setThresholdToCh(&_alarm_request_info,g_pwr_ch_id);
+        char log_buff[256];
+        sprintf(log_buff, "Update power threshold CH%d!",g_pwr_ch_id);
+        dev_insert_alarm_ctrl(__globalDeviceManage.db, __globalDeviceManage._globalDevInfo.product.id, ALARM_TYPE_OPRATION, log_buff);
         /*
         if (g_pwr_ch_id ==0)
         {
@@ -3298,7 +3301,8 @@ static void communicationManagement(void *conn)
         info->product_modbus_addr = atoi(reqInfo._rs_info.addr);
         
         ///////////////////////////////////////////////////////////////////////////////
-        r = cascade_set_modbus(info);
+       // r = cascade_set_modbus(info);
+        r = cascade_set_ip_modbus(info);
         if(r==0) {
             dev_update_device_modus_info(__globalDeviceManage.db,devInfo);
         }

+ 196 - 26
ip/src/cascade.c

@@ -9,6 +9,7 @@
 #include "paras.h"
 #include "modbus-rtu.h"
 #include "modbus-tcp.h"
+#include "sys.h"
 
 #if 1
 #define LOGD            log_d
@@ -58,6 +59,7 @@ static cascade_handle_t casHandle={.inited=0};
 static cascade_handle_t casHandle_breaker={.inited=0};
 static void* cmd_thread(void *arg);
 static void* cmd_NF_thread(void *arg);
+static int master_cmd_addr(cascade_handle_t *cas, cmd_data_t *cmd,int saddr,int index);
 
 //////////////////////////////////////////////////
 static inline GlobalDeviceManager* get_dm(void)
@@ -492,7 +494,11 @@ static int _mb_scan(cascade_handle_t *cas, int addr)
 
     //g_modbus_set_timeout(&cas->m, 200);
     //modbus_set_response_timeout(cas->m.mb, 0,200000);
+#if SURPPORT_OLD485
+    r = g_modbus_read_x_reg(&cas->m, addr, 6000, 1, &tmp);
+#else
     r = g_modbus_read_x_reg(&cas->m, addr, CASCADE_REG_SCAN, 1, &tmp);
+#endif
     //g_modbus_set_timeout(&cas->m, 1000);
     //modbus_set_response_timeout(cas->m.mb, 0,800000);
     return r;
@@ -905,13 +911,17 @@ static int master_scan(cascade_handle_t *cas)
 {
     int i,r=0 ;
     uint16_t tmp[10];
+    cmd_data_t cmd={0};
 
     if(cas->scanAddr>CASCADE_MAX) {
         cas->scanAddr = 1;
     }
 
     if(!slave_find(cas, cas->scanAddr)) {
+
          r = _mb_scan(cas, cas->scanAddr);
+
+
         if(r>0) {
             LOGD("____ find a slave, addr: %d\n", cas->scanAddr);
             slave_add(cas, cas->scanAddr);
@@ -1220,7 +1230,7 @@ static int power_update(cascade_handle_t *cas)
     GlobalDeviceManager *dm2=get_dm2();
     slave_info_t *info=&cas->sInfo;
 
-    LOGD("______ power_update, %d\n", info->cnt);
+    //LOGD("______ power_update, %d\n", info->cnt);
     if(info->cnt==0) {
         LOGE("___ sInfo.cnt is 0\n");
         return -1;
@@ -1351,13 +1361,37 @@ static int master_cmd(cascade_handle_t *cas, cmd_data_t *cmd)
 
         case CASCADE_CMD_GET_INFO:
         {
+#if SURPPORT_OLD485
+        //LOGD("_____ master send CASCADE_CMD_GET_INFO surport old 485 type!!!\n");
+        sensor_data_t sdat;
+        slave_t *sl=slave_get(cas, cur_dev_addr);
+        r = sensor_get(cas,cur_dev_addr,&sdat);
+        if(r==0) {
+            cas->sInfo.cnt = 1;
+            cas->sInfo.prod.product_id = cur_dev_addr;
+            cas->sInfo.ch[0].chinfo.current = sdat.pwr.current;
+            cas->sInfo.ch[0].chinfo.consumption = sdat.pwr.consumption;
+            cas->sInfo.ch[0].chinfo.power = sdat.pwr.power;
+            cas->sInfo.ch[0].chinfo.voltage = sdat.pwr.voltage;
+            cas->sInfo.ch[0].chinfo.status = sdat.pwr.status;
+            cas->sInfo.ch[0].chinfo.factor = sdat.pwr.factor;
+            cas->sInfo.ch[0].chinfo.freq = sdat.pwr.freq;
+            cas->sInfo.ch[0].chinfo.tempratue = sdat.pwr.tempratue;
+            cas->sInfo.ch[0].chinfo.humidity = sdat.pwr.humidity;
+            power_add(cas);
+            sl->err = 0;
+        }
+        else {
+                sl->err++;
+        }   
+#else
             wdata.dlen = sizeof(cmd_data_t);
             wdata.data = (uint8_t*)cmd;
 
             rdata.dlen = sizeof(slave_info_t)-sizeof(channel_info_t)*CH_MAX;
             rdata.data = (uint8_t*)&cas->sInfo;
 
-            LOGD("_____ master send CASCADE_CMD_GET_INFO\n");
+            //LOGD("_____ master send CASCADE_CMD_GET_INFO\n");
             r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
             if(r==0) {
                // LOGD("______cas->info.cnt: %d\n", cas->sInfo.cnt);
@@ -1370,9 +1404,11 @@ static int master_cmd(cascade_handle_t *cas, cmd_data_t *cmd)
                     power_add(cas);
                 }
             }
+
             else {
                 LOGE("_____ master CASCADE_CMD_GET_INFO failed\n");
             }
+#endif
         }
         break;
         case CASCADE_CMD_GET_BREAKER_INFO:
@@ -1412,6 +1448,88 @@ static int master_cmd(cascade_handle_t *cas, cmd_data_t *cmd)
 
     return r;
 }
+
+
+static int master_cmd_addr(cascade_handle_t *cas, cmd_data_t *cmd,int saddr,int index)
+{
+    int i,r;
+    GlobalDeviceManager *dm=get_dm();
+    data_t rdata,wdata;
+    switch(cmd->cmd) {
+        case CASCADE_CMD_GET_INFO:
+        {
+#if SURPPORT_OLD485
+        //LOGD("_____ master send CASCADE_CMD_GET_INFO surport old 485 type!!!\n");
+        sensor_data_t sdat;
+        slave_t *sl=slave_get(cas, saddr);
+        r = sensor_get(cas,saddr,&sdat);
+        if(r==0) {
+            dm->mmp->data[index].saddr = saddr;
+            dm->mmp->data[index].current = sdat.pwr.current * 1000;
+            dm->mmp->data[index].consumer = sdat.pwr.consumption * 1000;
+            dm->mmp->data[index].power = sdat.pwr.power* 1000;
+            dm->mmp->data[index].voltage = sdat.pwr.voltage* 1000;
+            dm->mmp->data[index].status = sdat.pwr.status;
+            dm->mmp->data[index].factor = sdat.pwr.factor* 1000;
+            dm->mmp->data[index].freq = sdat.pwr.freq* 1000;
+            dm->mmp->data[index].temprature = sdat.temprature * 100;
+            dm->mmp->data[index].humidity = sdat.humidity * 100;
+            //power_add(cas);
+            sl->err = 0;
+            
+        }
+        else {
+                sl->err++;
+        }   
+#else
+            wdata.dlen = sizeof(cmd_data_t);
+            wdata.data = (uint8_t*)cmd;
+
+            rdata.dlen = sizeof(slave_info_t)-sizeof(channel_info_t)*CH_MAX;
+            rdata.data = (uint8_t*)&cas->sInfo;
+
+            //LOGD("_____ master send CASCADE_CMD_GET_INFO\n");
+            r = mb_write_read(cas, saddr, &wdata, &rdata);
+            if(r==0) {
+               // LOGD("______cas->info.cnt: %d\n", cas->sInfo.cnt);
+                rdata.dlen = sizeof(slave_info_t)-sizeof(channel_info_t)*(CH_MAX-cas->sInfo.cnt);
+                rdata.data = (uint8_t*)&cas->sInfo;
+                //LOGD("______cas->info.cnt1: %d\n", cas->sInfo.cnt);
+                r = mb_write_read(cas, saddr, &wdata, &rdata);
+                //LOGD("______cas->info.cnt2: %d\n", cas->sInfo.cnt);
+                // if(r==0) {
+                //     power_add(cas);
+                // }
+                for(int i = 0; i < cas->sInfo.cnt;i++)
+                { 
+                    dm->mmp->data[index].current =  cas->sInfo.ch[i].chinfo.current * 1000;
+                    dm->mmp->data[index].consumer = cas->sInfo.ch[i].chinfo.consumption * 1000;
+                    dm->mmp->data[index].power = cas->sInfo.ch[i].chinfo.power* 1000;
+                    dm->mmp->data[index].voltage = cas->sInfo.ch[i].chinfo.voltage* 1000;
+                    dm->mmp->data[index].status = cas->sInfo.ch[i].chinfo.status;
+                    dm->mmp->data[index].factor = cas->sInfo.ch[i].chinfo.factor* 1000;
+                    dm->mmp->data[index].freq = cas->sInfo.ch[i].chinfo.freq* 1000;
+                    dm->mmp->data[index].temprature = cas->sInfo.ch[i].chinfo.tempratue * 100;
+                    dm->mmp->data[index].humidity = cas->sInfo.ch[i].chinfo.humidity * 100;        
+                    dm->mmp->data[index].saddr = saddr;
+                }
+            }
+
+            else {
+                LOGE("_____ master CASCADE_CMD_GET_INFO failed\n");
+            }
+#endif
+        }
+        break;
+        default:
+        cas->cmd = *cmd;
+        r = 0;
+    }
+
+    return r;
+}
+
+
 static int master_query(cascade_handle_t *cas)
 {
     int i,r;
@@ -1422,7 +1540,7 @@ static int master_query(cascade_handle_t *cas)
     data_t rdata,wdata;
 
     if(cur_dev_addr==0) {
-        return -1;
+        return -1; 
     }
 
     wdata.dlen = sizeof(cmd_data_t);
@@ -1438,11 +1556,34 @@ static int master_query(cascade_handle_t *cas)
             if(cas->sInfo.cnt==0) {
                 return -1;
             }
+#if SURPPORT_OLD485
+            sensor_data_t sdat;
+            slave_t *sl=slave_get(cas, cur_dev_addr);
+            r = sensor_get(cas,cur_dev_addr,&sdat);
+            if(r==0) {
+                cas->sInfo.cnt = 1;
+                cas->sInfo.prod.product_id = cur_dev_addr;
+                cas->sInfo.ch[0].chinfo.current = sdat.pwr.current;
+                cas->sInfo.ch[0].chinfo.consumption = sdat.pwr.consumption;
+                cas->sInfo.ch[0].chinfo.power = sdat.pwr.power;
+                cas->sInfo.ch[0].chinfo.voltage = sdat.pwr.voltage;
+                cas->sInfo.ch[0].chinfo.status = sdat.pwr.status;
+                cas->sInfo.ch[0].chinfo.factor = sdat.pwr.factor;
+                cas->sInfo.ch[0].chinfo.freq = sdat.pwr.freq;
+                cas->sInfo.ch[0].chinfo.tempratue = sdat.pwr.tempratue;
+                cas->sInfo.ch[0].chinfo.humidity = sdat.pwr.humidity;
+                sl->err = 0;
+            }
+            else {
+                    sl->err++;
+            }
 
+#else
             rdata.dlen = sizeof(slave_info_t)-sizeof(channel_info_t)*(CH_MAX-cas->sInfo.cnt);
             rdata.data = (uint8_t*)&cas->sInfo;
             
             r = mb_write_read(cas, cur_dev_addr, &wdata, &rdata);
+#endif
             if(r==0) {
                 power_update(cas);
                // cmd->cmd = CASCADE_CMD_BREAKER_QUERY;
@@ -1618,16 +1759,16 @@ static void* cascade_thread(void *arg)
     
     LOGD("__ cascade %s\n", info->product_modbus_type?"slave":"master");
     while(h->quit==0) {
-        if(info->product_modbus_type==0) {      //主模
-            cascade_lock();
-            r = master_query(cas);
-            cascade_unlock();
-        }
-        else {                                  //从模式,等待主设备发起数据请�?
-            cascade_lock();
-            r = slave_receive(cas);
-            cascade_unlock();
-        }  
+        //if(info->product_modbus_type==0) {      //主模
+        cascade_lock();
+        r = master_query(cas);
+        cascade_unlock();
+        // }
+        // else {                                  //从模式,等待主设备发起数据请�?
+        //     cascade_lock();
+        //     r = slave_receive(cas);
+        //     cascade_unlock();
+        // }  
         usleep(100000);
     }
     
@@ -1642,12 +1783,12 @@ static void* scan_thread(void *arg)
     int i = 1;
     
     while(h->quit==0) {
-        if(info->product_modbus_type==0) {  //master
+        //if(info->product_modbus_type==0) {  //master
             cascade_lock();
             //r = new_master_scaner(cas);
             master_scan(cas);
             cascade_unlock();
-        }
+        //}
         sleep(1);
     }
 
@@ -1762,21 +1903,21 @@ static int set_modbus(cascade_handle_t *cas, ModbusInfo_t *info)
     cas->mInfo = *info;
     //LOGD("master init modbus:  port: %s, type: %d, baud: %d\n", CASCADE_MODBUS_PORT, info->product_modbus_type, info->product_modbus_baud);
 
-    r = mb_init(cas, CASCADE_MODBUS_PORT, 1,
-                  info->product_modbus_addr, info->product_modbus_baud);
+    r = mb_init(cas, CASCADE_MODBUS_PORT, 0,
+                  0, 115200);
     if(r!=0) {
         LOGE("cascade modbus init error.\n");
         return -1;
     }
     cas->inited = 1;
     cas->scanner_flag = 0;
-    if (cas->mInfo.product_modbus_type)
-    {
-        for (size_t i = 1; i < CASCADE_MAX; i++)
-        {
-            slave_rm(cas,i);
-        }        
-    }    
+    // if (cas->mInfo.product_modbus_type)
+    // {
+    //     for (size_t i = 1; i < CASCADE_MAX; i++)
+    //     {
+    //         slave_rm(cas,i);
+    //     }        
+    // }    
     return 0;
 }
 
@@ -1810,7 +1951,19 @@ int cascade_init(void)
 
     thread_start(THREAD_ID_CASCADE, cascade_thread, cas, 4*MB, 0);
     thread_start(THREAD_ID_SCAN, scan_thread, cas, 4*MB, 0);
-        
+    GlobalDeviceManager* dm =get_dm();
+    NetworkInfo_t net = {0};
+    sys_get_net(&net,IP_V4);
+    uint8_t addr = 0;
+    if(dm->_globalDevInfo._gmodbus_info.product_modbus_type == 0)
+    {
+        addr = 0XFF; 
+    }else
+    {
+        addr = dm->_globalDevInfo._gmodbus_info.product_modbus_addr;
+    }
+    dm->md_tcp = tcp_modbus_init(net.ip_address,CASCADE_SLAVE_PORT,addr,dm->_globalDevInfo.product_pwr_type);
+    thread_start(THREAD_ID_TCP, tcp_modbus_thread, cas, 4*MB, 0);
     return 0;
 }
 
@@ -1865,7 +2018,7 @@ int cascade_get_dlist(dev_list_t *dl)
     }
     dl->slave = sl;
     dl->cnt = cnt;
-    LOGD("____dev cnt: %d\n", cnt);
+    //LOGD("____dev cnt: %d\n", cnt);
 
     return 0;
 }
@@ -1916,6 +2069,23 @@ int cascade_request(cmd_data_t *cmd)
 }
 
 
+int cascade_request_saddr(cmd_data_t *cmd,int saddr,int index)
+{
+    int r=0;
+    cascade_handle_t *cas=&casHandle;
+
+    if(!cmd) {
+        return -1;
+    }
+    pthread_mutex_lock(&cas->lock);
+    cas->scanner_flag = 1;
+    r = master_cmd_addr(cas, cmd,saddr, index);
+    cas->scanner_flag = 0;
+    pthread_mutex_unlock(&cas->lock);
+    return 0;
+}
+
+
 int cascade_get_all(_OverAllPwrAckInfo *all)
 {
 

+ 16 - 1
ip/src/cascade.h

@@ -33,7 +33,8 @@
 // #define CASCADE_REG_BREAKER_READ            (CASCADE_REG_BREAKER+0)
 // #define CASCADE_REG_BREAKER_WRITE       (CASCADE_REG_BREAKER+1)
 
-
+#define CASCADE_SLAVE_CONNECTION                5
+#define CASCADE_SLAVE_PORT                      6666
 
 enum {
     CASCADE_CMD_OPEN=0,
@@ -272,6 +273,20 @@ modbus_mapping_t    *cascade_slave_map();
 void cascade_slave_read(uint32_t addr,uint32_t lenth);
 void cascade_slave_write(uint32_t addr, uint16_t val);
 
+
+int cascade_request_saddr(cmd_data_t *cmd,int saddr,int index);
+int cascade_set_ip_modbus(ModbusInfo_t *info);
+
+
+void* ip_cascade_thread(void *arg);
+void* tcp_modbus_thread(void *arg);
+
+Modbus_Manger_Tcp* tcp_modbus_init(const char * ip, uint16_t port,uint8_t addr,int power_type);
+void  tcp_modbus_deinit(Modbus_Manger_Tcp **tcp);
+
+void * thread_sensor_or_485(void*arg);
+void sensor_or_cascade_init();
+
 #endif
 
 

+ 563 - 12
ip/src/cascade_slave.c

@@ -4,8 +4,9 @@
 #include "switch_ctrl.h"
 #include "cascade.h"
 #include "sqlite_handle.h"
-
-
+#include "sys.h"
+#include "thread.h"
+#include "sensor_handle.h"
 
 #define DEV_CHN_REG                 (4000)  
 #define OUT_INFO_REG                (4001)     
@@ -76,17 +77,18 @@ enum {
 
 
 #define DEV_CHN_REG                     (4000)
-#define SWITCH_STATUE_REG               (4001)
-#define POWER_INFO_REG                  (4002)
-#define TEPM_HUM_REG                    (4016)
-#define SENCOR_STATUS                   (4018)
+#define DEV_IP_MAC                      (4001)
+#define POWER_INFO_REG                  (4007)
+#define OVER_POWER_ALL                  (4101)
+
+
+
+
 
 enum{
-    IP_DEV_CHN,
-    IP_SWITCH_STATUE,
-    IP_POWER_INFO,
-    IP_TEMP_HUM,
-    IP_SENCOR_STATUS,
+    DS_IP_DEV_CHN,
+    DS_IP_MAC,
+    DS_POWER_INFO_REG,
 };
 
 
@@ -131,6 +133,13 @@ static mmap_modbus_t modbus_three[] = {
     [TREE_W_ALL_CHN_STA     ]{.offset = TREE_ALL_SET_SWITCH_REG }
 };
 
+static mmap_modbus_t ip[] ={
+    [DS_IP_DEV_CHN         ]{.offset = DEV_CHN_REG              },
+    [DS_IP_MAC             ]{.offset = DEV_IP_MAC               },
+    [DS_POWER_INFO_REG     ]{.offset = POWER_INFO_REG           },
+};
+
+
 typedef struct { 
     modbus_mapping_t    *map;
 }slave_handle_t;
@@ -660,4 +669,546 @@ void cascade_slave_write(uint32_t addr, uint16_t val)
     }
 }
 
-#endif
+#endif
+
+
+
+int cascade_slave_init(void)
+{
+    slave_handle_t *sh=&slHandle;
+    GlobalDeviceManager* mgr=get_dm();
+    if(sh->map)
+    {
+        free(sh->map);
+        sh->map = NULL;
+    }
+    sh->map = modbus_mapping_new_start_address(0,0,0,0,DEV_CHN_REG,1000,0,0);     //3000 ge
+    ip[DS_IP_DEV_CHN          ].addr = &mgr->mmp->dev_chn;
+    ip[DS_IP_MAC              ].addr = &mgr->mmp->mac[0];
+    ip[DS_POWER_INFO_REG      ].addr = &mgr->mmp->data[0];
+    return 0;
+}
+
+
+void cascade_slave_read(uint32_t addr,uint32_t lenth)
+{
+    slave_handle_t *sh=&slHandle;
+    switch(addr)
+    {
+        case DEV_CHN_REG:
+        {
+            uint16_t *base_addr = (uint16_t *)ip[DS_IP_DEV_CHN].addr;
+            uint32_t step = addr - sh->map->start_registers;
+            base_addr = base_addr + (addr - ip[DS_IP_DEV_CHN].offset);
+            uint16_t *map_addr = (uint16_t *)&(sh->map->tab_registers[step]);
+            if(lenth < 126)
+            {
+                memcpy(map_addr, base_addr,2*lenth);
+            }
+        }
+        break;
+        case DEV_IP_MAC:
+        {
+            uint16_t *base_addr = (uint16_t *)ip[DS_IP_MAC].addr;
+            uint32_t step = addr - sh->map->start_registers;
+            base_addr = base_addr + (addr - ip[DS_IP_MAC].offset);
+            uint16_t *map_addr = (uint16_t *)&(sh->map->tab_registers[step]);
+            if(lenth < 126)
+            {
+                memcpy(map_addr, base_addr,2*lenth);
+            }
+        }
+        case POWER_INFO_REG ... OVER_POWER_ALL:
+        {
+            uint16_t *base_addr = (uint16_t *)ip[DS_POWER_INFO_REG].addr;
+            uint32_t step = addr - sh->map->start_registers;
+            base_addr = base_addr + (addr - ip[DS_POWER_INFO_REG].offset);
+            uint16_t *map_addr = (uint16_t *)&(sh->map->tab_registers[step]);
+            if(lenth < 126)
+            {
+                memcpy(map_addr, base_addr,2*lenth);
+            }
+        }
+        break;
+        default:
+        break;
+    }
+}
+
+
+static void memswap(uint8_t *buf, int len)
+{
+    int i;
+    uint8_t tmp;
+
+    for(i=0; i<len; i+=2) {
+        tmp = buf[i];
+        buf[i] = buf[i+1];
+        buf[i+1] = tmp;
+    }
+}
+
+static int _mb_hdr(uint8_t *data, int datalen, mb_hdr_t *h)
+{
+    h->addr = data[0];
+    h->func = data[1];
+    h->reg  = data[2]<<8 | data[3];
+    h->regcnt = data[4]<<8 | data[5];
+
+    h->dlen = 0;
+    h->data = NULL;
+    if(datalen>8) {
+        h->dlen = data[6];
+        h->data = data+7;
+
+        memswap(h->data, h->dlen+h->dlen%2);
+    }
+    //print_hdr("sss", h);
+
+    return 0;
+}
+
+int cascade_set_ip_modbus(ModbusInfo_t *info)
+{ 
+    GlobalDeviceManager *_globalDeviceManager = (GlobalDeviceManager *)&__globalDeviceManage;
+    g_modbus_deinit(&_globalDeviceManager->sensor_modbus_manager);
+    if(info->product_modbus_type > 0)
+    {
+        int ret = g_modbus_init(&_globalDeviceManager->sensor_modbus_manager,
+                            INTERL_SENSOR_MODBUS_PORT, // _globalSensorMangerTemp->sensor_port_name,
+                            info->product_modbus_baud, // _globalSensorMangerTemp->sensor_baud,
+                            info->product_modbus_type,
+                            info->product_modbus_addr,
+                            "ip to user",
+                            1);
+        g_modbus_set_slave(&_globalDeviceManager->sensor_modbus_manager,info->product_modbus_addr);
+    }else
+    {
+        int ret = g_modbus_init(&_globalDeviceManager->sensor_modbus_manager,
+                    INTERL_SENSOR_MODBUS_PORT, // _globalSensorMangerTemp->sensor_port_name,
+                    info->product_modbus_baud, // _globalSensorMangerTemp->sensor_baud,
+                    info->product_modbus_type,
+                    info->product_modbus_addr,
+                    "sensor",
+                    1);
+               
+    }
+    _globalDeviceManager->_globalDevInfo._gmodbus_info.product_modbus_type = info->product_modbus_type;   
+    return 0;
+}
+
+
+
+
+
+
+void* ip_cascade_thread(void *arg)
+{
+    GlobalDeviceManager *_globalDeviceManager = (GlobalDeviceManager *)&__globalDeviceManage;
+    GlobalDeviceInfo *devInfo = &_globalDeviceManager->_globalDevInfo;
+    uint8_t query[512] = {0};
+
+    int ret = g_modbus_init(&_globalDeviceManager->sensor_modbus_manager,
+                        INTERL_SENSOR_MODBUS_PORT, // _globalSensorMangerTemp->sensor_port_name,
+                        devInfo->_gmodbus_info.product_modbus_baud, // _globalSensorMangerTemp->sensor_baud,
+                        devInfo->_gmodbus_info.product_modbus_type,
+                        devInfo->_gmodbus_info.product_modbus_addr,
+                        "ip to user",
+                        1);
+    g_modbus_set_slave(&_globalDeviceManager->sensor_modbus_manager,devInfo->_gmodbus_info.product_modbus_addr);
+    cascade_slave_init();
+    int r = 0;
+    mb_hdr_t h;
+    while (_globalDeviceManager->dev_samp_flag)
+    {
+        r = g_modbus_receive(&_globalDeviceManager->sensor_modbus_manager,query);
+        if(r > 0)
+        {
+            _mb_hdr(query,r,&h);
+            if(h.func==MODBUS_FC_READ_HOLDING_REGISTERS) {
+                cascade_slave_read(h.reg, h.regcnt);
+                g_modbus_reply(&_globalDeviceManager->sensor_modbus_manager,query,r,cascade_slave_map());
+            }
+        }else
+        {
+            log_d("modbus err!!!!\n");
+        }
+        
+    }
+    pthread_exit(NULL);
+}
+
+int tcp_modbus_receive(Modbus_Manger_Tcp *tcp, uint8_t *req)
+{
+    int ret = 0 ;
+    pthread_mutex_lock(&tcp->mutex);
+    ret = modbus_receive(tcp->ctx, req);
+    pthread_mutex_unlock(&tcp->mutex);
+    return ret ;
+}
+int tcp_modbus_reply(Modbus_Manger_Tcp *tcp, uint8_t *req, int reqlen, modbus_mapping_t *map)
+{
+    int ret = 0 ;
+    pthread_mutex_lock(&tcp->mutex);
+    ret = modbus_reply(tcp->ctx, req, reqlen, map);
+    pthread_mutex_unlock(&tcp->mutex);
+    return ret ;
+}
+int tcp_modbus_set_slave(Modbus_Manger_Tcp *tcp, int saddr)
+{
+    int ret = 0 ;
+    pthread_mutex_lock(&tcp->mutex);
+    ret = modbus_set_slave(tcp->ctx, saddr);
+    pthread_mutex_unlock(&tcp->mutex);
+    return ret ;
+}
+
+
+
+Modbus_Manger_Tcp* tcp_modbus_init(const char* ip, uint16_t port,uint8_t addr,int power_type)
+{
+    Modbus_Manger_Tcp* tcp  = NULL;
+    tcp = (Modbus_Manger_Tcp*)malloc(sizeof(Modbus_Manger_Tcp));
+    if(!tcp)
+    {
+        log_d("malloc modubus manger faield!!!\n");
+        goto err1;
+    }
+    memset(tcp, 0, sizeof(Modbus_Manger_Tcp));
+    
+    tcp->ctx = modbus_new_tcp(ip, port);
+    if(!tcp->ctx)
+    {
+        log_d("malloc modbus_tcp ctx faield!!!\n");
+        goto err2;
+    }
+    
+    struct timeval response_timeout;
+    response_timeout.tv_sec = 1;
+    response_timeout.tv_usec = 0;
+    modbus_set_response_timeout(tcp->ctx, 0,800000);
+    modbus_set_byte_timeout(tcp->ctx,0,50000);
+    modbus_set_error_recovery(tcp->ctx,MODBUS_ERROR_RECOVERY_PROTOCOL);
+    modbus_set_slave(tcp->ctx,addr);
+    pthread_mutex_init(&tcp->mutex,NULL);
+    strcpy(tcp->ip,ip);
+    tcp->port = port;
+    tcp->slave_id = addr;
+    tcp->power_type = power_type;
+    return tcp;
+err2:
+    free(tcp);
+err1:
+    return tcp;
+}
+
+void  tcp_modbus_deinit(Modbus_Manger_Tcp **tcp)
+{
+    Modbus_Manger_Tcp** tmp = tcp;
+    if(tmp)
+    {
+        if(*tmp)
+        {
+            modbus_close((*tmp)->ctx);
+            modbus_free((*tmp)->ctx);
+
+            free(*tmp);
+            *tmp = 0;   
+        }
+    }
+    
+}
+
+
+
+
+
+
+void* tcp_modbus_thread(void *arg)
+{
+    //GlobalDeviceManager *mgr = (GlobalDeviceManager *)(arg);
+    
+    GlobalDeviceManager *mgr = get_dm();
+    Modbus_Manger_Tcp *tcp = mgr->md_tcp;
+    tcp->connection = modbus_tcp_listen(tcp->ctx,CASCADE_SLAVE_CONNECTION);
+    modbus_tcp_accept(tcp->ctx,&tcp->connection);
+    uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH] = {0};
+    mb_hdr_t h;
+    log_d("start tcp modbus thread!!!\n");
+    int rc = 0;
+    while(1)
+    {
+        if(tcp->ctx){
+            rc = tcp_modbus_receive(tcp,query);
+            if(rc > 0)
+            {
+                _mb_hdr(&query[6],rc,&h);
+                if(h.func==MODBUS_FC_READ_HOLDING_REGISTERS) {
+                    cascade_slave_read(h.reg, h.regcnt);
+                    tcp_modbus_reply(tcp,query,rc,cascade_slave_map());
+                }
+                
+                //r = _mb_reply(cas, buff, rc,cascade_slave_map());
+            }
+        }
+    }
+
+}
+
+
+
+void sensor_or_cascade_init()
+{
+    //GlobalDeviceManager* dm =get_dm();
+    GlobalDeviceManager *_globalDeviceManager = (GlobalDeviceManager *)&__globalDeviceManage;
+    INIT_LIST_HEAD(&_globalDeviceManager->_globalSensorManger.list);
+    //INIT_LIST_HEAD(&dm->_globalSensorManger.list);
+    GlobalDeviceInfo *devInfo = &_globalDeviceManager->_globalDevInfo;
+    //uint8_t query[512] = {0};
+    int ret = 0;
+    ret = dev_get_sensor_manage_info(_globalDeviceManager->db,
+                                    _globalDeviceManager->_globalDevInfo.product_id,
+                                    &_globalDeviceManager->_globalSensorManger);
+                
+    dev_Alarm_Run_message(_globalDeviceManager,language_alarm_Init_Success[0],"sensor");
+    cascade_slave_init();
+    if(devInfo->_gmodbus_info.product_modbus_type > 0)
+    {
+        int ret = g_modbus_init(&_globalDeviceManager->sensor_modbus_manager,
+                        INTERL_SENSOR_MODBUS_PORT, // _globalSensorMangerTemp->sensor_port_name,
+                        devInfo->_gmodbus_info.product_modbus_baud, // _globalSensorMangerTemp->sensor_baud,
+                        devInfo->_gmodbus_info.product_modbus_type,
+                        devInfo->_gmodbus_info.product_modbus_addr,
+                        "ip to user",
+                        1);
+        g_modbus_set_slave(&_globalDeviceManager->sensor_modbus_manager,devInfo->_gmodbus_info.product_modbus_addr);
+    }else
+    {
+        int ret = g_modbus_init(&_globalDeviceManager->sensor_modbus_manager,
+                    INTERL_SENSOR_MODBUS_PORT, // _globalSensorMangerTemp->sensor_port_name,
+                    INTERL_SENSOR_MODBUS_BAUD, // _globalSensorMangerTemp->sensor_baud,
+                    0,
+                    0,
+                    "ip to user",
+                    1);
+    }
+    pthread_mutex_init(&_globalDeviceManager->_sensor_update,NULL);
+
+
+    thread_start(THREAD_ID_SENSOR, thread_sensor_or_485, _globalDeviceManager, 5*MB, 0);
+}
+
+extern void sensor_alarm(GlobalSensorManger *_globalSensorMangerTemp, int nAlarmType);
+
+void * thread_sensor_or_485(void*arg)
+{
+    thread_handle_t *h=(thread_handle_t*)arg;
+    //GlobalDeviceManager* _globalDeviceManager = (GlobalDeviceManager*)h->arg;
+    GlobalDeviceManager *_globalDeviceManager = (GlobalDeviceManager *)&__globalDeviceManage;
+    GlobalSensorManger *_globalSensorMangerTemp;
+    int ret = 0;
+    GlobalSensorInfo _globalSensorInfo;
+    struct tm *t;
+    struct timeval tv;
+    struct timezone tz;
+    int r = 0;
+    mb_hdr_t mb_h;
+    GlobalDeviceInfo *devInfo = &_globalDeviceManager->_globalDevInfo;
+    uint8_t query[512] = {0};
+
+    float temperature = 0.0;
+    float humidity = 0.0;
+    int nSaveIndex = 1;
+    char strTable[] = "Table_SensorInfo";
+    char strTemp[64] = {0};
+    dev_search_last_Index(_globalDeviceManager->db, &nSaveIndex, strTable); // 查询日志最大点
+    int nMaxIndex = 2000000000;
+    int nDeleteNumber = 1000 / 120000 * 3600 * 24 * 30 * 10; // 1/60s;
+
+    while(_globalDeviceManager->dev_samp_flag)
+    {
+        if(devInfo->_gmodbus_info.product_modbus_type > 0)
+        {
+            //printf("12323451541545135435\n");
+            dev_search_last_Index(_globalDeviceManager->db, &nSaveIndex, strTable);
+            pthread_mutex_lock(&__globalDeviceManage._sensor_update);
+
+            pthread_mutex_unlock(&__globalDeviceManage._sensor_update);
+            list_for_each_entry(_globalSensorMangerTemp, &_globalDeviceManager->_globalSensorManger.list, list)
+            {
+                switch (_globalSensorMangerTemp->sensor_type)
+                {
+                    case SENSOR_TYPE_TEMPERATURE:
+                    {
+                        _globalSensorInfo.val1 = 0.0;
+                        _globalSensorInfo.val2 = 0.0;
+                        _globalSensorMangerTemp->Cur_sensor_info=_globalSensorInfo;
+                        _globalDeviceManager->g_modebus_read.temprature=0.0;
+                        _globalDeviceManager->g_modebus_read.humidity=0.0;
+                        _globalSensorMangerTemp->sensor_status = 1;
+                    }
+                    default:
+                    break;
+                }
+            }
+            r = g_modbus_receive(&_globalDeviceManager->sensor_modbus_manager,query);
+            if(r > 0)
+            {
+                _mb_hdr(query,r,&mb_h);
+                if(mb_h.func==MODBUS_FC_READ_HOLDING_REGISTERS) {
+                    cascade_slave_read(mb_h.reg, mb_h.regcnt);
+                    g_modbus_reply(&_globalDeviceManager->sensor_modbus_manager,query,r,cascade_slave_map());
+                }
+            }else
+            {
+                log_d("modbus err!!!!\n");
+            }
+
+        }else
+        {
+            //printf("--------------------------\n");
+            if (nSaveIndex > nMaxIndex)
+            {
+                dev_change_last_Index(_globalDeviceManager->db, &nSaveIndex, nDeleteNumber, strTable);
+            }
+            pthread_mutex_lock(&__globalDeviceManage._sensor_update);
+            list_for_each_entry(_globalSensorMangerTemp, &_globalDeviceManager->_globalSensorManger.list, list)
+            {
+                switch (_globalSensorMangerTemp->sensor_type)
+                {
+                    case SENSOR_TYPE_TEMPERATURE: // 温湿度
+                    {
+                        // printf("get \n");
+                        float temperature = 0.0;
+                        float humidity = 0.0;
+#ifdef CUST_ANDERSON
+                        ret = _g_sensor_get_temperature_value_ANDERSON((void *)&_globalDeviceManager->sensor_modbus_manager,
+                                                            _globalSensorMangerTemp->sensor_addr,
+                                                            &temperature,
+                                                            &humidity);
+#else
+                        ret = _g_sensor_get_temperature_value((void *)&_globalDeviceManager->sensor_modbus_manager,
+                                                            _globalSensorMangerTemp->sensor_addr,
+                                                            &temperature,
+                                                            &humidity);
+#endif
+                        if (ret == -1)
+                        {
+                            _globalSensorMangerTemp->sensor_status = 1;
+                        }
+                        else
+                        {
+                            _globalSensorMangerTemp->sensor_status = 0;
+                        }
+                        // log_d("sensor val:%0.2f %0.2f\n",temperature,humidity);
+                        // printf("get temperature=%f   humidity=%f\n",temperature,humidity);
+                        gettimeofday(&tv, &tz);
+                        t = localtime(&tv.tv_sec);
+                        sprintf(_globalSensorInfo.samp_time, "%04d-%02d-%02d %02d:%02d:%02d.%03ld",
+                                t->tm_year + 1900, t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec, tv.tv_usec / 1000);
+                        _globalSensorInfo.product_id = __globalDeviceManage._globalDevInfo.product_id;
+                        _globalSensorInfo.sensor_id = _globalSensorMangerTemp->sensor_id;
+                        _globalSensorInfo.val1 = temperature;
+                        _globalSensorInfo.val2 = humidity;
+
+                        _globalSensorInfo.product_log_time=_globalSensorMangerTemp->Cur_sensor_info.product_log_time;
+                        _globalSensorMangerTemp->Cur_sensor_info=_globalSensorInfo;
+                        _globalDeviceManager->g_modebus_read.temprature=temperature *1000;
+                        _globalDeviceManager->g_modebus_read.humidity=humidity *1000;
+                    }
+                    break;
+                    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 SENSOR_TYPE_GAS: // 气体
+                    {
+
+                    }
+                    break;
+                    case SENSOR_TYPE_AIR_PRESS: // 气流
+                    {
+
+                    }
+                    break;
+                    case SENSOR_TYPE_DoubleT://双头传感器
+                    {
+                        float temperature = 0.0;
+                        float temperature2 = 0.0;
+                        ret = _g_sensor_get_D_temperature_value_ANDERSON((void *)&_globalDeviceManager->sensor_modbus_manager,
+                                                            _globalSensorMangerTemp->sensor_addr,
+                                                            &temperature,
+                                                            &temperature2);
+
+                        if (ret == -1)
+                        {
+                            //log_w("Relay modbus Error:%s\n", modbus_strerror(errno));
+                            _globalSensorMangerTemp->sensor_status = 1;
+                        }
+                        else
+                        {
+                            _globalSensorMangerTemp->sensor_status = 0;
+                        }
+                        // log_d("sensor val:%0.2f %0.2f\n",temperature,humidity);
+                        // printf("get temperature=%f   humidity=%f\n",temperature,humidity);
+                        gettimeofday(&tv, &tz);
+                        t = localtime(&tv.tv_sec);
+                        sprintf(_globalSensorInfo.samp_time, "%04d-%02d-%02d %02d:%02d:%02d.%03ld",
+                                t->tm_year + 1900, t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec, tv.tv_usec / 1000);
+                        _globalSensorInfo.product_id = __globalDeviceManage._globalDevInfo.product_id;
+                        _globalSensorInfo.sensor_id = _globalSensorMangerTemp->sensor_id;
+                        _globalSensorInfo.val1 = temperature;
+                        _globalSensorInfo.val2 = temperature2;
+                        _globalSensorInfo.product_log_time=_globalSensorMangerTemp->Cur_sensor_info.product_log_time;;
+                        _globalSensorMangerTemp->Cur_sensor_info=_globalSensorInfo;
+                        _globalDeviceManager->g_modebus_read.temprature=temperature;
+                        _globalDeviceManager->g_modebus_read.temprature2=temperature2;
+                    }
+                    break;
+                    }
+                    // 通用功能
+                    //  写入数据库
+                    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, ".%03ld", 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.");
+                        }
+                    }
+                    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);
+                    }
+                }
+                pthread_mutex_unlock(&__globalDeviceManage._sensor_update);
+                sleep(3);
+
+        }
+    }
+    pthread_exit(NULL);
+    return NULL;
+}

+ 38 - 1
ip/src/common.h

@@ -29,6 +29,8 @@
 
 #define MAX_RELAY_CHN       100
 
+#define  SURPPORT_OLD485                0
+
 //是否在OS环境下运行
 #define OS_HANDWARE 1
 
@@ -858,6 +860,40 @@ typedef struct cascade_triphasic_mmap{
 }cascade_triphasic_mmap_t;
 
 
+typedef struct case_ip_485_data{
+    uint16_t saddr;
+    uint16_t status;
+    uint16_t temprature;
+    uint16_t humidity;
+    uint32_t voltage;
+    uint32_t current;
+    uint32_t power;
+    uint32_t consumer;
+    uint32_t factor;
+    uint32_t freq;
+    //uint32_t angle;
+    
+}case_ip_485_data_t;
+
+typedef struct
+{
+    modbus_t *ctx;
+    char ip[64];
+    uint16_t port;
+    uint8_t slave_id;
+    uint8_t power_type;
+    modbus_mapping_t *map;
+    int connection;
+    pthread_mutex_t mutex;
+}Modbus_Manger_Tcp;
+
+
+
+typedef struct cascade_ip_mmap{
+    uint16_t dev_chn;
+    uint16_t mac[6];
+    case_ip_485_data_t data[32];
+}cascade_ip_mmap_t;
 
 
 #pragma pack ()
@@ -968,9 +1004,10 @@ typedef struct
     //cascade_single_mmap_t *single_mmap;
     //cascade_triphasic_mmap_t *triphasic_mmap;	
 	//GlobalBreakerManager g_new_global_breaker;
-
+    cascade_ip_mmap_t * mmp;
     smtp_info_t          smtpInfo;
     mqtt_info_t          mqttInfo;
+    Modbus_Manger_Tcp *md_tcp;
 }GlobalDeviceManager;
 
 extern GlobalDeviceManager __globalDeviceManage;

+ 2 - 1
ip/src/file.c

@@ -1,6 +1,7 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include "file.h"
+#include "unistd.h"
 
 
 #if 0
@@ -45,6 +46,7 @@ int file_save(char *path, void *buf, int len)
     else {
         r = 0;
     }
+    fflush(fp);
     fclose(fp);
 
     return r;
@@ -86,7 +88,6 @@ int file_load(char* path, buf_t *fbuf)
         fbuf->buf[flen] = 0; r = 0;
     }
     fclose(fp);
-
     return r;
 }
 

+ 53 - 53
ip/src/json_handle.c

@@ -367,47 +367,47 @@ char* user_routers_info_to_json(void)
     if ( _GlobalMenuAuthority.PowerEnabled) cJSON_AddItemToObject(data_array, "data", data1_filed);
 
     //第二块 传感器监控
-    cJSON* data2_filed = cJSON_CreateObject(); 
-    cJSON_AddStringToObject(data2_filed,"name","Sensor");
-    cJSON_AddStringToObject(data2_filed,"path","/sensor");
-    cJSON_AddBoolToObject(data2_filed,"hidden",false);       
-    cJSON_AddStringToObject(data2_filed,"redirect","noRedirect");
-    cJSON_AddStringToObject(data2_filed,"component","Layout");
-    cJSON_AddBoolToObject(data2_filed,"alwaysShow",true);  
-    cJSON* meta_data2_filed = cJSON_CreateObject(); 
-    cJSON_AddStringToObject(meta_data2_filed,"title",language_sensor_monitoring[__globalDeviceManage._globalDevInfo.product_language]);   
-    cJSON_AddStringToObject(meta_data2_filed,"icon","slider");   
-    cJSON_AddBoolToObject(meta_data2_filed,"noCache",false); 
-    cJSON_AddStringToObject(meta_data2_filed,"link","");     
-    cJSON_AddItemToObject(data2_filed, "meta", meta_data2_filed);
-    //children
-    cJSON* children2_data_array = cJSON_CreateArray();
-    cJSON* children2_data1_filed = cJSON_CreateObject(); 
-    cJSON_AddStringToObject(children2_data1_filed,"name","SensorStatus");    
-    cJSON_AddStringToObject(children2_data1_filed,"path","sensorStatus");  
-    cJSON_AddBoolToObject(children2_data1_filed,"hidden",false); 
-    cJSON_AddStringToObject(children2_data1_filed,"component","sensor/sensorStatus/index");  
-    cJSON* children2_meta1_data1_filed = cJSON_CreateObject(); 
-    cJSON_AddStringToObject(children2_meta1_data1_filed,"title",language_sensor_status_monitoring[__globalDeviceManage._globalDevInfo.product_language]);   
-    cJSON_AddStringToObject(children2_meta1_data1_filed,"icon","monitor");   
-    cJSON_AddBoolToObject(children2_meta1_data1_filed,"noCache",false); 
-    cJSON_AddStringToObject(children2_meta1_data1_filed,"link","");    
-    cJSON_AddItemToObject(children2_data1_filed, "meta", children2_meta1_data1_filed);
-    if(_GlobalMenuAuthority.SensorStatusEnabled)cJSON_AddItemToObject(children2_data_array, "children", children2_data1_filed);
-    cJSON* children2_data2_filed = cJSON_CreateObject(); 
-    cJSON_AddStringToObject(children2_data2_filed,"name","SensorHistory");    
-    cJSON_AddStringToObject(children2_data2_filed,"path","sensorHistory");  
-    cJSON_AddBoolToObject(children2_data2_filed,"hidden",false); 
-    cJSON_AddStringToObject(children2_data2_filed,"component","sensor/sensorHistory/index");  
-    cJSON* children2_meta2_data2_filed = cJSON_CreateObject(); 
-    cJSON_AddStringToObject(children2_meta2_data2_filed,"title",language_sensor_history_search[__globalDeviceManage._globalDevInfo.product_language]);   
-    cJSON_AddStringToObject(children2_meta2_data2_filed,"icon","chart");   
-    cJSON_AddBoolToObject(children2_meta2_data2_filed,"noCache",false); 
-    cJSON_AddStringToObject(children2_meta2_data2_filed,"link","");    
-    cJSON_AddItemToObject(children2_data2_filed, "meta", children2_meta2_data2_filed);
-    if(_GlobalMenuAuthority.SensorHistorylEnabled)cJSON_AddItemToObject(children2_data_array, "children", children2_data2_filed);
-    cJSON_AddItemToObject(data2_filed, "children", children2_data_array);
-    if(_GlobalMenuAuthority.SensorEnabled)cJSON_AddItemToObject(data_array, "data", data2_filed);
+    // cJSON* data2_filed = cJSON_CreateObject(); 
+    // cJSON_AddStringToObject(data2_filed,"name","Sensor");
+    // cJSON_AddStringToObject(data2_filed,"path","/sensor");
+    // cJSON_AddBoolToObject(data2_filed,"hidden",false);       
+    // cJSON_AddStringToObject(data2_filed,"redirect","noRedirect");
+    // cJSON_AddStringToObject(data2_filed,"component","Layout");
+    // cJSON_AddBoolToObject(data2_filed,"alwaysShow",true);  
+    // cJSON* meta_data2_filed = cJSON_CreateObject(); 
+    // cJSON_AddStringToObject(meta_data2_filed,"title",language_sensor_monitoring[__globalDeviceManage._globalDevInfo.product_language]);   
+    // cJSON_AddStringToObject(meta_data2_filed,"icon","slider");   
+    // cJSON_AddBoolToObject(meta_data2_filed,"noCache",false); 
+    // cJSON_AddStringToObject(meta_data2_filed,"link","");     
+    // cJSON_AddItemToObject(data2_filed, "meta", meta_data2_filed);
+    // //children
+    // cJSON* children2_data_array = cJSON_CreateArray();
+    // cJSON* children2_data1_filed = cJSON_CreateObject(); 
+    // cJSON_AddStringToObject(children2_data1_filed,"name","SensorStatus");    
+    // cJSON_AddStringToObject(children2_data1_filed,"path","sensorStatus");  
+    // cJSON_AddBoolToObject(children2_data1_filed,"hidden",false); 
+    // cJSON_AddStringToObject(children2_data1_filed,"component","sensor/sensorStatus/index");  
+    // cJSON* children2_meta1_data1_filed = cJSON_CreateObject(); 
+    // cJSON_AddStringToObject(children2_meta1_data1_filed,"title",language_sensor_status_monitoring[__globalDeviceManage._globalDevInfo.product_language]);   
+    // cJSON_AddStringToObject(children2_meta1_data1_filed,"icon","monitor");   
+    // cJSON_AddBoolToObject(children2_meta1_data1_filed,"noCache",false); 
+    // cJSON_AddStringToObject(children2_meta1_data1_filed,"link","");    
+    // cJSON_AddItemToObject(children2_data1_filed, "meta", children2_meta1_data1_filed);
+    // if(_GlobalMenuAuthority.SensorStatusEnabled)cJSON_AddItemToObject(children2_data_array, "children", children2_data1_filed);
+    // cJSON* children2_data2_filed = cJSON_CreateObject(); 
+    // cJSON_AddStringToObject(children2_data2_filed,"name","SensorHistory");    
+    // cJSON_AddStringToObject(children2_data2_filed,"path","sensorHistory");  
+    // cJSON_AddBoolToObject(children2_data2_filed,"hidden",false); 
+    // cJSON_AddStringToObject(children2_data2_filed,"component","sensor/sensorHistory/index");  
+    // cJSON* children2_meta2_data2_filed = cJSON_CreateObject(); 
+    // cJSON_AddStringToObject(children2_meta2_data2_filed,"title",language_sensor_history_search[__globalDeviceManage._globalDevInfo.product_language]);   
+    // cJSON_AddStringToObject(children2_meta2_data2_filed,"icon","chart");   
+    // cJSON_AddBoolToObject(children2_meta2_data2_filed,"noCache",false); 
+    // cJSON_AddStringToObject(children2_meta2_data2_filed,"link","");    
+    // cJSON_AddItemToObject(children2_data2_filed, "meta", children2_meta2_data2_filed);
+    // if(_GlobalMenuAuthority.SensorHistorylEnabled)cJSON_AddItemToObject(children2_data_array, "children", children2_data2_filed);
+    // cJSON_AddItemToObject(data2_filed, "children", children2_data_array);
+    // if(_GlobalMenuAuthority.SensorEnabled)cJSON_AddItemToObject(data_array, "data", data2_filed);
 
     //第三块 告警保护
     cJSON* data3_filed = cJSON_CreateObject(); 
@@ -592,18 +592,18 @@ char* user_routers_info_to_json(void)
     cJSON_AddStringToObject(children5_meta1_data1_filed,"link","");    
     cJSON_AddItemToObject(children5_data1_filed, "meta", children5_meta1_data1_filed);
    if( _GlobalMenuAuthority.WkszEnabled) cJSON_AddItemToObject(children5_data_array, "children", children5_data1_filed);
-    // cJSON* children5_data2_filed = cJSON_CreateObject(); 
-    // cJSON_AddStringToObject(children5_data2_filed,"name","Rssz");    
-    // cJSON_AddStringToObject(children5_data2_filed,"path","rssz");  
-    // cJSON_AddBoolToObject(children5_data2_filed,"hidden",false); 
-    // cJSON_AddStringToObject(children5_data2_filed,"component","txgl/rssz/index");  
-    // cJSON* children5_meta2_data1_filed = cJSON_CreateObject(); 
-    // cJSON_AddStringToObject(children5_meta2_data1_filed,"title",language_RS485_install[__globalDeviceManage._globalDevInfo.product_language]);   
-    // cJSON_AddStringToObject(children5_meta2_data1_filed,"icon","build");   
-    // cJSON_AddBoolToObject(children5_meta2_data1_filed,"noCache",false); 
-    // cJSON_AddStringToObject(children5_meta2_data1_filed,"link","");    
-    // cJSON_AddItemToObject(children5_data2_filed, "meta", children5_meta2_data1_filed);
-    // if(_GlobalMenuAuthority.RsszEnabled)cJSON_AddItemToObject(children5_data_array, "children", children5_data2_filed);
+    cJSON* children5_data2_filed = cJSON_CreateObject(); 
+    cJSON_AddStringToObject(children5_data2_filed,"name","Rssz");    
+    cJSON_AddStringToObject(children5_data2_filed,"path","rssz");  
+    cJSON_AddBoolToObject(children5_data2_filed,"hidden",false); 
+    cJSON_AddStringToObject(children5_data2_filed,"component","txgl/rssz/index");  
+    cJSON* children5_meta2_data1_filed = cJSON_CreateObject(); 
+    cJSON_AddStringToObject(children5_meta2_data1_filed,"title",language_RS485_install[__globalDeviceManage._globalDevInfo.product_language]);   
+    cJSON_AddStringToObject(children5_meta2_data1_filed,"icon","build");   
+    cJSON_AddBoolToObject(children5_meta2_data1_filed,"noCache",false); 
+    cJSON_AddStringToObject(children5_meta2_data1_filed,"link","");    
+    cJSON_AddItemToObject(children5_data2_filed, "meta", children5_meta2_data1_filed);
+    if(_GlobalMenuAuthority.RsszEnabled)cJSON_AddItemToObject(children5_data_array, "children", children5_data2_filed);
     cJSON_AddItemToObject(data5_filed, "children", children5_data_array);
     if(_GlobalMenuAuthority.CommEnabled)cJSON_AddItemToObject(data_array, "data", data5_filed);
 

+ 1 - 0
ip/src/modbus_handle.c

@@ -233,6 +233,7 @@ int g_modbus_read_x_reg_delay(void* manger,int saddr,unsigned short reg,unsigned
 void g_modbus_deinit(void* manger)
 {
     Modbus_Manger *modbus_manger = (Modbus_Manger *)manger;
+    
     modbus_close(modbus_manger->mb);
     modbus_free(modbus_manger->mb);
     pthread_mutex_destroy(&modbus_manger->mutex);

+ 37 - 1
ip/src/sqlite_handle.c

@@ -478,6 +478,42 @@ int dev_search_latest_power_info(sqlite3 *db,int product_id,int product_ch_id,Gl
     return 0;
 }
 
+
+int dev_search_latest_power_all_info_ip(GlobalDeviceManager* globalDeviceManger,_OverChnPwrAckInfo* __overChnPwrAckInfo, int dev_addr)
+{
+
+    cascade_ip_mmap_t *mmp_t = globalDeviceManger->mmp;
+    if(mmp_t->dev_chn >= 32)
+        return -1;
+    for(int i = 0; i < mmp_t->dev_chn;i++)
+    {
+        _OverChnPwrAckInfo *_overChnPwrBackInfoTemp = (_OverChnPwrAckInfo *)malloc(sizeof(_OverChnPwrAckInfo));
+        if (_overChnPwrBackInfoTemp == NULL)
+        {
+            log_e("_overChnPwrBackInfoTemp malloc err.");
+            return -1;
+        }
+        _overChnPwrBackInfoTemp->product_name = globalDeviceManger->_globalDevInfo.product_name;
+        _overChnPwrBackInfoTemp->product_number = globalDeviceManger->_globalDevInfo.product_number;
+        _overChnPwrBackInfoTemp->product_id = mmp_t->data[i].saddr;            
+        _overChnPwrBackInfoTemp->productChName = globalDeviceManger->_globalDevInfo.product_name;
+        _overChnPwrBackInfoTemp->productChId = mmp_t->data[i].saddr;
+        _overChnPwrBackInfoTemp->status = mmp_t->data[i].status;
+        _overChnPwrBackInfoTemp->voltage =mmp_t->data[i].voltage/1000.0;
+        _overChnPwrBackInfoTemp->current = mmp_t->data[i].current/1000.0;
+        _overChnPwrBackInfoTemp->power =mmp_t->data[i].power/1000.0;
+        _overChnPwrBackInfoTemp->freq = mmp_t->data[i].freq/1000.0;
+        _overChnPwrBackInfoTemp->consumption = mmp_t->data[i].consumer/1000.0;
+        _overChnPwrBackInfoTemp->factor = mmp_t->data[i].factor/1000.0;
+        _overChnPwrBackInfoTemp->product_ch_start_delay = 0;
+        _overChnPwrBackInfoTemp->product_ch_stop_delay = 0;
+        list_add_tail(&_overChnPwrBackInfoTemp->list, &__overChnPwrAckInfo->list);
+    }
+    return 0;
+}
+
+
+
 /// @brief 获取所有采集的最新值
 /// @param db 
 /// @param _globalPowerManger 
@@ -595,7 +631,7 @@ int dev_search_latest_power_All_info(GlobalDeviceManager* globalDeviceManger,_Ov
             // 填数据
             _overChnPwrBackInfoTemp->product_name = globalDeviceManger->_globalDevInfo.product_name;
             _overChnPwrBackInfoTemp->product_number = globalDeviceManger->_globalDevInfo.product_number;
-            _overChnPwrBackInfoTemp->product_id = globalDeviceManger->_globalDevInfo.product_id;
+            _overChnPwrBackInfoTemp->product_id = _globalPowerMangerTemp->product_id;
             _overChnPwrBackInfoTemp->productChName = _globalPowerMangerTemp->product_ch_name;
             _overChnPwrBackInfoTemp->productChId = _globalPowerMangerTemp->product_ch_id;
             _overChnPwrBackInfoTemp->status = _globalPowerMangerTemp->_PowerInfo.status;

+ 2 - 0
ip/src/sqlite_handle.h

@@ -156,4 +156,6 @@ int dev_sql_VACCUM(sqlite3 *db);
 
 int dev_sql_set_overwrite(int flag);
 
+int dev_search_latest_power_all_info_ip(GlobalDeviceManager* globalDeviceManger,_OverChnPwrAckInfo* __overChnPwrAckInfo, int dev_addr);
+
 #endif

+ 1 - 1
ip/src/sys.c

@@ -1036,7 +1036,7 @@ int sys_get_disk_ava_MB(char *path)
     int avaMB = (st.f_frsize*st.f_bavail)/(1024*1024);
     //int freeMB = (st.f_frsize*st.f_bfree)/(1024*1024);
     //printf("____ava: %dMB, free %dMB\n", avaMB, freeMB);
-	LOGD("___ RomAvailable rom: %dMB\n", avaMB);
+	//LOGD("___ RomAvailable rom: %dMB\n", avaMB);
 
     return avaMB;
 }

+ 1 - 1
ip/src/thread.h

@@ -29,7 +29,7 @@ enum {
     THREAD_ID_BREAKER_SCANNER,
     THREAD_ID_MQTT,
     THREAD_ID_SMTP,
-    
+    THREAD_ID_TCP,
     THREAD_ID_MAX=30
 };
 

+ 3 - 2
ip/src/websocket_handle.c

@@ -164,6 +164,7 @@ static void web_update(ws_handle_t *wh)
 
             if(cur_dev_addr==0) {
                 pthread_mutex_lock(&gdm->_power_update); 
+                //nRetCh=dev_search_latest_power_all_info_ip(gdm,&chInfo, cur_dev_addr);
                 nRetCh=dev_search_latest_power_All_info(gdm,&chInfo, cur_dev_addr);
                 pthread_mutex_unlock(&gdm->_power_update);
                 pdm = gdm;
@@ -190,9 +191,9 @@ static void web_update(ws_handle_t *wh)
 
         //sensor info
         {
-            //pthread_mutex_lock(&__globalDeviceManage._sensor_update);
+            pthread_mutex_lock(&__globalDeviceManage._sensor_update);
             json_str = ws_sensor_status_ack_to_json(&gdm->_globalSensorManger);
-           // pthread_mutex_unlock(&__globalDeviceManage._sensor_update);
+           pthread_mutex_unlock(&__globalDeviceManage._sensor_update);
             ws_send_data(wh, json_str, strlen(json_str));
             cJSON_free(json_str);
         }