Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b75df5e0fc |
@@ -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 分支
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
Submodule Project/GateWay/source/Module/GateWay_Debug updated: 5c414595cc...a57b9ddf31
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user