Преглед изворни кода

控制板升级,采用一对一升级。修改控制板升级是不用退出程序

liyi пре 1 година
родитељ
комит
fdc3b54076
5 измењених фајлова са 78 додато и 32 уклоњено
  1. 8 2
      pro/src/app.c
  2. 5 0
      pro/src/breaker_detection.c
  3. 21 10
      pro/src/cascade.c
  4. 1 0
      pro/src/common.h
  5. 43 20
      pro/src/upg.c

+ 8 - 2
pro/src/app.c

@@ -89,7 +89,7 @@ static void* power_thread(void* arg)
     //采集线程
     while (h->quit==0)
     {
-        if (_globalDeviceManager->_ReloadChm_flag)
+        if (_globalDeviceManager->_ReloadChm_flag || _globalDeviceManager->upgread_flag)
         {
             sleep(1);
             continue;
@@ -2810,7 +2810,13 @@ static void* snmp_thread(void *arg)
             read_configs();  
             reconfig = 0;  
         }  
-        agent_check_and_process(1);/* block every 1 second */
+        if(!dm->upgread_flag)
+        {
+            agent_check_and_process(1);/* block every 1 second */
+        }else
+        {
+            sleep(1);
+        }
     }
     /* at shutdown time */
     snmp_shutdown(path);

+ 5 - 0
pro/src/breaker_detection.c

@@ -177,6 +177,11 @@ void* breaker_scanner_thread(void* arg)
 
     while(h->quit==0)
     {
+        if(gm->upgread_flag)
+        {
+            sleep(1);
+            continue;
+        }
         //改为启动的时候和web端手动添加开关的时候,检测一次开关控制板在不在线,其他时候就不扫描了
       /*  if((count % 10) == 1)
         {

+ 21 - 10
pro/src/cascade.c

@@ -796,6 +796,7 @@ static int mb_receive(cascade_handle_t *cas)
     if(h.addr>0 && h.addr!=cas->addr) {
         return -1;
     }
+
 #endif
 
     //LOGD("____mb_receive, reg: %d, rc: %d\n", h.reg, rc);
@@ -935,15 +936,17 @@ static int mb_receive(cascade_handle_t *cas)
             Modbus_Manger *mm=&get_dm()->_globalRelaySampManger;
 
             LOGD("___ slave XXXXXXXXXXX\n");
-
-            if(h.func==MODBUS_FC_READ_HOLDING_REGISTERS) {
-                cascade_slave_read(h.reg, h.regcnt);
-            }
-            else if(h.func==MODBUS_FC_WRITE_SINGLE_REGISTER) {
-                cascade_slave_write(h.reg, h.regcnt);
+            if(!get_dm()->upgread_flag)
+            {
+                if(h.func==MODBUS_FC_READ_HOLDING_REGISTERS) {
+                    cascade_slave_read(h.reg, h.regcnt);
+                }
+                else if(h.func==MODBUS_FC_WRITE_SINGLE_REGISTER) {
+                    cascade_slave_write(h.reg, h.regcnt);
+                }
+            
+                r = _mb_reply(cas, buff, rc,cascade_slave_map());
             }
-
-            r = _mb_reply(cas, buff, rc,cascade_slave_map());
         }
     }
 
@@ -1693,7 +1696,11 @@ static void* cmd_thread(void *arg)
     else {
         LOGD("____ slave CASCADE_CMD_CLOSE\n");
     }
-
+    if(dm->upgread_flag)
+    {
+        free(pcmd);
+        pthread_exit(NULL);
+    }
     int flag=((pcmd->cmd==CASCADE_CMD_OPEN)?1:0);
     if(pcmd->chId == 0xff) {
         int sendAddr = 0;
@@ -1744,7 +1751,11 @@ static void* cmd_NF_thread(void *arg)
     slave_info_t *info=&cas->sInfo;
     GlobalDeviceManager *dm=get_dm();
     cmd_data_t *pcmd=(cmd_data_t*)arg;
-
+    if(dm->upgread_flag)
+    {
+        free(pcmd);
+        pthread_exit(NULL);
+    }
     if(pcmd->cmd==CASCADE_CMD_OPEN_NF) {
         LOGD("____ slave CASCADE_CMD_OPEN_NF\n");
     }

+ 1 - 0
pro/src/common.h

@@ -1316,6 +1316,7 @@ typedef struct
     mqtt_info_t          mqttInfo;
     Modbus_Manger_Tcp *md_tcp;
     Msg_thread_args  _MSG_args;
+    uint8_t          upgread_flag;
 #ifdef NORTH_USER_SPECILS
     cascade_north_user_t north_user;
 #endif

+ 43 - 20
pro/src/upg.c

@@ -100,12 +100,11 @@ static int mb_read(Modbus_Manger *mm, uint16_t addr, uint16_t reg, void *data, i
 static int mb_write(Modbus_Manger *mm, uint16_t addr, uint16_t reg, void *data, int len, int timeout)
 {
     int to,r,cnt=(len+len%2)/2;
-
+    
     g_modbus_get_timeout(mm, &to);
     g_modbus_set_timeout(mm, timeout);
     r = g_modbus_write_x_reg(mm, addr, reg, cnt, data);
     g_modbus_set_timeout(mm, to);
-
     return (r==cnt)?0:-1;
 }
 //////////////////////////////////////////////////////////////////////
@@ -204,7 +203,21 @@ static int board_send(Modbus_Manger *mm, uint16_t addr, char *data, int dlen)
     int slen=0,onelen=0,onemax=128;
 
     upg_pkt_t *pkt=(upg_pkt_t*)temp;
-    r = board_upgrade_jump(mm, addr);
+    board_upgrade_jump(mm, addr);
+    sleep(1);
+    r = board_is_upgrading(mm,addr);
+    if(r == 0){
+        sleep(3);
+        r = board_upgrade_jump(mm, addr);
+        sleep(3);
+        r = board_is_upgrading(mm,addr);
+    }
+    LOGD("r = %d   addr = %d\n",r,addr);
+    if(r  == 0)
+    {
+        return -1;
+    }
+    sleep(2);
     while(1) {
         if((slen+onemax)>=dlen) {
             //onelen = dlen-(slen+onemax);
@@ -217,7 +230,8 @@ static int board_send(Modbus_Manger *mm, uint16_t addr, char *data, int dlen)
         memcpy(pkt->data, data+slen, onelen);
         pkt->pid = pid;
         pkt->dlen = onelen;
-        r = mb_write(mm, addr, REG_UPG_WRITE, pkt, onelen+sizeof(upg_pkt_t), 10);
+        r = mb_write(mm, addr, REG_UPG_WRITE, pkt, onelen+sizeof(upg_pkt_t), 40);
+
         slen += onelen;
         if(pid==0) {
             //file_save("/tmp/xxx.bin", pkt, onelen+sizeof(upg_pkt_t));
@@ -228,7 +242,7 @@ static int board_send(Modbus_Manger *mm, uint16_t addr, char *data, int dlen)
         if(pid<0) break;
         pid++;
     }
-    sleep(1);
+    sleep(2);
 
     return 0;
 }
@@ -252,21 +266,27 @@ static int board_proc(upg_handle_t *h, int quit)
     board_info_set(&info);
 
     //broadcase upgrade file
-    board_send(mm, 0, fbuf.buf, fbuf.dlen);
+    sleep(1);
+    
     while(1) {
         r = xlist_get_node(l, &ln, 0);
         if(r) {
             break;
         }
-
         tmp = (board_info_t*)ln->data.buf;
-        for(i=0; i<RETRY_MAX; i++) {
-            r = board_get_info(mm, tmp->addr, &swinfo);
-            if(r==0) {
-                break;
+
+        r = board_send(mm, tmp->addr, fbuf.buf, fbuf.dlen);
+        if(r == 0)
+        {
+            for(i=0; i<20; i++) {
+                r = board_get_info(mm, tmp->addr, &swinfo);
+                if(r==0) {
+                    break;
+                }
+                LOGE("___ board upgrade failed, retry %d\n", i+1);
+                sleep(1);
+            // board_send(mm, i, fbuf.buf, fbuf.dlen);
             }
-            LOGE("___ board upgrade failed, retry %d\n", i+1);
-            board_send(mm, i, fbuf.buf, fbuf.dlen);
         }
 
         if(r) {
@@ -283,7 +303,7 @@ static int board_proc(upg_handle_t *h, int quit)
     }
     free(fbuf.buf);
 
-    sys_exit();        //restart app
+   // sys_exit();        //restart app
 
     return 0;
 }
@@ -310,16 +330,16 @@ static int board_scan(void)
 static void start_threads(int flag)
 {
     if(flag) {
-        thread_start2(THREAD_ID_SNMP);
-        thread_start2(THREAD_ID_POWER);
+       // thread_start2(THREAD_ID_SNMP);
+      //  thread_start2(THREAD_ID_POWER);
         //thread_start2(THREAD_ID_CASCADE);
         //thread_start2(THREAD_ID_CASCADE_SCAN);
         //thread_start2(THREAD_ID_BREAKER);
         //thread_start2(THREAD_ID_BREAKER_SCANNER);
     }
     else {
-        thread_stop(THREAD_ID_SNMP);
-        thread_stop(THREAD_ID_POWER);
+       // thread_stop(THREAD_ID_SNMP);
+       // thread_stop(THREAD_ID_POWER);
         //thread_stop(THREAD_ID_CASCADE);
         //thread_stop(THREAD_ID_CASCADE_SCAN);
         //thread_stop(THREAD_ID_BREAKER);
@@ -339,11 +359,14 @@ static void* board_thread(void *arg)
     while(th->quit==0) {
         if(h->arg.upging) {
             
-            start_threads(0);
+           // start_threads(0);
+           h->dm->upgread_flag = 1;
+           sleep(2);
             r = board_proc(h, th->quit);
-            start_threads(1);
+            //start_threads(1);
             
             file_remove(h->arg.path);
+            h->dm->upgread_flag = 0;
             h->arg.upging = 0;
         }
         else {