From: Caisking Date: Thu, 11 Sep 2025 10:49:46 +0000 (+0800) Subject: 增加GPS轨迹协议内容 X-Git-Tag: leiniao_debug_1.0.0_20250922_020716~92^2~2^2~2 X-Git-Url: http://git.snicker.com.cn/css/static/gitweb.css?a=commitdiff_plain;h=f52f959b4f7935763b5a72ba459456db52dba549;p=mirrors%2FFD230.git 增加GPS轨迹协议内容 --- diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/src/TraingModel.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/src/TraingModel.cpp index a04225d76..b6d67d677 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/src/TraingModel.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/src/TraingModel.cpp @@ -3341,6 +3341,18 @@ bool get_training_heart_path_(char *path, uint32_t time, uint32_t max_len) { return true; } +//获取gps轨迹路径 +bool get_training_gps_path_(char *path, uint32_t time, uint32_t max_len) { + std::string str = OHOS::TraingModel::GetInstance()->GetGPSDataPath(time); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "get_training_gps:%s\r\n", + str.c_str()); + if (str.length() <= 3) { + return false; + } + memcpy_s(path, max_len, str.c_str(), str.length()); + return true; +} + char *struct_to_json_buf_malloc_(uint8_t day) { cJSON *dataJSON = cJSON_CreateObject(); cJSON *data_arryJSON = cJSON_CreateArray(); @@ -3400,6 +3412,7 @@ extern bleInstruct_t_ bleInstruct_t; void ble_training_init(void) { bleInstruct_t.get_training_spead_path_cb = get_training_spead_path_; bleInstruct_t.get_training_heart_path_cb = get_training_heart_path_; + bleInstruct_t.get_training_gps_path_cb = get_training_gps_path_; bleInstruct_t.struct_to_json_buf_malloc = struct_to_json_buf_malloc_; } diff --git a/code/sdk/zhihui/services/ble_service/blemoder/bleInstruct.cpp b/code/sdk/zhihui/services/ble_service/blemoder/bleInstruct.cpp index 5bf13bf79..a59d657ab 100644 --- a/code/sdk/zhihui/services/ble_service/blemoder/bleInstruct.cpp +++ b/code/sdk/zhihui/services/ble_service/blemoder/bleInstruct.cpp @@ -111,6 +111,11 @@ uint8_t get_dial_num() return SAFE_CALL_PTR_NO_ARGS(bleInstruct_t.get_dial_num_cb); } +int read_GPS_DATA(char *path ,uint8_t *out_buf) +{ + return SAFE_CALL_PTR(bleInstruct_t.read_GPS_DATA_cb, path, out_buf); +} + bool ble_is_Alipay_bind(void) { // return is_Alipay_bind(); @@ -132,6 +137,11 @@ bool get_training_spead_path(char *path ,uint32_t time,uint32_t max_len) return SAFE_CALL_BOOL(bleInstruct_t.get_training_spead_path_cb, path, time, max_len); } +bool get_training_gps_path(char *path ,uint32_t time,uint32_t max_len) +{ + return SAFE_CALL_BOOL(bleInstruct_t.get_training_gps_path_cb, path, time, max_len); +} + bool get_training_heart_path(char *path ,uint32_t time,uint32_t max_len) { diff --git a/code/sdk/zhihui/services/ble_service/blemoder/bleInstruct.h b/code/sdk/zhihui/services/ble_service/blemoder/bleInstruct.h index 4bf6d963f..33729065b 100644 --- a/code/sdk/zhihui/services/ble_service/blemoder/bleInstruct.h +++ b/code/sdk/zhihui/services/ble_service/blemoder/bleInstruct.h @@ -383,7 +383,7 @@ void ble_sos_data_save(void); void ble_SOS_data_init(void); bool get_training_spead_path(char *path ,uint32_t time,uint32_t max_len); - +bool get_training_gps_path(char *path ,uint32_t time,uint32_t max_len); bool get_training_heart_path(char *path ,uint32_t time,uint32_t max_len); void set_goal_other_notification(uint8_t data); @@ -408,14 +408,19 @@ errcode_t get_dial_file_path(char* input_dialname ,uint32_t input_size, char* ou uint16_t get_str_nodisplay_number(char *str, uint32_t max_len); +int read_GPS_DATA(char *path ,uint8_t *out_buf); + bool ble_bin_install(const char * data); typedef struct bleInstruct { uint16_t (*get_str_nodisplay_number_cb)(char *str, uint32_t max_len); + int (*read_GPS_DATA_cb)(char *path ,uint8_t *out_buf); + uint8_t (*get_dial_num_cb)(void); void (*set_ota_upgrade_cb)(void); bool (*get_training_spead_path_cb)(char *path ,uint32_t time,uint32_t max_len); bool (*get_training_heart_path_cb)(char *path ,uint32_t time,uint32_t max_len); + bool (*get_training_gps_path_cb)(char *path ,uint32_t time,uint32_t max_len); void (*ble_sos_data_save_cb)(void); diff --git a/code/sdk/zhihui/services/ble_service/blemoder/bleinstruct_sample.cpp b/code/sdk/zhihui/services/ble_service/blemoder/bleinstruct_sample.cpp index 991564211..1c555a118 100644 --- a/code/sdk/zhihui/services/ble_service/blemoder/bleinstruct_sample.cpp +++ b/code/sdk/zhihui/services/ble_service/blemoder/bleinstruct_sample.cpp @@ -30,7 +30,7 @@ #include "../../../../../../zhihui/config/include/ConfigModelC.h" #include "../../../../../../zhihui/utils/custom_runtime.h" -#ifdef FD230 + #include "uiservice/include/ui_service.h" #include "TraingModel.h" #include "WeatherModel.h" @@ -58,7 +58,6 @@ #include "MusicPlayerModel.h" #include "UiConfig.h" -#endif @@ -112,7 +111,6 @@ extern "C" { #define DIAL_DATA_DIR APP_DOWNLOAD_DIAL_PATH // #define DIAL_DATA_DIR "/user/dial/offline_dial" -#ifdef FD230 uint16_t get_str_nodisplay_number(char *str, uint32_t max_len) { @@ -147,6 +145,55 @@ uint16_t get_str_nodisplay_number(char *str, uint32_t max_len) { // printf("%s\r\n", str_); } +int read_GPS_DATA(char *path ,uint8_t *out_buf) +{ + FILE *fp= fopen(path,"rb+"); + if(fp==NULL) + { + return 0; + } + uint32_t file_size=0; + + int len=0; + + OHOS::GPSData_t data={0}; + + while (1) + { + int read_size=fread(&data,1,sizeof(data),fp); + if(read_size==sizeof(data) ) + { + + + int temp_data=data.timestamp; + memcpy_s(out_buf+len,4,&temp_data,sizeof(data.timestamp)); + printf("%d",temp_data); + len+=4; + + int temp_latitude=(int)(data.latitude *10000000); + memcpy_s(out_buf+len,4,&temp_latitude,sizeof(temp_latitude)); + // printf("temp_latitude :%d\r\n",temp_latitude); + len+=4; + + int temp_longitude=(int)(data.longitude*10000000); + memcpy_s(out_buf+len,4,&temp_longitude,sizeof(temp_longitude)); + // printf("temp_longitude :%d\r\n",temp_longitude); + len+=4; + + + } + else + { + break; + } + } + + fclose(fp); + + + return len; +} + char * get_dial_path(void) { @@ -3316,9 +3363,9 @@ void ble_set_sleep_remind(msg_get_sleep_param_info_t data) p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SLEEP_REMIND,data.bedtime_alarm); //更新睡眠配置 - #ifdef FD230 - OHOS::SleepModel::GetInstance().set_sleep_goal(); - #endif + + OHOS::SleepModel::GetInstance().set_sleep_goal(); + } return; @@ -3622,10 +3669,7 @@ void set_languaage(uint32_t id) char *addressbook(void)//获取通讯录保存文件地址路径 { - #ifdef FD230 return ADDRESS_BOOK_PATH; - #endif - return NULL; } void addressbookToRead(char *buf)//转化用于·c文件 @@ -4054,7 +4098,7 @@ bool IS_free_save_Mp3(uint32_t size) return true; } -#endif + #ifdef __cplusplus #if __cplusplus } diff --git a/code/sdk/zhihui/services/ble_service/bleservice/bleEvent.c b/code/sdk/zhihui/services/ble_service/bleservice/bleEvent.c index 2e152e411..464508c09 100644 --- a/code/sdk/zhihui/services/ble_service/bleservice/bleEvent.c +++ b/code/sdk/zhihui/services/ble_service/bleservice/bleEvent.c @@ -1,9211 +1,9299 @@ -/** - * Copyright (c) CompanyNameMagicTag 2023-2023. All rights reserved. - * Description: alipay bluetooth module. - * Author: - * Create: - */ - - -#ifdef __cplusplus -extern "C" { -#endif -#include "common_def.h" -#include "bts_def.h" -#include "bts_gatt_stru.h" -#include "bts_a2dp_source.h" -#include "bts_gatt_server.h" -#include "bts_le_gap.h" -#include "osal_task.h" -#include "securec.h" -#include "wearable_log.h" -#include -#include -#include "stdbool.h" -#include "bts_br_gap.h" - -#ifdef SUPPORT_BATTERY_SERVICE -#include "battery_hal.h" -#endif - -#include "bleService.h" -#include "alipay_feature.h" - -// #include "alipay_bluetooth.h" - -#include "bts_a2dp_sink.h" -#include "osal_timer.h" -#include "bleEvent.h" -#include "broadcast_feature.h" -#include -#if 1//#ifdef //SUPPORT_BLE_SERVICE -#include "app_common_api.h" -// #include "hidService.h" -#include "../../../../../open_source/openharmony/third_party/cJSON/cJSON.h" -#include "errcode.h" -#include "sys/statfs.h" - -#ifdef BLE_INSTRUCT -#include "bleInstruct.h" -#endif - -#include "custom_utils.h" -#include "custom_runtime.h" -#include "bleANCS.h" -#ifdef FD230 -#include "Bluetooyhpabpserver.h" -#endif -#include "custom_save_runtime.h" - -#define DEBUG_TEST (0) -#define CRC_CHECK_ERR 0 //crc校验失败 -#define JSON_CHECK_OK 1 //json解析成功 -#define JSON_CHECK_ERR 2 //json解析失败 - -#define AI_TXT_BUF_MAX_LEN 1024*3 //json解析失败 - - -#define MAX_BLE_EVENT_DIAL_NUM (10) //表盘最大数量 - -#include "upg_common_porting.h" - - -uint32_t packdataLen = 0; -uint32_t totalDataLen = 0; -uint8_t totalpack = 0; -uint8_t cmd_data[17]; -uint8_t *recvData; -#include "los_memory.h" - -#define MAX_BLE_MSG_PACKAGE_LEN (1024*5) //包缓存最大5k -#define BLE_MSG_TMP_FILE_NAME "/user/userdata/ble_tmp_buf_%04X" -typedef struct -{ - int handle; - int data_len ; - int totalDataLen; - int buffer_to_file; //1 buffer to file , 0 buffer to ram - int decode_type; //1 with header , 2 no header - FILE *tmpfilehandle;// 如果buffer to file , 则在此保存handle - msg_header_t cmd_header; - uint8_t *data;//if buffer_to_file is 1, than data is the filename , else data is the ram buffer. - uint8_t crcvalue; - uint8_t lrcvalue; //计算crc用的临时变量 - uint8_t lrcvalue2; //计算crc用的临时变量 - uint32_t last_timestamp;// last package receive time - uint8_t receive_file_flag;//1 接收文件 0 不接收文件 - file_recv_stat_t file_recv_stat; - uint8_t last_data_sample[5]; //专门给文件传输过程中重复包判定用。目前只是取前5个字节,实际应该再做优化算法。 - uint16_t last_data_size;//专门给传输过程中重复包判定用,记录上一个包的长度,至少长度相同才有判断重复的必要。同时也可以作为少于5个字节的包的判定依据。 -} ble_read_data; - -#define MAX_HANDLE_NUM 10 -//LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemInfoGet(VOID *pool, LOS_MEM_POOL_STATUS *poolStatus) -//根据特征值分开组合读取的数据,并处理 -static ble_read_data handle_l[MAX_HANDLE_NUM]={0}; -errcode_t cancel_recv_file(uint8_t flag); - -static char app_name[64]={0}; - -uint8_t ble_dial_file_count=0; -uint8_t ble_dial_file_index=0; -uint8_t *bigDataBuf = NULL;//大数据buf -uint8_t bigDataBufLen=0; -bool sendbigDataBufState = false;//发送大数据表示不要被其他指令打断 -bool recvBigDataBufState = false;//接收大数据标志 -static bool muiltFlag = 0;//多包数据flag -static bool ANCSBigBufFlag = 0;//ANCS多包数据flag -// static uint16_t data_len = 0; -ble_recv_data_info_t ble_recv_data; -static uint8_t TRANSMIT_DATA; -static osTimerId_t BR_TRANSFER_timer=NULL; -static uint32_t timer_flie_flag=0; -ble_read_data* ble_read_timer_p=NULL; - -#ifdef SINGLE_USER_PARTITION -#define UP_DATE_FWPKG_PATH UPG_FILE_NAME - -#else -#define UP_DATE_FWPKG_PATH UPG_FILE_NAME -#endif - - -//MP3文件重命名 -static errcode_t create_mp3_name(char* path,char*dir_path ,char* file_name) -{ - - sprintf_s(path,256,"%s/",dir_path); - uint16_t path_len=strlen(path); - - - if(strstr(file_name,".mp3")) - { - //"光-陈粒.128.mp3" - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s\r\n",file_name); - int len=strlen(file_name)-strlen(".mp3"); - for(int i=0;i=5 || output_file_path == NULL || filename == NULL) - { - return ERRCODE_FAIL; - } - char name[64]={0}; - ble_get_dial_path(name,id); - int ret; - if(id == 1 && strcmp(filename, "main_bg") == 0) //自定义视频表盘Id 1 只有背景需要是mp4 main_bg - { - ret = sprintf_s(output_file_path,max_output_size,"%s/%s.mp4",name,filename); - } - else - { - ret = sprintf_s(output_file_path,max_output_size,"%s/%s.bin",name,filename); - } - if (ret < 0) - return ERRCODE_FAIL; - - return ERRCODE_SUCC; - -} - - - - -int char_to_dec(char ch) -{ - int num = 0; - if(ch >= '0' && ch <= '9') { - num = num * 10 + (ch - '0'); - } - return num; -} -void char_to_big(uint8_t *src_str,uint8_t *res_str,uint8_t len) -{ - for(uint8_t i = 0;i= 'a' && src_str[i] <= 'z') { - src_str[i] = src_str[i] - 32; - } - } - memcpy(res_str,src_str,len); -} -void cameram_data(void)//拍照发送数据 调用这个接口即可 -{ - uint8_t data[2]={0x01,0x00}; - errcode_t ret = ble_hid_server_send_input_report(&data,2); - osal_msleep(100); /* wait 100 ms */ - memset(data,0,2); - (void)ble_hid_server_send_input_report(&data, 2); /* 上报按下按键 把停止发送指令也要发送 防止一直拍照*/ -} - -bool bigDataBufState=false;//大数据传输状态 -/** - * 计算crc时的求和函数,可以递归,从而实现多段数据的组合计算 -*/ -// uint8_t calculate_lrc(uint8_t *data,uint16_t len,uint8_t _lrcValue) -// { -// uint8_t lrcValue = _lrcValue; -// if(data == NULL) -// { -// return false; -// } -// for(uint16_t i = 0; i < len; i++) -// { -// lrcValue =lrcValue+ data[i]; -// // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%02x ",data[i]); -// } -// return lrcValue; -// } - - -/*** - * 根据求和后的数据计算crc 值 -*/ -// uint8_t get_crc_from_lrc(uint8_t lrcValue) -// { -// uint8_t crcbuf = 0; -// crcbuf = lrcValue%256; -// crcbuf = 256-crcbuf; -// crcbuf = crcbuf%256; -// return crcbuf; -// } - -uint8_t calculate_lrc_file(char *file_path) -{ - uint8_t lrcValue =0; - FILE * fp = fopen(file_path,"rb+"); - - char data[1]={0}; - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"calculate_lrc_file %s\r\n",file_path); - uint8_t read_size=0; - - if(fp==NULL) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"fopen fail %s\r\n",file_path); - return 0; - } - do - { - memset_s(data,1,0,1); - read_size=fread(data,1,1,fp); - lrcValue+=data[0]; - - }while(read_size==1); - - fclose(fp); - return lrcValue; -} - - -#define USE_DEMO -static bool Check_CRC(uint8_t *data,uint16_t len,uint8_t crcvalue)//计算20byte的的校验位 -{ - uint8_t crcbuf = 0; - uint8_t lrcValue = 0x00; - if(data == NULL) - { - return false; - } - lrcValue = calculate_lrc(data,len,0x00); - - crcbuf = get_crc_from_lrc(lrcValue); - - #ifdef BLE_LOG - WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Check_CRC lrc: 0x%x ,ret crc: 0x%x ,crcvalue 0x%x , len:%d\r\n",lrcValue,crcbuf,crcvalue,len); - #endif - if(crcbuf == crcvalue) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Check_CRC true:\r\n"); - return true; - } - else{ - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Check_CRC false:\r\n"); - if(uapi_dev_runtime_get_android_connection_status()==1) - return true; - else - #ifndef USE_DEMO - return false; - #else - return true; - #endif - } - -} - - -// uint8_t Calculate_CRC(uint8_t *data,uint16_t len)//计算20byte -// { -// uint8_t crcbuf = 0; -// uint8_t lrcValue = 0x00; -// lrcValue = calculate_lrc(data+17,len-17,0x00); -// crcbuf = get_crc_from_lrc(lrcValue); -// return crcbuf; -// } - -uint8_t Calculate_CRC_AI(uint8_t *data,uint16_t len) -{ - return Calculate_CRC(data,len); -} - -// uint8_t Calculate_CRC_Big(uint8_t *data,uint16_t len)//计算20byte -// { -// uint8_t crcbuf = 0; -// uint8_t lrcValue = 0x00; -// lrcValue = calculate_lrc(data,len,0x00); -// crcbuf = get_crc_from_lrc(lrcValue); -// return crcbuf; -// } - -static cJSON *cjson_json_tmp = NULL; -//发送ble数据 -errcode_t sendBleData(uint8_t *buf,uint16_t len) -{ - errcode_t ret = ERRCODE_FAIL; - #ifdef BLE_LOG - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"bigDataBufState:%d and sendbigDataBufState %d\r\n",bigDataBufState,sendbigDataBufState); - #endif - //if(Bleconnect == true ) - { - ret = svr_ble_bt_gatts_noyify(buf,len); - } - return ret; - -} - - -errcode_t sendBleData_zhihui(uint8_t *buf,uint16_t len) -{ - errcode_t ret = ERRCODE_FAIL; - #ifdef BLE_LOG - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"bigDataBufState:%d and sendbigDataBufState %d\r\n",bigDataBufState,sendbigDataBufState); - #endif - //if(Bleconnect == true ) - { - ret = svr_ble_bt_gatts_noyify_zhihui(buf,len); - } - return ret; - -} - - -void sendDataNow(uint8_t *buf,uint16_t len) -{ - //if(Bleconnect == true ) - { - svr_ble_bt_gatts_noyify(buf,len); - } -} - -void send_Data_Now_zh(uint8_t *buf,uint16_t len) -{ - { - svr_ble_bt_gatts_noyify_zhihui(buf,len); - } -} - - - -void send_big_data(ble_data_type type,char *data, uint16 datalen) -{ - // 动态分配内存空间,防止堆栈溢出 - uint8_t *buf =NULL; - buf = ym_malloc(17 + datalen + 1); - memset_s(buf,ble_nus_max_data_len,0,17 + datalen + 1); - if (buf == NULL && datalen!=0) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"内存分配失败\n"); - return; - } - if(type.Packet_id>=2) - { - msleep(get_ble_interval()+5);//多包数据发送增加延迟 - } - // 设置消息头部信息 - buf[0] = 0x72; // 消息头 - buf[1] = type.type; // 类型 - buf[2] = type.type_id; // 类型ID - memcpy(buf + 3, &type.packet_total, 4); // 总包数 - memcpy(buf + 7, &type.total, 4); // 总数据长度 - memcpy(buf + 11, &type.Packet_id, 4); // 数据包ID - memcpy(buf + 15, &datalen, 2); // 包数据长度 - - // 处理数据和计算CRC - if (data == NULL) { - //数据为空 按照18个字节总长度发送给app - buf[17] = 0x00; // 直接写0x00的校验和 - } else { - memcpy(buf + 17, data, datalen); // 复制数据到缓冲区 - buf[17 + datalen] = Calculate_CRC_Big((uint8_t *)data, datalen); // 计算CRC - } - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"data:\r\n"); - - for(int i=0;i<17 + datalen + 1;i++) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%x ",buf[i]); - } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"end\r\n"); - - // 根据标志位选择发送数据的方式 - if(type.type==6) - { - send_Data_Now_zh(buf, 17 + datalen + 1); - } - else - { - sendDataNow(buf, 17 + datalen + 1); // 判断是否在传输或接收多包数据 - } - - - - ym_free(buf); // 释放内存空间 -} - -void send_long_data(char *buf, uint32_t pack_size,uint8_t type,uint8_t id) -{ - uint32_t data_len = strlen(buf); - uint32_t surplus_len=data_len; - uint32_t pack; - if(data_len%pack_size==0) - { - pack=data_len/pack_size; - } - else - { - pack=data_len/pack_size+1; - } - uint32_t pack_id=1; - uint32_t offset=0; - while (surplus_len!=0) - { - if(surplus_len>=pack_size) - { - surplus_len=surplus_len-pack_size; - - ble_data_type type_={type,id,data_len,pack,pack_id}; - send_big_data(type_,buf+offset,pack_size); - - //send_big_data(1,json_format+offset,pack_size,data_len,pack_id,pack,id,1); - offset+=pack_size; - } - else - { - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack); - ble_data_type type_={type,id,data_len,pack,pack_id}; - send_big_data(type_,buf+offset,surplus_len); - //send_big_data(1,json_format+offset,surplus_len,data_len,pack_id,pack,id,1); - break; - } - pack_id++; - } -} - - - -bool is_free_ota_update(uint32_t size) -{ - uint64_t free_size=0; - int i; - struct statfs file_buf = {0}; - FILE *fp=NULL; - fp=fopen(UP_DATE_FWPKG_PATH,"rb+"); - if(fp) - { - fclose(fp); - remove(UP_DATE_FWPKG_PATH); - } - -#ifdef SINGLE_USER_PARTITION - static const char * const g_volume_names[1] = { "/user/"}; - for (i = 0; i < 1; i++) { -#else - static const char * const g_volume_names[4] = {"/system/", "/update/", "/music/", "/user/"}; - for (i = 0; i < 4; i++) { -#endif - - /* 获取文件系统状态 */ - if (statfs(g_volume_names[i], &file_buf) != 0) { - return false ; - } - - #ifdef SINGLE_USER_PARTITION - if(strcmp("/user/",g_volume_names[i])==0) - { - free_size= ((uint64_t)(file_buf.f_bfree * file_buf.f_bsize)); - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"free_size :%ld\r\n",free_size); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"free_size :%lu\r\n",free_size); - } - int need_size=size*1.5; - if(need_size>free_size) - { - return false; - } - else - { - return true; - } - #else - //单分区不考虑是否足够空间 - return true; - #endif -#ifdef SINGLE_USER_PARTITION - } -#else - } -#endif - return false; -} - - - -//发送训练状态[app发起的运动] -void sendtraningstatedata(uint8_t state ,uint16_t time) -{ - char data[3]={0}; - uint32_t data_len=3; - data[0]=state; - memcpy(&data[1],&time,2); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"发送训练状态数据%d %d\r\n",data[0],time); - ble_data_type type={0x05,0x50,data_len,1,1}; - send_big_data(type,data,data_len); - -} - -//发送训练结束状态[手表发起] -void sendtraningstateend(void) -{ - char data[1]={0}; - uint32_t data_len=1; - data[0]=0; //[0 结束] - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"发送训练状态结束%d\r\n",data[0]); - - ble_data_type type={0x05,0x51,data_len,1,1}; - send_big_data(type,data,data_len); - //end_big_data(0,data,data_len,data_len,1,1,0x51,5); -} - -void sendtraningdata(msg_get_train_data_info_t *data) -{ - cJSON* dataJSON = cJSON_CreateObject(); - - if (dataJSON == NULL) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error creating JSON object\n"); - return; - } - - cJSON_AddNumberToObject(dataJSON,"st",data->st); - cJSON_AddNumberToObject(dataJSON,"hr",data->hr); - cJSON_AddNumberToObject(dataJSON,"ca",data->ca); - cJSON_AddNumberToObject(dataJSON,"di",data->di); - cJSON_AddNumberToObject(dataJSON,"stp",data->stp); - cJSON_AddNumberToObject(dataJSON,"ti",data->ti); - cJSON_AddNumberToObject(dataJSON,"pc",data->pc); - - char *jsonString = cJSON_PrintUnformatted(dataJSON); - - if (jsonString == NULL) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error printing JSON to string\n"); - cJSON_Delete(dataJSON); - return; - } - - uint32_t data_len = strlen(jsonString); - cJSON_Delete(dataJSON); - - if (data_len == 0) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error: JSON string length is 0\n"); - return; - } - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"发送训练实时数据 %d %s\n", data_len, jsonString); - ble_data_type type={0x01,0x0f,data_len,1,1}; - send_big_data(type,jsonString,data_len); - - cJSON_free(jsonString); -} - -static uint8_t AI_is_end_state=0; - -//查询AI 模型是否可用,结果通过2AE4返回 -/*使用模型: -0:文心一言 -1:ChatGPT -2:KIMI -3:豆包*/ -void inquire_AI_is_ready(uint8_t type) -{ - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"查询AI模型,是否准备就绪\r\n"); - ble_data_type type_={0x05,0x06,1,1,1}; - send_big_data(type_,(char *)&type,1); - //send_big_data(0, (char *)&type, 1, 1, 1, 1, 0x06, 5); -} - -void watch_synchronization_time(void) -{ - ble_data_type type_={0x05,0x02,0,1,1}; - send_big_data(type_,NULL,0); -} - - - -//发送ble数据 -uint8_t phone_mac[6];//手机下发的mac地址 第一次连接为空 -uint8_t parie_mac[6];//配对完成之后的的mac地址 -uint8_t phoneDataFlag = 0; -//发送配对指令 -void sendConfirmParieSucess(void) -{ - uint8_t value[19]; - memset(value,0,19); - value[0] = 0x72; - value[1] = 0x05; - value[2] = 0x11; - uint32_t tmp = 1; - uint16_t tmp_data = 1; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - value[17] = 0x01; - value[18] = Calculate_CRC(value,1+18); - sendBleData(value,19); -} - -uint8_t phoneType = 0; - - - - -errcode_t UnbindSucessCmd(uint8_t flag)//发送解绑指令,解绑界面调用这个函数 如果点了✓调用这个函数 返回成功后延迟10s再重启设备 -{ - errcode_t sendok = ERRCODE_FAIL; - uint32_t tmp = 1; - uint8_t value[19]; - uint8_t crcvalue = 0; - memset(value,0,19); - memset(value,0,19); - value[0] =0x72; - value[1] =0x05; - value[2] =0x12; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp,2); - value[17] = flag; - value[18] = Calculate_CRC(value,18); - sendok = sendBleData(value,19); - msleep(3*get_ble_interval());//增加延时,确保可以成功发送解除绑定 - - bd_addr_t addr={0}; - get_phone_addr(&addr,g_ble_conn_id); - - bool ret = bt_is_acl_connected(&addr); - if(flag == 1) - { - if(0!=remove(PHONE_WATCH_CONFIG_PATH)) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"json remove fail\r\n"); - } - gap_ble_remove_all_pairs(); - gap_remove_all_pairs(); - } - - - - return sendok; -} - -void watch_clean_pairs(void) -{ - if(0!=remove(PHONE_WATCH_CONFIG_PATH)) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"json remove fail\r\n"); - } - gap_ble_remove_all_pairs(); - gap_remove_all_pairs(); -} - - -void getDeviceState(void)//获取设备状态 -{ - bd_addr_t addr={0}; - get_phone_addr(&addr,g_ble_conn_id); - - bool ret = bt_is_acl_connected(&addr); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"getDeviceState ret:%d\r\n",ret); -} - -void clearPaireFlag(uint8_t flag) -{ - uint8_t value[19]; - uint8_t crcvalue = 0; - memset(value,0,19); - uint32_t tmp = 1; - value[0] =0x72; - value[1] =0x01; - value[2] =0x10; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp,2); - value[17] = flag; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - - UnbindSucessCmd(1);//1确认解绑; - - // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_RESTORE_FACTORY_SETTING, NULL, 0);//恢复出厂 - uint8_t shutdowflag = 2;//恢复出厂 - CustomEventPublish(TOPIC_EVENT_SHUTDOWN_ANIMATIOR, &shutdowflag, sizeof(shutdowflag)); - //uapi_reboot_device(); -} -void clearPaireCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)//发送清除配对指令 -{ - if(Check_CRC(data,len,crcvalue)) - { - //弹出清除配对界面不弹出是则发送0x02操作失败 1操作成功 0校验失败 - clearPaireFlag(1); - } - else - { - clearPaireFlag(0); - } -} -uint8_t *savephonename=NULL; -//确认配对指令 -uint8_t first_bond = 0;//是否第一次绑定 第一次绑定保存配对mac地址 -void comfirmPaire(uint8_t flag) -{ - uint8_t value[19]; - memset(value,0,19); - uint32_t tmp = 1; - value[0] =0x72; - value[1] =0x05; - value[2] =0x11; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp,2); - value[17] = flag; - value[18] = Calculate_CRC(value,1+17); - sendBleData(value,19); - if(flag == 1) - { - first_bond = 1; - - if(get_ble_pair()) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP," gap_ble_pair \r\n"); - - bd_addr_t addr={0}; - get_phone_addr(&addr,g_ble_conn_id); - - errcode_t code = gap_ble_pair_remote_device(&addr); - if(code!=ERRCODE_SUCC) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"gap_ble_pair_remote_device fail %X\r\n",code); - } - } - - - }else{ - first_bond = 0; - errcode_t ret = 0; - bd_addr_t addr={0}; - get_phone_addr(&addr,g_ble_conn_id); - - ret = gap_ble_disconnect_remote_device(&addr);//与固定的mac设置地址进行断开连接 - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"gap_ble_disconnect_remote_device %x\r\n",ret); - ret = gap_ble_remove_all_pairs(); - bool ret_ok = gap_remove_all_pairs(); - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"gap_remove_all_pairs %x %x\r\n",ret,ret_ok); - if(savephonename != NULL) - { - ym_free(savephonename); - savephonename = NULL; - } - } -} - -// l连接手表之后-app通过特征值2AE4读手表信息->手表会把相应的信息给app->app通过73 02 10下发手机信息给设备(第一次连接mac为空)->设备返回73 02 10状态1才能和手机app第一次连接->设备会回发配对指令72 05 11给app,同时设备会对手机发起配对->手机点了配对后,配对成功手表会发配对成功指令72 05 10,这条指令包含手机的mac地址也会传给app->app校验解析成功之后->app下发时间指令72 02 02给设备->设备回复解析成功->完成连接 -void alarmData(void) -{ - -} - - -void getPhoneNameLen(uint8_t *data,uint8_t *datalen,uint8_t *type)//获取手机设备名称长度 -{ - uint8_t len = 0; - uint8_t *json = data; - cJSON* root = cJSON_Parse((const char *)json); - - if(root != NULL) - { - cJSON* pn = cJSON_GetObjectItem(root, "pn"); - if (pn && cJSON_IsString(pn)) { - len = strlen(pn->valuestring)+1; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"设备名称: %s len:%d\n", pn->valuestring,len); - } - cJSON* tp = cJSON_GetObjectItem(root, "tp"); - if(tp && cJSON_IsNumber(tp)) - { - *type=tp->valueint; - } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d\r\n",type); - - cJSON* bond=cJSON_GetObjectItem(root, "bond"); - if(bond) - { - - } - *datalen = len; - cJSON_Delete(root); - } else{ - len = 0; - *datalen = len; - } -} -#define PHONE_NAME_MAX_LEN 50 -static uint8_t *getPhoneName(uint8_t *data)//获取手机设备名称 -{ - uint8_t *json = data; - uint8_t *str = NULL; - cJSON* root = cJSON_Parse((const char *)json); - if(root != NULL) - { - cJSON* pn = cJSON_GetObjectItem(root, "pn"); - if (pn && cJSON_IsString(pn)) { - uint8_t datalen = strlen(pn->valuestring)+1; - if(datalen > PHONE_NAME_MAX_LEN) // - { - datalen = PHONE_NAME_MAX_LEN; - } - if(datalen - 1 > 0){ - pn->valuestring[datalen]='\0'; - str = ym_malloc(sizeof(char)*datalen); - if(str != NULL) - { - memcpy(str,(uint8_t *)pn->valuestring,datalen+1); - } - if(savephonename) - { - ym_free(savephonename); - savephonename=NULL; - } - savephonename = ym_malloc(sizeof(char)*datalen); - if(savephonename != NULL){ - memcpy(savephonename,(uint8_t *)pn->valuestring,datalen+1); - } - } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"设备名称: %s\n", pn->valuestring); - } - cJSON_Delete(root); - } - if (str == NULL){ - return NULL; - } - else{ - return str; - } - -} -void getPhoneMac(uint8_t *data,uint8_t *phoneMac)//获取手机设备mac这个是手表上传给手机的mac地址 -{ - uint8_t *json = data; - uint8_t phone_tmp[6]; - memset(phone_tmp,0,6); - cJSON* root = cJSON_Parse((const char *)json); - uint8_t datalen = 0; - uint8_t count = 5; - if(root != NULL) - { - cJSON* mac = cJSON_GetObjectItem(root, "mac"); - if (mac && cJSON_IsArray(mac)) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"MAC地址: "); - cJSON* macElement = NULL; - cJSON_ArrayForEach(macElement, mac) { - if (cJSON_IsNumber(macElement)) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d", macElement->valueint); - if (macElement->prev != NULL) { - phone_tmp[count] = macElement->valueint; - count--; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,", "); - } - } - } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"\n"); - } - - memcpy(phoneMac,phone_tmp,6); - cJSON_Delete(root); - } - else{ - memset(phoneMac,0,6); - } -} - -void GetwatchSaveMac(uint8_t *mac,uint8_t *mactype)//获取手表本地保存的mac地址和mac地址类型 分共有和私有的 -{ - uint8_t mac_tmp[6]; - memset(mac_tmp,0,6); - uint8_t count = 0; - uint8_t type= 0; - FILE *jsfile = fopen(PHONE_WATCH_CONFIG_PATH, "r"); - if (jsfile != NULL) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"succes opening file\n"); - fseek(jsfile, 0, SEEK_END); - long fileSize = ftell(jsfile); - fseek(jsfile, 0, SEEK_SET); - - char *jsonData = (char *)ym_malloc(fileSize + 1); - fread(jsonData, 1, fileSize, jsfile); - jsonData[fileSize] = '\0'; - fclose(jsfile); - // 解析JSON数据 - cJSON *root = cJSON_Parse(jsonData); - // 释放资源 - ym_free(jsonData); - if (root != NULL) { - cJSON *modifiedJson = cJSON_GetObjectItem(root,"mac"); - if (cJSON_IsArray(modifiedJson)) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"watch MAC地址: "); - cJSON* macElement = NULL; - cJSON_ArrayForEach(macElement, modifiedJson) { - if (cJSON_IsNumber(macElement)) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d", macElement->valueint); - if ((macElement->prev != NULL)) { - mac_tmp[count] = macElement->valueint; - count++; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,", "); - } - } - } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"\n"); - } - cJSON *mac_type = cJSON_GetObjectItem(root,"mac_type"); - if(cJSON_IsNumber(mac_type)) - { - *mactype = mac_type->valueint; - } - } - if(mac_tmp[0] == 0 && mac_tmp[1] == 0 && mac_tmp[2] == 0 && mac_tmp[3] == 0 && mac_tmp[4] == 0 && mac_tmp[5] == 0){ - memset(mac,0,6); - }else - { - memcpy(mac,mac_tmp,6); - } - cJSON_Delete(root); - }else - { - memset(mac_tmp,0,6); - memcpy(mac,mac_tmp,6); - *mactype = 0; - } -} -static void GetwatchSaveNameLen(uint8_t *datalen)//获取手表本地保存的手机设备名称长度 -{ - uint8_t len = 0; - FILE *jsfile = fopen(PHONE_WATCH_CONFIG_PATH, "r"); - if (jsfile != NULL) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetwatchSaveNameLen opening file\n"); - fseek(jsfile, 0, SEEK_END); - long fileSize = ftell(jsfile); - fseek(jsfile, 0, SEEK_SET); - - char *jsonData = (char *)ym_malloc(fileSize + 1); - fread(jsonData, 1, fileSize, jsfile); - jsonData[fileSize] = '\0'; - fclose(jsfile); - - // 解析JSON数据 - cJSON *root = cJSON_Parse(jsonData); - ym_free(jsonData); - if (root != NULL) { - cJSON *pn = cJSON_GetObjectItem(root,"pn"); - if(cJSON_IsString(pn)) - { - len = strlen(pn->valuestring)+1;//多加一个加上字符串的结束符\0 - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetwatchSaveNameLen;%d",len); - } - }; - *datalen = len; - // memcpy(datalen,&len,1); - // 释放资源 - cJSON_Delete(root); - }else{ - len = 0; - *datalen = len; - } -} -static uint8_t *GetwatchSaveName(void)//获取手表本地保存的手机设备名称 -{ - uint8_t count = 0; - uint8_t *str = NULL; - FILE *jsfile = fopen(PHONE_WATCH_CONFIG_PATH, "r"); - if (jsfile != NULL) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"succes opening file\n"); - fseek(jsfile, 0, SEEK_END); - long fileSize = ftell(jsfile); - fseek(jsfile, 0, SEEK_SET); - - char *jsonData = (char *)ym_malloc(fileSize + 1); - fread(jsonData, 1, fileSize, jsfile); - jsonData[fileSize] = '\0'; - fclose(jsfile); - - // 解析JSON数据 - cJSON *root = cJSON_Parse(jsonData); - ym_free(jsonData); - // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ym_free ym_malloc_count:%d ym_free_count:%d\r\n",ym_malloc_count,ym_free_count); - if (root != NULL) { - cJSON *pn = cJSON_GetObjectItem(root,"pn"); - if(cJSON_IsString(pn)) - { - uint8_t showname_len = strlen(pn->valuestring)+1; - if(showname_len > 50) - { - showname_len = PHONE_NAME_MAX_LEN; - } - if(showname_len-1 > 0){ - str = ym_malloc(sizeof(char)*showname_len); - if(str != NULL) - { - pn->valuestring[showname_len]='\0'; - memcpy(str,(uint8_t *)pn->valuestring,showname_len+1); - } - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetwatchSaveName:%s",pn->valuestring); - } - } - } - // 释放资源 - cJSON_Delete(root); - } - if (str == NULL) - { - return NULL; - }else{ - return str; - } - -} - -void cleanUnbindInfor(uint8_t flag)//和旧手机解绑清除配对信息 -{ - uint8_t value[19]; - memset(value,0,19); - uint32_t tmp = 1; - uint16_t tmp_fen= 1; - value[0] =0x72; - value[1] =0x05; - value[2] =0x11; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_fen,2); - value[17] = 0x03;// - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - - uint8_t MacType = 0; - uint8_t mac_data[6]; - memset(mac_data,0,6); - GetwatchSaveMac(&mac_data,&MacType); - - bd_addr_t addr={0}; - get_phone_addr(&addr,g_ble_conn_id); - - errcode_t ret1 = gap_disconnect_remote_device(&addr); - gap_ble_disconnect_remote_device(&addr);//与固定的mac设置地址进行断开连接 - - if (flag == 1){ - errcode_t ret= gap_ble_remove_pair(&addr);//清除配对信息 - - gap_ble_remove_all_pairs(); - bool ret_flag = gap_remove_all_pairs(); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"ret_flag:%d ret:%x\r\n",ret_flag,ret); - if(0!=remove(PHONE_WATCH_CONFIG_PATH)) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"json remove fail\r\n"); - } - set_ble_falg(0); - do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_RESTORE_FACTORY_SETTING, NULL, 0);//恢复出厂 - //uapi_reboot_device(); - } -} -static bool ctkd_flag_ble=false; - -void set_ctkd_flag(bool flag) -{ - ctkd_flag_ble=flag; -} -bool get_ctkd_flag(void) -{ - return true;//ctkd_flag_ble; -} -void sendBindInfor(uint8_t *data) -{ - uint8_t value[19]; - memset(value,0,19); - uint32_t tmp = 1; - uint16_t tmp_fen= 1; - value[0] =0x72; - value[1] =0x02; - value[2] =0x10; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_fen,2); - - uint8_t copare_mac[6]; - memset(copare_mac,0,6); - uint8_t datalen=0; - uint8_t *devname = NULL; - uint8_t devnamelen = 0; - uint8_t mac_tmp[6]; - memset(mac_tmp,0,6); - uint8_t phone_type; - uint8_t bond = 1;//未与任何手机绑定过 - errcode_t ret = 0; - first_bond = 0; - uint8_t save_mac[6]; - memset(save_mac,0,6); - uint8_t MacType = 0; - - GetwatchSaveMac(&save_mac,&MacType);//获取手表设备本地保存的mac地址和mac地址类型 - getPhoneMac(data,&copare_mac); - - if(save_mac[0] == 0 && save_mac[1] == 0 && save_mac[2] == 0 && save_mac[3] == 0 && save_mac[4] == 0 && save_mac[5] == 0)//只要手表本地存储没有mac地址就走连接流程重新绑定 - { - bond = 0x01;//手表未和任何手机绑定过 - //未配过使能一键双联 - - //清除一次配对 - //if(get_ble_pair()) - - // - value[17] = bond;// - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - - #ifdef SUPPORT_DEVICE_PAIRING_NOTIFICATION - #ifdef SUPPORT_A5133_SERVICE_BLE_PAIR - comfirmPaire(1); - #else - devnamelen = 0; - getPhoneNameLen(data,&devnamelen,&phone_type);//获取手机下发的手机设备名称长度 - - if(phone_type==0) - { - unsigned int paired_devices_num=0; - bool gap_get_paired =gap_get_paired_devices_num(&paired_devices_num); - if(gap_get_paired!=true ||paired_devices_num!=0 ) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"sendBindInfor!!!!!!!!!:gap_remove_all_pairs \r\n"); - gap_remove_all_pairs(); - } - } - - - if(devnamelen > 0 ) - { - - devname = getPhoneName(data); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"devname!!!!!!!!!:%s devnamelen:%d",devname,devnamelen); - if (devname != NULL){ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"phone devname is name!!!!!!!!!\r\n"); - uint8_t buf[devnamelen+2]; - memset(buf,0,devnamelen+2); - buf[0] = DEVICEBIND ; - buf[1] = devnamelen;//设备名称长度 0不显示 - memcpy(buf+2,devname,devnamelen); - - if(phone_type==1) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"IOS\r\n"); - ble_set_pair(1); - - errcode_t ret = gap_ble_set_ctkd_enable(true); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "iPhone gap_ble_set_ctkd_enable ret = %x", ret); - set_ctkd_flag(true); - } - else - { - ble_set_pair(0); - - errcode_t ret = gap_ble_set_ctkd_enable(true); - - } - - CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,(uint8_t *)buf,devnamelen+2); - // comfirmPaire(1); - if(devname) - { - ym_free(devname); - devname = NULL; - } - }else{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"phone devname is no name11111!!!!!!!!!:"); - uint8_t buf[2]; - memset(buf,0,2); - buf[0] = DEVICEBIND; - buf[1] = 0; - CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,buf,2); - // comfirmPaire(1); - - } - } - else{ - uint8_t buf[2]; - memset(buf,0,2); - buf[0] = DEVICEBIND; - buf[1] = 0 ; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"phone devname is no name!!!!!!!!!:"); - CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,buf,2); - // comfirmPaire(1); - } - #endif - #endif - - return; - - }else - { - if(copare_mac[0] == 0 && copare_mac[1] == 0 && copare_mac[2] == 0 && copare_mac[3] == 0 && copare_mac[4] == 0 && copare_mac[5] == 0) - { - bond = 0x03;//手表和其他手机绑定过 - - }else{//如果手机有保存mac app下发是空就提示和其他手机绑定过界面不在发起配对 - int result = memcmp(copare_mac,save_mac,6); - if(result == 0) - { - - if(get_ble_pair()) - { - set_ctkd_flag(true); - errcode_t ret = gap_ble_set_ctkd_enable(true); - - } - else - { - errcode_t ret = gap_ble_set_ctkd_enable(true); - } - - - if(get_ble_pair()) - { - bd_addr_t addr={0}; - get_phone_addr(&addr,g_ble_conn_id); - - errcode_t code = gap_ble_pair_remote_device(&addr); - if(code!=ERRCODE_SUCC) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"gap_ble_pair_remote_device fail %X\r\n",code); - } - } - - bond = 0x02;//手表与该手机绑定过 - value[17] = bond;// - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - return; - }else{ - bond = 0x03;//手表与其他手机绑定过 - } - } - } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"bond flag:%d first_bond:%d\r\n",bond,first_bond); - - if(bond == 0x03) - { - devnamelen = 0; - GetwatchSaveNameLen(&devnamelen);//获取手表设备保存手机的设备名称长度 - if(devnamelen > 0) - { - devname = GetwatchSaveName(); - if (devname != NULL){ - uint8_t buf[devnamelen+2]; - memset(buf,0,devnamelen+2); - buf[0] = DEVICEUNBIND ; - buf[1] = devnamelen; - memcpy(buf+2,devname,devnamelen); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"devname:is no null!!!!!%s\r\n",devname); - CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,(uint8_t *)buf,devnamelen+2); - if(devname) - { - ym_free(devname); - devname = NULL; - } - }else{ - uint8_t buf[2]; - memset(buf,0,2); - buf[0] = DEVICEUNBIND; - buf[1] = 0; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"devname:is null!!!!!"); - CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,buf,2); - } - }else{ - uint8_t buf[2]; - memset(buf,0,2); - buf[0] = DEVICEUNBIND; - buf[1] = 0; - CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,buf,2); - } - } - value[17] = bond;// - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); -} -void SetPhoneInfo(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取手机信息 -{ - uint8_t value[19]; - memset(value,0,19); - uint32_t tmp = 1; - uint16_t tmp_fen= 1; - value[0] =0x72; - value[1] =0x02; - value[2] =0x10; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_fen,2); - phoneDataFlag = 1; - - if(Check_CRC(data,len,crcvalue)) - { - sendBindInfor(data); - }else{ - value[17] = 0x00; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } -} - - -void sendParieSuccess(uint8_t flag,bd_addr_t *addr)//发送配对成功指令to app -{ - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sendParieSuccess:0x%x-0x%x-0x%x-0x%x-0x%x-0x%x\r\n",addr->addr[0],addr->addr[1],addr->addr[2],addr->addr[3],addr->addr[4],addr->addr[5]); - if(g_ble_conn_id==0) - { - return; - - } - if(first_bond == 1 && phoneDataFlag == 1)//第一次连接绑定 - { - set_ble_falg(1); - uint8_t value[25]; - uint8_t length = 0; - memset(value,0,25); - value[0] = 0x72; - value[1] = 0x05; - value[2] = 0x10; - uint32_t totalpack= 1;//总的包数 - uint32_t data_len = 7;//数据长度 - uint32_t pack_index= 1;//分包序号Index - uint16_t pack_dataLen = 7; - memcpy(value+3,&totalpack,4); - memcpy(value+7,&data_len,4); - memcpy(value+11,&pack_index,4); - memcpy(value+15,&pack_dataLen,2); - value[17] = flag;//1 配对成功 0 配对失败 - if(flag == 1)//配对成功 - { - cJSON *dataJSON = cJSON_CreateObject(); - if(dataJSON==NULL) - { - return; - } - - cJSON* arrayJSON = cJSON_CreateArray(); - if(arrayJSON==NULL) - { - return; - } - for(uint8_t id = 0;id<6;id++) - { - cJSON_AddNumberToObject(arrayJSON,"id",addr->addr[id]); - } - if(savephonename != NULL) - { - cJSON_AddStringToObject(dataJSON,"pn",(char *)savephonename); - ym_free(savephonename); - savephonename = NULL; - } - cJSON_AddNumberToObject(dataJSON,"phoneType",phoneType); - cJSON_AddNumberToObject(dataJSON,"mac_type",addr->type); - cJSON_AddItemToObject(dataJSON,"mac",arrayJSON); - - char *jsonString = cJSON_PrintUnformatted(dataJSON); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"phone %s",jsonString); - FILE *file = fopen(PHONE_WATCH_CONFIG_PATH, "wb"); - if (file) - { - if (fputs(jsonString, file) != EOF) // 将 JSON 字符串写入文件 - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WriteJsonData success\n"); - } - fclose(file); - } - // ym_free(jsonString); - cJSON_free(jsonString); - cJSON_Delete(dataJSON); - // 读取JSON文件 - - //memcpy(value+18,addr->addr,6); - value[18]=addr->addr[5]; - value[19]=addr->addr[4]; - value[20]=addr->addr[3]; - value[21]=addr->addr[2]; - value[22]=addr->addr[1]; - value[23]=addr->addr[0]; - - memcpy(parie_mac,addr->addr,6); - length = 18+6; - uint8_t crcvalue = Calculate_CRC(value,length); - value[length] = crcvalue; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sendParieSuccess:%d length:%d crcvalue:%d",sizeof(value),length,crcvalue ); - sendBleData(value,length+1); - }else{ - length = 18; - uint8_t crcvalue = Calculate_CRC(value,length); - value[length] = crcvalue; - length = length+1; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sendParieSuccess:%d length:%d crcvalue:%d",sizeof(value),length,crcvalue ); - sendBleData(value,length); - } - phoneDataFlag = 0; - } - - -} - - -//02类型的指令数据 - -void checkCrcSend(uint8_t type,uint8_t typeID,uint8_t crcflag)//获取时间 -{ - uint32_t tmp = 1; - uint16_t tmp_data = 1; - uint8_t sendBuf[19]; - memset(sendBuf,0,19); - sendBuf[0] = 0x72; - sendBuf[1] = type; - sendBuf[2] = typeID; - memcpy(sendBuf+3,&tmp,4); - memcpy(sendBuf+7,&tmp,4); - memcpy(sendBuf+11,&tmp,4); - memcpy(sendBuf+15,&tmp_data,2); - sendBuf[17] = crcflag; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - -} -//发送查找手机 -void senfindphoneSend(uint8_t flag) -{ - uint32_t tmp = 1; - uint16_t tmp_data = 1; - uint8_t sendBuf[19]; - memset(sendBuf,0,19); - sendBuf[0] = 0x72; - sendBuf[1] = 0x05; - sendBuf[2] = 0x01; //3 - memcpy(sendBuf+3,&tmp,4); - memcpy(sendBuf+7,&tmp,4); - memcpy(sendBuf+11,&tmp,4); //15 - memcpy(sendBuf+15,&tmp_data,2); //17 - sendBuf[17] = flag; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); -} - -static uint8_t jsonCheck_time(uint8_t *buf)//json 格式解析 -{ - // char time_data[24]; - // memset(time_data,0,24); - - uint8_t *json; - json = buf; - cJSON* root = cJSON_Parse((const char *)json); - if (root == NULL) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"时间 JSON解析错误\n"); - return 2; - } - char *locations; - int year = 1970; - uint8_t month = 1; - uint8_t day = 1; - uint8_t week = 4; - uint8_t hour = 0; - uint8_t minute = 0; - uint8_t second = 0; - uint32_t timestamp; - cJSON* time = cJSON_GetObjectItem(root, "time"); - if (time && cJSON_IsNumber(time)) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"time: %d\n", time->valueint); - timestamp = time->valueint; - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"time: %d\n", time->valueint); - } - cJSON* jsweek = cJSON_GetObjectItem(root, "week"); - if (jsweek && cJSON_IsNumber(jsweek)) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"week: %d\n", jsweek->valueint); - week = jsweek->valueint; - } - cJSON* jsyear = cJSON_GetObjectItem(root, "year"); - if (jsyear && cJSON_IsNumber(jsyear)) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"year: %d\n", jsyear->valueint); - year = jsyear->valueint; - } - cJSON* jsmonth = cJSON_GetObjectItem(root, "month"); - if (jsmonth && cJSON_IsNumber(jsmonth)) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"month: %d\n", jsmonth->valueint); - month = jsmonth->valueint; - } - cJSON* jsday = cJSON_GetObjectItem(root, "day"); - if (jsday && cJSON_IsNumber(jsday)) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"day: %d\n", jsday->valueint); - day = jsday->valueint; - } - cJSON* jshour = cJSON_GetObjectItem(root, "hour"); - if (jshour && cJSON_IsNumber(jshour)) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"hour: %d\n", jshour->valueint); - hour = jshour->valueint; - } - cJSON* jsminute = cJSON_GetObjectItem(root, "minute"); - if (jsminute && cJSON_IsNumber(jsminute)) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"minute: %d\n", jsminute->valueint); - minute = jsminute->valueint; - } - cJSON* jssecond = cJSON_GetObjectItem(root, "second"); - if (jssecond && cJSON_IsNumber(jssecond)) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"second: %d\n", jssecond->valueint); - second = jssecond->valueint; - } - cJSON* location = cJSON_GetObjectItem(root, "location"); - if (location && cJSON_IsString(location)) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"location: %s\n", location->valuestring); - locations = location->valuestring; - } - // sprintf((char *)time_data,"%d-%d-%d %d:%d:%d",year+2000,month,day,hour,minute,second); - // set_system_time(time_data); - - - /***计算timezone*/ - struct tm tmp={0}; - tmp.tm_year = year+2000 - 1900; - tmp.tm_mon = month -1; - tmp.tm_mday = day; - tmp.tm_hour = hour; - tmp.tm_min = minute; - tmp.tm_sec = second; - time_t timestamp2 = __tm_to_secs(&tmp); - int16_t timezone = (timestamp2-timestamp)/60/15; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"timezone in quarters %d\n",timezone); - uapi_set_timezone(timezone); //要在uaip_sntp_set_time_utc 之前执行才有效 - /********/ - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"time: %d\n",timestamp ); - - uaip_sntp_set_time_utc(timestamp); - - cJSON_Delete(root); - return 1; -} - - - - -void SetUTCtime(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取时间 -{ - uint32_t tmp = 1; - uint16_t tmp_data = 1; - uint8_t sendBuf[19]; - memset(sendBuf,0,19); - sendBuf[0] = 0x72; - sendBuf[1] = 0x02; - sendBuf[2] = 0x02; - memcpy(sendBuf+3,&tmp,4); - memcpy(sendBuf+7,&tmp,4); - memcpy(sendBuf+11,&tmp,4); - memcpy(sendBuf+15,&tmp_data,2); - - if(Check_CRC(data,len,crcvalue)) - { - - uint8_t set_ok = 1; - set_ok = jsonCheck_time(data); - sendBuf[17] = set_ok; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - - } - else - { - sendBuf[17] = 0; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } - -} -static training_ble training_ble_data; -//设置训练目标 -static uint8_t jsonCheck_targetparam(uint8_t *buf) -{ - uint8_t *json; - json = buf; - cJSON* root = cJSON_Parse((const char *)json); - if (root == NULL) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"时间 JSON解析错误\n"); - return 2; - } - - memset(&training_ble_data, 0, sizeof(training_ble)); - - cJSON* ty = cJSON_GetObjectItem(root, "ty");//目标类型 - if (cJSON_IsNumber(ty)) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"ty: %d\n", ty->valueint); - training_ble_data.sportTagType = ty->valueint; - training_ble_data.controlmd = SETGOAL; - - cJSON* targetItem = NULL; - switch (training_ble_data.sportTagType) - { - case 0: // 距离 - targetItem = cJSON_GetObjectItem(root, "di");//目标距离 - break; - case 1: // 卡路里 - targetItem = cJSON_GetObjectItem(root, "ca");//目标卡路里 - break; - case 2: // 时间 - targetItem = cJSON_GetObjectItem(root, "tm");//目标时间 - break; - case 3: // 步数 - targetItem = cJSON_GetObjectItem(root, "st");//目标步数 - break; - default: - break; - } - - if (targetItem && cJSON_IsNumber(targetItem)) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s: %d\n", targetItem->string, targetItem->valueint); - training_ble_data.sportTag = targetItem->valueint; - cJSON_Delete(root); - CustomEventPublish(TOPIC_EVENT_BLE_TRAINING, (uint8_t*)&training_ble_data, sizeof(training_ble)); - return JSON_CHECK_OK; - } - } - - cJSON_Delete(root); - return JSON_CHECK_ERR; -} - - -void SetTarinTarget(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置训练目标 -{ - uint32_t tmp = 1; - uint16_t tmp_data = 1; - uint8_t sendBuf[19]; - memset(sendBuf,0,19); - sendBuf[0] = 0x72; - sendBuf[1] = 0x02; - sendBuf[2] = 0x04; - memcpy(sendBuf+3,&tmp,4); - memcpy(sendBuf+7,&tmp,4); - memcpy(sendBuf+11,&tmp,4); - memcpy(sendBuf+15,&tmp_data,2); - - if(Check_CRC(data,len,crcvalue)) - { - uint8_t set_ok = 1; - set_ok = jsonCheck_targetparam(data); - sendBuf[17] = set_ok; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } - else - { - sendBuf[17] = 0; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } - -} - -static void SetOtherTarget(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取其他目标 -{ - uint32_t tmp = 1; - uint16_t tmp_data = 1; - uint8_t sendBuf[19]; - memset(sendBuf,0,19); - sendBuf[0] = 0x72; - sendBuf[1] = 0x02; - sendBuf[2] = 0x17; - memcpy(sendBuf+3,&tmp,4); - memcpy(sendBuf+7,&tmp,4); - memcpy(sendBuf+11,&tmp,4); - memcpy(sendBuf+15,&tmp_data,2); - - if(Check_CRC(data,len,crcvalue)) - { - // 73 2 17 1 0 0 0 8 0 0 0 1 0 0 0 8 0 2c 1 a 8 1e 1 1 1 2 - - uint16_t target_kcal = data[0]+data[1]*256;//目标卡路里 - uint8_t target_km = data[2];//目标里程 - uint8_t target_stand = data[3];//目标站立 - uint8_t target_fattime = data[4];//目标燃脂 - - uint8_t ring = data[5];//铃声 - uint8_t vibratior = data[6];//振动 - uint8_t notify = data[7];//通知 - if(target_km) - set_goal_discount(target_km); - if(target_stand) - set_goal_standupcount(target_stand); - if(target_fattime) - set_goal_durationcount(target_fattime); - if(target_kcal) - set_goal_caloriescount(target_kcal); - - // set_SilentMode(ring); - // set_vibrationremiander(vibratior); - // set_notify_switch(notify); - if(ring && vibratior && notify) - set_goal_other_notification(1); - else - set_goal_other_notification(0); - - - sendBuf[17] = 1; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } - else - { - sendBuf[17] = 0; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } - -} -static void jsonCheck_alarm(uint8_t *buf)//json 解析闹钟数据 -{ - uint8_t *json; - json = buf; - cJSON* root = cJSON_Parse((const char *)json); - - if (root == NULL) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"闹钟 JSON解析错误\n"); - return; - } - else - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"闹钟 %s\r\n",json); - } - ble_delet_all_AlarmInfo(); - - cJSON* alarms = cJSON_GetObjectItem(root, "alarms"); - if(alarms==NULL) - { - return; - } - int alarmCount = cJSON_GetArraySize(alarms); - - for(int i=0;ivalueint; - - cJSON* repeat=cJSON_GetObjectItem(data,"repeat"); - if(repeat==NULL) - return; - - int array_size = cJSON_GetArraySize(repeat); - for(int j=0;jvalueint; - if(day==7) - { - week|=0b00000001; - } - else if(day!=0) - { - week|=0b00000001<<(day); - } - - } - - cJSON* hour_data=cJSON_GetObjectItem(data,"hour"); - if(hour_data==NULL) - { - return; - } - int hour=hour_data->valueint; - cJSON* minute_data=cJSON_GetObjectItem(data,"minute"); - if(minute_data==NULL) - { - return; - } - int minute=minute_data ->valueint; - cJSON* enable_data=cJSON_GetObjectItem(data,"enable"); - if(enable_data==NULL) - { - return; - } - int enable=enable_data ->valueint; - - ble_SetAlarmInfo(hour, minute,week,i,enable); - - } - cJSON_Delete(root); - ble_AlarmClock_refresh(); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"alarmCount %d\n",alarmCount); - -} - -void SetAlarmDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的屏幕参数 -{ - uint32_t tmp = 1; - uint16_t tmp_data = 1; - uint8_t sendBuf[19]; - memset(sendBuf,0,19); - sendBuf[0] = 0x72; - sendBuf[1] = 0x02; - sendBuf[2] = 0x21; - memcpy(sendBuf+3,&tmp,4); - memcpy(sendBuf+7,&tmp,4); - memcpy(sendBuf+11,&tmp,4); - memcpy(sendBuf+15,&tmp_data,2); - - if(Check_CRC(data,len,crcvalue)) - { - jsonCheck_alarm(data); - - sendBuf[17] = 1; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } - else - { - sendBuf[17] = 0; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } -} - - -void SetpasswordCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的屏幕参数 -{ - uint32_t tmp = 1; - uint16_t tmp_data = 1; - uint8_t sendBuf[19]; - memset(sendBuf,0,19); - sendBuf[0] = 0x72; - sendBuf[1] = 0x02; - sendBuf[2] = 0x1c; - memcpy(sendBuf+3,&tmp,4); - memcpy(sendBuf+7,&tmp,4); - memcpy(sendBuf+11,&tmp,4); - memcpy(sendBuf+15,&tmp_data,2); - - if(Check_CRC(data,len,crcvalue)) - { - char* buf[7]={0}; - - sprintf_s(buf,7,"%d%d%d%d%d%d",data[1],data[2],data[3],data[4],data[5],data[6]); - ble_set_password(data[0],buf); - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s\r\n",buf); - - sendBuf[17] = 1; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } - else - { - sendBuf[17] = 0; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } -} - - -void GetWatchLcdParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的屏幕参数 -{ - uint32_t tmp = 1; - uint16_t tmp_data = 1; - uint8_t sendBuf[19]; - memset(sendBuf,0,19); - sendBuf[0] = 0x72; - sendBuf[1] = 0x02; - sendBuf[2] = 0x0e; - memcpy(sendBuf+3,&tmp,4); - memcpy(sendBuf+7,&tmp,4); - memcpy(sendBuf+11,&tmp,4); - memcpy(sendBuf+15,&tmp_data,2); - - if(Check_CRC(data,len,crcvalue)) - { - uint8_t type = data[0]; - if(type == 0)//只设置屏幕亮度 - { - uint8_t brightness = data[1]; - set_brigthness(brightness); - }else if(type == 1)//设置亮屏时长 抬碗亮屏 - { - uint8_t screen_type = data[1];//ms级别 - - int screen_time = 5*1000; - switch (screen_type) - { - case 0: - screen_time = 5*1000; - break; - case 1: - screen_time = 10*1000; - break; - case 2: - screen_time = 15*1000; - break; - case 3: - screen_time = 30*1000; - break; - case 4: - screen_time = 60*1000; - break; - case 5: - screen_time = 60*5*1000; - break; - default: - break; - } - bool raise = data[2]; - - set_ScreenDuration(screen_time); - Set_RaiseToWake(raise); - } - sendBuf[17] = 1; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } - else - { - sendBuf[17] = 0; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } - -} - - - -void GetVoiceVibrateParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的声音与振动参数 -{ - uint32_t tmp = 1; - uint16_t tmp_data = 1; - uint8_t sendBuf[19]; - memset(sendBuf,0,19); - sendBuf[0] = 0x72; - sendBuf[1] = 0x02; - sendBuf[2] = 0x0f; - memcpy(sendBuf+3,&tmp,4); - memcpy(sendBuf+7,&tmp,4); - memcpy(sendBuf+11,&tmp,4); - memcpy(sendBuf+15,&tmp_data,2); - - if(Check_CRC(data,len,crcvalue)) - { - - uint8_t type = data[0]; - if(type == 0)//只改变系统音量参数 其他还是保持不变 按照原来的参数 - { - int sys_volume = data[1]; - Set_SystemVolume(sys_volume); - - }else if(type == 1)//只改变铃声音量参数 其他还是保持不变 按照原来的参数 - { - int ring_volume = 0; - - ring_volume = data[1]; - - Set_CallVolume(ring_volume); - - }else if(type == 2)//只改变媒体音量 - { - int ring_volume = 0; - ring_volume = data[1]; - Set_CallVolume(ring_volume); - } - else if(type == 3)//只改变铃声和振动开关 - { - int bell_on = data[1]; - int vibrate_on = data[2]; - set_SilentMode(bell_on); - set_vibrationremiander(vibrate_on); - } - - sendBuf[17] = 1; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } - else - { - sendBuf[17] = 0; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } - -} - -void GetHrSetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//app设置心率参数 -{ - uint32_t tmp = 1; - uint16_t tmp_data = 1; - uint8_t sendBuf[19]; - memset(sendBuf,0,19); - sendBuf[0] = 0x72; - sendBuf[1] = 0x02; - sendBuf[2] = 0x12; - memcpy(sendBuf+3,&tmp,4); - memcpy(sendBuf+7,&tmp,4); - memcpy(sendBuf+11,&tmp,4); - memcpy(sendBuf+15,&tmp_data,2); - - if(Check_CRC(data,len,crcvalue)) - { - msg_get_heart_set_param_info_t set_data; - - set_data.frequence = data[0]; - set_data.remind_on=data[1]; - set_data.max_min=data[2]; - set_data.heart=data[3]; - - Set_heart_cmd(&set_data); - sendBuf[17] = 1; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } - else - { - sendBuf[17] = 0; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } - -} - - -void GetSpo2SetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue) -{ - uint32_t tmp = 1; - uint16_t tmp_data = 1; - uint8_t sendBuf[19]; - memset(sendBuf,0,19); - sendBuf[0] = 0x72; - sendBuf[1] = 0x02; - sendBuf[2] = 0x13; - memcpy(sendBuf+3,&tmp,4); - memcpy(sendBuf+7,&tmp,4); - memcpy(sendBuf+11,&tmp,4); - memcpy(sendBuf+15,&tmp_data,2); - - if(Check_CRC(data,len,crcvalue)) - { - - msg_get_spo2_set_param_info_t set_data; - set_data.frequence = data[0]; - set_data.remind_on=data[1]; - set_data.spo2=data[2]; - - Set_oxygen_cmd(&set_data); - - sendBuf[17] = 1; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } - else - { - sendBuf[17] = 0; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } - -} - -void SetsleepSetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置睡眠 -{ - uint32_t tmp = 1; - uint16_t tmp_data = 1; - uint8_t sendBuf[19]; - memset(sendBuf,0,19); - sendBuf[0] = 0x72; - sendBuf[1] = 0x02; - sendBuf[2] = 0x15; - memcpy(sendBuf+3,&tmp,4); - memcpy(sendBuf+7,&tmp,4); - memcpy(sendBuf+11,&tmp,4); - memcpy(sendBuf+15,&tmp_data,2); - - if(Check_CRC(data,len,crcvalue)) - { - msg_get_sleep_param_info_t sleep_info; - sleep_info.schedule = data[0]; - if(len>=6) - { - sleep_info.bedtime_hour= data[1]; - sleep_info.bedtime_min= data[2]; - sleep_info.waketime_hour= data[3]; - sleep_info.waketime_min= data[4]; - sleep_info.bedtime_alarm= data[5]; - } - - ble_set_sleep_remind(sleep_info); - - sendBuf[17] = 1; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } - else - { - sendBuf[17] = 0; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } -} - -void SetDrinkSetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置喝水提醒s设置 -{ - uint32_t tmp = 1; - uint16_t tmp_data = 1; - uint8_t sendBuf[19]; - memset(sendBuf,0,19); - sendBuf[0] = 0x72; - sendBuf[1] = 0x02; - sendBuf[2] = 0x14; - memcpy(sendBuf+3,&tmp,4); - memcpy(sendBuf+7,&tmp,4); - memcpy(sendBuf+11,&tmp,4); - memcpy(sendBuf+15,&tmp_data,2); - - if(Check_CRC(data,len,crcvalue)) - { - msg_drink_info_t drink_info={0}; - drink_info.drink_on = data[0]; - if(data[1]) - { - drink_info.drink_on=2; - } - // drink_info.drink_on = data[1]; - drink_info.goal = data[2]+data[3]*256; - drink_info.time_start = data[4]<<16|data[5]; - if(data[1]) - { - drink_info.time_end = data[6]<<16|data[7]; - drink_info.freq = data[8]; - - } - ble_set_drink_remind(drink_info); - - sendBuf[17] = 1; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } - else - { - sendBuf[17] = 0; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } - -} - -void SetsedentarinessSetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置久坐设置 -{ - uint32_t tmp = 1; - uint16_t tmp_data = 1; - uint8_t sendBuf[19]; - memset(sendBuf,0,19); - sendBuf[0] = 0x72; - sendBuf[1] = 0x02; - sendBuf[2] = 0x1D; - memcpy(sendBuf+3,&tmp,4); - memcpy(sendBuf+7,&tmp,4); - memcpy(sendBuf+11,&tmp,4); - memcpy(sendBuf+15,&tmp_data,2); - - if(Check_CRC(data,len,crcvalue)) - { - msg_sedent_set_param_info_t sedent_data={0}; - sedent_data.sedent_on=data[0]; - - // uint32_t sedent_on_time=data[1]; - // sedent_data.sedent_time |= sedent_on_time<<24; - - // sedent_on_time=data[2]; - // sedent_data.sedent_time |= sedent_on_time<<16; - - // sedent_on_time=data[3]; - // sedent_data.sedent_time |= sedent_on_time<<8; - - // sedent_on_time=data[4]; - // sedent_data.sedent_time |= sedent_on_time<<0; - memcpy_s( &sedent_data.sedent_time,4,&data[1],4); - - - sedent_data.frequenc = data[5]; - - // set_sedent_param(&sedent_data); - - sendBuf[17] = 1; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } - else - { - sendBuf[17] = 0; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } -} - -void SetmsgfiltrationCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置久坐设置 -{ - uint32_t tmp = 1; - uint16_t tmp_data = 1; - uint8_t sendBuf[19]; - memset(sendBuf,0,19); - sendBuf[0] = 0x72; - sendBuf[1] = 0x02; - sendBuf[2] = 0x1E; - memcpy(sendBuf+3,&tmp,4); - memcpy(sendBuf+7,&tmp,4); - memcpy(sendBuf+11,&tmp,4); - memcpy(sendBuf+15,&tmp_data,2); - - if(Check_CRC(data,len,crcvalue)) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"总长%d\r\n",len); - // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"数据%s\r\n",data); - uint32_t offset=0; - uint8_t count=0; - while (offset482)pack_size=482; - - if(json_len%pack_size==0) - { - pack=json_len/pack_size; - } - else - { - pack=json_len/pack_size+1; - } - uint32_t pack_id=1; - while (surplus_len!=0) - { - if(surplus_len>=pack_size) - { - surplus_len=surplus_len-pack_size; - - ble_data_type type_={0x02,0x19,json_len,pack,pack_id}; - send_big_data(type_,(char *)json_str+offset,pack_size); - offset+=pack_size; - } - else - { - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",json_len,surplus_len,pack_id,pack); - ble_data_type type_={0x02,0x19,json_len,pack,pack_id}; - send_big_data(type_,(char *)json_str+offset,surplus_len); - break; - } - pack_id++; - } - - cJSON_free(json_str); - - } - - } - else - { - ble_data_type type_={0x02,0x19,0,1,1}; - send_big_data(type_,NULL,0); - } -} - - -void SYN_train_heart_datatCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//同步训练数据 -{ - - if(Check_CRC(data,len,crcvalue)) - { - if(len==4) - { - uint32_t timetamp=0; - memcpy_s((void*)&timetamp,4,data,4); - char path[128]={0}; - if(get_training_heart_path(path,timetamp,128)) - { - FILE *fp= fopen(path,"rb+"); - uint32_t file_size=0; - if(fp==NULL) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"打开文件失败 %s \r\n",path); - - ble_data_type type_={0x02,0x4b,0,1,1}; - send_big_data(type_,NULL,0); - - return ; - } - fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾 - file_size = ftell(fp); // 获取当前文件指针位置,即文件大小 - fseek(fp, 0, SEEK_SET); // 将文件指针移回文件开头 - - int num=(ble_nus_max_data_len-18); - if(num>482)num=482; - - int num_check=file_size%5;//心率数据 5个字节 - if(num_check!=0) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"数据有误 %d \r\n",cmd); - - ble_data_type type_={0x02,0x4b,0,1,1}; - send_big_data(type_,NULL,0); - return ; - } - - char* buf = (char *)ym_malloc(sizeof(char)*num+1); - if(buf==NULL){fclose(fp); return ;} - - uint32_t pack=1; - - if(file_size%num==0) - pack=file_size/num; - else - pack=file_size/num+1; - - uint32_t pack_id=1; - uint32_t read_size=0; - do - { - memset_s(buf,num+1,0,num+1); - read_size=fread(buf,1,num,fp); - if(read_size!=0) - { - ble_data_type type_={0x02,0x4b,file_size,pack,pack_id}; - send_big_data(type_,buf,read_size); - } - pack_id++; - } while (read_size==num); - fclose(fp); - free(buf); - - } - } - - } - else - { - ble_data_type type_={0x02,0x4B,0,1,1}; - send_big_data(type_,NULL,0); - } -} - -void SYN_train_speed_datatCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//同步训练数据 -{ - - if(Check_CRC(data,len,crcvalue)) - { - if(len==4) - { - uint32_t timetamp=0; - memcpy_s((void*)&timetamp,4,data,4); - char path[128]={0}; - if(get_training_spead_path(path,timetamp,128)) - { - FILE *fp= fopen(path,"rb+"); - uint32_t file_size=0; - if(fp==NULL) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"打开文件失败 %s \r\n",path); - - ble_data_type type_={0x02,0x18,0,1,1}; - send_big_data(type_,NULL,0); - - return ; - } - fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾 - file_size = ftell(fp); // 获取当前文件指针位置,即文件大小 - fseek(fp, 0, SEEK_SET); // 将文件指针移回文件开头 - - int num=(ble_nus_max_data_len-18); - if(num>482)num=482; - - int num_check=file_size%6; - if(num_check!=0) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"数据有误 %d \r\n",cmd); - - ble_data_type type_={0x02,0x18,0,1,1}; - send_big_data(type_,NULL,0); - return ; - } - - char* buf = (char *)ym_malloc(sizeof(char)*num+1); - if(buf==NULL){fclose(fp); return ;} - - uint32_t pack=1; - if(file_size%num==0) - pack=file_size/num; - else - pack=file_size/num+1; - uint32_t pack_id=1; - uint32_t read_size=0; - do - { - memset_s(buf,num+1,0,num+1); - read_size=fread(buf,1,num,fp); - if(read_size!=0) - { - ble_data_type type_={0x02,0x18,file_size,pack,pack_id}; - send_big_data(type_,buf,read_size); - } - - - //send_big_data(1,buf,read_size,file_size,pack_id,pack,id,1); - pack_id++; - } while (read_size==num); - - fclose(fp); - free(buf); - - } - - } - } - else - { - ble_data_type type_={0x02,0x18,0,1,1}; - send_big_data(type_,NULL,0); - } -} - -//APP设置步数目标 -void SetsteptargetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue) -{ - uint32_t tmp = 1; - uint16_t tmp_data = 1; - uint8_t sendBuf[19]; - memset(sendBuf,0,19); - sendBuf[0] = 0x72; - sendBuf[1] = 0x02; - sendBuf[2] = 0x16; - memcpy(sendBuf+3,&tmp,4); - memcpy(sendBuf+7,&tmp,4); - memcpy(sendBuf+11,&tmp,4); - memcpy(sendBuf+15,&tmp_data,2); - - if(Check_CRC(data,len,crcvalue)) - { - - uint32_t targetStep; - memcpy(&targetStep,data,4); - - uint8_t ringOn=data[4]; - uint8_t vibration=data[5]; - uint8_t notify=data[6]; - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"设置步数:%d %d %d %d \r\n",targetStep,ringOn,vibration,notify); - - set_goal_stepcount(targetStep); - - - if(ringOn &&vibration && notify) - set_goal_step_notification(1); - else - set_goal_step_notification(0); - - - sendBuf[17] = 1; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } - else - { - sendBuf[17] = 0; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } - -} - -uint8_t jsonCheck_weather(uint8_t *buf,uint8_t *check)//json 格式解析 天气数据 -{ - uint8_t *json; - json = buf; - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"jsonCheck_weather:len: json:%f jsonlen:%d\r\n",0.011,strlen((char *)json)); - FILE *fp=fopen("/user/userdata/weather.json","wb+"); - if(fp != NULL) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"jsonCheck_weather len %d",strlen((char *)buf)+1); - //fwrite((void*)buf,1,strlen((char *)buf)+1,fp); - fputs((char *)buf,fp); - fclose(fp); - } - return parse_jsonCheck_weather(buf,check); -} -void parse_jsonCheck_weather_post(uint8_t *buf)//json 格式解析 天气数据 -{ - uint8_t *json; - json = buf; - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"jsonCheck_weather:len: json:%f jsonlen:%d\r\n",0.011,strlen((char *)json)); - cJSON* root = cJSON_Parse((const char *)json); - if (root == NULL) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"天气 JSON解析错误\n"); - return ; - } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"开始解析天气 JSON\n"); - cJSON *now_cjson = cJSON_GetObjectItem(root, "now"); - if(now_cjson == NULL) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"天气 JSON解析错误\n"); - return ; - } - int humidity=0; - char * windScale=NULL; - char *textNight=NULL; - int uvIndex=0; - int temp=0; - int iconNight=0; - - cJSON *now_data_humidity= cJSON_GetObjectItem(now_cjson, "humidity"); - if(now_data_humidity) - { - humidity=now_data_humidity->valueint; - } - cJSON *now_data_windScale=cJSON_GetObjectItem(now_cjson, "windScale"); - if(now_data_windScale) - { - windScale=now_data_windScale->valuestring; - } - cJSON *now_data_textNight=cJSON_GetObjectItem(now_cjson, "textNight"); - if(now_data_textNight) - { - textNight=now_data_textNight->valuestring; - } - cJSON *now_data_uvIndex= cJSON_GetObjectItem(now_cjson, "uvIndex"); - if(now_data_uvIndex) - { - uvIndex=now_data_uvIndex->valueint; - } - cJSON *now_data_temp= cJSON_GetObjectItem(now_cjson, "temp"); - if(now_data_temp) - { - temp=now_data_temp->valueint; - } - cJSON *now_data_iconNight= cJSON_GetObjectItem(now_cjson, "iconNight"); - if(now_data_iconNight) - { - iconNight=now_data_iconNight->valueint; - } - set_weather_now_data(humidity,windScale,textNight,uvIndex,temp,iconNight); - - - cJSON *address_cjson = cJSON_GetObjectItem(root, "address"); - - char*city=NULL; - char*subLocality=NULL; - char*atm=NULL; - int lat=0; - int lon=0; - - cJSON *address_cjson_ = cJSON_GetObjectItem(address_cjson, "city"); - if(address_cjson_) - { - city=address_cjson_->valuestring; - } - - - address_cjson_= cJSON_GetObjectItem(address_cjson, "subLocality"); - if(address_cjson_) - { - subLocality=address_cjson_->valuestring; - } - - address_cjson_=cJSON_GetObjectItem(address_cjson, "atm"); - if(address_cjson_) - { - atm=address_cjson_->valuestring; - } - address_cjson_ = cJSON_GetObjectItem(address_cjson, "lat"); - if(address_cjson_) - { - lat=address_cjson_->valueint; - } - - address_cjson_ = cJSON_GetObjectItem(address_cjson, "lon"); - if(address_cjson_) - { - lon=address_cjson_->valueint; - } - set_weather_address_data(lat,atm,city,subLocality,lon); - cJSON *daily = cJSON_GetObjectItem(root, "daily"); - if(daily==NULL) - { - return ; - } - int count= cJSON_GetArraySize(daily); - for(int i=0;ivalueint; - } - - data_=cJSON_GetObjectItem(data,"iconDay"); - if(data_&& cJSON_IsNumber(data_) ) - { - iconDay=data_->valueint; - } - - data_=cJSON_GetObjectItem(data,"fxDate"); - if(data_&& cJSON_IsNumber(data_) ) - { - fxDate=data_->valueint; - } - - data_=cJSON_GetObjectItem(data,"textDay"); - if(data_&& cJSON_IsString(data_) ) - { - textDay=data_->valuestring; - } - data_=cJSON_GetObjectItem(data,"tempMax"); - if(data_&& cJSON_IsNumber(data_) ) - { - tempMax=data_->valueint; - } - set_weather_one_data(tempMin,iconDay,fxDate,tempMax,textDay,i); - - } - ble_UpdateMainWeatherData(); - cJSON_Delete(root); - return ; -} - -uint8_t parse_jsonCheck_weather(uint8_t *buf,uint8_t *check)//json 格式解析 天气数据 -{ - uint8_t flag = 0; - // flag = 2; - // memcpy(check,&flag,1); - // return 0; - uint8_t *json; - json = buf; - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"jsonCheck_weather:len: json:%f jsonlen:%d\r\n",0.011,strlen((char *)json)); - cJSON* root = cJSON_Parse((const char *)json); - if (root == NULL) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"天气 JSON解析错误\n"); - flag = 2; - memcpy(check,&flag,1); - return 0; - } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"开始解析天气 JSON\n"); - cJSON *now_cjson = cJSON_GetObjectItem(root, "now"); - if(now_cjson == NULL) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"天气 JSON解析错误\n"); - return 0; - } - int humidity=0; - char * windScale=NULL; - char *textNight=NULL; - int uvIndex=0; - int temp=0; - int iconNight=0; - - cJSON *now_data_humidity= cJSON_GetObjectItem(now_cjson, "humidity"); - if(now_data_humidity) - { - humidity=now_data_humidity->valueint; - } - cJSON *now_data_windScale=cJSON_GetObjectItem(now_cjson, "windScale"); - if(now_data_windScale) - { - windScale=now_data_windScale->valuestring; - } - cJSON *now_data_textNight=cJSON_GetObjectItem(now_cjson, "textNight"); - if(now_data_textNight) - { - textNight=now_data_textNight->valuestring; - } - cJSON *now_data_uvIndex= cJSON_GetObjectItem(now_cjson, "uvIndex"); - if(now_data_uvIndex) - { - uvIndex=now_data_uvIndex->valueint; - } - cJSON *now_data_temp= cJSON_GetObjectItem(now_cjson, "temp"); - if(now_data_temp) - { - temp=now_data_temp->valueint; - } - cJSON *now_data_iconNight= cJSON_GetObjectItem(now_cjson, "iconNight"); - if(now_data_iconNight) - { - iconNight=now_data_iconNight->valueint; - } - set_weather_now_data(humidity,windScale,textNight,uvIndex,temp,iconNight); - - - cJSON *address_cjson = cJSON_GetObjectItem(root, "address"); - - char*city=NULL; - char*subLocality=NULL; - char*atm=NULL; - int lat=0; - int lon=0; - - cJSON *address_cjson_ = cJSON_GetObjectItem(address_cjson, "city"); - if(address_cjson_) - { - city=address_cjson_->valuestring; - } - - - address_cjson_= cJSON_GetObjectItem(address_cjson, "subLocality"); - if(address_cjson_) - { - subLocality=address_cjson_->valuestring; - } - - address_cjson_=cJSON_GetObjectItem(address_cjson, "atm"); - if(address_cjson_) - { - atm=address_cjson_->valuestring; - } - address_cjson_ = cJSON_GetObjectItem(address_cjson, "lat"); - if(address_cjson_) - { - lat=address_cjson_->valueint; - } - - address_cjson_ = cJSON_GetObjectItem(address_cjson, "lon"); - if(address_cjson_) - { - lon=address_cjson_->valueint; - } - set_weather_address_data(lat,atm,city,subLocality,lon); - cJSON *daily = cJSON_GetObjectItem(root, "daily"); - if(daily==NULL) - { - return 0; - } - int count= cJSON_GetArraySize(daily); - for(int i=0;ivalueint; - } - - data_=cJSON_GetObjectItem(data,"iconDay"); - if(data_&& cJSON_IsNumber(data_) ) - { - iconDay=data_->valueint; - } - - data_=cJSON_GetObjectItem(data,"fxDate"); - if(data_&& cJSON_IsNumber(data_) ) - { - fxDate=data_->valueint; - } - - data_=cJSON_GetObjectItem(data,"textDay"); - if(data_&& cJSON_IsString(data_) ) - { - textDay=data_->valuestring; - } - data_=cJSON_GetObjectItem(data,"tempMax"); - if(data_&& cJSON_IsNumber(data_) ) - { - tempMax=data_->valueint; - } - set_weather_one_data(tempMin,iconDay,fxDate,tempMax,textDay,i); - - } - - if( uapi_dev_runtime_get_bt_powerstat() && cm_get_HFP_switch()) - uapi_pbap_cmd_start_client(); - - bd_addr_t bdaddr={0}; - #ifdef FD230 - uapi_get_br_address(&bdaddr); - if( uapi_dev_runtime_get_bt_powerstat() && (cm_get_HFP_switch()||cm_get_A2DP_switch())) - { - - if(cm_get_A2DP_switch() && cm_get_A2DP_switch() && false==bt_is_acl_connected(&bdaddr) && !(bdaddr.addr[0]==0 && bdaddr.addr[1]==0 && bdaddr.addr[2]==0 && bdaddr.addr[3]==0 - && bdaddr.addr[4]==0 && bdaddr.addr[5]==0)) - { - gap_reconnect_media_device(&bdaddr); - } - else if(cm_get_A2DP_switch()) - { - uapi_a2dp_snk_connect(); - } - else if(cm_get_HFP_switch()) - { - uapi_hfp_connect(); - } - - } - - #endif - - ble_UpdateMainWeatherData(); - cJSON_Delete(root); - *check = 1; - return 1; -} -/*读取天气历史数据*/ -uint8_t read_jsonHistory_weather(void) -{ - uint8_t *buf = NULL; - FILE *fp=fopen("/user/userdata/weather.json","rb"); - if(fp == NULL) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"read_jsonHistory_weather:fopen error\r\n"); - return 0; - } - fseek(fp, 0, SEEK_END); - long size = ftell(fp); - fseek(fp, 0, SEEK_SET); - if (size == 0) - { - fclose(fp); - return 0; - } - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file size = %d\r\n",size); - buf = (uint8_t*)malloc(size + 1); - if(buf == NULL) - { - fclose(fp); - return 0; - } - - char *str = fgets((char *)buf,size + 1,fp); - if(str!=NULL) - { - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file str = %s\r\n",str); - } - - fclose(fp); - - parse_jsonCheck_weather_post(buf); - - free(buf); - - return 1; -} - -uint8_t binCheck_AI(uint8_t *buf,uint8_t *check,uint16_t len)//json 格式解析 天气数据 -{ - uint8_t flag = 0; - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"jsonCheck_weather:len: json:%f jsonlen:%d\r\n",0.011,strlen((char *)json)); - #if 0 - FILE *fp=fopen("user/AI.txt","wb+"); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI len %d\r\n",len); - fwrite((void*)buf,1,len,fp); - //fputs((char *)buf,fp); - fclose(fp); - #endif - - uint16_t offset=0; - - while (len>offset) - { - if(buf[offset]==1) - { - offset++; - if(offset>=len)break; - uint16_t txt_len; - memcpy_s(&txt_len,2,&buf[offset],2); - - offset+=2; - if(offset>=len)break; - - char txt_buf[256]={0}; - memcpy_s(txt_buf,256,&buf[offset],txt_len); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI Question txtbuf:%s %d\r\n",txt_buf,txt_len); - ble_set_ai_Question_str(txt_buf); - offset+=txt_len; - //offset+=1; - } - if(offset>=len)break; - - if(buf[offset]==2) - { - offset++; - if(offset>=len)break; - - uint16_t txt_len; - memcpy_s(&txt_len,2,&buf[offset],2); - - offset+=2; - if(offset>=len)break; - - if(txt_len>=AI_TXT_BUF_MAX_LEN) - txt_len=AI_TXT_BUF_MAX_LEN; - - char *txt_buf=(char*)malloc(txt_len+1); - if(txt_buf==NULL) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI txtbuf malloc fail\r\n"); - ble_set_ai_Answer_str("手表缓存不足",0); - return 0; - } - - txt_buf[txt_len]=0; - memcpy_s((char *)txt_buf,1024*3,&buf[offset],txt_len); - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI txtbuf Answer %s %d\r\n",txt_buf,txt_len); - ble_set_ai_Answer_str(txt_buf,2); - free(txt_buf); - - offset+=txt_len; - //offset+=1; - } - if(offset>=len)break; - - if(buf[offset]==0) - { - offset++; - if(offset>=len)break; - - uint16_t txt_len; - memcpy_s(&txt_len,2,&buf[offset],2); - - offset+=2; - if(offset>=len)break; - - char error_buf[256]={0}; - memcpy_s(error_buf,256,&buf[offset],txt_len); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI Question txtbuf:%s %d\r\n",error_buf,txt_len); - ble_set_ai_Answer_str(error_buf,0); - offset+=txt_len; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AI 解析失败\r\n"); - - } - if(offset>=len)break; - - if(buf[offset]==3) - { - offset++; - if(offset>=len)break; - - uint16_t txt_len; - memcpy_s(&txt_len,2,&buf[offset],2); - - offset+=2; - if(offset>=len)break; - - char error_buf[256]={0}; - memcpy_s(error_buf,256,&buf[offset],txt_len); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI Question txtbuf:%s %d\r\n",error_buf,txt_len); - ble_set_ai_Answer_str(error_buf,3); - offset+=txt_len; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AI 回应错误\r\n"); - - } - if(offset>=len)break; - - if(buf[offset]==4) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AI 结束\r\n"); - // if(AI_is_end_state) - // { - // AI_is_end_state=0; - // } - offset++; - if(offset>=len) - { - ble_set_ai_Answer_str("",4); - break; - } - - uint16_t txt_len; - memcpy_s(&txt_len,2,&buf[offset],2); - - offset+=2; - if(offset>=len)break; - - char error_buf[256]={0}; - memcpy_s(error_buf,256,&buf[offset],txt_len); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI Question txtbuf:%s %d\r\n",error_buf,txt_len); - ble_set_ai_Answer_str(error_buf,4); - - offset+=txt_len; - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AI 解析失败\r\n"); - - } - if(offset>=len)break; - offset++; - } - - *check = 1; - return 1; -} - - -void SetWeatherCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取天气数据 -{ - uint32_t tmp = 1; - uint16_t tmp_data = 1; - uint8_t sendBuf[19]; - memset(sendBuf,0,19); - sendBuf[0] = 0x72; - sendBuf[1] = 0x02; - sendBuf[2] = 0x20; - memcpy(sendBuf+3,&tmp,4); - memcpy(sendBuf+7,&tmp,4); - memcpy(sendBuf+11,&tmp,4); - memcpy(sendBuf+15,&tmp_data,2); - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetWeatherCmd:len:%d data:%s\r\n",len,data); - if(Check_CRC(data,len,crcvalue)) - { - // uint32_t y=(0xff00); - // uint32_t x =(0xff00& 0Xff00)>>16; - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetWeatherCmd %u\r\n",x); - uint8_t check = 1; - jsonCheck_weather(data,&check); - sendBuf[17] = check; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } - else - { - sendBuf[17] = 0; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } -} - - -void SetAiResultCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue) -{ - uint32_t tmp = 1; - uint16_t tmp_data = 1; - uint8_t sendBuf[19]; - memset(sendBuf,0,19); - sendBuf[0] = 0x72; - sendBuf[1] = 0x02; - sendBuf[2] = 0x1f; - memcpy(sendBuf+3,&tmp,4); - memcpy(sendBuf+7,&tmp,4); - memcpy(sendBuf+11,&tmp,4); - memcpy(sendBuf+15,&tmp_data,2); - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetWeatherCmd:len:%d data:%s\r\n",len,data); - if(Check_CRC(data,len,crcvalue)) - { - uint8_t check = 1; - binCheck_AI(data,&check,len); - - sendBuf[17] = check; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } - else - { - sendBuf[17] = 0; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } -} - -void APP_reply_AI_is_ready(uint8_t *data,uint16_t len) -{ - if(data[0]) - { - if(len>1) - { - //更新chatgptKEY - FILE *fp= fopen("/user/userdata/chatGPTkey.bin","wb+"); - if(fp) - { - fwrite(data+1,1,len-1,fp); - fclose(fp); - } - } - } - ble_app_reply(data[0]); -} -void SaveChatGPTCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue) -{ - uint32_t tmp = 1; - uint16_t tmp_data = 1; - uint8_t sendBuf[19]; - memset(sendBuf,0,19); - sendBuf[0] = 0x72; - sendBuf[1] = 0x02; - sendBuf[2] = 0x23; - memcpy(sendBuf+3,&tmp,4); - memcpy(sendBuf+7,&tmp,4); - memcpy(sendBuf+11,&tmp,4); - memcpy(sendBuf+15,&tmp_data,2); - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetWeatherCmd:len:%d data:%s\r\n",len,data); - //"sk-proj-04ogvrZQqyaiv1OWw8OZT3BlbkFJG9Gyr8oFvRdmr3oXQNbX" - if(Check_CRC(data,len,crcvalue)) - { - - FILE *fp= fopen("/user/userdata/chatGPTkey.bin","wb+"); - if(fp) - { - fwrite(data,1,len,fp); - fclose(fp); - sendBuf[17] = 1; - } - else - { - sendBuf[17] = 2; - } - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } - else - { - sendBuf[17] = 0; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } -} - - -bool bin_Check_schedule(uint8_t *data,uint16_t len) -{ - uint16_t offset = 0; - uint16_t buf_len = 0; - uint16_t id_ = 1; - - // 打印函数开始及总长度信息 - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bin_Check_schedule start, total len: %d", len); - - while (offset < len) - { - uint16_t id; - // 解析ID - memcpy_s(&id, 2, &data[offset], 2); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Parsing ID: 0x%04X at offset: %d", id, offset); - offset += 2; - if (offset >= len) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len after parsing ID, break"); - break; - } - - // 解析标题长度 - memcpy_s(&buf_len, 2, &data[offset], 2); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title length: %d at offset: %d", buf_len, offset); - offset += 2; - if (offset >= len) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len after parsing title length, break"); - break; - } - - // 解析标题内容 - char *title = (char*)malloc(buf_len + 1); - if (!title) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to allocate memory for title"); - break; - } - memset_s(title, buf_len + 1, 0, buf_len + 1); // 修正为实际分配的大小 - memcpy_s(title, buf_len + 1, &data[offset], buf_len); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Parsed title: [%s] (length: %d) at offset: %d", title, buf_len, offset); - - offset += buf_len; - - if (offset >= len) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len after parsing title, free title and break"); - free(title); - break; - } - - // 解析开始时间 - uint32_t timetemp_begin = 0; - memcpy_s(&timetemp_begin, 4, &data[offset], 4); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Start time: %u at offset: %d", timetemp_begin, offset); - offset += 4; - if (offset >= len) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len after parsing start time, free title and break"); - free(title); - break; - } - - // 解析结束时间 - uint32_t timetemp_end = 0; - memcpy_s(&timetemp_end, 4, &data[offset], 4); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "End time: %u at offset: %d", timetemp_end, offset); - offset += 4; - if (offset >= len) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len after parsing end time, free title and break"); - free(title); - break; - } - - // 解析附加信息长度 - memcpy_s(&buf_len, 2, &data[offset], 2); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Additional info length: %d at offset: %d", buf_len, offset); - offset += 2; - - if (buf_len == 0) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "No additional info, offset: %d, len: %d", offset, len); - // 调用设置函数 - if (offset == len) - { - Ble_Set_ScheduleInfo(id_, timetemp_begin, timetemp_end, title, "", true); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Set schedule info (complete), id_: %d", id_); - } - else - { - Ble_Set_ScheduleInfo(id_, timetemp_begin, timetemp_end, title, "", false); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Set schedule info (incomplete), id_: %d", id_); - } - - id_++; - free(title); - continue; - } - - if (offset >= len) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len before parsing additional info, free title and break"); - free(title); - break; - } - - // 解析附加信息 - char *str_ = (char*)malloc(buf_len + 1); - if (!str_) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to allocate memory for additional info"); - free(title); - break; - } - memset_s(str_, buf_len + 1, 0, buf_len + 1); // 修正为实际分配的大小 - memcpy_s(str_, buf_len + 1, &data[offset], buf_len); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Parsed additional info: [%s] (length: %d) at offset: %d", str_, buf_len, offset); - - offset += buf_len; - - // 调用设置函数 - if (offset == len) - { - Ble_Set_ScheduleInfo(id_, timetemp_begin, timetemp_end, title, str_, true); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Set schedule info with additional info (complete), id_: %d", id_); - } - else - { - Ble_Set_ScheduleInfo(id_, timetemp_begin, timetemp_end, title, str_, false); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Set schedule info with additional info (incomplete), id_: %d", id_); - } - - id_++; - - // 释放内存 - free(title); - free(str_); - - if (offset >= len) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "All data parsed, exit loop"); - break; - } - } - - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bin_Check_schedule end, total parsed id count: %d", id_ - 1); - return true; -} -void APP_send_schedule_Cmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue) -{ - uint32_t tmp = 1; - uint16_t tmp_data = 1; - uint8_t sendBuf[19]; - memset(sendBuf,0,19); - sendBuf[0] = 0x72; - sendBuf[1] = 0x02; - sendBuf[2] = 0x24; - memcpy(sendBuf+3,&tmp,4); - memcpy(sendBuf+7,&tmp,4); - memcpy(sendBuf+11,&tmp,4); - memcpy(sendBuf+15,&tmp_data,2); - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetWeatherCmd:len:%d data:%s\r\n",len,data); - //"sk-proj-04ogvrZQqyaiv1OWw8OZT3BlbkFJG9Gyr8oFvRdmr3oXQNbX" - if(Check_CRC(data,len,crcvalue)) - { - - printf("11111111111111111\n"); - bool val = bin_Check_schedule(data,len); - printf("222222222222222222222\n"); - if(val) - { - sendBuf[17] = 1; - } - else - { - sendBuf[17] = 2; - } - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } - else - { - sendBuf[17] = 0; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } -} - -bool bin_Check_sos(uint8_t *data,uint16_t len) -{ - uint8_t SOS_num=data[0]; - uint32_t offset=1; - char *name=NULL; - char *number=NULL; - ble_sos_number_clean(); - - while (SOS_num) - { - SOS_num--; - uint8_t sex=data[offset]; - offset++; - if(offset>=len) - break; - uint8_t name_len=data[offset]; - offset++; - if(offset>=len) - break; - char *name=(char *)malloc(name_len+1); - if(name==NULL) - break; - memset_s(name,255,0,name_len+1); - memcpy_s(name,255,&data[offset],name_len); - offset+=name_len; - if(offset>=len) - break; - uint8_t number_len=data[offset]; - offset++; - if(offset>=len) - break; - char *number=(char *)malloc(number_len); - if(number==NULL) - break; - memset_s(number,255,0,number_len+1); - memcpy_s(number,255,&data[offset],number_len); - offset+=number_len; - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"sex:%d,name:%s,number:%s;\r\n",sex,name,number); - - ble_add_sos_number(sex,name,number); - - free(number); - number==NULL; - free(name); - name==NULL; - - if(offset>=len) - break; - - - } - if(number) - { - free(number); - } - if(name) - { - free(name); - } - - ble_sos_data_save(); - - return true; -} - -void APP_send_sos_Cmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue) -{ - uint32_t tmp = 1; - uint16_t tmp_data = 1; - uint8_t sendBuf[19]; - memset(sendBuf,0,19); - sendBuf[0] = 0x72; - sendBuf[1] = 0x02; - sendBuf[2] = 0x25; - memcpy(sendBuf+3,&tmp,4); - memcpy(sendBuf+7,&tmp,4); - memcpy(sendBuf+11,&tmp,4); - memcpy(sendBuf+15,&tmp_data,2); - - if(Check_CRC(data,len,crcvalue)) - { - - if(bin_Check_sos(data,len)) - { - sendBuf[17] = 1; - } - else - { - sendBuf[17] = 2; - } - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } - else - { - sendBuf[17] = 0; - sendBuf[18] = Calculate_CRC(sendBuf,18); - sendBleData(sendBuf,19); - } -} - - -void GetGPSCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue) -{ - ble_data_type type_={0x02,0x4f,0,1,1}; - send_big_data(type_,NULL,0); - - //send_big_data(1,NULL,0,0,1,1,0x4f,2); -} - -void App_delete_file(ble_read_data *buffer_handle,uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)// -{ - - uint8_t reply[2]={0}; - if (len<=2) - { - ble_reply_cmdarr(cmd,reply,2);//crc error - } - if(Check_CRC(data,len,crcvalue)) - { - uint8_t count=data[0]; - uint8_t type=data[1]; - if(type==2) - { - if(len-2!=count*2) - { - ble_reply_cmdarr(cmd,reply,1);//crc error - } - else - { - int offest=2; - for(int i=0;iage; - msg_userinfo.fat_time = p_userinfo->fat_time; - msg_userinfo.gender = p_userinfo->gender; - msg_userinfo.height = p_userinfo->height; - msg_userinfo.target_stand = p_userinfo->target_stand; - msg_userinfo.target_step = p_userinfo->target_step; - msg_userinfo.timeformat = p_userinfo->timeformat; - msg_userinfo.weight = p_userinfo->weight; - msg_userinfo.calorie=p_userinfo->calorie; - msg_userinfo.distance=p_userinfo->distance; - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"getUserInfo:!!age %d, fat %d, sex %d, height %d, stand %d, step %d , timeformat %d , weight %d !!!!!!\r\n", - p_userinfo->age, - p_userinfo->fat_time, - p_userinfo->gender, - p_userinfo->height, - p_userinfo->target_stand, - p_userinfo->target_step, - p_userinfo->timeformat, - p_userinfo->weight - ); - - set_user_data(&msg_userinfo); - - }else{ - ble_reply_cmd(USER_INFOR_CMD,0);//crc error - } -} - -//APP下发快捷辅助功能参数 -void Set_auxil_fun_parm(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)// -{ - uint8_t value[19]; - memset(value,0,19); - uint32_t tmp = 1; - uint16_t packtmp = 1; - value[0] =0x72; - value[1] =0x02; - value[2] =0x11; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&packtmp,2); - - if(Check_CRC(data,len,crcvalue)) - { - uint8_t paramCnt = data[0];//快捷辅助功能 按照协议文档要区分 - set_quick_auxiliary_paramters(paramCnt); - value[17] = 1; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - }else{ - value[17] = 0x00; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } -} -void getTRAIN_TARGETInfo(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)// -{ - -} -// #include "phoneaddressmodel.h" -//电话薄解析函数 -void Parse_addressbook_bin(uint8_t *data,uint16_t len) -{ - int num=data[0];//人数 - int offset=1; - while (num) - { - uint8 sex = data[offset]; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"性别: %d\r\n",sex); - offset=offset+1; - uint8 name_len=data[offset]; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"name_len %d\r\n",name_len); - char name[32]={0}; - if(name_len==0) - { - name_len=strlen("未知"); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"未知\r\n"); - } - else - { - memcpy(name,&data[offset+1],name_len); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"姓名: %s\r\n",name); - // for(int i=0;i482)pack_size=482; - - // if(data_len%pack_size==0) - // { - // pack=data_len/pack_size; - // } - // else - // { - // pack=data_len/pack_size+1; - // } - // uint32_t pack_id=1; - // uint32_t offset=0; - // while (surplus_len!=0) - // { - // if(surplus_len>=pack_size) - // { - // surplus_len=surplus_len-pack_size; - - - // ble_data_type type_={0x01,0x06,data_len,pack,pack_id}; - // send_big_data(type_,json_format+offset,pack_size); - - // //send_big_data(1,json_format+offset,pack_size,data_len,pack_id,pack,0x06,1); - // offset+=pack_size; - // } - // else - // { - - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack); - // ble_data_type type_={0x01,0x06,data_len,pack,pack_id}; - // send_big_data(type_,json_format+offset,surplus_len); - // //send_big_data(1,json_format+offset,surplus_len,data_len,pack_id,pack,0x06,1); - // break; - // } - // pack_id++; - // } - // cJSON_free(json_format); - -} -//获取当手表电池电量 -static void GetBatteryLevelCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[19]; - memset(value,0,19); - uint32_t tmp = 1; - uint16_t tmp_data = 1; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x07; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(Check_CRC(data,len,crcvalue)) - { - float voltage = 0.0F; - uint8_t power = 0; - power = battery_get_voltage(&voltage); - value[17] = power; - value[18] = Calculate_CRC(value,18); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n"); - sendBleData(value,19); - }else - { - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } -} -//设置开关//(弃) -static void SetSwitchMessCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[19]; - memset(value,0,19); - uint32_t tmp = 1; - uint16_t tmp_data = 1; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x08; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(Check_CRC(data,len,crcvalue)) - { - uint8_t switch_on = data[0];//0 关闭 1 开启 - if(switch_on) - { - //ble_ancs_client_cmd_setup_and_subscribe(g_ble_conn_id); - } - else - { - //ble_ancs_client_subscribe_notify(g_ble_conn_id,0); - } - - value[17] = 1; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - }else - { - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } -} -//撤销当前文件传输 1 OTA 2MP3 3表盘 3天气 5闹钟 -static void RemoveFileCmd(ble_read_data *buffer_handle,uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[19]; - memset(value,0,19); - uint32_t tmp = 1; - uint16_t tmp_data = 1; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x20; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(Check_CRC(data,len,crcvalue)) - { - uint8_t file_type= data[0];//1 ota 2 MP3 - - // TRANSMIT_DATA=TRANS_FREE; - // CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - - value[17] = 1; // - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - - cancel_recv_file(0); - - }else - { - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } -} - -//获取指定类型文件目录 -static void GetFileTypeCmd(uint8_t *data,uint16_t len) -{ - uint8_t value[19]; - memset(value,0,19); - uint32_t tmp = 1; - uint16_t tmp_data = 1; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x21; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(Check_CRC(data,len,1)) - { - uint8_t fileType = data[17];//2 mp3 3 表盘 - - value[17] = 1; //1 操作成功 2 操作失败 - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - }else - { - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } -} -//删除指定类型所有的文件 -static void DeleteFileTypeCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[19]; - memset(value,0,19); - uint32_t tmp = 1; - uint16_t tmp_data = 1; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x22; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(Check_CRC(data,len,crcvalue)) - { - value[17] = 1; //1 操作成功 2 操作失败 - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - }else - { - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } -} -//开启指定运动模式 -void reply_APP_OpenSportModeCmd(bool falg) -{ - - ble_data_type type_={0x01,0x0A,1,1,1}; - char data[1]={0}; - if(falg) - data[0]=1; - else - data[0]=2; - send_big_data(type_,data,1); - -} - - -static void OpenSportModeCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[19]; - memset(value,0,19); - uint32_t tmp = 1; - uint16_t tmp_data = 1; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x0A; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(Check_CRC(data,len,crcvalue)) - { - training_ble_data.sportType= data[0];//运动类型 0 健走 1跑步 2骑行 3 - training_ble_data.controlmd= START; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"开启指定运动%d\r\n",data[0]); - CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble)); - - // value[17] = 1; //1 操作成功 2 操作失败 - // value[18] = Calculate_CRC(value,18); - // sendBleData(value,19); - } - else - { - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } -} - -void reply_APP_SportStopModeCmd(uint16_t time) -{ - char data[3]={0}; - uint32_t data_len=3; - data[0]=1; - memcpy(&data[1],&time,2); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"发送训练状态数据%d %d\r\n",data[0],time); - ble_data_type type={0x01,0x0B,data_len,1,1}; - send_big_data(type,data,data_len); -} -//结束运动模式 -static void StopSportModeCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[19]; - memset(value,0,19); - uint32_t tmp = 1; - uint16_t tmp_data = 1; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x0B; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(Check_CRC(data,len,crcvalue)) - { - - training_ble_data.sportType= 4;//运动类型 0 健走 1跑步 2骑行 3 - training_ble_data.controlmd= END; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"结束运动\r\n"); - - CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble)); - // value[17] = 1; //1 操作成功 2 操作失败 - // value[18] = Calculate_CRC(value,18); - // sendBleData(value,19); - }else - { - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } -} -//设置语言 -static void SetLanguageCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[19]; - memset(value,0,19); - uint32_t tmp = 1; - uint16_t tmp_data = 1; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x0E; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(Check_CRC(data,len,crcvalue)) - { - uint8_t language = data[0]; - set_languaage(language); - value[17] = 1; //1 操作成功 2 操作失败 - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - }else - { - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } -} -//开启/关闭获取实时训练数据 -static void SetRealTimeDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[19]; - memset(value,0,19); - uint32_t tmp = 1; - uint16_t tmp_data = 1; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x11; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(Check_CRC(data,len,crcvalue)) - { - uint8_t autoSportData = data[0];//开关 1开启 0关闭 - /*进行开启关闭操作*/ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"进行开启关闭操作 %d\r\n", autoSportData); - set_traning_updata_auto( autoSportData); - - value[17] = 1; //1 操作成功 2 操作失败 - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - }else - { - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } -} -//设置训练数据采集频率 -static void SetRTDataFreCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[19]; - memset(value,0,19); - uint32_t tmp = 1; - uint16_t tmp_data = 1; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x14; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(Check_CRC(data,len,crcvalue)) - { - uint8_t Frequence = data[0];//频率单位是s - /*设置获取频率*/ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"设置获取频率 %d\r\n", Frequence); - set_traning_updata_freq(Frequence); - - value[17] = 1; //1 操作成功 2 操作失败 - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - }else - { - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } -} -//获取实时训练数据 -// void getSportData(char *buf) -// { -// cJSON *dataJSON = cJSON_CreateObject(); -// cJSON_AddNumberToObject(dataJSON,"st",1637825067); -// cJSON_AddNumberToObject(dataJSON,"hr",120); -// cJSON_AddNumberToObject(dataJSON,"ca",3657); -// cJSON_AddNumberToObject(dataJSON,"di",5274); -// cJSON_AddNumberToObject(dataJSON,"stp",1234); -// cJSON_AddNumberToObject(dataJSON,"ti",3); -// char *json_format = cJSON_PrintUnformatted(dataJSON); -// WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s",json_format); -// cJSON_Delete(dataJSON); -// int dataLen = strlen(json_format); -// memcpy(buf,json_format,dataLen); -// return; -// } -void sendRealTimeDataToAPP(uint8_t flag) -{ - if(flag == 0)//校验失败 - { - ble_data_type type_={0x01,0x0f,0,1,1}; - send_big_data(type_,NULL,0); - - //send_big_data(0,NULL,0,0,1,1,0x0f,1); - - }else - { - training_ble_data.sportType= 4;//运动类型 0 健走 1跑步 2骑行 3 - training_ble_data.controlmd= SENDDATA; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"发送运动实时数据\r\n"); - - CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble)); - - } - -} -//获取实时训练数据 -static void GetRealTimeDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - - if(Check_CRC(data,len,crcvalue)) - { - sendRealTimeDataToAPP(1); - }else - { - sendRealTimeDataToAPP(0); - } -} -//设置最高心率提醒 -static void SetMaxHrRemindCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[19]; - memset(value,0,19); - uint32_t tmp = 1; - uint16_t tmp_data = 1; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x15; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(Check_CRC(data,len,crcvalue))// - { - uint8_t maxHr = data[0]; - if(maxHr > 250)maxHr = 250;//最高心率是250 - else if(maxHr <= 0) maxHr = 0; - set_traning_heart_max(maxHr); - //设置255 表示心率提醒关闭 - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"设置最高心率提醒 %d\r\n",maxHr); - value[17] = 1; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - }else - { - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } - -} - -void reply_APP_SportPasueResetCmd(uint16_t time) -{ - char data[3]={0}; - uint32_t data_len=3; - data[0]=1; - memcpy(&data[1],&time,2); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"发送训练状态数据%d %d\r\n",data[0],time); - ble_data_type type={0x01,0x16,data_len,1,1}; - send_big_data(type,data,data_len); -} - - -//训练暂停/恢复 -static void GetSportPasueResetCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[19]; - memset(value,0,19); - uint32_t tmp = 1; - uint16_t tmp_data = 1; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x16; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(Check_CRC(data,len,crcvalue))// - { - uint8_t PauseStop = data[0];//0 暂停 1恢复 - if(PauseStop==0) - { - training_ble_data.sportType= 4;//运动类型 0 健走 1跑步 2骑行 3 - training_ble_data.controlmd= STOP; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"运动暂停\r\n"); - - CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble)); - } - else - { - training_ble_data.sportType= 4;//运动类型 0 健走 1跑步 2骑行 3 - training_ble_data.controlmd= RECOVER; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"运动恢复\r\n"); - - CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble)); - - } - // value[17] = 1; - // value[18] = Calculate_CRC(value,18); - // sendBleData(value,19); - }else - { - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } - -} -//发送当前表盘到app - -void Watch_SendDial_ToAppCmd(void) -{ - - uint16_t dialNum =ble_get_dial_id(); - ble_data_type type_={0x01,0x17,2,1,1}; - send_big_data(type_,(char *)&dialNum,2); -} - -static void SendDialToAppCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[20]; - memset(value,0,20); - uint32_t tmp = 1; - uint32_t datalen = 2; - uint16_t tmp_data = 2; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x17; - memcpy(value+3,&tmp,4); - memcpy(value+7,&datalen,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(Check_CRC(data,len,crcvalue))// - { - uint16_t dialNum =ble_get_dial_id(); - memcpy(&value[17],&dialNum,2); - value[19] = Calculate_CRC(value,19); - sendBleData(value,20); - }else - { - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } - -} -//获取手表当前状态 -static void GetWatchStatusCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[20]; - memset(value,0,20); - uint32_t tmp = 1; - uint16_t tmp_data = 1; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x19; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - - //0空闲状态 9 usb状态 10 运动训练状态 - uint8_t watchStatus = 0; - - if(uapi_dev_runtime_get_train_status()) - watchStatus=10; - - value[17] = watchStatus; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); -} -//获取手表屏幕参数 -static void GetScreenParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[21]; - memset(value,0,21); - uint32_t tmp = 1; - uint32_t datalen = 3; - uint16_t tmp_data = 3; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x1a; - memcpy(value+3,&tmp,4); - memcpy(value+7,&datalen,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - - int brigntess = get_brigthness(); - int screen_time =get_ScreenDuration(); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetScreenParamCmd get_ScreenDuration %d \r\n", screen_time); - switch (get_ScreenDuration()/1000) - { - case 5: - screen_time = 0; - break; - case 10: - screen_time = 1; - break; - case 15: - screen_time = 2; - break; - case 30: - screen_time = 3; - break; - case 60: - screen_time = 4; - break; - case 60*5: - screen_time = 5; - break; - default: - screen_time = 0; - break; - } - bool wrist_on = Get_RaiseToWake(); - value[17] = brigntess; - value[18] = screen_time; - value[19] = wrist_on; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetScreenParamCmd %d %d %d \r\n",brigntess,screen_time,wrist_on); - value[20] = Calculate_CRC(value,20); - sendBleData(value,21); -} - -//App删除表盘 (仅W4手表) -static void DeleteDialUidCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[20]; - memset(value,0,20); - uint32_t tmp = 1; - uint16_t tmp_data = 1; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x1b; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(Check_CRC(data,len,crcvalue)) - { - uint16_t deleteDial = 0;//删除的表盘UID - deleteDial=data[0]+data[1]*256; - - if(ble_delete_dial(deleteDial)) - value[17] = 1;// 1删除成功 2 没有改资源 0指令校验失败 - else - value[17] = 2;// 1删除成功 2 没有改资源 0指令校验失败 - - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - }else - { - - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } - - -} - -//获取手表声音与振动参数 Sound and Vibration -static void GetSoundVibrationCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[23]; - memset(value,0,23); - uint32_t tmp = 1; - uint32_t datalen = 5; - uint16_t tmp_data = 5; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x1c; - memcpy(value+3,&tmp,4); - memcpy(value+7,&datalen,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(Check_CRC(data,len,crcvalue)) - { - - int sys_volume = Get_SystemVolume(); - int ring_volume = Get_CallVolume(); - int media_volume = Get_CallVolume(); - uint8_t vibrate_on = get_vibrationremiander(); - - bool bell_on = get_SilentMode(); - - value[17] = sys_volume;// - value[18] = ring_volume;// - value[19] = media_volume;// - value[20] = bell_on;// - value[21] = vibrate_on;// - value[22] = Calculate_CRC(value,22); - sendBleData(value,23); - }else - { - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } - - -} - -//APP获取手表辅助功能参数Auxiliary functions -static void GetWatchAuxFuncCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[23]; - memset(value,0,23); - uint32_t tmp = 1; - uint16_t tmp_data = 1; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x1d; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(Check_CRC(data,len,crcvalue)) - { - uint8_t paramCmt = 0;//辅助功能 0 - paramCmt = get_quick_auxiliary_paramters(); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"paramCmt:%d\r\n",paramCmt); - value[17] = paramCmt;// - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - }else - { - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } - - -} -//APP获取手表心率设置 -static void GetHrGetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[22]; - memset(value,0,22); - uint32_t tmp = 1; - uint32_t datalen = 4; - uint16_t tmp_data = 4; - - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x1e; - memcpy(value+3,&tmp,4); - memcpy(value+7,&datalen,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(Check_CRC(data,len,crcvalue)) - { - - msg_get_heart_set_param_info_t heart_param; - Get_heart_cmd(&heart_param); - - value[17] = heart_param.frequence;// - value[18] = heart_param.remind_on;// - value[19] = heart_param.max_min;// - value[20] = heart_param.heart;// - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d ",value[17],value[18],value[19],value[20]); - - value[21] = Calculate_CRC(value,21); - sendBleData(value,22); - }else - { - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } - - -} -//APP获取手表血氧设置 -static void GetSpo2GetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[21]; - memset(value,0,21); - uint32_t tmp = 1; - uint32_t datalen = 3; - uint16_t tmp_data = 3; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x1f; - memcpy(value+3,&tmp,4); - memcpy(value+7,&datalen,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(Check_CRC(data,len,crcvalue)) - { - msg_get_spo2_set_param_info_t SO2_param; - Get_oxygen_cmd(&SO2_param); - - uint8_t spo2freq = SO2_param.frequence;//监测频率 - uint8_t spo2Switch = SO2_param.remind_on;//心率提醒开关 - uint8_t spo2MaxMin = SO2_param.spo2;//高于或低于 - - value[17] = spo2freq;// - value[18] = spo2Switch;// - value[19] = spo2MaxMin;// - - value[20] = Calculate_CRC(value,20); - sendBleData(value,21); - }else - { - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } - - -} -void cameraSend(uint8_t flag)//2进行手势拍照 3退出拍照界面 -{ - uint8_t value[19]; - memset(value,0,19); - uint32_t tmp = 1; - uint16_t tmp_data = 1; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x23; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - value[17] = flag;// - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); -} -//手势拍照协议 -static void carmeraCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[19]; - memset(value,0,19); - uint32_t tmp = 1; - uint16_t tmp_data = 1; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x23; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(Check_CRC(data,len,crcvalue)) - { - uint8_t carmera_on = data[0]; //0退出拍照界面 1进入拍照界面 - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"进入拍照\r\n"); - //需要加界面弹窗提示 - if(carmera_on == 1)//进入拍照界面 - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"进入拍照\r\n"); - CustomEventPublish(TOPIC_EVENT_ENTER_CMAERA,NULL,0); - }else{//退出拍照弹窗界面 - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"退出拍照\r\n"); - CustomEventPublish(TOPIC_EVENT_CANCEL_CMAERA,NULL,0); - } - value[17] = 1;// - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - }else - { - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } -} - -//APP获取手表喝水提醒设置 -static void GetDrinkParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[19]; - memset(value,0,19); - uint32_t tmp = 1; - uint16_t tmp_data = 1; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x24; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(1) - { - msg_drink_info_t drink_on_; - ble_get_drink_remind(&drink_on_); - value[17] = drink_on_.drink_on;// - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } -} - -//APP发送恢复出厂设置 -static void GetFactoryCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[19]; - memset(value,0,19); - uint32_t tmp = 1; - uint16_t tmp_data = 1; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x25; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(Check_CRC(data,len,crcvalue)) - { - value[17] = 1;// - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - }else - { - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } - if( value[17]) - { - do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_RESTORE_FACTORY_SETTING, NULL, 0); - } -} -//APP发送重新启动 -static uint8_t power_buf[2]={0}; -static void GetResetCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[19]; - memset(value,0,19); - uint32_t tmp = 1; - uint16_t tmp_data = 1; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x26; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(Check_CRC(data,len,crcvalue)) - { - - value[17] = 1;// - value[18] = Calculate_CRC(value,18); - power_buf[0]=REBOOT; - CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,power_buf,2); - sendBleData(value,19); - - }else - { - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } -} -//APP发送关机 -static void GetPowerOffCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[19]; - memset(value,0,19); - uint32_t tmp = 1; - uint16_t tmp_data = 1; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x27; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(Check_CRC(data,len,crcvalue)) - { - - value[17] = 1;// - value[18] = Calculate_CRC(value,18); - power_buf[0]=SHUTDOWN; - CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,power_buf,2); - sendBleData(value,19); - }else - { - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } -} - - -//app发送公英制单位 -static void GetMetricCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[19]; - memset(value,0,19); - uint32_t tmp = 1; - uint16_t tmp_data = 1; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x28; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(Check_CRC(data,len,crcvalue)) - { - uint8_t kmileter = data[0];//公英制单位 0 是公英制 1英制单位 - value[17] = 1;// - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - }else - { - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } -} - -//app获取久坐设置 -static void GetSedentParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[24]; - memset(value,0,24); - uint32_t tmp = 1; - uint32_t datalen = 6; - uint16_t tmp_data =6; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x31; - memcpy(value+3,&tmp,4); - memcpy(value+7,&datalen,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(1) - { - msg_sedent_set_param_info_t data; - get_sedent_param( &data); - - uint8_t on = data.sedent_on;//作息时间设定 0关闭 1开启 1 - uint32_t time = data.sedent_time;//时间 4 - uint8_t frequenc = data.frequenc;//间隔 1 - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%04X %d %d\r\n",time,frequenc,on); - value[17] = on; - memcpy_s(&value[18],4,&time,4); - - value[22] = frequenc; - value[23] = Calculate_CRC(value,23); - sendBleData(value,24); - }else - { - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } -} - - -static void GetSleepParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[24]; - memset(value,0,24); - uint32_t tmp = 1; - uint32_t datalen = 6; - uint16_t tmp_data =6; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x29; - memcpy(value+3,&tmp,4); - memcpy(value+7,&datalen,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(1) - { - msg_get_sleep_param_info_t data; - - ble_get_sleep_remind(&data); - uint8_t sleepTime = data.schedule;//作息时间设定 0关闭 1开启 - uint8_t bedTimeHour = data.bedtime_hour;//就寝时间 - uint8_t bedTimeMin = data.bedtime_min;//就寝时间 - uint8_t wakeTimeHour = data.waketime_hour;//起床时间 - uint8_t wakeTimeMin = data.waketime_min;//起床时间 - uint8_t bedTimeOn = data.bedtime_alarm;//就寝前20分钟提醒时间 - - value[17] = sleepTime; - value[18] = bedTimeHour; - value[19] = bedTimeMin; - value[20] = wakeTimeHour; - value[21] = wakeTimeMin; - value[22] = bedTimeOn; - value[23] = Calculate_CRC(value,23); - sendBleData(value,24); - }else - { - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } -} - -//app获取所有表盘UID -static void GetAllDialUidCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - - - if(Check_CRC(data,len,crcvalue)) - { - int dial_num=ble_get_dial_num(); - - uint16_t data_size=1+dial_num*2; - uint32_t temp_data_size=data_size; - char *dail_uid_buf=(char *)ym_malloc(data_size); - dail_uid_buf[0]=(uint8_t)dial_num; - - if(dial_num *2 !=get_all_dial_id(dail_uid_buf+1,dial_num*2)) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetAllDialUidCmd dial_num %d err\r\n",dial_num); - } - else - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetAllDialUidCmd yes\r\n"); - - } - ble_data_type type_={0x01,0x2a,temp_data_size,1,1}; - send_big_data(type_,dail_uid_buf,data_size); - //send_big_data(0,dail_uid_buf,data_size,temp_data_size,1,1,0x2a,1); - - free(dail_uid_buf); - - }else - { - ble_reply_cmd(cmd,0); - } -} -//app获取目标步数设置 -static void GetTargetStepCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[25]; - memset(value,0,25); - uint32_t tmp = 1; - uint32_t datalen = 7; - uint16_t tmp_data = 7; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x2b; - memcpy(value+3,&tmp,4); - memcpy(value+7,&datalen,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(1) - { - uint32_t targetStep = get_goal_stepcount();//目标步数 4字节 - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"目标步数:%d\r\n",targetStep); - - uint8_t ringOn = get_step_goal_notify_switch();//铃声提醒 - uint8_t vibration = get_step_goal_notify_switch();//振动提醒 - uint8_t notify = get_step_goal_notify_switch();//通知提醒 - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"提醒开关:%d %d %d \r\n",ringOn,vibration,notify); - - memcpy(&value[17],&targetStep,4);//目标步数 - - value[21] = ringOn;//铃声提醒 - value[22] = vibration;//振动提醒 - value[23] = notify;//通知提醒 - - value[24] = Calculate_CRC(value,24); - sendBleData(value,25); - }else - { - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } -} - -//app其他目标设置 -static void GetTargetOtherCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[26]; - memset(value,0,26); - uint32_t tmp = 1; - uint32_t datalen = 8; - uint16_t tmp_data = 8; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x2c; - memcpy(value+3,&tmp,4); - memcpy(value+7,&datalen,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(1) - { - uint16_t targetKcal = 0;//目标卡路里 - uint8_t targetKm = 0;//目标里程 - uint8_t targetstand = 0;//目标站立 - uint8_t targetfat = 0;//目标燃脂时间 - uint8_t ringTime = 0;//铃声提醒 - uint8_t vibration = 0;//振动提醒 - uint8_t notify = 0;//通知提醒 - - targetKcal = get_goal_caloriescount(); - targetKm = get_goal_discount(); - targetstand =get_goal_standupcount(); - targetfat = get_goal_durationcount(); - - ringTime = get_other_goal_notify_switch (); - vibration = get_other_goal_notify_switch(); - notify = get_other_goal_notify_switch(); - - memcpy(&value[17],&targetKcal,2);//目标卡路里 - value[19] = targetKm;// - value[20] = targetstand;// - value[21] = targetfat;// - - value[22] = ringTime;// - value[23] = vibration;// - value[24] = notify;//通知提醒 - value[25] = Calculate_CRC(value,25); - sendBleData(value,26); - }else - { - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } -} - -static void GetPasswordCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[19]; - memset(value,0,19); - uint32_t tmp = 1; - uint32_t datalen = 1; - uint16_t tmp_data = 1; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x2f; - memcpy(value+3,&tmp,4); - memcpy(value+7,&datalen,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(1) - { - uint8_t data=ble_get_password(); - memcpy(&value[17],&data,1);// - - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - }else - { - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } -} - -static void GetmsgconfigCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[36]; - memset(value,0,36); - uint32_t tmp = 1; - uint32_t datalen = 18; - uint16_t tmp_data = 18; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x33; - memcpy(value+3,&tmp,4); - memcpy(value+7,&datalen,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(1) - { - uint8_t data_buf[filtration_data_count]; - uint8_t data_buf_len=0; - // memset(data,1,18); - filtration_on_get((uint8_t*)data_buf,&data_buf_len); - // printf("data_buf_len %d\r\n",data_buf_len); - memcpy(&value[17],data_buf,data_buf_len);// - value[17+data_buf_len] = Calculate_CRC(value,17+data_buf_len); - sendBleData(value,18+data_buf_len); - }else - { - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } -} - - - - -bool get_AI_PATH_and_size(char *path,uint32_t *size) -{ - - memcpy((void*)path,ble_get_ai_audio_path_str(),strlen(ble_get_ai_audio_path_str())); - - FILE *fp= fopen(path,"r+"); - if(fp) - { - fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾 - *size = ftell(fp); // 获取当前文件指针位置,即文件大小 - fseek(fp, 0, SEEK_SET); // 将文件指针移回文件开头 - fclose(fp); - - return true; - } - else - { - return false; - } -} -#define SEND_AIVOICE_PACKAGE_DELAY 15 -//APP获取录音文件,录音文件上传 -static void GetAiRecordCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[19]; - memset(value,0,19); - uint32_t tmp = 1; - uint32_t datalen = 1; - uint16_t tmp_data = 1; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x2f; - memcpy(value+3,&tmp,4); - memcpy(value+7,&datalen,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - char file_name[64]={0}; - uint32_t file_size=0; - if(get_AI_PATH_and_size(file_name,&file_size)) - { - int num=(ble_nus_max_data_len-18); - if(num>482)num=482; - - char *data= (char *)malloc(num+1); - - uint16_t read_size=0; - FILE *fp=fopen(file_name,"rb+"); - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetAiRecordCmd size %d\r\n",file_size); - uint32_t pack=file_size/num+1; - uint32_t pack_id=1; - if(fp==NULL) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"fopen fail %s\r\n",file_name); - goto GetAiRecordFail; - } - do - { - memset_s(data,num+1,0,num+1); - read_size=fread(data,1,num,fp); - - if(read_size!=0) - { - ble_data_type type_={0x01,0x34,file_size,pack,pack_id}; - send_big_data(type_,data,read_size); - } - pack_id++; - - - } while (read_size==num); - free(data); - fclose(fp); - }else - { - GetAiRecordFail: - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } -} - -static void GetSOSDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint32_t data_len=0; - uint8_t *bin_data = ble_get_sos_all_data_malloc(&data_len); - if(bin_data==NULL) - { - ble_data_type type_={0x01,0x36,0,1,1}; - send_big_data(type_,NULL,0); - return; - } - uint32_t surplus_len=data_len; - uint32_t offset=0; - - uint32_t pack; - uint16_t pack_size=(ble_nus_max_data_len-18); - if(pack_size>482)pack_size=482; - - if(data_len%pack_size==0) - { - pack=data_len/pack_size; - } - else - { - pack=data_len/pack_size+1; - } - uint32_t pack_id=1; - while (surplus_len!=0) - { - if(surplus_len>=pack_size) - { - surplus_len=surplus_len-pack_size; - - ble_data_type type_={0x01,0x36,data_len,pack,pack_id}; - send_big_data(type_,(char *)bin_data+offset,pack_size); - offset+=pack_size; - } - else - { - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack); - ble_data_type type_={0x01,0x36,data_len,pack,pack_id}; - send_big_data(type_,(char *)bin_data+offset,surplus_len); - break; - } - pack_id++; - } - free(bin_data); - - -} -//AI录音已经就绪 -static void AiIsReadyCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - - if(data[0]) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AiIsReadyCmd succ\r\n"); - }else - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AiIsReadyCmd fail\r\n"); - } -} -//app发送解除配对消息 -static void UnpairMessCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[19]; - memset(value,0,19); - uint32_t tmp = 1; - uint32_t datalen = 1; - uint16_t tmp_data = 1; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x2d; - memcpy(value+3,&tmp,4); - memcpy(value+7,&datalen,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(Check_CRC(data,len,crcvalue)) - { - - value[17] = 1;// - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - }else - { - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } -} - -uint8_t is_connect_synchronization_time=0; - -//app发送同步数据结束消息 -static void GetSynDataEndCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[19]; - memset(value,0,19); - uint32_t tmp = 1; - uint32_t datalen = 1; - uint16_t tmp_data = 1; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x2e; - memcpy(value+3,&tmp,4); - memcpy(value+7,&datalen,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(Check_CRC(data,len,crcvalue)) - { - value[17] = 1;// - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - uapi_save_runtime_log(RUNTIME_LOG_BLE_APP_SYN_END); - - if(is_connect_synchronization_time) - { - watch_synchronization_time(); - } - else - { - if(g_ble_conn_id) - { - is_connect_synchronization_time=1; - } - - } - - - - uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_SLOW); - - }else - { - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } -} - -//同步基础训练历史数据 training history data -static void Send_json_Data_Cmd(uint8_t day,uint16_t pack_size,uint8_t id) -{ - - - char *json_format = NULL; - switch (id) - { - case 0x49: - json_format=struct_to_json_buf_malloc_(day); - break; - case 0x01: - json_format=struct_to_json_buf_malloc_Alarm(); - break; - case 0x21: - json_format=dir_to_json_buf_malloc(day); - break; - - default: - break; - } - - if(json_format == NULL) return ; - - uint32_t data_len = strlen(json_format); - uint32_t surplus_len=data_len; - uint32_t pack; - if(data_len%pack_size==0) - { - pack=data_len/pack_size; - } - else - { - pack=data_len/pack_size+1; - } - uint32_t pack_id=1; - uint32_t offset=0; - while (surplus_len!=0) - { - if(surplus_len>=pack_size) - { - surplus_len=surplus_len-pack_size; - - ble_data_type type_={0x01,id,data_len,pack,pack_id}; - send_big_data(type_,json_format+offset,pack_size); - - //send_big_data(1,json_format+offset,pack_size,data_len,pack_id,pack,id,1); - offset+=pack_size; - } - else - { - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack); - ble_data_type type_={0x01,id,data_len,pack,pack_id}; - send_big_data(type_,json_format+offset,surplus_len); - //send_big_data(1,json_format+offset,surplus_len,data_len,pack_id,pack,id,1); - break; - } - pack_id++; - } - cJSON_free(json_format); -} - -//同步数据结束完成 -static void synEndDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) -{ - uint8_t value[18+1]; - memset(value,0,18+1); - uint32_t tmp = 1; - uint32_t tmpToall = 0; - uint16_t tmp_data = 0; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x2e; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmpToall,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - if(Check_CRC(data,len,crcvalue)) - { - value[17] = 1; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - - uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_SLOW); - - }else - { - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } -} - - - - -//01类型 -/* -cmd: 指令uint16_t 协议01 02 拼接成0x0102 去协议文档对应是切换表盘 -*data:数据,不包含前面17个字节的包头和最后一位的校验和 -len 就是data的长度 -*totaldata:总的数据内容 包含包头和校验预览做接口是用 如果要计算totaldata的长度直接是len+17+1 就是加上包头和校验和 -crcvalue;数据的校验和 不包含包头和校验和的计算结果 -*/ -// 73 01 31 01 00 00 00 01 00 00 00 01 00 00 00 00 00 2 FE -void SetDMPModeCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置入库模式 0关闭 1电信 2-255移动 -{ - uint8_t value[19]; - memset(value,0,19); - uint32_t tmp = 1; - value[0] =0x72; - value[1] =0x01; - value[2] =0x31; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp,2); - - if(Check_CRC(data,len,crcvalue)) - { - - int state = 0; - state = data[0]; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"data[0];%d state:%d\r\n",data[0],state); - Set_DmpChangeMode(state); - value[17] = 1; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - }else{ - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } -} -// 73 01 32 01 00 00 00 00 00 00 00 01 00 00 00 00 00 crc - -void GetDMPModeCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取入库模式 0关闭 1电信 2-255移动 -{ - uint8_t value[19]; - memset(value,0,19); - uint32_t tmp = 1; - value[0] =0x72; - value[1] =0x01; - value[2] =0x32; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp,2); - - if(Check_CRC(data,len,crcvalue)) - { - int state = Get_DmpChangeMode(); - value[17] = state; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - }else{ - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } -} -void type2AE3Data(ble_read_data *buffer_handle,uint8_t *cmd_buf ,uint8_t *data,uint16_t datalen,uint8_t *totaldata,uint8_t crcvalue) -{ - uint16_t cmd = cmd_buf[1]*256+cmd_buf[2]; - #ifdef BLE_LOG - - #endif - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"type2AE3Data:0x%04X\r\n",cmd); - // uint8_t typeID = cmd_buf[2]; - switch (cmd) - { - case SEND_UPPAIR_CMD://清除配对指令 - clearPaireCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case SWITCH_DIAL_CMD://表盘切换 - switchDialCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case ABOUT_DEV_CMD://关于本机内容 - aboutDeviceCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case FIND_WATCH_CMD://查找手表 - findWatchCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case GET_SD_SPACE_CMD://获取sdk的剩余空间 - GetSDSpaceCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case GET_CURR_DATA_CMD://获取当前数据 卡路里 - GetCurDataCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case GET_BATTERY_LEVEL_CMD://获取手表电池电量 - GetBatteryLevelCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case SWITCH_MESS_CMD://开关消息推送功能 - SetSwitchMessCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case REVOKE_CURR_FILE_TRANS_CMD://撤销文件传输 - RemoveFileCmd(buffer_handle,cmd,data,datalen,totaldata,crcvalue); - break; - case DELETE_SPECIF_TYPE_FILE_CMD://删除指定类型的所有文件 - DeleteFileTypeCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case SWITCH_SPORT_MODE_CMD://开启指定运动模式 - OpenSportModeCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case STOP_SPORT_MODE_CMD://结束运动模式 - StopSportModeCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case SET_LANGUGAE_CMD://设置语言 - SetLanguageCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case GET_REAL_HEART_CMD://获取实时训练数据 - GetRealTimeDataCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case SWITCH_GET_REAL_HEART_CMD://开启/关闭自动获取实时训练数据 - SetRealTimeDataCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case SET_REAL_DATA_FREQ_CMD://设置训练实时数据采集频率 - SetRTDataFreCmd(cmd,data,datalen,totaldata,crcvalue); - break; - - case SET_MAX_HR_REMID_CMD://设置最高心疼提醒 255关闭 - SetMaxHrRemindCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case SPORT_PAUSE_RESET_CMD://训练暂停/恢复 - GetSportPasueResetCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case SEND_CURR_DIAL_TOAPP_CMD://发送当前表盘 - SendDialToAppCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case SEND_CURR_STATUS_CMD: //获取手表当前状态 - GetWatchStatusCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case GET_WATCH_LCD_PARAM_CMD: //获取手表屏幕参数 - GetScreenParamCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case DELETE_DIAL_CMD://删除表盘UID - DeleteDialUidCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case GET_WATCH_VOICE_VIBRATE_CMD://获取手表声音与振动参数 - GetSoundVibrationCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case GET_WATCH_AUXIL_FUN_PARAM_CMD://获取手表辅助功能参数 - GetWatchAuxFuncCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case GET_WATCH_HR_SET_PARAM_CMD://获取手表心率设置 - GetHrGetParamCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case GET_WATCH_SPO2_SET_PARAM_CMD://获取手表血氧设置 - GetSpo2GetParamCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case GET_GESTURE_CARMERA_CMD://获取手势拍照 - carmeraCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case GET_DRINK_SWITCH_CMD://获取喝水提醒设置 - GetDrinkParamCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case FACTORY_SET_CMD://app发送恢复出厂设置 - GetFactoryCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case RESET_WATCH_CMD://app发送重启指令 - GetResetCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case POWER_OFF_CMD://app发送关机 - GetPowerOffCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case KM_MILE_CMD://app设置手表公英制单位 - GetMetricCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case SLEEP_GET_CMD://app获取睡眠设置 - GetSleepParamCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case GET_SEDENT_CMD: - GetSedentParamCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case DELETE_ALL_DILA_CMD://app所有表盘UID - GetAllDialUidCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case GET_TARGET_STEP_CMD://app获取目标步数设置 - GetTargetStepCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case GET_OTHER_TARGET_CMD://app获取其他目标 - GetTargetOtherCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case GET_UNPAIR_CMD://发送解除配对消息 - UnpairMessCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case SYN_DATA_END_CMD: //app发送同步数据结束消息 - GetSynDataEndCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case GET_PASSWORD_CMD: //获取手表密码 - GetPasswordCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case SYN_GET_MSG_CONFIG_CMD: //获取手表消息设置 - GetmsgconfigCmd(cmd,data,datalen,totaldata,crcvalue); - break; - - case APP_GET_AI_PCM_DATA_CMD: - GetAiRecordCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case APP_GET_SOS_DATA_CMD: - GetSOSDataCmd(cmd,data,datalen,totaldata,crcvalue); - break; - - case GET_SPECIF_TYPE_FILE_CMD://获取指定类型文件目录 - case AI_IS_READ_DATA_CMD: - case SYN_HEART_HISTORY_DATA_CMD://同步心率历史数据 - case SYN_SPO2_HISTORY_DATA_CMD://同步血氧历史数据 - case SYN_STEP_HISTORY_DATA_CMD: //同步步数历史数据 - case SYN_FAT_BURN_HISTORY_DATA_CMD://同步燃脂时间数据 - case SYN_STAND_HISTORY_DATA_CMD://同步站立历史数据 - case SYN_KCAL_HISTORY_DATA_CMD://同步卡路里历史数据 - case SYN_DIS_HISTORY_DATA_CMD://同步距离历史数据 - case SYN_BASIC_TRANIN_HISTORY_DATA_CMD://同步基础训练历史数据 - case SYN_SLEEP_HISTORY_DATA_CMD://睡眠历史数据 - case ALARM_CMD://获取手表闹钟//同步闹钟 - - readDevDataBle(cmd,data,datalen,totaldata,crcvalue); - break; - case SET_DMP_MODE_CMD://0X0131 - SetDMPModeCmd(cmd,data,datalen,totaldata,crcvalue); - break; - case GET_DMP_MODE_CMD://0X0132 - GetDMPModeCmd(cmd,data,datalen,totaldata,crcvalue); - break; - default: - break; - } - - -} - - -//05 类型 -void typeHexFiveData(uint8_t *buf_cmd,uint8_t *data,uint16_t datalen) -{ - uint16_t typeID = buf_cmd[1]*256+buf_cmd[2]; - switch (typeID) //ID - { - case FIND_PHONE_CMD://查找手机 - // (data,datalen); - break; - case GET_CURR_TIME_CMD://手表获取系统时间 - // getPhoneInfo(data,datalen); - break; - case SEND_PARI_SUCESS_CMD: - // GetUTCtime(data,datalen);//获取时间app下发的时间进行解析 - break; - case GET_TRANS_END_CMD: - // getPhoneInfo_test(); - break; - case SEND_FACTORY_RECORD_CMD: - break; - case REQUEST_EPO_FILE_CMD: - break; - case SEND_TRAIN_STATUS_CMD: - break; - default: - break; - } -} - - -#define STEP_DATA_LEN 8 -#define KCAL_DATA_LEN 8 -#define DIS_DATA_LEN 8 -#define STAND_DATA_LEN 8 -#define FATTIME_DATA_LEN 6 -#define HEART_DATA_LEN 5 -#define SPO2_DATA_LEN 5 -uint8_t bleSendTypeID=0; //发送的数据类型 -//发送读出来的设备数据to APP -uint16_t max_mtu_szie_data_len = 200; -uint32_t EACH_DATA_LEN=0;//每种数据类型的的长度 - - -void Send_Sleep_Bin_Data(uint8_t day, uint16_t num) -{ - - char *data=NULL; - uint32_t file_size=1; - uint8_t sleep_count = ble_get_sleep_data_dir(&file_size,day); - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Send_Sleep_Bin_Data file_size : %d \r\n",file_size); - - data=(char *)malloc(file_size); - - if(data==NULL) - { - return; - } - - memset(data,0,file_size); - - data[0]=sleep_count; - - if(data==NULL) - { - #ifdef BLE_LOG - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"malloc\r\n"); - #endif - - return; - } - ble_get_sleep_data(file_size,day,(uint8_t*)data+1); - - - if(data==NULL || file_size==1) - { - ble_data_type type_={0x01,0x4b,0,1,1}; - send_big_data(type_,NULL,0); - //send_big_data(1,NULL,0,0,1,1,0x4b,1); - return; - } - - uint32_t surplus_len=file_size; - uint32_t pack; - if(file_size%num==0) - { - pack=file_size/num; - } - else - { - pack=file_size/num+1; - } - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack); - uint32_t pack_id=1; - uint32_t offset=0; - while (surplus_len!=0) - { - if(surplus_len>=num) - { - surplus_len=surplus_len-num; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",num,file_size,pack_id,pack); - - ble_data_type type_={0x01,0x4b,file_size,pack,pack_id}; - send_big_data(type_,data+offset,num); - offset+=num; - } - else - { - //#ifdef BLE_LOG - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",surplus_len,file_size,pack_id,pack); - //#endif - ble_data_type type_={0x01,0x4b,file_size,pack,pack_id}; - send_big_data(type_,data+offset,surplus_len); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"开始\r\n"); - for(int i=0;i=pack_size) - { - surplus_len=surplus_len-pack_size; - ble_data_type type_={0x01,id,data_len,pack,pack_id}; - send_big_data(type_,data+offset,pack_size); - //send_big_data(1,data+offset,pack_size,data_len,pack_id,pack,id,1); - offset+=pack_size; - } - else - { - #ifdef BLE_LOG - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack); - #endif - - ble_data_type type_={0x01,id,data_len,pack,pack_id}; - send_big_data(type_,data+offset,surplus_len); - - //send_big_data(1,data+offset,surplus_len,data_len,pack_id,pack,id,1); - break; - } - pack_id++; - } - free(data); - -} - -//手机app下发读设备数据指令 -void readDevDataBle(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue) -{ - - uint8_t sendBuf[19]; - memset(sendBuf,0,19); - uint8_t type = cmd/256; - uint8_t typeID = cmd-((cmd/256)*256); - uint32_t totaldata_pack = 1; - uint32_t totaldata_packlen = 0; - uint32_t pack_count = 0; - uint16_t pack_datalen = 0; - sendBuf[0]=0x72; - sendBuf[1]=type; - sendBuf[2]=typeID; - memcpy(sendBuf+3,&totaldata_pack,4);//总的数据包 - memcpy(sendBuf+7,&totaldata_packlen,4);//总的数据包长度 - memcpy(sendBuf+11,&pack_count,4);//分包索引号 - - memcpy(sendBuf+15,&pack_datalen,2);//分包数据长度 - - if(Check_CRC(data,len,crcvalue)) - { - bleSendTypeID=cmd-((cmd/256)*256); - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"同步第%d天的数据\r\n",data[0]); - int num; - - switch (bleSendTypeID) - { - case 0x40://同步心率历史数据 - if(uapi_dev_runtime_get_heartrate_storage_status()) - { - ble_reply_cmdarr(SYN_HEART_HISTORY_DATA_CMD,NULL,0); - return; - } - - num=(ble_nus_max_data_len-18); - if(num>482)num=482; - #ifdef BLE_LOG - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"同步心率数据,每包最多:%d 数据 data:%d %d\r\n",num,data[0],len); - #endif - uapi_dev_runtime_set_heartrate_storage_status(1); - if(!Read_Health_BIN_file_buf_send_bin_Data(data[0],num,0x40)) - { - ble_data_type type_={0x01,0x40,0,1,1}; - send_big_data(type_,NULL,0); - } - uapi_dev_runtime_set_heartrate_storage_status(0); - //send_big_data(1,NULL,0,0,1,1,0x40,1); - - break; - case 0x41://同步血氧历史数据 - if(uapi_dev_runtime_get_bloodoxygen_storage_status()) - { - ble_reply_cmdarr(SYN_SPO2_HISTORY_DATA_CMD,NULL,0); - return; - } - - - num=(ble_nus_max_data_len-18); - if(num>482)num=482; - uapi_dev_runtime_set_bloodoxygen_storage_status(1); - if(!Read_Health_BIN_file_buf_send_bin_Data(data[0],num,0x41)) - { - ble_data_type type_={0x01,0x41,0,1,1}; - send_big_data(type_,NULL,0); - } - uapi_dev_runtime_set_bloodoxygen_storage_status(0); - - break; - case 0x43: //同步步数历史数据 - - if(uapi_dev_runtime_get_goal_storage_status()) - { - ble_reply_cmdarr(SYN_STEP_HISTORY_DATA_CMD,NULL,0); - return; - } - - num=(ble_nus_max_data_len-18); - if(num>482)num=482; - uapi_dev_runtime_set_goal_storage_status(1); - Read_BIN_file_buf_send_bin_Data(data[0],num,0x43); - uapi_dev_runtime_set_goal_storage_status(0); - - break; - case 0x44://同步燃脂时间数据 - - if(uapi_dev_runtime_get_goal_storage_status()) - { - ble_reply_cmdarr(SYN_FAT_BURN_HISTORY_DATA_CMD,NULL,0); - return; - } - - num=(ble_nus_max_data_len-18); - if(num>482)num=482; - uapi_dev_runtime_set_goal_storage_status(1); - Read_BIN_file_buf_send_bin_Data(data[0],num,0x44); - uapi_dev_runtime_set_goal_storage_status(0); - break; - case 0x45://同步站立历史数据 - - if(uapi_dev_runtime_get_goal_storage_status()) - { - ble_reply_cmdarr(SYN_STAND_HISTORY_DATA_CMD,NULL,0); - return; - } - - - num=(ble_nus_max_data_len-18); - if(num>482) - { - num=482; - } - uapi_dev_runtime_set_goal_storage_status(1); - Read_BIN_file_buf_send_bin_Data(data[0],num,0x45); - uapi_dev_runtime_set_goal_storage_status(0); - - break; - case 0x46://同步卡路里历史数据 - if(uapi_dev_runtime_get_goal_storage_status()) - { - ble_reply_cmdarr(SYN_KCAL_HISTORY_DATA_CMD,NULL,0); - return; - } - - num=(ble_nus_max_data_len-18); - if(num>482) - { - num=482; - } - uapi_dev_runtime_set_goal_storage_status(1); - Read_BIN_file_buf_send_bin_Data(data[0],num,0x46); - uapi_dev_runtime_set_goal_storage_status(0); - break; - case 0x47://同步距离历史数据 - - if(uapi_dev_runtime_get_goal_storage_status()) - { - ble_reply_cmdarr(SYN_DIS_HISTORY_DATA_CMD,NULL,0); - return; - } - - num=(ble_nus_max_data_len-18); - if(num>482) - { - num=482; - } - uapi_dev_runtime_set_goal_storage_status(1); - Read_BIN_file_buf_send_bin_Data(data[0],num,0x47); - uapi_dev_runtime_set_goal_storage_status(0); - break; - case 0x49://同步基础训练历史数据 - - if(uapi_dev_runtime_get_train_storage_status()) - { - ble_reply_cmdarr(SYN_BASIC_TRANIN_HISTORY_DATA_CMD,NULL,0); - return; - } - - EACH_DATA_LEN = DIS_DATA_LEN; - num=(ble_nus_max_data_len-18); - if(num>482) - { - num=482; - } - uapi_dev_runtime_set_train_storage_status(1); - Send_json_Data_Cmd(data[0],num,0x49); - uapi_dev_runtime_set_train_storage_status(0); - break; - case 0x01://同步闹钟 - EACH_DATA_LEN = DIS_DATA_LEN; - num=(ble_nus_max_data_len-18); - if(num>482) - { - num=482; - } - Send_json_Data_Cmd(data[0],num,0x01); - break; - case 0x4b://睡眠历史数据 - - if(uapi_dev_runtime_get_sleep_storage_status()) - { - ble_reply_cmdarr(SYN_SLEEP_HISTORY_DATA_CMD,NULL,0); - return; - } - - EACH_DATA_LEN = DIS_DATA_LEN; - num=(ble_nus_max_data_len-18); - if(num>482)num=482; - uapi_dev_runtime_set_sleep_storage_status(1); - Send_Sleep_Bin_Data(data[0],num); - uapi_dev_runtime_set_sleep_storage_status(0); - break; - case 0x21://文件目录 - EACH_DATA_LEN = DIS_DATA_LEN; - num=(ble_nus_max_data_len-18); - if(num>482) - { - num=482; - } - Send_json_Data_Cmd(data[0],num,0x21); - break; - - default: - break; - } - //sendReadData(); - }else{ - sendBuf[18] = 0; - sendBleData(sendBuf,19); - } -} - - - - -void getPhoneInfo_test(void) -{ - /* - cJSON *dataJSON = cJSON_CreateObject(); - cJSON* data_arryJSON = cJSON_CreateArray(); - cJSON_AddNumberToObject(dataJSON,"code",1); - - for(uint8_t i =0;i<3;i++) - { - cJSON* itemJSON = cJSON_CreateObject(); - cJSON* arrayJSON = cJSON_CreateArray(); - for(uint8_t id = 0;id<7;id++) - { - cJSON_AddNumberToObject(arrayJSON,"id",id); - } - - cJSON_AddNumberToObject(itemJSON,"id",i); - cJSON_AddItemToObject(itemJSON,"repeat",arrayJSON); - cJSON_AddNumberToObject(itemJSON,"hour",2+20*i); - cJSON_AddNumberToObject(itemJSON,"minute",30+i*0); - cJSON_AddNumberToObject(itemJSON,"enable",1); - cJSON_AddItemReferenceToArray(data_arryJSON,itemJSON); - } - cJSON_AddItemToObject(dataJSON,"alarm",data_arryJSON); - - char *json_format = cJSON_PrintUnformatted(dataJSON); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d\n",strlen(json_format)); - cJSON_Delete(dataJSON); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s\n",json_format); - uint32_t data_len = strlen(json_format); - uint8_t value[data_len+18]; - uint32_t tmp = 1; - uint16_t tmp_data = 1; - value[0] = 0x72; - value[1] = 0x01; - value[2] = 0x01; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp_data,2); - memcpy(value+17,(uint8_t *)json_format,data_len); - unsigned char lrc = Calculate_CRC(value,data_len+17); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"lrc:%d",lrc); - value[data_len+18] = lrc; - sendBleData(value,data_len+18); - */ - - // uint8_t value[128]; - // memset(value,0,128); - - // value[0] = 0x72; - // value[1] = 0x01; - // value[2] = 0x0f; - // char buf[128]; - // memset(buf,0,128); - // getSportData(&buf); - // uint32_t tmp = 1; - // uint32_t datalen = 1; - // uint16_t tmp_data = 1; - // datalen = strlen(buf); - // tmp_data = datalen; - // memcpy(value+3,&tmp,4); - // memcpy(value+7,&datalen,4); - // memcpy(value+11,&tmp,4); - // memcpy(value+15,&tmp_data,2); - // memcpy(&value[17],buf,strlen(buf)); - - // comfirmPaire(0); - -} - -bool creatMessageDir(void)//创建消息文件夹 -{ - struct stat info; - if (stat(ANCS_DATA_CONFIG_DIR, &info) != 0) - { - if (mkdir(ANCS_DATA_CONFIG_DIR, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0) - { - return false; // Failed to create folder - } - } - return true; -} -char *get_message_dir_path(void)//获取信息的文件夹路径 -{ - return ANCS_DATA_CONFIG_DIR; -} - -void message_data(int uid,int appid,char *title,char *msg,int hasCode) -{ - - uint32_t timestampe = 0; - if (uapi_get_timestampe_ss(×tampe) != ERRCODE_SUCC) - { - timestampe = 0; - } - ancs_data_info_t data; - data.title=malloc(strlen(title)+1); - data.msg = malloc(strlen(msg) + 1); - memset_s(data.title, TITLE_BUF_LEN, 0, strlen(title) + 1); - memset_s(data.msg, MSG_BUF_LEN, 0, strlen(msg) + 1); - memcpy_s(data.title, TITLE_BUF_LEN + 1, title, strlen(title)); - memcpy_s(data.msg, MSG_BUF_LEN + 1, msg, strlen(msg)); - - - data.appid = appid; - data.uid=uid; - data.time=timestampe; - data.read=0; - data.hasCode = hasCode; - - data.msglen = strlen(msg); - data.titlelen = strlen(title); - - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"message_data %p %p\r\n", data.title, data.msg); - - CustomEventPublish_TOPIC_EVENT_MESSAGENOTE(&data); - return ; - -} -int uft8_check(char *chinese_string,int length) -{ - int i = 0; - for (i = 0; i < length;) { - // 判断是否为ASCII字符 - if ((unsigned char)chinese_string[i] < 0x80) { - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"ASCII character: %d\n", (int)(unsigned char)chinese_string[i]); - i++; - } else { - // 假设这里我们只处理3字节的UTF-8字符 - // 实际上,中文字符通常是4字节 - if ((unsigned char)chinese_string[i] >= 0xF0) { - // 这里应处理4字节UTF-8字符的逻辑 - // 例如: return (chinese_string[i] << 24) | (chinese_string[i + 1] << 16) | (chinese_string[i + 2] << 8) | chinese_string[i + 3]; - i += 4; // 跳过4个字节 - } else if ((unsigned char)chinese_string[i] >= 0xE0) { - // 这里应处理3字节UTF-8字符的逻辑 - // 例如: return (chinese_string[i] << 16) | (chinese_string[i + 1] << 8) | chinese_string[i + 2]; - i += 3; // 跳过3个字节 - } else { - // 这里应处理2字节UTF-8字符的逻辑 - // 例如: return (chinese_string[i] << 8) | chinese_string[i + 1]; - i += 2; // 跳过2个字节 - } - } - if(i+4 > length) - break; - } - return i; -} - - -//安卓消息接收解析数据 //ANCS 2AE1 -uint8_t jscheck_ancs(uint8_t *data) -{ - uint8_t *json; - json = data; - cJSON* root = cJSON_Parse((const char *)json); - if (root == NULL) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"信息解析 JSON解析 失败\n"); - return 2; - } - - int uid_t = 0; - int appid_t = 0; - int hasCode_t = 0; - char *titleBuf; - char *msgBuf; - titleBuf = ym_malloc(TITLE_BUF_LEN+1); - msgBuf = ym_malloc(MSG_BUF_LEN+1); - if(titleBuf == NULL || msgBuf == NULL)//申请内存失败不在申请 - { - return 2; - } - memset(titleBuf,0,TITLE_BUF_LEN+1); - memset(msgBuf,0,MSG_BUF_LEN+1); - cJSON* uid = cJSON_GetObjectItem(root, "uid"); - if (uid && cJSON_IsNumber(uid)) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"uid_t: %d\n", uid->valueint); - uid_t = uid->valueint; - } - cJSON* appid = cJSON_GetObjectItem(root, "appid"); - if (appid && cJSON_IsNumber(appid)) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"appid_t: %d\n", appid->valueint); - appid_t = appid->valueint; - } - cJSON* title_c = cJSON_GetObjectItem(root, "title"); - if (title_c && cJSON_IsString(title_c)) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"titleBuf: %s\n", title_c->valuestring); - int len = strlen(title_c->valuestring); - if(len >= TITLE_BUF_LEN){ - len = uft8_check(title_c->valuestring,TITLE_BUF_LEN-4); - title_c->valuestring[len++] ='.'; - title_c->valuestring[len++] = '.'; - title_c->valuestring[len++] = '.'; - title_c->valuestring[len++] = 0; - } - memcpy_s(titleBuf,TITLE_BUF_LEN,(uint8_t *)title_c->valuestring,len); - } - cJSON* msg = cJSON_GetObjectItem(root, "msg"); - if (msg && cJSON_IsString(msg)) { - int len = strlen(msg->valuestring); - if(len >= MSG_BUF_LEN-4){ - len = uft8_check(msg->valuestring,MSG_BUF_LEN-4); - msg->valuestring[len++] ='.'; - msg->valuestring[len++] = '.'; - msg->valuestring[len++] = '.'; - msg->valuestring[len++] = 0; - } - memcpy_s(msgBuf,MSG_BUF_LEN,(uint8_t *)msg->valuestring,len); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"msgBuf: %s\n",msgBuf); - } - cJSON* time = cJSON_GetObjectItem(root, "time"); - if (time && cJSON_IsString(time)) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"time: %s\n", time->valuestring); - // timeBuf = time->valueint; - } - cJSON* hasCode = cJSON_GetObjectItem(root, "hasCode"); - if (hasCode && cJSON_IsNumber(hasCode)) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"hasCode_t: %d\n", hasCode->valueint); - hasCode_t = hasCode->valueint; - } - cJSON_Delete(root); - - // if(ancs_msg_data!=NULL) - // { - // free(ancs_msg_data); - // ancs_msg_data=NULL; - // } - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"send message\r\n"); - message_data(uid_t,appid_t,titleBuf,msgBuf,hasCode_t); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"send message ok\r\n"); - - if(titleBuf != NULL){ - ym_free(titleBuf); - titleBuf = NULL; - } - if(msgBuf != NULL){ - ym_free(msgBuf); - msgBuf = NULL; - } - return 1; -} - -void ancsDataShowCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)// -{ - uint8_t value[19]; - memset(value,0,19); - uint32_t tmp = 1; - value[0] =0x72; - value[1] =0x02; - value[2] =0x01; - memcpy(value+3,&tmp,4); - memcpy(value+7,&tmp,4); - memcpy(value+11,&tmp,4); - memcpy(value+15,&tmp,2); - - if(Check_CRC(data,len,crcvalue)) - { - //解析ancs数据并且显示出来 - uint8_t check_ok= 1; - check_ok = jscheck_ancs(data); - value[17] = 1; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - }else{ - value[17] = 0; - value[18] = Calculate_CRC(value,18); - sendBleData(value,19); - } -} - -void CustomEventPublish_TOPIC_EVENT_MESSAGENOTE(void *data) -{ - CustomEventPublish(TOPIC_EVENT_MESSAGE_UPDATA,(uint8_t*)data,sizeof(ancs_data_info_t)); -} - -void type2AE1Data(uint8_t *buf_cmd,uint8_t *data,uint16_t datalen,uint8_t *totalData,uint8_t crcvalue) -{ - uint16_t typeID = buf_cmd[1]*256+buf_cmd[2]; - #ifdef BLE_LOG - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"type2AE1Data typeID:0x%4X\r\n",typeID); - #endif - switch (typeID) //ID - { - case ANDROID_ANCS_CMD:// - ancsDataShowCmd(typeID,data,datalen,totalData,crcvalue); - break; - } -} - -void bleRecvANCSData(uint8_t *data, uint16_t data_size,uint8_t *buf_cmd,uint8_t *totalData,uint8_t crcvalue)//buf_cmd 指令前17个字节数据 -{ - uint8_t type = buf_cmd[1]; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"type:%d %d data_size:%d data:%d crcvalue:%x\r\n",buf_cmd[0],type,data_size,data[0],crcvalue); - switch (type) - { - case 0x03:// - type2AE1Data(buf_cmd,data,data_size,totalData,crcvalue); - break; - default: - break; - } -} - -/** - * less than 20bytes msg reply -*/ -errcode_t ble_reply_msgarr(uint8_t msg_cmdtype,uint8_t msg_cmdid,uint8_t *replydata,uint16_t replydata_len) -{ - - //发送校验失败 - - if (replydata_len > 20) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"datalen is larger than 20, please send with other api !\n"); - return ERRCODE_FAIL; - } - uint16_t replybuflen=sizeof(msg_header_t)+replydata_len+1; - uint8_t *replybuf=malloc(replybuflen); - if(replybuf != NULL) - { - msg_header_t *reply_cmd_header=(msg_header_t*)replybuf; - reply_cmd_header->direction = MSG_DIRECTION_SEND; - reply_cmd_header->cmdtype =msg_cmdtype; - reply_cmd_header->cmdid = msg_cmdid; - reply_cmd_header->package_count = 1; - reply_cmd_header->package_index = 1; - reply_cmd_header->package_len = replydata_len; - reply_cmd_header->total_data_len = replydata_len; - memcpy_s(replybuf+sizeof(msg_header_t),replydata_len,replydata,replydata_len); - uint8_t crc_value = Calculate_CRC( replybuf, replybuflen - 1); - replybuf[ replybuflen - 1 ] = crc_value ; //CRC - errcode_t ret=0; - if(msg_cmdtype==6) - { - ret=sendBleData_zhihui(replybuf,replybuflen); - - }else - { - ret= sendBleData(replybuf,replybuflen); - } - - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"ble_reply_msgarr cmdtype %02X cmdid %02X package %d/%d , len %d,total len %d , data[0] %02X crc %02X\n", - reply_cmd_header->cmdtype, - reply_cmd_header->cmdid, - reply_cmd_header->package_index, - reply_cmd_header->package_count, - reply_cmd_header->package_len, - reply_cmd_header->total_data_len, - (replybuf+sizeof(msg_header_t))[0], - crc_value - ); - free(replybuf); - return ret; - }else{ - return ERRCODE_MALLOC; - } -} - -errcode_t ble_reply_cmdarr(uint16_t msg_cmd,uint8_t *replydata,uint16_t replydata_len) -{ - - uint8_t cmdtype = (uint8_t)((msg_cmd&0xFF00)>>8); - uint8_t cmdid = (uint8_t)(msg_cmd&0x00FF); - - return ble_reply_msgarr(cmdtype,cmdid,replydata,replydata_len); - -} -errcode_t ble_reply_cmd(uint16_t msg_cmd,uint8_t replydata) -{ - uint8_t cmdtype = (uint8_t)((msg_cmd&0xFF00)>>8); - uint8_t cmdid = (uint8_t)(msg_cmd&0x00FF); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"msg_cmd %04X cmdtype %02X cmdid %02X\n",msg_cmd,cmdtype,cmdid); - return ble_reply_msg(cmdtype,cmdid,replydata); -} -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); -} - -static uint32_t last_package_id=0; -static void ble_transfer_Timer_CallBack(int data) -{ - timer_flie_flag--; - - if(timer_flie_flag==0) - { - cancel_recv_file(1); - } -} -uint8_t OTA_FILE_value=0; - -errcode_t decode_ota_data(ble_read_data *buffer_handle,uint8_t *data,uint16_t datalen,uint8_t crcvalue) -{ - if(datalencmdtype!=0x06) - { - return ERRCODE_FAIL; - } - - uint8_t* data_=data+sizeof(msg_header_t); - //datalen-=18; - datalen=header->package_len; - - if(header->cmdid==0x0B) - { - //取消文件传输 - if(Check_CRC(data_,datalen,crcvalue)) - { - cancel_recv_file(0); - uint8_t replydata= 1; - ble_reply_msgarr(6,0x0B,&replydata,1); - } - else - { - cancel_recv_file(0); - uint8_t replydata= 0; - ble_reply_msgarr(6,0x0B,&replydata,1); - } - - } - else if(header->cmdid==0x02) - { - - uint32_t package_id=header->package_index; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"package_id: %d \r\n",package_id); - if(Check_CRC(data_,datalen,crcvalue)) - { - - if(package_id==0) - { - last_package_id=package_id; - if((buffer_handle->file_recv_stat.recv_file_stat <= 0) && buffer_handle->file_recv_stat.file == NULL ) - { - buffer_handle->file_recv_stat.lrcvalue = 0; - if (buffer_handle->file_recv_stat.file_type == 1) - { - - buffer_handle->file_recv_stat.file = fopen(UP_DATE_FWPKG_PATH,"w+"); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",UP_DATE_FWPKG_PATH,buffer_handle->file_recv_stat.file); - - - } - else if (buffer_handle->file_recv_stat.file_type == 2) - { - char musicpath[64]={0}; - get_music_path(musicpath,64); - //"/user/userdata/music" - char filepath[256]={0}; - create_mp3_name(filepath,musicpath,buffer_handle->file_recv_stat.file_name); - - buffer_handle->file_recv_stat.file = fopen(filepath,"w+"); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"filepath %s\r\n",filepath); - } - else if (buffer_handle->file_recv_stat.file_type == 4) - { - char filepath[128]={0}; - if (get_app_file_path(buffer_handle->file_recv_stat.file_name,strlen(buffer_handle->file_recv_stat.file_name),filepath,sizeof(filepath)) == ERRCODE_SUCC) - { - buffer_handle->file_recv_stat.file = fopen(filepath,"w+");//? - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",filepath,buffer_handle->file_recv_stat.file); - }else{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s error %X\n",buffer_handle->file_recv_stat.file_name,buffer_handle->file_recv_stat.file); - } - } - else - { - char filepath[128]={0}; - 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) - { - buffer_handle->file_recv_stat.file = fopen(filepath,"w+"); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",filepath,buffer_handle->file_recv_stat.file); - }else{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s error %X\n",buffer_handle->file_recv_stat.file_name,buffer_handle->file_recv_stat.file); - } - } - - - - if (buffer_handle->file_recv_stat.file == NULL) - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"6185 buffer_handle->file_recv_stat.file \n"); - return ERRCODE_FAIL; - } - size_t writtensize = fwrite(data_,1,datalen,buffer_handle->file_recv_stat.file); - if(writtensize == datalen) - { - timer_flie_flag=10; - - buffer_handle->file_recv_stat.lrcvalue = calculate_lrc(data_,datalen,buffer_handle->file_recv_stat.lrcvalue); - buffer_handle->file_recv_stat.received_size += datalen; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file received_size %d\n",buffer_handle->file_recv_stat.received_size); - OTA_FILE_value= ((float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size) *100; - - - }else{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file write file failed! ret %d != %d\n",writtensize,datalen); - return ERRCODE_FAIL; - } - - - buffer_handle->file_recv_stat.recv_file_stat = 1; - ////////////////创建文件传输超时定时器////////////////// - uint32_t tick; - osStatus_t retTimer; - if(BR_TRANSFER_timer!=NULL) - { - osTimerDelete(BR_TRANSFER_timer); - BR_TRANSFER_timer = NULL; - } - ble_read_timer_p=buffer_handle; - timer_flie_flag=10; - - BR_TRANSFER_timer = osTimerNew((osTimerFunc_t)ble_transfer_Timer_CallBack, osTimerPeriodic, NULL, NULL); - tick =1000;// osMs2Tick(1000); - retTimer = osTimerStart(BR_TRANSFER_timer, tick); - if (retTimer != osOK && BR_TRANSFER_timer != NULL) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"StartCallTimer osTimerStart failed, ret = %lx!!", retTimer); - osTimerDelete(BR_TRANSFER_timer); - BR_TRANSFER_timer = NULL; - return ERRCODE_FAIL; - } - - { - if(buffer_handle->file_recv_stat.file_type==3) - TRANSMIT_DATA=TRANS_DIAL_TRANSMITTING; - - if(buffer_handle->file_recv_stat.file_type==1) - TRANSMIT_DATA=TRANS_OTA_TRANSMITTING; - - if(buffer_handle->file_recv_stat.file_type==2) - TRANSMIT_DATA=TRANS_MP3_TRANSMITTING; - - if(buffer_handle->file_recv_stat.file_type==4) - TRANSMIT_DATA=TRANS_BIN_TRANSMITTING; - - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - } - } - /////////////////////////////////////////////////////////// - } - else if ((last_package_id+1)==package_id) - { - last_package_id=package_id; - if (buffer_handle->file_recv_stat.file == NULL) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"6194 buffer_handle->file_recv_stat.file \n"); - return ERRCODE_FAIL; - } - //写入文件 - size_t writtensize = fwrite(data_,1,datalen,buffer_handle->file_recv_stat.file); - if(writtensize == datalen) - { - timer_flie_flag=10; - - buffer_handle->file_recv_stat.lrcvalue = calculate_lrc(data_,datalen,buffer_handle->file_recv_stat.lrcvalue); - buffer_handle->file_recv_stat.received_size += datalen; - OTA_FILE_value= ((float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size) *100; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"handle_recv_file received_size %d %0.3lf\n",buffer_handle->file_recv_stat.received_size - ,(float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size); - - }else{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file write file failed! ret %d != %d\n",writtensize,datalen); - return ERRCODE_FAIL; - } - - //检查文件是否写完 - if(buffer_handle->file_recv_stat.file_size == buffer_handle->file_recv_stat.received_size) - { - if (buffer_handle->file_recv_stat.file!=NULL) - { - fclose(buffer_handle->file_recv_stat.file); - buffer_handle->file_recv_stat.file = NULL; - } - if (buffer_handle->file_recv_stat.file_name != NULL) - { - free(buffer_handle->file_recv_stat.file_name); - buffer_handle->file_recv_stat.file_name=NULL; - } - buffer_handle->file_recv_stat.recv_file_stat = 2; - buffer_handle->receive_file_flag = 0; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file received success \n"); - - if(BR_TRANSFER_timer) - { - osTimerStop(BR_TRANSFER_timer); - osTimerDelete(BR_TRANSFER_timer); - BR_TRANSFER_timer = NULL; - } - ble_read_timer_p=NULL; - - TRANSMIT_DATA=FILE_IS_DONE; - - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - - - ble_reply_cmd(OTA_FILE_SUCC_CMD,1);//接收成功 - } - - } - else if (last_package_id==package_id) - { - uint32_t replydata=0xffffffff; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"0xffffffff 包重复\r\n"); - //ble_reply_msgarr(6,4,&replydata,4); - } - else if (last_package_id!=package_id) - { - uint32_t replydata= last_package_id+1; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"包错漏\r\n"); - - - ble_reply_msgarr(0x06,0x04,&replydata,4); - } - return ERRCODE_SUCC; - } - else - { - return ERRCODE_FAIL; - } - } - return ERRCODE_FAIL; -} - - - - -errcode_t decode_ota_json(ble_read_data *buffer_handle) { - - if (uapi_dev_runtime_get_train_status() == 1) { - return ERRCODE_FAIL; - } - - uint8_t *data = buffer_handle->data+sizeof(msg_header_t); - uint16_t datalen = buffer_handle->totalDataLen; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"ota_json_file_save %s\n",data); - - cJSON* root = cJSON_Parse((const char *)data); - if(root != NULL) - { - cJSON* ota_size_json = cJSON_GetObjectItem(root, "size"); - if(ota_size_json != NULL && cJSON_IsNumber(ota_size_json)) - { - buffer_handle->file_recv_stat.file_size = ota_size_json->valueint; - if(is_free_ota_update(ota_size_json->valueint)==false) - { - TRANSMIT_DATA=TRANS_OTA_FAIL; - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - cJSON_Delete(root); - - return ERRCODE_FAIL; - } - } - - cJSON* ota_type_json = cJSON_GetObjectItem(root, "type"); - if(ota_type_json != NULL && cJSON_IsNumber(ota_type_json)) - { - buffer_handle->file_recv_stat.file_type = ota_type_json->valueint; - } - - cJSON* ota_name_json = cJSON_GetObjectItem(root, "name"); - if ( ota_name_json != NULL && cJSON_IsString(ota_name_json)) { - uint32_t filenamelen=strlen(ota_name_json->valuestring)+1; - if (filenamelen > 0 && filenamelen < 255) - { - buffer_handle->file_recv_stat.file_name = malloc(filenamelen); - if (buffer_handle->file_recv_stat.file_name!=NULL) - memcpy_s(buffer_handle->file_recv_stat.file_name,filenamelen,ota_name_json->valuestring,filenamelen); - //下载完成再在 cancel download 里 free filename - }else{ - buffer_handle->file_recv_stat.file_name = NULL; - } - }else{ - buffer_handle->file_recv_stat.file_name = NULL; - } - - cJSON* ota_major_json = cJSON_GetObjectItem(root, "major"); - if(ota_major_json != NULL && cJSON_IsNumber(ota_major_json)) - { - buffer_handle->file_recv_stat.ota_major = ota_major_json->valueint; - } - cJSON* ota_mid_json = cJSON_GetObjectItem(root, "mid"); - if(ota_mid_json != NULL && cJSON_IsNumber(ota_mid_json)) - { - buffer_handle->file_recv_stat.ota_mid = ota_mid_json->valueint; - } - cJSON* ota_minor_json = cJSON_GetObjectItem(root, "minor"); - if(ota_minor_json != NULL && cJSON_IsNumber(ota_minor_json)) - { - buffer_handle->file_recv_stat.ota_minor = ota_minor_json->valueint; - } - cJSON* ota_isforced_json = cJSON_GetObjectItem(root, "isForced"); - if(ota_isforced_json != NULL && cJSON_IsNumber(ota_isforced_json)) - { - buffer_handle->file_recv_stat.ota_isforced = ota_isforced_json->valueint; - } - cJSON_Delete(root); - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP," ota_type= %d, ota_name=%s, ota_size=%d, ota_major=%d, ota_mid=%d, ota_minor=%d, ota_isforced=%d \n", - buffer_handle->file_recv_stat.file_type, - buffer_handle->file_recv_stat.file_name, - buffer_handle->file_recv_stat.file_size, - buffer_handle->file_recv_stat.ota_major, - buffer_handle->file_recv_stat.ota_mid, - buffer_handle->file_recv_stat.ota_minor, - buffer_handle->file_recv_stat.ota_isforced - ); - buffer_handle->file_recv_stat.received_size = 0; - buffer_handle->file_recv_stat.lrcvalue = 0; - buffer_handle->receive_file_flag = 1; - uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH); - //进入特殊UI - TRANSMIT_DATA=TRANS_OTA_TRANSMITTING; - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - - return ERRCODE_SUCC; - }else{ - buffer_handle->receive_file_flag = 0; - return ERRCODE_FAIL; - } -} - - -errcode_t decode_mp3_json(ble_read_data *buffer_handle) -{ - if (uapi_dev_runtime_get_train_status() == 1) { - return ERRCODE_FAIL; - } - - uint8_t *data = buffer_handle->data+sizeof(msg_header_t); - uint16_t datalen = buffer_handle->totalDataLen; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"MP3_file_save %s\n",data); - - cJSON* root = cJSON_Parse((const char *)data); - - if(root != NULL) - { - cJSON* ota_type_json = cJSON_GetObjectItem(root, "type"); - if(ota_type_json != NULL && cJSON_IsNumber(ota_type_json)) - { - buffer_handle->file_recv_stat.file_type = ota_type_json->valueint; - } - - cJSON* ota_name_json = cJSON_GetObjectItem(root, "name"); - if ( ota_name_json != NULL && cJSON_IsString(ota_name_json)) { - uint32_t filenamelen=strlen(ota_name_json->valuestring)+1; - - if (filenamelen > 0 && filenamelen < 255) - { - if(buffer_handle->file_recv_stat.file_name) - { - free(buffer_handle->file_recv_stat.file_name); - buffer_handle->file_recv_stat.file_name=NULL; - } - buffer_handle->file_recv_stat.file_name = malloc(filenamelen); - if (buffer_handle->file_recv_stat.file_name!=NULL) - { - memset_s(buffer_handle->file_recv_stat.file_name,filenamelen,0,filenamelen); - memcpy_s(buffer_handle->file_recv_stat.file_name,filenamelen,ota_name_json->valuestring,filenamelen); - } - - //下载完成再在 cancel download 里 free filename - }else{ - buffer_handle->file_recv_stat.file_name = NULL; - } - } - - cJSON* ota_size_json = cJSON_GetObjectItem(root, "size"); - if(ota_size_json != NULL && cJSON_IsNumber(ota_size_json)) - { - buffer_handle->file_recv_stat.file_size = ota_size_json->valueint; - } - cJSON_Delete(root); - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP," MP3_type= %d, MP3_name=%s, MP3_size=%d \n", - buffer_handle->file_recv_stat.file_type, - buffer_handle->file_recv_stat.file_name, - buffer_handle->file_recv_stat.file_size - ); - // buffer_handle->file_recv_stat.received_size = 0; - // buffer_handle->file_recv_stat.lrcvalue = 0; - // buffer_handle->receive_file_flag = 1; - // uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH); - // TRANSMIT_DATA=TRANS_MP3_TRANSMITTING; - // CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - if(IS_free_save_Mp3(ota_size_json->valueint)==false) - { - free(buffer_handle->file_recv_stat.file_name); - buffer_handle->file_recv_stat.file_name=NULL; - - TRANSMIT_DATA=TRANS_MP3_MAX_FAIL; - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - - return ERRCODE_FAIL; - } - else - { - buffer_handle->file_recv_stat.received_size = 0; - buffer_handle->file_recv_stat.lrcvalue = 0; - buffer_handle->receive_file_flag = 1; - uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH); - - return ERRCODE_SUCC; - } - - }else{ - buffer_handle->receive_file_flag = 0; - return ERRCODE_FAIL; - } -} - - -errcode_t decode_bin_json(ble_read_data *buffer_handle) -{ - if (uapi_dev_runtime_get_train_status() == 1) { - return ERRCODE_FAIL; - } - - uint8_t *data = buffer_handle->data+sizeof(msg_header_t); - uint16_t datalen = buffer_handle->totalDataLen; - // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"decode_bin_json %s\n",data); - - cJSON* root = cJSON_Parse((const char *)data); - - if(root != NULL) - { - cJSON* ota_type_json = cJSON_GetObjectItem(root, "type"); - if(ota_type_json != NULL && cJSON_IsNumber(ota_type_json)) - { - buffer_handle->file_recv_stat.file_type = ota_type_json->valueint; - } - - cJSON* ota_name_json = cJSON_GetObjectItem(root, "name"); - if ( ota_name_json != NULL && cJSON_IsString(ota_name_json)) { - uint32_t filenamelen=strlen(ota_name_json->valuestring)+1; - - if (filenamelen > 0 && filenamelen < 255) - { - if(buffer_handle->file_recv_stat.file_name) - { - free(buffer_handle->file_recv_stat.file_name); - buffer_handle->file_recv_stat.file_name=NULL; - } - buffer_handle->file_recv_stat.file_name = malloc(filenamelen); - if (buffer_handle->file_recv_stat.file_name!=NULL) - { - memset_s(buffer_handle->file_recv_stat.file_name,filenamelen,0,filenamelen); - memcpy_s(buffer_handle->file_recv_stat.file_name,filenamelen,ota_name_json->valuestring,filenamelen); - } - - //下载完成再在 cancel download 里 free filename - }else{ - buffer_handle->file_recv_stat.file_name = NULL; - } - } - - cJSON* ota_size_json = cJSON_GetObjectItem(root, "size"); - if(ota_size_json != NULL && cJSON_IsNumber(ota_size_json)) - { - buffer_handle->file_recv_stat.file_size = ota_size_json->valueint; - } - cJSON_Delete(root); - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP," bin type = %d, bin name =%s, bin size =%d \n", - buffer_handle->file_recv_stat.file_type, - buffer_handle->file_recv_stat.file_name, - buffer_handle->file_recv_stat.file_size - ); - // buffer_handle->file_recv_stat.received_size = 0; - // buffer_handle->file_recv_stat.lrcvalue = 0; - // buffer_handle->receive_file_flag = 1; - // uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH); - // TRANSMIT_DATA=TRANS_MP3_TRANSMITTING; - // CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - if(IS_free_save_Mp3(ota_size_json->valueint)==false) - { - free(buffer_handle->file_recv_stat.file_name); - buffer_handle->file_recv_stat.file_name=NULL; - - TRANSMIT_DATA=TRANS_MP3_MAX_FAIL; - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - - return ERRCODE_FAIL; - } - else - { - buffer_handle->file_recv_stat.received_size = 0; - buffer_handle->file_recv_stat.lrcvalue = 0; - buffer_handle->receive_file_flag = 1; - uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH); - - memset_s(app_name,64,0,64); - memcpy_s(app_name,64, buffer_handle->file_recv_stat.file_name,strlen(buffer_handle->file_recv_stat.file_name)); - - - return ERRCODE_SUCC; - } - - }else{ - buffer_handle->receive_file_flag = 0; - return ERRCODE_FAIL; - } -} -static uint16_t ble_dial_uid=0; - -errcode_t decode_dial_info(ble_read_data *buffer_handle) -{ - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"decode_dial_info \n"); - for(uint8_t i = 0;idata_len;i++) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%x ",buffer_handle->data[i]); - } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"\n"); - if (buffer_handle->data_len == 6) - { - - return ERRCODE_SUCC; - } - uint8_t *data = buffer_handle->data+sizeof(msg_header_t); - uint16_t datalen = buffer_handle->totalDataLen; - - msg_recv_dial_info_t dialinfo={0}; - msg_recv_dial_info_t *pdialinfo=(msg_recv_dial_info_t*)data; - - // dialinfo.dial_count = pdialinfo->dial_count; - dialinfo.dial_uid = pdialinfo->dial_uid; - if(dialinfo.dial_uid<=4) - { - - msg_recv_custom_dial_info_t *custom_dial_info=(msg_recv_custom_dial_info_t*)data; - custom_dial_info->dial_uid+=1; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"custom_dial_info %d %d %d %d", - custom_dial_info->dial_uid, - custom_dial_info->battery, - custom_dial_info->time, - custom_dial_info->time_font); - - ble_save_dial_custom(custom_dial_info); - ble_dial_file_count=*(data+sizeof(msg_recv_custom_dial_info_t)); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP," custom_dial file_count %d\r\n",ble_dial_file_count); - - } - else - { - dialinfo.file_name_len = pdialinfo->file_name_len; - // dialinfo.file_type = pdialinfo->file_type; - - if (dialinfo.file_name_len < 0 || dialinfo.file_name_len >255) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file name len should in [0,255] \n"); - return ERRCODE_FAIL; - } - - char * filename = malloc(dialinfo.file_name_len); - - ble_dial_file_count= data[sizeof(msg_recv_dial_info_t)+dialinfo.file_name_len]; - if (filename == NULL) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file name malloc failed filename_len %d\n",dialinfo.file_name_len); - return ERRCODE_FAIL; - } - memcpy_s(filename,dialinfo.file_name_len,data+sizeof(msg_recv_dial_info_t),dialinfo.file_name_len); - - buffer_handle->file_recv_stat.file_name = filename; - - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP," dial name = %s, dial file count = %d \n", - filename,ble_dial_file_count); - - free(filename); - buffer_handle->file_recv_stat.file_name=NULL; - } - - ble_dial_uid = dialinfo.dial_uid; - - buffer_handle->file_recv_stat.received_size = 0; - buffer_handle->file_recv_stat.lrcvalue = 0; - buffer_handle->receive_file_flag = 0; - - return ERRCODE_SUCC; - -} - -errcode_t decode_single_dial_info(ble_read_data *buffer_handle) -{ - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"decode_single_dial_info \n"); - for(uint8_t i = 0;idata_len;i++) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%x ",buffer_handle->data[i]); - } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"\n"); - if (buffer_handle->data_len == 6) - { - return ERRCODE_SUCC; - } - uint8_t *data = buffer_handle->data+sizeof(msg_header_t); - uint16_t datalen = buffer_handle->totalDataLen; - - msg_recv_single_dial_info_t dialinfo={0}; - msg_recv_single_dial_info_t *pdialinfo=(msg_recv_single_dial_info_t*)data; - - dialinfo.dial_count = pdialinfo->dial_count; - - ble_dial_file_index= dialinfo.dial_count; - - dialinfo.dial_uid = pdialinfo->dial_uid; - dialinfo.file_name_len = pdialinfo->file_name_len; - dialinfo.file_type = pdialinfo->file_type; - - if (dialinfo.file_name_len < 6 || dialinfo.file_name_len >255) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file name len should in [6,255] \n"); - return ERRCODE_FAIL; - } - - if (uapi_dev_runtime_get_train_status() == 1) { - return ERRCODE_FAIL; - } - - - char * filename = malloc(dialinfo.file_name_len+1); - //下载完成再在 cancel download 里 free filename - - uint32_t file_size = 0; - memcpy_s((void*)&file_size,sizeof(uint32_t),(void*)&data[sizeof(msg_recv_single_dial_info_t)+dialinfo.file_name_len],sizeof(uint32_t)); - if (filename == NULL) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file name malloc failed filename_len %d\n",dialinfo.file_name_len); - return ERRCODE_FAIL; - } - memcpy_s(filename,dialinfo.file_name_len,data+sizeof(msg_recv_single_dial_info_t),dialinfo.file_name_len); - filename[dialinfo.file_name_len] ='\0'; - //在runtime中备份一个安装文件名。 - uapi_dev_runtime_set_dialname(filename); - - if (check_dial_freespace(dialinfo.dial_uid, file_size) == false) - { - free(filename); - filename=NULL; - - TRANSMIT_DATA=TRANS_DIAL_MAX_FAIL; - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - return ERRCODE_FAIL; - } - - //存表盘id - ble_dial_uid = dialinfo.dial_uid; - // if(ble_dial_uid<=4) - // ble_dial_uid++; - - if(buffer_handle->file_recv_stat.file_name) - { - free(buffer_handle->file_recv_stat.file_name); - buffer_handle->file_recv_stat.file_name=NULL; - } - - buffer_handle->file_recv_stat.file_name = filename; - buffer_handle->file_recv_stat.file_size = file_size; - buffer_handle->file_recv_stat.file_type = 3;//表盘 - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP," filetype = %d, file_name=%s, file_size=%d , dial_uid %04X ,dial_count %d, dial_filetype %d\n", - buffer_handle->file_recv_stat.file_type, - buffer_handle->file_recv_stat.file_name, - buffer_handle->file_recv_stat.file_size, - dialinfo.dial_uid, - dialinfo.dial_count, - dialinfo.file_type - - ); - buffer_handle->file_recv_stat.received_size = 0; - buffer_handle->file_recv_stat.lrcvalue = 0; - buffer_handle->receive_file_flag = 1; - uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH); - - // TRANSMIT_DATA=TRANS_DIAL_TRANSMITTING; - // CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - return ERRCODE_SUCC; - - - - - - -} -static errcode_t install_dial(void) -{ - char *lzmapkgname = uapi_dev_runtime_get_dialname(); - // 增加初始参数校验打印 - if (lzmapkgname == NULL) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取到的表盘包名为空\n"); - return ERRCODE_FAIL; - } - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 开始安装表盘,包名:%s\n", lzmapkgname); - - // 检查是否为lzma格式包 - char *lzmaindex = strstr(lzmapkgname, ".lzma"); - if (lzmaindex == NULL) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:包名中未找到.lzma后缀,不是有效压缩包\n"); - return ERRCODE_FAIL; - } - - // 创建表盘目录(若不存在) - struct stat info; - if (stat(get_dial_path(), &info) != 0) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘目录不存在,尝试创建...\n"); - if (mkdir(get_dial_path(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:创建表盘目录失败\n"); - return ERRCODE_FAIL; - } - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘目录创建成功\n"); - } else { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘目录已存在,无需创建\n"); - } - - // 解析表盘基础名称(去除.lzma后缀) - char dial_basename[64] = {0}; - int dial_basenamelen = lzmaindex - lzmapkgname; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解析基础名称长度:%d\n", dial_basenamelen); - if (dial_basenamelen <= 0 || dial_basenamelen >= sizeof(dial_basename)) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:基础名称长度无效(%d),超出缓冲区大小\n", dial_basenamelen); - return ERRCODE_FAIL; - } - memcpy_s(dial_basename, sizeof(dial_basename), lzmapkgname, dial_basenamelen); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解析到表盘基础名称:%s\n", dial_basename); - - // 确定解压后bin文件路径 - char dialbin_filepath[128] = {0}; - if (ble_dial_uid > 5) { - if (get_dial_file_path(dial_basename, strlen(dial_basename), dialbin_filepath, sizeof(dialbin_filepath)) != ERRCODE_SUCC) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取常规表盘文件路径失败\n"); - return ERRCODE_FAIL; - } - } else { - if (get_custom_dial_file_path(ble_dial_uid, dial_basename, strlen(dial_basename), dialbin_filepath, sizeof(dialbin_filepath)) != ERRCODE_SUCC) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取自定义表盘文件路径失败\n"); - return ERRCODE_FAIL; - } - } - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压目标bin文件路径:%s\n", dialbin_filepath); - - // 确定源lzma文件路径 - char lzma_filepath[128] = {0}; - if (get_file_recv_file_path(lzmapkgname, strlen(lzmapkgname), lzma_filepath, sizeof(lzma_filepath)) != ERRCODE_SUCC) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取源lzma文件路径失败\n"); - return ERRCODE_FAIL; - } - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 源lzma文件路径:%s\n", lzma_filepath); - - // 执行解压操作 - errcode_t ret = uapi_dial_pkg_decompress(lzma_filepath, dialbin_filepath); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压操作完成,返回码:0x%X(%s)\n", ret, - (ret == ERRCODE_SUCC) ? "成功" : "失败"); - - // 关键:检查解压后bin文件是否存在及大小 - struct stat bin_info; - if (stat(dialbin_filepath, &bin_info) != 0) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:解压后bin文件不存在或无法访问(路径:%s)\n", dialbin_filepath); - ret = ERRCODE_FAIL; // 即使解压返回成功,文件不存在也视为失败 - } else { - if (bin_info.st_size <= 0) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:解压后bin文件大小为空(%ld字节),无效文件\n", bin_info.st_size); - ret = ERRCODE_FAIL; // 大小为空视为失败 - } else { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压后bin文件大小正常:%ld字节\n", bin_info.st_size); - } - } - - // 若解压失败,直接返回 - if (ret != ERRCODE_SUCC) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压失败,终止安装流程\n"); - return ret; - } - - // 注册并设置表盘 - char *namebuf = strtok(lzmapkgname, "."); - if (ble_dial_uid > 5) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 注册常规表盘:%s(ID:%d)\n", namebuf, ble_dial_uid); - install_Register_dial(namebuf, ble_dial_uid); - ble_set_dial_by_id(ble_dial_uid); - } else { - if (ble_dial_file_index == ble_dial_file_count) { - char name_str[32] = {0}; - ble_get_custom_dial(ble_dial_uid, name_str); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 自定义表盘安装完毕,注册:%s(ID:%d)\n", name_str, ble_dial_uid); - install_Register_dial(name_str, ble_dial_uid); - ble_set_dial_by_id(ble_dial_uid); - } else { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 自定义表盘未达安装条件(当前索引:%d,总数:%d)\n", - ble_dial_file_index, ble_dial_file_count); - } - } - - // 删除源lzma文件 - #if 1 - if (remove(lzma_filepath) != 0) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 警告:删除源lzma文件失败(路径:%s),可能残留冗余文件\n", lzma_filepath); - // 此处不返回失败,仅警告,因为核心安装已完成 - } else { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 源lzma文件已成功删除\n"); - } - #endif - - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘安装流程全部完成,返回成功\n"); - return ERRCODE_SUCC; -} -static char file_name[128]={0}; -static uint32_t file_size=0; - -bool Read_tar_file_buf_send_Data(uint16_t pack_size,uint8_t id) -{ - - char *data= (char *)malloc(pack_size+1); - uint16_t read_size=0; - FILE *fp=fopen(file_name,"rb+"); - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Read_tar_file_buf_send_Data size %d\r\n",file_size); - - uint32_t pack=file_size/pack_size+1; - uint32_t pack_id=1; - if(fp==NULL) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"fopen fail %s\r\n",file_name); - free(data); - return false; - } - - do - { - memset_s(data,pack_size+1,0,pack_size+1); - read_size=fread(data,1,pack_size,fp); - if(read_size!=0) - { - ble_data_type type_={0x05,id,file_size,pack,pack_id}; - send_big_data(type_,(char *)data,read_size); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"Read_tar_file_buf_send_Data size %d\r\n",read_size); - } - - - //send_big_data(1,data,read_size,file_size,pack_id,pack,id,5); - pack_id++; - - } while (read_size==pack_size); - free(data); - fclose(fp); - sendbigDataBufState = false; - return true; -} - - -void delete_app(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t crcvalue) -{ - - if(Check_CRC(data,len,crcvalue)) - { - if(ble_app_delete(data)) - { - ble_reply_cmd(cmd,1); - } - else - { - ble_reply_cmd(cmd,2); - } - - } - else - { - ble_reply_cmd(cmd,0); - } - -} - -void get_app_list(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t crcvalue) -{ - - if(Check_CRC(data,len,crcvalue)) - { - cJSON *jdata=ble_app_list(); - - if(jdata) - { - - char *jsonString = cJSON_PrintUnformatted(jdata); - - if (jsonString == NULL) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error printing JSON to string\n"); - cJSON_Delete(jdata); - return; - } - - uint32_t data_len = strlen(jsonString); - cJSON_Delete(jdata); - - if (data_len == 0) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error: JSON string length is 0\n"); - return; - } - int num=(ble_nus_max_data_len-18); - if(num>482)num=482; - - send_long_data(jsonString,num,0x06,0x0E); - - cJSON_free(jsonString); - } - - - } - else - { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"CRC ERROR!"); - ble_reply_cmd(cmd,0); - } - -} - -void get_watch_msg(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t crcvalue) -{ - - if(Check_CRC(data,len,crcvalue)) - { - cJSON *jdata=ble_get_watch_msg(); - - if(jdata) - { - - char *jsonString = cJSON_PrintUnformatted(jdata); - - if (jsonString == NULL) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error printing JSON to string\n"); - cJSON_Delete(jdata); - return; - } - - uint32_t data_len = strlen(jsonString); - cJSON_Delete(jdata); - - if (data_len == 0) { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error: JSON string length is 0\n"); - return; - } - int num=(ble_nus_max_data_len-18); - if(num>482)num=482; - - send_long_data(jsonString,num,0x06,0x0F); - - cJSON_free(jsonString); - } - - - } - else - { - ble_reply_cmd(cmd,0); - } - -} - - -bool read_dir_send_json() -{ - - char *send_buf=NULL; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"read_dir_send_json xxxxxxxx\r\n"); - memset_s(file_name,128,0,128); - send_buf=tar_dir_to_json_buf_malloc_(file_name,&file_size); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"read_dir_send_json end\r\n"); - if( send_buf!=NULL) - { - //send_big_data(1,send_buf,strlen(send_buf),strlen(send_buf),1,1,0x26,0x04); - - ble_data_type type_={0x04,0x26,strlen(send_buf),1,1}; - - send_big_data(type_,(char *)send_buf,strlen(send_buf)); - - free(send_buf); - return true; - } - else - { - return false; - } -} - -void decode_file_checksum_2AE6(ble_read_data *buffer_handle) -{ - uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_SLOW); - - uint8_t msg_crc = get_crc_from_lrc(buffer_handle->lrcvalue); - if ((msg_crc == buffer_handle->crcvalue) - || (buffer_handle->cmd_header.direction == MSG_DIRECTION_RECV_ANDROID )) - { - uint8_t file_crc = get_crc_from_lrc(buffer_handle->file_recv_stat.lrcvalue); - uint8_t crc_recv = buffer_handle->data[sizeof(msg_header_t)]; -#if 1 - if ((file_crc == crc_recv) || - (buffer_handle->cmd_header.direction == MSG_DIRECTION_RECV_ANDROID)) -#else - if (file_crc == crc_recv) -#endif - { - ble_reply_cmd(FILE_CHECKSUM_RECV_CMD_ZHIHUI,1); - switch(buffer_handle->file_recv_stat.file_type) - { - case 1: //ota - ble_reply_cmd(FILE_SUCC_TRANSFER,1); - do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_STARTOTA,NULL,0); - TRANSMIT_DATA=TRANS_OTA_SUCC; - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - - break; - case 2://mp3 - TRANSMIT_DATA=TRANS_MP3_SUCC; - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - - ble_reply_cmd(FILE_SUCC_TRANSFER,1); - ble_mp3_list_update(); - - break; - case 3://dial - //TODO: 设置成当前下载的表盘 - if (install_dial() == ERRCODE_SUCC) - { - //ble_set_dial_by_id(ble_dial_uid); - - if(ble_dial_uid>5 || ble_dial_file_index==ble_dial_file_count) - { - TRANSMIT_DATA= TRANS_DIAL_SUCC; - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - //0504 - ble_reply_cmd(DIAL_SUCC_INSTALL,1); - } - - - - // ble_reply_cmd(GET_TRANS_END_CMD,1); - - } - else - { - TRANSMIT_DATA= TRANS_DIAL_FAIL; - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - - ble_reply_cmd(DIAL_SUCC_INSTALL,0); - - } - break; - case 4://dial - TRANSMIT_DATA=TRANS_BIN_SUCC; - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - if( ble_bin_install(app_name)) - ble_reply_cmd(FILE_SUCC_TRANSFER,1); - else - ble_reply_cmd(FILE_SUCC_TRANSFER,0); - - // ble_mp3_list_update(); - - break; - default: - break; - } - }else{ - ble_reply_cmd(FILE_CHECKSUM_RECV_CMD_ZHIHUI,2); - switch (buffer_handle->file_recv_stat.file_type) - { - case 1: //ota - TRANSMIT_DATA=TRANS_OTA_FAIL; - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - break; - case 2://mp3 - TRANSMIT_DATA=TRANS_MP3_FAIL; - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - - break; - case 3://dial - TRANSMIT_DATA= TRANS_DIAL_FAIL; - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - break; - - case 4://dial - TRANSMIT_DATA= TRANS_BIN_FAIL; - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - - break; - default: - break; - } - - } - }else{ - ble_reply_cmd(FILE_CHECKSUM_RECV_CMD_ZHIHUI,0); - switch (buffer_handle->file_recv_stat.file_type) - { - case 1: //ota - TRANSMIT_DATA=TRANS_OTA_FAIL; - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - break; - case 2://mp3 - TRANSMIT_DATA=TRANS_MP3_FAIL; - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - - break; - case 3://dial - TRANSMIT_DATA= TRANS_DIAL_FAIL; - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - break; - case 4://dial - TRANSMIT_DATA= TRANS_BIN_FAIL; - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - break; - default: - break; - } - } - buffer_handle->file_recv_stat.recv_file_stat=0; -} - -void decode_file_checksum(ble_read_data *buffer_handle) -{ - uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_SLOW); - - uint8_t msg_crc = get_crc_from_lrc(buffer_handle->lrcvalue); - if ((msg_crc == buffer_handle->crcvalue) - || (buffer_handle->cmd_header.direction == MSG_DIRECTION_RECV_ANDROID )) - { - uint8_t file_crc = get_crc_from_lrc(buffer_handle->file_recv_stat.lrcvalue); - uint8_t crc_recv = buffer_handle->data[sizeof(msg_header_t)]; -#if 1 - if ((file_crc == crc_recv) || - (buffer_handle->cmd_header.direction == MSG_DIRECTION_RECV_ANDROID)) -#else - if (file_crc == crc_recv) -#endif - { - ble_reply_cmd(FILE_CHECKSUM_RECV_CMD,1); - switch(buffer_handle->file_recv_stat.file_type) - { - case 1: //ota - do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_STARTOTA,NULL,0); - - TRANSMIT_DATA=TRANS_OTA_SUCC; - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - - - break; - case 2://mp3 - TRANSMIT_DATA=TRANS_MP3_SUCC; - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - - ble_reply_cmd(DIAL_INSTALL_REPY_CMD,1); - ble_mp3_list_update(); - - break; - case 3://dial - //TODO: 设置成当前下载的表盘 - if (install_dial() == ERRCODE_SUCC) - { - //ble_set_dial_by_id(ble_dial_uid); - - if(ble_dial_uid>5 || ble_dial_file_index==ble_dial_file_count) - { - TRANSMIT_DATA= TRANS_DIAL_SUCC; - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - //0504 - ble_reply_cmd(DIAL_INSTALL_REPY_CMD,1); - } - - - - // ble_reply_cmd(GET_TRANS_END_CMD,1); - - } - else - { - TRANSMIT_DATA= TRANS_DIAL_FAIL; - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - - ble_reply_cmd(DIAL_INSTALL_REPY_CMD,0); - - } - break; - default: - break; - } - }else{ - ble_reply_cmd(FILE_CHECKSUM_RECV_CMD,2); - switch (buffer_handle->file_recv_stat.file_type) - { - case 1: //ota - TRANSMIT_DATA=TRANS_OTA_FAIL; - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - break; - case 2://mp3 - TRANSMIT_DATA=TRANS_MP3_FAIL; - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - - break; - case 3://dial - TRANSMIT_DATA= TRANS_DIAL_FAIL; - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - - break; - default: - break; - } - - } - }else{ - ble_reply_cmd(FILE_CHECKSUM_RECV_CMD,0); - switch (buffer_handle->file_recv_stat.file_type) - { - case 1: //ota - TRANSMIT_DATA=TRANS_OTA_FAIL; - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - break; - case 2://mp3 - TRANSMIT_DATA=TRANS_MP3_FAIL; - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - - break; - case 3://dial - TRANSMIT_DATA= TRANS_DIAL_FAIL; - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - break; - default: - break; - } - } - buffer_handle->file_recv_stat.recv_file_stat=0; - -} - -void type2AE0Data(ble_read_data *buffer_handle) -{ - uint16_t typeID = buffer_handle->cmd_header.cmdtype*256 + buffer_handle->cmd_header.cmdid; - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"type2AE0Data typeID:0x%04X datalen %d\r\n",typeID,buffer_handle->totalDataLen); - - bool checkcrc = (get_crc_from_lrc(buffer_handle->lrcvalue) == buffer_handle->crcvalue); - - uint32_t num; - if ( (checkcrc == true ) || - (buffer_handle->cmd_header.direction == MSG_DIRECTION_RECV_ANDROID)) - { - switch (typeID) //ID - { - case OTA_FILE_RECV_CMD:// - { - if (decode_ota_json( buffer_handle) == ERRCODE_SUCC) - { - ble_reply_cmd(OTA_FILE_RECV_CMD,1); - }else{ - ble_reply_cmd(OTA_FILE_RECV_CMD,2); - } - } - break; - case MP3_FILE_RECV_CMD: - { - if (decode_mp3_json( buffer_handle) == ERRCODE_SUCC) - { - ble_reply_cmd(MP3_FILE_RECV_CMD,1); - }else{ - ble_reply_cmd(MP3_FILE_RECV_CMD,2); - } - } - break; - case DIAL_FILE_RECV_CMD: - { - if (decode_dial_info( buffer_handle) == ERRCODE_SUCC) - { - - //if(ble_dial_uid >=5 && - // if(get_dial_num()>=MAX_BLE_EVENT_DIAL_NUM) - // { - // ble_reply_cmd(DIAL_FILE_RECV_CMD,3); - - // } - //else - { - - ble_reply_cmd(DIAL_FILE_RECV_CMD,1); - } - - }else{ - ble_reply_cmd(DIAL_FILE_RECV_CMD,2); - } - } - break; - case FILE_CHECKSUM_RECV_CMD: - decode_file_checksum(buffer_handle); - break; - case SINGLE_DIAL_FILE_RECV_CMD: - if (decode_single_dial_info(buffer_handle) == ERRCODE_SUCC) - { - ble_reply_cmd(SINGLE_DIAL_FILE_RECV_CMD,1); - } else { - ble_reply_cmd(SINGLE_DIAL_FILE_RECV_CMD,2); - } - break; - case EPO_DATA_RECV_CMD: - break; - case APP_INAUIRE_EXC_FILE_CMD: - get_tar_dir_file_count(); - - if(!read_dir_send_json()) - { - ble_reply_cmd(APP_INAUIRE_EXC_FILE_CMD,2); - } - break; - - case APP_START_SEND_EXC_FILE_CMD: - num=(ble_nus_max_data_len-18); - if(num>482)num=482; - if(!Read_tar_file_buf_send_Data(num,0x63)) - { - ble_reply_cmd(APP_START_SEND_EXC_FILE_CMD,2); - } - break; - case APP_SEND_EXC_FILE_END_CMD: - if(!tar_rmove(file_name)) - { - ble_reply_cmd(APP_SEND_EXC_FILE_END_CMD,2); - } - if(!read_dir_send_json()) - { - ble_reply_cmd(APP_SEND_EXC_FILE_END_CMD,2); - } - break; - - - default: - break; - } - - }else{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"type2AE0Data CRC failed!\n"); - } - -} -// -void type2AE6Data(ble_read_data *buffer_handle,uint8_t *cmd_buf ,uint8_t *data,uint16_t datalen,uint8_t *totaldata,uint8_t crcvalue) -{ - uint16_t cmd = cmd_buf[1]*256+cmd_buf[2]; - #ifdef BLE_LOG - - #endif - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"type2AE6Data:0x%04X\r\n",cmd); - // uint8_t typeID = cmd_buf[2]; - switch (cmd) - { - case OTA_FILE_MSG_CMD : - { - if (decode_ota_json( buffer_handle) == ERRCODE_SUCC) - { - ble_reply_cmd(OTA_FILE_MSG_CMD,1); - }else{ - ble_reply_cmd(OTA_FILE_MSG_CMD,2); - } - } - break; - - case OTA_FILE_RECV_CMD:// - { - if (decode_ota_json( buffer_handle) == ERRCODE_SUCC) - { - ble_reply_cmd(OTA_FILE_RECV_CMD,1); - }else{ - ble_reply_cmd(OTA_FILE_RECV_CMD,2); - } - } - break; - - - case DIAL_COLLECT_FILE_CMD : - { - if (decode_dial_info( buffer_handle) == ERRCODE_SUCC) - { - ble_reply_cmd(DIAL_COLLECT_FILE_CMD,1); - }else{ - ble_reply_cmd(DIAL_COLLECT_FILE_CMD,2); - } - break; - } - - case DIAL_SINGEL_FILE_CMD : - { - if (decode_single_dial_info(buffer_handle) == ERRCODE_SUCC) - { - ble_reply_cmd(DIAL_SINGEL_FILE_CMD,1); - - } else { - - ble_reply_cmd(DIAL_SINGEL_FILE_CMD,2); - - } - break; - } - case MP3_FILE_CMD : - { - if (decode_mp3_json( buffer_handle) == ERRCODE_SUCC) - { - ble_reply_cmd(MP3_FILE_CMD,1); - }else{ - ble_reply_cmd(MP3_FILE_CMD,2); - } - } - break; - case BIN_FILE_CMD : - { - if (decode_bin_json( buffer_handle) == ERRCODE_SUCC) - { - ble_reply_cmd(BIN_FILE_CMD,1); - }else{ - ble_reply_cmd(BIN_FILE_CMD,2); - } - } - break; - - - case FILE_CHECKSUM_RECV_CMD: - decode_file_checksum(buffer_handle); - break; - // case OTA_FILE_DATA_CMD : - // { - // if (decode_ota_data( buffer_handle,data,datalen, crcvalue) == ERRCODE_SUCC) - // { - - // }else{ - // ble_reply_cmd(OTA_FILE_DATA_CMD,0); - // } - // } - - case FILE_CHECKSUM_RECV_CMD_ZHIHUI : - decode_file_checksum_2AE6(buffer_handle); - break; - - case OTA_FILE_FAIL_CMD : - - break; - - case APP_DELETE_CMD : - delete_app( cmd, data,datalen,crcvalue); - break; - case GET_LIST_CMD : - - get_app_list( cmd, data,datalen,crcvalue); - - break; - case GET_APP_MSG_CMD: - get_watch_msg( cmd, data,datalen,crcvalue); - - break; - default: - break; - } -} - - - - -void dumpHeader(msg_header_t *msgheader) -{ - #ifdef BLE_LOG - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"dumpHeader(%d) direction %02X, type %02X, id %02X, package_count %d, total_data_len %d,package_index %d , package_len %d\n", - sizeof(msg_header_t), - msgheader->direction, - msgheader->cmdtype, - msgheader->cmdid, - msgheader->package_count, - msgheader->total_data_len, - msgheader->package_index, - msgheader->package_len - ); - #endif -} - -errcode_t check_header(msg_header_t *header ) -{ - if( (header->direction == MSG_DIRECTION_RECV || header->direction == MSG_DIRECTION_RECV_ANDROID) - && (header->cmdtype > 0 && header->cmdtype <= 6 ) - && (header->cmdid > 0 && header->cmdid <= 0x50 ) - ) - { - // 这个是合理的值,可以当做header来处理 - dumpHeader(header); - return ERRCODE_SUCC; - }else{ - //非header - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"not first package , no header!\n"); - return ERRCODE_FAIL; - } -} - - -errcode_t cancel_recv_file(uint8_t flag) -{ - if(BR_TRANSFER_timer) - { - timer_flie_flag=0; - osTimerStop(BR_TRANSFER_timer); - osTimerDelete(BR_TRANSFER_timer); - BR_TRANSFER_timer = NULL; - } - - if(ble_read_timer_p) - { - if(flag) - { - if(ble_read_timer_p->file_recv_stat.file_type==1) - { - TRANSMIT_DATA=TRANS_OTA_FAIL; - } - else if (ble_read_timer_p->file_recv_stat.file_type==3) - { - TRANSMIT_DATA=TRANS_DIAL_FAIL; - } - else if(ble_read_timer_p->file_recv_stat.file_type==2) - { - TRANSMIT_DATA=TRANS_MP3_FAIL; - } - else if(ble_read_timer_p->file_recv_stat.file_type==4) - { - TRANSMIT_DATA=TRANS_BIN_FAIL; - } - - else - { - TRANSMIT_DATA=TRANS_FREE; - } - ble_reply_cmd(FILE_RECV_REPLY_STAT_CMD,0);//接收失败 - } - else - { - TRANSMIT_DATA=TRANS_FREE; - } - - ble_read_timer_p->receive_file_flag = 0; - - if (ble_read_timer_p->file_recv_stat.recv_file_stat != 2) //已经下载完毕的文件,没有必要cancel了。 - { - if (ble_read_timer_p->file_recv_stat.file!=NULL) - { - fclose(ble_read_timer_p->file_recv_stat.file); - ble_read_timer_p->file_recv_stat.file = NULL; - } - - if (ble_read_timer_p->file_recv_stat.file_type == 2) - { - char musicpath[64]={0}; - get_music_path(musicpath,64); - //"/user/userdata/music" - char filepath[256]={0}; - create_mp3_name(filepath,musicpath,ble_read_timer_p->file_recv_stat.file_name); - remove(filepath); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"filepath %s\r\n",filepath); - } - else if (ble_read_timer_p->file_recv_stat.file_type == 3) - { - char filepath[128]={0}; - if (get_file_recv_file_path(ble_read_timer_p->file_recv_stat.file_name,strlen(ble_read_timer_p->file_recv_stat.file_name),filepath,sizeof(filepath)) == ERRCODE_SUCC) - { - remove(filepath); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"filepath %s\r\n",filepath); - } - } - - if (ble_read_timer_p->file_recv_stat.file_name != NULL) - { - free(ble_read_timer_p->file_recv_stat.file_name); - ble_read_timer_p->file_recv_stat.file_name=NULL; - } - ble_read_timer_p->file_recv_stat.recv_file_stat = -1; - //ble_read_timer_p=NULL; - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - } - // else - // { - // CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - // } - ble_read_timer_p=NULL; - - } - - - - return ERRCODE_SUCC; -} - -uint8_t get_OTA_recv_value() -{ - return OTA_FILE_value; -} - -void Set_OTA_recv_value() -{ - OTA_FILE_value=0; - return; -} - -static errcode_t save_package_sample(ble_read_data *buffer_handle,uint8_t *data, uint16_t event_size) -{ - - //保存前 4 bytes + 最后 1 byte - int save_len = 4; - uint8_t last_byte = calculate_lrc(data,event_size,0x00); - if (event_size < 4) - { - save_len = event_size; - } - memset(buffer_handle->last_data_sample,0,sizeof(buffer_handle->last_data_sample)); - buffer_handle->last_data_size = event_size; - memcpy_s(buffer_handle->last_data_sample,sizeof(buffer_handle->last_data_sample),data,save_len); - buffer_handle->last_data_sample[4]=last_byte; - - return ERRCODE_SUCC; -} -static errcode_t check_package_same(uint8_t* lastdata,uint8_t *newdata , uint16_t cmp_size) -{ - - - //对比前 4 bytes + 最后 1 byte - int save_len = 4; - uint8_t current_sample_data[5]; - uint8_t last_byte = calculate_lrc(newdata,cmp_size,0x00); - if (cmp_size < 4) - { - save_len = cmp_size; - } - memset(current_sample_data,0,sizeof(current_sample_data)); - memcpy_s(current_sample_data,sizeof(current_sample_data),newdata,save_len); - current_sample_data[4]=last_byte; - - if (memcmp(lastdata,newdata,5)==0) - { - return ERRCODE_SUCC; - }else{ - return ERRCODE_FAIL; - } -} - -errcode_t handle_recv_file(ble_read_data *buffer_handle,uint8_t *data, uint16_t event_size) -{ - - if( event_size == 0 || data == NULL ) return ERRCODE_FAIL; - - if (buffer_handle->last_data_size == event_size) - { - if (check_package_same(buffer_handle->last_data_sample,data,event_size) == ERRCODE_SUCC) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error handle_recv_file recve same package header 0x%02X%02X%02X%02X end 0x%02X skip \n" - ,buffer_handle->last_data_sample[0] - ,buffer_handle->last_data_sample[1] - ,buffer_handle->last_data_sample[2] - ,buffer_handle->last_data_sample[3] - ,buffer_handle->last_data_sample[4]); - // return ERRCODE_FAIL; - } - } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file %d\n",event_size); - save_package_sample(buffer_handle,data,event_size); - - - //第一帧要创建文件 - if((buffer_handle->file_recv_stat.recv_file_stat <= 0) && buffer_handle->file_recv_stat.file == NULL ) - { - buffer_handle->file_recv_stat.lrcvalue = 0; - if (buffer_handle->file_recv_stat.file_type == 1) - { - - buffer_handle->file_recv_stat.file = fopen(UP_DATE_FWPKG_PATH,"w+"); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",UP_DATE_FWPKG_PATH,buffer_handle->file_recv_stat.file); - - } - else if (buffer_handle->file_recv_stat.file_type == 2) - { - char musicpath[64]={0}; - get_music_path(musicpath,64); - //"/user/userdata/music" - char filepath[256]={0}; - create_mp3_name(filepath,musicpath,buffer_handle->file_recv_stat.file_name); - - buffer_handle->file_recv_stat.file = fopen(filepath,"w+"); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"filepath %s\r\n",filepath); - } - else - { - char filepath[128]={0}; - 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) - { - buffer_handle->file_recv_stat.file = fopen(filepath,"w+"); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",filepath,buffer_handle->file_recv_stat.file); - }else{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s error %X\n",buffer_handle->file_recv_stat.file_name,buffer_handle->file_recv_stat.file); - } - } - if (buffer_handle->file_recv_stat.file == NULL) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"6185 buffer_handle->file_recv_stat.file NULL\n"); - return ERRCODE_FAIL; - } - buffer_handle->file_recv_stat.recv_file_stat = 1; - OTA_FILE_value=0; - ////////////////创建文件传输超时定时器////////////////// - uint32_t tick; - osStatus_t retTimer; - if(BR_TRANSFER_timer!=NULL) - { - osTimerDelete(BR_TRANSFER_timer); - BR_TRANSFER_timer = NULL; - } - ble_read_timer_p=buffer_handle; - timer_flie_flag=10; - - BR_TRANSFER_timer = osTimerNew((osTimerFunc_t)ble_transfer_Timer_CallBack, osTimerPeriodic, NULL, NULL); - tick =1000;// osMs2Tick(1000); - retTimer = osTimerStart(BR_TRANSFER_timer, tick); - if (retTimer != osOK && BR_TRANSFER_timer != NULL) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"StartCallTimer osTimerStart failed, ret = %lx!!", retTimer); - osTimerDelete(BR_TRANSFER_timer); - BR_TRANSFER_timer = NULL; - return ERRCODE_FAIL; - } - // if(buffer_handle->file_recv_stat.received_size==0) - { - if(buffer_handle->file_recv_stat.file_type==3) - TRANSMIT_DATA=TRANS_DIAL_TRANSMITTING; - - if(buffer_handle->file_recv_stat.file_type==1) - TRANSMIT_DATA=TRANS_OTA_TRANSMITTING; - - if(buffer_handle->file_recv_stat.file_type==2) - TRANSMIT_DATA=TRANS_MP3_TRANSMITTING; - - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - } - - /////////////////////////////////////////////////////////// - } - if (buffer_handle->file_recv_stat.file == NULL) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"6194 buffer_handle->file_recv_stat.file \n"); - return ERRCODE_FAIL; - } - //写入文件 - size_t writtensize = fwrite(data,1,event_size,buffer_handle->file_recv_stat.file); - if(writtensize == event_size) - { - timer_flie_flag=10; - - buffer_handle->file_recv_stat.lrcvalue = calculate_lrc(data,event_size,buffer_handle->file_recv_stat.lrcvalue); - buffer_handle->file_recv_stat.received_size += event_size; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file received_size %d\n",buffer_handle->file_recv_stat.received_size); - OTA_FILE_value= ((float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size) *100; - - - }else{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file write file failed! ret %d != %d\n",writtensize,event_size); - return ERRCODE_FAIL; - } - - //检查文件是否写完 - if(buffer_handle->file_recv_stat.file_size == buffer_handle->file_recv_stat.received_size) - { - if (buffer_handle->file_recv_stat.file!=NULL) - { - fclose(buffer_handle->file_recv_stat.file); - buffer_handle->file_recv_stat.file = NULL; - } - if (buffer_handle->file_recv_stat.file_name != NULL) - { - free(buffer_handle->file_recv_stat.file_name); - buffer_handle->file_recv_stat.file_name=NULL; - } - buffer_handle->file_recv_stat.recv_file_stat = 2; - buffer_handle->receive_file_flag = 0; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file received success \n"); - - if(BR_TRANSFER_timer) - { - osTimerStop(BR_TRANSFER_timer); - osTimerDelete(BR_TRANSFER_timer); - BR_TRANSFER_timer = NULL; - } - ble_read_timer_p=NULL; - TRANSMIT_DATA=FILE_IS_DONE; - - CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); - - ble_reply_cmd(FILE_RECV_REPLY_STAT_CMD,1);//接收成功 - } - - return ERRCODE_SUCC; -} - -//长数据解析 -void bleLongRecvData(ble_read_data *buffer_handle,uint8_t *data, uint16_t data_size,uint8_t *buf_cmd,uint8_t *totalData,uint8_t crcvalue)//buf_cmd 指令前17个字节数据 -{ - uint8_t type=buf_cmd[1]; - #ifdef BLE_LOG - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"type:%d %d data_size:%d data:%x crcvalue:%x\r\n", - buffer_handle->cmd_header.cmdtype, - buffer_handle->cmd_header.cmdid, - data_size, - data, - crcvalue); - #endif - - if(buffer_handle->handle==data2ae4Cmd) - { - type2AE4Data(buffer_handle,buf_cmd,data,data_size,totalData,crcvalue); - } - else if (buffer_handle->handle==data2ae3Cmd) - { - type2AE3Data(buffer_handle,buf_cmd,data,data_size,totalData,crcvalue); - } - else if (buffer_handle->handle==data2ae1Cmd) - { - type2AE1Data(buf_cmd,data,data_size,totalData,crcvalue); - } - else if (buffer_handle->handle==data2ae0Cmd) - { - type2AE0Data(buffer_handle); - } - else if (buffer_handle->handle==data2ae6Cmd) - { - type2AE6Data(buffer_handle,buf_cmd,data,data_size,totalData,crcvalue); - } -} - - -/// @brief 解码收到的msg -/// @param buffer_handle -/// @return -static errcode_t handle_ble_msg(ble_read_data *buffer_handle) -{ - - if(buffer_handle->buffer_to_file == 0) - { - bleLongRecvData(buffer_handle,buffer_handle->data+sizeof(msg_header_t),buffer_handle->totalDataLen,(uint8_t*)(&buffer_handle->cmd_header),buffer_handle->data,buffer_handle->crcvalue); - - }else{ - //处理缓存成文件的 - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle ble msg file buffer! not implement\n"); - } - return ERRCODE_SUCC; -} -/***** - * 组包函数 - * 组包校验完成,在分发给对应的handler去解码协议。 - * -*/ -errcode_t combine_data_internal(ble_read_data *buffer_handle,uint8_t *totalData, uint16_t event_size) -{ - - - if(buffer_handle->receive_file_flag == 1 ) - { - //接收文件 - if(buffer_handle->handle==data2ae6Cmd) - return decode_ota_data( buffer_handle,totalData,event_size,totalData[event_size-1]); - else - return handle_recv_file(buffer_handle,totalData,event_size); - } - - msg_header_t *header = (msg_header_t*)totalData; - //第一帧 - if (event_size > sizeof(msg_header_t) && check_header(header) == ERRCODE_SUCC ) - { - - if (header->direction == MSG_DIRECTION_RECV_ANDROID) - { - //uapi_dev_runtime_set_android_connection_status(1); - }else{ - // uapi_dev_runtime_set_android_connection_status(0); - } - buffer_handle->cmd_header.direction = header->direction; - buffer_handle->cmd_header.cmdtype = header->cmdtype; - buffer_handle->cmd_header.cmdid = header->cmdid; - buffer_handle->cmd_header.package_count = header->package_count; - buffer_handle->cmd_header.total_data_len = header->total_data_len; - buffer_handle->cmd_header.package_len = header->package_len; - buffer_handle->cmd_header.package_index = header->package_index; - //如果有历史数据,没有被清空,可能是历史错误数据,则清空内存。 - if (buffer_handle->data!=NULL && buffer_handle->data_len > 0) - { - free(buffer_handle->data); - buffer_handle->data = NULL; - } - if (buffer_handle->tmpfilehandle!=NULL && buffer_handle->data_len>0) - { - fclose(buffer_handle->tmpfilehandle); - buffer_handle->tmpfilehandle = NULL; - } - buffer_handle->data_len = 0; - buffer_handle->crcvalue = 0; - buffer_handle->lrcvalue = 0; - buffer_handle->buffer_to_file = 0; - buffer_handle->decode_type = 0; - buffer_handle->tmpfilehandle = NULL; - uint32_t timestamp_ble=0; - uapi_get_timestampe_ss(×tamp_ble); - buffer_handle->last_timestamp = timestamp_ble; - buffer_handle->totalDataLen = buffer_handle->cmd_header.total_data_len; - if (buffer_handle->totalDataLen > MAX_BLE_MSG_PACKAGE_LEN || buffer_handle->totalDataLen < 0 ) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"package is too lardge (%d) than (%d) or too small !\n",buffer_handle->totalDataLen,MAX_BLE_MSG_PACKAGE_LEN); - return ERRCODE_FAIL; - } - if(buffer_handle->totalDataLen+sizeof(msg_header_t)+1 > MAX_BLE_MSG_PACKAGE_LEN) - { - //如果总长度超过限定大小,则写入文件做缓存。 - buffer_handle->buffer_to_file = 1; - int filelen = strlen(BLE_MSG_TMP_FILE_NAME); - buffer_handle->data = malloc(filelen); - if (buffer_handle->data== NULL) - { - return ERRCODE_MALLOC; - } - //生成临时文件名 - sprintf_s((char*)buffer_handle->data,filelen,BLE_MSG_TMP_FILE_NAME,buffer_handle->handle); - buffer_handle->tmpfilehandle = fopen((const char*)buffer_handle->data,"w+"); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create ble protocol tmpfile %s handle %X\n",buffer_handle->data,buffer_handle->tmpfilehandle); - if (buffer_handle->tmpfilehandle != NULL) - { - //写buffer到文件 - size_t ret =fwrite(totalData,1,event_size,buffer_handle->tmpfilehandle); - buffer_handle->lrcvalue = calculate_lrc(totalData+sizeof(msg_header_t),header->package_len,0x00); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"write %d to buffer file!\n",ret); - } - buffer_handle->data_len += event_size; - - }else{ - //如果长度在限定大小之内。则写入内存中缓存。 - buffer_handle->buffer_to_file = 0; - buffer_handle->data = malloc(buffer_handle->totalDataLen+sizeof(msg_header_t)+1); - if (buffer_handle->data== NULL) - { - return ERRCODE_MALLOC; - } - //创建缓存开始存储包数据 - if(buffer_handle->cmd_header.package_len >=0) - { - memcpy_s(buffer_handle->data,buffer_handle->totalDataLen+sizeof(msg_header_t)+1,totalData,event_size); - buffer_handle->lrcvalue = calculate_lrc(totalData+sizeof(msg_header_t),header->package_len,0x00); - buffer_handle->data_len += event_size; - } - - //单一包 - if(event_size == sizeof(msg_header_t)+buffer_handle->totalDataLen+1) - { - buffer_handle->crcvalue = totalData[event_size-1]; - } - } - - }else{ - //处理第二包以后的数据 - - //经过第一包处理,仍然data==NULL证明第一帧就是错的,要退出解析。 - if (buffer_handle->data== NULL) - { - return ERRCODE_MALLOC; - } - //此处是最后一帧 event_size = (buffer_handle->totalDataLen-buffer_handle->data_len) + 1 - if (event_size == (buffer_handle->totalDataLen + sizeof(msg_header_t) + 1 -buffer_handle->data_len )) - { - if(buffer_handle->buffer_to_file == 1) - { - fwrite(totalData,1,event_size,buffer_handle->tmpfilehandle); - - }else{ - memcpy_s(buffer_handle->data+buffer_handle->data_len,buffer_handle->totalDataLen,totalData,event_size); - - } - buffer_handle->lrcvalue = calculate_lrc(totalData,event_size,buffer_handle->lrcvalue); - buffer_handle->data_len += event_size; - }else if (event_size < (buffer_handle->totalDataLen + sizeof(msg_header_t) + 1 - buffer_handle->data_len)) //中间帧 - { - if(buffer_handle->buffer_to_file == 1) - { - fwrite(totalData,1,event_size,buffer_handle->tmpfilehandle); - - }else{ - memcpy_s(buffer_handle->data+buffer_handle->data_len,(buffer_handle->totalDataLen + sizeof(msg_header_t) + 1 - buffer_handle->data_len),totalData,event_size); - - } - buffer_handle->lrcvalue = calculate_lrc(totalData,event_size,buffer_handle->lrcvalue); - buffer_handle->data_len += event_size; - }else{ //异常帧 - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"error event_size %d , should <= %d\n",event_size, (buffer_handle->totalDataLen + sizeof(msg_header_t) + 1 - buffer_handle->data_len) ); - - } - - } - //如果包完整接收,进行crc校验 - if( (buffer_handle->totalDataLen + sizeof(msg_header_t) + 1 ) == buffer_handle->data_len ) - { - //我们认为最后一个包,应该不包含其他包,因此其最后一位,应当就是crc值,因此可直接获取crc值 - buffer_handle->crcvalue = buffer_handle->data[buffer_handle->data_len - 1];//获取crc - //最后一位校验位清0,方便字符串处理 - buffer_handle->data[buffer_handle->data_len - 1] = 0; - - //缓存到文件的,处理方法会不同因此单独解决 - if(buffer_handle->buffer_to_file == 1) - { - //先关闭临时文件,然后把文件名给协议解析函数即可。 - if (buffer_handle->tmpfilehandle != NULL) - { - fclose(buffer_handle->tmpfilehandle); - buffer_handle->tmpfilehandle=NULL; - } - } - // #define COMMON_CRC_MSG - //通用回复crc校验结果,不是所有指令都一致,暂时取消,在每个指令内部进行回复 - #ifdef COMMON_CRC_MSG - if (get_crc_from_lrc(buffer_handle->lrcvalue) != buffer_handle->crcvalue) - { - //发送校验失败 - ble_reply_msg(buffer_handle->cmd_header.cmdtype,buffer_handle->cmd_header.cmdid,0); - - }else - #endif - { - //协议解析指令 - handle_ble_msg(buffer_handle); - } - //所有操作都完成,要释放 data - if(buffer_handle->data != NULL) - { - free(buffer_handle->data); - buffer_handle->data=NULL; - } - - } - return ERRCODE_SUCC; -} - - - -void bleDataRecv(uint8_t *totalData, uint16_t event_size,uint16_t handle) -{ - - if (event_size < sizeof(msg_header_t)) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"event size (%d) is less than msg_header_t (%d) ",event_size,sizeof(msg_header_t)); - // return ; - } - #ifdef BLE_LOG - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"bleDataRecv handle:%d\r\n",handle); - #endif - int last_unused_handle_index = -1; - int handle_index_found = -1; - for(int i = 0;i=0 && handle_index_found == -1) - { - handle_index_found = last_unused_handle_index; - } - - if(handle_index_found>=0) - { - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_index_found:index %d addr %X\r\n",handle_index_found,&handle_l[handle_index_found]); - handle_l[handle_index_found].handle = handle; - combine_data_internal(&handle_l[handle_index_found],totalData,event_size); - } - else - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"no empty handle_l found! skip this msg!\n"); - - -} - -void free_ble_data(void)//以防断开蓝牙没有释放数据类型 -{ - blesrv_service_recv_msg_handler(0xff,(uint8_t*)"clean",6); - return; - -} - - -void cancel_AI_cur_chat(void) -{ - blesrv_service_recv_msg_handler(0xff,(uint8_t*)"AI_cancel_AI",13); - return; - //send_big_data(0, (char *)&data, 1, 1, 1, 1, 0x07, 5); -} - -void free_ble_data_Event(void)//以防断开蓝牙没有释放数据类型 -{ - - totalpack = 0; - muiltFlag = 0; - packdataLen = 0; - totalDataLen = 0; - ANCSBigBufFlag = 0; - - recvBigDataBufState = false; - sendbigDataBufState = false; - - is_connect_synchronization_time=0; - - - cancel_recv_file(1); - - for (int i = 0 ; i < MAX_HANDLE_NUM ; i++) - { - if (handle_l[i].data != NULL) - { - free(handle_l[i].data); - handle_l[i].data=NULL; - } - memset((void*)&handle_l[i],0,sizeof(ble_read_data)); - } - return; - -} - -//发送AI录音准备就绪国内/ -/*使用模型: -0:文心一言 -1:ChatGPT -2:KIMI -3:豆包*/ -bool send_AI_is_ready_(uint8_t type) -{ - - if(AI_is_end_state==0) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"发送AI准备就绪\r\n"); - ble_data_type type_={0x05,0x05,1,1,1}; - send_big_data(type_,(char *)&type,1); - AI_is_end_state=1; - return true; - } - else - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"发送AI准备就绪失败,没有正确回复结束\r\n"); - return false; - } - //send_big_data(0, (char *)&type, 1, 1, 1, 1, 0x05, 5); -} - -static uint8_t AI_is_ready_type=0; - -bool send_AI_is_ready(uint8_t type) -{ - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"发送AI准备就绪\r\n"); - AI_is_ready_type=type; - blesrv_service_recv_msg_handler(0xff,(uint8_t*)"AI_is_ready",12); - return true; -} - -void cancel_AI_cur_chat_(void) -{ - //if(AI_is_end_state) - { - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"取消当前AI对话\r\n"); - uint8_t data=1; - ble_data_type type_={0x05,0x07,1,1,1}; - send_big_data(type_,(char *)&data,1); - AI_is_end_state=0; - - } - //else - // { - // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"已经取消当前AI对话无需再次取消\r\n"); - // } - - - //send_big_data(0, (char *)&data, 1, 1, 1, 1, 0x07, 5); -} - -//接收app下发的原始数据 -void revBleOldData(uint8_t *buf, uint16_t event_size,uint16_t handle)//每包的数据大小 -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle :%d %s event_size %d\r\n",handle,getHandlname(handle),event_size); - if(handle==0xff) - { - if(strcmp("AI_cancel_AI",(char *)buf)==0) - { - cancel_AI_cur_chat_(); - } - else if(strcmp("AI_is_ready",(char *)buf)==0) - { - send_AI_is_ready_(AI_is_ready_type); - } - else - { - free_ble_data_Event(); - } - - return; - } - - bleDataRecv(buf,event_size,handle); -} -#endif -#endif -#ifdef __cplusplus -} +/** + * Copyright (c) CompanyNameMagicTag 2023-2023. All rights reserved. + * Description: alipay bluetooth module. + * Author: + * Create: + */ + + +#ifdef __cplusplus +extern "C" { +#endif +#include "common_def.h" +#include "bts_def.h" +#include "bts_gatt_stru.h" +#include "bts_a2dp_source.h" +#include "bts_gatt_server.h" +#include "bts_le_gap.h" +#include "osal_task.h" +#include "securec.h" +#include "wearable_log.h" +#include +#include +#include "stdbool.h" +#include "bts_br_gap.h" + +#ifdef SUPPORT_BATTERY_SERVICE +#include "battery_hal.h" +#endif + +#include "bleService.h" +#include "alipay_feature.h" + +// #include "alipay_bluetooth.h" + +#include "bts_a2dp_sink.h" +#include "osal_timer.h" +#include "bleEvent.h" +#include "broadcast_feature.h" +#include +#if 1//#ifdef //SUPPORT_BLE_SERVICE +#include "app_common_api.h" +// #include "hidService.h" +#include "../../../../../open_source/openharmony/third_party/cJSON/cJSON.h" +#include "errcode.h" +#include "sys/statfs.h" + +#ifdef BLE_INSTRUCT +#include "bleInstruct.h" +#endif + +#include "custom_utils.h" +#include "custom_runtime.h" +#include "bleANCS.h" +#ifdef FD230 +#include "Bluetooyhpabpserver.h" +#endif +#include "custom_save_runtime.h" + +#define DEBUG_TEST (0) +#define CRC_CHECK_ERR 0 //crc校验失败 +#define JSON_CHECK_OK 1 //json解析成功 +#define JSON_CHECK_ERR 2 //json解析失败 + +#define AI_TXT_BUF_MAX_LEN 1024*3 //json解析失败 + + +#define MAX_BLE_EVENT_DIAL_NUM (10) //表盘最大数量 + +#include "upg_common_porting.h" + + +uint32_t packdataLen = 0; +uint32_t totalDataLen = 0; +uint8_t totalpack = 0; +uint8_t cmd_data[17]; +uint8_t *recvData; +#include "los_memory.h" + +#define MAX_BLE_MSG_PACKAGE_LEN (1024*5) //包缓存最大5k +#define BLE_MSG_TMP_FILE_NAME "/user/userdata/ble_tmp_buf_%04X" +typedef struct +{ + int handle; + int data_len ; + int totalDataLen; + int buffer_to_file; //1 buffer to file , 0 buffer to ram + int decode_type; //1 with header , 2 no header + FILE *tmpfilehandle;// 如果buffer to file , 则在此保存handle + msg_header_t cmd_header; + uint8_t *data;//if buffer_to_file is 1, than data is the filename , else data is the ram buffer. + uint8_t crcvalue; + uint8_t lrcvalue; //计算crc用的临时变量 + uint8_t lrcvalue2; //计算crc用的临时变量 + uint32_t last_timestamp;// last package receive time + uint8_t receive_file_flag;//1 接收文件 0 不接收文件 + file_recv_stat_t file_recv_stat; + uint8_t last_data_sample[5]; //专门给文件传输过程中重复包判定用。目前只是取前5个字节,实际应该再做优化算法。 + uint16_t last_data_size;//专门给传输过程中重复包判定用,记录上一个包的长度,至少长度相同才有判断重复的必要。同时也可以作为少于5个字节的包的判定依据。 +} ble_read_data; + +#define MAX_HANDLE_NUM 10 +//LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemInfoGet(VOID *pool, LOS_MEM_POOL_STATUS *poolStatus) +//根据特征值分开组合读取的数据,并处理 +static ble_read_data handle_l[MAX_HANDLE_NUM]={0}; +errcode_t cancel_recv_file(uint8_t flag); + +static char app_name[64]={0}; + +uint8_t ble_dial_file_count=0; +uint8_t ble_dial_file_index=0; +uint8_t *bigDataBuf = NULL;//大数据buf +uint8_t bigDataBufLen=0; +bool sendbigDataBufState = false;//发送大数据表示不要被其他指令打断 +bool recvBigDataBufState = false;//接收大数据标志 +static bool muiltFlag = 0;//多包数据flag +static bool ANCSBigBufFlag = 0;//ANCS多包数据flag +// static uint16_t data_len = 0; +ble_recv_data_info_t ble_recv_data; +static uint8_t TRANSMIT_DATA; +static osTimerId_t BR_TRANSFER_timer=NULL; +static uint32_t timer_flie_flag=0; +ble_read_data* ble_read_timer_p=NULL; + +#ifdef SINGLE_USER_PARTITION +#define UP_DATE_FWPKG_PATH UPG_FILE_NAME + +#else +#define UP_DATE_FWPKG_PATH UPG_FILE_NAME +#endif + + +//MP3文件重命名 +static errcode_t create_mp3_name(char* path,char*dir_path ,char* file_name) +{ + + sprintf_s(path,256,"%s/",dir_path); + uint16_t path_len=strlen(path); + + + if(strstr(file_name,".mp3")) + { + //"光-陈粒.128.mp3" + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s\r\n",file_name); + int len=strlen(file_name)-strlen(".mp3"); + for(int i=0;i=5 || output_file_path == NULL || filename == NULL) + { + return ERRCODE_FAIL; + } + char name[64]={0}; + ble_get_dial_path(name,id); + int ret; + if(id == 1 && strcmp(filename, "main_bg") == 0) //自定义视频表盘Id 1 只有背景需要是mp4 main_bg + { + ret = sprintf_s(output_file_path,max_output_size,"%s/%s.mp4",name,filename); + } + else + { + ret = sprintf_s(output_file_path,max_output_size,"%s/%s.bin",name,filename); + } + if (ret < 0) + return ERRCODE_FAIL; + + return ERRCODE_SUCC; + +} + + + + +int char_to_dec(char ch) +{ + int num = 0; + if(ch >= '0' && ch <= '9') { + num = num * 10 + (ch - '0'); + } + return num; +} +void char_to_big(uint8_t *src_str,uint8_t *res_str,uint8_t len) +{ + for(uint8_t i = 0;i= 'a' && src_str[i] <= 'z') { + src_str[i] = src_str[i] - 32; + } + } + memcpy(res_str,src_str,len); +} +void cameram_data(void)//拍照发送数据 调用这个接口即可 +{ + uint8_t data[2]={0x01,0x00}; + errcode_t ret = ble_hid_server_send_input_report(&data,2); + osal_msleep(100); /* wait 100 ms */ + memset(data,0,2); + (void)ble_hid_server_send_input_report(&data, 2); /* 上报按下按键 把停止发送指令也要发送 防止一直拍照*/ +} + +bool bigDataBufState=false;//大数据传输状态 +/** + * 计算crc时的求和函数,可以递归,从而实现多段数据的组合计算 +*/ +// uint8_t calculate_lrc(uint8_t *data,uint16_t len,uint8_t _lrcValue) +// { +// uint8_t lrcValue = _lrcValue; +// if(data == NULL) +// { +// return false; +// } +// for(uint16_t i = 0; i < len; i++) +// { +// lrcValue =lrcValue+ data[i]; +// // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%02x ",data[i]); +// } +// return lrcValue; +// } + + +/*** + * 根据求和后的数据计算crc 值 +*/ +// uint8_t get_crc_from_lrc(uint8_t lrcValue) +// { +// uint8_t crcbuf = 0; +// crcbuf = lrcValue%256; +// crcbuf = 256-crcbuf; +// crcbuf = crcbuf%256; +// return crcbuf; +// } + +uint8_t calculate_lrc_file(char *file_path) +{ + uint8_t lrcValue =0; + FILE * fp = fopen(file_path,"rb+"); + + char data[1]={0}; + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"calculate_lrc_file %s\r\n",file_path); + uint8_t read_size=0; + + if(fp==NULL) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"fopen fail %s\r\n",file_path); + return 0; + } + do + { + memset_s(data,1,0,1); + read_size=fread(data,1,1,fp); + lrcValue+=data[0]; + + }while(read_size==1); + + fclose(fp); + return lrcValue; +} + + +#define USE_DEMO +static bool Check_CRC(uint8_t *data,uint16_t len,uint8_t crcvalue)//计算20byte的的校验位 +{ + uint8_t crcbuf = 0; + uint8_t lrcValue = 0x00; + if(data == NULL) + { + return false; + } + lrcValue = calculate_lrc(data,len,0x00); + + crcbuf = get_crc_from_lrc(lrcValue); + + #ifdef BLE_LOG + WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Check_CRC lrc: 0x%x ,ret crc: 0x%x ,crcvalue 0x%x , len:%d\r\n",lrcValue,crcbuf,crcvalue,len); + #endif + if(crcbuf == crcvalue) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Check_CRC true:\r\n"); + return true; + } + else{ + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Check_CRC false:\r\n"); + if(uapi_dev_runtime_get_android_connection_status()==1) + return true; + else + #ifndef USE_DEMO + return false; + #else + return true; + #endif + } + +} + + +// uint8_t Calculate_CRC(uint8_t *data,uint16_t len)//计算20byte +// { +// uint8_t crcbuf = 0; +// uint8_t lrcValue = 0x00; +// lrcValue = calculate_lrc(data+17,len-17,0x00); +// crcbuf = get_crc_from_lrc(lrcValue); +// return crcbuf; +// } + +uint8_t Calculate_CRC_AI(uint8_t *data,uint16_t len) +{ + return Calculate_CRC(data,len); +} + +// uint8_t Calculate_CRC_Big(uint8_t *data,uint16_t len)//计算20byte +// { +// uint8_t crcbuf = 0; +// uint8_t lrcValue = 0x00; +// lrcValue = calculate_lrc(data,len,0x00); +// crcbuf = get_crc_from_lrc(lrcValue); +// return crcbuf; +// } + +static cJSON *cjson_json_tmp = NULL; +//发送ble数据 +errcode_t sendBleData(uint8_t *buf,uint16_t len) +{ + errcode_t ret = ERRCODE_FAIL; + #ifdef BLE_LOG + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"bigDataBufState:%d and sendbigDataBufState %d\r\n",bigDataBufState,sendbigDataBufState); + #endif + //if(Bleconnect == true ) + { + ret = svr_ble_bt_gatts_noyify(buf,len); + } + return ret; + +} + + +errcode_t sendBleData_zhihui(uint8_t *buf,uint16_t len) +{ + errcode_t ret = ERRCODE_FAIL; + #ifdef BLE_LOG + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"bigDataBufState:%d and sendbigDataBufState %d\r\n",bigDataBufState,sendbigDataBufState); + #endif + //if(Bleconnect == true ) + { + ret = svr_ble_bt_gatts_noyify_zhihui(buf,len); + } + return ret; + +} + + +void sendDataNow(uint8_t *buf,uint16_t len) +{ + //if(Bleconnect == true ) + { + svr_ble_bt_gatts_noyify(buf,len); + } +} + +void send_Data_Now_zh(uint8_t *buf,uint16_t len) +{ + { + svr_ble_bt_gatts_noyify_zhihui(buf,len); + } +} + + + +void send_big_data(ble_data_type type,char *data, uint16 datalen) +{ + // 动态分配内存空间,防止堆栈溢出 + uint8_t *buf =NULL; + buf = ym_malloc(17 + datalen + 1); + memset_s(buf,ble_nus_max_data_len,0,17 + datalen + 1); + if (buf == NULL && datalen!=0) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"内存分配失败\n"); + return; + } + if(type.Packet_id>=2) + { + msleep(get_ble_interval()+5);//多包数据发送增加延迟 + } + // 设置消息头部信息 + buf[0] = 0x72; // 消息头 + buf[1] = type.type; // 类型 + buf[2] = type.type_id; // 类型ID + memcpy(buf + 3, &type.packet_total, 4); // 总包数 + memcpy(buf + 7, &type.total, 4); // 总数据长度 + memcpy(buf + 11, &type.Packet_id, 4); // 数据包ID + memcpy(buf + 15, &datalen, 2); // 包数据长度 + + // 处理数据和计算CRC + if (data == NULL) { + //数据为空 按照18个字节总长度发送给app + buf[17] = 0x00; // 直接写0x00的校验和 + } else { + memcpy(buf + 17, data, datalen); // 复制数据到缓冲区 + buf[17 + datalen] = Calculate_CRC_Big((uint8_t *)data, datalen); // 计算CRC + } + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"data:\r\n"); + + for(int i=0;i<17 + datalen + 1;i++) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%x ",buf[i]); + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"end\r\n"); + + // 根据标志位选择发送数据的方式 + if(type.type==6) + { + send_Data_Now_zh(buf, 17 + datalen + 1); + } + else + { + sendDataNow(buf, 17 + datalen + 1); // 判断是否在传输或接收多包数据 + } + + + + ym_free(buf); // 释放内存空间 +} + +void send_long_data(char *buf, uint32_t pack_size,uint8_t type,uint8_t id) +{ + uint32_t data_len = strlen(buf); + uint32_t surplus_len=data_len; + uint32_t pack; + if(data_len%pack_size==0) + { + pack=data_len/pack_size; + } + else + { + pack=data_len/pack_size+1; + } + uint32_t pack_id=1; + uint32_t offset=0; + while (surplus_len!=0) + { + if(surplus_len>=pack_size) + { + surplus_len=surplus_len-pack_size; + + ble_data_type type_={type,id,data_len,pack,pack_id}; + send_big_data(type_,buf+offset,pack_size); + + //send_big_data(1,json_format+offset,pack_size,data_len,pack_id,pack,id,1); + offset+=pack_size; + } + else + { + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack); + ble_data_type type_={type,id,data_len,pack,pack_id}; + send_big_data(type_,buf+offset,surplus_len); + //send_big_data(1,json_format+offset,surplus_len,data_len,pack_id,pack,id,1); + break; + } + pack_id++; + } +} + + + +bool is_free_ota_update(uint32_t size) +{ + uint64_t free_size=0; + int i; + struct statfs file_buf = {0}; + FILE *fp=NULL; + fp=fopen(UP_DATE_FWPKG_PATH,"rb+"); + if(fp) + { + fclose(fp); + remove(UP_DATE_FWPKG_PATH); + } + +#ifdef SINGLE_USER_PARTITION + static const char * const g_volume_names[1] = { "/user/"}; + for (i = 0; i < 1; i++) { +#else + static const char * const g_volume_names[4] = {"/system/", "/update/", "/music/", "/user/"}; + for (i = 0; i < 4; i++) { +#endif + + /* 获取文件系统状态 */ + if (statfs(g_volume_names[i], &file_buf) != 0) { + return false ; + } + + #ifdef SINGLE_USER_PARTITION + if(strcmp("/user/",g_volume_names[i])==0) + { + free_size= ((uint64_t)(file_buf.f_bfree * file_buf.f_bsize)); + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"free_size :%ld\r\n",free_size); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"free_size :%lu\r\n",free_size); + } + int need_size=size*1.5; + if(need_size>free_size) + { + return false; + } + else + { + return true; + } + #else + //单分区不考虑是否足够空间 + return true; + #endif +#ifdef SINGLE_USER_PARTITION + } +#else + } +#endif + return false; +} + + + +//发送训练状态[app发起的运动] +void sendtraningstatedata(uint8_t state ,uint16_t time) +{ + char data[3]={0}; + uint32_t data_len=3; + data[0]=state; + memcpy(&data[1],&time,2); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"发送训练状态数据%d %d\r\n",data[0],time); + ble_data_type type={0x05,0x50,data_len,1,1}; + send_big_data(type,data,data_len); + +} + +//发送训练结束状态[手表发起] +void sendtraningstateend(void) +{ + char data[1]={0}; + uint32_t data_len=1; + data[0]=0; //[0 结束] + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"发送训练状态结束%d\r\n",data[0]); + + ble_data_type type={0x05,0x51,data_len,1,1}; + send_big_data(type,data,data_len); + //end_big_data(0,data,data_len,data_len,1,1,0x51,5); +} + +void sendtraningdata(msg_get_train_data_info_t *data) +{ + cJSON* dataJSON = cJSON_CreateObject(); + + if (dataJSON == NULL) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error creating JSON object\n"); + return; + } + + cJSON_AddNumberToObject(dataJSON,"st",data->st); + cJSON_AddNumberToObject(dataJSON,"hr",data->hr); + cJSON_AddNumberToObject(dataJSON,"ca",data->ca); + cJSON_AddNumberToObject(dataJSON,"di",data->di); + cJSON_AddNumberToObject(dataJSON,"stp",data->stp); + cJSON_AddNumberToObject(dataJSON,"ti",data->ti); + cJSON_AddNumberToObject(dataJSON,"pc",data->pc); + + char *jsonString = cJSON_PrintUnformatted(dataJSON); + + if (jsonString == NULL) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error printing JSON to string\n"); + cJSON_Delete(dataJSON); + return; + } + + uint32_t data_len = strlen(jsonString); + cJSON_Delete(dataJSON); + + if (data_len == 0) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error: JSON string length is 0\n"); + return; + } + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"发送训练实时数据 %d %s\n", data_len, jsonString); + ble_data_type type={0x01,0x0f,data_len,1,1}; + send_big_data(type,jsonString,data_len); + + cJSON_free(jsonString); +} + +static uint8_t AI_is_end_state=0; + +//查询AI 模型是否可用,结果通过2AE4返回 +/*使用模型: +0:文心一言 +1:ChatGPT +2:KIMI +3:豆包*/ +void inquire_AI_is_ready(uint8_t type) +{ + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"查询AI模型,是否准备就绪\r\n"); + ble_data_type type_={0x05,0x06,1,1,1}; + send_big_data(type_,(char *)&type,1); + //send_big_data(0, (char *)&type, 1, 1, 1, 1, 0x06, 5); +} + +void watch_synchronization_time(void) +{ + ble_data_type type_={0x05,0x02,0,1,1}; + send_big_data(type_,NULL,0); +} + + + +//发送ble数据 +uint8_t phone_mac[6];//手机下发的mac地址 第一次连接为空 +uint8_t parie_mac[6];//配对完成之后的的mac地址 +uint8_t phoneDataFlag = 0; +//发送配对指令 +void sendConfirmParieSucess(void) +{ + uint8_t value[19]; + memset(value,0,19); + value[0] = 0x72; + value[1] = 0x05; + value[2] = 0x11; + uint32_t tmp = 1; + uint16_t tmp_data = 1; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + value[17] = 0x01; + value[18] = Calculate_CRC(value,1+18); + sendBleData(value,19); +} + +uint8_t phoneType = 0; + + + + +errcode_t UnbindSucessCmd(uint8_t flag)//发送解绑指令,解绑界面调用这个函数 如果点了✓调用这个函数 返回成功后延迟10s再重启设备 +{ + errcode_t sendok = ERRCODE_FAIL; + uint32_t tmp = 1; + uint8_t value[19]; + uint8_t crcvalue = 0; + memset(value,0,19); + memset(value,0,19); + value[0] =0x72; + value[1] =0x05; + value[2] =0x12; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp,2); + value[17] = flag; + value[18] = Calculate_CRC(value,18); + sendok = sendBleData(value,19); + msleep(3*get_ble_interval());//增加延时,确保可以成功发送解除绑定 + + bd_addr_t addr={0}; + get_phone_addr(&addr,g_ble_conn_id); + + bool ret = bt_is_acl_connected(&addr); + if(flag == 1) + { + if(0!=remove(PHONE_WATCH_CONFIG_PATH)) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"json remove fail\r\n"); + } + gap_ble_remove_all_pairs(); + gap_remove_all_pairs(); + } + + + + return sendok; +} + +void watch_clean_pairs(void) +{ + if(0!=remove(PHONE_WATCH_CONFIG_PATH)) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"json remove fail\r\n"); + } + gap_ble_remove_all_pairs(); + gap_remove_all_pairs(); +} + + +void getDeviceState(void)//获取设备状态 +{ + bd_addr_t addr={0}; + get_phone_addr(&addr,g_ble_conn_id); + + bool ret = bt_is_acl_connected(&addr); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"getDeviceState ret:%d\r\n",ret); +} + +void clearPaireFlag(uint8_t flag) +{ + uint8_t value[19]; + uint8_t crcvalue = 0; + memset(value,0,19); + uint32_t tmp = 1; + value[0] =0x72; + value[1] =0x01; + value[2] =0x10; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp,2); + value[17] = flag; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + + UnbindSucessCmd(1);//1确认解绑; + + // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_RESTORE_FACTORY_SETTING, NULL, 0);//恢复出厂 + uint8_t shutdowflag = 2;//恢复出厂 + CustomEventPublish(TOPIC_EVENT_SHUTDOWN_ANIMATIOR, &shutdowflag, sizeof(shutdowflag)); + //uapi_reboot_device(); +} +void clearPaireCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)//发送清除配对指令 +{ + if(Check_CRC(data,len,crcvalue)) + { + //弹出清除配对界面不弹出是则发送0x02操作失败 1操作成功 0校验失败 + clearPaireFlag(1); + } + else + { + clearPaireFlag(0); + } +} +uint8_t *savephonename=NULL; +//确认配对指令 +uint8_t first_bond = 0;//是否第一次绑定 第一次绑定保存配对mac地址 +void comfirmPaire(uint8_t flag) +{ + uint8_t value[19]; + memset(value,0,19); + uint32_t tmp = 1; + value[0] =0x72; + value[1] =0x05; + value[2] =0x11; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp,2); + value[17] = flag; + value[18] = Calculate_CRC(value,1+17); + sendBleData(value,19); + if(flag == 1) + { + first_bond = 1; + + if(get_ble_pair()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP," gap_ble_pair \r\n"); + + bd_addr_t addr={0}; + get_phone_addr(&addr,g_ble_conn_id); + + errcode_t code = gap_ble_pair_remote_device(&addr); + if(code!=ERRCODE_SUCC) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"gap_ble_pair_remote_device fail %X\r\n",code); + } + } + + + }else{ + first_bond = 0; + errcode_t ret = 0; + bd_addr_t addr={0}; + get_phone_addr(&addr,g_ble_conn_id); + + ret = gap_ble_disconnect_remote_device(&addr);//与固定的mac设置地址进行断开连接 + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"gap_ble_disconnect_remote_device %x\r\n",ret); + ret = gap_ble_remove_all_pairs(); + bool ret_ok = gap_remove_all_pairs(); + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"gap_remove_all_pairs %x %x\r\n",ret,ret_ok); + if(savephonename != NULL) + { + ym_free(savephonename); + savephonename = NULL; + } + } +} + +// l连接手表之后-app通过特征值2AE4读手表信息->手表会把相应的信息给app->app通过73 02 10下发手机信息给设备(第一次连接mac为空)->设备返回73 02 10状态1才能和手机app第一次连接->设备会回发配对指令72 05 11给app,同时设备会对手机发起配对->手机点了配对后,配对成功手表会发配对成功指令72 05 10,这条指令包含手机的mac地址也会传给app->app校验解析成功之后->app下发时间指令72 02 02给设备->设备回复解析成功->完成连接 +void alarmData(void) +{ + +} + + +void getPhoneNameLen(uint8_t *data,uint8_t *datalen,uint8_t *type)//获取手机设备名称长度 +{ + uint8_t len = 0; + uint8_t *json = data; + cJSON* root = cJSON_Parse((const char *)json); + + if(root != NULL) + { + cJSON* pn = cJSON_GetObjectItem(root, "pn"); + if (pn && cJSON_IsString(pn)) { + len = strlen(pn->valuestring)+1; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"设备名称: %s len:%d\n", pn->valuestring,len); + } + cJSON* tp = cJSON_GetObjectItem(root, "tp"); + if(tp && cJSON_IsNumber(tp)) + { + *type=tp->valueint; + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d\r\n",type); + + cJSON* bond=cJSON_GetObjectItem(root, "bond"); + if(bond) + { + + } + *datalen = len; + cJSON_Delete(root); + } else{ + len = 0; + *datalen = len; + } +} +#define PHONE_NAME_MAX_LEN 50 +static uint8_t *getPhoneName(uint8_t *data)//获取手机设备名称 +{ + uint8_t *json = data; + uint8_t *str = NULL; + cJSON* root = cJSON_Parse((const char *)json); + if(root != NULL) + { + cJSON* pn = cJSON_GetObjectItem(root, "pn"); + if (pn && cJSON_IsString(pn)) { + uint8_t datalen = strlen(pn->valuestring)+1; + if(datalen > PHONE_NAME_MAX_LEN) // + { + datalen = PHONE_NAME_MAX_LEN; + } + if(datalen - 1 > 0){ + pn->valuestring[datalen]='\0'; + str = ym_malloc(sizeof(char)*datalen); + if(str != NULL) + { + memcpy(str,(uint8_t *)pn->valuestring,datalen+1); + } + if(savephonename) + { + ym_free(savephonename); + savephonename=NULL; + } + savephonename = ym_malloc(sizeof(char)*datalen); + if(savephonename != NULL){ + memcpy(savephonename,(uint8_t *)pn->valuestring,datalen+1); + } + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"设备名称: %s\n", pn->valuestring); + } + cJSON_Delete(root); + } + if (str == NULL){ + return NULL; + } + else{ + return str; + } + +} +void getPhoneMac(uint8_t *data,uint8_t *phoneMac)//获取手机设备mac这个是手表上传给手机的mac地址 +{ + uint8_t *json = data; + uint8_t phone_tmp[6]; + memset(phone_tmp,0,6); + cJSON* root = cJSON_Parse((const char *)json); + uint8_t datalen = 0; + uint8_t count = 5; + if(root != NULL) + { + cJSON* mac = cJSON_GetObjectItem(root, "mac"); + if (mac && cJSON_IsArray(mac)) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"MAC地址: "); + cJSON* macElement = NULL; + cJSON_ArrayForEach(macElement, mac) { + if (cJSON_IsNumber(macElement)) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d", macElement->valueint); + if (macElement->prev != NULL) { + phone_tmp[count] = macElement->valueint; + count--; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,", "); + } + } + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"\n"); + } + + memcpy(phoneMac,phone_tmp,6); + cJSON_Delete(root); + } + else{ + memset(phoneMac,0,6); + } +} + +void GetwatchSaveMac(uint8_t *mac,uint8_t *mactype)//获取手表本地保存的mac地址和mac地址类型 分共有和私有的 +{ + uint8_t mac_tmp[6]; + memset(mac_tmp,0,6); + uint8_t count = 0; + uint8_t type= 0; + FILE *jsfile = fopen(PHONE_WATCH_CONFIG_PATH, "r"); + if (jsfile != NULL) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"succes opening file\n"); + fseek(jsfile, 0, SEEK_END); + long fileSize = ftell(jsfile); + fseek(jsfile, 0, SEEK_SET); + + char *jsonData = (char *)ym_malloc(fileSize + 1); + fread(jsonData, 1, fileSize, jsfile); + jsonData[fileSize] = '\0'; + fclose(jsfile); + // 解析JSON数据 + cJSON *root = cJSON_Parse(jsonData); + // 释放资源 + ym_free(jsonData); + if (root != NULL) { + cJSON *modifiedJson = cJSON_GetObjectItem(root,"mac"); + if (cJSON_IsArray(modifiedJson)) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"watch MAC地址: "); + cJSON* macElement = NULL; + cJSON_ArrayForEach(macElement, modifiedJson) { + if (cJSON_IsNumber(macElement)) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d", macElement->valueint); + if ((macElement->prev != NULL)) { + mac_tmp[count] = macElement->valueint; + count++; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,", "); + } + } + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"\n"); + } + cJSON *mac_type = cJSON_GetObjectItem(root,"mac_type"); + if(cJSON_IsNumber(mac_type)) + { + *mactype = mac_type->valueint; + } + } + if(mac_tmp[0] == 0 && mac_tmp[1] == 0 && mac_tmp[2] == 0 && mac_tmp[3] == 0 && mac_tmp[4] == 0 && mac_tmp[5] == 0){ + memset(mac,0,6); + }else + { + memcpy(mac,mac_tmp,6); + } + cJSON_Delete(root); + }else + { + memset(mac_tmp,0,6); + memcpy(mac,mac_tmp,6); + *mactype = 0; + } +} +static void GetwatchSaveNameLen(uint8_t *datalen)//获取手表本地保存的手机设备名称长度 +{ + uint8_t len = 0; + FILE *jsfile = fopen(PHONE_WATCH_CONFIG_PATH, "r"); + if (jsfile != NULL) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetwatchSaveNameLen opening file\n"); + fseek(jsfile, 0, SEEK_END); + long fileSize = ftell(jsfile); + fseek(jsfile, 0, SEEK_SET); + + char *jsonData = (char *)ym_malloc(fileSize + 1); + fread(jsonData, 1, fileSize, jsfile); + jsonData[fileSize] = '\0'; + fclose(jsfile); + + // 解析JSON数据 + cJSON *root = cJSON_Parse(jsonData); + ym_free(jsonData); + if (root != NULL) { + cJSON *pn = cJSON_GetObjectItem(root,"pn"); + if(cJSON_IsString(pn)) + { + len = strlen(pn->valuestring)+1;//多加一个加上字符串的结束符\0 + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetwatchSaveNameLen;%d",len); + } + }; + *datalen = len; + // memcpy(datalen,&len,1); + // 释放资源 + cJSON_Delete(root); + }else{ + len = 0; + *datalen = len; + } +} +static uint8_t *GetwatchSaveName(void)//获取手表本地保存的手机设备名称 +{ + uint8_t count = 0; + uint8_t *str = NULL; + FILE *jsfile = fopen(PHONE_WATCH_CONFIG_PATH, "r"); + if (jsfile != NULL) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"succes opening file\n"); + fseek(jsfile, 0, SEEK_END); + long fileSize = ftell(jsfile); + fseek(jsfile, 0, SEEK_SET); + + char *jsonData = (char *)ym_malloc(fileSize + 1); + fread(jsonData, 1, fileSize, jsfile); + jsonData[fileSize] = '\0'; + fclose(jsfile); + + // 解析JSON数据 + cJSON *root = cJSON_Parse(jsonData); + ym_free(jsonData); + // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ym_free ym_malloc_count:%d ym_free_count:%d\r\n",ym_malloc_count,ym_free_count); + if (root != NULL) { + cJSON *pn = cJSON_GetObjectItem(root,"pn"); + if(cJSON_IsString(pn)) + { + uint8_t showname_len = strlen(pn->valuestring)+1; + if(showname_len > 50) + { + showname_len = PHONE_NAME_MAX_LEN; + } + if(showname_len-1 > 0){ + str = ym_malloc(sizeof(char)*showname_len); + if(str != NULL) + { + pn->valuestring[showname_len]='\0'; + memcpy(str,(uint8_t *)pn->valuestring,showname_len+1); + } + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetwatchSaveName:%s",pn->valuestring); + } + } + } + // 释放资源 + cJSON_Delete(root); + } + if (str == NULL) + { + return NULL; + }else{ + return str; + } + +} + +void cleanUnbindInfor(uint8_t flag)//和旧手机解绑清除配对信息 +{ + uint8_t value[19]; + memset(value,0,19); + uint32_t tmp = 1; + uint16_t tmp_fen= 1; + value[0] =0x72; + value[1] =0x05; + value[2] =0x11; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_fen,2); + value[17] = 0x03;// + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + + uint8_t MacType = 0; + uint8_t mac_data[6]; + memset(mac_data,0,6); + GetwatchSaveMac(&mac_data,&MacType); + + bd_addr_t addr={0}; + get_phone_addr(&addr,g_ble_conn_id); + + errcode_t ret1 = gap_disconnect_remote_device(&addr); + gap_ble_disconnect_remote_device(&addr);//与固定的mac设置地址进行断开连接 + + if (flag == 1){ + errcode_t ret= gap_ble_remove_pair(&addr);//清除配对信息 + + gap_ble_remove_all_pairs(); + bool ret_flag = gap_remove_all_pairs(); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"ret_flag:%d ret:%x\r\n",ret_flag,ret); + if(0!=remove(PHONE_WATCH_CONFIG_PATH)) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"json remove fail\r\n"); + } + set_ble_falg(0); + do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_RESTORE_FACTORY_SETTING, NULL, 0);//恢复出厂 + //uapi_reboot_device(); + } +} +static bool ctkd_flag_ble=false; + +void set_ctkd_flag(bool flag) +{ + ctkd_flag_ble=flag; +} +bool get_ctkd_flag(void) +{ + return true;//ctkd_flag_ble; +} +void sendBindInfor(uint8_t *data) +{ + uint8_t value[19]; + memset(value,0,19); + uint32_t tmp = 1; + uint16_t tmp_fen= 1; + value[0] =0x72; + value[1] =0x02; + value[2] =0x10; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_fen,2); + + uint8_t copare_mac[6]; + memset(copare_mac,0,6); + uint8_t datalen=0; + uint8_t *devname = NULL; + uint8_t devnamelen = 0; + uint8_t mac_tmp[6]; + memset(mac_tmp,0,6); + uint8_t phone_type; + uint8_t bond = 1;//未与任何手机绑定过 + errcode_t ret = 0; + first_bond = 0; + uint8_t save_mac[6]; + memset(save_mac,0,6); + uint8_t MacType = 0; + + GetwatchSaveMac(&save_mac,&MacType);//获取手表设备本地保存的mac地址和mac地址类型 + getPhoneMac(data,&copare_mac); + + if(save_mac[0] == 0 && save_mac[1] == 0 && save_mac[2] == 0 && save_mac[3] == 0 && save_mac[4] == 0 && save_mac[5] == 0)//只要手表本地存储没有mac地址就走连接流程重新绑定 + { + bond = 0x01;//手表未和任何手机绑定过 + //未配过使能一键双联 + + //清除一次配对 + //if(get_ble_pair()) + + // + value[17] = bond;// + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + + #ifdef SUPPORT_DEVICE_PAIRING_NOTIFICATION + #ifdef SUPPORT_A5133_SERVICE_BLE_PAIR + comfirmPaire(1); + #else + devnamelen = 0; + getPhoneNameLen(data,&devnamelen,&phone_type);//获取手机下发的手机设备名称长度 + + if(phone_type==0) + { + unsigned int paired_devices_num=0; + bool gap_get_paired =gap_get_paired_devices_num(&paired_devices_num); + if(gap_get_paired!=true ||paired_devices_num!=0 ) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"sendBindInfor!!!!!!!!!:gap_remove_all_pairs \r\n"); + gap_remove_all_pairs(); + } + } + + + if(devnamelen > 0 ) + { + + devname = getPhoneName(data); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"devname!!!!!!!!!:%s devnamelen:%d",devname,devnamelen); + if (devname != NULL){ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"phone devname is name!!!!!!!!!\r\n"); + uint8_t buf[devnamelen+2]; + memset(buf,0,devnamelen+2); + buf[0] = DEVICEBIND ; + buf[1] = devnamelen;//设备名称长度 0不显示 + memcpy(buf+2,devname,devnamelen); + + if(phone_type==1) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"IOS\r\n"); + ble_set_pair(1); + + errcode_t ret = gap_ble_set_ctkd_enable(true); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "iPhone gap_ble_set_ctkd_enable ret = %x", ret); + set_ctkd_flag(true); + } + else + { + ble_set_pair(0); + + errcode_t ret = gap_ble_set_ctkd_enable(true); + + } + + CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,(uint8_t *)buf,devnamelen+2); + // comfirmPaire(1); + if(devname) + { + ym_free(devname); + devname = NULL; + } + }else{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"phone devname is no name11111!!!!!!!!!:"); + uint8_t buf[2]; + memset(buf,0,2); + buf[0] = DEVICEBIND; + buf[1] = 0; + CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,buf,2); + // comfirmPaire(1); + + } + } + else{ + uint8_t buf[2]; + memset(buf,0,2); + buf[0] = DEVICEBIND; + buf[1] = 0 ; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"phone devname is no name!!!!!!!!!:"); + CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,buf,2); + // comfirmPaire(1); + } + #endif + #endif + + return; + + }else + { + if(copare_mac[0] == 0 && copare_mac[1] == 0 && copare_mac[2] == 0 && copare_mac[3] == 0 && copare_mac[4] == 0 && copare_mac[5] == 0) + { + bond = 0x03;//手表和其他手机绑定过 + + }else{//如果手机有保存mac app下发是空就提示和其他手机绑定过界面不在发起配对 + int result = memcmp(copare_mac,save_mac,6); + if(result == 0) + { + + if(get_ble_pair()) + { + set_ctkd_flag(true); + errcode_t ret = gap_ble_set_ctkd_enable(true); + + } + else + { + errcode_t ret = gap_ble_set_ctkd_enable(true); + } + + + if(get_ble_pair()) + { + bd_addr_t addr={0}; + get_phone_addr(&addr,g_ble_conn_id); + + errcode_t code = gap_ble_pair_remote_device(&addr); + if(code!=ERRCODE_SUCC) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"gap_ble_pair_remote_device fail %X\r\n",code); + } + } + + bond = 0x02;//手表与该手机绑定过 + value[17] = bond;// + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + return; + }else{ + bond = 0x03;//手表与其他手机绑定过 + } + } + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"bond flag:%d first_bond:%d\r\n",bond,first_bond); + + if(bond == 0x03) + { + devnamelen = 0; + GetwatchSaveNameLen(&devnamelen);//获取手表设备保存手机的设备名称长度 + if(devnamelen > 0) + { + devname = GetwatchSaveName(); + if (devname != NULL){ + uint8_t buf[devnamelen+2]; + memset(buf,0,devnamelen+2); + buf[0] = DEVICEUNBIND ; + buf[1] = devnamelen; + memcpy(buf+2,devname,devnamelen); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"devname:is no null!!!!!%s\r\n",devname); + CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,(uint8_t *)buf,devnamelen+2); + if(devname) + { + ym_free(devname); + devname = NULL; + } + }else{ + uint8_t buf[2]; + memset(buf,0,2); + buf[0] = DEVICEUNBIND; + buf[1] = 0; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"devname:is null!!!!!"); + CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,buf,2); + } + }else{ + uint8_t buf[2]; + memset(buf,0,2); + buf[0] = DEVICEUNBIND; + buf[1] = 0; + CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,buf,2); + } + } + value[17] = bond;// + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); +} +void SetPhoneInfo(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取手机信息 +{ + uint8_t value[19]; + memset(value,0,19); + uint32_t tmp = 1; + uint16_t tmp_fen= 1; + value[0] =0x72; + value[1] =0x02; + value[2] =0x10; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_fen,2); + phoneDataFlag = 1; + + if(Check_CRC(data,len,crcvalue)) + { + sendBindInfor(data); + }else{ + value[17] = 0x00; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } +} + + +void sendParieSuccess(uint8_t flag,bd_addr_t *addr)//发送配对成功指令to app +{ + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sendParieSuccess:0x%x-0x%x-0x%x-0x%x-0x%x-0x%x\r\n",addr->addr[0],addr->addr[1],addr->addr[2],addr->addr[3],addr->addr[4],addr->addr[5]); + if(g_ble_conn_id==0) + { + return; + + } + if(first_bond == 1 && phoneDataFlag == 1)//第一次连接绑定 + { + set_ble_falg(1); + uint8_t value[25]; + uint8_t length = 0; + memset(value,0,25); + value[0] = 0x72; + value[1] = 0x05; + value[2] = 0x10; + uint32_t totalpack= 1;//总的包数 + uint32_t data_len = 7;//数据长度 + uint32_t pack_index= 1;//分包序号Index + uint16_t pack_dataLen = 7; + memcpy(value+3,&totalpack,4); + memcpy(value+7,&data_len,4); + memcpy(value+11,&pack_index,4); + memcpy(value+15,&pack_dataLen,2); + value[17] = flag;//1 配对成功 0 配对失败 + if(flag == 1)//配对成功 + { + cJSON *dataJSON = cJSON_CreateObject(); + if(dataJSON==NULL) + { + return; + } + + cJSON* arrayJSON = cJSON_CreateArray(); + if(arrayJSON==NULL) + { + return; + } + for(uint8_t id = 0;id<6;id++) + { + cJSON_AddNumberToObject(arrayJSON,"id",addr->addr[id]); + } + if(savephonename != NULL) + { + cJSON_AddStringToObject(dataJSON,"pn",(char *)savephonename); + ym_free(savephonename); + savephonename = NULL; + } + cJSON_AddNumberToObject(dataJSON,"phoneType",phoneType); + cJSON_AddNumberToObject(dataJSON,"mac_type",addr->type); + cJSON_AddItemToObject(dataJSON,"mac",arrayJSON); + + char *jsonString = cJSON_PrintUnformatted(dataJSON); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"phone %s",jsonString); + FILE *file = fopen(PHONE_WATCH_CONFIG_PATH, "wb"); + if (file) + { + if (fputs(jsonString, file) != EOF) // 将 JSON 字符串写入文件 + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WriteJsonData success\n"); + } + fclose(file); + } + // ym_free(jsonString); + cJSON_free(jsonString); + cJSON_Delete(dataJSON); + // 读取JSON文件 + + //memcpy(value+18,addr->addr,6); + value[18]=addr->addr[5]; + value[19]=addr->addr[4]; + value[20]=addr->addr[3]; + value[21]=addr->addr[2]; + value[22]=addr->addr[1]; + value[23]=addr->addr[0]; + + memcpy(parie_mac,addr->addr,6); + length = 18+6; + uint8_t crcvalue = Calculate_CRC(value,length); + value[length] = crcvalue; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sendParieSuccess:%d length:%d crcvalue:%d",sizeof(value),length,crcvalue ); + sendBleData(value,length+1); + }else{ + length = 18; + uint8_t crcvalue = Calculate_CRC(value,length); + value[length] = crcvalue; + length = length+1; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sendParieSuccess:%d length:%d crcvalue:%d",sizeof(value),length,crcvalue ); + sendBleData(value,length); + } + phoneDataFlag = 0; + } + + +} + + +//02类型的指令数据 + +void checkCrcSend(uint8_t type,uint8_t typeID,uint8_t crcflag)//获取时间 +{ + uint32_t tmp = 1; + uint16_t tmp_data = 1; + uint8_t sendBuf[19]; + memset(sendBuf,0,19); + sendBuf[0] = 0x72; + sendBuf[1] = type; + sendBuf[2] = typeID; + memcpy(sendBuf+3,&tmp,4); + memcpy(sendBuf+7,&tmp,4); + memcpy(sendBuf+11,&tmp,4); + memcpy(sendBuf+15,&tmp_data,2); + sendBuf[17] = crcflag; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + +} +//发送查找手机 +void senfindphoneSend(uint8_t flag) +{ + uint32_t tmp = 1; + uint16_t tmp_data = 1; + uint8_t sendBuf[19]; + memset(sendBuf,0,19); + sendBuf[0] = 0x72; + sendBuf[1] = 0x05; + sendBuf[2] = 0x01; //3 + memcpy(sendBuf+3,&tmp,4); + memcpy(sendBuf+7,&tmp,4); + memcpy(sendBuf+11,&tmp,4); //15 + memcpy(sendBuf+15,&tmp_data,2); //17 + sendBuf[17] = flag; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); +} + +static uint8_t jsonCheck_time(uint8_t *buf)//json 格式解析 +{ + // char time_data[24]; + // memset(time_data,0,24); + + uint8_t *json; + json = buf; + cJSON* root = cJSON_Parse((const char *)json); + if (root == NULL) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"时间 JSON解析错误\n"); + return 2; + } + char *locations; + int year = 1970; + uint8_t month = 1; + uint8_t day = 1; + uint8_t week = 4; + uint8_t hour = 0; + uint8_t minute = 0; + uint8_t second = 0; + uint32_t timestamp; + cJSON* time = cJSON_GetObjectItem(root, "time"); + if (time && cJSON_IsNumber(time)) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"time: %d\n", time->valueint); + timestamp = time->valueint; + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"time: %d\n", time->valueint); + } + cJSON* jsweek = cJSON_GetObjectItem(root, "week"); + if (jsweek && cJSON_IsNumber(jsweek)) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"week: %d\n", jsweek->valueint); + week = jsweek->valueint; + } + cJSON* jsyear = cJSON_GetObjectItem(root, "year"); + if (jsyear && cJSON_IsNumber(jsyear)) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"year: %d\n", jsyear->valueint); + year = jsyear->valueint; + } + cJSON* jsmonth = cJSON_GetObjectItem(root, "month"); + if (jsmonth && cJSON_IsNumber(jsmonth)) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"month: %d\n", jsmonth->valueint); + month = jsmonth->valueint; + } + cJSON* jsday = cJSON_GetObjectItem(root, "day"); + if (jsday && cJSON_IsNumber(jsday)) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"day: %d\n", jsday->valueint); + day = jsday->valueint; + } + cJSON* jshour = cJSON_GetObjectItem(root, "hour"); + if (jshour && cJSON_IsNumber(jshour)) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"hour: %d\n", jshour->valueint); + hour = jshour->valueint; + } + cJSON* jsminute = cJSON_GetObjectItem(root, "minute"); + if (jsminute && cJSON_IsNumber(jsminute)) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"minute: %d\n", jsminute->valueint); + minute = jsminute->valueint; + } + cJSON* jssecond = cJSON_GetObjectItem(root, "second"); + if (jssecond && cJSON_IsNumber(jssecond)) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"second: %d\n", jssecond->valueint); + second = jssecond->valueint; + } + cJSON* location = cJSON_GetObjectItem(root, "location"); + if (location && cJSON_IsString(location)) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"location: %s\n", location->valuestring); + locations = location->valuestring; + } + // sprintf((char *)time_data,"%d-%d-%d %d:%d:%d",year+2000,month,day,hour,minute,second); + // set_system_time(time_data); + + + /***计算timezone*/ + struct tm tmp={0}; + tmp.tm_year = year+2000 - 1900; + tmp.tm_mon = month -1; + tmp.tm_mday = day; + tmp.tm_hour = hour; + tmp.tm_min = minute; + tmp.tm_sec = second; + time_t timestamp2 = __tm_to_secs(&tmp); + int16_t timezone = (timestamp2-timestamp)/60/15; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"timezone in quarters %d\n",timezone); + uapi_set_timezone(timezone); //要在uaip_sntp_set_time_utc 之前执行才有效 + /********/ + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"time: %d\n",timestamp ); + + uaip_sntp_set_time_utc(timestamp); + + cJSON_Delete(root); + return 1; +} + + + + +void SetUTCtime(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取时间 +{ + uint32_t tmp = 1; + uint16_t tmp_data = 1; + uint8_t sendBuf[19]; + memset(sendBuf,0,19); + sendBuf[0] = 0x72; + sendBuf[1] = 0x02; + sendBuf[2] = 0x02; + memcpy(sendBuf+3,&tmp,4); + memcpy(sendBuf+7,&tmp,4); + memcpy(sendBuf+11,&tmp,4); + memcpy(sendBuf+15,&tmp_data,2); + + if(Check_CRC(data,len,crcvalue)) + { + + uint8_t set_ok = 1; + set_ok = jsonCheck_time(data); + sendBuf[17] = set_ok; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + + } + else + { + sendBuf[17] = 0; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } + +} +static training_ble training_ble_data; +//设置训练目标 +static uint8_t jsonCheck_targetparam(uint8_t *buf) +{ + uint8_t *json; + json = buf; + cJSON* root = cJSON_Parse((const char *)json); + if (root == NULL) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"时间 JSON解析错误\n"); + return 2; + } + + memset(&training_ble_data, 0, sizeof(training_ble)); + + cJSON* ty = cJSON_GetObjectItem(root, "ty");//目标类型 + if (cJSON_IsNumber(ty)) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"ty: %d\n", ty->valueint); + training_ble_data.sportTagType = ty->valueint; + training_ble_data.controlmd = SETGOAL; + + cJSON* targetItem = NULL; + switch (training_ble_data.sportTagType) + { + case 0: // 距离 + targetItem = cJSON_GetObjectItem(root, "di");//目标距离 + break; + case 1: // 卡路里 + targetItem = cJSON_GetObjectItem(root, "ca");//目标卡路里 + break; + case 2: // 时间 + targetItem = cJSON_GetObjectItem(root, "tm");//目标时间 + break; + case 3: // 步数 + targetItem = cJSON_GetObjectItem(root, "st");//目标步数 + break; + default: + break; + } + + if (targetItem && cJSON_IsNumber(targetItem)) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s: %d\n", targetItem->string, targetItem->valueint); + training_ble_data.sportTag = targetItem->valueint; + cJSON_Delete(root); + CustomEventPublish(TOPIC_EVENT_BLE_TRAINING, (uint8_t*)&training_ble_data, sizeof(training_ble)); + return JSON_CHECK_OK; + } + } + + cJSON_Delete(root); + return JSON_CHECK_ERR; +} + + +void SetTarinTarget(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置训练目标 +{ + uint32_t tmp = 1; + uint16_t tmp_data = 1; + uint8_t sendBuf[19]; + memset(sendBuf,0,19); + sendBuf[0] = 0x72; + sendBuf[1] = 0x02; + sendBuf[2] = 0x04; + memcpy(sendBuf+3,&tmp,4); + memcpy(sendBuf+7,&tmp,4); + memcpy(sendBuf+11,&tmp,4); + memcpy(sendBuf+15,&tmp_data,2); + + if(Check_CRC(data,len,crcvalue)) + { + uint8_t set_ok = 1; + set_ok = jsonCheck_targetparam(data); + sendBuf[17] = set_ok; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } + else + { + sendBuf[17] = 0; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } + +} + +static void SetOtherTarget(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取其他目标 +{ + uint32_t tmp = 1; + uint16_t tmp_data = 1; + uint8_t sendBuf[19]; + memset(sendBuf,0,19); + sendBuf[0] = 0x72; + sendBuf[1] = 0x02; + sendBuf[2] = 0x17; + memcpy(sendBuf+3,&tmp,4); + memcpy(sendBuf+7,&tmp,4); + memcpy(sendBuf+11,&tmp,4); + memcpy(sendBuf+15,&tmp_data,2); + + if(Check_CRC(data,len,crcvalue)) + { + // 73 2 17 1 0 0 0 8 0 0 0 1 0 0 0 8 0 2c 1 a 8 1e 1 1 1 2 + + uint16_t target_kcal = data[0]+data[1]*256;//目标卡路里 + uint8_t target_km = data[2];//目标里程 + uint8_t target_stand = data[3];//目标站立 + uint8_t target_fattime = data[4];//目标燃脂 + + uint8_t ring = data[5];//铃声 + uint8_t vibratior = data[6];//振动 + uint8_t notify = data[7];//通知 + if(target_km) + set_goal_discount(target_km); + if(target_stand) + set_goal_standupcount(target_stand); + if(target_fattime) + set_goal_durationcount(target_fattime); + if(target_kcal) + set_goal_caloriescount(target_kcal); + + // set_SilentMode(ring); + // set_vibrationremiander(vibratior); + // set_notify_switch(notify); + if(ring && vibratior && notify) + set_goal_other_notification(1); + else + set_goal_other_notification(0); + + + sendBuf[17] = 1; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } + else + { + sendBuf[17] = 0; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } + +} +static void jsonCheck_alarm(uint8_t *buf)//json 解析闹钟数据 +{ + uint8_t *json; + json = buf; + cJSON* root = cJSON_Parse((const char *)json); + + if (root == NULL) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"闹钟 JSON解析错误\n"); + return; + } + else + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"闹钟 %s\r\n",json); + } + ble_delet_all_AlarmInfo(); + + cJSON* alarms = cJSON_GetObjectItem(root, "alarms"); + if(alarms==NULL) + { + return; + } + int alarmCount = cJSON_GetArraySize(alarms); + + for(int i=0;ivalueint; + + cJSON* repeat=cJSON_GetObjectItem(data,"repeat"); + if(repeat==NULL) + return; + + int array_size = cJSON_GetArraySize(repeat); + for(int j=0;jvalueint; + if(day==7) + { + week|=0b00000001; + } + else if(day!=0) + { + week|=0b00000001<<(day); + } + + } + + cJSON* hour_data=cJSON_GetObjectItem(data,"hour"); + if(hour_data==NULL) + { + return; + } + int hour=hour_data->valueint; + cJSON* minute_data=cJSON_GetObjectItem(data,"minute"); + if(minute_data==NULL) + { + return; + } + int minute=minute_data ->valueint; + cJSON* enable_data=cJSON_GetObjectItem(data,"enable"); + if(enable_data==NULL) + { + return; + } + int enable=enable_data ->valueint; + + ble_SetAlarmInfo(hour, minute,week,i,enable); + + } + cJSON_Delete(root); + ble_AlarmClock_refresh(); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"alarmCount %d\n",alarmCount); + +} + +void SetAlarmDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的屏幕参数 +{ + uint32_t tmp = 1; + uint16_t tmp_data = 1; + uint8_t sendBuf[19]; + memset(sendBuf,0,19); + sendBuf[0] = 0x72; + sendBuf[1] = 0x02; + sendBuf[2] = 0x21; + memcpy(sendBuf+3,&tmp,4); + memcpy(sendBuf+7,&tmp,4); + memcpy(sendBuf+11,&tmp,4); + memcpy(sendBuf+15,&tmp_data,2); + + if(Check_CRC(data,len,crcvalue)) + { + jsonCheck_alarm(data); + + sendBuf[17] = 1; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } + else + { + sendBuf[17] = 0; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } +} + + +void SetpasswordCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的屏幕参数 +{ + uint32_t tmp = 1; + uint16_t tmp_data = 1; + uint8_t sendBuf[19]; + memset(sendBuf,0,19); + sendBuf[0] = 0x72; + sendBuf[1] = 0x02; + sendBuf[2] = 0x1c; + memcpy(sendBuf+3,&tmp,4); + memcpy(sendBuf+7,&tmp,4); + memcpy(sendBuf+11,&tmp,4); + memcpy(sendBuf+15,&tmp_data,2); + + if(Check_CRC(data,len,crcvalue)) + { + char* buf[7]={0}; + + sprintf_s(buf,7,"%d%d%d%d%d%d",data[1],data[2],data[3],data[4],data[5],data[6]); + ble_set_password(data[0],buf); + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s\r\n",buf); + + sendBuf[17] = 1; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } + else + { + sendBuf[17] = 0; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } +} + + +void GetWatchLcdParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的屏幕参数 +{ + uint32_t tmp = 1; + uint16_t tmp_data = 1; + uint8_t sendBuf[19]; + memset(sendBuf,0,19); + sendBuf[0] = 0x72; + sendBuf[1] = 0x02; + sendBuf[2] = 0x0e; + memcpy(sendBuf+3,&tmp,4); + memcpy(sendBuf+7,&tmp,4); + memcpy(sendBuf+11,&tmp,4); + memcpy(sendBuf+15,&tmp_data,2); + + if(Check_CRC(data,len,crcvalue)) + { + uint8_t type = data[0]; + if(type == 0)//只设置屏幕亮度 + { + uint8_t brightness = data[1]; + set_brigthness(brightness); + }else if(type == 1)//设置亮屏时长 抬碗亮屏 + { + uint8_t screen_type = data[1];//ms级别 + + int screen_time = 5*1000; + switch (screen_type) + { + case 0: + screen_time = 5*1000; + break; + case 1: + screen_time = 10*1000; + break; + case 2: + screen_time = 15*1000; + break; + case 3: + screen_time = 30*1000; + break; + case 4: + screen_time = 60*1000; + break; + case 5: + screen_time = 60*5*1000; + break; + default: + break; + } + bool raise = data[2]; + + set_ScreenDuration(screen_time); + Set_RaiseToWake(raise); + } + sendBuf[17] = 1; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } + else + { + sendBuf[17] = 0; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } + +} + + + +void GetVoiceVibrateParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的声音与振动参数 +{ + uint32_t tmp = 1; + uint16_t tmp_data = 1; + uint8_t sendBuf[19]; + memset(sendBuf,0,19); + sendBuf[0] = 0x72; + sendBuf[1] = 0x02; + sendBuf[2] = 0x0f; + memcpy(sendBuf+3,&tmp,4); + memcpy(sendBuf+7,&tmp,4); + memcpy(sendBuf+11,&tmp,4); + memcpy(sendBuf+15,&tmp_data,2); + + if(Check_CRC(data,len,crcvalue)) + { + + uint8_t type = data[0]; + if(type == 0)//只改变系统音量参数 其他还是保持不变 按照原来的参数 + { + int sys_volume = data[1]; + Set_SystemVolume(sys_volume); + + }else if(type == 1)//只改变铃声音量参数 其他还是保持不变 按照原来的参数 + { + int ring_volume = 0; + + ring_volume = data[1]; + + Set_CallVolume(ring_volume); + + }else if(type == 2)//只改变媒体音量 + { + int ring_volume = 0; + ring_volume = data[1]; + Set_CallVolume(ring_volume); + } + else if(type == 3)//只改变铃声和振动开关 + { + int bell_on = data[1]; + int vibrate_on = data[2]; + set_SilentMode(bell_on); + set_vibrationremiander(vibrate_on); + } + + sendBuf[17] = 1; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } + else + { + sendBuf[17] = 0; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } + +} + +void GetHrSetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//app设置心率参数 +{ + uint32_t tmp = 1; + uint16_t tmp_data = 1; + uint8_t sendBuf[19]; + memset(sendBuf,0,19); + sendBuf[0] = 0x72; + sendBuf[1] = 0x02; + sendBuf[2] = 0x12; + memcpy(sendBuf+3,&tmp,4); + memcpy(sendBuf+7,&tmp,4); + memcpy(sendBuf+11,&tmp,4); + memcpy(sendBuf+15,&tmp_data,2); + + if(Check_CRC(data,len,crcvalue)) + { + msg_get_heart_set_param_info_t set_data; + + set_data.frequence = data[0]; + set_data.remind_on=data[1]; + set_data.max_min=data[2]; + set_data.heart=data[3]; + + Set_heart_cmd(&set_data); + sendBuf[17] = 1; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } + else + { + sendBuf[17] = 0; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } + +} + + +void GetSpo2SetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue) +{ + uint32_t tmp = 1; + uint16_t tmp_data = 1; + uint8_t sendBuf[19]; + memset(sendBuf,0,19); + sendBuf[0] = 0x72; + sendBuf[1] = 0x02; + sendBuf[2] = 0x13; + memcpy(sendBuf+3,&tmp,4); + memcpy(sendBuf+7,&tmp,4); + memcpy(sendBuf+11,&tmp,4); + memcpy(sendBuf+15,&tmp_data,2); + + if(Check_CRC(data,len,crcvalue)) + { + + msg_get_spo2_set_param_info_t set_data; + set_data.frequence = data[0]; + set_data.remind_on=data[1]; + set_data.spo2=data[2]; + + Set_oxygen_cmd(&set_data); + + sendBuf[17] = 1; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } + else + { + sendBuf[17] = 0; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } + +} + +void SetsleepSetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置睡眠 +{ + uint32_t tmp = 1; + uint16_t tmp_data = 1; + uint8_t sendBuf[19]; + memset(sendBuf,0,19); + sendBuf[0] = 0x72; + sendBuf[1] = 0x02; + sendBuf[2] = 0x15; + memcpy(sendBuf+3,&tmp,4); + memcpy(sendBuf+7,&tmp,4); + memcpy(sendBuf+11,&tmp,4); + memcpy(sendBuf+15,&tmp_data,2); + + if(Check_CRC(data,len,crcvalue)) + { + msg_get_sleep_param_info_t sleep_info; + sleep_info.schedule = data[0]; + if(len>=6) + { + sleep_info.bedtime_hour= data[1]; + sleep_info.bedtime_min= data[2]; + sleep_info.waketime_hour= data[3]; + sleep_info.waketime_min= data[4]; + sleep_info.bedtime_alarm= data[5]; + } + + ble_set_sleep_remind(sleep_info); + + sendBuf[17] = 1; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } + else + { + sendBuf[17] = 0; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } +} + +void SetDrinkSetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置喝水提醒s设置 +{ + uint32_t tmp = 1; + uint16_t tmp_data = 1; + uint8_t sendBuf[19]; + memset(sendBuf,0,19); + sendBuf[0] = 0x72; + sendBuf[1] = 0x02; + sendBuf[2] = 0x14; + memcpy(sendBuf+3,&tmp,4); + memcpy(sendBuf+7,&tmp,4); + memcpy(sendBuf+11,&tmp,4); + memcpy(sendBuf+15,&tmp_data,2); + + if(Check_CRC(data,len,crcvalue)) + { + msg_drink_info_t drink_info={0}; + drink_info.drink_on = data[0]; + if(data[1]) + { + drink_info.drink_on=2; + } + // drink_info.drink_on = data[1]; + drink_info.goal = data[2]+data[3]*256; + drink_info.time_start = data[4]<<16|data[5]; + if(data[1]) + { + drink_info.time_end = data[6]<<16|data[7]; + drink_info.freq = data[8]; + + } + ble_set_drink_remind(drink_info); + + sendBuf[17] = 1; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } + else + { + sendBuf[17] = 0; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } + +} + +void SetsedentarinessSetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置久坐设置 +{ + uint32_t tmp = 1; + uint16_t tmp_data = 1; + uint8_t sendBuf[19]; + memset(sendBuf,0,19); + sendBuf[0] = 0x72; + sendBuf[1] = 0x02; + sendBuf[2] = 0x1D; + memcpy(sendBuf+3,&tmp,4); + memcpy(sendBuf+7,&tmp,4); + memcpy(sendBuf+11,&tmp,4); + memcpy(sendBuf+15,&tmp_data,2); + + if(Check_CRC(data,len,crcvalue)) + { + msg_sedent_set_param_info_t sedent_data={0}; + sedent_data.sedent_on=data[0]; + + // uint32_t sedent_on_time=data[1]; + // sedent_data.sedent_time |= sedent_on_time<<24; + + // sedent_on_time=data[2]; + // sedent_data.sedent_time |= sedent_on_time<<16; + + // sedent_on_time=data[3]; + // sedent_data.sedent_time |= sedent_on_time<<8; + + // sedent_on_time=data[4]; + // sedent_data.sedent_time |= sedent_on_time<<0; + memcpy_s( &sedent_data.sedent_time,4,&data[1],4); + + + sedent_data.frequenc = data[5]; + + // set_sedent_param(&sedent_data); + + sendBuf[17] = 1; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } + else + { + sendBuf[17] = 0; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } +} + +void SetmsgfiltrationCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置久坐设置 +{ + uint32_t tmp = 1; + uint16_t tmp_data = 1; + uint8_t sendBuf[19]; + memset(sendBuf,0,19); + sendBuf[0] = 0x72; + sendBuf[1] = 0x02; + sendBuf[2] = 0x1E; + memcpy(sendBuf+3,&tmp,4); + memcpy(sendBuf+7,&tmp,4); + memcpy(sendBuf+11,&tmp,4); + memcpy(sendBuf+15,&tmp_data,2); + + if(Check_CRC(data,len,crcvalue)) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"总长%d\r\n",len); + // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"数据%s\r\n",data); + uint32_t offset=0; + uint8_t count=0; + while (offset482)pack_size=482; + + if(json_len%pack_size==0) + { + pack=json_len/pack_size; + } + else + { + pack=json_len/pack_size+1; + } + uint32_t pack_id=1; + while (surplus_len!=0) + { + if(surplus_len>=pack_size) + { + surplus_len=surplus_len-pack_size; + + ble_data_type type_={0x02,0x19,json_len,pack,pack_id}; + send_big_data(type_,(char *)json_str+offset,pack_size); + offset+=pack_size; + } + else + { + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",json_len,surplus_len,pack_id,pack); + ble_data_type type_={0x02,0x19,json_len,pack,pack_id}; + send_big_data(type_,(char *)json_str+offset,surplus_len); + break; + } + pack_id++; + } + + cJSON_free(json_str); + + } + + } + else + { + ble_data_type type_={0x02,0x19,0,1,1}; + send_big_data(type_,NULL,0); + } +} + + +void SYN_train_heart_datatCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//同步训练数据 +{ + + if(Check_CRC(data,len,crcvalue)) + { + if(len==4) + { + uint32_t timetamp=0; + memcpy_s((void*)&timetamp,4,data,4); + char path[128]={0}; + if(get_training_heart_path(path,timetamp,128)) + { + FILE *fp= fopen(path,"rb+"); + uint32_t file_size=0; + if(fp==NULL) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"打开文件失败 %s \r\n",path); + + ble_data_type type_={0x02,0x4b,0,1,1}; + send_big_data(type_,NULL,0); + + return ; + } + fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾 + file_size = ftell(fp); // 获取当前文件指针位置,即文件大小 + fseek(fp, 0, SEEK_SET); // 将文件指针移回文件开头 + + int num=(ble_nus_max_data_len-18); + if(num>482)num=482; + + int num_check=file_size%5;//心率数据 5个字节 + if(num_check!=0) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"数据有误 %d \r\n",cmd); + + ble_data_type type_={0x02,0x4b,0,1,1}; + send_big_data(type_,NULL,0); + return ; + } + + char* buf = (char *)ym_malloc(sizeof(char)*num+1); + if(buf==NULL){fclose(fp); return ;} + + uint32_t pack=1; + + if(file_size%num==0) + pack=file_size/num; + else + pack=file_size/num+1; + + uint32_t pack_id=1; + uint32_t read_size=0; + do + { + memset_s(buf,num+1,0,num+1); + read_size=fread(buf,1,num,fp); + if(read_size!=0) + { + ble_data_type type_={0x02,0x4b,file_size,pack,pack_id}; + send_big_data(type_,buf,read_size); + } + pack_id++; + } while (read_size==num); + fclose(fp); + free(buf); + + } + } + + } + else + { + ble_data_type type_={0x02,0x4B,0,1,1}; + send_big_data(type_,NULL,0); + } +} + +void SYN_train_speed_datatCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//同步训练数据 +{ + + if(Check_CRC(data,len,crcvalue)) + { + if(len==4) + { + uint32_t timetamp=0; + memcpy_s((void*)&timetamp,4,data,4); + char path[128]={0}; + if(get_training_spead_path(path,timetamp,128)) + { + FILE *fp= fopen(path,"rb+"); + uint32_t file_size=0; + if(fp==NULL) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"打开文件失败 %s \r\n",path); + + ble_data_type type_={0x02,0x18,0,1,1}; + send_big_data(type_,NULL,0); + + return ; + } + fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾 + file_size = ftell(fp); // 获取当前文件指针位置,即文件大小 + fseek(fp, 0, SEEK_SET); // 将文件指针移回文件开头 + + int num=(ble_nus_max_data_len-18); + if(num>482)num=482; + + int num_check=file_size%6; + if(num_check!=0) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"数据有误 %d \r\n",cmd); + + ble_data_type type_={0x02,0x18,0,1,1}; + send_big_data(type_,NULL,0); + return ; + } + + char* buf = (char *)ym_malloc(sizeof(char)*num+1); + if(buf==NULL){fclose(fp); return ;} + + uint32_t pack=1; + if(file_size%num==0) + pack=file_size/num; + else + pack=file_size/num+1; + uint32_t pack_id=1; + uint32_t read_size=0; + do + { + memset_s(buf,num+1,0,num+1); + read_size=fread(buf,1,num,fp); + if(read_size!=0) + { + ble_data_type type_={0x02,0x18,file_size,pack,pack_id}; + send_big_data(type_,buf,read_size); + } + + + //send_big_data(1,buf,read_size,file_size,pack_id,pack,id,1); + pack_id++; + } while (read_size==num); + + fclose(fp); + free(buf); + + } + + } + } + else + { + ble_data_type type_={0x02,0x18,0,1,1}; + send_big_data(type_,NULL,0); + } +} + +//APP设置步数目标 +void SetsteptargetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue) +{ + uint32_t tmp = 1; + uint16_t tmp_data = 1; + uint8_t sendBuf[19]; + memset(sendBuf,0,19); + sendBuf[0] = 0x72; + sendBuf[1] = 0x02; + sendBuf[2] = 0x16; + memcpy(sendBuf+3,&tmp,4); + memcpy(sendBuf+7,&tmp,4); + memcpy(sendBuf+11,&tmp,4); + memcpy(sendBuf+15,&tmp_data,2); + + if(Check_CRC(data,len,crcvalue)) + { + + uint32_t targetStep; + memcpy(&targetStep,data,4); + + uint8_t ringOn=data[4]; + uint8_t vibration=data[5]; + uint8_t notify=data[6]; + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"设置步数:%d %d %d %d \r\n",targetStep,ringOn,vibration,notify); + + set_goal_stepcount(targetStep); + + + if(ringOn &&vibration && notify) + set_goal_step_notification(1); + else + set_goal_step_notification(0); + + + sendBuf[17] = 1; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } + else + { + sendBuf[17] = 0; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } + +} + +uint8_t jsonCheck_weather(uint8_t *buf,uint8_t *check)//json 格式解析 天气数据 +{ + uint8_t *json; + json = buf; + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"jsonCheck_weather:len: json:%f jsonlen:%d\r\n",0.011,strlen((char *)json)); + FILE *fp=fopen("/user/userdata/weather.json","wb+"); + if(fp != NULL) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"jsonCheck_weather len %d",strlen((char *)buf)+1); + //fwrite((void*)buf,1,strlen((char *)buf)+1,fp); + fputs((char *)buf,fp); + fclose(fp); + } + return parse_jsonCheck_weather(buf,check); +} +void parse_jsonCheck_weather_post(uint8_t *buf)//json 格式解析 天气数据 +{ + uint8_t *json; + json = buf; + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"jsonCheck_weather:len: json:%f jsonlen:%d\r\n",0.011,strlen((char *)json)); + cJSON* root = cJSON_Parse((const char *)json); + if (root == NULL) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"天气 JSON解析错误\n"); + return ; + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"开始解析天气 JSON\n"); + cJSON *now_cjson = cJSON_GetObjectItem(root, "now"); + if(now_cjson == NULL) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"天气 JSON解析错误\n"); + return ; + } + int humidity=0; + char * windScale=NULL; + char *textNight=NULL; + int uvIndex=0; + int temp=0; + int iconNight=0; + + cJSON *now_data_humidity= cJSON_GetObjectItem(now_cjson, "humidity"); + if(now_data_humidity) + { + humidity=now_data_humidity->valueint; + } + cJSON *now_data_windScale=cJSON_GetObjectItem(now_cjson, "windScale"); + if(now_data_windScale) + { + windScale=now_data_windScale->valuestring; + } + cJSON *now_data_textNight=cJSON_GetObjectItem(now_cjson, "textNight"); + if(now_data_textNight) + { + textNight=now_data_textNight->valuestring; + } + cJSON *now_data_uvIndex= cJSON_GetObjectItem(now_cjson, "uvIndex"); + if(now_data_uvIndex) + { + uvIndex=now_data_uvIndex->valueint; + } + cJSON *now_data_temp= cJSON_GetObjectItem(now_cjson, "temp"); + if(now_data_temp) + { + temp=now_data_temp->valueint; + } + cJSON *now_data_iconNight= cJSON_GetObjectItem(now_cjson, "iconNight"); + if(now_data_iconNight) + { + iconNight=now_data_iconNight->valueint; + } + set_weather_now_data(humidity,windScale,textNight,uvIndex,temp,iconNight); + + + cJSON *address_cjson = cJSON_GetObjectItem(root, "address"); + + char*city=NULL; + char*subLocality=NULL; + char*atm=NULL; + int lat=0; + int lon=0; + + cJSON *address_cjson_ = cJSON_GetObjectItem(address_cjson, "city"); + if(address_cjson_) + { + city=address_cjson_->valuestring; + } + + + address_cjson_= cJSON_GetObjectItem(address_cjson, "subLocality"); + if(address_cjson_) + { + subLocality=address_cjson_->valuestring; + } + + address_cjson_=cJSON_GetObjectItem(address_cjson, "atm"); + if(address_cjson_) + { + atm=address_cjson_->valuestring; + } + address_cjson_ = cJSON_GetObjectItem(address_cjson, "lat"); + if(address_cjson_) + { + lat=address_cjson_->valueint; + } + + address_cjson_ = cJSON_GetObjectItem(address_cjson, "lon"); + if(address_cjson_) + { + lon=address_cjson_->valueint; + } + set_weather_address_data(lat,atm,city,subLocality,lon); + cJSON *daily = cJSON_GetObjectItem(root, "daily"); + if(daily==NULL) + { + return ; + } + int count= cJSON_GetArraySize(daily); + for(int i=0;ivalueint; + } + + data_=cJSON_GetObjectItem(data,"iconDay"); + if(data_&& cJSON_IsNumber(data_) ) + { + iconDay=data_->valueint; + } + + data_=cJSON_GetObjectItem(data,"fxDate"); + if(data_&& cJSON_IsNumber(data_) ) + { + fxDate=data_->valueint; + } + + data_=cJSON_GetObjectItem(data,"textDay"); + if(data_&& cJSON_IsString(data_) ) + { + textDay=data_->valuestring; + } + data_=cJSON_GetObjectItem(data,"tempMax"); + if(data_&& cJSON_IsNumber(data_) ) + { + tempMax=data_->valueint; + } + set_weather_one_data(tempMin,iconDay,fxDate,tempMax,textDay,i); + + } + ble_UpdateMainWeatherData(); + cJSON_Delete(root); + return ; +} + +uint8_t parse_jsonCheck_weather(uint8_t *buf,uint8_t *check)//json 格式解析 天气数据 +{ + uint8_t flag = 0; + // flag = 2; + // memcpy(check,&flag,1); + // return 0; + uint8_t *json; + json = buf; + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"jsonCheck_weather:len: json:%f jsonlen:%d\r\n",0.011,strlen((char *)json)); + cJSON* root = cJSON_Parse((const char *)json); + if (root == NULL) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"天气 JSON解析错误\n"); + flag = 2; + memcpy(check,&flag,1); + return 0; + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"开始解析天气 JSON\n"); + cJSON *now_cjson = cJSON_GetObjectItem(root, "now"); + if(now_cjson == NULL) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"天气 JSON解析错误\n"); + return 0; + } + int humidity=0; + char * windScale=NULL; + char *textNight=NULL; + int uvIndex=0; + int temp=0; + int iconNight=0; + + cJSON *now_data_humidity= cJSON_GetObjectItem(now_cjson, "humidity"); + if(now_data_humidity) + { + humidity=now_data_humidity->valueint; + } + cJSON *now_data_windScale=cJSON_GetObjectItem(now_cjson, "windScale"); + if(now_data_windScale) + { + windScale=now_data_windScale->valuestring; + } + cJSON *now_data_textNight=cJSON_GetObjectItem(now_cjson, "textNight"); + if(now_data_textNight) + { + textNight=now_data_textNight->valuestring; + } + cJSON *now_data_uvIndex= cJSON_GetObjectItem(now_cjson, "uvIndex"); + if(now_data_uvIndex) + { + uvIndex=now_data_uvIndex->valueint; + } + cJSON *now_data_temp= cJSON_GetObjectItem(now_cjson, "temp"); + if(now_data_temp) + { + temp=now_data_temp->valueint; + } + cJSON *now_data_iconNight= cJSON_GetObjectItem(now_cjson, "iconNight"); + if(now_data_iconNight) + { + iconNight=now_data_iconNight->valueint; + } + set_weather_now_data(humidity,windScale,textNight,uvIndex,temp,iconNight); + + + cJSON *address_cjson = cJSON_GetObjectItem(root, "address"); + + char*city=NULL; + char*subLocality=NULL; + char*atm=NULL; + int lat=0; + int lon=0; + + cJSON *address_cjson_ = cJSON_GetObjectItem(address_cjson, "city"); + if(address_cjson_) + { + city=address_cjson_->valuestring; + } + + + address_cjson_= cJSON_GetObjectItem(address_cjson, "subLocality"); + if(address_cjson_) + { + subLocality=address_cjson_->valuestring; + } + + address_cjson_=cJSON_GetObjectItem(address_cjson, "atm"); + if(address_cjson_) + { + atm=address_cjson_->valuestring; + } + address_cjson_ = cJSON_GetObjectItem(address_cjson, "lat"); + if(address_cjson_) + { + lat=address_cjson_->valueint; + } + + address_cjson_ = cJSON_GetObjectItem(address_cjson, "lon"); + if(address_cjson_) + { + lon=address_cjson_->valueint; + } + set_weather_address_data(lat,atm,city,subLocality,lon); + cJSON *daily = cJSON_GetObjectItem(root, "daily"); + if(daily==NULL) + { + return 0; + } + int count= cJSON_GetArraySize(daily); + for(int i=0;ivalueint; + } + + data_=cJSON_GetObjectItem(data,"iconDay"); + if(data_&& cJSON_IsNumber(data_) ) + { + iconDay=data_->valueint; + } + + data_=cJSON_GetObjectItem(data,"fxDate"); + if(data_&& cJSON_IsNumber(data_) ) + { + fxDate=data_->valueint; + } + + data_=cJSON_GetObjectItem(data,"textDay"); + if(data_&& cJSON_IsString(data_) ) + { + textDay=data_->valuestring; + } + data_=cJSON_GetObjectItem(data,"tempMax"); + if(data_&& cJSON_IsNumber(data_) ) + { + tempMax=data_->valueint; + } + set_weather_one_data(tempMin,iconDay,fxDate,tempMax,textDay,i); + + } + + if( uapi_dev_runtime_get_bt_powerstat() && cm_get_HFP_switch()) + uapi_pbap_cmd_start_client(); + + bd_addr_t bdaddr={0}; + #ifdef FD230 + uapi_get_br_address(&bdaddr); + if( uapi_dev_runtime_get_bt_powerstat() && (cm_get_HFP_switch()||cm_get_A2DP_switch())) + { + + if(cm_get_A2DP_switch() && cm_get_A2DP_switch() && false==bt_is_acl_connected(&bdaddr) && !(bdaddr.addr[0]==0 && bdaddr.addr[1]==0 && bdaddr.addr[2]==0 && bdaddr.addr[3]==0 + && bdaddr.addr[4]==0 && bdaddr.addr[5]==0)) + { + gap_reconnect_media_device(&bdaddr); + } + else if(cm_get_A2DP_switch()) + { + uapi_a2dp_snk_connect(); + } + else if(cm_get_HFP_switch()) + { + uapi_hfp_connect(); + } + + } + + #endif + + ble_UpdateMainWeatherData(); + cJSON_Delete(root); + *check = 1; + return 1; +} +/*读取天气历史数据*/ +uint8_t read_jsonHistory_weather(void) +{ + uint8_t *buf = NULL; + FILE *fp=fopen("/user/userdata/weather.json","rb"); + if(fp == NULL) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"read_jsonHistory_weather:fopen error\r\n"); + return 0; + } + fseek(fp, 0, SEEK_END); + long size = ftell(fp); + fseek(fp, 0, SEEK_SET); + if (size == 0) + { + fclose(fp); + return 0; + } + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file size = %d\r\n",size); + buf = (uint8_t*)malloc(size + 1); + if(buf == NULL) + { + fclose(fp); + return 0; + } + + char *str = fgets((char *)buf,size + 1,fp); + if(str!=NULL) + { + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file str = %s\r\n",str); + } + + fclose(fp); + + parse_jsonCheck_weather_post(buf); + + free(buf); + + return 1; +} + +uint8_t binCheck_AI(uint8_t *buf,uint8_t *check,uint16_t len)//json 格式解析 天气数据 +{ + uint8_t flag = 0; + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"jsonCheck_weather:len: json:%f jsonlen:%d\r\n",0.011,strlen((char *)json)); + #if 0 + FILE *fp=fopen("user/AI.txt","wb+"); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI len %d\r\n",len); + fwrite((void*)buf,1,len,fp); + //fputs((char *)buf,fp); + fclose(fp); + #endif + + uint16_t offset=0; + + while (len>offset) + { + if(buf[offset]==1) + { + offset++; + if(offset>=len)break; + uint16_t txt_len; + memcpy_s(&txt_len,2,&buf[offset],2); + + offset+=2; + if(offset>=len)break; + + char txt_buf[256]={0}; + memcpy_s(txt_buf,256,&buf[offset],txt_len); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI Question txtbuf:%s %d\r\n",txt_buf,txt_len); + ble_set_ai_Question_str(txt_buf); + offset+=txt_len; + //offset+=1; + } + if(offset>=len)break; + + if(buf[offset]==2) + { + offset++; + if(offset>=len)break; + + uint16_t txt_len; + memcpy_s(&txt_len,2,&buf[offset],2); + + offset+=2; + if(offset>=len)break; + + if(txt_len>=AI_TXT_BUF_MAX_LEN) + txt_len=AI_TXT_BUF_MAX_LEN; + + char *txt_buf=(char*)malloc(txt_len+1); + if(txt_buf==NULL) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI txtbuf malloc fail\r\n"); + ble_set_ai_Answer_str("手表缓存不足",0); + return 0; + } + + txt_buf[txt_len]=0; + memcpy_s((char *)txt_buf,1024*3,&buf[offset],txt_len); + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI txtbuf Answer %s %d\r\n",txt_buf,txt_len); + ble_set_ai_Answer_str(txt_buf,2); + free(txt_buf); + + offset+=txt_len; + //offset+=1; + } + if(offset>=len)break; + + if(buf[offset]==0) + { + offset++; + if(offset>=len)break; + + uint16_t txt_len; + memcpy_s(&txt_len,2,&buf[offset],2); + + offset+=2; + if(offset>=len)break; + + char error_buf[256]={0}; + memcpy_s(error_buf,256,&buf[offset],txt_len); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI Question txtbuf:%s %d\r\n",error_buf,txt_len); + ble_set_ai_Answer_str(error_buf,0); + offset+=txt_len; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AI 解析失败\r\n"); + + } + if(offset>=len)break; + + if(buf[offset]==3) + { + offset++; + if(offset>=len)break; + + uint16_t txt_len; + memcpy_s(&txt_len,2,&buf[offset],2); + + offset+=2; + if(offset>=len)break; + + char error_buf[256]={0}; + memcpy_s(error_buf,256,&buf[offset],txt_len); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI Question txtbuf:%s %d\r\n",error_buf,txt_len); + ble_set_ai_Answer_str(error_buf,3); + offset+=txt_len; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AI 回应错误\r\n"); + + } + if(offset>=len)break; + + if(buf[offset]==4) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AI 结束\r\n"); + // if(AI_is_end_state) + // { + // AI_is_end_state=0; + // } + offset++; + if(offset>=len) + { + ble_set_ai_Answer_str("",4); + break; + } + + uint16_t txt_len; + memcpy_s(&txt_len,2,&buf[offset],2); + + offset+=2; + if(offset>=len)break; + + char error_buf[256]={0}; + memcpy_s(error_buf,256,&buf[offset],txt_len); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI Question txtbuf:%s %d\r\n",error_buf,txt_len); + ble_set_ai_Answer_str(error_buf,4); + + offset+=txt_len; + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AI 解析失败\r\n"); + + } + if(offset>=len)break; + offset++; + } + + *check = 1; + return 1; +} + + +void SetWeatherCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取天气数据 +{ + uint32_t tmp = 1; + uint16_t tmp_data = 1; + uint8_t sendBuf[19]; + memset(sendBuf,0,19); + sendBuf[0] = 0x72; + sendBuf[1] = 0x02; + sendBuf[2] = 0x20; + memcpy(sendBuf+3,&tmp,4); + memcpy(sendBuf+7,&tmp,4); + memcpy(sendBuf+11,&tmp,4); + memcpy(sendBuf+15,&tmp_data,2); + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetWeatherCmd:len:%d data:%s\r\n",len,data); + if(Check_CRC(data,len,crcvalue)) + { + // uint32_t y=(0xff00); + // uint32_t x =(0xff00& 0Xff00)>>16; + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetWeatherCmd %u\r\n",x); + uint8_t check = 1; + jsonCheck_weather(data,&check); + sendBuf[17] = check; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } + else + { + sendBuf[17] = 0; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } +} + + +void SetAiResultCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue) +{ + uint32_t tmp = 1; + uint16_t tmp_data = 1; + uint8_t sendBuf[19]; + memset(sendBuf,0,19); + sendBuf[0] = 0x72; + sendBuf[1] = 0x02; + sendBuf[2] = 0x1f; + memcpy(sendBuf+3,&tmp,4); + memcpy(sendBuf+7,&tmp,4); + memcpy(sendBuf+11,&tmp,4); + memcpy(sendBuf+15,&tmp_data,2); + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetWeatherCmd:len:%d data:%s\r\n",len,data); + if(Check_CRC(data,len,crcvalue)) + { + uint8_t check = 1; + binCheck_AI(data,&check,len); + + sendBuf[17] = check; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } + else + { + sendBuf[17] = 0; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } +} + +void APP_reply_AI_is_ready(uint8_t *data,uint16_t len) +{ + if(data[0]) + { + if(len>1) + { + //更新chatgptKEY + FILE *fp= fopen("/user/userdata/chatGPTkey.bin","wb+"); + if(fp) + { + fwrite(data+1,1,len-1,fp); + fclose(fp); + } + } + } + ble_app_reply(data[0]); +} +void SaveChatGPTCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue) +{ + uint32_t tmp = 1; + uint16_t tmp_data = 1; + uint8_t sendBuf[19]; + memset(sendBuf,0,19); + sendBuf[0] = 0x72; + sendBuf[1] = 0x02; + sendBuf[2] = 0x23; + memcpy(sendBuf+3,&tmp,4); + memcpy(sendBuf+7,&tmp,4); + memcpy(sendBuf+11,&tmp,4); + memcpy(sendBuf+15,&tmp_data,2); + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetWeatherCmd:len:%d data:%s\r\n",len,data); + //"sk-proj-04ogvrZQqyaiv1OWw8OZT3BlbkFJG9Gyr8oFvRdmr3oXQNbX" + if(Check_CRC(data,len,crcvalue)) + { + + FILE *fp= fopen("/user/userdata/chatGPTkey.bin","wb+"); + if(fp) + { + fwrite(data,1,len,fp); + fclose(fp); + sendBuf[17] = 1; + } + else + { + sendBuf[17] = 2; + } + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } + else + { + sendBuf[17] = 0; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } +} + + +bool bin_Check_schedule(uint8_t *data,uint16_t len) +{ + uint16_t offset = 0; + uint16_t buf_len = 0; + uint16_t id_ = 1; + + // 打印函数开始及总长度信息 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bin_Check_schedule start, total len: %d", len); + + while (offset < len) + { + uint16_t id; + // 解析ID + memcpy_s(&id, 2, &data[offset], 2); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Parsing ID: 0x%04X at offset: %d", id, offset); + offset += 2; + if (offset >= len) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len after parsing ID, break"); + break; + } + + // 解析标题长度 + memcpy_s(&buf_len, 2, &data[offset], 2); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title length: %d at offset: %d", buf_len, offset); + offset += 2; + if (offset >= len) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len after parsing title length, break"); + break; + } + + // 解析标题内容 + char *title = (char*)malloc(buf_len + 1); + if (!title) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to allocate memory for title"); + break; + } + memset_s(title, buf_len + 1, 0, buf_len + 1); // 修正为实际分配的大小 + memcpy_s(title, buf_len + 1, &data[offset], buf_len); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Parsed title: [%s] (length: %d) at offset: %d", title, buf_len, offset); + + offset += buf_len; + + if (offset >= len) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len after parsing title, free title and break"); + free(title); + break; + } + + // 解析开始时间 + uint32_t timetemp_begin = 0; + memcpy_s(&timetemp_begin, 4, &data[offset], 4); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Start time: %u at offset: %d", timetemp_begin, offset); + offset += 4; + if (offset >= len) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len after parsing start time, free title and break"); + free(title); + break; + } + + // 解析结束时间 + uint32_t timetemp_end = 0; + memcpy_s(&timetemp_end, 4, &data[offset], 4); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "End time: %u at offset: %d", timetemp_end, offset); + offset += 4; + if (offset >= len) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len after parsing end time, free title and break"); + free(title); + break; + } + + // 解析附加信息长度 + memcpy_s(&buf_len, 2, &data[offset], 2); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Additional info length: %d at offset: %d", buf_len, offset); + offset += 2; + + if (buf_len == 0) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "No additional info, offset: %d, len: %d", offset, len); + // 调用设置函数 + if (offset == len) + { + Ble_Set_ScheduleInfo(id_, timetemp_begin, timetemp_end, title, "", true); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Set schedule info (complete), id_: %d", id_); + } + else + { + Ble_Set_ScheduleInfo(id_, timetemp_begin, timetemp_end, title, "", false); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Set schedule info (incomplete), id_: %d", id_); + } + + id_++; + free(title); + continue; + } + + if (offset >= len) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len before parsing additional info, free title and break"); + free(title); + break; + } + + // 解析附加信息 + char *str_ = (char*)malloc(buf_len + 1); + if (!str_) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to allocate memory for additional info"); + free(title); + break; + } + memset_s(str_, buf_len + 1, 0, buf_len + 1); // 修正为实际分配的大小 + memcpy_s(str_, buf_len + 1, &data[offset], buf_len); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Parsed additional info: [%s] (length: %d) at offset: %d", str_, buf_len, offset); + + offset += buf_len; + + // 调用设置函数 + if (offset == len) + { + Ble_Set_ScheduleInfo(id_, timetemp_begin, timetemp_end, title, str_, true); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Set schedule info with additional info (complete), id_: %d", id_); + } + else + { + Ble_Set_ScheduleInfo(id_, timetemp_begin, timetemp_end, title, str_, false); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Set schedule info with additional info (incomplete), id_: %d", id_); + } + + id_++; + + // 释放内存 + free(title); + free(str_); + + if (offset >= len) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "All data parsed, exit loop"); + break; + } + } + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bin_Check_schedule end, total parsed id count: %d", id_ - 1); + return true; +} +void APP_send_schedule_Cmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue) +{ + uint32_t tmp = 1; + uint16_t tmp_data = 1; + uint8_t sendBuf[19]; + memset(sendBuf,0,19); + sendBuf[0] = 0x72; + sendBuf[1] = 0x02; + sendBuf[2] = 0x24; + memcpy(sendBuf+3,&tmp,4); + memcpy(sendBuf+7,&tmp,4); + memcpy(sendBuf+11,&tmp,4); + memcpy(sendBuf+15,&tmp_data,2); + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetWeatherCmd:len:%d data:%s\r\n",len,data); + //"sk-proj-04ogvrZQqyaiv1OWw8OZT3BlbkFJG9Gyr8oFvRdmr3oXQNbX" + if(Check_CRC(data,len,crcvalue)) + { + + printf("11111111111111111\n"); + bool val = bin_Check_schedule(data,len); + printf("222222222222222222222\n"); + if(val) + { + sendBuf[17] = 1; + } + else + { + sendBuf[17] = 2; + } + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } + else + { + sendBuf[17] = 0; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } +} + +bool bin_Check_sos(uint8_t *data,uint16_t len) +{ + uint8_t SOS_num=data[0]; + uint32_t offset=1; + char *name=NULL; + char *number=NULL; + ble_sos_number_clean(); + + while (SOS_num) + { + SOS_num--; + uint8_t sex=data[offset]; + offset++; + if(offset>=len) + break; + uint8_t name_len=data[offset]; + offset++; + if(offset>=len) + break; + char *name=(char *)malloc(name_len+1); + if(name==NULL) + break; + memset_s(name,255,0,name_len+1); + memcpy_s(name,255,&data[offset],name_len); + offset+=name_len; + if(offset>=len) + break; + uint8_t number_len=data[offset]; + offset++; + if(offset>=len) + break; + char *number=(char *)malloc(number_len); + if(number==NULL) + break; + memset_s(number,255,0,number_len+1); + memcpy_s(number,255,&data[offset],number_len); + offset+=number_len; + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"sex:%d,name:%s,number:%s;\r\n",sex,name,number); + + ble_add_sos_number(sex,name,number); + + free(number); + number==NULL; + free(name); + name==NULL; + + if(offset>=len) + break; + + + } + if(number) + { + free(number); + } + if(name) + { + free(name); + } + + ble_sos_data_save(); + + return true; +} + +void APP_send_sos_Cmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue) +{ + uint32_t tmp = 1; + uint16_t tmp_data = 1; + uint8_t sendBuf[19]; + memset(sendBuf,0,19); + sendBuf[0] = 0x72; + sendBuf[1] = 0x02; + sendBuf[2] = 0x25; + memcpy(sendBuf+3,&tmp,4); + memcpy(sendBuf+7,&tmp,4); + memcpy(sendBuf+11,&tmp,4); + memcpy(sendBuf+15,&tmp_data,2); + + if(Check_CRC(data,len,crcvalue)) + { + + if(bin_Check_sos(data,len)) + { + sendBuf[17] = 1; + } + else + { + sendBuf[17] = 2; + } + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } + else + { + sendBuf[17] = 0; + sendBuf[18] = Calculate_CRC(sendBuf,18); + sendBleData(sendBuf,19); + } +} + +void GetGPSCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue) +{ + { + if(Check_CRC(data,len,crcvalue)) + { + if(len==4) + { + uint32_t timetamp=0; + memcpy_s((void*)&timetamp,4,data,4); + char path[128]={0}; + if(get_training_gps_path(path,timetamp,128)) + { + FILE *fp= fopen(path,"rb+"); + uint32_t file_size=0; + if(fp==NULL) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"打开文件失败 %s \r\n",path); + ble_data_type type_={0x02,0x4f,0,1,1}; + send_big_data(type_,NULL,0); + return ; + } + fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾 + file_size = ftell(fp); // 获取当前文件指针位置,即文件大小 + fseek(fp, 0, SEEK_SET); // 将文件指针移回文件开头 + fclose(fp); + + int num=(ble_nus_max_data_len-18); + if(num>482)num=482; + + char* buf = (char *)ym_malloc( file_size ); + if(buf==NULL){fclose(fp); return ;} + + int data_size= read_GPS_DATA(path,buf); + + uint32_t surplus_len=data_size; + uint32_t offset=0; + + uint32_t pack; + uint16_t pack_size=(ble_nus_max_data_len-18); + if(pack_size>482)pack_size=482; + + if(data_size%pack_size==0) + { + pack=data_size/pack_size; + } + else + { + pack=data_size/pack_size+1; + } + uint32_t pack_id=1; + while (surplus_len!=0) + { + if(surplus_len>=pack_size) + { + surplus_len=surplus_len-pack_size; + + ble_data_type type_={0x02,0x4f,data_size,pack,pack_id}; + send_big_data(type_,(char *)buf+offset,pack_size); + offset+=pack_size; + } + else + { + + ble_data_type type_={0x02,0x4f,data_size,pack,pack_id}; + send_big_data(type_,(char *)buf+offset,surplus_len); + break; + } + pack_id++; + } + + + free(buf); + + } + else + { + ble_data_type type_={0x02,0x4f,0,1,1}; + send_big_data(type_,NULL,0); + } + + } + else + { + ble_data_type type_={0x02,0x4f,0,1,1}; + send_big_data(type_,NULL,0); + } + } + else + { + ble_data_type type_={0x02,0x4f,0,1,1}; + send_big_data(type_,NULL,0); + } + + //send_big_data(1,NULL,0,0,1,1,,2); +} + //send_big_data(1,NULL,0,0,1,1,0x4f,2); +} +void App_delete_file(ble_read_data *buffer_handle,uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)// +{ + + uint8_t reply[2]={0}; + if (len<=2) + { + ble_reply_cmdarr(cmd,reply,2);//crc error + } + if(Check_CRC(data,len,crcvalue)) + { + uint8_t count=data[0]; + uint8_t type=data[1]; + if(type==2) + { + if(len-2!=count*2) + { + ble_reply_cmdarr(cmd,reply,1);//crc error + } + else + { + int offest=2; + for(int i=0;iage; + msg_userinfo.fat_time = p_userinfo->fat_time; + msg_userinfo.gender = p_userinfo->gender; + msg_userinfo.height = p_userinfo->height; + msg_userinfo.target_stand = p_userinfo->target_stand; + msg_userinfo.target_step = p_userinfo->target_step; + msg_userinfo.timeformat = p_userinfo->timeformat; + msg_userinfo.weight = p_userinfo->weight; + msg_userinfo.calorie=p_userinfo->calorie; + msg_userinfo.distance=p_userinfo->distance; + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"getUserInfo:!!age %d, fat %d, sex %d, height %d, stand %d, step %d , timeformat %d , weight %d !!!!!!\r\n", + p_userinfo->age, + p_userinfo->fat_time, + p_userinfo->gender, + p_userinfo->height, + p_userinfo->target_stand, + p_userinfo->target_step, + p_userinfo->timeformat, + p_userinfo->weight + ); + + set_user_data(&msg_userinfo); + + }else{ + ble_reply_cmd(USER_INFOR_CMD,0);//crc error + } +} + +//APP下发快捷辅助功能参数 +void Set_auxil_fun_parm(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)// +{ + uint8_t value[19]; + memset(value,0,19); + uint32_t tmp = 1; + uint16_t packtmp = 1; + value[0] =0x72; + value[1] =0x02; + value[2] =0x11; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&packtmp,2); + + if(Check_CRC(data,len,crcvalue)) + { + uint8_t paramCnt = data[0];//快捷辅助功能 按照协议文档要区分 + set_quick_auxiliary_paramters(paramCnt); + value[17] = 1; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + }else{ + value[17] = 0x00; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } +} +void getTRAIN_TARGETInfo(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)// +{ + +} +// #include "phoneaddressmodel.h" +//电话薄解析函数 +void Parse_addressbook_bin(uint8_t *data,uint16_t len) +{ + int num=data[0];//人数 + int offset=1; + while (num) + { + uint8 sex = data[offset]; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"性别: %d\r\n",sex); + offset=offset+1; + uint8 name_len=data[offset]; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"name_len %d\r\n",name_len); + char name[32]={0}; + if(name_len==0) + { + name_len=strlen("未知"); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"未知\r\n"); + } + else + { + memcpy(name,&data[offset+1],name_len); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"姓名: %s\r\n",name); + // for(int i=0;i482)pack_size=482; + + // if(data_len%pack_size==0) + // { + // pack=data_len/pack_size; + // } + // else + // { + // pack=data_len/pack_size+1; + // } + // uint32_t pack_id=1; + // uint32_t offset=0; + // while (surplus_len!=0) + // { + // if(surplus_len>=pack_size) + // { + // surplus_len=surplus_len-pack_size; + + + // ble_data_type type_={0x01,0x06,data_len,pack,pack_id}; + // send_big_data(type_,json_format+offset,pack_size); + + // //send_big_data(1,json_format+offset,pack_size,data_len,pack_id,pack,0x06,1); + // offset+=pack_size; + // } + // else + // { + + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack); + // ble_data_type type_={0x01,0x06,data_len,pack,pack_id}; + // send_big_data(type_,json_format+offset,surplus_len); + // //send_big_data(1,json_format+offset,surplus_len,data_len,pack_id,pack,0x06,1); + // break; + // } + // pack_id++; + // } + // cJSON_free(json_format); + +} +//获取当手表电池电量 +static void GetBatteryLevelCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[19]; + memset(value,0,19); + uint32_t tmp = 1; + uint16_t tmp_data = 1; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x07; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(Check_CRC(data,len,crcvalue)) + { + float voltage = 0.0F; + uint8_t power = 0; + power = battery_get_voltage(&voltage); + value[17] = power; + value[18] = Calculate_CRC(value,18); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n"); + sendBleData(value,19); + }else + { + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } +} +//设置开关//(弃) +static void SetSwitchMessCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[19]; + memset(value,0,19); + uint32_t tmp = 1; + uint16_t tmp_data = 1; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x08; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(Check_CRC(data,len,crcvalue)) + { + uint8_t switch_on = data[0];//0 关闭 1 开启 + if(switch_on) + { + //ble_ancs_client_cmd_setup_and_subscribe(g_ble_conn_id); + } + else + { + //ble_ancs_client_subscribe_notify(g_ble_conn_id,0); + } + + value[17] = 1; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + }else + { + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } +} +//撤销当前文件传输 1 OTA 2MP3 3表盘 3天气 5闹钟 +static void RemoveFileCmd(ble_read_data *buffer_handle,uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[19]; + memset(value,0,19); + uint32_t tmp = 1; + uint16_t tmp_data = 1; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x20; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(Check_CRC(data,len,crcvalue)) + { + uint8_t file_type= data[0];//1 ota 2 MP3 + + // TRANSMIT_DATA=TRANS_FREE; + // CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + + value[17] = 1; // + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + + cancel_recv_file(0); + + }else + { + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } +} + +//获取指定类型文件目录 +static void GetFileTypeCmd(uint8_t *data,uint16_t len) +{ + uint8_t value[19]; + memset(value,0,19); + uint32_t tmp = 1; + uint16_t tmp_data = 1; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x21; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(Check_CRC(data,len,1)) + { + uint8_t fileType = data[17];//2 mp3 3 表盘 + + value[17] = 1; //1 操作成功 2 操作失败 + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + }else + { + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } +} +//删除指定类型所有的文件 +static void DeleteFileTypeCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[19]; + memset(value,0,19); + uint32_t tmp = 1; + uint16_t tmp_data = 1; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x22; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(Check_CRC(data,len,crcvalue)) + { + value[17] = 1; //1 操作成功 2 操作失败 + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + }else + { + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } +} +//开启指定运动模式 +void reply_APP_OpenSportModeCmd(bool falg) +{ + + ble_data_type type_={0x01,0x0A,1,1,1}; + char data[1]={0}; + if(falg) + data[0]=1; + else + data[0]=2; + send_big_data(type_,data,1); + +} + + +static void OpenSportModeCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[19]; + memset(value,0,19); + uint32_t tmp = 1; + uint16_t tmp_data = 1; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x0A; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(Check_CRC(data,len,crcvalue)) + { + training_ble_data.sportType= data[0];//运动类型 0 健走 1跑步 2骑行 3 + training_ble_data.controlmd= START; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"开启指定运动%d\r\n",data[0]); + CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble)); + + // value[17] = 1; //1 操作成功 2 操作失败 + // value[18] = Calculate_CRC(value,18); + // sendBleData(value,19); + } + else + { + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } +} + +void reply_APP_SportStopModeCmd(uint16_t time) +{ + char data[3]={0}; + uint32_t data_len=3; + data[0]=1; + memcpy(&data[1],&time,2); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"发送训练状态数据%d %d\r\n",data[0],time); + ble_data_type type={0x01,0x0B,data_len,1,1}; + send_big_data(type,data,data_len); +} +//结束运动模式 +static void StopSportModeCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[19]; + memset(value,0,19); + uint32_t tmp = 1; + uint16_t tmp_data = 1; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x0B; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(Check_CRC(data,len,crcvalue)) + { + + training_ble_data.sportType= 4;//运动类型 0 健走 1跑步 2骑行 3 + training_ble_data.controlmd= END; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"结束运动\r\n"); + + CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble)); + // value[17] = 1; //1 操作成功 2 操作失败 + // value[18] = Calculate_CRC(value,18); + // sendBleData(value,19); + }else + { + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } +} +//设置语言 +static void SetLanguageCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[19]; + memset(value,0,19); + uint32_t tmp = 1; + uint16_t tmp_data = 1; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x0E; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(Check_CRC(data,len,crcvalue)) + { + uint8_t language = data[0]; + set_languaage(language); + value[17] = 1; //1 操作成功 2 操作失败 + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + }else + { + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } +} +//开启/关闭获取实时训练数据 +static void SetRealTimeDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[19]; + memset(value,0,19); + uint32_t tmp = 1; + uint16_t tmp_data = 1; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x11; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(Check_CRC(data,len,crcvalue)) + { + uint8_t autoSportData = data[0];//开关 1开启 0关闭 + /*进行开启关闭操作*/ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"进行开启关闭操作 %d\r\n", autoSportData); + set_traning_updata_auto( autoSportData); + + value[17] = 1; //1 操作成功 2 操作失败 + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + }else + { + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } +} +//设置训练数据采集频率 +static void SetRTDataFreCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[19]; + memset(value,0,19); + uint32_t tmp = 1; + uint16_t tmp_data = 1; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x14; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(Check_CRC(data,len,crcvalue)) + { + uint8_t Frequence = data[0];//频率单位是s + /*设置获取频率*/ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"设置获取频率 %d\r\n", Frequence); + set_traning_updata_freq(Frequence); + + value[17] = 1; //1 操作成功 2 操作失败 + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + }else + { + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } +} +//获取实时训练数据 +// void getSportData(char *buf) +// { +// cJSON *dataJSON = cJSON_CreateObject(); +// cJSON_AddNumberToObject(dataJSON,"st",1637825067); +// cJSON_AddNumberToObject(dataJSON,"hr",120); +// cJSON_AddNumberToObject(dataJSON,"ca",3657); +// cJSON_AddNumberToObject(dataJSON,"di",5274); +// cJSON_AddNumberToObject(dataJSON,"stp",1234); +// cJSON_AddNumberToObject(dataJSON,"ti",3); +// char *json_format = cJSON_PrintUnformatted(dataJSON); +// WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s",json_format); +// cJSON_Delete(dataJSON); +// int dataLen = strlen(json_format); +// memcpy(buf,json_format,dataLen); +// return; +// } +void sendRealTimeDataToAPP(uint8_t flag) +{ + if(flag == 0)//校验失败 + { + ble_data_type type_={0x01,0x0f,0,1,1}; + send_big_data(type_,NULL,0); + + //send_big_data(0,NULL,0,0,1,1,0x0f,1); + + }else + { + training_ble_data.sportType= 4;//运动类型 0 健走 1跑步 2骑行 3 + training_ble_data.controlmd= SENDDATA; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"发送运动实时数据\r\n"); + + CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble)); + + } + +} +//获取实时训练数据 +static void GetRealTimeDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + + if(Check_CRC(data,len,crcvalue)) + { + sendRealTimeDataToAPP(1); + }else + { + sendRealTimeDataToAPP(0); + } +} +//设置最高心率提醒 +static void SetMaxHrRemindCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[19]; + memset(value,0,19); + uint32_t tmp = 1; + uint16_t tmp_data = 1; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x15; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(Check_CRC(data,len,crcvalue))// + { + uint8_t maxHr = data[0]; + if(maxHr > 250)maxHr = 250;//最高心率是250 + else if(maxHr <= 0) maxHr = 0; + set_traning_heart_max(maxHr); + //设置255 表示心率提醒关闭 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"设置最高心率提醒 %d\r\n",maxHr); + value[17] = 1; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + }else + { + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } + +} + +void reply_APP_SportPasueResetCmd(uint16_t time) +{ + char data[3]={0}; + uint32_t data_len=3; + data[0]=1; + memcpy(&data[1],&time,2); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"发送训练状态数据%d %d\r\n",data[0],time); + ble_data_type type={0x01,0x16,data_len,1,1}; + send_big_data(type,data,data_len); +} + + +//训练暂停/恢复 +static void GetSportPasueResetCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[19]; + memset(value,0,19); + uint32_t tmp = 1; + uint16_t tmp_data = 1; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x16; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(Check_CRC(data,len,crcvalue))// + { + uint8_t PauseStop = data[0];//0 暂停 1恢复 + if(PauseStop==0) + { + training_ble_data.sportType= 4;//运动类型 0 健走 1跑步 2骑行 3 + training_ble_data.controlmd= STOP; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"运动暂停\r\n"); + + CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble)); + } + else + { + training_ble_data.sportType= 4;//运动类型 0 健走 1跑步 2骑行 3 + training_ble_data.controlmd= RECOVER; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"运动恢复\r\n"); + + CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble)); + + } + // value[17] = 1; + // value[18] = Calculate_CRC(value,18); + // sendBleData(value,19); + }else + { + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } + +} +//发送当前表盘到app + +void Watch_SendDial_ToAppCmd(void) +{ + + uint16_t dialNum =ble_get_dial_id(); + ble_data_type type_={0x01,0x17,2,1,1}; + send_big_data(type_,(char *)&dialNum,2); +} + +static void SendDialToAppCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[20]; + memset(value,0,20); + uint32_t tmp = 1; + uint32_t datalen = 2; + uint16_t tmp_data = 2; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x17; + memcpy(value+3,&tmp,4); + memcpy(value+7,&datalen,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(Check_CRC(data,len,crcvalue))// + { + uint16_t dialNum =ble_get_dial_id(); + memcpy(&value[17],&dialNum,2); + value[19] = Calculate_CRC(value,19); + sendBleData(value,20); + }else + { + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } + +} +//获取手表当前状态 +static void GetWatchStatusCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[20]; + memset(value,0,20); + uint32_t tmp = 1; + uint16_t tmp_data = 1; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x19; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + + //0空闲状态 9 usb状态 10 运动训练状态 + uint8_t watchStatus = 0; + + if(uapi_dev_runtime_get_train_status()) + watchStatus=10; + + value[17] = watchStatus; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); +} +//获取手表屏幕参数 +static void GetScreenParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[21]; + memset(value,0,21); + uint32_t tmp = 1; + uint32_t datalen = 3; + uint16_t tmp_data = 3; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x1a; + memcpy(value+3,&tmp,4); + memcpy(value+7,&datalen,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + + int brigntess = get_brigthness(); + int screen_time =get_ScreenDuration(); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetScreenParamCmd get_ScreenDuration %d \r\n", screen_time); + switch (get_ScreenDuration()/1000) + { + case 5: + screen_time = 0; + break; + case 10: + screen_time = 1; + break; + case 15: + screen_time = 2; + break; + case 30: + screen_time = 3; + break; + case 60: + screen_time = 4; + break; + case 60*5: + screen_time = 5; + break; + default: + screen_time = 0; + break; + } + bool wrist_on = Get_RaiseToWake(); + value[17] = brigntess; + value[18] = screen_time; + value[19] = wrist_on; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetScreenParamCmd %d %d %d \r\n",brigntess,screen_time,wrist_on); + value[20] = Calculate_CRC(value,20); + sendBleData(value,21); +} + +//App删除表盘 (仅W4手表) +static void DeleteDialUidCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[20]; + memset(value,0,20); + uint32_t tmp = 1; + uint16_t tmp_data = 1; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x1b; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(Check_CRC(data,len,crcvalue)) + { + uint16_t deleteDial = 0;//删除的表盘UID + deleteDial=data[0]+data[1]*256; + + if(ble_delete_dial(deleteDial)) + value[17] = 1;// 1删除成功 2 没有改资源 0指令校验失败 + else + value[17] = 2;// 1删除成功 2 没有改资源 0指令校验失败 + + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + }else + { + + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } + + +} + +//获取手表声音与振动参数 Sound and Vibration +static void GetSoundVibrationCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[23]; + memset(value,0,23); + uint32_t tmp = 1; + uint32_t datalen = 5; + uint16_t tmp_data = 5; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x1c; + memcpy(value+3,&tmp,4); + memcpy(value+7,&datalen,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(Check_CRC(data,len,crcvalue)) + { + + int sys_volume = Get_SystemVolume(); + int ring_volume = Get_CallVolume(); + int media_volume = Get_CallVolume(); + uint8_t vibrate_on = get_vibrationremiander(); + + bool bell_on = get_SilentMode(); + + value[17] = sys_volume;// + value[18] = ring_volume;// + value[19] = media_volume;// + value[20] = bell_on;// + value[21] = vibrate_on;// + value[22] = Calculate_CRC(value,22); + sendBleData(value,23); + }else + { + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } + + +} + +//APP获取手表辅助功能参数Auxiliary functions +static void GetWatchAuxFuncCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[23]; + memset(value,0,23); + uint32_t tmp = 1; + uint16_t tmp_data = 1; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x1d; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(Check_CRC(data,len,crcvalue)) + { + uint8_t paramCmt = 0;//辅助功能 0 + paramCmt = get_quick_auxiliary_paramters(); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"paramCmt:%d\r\n",paramCmt); + value[17] = paramCmt;// + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + }else + { + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } + + +} +//APP获取手表心率设置 +static void GetHrGetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[22]; + memset(value,0,22); + uint32_t tmp = 1; + uint32_t datalen = 4; + uint16_t tmp_data = 4; + + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x1e; + memcpy(value+3,&tmp,4); + memcpy(value+7,&datalen,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(Check_CRC(data,len,crcvalue)) + { + + msg_get_heart_set_param_info_t heart_param; + Get_heart_cmd(&heart_param); + + value[17] = heart_param.frequence;// + value[18] = heart_param.remind_on;// + value[19] = heart_param.max_min;// + value[20] = heart_param.heart;// + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d ",value[17],value[18],value[19],value[20]); + + value[21] = Calculate_CRC(value,21); + sendBleData(value,22); + }else + { + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } + + +} +//APP获取手表血氧设置 +static void GetSpo2GetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[21]; + memset(value,0,21); + uint32_t tmp = 1; + uint32_t datalen = 3; + uint16_t tmp_data = 3; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x1f; + memcpy(value+3,&tmp,4); + memcpy(value+7,&datalen,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(Check_CRC(data,len,crcvalue)) + { + msg_get_spo2_set_param_info_t SO2_param; + Get_oxygen_cmd(&SO2_param); + + uint8_t spo2freq = SO2_param.frequence;//监测频率 + uint8_t spo2Switch = SO2_param.remind_on;//心率提醒开关 + uint8_t spo2MaxMin = SO2_param.spo2;//高于或低于 + + value[17] = spo2freq;// + value[18] = spo2Switch;// + value[19] = spo2MaxMin;// + + value[20] = Calculate_CRC(value,20); + sendBleData(value,21); + }else + { + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } + + +} +void cameraSend(uint8_t flag)//2进行手势拍照 3退出拍照界面 +{ + uint8_t value[19]; + memset(value,0,19); + uint32_t tmp = 1; + uint16_t tmp_data = 1; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x23; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + value[17] = flag;// + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); +} +//手势拍照协议 +static void carmeraCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[19]; + memset(value,0,19); + uint32_t tmp = 1; + uint16_t tmp_data = 1; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x23; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(Check_CRC(data,len,crcvalue)) + { + uint8_t carmera_on = data[0]; //0退出拍照界面 1进入拍照界面 + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"进入拍照\r\n"); + //需要加界面弹窗提示 + if(carmera_on == 1)//进入拍照界面 + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"进入拍照\r\n"); + CustomEventPublish(TOPIC_EVENT_ENTER_CMAERA,NULL,0); + }else{//退出拍照弹窗界面 + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"退出拍照\r\n"); + CustomEventPublish(TOPIC_EVENT_CANCEL_CMAERA,NULL,0); + } + value[17] = 1;// + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + }else + { + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } +} + +//APP获取手表喝水提醒设置 +static void GetDrinkParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[19]; + memset(value,0,19); + uint32_t tmp = 1; + uint16_t tmp_data = 1; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x24; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(1) + { + msg_drink_info_t drink_on_; + ble_get_drink_remind(&drink_on_); + value[17] = drink_on_.drink_on;// + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } +} + +//APP发送恢复出厂设置 +static void GetFactoryCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[19]; + memset(value,0,19); + uint32_t tmp = 1; + uint16_t tmp_data = 1; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x25; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(Check_CRC(data,len,crcvalue)) + { + value[17] = 1;// + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + }else + { + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } + if( value[17]) + { + do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_RESTORE_FACTORY_SETTING, NULL, 0); + } +} +//APP发送重新启动 +static uint8_t power_buf[2]={0}; +static void GetResetCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[19]; + memset(value,0,19); + uint32_t tmp = 1; + uint16_t tmp_data = 1; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x26; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(Check_CRC(data,len,crcvalue)) + { + + value[17] = 1;// + value[18] = Calculate_CRC(value,18); + power_buf[0]=REBOOT; + CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,power_buf,2); + sendBleData(value,19); + + }else + { + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } +} +//APP发送关机 +static void GetPowerOffCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[19]; + memset(value,0,19); + uint32_t tmp = 1; + uint16_t tmp_data = 1; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x27; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(Check_CRC(data,len,crcvalue)) + { + + value[17] = 1;// + value[18] = Calculate_CRC(value,18); + power_buf[0]=SHUTDOWN; + CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,power_buf,2); + sendBleData(value,19); + }else + { + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } +} + + +//app发送公英制单位 +static void GetMetricCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[19]; + memset(value,0,19); + uint32_t tmp = 1; + uint16_t tmp_data = 1; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x28; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(Check_CRC(data,len,crcvalue)) + { + uint8_t kmileter = data[0];//公英制单位 0 是公英制 1英制单位 + value[17] = 1;// + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + }else + { + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } +} + +//app获取久坐设置 +static void GetSedentParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[24]; + memset(value,0,24); + uint32_t tmp = 1; + uint32_t datalen = 6; + uint16_t tmp_data =6; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x31; + memcpy(value+3,&tmp,4); + memcpy(value+7,&datalen,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(1) + { + msg_sedent_set_param_info_t data; + get_sedent_param( &data); + + uint8_t on = data.sedent_on;//作息时间设定 0关闭 1开启 1 + uint32_t time = data.sedent_time;//时间 4 + uint8_t frequenc = data.frequenc;//间隔 1 + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%04X %d %d\r\n",time,frequenc,on); + value[17] = on; + memcpy_s(&value[18],4,&time,4); + + value[22] = frequenc; + value[23] = Calculate_CRC(value,23); + sendBleData(value,24); + }else + { + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } +} + + +static void GetSleepParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[24]; + memset(value,0,24); + uint32_t tmp = 1; + uint32_t datalen = 6; + uint16_t tmp_data =6; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x29; + memcpy(value+3,&tmp,4); + memcpy(value+7,&datalen,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(1) + { + msg_get_sleep_param_info_t data; + + ble_get_sleep_remind(&data); + uint8_t sleepTime = data.schedule;//作息时间设定 0关闭 1开启 + uint8_t bedTimeHour = data.bedtime_hour;//就寝时间 + uint8_t bedTimeMin = data.bedtime_min;//就寝时间 + uint8_t wakeTimeHour = data.waketime_hour;//起床时间 + uint8_t wakeTimeMin = data.waketime_min;//起床时间 + uint8_t bedTimeOn = data.bedtime_alarm;//就寝前20分钟提醒时间 + + value[17] = sleepTime; + value[18] = bedTimeHour; + value[19] = bedTimeMin; + value[20] = wakeTimeHour; + value[21] = wakeTimeMin; + value[22] = bedTimeOn; + value[23] = Calculate_CRC(value,23); + sendBleData(value,24); + }else + { + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } +} + +//app获取所有表盘UID +static void GetAllDialUidCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + + + if(Check_CRC(data,len,crcvalue)) + { + int dial_num=ble_get_dial_num(); + + uint16_t data_size=1+dial_num*2; + uint32_t temp_data_size=data_size; + char *dail_uid_buf=(char *)ym_malloc(data_size); + dail_uid_buf[0]=(uint8_t)dial_num; + + if(dial_num *2 !=get_all_dial_id(dail_uid_buf+1,dial_num*2)) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetAllDialUidCmd dial_num %d err\r\n",dial_num); + } + else + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetAllDialUidCmd yes\r\n"); + + } + ble_data_type type_={0x01,0x2a,temp_data_size,1,1}; + send_big_data(type_,dail_uid_buf,data_size); + //send_big_data(0,dail_uid_buf,data_size,temp_data_size,1,1,0x2a,1); + + free(dail_uid_buf); + + }else + { + ble_reply_cmd(cmd,0); + } +} +//app获取目标步数设置 +static void GetTargetStepCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[25]; + memset(value,0,25); + uint32_t tmp = 1; + uint32_t datalen = 7; + uint16_t tmp_data = 7; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x2b; + memcpy(value+3,&tmp,4); + memcpy(value+7,&datalen,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(1) + { + uint32_t targetStep = get_goal_stepcount();//目标步数 4字节 + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"目标步数:%d\r\n",targetStep); + + uint8_t ringOn = get_step_goal_notify_switch();//铃声提醒 + uint8_t vibration = get_step_goal_notify_switch();//振动提醒 + uint8_t notify = get_step_goal_notify_switch();//通知提醒 + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"提醒开关:%d %d %d \r\n",ringOn,vibration,notify); + + memcpy(&value[17],&targetStep,4);//目标步数 + + value[21] = ringOn;//铃声提醒 + value[22] = vibration;//振动提醒 + value[23] = notify;//通知提醒 + + value[24] = Calculate_CRC(value,24); + sendBleData(value,25); + }else + { + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } +} + +//app其他目标设置 +static void GetTargetOtherCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[26]; + memset(value,0,26); + uint32_t tmp = 1; + uint32_t datalen = 8; + uint16_t tmp_data = 8; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x2c; + memcpy(value+3,&tmp,4); + memcpy(value+7,&datalen,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(1) + { + uint16_t targetKcal = 0;//目标卡路里 + uint8_t targetKm = 0;//目标里程 + uint8_t targetstand = 0;//目标站立 + uint8_t targetfat = 0;//目标燃脂时间 + uint8_t ringTime = 0;//铃声提醒 + uint8_t vibration = 0;//振动提醒 + uint8_t notify = 0;//通知提醒 + + targetKcal = get_goal_caloriescount(); + targetKm = get_goal_discount(); + targetstand =get_goal_standupcount(); + targetfat = get_goal_durationcount(); + + ringTime = get_other_goal_notify_switch (); + vibration = get_other_goal_notify_switch(); + notify = get_other_goal_notify_switch(); + + memcpy(&value[17],&targetKcal,2);//目标卡路里 + value[19] = targetKm;// + value[20] = targetstand;// + value[21] = targetfat;// + + value[22] = ringTime;// + value[23] = vibration;// + value[24] = notify;//通知提醒 + value[25] = Calculate_CRC(value,25); + sendBleData(value,26); + }else + { + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } +} + +static void GetPasswordCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[19]; + memset(value,0,19); + uint32_t tmp = 1; + uint32_t datalen = 1; + uint16_t tmp_data = 1; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x2f; + memcpy(value+3,&tmp,4); + memcpy(value+7,&datalen,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(1) + { + uint8_t data=ble_get_password(); + memcpy(&value[17],&data,1);// + + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + }else + { + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } +} + +static void GetmsgconfigCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[36]; + memset(value,0,36); + uint32_t tmp = 1; + uint32_t datalen = 18; + uint16_t tmp_data = 18; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x33; + memcpy(value+3,&tmp,4); + memcpy(value+7,&datalen,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(1) + { + uint8_t data_buf[filtration_data_count]; + uint8_t data_buf_len=0; + // memset(data,1,18); + filtration_on_get((uint8_t*)data_buf,&data_buf_len); + // printf("data_buf_len %d\r\n",data_buf_len); + memcpy(&value[17],data_buf,data_buf_len);// + value[17+data_buf_len] = Calculate_CRC(value,17+data_buf_len); + sendBleData(value,18+data_buf_len); + }else + { + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } +} + + + + +bool get_AI_PATH_and_size(char *path,uint32_t *size) +{ + + memcpy((void*)path,ble_get_ai_audio_path_str(),strlen(ble_get_ai_audio_path_str())); + + FILE *fp= fopen(path,"r+"); + if(fp) + { + fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾 + *size = ftell(fp); // 获取当前文件指针位置,即文件大小 + fseek(fp, 0, SEEK_SET); // 将文件指针移回文件开头 + fclose(fp); + + return true; + } + else + { + return false; + } +} +#define SEND_AIVOICE_PACKAGE_DELAY 15 +//APP获取录音文件,录音文件上传 +static void GetAiRecordCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[19]; + memset(value,0,19); + uint32_t tmp = 1; + uint32_t datalen = 1; + uint16_t tmp_data = 1; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x2f; + memcpy(value+3,&tmp,4); + memcpy(value+7,&datalen,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + char file_name[64]={0}; + uint32_t file_size=0; + if(get_AI_PATH_and_size(file_name,&file_size)) + { + int num=(ble_nus_max_data_len-18); + if(num>482)num=482; + + char *data= (char *)malloc(num+1); + + uint16_t read_size=0; + FILE *fp=fopen(file_name,"rb+"); + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetAiRecordCmd size %d\r\n",file_size); + uint32_t pack=file_size/num+1; + uint32_t pack_id=1; + if(fp==NULL) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"fopen fail %s\r\n",file_name); + goto GetAiRecordFail; + } + do + { + memset_s(data,num+1,0,num+1); + read_size=fread(data,1,num,fp); + + if(read_size!=0) + { + ble_data_type type_={0x01,0x34,file_size,pack,pack_id}; + send_big_data(type_,data,read_size); + } + pack_id++; + + + } while (read_size==num); + free(data); + fclose(fp); + }else + { + GetAiRecordFail: + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } +} + +static void GetSOSDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint32_t data_len=0; + uint8_t *bin_data = ble_get_sos_all_data_malloc(&data_len); + if(bin_data==NULL) + { + ble_data_type type_={0x01,0x36,0,1,1}; + send_big_data(type_,NULL,0); + return; + } + uint32_t surplus_len=data_len; + uint32_t offset=0; + + uint32_t pack; + uint16_t pack_size=(ble_nus_max_data_len-18); + if(pack_size>482)pack_size=482; + + if(data_len%pack_size==0) + { + pack=data_len/pack_size; + } + else + { + pack=data_len/pack_size+1; + } + uint32_t pack_id=1; + while (surplus_len!=0) + { + if(surplus_len>=pack_size) + { + surplus_len=surplus_len-pack_size; + + ble_data_type type_={0x01,0x36,data_len,pack,pack_id}; + send_big_data(type_,(char *)bin_data+offset,pack_size); + offset+=pack_size; + } + else + { + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack); + ble_data_type type_={0x01,0x36,data_len,pack,pack_id}; + send_big_data(type_,(char *)bin_data+offset,surplus_len); + break; + } + pack_id++; + } + free(bin_data); + + +} +//AI录音已经就绪 +static void AiIsReadyCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + + if(data[0]) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AiIsReadyCmd succ\r\n"); + }else + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AiIsReadyCmd fail\r\n"); + } +} +//app发送解除配对消息 +static void UnpairMessCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[19]; + memset(value,0,19); + uint32_t tmp = 1; + uint32_t datalen = 1; + uint16_t tmp_data = 1; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x2d; + memcpy(value+3,&tmp,4); + memcpy(value+7,&datalen,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(Check_CRC(data,len,crcvalue)) + { + + value[17] = 1;// + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + }else + { + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } +} + +uint8_t is_connect_synchronization_time=0; + +//app发送同步数据结束消息 +static void GetSynDataEndCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[19]; + memset(value,0,19); + uint32_t tmp = 1; + uint32_t datalen = 1; + uint16_t tmp_data = 1; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x2e; + memcpy(value+3,&tmp,4); + memcpy(value+7,&datalen,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(Check_CRC(data,len,crcvalue)) + { + value[17] = 1;// + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + uapi_save_runtime_log(RUNTIME_LOG_BLE_APP_SYN_END); + + if(is_connect_synchronization_time) + { + watch_synchronization_time(); + } + else + { + if(g_ble_conn_id) + { + is_connect_synchronization_time=1; + } + + } + + + + uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_SLOW); + + }else + { + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } +} + +//同步基础训练历史数据 training history data +static void Send_json_Data_Cmd(uint8_t day,uint16_t pack_size,uint8_t id) +{ + + + char *json_format = NULL; + switch (id) + { + case 0x49: + json_format=struct_to_json_buf_malloc_(day); + break; + case 0x01: + json_format=struct_to_json_buf_malloc_Alarm(); + break; + case 0x21: + json_format=dir_to_json_buf_malloc(day); + break; + + default: + break; + } + + if(json_format == NULL) return ; + + uint32_t data_len = strlen(json_format); + uint32_t surplus_len=data_len; + uint32_t pack; + if(data_len%pack_size==0) + { + pack=data_len/pack_size; + } + else + { + pack=data_len/pack_size+1; + } + uint32_t pack_id=1; + uint32_t offset=0; + while (surplus_len!=0) + { + if(surplus_len>=pack_size) + { + surplus_len=surplus_len-pack_size; + + ble_data_type type_={0x01,id,data_len,pack,pack_id}; + send_big_data(type_,json_format+offset,pack_size); + + //send_big_data(1,json_format+offset,pack_size,data_len,pack_id,pack,id,1); + offset+=pack_size; + } + else + { + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack); + ble_data_type type_={0x01,id,data_len,pack,pack_id}; + send_big_data(type_,json_format+offset,surplus_len); + //send_big_data(1,json_format+offset,surplus_len,data_len,pack_id,pack,id,1); + break; + } + pack_id++; + } + cJSON_free(json_format); +} + +//同步数据结束完成 +static void synEndDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + uint8_t value[18+1]; + memset(value,0,18+1); + uint32_t tmp = 1; + uint32_t tmpToall = 0; + uint16_t tmp_data = 0; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x2e; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmpToall,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + if(Check_CRC(data,len,crcvalue)) + { + value[17] = 1; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + + uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_SLOW); + + }else + { + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } +} + + + + +//01类型 +/* +cmd: 指令uint16_t 协议01 02 拼接成0x0102 去协议文档对应是切换表盘 +*data:数据,不包含前面17个字节的包头和最后一位的校验和 +len 就是data的长度 +*totaldata:总的数据内容 包含包头和校验预览做接口是用 如果要计算totaldata的长度直接是len+17+1 就是加上包头和校验和 +crcvalue;数据的校验和 不包含包头和校验和的计算结果 +*/ +// 73 01 31 01 00 00 00 01 00 00 00 01 00 00 00 00 00 2 FE +void SetDMPModeCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置入库模式 0关闭 1电信 2-255移动 +{ + uint8_t value[19]; + memset(value,0,19); + uint32_t tmp = 1; + value[0] =0x72; + value[1] =0x01; + value[2] =0x31; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp,2); + + if(Check_CRC(data,len,crcvalue)) + { + + int state = 0; + state = data[0]; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"data[0];%d state:%d\r\n",data[0],state); + Set_DmpChangeMode(state); + value[17] = 1; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + }else{ + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } +} +// 73 01 32 01 00 00 00 00 00 00 00 01 00 00 00 00 00 crc + +void GetDMPModeCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取入库模式 0关闭 1电信 2-255移动 +{ + uint8_t value[19]; + memset(value,0,19); + uint32_t tmp = 1; + value[0] =0x72; + value[1] =0x01; + value[2] =0x32; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp,2); + + if(Check_CRC(data,len,crcvalue)) + { + int state = Get_DmpChangeMode(); + value[17] = state; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + }else{ + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } +} +void type2AE3Data(ble_read_data *buffer_handle,uint8_t *cmd_buf ,uint8_t *data,uint16_t datalen,uint8_t *totaldata,uint8_t crcvalue) +{ + uint16_t cmd = cmd_buf[1]*256+cmd_buf[2]; + #ifdef BLE_LOG + + #endif + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"type2AE3Data:0x%04X\r\n",cmd); + // uint8_t typeID = cmd_buf[2]; + switch (cmd) + { + case SEND_UPPAIR_CMD://清除配对指令 + clearPaireCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case SWITCH_DIAL_CMD://表盘切换 + switchDialCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case ABOUT_DEV_CMD://关于本机内容 + aboutDeviceCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case FIND_WATCH_CMD://查找手表 + findWatchCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case GET_SD_SPACE_CMD://获取sdk的剩余空间 + GetSDSpaceCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case GET_CURR_DATA_CMD://获取当前数据 卡路里 + GetCurDataCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case GET_BATTERY_LEVEL_CMD://获取手表电池电量 + GetBatteryLevelCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case SWITCH_MESS_CMD://开关消息推送功能 + SetSwitchMessCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case REVOKE_CURR_FILE_TRANS_CMD://撤销文件传输 + RemoveFileCmd(buffer_handle,cmd,data,datalen,totaldata,crcvalue); + break; + case DELETE_SPECIF_TYPE_FILE_CMD://删除指定类型的所有文件 + DeleteFileTypeCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case SWITCH_SPORT_MODE_CMD://开启指定运动模式 + OpenSportModeCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case STOP_SPORT_MODE_CMD://结束运动模式 + StopSportModeCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case SET_LANGUGAE_CMD://设置语言 + SetLanguageCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case GET_REAL_HEART_CMD://获取实时训练数据 + GetRealTimeDataCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case SWITCH_GET_REAL_HEART_CMD://开启/关闭自动获取实时训练数据 + SetRealTimeDataCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case SET_REAL_DATA_FREQ_CMD://设置训练实时数据采集频率 + SetRTDataFreCmd(cmd,data,datalen,totaldata,crcvalue); + break; + + case SET_MAX_HR_REMID_CMD://设置最高心疼提醒 255关闭 + SetMaxHrRemindCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case SPORT_PAUSE_RESET_CMD://训练暂停/恢复 + GetSportPasueResetCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case SEND_CURR_DIAL_TOAPP_CMD://发送当前表盘 + SendDialToAppCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case SEND_CURR_STATUS_CMD: //获取手表当前状态 + GetWatchStatusCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case GET_WATCH_LCD_PARAM_CMD: //获取手表屏幕参数 + GetScreenParamCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case DELETE_DIAL_CMD://删除表盘UID + DeleteDialUidCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case GET_WATCH_VOICE_VIBRATE_CMD://获取手表声音与振动参数 + GetSoundVibrationCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case GET_WATCH_AUXIL_FUN_PARAM_CMD://获取手表辅助功能参数 + GetWatchAuxFuncCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case GET_WATCH_HR_SET_PARAM_CMD://获取手表心率设置 + GetHrGetParamCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case GET_WATCH_SPO2_SET_PARAM_CMD://获取手表血氧设置 + GetSpo2GetParamCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case GET_GESTURE_CARMERA_CMD://获取手势拍照 + carmeraCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case GET_DRINK_SWITCH_CMD://获取喝水提醒设置 + GetDrinkParamCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case FACTORY_SET_CMD://app发送恢复出厂设置 + GetFactoryCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case RESET_WATCH_CMD://app发送重启指令 + GetResetCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case POWER_OFF_CMD://app发送关机 + GetPowerOffCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case KM_MILE_CMD://app设置手表公英制单位 + GetMetricCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case SLEEP_GET_CMD://app获取睡眠设置 + GetSleepParamCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case GET_SEDENT_CMD: + GetSedentParamCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case DELETE_ALL_DILA_CMD://app所有表盘UID + GetAllDialUidCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case GET_TARGET_STEP_CMD://app获取目标步数设置 + GetTargetStepCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case GET_OTHER_TARGET_CMD://app获取其他目标 + GetTargetOtherCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case GET_UNPAIR_CMD://发送解除配对消息 + UnpairMessCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case SYN_DATA_END_CMD: //app发送同步数据结束消息 + GetSynDataEndCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case GET_PASSWORD_CMD: //获取手表密码 + GetPasswordCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case SYN_GET_MSG_CONFIG_CMD: //获取手表消息设置 + GetmsgconfigCmd(cmd,data,datalen,totaldata,crcvalue); + break; + + case APP_GET_AI_PCM_DATA_CMD: + GetAiRecordCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case APP_GET_SOS_DATA_CMD: + GetSOSDataCmd(cmd,data,datalen,totaldata,crcvalue); + break; + + case GET_SPECIF_TYPE_FILE_CMD://获取指定类型文件目录 + case AI_IS_READ_DATA_CMD: + case SYN_HEART_HISTORY_DATA_CMD://同步心率历史数据 + case SYN_SPO2_HISTORY_DATA_CMD://同步血氧历史数据 + case SYN_STEP_HISTORY_DATA_CMD: //同步步数历史数据 + case SYN_FAT_BURN_HISTORY_DATA_CMD://同步燃脂时间数据 + case SYN_STAND_HISTORY_DATA_CMD://同步站立历史数据 + case SYN_KCAL_HISTORY_DATA_CMD://同步卡路里历史数据 + case SYN_DIS_HISTORY_DATA_CMD://同步距离历史数据 + case SYN_BASIC_TRANIN_HISTORY_DATA_CMD://同步基础训练历史数据 + case SYN_SLEEP_HISTORY_DATA_CMD://睡眠历史数据 + case ALARM_CMD://获取手表闹钟//同步闹钟 + + readDevDataBle(cmd,data,datalen,totaldata,crcvalue); + break; + case SET_DMP_MODE_CMD://0X0131 + SetDMPModeCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case GET_DMP_MODE_CMD://0X0132 + GetDMPModeCmd(cmd,data,datalen,totaldata,crcvalue); + break; + default: + break; + } + + +} + + +//05 类型 +void typeHexFiveData(uint8_t *buf_cmd,uint8_t *data,uint16_t datalen) +{ + uint16_t typeID = buf_cmd[1]*256+buf_cmd[2]; + switch (typeID) //ID + { + case FIND_PHONE_CMD://查找手机 + // (data,datalen); + break; + case GET_CURR_TIME_CMD://手表获取系统时间 + // getPhoneInfo(data,datalen); + break; + case SEND_PARI_SUCESS_CMD: + // GetUTCtime(data,datalen);//获取时间app下发的时间进行解析 + break; + case GET_TRANS_END_CMD: + // getPhoneInfo_test(); + break; + case SEND_FACTORY_RECORD_CMD: + break; + case REQUEST_EPO_FILE_CMD: + break; + case SEND_TRAIN_STATUS_CMD: + break; + default: + break; + } +} + + +#define STEP_DATA_LEN 8 +#define KCAL_DATA_LEN 8 +#define DIS_DATA_LEN 8 +#define STAND_DATA_LEN 8 +#define FATTIME_DATA_LEN 6 +#define HEART_DATA_LEN 5 +#define SPO2_DATA_LEN 5 +uint8_t bleSendTypeID=0; //发送的数据类型 +//发送读出来的设备数据to APP +uint16_t max_mtu_szie_data_len = 200; +uint32_t EACH_DATA_LEN=0;//每种数据类型的的长度 + + +void Send_Sleep_Bin_Data(uint8_t day, uint16_t num) +{ + + char *data=NULL; + uint32_t file_size=1; + uint8_t sleep_count = ble_get_sleep_data_dir(&file_size,day); + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Send_Sleep_Bin_Data file_size : %d \r\n",file_size); + + data=(char *)malloc(file_size); + + if(data==NULL) + { + return; + } + + memset(data,0,file_size); + + data[0]=sleep_count; + + if(data==NULL) + { + #ifdef BLE_LOG + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"malloc\r\n"); + #endif + + return; + } + ble_get_sleep_data(file_size,day,(uint8_t*)data+1); + + + if(data==NULL || file_size==1) + { + ble_data_type type_={0x01,0x4b,0,1,1}; + send_big_data(type_,NULL,0); + //send_big_data(1,NULL,0,0,1,1,0x4b,1); + return; + } + + uint32_t surplus_len=file_size; + uint32_t pack; + if(file_size%num==0) + { + pack=file_size/num; + } + else + { + pack=file_size/num+1; + } + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack); + uint32_t pack_id=1; + uint32_t offset=0; + while (surplus_len!=0) + { + if(surplus_len>=num) + { + surplus_len=surplus_len-num; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",num,file_size,pack_id,pack); + + ble_data_type type_={0x01,0x4b,file_size,pack,pack_id}; + send_big_data(type_,data+offset,num); + offset+=num; + } + else + { + //#ifdef BLE_LOG + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",surplus_len,file_size,pack_id,pack); + //#endif + ble_data_type type_={0x01,0x4b,file_size,pack,pack_id}; + send_big_data(type_,data+offset,surplus_len); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"开始\r\n"); + for(int i=0;i=pack_size) + { + surplus_len=surplus_len-pack_size; + ble_data_type type_={0x01,id,data_len,pack,pack_id}; + send_big_data(type_,data+offset,pack_size); + //send_big_data(1,data+offset,pack_size,data_len,pack_id,pack,id,1); + offset+=pack_size; + } + else + { + #ifdef BLE_LOG + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack); + #endif + + ble_data_type type_={0x01,id,data_len,pack,pack_id}; + send_big_data(type_,data+offset,surplus_len); + + //send_big_data(1,data+offset,surplus_len,data_len,pack_id,pack,id,1); + break; + } + pack_id++; + } + free(data); + +} + +//手机app下发读设备数据指令 +void readDevDataBle(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue) +{ + + uint8_t sendBuf[19]; + memset(sendBuf,0,19); + uint8_t type = cmd/256; + uint8_t typeID = cmd-((cmd/256)*256); + uint32_t totaldata_pack = 1; + uint32_t totaldata_packlen = 0; + uint32_t pack_count = 0; + uint16_t pack_datalen = 0; + sendBuf[0]=0x72; + sendBuf[1]=type; + sendBuf[2]=typeID; + memcpy(sendBuf+3,&totaldata_pack,4);//总的数据包 + memcpy(sendBuf+7,&totaldata_packlen,4);//总的数据包长度 + memcpy(sendBuf+11,&pack_count,4);//分包索引号 + + memcpy(sendBuf+15,&pack_datalen,2);//分包数据长度 + + if(Check_CRC(data,len,crcvalue)) + { + bleSendTypeID=cmd-((cmd/256)*256); + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"同步第%d天的数据\r\n",data[0]); + int num; + + switch (bleSendTypeID) + { + case 0x40://同步心率历史数据 + if(uapi_dev_runtime_get_heartrate_storage_status()) + { + ble_reply_cmdarr(SYN_HEART_HISTORY_DATA_CMD,NULL,0); + return; + } + + num=(ble_nus_max_data_len-18); + if(num>482)num=482; + #ifdef BLE_LOG + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"同步心率数据,每包最多:%d 数据 data:%d %d\r\n",num,data[0],len); + #endif + uapi_dev_runtime_set_heartrate_storage_status(1); + if(!Read_Health_BIN_file_buf_send_bin_Data(data[0],num,0x40)) + { + ble_data_type type_={0x01,0x40,0,1,1}; + send_big_data(type_,NULL,0); + } + uapi_dev_runtime_set_heartrate_storage_status(0); + //send_big_data(1,NULL,0,0,1,1,0x40,1); + + break; + case 0x41://同步血氧历史数据 + if(uapi_dev_runtime_get_bloodoxygen_storage_status()) + { + ble_reply_cmdarr(SYN_SPO2_HISTORY_DATA_CMD,NULL,0); + return; + } + + + num=(ble_nus_max_data_len-18); + if(num>482)num=482; + uapi_dev_runtime_set_bloodoxygen_storage_status(1); + if(!Read_Health_BIN_file_buf_send_bin_Data(data[0],num,0x41)) + { + ble_data_type type_={0x01,0x41,0,1,1}; + send_big_data(type_,NULL,0); + } + uapi_dev_runtime_set_bloodoxygen_storage_status(0); + + break; + case 0x43: //同步步数历史数据 + + if(uapi_dev_runtime_get_goal_storage_status()) + { + ble_reply_cmdarr(SYN_STEP_HISTORY_DATA_CMD,NULL,0); + return; + } + + num=(ble_nus_max_data_len-18); + if(num>482)num=482; + uapi_dev_runtime_set_goal_storage_status(1); + Read_BIN_file_buf_send_bin_Data(data[0],num,0x43); + uapi_dev_runtime_set_goal_storage_status(0); + + break; + case 0x44://同步燃脂时间数据 + + if(uapi_dev_runtime_get_goal_storage_status()) + { + ble_reply_cmdarr(SYN_FAT_BURN_HISTORY_DATA_CMD,NULL,0); + return; + } + + num=(ble_nus_max_data_len-18); + if(num>482)num=482; + uapi_dev_runtime_set_goal_storage_status(1); + Read_BIN_file_buf_send_bin_Data(data[0],num,0x44); + uapi_dev_runtime_set_goal_storage_status(0); + break; + case 0x45://同步站立历史数据 + + if(uapi_dev_runtime_get_goal_storage_status()) + { + ble_reply_cmdarr(SYN_STAND_HISTORY_DATA_CMD,NULL,0); + return; + } + + + num=(ble_nus_max_data_len-18); + if(num>482) + { + num=482; + } + uapi_dev_runtime_set_goal_storage_status(1); + Read_BIN_file_buf_send_bin_Data(data[0],num,0x45); + uapi_dev_runtime_set_goal_storage_status(0); + + break; + case 0x46://同步卡路里历史数据 + if(uapi_dev_runtime_get_goal_storage_status()) + { + ble_reply_cmdarr(SYN_KCAL_HISTORY_DATA_CMD,NULL,0); + return; + } + + num=(ble_nus_max_data_len-18); + if(num>482) + { + num=482; + } + uapi_dev_runtime_set_goal_storage_status(1); + Read_BIN_file_buf_send_bin_Data(data[0],num,0x46); + uapi_dev_runtime_set_goal_storage_status(0); + break; + case 0x47://同步距离历史数据 + + if(uapi_dev_runtime_get_goal_storage_status()) + { + ble_reply_cmdarr(SYN_DIS_HISTORY_DATA_CMD,NULL,0); + return; + } + + num=(ble_nus_max_data_len-18); + if(num>482) + { + num=482; + } + uapi_dev_runtime_set_goal_storage_status(1); + Read_BIN_file_buf_send_bin_Data(data[0],num,0x47); + uapi_dev_runtime_set_goal_storage_status(0); + break; + case 0x49://同步基础训练历史数据 + + if(uapi_dev_runtime_get_train_storage_status()) + { + ble_reply_cmdarr(SYN_BASIC_TRANIN_HISTORY_DATA_CMD,NULL,0); + return; + } + + EACH_DATA_LEN = DIS_DATA_LEN; + num=(ble_nus_max_data_len-18); + if(num>482) + { + num=482; + } + uapi_dev_runtime_set_train_storage_status(1); + Send_json_Data_Cmd(data[0],num,0x49); + uapi_dev_runtime_set_train_storage_status(0); + break; + case 0x01://同步闹钟 + EACH_DATA_LEN = DIS_DATA_LEN; + num=(ble_nus_max_data_len-18); + if(num>482) + { + num=482; + } + Send_json_Data_Cmd(data[0],num,0x01); + break; + case 0x4b://睡眠历史数据 + + if(uapi_dev_runtime_get_sleep_storage_status()) + { + ble_reply_cmdarr(SYN_SLEEP_HISTORY_DATA_CMD,NULL,0); + return; + } + + EACH_DATA_LEN = DIS_DATA_LEN; + num=(ble_nus_max_data_len-18); + if(num>482)num=482; + uapi_dev_runtime_set_sleep_storage_status(1); + Send_Sleep_Bin_Data(data[0],num); + uapi_dev_runtime_set_sleep_storage_status(0); + break; + case 0x21://文件目录 + EACH_DATA_LEN = DIS_DATA_LEN; + num=(ble_nus_max_data_len-18); + if(num>482) + { + num=482; + } + Send_json_Data_Cmd(data[0],num,0x21); + break; + + default: + break; + } + //sendReadData(); + }else{ + sendBuf[18] = 0; + sendBleData(sendBuf,19); + } +} + + + + +void getPhoneInfo_test(void) +{ + /* + cJSON *dataJSON = cJSON_CreateObject(); + cJSON* data_arryJSON = cJSON_CreateArray(); + cJSON_AddNumberToObject(dataJSON,"code",1); + + for(uint8_t i =0;i<3;i++) + { + cJSON* itemJSON = cJSON_CreateObject(); + cJSON* arrayJSON = cJSON_CreateArray(); + for(uint8_t id = 0;id<7;id++) + { + cJSON_AddNumberToObject(arrayJSON,"id",id); + } + + cJSON_AddNumberToObject(itemJSON,"id",i); + cJSON_AddItemToObject(itemJSON,"repeat",arrayJSON); + cJSON_AddNumberToObject(itemJSON,"hour",2+20*i); + cJSON_AddNumberToObject(itemJSON,"minute",30+i*0); + cJSON_AddNumberToObject(itemJSON,"enable",1); + cJSON_AddItemReferenceToArray(data_arryJSON,itemJSON); + } + cJSON_AddItemToObject(dataJSON,"alarm",data_arryJSON); + + char *json_format = cJSON_PrintUnformatted(dataJSON); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d\n",strlen(json_format)); + cJSON_Delete(dataJSON); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s\n",json_format); + uint32_t data_len = strlen(json_format); + uint8_t value[data_len+18]; + uint32_t tmp = 1; + uint16_t tmp_data = 1; + value[0] = 0x72; + value[1] = 0x01; + value[2] = 0x01; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp_data,2); + memcpy(value+17,(uint8_t *)json_format,data_len); + unsigned char lrc = Calculate_CRC(value,data_len+17); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"lrc:%d",lrc); + value[data_len+18] = lrc; + sendBleData(value,data_len+18); + */ + + // uint8_t value[128]; + // memset(value,0,128); + + // value[0] = 0x72; + // value[1] = 0x01; + // value[2] = 0x0f; + // char buf[128]; + // memset(buf,0,128); + // getSportData(&buf); + // uint32_t tmp = 1; + // uint32_t datalen = 1; + // uint16_t tmp_data = 1; + // datalen = strlen(buf); + // tmp_data = datalen; + // memcpy(value+3,&tmp,4); + // memcpy(value+7,&datalen,4); + // memcpy(value+11,&tmp,4); + // memcpy(value+15,&tmp_data,2); + // memcpy(&value[17],buf,strlen(buf)); + + // comfirmPaire(0); + +} + +bool creatMessageDir(void)//创建消息文件夹 +{ + struct stat info; + if (stat(ANCS_DATA_CONFIG_DIR, &info) != 0) + { + if (mkdir(ANCS_DATA_CONFIG_DIR, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0) + { + return false; // Failed to create folder + } + } + return true; +} +char *get_message_dir_path(void)//获取信息的文件夹路径 +{ + return ANCS_DATA_CONFIG_DIR; +} + +void message_data(int uid,int appid,char *title,char *msg,int hasCode) +{ + + uint32_t timestampe = 0; + if (uapi_get_timestampe_ss(×tampe) != ERRCODE_SUCC) + { + timestampe = 0; + } + ancs_data_info_t data; + data.title=malloc(strlen(title)+1); + data.msg = malloc(strlen(msg) + 1); + memset_s(data.title, TITLE_BUF_LEN, 0, strlen(title) + 1); + memset_s(data.msg, MSG_BUF_LEN, 0, strlen(msg) + 1); + memcpy_s(data.title, TITLE_BUF_LEN + 1, title, strlen(title)); + memcpy_s(data.msg, MSG_BUF_LEN + 1, msg, strlen(msg)); + + + data.appid = appid; + data.uid=uid; + data.time=timestampe; + data.read=0; + data.hasCode = hasCode; + + data.msglen = strlen(msg); + data.titlelen = strlen(title); + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"message_data %p %p\r\n", data.title, data.msg); + + CustomEventPublish_TOPIC_EVENT_MESSAGENOTE(&data); + return ; + +} +int uft8_check(char *chinese_string,int length) +{ + int i = 0; + for (i = 0; i < length;) { + // 判断是否为ASCII字符 + if ((unsigned char)chinese_string[i] < 0x80) { + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"ASCII character: %d\n", (int)(unsigned char)chinese_string[i]); + i++; + } else { + // 假设这里我们只处理3字节的UTF-8字符 + // 实际上,中文字符通常是4字节 + if ((unsigned char)chinese_string[i] >= 0xF0) { + // 这里应处理4字节UTF-8字符的逻辑 + // 例如: return (chinese_string[i] << 24) | (chinese_string[i + 1] << 16) | (chinese_string[i + 2] << 8) | chinese_string[i + 3]; + i += 4; // 跳过4个字节 + } else if ((unsigned char)chinese_string[i] >= 0xE0) { + // 这里应处理3字节UTF-8字符的逻辑 + // 例如: return (chinese_string[i] << 16) | (chinese_string[i + 1] << 8) | chinese_string[i + 2]; + i += 3; // 跳过3个字节 + } else { + // 这里应处理2字节UTF-8字符的逻辑 + // 例如: return (chinese_string[i] << 8) | chinese_string[i + 1]; + i += 2; // 跳过2个字节 + } + } + if(i+4 > length) + break; + } + return i; +} + + +//安卓消息接收解析数据 //ANCS 2AE1 +uint8_t jscheck_ancs(uint8_t *data) +{ + uint8_t *json; + json = data; + cJSON* root = cJSON_Parse((const char *)json); + if (root == NULL) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"信息解析 JSON解析 失败\n"); + return 2; + } + + int uid_t = 0; + int appid_t = 0; + int hasCode_t = 0; + char *titleBuf; + char *msgBuf; + titleBuf = ym_malloc(TITLE_BUF_LEN+1); + msgBuf = ym_malloc(MSG_BUF_LEN+1); + if(titleBuf == NULL || msgBuf == NULL)//申请内存失败不在申请 + { + return 2; + } + memset(titleBuf,0,TITLE_BUF_LEN+1); + memset(msgBuf,0,MSG_BUF_LEN+1); + cJSON* uid = cJSON_GetObjectItem(root, "uid"); + if (uid && cJSON_IsNumber(uid)) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"uid_t: %d\n", uid->valueint); + uid_t = uid->valueint; + } + cJSON* appid = cJSON_GetObjectItem(root, "appid"); + if (appid && cJSON_IsNumber(appid)) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"appid_t: %d\n", appid->valueint); + appid_t = appid->valueint; + } + cJSON* title_c = cJSON_GetObjectItem(root, "title"); + if (title_c && cJSON_IsString(title_c)) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"titleBuf: %s\n", title_c->valuestring); + int len = strlen(title_c->valuestring); + if(len >= TITLE_BUF_LEN){ + len = uft8_check(title_c->valuestring,TITLE_BUF_LEN-4); + title_c->valuestring[len++] ='.'; + title_c->valuestring[len++] = '.'; + title_c->valuestring[len++] = '.'; + title_c->valuestring[len++] = 0; + } + memcpy_s(titleBuf,TITLE_BUF_LEN,(uint8_t *)title_c->valuestring,len); + } + cJSON* msg = cJSON_GetObjectItem(root, "msg"); + if (msg && cJSON_IsString(msg)) { + int len = strlen(msg->valuestring); + if(len >= MSG_BUF_LEN-4){ + len = uft8_check(msg->valuestring,MSG_BUF_LEN-4); + msg->valuestring[len++] ='.'; + msg->valuestring[len++] = '.'; + msg->valuestring[len++] = '.'; + msg->valuestring[len++] = 0; + } + memcpy_s(msgBuf,MSG_BUF_LEN,(uint8_t *)msg->valuestring,len); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"msgBuf: %s\n",msgBuf); + } + cJSON* time = cJSON_GetObjectItem(root, "time"); + if (time && cJSON_IsString(time)) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"time: %s\n", time->valuestring); + // timeBuf = time->valueint; + } + cJSON* hasCode = cJSON_GetObjectItem(root, "hasCode"); + if (hasCode && cJSON_IsNumber(hasCode)) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"hasCode_t: %d\n", hasCode->valueint); + hasCode_t = hasCode->valueint; + } + cJSON_Delete(root); + + // if(ancs_msg_data!=NULL) + // { + // free(ancs_msg_data); + // ancs_msg_data=NULL; + // } + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"send message\r\n"); + message_data(uid_t,appid_t,titleBuf,msgBuf,hasCode_t); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"send message ok\r\n"); + + if(titleBuf != NULL){ + ym_free(titleBuf); + titleBuf = NULL; + } + if(msgBuf != NULL){ + ym_free(msgBuf); + msgBuf = NULL; + } + return 1; +} + +void ancsDataShowCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)// +{ + uint8_t value[19]; + memset(value,0,19); + uint32_t tmp = 1; + value[0] =0x72; + value[1] =0x02; + value[2] =0x01; + memcpy(value+3,&tmp,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp,4); + memcpy(value+15,&tmp,2); + + if(Check_CRC(data,len,crcvalue)) + { + //解析ancs数据并且显示出来 + uint8_t check_ok= 1; + check_ok = jscheck_ancs(data); + value[17] = 1; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + }else{ + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } +} + +void CustomEventPublish_TOPIC_EVENT_MESSAGENOTE(void *data) +{ + CustomEventPublish(TOPIC_EVENT_MESSAGE_UPDATA,(uint8_t*)data,sizeof(ancs_data_info_t)); +} + +void type2AE1Data(uint8_t *buf_cmd,uint8_t *data,uint16_t datalen,uint8_t *totalData,uint8_t crcvalue) +{ + uint16_t typeID = buf_cmd[1]*256+buf_cmd[2]; + #ifdef BLE_LOG + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"type2AE1Data typeID:0x%4X\r\n",typeID); + #endif + switch (typeID) //ID + { + case ANDROID_ANCS_CMD:// + ancsDataShowCmd(typeID,data,datalen,totalData,crcvalue); + break; + } +} + +void bleRecvANCSData(uint8_t *data, uint16_t data_size,uint8_t *buf_cmd,uint8_t *totalData,uint8_t crcvalue)//buf_cmd 指令前17个字节数据 +{ + uint8_t type = buf_cmd[1]; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"type:%d %d data_size:%d data:%d crcvalue:%x\r\n",buf_cmd[0],type,data_size,data[0],crcvalue); + switch (type) + { + case 0x03:// + type2AE1Data(buf_cmd,data,data_size,totalData,crcvalue); + break; + default: + break; + } +} + +/** + * less than 20bytes msg reply +*/ +errcode_t ble_reply_msgarr(uint8_t msg_cmdtype,uint8_t msg_cmdid,uint8_t *replydata,uint16_t replydata_len) +{ + + //发送校验失败 + + if (replydata_len > 20) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"datalen is larger than 20, please send with other api !\n"); + return ERRCODE_FAIL; + } + uint16_t replybuflen=sizeof(msg_header_t)+replydata_len+1; + uint8_t *replybuf=malloc(replybuflen); + if(replybuf != NULL) + { + msg_header_t *reply_cmd_header=(msg_header_t*)replybuf; + reply_cmd_header->direction = MSG_DIRECTION_SEND; + reply_cmd_header->cmdtype =msg_cmdtype; + reply_cmd_header->cmdid = msg_cmdid; + reply_cmd_header->package_count = 1; + reply_cmd_header->package_index = 1; + reply_cmd_header->package_len = replydata_len; + reply_cmd_header->total_data_len = replydata_len; + memcpy_s(replybuf+sizeof(msg_header_t),replydata_len,replydata,replydata_len); + uint8_t crc_value = Calculate_CRC( replybuf, replybuflen - 1); + replybuf[ replybuflen - 1 ] = crc_value ; //CRC + errcode_t ret=0; + if(msg_cmdtype==6) + { + ret=sendBleData_zhihui(replybuf,replybuflen); + + }else + { + ret= sendBleData(replybuf,replybuflen); + } + + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"ble_reply_msgarr cmdtype %02X cmdid %02X package %d/%d , len %d,total len %d , data[0] %02X crc %02X\n", + reply_cmd_header->cmdtype, + reply_cmd_header->cmdid, + reply_cmd_header->package_index, + reply_cmd_header->package_count, + reply_cmd_header->package_len, + reply_cmd_header->total_data_len, + (replybuf+sizeof(msg_header_t))[0], + crc_value + ); + free(replybuf); + return ret; + }else{ + return ERRCODE_MALLOC; + } +} + +errcode_t ble_reply_cmdarr(uint16_t msg_cmd,uint8_t *replydata,uint16_t replydata_len) +{ + + uint8_t cmdtype = (uint8_t)((msg_cmd&0xFF00)>>8); + uint8_t cmdid = (uint8_t)(msg_cmd&0x00FF); + + return ble_reply_msgarr(cmdtype,cmdid,replydata,replydata_len); + +} +errcode_t ble_reply_cmd(uint16_t msg_cmd,uint8_t replydata) +{ + uint8_t cmdtype = (uint8_t)((msg_cmd&0xFF00)>>8); + uint8_t cmdid = (uint8_t)(msg_cmd&0x00FF); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"msg_cmd %04X cmdtype %02X cmdid %02X\n",msg_cmd,cmdtype,cmdid); + return ble_reply_msg(cmdtype,cmdid,replydata); +} +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); +} + +static uint32_t last_package_id=0; +static void ble_transfer_Timer_CallBack(int data) +{ + timer_flie_flag--; + + if(timer_flie_flag==0) + { + cancel_recv_file(1); + } +} +uint8_t OTA_FILE_value=0; + +errcode_t decode_ota_data(ble_read_data *buffer_handle,uint8_t *data,uint16_t datalen,uint8_t crcvalue) +{ + if(datalencmdtype!=0x06) + { + return ERRCODE_FAIL; + } + + uint8_t* data_=data+sizeof(msg_header_t); + //datalen-=18; + datalen=header->package_len; + + if(header->cmdid==0x0B) + { + //取消文件传输 + if(Check_CRC(data_,datalen,crcvalue)) + { + cancel_recv_file(0); + uint8_t replydata= 1; + ble_reply_msgarr(6,0x0B,&replydata,1); + } + else + { + cancel_recv_file(0); + uint8_t replydata= 0; + ble_reply_msgarr(6,0x0B,&replydata,1); + } + + } + else if(header->cmdid==0x02) + { + + uint32_t package_id=header->package_index; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"package_id: %d \r\n",package_id); + if(Check_CRC(data_,datalen,crcvalue)) + { + + if(package_id==0) + { + last_package_id=package_id; + if((buffer_handle->file_recv_stat.recv_file_stat <= 0) && buffer_handle->file_recv_stat.file == NULL ) + { + buffer_handle->file_recv_stat.lrcvalue = 0; + if (buffer_handle->file_recv_stat.file_type == 1) + { + + buffer_handle->file_recv_stat.file = fopen(UP_DATE_FWPKG_PATH,"w+"); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",UP_DATE_FWPKG_PATH,buffer_handle->file_recv_stat.file); + + + } + else if (buffer_handle->file_recv_stat.file_type == 2) + { + char musicpath[64]={0}; + get_music_path(musicpath,64); + //"/user/userdata/music" + char filepath[256]={0}; + create_mp3_name(filepath,musicpath,buffer_handle->file_recv_stat.file_name); + + buffer_handle->file_recv_stat.file = fopen(filepath,"w+"); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"filepath %s\r\n",filepath); + } + else if (buffer_handle->file_recv_stat.file_type == 4) + { + char filepath[128]={0}; + if (get_app_file_path(buffer_handle->file_recv_stat.file_name,strlen(buffer_handle->file_recv_stat.file_name),filepath,sizeof(filepath)) == ERRCODE_SUCC) + { + buffer_handle->file_recv_stat.file = fopen(filepath,"w+");//? + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",filepath,buffer_handle->file_recv_stat.file); + }else{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s error %X\n",buffer_handle->file_recv_stat.file_name,buffer_handle->file_recv_stat.file); + } + } + else + { + char filepath[128]={0}; + 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) + { + buffer_handle->file_recv_stat.file = fopen(filepath,"w+"); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",filepath,buffer_handle->file_recv_stat.file); + }else{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s error %X\n",buffer_handle->file_recv_stat.file_name,buffer_handle->file_recv_stat.file); + } + } + + + + if (buffer_handle->file_recv_stat.file == NULL) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"6185 buffer_handle->file_recv_stat.file \n"); + return ERRCODE_FAIL; + } + size_t writtensize = fwrite(data_,1,datalen,buffer_handle->file_recv_stat.file); + if(writtensize == datalen) + { + timer_flie_flag=10; + + buffer_handle->file_recv_stat.lrcvalue = calculate_lrc(data_,datalen,buffer_handle->file_recv_stat.lrcvalue); + buffer_handle->file_recv_stat.received_size += datalen; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file received_size %d\n",buffer_handle->file_recv_stat.received_size); + OTA_FILE_value= ((float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size) *100; + + + }else{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file write file failed! ret %d != %d\n",writtensize,datalen); + return ERRCODE_FAIL; + } + + + buffer_handle->file_recv_stat.recv_file_stat = 1; + ////////////////创建文件传输超时定时器////////////////// + uint32_t tick; + osStatus_t retTimer; + if(BR_TRANSFER_timer!=NULL) + { + osTimerDelete(BR_TRANSFER_timer); + BR_TRANSFER_timer = NULL; + } + ble_read_timer_p=buffer_handle; + timer_flie_flag=10; + + BR_TRANSFER_timer = osTimerNew((osTimerFunc_t)ble_transfer_Timer_CallBack, osTimerPeriodic, NULL, NULL); + tick =1000;// osMs2Tick(1000); + retTimer = osTimerStart(BR_TRANSFER_timer, tick); + if (retTimer != osOK && BR_TRANSFER_timer != NULL) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"StartCallTimer osTimerStart failed, ret = %lx!!", retTimer); + osTimerDelete(BR_TRANSFER_timer); + BR_TRANSFER_timer = NULL; + return ERRCODE_FAIL; + } + + { + if(buffer_handle->file_recv_stat.file_type==3) + TRANSMIT_DATA=TRANS_DIAL_TRANSMITTING; + + if(buffer_handle->file_recv_stat.file_type==1) + TRANSMIT_DATA=TRANS_OTA_TRANSMITTING; + + if(buffer_handle->file_recv_stat.file_type==2) + TRANSMIT_DATA=TRANS_MP3_TRANSMITTING; + + if(buffer_handle->file_recv_stat.file_type==4) + TRANSMIT_DATA=TRANS_BIN_TRANSMITTING; + + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + } + } + /////////////////////////////////////////////////////////// + } + else if ((last_package_id+1)==package_id) + { + last_package_id=package_id; + if (buffer_handle->file_recv_stat.file == NULL) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"6194 buffer_handle->file_recv_stat.file \n"); + return ERRCODE_FAIL; + } + //写入文件 + size_t writtensize = fwrite(data_,1,datalen,buffer_handle->file_recv_stat.file); + if(writtensize == datalen) + { + timer_flie_flag=10; + + buffer_handle->file_recv_stat.lrcvalue = calculate_lrc(data_,datalen,buffer_handle->file_recv_stat.lrcvalue); + buffer_handle->file_recv_stat.received_size += datalen; + OTA_FILE_value= ((float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size) *100; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"handle_recv_file received_size %d %0.3lf\n",buffer_handle->file_recv_stat.received_size + ,(float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size); + + }else{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file write file failed! ret %d != %d\n",writtensize,datalen); + return ERRCODE_FAIL; + } + + //检查文件是否写完 + if(buffer_handle->file_recv_stat.file_size == buffer_handle->file_recv_stat.received_size) + { + if (buffer_handle->file_recv_stat.file!=NULL) + { + fclose(buffer_handle->file_recv_stat.file); + buffer_handle->file_recv_stat.file = NULL; + } + if (buffer_handle->file_recv_stat.file_name != NULL) + { + free(buffer_handle->file_recv_stat.file_name); + buffer_handle->file_recv_stat.file_name=NULL; + } + buffer_handle->file_recv_stat.recv_file_stat = 2; + buffer_handle->receive_file_flag = 0; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file received success \n"); + + if(BR_TRANSFER_timer) + { + osTimerStop(BR_TRANSFER_timer); + osTimerDelete(BR_TRANSFER_timer); + BR_TRANSFER_timer = NULL; + } + ble_read_timer_p=NULL; + + TRANSMIT_DATA=FILE_IS_DONE; + + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + + + ble_reply_cmd(OTA_FILE_SUCC_CMD,1);//接收成功 + } + + } + else if (last_package_id==package_id) + { + uint32_t replydata=0xffffffff; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"0xffffffff 包重复\r\n"); + //ble_reply_msgarr(6,4,&replydata,4); + } + else if (last_package_id!=package_id) + { + uint32_t replydata= last_package_id+1; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"包错漏\r\n"); + + + ble_reply_msgarr(0x06,0x04,&replydata,4); + } + return ERRCODE_SUCC; + } + else + { + return ERRCODE_FAIL; + } + } + return ERRCODE_FAIL; +} + + + + +errcode_t decode_ota_json(ble_read_data *buffer_handle) { + + if (uapi_dev_runtime_get_train_status() == 1) { + return ERRCODE_FAIL; + } + + uint8_t *data = buffer_handle->data+sizeof(msg_header_t); + uint16_t datalen = buffer_handle->totalDataLen; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"ota_json_file_save %s\n",data); + + cJSON* root = cJSON_Parse((const char *)data); + if(root != NULL) + { + cJSON* ota_size_json = cJSON_GetObjectItem(root, "size"); + if(ota_size_json != NULL && cJSON_IsNumber(ota_size_json)) + { + buffer_handle->file_recv_stat.file_size = ota_size_json->valueint; + if(is_free_ota_update(ota_size_json->valueint)==false) + { + TRANSMIT_DATA=TRANS_OTA_FAIL; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + cJSON_Delete(root); + + return ERRCODE_FAIL; + } + } + + cJSON* ota_type_json = cJSON_GetObjectItem(root, "type"); + if(ota_type_json != NULL && cJSON_IsNumber(ota_type_json)) + { + buffer_handle->file_recv_stat.file_type = ota_type_json->valueint; + } + + cJSON* ota_name_json = cJSON_GetObjectItem(root, "name"); + if ( ota_name_json != NULL && cJSON_IsString(ota_name_json)) { + uint32_t filenamelen=strlen(ota_name_json->valuestring)+1; + if (filenamelen > 0 && filenamelen < 255) + { + buffer_handle->file_recv_stat.file_name = malloc(filenamelen); + if (buffer_handle->file_recv_stat.file_name!=NULL) + memcpy_s(buffer_handle->file_recv_stat.file_name,filenamelen,ota_name_json->valuestring,filenamelen); + //下载完成再在 cancel download 里 free filename + }else{ + buffer_handle->file_recv_stat.file_name = NULL; + } + }else{ + buffer_handle->file_recv_stat.file_name = NULL; + } + + cJSON* ota_major_json = cJSON_GetObjectItem(root, "major"); + if(ota_major_json != NULL && cJSON_IsNumber(ota_major_json)) + { + buffer_handle->file_recv_stat.ota_major = ota_major_json->valueint; + } + cJSON* ota_mid_json = cJSON_GetObjectItem(root, "mid"); + if(ota_mid_json != NULL && cJSON_IsNumber(ota_mid_json)) + { + buffer_handle->file_recv_stat.ota_mid = ota_mid_json->valueint; + } + cJSON* ota_minor_json = cJSON_GetObjectItem(root, "minor"); + if(ota_minor_json != NULL && cJSON_IsNumber(ota_minor_json)) + { + buffer_handle->file_recv_stat.ota_minor = ota_minor_json->valueint; + } + cJSON* ota_isforced_json = cJSON_GetObjectItem(root, "isForced"); + if(ota_isforced_json != NULL && cJSON_IsNumber(ota_isforced_json)) + { + buffer_handle->file_recv_stat.ota_isforced = ota_isforced_json->valueint; + } + cJSON_Delete(root); + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP," ota_type= %d, ota_name=%s, ota_size=%d, ota_major=%d, ota_mid=%d, ota_minor=%d, ota_isforced=%d \n", + buffer_handle->file_recv_stat.file_type, + buffer_handle->file_recv_stat.file_name, + buffer_handle->file_recv_stat.file_size, + buffer_handle->file_recv_stat.ota_major, + buffer_handle->file_recv_stat.ota_mid, + buffer_handle->file_recv_stat.ota_minor, + buffer_handle->file_recv_stat.ota_isforced + ); + buffer_handle->file_recv_stat.received_size = 0; + buffer_handle->file_recv_stat.lrcvalue = 0; + buffer_handle->receive_file_flag = 1; + uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH); + //进入特殊UI + TRANSMIT_DATA=TRANS_OTA_TRANSMITTING; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + + return ERRCODE_SUCC; + }else{ + buffer_handle->receive_file_flag = 0; + return ERRCODE_FAIL; + } +} + + +errcode_t decode_mp3_json(ble_read_data *buffer_handle) +{ + if (uapi_dev_runtime_get_train_status() == 1) { + return ERRCODE_FAIL; + } + + uint8_t *data = buffer_handle->data+sizeof(msg_header_t); + uint16_t datalen = buffer_handle->totalDataLen; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"MP3_file_save %s\n",data); + + cJSON* root = cJSON_Parse((const char *)data); + + if(root != NULL) + { + cJSON* ota_type_json = cJSON_GetObjectItem(root, "type"); + if(ota_type_json != NULL && cJSON_IsNumber(ota_type_json)) + { + buffer_handle->file_recv_stat.file_type = ota_type_json->valueint; + } + + cJSON* ota_name_json = cJSON_GetObjectItem(root, "name"); + if ( ota_name_json != NULL && cJSON_IsString(ota_name_json)) { + uint32_t filenamelen=strlen(ota_name_json->valuestring)+1; + + if (filenamelen > 0 && filenamelen < 255) + { + if(buffer_handle->file_recv_stat.file_name) + { + free(buffer_handle->file_recv_stat.file_name); + buffer_handle->file_recv_stat.file_name=NULL; + } + buffer_handle->file_recv_stat.file_name = malloc(filenamelen); + if (buffer_handle->file_recv_stat.file_name!=NULL) + { + memset_s(buffer_handle->file_recv_stat.file_name,filenamelen,0,filenamelen); + memcpy_s(buffer_handle->file_recv_stat.file_name,filenamelen,ota_name_json->valuestring,filenamelen); + } + + //下载完成再在 cancel download 里 free filename + }else{ + buffer_handle->file_recv_stat.file_name = NULL; + } + } + + cJSON* ota_size_json = cJSON_GetObjectItem(root, "size"); + if(ota_size_json != NULL && cJSON_IsNumber(ota_size_json)) + { + buffer_handle->file_recv_stat.file_size = ota_size_json->valueint; + } + cJSON_Delete(root); + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP," MP3_type= %d, MP3_name=%s, MP3_size=%d \n", + buffer_handle->file_recv_stat.file_type, + buffer_handle->file_recv_stat.file_name, + buffer_handle->file_recv_stat.file_size + ); + // buffer_handle->file_recv_stat.received_size = 0; + // buffer_handle->file_recv_stat.lrcvalue = 0; + // buffer_handle->receive_file_flag = 1; + // uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH); + // TRANSMIT_DATA=TRANS_MP3_TRANSMITTING; + // CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + if(IS_free_save_Mp3(ota_size_json->valueint)==false) + { + free(buffer_handle->file_recv_stat.file_name); + buffer_handle->file_recv_stat.file_name=NULL; + + TRANSMIT_DATA=TRANS_MP3_MAX_FAIL; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + + return ERRCODE_FAIL; + } + else + { + buffer_handle->file_recv_stat.received_size = 0; + buffer_handle->file_recv_stat.lrcvalue = 0; + buffer_handle->receive_file_flag = 1; + uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH); + + return ERRCODE_SUCC; + } + + }else{ + buffer_handle->receive_file_flag = 0; + return ERRCODE_FAIL; + } +} + + +errcode_t decode_bin_json(ble_read_data *buffer_handle) +{ + if (uapi_dev_runtime_get_train_status() == 1) { + return ERRCODE_FAIL; + } + + uint8_t *data = buffer_handle->data+sizeof(msg_header_t); + uint16_t datalen = buffer_handle->totalDataLen; + // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"decode_bin_json %s\n",data); + + cJSON* root = cJSON_Parse((const char *)data); + + if(root != NULL) + { + cJSON* ota_type_json = cJSON_GetObjectItem(root, "type"); + if(ota_type_json != NULL && cJSON_IsNumber(ota_type_json)) + { + buffer_handle->file_recv_stat.file_type = ota_type_json->valueint; + } + + cJSON* ota_name_json = cJSON_GetObjectItem(root, "name"); + if ( ota_name_json != NULL && cJSON_IsString(ota_name_json)) { + uint32_t filenamelen=strlen(ota_name_json->valuestring)+1; + + if (filenamelen > 0 && filenamelen < 255) + { + if(buffer_handle->file_recv_stat.file_name) + { + free(buffer_handle->file_recv_stat.file_name); + buffer_handle->file_recv_stat.file_name=NULL; + } + buffer_handle->file_recv_stat.file_name = malloc(filenamelen); + if (buffer_handle->file_recv_stat.file_name!=NULL) + { + memset_s(buffer_handle->file_recv_stat.file_name,filenamelen,0,filenamelen); + memcpy_s(buffer_handle->file_recv_stat.file_name,filenamelen,ota_name_json->valuestring,filenamelen); + } + + //下载完成再在 cancel download 里 free filename + }else{ + buffer_handle->file_recv_stat.file_name = NULL; + } + } + + cJSON* ota_size_json = cJSON_GetObjectItem(root, "size"); + if(ota_size_json != NULL && cJSON_IsNumber(ota_size_json)) + { + buffer_handle->file_recv_stat.file_size = ota_size_json->valueint; + } + cJSON_Delete(root); + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP," bin type = %d, bin name =%s, bin size =%d \n", + buffer_handle->file_recv_stat.file_type, + buffer_handle->file_recv_stat.file_name, + buffer_handle->file_recv_stat.file_size + ); + // buffer_handle->file_recv_stat.received_size = 0; + // buffer_handle->file_recv_stat.lrcvalue = 0; + // buffer_handle->receive_file_flag = 1; + // uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH); + // TRANSMIT_DATA=TRANS_MP3_TRANSMITTING; + // CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + if(IS_free_save_Mp3(ota_size_json->valueint)==false) + { + free(buffer_handle->file_recv_stat.file_name); + buffer_handle->file_recv_stat.file_name=NULL; + + TRANSMIT_DATA=TRANS_MP3_MAX_FAIL; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + + return ERRCODE_FAIL; + } + else + { + buffer_handle->file_recv_stat.received_size = 0; + buffer_handle->file_recv_stat.lrcvalue = 0; + buffer_handle->receive_file_flag = 1; + uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH); + + memset_s(app_name,64,0,64); + memcpy_s(app_name,64, buffer_handle->file_recv_stat.file_name,strlen(buffer_handle->file_recv_stat.file_name)); + + + return ERRCODE_SUCC; + } + + }else{ + buffer_handle->receive_file_flag = 0; + return ERRCODE_FAIL; + } +} +static uint16_t ble_dial_uid=0; + +errcode_t decode_dial_info(ble_read_data *buffer_handle) +{ + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"decode_dial_info \n"); + for(uint8_t i = 0;idata_len;i++) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%x ",buffer_handle->data[i]); + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"\n"); + if (buffer_handle->data_len == 6) + { + + return ERRCODE_SUCC; + } + uint8_t *data = buffer_handle->data+sizeof(msg_header_t); + uint16_t datalen = buffer_handle->totalDataLen; + + msg_recv_dial_info_t dialinfo={0}; + msg_recv_dial_info_t *pdialinfo=(msg_recv_dial_info_t*)data; + + // dialinfo.dial_count = pdialinfo->dial_count; + dialinfo.dial_uid = pdialinfo->dial_uid; + if(dialinfo.dial_uid<=4) + { + + msg_recv_custom_dial_info_t *custom_dial_info=(msg_recv_custom_dial_info_t*)data; + custom_dial_info->dial_uid+=1; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"custom_dial_info %d %d %d %d", + custom_dial_info->dial_uid, + custom_dial_info->battery, + custom_dial_info->time, + custom_dial_info->time_font); + + ble_save_dial_custom(custom_dial_info); + ble_dial_file_count=*(data+sizeof(msg_recv_custom_dial_info_t)); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP," custom_dial file_count %d\r\n",ble_dial_file_count); + + } + else + { + dialinfo.file_name_len = pdialinfo->file_name_len; + // dialinfo.file_type = pdialinfo->file_type; + + if (dialinfo.file_name_len < 0 || dialinfo.file_name_len >255) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file name len should in [0,255] \n"); + return ERRCODE_FAIL; + } + + char * filename = malloc(dialinfo.file_name_len); + + ble_dial_file_count= data[sizeof(msg_recv_dial_info_t)+dialinfo.file_name_len]; + if (filename == NULL) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file name malloc failed filename_len %d\n",dialinfo.file_name_len); + return ERRCODE_FAIL; + } + memcpy_s(filename,dialinfo.file_name_len,data+sizeof(msg_recv_dial_info_t),dialinfo.file_name_len); + + buffer_handle->file_recv_stat.file_name = filename; + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP," dial name = %s, dial file count = %d \n", + filename,ble_dial_file_count); + + free(filename); + buffer_handle->file_recv_stat.file_name=NULL; + } + + ble_dial_uid = dialinfo.dial_uid; + + buffer_handle->file_recv_stat.received_size = 0; + buffer_handle->file_recv_stat.lrcvalue = 0; + buffer_handle->receive_file_flag = 0; + + return ERRCODE_SUCC; + +} + +errcode_t decode_single_dial_info(ble_read_data *buffer_handle) +{ + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"decode_single_dial_info \n"); + for(uint8_t i = 0;idata_len;i++) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%x ",buffer_handle->data[i]); + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"\n"); + if (buffer_handle->data_len == 6) + { + return ERRCODE_SUCC; + } + uint8_t *data = buffer_handle->data+sizeof(msg_header_t); + uint16_t datalen = buffer_handle->totalDataLen; + + msg_recv_single_dial_info_t dialinfo={0}; + msg_recv_single_dial_info_t *pdialinfo=(msg_recv_single_dial_info_t*)data; + + dialinfo.dial_count = pdialinfo->dial_count; + + ble_dial_file_index= dialinfo.dial_count; + + dialinfo.dial_uid = pdialinfo->dial_uid; + dialinfo.file_name_len = pdialinfo->file_name_len; + dialinfo.file_type = pdialinfo->file_type; + + if (dialinfo.file_name_len < 6 || dialinfo.file_name_len >255) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file name len should in [6,255] \n"); + return ERRCODE_FAIL; + } + + if (uapi_dev_runtime_get_train_status() == 1) { + return ERRCODE_FAIL; + } + + + char * filename = malloc(dialinfo.file_name_len+1); + //下载完成再在 cancel download 里 free filename + + uint32_t file_size = 0; + memcpy_s((void*)&file_size,sizeof(uint32_t),(void*)&data[sizeof(msg_recv_single_dial_info_t)+dialinfo.file_name_len],sizeof(uint32_t)); + if (filename == NULL) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file name malloc failed filename_len %d\n",dialinfo.file_name_len); + return ERRCODE_FAIL; + } + memcpy_s(filename,dialinfo.file_name_len,data+sizeof(msg_recv_single_dial_info_t),dialinfo.file_name_len); + filename[dialinfo.file_name_len] ='\0'; + //在runtime中备份一个安装文件名。 + uapi_dev_runtime_set_dialname(filename); + + if (check_dial_freespace(dialinfo.dial_uid, file_size) == false) + { + free(filename); + filename=NULL; + + TRANSMIT_DATA=TRANS_DIAL_MAX_FAIL; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + return ERRCODE_FAIL; + } + + //存表盘id + ble_dial_uid = dialinfo.dial_uid; + // if(ble_dial_uid<=4) + // ble_dial_uid++; + + if(buffer_handle->file_recv_stat.file_name) + { + free(buffer_handle->file_recv_stat.file_name); + buffer_handle->file_recv_stat.file_name=NULL; + } + + buffer_handle->file_recv_stat.file_name = filename; + buffer_handle->file_recv_stat.file_size = file_size; + buffer_handle->file_recv_stat.file_type = 3;//表盘 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP," filetype = %d, file_name=%s, file_size=%d , dial_uid %04X ,dial_count %d, dial_filetype %d\n", + buffer_handle->file_recv_stat.file_type, + buffer_handle->file_recv_stat.file_name, + buffer_handle->file_recv_stat.file_size, + dialinfo.dial_uid, + dialinfo.dial_count, + dialinfo.file_type + + ); + buffer_handle->file_recv_stat.received_size = 0; + buffer_handle->file_recv_stat.lrcvalue = 0; + buffer_handle->receive_file_flag = 1; + uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH); + + // TRANSMIT_DATA=TRANS_DIAL_TRANSMITTING; + // CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + return ERRCODE_SUCC; + + + + + + +} +static errcode_t install_dial(void) +{ + char *lzmapkgname = uapi_dev_runtime_get_dialname(); + // 增加初始参数校验打印 + if (lzmapkgname == NULL) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取到的表盘包名为空\n"); + return ERRCODE_FAIL; + } + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 开始安装表盘,包名:%s\n", lzmapkgname); + + // 检查是否为lzma格式包 + char *lzmaindex = strstr(lzmapkgname, ".lzma"); + if (lzmaindex == NULL) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:包名中未找到.lzma后缀,不是有效压缩包\n"); + return ERRCODE_FAIL; + } + + // 创建表盘目录(若不存在) + struct stat info; + if (stat(get_dial_path(), &info) != 0) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘目录不存在,尝试创建...\n"); + if (mkdir(get_dial_path(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:创建表盘目录失败\n"); + return ERRCODE_FAIL; + } + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘目录创建成功\n"); + } else { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘目录已存在,无需创建\n"); + } + + // 解析表盘基础名称(去除.lzma后缀) + char dial_basename[64] = {0}; + int dial_basenamelen = lzmaindex - lzmapkgname; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解析基础名称长度:%d\n", dial_basenamelen); + if (dial_basenamelen <= 0 || dial_basenamelen >= sizeof(dial_basename)) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:基础名称长度无效(%d),超出缓冲区大小\n", dial_basenamelen); + return ERRCODE_FAIL; + } + memcpy_s(dial_basename, sizeof(dial_basename), lzmapkgname, dial_basenamelen); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解析到表盘基础名称:%s\n", dial_basename); + + // 确定解压后bin文件路径 + char dialbin_filepath[128] = {0}; + if (ble_dial_uid > 5) { + if (get_dial_file_path(dial_basename, strlen(dial_basename), dialbin_filepath, sizeof(dialbin_filepath)) != ERRCODE_SUCC) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取常规表盘文件路径失败\n"); + return ERRCODE_FAIL; + } + } else { + if (get_custom_dial_file_path(ble_dial_uid, dial_basename, strlen(dial_basename), dialbin_filepath, sizeof(dialbin_filepath)) != ERRCODE_SUCC) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取自定义表盘文件路径失败\n"); + return ERRCODE_FAIL; + } + } + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压目标bin文件路径:%s\n", dialbin_filepath); + + // 确定源lzma文件路径 + char lzma_filepath[128] = {0}; + if (get_file_recv_file_path(lzmapkgname, strlen(lzmapkgname), lzma_filepath, sizeof(lzma_filepath)) != ERRCODE_SUCC) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取源lzma文件路径失败\n"); + return ERRCODE_FAIL; + } + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 源lzma文件路径:%s\n", lzma_filepath); + + // 执行解压操作 + errcode_t ret = uapi_dial_pkg_decompress(lzma_filepath, dialbin_filepath); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压操作完成,返回码:0x%X(%s)\n", ret, + (ret == ERRCODE_SUCC) ? "成功" : "失败"); + + // 关键:检查解压后bin文件是否存在及大小 + struct stat bin_info; + if (stat(dialbin_filepath, &bin_info) != 0) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:解压后bin文件不存在或无法访问(路径:%s)\n", dialbin_filepath); + ret = ERRCODE_FAIL; // 即使解压返回成功,文件不存在也视为失败 + } else { + if (bin_info.st_size <= 0) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:解压后bin文件大小为空(%ld字节),无效文件\n", bin_info.st_size); + ret = ERRCODE_FAIL; // 大小为空视为失败 + } else { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压后bin文件大小正常:%ld字节\n", bin_info.st_size); + } + } + + // 若解压失败,直接返回 + if (ret != ERRCODE_SUCC) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压失败,终止安装流程\n"); + return ret; + } + + // 注册并设置表盘 + char *namebuf = strtok(lzmapkgname, "."); + if (ble_dial_uid > 5) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 注册常规表盘:%s(ID:%d)\n", namebuf, ble_dial_uid); + install_Register_dial(namebuf, ble_dial_uid); + ble_set_dial_by_id(ble_dial_uid); + } else { + if (ble_dial_file_index == ble_dial_file_count) { + char name_str[32] = {0}; + ble_get_custom_dial(ble_dial_uid, name_str); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 自定义表盘安装完毕,注册:%s(ID:%d)\n", name_str, ble_dial_uid); + install_Register_dial(name_str, ble_dial_uid); + ble_set_dial_by_id(ble_dial_uid); + } else { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 自定义表盘未达安装条件(当前索引:%d,总数:%d)\n", + ble_dial_file_index, ble_dial_file_count); + } + } + + // 删除源lzma文件 + #if 1 + if (remove(lzma_filepath) != 0) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 警告:删除源lzma文件失败(路径:%s),可能残留冗余文件\n", lzma_filepath); + // 此处不返回失败,仅警告,因为核心安装已完成 + } else { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 源lzma文件已成功删除\n"); + } + #endif + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘安装流程全部完成,返回成功\n"); + return ERRCODE_SUCC; +} +static char file_name[128]={0}; +static uint32_t file_size=0; + +bool Read_tar_file_buf_send_Data(uint16_t pack_size,uint8_t id) +{ + + char *data= (char *)malloc(pack_size+1); + uint16_t read_size=0; + FILE *fp=fopen(file_name,"rb+"); + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Read_tar_file_buf_send_Data size %d\r\n",file_size); + + uint32_t pack=file_size/pack_size+1; + uint32_t pack_id=1; + if(fp==NULL) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"fopen fail %s\r\n",file_name); + free(data); + return false; + } + + do + { + memset_s(data,pack_size+1,0,pack_size+1); + read_size=fread(data,1,pack_size,fp); + if(read_size!=0) + { + ble_data_type type_={0x05,id,file_size,pack,pack_id}; + send_big_data(type_,(char *)data,read_size); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"Read_tar_file_buf_send_Data size %d\r\n",read_size); + } + + + //send_big_data(1,data,read_size,file_size,pack_id,pack,id,5); + pack_id++; + + } while (read_size==pack_size); + free(data); + fclose(fp); + sendbigDataBufState = false; + return true; +} + + +void delete_app(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t crcvalue) +{ + + if(Check_CRC(data,len,crcvalue)) + { + if(ble_app_delete(data)) + { + ble_reply_cmd(cmd,1); + } + else + { + ble_reply_cmd(cmd,2); + } + + } + else + { + ble_reply_cmd(cmd,0); + } + +} + +void get_app_list(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t crcvalue) +{ + + if(Check_CRC(data,len,crcvalue)) + { + cJSON *jdata=ble_app_list(); + + if(jdata) + { + + char *jsonString = cJSON_PrintUnformatted(jdata); + + if (jsonString == NULL) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error printing JSON to string\n"); + cJSON_Delete(jdata); + return; + } + + uint32_t data_len = strlen(jsonString); + cJSON_Delete(jdata); + + if (data_len == 0) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error: JSON string length is 0\n"); + return; + } + int num=(ble_nus_max_data_len-18); + if(num>482)num=482; + + send_long_data(jsonString,num,0x06,0x0E); + + cJSON_free(jsonString); + } + + + } + else + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"CRC ERROR!"); + ble_reply_cmd(cmd,0); + } + +} + +void get_watch_msg(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t crcvalue) +{ + + if(Check_CRC(data,len,crcvalue)) + { + cJSON *jdata=ble_get_watch_msg(); + + if(jdata) + { + + char *jsonString = cJSON_PrintUnformatted(jdata); + + if (jsonString == NULL) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error printing JSON to string\n"); + cJSON_Delete(jdata); + return; + } + + uint32_t data_len = strlen(jsonString); + cJSON_Delete(jdata); + + if (data_len == 0) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error: JSON string length is 0\n"); + return; + } + int num=(ble_nus_max_data_len-18); + if(num>482)num=482; + + send_long_data(jsonString,num,0x06,0x0F); + + cJSON_free(jsonString); + } + + + } + else + { + ble_reply_cmd(cmd,0); + } + +} + + +bool read_dir_send_json() +{ + + char *send_buf=NULL; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"read_dir_send_json xxxxxxxx\r\n"); + memset_s(file_name,128,0,128); + send_buf=tar_dir_to_json_buf_malloc_(file_name,&file_size); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"read_dir_send_json end\r\n"); + if( send_buf!=NULL) + { + //send_big_data(1,send_buf,strlen(send_buf),strlen(send_buf),1,1,0x26,0x04); + + ble_data_type type_={0x04,0x26,strlen(send_buf),1,1}; + + send_big_data(type_,(char *)send_buf,strlen(send_buf)); + + free(send_buf); + return true; + } + else + { + return false; + } +} + +void decode_file_checksum_2AE6(ble_read_data *buffer_handle) +{ + uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_SLOW); + + uint8_t msg_crc = get_crc_from_lrc(buffer_handle->lrcvalue); + if ((msg_crc == buffer_handle->crcvalue) + || (buffer_handle->cmd_header.direction == MSG_DIRECTION_RECV_ANDROID )) + { + uint8_t file_crc = get_crc_from_lrc(buffer_handle->file_recv_stat.lrcvalue); + uint8_t crc_recv = buffer_handle->data[sizeof(msg_header_t)]; +#if 1 + if ((file_crc == crc_recv) || + (buffer_handle->cmd_header.direction == MSG_DIRECTION_RECV_ANDROID)) +#else + if (file_crc == crc_recv) +#endif + { + ble_reply_cmd(FILE_CHECKSUM_RECV_CMD_ZHIHUI,1); + switch(buffer_handle->file_recv_stat.file_type) + { + case 1: //ota + ble_reply_cmd(FILE_SUCC_TRANSFER,1); + do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_STARTOTA,NULL,0); + TRANSMIT_DATA=TRANS_OTA_SUCC; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + + break; + case 2://mp3 + TRANSMIT_DATA=TRANS_MP3_SUCC; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + + ble_reply_cmd(FILE_SUCC_TRANSFER,1); + ble_mp3_list_update(); + + break; + case 3://dial + //TODO: 设置成当前下载的表盘 + if (install_dial() == ERRCODE_SUCC) + { + //ble_set_dial_by_id(ble_dial_uid); + + if(ble_dial_uid>5 || ble_dial_file_index==ble_dial_file_count) + { + TRANSMIT_DATA= TRANS_DIAL_SUCC; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + //0504 + ble_reply_cmd(DIAL_SUCC_INSTALL,1); + } + + + + // ble_reply_cmd(GET_TRANS_END_CMD,1); + + } + else + { + TRANSMIT_DATA= TRANS_DIAL_FAIL; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + + ble_reply_cmd(DIAL_SUCC_INSTALL,0); + + } + break; + case 4://dial + TRANSMIT_DATA=TRANS_BIN_SUCC; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + if( ble_bin_install(app_name)) + ble_reply_cmd(FILE_SUCC_TRANSFER,1); + else + ble_reply_cmd(FILE_SUCC_TRANSFER,0); + + // ble_mp3_list_update(); + + break; + default: + break; + } + }else{ + ble_reply_cmd(FILE_CHECKSUM_RECV_CMD_ZHIHUI,2); + switch (buffer_handle->file_recv_stat.file_type) + { + case 1: //ota + TRANSMIT_DATA=TRANS_OTA_FAIL; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + break; + case 2://mp3 + TRANSMIT_DATA=TRANS_MP3_FAIL; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + + break; + case 3://dial + TRANSMIT_DATA= TRANS_DIAL_FAIL; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + break; + + case 4://dial + TRANSMIT_DATA= TRANS_BIN_FAIL; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + + break; + default: + break; + } + + } + }else{ + ble_reply_cmd(FILE_CHECKSUM_RECV_CMD_ZHIHUI,0); + switch (buffer_handle->file_recv_stat.file_type) + { + case 1: //ota + TRANSMIT_DATA=TRANS_OTA_FAIL; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + break; + case 2://mp3 + TRANSMIT_DATA=TRANS_MP3_FAIL; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + + break; + case 3://dial + TRANSMIT_DATA= TRANS_DIAL_FAIL; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + break; + case 4://dial + TRANSMIT_DATA= TRANS_BIN_FAIL; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + break; + default: + break; + } + } + buffer_handle->file_recv_stat.recv_file_stat=0; +} + +void decode_file_checksum(ble_read_data *buffer_handle) +{ + uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_SLOW); + + uint8_t msg_crc = get_crc_from_lrc(buffer_handle->lrcvalue); + if ((msg_crc == buffer_handle->crcvalue) + || (buffer_handle->cmd_header.direction == MSG_DIRECTION_RECV_ANDROID )) + { + uint8_t file_crc = get_crc_from_lrc(buffer_handle->file_recv_stat.lrcvalue); + uint8_t crc_recv = buffer_handle->data[sizeof(msg_header_t)]; +#if 1 + if ((file_crc == crc_recv) || + (buffer_handle->cmd_header.direction == MSG_DIRECTION_RECV_ANDROID)) +#else + if (file_crc == crc_recv) +#endif + { + ble_reply_cmd(FILE_CHECKSUM_RECV_CMD,1); + switch(buffer_handle->file_recv_stat.file_type) + { + case 1: //ota + do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_STARTOTA,NULL,0); + + TRANSMIT_DATA=TRANS_OTA_SUCC; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + + + break; + case 2://mp3 + TRANSMIT_DATA=TRANS_MP3_SUCC; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + + ble_reply_cmd(DIAL_INSTALL_REPY_CMD,1); + ble_mp3_list_update(); + + break; + case 3://dial + //TODO: 设置成当前下载的表盘 + if (install_dial() == ERRCODE_SUCC) + { + //ble_set_dial_by_id(ble_dial_uid); + + if(ble_dial_uid>5 || ble_dial_file_index==ble_dial_file_count) + { + TRANSMIT_DATA= TRANS_DIAL_SUCC; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + //0504 + ble_reply_cmd(DIAL_INSTALL_REPY_CMD,1); + } + + + + // ble_reply_cmd(GET_TRANS_END_CMD,1); + + } + else + { + TRANSMIT_DATA= TRANS_DIAL_FAIL; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + + ble_reply_cmd(DIAL_INSTALL_REPY_CMD,0); + + } + break; + default: + break; + } + }else{ + ble_reply_cmd(FILE_CHECKSUM_RECV_CMD,2); + switch (buffer_handle->file_recv_stat.file_type) + { + case 1: //ota + TRANSMIT_DATA=TRANS_OTA_FAIL; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + break; + case 2://mp3 + TRANSMIT_DATA=TRANS_MP3_FAIL; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + + break; + case 3://dial + TRANSMIT_DATA= TRANS_DIAL_FAIL; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + + break; + default: + break; + } + + } + }else{ + ble_reply_cmd(FILE_CHECKSUM_RECV_CMD,0); + switch (buffer_handle->file_recv_stat.file_type) + { + case 1: //ota + TRANSMIT_DATA=TRANS_OTA_FAIL; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + break; + case 2://mp3 + TRANSMIT_DATA=TRANS_MP3_FAIL; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + + break; + case 3://dial + TRANSMIT_DATA= TRANS_DIAL_FAIL; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + break; + default: + break; + } + } + buffer_handle->file_recv_stat.recv_file_stat=0; + +} + +void type2AE0Data(ble_read_data *buffer_handle) +{ + uint16_t typeID = buffer_handle->cmd_header.cmdtype*256 + buffer_handle->cmd_header.cmdid; + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"type2AE0Data typeID:0x%04X datalen %d\r\n",typeID,buffer_handle->totalDataLen); + + bool checkcrc = (get_crc_from_lrc(buffer_handle->lrcvalue) == buffer_handle->crcvalue); + + uint32_t num; + if ( (checkcrc == true ) || + (buffer_handle->cmd_header.direction == MSG_DIRECTION_RECV_ANDROID)) + { + switch (typeID) //ID + { + case OTA_FILE_RECV_CMD:// + { + if (decode_ota_json( buffer_handle) == ERRCODE_SUCC) + { + ble_reply_cmd(OTA_FILE_RECV_CMD,1); + }else{ + ble_reply_cmd(OTA_FILE_RECV_CMD,2); + } + } + break; + case MP3_FILE_RECV_CMD: + { + if (decode_mp3_json( buffer_handle) == ERRCODE_SUCC) + { + ble_reply_cmd(MP3_FILE_RECV_CMD,1); + }else{ + ble_reply_cmd(MP3_FILE_RECV_CMD,2); + } + } + break; + case DIAL_FILE_RECV_CMD: + { + if (decode_dial_info( buffer_handle) == ERRCODE_SUCC) + { + + //if(ble_dial_uid >=5 && + // if(get_dial_num()>=MAX_BLE_EVENT_DIAL_NUM) + // { + // ble_reply_cmd(DIAL_FILE_RECV_CMD,3); + + // } + //else + { + + ble_reply_cmd(DIAL_FILE_RECV_CMD,1); + } + + }else{ + ble_reply_cmd(DIAL_FILE_RECV_CMD,2); + } + } + break; + case FILE_CHECKSUM_RECV_CMD: + decode_file_checksum(buffer_handle); + break; + case SINGLE_DIAL_FILE_RECV_CMD: + if (decode_single_dial_info(buffer_handle) == ERRCODE_SUCC) + { + ble_reply_cmd(SINGLE_DIAL_FILE_RECV_CMD,1); + } else { + ble_reply_cmd(SINGLE_DIAL_FILE_RECV_CMD,2); + } + break; + case EPO_DATA_RECV_CMD: + break; + case APP_INAUIRE_EXC_FILE_CMD: + get_tar_dir_file_count(); + + if(!read_dir_send_json()) + { + ble_reply_cmd(APP_INAUIRE_EXC_FILE_CMD,2); + } + break; + + case APP_START_SEND_EXC_FILE_CMD: + num=(ble_nus_max_data_len-18); + if(num>482)num=482; + if(!Read_tar_file_buf_send_Data(num,0x63)) + { + ble_reply_cmd(APP_START_SEND_EXC_FILE_CMD,2); + } + break; + case APP_SEND_EXC_FILE_END_CMD: + if(!tar_rmove(file_name)) + { + ble_reply_cmd(APP_SEND_EXC_FILE_END_CMD,2); + } + if(!read_dir_send_json()) + { + ble_reply_cmd(APP_SEND_EXC_FILE_END_CMD,2); + } + break; + + + default: + break; + } + + }else{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"type2AE0Data CRC failed!\n"); + } + +} +// +void type2AE6Data(ble_read_data *buffer_handle,uint8_t *cmd_buf ,uint8_t *data,uint16_t datalen,uint8_t *totaldata,uint8_t crcvalue) +{ + uint16_t cmd = cmd_buf[1]*256+cmd_buf[2]; + #ifdef BLE_LOG + + #endif + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"type2AE6Data:0x%04X\r\n",cmd); + // uint8_t typeID = cmd_buf[2]; + switch (cmd) + { + case OTA_FILE_MSG_CMD : + { + if (decode_ota_json( buffer_handle) == ERRCODE_SUCC) + { + ble_reply_cmd(OTA_FILE_MSG_CMD,1); + }else{ + ble_reply_cmd(OTA_FILE_MSG_CMD,2); + } + } + break; + + case OTA_FILE_RECV_CMD:// + { + if (decode_ota_json( buffer_handle) == ERRCODE_SUCC) + { + ble_reply_cmd(OTA_FILE_RECV_CMD,1); + }else{ + ble_reply_cmd(OTA_FILE_RECV_CMD,2); + } + } + break; + + + case DIAL_COLLECT_FILE_CMD : + { + if (decode_dial_info( buffer_handle) == ERRCODE_SUCC) + { + ble_reply_cmd(DIAL_COLLECT_FILE_CMD,1); + }else{ + ble_reply_cmd(DIAL_COLLECT_FILE_CMD,2); + } + break; + } + + case DIAL_SINGEL_FILE_CMD : + { + if (decode_single_dial_info(buffer_handle) == ERRCODE_SUCC) + { + ble_reply_cmd(DIAL_SINGEL_FILE_CMD,1); + + } else { + + ble_reply_cmd(DIAL_SINGEL_FILE_CMD,2); + + } + break; + } + case MP3_FILE_CMD : + { + if (decode_mp3_json( buffer_handle) == ERRCODE_SUCC) + { + ble_reply_cmd(MP3_FILE_CMD,1); + }else{ + ble_reply_cmd(MP3_FILE_CMD,2); + } + } + break; + case BIN_FILE_CMD : + { + if (decode_bin_json( buffer_handle) == ERRCODE_SUCC) + { + ble_reply_cmd(BIN_FILE_CMD,1); + }else{ + ble_reply_cmd(BIN_FILE_CMD,2); + } + } + break; + + + case FILE_CHECKSUM_RECV_CMD: + decode_file_checksum(buffer_handle); + break; + // case OTA_FILE_DATA_CMD : + // { + // if (decode_ota_data( buffer_handle,data,datalen, crcvalue) == ERRCODE_SUCC) + // { + + // }else{ + // ble_reply_cmd(OTA_FILE_DATA_CMD,0); + // } + // } + + case FILE_CHECKSUM_RECV_CMD_ZHIHUI : + decode_file_checksum_2AE6(buffer_handle); + break; + + case OTA_FILE_FAIL_CMD : + + break; + + case APP_DELETE_CMD : + delete_app( cmd, data,datalen,crcvalue); + break; + case GET_LIST_CMD : + + get_app_list( cmd, data,datalen,crcvalue); + + break; + case GET_APP_MSG_CMD: + get_watch_msg( cmd, data,datalen,crcvalue); + + break; + default: + break; + } +} + + + + +void dumpHeader(msg_header_t *msgheader) +{ + #ifdef BLE_LOG + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"dumpHeader(%d) direction %02X, type %02X, id %02X, package_count %d, total_data_len %d,package_index %d , package_len %d\n", + sizeof(msg_header_t), + msgheader->direction, + msgheader->cmdtype, + msgheader->cmdid, + msgheader->package_count, + msgheader->total_data_len, + msgheader->package_index, + msgheader->package_len + ); + #endif +} + +errcode_t check_header(msg_header_t *header ) +{ + if( (header->direction == MSG_DIRECTION_RECV || header->direction == MSG_DIRECTION_RECV_ANDROID) + && (header->cmdtype > 0 && header->cmdtype <= 6 ) + && (header->cmdid > 0 && header->cmdid <= 0x50 ) + ) + { + // 这个是合理的值,可以当做header来处理 + dumpHeader(header); + return ERRCODE_SUCC; + }else{ + //非header + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"not first package , no header!\n"); + return ERRCODE_FAIL; + } +} + + +errcode_t cancel_recv_file(uint8_t flag) +{ + if(BR_TRANSFER_timer) + { + timer_flie_flag=0; + osTimerStop(BR_TRANSFER_timer); + osTimerDelete(BR_TRANSFER_timer); + BR_TRANSFER_timer = NULL; + } + + if(ble_read_timer_p) + { + if(flag) + { + if(ble_read_timer_p->file_recv_stat.file_type==1) + { + TRANSMIT_DATA=TRANS_OTA_FAIL; + } + else if (ble_read_timer_p->file_recv_stat.file_type==3) + { + TRANSMIT_DATA=TRANS_DIAL_FAIL; + } + else if(ble_read_timer_p->file_recv_stat.file_type==2) + { + TRANSMIT_DATA=TRANS_MP3_FAIL; + } + else if(ble_read_timer_p->file_recv_stat.file_type==4) + { + TRANSMIT_DATA=TRANS_BIN_FAIL; + } + + else + { + TRANSMIT_DATA=TRANS_FREE; + } + ble_reply_cmd(FILE_RECV_REPLY_STAT_CMD,0);//接收失败 + } + else + { + TRANSMIT_DATA=TRANS_FREE; + } + + ble_read_timer_p->receive_file_flag = 0; + + if (ble_read_timer_p->file_recv_stat.recv_file_stat != 2) //已经下载完毕的文件,没有必要cancel了。 + { + if (ble_read_timer_p->file_recv_stat.file!=NULL) + { + fclose(ble_read_timer_p->file_recv_stat.file); + ble_read_timer_p->file_recv_stat.file = NULL; + } + + if (ble_read_timer_p->file_recv_stat.file_type == 2) + { + char musicpath[64]={0}; + get_music_path(musicpath,64); + //"/user/userdata/music" + char filepath[256]={0}; + create_mp3_name(filepath,musicpath,ble_read_timer_p->file_recv_stat.file_name); + remove(filepath); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"filepath %s\r\n",filepath); + } + else if (ble_read_timer_p->file_recv_stat.file_type == 3) + { + char filepath[128]={0}; + if (get_file_recv_file_path(ble_read_timer_p->file_recv_stat.file_name,strlen(ble_read_timer_p->file_recv_stat.file_name),filepath,sizeof(filepath)) == ERRCODE_SUCC) + { + remove(filepath); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"filepath %s\r\n",filepath); + } + } + + if (ble_read_timer_p->file_recv_stat.file_name != NULL) + { + free(ble_read_timer_p->file_recv_stat.file_name); + ble_read_timer_p->file_recv_stat.file_name=NULL; + } + ble_read_timer_p->file_recv_stat.recv_file_stat = -1; + //ble_read_timer_p=NULL; + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + } + // else + // { + // CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + // } + ble_read_timer_p=NULL; + + } + + + + return ERRCODE_SUCC; +} + +uint8_t get_OTA_recv_value() +{ + return OTA_FILE_value; +} + +void Set_OTA_recv_value() +{ + OTA_FILE_value=0; + return; +} + +static errcode_t save_package_sample(ble_read_data *buffer_handle,uint8_t *data, uint16_t event_size) +{ + + //保存前 4 bytes + 最后 1 byte + int save_len = 4; + uint8_t last_byte = calculate_lrc(data,event_size,0x00); + if (event_size < 4) + { + save_len = event_size; + } + memset(buffer_handle->last_data_sample,0,sizeof(buffer_handle->last_data_sample)); + buffer_handle->last_data_size = event_size; + memcpy_s(buffer_handle->last_data_sample,sizeof(buffer_handle->last_data_sample),data,save_len); + buffer_handle->last_data_sample[4]=last_byte; + + return ERRCODE_SUCC; +} +static errcode_t check_package_same(uint8_t* lastdata,uint8_t *newdata , uint16_t cmp_size) +{ + + + //对比前 4 bytes + 最后 1 byte + int save_len = 4; + uint8_t current_sample_data[5]; + uint8_t last_byte = calculate_lrc(newdata,cmp_size,0x00); + if (cmp_size < 4) + { + save_len = cmp_size; + } + memset(current_sample_data,0,sizeof(current_sample_data)); + memcpy_s(current_sample_data,sizeof(current_sample_data),newdata,save_len); + current_sample_data[4]=last_byte; + + if (memcmp(lastdata,newdata,5)==0) + { + return ERRCODE_SUCC; + }else{ + return ERRCODE_FAIL; + } +} + +errcode_t handle_recv_file(ble_read_data *buffer_handle,uint8_t *data, uint16_t event_size) +{ + + if( event_size == 0 || data == NULL ) return ERRCODE_FAIL; + + if (buffer_handle->last_data_size == event_size) + { + if (check_package_same(buffer_handle->last_data_sample,data,event_size) == ERRCODE_SUCC) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error handle_recv_file recve same package header 0x%02X%02X%02X%02X end 0x%02X skip \n" + ,buffer_handle->last_data_sample[0] + ,buffer_handle->last_data_sample[1] + ,buffer_handle->last_data_sample[2] + ,buffer_handle->last_data_sample[3] + ,buffer_handle->last_data_sample[4]); + // return ERRCODE_FAIL; + } + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file %d\n",event_size); + save_package_sample(buffer_handle,data,event_size); + + + //第一帧要创建文件 + if((buffer_handle->file_recv_stat.recv_file_stat <= 0) && buffer_handle->file_recv_stat.file == NULL ) + { + buffer_handle->file_recv_stat.lrcvalue = 0; + if (buffer_handle->file_recv_stat.file_type == 1) + { + + buffer_handle->file_recv_stat.file = fopen(UP_DATE_FWPKG_PATH,"w+"); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",UP_DATE_FWPKG_PATH,buffer_handle->file_recv_stat.file); + + } + else if (buffer_handle->file_recv_stat.file_type == 2) + { + char musicpath[64]={0}; + get_music_path(musicpath,64); + //"/user/userdata/music" + char filepath[256]={0}; + create_mp3_name(filepath,musicpath,buffer_handle->file_recv_stat.file_name); + + buffer_handle->file_recv_stat.file = fopen(filepath,"w+"); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"filepath %s\r\n",filepath); + } + else + { + char filepath[128]={0}; + 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) + { + buffer_handle->file_recv_stat.file = fopen(filepath,"w+"); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",filepath,buffer_handle->file_recv_stat.file); + }else{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s error %X\n",buffer_handle->file_recv_stat.file_name,buffer_handle->file_recv_stat.file); + } + } + if (buffer_handle->file_recv_stat.file == NULL) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"6185 buffer_handle->file_recv_stat.file NULL\n"); + return ERRCODE_FAIL; + } + buffer_handle->file_recv_stat.recv_file_stat = 1; + OTA_FILE_value=0; + ////////////////创建文件传输超时定时器////////////////// + uint32_t tick; + osStatus_t retTimer; + if(BR_TRANSFER_timer!=NULL) + { + osTimerDelete(BR_TRANSFER_timer); + BR_TRANSFER_timer = NULL; + } + ble_read_timer_p=buffer_handle; + timer_flie_flag=10; + + BR_TRANSFER_timer = osTimerNew((osTimerFunc_t)ble_transfer_Timer_CallBack, osTimerPeriodic, NULL, NULL); + tick =1000;// osMs2Tick(1000); + retTimer = osTimerStart(BR_TRANSFER_timer, tick); + if (retTimer != osOK && BR_TRANSFER_timer != NULL) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"StartCallTimer osTimerStart failed, ret = %lx!!", retTimer); + osTimerDelete(BR_TRANSFER_timer); + BR_TRANSFER_timer = NULL; + return ERRCODE_FAIL; + } + // if(buffer_handle->file_recv_stat.received_size==0) + { + if(buffer_handle->file_recv_stat.file_type==3) + TRANSMIT_DATA=TRANS_DIAL_TRANSMITTING; + + if(buffer_handle->file_recv_stat.file_type==1) + TRANSMIT_DATA=TRANS_OTA_TRANSMITTING; + + if(buffer_handle->file_recv_stat.file_type==2) + TRANSMIT_DATA=TRANS_MP3_TRANSMITTING; + + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + } + + /////////////////////////////////////////////////////////// + } + if (buffer_handle->file_recv_stat.file == NULL) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"6194 buffer_handle->file_recv_stat.file \n"); + return ERRCODE_FAIL; + } + //写入文件 + size_t writtensize = fwrite(data,1,event_size,buffer_handle->file_recv_stat.file); + if(writtensize == event_size) + { + timer_flie_flag=10; + + buffer_handle->file_recv_stat.lrcvalue = calculate_lrc(data,event_size,buffer_handle->file_recv_stat.lrcvalue); + buffer_handle->file_recv_stat.received_size += event_size; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file received_size %d\n",buffer_handle->file_recv_stat.received_size); + OTA_FILE_value= ((float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size) *100; + + + }else{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file write file failed! ret %d != %d\n",writtensize,event_size); + return ERRCODE_FAIL; + } + + //检查文件是否写完 + if(buffer_handle->file_recv_stat.file_size == buffer_handle->file_recv_stat.received_size) + { + if (buffer_handle->file_recv_stat.file!=NULL) + { + fclose(buffer_handle->file_recv_stat.file); + buffer_handle->file_recv_stat.file = NULL; + } + if (buffer_handle->file_recv_stat.file_name != NULL) + { + free(buffer_handle->file_recv_stat.file_name); + buffer_handle->file_recv_stat.file_name=NULL; + } + buffer_handle->file_recv_stat.recv_file_stat = 2; + buffer_handle->receive_file_flag = 0; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file received success \n"); + + if(BR_TRANSFER_timer) + { + osTimerStop(BR_TRANSFER_timer); + osTimerDelete(BR_TRANSFER_timer); + BR_TRANSFER_timer = NULL; + } + ble_read_timer_p=NULL; + TRANSMIT_DATA=FILE_IS_DONE; + + CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); + + ble_reply_cmd(FILE_RECV_REPLY_STAT_CMD,1);//接收成功 + } + + return ERRCODE_SUCC; +} + +//长数据解析 +void bleLongRecvData(ble_read_data *buffer_handle,uint8_t *data, uint16_t data_size,uint8_t *buf_cmd,uint8_t *totalData,uint8_t crcvalue)//buf_cmd 指令前17个字节数据 +{ + uint8_t type=buf_cmd[1]; + #ifdef BLE_LOG + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"type:%d %d data_size:%d data:%x crcvalue:%x\r\n", + buffer_handle->cmd_header.cmdtype, + buffer_handle->cmd_header.cmdid, + data_size, + data, + crcvalue); + #endif + + if(buffer_handle->handle==data2ae4Cmd) + { + type2AE4Data(buffer_handle,buf_cmd,data,data_size,totalData,crcvalue); + } + else if (buffer_handle->handle==data2ae3Cmd) + { + type2AE3Data(buffer_handle,buf_cmd,data,data_size,totalData,crcvalue); + } + else if (buffer_handle->handle==data2ae1Cmd) + { + type2AE1Data(buf_cmd,data,data_size,totalData,crcvalue); + } + else if (buffer_handle->handle==data2ae0Cmd) + { + type2AE0Data(buffer_handle); + } + else if (buffer_handle->handle==data2ae6Cmd) + { + type2AE6Data(buffer_handle,buf_cmd,data,data_size,totalData,crcvalue); + } +} + + +/// @brief 解码收到的msg +/// @param buffer_handle +/// @return +static errcode_t handle_ble_msg(ble_read_data *buffer_handle) +{ + + if(buffer_handle->buffer_to_file == 0) + { + bleLongRecvData(buffer_handle,buffer_handle->data+sizeof(msg_header_t),buffer_handle->totalDataLen,(uint8_t*)(&buffer_handle->cmd_header),buffer_handle->data,buffer_handle->crcvalue); + + }else{ + //处理缓存成文件的 + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle ble msg file buffer! not implement\n"); + } + return ERRCODE_SUCC; +} +/***** + * 组包函数 + * 组包校验完成,在分发给对应的handler去解码协议。 + * +*/ +errcode_t combine_data_internal(ble_read_data *buffer_handle,uint8_t *totalData, uint16_t event_size) +{ + + + if(buffer_handle->receive_file_flag == 1 ) + { + //接收文件 + if(buffer_handle->handle==data2ae6Cmd) + return decode_ota_data( buffer_handle,totalData,event_size,totalData[event_size-1]); + else + return handle_recv_file(buffer_handle,totalData,event_size); + } + + msg_header_t *header = (msg_header_t*)totalData; + //第一帧 + if (event_size > sizeof(msg_header_t) && check_header(header) == ERRCODE_SUCC ) + { + + if (header->direction == MSG_DIRECTION_RECV_ANDROID) + { + //uapi_dev_runtime_set_android_connection_status(1); + }else{ + // uapi_dev_runtime_set_android_connection_status(0); + } + buffer_handle->cmd_header.direction = header->direction; + buffer_handle->cmd_header.cmdtype = header->cmdtype; + buffer_handle->cmd_header.cmdid = header->cmdid; + buffer_handle->cmd_header.package_count = header->package_count; + buffer_handle->cmd_header.total_data_len = header->total_data_len; + buffer_handle->cmd_header.package_len = header->package_len; + buffer_handle->cmd_header.package_index = header->package_index; + //如果有历史数据,没有被清空,可能是历史错误数据,则清空内存。 + if (buffer_handle->data!=NULL && buffer_handle->data_len > 0) + { + free(buffer_handle->data); + buffer_handle->data = NULL; + } + if (buffer_handle->tmpfilehandle!=NULL && buffer_handle->data_len>0) + { + fclose(buffer_handle->tmpfilehandle); + buffer_handle->tmpfilehandle = NULL; + } + buffer_handle->data_len = 0; + buffer_handle->crcvalue = 0; + buffer_handle->lrcvalue = 0; + buffer_handle->buffer_to_file = 0; + buffer_handle->decode_type = 0; + buffer_handle->tmpfilehandle = NULL; + uint32_t timestamp_ble=0; + uapi_get_timestampe_ss(×tamp_ble); + buffer_handle->last_timestamp = timestamp_ble; + buffer_handle->totalDataLen = buffer_handle->cmd_header.total_data_len; + if (buffer_handle->totalDataLen > MAX_BLE_MSG_PACKAGE_LEN || buffer_handle->totalDataLen < 0 ) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"package is too lardge (%d) than (%d) or too small !\n",buffer_handle->totalDataLen,MAX_BLE_MSG_PACKAGE_LEN); + return ERRCODE_FAIL; + } + if(buffer_handle->totalDataLen+sizeof(msg_header_t)+1 > MAX_BLE_MSG_PACKAGE_LEN) + { + //如果总长度超过限定大小,则写入文件做缓存。 + buffer_handle->buffer_to_file = 1; + int filelen = strlen(BLE_MSG_TMP_FILE_NAME); + buffer_handle->data = malloc(filelen); + if (buffer_handle->data== NULL) + { + return ERRCODE_MALLOC; + } + //生成临时文件名 + sprintf_s((char*)buffer_handle->data,filelen,BLE_MSG_TMP_FILE_NAME,buffer_handle->handle); + buffer_handle->tmpfilehandle = fopen((const char*)buffer_handle->data,"w+"); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create ble protocol tmpfile %s handle %X\n",buffer_handle->data,buffer_handle->tmpfilehandle); + if (buffer_handle->tmpfilehandle != NULL) + { + //写buffer到文件 + size_t ret =fwrite(totalData,1,event_size,buffer_handle->tmpfilehandle); + buffer_handle->lrcvalue = calculate_lrc(totalData+sizeof(msg_header_t),header->package_len,0x00); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"write %d to buffer file!\n",ret); + } + buffer_handle->data_len += event_size; + + }else{ + //如果长度在限定大小之内。则写入内存中缓存。 + buffer_handle->buffer_to_file = 0; + buffer_handle->data = malloc(buffer_handle->totalDataLen+sizeof(msg_header_t)+1); + if (buffer_handle->data== NULL) + { + return ERRCODE_MALLOC; + } + //创建缓存开始存储包数据 + if(buffer_handle->cmd_header.package_len >=0) + { + memcpy_s(buffer_handle->data,buffer_handle->totalDataLen+sizeof(msg_header_t)+1,totalData,event_size); + buffer_handle->lrcvalue = calculate_lrc(totalData+sizeof(msg_header_t),header->package_len,0x00); + buffer_handle->data_len += event_size; + } + + //单一包 + if(event_size == sizeof(msg_header_t)+buffer_handle->totalDataLen+1) + { + buffer_handle->crcvalue = totalData[event_size-1]; + } + } + + }else{ + //处理第二包以后的数据 + + //经过第一包处理,仍然data==NULL证明第一帧就是错的,要退出解析。 + if (buffer_handle->data== NULL) + { + return ERRCODE_MALLOC; + } + //此处是最后一帧 event_size = (buffer_handle->totalDataLen-buffer_handle->data_len) + 1 + if (event_size == (buffer_handle->totalDataLen + sizeof(msg_header_t) + 1 -buffer_handle->data_len )) + { + if(buffer_handle->buffer_to_file == 1) + { + fwrite(totalData,1,event_size,buffer_handle->tmpfilehandle); + + }else{ + memcpy_s(buffer_handle->data+buffer_handle->data_len,buffer_handle->totalDataLen,totalData,event_size); + + } + buffer_handle->lrcvalue = calculate_lrc(totalData,event_size,buffer_handle->lrcvalue); + buffer_handle->data_len += event_size; + }else if (event_size < (buffer_handle->totalDataLen + sizeof(msg_header_t) + 1 - buffer_handle->data_len)) //中间帧 + { + if(buffer_handle->buffer_to_file == 1) + { + fwrite(totalData,1,event_size,buffer_handle->tmpfilehandle); + + }else{ + memcpy_s(buffer_handle->data+buffer_handle->data_len,(buffer_handle->totalDataLen + sizeof(msg_header_t) + 1 - buffer_handle->data_len),totalData,event_size); + + } + buffer_handle->lrcvalue = calculate_lrc(totalData,event_size,buffer_handle->lrcvalue); + buffer_handle->data_len += event_size; + }else{ //异常帧 + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"error event_size %d , should <= %d\n",event_size, (buffer_handle->totalDataLen + sizeof(msg_header_t) + 1 - buffer_handle->data_len) ); + + } + + } + //如果包完整接收,进行crc校验 + if( (buffer_handle->totalDataLen + sizeof(msg_header_t) + 1 ) == buffer_handle->data_len ) + { + //我们认为最后一个包,应该不包含其他包,因此其最后一位,应当就是crc值,因此可直接获取crc值 + buffer_handle->crcvalue = buffer_handle->data[buffer_handle->data_len - 1];//获取crc + //最后一位校验位清0,方便字符串处理 + buffer_handle->data[buffer_handle->data_len - 1] = 0; + + //缓存到文件的,处理方法会不同因此单独解决 + if(buffer_handle->buffer_to_file == 1) + { + //先关闭临时文件,然后把文件名给协议解析函数即可。 + if (buffer_handle->tmpfilehandle != NULL) + { + fclose(buffer_handle->tmpfilehandle); + buffer_handle->tmpfilehandle=NULL; + } + } + // #define COMMON_CRC_MSG + //通用回复crc校验结果,不是所有指令都一致,暂时取消,在每个指令内部进行回复 + #ifdef COMMON_CRC_MSG + if (get_crc_from_lrc(buffer_handle->lrcvalue) != buffer_handle->crcvalue) + { + //发送校验失败 + ble_reply_msg(buffer_handle->cmd_header.cmdtype,buffer_handle->cmd_header.cmdid,0); + + }else + #endif + { + //协议解析指令 + handle_ble_msg(buffer_handle); + } + //所有操作都完成,要释放 data + if(buffer_handle->data != NULL) + { + free(buffer_handle->data); + buffer_handle->data=NULL; + } + + } + return ERRCODE_SUCC; +} + + + +void bleDataRecv(uint8_t *totalData, uint16_t event_size,uint16_t handle) +{ + + if (event_size < sizeof(msg_header_t)) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"event size (%d) is less than msg_header_t (%d) ",event_size,sizeof(msg_header_t)); + // return ; + } + #ifdef BLE_LOG + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"bleDataRecv handle:%d\r\n",handle); + #endif + int last_unused_handle_index = -1; + int handle_index_found = -1; + for(int i = 0;i=0 && handle_index_found == -1) + { + handle_index_found = last_unused_handle_index; + } + + if(handle_index_found>=0) + { + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_index_found:index %d addr %X\r\n",handle_index_found,&handle_l[handle_index_found]); + handle_l[handle_index_found].handle = handle; + combine_data_internal(&handle_l[handle_index_found],totalData,event_size); + } + else + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"no empty handle_l found! skip this msg!\n"); + + +} + +void free_ble_data(void)//以防断开蓝牙没有释放数据类型 +{ + blesrv_service_recv_msg_handler(0xff,(uint8_t*)"clean",6); + return; + +} + + +void cancel_AI_cur_chat(void) +{ + blesrv_service_recv_msg_handler(0xff,(uint8_t*)"AI_cancel_AI",13); + return; + //send_big_data(0, (char *)&data, 1, 1, 1, 1, 0x07, 5); +} + +void free_ble_data_Event(void)//以防断开蓝牙没有释放数据类型 +{ + + totalpack = 0; + muiltFlag = 0; + packdataLen = 0; + totalDataLen = 0; + ANCSBigBufFlag = 0; + + recvBigDataBufState = false; + sendbigDataBufState = false; + + is_connect_synchronization_time=0; + + + cancel_recv_file(1); + + for (int i = 0 ; i < MAX_HANDLE_NUM ; i++) + { + if (handle_l[i].data != NULL) + { + free(handle_l[i].data); + handle_l[i].data=NULL; + } + memset((void*)&handle_l[i],0,sizeof(ble_read_data)); + } + return; + +} + +//发送AI录音准备就绪国内/ +/*使用模型: +0:文心一言 +1:ChatGPT +2:KIMI +3:豆包*/ +bool send_AI_is_ready_(uint8_t type) +{ + + if(AI_is_end_state==0) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"发送AI准备就绪\r\n"); + ble_data_type type_={0x05,0x05,1,1,1}; + send_big_data(type_,(char *)&type,1); + AI_is_end_state=1; + return true; + } + else + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"发送AI准备就绪失败,没有正确回复结束\r\n"); + return false; + } + //send_big_data(0, (char *)&type, 1, 1, 1, 1, 0x05, 5); +} + +static uint8_t AI_is_ready_type=0; + +bool send_AI_is_ready(uint8_t type) +{ + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"发送AI准备就绪\r\n"); + AI_is_ready_type=type; + blesrv_service_recv_msg_handler(0xff,(uint8_t*)"AI_is_ready",12); + return true; +} + +void cancel_AI_cur_chat_(void) +{ + //if(AI_is_end_state) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"取消当前AI对话\r\n"); + uint8_t data=1; + ble_data_type type_={0x05,0x07,1,1,1}; + send_big_data(type_,(char *)&data,1); + AI_is_end_state=0; + + } + //else + // { + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"已经取消当前AI对话无需再次取消\r\n"); + // } + + + //send_big_data(0, (char *)&data, 1, 1, 1, 1, 0x07, 5); +} + +//接收app下发的原始数据 +void revBleOldData(uint8_t *buf, uint16_t event_size,uint16_t handle)//每包的数据大小 +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle :%d %s event_size %d\r\n",handle,getHandlname(handle),event_size); + if(handle==0xff) + { + if(strcmp("AI_cancel_AI",(char *)buf)==0) + { + cancel_AI_cur_chat_(); + } + else if(strcmp("AI_is_ready",(char *)buf)==0) + { + send_AI_is_ready_(AI_is_ready_type); + } + else + { + free_ble_data_Event(); + } + + return; + } + + bleDataRecv(buf,event_size,handle); +} +#endif +#endif +#ifdef __cplusplus +} #endif \ No newline at end of file