feat: 新增激光定时关闭与姿态角持续输出测试功能,编码转UTF-8

1. 激光定时自动关闭:默认10分钟,laser on启动计时,超时自动关并上报
2. laser time <min>可配置定时分钟数,0=关闭定时
3. att on/off持续输出姿态角(Pitch/Roll/Yaw),不注册不低功耗
4. 20个源文件从GB2312编码转为UTF-8 with BOM
This commit is contained in:
2026-07-20 17:04:48 +08:00
parent 70758b1c06
commit 72844ff821
20 changed files with 1388 additions and 1260 deletions
+92 -61
View File
@@ -1,4 +1,4 @@
/******************************************************************************
* Include files
******************************************************************************/
@@ -20,17 +20,17 @@ extern uint32_t CommWay;
extern uint32_t DeviceSign;
extern uint32_t AddNumber;
extern uint8_t LocalMAC[6]; //本机MAC地址
extern uint8_t GatewayMAC[6]; //网关MAC地址,注册时全为0
extern uint8_t LocalDataPack[sizeof(SGCP.DevData.LaserTracing)]; //本机数据包 //本机数据包
extern uint8_t LocalMAC[6]; //本机MAC地址
extern uint8_t GatewayMAC[6]; //网关MAC地址,注册时全为0
extern uint8_t LocalDataPack[sizeof(SGCP.DevData.LaserTracing)]; //本机数据包 //本机数据包
bool MainDispEn = true;
bool DataDispEn = true;
/*****************************************************************************************
* 函数名称: MainDBGOnOff
* 功能描述: 主调试信息开关函数
* 参 数: OnOff,开关
* 返 回 值: 无
* 函数名称: MainDBGOnOff
* 功能描述: 主调试信息开关函数
* 参 数: OnOff,开关
* 返 回 值: 无
*****************************************************************************************/
void MainDBGOnOff(bool OnOff)
{
@@ -41,10 +41,10 @@ void MainDBGOnOff(bool OnOff)
DBG_LOG("\r\nMain Display Disable!\r\n\r\n");
}
/*****************************************************************************************
* 函数名称: DataDBGOnOff
* 功能描述: 数据信息开关函数
* 参 数: OnOff,开关
* 返 回 值: 无
* 函数名称: DataDBGOnOff
* 功能描述: 数据信息开关函数
* 参 数: OnOff,开关
* 返 回 值: 无
*****************************************************************************************/
void DataDBGOnOff(bool OnOff)
{
@@ -82,17 +82,17 @@ static void AppInit(void)
LocalMAC[i] = *((volatile const uint8_t *)(0x00002800 + i));
}
memcpy(&App.Para.BLPara.DevMac, &LocalMAC[0], 6);
LocalType = (App.Para.BLPara.DevMac[0] | (App.Para.BLPara.DevMac[1] << 8)); //本机设备类型
CommWay = App.Para.BLPara.DevMac[2]; //本机通讯方式
DeviceSign = App.Para.BLPara.DevMac[3] & 0x80; //本机设备标志
AddNumber = ((App.Para.BLPara.DevMac[3] << 16)+ (App.Para.BLPara.DevMac[4] << 8) + App.Para.BLPara.DevMac[5]) - 0x800000; //本机地址编号,数字部分对应唯一地址编号
LocalType = (App.Para.BLPara.DevMac[0] | (App.Para.BLPara.DevMac[1] << 8)); //本机设备类型
CommWay = App.Para.BLPara.DevMac[2]; //本机通讯方式
DeviceSign = App.Para.BLPara.DevMac[3] & 0x80; //本机设备标志
AddNumber = ((App.Para.BLPara.DevMac[3] << 16)+ (App.Para.BLPara.DevMac[4] << 8) + App.Para.BLPara.DevMac[5]) - 0x800000; //本机地址编号,数字部分对应唯一地址编号
#else
LocalType = LASER_TRACING; //本机设备类型
CommWay = LORA; //本机通讯方式
DeviceSign = MASTER; //本机设备标志
AddNumber = 0x000023 + DeviceSign;//本机地址编号,数字部分对应唯一地址编号
LocalType = LASER_TRACING; //本机设备类型
CommWay = LORA; //本机通讯方式
DeviceSign = MASTER; //本机设备标志
AddNumber = 0x000023 + DeviceSign;//本机地址编号,数字部分对应唯一地址编号
App.Para.BLPara.LoraFreq = CH0;
LocalMAC[0] = LocalType & 0xFF; //本机MAC地址
LocalMAC[0] = LocalType & 0xFF; //本机MAC地址
LocalMAC[1] = (LocalType >> 8) & 0xFF;
LocalMAC[2] = CommWay;
LocalMAC[3] = (AddNumber >> 16) & 0xFF;
@@ -104,7 +104,7 @@ static void AppInit(void)
if(App.Para.FactoryFlag != 0x00)
{
App.Para.FactoryFlag = 0x00;
/*校准参数初始化*/
/*校准参数初始化*/
App.Para.CaliPara.PitchZero = 0;
App.Para.CaliPara.RollZero = 0;
App.Para.CaliPara.YawZero = 0;
@@ -137,7 +137,7 @@ static void AppInit(void)
if(App.Para.BLPara.LoraFreq < 410000000 || App.Para.BLPara.LoraFreq > 525000000)
App.Para.BLPara.LoraFreq = CH0;
App.Para.Lora.FreqCent = App.Para.BLPara.LoraFreq;
SX1276LoRaWriteFreq(App.Para.Lora.FreqCent); //Lora频率:433100000ul + 200000*N
SX1276LoRaWriteFreq(App.Para.Lora.FreqCent); //Lora频率:433100000ul + 200000*N
if(App.Para.Rs485Ch1.Addr > 16 || App.Para.Rs485Ch1.Addr < 1){
App.Para.Rs485Ch1.Addr = 1;
@@ -159,10 +159,10 @@ static void AppInit(void)
}
SAVE_APP_PARA((uint32_t *)&App.Para);
LpUart0Init(App.Para.Rs485Ch1.BaudRate);//低功耗串口初始化
LpUart0Init(App.Para.Rs485Ch1.BaudRate);//低功耗串口初始化
LORAIntEnable();
LoraInit(); //< LORA芯片初始化
LoraInit(); //< LORA芯片初始化
FeedDog();
Lsm6dslInit();
@@ -173,7 +173,7 @@ static void AppInit(void)
LPTimer0_OFF();
uint32_t seed = 0;//< 随机数初始化
uint32_t seed = 0;//< 随机数初始化
seed = seed + LocalMAC[2];
seed = (seed << 8) + LocalMAC[3];
seed = (seed << 8) + LocalMAC[4];
@@ -194,10 +194,10 @@ static void AppInit(void)
App.LoginFlag = false;
App.Login_RTC = false;
App.Login_LPTimer0 = true;
//LPTimer0_ON((App.Nonce % 1200) + 300);//定时30s+随机2分钟,最小间隙100ms
LPTimer0_ON(50);//5秒后注册
MAIN_DBG_LOG("Login LPTimer0 Open\r\n");
//LPTimer0_ON((App.Nonce % 1200) + 300);//定时30s+随机2分钟,最小间隙100ms
LPTimer0_ON(50);//5秒后注册
SGCP.LaserTimerMinutes = 10; //激光定时关闭默认10分钟
SGCP.LaserTimerCount = 0;
App.Upload45S10SCount = 0;
App.UploadFlag = false;
App.Upload_LPTimer0 = false;
@@ -282,7 +282,7 @@ static void ReadDataLoopHandler(void)
RollDiff = App.ConvertedData.Roll - App.Para.CaliPara.RollZero;
if((PitchDiff > ERINTERVAL_VPT) || (RollDiff > ERINTERVAL_VPT))
{
//触发紧急上报
//触发紧急上报
App.ERFlag = true;
DATA_DBG_LOG("PitchDiff=%04d, PitchDiff=%04d\r\n", PitchDiff,RollDiff);
DATA_DBG_LOG("Start emergency reporting!\r\n");
@@ -300,7 +300,7 @@ static void ReadDataLoopHandler(void)
SGCP.DevData.LaserTracing.MasterDev.BatLevel = 0x00;
#endif
#if (SGCP_SELECT == 1 || SGCP_SELECT == 2)
SX1276LoCalcRssiSnr(&SGCP.DevData.LaserTracing.MasterDev.RSSI, &SGCP.DevData.LaserTracing.MasterDev.Nsr);//获取信号强度
SX1276LoCalcRssiSnr(&SGCP.DevData.LaserTracing.MasterDev.RSSI, &SGCP.DevData.LaserTracing.MasterDev.Nsr);//获取信号强度
#else
SGCP.DevData.LaserTracing.MasterDev.RSSI = 0x00;
SGCP.DevData.LaserTracing.MasterDev.Nsr = 0x00;
@@ -308,7 +308,7 @@ static void ReadDataLoopHandler(void)
memcpy(LocalDataPack, &SGCP.DevData.LaserTracing, sizeof(LocalDataPack));
DATA_DBG_LOG("<------------ Sensor Data Upda End ------------> \r\n");
//App.RDStatus = READDATA_STATUS_UPDAING;//持续工作
//App.RDStatus = READDATA_STATUS_UPDAING;//持续工作
App.RDStatus = READDATA_STATUS_IDLE;
App.UpdateOk = true;
break;}
@@ -333,7 +333,7 @@ static void AppLoopHandler(void)
case APP_STATUS_ON:{
if(App.TD1mSDelayCnt <= 0){
App.TD1mSDelayCnt = 300;//唤醒后待机时间
App.TD1mSDelayCnt = 300;//唤醒后待机时间
App.Status = APP_STATUS_ACTION;
}
break;}
@@ -348,15 +348,15 @@ static void AppLoopHandler(void)
if(SGCP.InStatus != IN_STATUS_IDLE){
break;
}
else if(SGCP.LoginOk == false && App.LoginFlag == true && SGCP.GWStatus == GW_STATUS_IDLE)//设备注册
else if(SGCP.LoginOk == false && App.LoginFlag == true && SGCP.GWStatus == GW_STATUS_IDLE)//设备注册
{
PrintfMess();
App.LoginFlag = false;
LPTimer0_OFF();//关闭低功耗定时器
SGCP.GWStatus = GW_STATUS_LOGIN;//注册
LPTimer0_OFF();//关闭低功耗定时器
SGCP.GWStatus = GW_STATUS_LOGIN;//注册
App.Status = APP_STATUS_WAIT_LOGIN;
}
else if(SGCP.TimingAcquisition == true && App.RDStatus == READDATA_STATUS_IDLE)//设备数据获取
else if(SGCP.TimingAcquisition == true && App.RDStatus == READDATA_STATUS_IDLE)//设备数据获取
{
PrintfMess();
SGCP.TimingAcquisition = false;
@@ -368,23 +368,28 @@ static void AppLoopHandler(void)
{
PrintfMess();
App.UploadFlag = false;
LPTimer0_OFF();//关闭低功耗定时器
SGCP.GWStatus = GW_STATUS_UPLOAD_SENSOR;//上传
LPTimer0_OFF();//关闭低功耗定时器
SGCP.GWStatus = GW_STATUS_UPLOAD_SENSOR;//上传
App.Status = APP_STATUS_WAIT_UPLOAD;
}
else if(SGCP.LaserOnOff == true && SGCP.LaserTimerCount == 0 && SGCP.GWStatus == GW_STATUS_IDLE)
{
SGCP.LaserOnOff = false;
SGCP.GWStatus = GW_STATUS_LASER_STARES;
}
else if(App.RDStatus == READDATA_STATUS_IDLE
&& SGCP.GWStatus == GW_STATUS_IDLE
&& SGCP.InStatus == IN_STATUS_IDLE
&& SGCP.TimingAcquisition == false
&& App.TD1mSDelayCnt == 0
&& App.ReadData1mSDelayCnt == 0
&& SGCP.LaserOnOff == false)
&& SGCP.LaserOnOff == false
&& App.AttTestMode == false)
{
//App.Status = APP_STATUS_ACTION;//持续工作
//App.Status = APP_STATUS_ACTION;
App.Status = APP_STATUS_OFF;
}
break;}
case APP_STATUS_WAIT_LOGIN:{
if(SGCP.LoginMess == true)
{
@@ -398,14 +403,14 @@ static void AppLoopHandler(void)
MAIN_DBG_LOG("Login RTC Open\r\n");
App.Login2Min30SCount = 0;
App.Login30MinCount = 0;
App.Login_RTC = true;//启动30分注册定时器
App.Login_RTC = true;//启动30分注册定时器
}
else
{
PrintfMess();
App.Login_LPTimer0 = true;
LPTimer0_ON((App.Nonce % 1200) + 300);//定时30s+随机2分钟,最小间隙100ms
//LPTimer0_ON(100);//定时10s
LPTimer0_ON((App.Nonce % 1200) + 300);//定时30s+随机2分钟,最小间隙100ms
//LPTimer0_ON(100);//定时10s
MAIN_DBG_LOG("Number of registration failures:%d\r\n",App.Login2Min30SCount);
MAIN_DBG_LOG("Login LPTimer0 Open\r\n");
}
@@ -443,8 +448,8 @@ static void AppLoopHandler(void)
{
PrintfMess();
App.Upload_LPTimer0 = true;
LPTimer0_ON((App.Nonce % 100) + 450);//随机延时100~10000ms+45秒后重新发送
//LPTimer0_ON(100);//定时10s
LPTimer0_ON((App.Nonce % 100) + 450);//随机延时100~10000ms+45秒后重新发送
//LPTimer0_ON(100);//定时10s
MAIN_DBG_LOG("Number of failed uploads:%d\r\n",App.Upload45S10SCount);
MAIN_DBG_LOG("Upload LPTimer0 Open\r\n");
}
@@ -468,6 +473,8 @@ static void App1mSRoutine(void)
if(App.ReadData1mSDelayCnt > 0)
App.ReadData1mSDelayCnt--;
App.FeedDogDlyCnt++;
if(App.AttTestMode == true && App.AttTestCnt > 0)
App.AttTestCnt--;
}
void FeedDogHandler(void)
@@ -480,7 +487,7 @@ void FeedDogHandler(void)
void SystemResetHandler(void)
{
//系统定时重启
//系统定时重启
if(App.SysResetTimeCnt > SYSTEM_TIMING_LOGIN) {
delay_ms(5);
SystemReset();
@@ -500,7 +507,7 @@ void SystemResetHandler(void)
int32_t main(void)
{
BspInit();
delay_ms(3000);//上电延时,等待从设备启动
delay_ms(3000);//上电延时,等待从设备启动
AppInit();
DBG_LOG("\r\n\r\n");
@@ -530,10 +537,29 @@ int32_t main(void)
GwRevLoopHandler();
InRevLoopHandler();
AppLoopHandler();
#if(USE_DEBUG == 1)
if(App.AttTestMode == true)
{
if(App.AttTestCnt == 0)
{
App.AttTestCnt = 200;
SGCP.TimingAcquisition = true;
}
if(App.UpdateOk == true)
{
App.UpdateOk = false;
DBG_LOG("Pitch:%.1f Roll:%.1f Yaw:%.1f\r\n",
App.ConvertedData.Pitch / 10.0,
App.ConvertedData.Roll / 10.0,
App.ConvertedData.Yaw / 10.0);
}
}
#endif
}
}
/*******************************************************************************
* 中断回调函数
* 中断回调函数
******************************************************************************/
void SysTick_CallBack(void)
{
@@ -546,20 +572,20 @@ void SysTick_CallBack(void)
void RtcIRQHander(void)
{
//SGCP.TimingAcquisition = true; //30S更新一次数据
//SGCP.TimingAcquisition = true; //30S更新一次数据
if(SGCP.LoginOk == true)
{
App.RepeLoginCount++;
if(App.RepeLoginCount >= SYSTEM_TIMING_LOGIN){
MAIN_DBG_LOG("24h Repetition Login\r\n");
App.RepeLoginCount = 0;
SGCP.LoginOk = false;//24h重复注册
SGCP.LoginOk = false;//24h重复注册
App.Login2Min30SCount = 0;
App.Login30MinCount = 0;
App.Login_RTC = false;//关闭30分注册定时器
App.Login_RTC = false;//关闭30分注册定时器
App.Login_LPTimer0 = true;
LPTimer0_ON((App.Nonce % 1200) + 300);//定时30s+随机2分钟,最小间隙100ms
LPTimer0_ON((App.Nonce % 1200) + 300);//定时30s+随机2分钟,最小间隙100ms
MAIN_DBG_LOG("Login LPTimer0 Open\r\n");
}
@@ -567,7 +593,7 @@ void RtcIRQHander(void)
if(App.Coll_N >= App.Para.Layout.CollectTime)
{
App.Coll_N = 0;
SGCP.TimingAcquisition = true; //定时更新数据
SGCP.TimingAcquisition = true; //定时更新数据
}
if(App.ERFlag == true)
@@ -583,7 +609,7 @@ void RtcIRQHander(void)
{
App.ERTime_N = 0;
App.ERFlag = false;
SGCP.MasterCaliOk = true;//紧急上报时间结束,重新校准参数
SGCP.MasterCaliOk = true;//紧急上报时间结束,重新校准参数
}
}
else{
@@ -599,19 +625,24 @@ void RtcIRQHander(void)
if(App.Login_RTC == true)
{
App.Login30MinCount++;
if(App.Login30MinCount >= ERR_TIMING_LOGIN)//30分钟重置注册错误信息
if(App.Login30MinCount >= ERR_TIMING_LOGIN)//30分钟重置注册错误信息
{
PrintfMess();
App.Login30MinCount = 0;
App.Login_RTC = false;//关闭30分注册定时器
App.Login_RTC = false;//关闭30分注册定时器
MAIN_DBG_LOG("Login RTC Close\r\n");
App.Login_LPTimer0 = true;
LPTimer0_ON((App.Nonce % 1200) + 300);//定时30s+随机2分钟,最小间隙100ms
//LPTimer0_ON(100);//定时10s
LPTimer0_ON((App.Nonce % 1200) + 300);//定时30s+随机2分钟,最小间隙100ms
//LPTimer0_ON(100);//定时10s
MAIN_DBG_LOG("Login LPTimer0 Open\r\n");
}
}
if(SGCP.LaserOnOff == true && SGCP.LaserTimerCount > 0)
{
SGCP.LaserTimerCount--;
}
}
void LPTimer0IRQHander(void)
{