1 Commits

13 changed files with 47 additions and 591 deletions
@@ -1,96 +0,0 @@
---
name: submodule-commit-push
description: 提交并推送含子模块的 Git 仓库(先子模块后父仓库,处理 detached HEAD / 落后远程等常见问题)
source: auto-skill
extracted_at: '2026-06-22T03:44:15.544Z'
---
# 提交并推送所有仓库(含子模块)
## 适用场景
项目包含多个 Git 子模块,需要将所有变更(子模块内文件删除/修改 + 父仓库指针更新)一次性提交并推送到远端。
## 核心原则
**子模块必须先于父仓库提交并推送**,否则父仓库的指针会指向尚未推送到远端的提交,导致其他人拉取失败。
## 操作流程
### 1. 检查整体状态
```bash
cd <项目根目录>
git status # 查看父仓库变更
git submodule status # 查看子模块状态(+ 表示新提交,- 表示未初始化)
```
### 2. 逐个检查子模块
对每个有变更的子模块,进入目录检查:
```bash
cd <子模块路径>
git status
git diff HEAD --stat
git branch -a # 检查是否在 detached HEAD
git log -n 1 --oneline # 检查是否落后远端
```
### 3. 处理子模块常见问题
| 问题 | 表现 | 解决方案 |
|------|------|----------|
| **落后远端** | `Your branch is behind 'origin/xxx' by N commits` | 先 `git stash``git pull``git stash pop`,再提交 |
| **detached HEAD** | 子模块不在任何分支上 | `git checkout -b develop``git checkout develop` 切到分支再提交 |
| **仅 modified content** | 父仓库显示 `modified content` 但子模块 `git status` 干净 | 子模块只有未提交的本地修改,需在子模块内 add + commit |
### 4. 提交并推送每个子模块
```bash
cd <子模块路径>
git add -A
git commit -m "chore: 具体变更描述
- 文件1: 变更说明
- 文件2: 变更说明"
git push origin <分支名> # 首次推送新分支用 git push -u origin <分支名>
```
> **提交消息格式**:按用户偏好,需列出每个文件的变更说明,而非笼统总结。
### 5. 在父仓库更新子模块指针
```bash
cd <项目根目录>
git add <子模块路径1> <子模块路径2> ...
git commit -m "chore: 更新子模块指针到最新提交
- 子模块1: 变更说明
- 子模块2: 变更说明"
git push origin <分支名>
```
### 6. 验证
```bash
cd <项目根目录>
git status # 应显示 nothing to commit, working tree clean
git submodule status # 所有子模块无 + 或 - 前缀
```
## 本项目子模块清单
| 子模块 | 路径 | 默认分支 | 远端地址 |
|--------|------|----------|----------|
| FatFS | `Project/GateWay/source/Module/FatFS` | master | 192.168.2.47 |
| GateWay_Debug | `Project/GateWay/source/Module/GateWay_Debug` | develop | 192.168.2.47 |
| SDCard | `Project/GateWay/source/Module/SDCard` | master | 192.168.2.47 |
| sx127x | `Project/GateWay/source/Module/sx127x` | develop | 192.168.2.47 |
> 父仓库 GateWay 的远端在 8.137.104.4,子模块的远端在 192.168.2.47(内网),注意网络可达性。
## 注意事项
- 如果子模块只有指针变更(无文件级修改),说明子模块已有新提交但父仓库指针未更新,只需在父仓库 `git add <子模块路径>` 即可
- FatFS 子模块容易因为 documents/ 目录产生大量 untracked 文件冲突,`git stash` 时加 `--include-untracked`
- sx127x 经常处于 detached HEAD 状态,操作前务必先切到 develop 分支
+26 -38
View File
@@ -729,18 +729,6 @@
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>14</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\source\User\Src\Update.c</PathWithFileName>
<FilenameWithoutPath>Update.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
@@ -751,7 +739,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>15</FileNumber>
<FileNumber>14</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -763,7 +751,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>16</FileNumber>
<FileNumber>15</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -775,7 +763,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>17</FileNumber>
<FileNumber>16</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -787,7 +775,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>18</FileNumber>
<FileNumber>17</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -799,7 +787,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>19</FileNumber>
<FileNumber>18</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -811,7 +799,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>20</FileNumber>
<FileNumber>19</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -823,7 +811,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>21</FileNumber>
<FileNumber>20</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -835,7 +823,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>22</FileNumber>
<FileNumber>21</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -847,7 +835,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>23</FileNumber>
<FileNumber>22</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -859,7 +847,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>24</FileNumber>
<FileNumber>23</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -871,7 +859,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>25</FileNumber>
<FileNumber>24</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -883,7 +871,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>26</FileNumber>
<FileNumber>25</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -895,7 +883,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>27</FileNumber>
<FileNumber>26</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -907,7 +895,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>28</FileNumber>
<FileNumber>27</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -919,7 +907,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>29</FileNumber>
<FileNumber>28</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -931,7 +919,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>30</FileNumber>
<FileNumber>29</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -943,7 +931,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>31</FileNumber>
<FileNumber>30</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -963,7 +951,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>32</FileNumber>
<FileNumber>31</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -983,7 +971,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>33</FileNumber>
<FileNumber>32</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -995,7 +983,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>34</FileNumber>
<FileNumber>33</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1015,7 +1003,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>35</FileNumber>
<FileNumber>34</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1027,7 +1015,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>36</FileNumber>
<FileNumber>35</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1039,7 +1027,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>37</FileNumber>
<FileNumber>36</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1051,7 +1039,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>38</FileNumber>
<FileNumber>37</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1071,12 +1059,12 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>39</FileNumber>
<FileNumber>38</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\..\..\..\Module\SX127x\sx127x.c</PathWithFileName>
<PathWithFileName>..\source\Module\SX127x\sx127x.c</PathWithFileName>
<FilenameWithoutPath>sx127x.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
+3 -13
View File
@@ -493,11 +493,6 @@
<FileType>1</FileType>
<FilePath>..\source\User\Src\utils.c</FilePath>
</File>
<File>
<FileName>Update.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\User\Src\Update.c</FilePath>
</File>
</Files>
</Group>
<Group>
@@ -784,7 +779,7 @@
<File>
<FileName>sx127x.c</FileName>
<FileType>1</FileType>
<FilePath>..\..\..\..\Module\SX127x\sx127x.c</FilePath>
<FilePath>..\source\Module\SX127x\sx127x.c</FilePath>
</File>
</Files>
</Group>
@@ -1272,7 +1267,7 @@
<MiscControls>--diag_suppress=186,66</MiscControls>
<Define>__DEBUG,HC32F460,USE_DEVICE_DRIVER_LIB,JEUA,BOOT_ENABLE</Define>
<Undefine></Undefine>
<IncludePath>..\..\..\driver\inc;..\..\..\mcu\common;..\source\User\Inc;..\source\User\Src;..\source\Module\Debug;..\source\Module\SDCard;..\source\Module\FatFS\source;..\source\Module\sx127x;..\source\Module\GateWay_Debug</IncludePath>
<IncludePath>..\..\..\driver\inc;..\..\..\mcu\common;..\source\User\Inc;..\source\Module\Debug;..\source\Module\SDCard;..\source\Module\FatFS\source;..\source\Module\sx127x;..\source\Module\GateWay_Debug</IncludePath>
</VariousControls>
</Cads>
<Aads>
@@ -1424,11 +1419,6 @@
<FileType>1</FileType>
<FilePath>..\source\User\Src\utils.c</FilePath>
</File>
<File>
<FileName>Update.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\User\Src\Update.c</FilePath>
</File>
</Files>
</Group>
<Group>
@@ -1715,7 +1705,7 @@
<File>
<FileName>sx127x.c</FileName>
<FileType>1</FileType>
<FilePath>..\..\..\..\Module\SX127x\sx127x.c</FilePath>
<FilePath>..\source\Module\SX127x\sx127x.c</FilePath>
</File>
</Files>
</Group>
-3
View File
@@ -5,8 +5,6 @@
#define LORA_LOWPOWER //LORA低功耗设备,采用主动上报方式
#define CRC16_BASE 0xA001
#define SENSOR_DATA_LEN_MAX 50
#define SENSOR_NUM_MAX 16
#define COMMUNIT_NUM_MAX 32
@@ -317,7 +315,6 @@ struct GateWay_t{
};
int Cat1EthRevCallBack(GateWayPara GateWay, uint8_t *rData, uint16_t rLen);
void Cat1UpgradeSetEnable(bool enable);
uint16_t CRC_Modbus(uint16_t wBase, __IO uint8_t *para, uint16_t length);
uint8_t AsciiToHex(char *ASCData, uint8_t *HexData, uint8_t sLen);
void HexToAscii(uint8_t *HexData, char *ASCData, uint8_t sLen);
-55
View File
@@ -1,55 +0,0 @@
#ifndef __UPDATE_H
#define __UPDATE_H
#include <stdint.h>
#include "bsp.h"
/*启动标志定义*/
#define APP_START_FLAG 0x55AA5A5A
#define APP_UPDATE_FLAG 0xA5A5AA55
/*主机下发升级请求载荷结构体*/
typedef struct {
uint16_t PackageNum;
uint32_t AppSize;
uint32_t AppCrc32;
}__attribute__ ((packed))UpDataRequset_t, *UDReq;
/*帧头结构体 - 与BootLoader协议一致*/
typedef struct {
uint8_t Header; // 0x7D
uint8_t DevMac[6]; // 设备MAC地址
uint8_t Cmd; // 命令码
uint8_t PayloadLen; // 载荷长度
}__attribute__((packed))UpdateFrameHeader_t, *pUpdateFrameHeader;
/*升级命令码*/
typedef enum {
INSIDE_CMD_UPDATE = 0x81, // 升级程序下发请求
}INSIDE_CMD_M;
/*内部指令状态机*/
typedef enum {
IN_STATUS_IDLE,
IN_STATUS_UPDATE,
}InStatus_m;
/*****************************************************************************************
* 函数名称: Update
* 功能描述: 固件升级 - 解析到升级指令后调用此函数
* 参 数: PayLoad 协议负载,需去除帧头等信息,只传负载数据
* 返 回 值: 无
*****************************************************************************************/
void Update(uint8_t *PayLoad);
/*****************************************************************************************
* 函数名称: UpdateInit
* 功能描述: 升级参数初始化 - 需要在程序启动,外设初始化完后调用
* 参 数: 无
* 返 回 值: 无
*****************************************************************************************/
void UpdateInit(void);
#endif
+1 -1
View File
@@ -8,7 +8,7 @@
#include <time.h>
#include "hc32_ddl.h"
#include "rtthread.h"
#include "ff.h"
#include "ff.h"
#define SOFTWARE_VERSION 10
#define HARDWARE_VERSION 12
+6 -1
View File
@@ -571,6 +571,7 @@ void CatOneLoopHandler(void)
rt_thread_delay(3000);
CAT1_PWR_KEY_SET();
CatSendErrCnt = 0;
CatOne.GateWay->SvrRegFlag = false;
CAT1_DBG_LOG("Cat1 Power Off!\r\n");
CatOne.Cat1Status = CAT_ONE_IDEL;
CatOne.ResetDelayCnt = CATONE_RESET_DELAY_TIME_MAX;
@@ -578,6 +579,7 @@ void CatOneLoopHandler(void)
case CAT_ONE_RESET:
CatSendErrCnt = 0;
CatOne.GateWay->SvrRegFlag = false;
CAT1_DBG_LOG("Cat1 Reset!\r\n");
CAT1_RESET_CLR();
CAT1_PWR_KEY_SET();
@@ -732,6 +734,7 @@ void EthLoopHandler(void)
case ETH_OFF:
CAT1_DBG_LOG("ETH Power Off!\r\n");
CatOne.GateWay->SvrRegFlag = false;
//ETH_RESET_CLR();
//rt_thread_delay(3000);
//ETH_RESET_SET();
@@ -887,7 +890,9 @@ void CatReadImeiOrSim(char *Imei, char *Sim)
void CatOneTriggerRegister(void)
{
CatOne.Cat1Status = CAT_ONE_REG_SVR;
ETHStop();
CAT1_ON();
CatOneReset();
}
void ETHTriggerRegister(void)
+3 -102
View File
@@ -2,7 +2,6 @@
#include "main.h"
#include "CatOneTask.h"
#include "DebugCmd.h"
#include "Update.h"
#define UC_OFFLINE_TIME_INTERVAL_MAX (2 * 60 * 60)//离线判断最大时间间隔,单位秒
@@ -10,14 +9,6 @@ static rt_sem_t LoraDioIRQ_Sem = RT_NULL;
static rt_thread_t LoraIRQ_Thread = RT_NULL;
static GateWayPara GateWay;
/*Lora通道升级相关变量*/
static InStatus_m s_LoraInStatus = IN_STATUS_IDLE;
static uint8_t s_LoraInsidePay[256];
static uint8_t s_LoraInsidePayLen = 0;
static bool s_LoraUpgradeEnable = false;
static void LoraInSideCmdHandler(uint8_t *rData, uint16_t rLen);
static void LoraInSideLoopHandler(void);
void LoraSend(uint8_t* pucBuff, uint8_t ucLen)
{
Sx1276LoRaSendBuffer(pucBuff, ucLen);
@@ -107,10 +98,6 @@ void Lora_Thread_Entry(void *parameter)
Sx1276LoRaInit(LoraRevCallBack);
Debug_Printf("Lora Thread is running\r\n");
/*启用Lora通道升级功能*/
s_LoraUpgradeEnable = true;
#ifdef LORA_LOWPOWER
while(1) {
if(GateWay->ConfigPara.Lora.OnOff == false) {
@@ -120,19 +107,9 @@ void Lora_Thread_Entry(void *parameter)
result = rt_mq_recv(GateWay->LoraRev_MQ, Payload, 256, 1000);
if(result == RT_EOK) {
/*内部指令处理(升级帧头0x7D)*/
if(Payload[1] == 0x7D && s_LoraUpgradeEnable) {
LoraInSideCmdHandler(&Payload[1], Payload[0]);
}
else {
/*内部指令状态机处理*/
LoraInSideLoopHandler();
/*正常通讯单元数据处理*/
int ret = GateWay->CommUnitRevCallBack(GateWay, &Payload[1], Payload[0], LoRaSendBuffer);
if(ret == 0xff) //注册信息
continue;
}
int ret = GateWay->CommUnitRevCallBack(GateWay, &Payload[1], Payload[0], LoRaSendBuffer);
if(ret == 0xff) //注册信息
continue;
}
else { //离线判断
for(int i = 0; i < COMMUNIT_NUM_MAX; i++) {
@@ -233,79 +210,3 @@ void LoraInit(void)
{
Sx1276LoRaInit(LoraRevCallBack);
}
/*****************************************************************************************
* 函数名称: LoraInSideCmdHandler
* 功能描述: Lora通道内部指令处理函数
* 参 数: rData 接收数据
rLen 数据长度
* 返 回 值: 无
*****************************************************************************************/
static void LoraInSideCmdHandler(uint8_t *rData, uint16_t rLen)
{
uint16_t crc16, Check;
uint8_t *Payload;
pUpdateFrameHeader IFHeader = (pUpdateFrameHeader)rData;
/*CRC校验*/
Check = CRC_Modbus(CRC16_BASE, rData, rLen - 2);
crc16 = (rData[rLen - 1] << 8) | rData[rLen - 2];
if(Check != crc16) {
Debug_Printf("Lora Inside CRC Err...\r\n");
return;
}
/*检查设备MAC是否匹配(支持广播0xFF)*/
bool isMatch = false;
for(int i = 0; i < 6; i++) {
if(IFHeader->DevMac[i] != GateWay->ConfigPara.GwMac[i]) {
if(IFHeader->DevMac[i] == 0xFF) {
isMatch = true;
break;
}
break;
}
else {
isMatch = true;
}
}
if(!isMatch) {
Debug_Printf("Lora Inside MAC Err...\r\n");
return;
}
Payload = &rData[sizeof(UpdateFrameHeader_t)];
s_LoraInsidePayLen = IFHeader->PayloadLen;
switch((INSIDE_CMD_M)IFHeader->Cmd) {
case INSIDE_CMD_UPDATE: {
memcpy(s_LoraInsidePay, Payload, s_LoraInsidePayLen);
s_LoraInStatus = IN_STATUS_UPDATE;
break;
}
default:
break;
}
}
/*****************************************************************************************
* 函数名称: LoraInSideLoopHandler
* 功能描述: Lora通道内部指令状态机处理函数
* 参 数: 无
* 返 回 值: 无
*****************************************************************************************/
static void LoraInSideLoopHandler(void)
{
switch(s_LoraInStatus) {
case IN_STATUS_IDLE: {
break;
}
case IN_STATUS_UPDATE: {
Update(s_LoraInsidePay);
memset(s_LoraInsidePay, 0, sizeof(s_LoraInsidePay));
s_LoraInStatus = IN_STATUS_IDLE;
break;
}
}
}
+3 -112
View File
@@ -4,17 +4,8 @@
#include "LoraTask.h"
#include "spiflash.h"
#include "CatOneTask.h"
#include "Update.h"
#include <stdlib.h>
/*Cat1/LAN通道升级相关变量*/
static InStatus_m s_Cat1InStatus = IN_STATUS_IDLE;
static uint8_t s_Cat1InsidePay[256];
static uint8_t s_Cat1InsidePayLen = 0;
static bool s_Cat1UpgradeEnable = false;
static void Cat1InSideCmdHandler(uint8_t *rData, uint16_t rLen, GateWayPara GateWay);
static void Cat1InSideLoopHandler(void);
//传感器对应的数据长度
const uint8_t SensorTypeDataLen[] = {
0, //0x0000-保留
@@ -870,26 +861,14 @@ int Cat1EthRevCallBack(GateWayPara GateWay, uint8_t *rData, uint16_t rLen)
uint8_t *Data;
uint8_t *MegData;
uint8_t sLen;
uint8_t CommUintMac[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
NetCommFrameHeader NCHeader = (NetCommFrameHeader)rData;
uint16_t FrameLen = sizeof(NetCommFrameHeader_t) + NCHeader->PayloadLen;
if(FrameLen > CAT_ONE_REV_LEN_MAX)
return -1;
/*Cat1/LAN通道升级处理 - 新协议帧头0x7D*/
if(NCHeader->Header == 0x7D && s_Cat1UpgradeEnable) {
/*内部指令状态机处理*/
Cat1InSideLoopHandler();
Cat1InSideCmdHandler(rData, rLen, GateWay);
return 0;
}
/*内部指令状态机处理*/
Cat1InSideLoopHandler();
if(NCHeader->Header != 0x7A)
return -1;
if(memcmp(NCHeader->GWMac, GateWay->ConfigPara.GwMac, 6) != 0x00)
@@ -1233,91 +1212,3 @@ int Cat1EthRevCallBack(GateWayPara GateWay, uint8_t *rData, uint16_t rLen)
}
return 0;
}
/*****************************************************************************************
* 函数名称: Cat1InSideCmdHandler
* 功能描述: Cat1/LAN通道内部指令处理函数
* 参 数: rData 接收数据
rLen 数据长度
GateWay 网关参数句柄
* 返 回 值: 无
*****************************************************************************************/
static void Cat1InSideCmdHandler(uint8_t *rData, uint16_t rLen, GateWayPara GateWay)
{
uint16_t crc16, Check;
uint8_t *Payload;
pUpdateFrameHeader IFHeader = (pUpdateFrameHeader)rData;
/*CRC校验*/
Check = CRC_Modbus(CRC16_BASE, rData, rLen - 2);
crc16 = (rData[rLen - 1] << 8) | rData[rLen - 2];
if(Check != crc16) {
Debug_Printf("Cat1 Inside CRC Err...\r\n");
return;
}
/*检查设备MAC是否匹配(支持广播0xFF)*/
bool isMatch = false;
for(int i = 0; i < 6; i++) {
if(IFHeader->DevMac[i] != GateWay->ConfigPara.GwMac[i]) {
if(IFHeader->DevMac[i] == 0xFF) {
isMatch = true;
break;
}
break;
}
else {
isMatch = true;
}
}
if(!isMatch) {
Debug_Printf("Cat1 Inside MAC Err...\r\n");
return;
}
Payload = &rData[sizeof(UpdateFrameHeader_t)];
s_Cat1InsidePayLen = IFHeader->PayloadLen;
switch((INSIDE_CMD_M)IFHeader->Cmd) {
case INSIDE_CMD_UPDATE: {
memcpy(s_Cat1InsidePay, Payload, s_Cat1InsidePayLen);
s_Cat1InStatus = IN_STATUS_UPDATE;
break;
}
default:
break;
}
}
/*****************************************************************************************
* 函数名称: Cat1InSideLoopHandler
* 功能描述: Cat1/LAN通道内部指令状态机处理函数
* 参 数: 无
* 返 回 值: 无
*****************************************************************************************/
static void Cat1InSideLoopHandler(void)
{
switch(s_Cat1InStatus) {
case IN_STATUS_IDLE: {
break;
}
case IN_STATUS_UPDATE: {
Update(s_Cat1InsidePay);
memset(s_Cat1InsidePay, 0, sizeof(s_Cat1InsidePay));
s_Cat1InStatus = IN_STATUS_IDLE;
break;
}
}
}
/*****************************************************************************************
* 函数名称: Cat1UpgradeSetEnable
* 功能描述: 设置Cat1/LAN通道升级使能
* 参 数: enable 使能标志
* 返 回 值: 无
*****************************************************************************************/
void Cat1UpgradeSetEnable(bool enable)
{
s_Cat1UpgradeEnable = enable;
}
+3 -103
View File
@@ -5,18 +5,8 @@
#include "CatOneTask.h"
#include "DebugCmd.h"
#include "update_protocol.h"
#include "Update.h"
#include "bsp.h"
/*升级相关变量 - 使用Update.h中定义的InStatus_m类型*/
static InStatus_m s_InStatus = IN_STATUS_IDLE;
static uint8_t s_InsidePay[256];
static uint8_t s_InsidePayLen = 0;
/*静态函数声明*/
static void InSideCmdHandler(uint8_t *rData, uint16_t rLen, GateWayPara GateWay, SensorCommPara SCPara);
static void InSideLoopHandler(GateWayPara GateWay, SensorCommPara SCPara);
//#define RS485_DBG_LOG(...) { if(RS485DispEn) Debug_Printf(__VA_ARGS__);}
//static uint8_t RS485DispEn = false;
@@ -270,15 +260,12 @@ void RS485LoopHandler(GateWayPara GateWay, RS485Para RS485Ch, SensorCommPara SCP
rt_err_t result;
uint8_t MegData[9];
int ret;
if(RS485Ch->Enable == false) {
rt_thread_delay(10);
return;
}
/*内部指令状态机处理(升级)*/
InSideLoopHandler(GateWay, SCPara);
if(RS485Ch->CommUnitEnable == true) { //使用内置通讯单元
if(RS485Ch->QuerySensorFlag == true) { //开机查找传感器
if(SCPara->SensorCnt < SENSOR_NUM_MAX) {
@@ -378,12 +365,7 @@ void RS485LoopHandler(GateWayPara GateWay, RS485Para RS485Ch, SensorCommPara SCP
RxLenTemp = SCPara->RS485RxLen;
// memset(SCPara->RS485RxBuff, 0x00, RS485_RX_BUFF_LEN_MAX);
SCPara->RS485RxLen = 0;
/*内部指令处理(升级帧头0x7D)*/
if(RxBuffTemp[0] == 0x7D && RS485Ch->UpgradeEnable == true) {
InSideCmdHandler(RxBuffTemp, RxLenTemp, GateWay, SCPara);
}
else if(RxBuffTemp[0] == 0x7A && RS485Ch->UpgradeEnable == true) { //旧版升级协议(兼容)
if(RxBuffTemp[0] == 0x7A && RS485Ch->UpgradeEnable == true) { //升级
update_process(RxBuffTemp,RxLenTemp);
}
else if(RxBuffTemp[0] == 0x7A && RS485Ch->CommUnitEnable == true) { //内置通讯单元数据解析
@@ -639,85 +621,3 @@ void RS485Ch2RxIrqCallback(uint8_t rData)
}
}
#endif
/*****************************************************************************************
* 函数名称: InSideCmdHandler
* 功能描述: 内部指令处理函数(升级命令)
* 参 数: rData 接收数据
rLen 数据长度
GateWay 网关参数句柄
SCPara RS485通讯参数句柄
* 返 回 值: 无
*****************************************************************************************/
static void InSideCmdHandler(uint8_t *rData, uint16_t rLen, GateWayPara GateWay, SensorCommPara SCPara)
{
uint16_t crc16, Check;
uint8_t *Payload;
pUpdateFrameHeader IFHeader = (pUpdateFrameHeader)rData;
/*CRC校验*/
Check = CRC_Modbus(CRC16_BASE, rData, rLen - 2);
crc16 = (rData[rLen - 1] << 8) | rData[rLen - 2];
if(Check != crc16) {
Debug_Printf("Inside CRC Err...\r\n");
return;
}
/*检查设备MAC是否匹配(支持广播0xFF)*/
bool isMatch = false;
for(int i = 0; i < 6; i++) {
if(IFHeader->DevMac[i] != GateWay->ConfigPara.GwMac[i]) {
if(IFHeader->DevMac[i] == 0xFF) {
isMatch = true;
break;
}
break;
}
else {
isMatch = true;
}
}
if(!isMatch) {
Debug_Printf("Inside MAC Err...\r\n");
return;
}
Payload = &rData[sizeof(UpdateFrameHeader_t)];
s_InsidePayLen = IFHeader->PayloadLen;
switch((INSIDE_CMD_M)IFHeader->Cmd) {
case INSIDE_CMD_UPDATE: {
/*保存升级数据并进入升级状态*/
memcpy(s_InsidePay, Payload, s_InsidePayLen);
s_InStatus = IN_STATUS_UPDATE;
break;
}
default:
break;
}
}
/*****************************************************************************************
* 函数名称: InSideLoopHandler
* 功能描述: 内部指令状态机处理函数
* 参 数: GateWay 网关参数句柄
SCPara RS485通讯参数句柄
* 返 回 值: 无
*****************************************************************************************/
static void InSideLoopHandler(GateWayPara GateWay, SensorCommPara SCPara)
{
switch(s_InStatus) {
case IN_STATUS_IDLE: {
break;
}
case IN_STATUS_UPDATE: {
/*调用升级处理函数*/
Update(s_InsidePay);
memset(s_InsidePay, 0, sizeof(s_InsidePay));
s_InStatus = IN_STATUS_IDLE;
break;
}
}
}
-59
View File
@@ -1,59 +0,0 @@
#include "Update.h"
#include "main.h"
#include "bsp.h"
#include <rtthread.h>
/*Boot参数存储地址定义*/
#define BOOT_PARA_ADDR FLASH_BINFO_BASE
/*****************************************************************************************
* 函数名称: Update
* 功能描述: 固件升级 - 此函数在解析到升级指令时调用
* 参 数: PayLoad 协议负载,需去除帧头等信息,只传负载数据
* 返 回 值: 无
*****************************************************************************************/
void Update(uint8_t *PayLoad)
{
UpDataRequset_t Req;
boot_para_t cfg = {0};
memcpy(&Req, PayLoad, sizeof(UpDataRequset_t));
cfg.AppFlag = 0;
cfg.UpdateFlag = APP_UPDATE_FLAG;
cfg.Crc32Check = Req.AppCrc32;
cfg.PackageNum = Req.PackageNum;
cfg.AppSize = Req.AppSize;
Debug_Printf("Receive upgrade command:\r\n");
Debug_Printf("PackageNum: %d\r\n", cfg.PackageNum);
Debug_Printf("AppSize: %d\r\n", cfg.AppSize);
Debug_Printf("AppCrc32: 0x%08x\r\n", cfg.Crc32Check);
Debug_Printf("System Reset!\r\n");
/*保存启动参数到Flash*/
dev_boot_write_param(cfg);
/*延时后复位*/
rt_thread_mdelay(200);
NVIC_SystemReset();
}
/*****************************************************************************************
* 函数名称: UpdateInit
* 功能描述: 升级参数初始化 - 需要在程序启动,外设初始化完后调用
* 参 数: 无
* 返 回 值: 无
*****************************************************************************************/
void UpdateInit(void)
{
boot_para_t cfg = {0};
/*读取启动参数*/
dev_boot_read_param(&cfg);
/*如果是首次运行,设置APP启动标志*/
if(cfg.AppFlag != APP_START_FLAG) {
cfg.AppFlag = APP_START_FLAG;
dev_boot_write_param(cfg);
}
}
+1 -7
View File
@@ -178,7 +178,7 @@ void GateWayInit(void)
GateWay.ConfigPara.Rs485Ch1.Power = false;
GateWay.ConfigPara.Rs485Ch2.Enable = true;
GateWay.ConfigPara.Rs485Ch2.BaudRate = 500000;
GateWay.ConfigPara.Rs485Ch2.UpgradeEnable = true; // 启用Ch2升级
GateWay.ConfigPara.Rs485Ch2.UpgradeEnable = false;
GateWay.ConfigPara.Rs485Ch2.CommUnitEnable = false;
GateWay.ConfigPara.Rs485Ch2.Power = false;
GateWay.ConfigPara.Rs485Ch1.RS485Send = RS485Ch1UartSend;
@@ -394,9 +394,6 @@ int main(void)
GateWay.CommUnitRevCallBack = CommUnitAnalyze;
GateWay.SvrRevCallBack = Cat1EthRevCallBack;
/*启用Cat1/LAN通道升级功能*/
Cat1UpgradeSetEnable(true);
GateWay.NetSendData_MQ = rt_mq_create("NetSendMQ", 512, 10, RT_IPC_FLAG_FIFO);
if(GateWay.NetSendData_MQ == RT_NULL) {
rt_kprintf("CatOne MQ Create Failed!\r\n");
@@ -431,9 +428,6 @@ int main(void)
rt_thread_startup(Debug_Thread);
else
return -1;
/*启用Debug通道升级功能*/
DebugUpgradeSetEnable(true);
Cat1Eth_Thread = rt_thread_create("Cat1Eth", CatOne_Eth_Thread_Entry, &GateWay, 4096, 3, 20);
if (Cat1Eth_Thread != RT_NULL)