From b30026ab8adb4baa197a90e5fd117a03fd0128d8 Mon Sep 17 00:00:00 2001
From: chen <15335560115@163.com>
Date: 星期三, 23 七月 2025 14:01:08 +0800
Subject: [PATCH] 初步增加新的lora网关升级功能,但lora功率不对,不可用的测试版

---
 keil/include/src/Radio/lora_1268.c |  285 ++++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 251 insertions(+), 34 deletions(-)

diff --git a/keil/include/src/Radio/lora_1268.c b/keil/include/src/Radio/lora_1268.c
index 24e793f..38c28fd 100644
--- a/keil/include/src/Radio/lora_1268.c
+++ b/keil/include/src/Radio/lora_1268.c
@@ -15,6 +15,7 @@
 #include "HIDO_TypeDef.h"
 #include "PCA9555.h"
 #include "mk_misc.h"
+#include "mk_flash.h"
 /********************************************结构体**************************************************************/
 typedef enum
 {
@@ -158,6 +159,7 @@
     lora_sendbuffer[HB_LORAPOWER_IDX] = g_com_map[LORA_POWER];//将距离校准改为了TX发射功率设置
     checksum = Checksum_u16(lora_sendbuffer,14);
     memcpy(&lora_sendbuffer[14],&checksum,2);	
+	LOG_INFO(TRACE_MODULE_APP, "进入send3\r\n");
     Radio.Send(lora_sendbuffer,16);
 		
 /*****************************心跳包上传内容*************************************/	
@@ -180,7 +182,7 @@
 extern uint16_t REV_RX_NUM;
 extern uint16_t REV_POLL_NUM;
 extern uint16_t REPLY_POLL_NUM;
-uint16_t num[3]={0,0,0};
+uint8_t num[3]={1,2,0};
 extern uint8_t stationary_flag;
 extern uint8_t SOS_KEY_STATE;
 uint32_t LORA_POLL_COUNT=0;
@@ -203,13 +205,15 @@
     //  wg_report_freq = REPORT_MANGE_CHANNEL_FRQ;
 	//LOG_INFO(TRACE_MODULE_APP," 切换2\r\n");
 	//test1++;
-    SwitchLoraSettings(wg_report_freq,REPORT_CHANNEL_SF,22);
-    if(heatbeat_count++>HEATBEAT_UPDATE_TIME && WG_Connected == wg_state) //如果心跳包到达上传时间,并且网关处于链接状态,就上传心跳包
-    {
-        heatbeat_count = 0;
-        LoraHeartBeartPoll();
-        return;
-    }
+//	LOG_INFO(TRACE_MODULE_APP," 切换9\r\n");
+    //SwitchLoraSettings(wg_report_freq,REPORT_CHANNEL_SF,22);
+	SwitchLoraSettings(478,7,22);
+//    if(heatbeat_count++>HEATBEAT_UPDATE_TIME && WG_Connected == wg_state) //如果心跳包到达上传时间,并且网关处于链接状态,就上传心跳包
+//    {
+//        heatbeat_count = 0;
+//        LoraHeartBeartPoll();
+//        return;
+//    }
     for(uint16_t i=0; i<report_ancnum-1; i++)
     {
         for(uint16_t j=0; j<report_ancnum-1-i; j++)
@@ -256,9 +260,12 @@
     memcpy(&lora_sendbuffer[ANCID_IDX+report_ancnum*2],report_ancdist,report_ancnum*2);
     checksum = Checksum_u16(lora_sendbuffer,4*report_ancnum+ANCID_IDX);
     memcpy(&lora_sendbuffer[ANCID_IDX+report_ancnum*4],&checksum,2);
-	//	test2++;
-    Radio.Send(lora_sendbuffer,ANCID_IDX+report_ancnum*4+2);
-
+		
+	//	test2++;   num
+//	LOG_INFO(TRACE_MODULE_APP," 切换8\r\n");
+	//SwitchLoraSettings(wg_report_freq,REPORT_CHANNEL_SF,22);
+   // Radio.Send(lora_sendbuffer,ANCID_IDX+report_ancnum*4+2);
+   Radio.Send(num,3);
 
 }
 
@@ -298,6 +305,7 @@
         checksum = Checksum_u16(lora_sendbuffer,11+data_length);
         memcpy(&lora_sendbuffer[11+data_length],&checksum,2);
 //        LORA_3029_SINGLE_SEND(lora_sendbuffer,data_length+13,0);
+	LOG_INFO(TRACE_MODULE_APP, "进入send2\r\n");
 				Radio.Send(lora_sendbuffer,data_length+13);
 	      //++;
   //  Delay_Ms(100);
@@ -316,6 +324,7 @@
 	memcpy(&lora_sendbuffer[7], &g_com_map[index/2], data_length);
 	checksum = Checksum_u16(lora_sendbuffer,9+data_length);
 	memcpy(&lora_sendbuffer[9+data_length],&checksum,2);
+	LOG_INFO(TRACE_MODULE_APP, "进入send1\r\n");
 	Radio.Send(lora_sendbuffer,data_length+11);
 LOG_INFO(TRACE_MODULE_APP, "进入回复\r\n");
   //LORA_3029_SINGLE_SEND(lora_sendbuffer,data_length+11,0);
@@ -466,6 +475,214 @@
 extern uint16_t set_mk_time;
 extern mk_send_message_to_BLE(void);
 uint8_t tt4=1;
+uint32_t Zhongjian_data[60];
+uint8_t send_lora_data[250];
+uint16_t rec_wenjian_daxiao;
+uint8_t huifushengjibaoerror_num;
+uint8_t muqiandeshengjibao;
+uint8_t final_bag_num;
+uint16_t wangguan_up_id;
+uint16_t testflag;
+uint16_t current_count1,target_count1,start_count1;
+int16_t end_count1;
+uint8_t start_wait_flag;
+/**
+  * @brief  Update CRC16 for input byte
+  * @param  CRC input value 
+  * @param  input byte
+  * @retval Updated CRC value
+  */
+uint16_t UpdateCRC16(uint16_t crcIn, uint8_t byte)
+{
+  uint32_t crc = crcIn;
+  uint32_t in = byte|0x100;
+
+  do
+  {
+    crc <<= 1;
+    in <<= 1;
+
+    if(in&0x100)
+    {
+      ++crc;
+    }
+    
+    if(crc&0x10000)
+    {
+      crc ^= 0x1021;
+    }
+ } while(!(in&0x10000));
+
+ return (crc&0xffffu);
+}
+
+/**
+  * @brief  Cal CRC16 for YModem Packet
+  * @param  data
+  * @param  length
+  * @retval CRC value
+  */
+uint16_t Cal_CRC16(const uint8_t* data, uint32_t size)
+{
+  uint32_t crc = 0;
+  const uint8_t* dataEnd = data+size;
+  
+  while(data<dataEnd)
+  {
+    crc = UpdateCRC16(crc,*data++);
+  }
+  crc = UpdateCRC16(crc,0);
+  crc = UpdateCRC16(crc,0);
+
+  return (crc&0xffffu);
+}
+void LoraUp_Poll()
+{    uint16_t  result ;
+    uint16_t crc16;
+    if(shengji_flag)
+    {
+//    memcpy(&wangguan_up_id,&RX_Buffer[SOURCE_ID_IDX],2);//网关ID 占用2个字节
+    send_lora_data[MSG_TYPE_IDX]=LORA_MSGTYPE_UPDATE_CONFIRM;
+    memcpy(&send_lora_data[SOURCE_ID_IDX],&dev_id,2);//网关ID 占用2个字节
+    memcpy(&send_lora_data[DEST_ID_IDX],&wangguan_up_id,2);//标签或者基站的设备ID 2个字节
+//    send_lora_data[MUQIAN_BAG]=0xFF;
+    crc16=Checksum_u16(send_lora_data,6);
+    memcpy(&send_lora_data[6],&crc16,2);
+    huifushengjibao_flag=0;
+    LoraUp_flag=1;
+    Radio.Send(send_lora_data,8);//基站发送升级确认回复
+    delay_ms(1000); 
+LOG_INFO(TRACE_MODULE_APP," 切换7\r\n");			
+   // SwitchLoraSettings(LORA_UPCHANNEL_FRQ,LORA_UPCHANNEL_SF,22); //切换lora升级频点  
+    delay_ms(200);   
+    __disable_irq();
+//    FLASH_Read(APP_1OR2_ADRESS,(uint8_t*)&app1_or_app2,2);        
+    final_bag_num=(rec_wenjian_daxiao/220)+1;//计算一共要请求多少包   
+        while(1)
+        {
+            //FLASH_Prepare(APP2_ADRESS, APP_SIZE); //删除上一次app为下次做准备
+						testflag=flash_erase(FLASH_ID0,APP2_ADRESS,APP_SIZE);//删除100kAPP2空间为下面做准备
+            delay_ms(500);
+            if(testflag==0)
+            {break;}
+        }
+//    FLASH_Write(APP2_ADRESS, (const uint8_t*)&tmp111, 2);    
+    __enable_irq();             
+    while(1)
+    {
+        if(huifushengjibao_flag==1)
+        {lora_up_rec_flag=1;
+            while(1)
+            {
+                send_lora_data[MSG_TYPE_IDX]=LORA_MSGTYPE_UPDATEFILE_REQUEST;
+                memcpy(&send_lora_data[SOURCE_ID_IDX],&dev_id,2);//网关ID 占用2个字节
+                memcpy(&send_lora_data[DEST_ID_IDX],&wangguan_up_id,2);//标签或者基站的设备ID 2个字节
+                send_lora_data[MUQIAN_BAG]=muqiandeshengjibao;
+                crc16=Checksum_u16(send_lora_data,7);
+                memcpy(&send_lora_data[7],&crc16,2);
+                lora_up_rec_flag=0;    
+                Radio.Send(send_lora_data,9);//基站发送请求第x包
+							
+                /*重写超时逻辑
+                start_count1=HAL_LPTIM_ReadCounter(&hlptim1);     //等待接收完成直到超时
+                end_count1=start_count1+32768/2;//500ms等待
+                if(end_count1>=32768)
+                {end_count1-=32768;}
+                current_count1=HAL_LPTIM_ReadCounter(&hlptim1);
+                while(!lora_up_rec_flag)
+                {
+                    current_count1=HAL_LPTIM_ReadCounter(&hlptim1);
+                    if(current_count1>=end_count1&&current_count1<end_count1+15000)
+                    {
+                    break;
+                    }
+                    delay_ms(100);
+                    if(lora_up_rec_flag)
+                    {break;}
+                    Radio.Send(send_lora_data,9);
+                }
+								 重写超时逻辑 */
+								 
+								 start_wait_flag=1;
+								 end_count1=2;
+								  while(!lora_up_rec_flag)
+                {
+									if(start_wait_flag==0)
+									{
+									break;
+									}
+									  delay_ms(100);
+                    if(lora_up_rec_flag)
+                    {break;}
+                    Radio.Send(send_lora_data,9);
+								}
+//                while(1);
+                if(lora_up_rec_flag)
+                {   uint16_t result12;
+                    //HAL_IWDG_Refresh(&hiwdg);//未修改喂狗
+                     crc16=Cal_CRC16(RX_Buffer,DATA_IDX+ONE_BAG_DAXIAO);
+                    __disable_irq();
+                     if(muqiandeshengjibao==RX_Buffer[MUQIAN_BAG]&&!memcmp(&crc16,&RX_Buffer[DATA_IDX+ONE_BAG_DAXIAO],2)&&!memcmp(&dev_id,&RX_Buffer[DEST_ID_IDX],2)&& !memcmp(&wangguan_up_id,&RX_Buffer[SOURCE_ID_IDX],2))
+                     {
+                     memcpy(Zhongjian_data,&RX_Buffer[DATA_IDX],ONE_BAG_DAXIAO);
+                     result12=flash_write_nbytes(FLASH_ID0,APP2_ADRESS+ONE_BAG_DAXIAO*RX_Buffer[MUQIAN_BAG],(uint8_t*)Zhongjian_data,ONE_BAG_DAXIAO);
+											// flash_write_nbytes(FLASH_ID0, FLASH_IAP_CTRL_MAP, (const uint8_t*)g_com_map, sizeof(g_com_map));
+                     while(result12==0)
+                     {
+                     result12=flash_write_nbytes(FLASH_ID0,APP2_ADRESS+ONE_BAG_DAXIAO*RX_Buffer[MUQIAN_BAG],(uint8_t*)Zhongjian_data,ONE_BAG_DAXIAO);
+                     delay_ms(10);    
+                     }                         
+                     if(result12)
+                     muqiandeshengjibao++;   
+                     }
+                     __enable_irq();
+                }
+                else
+                {
+                    //HAL_IWDG_Refresh(&hiwdg);//未修改喂狗
+                    huifushengjibaoerror_num++;
+                    if(huifushengjibaoerror_num>=20)
+                    {
+                    huifushengjibaoerror_num=0;    
+                    muqiandeshengjibao=0;
+                    delay_ms(500);
+                    //HAL_NVIC_SystemReset();//修改重启
+										sys_reset(0);											
+                    break;
+                    }   
+                }
+                if(muqiandeshengjibao==final_bag_num)
+                {
+                uint16_t tmp11 ,result11;
+                    tmp11=0XCC;
+									result11=flash_erase(FLASH_ID0,APP_1OR2_ADRESS,FLASH_SECTOR_SIZE);//删除标志位所在区域
+                if(!result11)
+                result11 = flash_write_nbytes(FLASH_ID0,APP_1OR2_ADRESS, (const uint8_t*)&tmp11, 2);//更新标志位
+                __disable_irq();                
+                delay_ms(1500);
+                //HAL_NVIC_SystemReset();//修改重启
+										sys_reset(0);
+                }
+            }
+        }
+        else
+        {
+        delay_ms(500);
+//        huifushengjibao_flag=0;
+        Radio.Send(send_lora_data,8);//基站发送升级确认回复
+        huifushengjibaoerror_num++;
+            if(huifushengjibaoerror_num>=5)
+            {
+            huifushengjibaoerror_num=0;  
+						delay_ms(500);
+						sys_reset(0);      
+            break;
+            }                
+        }
+    }
+  }
+}
+uint8_t imu_enable;
 void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr )
 {  
 				uint16_t checksum1;
@@ -570,22 +787,22 @@
 															break; 
 												case WGRSP_RWTAG_UPDATE:
 												rec_index = RX_Buffer[PWTAG_WRITE_IDX_IDX];
-//												switch(rec_index)
-//												{
-//														case 0xaa:  //升级下发
-//														memcpy(&rec_wenjian_daxiao,&RX_Buffer[WRITEPARA_VALUE_IDX],2);//文件大小
-//														if(rec_wenjian_daxiao>0XAC00||rec_wenjian_daxiao==0)
-//														{}//文件过大,超出范围
-//														else
-//														{
-//																memcpy(&wangguan_up_id,&RX_Buffer[SOURCE_ID_IDX],2);//网关ID 占用2个字节
-//																shengji_flag=1;
-//																LoraUp_flag=1;   
+												switch(rec_index)
+												{
+														case 0xaa:  //升级下发
+														memcpy(&rec_wenjian_daxiao,&RX_Buffer[WRITEPARA_VALUE_IDX],2);//文件大小
+														if(rec_wenjian_daxiao>0XAC00||rec_wenjian_daxiao==0)
+														{}//文件过大,超出范围
+														else
+														{
+																memcpy(&wangguan_up_id,&RX_Buffer[SOURCE_ID_IDX],2);//网关ID 占用2个字节
+																shengji_flag=1;
+																LoraUp_flag=1;   
 //																imu_enable=0;                            
-//														}
-////                    		  LoraUp_Poll();
-//																break;                        
-//												}
+														}
+//                    		  LoraUp_Poll();
+																break;                        
+												}
 														break; 
 										}
 									}
@@ -596,8 +813,8 @@
     if(!no_rx_flag)
     {
         if(lora_jianting_flag&&LoraUp_flag==0)
-        {	//LOG_INFO(TRACE_MODULE_APP," 切换2\r\n");
-            SwitchLoraSettings(UWB_CHANNEL_FRQ+group_id,UWB_CHANNEL_SF,0);
+        {	LOG_INFO(TRACE_MODULE_APP," 切换2\r\n");
+//            SwitchLoraSettings(UWB_CHANNEL_FRQ+group_id,UWB_CHANNEL_SF,0);
             Radio.Rx(0);
         }
     }
@@ -609,8 +826,8 @@
     Radio.Standby();
     if(lora_jianting_flag)
     {
-			//LOG_INFO(TRACE_MODULE_APP," 切换3\r\n");
-        SwitchLoraSettings(UWB_CHANNEL_FRQ+group_id,UWB_CHANNEL_SF,0);
+			LOG_INFO(TRACE_MODULE_APP," 切换3\r\n");
+       // SwitchLoraSettings(UWB_CHANNEL_FRQ+group_id,UWB_CHANNEL_SF,0);
         Radio.Rx(0);
     }
 }
@@ -621,8 +838,8 @@
 	
     if(lora_jianting_flag)
     {
-			//LOG_INFO(TRACE_MODULE_APP," 切换4\r\n");
-        SwitchLoraSettings(UWB_CHANNEL_FRQ+group_id,UWB_CHANNEL_SF,0);
+			LOG_INFO(TRACE_MODULE_APP," 切换4\r\n");
+//        SwitchLoraSettings(UWB_CHANNEL_FRQ+group_id,UWB_CHANNEL_SF,0);
         Radio.Rx(0);
     }
 }
@@ -634,8 +851,8 @@
     Radio.Standby();
     if(lora_jianting_flag)
     {
-			//LOG_INFO(TRACE_MODULE_APP," 切换5\r\n");
-        SwitchLoraSettings(UWB_CHANNEL_FRQ+group_id,UWB_CHANNEL_SF,0);
+			LOG_INFO(TRACE_MODULE_APP," 切换5\r\n");
+    //    SwitchLoraSettings(UWB_CHANNEL_FRQ+group_id,UWB_CHANNEL_SF,0);
         Radio.Rx(0);
     }
 }

--
Gitblit v1.9.3