From fc9967b37c19c8b5b72837b24c1f35678163ab64 Mon Sep 17 00:00:00 2001
From: WXK <287788329@qq.com>
Date: 星期一, 30 六月 2025 14:49:07 +0800
Subject: [PATCH] OTAv3   加入传输完成的语音

---
 keil/include/src/OTA.c |  139 +++++++++++++++++++++++++++++-----------------
 1 files changed, 87 insertions(+), 52 deletions(-)

diff --git a/keil/include/src/OTA.c b/keil/include/src/OTA.c
index f1e4d1e..0cb6782 100644
--- a/keil/include/src/OTA.c
+++ b/keil/include/src/OTA.c
@@ -26,8 +26,8 @@
  *******************************************************************************/
 #define MAX_REQUEST_SIZE                    (5 * 1024)
 #define APP2_ADRESS 0x0402f000
-#define APP_SIZE 0x04080000-APP2_ADRESS
-
+//#define APP_SIZE 0x04080000-APP2_ADRESS
+#define APP_CONFIG_APPLICATION_SIZE                         0x20000          //4K对齐
 /*******************************************************************************
  *                             Type Definition                                 *
  *******************************************************************************/
@@ -38,17 +38,24 @@
     OTA_STATE_HTTP_REQUEST_DATA,
     OTA_STATE_WAIT_HTTP_RESPONSE,
 }E_OTAState;
+typedef enum
+{
+    OTA_TYPE_MCU,
+    OTA_TYPE_MUSIC,
+} E_OTAType;
 
 /*******************************************************************************
  *                             Local Variable                                  *
  *******************************************************************************/
+static HIDO_UINT8 l_u8OTAType;
 static HIDO_CHAR  l_acOTAUrl[256];
 static HIDO_UINT32 l_u32OTATimerID = 0;
 static volatile E_OTAState l_eOTAState = OTA_STATE_IDLE;
 static HIDO_UINT32 l_u32OTARetryCnt = 0;
 static HIDO_UINT32 l_u32OTAFileRecvLen = 0;
 static HIDO_UINT32 l_u32OTAFileSize = 0;
-
+static HIDO_UINT32 l_u32MusicWriteLen = 0;
+static E_OTAType l_eOTAType = OTA_TYPE_MCU;
 /*******************************************************************************
  *                        Local Function Declaration                           *
  *******************************************************************************/
@@ -128,6 +135,7 @@
  * Author            : www.hido-studio.com
  * Modified Date:    : 2020年9月13日
  *******************************************************************************/
+uint8_t result1;
 static HIDO_INT32 OTA_HTTPGetFileCallBack(HIDO_UINT32 _u32RespCode, ST_HTTPGetFileResponse *_pstResponse,
         HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32Len, HIDO_VOID *_pArg)
 {
@@ -174,31 +182,33 @@
                 /* 文件接收完成 */
                 if (l_u32OTAFileRecvLen == l_u32OTAFileSize)
                 {
+                    uint16_t tmp = 0;
                     l_eOTAState = OTA_STATE_IDLE;
                     HIDO_TimerCancel(l_u32OTATimerID);
 
-									  // 执行到这里,已经完成文件的下载,可以执行下一步处理了
-//#if 0
-//                    HIDO_UINT16 tmp = 0xBBBB,result;
-//                    SPIFlash_Erase(SPI_FLASH_ID_0, APP_CONFIG_IAPFLAG_MAP,2, SPI_FLASH_SECTOR_ERASE_MODE_4K);  
-//                    SPIFlash_Write(SPI_FLASH_ID_0, APP_CONFIG_IAPFLAG_MAP, (HIDO_UINT8*)&tmp, sizeof(tmp)); 
-//#endif
-									  // HAL_Delay(10);
-                    // Reboot(0);
-                    uint32_t result = 0;
-                    uint16_t tmp = 0xCCCC;
+                    // 执行到这里,已经完成文件的下载,可以执行下一步处理了
+                    if (OTA_TYPE_MUSIC == l_eOTAType)
+                    {
+                        tmp = 0xFFFF;
+                        l_u32MusicWriteLen = 0;
+                        DATA_CHANGE();
+                    }
+                    else
+                    {
+                        tmp = 0xBBBB;
+                    }
                     __disable_irq();
-                    result = flash_open(FLASH_ID0,NULL);
-                    if(!result)//打开成功
-                        flash_erase(FLASH_ID0,APP_CONFIG_IAPFLAG_SECTOR_ADDR,FLASH_SECTOR_SIZE);
-                    result = flash_write_nbytes(FLASH_ID0,APP_CONFIG_IAPFLAG_MAP,(uint8_t*)&tmp,2);
+                    result1=flash_open(FLASH_ID0,NULL);
+                    if(!result1) 
+                    {
+                    flash_erase(FLASH_ID0, APP_CONFIG_IAPFLAG_SECTOR_ADDR, FLASH_SECTOR_SIZE);//擦除APPFLAG
+                    flash_write_nbytes(FLASH_ID0, APP_CONFIG_IAPFLAG_MAP, (uint8_t*)&tmp, sizeof(tmp));
+                    flash_erase(FLASH_ID0, APP_CONFIG_IAP_PARAM_MAP, FLASH_SECTOR_SIZE);//擦除APPFLAG
+                    }
                     __enable_irq();
-                    Serial0PutString("进入升级模式\r\n");
-                    g_com_map[CNT_UPDATE]=0;
-                    save_com_map_to_flash();
-                    delay_us(100000);
+                    delay_us(1000000);
                     NVIC_SystemReset(); //软复位回到bootloader
-                    break;
+                            break;
                 }
 
                 OTA_RequestFileData(l_u32OTAFileRecvLen);
@@ -219,6 +229,27 @@
 
     return HIDO_OK;
 }
+
+
+HIDO_VOID OTA_GetMusicPackData(HIDO_UINT8 *_pu8Data)
+{
+    flash_read(FLASH_ID0, APP2_ADRESS + l_u32MusicWriteLen, _pu8Data, 512);
+    l_u32MusicWriteLen += 512;
+}
+
+HIDO_UINT16 OTA_GetMusicPackNum()
+{
+    if ((l_u32OTAFileSize % 512) != 0)
+    {
+        return (l_u32OTAFileSize / 512) + 1;
+    }
+    else
+    {
+        return l_u32OTAFileSize / 512;
+    }
+}
+
+
 /*******************************************************************************
  * Function Name     : OTA_Failed
  * Description       :
@@ -230,20 +261,17 @@
  *******************************************************************************/
 static HIDO_INT32 OTA_Failed(void)
 {
-    /* 升级参数有误,取消升级 */
-    HIDO_UINT16 tmp = 0xFFFF;
-    
-//    HIDO_Debug("goto app application\r\n");
-
-		// 执行到这里,说明文件下载失败了,需要进一步处理
-#if 0
-    SPIFlash_Erase(SPI_FLASH_ID_0, APP_CONFIG_IAPFLAG_MAP, 2, SPI_FLASH_SECTOR_ERASE_MODE_4K);  
-    SPIFlash_Write(SPI_FLASH_ID_0, APP_CONFIG_IAPFLAG_MAP, (HIDO_UINT8*)&tmp, sizeof(tmp)); 
-    SPIFlash_Erase(SPI_FLASH_ID_0, APP_CONFIG_IAP_PARAM_MAP, 256, SPI_FLASH_SECTOR_ERASE_MODE_4K);  
-#endif
-//    g_com_map[OTA_FLAG]=0;
-//    save_com_map_to_flash();
-//    delay_us(100000);
+    uint16_t tmp = 0xFFFF;
+    __disable_irq();
+    result1=flash_open(FLASH_ID0,NULL);
+    if(!result1) 
+    {
+    flash_erase(FLASH_ID0, APP_CONFIG_IAPFLAG_SECTOR_ADDR, FLASH_SECTOR_SIZE);//擦除APPFLAG
+    flash_write_nbytes(FLASH_ID0, APP_CONFIG_IAPFLAG_MAP, (uint8_t*)&tmp, sizeof(tmp));
+    flash_erase(FLASH_ID0, APP_CONFIG_IAP_PARAM_MAP, FLASH_SECTOR_SIZE);//擦除APPFLAG
+    }
+    __enable_irq();
+    delay_us(1000000);
     NVIC_SystemReset(); //软复位回到bootloader
     
     return HIDO_OK;
@@ -308,7 +336,7 @@
  * Author            : www.hido-studio.com
  * Modified Date:    : 2020年9月13日
  *******************************************************************************/
-HIDO_INT32 OTA_SetUp(HIDO_CHAR *_pcUrl)
+HIDO_INT32 OTA_SetUp(HIDO_UINT8 _u8Type, HIDO_CHAR *_pcUrl)
 {
     if(HIDO_NULL == _pcUrl)
     {
@@ -324,15 +352,21 @@
     l_u32OTARetryCnt = 0;
     l_u32OTAFileSize = 0;
     l_u32OTAFileRecvLen = 0;
+    l_u8OTAType = _u8Type;
     HIDO_UtilSnprintf(l_acOTAUrl, sizeof(l_acOTAUrl), _pcUrl);
 
     /* 擦除OTA文件缓存存储空间 */
-#if 0
-    SPIFlash_Erase(SPI_FLASH_ID_0, APP_CONFIG_APP_DOWN_LOAD_SPIFLASH_ADDRESS,
-            APP_CONFIG_APP_DOWN_LOAD_SPIFLASH_SIZE, SPI_FLASH_SECTOR_ERASE_MODE_64K);
-#else
-    flash_erase(FLASH_ID0,APP2_ADRESS,APP_SIZE);
-#endif
+    if (_u8Type == 0)
+    {
+        l_eOTAType = OTA_TYPE_MCU;
+        flash_erase(FLASH_ID0, APP2_ADRESS, APP_CONFIG_APPLICATION_SIZE);
+    }
+    else
+    {
+        l_eOTAType = OTA_TYPE_MUSIC;
+        flash_erase(FLASH_ID0, APP2_ADRESS, APP_CONFIG_APPLICATION_SIZE);
+    }
+
     /* 请求升级文件长度 */
     if(OTA_RequestFileLen() != HIDO_OK)
     {
@@ -373,18 +407,19 @@
  *******************************************************************************/
 HIDO_INT32 OTA_Poll(void)
 {
-    if(Internet_IsIPReady() != HIDO_TRUE)
+    if (Internet_IsIPReady() != HIDO_TRUE)
     {
         return HIDO_ERR;
     }
-    
-    if(l_eOTAState == OTA_STATE_IDLE)
+
+    if (l_eOTAState == OTA_STATE_IDLE)
     {
-        OTA_SetUp(l_acOTAUrl);
+        OTA_SetUp(l_u8OTAType, l_acOTAUrl);
     }
-    
+
     return HIDO_OK;
 }
+
 
 /*******************************************************************************
  * Function Name     : OTA_Start
@@ -395,12 +430,12 @@
  * Author            : www.hido-studio.com
  * Modified Date:    : 2020年9月13日
  *******************************************************************************/
-HIDO_INT32 OTA_Start(HIDO_CHAR *_pcUrl)
+HIDO_INT32 OTA_Start(HIDO_UINT8 _u8Type, HIDO_CHAR *_pcUrl)
 {
     l_eOTAState = OTA_STATE_IDLE;
     HIDO_TimerCreate(&l_u32OTATimerID);
-    
-    OTA_SetUp(_pcUrl);
-    
+
+    OTA_SetUp(_u8Type, _pcUrl);
+
     return HIDO_OK;
 }

--
Gitblit v1.9.3