/****************************************************************************** 版权所有 (C), , ****************************************************************************** 文 件 名 : device_setup_server.c 版 本 号 : 初稿 作 者 : sean 生成日期 : 2020年6月17日 最近修改 : 功能描述 : 基础功能接口的设备设置 函数列表 : user_null_func, BLE_SetDeviceTime,//4.2.1 BLE_GetDeviceTime, //4.2.2 BLE_UserRaiseWristBrightScreenSwitch, //4.2.3 BLE_UserTrunWristCutScreenSwitch, //4.2.4 BLE_UserActivityReminderSwitch, //4.2.5 BLE_Factory_Reset, //4.2.6 BLE_SetAlarmClock, //4.2.7 BLE_GetAlarmClock, //4.2.8 BLE_UserRecvAndSetAvoidDisturbInfo,//4.2.9 user_null_func, user_null_func, user_null_func, user_null_func, user_null_func, user_null_func, BLE_UserGetDeviceMacAddr, //4.2.10 Ble_UserGetSoftwareVersion,//4.2.11 Ble_UserGetHardwareVersion,//4.2.12 BLE_UserBeginFindPhoneACK, // 找手机 主动上报 4.2.13 BLE_NotifyAPPSynchronizationAlarmACK, // 主动上报 4.2.14 ACK 解析 Ble_SetTimeFormat, //设置时间显示格式, 4.2.15 Ble_DisConnectedNotifySwitch,//4.2.16 user_null_func, //单位设置, 4.2.17 BLE_UserGetDeviceElectricQuantityOrVoltage, //4.2.18 user_null_func, //主动上报 4.2.19 user_null_func //BLE_DeviceChargingStateUpload 主动上报 4.2.20 修改历史 : 1.日 期 : 2020年5月22日 作 者 : andy 修改内容 : 创建文件 ******************************************************************************/ #include "wsf_types.h" //#include "hci_drv_apollo3.h" #include "sys_config.h" #include "sys_adapter.h" #include "crc16.h" #include "ble_device_setup_server.h" #include "ble_management_server.h" #include "ble_data_transmission.h" #include "rtc_api.h" #include "tp_api.h" #include "rom_api.h" #include "health_api.h" //#include "alarm_clock.h" //#include "ancillary_adapter.h" //#include "no_disturb.h" #include "sql_setting.h" #include "sql_weather.h" #include "user_charge.h" #include "user_adapter.h" #include "ate_production_order.h" #include "ate_customized_info.h" #include "ui_port_fw.h" #include "ui_port_resource.h" #include "task_fit.h" #include "task_ble.h" #include "task_ui.h" #include "task_ancillary.h" #include "ui_more_alarm.h" #include "user_alarm_clock.h" #include "sql_setting.h" #define ENABLE_STATIC_PRINT false extern uint32_t am_util_stdio_printf(const char *pcFmt, ...); #define static_print_remind(...) am_util_stdio_printf(__VA_ARGS__) #if ENABLE_STATIC_PRINT #define static_print_info(...) am_util_stdio_printf(__VA_ARGS__) #else #define static_print_info(...) #endif #ifdef TEST_UI_RESPOND bool_t gTestAlarmTimeoutFlag = true; //UI界面响应闹钟超时 static osTimerId_t testTimeOut = NULL; //4.2.7设置,大概1分钟内UI会响铃,否则处理测试过程中UI界面响应超时,通过蓝牙发送超时给APP static void TestResponseTimeOut_handler(void) { if(gTestAlarmTimeoutFlag){ uint8_t i = 0; uint8_t tmpArray[10]; printf("test Alarm message time out\r\n"); tmpArray[i++] = 3; tmpArray[i++] = 1; //返回结果Type tmpArray[i++] = 2; //超时响应 BLE_SendFrameById(TEST_SPECIAL_SERVER, TEST_ALARMCLOCK, tmpArray, i); gTestAlarmTimeoutFlag = false; } return; } #endif /*************************************************************************************************** 设置设备时间--4.2.1 ***************************************************************************************************/ void BLE_SetDeviceTime(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { uint16_t write_idx = 0; uint32_t time_stamp = 0; int16_t time_offset = 0; uint8_t SetSucessCount = 0; protocol_data_info_t data_info = {0}; do { user_get_data_info(&data_info, &in_data, &in_len); switch(data_info.type & 0x7f) { //无子节点 case time_type: // APP下发的时间戳为UTC时间戳 time_stamp = (*data_info.p_data++) << 24; time_stamp += (*data_info.p_data++) << 16; time_stamp += (*data_info.p_data++) << 8; time_stamp += (*data_info.p_data); SetSucessCount++; break; case time_offset_type: time_offset = (*data_info.p_data++); static_print_info("time_offset: 0x%x \r\n", time_offset); if(time_offset & 0x80) { //负时区 time_offset = 0 - ((time_offset - 0x80) * 60); //小时转负分钟数 time_offset += (0 - (*data_info.p_data)); //负分钟数 } else { time_offset = (time_offset * 60) + (*data_info.p_data); } SetSucessCount++; break; default: break; } in_data = in_data + (data_info.len); in_len = in_len - (2 + data_info.len); if(in_len > FRAM_MAX_SIZ) { in_len = 0; } } while(in_len); if(SetSucessCount >= 2) { data_info.error = FENDA_SUCCESS; } else { data_info.error = REQ_FORMAT_ERROR; } static_print_info("time_stamp = %d, time_offset = %d.\r\n", time_stamp, time_offset); if(data_info.error == FENDA_SUCCESS) { sql_setting_set_zone(time_offset); rtc_api_set_by_utc_timestamp(time_stamp); task_fit_notify(FIT_MSG_TIME_UPDATE, 0); } write_idx = user_set_protocol_error(out_data, DEVICE_SETUP_SERVER, data_info.error); *out_len = write_idx; } /*************************************************************************************************** 获取设备时间--4.2.2 ***************************************************************************************************/ void BLE_GetDeviceTime(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { uint16_t write_idx = 0; uint32_t time_stamp = 0; uint16_t time_offset = 0; protocol_data_info_t data_info = {0}; data_info.error = FENDA_SUCCESS; do { user_get_data_info(&data_info, &in_data, &in_len); switch(data_info.type & 0x7f) { //无子节点 case time_type: time_stamp = rtc_api_get_utc_timestamp(); // 待添加时区接口 out_data[write_idx++] = 0x06; out_data[write_idx++] = data_info.type; out_data[write_idx++] = (time_stamp & 0xff000000) >> 24; out_data[write_idx++] = (time_stamp & 0x00ff0000) >> 16; out_data[write_idx++] = (time_stamp & 0x0000ff00) >> 8; out_data[write_idx++] = time_stamp & 0xff; break; case time_offset_type: time_offset = sql_setting_get_zone(); // 待添加时区接口 out_data[write_idx++] = 0x04; out_data[write_idx++] = data_info.type; out_data[write_idx++] = (time_offset & 0xff00) >> 8; out_data[write_idx++] = time_offset & 0x00ff; break; default: break; } in_data = in_data + (data_info.len); in_len = in_len - (2 + data_info.len); if(in_len > FRAM_MAX_SIZ) { in_len = 0; } }while(in_len); *out_len = write_idx; } /***************************************************************************** 函 数 名 : UserRaiseWristBrightScreenSwitch 功能描述 : 4.2.3 抬腕亮屏开关 输入参数 : uint8_t *in_data APP下传下来协议数据 uint16_t in_len APP下传下来的协议数据长度 输出参数 : uint8_t *out_data APP传下来的协议,解析后需要返回给APP的协议数据 uint16_t *out_len APP传下来的协议,解析后需要返回个APP的协议数据长度 返 回 值 : 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2020年5月25日 作 者 : andy 修改内容 : 新生成函数 *****************************************************************************/ /******************************** *4.2.3 抬腕亮屏开关 **********************************/ enum { BRIGHT_SCREEN = 1, }; void BLE_UserRaiseWristBrightScreenSwitch(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { uint16_t write_idx = 0; protocol_data_info_t data_info = {0}; uint8_t tmp = 0; data_info.error = FENDA_SUCCESS; do { user_get_data_info(&data_info, &in_data, &in_len); //获取当前服务下的多个type及字节长度,内容, switch((data_info.type & 0x7F)) { case BRIGHT_SCREEN: tmp = *data_info.p_data; static_print_info("BRIGHT_SCREEN SET\r\n"); health_api_set_bright_screen_sw(tmp); break; default: data_info.error = PARAM_ERROR; in_len = 0; break; } in_data += (data_info.len); in_len -= (2 + data_info.len); if(in_len > FRAM_MAX_SIZ) { in_len = 0; } } while(in_len); write_idx = user_set_protocol_error(out_data, DEVICE_SETUP_SERVER, data_info.error); *out_len = write_idx; } /***************************************************************************** 函 数 名 : UserTrunWristCutScreenSwitch 功能描述 : 4.2.4 翻腕切屏开关 输入参数 : uint8_t *in_data APP下传下来协议数据 uint16_t in_len APP下传下来的协议数据长度 输出参数 : uint8_t *out_data APP传下来的协议,解析后需要返回给APP的协议数据 uint16_t *out_len APP传下来的协议,解析后需要返回个APP的协议数据长度 返 回 值 : 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2020年5月25日 作 者 : andy 修改内容 : 新生成函数 *****************************************************************************/ /******************************** *4.2.4 翻腕切屏开关 **********************************/ enum { CUT_SCREEN = 1, }; void BLE_UserTrunWristCutScreenSwitch(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { uint16_t write_idx = 0; protocol_data_info_t data_info = {0}; // uint8_t tmp = 0; data_info.error = FENDA_SUCCESS; do { user_get_data_info(&data_info, &in_data, &in_len); //获取当前服务下的多个type及字节长度,内容, switch((data_info.type & 0x7F)) { case CUT_SCREEN: // tmp = *data_info.p_data; // health_api_set_switch_screen_sw(tmp); data_info.error = UNSUPPORT_COMMAND_ERROR; break; default: data_info.error = PARAM_ERROR; in_len = 0; break; } in_data += (data_info.len); in_len -= (2 + data_info.len); if(in_len > FRAM_MAX_SIZ) { in_len = 0; } } while(in_len); write_idx = user_set_protocol_error(out_data, DEVICE_SETUP_SERVER, data_info.error); *out_len = write_idx; } /***************************************************************************** 函 数 名 : UserActivityReminderSwitch 功能描述 : 4.2.5 久坐提醒开关 输入参数 : uint8_t *in_data APP下传下来协议数据 uint16_t in_len APP下传下来的协议数据长度 输出参数 : uint8_t *out_data APP传下来的协议,解析后需要返回给APP的协议数据 uint16_t *out_len APP传下来的协议,解析后需要返回个APP的协议数据长度 返 回 值 : 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2020年5月25日 作 者 : andy 修改内容 : 新生成函数 *****************************************************************************/ /******************************** *4.2.5 久坐提醒开关 **********************************/ enum { LONG_SEAT_REMINDER = 1, }; void BLE_UserActivityReminderSwitch(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { uint16_t write_idx = 0; protocol_data_info_t data_info = {0}; uint8_t tmp = 0; data_info.error = FENDA_SUCCESS; do { user_get_data_info(&data_info, &in_data, &in_len); //获取当前服务下的多个type及字节长度,内容, switch((data_info.type & 0x7F)) { case LONG_SEAT_REMINDER: tmp = *data_info.p_data; health_api_set_sedentary_remind_sw(tmp); break; default: data_info.error = PARAM_ERROR; in_len = 0; break; } in_data += (data_info.len); in_len -= (2 + data_info.len); if(in_len > FRAM_MAX_SIZ) { in_len = 0; } } while(in_len); write_idx = user_set_protocol_error(out_data, DEVICE_SETUP_SERVER, data_info.error); *out_len = write_idx; } /*************************************************************************************************** 恢复出厂设置--4.2.6 ***************************************************************************************************/ void BLE_Factory_Reset(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { uint16_t write_idx = 0; protocol_data_info_t data_info = {0}; memset(&data_info, 0, sizeof(protocol_data_info_t)); data_info.error = FENDA_SUCCESS; do { user_get_data_info(&data_info, &in_data, &in_len); //APP_TRACE_INFO1("type = %d\r\n", *in_data); switch(data_info.type & 0x7f) { //无子节点 case reset: task_ancillary_notify(ANCILLARY_MSG_RESTORE_FACTORY, 0); // 恢复出厂设置 break; default: data_info.error = PARAM_ERROR; in_len = 0; break; } in_data += (data_info.len); in_len -= (2 + data_info.len); if(in_len > FRAM_MAX_SIZ) { in_len = 0; } } while(in_len); write_idx = user_set_protocol_error(out_data, DEVICE_SETUP_SERVER, data_info.error); *out_len = write_idx; } /*************************************************************************************************** 闹钟:设置闹钟--4.2.7 ***************************************************************************************************/ void BLE_SetAlarmClock(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { #if 1 uint16_t write_idx = 0; uint8_t i,alarm_idx = 0xff; uint8_t j = 0; protocol_data_info_t data_info = {0}; memset(&data_info, 0, sizeof(protocol_data_info_t)); AlarmClockConfig alarmClock_temp[ALARM_MAX_SIZE] = {0}; memset(&alarmClock_temp, 0, sizeof(alarmClock_temp)); data_info.error = FENDA_SUCCESS; do { user_get_data_info(&data_info, &in_data, &in_len); switch(data_info.type & 0x7f) { //无子节点 case LTV_relationship_type: if((*data_info.p_data) != ALARM_RELATIONSHIP_VALUE) { data_info.error = PARAM_ERROR; in_len = 0; } break; case alarm_id_type: alarm_idx = *data_info.p_data; if(alarm_idx >= ALARM_MAX_SIZE) { alarm_idx = ALARM_MAX_SIZE - 1; } alarmClock_temp[alarm_idx].valid = 1; alarmClock_temp[alarm_idx].id = alarm_idx; break; case alarm_H_type: alarmClock_temp[alarm_idx].hour = *data_info.p_data; // static_print_remind("alarmClock_temp[%d].hourTime = %d--------------\n",alarm_idx,alarmClock_temp[alarm_idx].hourTime); break; case alarm_M_type: alarmClock_temp[alarm_idx].minute = *data_info.p_data; // static_print_remind("alarmClock_temp[%d].mintueTime = %d--------------\n",alarm_idx,alarmClock_temp[alarm_idx].mintueTime); break; case repeat_type: alarmClock_temp[alarm_idx].cycleMode = *data_info.p_data; // static_print_remind("alarmClock_temp[%d].cycleMode = %d--------------\n",alarm_idx,alarmClock_temp[alarm_idx].cycleMode); break; case alarm_name_type: memcpy(alarmClock_temp[alarm_idx].name, data_info.p_data, data_info.len); // static_print_remind("alarmClock_temp[%d].name = %d--------------\n",alarm_idx,alarmClock_temp[alarm_idx].name); break; case alarm_enable_type: alarmClock_temp[alarm_idx].enable = *data_info.p_data; // static_print_remind("alarmClock_temp[%d].alarmSwitch = %d--------------\n",alarm_idx,alarmClock_temp[alarm_idx].alarmSwitch); break; default: break; } in_data = in_data + (data_info.len); in_len = in_len - (2 + data_info.len); if(in_len > FRAM_MAX_SIZ) { in_len = 0; } } while(in_len); if((alarm_idx != 0xff) && (alarm_idx < ALARM_MAX_SIZE)) { //for(i = 0; i <= alarm_idx ;i++) //{ // ADPTUpdateAlarmClock(&alarmClock_temp[i],i); //} #ifdef TEST_UI_RESPOND gTestAlarmTimeoutFlag = true; //闹钟启闹大概是在1分钟以内,超时用70s const osTimerAttr_t testTimeOutAttributes = { .name = "testTimeOut" }; if(testTimeOut == NULL){ testTimeOut = osTimerNew((osTimerFunc_t)TestResponseTimeOut_handler, osTimerOnce, NULL, &testTimeOutAttributes); if(testTimeOut == NULL){ PRINT_INFO("create testTimeout is fail\n"); } osTimerStart(testTimeOut, pdMS_TO_TICKS(70000)); }else{ osTimerReset(testTimeOut); } #endif } static_print_info("ble set alarm clock list\r\n"); // adpt_update_alarm_clock_list(&alarmClock_temp[1]); // 暂时跳过0号“智能闹钟” UpdateAlarmClockList(&alarmClock_temp[1]); task_ui_notify(EVENT_ALARM_UPDATE,NULL,&alarmClock_temp[1],sizeof(AlarmClockConfig) * ALARM_CLOCK_MAX_NUMBER); // for(i = 1; i <= ALARM_MAX_SIZE ;i++) // { // j = i -1; // alarm_update(&alarmClock_temp[i],j); //// static_print_remind("alarm_update*******************i = %d*****************\n",i); // } write_idx = user_set_protocol_error(out_data, DEVICE_SETUP_SERVER, data_info.error); *out_len = write_idx; #endif } /*************************************************************************************************** 闹钟:获取设备闹钟--4.2.8 ***************************************************************************************************/ void BLE_GetAlarmClock(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { #if 1 uint8_t NameLen, i = 0; uint8_t id_list; uint16_t write_idx = 0, LTV_relationShip_idx = 0; protocol_data_info_t data_info = {0}; memset(&data_info, 0, sizeof(protocol_data_info_t)); AlarmClockConfig alarmClock_temp[ALARM_MAX_SIZE] = {0}; data_info.error = FENDA_SUCCESS; //LTV_relationship out_data[write_idx++] = 0x03; out_data[write_idx++] = LTV_relationship_type; LTV_relationShip_idx = write_idx; out_data[write_idx++] = ALARM_RELATIONSHIP_VALUE; static_print_info("//******************//\nble get alarm clock list\r\n"); // //第0号智能闹钟 // //LTV(alarm_id) // out_data[write_idx++] = 0x03; // out_data[write_idx++] = alarm_id_type; // out_data[write_idx++] = 0; // // //LTV(alarm_H) // out_data[write_idx++] = 0x03; // out_data[write_idx++] = alarm_H_type; // out_data[write_idx++] = 0; // // //LTV(alarm_M) // out_data[write_idx++] = 0x03; // out_data[write_idx++] = alarm_M_type; // out_data[write_idx++] = 0; // // //LTV(repeat) // out_data[write_idx++] = 0x03; // out_data[write_idx++] = repeat_type; // out_data[write_idx++] = 0; // // //LTV(alarm_name) // out_data[write_idx++] = 0x02; // out_data[write_idx++] = alarm_name_type; // //LTV(alarm_enable) // out_data[write_idx++] = 0x03; // out_data[write_idx++] = alarm_enable_type; // out_data[write_idx++] = 0; out_data[LTV_relationShip_idx] = write_idx - LTV_relationShip_idx - 1; // uint8_t alarm_num = sql_setting_get_alarm_id_list(&id_list); for(i = 0; i < ALARM_MAX_SIZE - 1; i++) { GetAlarmClock(&alarmClock_temp[i],i); // static_print_remind("i=%d,valid=%d,enable=%d,hour=%d,minute=%d,cycleMode=%d\r\n", \ // i, alarmClock_temp[i].state, alarmClock_temp[i].alarmSwitch, alarmClock_temp[i].hourTime, alarmClock_temp[i].mintueTime, alarmClock_temp[i].cycleMode); if(alarmClock_temp[i].valid != 0) { //LTV_relationship out_data[write_idx++] = 0x03; out_data[write_idx++] = LTV_relationship_type; LTV_relationShip_idx = write_idx; out_data[write_idx++] = ALARM_RELATIONSHIP_VALUE; //LTV(alarm_id) out_data[write_idx++] = 0x03; out_data[write_idx++] = alarm_id_type; out_data[write_idx++] = alarmClock_temp[i].id+ 1; //LTV(alarm_H) out_data[write_idx++] = 0x03; out_data[write_idx++] = alarm_H_type; out_data[write_idx++] = alarmClock_temp[i].hour; //LTV(alarm_M) out_data[write_idx++] = 0x03; out_data[write_idx++] = alarm_M_type; out_data[write_idx++] = alarmClock_temp[i].minute; //LTV(repeat) out_data[write_idx++] = 0x03; out_data[write_idx++] = repeat_type; out_data[write_idx++] = alarmClock_temp[i].cycleMode; //LTV(alarm_name) NameLen = strlen(alarmClock_temp[i].name); if(NameLen > 32) { NameLen = 32; } out_data[write_idx++] = NameLen + 2; out_data[write_idx++] = alarm_name_type; memcpy(&out_data[write_idx], alarmClock_temp[i].name, NameLen); write_idx += NameLen; //LTV(alarm_enable) out_data[write_idx++] = 0x03; out_data[write_idx++] = alarm_enable_type; out_data[write_idx++] = alarmClock_temp[i].enable; out_data[LTV_relationShip_idx] = write_idx - LTV_relationShip_idx - 1; } } *out_len = write_idx; #endif } /*************************************************************************************************** 勿打扰--4.2.9 ***************************************************************************************************/ void BLE_UserRecvAndSetAvoidDisturbInfo(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { uint8_t write_idx = 0; protocol_data_info_t data_info = {0}; uint8_t per_data[5] = {0}; memset(&data_info, 0, sizeof(protocol_data_info_t)); data_info.error = FENDA_SUCCESS; do { user_get_data_info(&data_info, &in_data, &in_len); switch((data_info.type & 0x7F)) { #if 1 case all_no_disturb_type: sql_setting_set_dnd_all_day(*(data_info.p_data)); break; case without_no_disturb_type: //未佩戴免打扰 //apdt_set_no_disturb_no_wear((bool_t)(*(data_info.p_data))); break; case regularly_no_disturb_type://免打扰开关 per_data[0] = *(data_info.p_data); break; case regularly_start_time_H_type: per_data[1] = *(data_info.p_data); break; case regularly_start_time_M_type: per_data[2] = *(data_info.p_data); break; case regularly_end_time_H_type: per_data[3] = *(data_info.p_data); break; case regularly_end_time_M_type: per_data[4] = *(data_info.p_data); sql_setting_set_dnd_period(per_data[0],per_data[1],per_data[2],per_data[3],per_data[4]); break; #endif default: break; } in_data += (data_info.len); in_len -= (2 + data_info.len); if(in_len > FRAM_MAX_SIZ) { in_len = 0; } } while(in_len); task_ble_notify(BLE_SAVE_SETTINGS_MSG, 0); // 异步存储系统设置 task_ui_notify(EVENT_UPDATA_DISTURB_INFO, 0, NULL, 0); write_idx = user_set_protocol_error(out_data, DEVICE_SETUP_SERVER, data_info.error); *out_len = write_idx; } /****************************************************************************** 获取设备蓝牙MAC地址--4.2.10 *******************************************************************************/ void BLE_UserGetDeviceMacAddr(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { uint16_t write_idx = 0; protocol_data_info_t data_info = {0}; memset(&data_info, 0, sizeof(protocol_data_info_t)); uint8_t MAC_Address[MAC_ADDRESS_LEN] = {0}; data_info.error = FENDA_SUCCESS; do { user_get_data_info(&data_info, &in_data, &in_len); switch(data_info.type & 0x7f) { //无子节点 case get_mac_type: user_get_reverse_ble_mac(MAC_Address, MAC_ADDRESS_LEN); out_data[write_idx++] = 0x08; out_data[write_idx++] = mac_type; out_data[write_idx++] = MAC_Address[0]; out_data[write_idx++] = MAC_Address[1]; out_data[write_idx++] = MAC_Address[2]; out_data[write_idx++] = MAC_Address[3]; out_data[write_idx++] = MAC_Address[4]; out_data[write_idx++] = MAC_Address[5]; break; default: data_info.error=PARAM_ERROR; in_len=0; break; } in_data = in_data + (data_info.len); in_len = in_len - (2 + data_info.len); if(in_len > FRAM_MAX_SIZ) { in_len = 0; } } while(in_len); if(data_info.error != FENDA_SUCCESS) { write_idx = user_set_protocol_error(out_data, DEVICE_SETUP_SERVER, data_info.error); } *out_len = write_idx; } /*************************************************************************************************** 获取软件版本号4.2.11 ***************************************************************************************************/ void Ble_UserGetSoftwareVersion(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { uint16_t write_idx = 0; const uint8_t* versions_p = NULL; uint8_t VersionLen = 0; protocol_data_info_t data_info = {0}; memset(&data_info, 0, sizeof(protocol_data_info_t)); data_info.error = FENDA_SUCCESS; do { user_get_data_info(&data_info, &in_data, &in_len); switch(data_info.type & 0x7f) { //无子节点 case get_version_type: versions_p = user_get_mcu_sw_ver(); VersionLen = strlen((const char*)versions_p); if(VersionLen > VERSION_LENGTH_MAX) { VersionLen = VERSION_LENGTH_MAX; } out_data[write_idx++] = VersionLen + 2; //LTV L out_data[write_idx++] = version_type;//LTV T memcpy(&out_data[write_idx], (const char*)versions_p, VersionLen); //v write_idx += VersionLen; break; default: data_info.error=PARAM_ERROR; in_len=0; break; } in_data = in_data + (data_info.len); in_len = in_len - (2 + data_info.len); if(in_len > FRAM_MAX_SIZ) { in_len = 0; } } while(in_len); if(data_info.error != FENDA_SUCCESS) { write_idx = user_set_protocol_error(out_data, DEVICE_SETUP_SERVER, data_info.error); } *out_len = write_idx; } /*************************************************************************************************** 获取硬件版本号--4.2.12 ***************************************************************************************************/ void Ble_UserGetHardwareVersion(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { uint16_t write_idx = 0; hard_version_u versions_num = {0}; protocol_data_info_t data_info = {0}; memset(&data_info, 0, sizeof(protocol_data_info_t)); data_info.error = FENDA_SUCCESS; do { user_get_data_info(&data_info, &in_data, &in_len); switch(data_info.type & 0x7f) { //无子节点 case get_hardware_version_type: versions_num = user_get_mcu_hw_ver(); out_data[write_idx++] = 6; //LTV L out_data[write_idx++] = version_type;//LTV T out_data[write_idx++] = (versions_num.u32_all >> 24) + '0'; out_data[write_idx++] = (versions_num.u32_all >> 16) + '0'; out_data[write_idx++] = (versions_num.u32_all >> 8) + '0'; out_data[write_idx++] = versions_num.u32_all; break; default: data_info.error=PARAM_ERROR; in_len=0; break; } in_data = in_data + (data_info.len); in_len = in_len - (2 + data_info.len); if(in_len > FRAM_MAX_SIZ) { in_len = 0; } } while(in_len); if(data_info.error != FENDA_SUCCESS) { write_idx = user_set_protocol_error(out_data, DEVICE_SETUP_SERVER, data_info.error); } *out_len = write_idx; } /*************************************************************************************************** 找手机--4.2.13 ***************************************************************************************************/ void BLE_UserBeginFindSmartPhoneUpload(uint8_t begin) { //LogFileWriteEvent(EVENT_ID_FIND_PHONE); uint16_t write_idx = 0; uint8_t buf_temp[SET_TEMP_NUM_MAX] = {0}; buf_temp[write_idx++] = 0x03; //LTV L值 buf_temp[write_idx++] = find_phone_type; //type 02 13 buf_temp[write_idx++] = begin; //value BLE_SendFrameById(DEVICE_SETUP_SERVER, FIND_PHONE_ID, buf_temp, write_idx); } void BLE_UserBeginFindPhoneACK(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { protocol_data_info_t data_info = {0}; // uint8_t BeginFindPhoneACK[2]; memset(&data_info, 0, sizeof(protocol_data_info_t)); data_info.error = FENDA_SUCCESS; do { user_get_data_info(&data_info, &in_data, &in_len); switch(data_info.type & 0x7f) { //无子节点 case find_phone_type: // BeginFindPhoneACK[0] = *data_info.p_data++; // BeginFindPhoneACK[1] = *data_info.p_data; break; default: break; } in_data = in_data + (data_info.len); in_len = in_len - (2 + data_info.len); if(in_len > FRAM_MAX_SIZ) { in_len = 0; } } while(in_len); *out_len = 0; } void BLE_UserEndFindSmartPhoneUpload(uint8_t end) { uint16_t write_idx = 0; uint8_t buf_temp[SET_TEMP_NUM_MAX] = {0}; buf_temp[write_idx++] = 0x03; //LTV L值 buf_temp[write_idx++] = find_phone_type; //type 02 13 buf_temp[write_idx++] = end; //value BLE_SendFrameById(DEVICE_SETUP_SERVER, FIND_PHONE_ID, buf_temp, write_idx); } /*************************************************************************************************** 闹钟:通知APP来同步闹钟--4.2.14 ***************************************************************************************************/ void BLE_NotifyAPPSynchronizationAlarm(void) { uint16_t write_idx = 0; uint8_t buf_temp[SET_TEMP_NUM_MAX] = {0}; buf_temp[write_idx++] = 0x02; //LTV L值 buf_temp[write_idx++] = Alarm_Change_Type; //type BLE_SendFrameById(DEVICE_SETUP_SERVER, NOTIFY_APP_SYNCH_ID, buf_temp, write_idx); } void BLE_NotifyAPPSynchronizationAlarmACK(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { protocol_data_info_t data_info = {0}; // uint8_t NotifySynchronizationAlarmACK[2]; memset(&data_info, 0, sizeof(protocol_data_info_t)); data_info.error = FENDA_SUCCESS; do { user_get_data_info(&data_info, &in_data, &in_len); switch(data_info.type & 0x7f) { //无子节点 case Alarm_Change_Type: // NotifySynchronizationAlarmACK[0] = *data_info.p_data++; // NotifySynchronizationAlarmACK[1] = *data_info.p_data; break; default: break; } in_data = in_data + (data_info.len); in_len = in_len - (2 + data_info.len); if(in_len > FRAM_MAX_SIZ) { in_len = 0; } } while(in_len); *out_len = 0; } /*************************************************************************************************** 设置时间格式--4.2.15 *******************************************************************************/ void Ble_SetTimeFormat(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { uint16_t write_idx = 0; protocol_data_info_t data_info = {0}; memset(&data_info, 0, sizeof(protocol_data_info_t)); data_info.error = FENDA_SUCCESS; do { user_get_data_info(&data_info, &in_data, &in_len); switch(data_info.type & 0x7f) { //无子节点 case date_display_type: sql_setting_set_date_format((*data_info.p_data)); break; case time_display_type: sql_setting_set_time_format((*data_info.p_data)); break; default: data_info.error=PARAM_ERROR; in_len=0; break; } in_data = in_data + (data_info.len); in_len = in_len - (2 + data_info.len); if(in_len > FRAM_MAX_SIZ) { in_len = 0; } } while(in_len); if(data_info.error == FENDA_SUCCESS) { task_ble_notify(BLE_SAVE_SETTINGS_MSG, 0); // 异步存储系统设置 } write_idx = user_set_protocol_error(out_data, DEVICE_SETUP_SERVER, data_info.error); *out_len = write_idx; } /********************************************************************************** 蓝牙断开提醒开关--4.2.16 ***********************************************************************************/ void Ble_DisConnectedNotifySwitch(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { uint16_t write_idx = 0; protocol_data_info_t data_info = {0}; memset(&data_info, 0, sizeof(protocol_data_info_t)); data_info.error = PARAM_ERROR; do { user_get_data_info(&data_info, &in_data, &in_len); switch(data_info.type & 0x7f) { //无子节点 case ble_disconnect_remind_type: sql_setting_set_ble_switch_disconn_reminder(*data_info.p_data); data_info.error = FENDA_SUCCESS; break; default: break; } in_data = in_data + (data_info.len); in_len = in_len - (2 + data_info.len); if(in_len > FRAM_MAX_SIZ) { in_len = 0; } } while(in_len); if(data_info.error == FENDA_SUCCESS){ task_ble_notify(BLE_SAVE_SETTINGS_MSG, 0); // 异步存储系统设置 } write_idx = user_set_protocol_error(out_data, DEVICE_SETUP_SERVER, data_info.error); *out_len = write_idx; } /********************************************************************************** 单位设置 --- 4.2.17 ***********************************************************************************/ void BLE_SetMeasuringUnits(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { uint16_t write_idx = 0; uint8_t unitSetValue; protocol_data_info_t data_info = {0}; memset(&data_info, 0, sizeof(protocol_data_info_t)); data_info.error = FENDA_SUCCESS; do { user_get_data_info(&data_info, &in_data, &in_len); switch(data_info.type & 0x7f) { //无子节点 case MEASURING_UNIT_TYPE: unitSetValue = *data_info.p_data; static_print_info("measuring uinit Set Command received,value = 0x%x.\r\n", unitSetValue); sql_setting_set_distance_unit(unitSetValue); break; default: break; } in_data = in_data + (data_info.len); in_len = in_len - (2 + data_info.len); if(in_len > FRAM_MAX_SIZ) { in_len = 0; } } while(in_len); if(data_info.error == FENDA_SUCCESS){ task_ble_notify(BLE_SAVE_SETTINGS_MSG, 0); // 异步存储系统设置 task_ui_notify(EVENT_TYPE_BLE_CHANG_UNIT, 0,NULL,NULL); // 英制/公制单位切换问题 -- add hes -- bug id 17257 } write_idx = user_set_protocol_error(out_data, DEVICE_SETUP_SERVER, data_info.error); *out_len = write_idx; } /*************************************************************************************************** 获取设备电量/电压--4.2.18 ***************************************************************************************************/ void BLE_UserGetDeviceElectricQuantityOrVoltage(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { uint16_t write_idx = 0; protocol_data_info_t data_info = {0}; memset(&data_info, 0, sizeof(protocol_data_info_t)); uint8_t powerValue = 0; // uint16_t voltageValue = 0; chg_usb_stat_e chargingState; data_info.error = FENDA_SUCCESS; do { user_get_data_info(&data_info, &in_data, &in_len); switch(data_info.type & 0x7f) { //无子节点 case GET_DEVICE_POWER_TYPE: if((*data_info.p_data) == GET_POWER_CHARGE_STATUS) { powerValue = charge_api_get_batt_percent(); chargingState = charge_api_get_usb_status(); out_data[write_idx++] = 0x03;//power LTV out_data[write_idx++] = DEVICE_POWER_TYPE; out_data[write_idx++] = powerValue; static_print_info("\r\n*******powerValue = %d**********\r\n", powerValue); out_data[write_idx++] = 0x03;//power LTV out_data[write_idx++] = DEVICE_CHARGE_STATUS_TYPE; if(chargingState == CHG_STAT_CHARGE || chargingState == CHG_STAT_TRICKLE_CHARGE) { out_data[write_idx++] = PROTOCOL_CHANGING; } else if (chargingState == CHG_STAT_NOT_USB) { out_data[write_idx++] = PROTOCOL_NOT_USB; } else if(chargingState == CHG_STAT_CHARGE_DONE) { out_data[write_idx++] = PROTOCOL_CHARGE_DON; } else { out_data[write_idx++] = 0xff; } break; }else { data_info.error = PARAM_ERROR; } break; default: data_info.error=PARAM_ERROR; in_len=0; break; } in_data = in_data + (data_info.len); in_len = in_len - (2 + data_info.len); if(in_len > FRAM_MAX_SIZ) { in_len = 0; } } while(in_len); if(data_info.error != FENDA_SUCCESS) { write_idx = user_set_protocol_error(out_data, DEVICE_SETUP_SERVER, data_info.error); } *out_len = write_idx; } /*************************************************************************************************** 设备主动上报电量--4.2.19 ***************************************************************************************************/ void BLE_DeviceElectricQuantityUpload(void) { uint16_t write_idx = 0; uint8_t buf_temp[SET_TEMP_NUM_MAX] = {0}; uint8_t power_value = 0; chg_usb_stat_e chargingState; power_value = charge_api_get_batt_percent(); chargingState = charge_api_get_usb_status(); buf_temp[write_idx++] = 0x03; //LTV L值 buf_temp[write_idx++] = REPORT_BATTERY_POWER_TYPE; //type buf_temp[write_idx++] = power_value;//value buf_temp[write_idx++] = 0x03;//POWER_RATTLE_TYPE buf_temp[write_idx++] = REPORT_BATTERY_POWER_RATTLE_TYPE; if(chargingState == CHG_STAT_CHARGE || chargingState == CHG_STAT_TRICKLE_CHARGE) { buf_temp[write_idx++] = PROTOCOL_CHANGING; } else if (chargingState == CHG_STAT_NOT_USB) { buf_temp[write_idx++] = PROTOCOL_NOT_USB; } else if(chargingState == CHG_STAT_CHARGE_DONE) { buf_temp[write_idx++] = PROTOCOL_CHARGE_DON; } else { buf_temp[write_idx++] = 0xff; } BLE_SendFrameById(DEVICE_SETUP_SERVER, DEVICE_UPLOAD_ELEC_ID, buf_temp, write_idx); } /*************************************************************************************************** 设备主动上报充电状态--4.2.20 ***************************************************************************************************/ /* void BLE_DeviceChargingStateUpload(void) { uint16_t write_idx = 0; uint8_t buf_temp[SET_TEMP_NUM_MAX] = {0}; uint8_t charging_state = 0; charging_state = ADPTGetChargeState(); buf_temp[write_idx++] = 0x03; //LTV L值 buf_temp[write_idx++] = REPORT_BATTERY_CHARGE_STATUS_TYPE; //type buf_temp[write_idx++] = charging_state;//value BLE_SendFrameById(DEVICE_SETUP_SERVER, DEVICE_UPLOAD_CHARGE_STATUS, buf_temp, write_idx); } */ /*************************************************************************************************** 获取设备各模块版本号(GPS、NFC、TP)--4.2.21 ***************************************************************************************************/ void BLE_GetDeviceModeVersion(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { uint16_t write_idx = 0; // int32_t Ret = 0; uint32_t tp_version = 0; uint8_t *ver_p = NULL;; uint8_t versionSize = 0; protocol_data_info_t data_info = {0}; memset(&data_info, 0, sizeof(protocol_data_info_t)); static_print_info("begin BLE_GetDeviceModeVersion.\r\n"); data_info.error = PARAM_ERROR; do { user_get_data_info(&data_info, &in_data, &in_len); switch(data_info.type & 0x7f) { //无子节点 case GET_VERSION_TYPE: data_info.error = FENDA_SUCCESS; //TP mode Version tp_version = touchpad_api_read_ver(); static_print_info("TP firwmare version:%d.\r\n", tp_version); out_data[write_idx++] = 4; //LTV L out_data[write_idx++] = VERSION_TP_TYPE;//LTV T out_data[write_idx++] = (tp_version >> 8) + '0'; out_data[write_idx++] = tp_version + '0'; //GPS mode Version ver_p = user_gps_get_firware_ver(); static_print_info("GPS firware_ver: %s \n", ver_p); versionSize = strlen((const char *)ver_p); out_data[write_idx++] = versionSize + 2; //LTV L out_data[write_idx++] = VERSION_GPS_TYPE;//LTV T memcpy(&out_data[write_idx], ver_p, versionSize); write_idx += versionSize; //FONT mode Version out_data[write_idx++] = 2;//LTV L out_data[write_idx++] = VERSION_FONT_TYPE;//LTV T //IMAGE mode Version out_data[write_idx++] = 2;//LTV L out_data[write_idx++] = VERSION_IMAGE_TYPE;//LTV T break; default: break; } in_data = in_data + (data_info.len); in_len = in_len - (2 + data_info.len); if(in_len > FRAM_MAX_SIZ) { in_len = 0; } } while(in_len); if(data_info.error != FENDA_SUCCESS) { write_idx = user_set_protocol_error(out_data, DEVICE_SETUP_SERVER, data_info.error); } *out_len = write_idx; } /********************************************************************************** 4.2.23 双击亮屏开关 ***********************************************************************************/ void BLE_doublePointBrightScreenSwitch(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { uint16_t write_idx = 0; protocol_data_info_t data_info = {0}; memset(&data_info, 0, sizeof(protocol_data_info_t)); data_info.error = PARAM_ERROR; do { user_get_data_info(&data_info, &in_data, &in_len); switch(data_info.type & 0x7f) { //无子节点 case DEVICE_DOUBLE_BRIGHT_SWITCH_TYPE: static_print_info("double bright Command received,value = 0x%x.\r\n", (uint8_t)(*data_info.p_data)); //data_info.error = ADPTSetDClickScreenOn((uint8_t)(*data_info.p_data)); break; default: break; } in_data = in_data + (data_info.len); in_len = in_len - (2 + data_info.len); if(in_len > FRAM_MAX_SIZ) { in_len = 0; } } while(in_len); write_idx = user_set_protocol_error(out_data, DEVICE_SETUP_SERVER, data_info.error); *out_len = write_idx; } /********************************************************************************** // 4.2.24 手机型号下发 ***********************************************************************************/ void BLE_getPhoneType(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { uint16_t write_idx = 0; protocol_data_info_t data_info = {0}; memset(&data_info, 0, sizeof(protocol_data_info_t)); data_info.error = PARAM_ERROR; do { user_get_data_info(&data_info, &in_data, &in_len); switch(data_info.type & 0x7f) { //无子节点 case DEVICE_GET_PHONE_TYPE_TYPE: static_print_info("get phone type Command received.Type = %s.\r\n", data_info.p_data); data_info.error = sql_setting_set_phone_name(data_info.p_data,data_info.len); break; default: break; } in_data = in_data + (data_info.len); in_len = in_len - (2 + data_info.len); if(in_len > FRAM_MAX_SIZ) { in_len = 0; } } while(in_len); if(data_info.error == FENDA_SUCCESS) { task_ble_notify(BLE_SAVE_SETTINGS_MSG, 0); // 异步存储系统设置 } write_idx = user_set_protocol_error(out_data, DEVICE_SETUP_SERVER, data_info.error); *out_len = write_idx; } /********************************************************************************** 4.2.25 推送新版本提醒到设备 ***********************************************************************************/ void BLE_getNewVersionNotice(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { uint16_t write_idx = 0; uint8_t *pNewVersionData = NULL,versionDataLen = NULL,firmwareVerisonType = NULL; protocol_data_info_t data_info = {0}; memset(&data_info, 0, sizeof(protocol_data_info_t)); data_info.error = PARAM_ERROR; do { user_get_data_info(&data_info, &in_data, &in_len); switch(data_info.type & 0x7f) { //无子节点 case DEVICE_NEW_VERSION_TYPE: static_print_info("get Device new version Command received,NewVersion = %s.\r\n", data_info.p_data); pNewVersionData = data_info.p_data; versionDataLen = (uint8_t)(data_info.len%0x100); break; case DEVICE_VERSION_TYPE_TYPE: static_print_info("get Device version type Command received,Versiontype = 0x%x.\r\n", *data_info.p_data); firmwareVerisonType = *data_info.p_data; break; default: break; } in_data = in_data + (data_info.len); in_len = in_len - (2 + data_info.len); if(in_len > FRAM_MAX_SIZ) { in_len = 0; } } while(in_len); if((pNewVersionData !=NULL)&&(versionDataLen != NULL)&&(firmwareVerisonType != NULL)) { //data_info.error = ADPTFirmwareNewVersion(pNewVersionData,versionDataLen,firmwareVerisonType); } write_idx = user_set_protocol_error(out_data, DEVICE_SETUP_SERVER, data_info.error); *out_len = write_idx; } /********************************************************************************** 4.2.26 喝水提醒 ***********************************************************************************/ void BLE_drinkWaterRemindSet(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { // uint16_t write_idx = 0; // protocol_data_info_t data_info = {0}; // WaterRemind wateRemindParam; // memset(&data_info, 0, sizeof(protocol_data_info_t)); // memset(&wateRemindParam, 0, sizeof(wateRemindParam)); // data_info.error = PARAM_ERROR; // do { // user_get_data_info(&data_info, &in_data, &in_len); // switch(data_info.type & 0x7f) { //无子节点 // case WATER_REMIND_SWITCH_TYPE: // PRINT_INFO("water remind switch Command received,value = 0x%x.\r\n", (uint8_t)(*data_info.p_data)); // wateRemindParam.waterRemindEnable = (uint8_t)(*data_info.p_data); // break; // case WATER_REMIND_INTERVAL_TYPE: // PRINT_INFO("water remind interval Command received,value = 0x%x.\r\n", (uint8_t)(*data_info.p_data)); // wateRemindParam.interval = (uint8_t)(*data_info.p_data); // break; // case WATER_REMIND_START_TYPE: // wateRemindParam.startTime = (uint8_t)(*data_info.p_data++)*0x100; // wateRemindParam.startTime += (uint8_t)(*data_info.p_data); // PRINT_INFO("water remind start Command received.startTime = %d.\r\n", wateRemindParam.startTime); // break; // case WATER_REMIND_END_TYPE: // wateRemindParam.endTime = (uint8_t)(*data_info.p_data++)*0x100; // wateRemindParam.endTime += (uint8_t)(*data_info.p_data); // PRINT_INFO("water remind end Command received.endTime = %d.\r\n",wateRemindParam.endTime); // break; // default: // break; // } // in_data = in_data + (data_info.len); // in_len = in_len - (2 + data_info.len); // if(in_len > FRAM_MAX_SIZ) { // in_len = 0; // } // } while(in_len); // data_info.error = ADPTSetDrinkWaterRemind(wateRemindParam); // write_idx = user_set_protocol_error(out_data, DEVICE_SETUP_SERVER, data_info.error); // *out_len = write_idx; } /********************************************************************************** 4.2.27 手机电量下发到 设备 ***********************************************************************************/ void BLE_getPhoneBatteryInfo(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { uint16_t write_idx = 0; protocol_data_info_t data_info = {0}; uint8_t batteryValue; memset(&data_info, 0, sizeof(protocol_data_info_t)); data_info.error = PARAM_ERROR; do { user_get_data_info(&data_info, &in_data, &in_len); switch(data_info.type & 0x7f) { //无子节点 case PHONE_BATTERY_SET_POWER_TYPE: batteryValue = *data_info.p_data; static_print_info("phone battery set power Command received,value = %d.\r\n", batteryValue); //data_info.error = ADPTSetPhoneBattery(batteryValue); break; default: break; } in_data = in_data + (data_info.len); in_len = in_len - (2 + data_info.len); if(in_len > FRAM_MAX_SIZ) { in_len = 0; } } while(in_len); write_idx = user_set_protocol_error(out_data, DEVICE_SETUP_SERVER, data_info.error); *out_len = write_idx; } /*************************************************************************************************** 获取设备版本信息(GPS、NFC、TP)--4.2.28 ***************************************************************************************************/ void BLE_GetDeviceVersionInfo(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { uint16_t write_idx = 0; int32_t Ret = 0; const uint8_t* firwmare_versions_p = NULL; hard_version_u versions_num = {0}; uint32_t tp_version = 0; uint8_t *ver_p = NULL; psn_calibra_t psn_temp = {0}; uint16_t temp_crc = 0; uint8_t MAC_Address[MAC_ADDRESS_LEN] = {0}; uint8_t VersionLen = 0; protocol_data_info_t data_info = {0}; char imageVersionArray[VERSION_LENGTH_MAX] = {0x31, 0x2E, 0x34, 0x2E, 0x36}; char fontVersionArray[VERSION_LENGTH_MAX] = {0x31, 0x2E, 0x34, 0x2E, 0x36}; memset(&data_info, 0, sizeof(protocol_data_info_t)); static_print_info("begin BLE_GetDeviceModeVersion.\r\n"); data_info.error = PARAM_ERROR; do { user_get_data_info(&data_info, &in_data, &in_len); switch(data_info.type & 0x7f) { //无子节点 case GET_VERSION_TYPE: data_info.error = FENDA_SUCCESS; //TP mode Version tp_version = touchpad_api_read_ver(); static_print_info("TP firwmare version:%d.\r\n", tp_version); out_data[write_idx++] = 4; //LTV L out_data[write_idx++] = VERSION_TP_TYPE;//LTV T out_data[write_idx++] = (tp_version >> 8) + '0'; out_data[write_idx++] = tp_version + '0'; //GPS mode Version ver_p = user_gps_get_firware_ver(); static_print_info("GPS firware_ver: %s \n", ver_p); VersionLen = strlen((const char *)ver_p); out_data[write_idx++] = VersionLen + 2; //LTV L out_data[write_idx++] = VERSION_GPS_TYPE;//LTV T memcpy(&out_data[write_idx], ver_p, VersionLen); write_idx += VersionLen; //FONT mode Version ui_get_font_version(fontVersionArray,1); VersionLen = strlen(fontVersionArray); static_print_info("font mode version:%s.\r\n", fontVersionArray); if(VersionLen > VERSION_LENGTH_MAX) { VersionLen = VERSION_LENGTH_MAX; } out_data[write_idx++] = VersionLen + 2;//LTV L out_data[write_idx++] = VERSION_FONT_TYPE;//LTV T memcpy(&out_data[write_idx], fontVersionArray, VersionLen); //v write_idx += VersionLen; //IMAGE mode Version ui_get_image_version(imageVersionArray,1); VersionLen = strlen(imageVersionArray); static_print_info("image mode version:%s.\r\n", imageVersionArray); if(VersionLen > VERSION_LENGTH_MAX) { VersionLen = VERSION_LENGTH_MAX; } out_data[write_idx++] = VersionLen + 2;//LTV L out_data[write_idx++] = VERSION_IMAGE_TYPE;//LTV T memcpy(&out_data[write_idx], imageVersionArray, VersionLen); //v write_idx += VersionLen; // firmware Version firwmare_versions_p = user_get_mcu_sw_ver(); VersionLen = strlen((const char*)firwmare_versions_p); if(VersionLen > VERSION_LENGTH_MAX) { VersionLen = VERSION_LENGTH_MAX; } out_data[write_idx++] = VersionLen + 2; //LTV L out_data[write_idx++] = FIRMWARE_VERSION_TYPE;//LTV T memcpy(&out_data[write_idx], (const char*)firwmare_versions_p, VersionLen); //v write_idx += VersionLen; // hardware Version versions_num = user_get_mcu_hw_ver(); out_data[write_idx++] = 6; //LTV L out_data[write_idx++] = HARDWARE_VERSION_TYPE;//LTV T out_data[write_idx++] = (versions_num.u32_all >> 24) + '0'; out_data[write_idx++] = (versions_num.u32_all >> 16) + '0'; out_data[write_idx++] = (versions_num.u32_all >> 8) + '0'; out_data[write_idx++] = versions_num.u32_all + '0'; // Device type out_data[write_idx++] = 3; //LTV L out_data[write_idx++] = DEVICE_TYPE_TYPE;//LTV T out_data[write_idx++] = 88; // 设备型号还未定义 // Device SN rom_api_read(FACTORY_PSN_ADDR, ( uint8_t * ) &psn_temp, sizeof(psn_temp)); VersionLen = sizeof(psn_temp.psn); out_data[write_idx++] = VersionLen + 2; //LTV L out_data[write_idx++] = DEVICE_SN_TYPE; //LTV T memcpy(&out_data[write_idx], psn_temp.psn, VersionLen); write_idx += VersionLen; static_print_info("VersionLen =%d\r\n", VersionLen); // Device MAC user_get_reverse_ble_mac(MAC_Address, MAC_ADDRESS_LEN); out_data[write_idx++] = 0x08; out_data[write_idx++] = DEVICE_MAC_TYPE; out_data[write_idx++] = MAC_Address[0]; out_data[write_idx++] = MAC_Address[1]; out_data[write_idx++] = MAC_Address[2]; out_data[write_idx++] = MAC_Address[3]; out_data[write_idx++] = MAC_Address[4]; out_data[write_idx++] = MAC_Address[5]; // device model out_data[write_idx++] = 2; //LTV L out_data[write_idx++] = DEVICE_MODEL_TYPE;//LTV T // device pid out_data[write_idx++] = 2; //LTV L out_data[write_idx++] = DEVICE_PID_TYPE;//LTV T // device vid out_data[write_idx++] = 2; //LTV L out_data[write_idx++] = DEVICE_VID_TYPE;//LTV T break; default: break; } in_data = in_data + (data_info.len); in_len = in_len - (2 + data_info.len); if(in_len > FRAM_MAX_SIZ) { in_len = 0; } } while(in_len); if(data_info.error != FENDA_SUCCESS) { write_idx = user_set_protocol_error(out_data, DEVICE_SETUP_SERVER, data_info.error); } *out_len = write_idx; } /********************************************************************************** 4.2.29 手机网络状态下发到设备 ***********************************************************************************/ void BLE_getPhoneInternetStatus(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { uint16_t write_idx = 0; protocol_data_info_t data_info = {0}; uint8_t internetStatusValue; memset(&data_info, 0, sizeof(protocol_data_info_t)); data_info.error = PARAM_ERROR; do { user_get_data_info(&data_info, &in_data, &in_len); switch(data_info.type & 0x7f) { //无子节点 case PHONE_INTERNET_STATUS_TYPE: internetStatusValue = *data_info.p_data; static_print_info("phone internet status received,value = %d.\r\n", internetStatusValue); user_set_phone_net_status(internetStatusValue); data_info.error = FENDA_SUCCESS; break; default: break; } in_data = in_data + (data_info.len); in_len = in_len - (2 + data_info.len); if(in_len > FRAM_MAX_SIZ) { in_len = 0; } } while(in_len); // UpdateWeatherPhoneNetState(user_get_phone_net_status()); // ------TO BE ADDED 向UI发送消息 ------- // QueryUiUpdateWeatherInfo(); write_idx = user_set_protocol_error(out_data, DEVICE_SETUP_SERVER, data_info.error); *out_len = write_idx; } /********************************************************************************** 4.2.30 手机发送找手环命令 ***********************************************************************************/ void BLE_findDevice(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { uint16_t write_idx = 0; protocol_data_info_t data_info = {0}; uint8_t findDeviceValue; memset(&data_info, 0, sizeof(protocol_data_info_t)); data_info.error = PARAM_ERROR; do { user_get_data_info(&data_info, &in_data, &in_len); switch(data_info.type & 0x7f) { //无子节点 case FIND_DEVICE_TYPE: findDeviceValue = *data_info.p_data; static_print_info("phone find device Command received.\r\n"); ui_port_send_sys_remind_event(EVENT_REMIND_FIND_BAND, findDeviceValue, NULL, 0); data_info.error = FENDA_SUCCESS; break; default: break; } in_data = in_data + (data_info.len); in_len = in_len - (2 + data_info.len); if(in_len > FRAM_MAX_SIZ) { in_len = 0; } } while(in_len); write_idx = user_set_protocol_error(out_data, DEVICE_SETUP_SERVER, data_info.error); *out_len = write_idx; } /*************************************************************************************************** 4.2.31 设备上报找手环状态 ***************************************************************************************************/ void BLE_ReportFindDeviceStatus(uint8_t status) { uint16_t write_idx = 0; uint8_t buf_temp[TEMP_NUM_MAX] = {0}; buf_temp[write_idx++] = 0x03; buf_temp[write_idx++] = FIND_DEVICE_STATUS_TYPE; buf_temp[write_idx++] = status; BLE_SendFrameById(DEVICE_SETUP_SERVER, REPORT_FIND_DEVICE_STATUS_ID,buf_temp, write_idx); } /********************************************************************************** 4.2.35 获取设备侧勿扰信息 ***********************************************************************************/ void BLE_getDisturbInfo(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { uint16_t write_idx = 0; uint8_t get_time[4] = {0}; uint8_t status = 0; status = sql_setting_get_dnd_period(&get_time[0], &get_time[1], &get_time[2], &get_time[3]); #if 1 out_data[write_idx++] = 0x03; out_data[write_idx++] = all_no_disturb_type; out_data[write_idx++] = sql_setting_get_dnd_all_day();//GetNoDisturbAllDay(); out_data[write_idx++] = 0x03; out_data[write_idx++] = without_no_disturb_type; out_data[write_idx++] = 0x01;//GetNoDisturbNoWear(); out_data[write_idx++] = 0x03; out_data[write_idx++] = regularly_no_disturb_type; out_data[write_idx++] = status;//GetNoDisturbPeriod(); out_data[write_idx++] = 0x03; out_data[write_idx++] = regularly_start_time_H_type; out_data[write_idx++] = get_time[0];//GetNoDisturbStartHour(); out_data[write_idx++] = 0x03; out_data[write_idx++] = regularly_start_time_M_type; out_data[write_idx++] = get_time[1];//GetNoDisturbStartMinute(); out_data[write_idx++] = 0x03; out_data[write_idx++] = regularly_end_time_H_type; out_data[write_idx++] = get_time[2];//GetNoDisturbEndHour(); out_data[write_idx++] = 0x03; out_data[write_idx++] = regularly_end_time_M_type; out_data[write_idx++] = get_time[3];//GetNoDisturbEndMinute(); #endif *out_len = write_idx; } /*************************************************************************************************** 4.2.36 设备通知APP 同步勿扰信息 ***************************************************************************************************/ void BLE_reportDisturbStatus(void) { uint16_t write_idx = 0; uint8_t buf_temp[TEMP_NUM_MAX] = {0}; buf_temp[write_idx++] = 0x02; buf_temp[write_idx++] = REPORT_DISTURB_STATUS_TYPE; BLE_SendFrameById(DEVICE_SETUP_SERVER, REPORT_DISTURBINFO_ID,buf_temp, write_idx); } /********************************************************************************** 4.2.37 APP 下发温度单位 ***********************************************************************************/ void BLE_SetTemperatureUnit(uint8_t *in_data, uint16_t in_len, uint8_t *out_data, uint16_t *out_len) { uint16_t write_idx = 0; protocol_data_info_t data_info = {0}; uint8_t tempUnitValue; memset(&data_info, 0, sizeof(protocol_data_info_t)); data_info.error = PARAM_ERROR; do { user_get_data_info(&data_info, &in_data, &in_len); switch(data_info.type & 0x7f) { //无子节点 case 0x01: // SetWeatherTempUnit((uint8_t)(*data_info.p_data)); // task_ble_notify(BLE_SAVE_WEATHER_MSG, 0); // 异步存储天气信息 tempUnitValue = *data_info.p_data; data_info.error = FENDA_SUCCESS; break; default: break; } in_data = in_data + (data_info.len); in_len = in_len - (2 + data_info.len); if(in_len > FRAM_MAX_SIZ) { in_len = 0; } } while(in_len); if(data_info.error == FENDA_SUCCESS) { #if 1 //重置并保存天气温度单位 sql_weather_set_temper_unit(tempUnitValue); task_ble_notify(BLE_SAVE_WEATHER_MSG, 0); // 异步存储天气信息 task_ble_notify(BLE_WEATHER_UPDATE_MSG, 0); // ------TO BE ADDED 向UI发送消息 ------- add hes 2022.4.11 task_ui_notify(EVENT_WEATHER_UPDATE,NULL,NULL,NULL); #endif } write_idx = user_set_protocol_error(out_data, DEVICE_SETUP_SERVER, data_info.error); *out_len = write_idx; } // 所有涉及到设备管理的函数指针,这里的顺序和common id 顺序相同 const p_func_t DeviceSetupServerFunc[DEVICE_SETUP_SERVERE_MAX_ID] = { user_null_func, BLE_SetDeviceTime,//4.2.1 BLE_GetDeviceTime, //4.2.2 BLE_UserRaiseWristBrightScreenSwitch, //4.2.3 BLE_UserTrunWristCutScreenSwitch, //4.2.4 BLE_UserActivityReminderSwitch, //4.2.5 BLE_Factory_Reset, //4.2.6 BLE_SetAlarmClock, //4.2.7 BLE_GetAlarmClock, //4.2.8 BLE_UserRecvAndSetAvoidDisturbInfo,//4.2.9 user_null_func, user_null_func, user_null_func, user_null_func, user_null_func, user_null_func, BLE_UserGetDeviceMacAddr, //4.2.10 Ble_UserGetSoftwareVersion,//4.2.11 Ble_UserGetHardwareVersion,//4.2.12 BLE_UserBeginFindPhoneACK, // 找手机 主动上报 4.2.13 BLE_NotifyAPPSynchronizationAlarmACK, // 主动上报 4.2.14 ACK 解析 Ble_SetTimeFormat, //设置时间显示格式, 4.2.15 Ble_DisConnectedNotifySwitch,//4.2.16 BLE_SetMeasuringUnits, //单位设置, 4.2.17 BLE_UserGetDeviceElectricQuantityOrVoltage, //4.2.18 user_null_func, //主动上报 4.2.19 user_null_func, user_null_func, user_null_func, user_null_func, user_null_func, user_null_func, user_null_func, //BLE_DeviceChargingStateUpload 主动上报 4.2.20 BLE_GetDeviceModeVersion, //获取各设备模块固件版本号 4.2.21 user_null_func, BLE_doublePointBrightScreenSwitch, BLE_getPhoneType, BLE_getNewVersionNotice, BLE_drinkWaterRemindSet, BLE_getPhoneBatteryInfo, BLE_GetDeviceVersionInfo, //4.2.28 BLE_getPhoneInternetStatus, //4.2.29 user_null_func, user_null_func, user_null_func, user_null_func, user_null_func, user_null_func, BLE_findDevice, //4,2.30 user_null_func, user_null_func, user_null_func, user_null_func, BLE_getDisturbInfo, //4.2.35 user_null_func, BLE_SetTemperatureUnit };