mcu_hi3321_watch/tjd/ble/protocol/ble_device_setup_server.c
2025-05-26 20:15:20 +08:00

1987 lines
69 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/******************************************************************************
版权所有 (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
};