265 lines
5.7 KiB
C
265 lines
5.7 KiB
C
|
|
#include "app_config.h"
|
||
|
|
|
||
|
|
|
||
|
|
#include "earphone.h"
|
||
|
|
#include "app_main.h"
|
||
|
|
#include "3th_profile_api.h"
|
||
|
|
#include "btstack/avctp_user.h"
|
||
|
|
#include "btstack/btstack_task.h"
|
||
|
|
#include "bt_tws.h"
|
||
|
|
#include "ble_qiot_export.h"
|
||
|
|
|
||
|
|
#include "update_tws.h"
|
||
|
|
#include "update_tws_new.h"
|
||
|
|
|
||
|
|
#if TUYA_DEMO_EN
|
||
|
|
|
||
|
|
#define LOG_TAG "[tuya_app]"
|
||
|
|
#define LOG_ERROR_ENABLE
|
||
|
|
#define LOG_DEBUG_ENABLE
|
||
|
|
#define LOG_INFO_ENABLE
|
||
|
|
/* #define LOG_DUMP_ENABLE */
|
||
|
|
#define LOG_CLI_ENABLE
|
||
|
|
#include "debug.h"
|
||
|
|
|
||
|
|
|
||
|
|
extern void ble_app_disconnect(void);
|
||
|
|
|
||
|
|
int tuya_earphone_state_set_page_scan_enable()
|
||
|
|
{
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
int tuya_earphone_state_get_connect_mac_addr()
|
||
|
|
{
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
int tuya_earphone_state_cancel_page_scan()
|
||
|
|
{
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
int tuya_earphone_state_tws_init(int paired)
|
||
|
|
{
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
int tuya_earphone_state_tws_connected(int first_pair, u8 *comm_addr)
|
||
|
|
{
|
||
|
|
if (first_pair) {
|
||
|
|
extern void ble_module_enable(u8 en);
|
||
|
|
extern void bt_update_mac_addr(u8 * addr);
|
||
|
|
extern void lib_make_ble_address(u8 * ble_address, u8 * edr_address);
|
||
|
|
/* bt_ble_adv_enable(0); */
|
||
|
|
u8 tmp_ble_addr[6] = {0};
|
||
|
|
lib_make_ble_address(tmp_ble_addr, comm_addr);
|
||
|
|
le_controller_set_mac(tmp_ble_addr);//将ble广播地址改成公共地址
|
||
|
|
bt_update_mac_addr(comm_addr);
|
||
|
|
/* bt_ble_adv_enable(1); */
|
||
|
|
|
||
|
|
|
||
|
|
/*新的连接,公共地址改变了,要重新将新的地址广播出去*/
|
||
|
|
if (tws_api_get_role() == TWS_ROLE_MASTER) {
|
||
|
|
printf("\nNew Connect Master!!!\n\n");
|
||
|
|
ble_app_disconnect();
|
||
|
|
ble_qiot_advertising_start();
|
||
|
|
} else {
|
||
|
|
printf("\nConnect Slave!!!\n\n");
|
||
|
|
/*从机ble关掉*/
|
||
|
|
ble_app_disconnect();
|
||
|
|
ble_qiot_advertising_stop();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
int tuya_earphone_state_enter_soft_poweroff()
|
||
|
|
{
|
||
|
|
extern void bt_ble_exit(void);
|
||
|
|
bt_ble_exit();
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
int tuya_adv_bt_status_event_handler(struct bt_event *bt)
|
||
|
|
{
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
int tuya_adv_hci_event_handler(struct bt_event *bt)
|
||
|
|
{
|
||
|
|
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
void tuya_bt_tws_event_handler(struct bt_event *bt)
|
||
|
|
{
|
||
|
|
int role = bt->args[0];
|
||
|
|
int phone_link_connection = bt->args[1];
|
||
|
|
int reason = bt->args[2];
|
||
|
|
|
||
|
|
switch (bt->event) {
|
||
|
|
case TWS_EVENT_CONNECTED:
|
||
|
|
//bt_ble_adv_enable(1);
|
||
|
|
if (tws_api_get_role() == TWS_ROLE_SLAVE) {
|
||
|
|
//master enable
|
||
|
|
printf("\nConnect Slave!!!\n\n");
|
||
|
|
/*从机ble关掉*/
|
||
|
|
ble_app_disconnect();
|
||
|
|
ble_qiot_advertising_stop();
|
||
|
|
} else {
|
||
|
|
void bt_tws_sync_tuya_state();
|
||
|
|
bt_tws_sync_tuya_state();
|
||
|
|
}
|
||
|
|
|
||
|
|
break;
|
||
|
|
case TWS_EVENT_PHONE_LINK_DETACH:
|
||
|
|
/*
|
||
|
|
* 跟手机的链路LMP层已完全断开, 只有tws在连接状态才会收到此事件
|
||
|
|
*/
|
||
|
|
break;
|
||
|
|
case TWS_EVENT_CONNECTION_DETACH:
|
||
|
|
/*
|
||
|
|
* TWS连接断开
|
||
|
|
*/
|
||
|
|
if (app_var.goto_poweroff_flag) {
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
if (get_app_connect_type() == 0) {
|
||
|
|
printf("\ntws detach to open ble~~~\n\n");
|
||
|
|
|
||
|
|
ble_qiot_advertising_start();
|
||
|
|
}
|
||
|
|
set_ble_connect_type(TYPE_NULL);
|
||
|
|
|
||
|
|
break;
|
||
|
|
case TWS_EVENT_SYNC_FUN_CMD:
|
||
|
|
break;
|
||
|
|
case TWS_EVENT_ROLE_SWITCH:
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
#if OTA_TWS_SAME_TIME_ENABLE
|
||
|
|
tws_ota_app_event_deal(bt->event);
|
||
|
|
#endif
|
||
|
|
}
|
||
|
|
|
||
|
|
int tuya_sys_event_handler_specific(struct sys_event *event)
|
||
|
|
{
|
||
|
|
switch (event->type) {
|
||
|
|
case SYS_BT_EVENT:
|
||
|
|
if ((u32)event->arg == SYS_BT_EVENT_TYPE_CON_STATUS) {
|
||
|
|
|
||
|
|
} else if ((u32)event->arg == SYS_BT_EVENT_TYPE_HCI_STATUS) {
|
||
|
|
|
||
|
|
}
|
||
|
|
#if TCFG_USER_TWS_ENABLE
|
||
|
|
else if (((u32)event->arg == SYS_BT_EVENT_FROM_TWS)) {
|
||
|
|
tuya_bt_tws_event_handler(&event->u.bt);
|
||
|
|
}
|
||
|
|
#endif
|
||
|
|
#if OTA_TWS_SAME_TIME_ENABLE
|
||
|
|
else if (((u32)event->arg == SYS_BT_OTA_EVENT_TYPE_STATUS)) {
|
||
|
|
bt_ota_event_handler(&event->u.bt);
|
||
|
|
}
|
||
|
|
#endif
|
||
|
|
break;
|
||
|
|
case SYS_DEVICE_EVENT:
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* int user_spp_state_specific(u8 packet_type) */
|
||
|
|
/* { */
|
||
|
|
/* */
|
||
|
|
/* switch (packet_type) { */
|
||
|
|
/* case 1: */
|
||
|
|
/* bt_ble_adv_enable(0); */
|
||
|
|
/* set_app_connect_type(TYPE_SPP); */
|
||
|
|
/* break; */
|
||
|
|
/* case 2: */
|
||
|
|
/* */
|
||
|
|
/* set_app_connect_type(TYPE_NULL); */
|
||
|
|
/* */
|
||
|
|
/* #if TCFG_USER_TWS_ENABLE */
|
||
|
|
/* if (!(tws_api_get_tws_state() & TWS_STA_SIBLING_CONNECTED)) { */
|
||
|
|
/* ble_module_enable(1); */
|
||
|
|
/* } else { */
|
||
|
|
/* if (tws_api_get_role() == TWS_ROLE_MASTER) { */
|
||
|
|
/* ble_module_enable(1); */
|
||
|
|
/* } */
|
||
|
|
/* } */
|
||
|
|
/* #else */
|
||
|
|
/* ble_module_enable(1); */
|
||
|
|
/* #endif */
|
||
|
|
/* */
|
||
|
|
/* break; */
|
||
|
|
/* } */
|
||
|
|
/* return 0; */
|
||
|
|
/* } */
|
||
|
|
|
||
|
|
|
||
|
|
int tuya_earphone_state_init()
|
||
|
|
{
|
||
|
|
/* transport_spp_init(); */
|
||
|
|
/* spp_data_deal_handle_register(user_spp_data_handler); */
|
||
|
|
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
_WEAK_ void tuya_state_deal(void *_data, u16 len)
|
||
|
|
{
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
extern void tuya_state_deal(void *_data, u16 len);
|
||
|
|
static void bt_tws_tuya_state(void *_data, u16 len, bool rx)
|
||
|
|
{
|
||
|
|
|
||
|
|
if (rx) {
|
||
|
|
//r_printf("slave ll sync data");
|
||
|
|
//put_buf(_data,len);
|
||
|
|
tuya_state_deal(_data, len);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
REGISTER_TWS_FUNC_STUB(app_tuya_state_stub) = {
|
||
|
|
.func_id = TWS_FUNC_ID_TUYA_STATE,
|
||
|
|
.func = bt_tws_tuya_state,
|
||
|
|
};
|
||
|
|
|
||
|
|
_WEAK_ u16 tuya_get_core_data(u8 *data)
|
||
|
|
{
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
extern u16 tuya_get_core_data(u8 *data);
|
||
|
|
void bt_tws_sync_tuya_state()
|
||
|
|
{
|
||
|
|
u8 data[20];
|
||
|
|
u16 data_len;
|
||
|
|
|
||
|
|
if (tws_api_get_role() == TWS_ROLE_MASTER) {
|
||
|
|
data_len = tuya_get_core_data(data);
|
||
|
|
|
||
|
|
//r_printf("master ll sync data");
|
||
|
|
put_buf(&data, data_len);
|
||
|
|
|
||
|
|
|
||
|
|
tws_api_send_data_to_sibling(data, data_len, TWS_FUNC_ID_TUYA_STATE);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
#endif
|