240 lines
8.3 KiB
C++
240 lines
8.3 KiB
C++
|
/***************************************************************************
|
||
|
*
|
||
|
* Copyright 2015-2019 BES.
|
||
|
* All rights reserved. All unpublished rights reserved.
|
||
|
*
|
||
|
* No part of this work may be used or reproduced in any form or by any
|
||
|
* means, or stored in a database or retrieval system, without prior written
|
||
|
* permission of BES.
|
||
|
*
|
||
|
* Use of this work is governed by a license granted by BES.
|
||
|
* This work contains confidential and proprietary information of
|
||
|
* BES. which is protected by copyright, trade secret,
|
||
|
* trademark and other intellectual property rights.
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
#include "bluetooth.h"
|
||
|
#include "hal_cmu.h"
|
||
|
#include "app_tota_cmd_code.h"
|
||
|
#include "app_spp_tota.h"
|
||
|
#include "app_tota.h"
|
||
|
#include "app_tota_cmd_handler.h"
|
||
|
#include "cmsis.h"
|
||
|
#include "crc32.h"
|
||
|
#include "app_hfp.h"
|
||
|
#include "app_key.h"
|
||
|
#include "app_tota_general.h"
|
||
|
#include "app_spp_tota.h"
|
||
|
#include "nvrecord_ble.h"
|
||
|
/*
|
||
|
** general info struct
|
||
|
** -> bt name
|
||
|
** -> ble name
|
||
|
** -> bt local/peer addr
|
||
|
** -> ble local/peer addr
|
||
|
** -> ibrt role
|
||
|
** -> crystal freq
|
||
|
** -> xtal fcap
|
||
|
** -> bat volt/level/status
|
||
|
** -> fw version
|
||
|
** -> ear location
|
||
|
** -> rssi info
|
||
|
*/
|
||
|
|
||
|
/*------------------------------------------------------------------------------------------------------------------------*/
|
||
|
|
||
|
/*
|
||
|
** general info
|
||
|
*/
|
||
|
static general_info_t general_info;
|
||
|
|
||
|
|
||
|
/*
|
||
|
** get general info
|
||
|
*/
|
||
|
static void __get_general_info();
|
||
|
|
||
|
/*
|
||
|
** handle general cmd
|
||
|
*/
|
||
|
static void __tota_general_cmd_handle(APP_TOTA_CMD_CODE_E funcCode, uint8_t* ptrParam, uint32_t paramLen);
|
||
|
|
||
|
/*------------------------------------------------------------------------------------------------------------------------*/
|
||
|
static void _tota_spp_connected(void);
|
||
|
static void _tota_spp_disconnected(void);
|
||
|
static void _tota_spp_tx_done(void);
|
||
|
static void _tota_spp_data_receive_handle(uint8_t * buf, uint32_t len);
|
||
|
|
||
|
static tota_callback_func_t s_func = {
|
||
|
_tota_spp_connected,
|
||
|
_tota_spp_disconnected,
|
||
|
_tota_spp_tx_done,
|
||
|
_tota_spp_data_receive_handle
|
||
|
};
|
||
|
|
||
|
static APP_TOTA_MODULE_E s_module = APP_TOTA_GENERAL;
|
||
|
|
||
|
void app_tota_general_init()
|
||
|
{
|
||
|
tota_callback_module_register(s_module, s_func);
|
||
|
}
|
||
|
|
||
|
static void _tota_spp_connected(void)
|
||
|
{
|
||
|
;
|
||
|
}
|
||
|
|
||
|
static void _tota_spp_disconnected(void)
|
||
|
{
|
||
|
;
|
||
|
}
|
||
|
|
||
|
static void _tota_spp_tx_done(void)
|
||
|
{
|
||
|
;
|
||
|
}
|
||
|
|
||
|
static void _tota_spp_data_receive_handle(uint8_t * buf, uint32_t len)
|
||
|
{
|
||
|
;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*------------------------------------------------------------------------------------------------------------------------*/
|
||
|
|
||
|
static void __tota_general_cmd_handle(APP_TOTA_CMD_CODE_E funcCode, uint8_t* ptrParam, uint32_t paramLen)
|
||
|
{
|
||
|
TOTA_LOG_DBG(2,"Func code 0x%x, param len %d", funcCode, paramLen);
|
||
|
TOTA_LOG_DBG(0,"Param content:");
|
||
|
DUMP8("%02x ", ptrParam, paramLen);
|
||
|
uint8_t resData[48]={0};
|
||
|
uint32_t resLen=1;
|
||
|
uint8_t volume_level;
|
||
|
switch (funcCode)
|
||
|
{
|
||
|
case OP_TOTA_GENERAL_INFO_CMD:
|
||
|
__get_general_info();
|
||
|
app_tota_send_response_to_command(funcCode,TOTA_NO_ERROR,(uint8_t *)&general_info, sizeof(general_info_t),app_tota_get_datapath());
|
||
|
// for test
|
||
|
// app_tota_send_response_to_command(funcCode,TOTA_NO_ERROR,(uint8_t *)&resLen, sizeof(uint32_t),app_tota_get_datapath());
|
||
|
return ;
|
||
|
case OP_TOTA_MERIDIAN_EFFECT_CMD:
|
||
|
resData[0] = app_meridian_eq(ptrParam[0]);
|
||
|
break;
|
||
|
case OP_TOTA_EQ_SELECT_CMD:
|
||
|
break;
|
||
|
case OP_TOTA_VOLUME_PLUS_CMD:
|
||
|
app_bt_volumeup();
|
||
|
volume_level = app_bt_stream_local_volume_get();
|
||
|
resData[0] = volume_level;
|
||
|
TRACE(1,"volume = %d",volume_level);
|
||
|
break;
|
||
|
case OP_TOTA_VOLUME_DEC_CMD:
|
||
|
app_bt_volumedown();
|
||
|
volume_level = app_bt_stream_local_volume_get();
|
||
|
resData[0] = volume_level;
|
||
|
resLen = 1;
|
||
|
TRACE(1,"volume = %d",volume_level);
|
||
|
break;
|
||
|
case OP_TOTA_VOLUME_SET_CMD:
|
||
|
//uint8_t scolevel = ptrParam[0];
|
||
|
//uint8_t a2dplevel = ptrParam[1];
|
||
|
app_bt_set_volume(APP_BT_STREAM_HFP_PCM,ptrParam[0]);
|
||
|
app_bt_set_volume(APP_BT_STREAM_A2DP_SBC,ptrParam[1]);
|
||
|
btapp_hfp_report_speak_gain();
|
||
|
btapp_a2dp_report_speak_gain();
|
||
|
break;
|
||
|
case OP_TOTA_VOLUME_GET_CMD:
|
||
|
resData[0] = app_bt_stream_hfpvolume_get();
|
||
|
resData[1] = app_bt_stream_a2dpvolume_get();
|
||
|
resLen = 2;
|
||
|
break;
|
||
|
case OP_TOTA_EQ_SET_CMD:
|
||
|
//int eq_index = ptrParam[0];
|
||
|
if (ptrParam[0] == 3)
|
||
|
resData[0] = app_meridian_eq(true);
|
||
|
else
|
||
|
resData[0] = app_audio_set_eq(ptrParam[0]);
|
||
|
resLen = 1;
|
||
|
break;
|
||
|
case OP_TOTA_EQ_GET_CMD:
|
||
|
resData[0] = app_audio_get_eq();
|
||
|
resLen = 1;
|
||
|
break;
|
||
|
case OP_TOTA_RAW_DATA_SET_CMD:
|
||
|
app_ibrt_debug_parse(ptrParam, paramLen);
|
||
|
break;
|
||
|
default:
|
||
|
TRACE(1,"wrong cmd 0x%x",funcCode);
|
||
|
resData[0] = -1;
|
||
|
return;
|
||
|
}
|
||
|
app_tota_send_response_to_command(funcCode,TOTA_NO_ERROR,resData,resLen,app_tota_get_datapath());
|
||
|
}
|
||
|
|
||
|
/* get general info */
|
||
|
static void __get_general_info()
|
||
|
{
|
||
|
/* get bt-ble name */
|
||
|
uint8_t* factory_name_ptr =factory_section_get_bt_name();
|
||
|
if ( factory_name_ptr != NULL )
|
||
|
{
|
||
|
uint16_t valid_len = strlen((char*)factory_name_ptr) > BT_BLE_LOCAL_NAME_LEN? BT_BLE_LOCAL_NAME_LEN:strlen((char*)factory_name_ptr);
|
||
|
memcpy(general_info.btName,factory_name_ptr,valid_len);
|
||
|
}
|
||
|
|
||
|
factory_name_ptr =factory_section_get_ble_name();
|
||
|
if ( factory_name_ptr != NULL )
|
||
|
{
|
||
|
uint16_t valid_len = strlen((char*)factory_name_ptr) > BT_BLE_LOCAL_NAME_LEN? BT_BLE_LOCAL_NAME_LEN:strlen((char*)factory_name_ptr);
|
||
|
memcpy(general_info.bleName,factory_name_ptr,valid_len);
|
||
|
}
|
||
|
|
||
|
/* get bt-ble peer addr */
|
||
|
ibrt_config_t addrInfo;
|
||
|
app_ibrt_ui_test_config_load(&addrInfo);
|
||
|
general_info.ibrtRole = addrInfo.nv_role;
|
||
|
memcpy(general_info.btLocalAddr.address, addrInfo.local_addr.address, 6);
|
||
|
memcpy(general_info.btPeerAddr.address, addrInfo.peer_addr.address, 6);
|
||
|
|
||
|
#ifdef BLE
|
||
|
memcpy(general_info.bleLocalAddr.address, bt_get_ble_local_address(), 6);
|
||
|
memcpy(general_info.blePeerAddr.address, nv_record_tws_get_peer_ble_addr(), 6);
|
||
|
#endif
|
||
|
|
||
|
/* get crystal info */
|
||
|
general_info.crystal_freq = hal_cmu_get_crystal_freq();
|
||
|
|
||
|
/* factory_section_xtal_fcap_get */
|
||
|
factory_section_xtal_fcap_get(&general_info.xtal_fcap);
|
||
|
|
||
|
/* get battery info (volt level)*/
|
||
|
app_battery_get_info(&general_info.battery_volt,&general_info.battery_level,&general_info.battery_status);
|
||
|
|
||
|
/* get firmware version */
|
||
|
#ifdef FIRMWARE_REV
|
||
|
system_get_info(&general_info.fw_version[0],&general_info.fw_version[1],&general_info.fw_version[2],&general_info.fw_version[3]);
|
||
|
TRACE(4,"firmware version = %d.%d.%d.%d",general_info.fw_version[0],general_info.fw_version[1],general_info.fw_version[2],general_info.fw_version[3]);
|
||
|
#endif
|
||
|
|
||
|
/* get ear location info */
|
||
|
if ( app_tws_is_right_side() ) general_info.ear_location = EAR_SIDE_RIGHT;
|
||
|
else if ( app_tws_is_left_side() ) general_info.ear_location = EAR_SIDE_LEFT;
|
||
|
else general_info.ear_location = EAR_SIDE_UNKNOWN;
|
||
|
|
||
|
app_ibrt_rssi_get_stutter(general_info.rssi, &general_info.rssi_len);
|
||
|
}
|
||
|
|
||
|
|
||
|
/* general command */
|
||
|
TOTA_COMMAND_TO_ADD(OP_TOTA_GENERAL_INFO_CMD, __tota_general_cmd_handle, false, 0, NULL );
|
||
|
TOTA_COMMAND_TO_ADD(OP_TOTA_MERIDIAN_EFFECT_CMD, __tota_general_cmd_handle, false, 0, NULL );
|
||
|
TOTA_COMMAND_TO_ADD(OP_TOTA_EQ_SELECT_CMD, __tota_general_cmd_handle, false, 0, NULL );
|
||
|
TOTA_COMMAND_TO_ADD(OP_TOTA_VOLUME_PLUS_CMD, __tota_general_cmd_handle, false, 0, NULL );
|
||
|
TOTA_COMMAND_TO_ADD(OP_TOTA_VOLUME_DEC_CMD, __tota_general_cmd_handle, false, 0, NULL );
|
||
|
TOTA_COMMAND_TO_ADD(OP_TOTA_VOLUME_SET_CMD, __tota_general_cmd_handle, false, 0, NULL );
|
||
|
TOTA_COMMAND_TO_ADD(OP_TOTA_VOLUME_GET_CMD, __tota_general_cmd_handle, false, 0, NULL );
|
||
|
TOTA_COMMAND_TO_ADD(OP_TOTA_EQ_SET_CMD, __tota_general_cmd_handle, false, 0, NULL );
|
||
|
TOTA_COMMAND_TO_ADD(OP_TOTA_EQ_GET_CMD, __tota_general_cmd_handle, false, 0, NULL );
|
||
|
TOTA_COMMAND_TO_ADD(OP_TOTA_RAW_DATA_SET_CMD, __tota_general_cmd_handle, false, 0, NULL );
|