增加 2AE6文件传输 增加自定义表盘文件传输 修复通讯录不显示多个电话BUG 589/1 589/head
authorhcj <1224667075@qq.com>
Fri, 26 Jul 2024 08:39:29 +0000 (16:39 +0800)
committerhcj <1224667075@qq.com>
Fri, 26 Jul 2024 08:39:29 +0000 (16:39 +0800)
code/sdk/application/wearable/fd230app/nativeui/bluetooth/src/BluetoothModel.cpp
code/sdk/application/wearable/fd230app/nativeui/phone/src/phoneaddressmodel.cpp
code/sdk/application/wearable/fd230app/nativeui/set_dial/include/SetDialModel.h
code/sdk/application/wearable/fd230app/nativeui/set_dial/src/SetDialModel.cpp
code/sdk/application/wearable/service/ble_service/blemoder/bletest.cpp
code/sdk/application/wearable/service/ble_service/blemoder/bletest.h
code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c
code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.h
code/sdk/application/wearable/service/ble_service/bleservice/bleService.c
code/sdk/application/wearable/service/ble_service/bleservice/bleService.h

index 896ca21..7ea5b31 100644 (file)
@@ -972,12 +972,12 @@ void BluetoothModel::BtGapAclStateChangedHandle(gap_acl_state_t state, unsigned
 // 回调:ACL连接状态上报\r
 void GapAclStateChangedCallback(const bd_addr_t *bdAddr, gap_acl_state_t state, unsigned int reason)\r
 {\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "bt GapAclStateChangedCallback state %d, reason %x succ or err", state, reason);\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "addr: %02x%02x%02x%02x%02x%02x",\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bt GapAclStateChangedCallback state %d, reason %x succ or err", state, reason);\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "addr: %02x%02x%02x%02x%02x%02x",\r
         bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* mac下标 0 1 2 3 4 5 */\r
         bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* mac下标 0 1 2 3 4 5 */\r
     if ((gap_get_device_class(bdAddr) & 0x200) != 0) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GapAclStateChangedCallback: Mobile Phone Device");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GapAclStateChangedCallback: Mobile Phone Device");\r
         return;\r
     }\r
     GraphicService::GetInstance()->PostGraphicEvent(\r
@@ -1412,8 +1412,14 @@ void BtA2dpDeInit(void)
     a2dp_snk_deregister_callbacks(&g_a2dp_snk_callbacks);\r
 \r
 }\r
+static void sample_gap_state_changed_callback(const int transport, const int status)\r
+{\r
+    printf("gap_state_changed_callback transport: %d status: %d\n", transport, status);\r
+}\r
+\r
 void BtInitCallBacks(void)\r
 {\r
+    g_btGapCallBacks.state_change_callback=sample_gap_state_changed_callback;\r
     g_btGapCallBacks.discovery_result_callback = BtGapDiscoveryResultCallback;\r
     g_btGapCallBacks.discovery_state_changed_callback = BtGapDiscoveryStateChangedCallback;\r
     g_btGapCallBacks.acl_state_changed_callbak = GapAclStateChangedCallback;\r
index e2ae148..d29a4bb 100644 (file)
@@ -86,21 +86,27 @@ namespace OHOS
                 printf("号码: %s\r\n",addressbook_t.Contact_t[j].phone_number_t[i].number);
                 // addressbook_t.Contact_t[j].phone_number_t[i].number=phonen_name;
                 offset=offset+phonen_len+1;
-            }
-            for(int i=0;i<phone_num;i++)
-            {
+
                 uint8_t add = buf[offset];
                 printf("归属地长度: %d\r\n",add);
                 // char *add_buf=(char *)malloc(sizeof(char)*add+1);
-                memset(addressbook_t.Contact_t[j].phone_number_t[i].affiliating_area,0,add+1);
-                memcpy(addressbook_t.Contact_t[j].phone_number_t[i].affiliating_area,&buf[offset+1],add);
+                memset(addressbook_t.Contact_t[j].phone_number_t[i].affiliating_area,0,AREA_LEN);
+                if(add > AREA_LEN)
+                {
+                    addressbook_t.Contact_t[j].phone_number_t[i].affiliating_area[AREA_LEN]='\0';
+                    memcpy(addressbook_t.Contact_t[j].phone_number_t[i].affiliating_area,&buf[offset+1],AREA_LEN);
+                }else{
+                    memcpy(addressbook_t.Contact_t[j].phone_number_t[i].affiliating_area,&buf[offset+1],add);
+                }
+                
                 printf("归属地: %s\r\n",addressbook_t.Contact_t[j].phone_number_t[i].affiliating_area);
                 // addressbook_t.Contact_t[j].phone_number_t[i].affiliating_area=add_buf;
+
                 offset=offset+add+1;
 
                 uint8_t yun = buf[offset];
                 // char *yun_buf=(char *)malloc(sizeof(char)*yun+1);
-                memset(addressbook_t.Contact_t[j].phone_number_t[i].operator_t,0,yun+1);
+                memset(addressbook_t.Contact_t[j].phone_number_t[i].operator_t,0,OPERATOR_LEN);
                 if(yun > OPERATOR_LEN)
                 {
                     addressbook_t.Contact_t[j].phone_number_t[i].operator_t[OPERATOR_LEN]='\0';
@@ -112,7 +118,10 @@ namespace OHOS
                 // addressbook_t.Contact_t[j].phone_number_t[i].operator_t=yun_buf;
 
                 offset=offset+yun+1;
+
+
             }
+    
         }
         //fclose(fp);
         // if(buf)
@@ -292,12 +301,12 @@ namespace OHOS
             {
                 //buf[offset]=strlen(addressbook_t.Contact_t[i].phone_number_t[j].affiliating_area)+1;
                 memcpy(&buf[offset],addressbook_t.Contact_t[i].phone_number_t[j].affiliating_area,AREA_LEN);
-                printf("写入运营商: %s\r\n",&buf[offset]);
+                printf("写入所属地: %s\r\n",&buf[offset]);
                 offset=offset+AREA_LEN;
 
                 //buf[offset]=strlen(addressbook_t.Contact_t[i].phone_number_t[j].operator_t)+1;
                 memcpy(&buf[offset],addressbook_t.Contact_t[i].phone_number_t[j].operator_t,OPERATOR_LEN);
-                printf("写入所属地: %s\r\n",&buf[offset]);
+                printf("写入运营商: %s\r\n",&buf[offset]);
                 offset=offset+OPERATOR_LEN;
             }
         }
index ea6abd2..b316c61 100644 (file)
@@ -26,7 +26,6 @@
 #ifndef SET_DIAL_MODEL_H
 #define SET_DIAL_MODEL_H
 #include "AppViewIDs.h"
-#include "UiConfig.h"
 #include "SetDialInfo.h"
 
 namespace OHOS
@@ -56,8 +55,10 @@ namespace OHOS
         int GetAllDialIDs(char *allidStr);
         bool readDialfile();
         bool saveDialfile();
+        std::string GetSaveDir(int Id);
 
     private:
+        void CreateDirectoryIfNotExists(const std::string &path);
         void LoadAllDialFromRam(void);
         void LoadAllDialFromFs(void);
         void LoadAllDialFromDefult(void);
index 0080f3a..f86a838 100644 (file)
@@ -30,6 +30,8 @@
 #include <iomanip>
 #include <stdio.h>
 #include "NativeAbility.h"
+#include "UiConfig.h"
+#include <sys/stat.h>
 namespace OHOS
 {
     // 定义特殊Id
@@ -283,6 +285,42 @@ namespace OHOS
         }
     }
 
+    void SetDialModel::CreateDirectoryIfNotExists(const std::string &path)
+    {
+        struct stat info;
+        if (stat(path.c_str(), &info) != 0)
+        {
+            if (mkdir(path.c_str(), 0755) != 0)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Could not create directory %s. Errno: %d", path.c_str(), errno);
+            }
+            else
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Created directory: %s", path.c_str());
+            }
+        }
+        else if (info.st_mode & S_IFDIR)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Directory already exists: %s", path.c_str());
+        }
+    }
+
+    std::string SetDialModel::GetSaveDir(int Id)
+    {
+        // 首先检查Id是否在0~4的范围内
+        if (Id < 0 || Id > 4)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Id must be between 0 and 4.");
+            return ""; // 或者返回一个空字符串
+        }
+        CreateDirectoryIfNotExists(std::string(APP_CUSTOM_DIAL_PATH));           
+        std::string folderPath = std::string(APP_CUSTOM_DIAL_PATH) + "/" + std::to_string(Id); // 修复这一行
+        CreateDirectoryIfNotExists(folderPath);                                                // 确保目录存在
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Directory is %s", folderPath.c_str());
+
+        return folderPath; // 返回目录路径
+    }
+
     /*加载所有表盘*/
     void SetDialModel::LoadAllDial()
     {
index 3ae47e6..c924afd 100644 (file)
@@ -530,7 +530,17 @@ void get_sedent_param(  msg_sedent_set_param_info_t * data)
     return;
 }
 
+void ble_get_dial_path(char * buf,uint16_t id)
+{
+    char *path= (char*)OHOS::SetDialModel::GetInstance().GetSaveDir(id).c_str();
+    memcpy(buf,path,strlen(path)+1);
+    return;
+}
+
+// void ble_save_dial_()
+// {
 
+// }
 
 void ble_set_dial_by_id(uint16_t id)
 {
index 4d0bbff..fb3f477 100644 (file)
@@ -218,6 +218,8 @@ void Set_oxygen_cmd(msg_get_spo2_set_param_info_t *data);
 void Get_oxygen_cmd(msg_get_spo2_set_param_info_t *data);
 
 //////////////////////表盘相关////////////////////////////
+void ble_get_dial_path(char * buf,uint16_t id);
+
 void ble_set_dial_by_id(uint16_t id);
 
 uint16_t ble_get_dial_id(void);
index 8a11c87..e303339 100644 (file)
@@ -51,6 +51,48 @@ extern "C" {
 \r
 #define AI_TXT_BUF_MAX_LEN 1024*3 //json解析失败\r
 \r
+\r
+uint32_t packdataLen = 0;\r
+uint32_t totalDataLen = 0;\r
+uint8_t totalpack = 0;\r
+uint8_t cmd_data[17];\r
+uint8_t *recvData;\r
+#include "los_memory.h"\r
+\r
+#define MAX_BLE_MSG_PACKAGE_LEN (1024*5)  //包缓存最大5k\r
+#define BLE_MSG_TMP_FILE_NAME "/user/userdata/ble_tmp_buf_%04X"\r
+typedef struct \r
+{\r
+    int handle;\r
+    int data_len ;\r
+    int totalDataLen;\r
+    int buffer_to_file; //1 buffer to file , 0 buffer to ram\r
+    int decode_type; //1 with header , 2 no header\r
+    FILE *tmpfilehandle;// 如果buffer to file , 则在此保存handle\r
+    msg_header_t cmd_header;\r
+    uint8_t *data;//if buffer_to_file is 1, than data is the filename , else  data is the ram buffer.\r
+    uint8_t crcvalue;\r
+    uint8_t lrcvalue; //计算crc用的临时变量\r
+    uint8_t lrcvalue2; //计算crc用的临时变量\r
+    uint32_t last_timestamp;// last package receive time\r
+    uint8_t receive_file_flag;//1 接收文件 0 不接收文件\r
+    file_recv_stat_t file_recv_stat;\r
+    uint8_t last_data_sample[5]; //专门给文件传输过程中重复包判定用。目前只是取前5个字节,实际应该再做优化算法。\r
+    uint16_t last_data_size;//专门给传输过程中重复包判定用,记录上一个包的长度,至少长度相同才有判断重复的必要。同时也可以作为少于5个字节的包的判定依据。\r
+} ble_read_data;\r
+\r
+#define MAX_HANDLE_NUM 10\r
+//LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemInfoGet(VOID *pool, LOS_MEM_POOL_STATUS *poolStatus)\r
+//根据特征值分开组合读取的数据,并处理\r
+static ble_read_data handle_l[MAX_HANDLE_NUM]={0};\r
+\r
+errcode_t cancel_recv_file(ble_read_data *buffer_handle);\r
+\r
+\r
+\r
+\r
+uint8_t ble_dial_file_count=0;\r
+uint8_t ble_dial_file_index=0;\r
 uint8_t *bigDataBuf = NULL;//大数据buf\r
 uint8_t bigDataBufLen=0;\r
 bool sendbigDataBufState = false;//发送大数据表示不要被其他指令打断\r
@@ -61,6 +103,12 @@ static uint16_t data_len = 0;
 ble_recv_data_info_t ble_recv_data;\r
 static uint8_t TRANSMIT_DATA;\r
 static osTimerId_t BR_TRANSFER_timer=NULL;\r
+static uint8_t timer_flie_type=0;\r
+static uint32_t timer_flie_flag=0;\r
+ble_read_data* ble_read_timer_p=NULL;\r
+\r
+\r
+\r
 \r
 #if 1\r
 #include "app_msg_manager.h"\r
@@ -96,6 +144,7 @@ static const char* getHandlname(uint16_t handle)
     if (data2ae3Cmd == handle) return "data2ae3Cmd";\r
     if (data2ae4Cmd == handle) return "data2ae4Cmd";\r
     if (data2ae5Cmd == handle) return "data2ae5Cmd";\r
+    if (data2ae6Cmd == handle) return "data2ae6Cmd";\r
     //if (data2ae2Cmd == handle) return "data2ae2Cmd";\r
     \r
     return "unknown handle";\r
@@ -114,7 +163,22 @@ static errcode_t get_file_recv_file_path(char* input_filename ,uint32_t input_si
 \r
     return ERRCODE_SUCC;\r
 } \r
+static errcode_t get_custom_dial_file_path(uint16_t id,uint32_t input_size, char* output_file_path , uint32_t max_output_size)\r
+{\r
+    if( id >=5  || output_file_path == NULL)\r
+    {\r
+        return ERRCODE_FAIL;\r
+    }\r
+    char name[64]={0};\r
+    ble_get_dial_path(name,id);\r
+\r
+    int ret = sprintf_s(output_file_path,max_output_size,"%s",name);\r
+    if (ret < 0)\r
+        return ERRCODE_FAIL;\r
 \r
+    return ERRCODE_SUCC;\r
+\r
+}\r
 static errcode_t get_dial_file_path(char* input_dialname ,uint32_t input_size, char* output_file_path , uint32_t max_output_size)\r
 {\r
     if(input_dialname == NULL || output_file_path == NULL)\r
@@ -336,51 +400,6 @@ void send_big_data(uint8_t flag, char *data, uint16_t datalen, uint32_t total, u
 }\r
 \r
 \r
-\r
-\r
-\r
-\r
-uint32_t packdataLen = 0;\r
-uint32_t totalDataLen = 0;\r
-uint8_t totalpack = 0;\r
-uint8_t cmd_data[17];\r
-uint8_t *recvData;\r
-#include "los_memory.h"\r
-\r
-#define MAX_BLE_MSG_PACKAGE_LEN (1024*5)  //包缓存最大5k\r
-#define BLE_MSG_TMP_FILE_NAME "/user/userdata/ble_tmp_buf_%04X"\r
-typedef struct \r
-{\r
-    int handle;\r
-    int data_len ;\r
-    int totalDataLen;\r
-    int buffer_to_file; //1 buffer to file , 0 buffer to ram\r
-    int decode_type; //1 with header , 2 no header\r
-    FILE *tmpfilehandle;// 如果buffer to file , 则在此保存handle\r
-    msg_header_t cmd_header;\r
-    uint8_t *data;//if buffer_to_file is 1, than data is the filename , else  data is the ram buffer.\r
-    uint8_t crcvalue;\r
-    uint8_t lrcvalue; //计算crc用的临时变量\r
-    uint8_t lrcvalue2; //计算crc用的临时变量\r
-    uint32_t last_timestamp;// last package receive time\r
-    uint8_t receive_file_flag;//1 接收文件 0 不接收文件\r
-    file_recv_stat_t file_recv_stat;\r
-    uint8_t last_data_sample[5]; //专门给文件传输过程中重复包判定用。目前只是取前5个字节,实际应该再做优化算法。\r
-    uint16_t last_data_size;//专门给传输过程中重复包判定用,记录上一个包的长度,至少长度相同才有判断重复的必要。同时也可以作为少于5个字节的包的判定依据。\r
-} ble_read_data;\r
-\r
-#define MAX_HANDLE_NUM 10\r
-//LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemInfoGet(VOID *pool, LOS_MEM_POOL_STATUS *poolStatus)\r
-//根据特征值分开组合读取的数据,并处理\r
-static ble_read_data handle_l[MAX_HANDLE_NUM]={0};\r
-\r
-errcode_t cancel_recv_file(ble_read_data *buffer_handle);\r
-\r
-\r
-\r
-\r
-\r
-\r
 //发送训练状态[app发起的运动]\r
 void sendtraningstatedata(uint8_t state ,uint16_t time)\r
 {\r
@@ -441,7 +460,12 @@ void sendtraningdata(msg_get_train_data_info_t *data)
     \r
     cJSON_free(jsonString);\r
 }\r
-//发送AI录音准备就绪国内/国外标识:0:国内版本 1:国外版本\r
+//发送AI录音准备就绪国内/\r
+/*使用模型:\r
+0:文心一言\r
+1:ChatGPT\r
+2:KIMI\r
+3:豆包*/\r
 void send_AI_is_ready(uint8_t type)\r
 {\r
   \r
@@ -993,7 +1017,7 @@ void sendBindInfor(uint8_t *data)
 \r
 \r
                 ret = gap_ble_pair_remote_device(&phone_addr);\r
-                printf("gap_ble_pair_remote_device ret:%x ",ret);\r
+                printf("gap_ble_pair_remote_device ret:%x \r\n",ret);\r
                 bond = 0x02;//手表与该手机绑定过\r
                 value[17] = bond;//\r
                 value[18] = Calculate_CRC(value,18);\r
@@ -1492,6 +1516,7 @@ static void jsonCheck_alarm(uint8_t *buf)//json 解析闹钟数据
 \r
     }\r
     cJSON_Delete(root);\r
+    ble_AlarmClock_refresh();\r
     printf("alarmCount %d\n",alarmCount);\r
     \r
 }\r
@@ -3537,7 +3562,7 @@ static void GetHrGetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *to
         value[18] = heart_param.remind_on;//\r
         value[19] = heart_param.max_min;//\r
         value[20] = heart_param.heart;// \r
-        \r
+\r
         printf("%d %d %d %d ",value[17],value[18],value[19],value[20]);\r
 \r
         value[21] = Calculate_CRC(value,21);\r
@@ -4769,7 +4794,6 @@ void type2AE3Data(ble_read_data *buffer_handle,uint8_t *cmd_buf ,uint8_t *data,u
         case GET_SPECIF_TYPE_FILE_CMD://获取指定类型文件目录 \r
         case AI_IS_READ_DATA_CMD:\r
         case SYN_HEART_HISTORY_DATA_CMD://同步心率历史数据\r
-            //heartDataCmd(cmd,data,datalen,totaldata,crcvalue);\r
         case SYN_SPO2_HISTORY_DATA_CMD://同步血氧历史数据\r
         case SYN_STEP_HISTORY_DATA_CMD: //同步步数历史数据\r
         case SYN_FAT_BURN_HISTORY_DATA_CMD://同步燃脂时间数据\r
@@ -4933,7 +4957,7 @@ bool Read_Health_BIN_file_buf_send_bin_Data(uint8_t day, uint16_t num,uint16_t i
     fseek(fp, 0, SEEK_SET); // 将文件指针移回文件开头\r
     \r
     buf = (char *)ym_malloc(sizeof(char)*num+1);\r
-    if(buf==NULL)return false;\r
+    if(buf==NULL){fclose(fp); return false;}\r
 \r
     uint32_t pack=1;\r
     if(file_size%num==0)\r
@@ -5504,7 +5528,216 @@ errcode_t ble_reply_msg(uint8_t msg_cmdtype,uint8_t msg_cmdid,uint8_t replydata)
     return ble_reply_msgarr(msg_cmdtype,msg_cmdid,&replydata,1);\r
 }\r
 \r
+static uint32_t last_package_id=0;\r
+static void  ble_transfer_Timer_CallBack(int data)\r
+{\r
+    timer_flie_flag--;\r
+\r
+    if(timer_flie_flag==0)\r
+    {\r
+        if(timer_flie_type==1)\r
+        {\r
+            TRANSMIT_DATA=TRANS_OTA_FAIL;\r
+        }\r
+        else if (timer_flie_type==3)\r
+        {\r
+            TRANSMIT_DATA=TRANS_DIAL_FAIL;\r
+        }\r
+        else\r
+        {\r
+            TRANSMIT_DATA=TRANS_FREE;\r
+        }\r
+        \r
+        ble_read_timer_p->receive_file_flag = 0;\r
+\r
+        if (ble_read_timer_p->file_recv_stat.recv_file_stat != 2) //已经下载完毕的文件,没有必要cancel了。\r
+        {\r
+\r
+            if (ble_read_timer_p->file_recv_stat.file!=NULL)\r
+            {\r
+                fclose(ble_read_timer_p->file_recv_stat.file);\r
+                ble_read_timer_p->file_recv_stat.file = NULL;\r
+            }\r
+            if (ble_read_timer_p->file_recv_stat.file_name != NULL)\r
+            {\r
+                free(ble_read_timer_p->file_recv_stat.file_name);\r
+                ble_read_timer_p->file_recv_stat.file_name=NULL;\r
+            }\r
+            ble_read_timer_p->file_recv_stat.recv_file_stat = -1;\r
+\r
+            ble_read_timer_p=NULL;\r
+\r
+            ble_reply_cmd(FILE_RECV_REPLY_STAT_CMD,0);//接收失败\r
+        }\r
+        CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
+\r
+        if(BR_TRANSFER_timer)\r
+        {\r
+            osTimerStop(BR_TRANSFER_timer);\r
+            osTimerDelete(BR_TRANSFER_timer);\r
+            BR_TRANSFER_timer = NULL;\r
+        }\r
+\r
+    }\r
+}\r
+uint8_t OTA_FILE_value=0;\r
+\r
+errcode_t decode_ota_data(ble_read_data *buffer_handle,uint8_t *data,uint16_t datalen,uint8_t crcvalue)\r
+{\r
+    uint32_t package_id=0;\r
+    memcpy_s(&package_id,4,&data[11],4);\r
+    printf("package_id: %d \r\n",package_id);\r
+\r
+    // for(int i=0 ;i<17;i++)\r
+    // {\r
+    //     printf(" 0x%02X",data[i]);\r
+    // }\r
+    // printf("\r\n");\r
+\r
+    data=data+sizeof(msg_header_t);\r
+    datalen-=18;\r
+    if(Check_CRC(data,datalen,crcvalue))\r
+    {\r
+      \r
+        if(package_id==0)\r
+        {\r
+        last_package_id=package_id;\r
+        if((buffer_handle->file_recv_stat.recv_file_stat <= 0) && buffer_handle->file_recv_stat.file == NULL )\r
+        {\r
+            buffer_handle->file_recv_stat.lrcvalue = 0;\r
+            if (buffer_handle->file_recv_stat.file_type == 1)\r
+            {\r
+                buffer_handle->file_recv_stat.file = fopen("/update/update.fwpkg","w+");\r
+                printf("create file /update/update.fwpkg %X\n",buffer_handle->file_recv_stat.file);\r
+\r
+            }else{\r
+                char filepath[128]={0};\r
+                if (get_file_recv_file_path(buffer_handle->file_recv_stat.file_name,strlen(buffer_handle->file_recv_stat.file_name),filepath,sizeof(filepath)) == ERRCODE_SUCC)\r
+                {\r
+                    buffer_handle->file_recv_stat.file = fopen(filepath,"w+");\r
+                    printf("create file %s %X\n",filepath,buffer_handle->file_recv_stat.file);\r
+                }else{\r
+                    printf("create file %s error %X\n",buffer_handle->file_recv_stat.file_name,buffer_handle->file_recv_stat.file);\r
+                }            \r
+            }\r
+            if (buffer_handle->file_recv_stat.file == NULL)\r
+            {\r
+                printf("6185 buffer_handle->file_recv_stat.file  \n");\r
+                return ERRCODE_FAIL;\r
+            }\r
+            size_t writtensize = fwrite(data,1,datalen,buffer_handle->file_recv_stat.file);\r
+            if(writtensize == datalen)\r
+            {\r
+                timer_flie_flag=10;\r
+\r
+                buffer_handle->file_recv_stat.lrcvalue = calculate_lrc(data,datalen,buffer_handle->file_recv_stat.lrcvalue);\r
+                        buffer_handle->file_recv_stat.received_size += datalen;\r
+                printf("handle_recv_file received_size %d\n",buffer_handle->file_recv_stat.received_size);\r
+                OTA_FILE_value= ((float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size) *100;\r
+\r
+\r
+            }else{\r
+                printf("handle_recv_file write file failed! ret %d != %d\n",writtensize,datalen);\r
+                return ERRCODE_FAIL;\r
+            }\r
+\r
+\r
+            buffer_handle->file_recv_stat.recv_file_stat = 1;\r
+            ////////////////创建文件传输超时定时器//////////////////\r
+            uint32_t tick;\r
+            osStatus_t retTimer;\r
+            if(BR_TRANSFER_timer!=NULL)\r
+            {\r
+                osTimerDelete(BR_TRANSFER_timer);\r
+                BR_TRANSFER_timer = NULL;\r
+            }\r
+            timer_flie_type=buffer_handle->file_recv_stat.file_type;\r
+            ble_read_timer_p=buffer_handle;\r
+            timer_flie_flag=10;\r
+\r
+            BR_TRANSFER_timer = osTimerNew((osTimerFunc_t)ble_transfer_Timer_CallBack, osTimerPeriodic, NULL, NULL);\r
+            tick =1000;// osMs2Tick(1000);\r
+            retTimer = osTimerStart(BR_TRANSFER_timer, tick);\r
+            if (retTimer != osOK && BR_TRANSFER_timer != NULL) {\r
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"StartCallTimer osTimerStart failed, ret = %lx!!", retTimer);\r
+                osTimerDelete(BR_TRANSFER_timer);\r
+                BR_TRANSFER_timer = NULL;\r
+                return ERRCODE_FAIL;\r
+            }\r
+        }\r
+        ///////////////////////////////////////////////////////////\r
+    }\r
+    else if ((last_package_id+1)==package_id)\r
+    {\r
+        last_package_id=package_id;\r
+        if (buffer_handle->file_recv_stat.file == NULL)\r
+        {\r
+            printf("6194 buffer_handle->file_recv_stat.file  \n");\r
+            return ERRCODE_FAIL;\r
+        }\r
+        //写入文件\r
+        size_t writtensize = fwrite(data,1,datalen,buffer_handle->file_recv_stat.file);\r
+        if(writtensize == datalen)\r
+        {\r
+            timer_flie_flag=10;\r
+\r
+            buffer_handle->file_recv_stat.lrcvalue = calculate_lrc(data,datalen,buffer_handle->file_recv_stat.lrcvalue);\r
+                    buffer_handle->file_recv_stat.received_size += datalen;\r
+            printf("handle_recv_file received_size %d\n",buffer_handle->file_recv_stat.received_size);\r
+            OTA_FILE_value= ((float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size) *100;\r
+\r
+\r
+        }else{\r
+            printf("handle_recv_file write file failed! ret %d != %d\n",writtensize,datalen);\r
+            return ERRCODE_FAIL;\r
+        }\r
 \r
+    //检查文件是否写完\r
+        if(buffer_handle->file_recv_stat.file_size == buffer_handle->file_recv_stat.received_size)\r
+        {\r
+            if (buffer_handle->file_recv_stat.file!=NULL)\r
+            {\r
+                fclose(buffer_handle->file_recv_stat.file);\r
+                buffer_handle->file_recv_stat.file = NULL;\r
+            }\r
+            if (buffer_handle->file_recv_stat.file_name != NULL)\r
+            {\r
+                free(buffer_handle->file_recv_stat.file_name);\r
+                buffer_handle->file_recv_stat.file_name=NULL;\r
+            }\r
+            buffer_handle->file_recv_stat.recv_file_stat = 2;\r
+            buffer_handle->receive_file_flag = 0;\r
+            printf("handle_recv_file received success \n");\r
+\r
+            if(BR_TRANSFER_timer)\r
+            {\r
+                osTimerStop(BR_TRANSFER_timer);\r
+                osTimerDelete(BR_TRANSFER_timer);\r
+                BR_TRANSFER_timer = NULL;\r
+            }\r
+\r
+            ble_reply_cmd(OTA_FILE_SUCC_CMD,1);//接收成功\r
+            }\r
+\r
+        }\r
+        else if (last_package_id==package_id)\r
+        {\r
+            uint32_t replydata=0xffffffff;\r
+            printf("包重复\r\n");\r
+            //ble_reply_msgarr(6,4,&replydata,4);\r
+        }\r
+        else if (last_package_id!=package_id)\r
+        {\r
+            uint32_t replydata= last_package_id+1;\r
+            ble_reply_msgarr(6,4,&replydata,4);\r
+        }\r
+        return ERRCODE_SUCC;\r
+    }\r
+    else\r
+    {\r
+         return ERRCODE_FAIL;\r
+    }\r
+}\r
 \r
 \r
 \r
@@ -5667,6 +5900,7 @@ errcode_t decode_mp3_json(ble_read_data *buffer_handle)
     }\r
 }\r
 \r
+\r
 errcode_t decode_dial_info(ble_read_data *buffer_handle)\r
 {\r
 \r
@@ -5689,28 +5923,46 @@ errcode_t decode_dial_info(ble_read_data *buffer_handle)
 \r
     // dialinfo.dial_count = pdialinfo->dial_count;\r
     dialinfo.dial_uid = pdialinfo->dial_uid;\r
-    dialinfo.file_name_len = pdialinfo->file_name_len;\r
-    // dialinfo.file_type = pdialinfo->file_type;\r
-\r
-    if (dialinfo.file_name_len < 0 || dialinfo.file_name_len >255)\r
-    {\r
-        printf("file name len should in [0,255] \n");\r
-        return ERRCODE_FAIL;\r
+    if(dialinfo.dial_uid<=4)\r
+    {\r
+        msg_recv_custom_dial_info_t *custom_dial_info=(msg_recv_custom_dial_info_t*)data;\r
+        printf("custom_dial_info %d %d %d %d",\r
+        custom_dial_info->dial_uid,\r
+        custom_dial_info->battery,\r
+        custom_dial_info->time,\r
+        custom_dial_info->time_font);\r
+        ble_dial_file_count=*(data+sizeof(msg_recv_custom_dial_info_t));\r
+        printf(" custom_dial file_count %d\r\n",ble_dial_file_count);\r
+        \r
     }\r
-    char * filename = malloc(dialinfo.file_name_len);\r
-    uint8_t file_count = data[sizeof(msg_recv_dial_info_t)+dialinfo.file_name_len];\r
-    if (filename == NULL)\r
+    else\r
     {\r
-        printf("file name malloc failed  filename_len %d\n",dialinfo.file_name_len);\r
-        return ERRCODE_FAIL;\r
+        dialinfo.file_name_len = pdialinfo->file_name_len;\r
+        // dialinfo.file_type = pdialinfo->file_type;\r
+\r
+        if (dialinfo.file_name_len < 0 || dialinfo.file_name_len >255)\r
+        {\r
+            printf("file name len should in [0,255] \n");\r
+            return ERRCODE_FAIL;\r
+        }\r
+        char * filename = malloc(dialinfo.file_name_len);\r
+        ble_dial_file_count= data[sizeof(msg_recv_dial_info_t)+dialinfo.file_name_len];\r
+        if (filename == NULL)\r
+        {\r
+            printf("file name malloc failed  filename_len %d\n",dialinfo.file_name_len);\r
+            return ERRCODE_FAIL;\r
+        }\r
+        memcpy_s(filename,dialinfo.file_name_len,data+sizeof(msg_recv_dial_info_t),dialinfo.file_name_len);\r
+        buffer_handle->file_recv_stat.file_name = filename;\r
+        \r
+        printf(" dial name = %s, dial file count = %d \n",\r
+            filename,\r
+            ble_dial_file_count\r
+        );\r
+        free(filename);\r
+\r
     }\r
-    memcpy_s(filename,dialinfo.file_name_len,data+sizeof(msg_recv_dial_info_t),dialinfo.file_name_len);\r
-    buffer_handle->file_recv_stat.file_name = filename;\r
-    \r
-    printf(" dial name = %s, dial file count = %d \n",\r
-        filename,\r
-        file_count\r
-    );\r
+   \r
     buffer_handle->file_recv_stat.received_size = 0;\r
     buffer_handle->file_recv_stat.lrcvalue = 0;\r
     buffer_handle->receive_file_flag = 0;\r
@@ -5719,7 +5971,7 @@ errcode_t decode_dial_info(ble_read_data *buffer_handle)
     TRANSMIT_DATA=TRANS_DIAL_TRANSMITTING;\r
     CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
 \r
-    free(filename);\r
+    \r
     return ERRCODE_SUCC;\r
 \r
 }\r
@@ -5745,6 +5997,9 @@ errcode_t decode_single_dial_info(ble_read_data *buffer_handle)
     msg_recv_single_dial_info_t *pdialinfo=(msg_recv_single_dial_info_t*)data;\r
 \r
     dialinfo.dial_count = pdialinfo->dial_count;\r
+\r
+    ble_dial_file_index= dialinfo.dial_count;\r
+\r
     dialinfo.dial_uid = pdialinfo->dial_uid;\r
     dialinfo.file_name_len = pdialinfo->file_name_len;\r
     dialinfo.file_type = pdialinfo->file_type;\r
@@ -5822,10 +6077,22 @@ static errcode_t install_dial(void)
         }\r
         printf("dial_basename %s\n",dial_basename);\r
         char dialbin_filepath[128]={0};\r
-        if (get_dial_file_path(dial_basename,strlen(dial_basename),dialbin_filepath,sizeof(dialbin_filepath)) != ERRCODE_SUCC)\r
+        if(ble_dial_uid>=5)\r
         {\r
-            return ERRCODE_FAIL;\r
+            if (get_dial_file_path(dial_basename,strlen(dial_basename),dialbin_filepath,sizeof(dialbin_filepath)) != ERRCODE_SUCC)\r
+            {\r
+                return ERRCODE_FAIL;\r
+            }\r
         }\r
+        else\r
+        {\r
+            if (get_custom_dial_file_path(ble_dial_uid,strlen(dial_basename),dialbin_filepath,sizeof(dialbin_filepath)) != ERRCODE_SUCC)\r
+            {\r
+                return ERRCODE_FAIL;\r
+            }\r
+        }\r
+       \r
+\r
         printf("dialbin_filepath %s\n",dialbin_filepath);\r
         char lzma_filepath[128]={0};\r
         if (get_file_recv_file_path(lzmapkgname,strlen(lzmapkgname),lzma_filepath,sizeof(lzma_filepath)) != ERRCODE_SUCC)\r
@@ -5840,10 +6107,22 @@ static errcode_t install_dial(void)
 \r
         char *namebuf= strtok(lzmapkgname,".");\r
 \r
-        install_Register_dial(namebuf,ble_dial_uid);\r
+        if(ble_dial_uid>=5)\r
+        {\r
+            install_Register_dial(namebuf,ble_dial_uid);\r
+\r
+            ble_set_dial_by_id(ble_dial_uid);\r
+\r
+        }\r
+        else\r
+        {\r
 \r
-        ble_set_dial_by_id(ble_dial_uid);\r
+            install_Register_dial(namebuf,ble_dial_uid);\r
 \r
+            ble_set_dial_by_id(ble_dial_uid);\r
+        }\r
+        \r
+       \r
         //安装完后删除表盘\r
         printf("remove  %s\r\n",lzma_filepath);\r
 \r
@@ -5955,11 +6234,14 @@ void decode_file_checksum(ble_read_data *buffer_handle)
                     {\r
                         //ble_set_dial_by_id(ble_dial_uid);\r
 \r
-                        TRANSMIT_DATA= TRANS_DIAL_SUCC;\r
-                        CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-\r
+                        if(ble_dial_uid>=5 ||  ble_dial_file_index==ble_dial_file_count)\r
+                        {\r
+                            TRANSMIT_DATA= TRANS_DIAL_SUCC;\r
+                            CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
                         //0504\r
-                        ble_reply_cmd(DIAL_INSTALL_REPY_CMD,1);\r
+                            ble_reply_cmd(DIAL_INSTALL_REPY_CMD,1);\r
+                        }\r
+                        \r
 \r
 \r
                       //  ble_reply_cmd(GET_TRANS_END_CMD,1);\r
@@ -6117,6 +6399,85 @@ void type2AE0Data(ble_read_data *buffer_handle)
     }\r
    \r
 }\r
+//\r
+void type2AE6Data(ble_read_data *buffer_handle,uint8_t *cmd_buf ,uint8_t *data,uint16_t datalen,uint8_t *totaldata,uint8_t crcvalue)\r
+{\r
+    uint16_t cmd = cmd_buf[1]*256+cmd_buf[2];\r
+     #ifdef BLE_LOG\r
+    \r
+    #endif\r
+    printf("typeHexOneData:0x%04X\r\n",cmd);\r
+    // uint8_t typeID = cmd_buf[2];\r
+    switch (cmd)\r
+    {\r
+        case OTA_FILE_MSG_CMD  :\r
+        {\r
+            if (decode_ota_json( buffer_handle) == ERRCODE_SUCC)\r
+            {\r
+                ble_reply_cmd(OTA_FILE_MSG_CMD,1);\r
+            }else{\r
+                ble_reply_cmd(OTA_FILE_MSG_CMD,2);\r
+            }               \r
+        }\r
+        break;\r
+\r
+        case DIAL_COLLECT_FILE_CMD  :\r
+        {\r
+            if (decode_dial_info( buffer_handle) == ERRCODE_SUCC)\r
+            {\r
+                ble_reply_cmd(DIAL_COLLECT_FILE_CMD,1);\r
+            }else{\r
+                ble_reply_cmd(DIAL_COLLECT_FILE_CMD,2);\r
+            }\r
+            break;             \r
+        }\r
+\r
+        case DIAL_SINGEL_FILE_CMD  :\r
+        {\r
+           if (decode_single_dial_info(buffer_handle) == ERRCODE_SUCC)\r
+            {\r
+                ble_reply_cmd(DIAL_SINGEL_FILE_CMD,1);\r
+\r
+            }else{\r
+                ble_reply_cmd(DIAL_SINGEL_FILE_CMD,2);\r
+\r
+            }         \r
+            break;      \r
+        }\r
+        case MP3_FILE_CMD  :\r
+        {\r
+            if (decode_mp3_json( buffer_handle) == ERRCODE_SUCC)\r
+            {\r
+                ble_reply_cmd(MP3_FILE_CMD,1);\r
+            }else{\r
+                ble_reply_cmd(MP3_FILE_CMD,2);\r
+            }              \r
+        }\r
+        break;\r
+        // case OTA_FILE_DATA_CMD :\r
+        // {\r
+        //     if (decode_ota_data( buffer_handle,data,datalen, crcvalue) == ERRCODE_SUCC)\r
+        //     {\r
+\r
+        //     }else{\r
+        //         ble_reply_cmd(OTA_FILE_DATA_CMD,0);\r
+        //     }               \r
+        // }\r
+\r
+        case OTA_FILE_SUCC_CMD :\r
+        {\r
+            decode_file_checksum(buffer_handle);\r
+            break;\r
+        }\r
+            \r
+        case OTA_FILE_FAIL_CMD :\r
+            break;\r
+        default:\r
+            break;\r
+    }\r
+}\r
+   \r
+\r
 \r
 \r
 void dumpHeader(msg_header_t *msgheader)\r
@@ -6151,94 +6512,20 @@ errcode_t check_header(msg_header_t *header )
         return ERRCODE_FAIL;\r
     }\r
 }\r
-static uint8_t timer_flie_type=0;\r
-static uint32_t timer_flie_flag=0;\r
-ble_read_data* ble_read_timer_p=NULL;\r
+\r
 \r
 errcode_t cancel_recv_file(ble_read_data *buffer_handle)\r
 {\r
 \r
-    buffer_handle->receive_file_flag = 0;\r
-\r
-    if (buffer_handle->file_recv_stat.recv_file_stat != 2) //已经下载完毕的文件,没有必要cancel了。\r
+    if(BR_TRANSFER_timer)\r
     {\r
-\r
-        if (buffer_handle->file_recv_stat.file!=NULL)\r
-        {\r
-            fclose(buffer_handle->file_recv_stat.file);\r
-            buffer_handle->file_recv_stat.file = NULL;\r
-        }\r
-        if (buffer_handle->file_recv_stat.file_name != NULL)\r
-        {\r
-            free(buffer_handle->file_recv_stat.file_name);\r
-            buffer_handle->file_recv_stat.file_name=NULL;\r
-        }\r
-        buffer_handle->file_recv_stat.recv_file_stat = -1;\r
-\r
-        if(BR_TRANSFER_timer)\r
-        {\r
-           timer_flie_flag=1;\r
-        }\r
-\r
-        ble_reply_cmd(FILE_RECV_REPLY_STAT_CMD,0);//接收失败\r
+        timer_flie_flag=1;\r
     }\r
+    ble_reply_cmd(FILE_RECV_REPLY_STAT_CMD,0);//接收失败\r
+    \r
     return ERRCODE_SUCC;\r
 }\r
 \r
-\r
-static void  ble_transfer_Timer_CallBack(int data)\r
-{\r
-    timer_flie_flag--;\r
-\r
-    if(timer_flie_flag==0)\r
-    {\r
-        if(timer_flie_type==1)\r
-        {\r
-            TRANSMIT_DATA=TRANS_OTA_FAIL;\r
-        }\r
-        else if (timer_flie_type==3)\r
-        {\r
-            TRANSMIT_DATA=TRANS_DIAL_FAIL;\r
-        }\r
-        else\r
-        {\r
-            TRANSMIT_DATA=TRANS_FREE;\r
-        }\r
-        \r
-        ble_read_timer_p->receive_file_flag = 0;\r
-\r
-        if (ble_read_timer_p->file_recv_stat.recv_file_stat != 2) //已经下载完毕的文件,没有必要cancel了。\r
-        {\r
-\r
-            if (ble_read_timer_p->file_recv_stat.file!=NULL)\r
-            {\r
-                fclose(ble_read_timer_p->file_recv_stat.file);\r
-                ble_read_timer_p->file_recv_stat.file = NULL;\r
-            }\r
-            if (ble_read_timer_p->file_recv_stat.file_name != NULL)\r
-            {\r
-                free(ble_read_timer_p->file_recv_stat.file_name);\r
-                ble_read_timer_p->file_recv_stat.file_name=NULL;\r
-            }\r
-            ble_read_timer_p->file_recv_stat.recv_file_stat = -1;\r
-\r
-            ble_read_timer_p=NULL;\r
-\r
-            ble_reply_cmd(FILE_RECV_REPLY_STAT_CMD,0);//接收失败\r
-        }\r
-        CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-\r
-        if(BR_TRANSFER_timer)\r
-        {\r
-            osTimerStop(BR_TRANSFER_timer);\r
-            osTimerDelete(BR_TRANSFER_timer);\r
-            BR_TRANSFER_timer = NULL;\r
-        }\r
-\r
-    }\r
-}\r
-uint8_t OTA_FILE_value=0;\r
-\r
 uint8_t get_OTA_recv_value()\r
 {\r
     return OTA_FILE_value;\r
@@ -6441,6 +6728,8 @@ void bleLongRecvData(ble_read_data *buffer_handle,uint8_t *data, uint16_t data_s
         case 0x04:\r
             type2AE0Data(buffer_handle);\r
             break;\r
+        case 0x06:\r
+            type2AE6Data(buffer_handle,buf_cmd,data,data_size,totalData,crcvalue);\r
         default:\r
             break;\r
     }\r
@@ -6472,11 +6761,15 @@ errcode_t combine_data_internal(ble_read_data *buffer_handle,uint8_t *totalData,
 {\r
 \r
 \r
-    if(buffer_handle->receive_file_flag == 1)\r
+    if(buffer_handle->receive_file_flag == 1 )\r
     {\r
         //接收文件\r
+        if(buffer_handle->handle==data2ae6Cmd)\r
+        return decode_ota_data( buffer_handle,totalData,event_size,totalData[event_size-1]);\r
+        else\r
         return handle_recv_file(buffer_handle,totalData,event_size);\r
     }\r
+\r
     msg_header_t *header =  (msg_header_t*)totalData;        \r
     //第一帧\r
     if (event_size > sizeof(msg_header_t) && check_header(header) == ERRCODE_SUCC  )\r
index abd584d..b04903a 100644 (file)
@@ -800,7 +800,11 @@ bool get_ctkd_flag(void);
 #define OTA_FILE_MSG_CMD  0x0601 
 #define OTA_FILE_DATA_CMD 0x0602
 #define OTA_FILE_SUCC_CMD 0x0603 
-#define OTA_FILE_FAIL_CMD 0x0604 
+#define OTA_FILE_FAIL_CMD 0x0604
+///////////// 
+#define DIAL_COLLECT_FILE_CMD 0x0605
+#define DIAL_SINGEL_FILE_CMD 0x0606 
+#define MP3_FILE_CMD 0x0607
 
 #ifdef __cplusplus
 }
index 4e0ea4f..997050c 100644 (file)
@@ -49,6 +49,9 @@ extern "C" {
 /* Gatt service UUID */\r
 #define BLE_SERVICE_UUID 0x18e0\r
 /* Gatt Characteristic UUID */\r
+//自定义 ota 文件传输特征值\r
+#define BLE_ZHIHUI_OTA_ID 0x2ae6\r
+\r
 #define BLE_CHARACTERISTIC_RECV_ID 0x2ae5\r
 #define BLE_CHARACTERISTIC_SNED_SHORT_ID 0x2ae3\r
 \r
@@ -114,6 +117,7 @@ uint16_t data2ae2Cmd = 0;//read
 uint16_t data2ae1Cmd = 0;//安卓消息来电\r
 uint16_t data2ae0Cmd = 0;//OTA\r
 \r
+uint16_t data2ae6Cmd = 0;//自定义OTA \r
 \r
 void get_phone_addr(bd_addr_t *addr)\r
 {\r
@@ -131,6 +135,7 @@ enum{
     BLE_CHARACTERISTIC_SNED_OTA_ID_PROPERTIES = GATT_CHARACTER_PROPERTY_BIT_WRITE|GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP,\r
     BLE_CHARACTERISTIC_SNED_ANDRIOD_ID_PROPERTIES = GATT_CHARACTER_PROPERTY_BIT_WRITE|GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP,\r
     BLE_CHARACTERISTIC_READ_BATTERY_ID_PROPERTIES = GATT_CHARACTER_PROPERTY_BIT_READ|GATT_CHARACTER_PROPERTY_BIT_NOTIFY,\r
+    BLE_ZHIHUI_OTA_ID_ID_PROPERTIES=GATT_CHARACTER_PROPERTY_BIT_WRITE|GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP,\r
 };\r
 static uint8_t ble_adv_falg = 0;\r
 static bool g_custom_ble_init_flag = false;\r
@@ -379,6 +384,35 @@ static void srv_ble_add_chart_decr_ota(uint8_t server_id,uint16_t srv_handle)
         // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
     }\r
 }\r
+\r
+//自定义 ota 文件传输协议\r
+static void srv_ble_add_chart_decr_Zhihui_ota(uint8_t server_id,uint16_t srv_handle)\r
+{   \r
+    errcode_t ret = 0;\r
+    static uint8_t ota_val[] = {0x00, 0x00};\r
+    gatts_add_chara_info_t character;\r
+    gatts_add_desc_info_t descriptor;\r
+    bts_data_to_uuid_len2(BLE_ZHIHUI_OTA_ID, &character.chara_uuid);\r
+    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ;\r
+    character.properties = BLE_ZHIHUI_OTA_ID_ID_PROPERTIES;\r
+    character.value_len = (uint16_t)sizeof(ota_val);\r
+    character.value = ota_val;\r
+\r
+    ret = gatts_add_characteristic(server_id, srv_handle, &character);\r
+    if (ret != ERRCODE_SUCC) {\r
+        // ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);\r
+    }\r
+    bts_data_to_uuid_len2(BLE_UUID_USER_CHARACTERISTIC_CONF, &descriptor.desc_uuid);\r
+    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE|GATT_ATTRIBUTE_PERMISSION_READ;\r
+    descriptor.value_len = (uint16_t)sizeof(ota_val);\r
+    descriptor.value = ota_val;\r
+    \r
+    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);\r
+    if (ret != ERRCODE_SUCC) {\r
+        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
+    }\r
+}\r
+\r
 //用于adnriod发送消息添加特征值和描述符\r
 static void srv_ble_add_chart_decr_andriod(uint8_t server_id,uint16_t srv_handle)\r
 {   \r
@@ -767,6 +801,8 @@ static void svr_ble_bt_gatts_service_add_cb(uint8_t server_id, bt_uuid_t *uuid,
         srv_ble_add_chart_decr_short_cmd(server_id,srv_handle);\r
         srv_ble_add_chart_decr_long_cmd(server_id,srv_handle);\r
         srv_ble_add_chart_decr_recv_cmd(server_id,srv_handle);\r
+        srv_ble_add_chart_decr_Zhihui_ota(server_id,srv_handle);\r
+\r
         gatts_start_service(server_id, srv_handle);\r
     }\r
     if (ble_gatts_cmp_uuid(uuid, &hid_service_uuid) == true){\r
@@ -822,15 +858,24 @@ static void svr_ble_bt_gatts_characteristic_add_cb(uint8_t server_id, bt_uuid_t
     bt_uuid_t hid_report_uuid_2a4d = {0};\r
     bts_data_to_uuid_len2(BLE_UUID_REPORT, &hid_report_uuid_2a4d);\r
 \r
-    bt_uuid_t alipay_report_uuid = {0};\r
-    bts_data_to_uuid_len2(ALIPAYY_CHARACTERISTIC_ID, &alipay_report_uuid);\r
+    bt_uuid_t hid_report_uuid_2ae6 = {0};\r
+    bts_data_to_uuid_len2(BLE_ZHIHUI_OTA_ID, &hid_report_uuid_2ae6);\r
+\r
+    // bt_uuid_t alipay_report_uuid = {0};\r
+    // bts_data_to_uuid_len2(ALIPAYY_CHARACTERISTIC_ID, &alipay_report_uuid);\r
 \r
-    if(ble_gatts_cmp_uuid(uuid, &alipay_report_uuid))\r
+    // if(ble_gatts_cmp_uuid(uuid, &alipay_report_uuid))\r
+    // {\r
+    //     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " alipay_handle  %d\r\n",result->value_handle);\r
+    //     alipay_handle = result->value_handle;\r
+    // }\r
+    if(ble_gatts_cmp_uuid(uuid, &hid_report_uuid_2ae6))\r
     {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " alipay_handle  %d\r\n",result->value_handle);\r
-        alipay_handle = result->value_handle;\r
+        if(data2ae6Cmd==0)\r
+        {\r
+            data2ae6Cmd=result->value_handle;\r
+        }\r
     }\r
-\r
     if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data_2ae5))\r
     {\r
         if(g_ble_server_handle == 0)\r
index 6a10f93..6bcfa2b 100644 (file)
@@ -22,6 +22,7 @@ extern uint16_t data2ae4Cmd;
 extern uint16_t data2ae5Cmd;
 extern uint16_t data2ae1Cmd;//安卓消息来电
 extern uint16_t data2ae0Cmd;//OTA
+extern uint16_t data2ae6Cmd;//自定义OTA
 extern uint16_t ble_nus_max_data_len;
 extern uint16_t alipay_handle;
 extern uint16_t g_ble_conn_id;