KT24-1110_65E-HA-651B/apps/soundbox/smartbox/cmd_data_deal/cmd_recieve.c

331 lines
10 KiB
C
Raw Normal View History

2024-11-10 10:44:17 +00:00
#include "smartbox/config.h"
#include "smartbox/smartbox.h"
#include "smartbox/function.h"
#include "smartbox/feature.h"
#include "smartbox/switch_device.h"
#include "file_transfer.h"
#include "file_delete.h"
#include "dev_format.h"
#include "smartbox/event.h"
#include "btstack/avctp_user.h"
#include "app_action.h"
#include "smartbox_adv_bluetooth.h"
#include "smartbox_update.h"
#include "le_smartbox_module.h"
#include "fs.h"
#include "smartbox/func_cmd/rtc_func.h"
////<<<<<<<<APP 下发命令响应处理
#if (SMART_BOX_EN)
#define RES_MD5_FILE SDFILE_RES_ROOT_PATH"md5.bin"
#define ASSET_CMD_DATA_LEN(len, limit) \
do{ \
if(len >= limit){ \
}else{ \
return ; \
}\
}while(0);
static void get_target_feature(void *priv, u8 OpCode, u8 OpCode_SN, u8 *data, u16 len)
{
struct smartbox *smart = (struct smartbox *)priv;
if (smart == NULL) {
return ;
}
smart->A_platform = data[4];
u32 mask = READ_BIG_U32(data);
u32 wlen = 0;
u8 *resp = zalloc(TARGET_FEATURE_RESP_BUF_SIZE);
ASSERT(resp, "func = %s, line = %d, no ram!!\n", __FUNCTION__, __LINE__);
wlen = target_feature_parse_packet(priv, resp, TARGET_FEATURE_RESP_BUF_SIZE, mask);
JL_CMD_response_send(OpCode, JL_PRO_STATUS_SUCCESS, OpCode_SN, resp, wlen);
free(resp);
}
static void switch_device(void *priv, u8 OpCode, u8 OpCode_SN, u8 *data, u16 len)
{
struct smartbox *smart = (struct smartbox *)priv;
if (smart == NULL) {
return ;
}
smart->trans_chl = data[0];//指spp还是ble
printf("smart->trans_chl:%x\n", smart->trans_chl);
JL_CMD_response_send(OpCode, JL_PRO_STATUS_SUCCESS, OpCode_SN, NULL, 0);
smartbox_switch_device(data);
}
static void get_sys_info(void *priv, u8 OpCode, u8 OpCode_SN, u8 *data, u16 len)
{
ASSET_CMD_DATA_LEN(len, 1);
u8 function = data[0];
u8 *resp = zalloc(TARGET_FEATURE_RESP_BUF_SIZE);
resp[0] = function;
u32 rlen = smartbox_function_get(priv, function, data + 1, len - 1, resp + 1, TARGET_FEATURE_RESP_BUF_SIZE - 1);
if (rlen == 0) {
printf("get_sys_info LTV NULL !!!!\n");
}
JL_CMD_response_send(OpCode, JL_PRO_STATUS_SUCCESS, OpCode_SN, resp, (u16)rlen + 1);
free(resp);
}
static void set_sys_info(void *priv, u8 OpCode, u8 OpCode_SN, u8 *data, u16 len)
{
ASSET_CMD_DATA_LEN(len, 1);
u8 function = data[0];
bool ret = smartbox_function_set(priv, function, data + 1, len - 1);
if (ret == true) {
JL_CMD_response_send(OpCode, JL_PRO_STATUS_SUCCESS, OpCode_SN, NULL, 0);
} else {
JL_CMD_response_send(OpCode, JL_PRO_STATUS_FAIL, OpCode_SN, NULL, 0);
}
}
static void disconnect_edr(void *priv, u8 OpCode, u8 OpCode_SN, u8 *data, u16 len)
{
struct smartbox *smart = (struct smartbox *)priv;
if (smart == NULL) {
return ;
}
printf("notify disconnect edr\n");
smartbox_msg_post(USER_MSG_SMARTBOX_DISCONNECT_EDR, 1, (int)priv);
JL_CMD_response_send(OpCode, JL_PRO_STATUS_SUCCESS, OpCode_SN, NULL, 0);
}
static void file_bs_start(void *priv, u8 OpCode, u8 OpCode_SN, u8 *data, u16 len)
{
/* printf("JL_OPCODE_FILE_BROWSE_REQUEST_START\n"); */
/* put_buf(data, len); */
#if RCSP_FILE_OPT
if (smartbox_browser_busy() == false) {
JL_CMD_response_send(OpCode, JL_PRO_STATUS_FAIL, OpCode_SN, NULL, 0);
} else {
JL_CMD_response_send(OpCode, JL_PRO_STATUS_SUCCESS, OpCode_SN, NULL, 0);
smartbox_browser_start(data, len);
}
#endif
}
static void open_bt_scan(void *priv, u8 OpCode, u8 OpCode_SN, u8 *data, u16 len)
{
u8 result = 0;
bool ret = smartbox_msg_post(USER_MSG_SMARTBOX_BT_SCAN_OPEN, 1, (int)priv);
if (ret == true) {
result = 1;
}
JL_CMD_response_send(OpCode, JL_PRO_STATUS_SUCCESS, OpCode_SN, &result, 1);
}
static void stop_bt_scan(void *priv, u8 OpCode, u8 OpCode_SN, u8 *data, u16 len)
{
u8 result = 0;
bool ret = smartbox_msg_post(USER_MSG_SMARTBOX_BT_SCAN_STOP, 1, (int)priv);
if (ret == true) {
result = 1;
}
JL_CMD_response_send(OpCode, JL_PRO_STATUS_SUCCESS, OpCode_SN, &result, 1);
}
static void connect_bt_spec_addr(void *priv, u8 OpCode, u8 OpCode_SN, u8 *data, u16 len)
{
u8 result = 0;
struct smartbox *smart = (struct smartbox *)priv;
if (smart == NULL) {
return ;
}
if (len != 6) {
printf("connect_bt_spec_addr data len err = %d\n", len);
}
memcpy(smart->emitter_con_addr, data, 6);
bool ret = smartbox_msg_post(USER_MSG_SMARTBOX_BT_CONNECT_SPEC_ADDR, 1, (int)priv);
if (ret == true) {
result = 1;
}
JL_CMD_response_send(OpCode, JL_PRO_STATUS_SUCCESS, OpCode_SN, &result, 1);
}
static void function_cmd_handle(void *priv, u8 OpCode, u8 OpCode_SN, u8 *data, u16 len)
{
ASSET_CMD_DATA_LEN(len, 1);
u8 function = data[0];
bool ret = smartbox_function_cmd_set(priv, function, data + 1, len - 1);
if (ret == true) {
JL_CMD_response_send(OpCode, JL_PRO_STATUS_SUCCESS, OpCode_SN, NULL, 0);
} else {
JL_CMD_response_send(OpCode, JL_PRO_STATUS_FAIL, OpCode_SN, NULL, 0);
}
}
static void find_device_handle(void *priv, u8 OpCode, u8 OpCode_SN, u8 *data, u16 len)
{
#if RCSP_ADV_FIND_DEVICE_ENABLE
struct smartbox *smart = (struct smartbox *)priv;
if (smart == NULL) {
return ;
}
if (!smart->find_dev_en) {
return;
}
if (BT_CALL_HANGUP != get_call_status()) {
return ;
}
u8 type = data[0];
u8 opt = data[1];
if (opt) {
// 播放铃声
u16 timeout = READ_BIG_U16(data + 2);
extern void find_device_timeout_handle(u32 sec);
find_device_timeout_handle(timeout);
} else {
// 关闭铃声
extern void smartbox_stop_find_device(void *priv);
smartbox_stop_find_device(NULL);
}
JL_CMD_response_send(OpCode, JL_PRO_STATUS_SUCCESS, OpCode_SN, NULL, 0);
#endif
}
static void get_md5_handle(void *priv, u8 OpCode, u8 OpCode_SN, u8 *data, u16 len)
{
struct smartbox *smart = (struct smartbox *)priv;
if (smart == NULL) {
return ;
}
u8 md5[32] = {0};
FILE *fp = fopen(RES_MD5_FILE, "r");
if (!fp) {
JL_CMD_response_send(OpCode, JL_PRO_STATUS_SUCCESS, OpCode_SN, NULL, 0);
return;
}
u32 r_len = fread(fp, (void *)md5, 32);
if (r_len != 32) {
JL_CMD_response_send(OpCode, JL_PRO_STATUS_SUCCESS, OpCode_SN, NULL, 0);
return;
}
/* printf("get [md5] succ:"); */
/* put_buf(md5, 32); */
JL_CMD_response_send(OpCode, JL_PRO_STATUS_SUCCESS, OpCode_SN, md5, 32);
fclose(fp);
}
static void get_low_latency_param(void *priv, u8 OpCode, u8 OpCode_SN, u8 *data, u16 len)
{
struct smartbox *smart = (struct smartbox *)priv;
if (smart == NULL) {
return ;
}
u8 low_latency_param[6] = {0};
JL_CMD_response_send(OpCode, JL_PRO_STATUS_SUCCESS, OpCode_SN, low_latency_param, 6);
}
static void smartbox_alarm_ex(void *priv, u8 OpCode, u8 OpCode_SN, u8 *data, u16 len)
{
u16 rlen = 0;
u8 op = data[0];
bool ret = 1;
u8 *resp = zalloc(TARGET_FEATURE_RESP_BUF_SIZE);
resp[0] = op;
if (op == 0x00) {
rlen = rtc_func_get_ex(priv, resp + 1, TARGET_FEATURE_RESP_BUF_SIZE - 1, data[1]) + 1;
put_buf(resp, rlen);
} else if (op == 0x01) {
put_buf(data, len);
ret = rtc_func_set_ex(priv, data + 1, len - 1);
rlen = 1;
}
if (ret == true) {
JL_CMD_response_send(OpCode, JL_PRO_STATUS_SUCCESS, OpCode_SN, resp, rlen);
} else {
JL_CMD_response_send(OpCode, JL_PRO_STATUS_FAIL, OpCode_SN, resp, rlen);
}
free(resp);
}
void cmd_recieve(void *priv, u8 OpCode, u8 OpCode_SN, u8 *data, u16 len)
{
switch (OpCode) {
case JL_OPCODE_GET_TARGET_FEATURE:
get_target_feature(priv, OpCode, OpCode_SN, data, len);
break;
case JL_OPCODE_DISCONNECT_EDR:
disconnect_edr(priv, OpCode, OpCode_SN, data, len);
break;
case JL_OPCODE_SWITCH_DEVICE:
switch_device(priv, OpCode, OpCode_SN, data, len);
break;
case JL_OPCODE_SYS_INFO_GET:
get_sys_info(priv, OpCode, OpCode_SN, data, len);
break;
case JL_OPCODE_SYS_INFO_SET:
set_sys_info(priv, OpCode, OpCode_SN, data, len);
break;
case JL_OPCODE_FILE_BROWSE_REQUEST_START:
file_bs_start(priv, OpCode, OpCode_SN, data, len);
break;
case JL_OPCODE_SYS_OPEN_BT_SCAN:
open_bt_scan(priv, OpCode, OpCode_SN, data, len);
break;
case JL_OPCODE_SYS_STOP_BT_SCAN:
stop_bt_scan(priv, OpCode, OpCode_SN, data, len);
break;
case JL_OPCODE_SYS_BT_CONNECT_SPEC:
connect_bt_spec_addr(priv, OpCode, OpCode_SN, data, len);
break;
case JL_OPCODE_FUNCTION_CMD:
function_cmd_handle(priv, OpCode, OpCode_SN, data, len);
break;
case JL_OPCODE_SYS_FIND_DEVICE:
find_device_handle(priv, OpCode, OpCode_SN, data, len);
break;
case JL_OPCODE_GET_MD5:
get_md5_handle(priv, OpCode, OpCode_SN, data, len);
break;
case JL_OPCODE_LOW_LATENCY_PARAM:
get_low_latency_param(priv, OpCode, OpCode_SN, data, len);
break;
case JL_OPCODE_CUSTOMER_USER:
smartbox_user_cmd_recieve(priv, OpCode, OpCode_SN, data, len);
break;
case JL_OPCODE_FILE_TRANSFER_START:
file_transfer_download_start(OpCode_SN, data, len);
break;
case JL_OPCODE_FILE_TRANSFER_CANCEL:
file_transfer_download_passive_cancel(OpCode_SN, data, len);
break;
case JL_OPCODE_FILE_DELETE:
file_delete_start(OpCode_SN, data, len);
break;
case JL_OPCODE_ACTION_PREPARE:
app_smartbox_task_prepare(1, data[0], OpCode_SN);
break;
case JL_OPCODE_DEVICE_FORMAT:
dev_format_start(OpCode_SN, data, len);
break;
case JL_OPCODE_ALARM_EXTRA:
smartbox_alarm_ex(priv, OpCode, OpCode_SN, data, len);
break;
default:
#if 1//RCSP_SMARTBOX_ADV_EN
if (0 == JL_smartbox_adv_cmd_resp(priv, OpCode, OpCode_SN, data, len)) {
break;
}
#endif
#if RCSP_UPDATE_EN
if (0 == JL_rcsp_update_cmd_resp(priv, OpCode, OpCode_SN, data, len)) {
break;
}
#endif
break;
}
}
#endif//SMART_BOX_EN