From 68e8d2e12993e0f0a8808cb162a37be966b3027a Mon Sep 17 00:00:00 2001 From: hcj <1224667075@qq.com> Date: Wed, 26 Jun 2024 18:34:25 +0800 Subject: [PATCH] =?utf8?q?ble=E9=83=A8=E5=88=86=E5=8D=8F=E8=AE=AE=E4=BF=AE?= =?utf8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../service/ble_service/blemoder/bletest.cpp | 60 ++- .../service/ble_service/blemoder/bletest.h | 10 +- .../service/ble_service/bleservice/bleEvent.c | 347 ++++++++++++++---- .../service/ble_service/bleservice/bleEvent.h | 9 +- 4 files changed, 352 insertions(+), 74 deletions(-) diff --git a/code/sdk/application/wearable/service/ble_service/blemoder/bletest.cpp b/code/sdk/application/wearable/service/ble_service/blemoder/bletest.cpp index 1f1b67b2e..f05200931 100644 --- a/code/sdk/application/wearable/service/ble_service/blemoder/bletest.cpp +++ b/code/sdk/application/wearable/service/ble_service/blemoder/bletest.cpp @@ -55,7 +55,7 @@ extern "C" { #include "chip_io.h" #include "gpio.h" #include "pm_veto.h" - +#include "cywee_service.h" #include "rtc.h" #include "timer.h" #include "systick.h" @@ -315,6 +315,7 @@ void ble_get_drink_remind(msg_drink_info_t *data) data->drink_on = p_ConfigModel-> get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_DRINK); if(data->drink_on) data->drink_on=1; + printf("开关:%d\r\n",data->drink_on); return; @@ -576,7 +577,7 @@ uint32_t tar_rmove(char *tar_path) return 0; } -char * tar_dir_to_json_buf_malloc_(char* file_name,uint32_t *file_size) +char * tar_dir_to_json_buf_malloc_(char* file_name,uint64_t *file_size) { char dir_path[128]={0}; sprintf_s(dir_path,128,"%s",TAR_PATH); @@ -761,6 +762,8 @@ void set_user_data(msg_user_info_t *data) //目标燃脂 printf("目标燃脂 %d\r\n",data->fat_time); p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SPORTS_GOAL_DURATION,data->fat_time); + + do_cywee_service_check_msg(CYWEE_SERVICE_CMD_SET_USER_INFO, NULL); /* 时制 p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_CUSTOM_DATA_AGE,data.timeformat); @@ -922,6 +925,54 @@ void Set_DmpChangeMode(int state) p_ConfigModel->SetDmpChangeMode(state); } +void Set_heart_cmd(msg_get_heart_set_param_info_t *data) +{ + OHOS::ConfigModel *p_ConfigModel = OHOS::ConfigModel::GetInstance(); + + p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_DETECTED,data->frequence); + + p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_REMIND,data->remind_on); + if(data->remind_on) + { + p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_MAX_MIN,data->max_min); + p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_THRESHOLD_VALUE,data->heart); + } + +} + + +void Get_heart_cmd(msg_get_heart_set_param_info_t *data) +{ + OHOS::ConfigModel *p_ConfigModel = OHOS::ConfigModel::GetInstance(); + + data->frequence = p_ConfigModel->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_DETECTED); + data->remind_on = p_ConfigModel->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_REMIND); + data->max_min= p_ConfigModel->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_MAX_MIN); + data->heart = p_ConfigModel->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_THRESHOLD_VALUE); + +} + +void Set_oxygen_cmd(msg_get_spo2_set_param_info_t *data) +{ + OHOS::ConfigModel *p_ConfigModel = OHOS::ConfigModel::GetInstance(); + + p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_OXYGEN_DETECTED,data->frequence); + + p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_OXYGEN_REMIND,data->remind_on); + + p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_OXYGEN_THRESHOLD_VALUE,data->spo2); + + +} + +void Get_oxygen_cmd(msg_get_spo2_set_param_info_t *data) +{ + OHOS::ConfigModel *p_ConfigModel = OHOS::ConfigModel::GetInstance(); + + data->frequence = p_ConfigModel->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_OXYGEN_DETECTED); + data->remind_on = p_ConfigModel->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_OXYGEN_REMIND); + data->spo2= p_ConfigModel->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_OXYGEN_THRESHOLD_VALUE); +} int Get_DmpChangeMode(void) { @@ -1014,7 +1065,7 @@ const char *get_health_HEART_data_path( uint8_t day) #ifdef FD230 char timeday[12] = {0}; - uapi_get_YYMMDD_Time_extend(timeday, '\0',day); + uapi_get_YYMMDD_Time_extend(timeday,'\0',day); printf("%s\r\n",timeday); char buf[PATH_MAX_LEN]={0}; @@ -1044,10 +1095,9 @@ const char *get_health_OXYGEN_data_path(uint8_t day) #ifdef FD230 char timeday[12] = {0}; - uapi_get_YYMMDD_Time_extend(timeday, '\0',day); + uapi_get_YYMMDD_Time_extend(timeday,'\0',day); printf("%s\r\n",timeday); - char buf[PATH_MAX_LEN]={0}; sprintf_s(buf,PATH_MAX_LEN-1,"%s%s.json",OHOS::GET_HEALTH_JSON_PATH_C_STR_OXYGEN(),timeday); if(JSON_F_buf != NULL) diff --git a/code/sdk/application/wearable/service/ble_service/blemoder/bletest.h b/code/sdk/application/wearable/service/ble_service/blemoder/bletest.h index 1a24d0da8..8869e106a 100644 --- a/code/sdk/application/wearable/service/ble_service/blemoder/bletest.h +++ b/code/sdk/application/wearable/service/ble_service/blemoder/bletest.h @@ -205,6 +205,14 @@ char * ble_sywee_history(uint8_t day,uint16_t *len,uint8_t type); void Set_DmpChangeMode(int state); int Get_DmpChangeMode(void); +void Set_heart_cmd(msg_get_heart_set_param_info_t *data); + +void Get_heart_cmd(msg_get_heart_set_param_info_t *data); + +void Set_oxygen_cmd(msg_get_spo2_set_param_info_t *data); + + +void Get_oxygen_cmd(msg_get_spo2_set_param_info_t *data); //////////////////////表盘相关//////////////////////////// void ble_set_dial_by_id(uint16_t id); @@ -232,7 +240,7 @@ void ble_set_password(uint8_t falg, char * data); uint8_t ble_get_password(void); ///////////////////////文件传输////////////////////////// -char * tar_dir_to_json_buf_malloc_(char* file_name,uint32_t *file_size); +char * tar_dir_to_json_buf_malloc_(char* file_name,uint64_t *file_size); void get_tar_dir_file_count(void); diff --git a/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c b/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c index 7e0f3378d..82d312436 100644 --- a/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c +++ b/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c @@ -37,6 +37,7 @@ extern "C" { #include "hidService.h" #include "../../../../../open_source/openharmony/third_party/cJSON/cJSON.h" #include "errcode.h" +#include "sys/statfs.h" #include "bletest.h" #include "custom_utils.h" @@ -525,6 +526,15 @@ void sendtraningdata(msg_get_train_data_info_t *data) cJSON_free(jsonString); } +//发送AI录音准备就绪国内/国外标识:0:国内版本 1:国外版本 +void send_AI_is_ready(uint8_t type) +{ + + printf("发送AI准备就绪\r\n"); + send_big_data(0, (char *)&type, 1, 1, 1, 1, 0x05, 5); + +} + //发送ble数据 uint8_t phone_mac[6];//手机下发的mac地址 第一次连接为空 uint8_t parie_mac[6];//配对完成之后的的mac地址 @@ -1630,6 +1640,7 @@ void GetWatchLcdParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalD }else if(type == 1)//设置亮屏时长 抬碗亮屏 { uint8_t screen_type = data[1];//ms级别 + int screen_time = 5*1000; switch (screen_type) { @@ -1655,6 +1666,7 @@ void GetWatchLcdParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalD break; } bool raise = data[2]; + set_ScreenDuration(screen_time); Set_RaiseToWake(raise); } @@ -1729,7 +1741,7 @@ void GetVoiceVibrateParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *to } -void GetHrSetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的声音与振动参数 +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; @@ -1745,22 +1757,12 @@ void GetHrSetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData if(Check_CRC(data,len,crcvalue)) { - ble_recv_msg_callback_t func = ble_recv_get_send_msg_callback_func(); - memset(&hr_param,0,sizeof(msg_get_heart_set_param_info_t)); - if(func != NULL) - { - func(READ_FLASH_DATA,cmd,&hr_param,sizeof(msg_get_heart_set_param_info_t)); - } - // printf("drink_info:%d %d %d\r\n",drink_info.drink_on,drink_info.alarm_mode,drink_info.start_hour); - hr_param.frequence = data[0]; - hr_param.remind_on = data[1]; - hr_param.max_min = data[2]; - hr_param.heart = data[3]; - if(func != NULL) - { - func(WRITE_FLASH_DATA,cmd,&hr_param,sizeof(msg_get_heart_set_param_info_t)); - } - + 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); @@ -1791,25 +1793,14 @@ void GetSpo2SetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalDa if(Check_CRC(data,len,crcvalue)) { - ble_recv_msg_callback_t func = ble_recv_get_send_msg_callback_func(); - memset(&spo2_param,0,sizeof(msg_get_spo2_set_param_info_t)); - if(func != NULL) - { - func(READ_FLASH_DATA,cmd,&spo2_param,sizeof(msg_get_spo2_set_param_info_t)); - } - // printf("drink_info:%d %d %d\r\n",drink_info.drink_on,drink_info.alarm_mode,drink_info.start_hour); - spo2_param.frequence = data[0]; - spo2_param.remind_on = data[1]; - if(spo2_param.remind_on) - { - spo2_param.spo2 = data[2]; - } - - if(func != NULL) - { - func(WRITE_FLASH_DATA,cmd,&spo2_param,sizeof(msg_get_spo2_set_param_info_t)); - } + 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); @@ -2074,6 +2065,54 @@ uint8_t jsonCheck_weather(uint8_t *buf,uint8_t *check)//json 格式解析 天气 return 1; } +uint8_t binCheck_AI(uint8_t *buf,uint8_t *check,uint16_t len)//json 格式解析 天气数据 +{ + uint8_t flag = 0; + // printf("jsonCheck_weather:len: json:%f jsonlen:%d\r\n",0.011,strlen((char *)json)); + #if 0 + FILE *fp=fopen("user/weather.json","wb+"); + printf("jsonCheck_weather len %d",strlen((char *)buf)+1); + //fwrite((void*)buf,1,strlen((char *)buf)+1,fp); + fputs((char *)buf,fp); + fclose(fp); + 1+1+2 + #endif + uint16_t offset=0; + + while (len>offset) + { + if(buf[offset]==1) + { + offset++; + uint16_t txt_len=buf[offset]; + offset++; + char buf[128]={0}; + memcpy_s(buf,128,buf[offset],txt_len); + printf("%s\r\n",buf); + offset+=txt_len; + offset+=1; + } + else if(buf[offset]==2) + { + offset++; + uint16_t txt_len=buf[offset]; + offset++; + char buf[128]={0}; + memcpy_s(buf,128,buf[offset],txt_len); + printf("%s\r\n",buf); + offset+=txt_len; + offset+=1; + } + else if(buf[offset]==0) + { + offset++; + } + } + + *check = 1; + return 1; +} + void GetWeatherCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取天气数据 { @@ -2102,11 +2141,41 @@ void GetWeatherCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,ui sendBuf[17] = 0; sendBuf[18] = Calculate_CRC(sendBuf,18); sendBleData(sendBuf,19); - } - + } } +void GetAiResultCmd(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); + // printf("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 query_dial_installed(ble_read_data *buffer_handle,uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)// { @@ -2383,6 +2452,10 @@ void type2AE4Data(ble_read_data *buffer_handle,uint8_t *buf_cmd,uint8_t *data,ui case SET_WEATHER_DATA_CMD://app下发的天气数据 GetWeatherCmd(typeID,data,datalen,totalData,crcvalue); break; + case SET_APP_AI_TXT_CMD://app下发的AI数据 + GetAiResultCmd(typeID,data,datalen,totalData,crcvalue); + break; + default: break; } @@ -2603,32 +2676,70 @@ static void findWatchCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totald //获取sd卡剩余空间 static void GetSDSpaceCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) { - uint8_t value[20]; - memset(value,0,20); + uint8_t value[28]; + memset(value,0,28); value[0] = 0x72; value[1] = 0x01; value[2] = 0x05; - uint32_t tmp = 2; - 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); + if(Check_CRC(data,len,crcvalue)) { - uint8_t sdFlag = 0; + uint32_t tmp_ = 1; + uint32_t tmp = 9; + uint16_t tmp_data = 9; + memcpy(value+3,&tmp_,4); + memcpy(value+7,&tmp,4); + memcpy(value+11,&tmp_,4); + memcpy(value+15,&tmp_data,2); + + uint8_t sdFlag = 1; + + uint64_t free_size=0; + int i; + struct statfs file_buf = {0}; + static const char * const g_volume_names[4] = {"/system/", "/update/", "/music/", "/user/"}; + + for (i = 0; i < 4; i++) { + /* 获取文件系统状态 */ + if (statfs(g_volume_names[i], &file_buf) != 0) { + return ; + } + if(strcmp("/user/",g_volume_names[i])==0) + { + free_size= ((uint64_t)(file_buf.f_bfree * file_buf.f_bsize)); + //printf("free_size :%ld\r\n",free_size); + printf("free_size :%lu\r\n",free_size); + } + } if(sdFlag == 1)// 1获取失败 2 获取成功 { value[17] = 1;//校验标志 - value[19] = Calculate_CRC(value,19); - sendBleData(value,20); + memcpy_s(value+18,8,&free_size,8); + + value[26] = Calculate_CRC(value,26); + sendBleData(value,27); }else{ + + 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] = 2;//校验标志 value[18] = Calculate_CRC(value,18); sendBleData(value,19); } }else { + + 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] = 0;//校验标志 value[18] = Calculate_CRC(value,18); sendBleData(value,19); @@ -3173,7 +3284,8 @@ static void GetScreenParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *t memcpy(value+15,&tmp_data,2); int brigntess = get_brigthness(); - int screen_time = 0; + int screen_time =get_ScreenDuration(); + printf("GetScreenParamCmd get_ScreenDuration %d \r\n", screen_time); switch (get_ScreenDuration()/1000) { case 5: @@ -3202,6 +3314,7 @@ static void GetScreenParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *t value[17] = brigntess; value[18] = screen_time; value[19] = wrist_on; + printf("GetScreenParamCmd %d %d %d \r\n",brigntess,screen_time,wrist_on); value[20] = Calculate_CRC(value,20); sendBleData(value,21); } @@ -3334,17 +3447,9 @@ static void GetHrGetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *to memcpy(value+15,&tmp_data,2); if(Check_CRC(data,len,crcvalue)) { - uint8_t hrfreq = 0;//监测频率 - uint8_t hrSwitch = 0;//心率提醒开关 - uint8_t hrMaxMin = 0;//高于或低于 - uint8_t hrValue = 0;//阈值 + msg_get_heart_set_param_info_t heart_param; - memset(&heart_param,0,sizeof(msg_get_heart_set_param_info_t)); - ble_recv_msg_callback_t func = ble_recv_get_send_msg_callback_func(); - if(func != NULL) - { - func(READ_FLASH_DATA,cmd,&heart_param,sizeof(msg_get_heart_set_param_info_t)); - } + Get_heart_cmd(&heart_param); value[17] = heart_param.frequence;// value[18] = heart_param.remind_on;// @@ -3378,12 +3483,17 @@ static void GetSpo2GetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t * memcpy(value+15,&tmp_data,2); if(Check_CRC(data,len,crcvalue)) { - uint8_t spo2freq = 0;//监测频率 - uint8_t spo2Switch = 0;//心率提醒开关 - uint8_t spo2MaxMin = 0;//高于或低于 + 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 @@ -3489,7 +3599,6 @@ static void GetFactoryCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *total memcpy(value+15,&tmp_data,2); if(Check_CRC(data,len,crcvalue)) { - value[17] = 1;// value[18] = Calculate_CRC(value,18); sendBleData(value,19); @@ -3499,6 +3608,10 @@ static void GetFactoryCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *total 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}; @@ -3691,8 +3804,10 @@ static void GetAllDialUidCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *to else { printf( "GetAllDialUidCmd yes\r\n"); + } send_big_data(0,dail_uid_buf,data_size,data_size,1,1,0x2a,1); + free(dail_uid_buf); }else @@ -3813,6 +3928,100 @@ static void GetPasswordCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *tota sendBleData(value,19); } } + +#define AI_RECORD_PATH "/user/userdata/AiRecording/AIAudio.pcm" + +bool get_AI_PATH_and_size(char *path,uint64_t *size) +{ + memcpy((void*)path,AI_RECORD_PATH,strlen(AI_RECORD_PATH)); + 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; + } +} +//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}; + uint64_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; + sendbigDataBufState = true;//分包同步数据不允许打断 + + char *data= (char *)malloc(num+1); + + uint16_t read_size=0; + FILE *fp=fopen(file_name,"rb+"); + + printf("GetAiRecordCmd size %d\r\n",file_size); + uint16_t pack=file_size/num+1; + uint8_t pack_id=1; + if(fp==NULL) + { + printf("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); + + send_big_data(1,data,read_size,file_size,pack_id,pack,0x34,1); + pack_id++; + msleep(50); + + } while (read_size==num); + free(data); + fclose(fp); + sendbigDataBufState = false; + + + }else + { + GetAiRecordFail: + value[17] = 0; + value[18] = Calculate_CRC(value,18); + sendBleData(value,19); + } +} + + +//AI录音已经就绪 +static void AiIsReadyCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) +{ + + if(data[0]) + { + printf("AiIsReadyCmd succ\r\n"); + }else + { + printf("AiIsReadyCmd fail\r\n"); + } +} //app发送解除配对消息 static void UnpairMessCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue) { @@ -4430,7 +4639,10 @@ void type2AE3Data(ble_read_data *buffer_handle,uint8_t *cmd_buf ,uint8_t *data,u case GET_PASSWORD_CMD: //获取手表密码 GetPasswordCmd(cmd,data,datalen,totaldata,crcvalue); break; - + case AI_IS_READ_DATA_CMD: + GetAiRecordCmd(cmd,data,datalen,totaldata,crcvalue); + break; + case APP_GET_AI_PCM_DATA_CMD://获取手表闹钟//同步闹钟 case SYN_HEART_HISTORY_DATA_CMD://同步心率历史数据 //heartDataCmd(cmd,data,datalen,totaldata,crcvalue); case SYN_SPO2_HISTORY_DATA_CMD://同步血氧历史数据 @@ -5609,7 +5821,7 @@ static errcode_t install_dial(void) } static char file_name[128]={0}; -static uint32_t file_size=0; +static uint64_t file_size=0; bool Read_tar_file_buf_send_Data(uint16_t pack_size,uint8_t id) { @@ -5693,12 +5905,13 @@ void decode_file_checksum(ble_read_data *buffer_handle) break; case 2://mp3 + break; case 3://dial //TODO: 设置成当前下载的表盘 if (install_dial() == ERRCODE_SUCC) { - ble_set_dial_by_id(ble_dial_uid); + //ble_set_dial_by_id(ble_dial_uid); TRANSMIT_DATA= TRANS_DIAL_SUCC; CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1); @@ -5941,7 +6154,7 @@ errcode_t handle_recv_file(ble_read_data *buffer_handle,uint8_t *data, uint16_t 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) + if (buffer_handle->file_recv_stat.file_type == 1) { buffer_handle->file_recv_stat.file = fopen("/update/update.fwpkg","w+"); printf("create file /update/update.fwpkg %X\n",buffer_handle->file_recv_stat.file); diff --git a/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.h b/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.h index deb09ffef..ce675a9fa 100644 --- a/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.h +++ b/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.h @@ -95,11 +95,13 @@ void cameram_send_data(void); #define SYN_DIS_HISTORY_DATA_CMD 0x0147 //同步距离历史数据 #define SYN_BASIC_TRANIN_HISTORY_DATA_CMD 0x0149 //同步基础训练历史数据basic training #define SYN_SLEEP_HISTORY_DATA_CMD 0x014B //同步睡眠历史数据 +#define APP_GET_AI_PCM_DATA_CMD 0x0134 //APP获取录音文件 +#define AI_IS_READ_DATA_CMD 0x0505 //AI准备就绪 #define SET_DMP_MODE_CMD 0x0135 #define GET_DMP_MODE_CMD 0x0136 -#define FIND_PHONE_CMD 0x0501 //同步睡眠历史数据 +#define FIND_PHONE_CMD 0x0501 #define MSG_DIRECTION_RECV 0x73 #define MSG_DIRECTION_RECV_ANDROID 0x4A @@ -427,6 +429,7 @@ typedef struct //对应数据的指令类型 uint8_t frequence;//检测频率 0关闭 1 1分 2 五分钟 3 10分钟 uint8_t remind_on;//心率提醒 0关闭 1开启 + uint8_t max_min;//高于或者低于 0低于 1高于 uint8_t heart;//心率区间阈值30-200 @@ -606,10 +609,12 @@ TYPE:02 #define SET_OTHER_TARGET_CMD 0x0217 //app发送其他目标 #define SET_PASSWORD_CMD 0x021C //APP设置手表密码password #define SET_SEDENTARINESS_PARAM_CMD 0x021D //APP设置久坐提醒 +#define SET_APP_AI_TXT_CMD 0x021F //设置AI返回的文本 #define SET_WEATHER_DATA_CMD 0x0220 //发送天气数据 #define SET_ALARM_DATA_CMD 0x0221 //发送闹钟数据 #define DELETE_FILE_CMD 0x0222 //删除指定文件 #define SYN_BASIC_REAL_HEATR_CMD 0x024B //同步基础训练试试心率记录 + #define SYN_TODAY_BASIC_TRAIN_TXT_CMD 0x024D //同步当天任意时间之后的基础训练记录 #pragma pack(1) @@ -772,6 +777,8 @@ void message_data(int uid,int appid,char *title,char *msg,int hasCode); void CustomEventPublish_TOPIC_EVENT_MESSAGENOTE(void); +void send_AI_is_ready(uint8_t type); + #ifdef __cplusplus } #endif -- 2.17.1