Ver código fonte

2024.06.26
修改状态指令3分钟上报一次,固件信息15分钟上报一次
状态或是有固件有更新则立即上报
Signed-off-by: gaochunhui <gaochunhui@cpyypt.cn>

gaochunhui 1 ano atrás
pai
commit
ffe493eee2
5 arquivos alterados com 58 adições e 12 exclusões
  1. 32 4
      App/masterslave.c
  2. 5 5
      App/public.c
  3. 6 1
      App/public.h
  4. 12 2
      App/taskOpt.c
  5. 3 0
      App/taskOpt.h

+ 32 - 4
App/masterslave.c

@@ -376,7 +376,7 @@ void master_analysis_status_cmd(uint8_t *data, uint8_t size)
     return;
 }
 
-
+extern timeout_t g_upstatusTime;
 uint8_t master_check_dev_table(uint16_t devType, uint32_t devSn)
 {
     volatile uint8_t i = 0;
@@ -392,7 +392,12 @@ uint8_t master_check_dev_table(uint16_t devType, uint32_t devSn)
     }
     if(flag == 1){
         g_runNode.nodMsg[i].readCount = 0;
-        g_runNode.nodMsg[i].status = 1;
+        if(g_runNode.nodMsg[i].status == 0){ // 前一次是离线,离线后再上线
+            timeout_stop(&g_upstatusTime);
+            g_runNode.nodMsg[i].status = 1;
+            g_runNode.devRunMsg[i].readNum = 4;
+        }
+
         return i;
     }
     else
@@ -442,14 +447,37 @@ void analysis_cmd_status(uint16_t cmd, uint8_t *data,uint8_t len)
 {
     uint8_t sendbuff[128], sendlen,sIndex;
     MasterSlave *msg = (MasterSlave*)data;
-
+    status0x2001 *s2001Msg = NULL;
     if(0x2000 == (cmd&0x2000)){
         data_dump("收到数据",data,len);
         sIndex = master_check_dev_table(msg->comInfo.statusMsg.devTypeS,msg->comInfo.statusMsg.devSnS);
         if(sIndex == 0xFF) return;
         switch(cmd){
-        case 0x2002:case 0x2001: // 实时状态信息 // 固件信息
+        case 0x2002:// 实时状态信息 // 固件信息
+            g_runNode.devRunMsg[sIndex].readNum++;
+            if(g_runNode.devRunMsg[sIndex].readNum<4) break;
             master_analysis_status_cmd(data,len);
+            g_runNode.devRunMsg[sIndex].readNum = 0;
+            break;
+        case 0x2001:
+            s2001Msg = (status0x2001*)msg->comInfo.info;
+            //data_dump("aaaaa",msg->comInfo.info,len-12);
+            printf("aaaaaaaaaa %08x,%08x\n",g_runNode.devRunMsg[sIndex].devAppVer,s2001Msg->appVer);
+            if(g_runNode.devRunMsg[sIndex].devAppVer != s2001Msg->appVer) {// APP版本不一样时,则上报
+                timeout_stop(&g_runNode.devRunMsg[sIndex].firmTime);
+                master_analysis_status_cmd(data,len);
+                timeout_setValue(&g_runNode.devRunMsg[sIndex].firmTime,UP_STATUS_2001);
+                timeout_start(&g_runNode.devRunMsg[sIndex].firmTime);
+                g_runNode.devRunMsg[sIndex].devAppVer = s2001Msg->appVer;
+            }
+            else {
+                if(timeout_isOut(&g_runNode.devRunMsg[sIndex].firmTime)){
+                    master_analysis_status_cmd(data,len);
+                    timeout_setValue(&g_runNode.devRunMsg[sIndex].firmTime,UP_STATUS_2001);
+                    timeout_start(&g_runNode.devRunMsg[sIndex].firmTime);
+                    printf("ccccccccccccccccc\n");
+                }
+            }
             break;
         }
     }

+ 5 - 5
App/public.c

@@ -286,12 +286,12 @@ void epprom_read_config_table(void)
         pbuff += 2; // Ô¤Áô
         if((pNode->devType == g_devMsg.devType) &&(pNode->devSn == g_devMsg.devSn)){
             pNode->bSelf = 1;
-				    pNode->status = 1;
-			}
+            pNode->status = 1;
+        }
         else {
-					pNode->bSelf = 0;
-					pNode->status = 0;
-				}
+            pNode->bSelf = 0;
+            pNode->status = 0;
+        }
         pNode->readCount = 0;
         printf("slave_table type = %04x, sn = %010u bself=%d\r\n",pNode->devType,pNode->devSn,pNode->bSelf);
     }

+ 6 - 1
App/public.h

@@ -59,11 +59,16 @@ typedef struct _node_msg_{
     uint8_t readCount; // 读取次数
     uint8_t bSelf;     // 是自己的设备类型和SN
 }__attribute__((packed))nodeMsg_t;
-
+typedef struct _node_dev_msg_{
+    uint8_t readNum; // 读取的次数
+    timeout_t firmTime; // 读取固件的次数
+    uint32_t devAppVer;
+}__attribute__((packed))nodeDevMsg;
 typedef struct _node_run_info_{
     nodeMsg_t nodMsg[NODE_MAX_SIZE];
     uint8_t nIndex;
     uint8_t slaveNum; // 从的个数
+    nodeDevMsg devRunMsg[NODE_MAX_SIZE];
 }__attribute__((packed))nodeRun_t;
 extern nodeRun_t g_runNode;
 

+ 12 - 2
App/taskOpt.c

@@ -102,6 +102,7 @@ void master_read_slave_data(void)
 {
 
 }
+timeout_t status2002time;
 /*-------------------------------------------------------------------------
  *  读取从的状态
  * -------------------------------------------------------------------------*/
@@ -111,7 +112,11 @@ uint8_t master_read_slave_status(void)
     nodeMsg_t *nodeMsg = NULL;
 
     if(0 == bsendMaster){
-        master_add_status_to_4g_txfifo(0x02,0x2002,g_devMsg.devType,g_devMsg.devSn, SELF_STATUS);
+        if(timeout_isOut(&status2002time)){
+            master_add_status_to_4g_txfifo(0x02,0x2002,g_devMsg.devType,g_devMsg.devSn, SELF_STATUS);
+            timeout_setValue(&status2002time,UP_STATUS_2002);
+            timeout_start(&status2002time);
+        }
         bsendMaster = 1;
     }
 
@@ -146,6 +151,7 @@ uint8_t master_read_slave_status(void)
 
 
 }
+timeout_t mastertime;
 /*--------------------------------------------------------------------------
  *  读取从的固件信息
  * -------------------------------------------------------------------------*/
@@ -155,7 +161,11 @@ void master_read_slave_firmmsg(void)
     nodeMsg_t *nodeMsg = NULL;
 
     if(0 == bsendMaster){
-        master_add_status_to_4g_txfifo(0x02,0x2001,g_devMsg.devType,g_devMsg.devSn,SELF_STATUS);
+        if(timeout_isOut(&mastertime)){
+            master_add_status_to_4g_txfifo(0x02,0x2001,g_devMsg.devType,g_devMsg.devSn,SELF_STATUS);
+            timeout_setValue(&mastertime,UP_STATUS_2001);
+            timeout_start(&mastertime);
+        }
         bsendMaster = 1;
     }
     if(1 == g_runNode.nodMsg[index].bSelf) {

+ 3 - 0
App/taskOpt.h

@@ -8,6 +8,9 @@
 #include "dn_4g.h"
 #include "ota_update.h"
 
+#define UP_STATUS_2001 1000*60*15
+#define UP_STATUS_2002 1000*60*3
+
 #define READ_STATUS_TIME 1000*60  // 状态读取时间,1分钟
 #define READ_FIRME_TIME  1000*60*3 // 读取固件信息的时间 3分钟
 typedef struct task_run_data_{