#include "system/includes.h" #include "media/includes.h" #include "tone_player.h" #include "earphone.h" #include "app_config.h" #include "app_action.h" #include "app_task.h" #include "btstack/avctp_user.h" #include "btstack/btstack_task.h" #include "btctrler/btctrler_task.h" #include "btstack/frame_queque.h" #include "user_cfg.h" // #include "aec_user.h" #include "classic/hci_lmp.h" #include "bt_common.h" #include "bt_ble.h" #include "bt_tws.h" #include "pbg_user.h" #include "btstack/bluetooth.h" #include "colorful_lights/colorful_lights.h" #include "app_chargestore.h" #include "jl_kws/jl_kws_api.h" #include "asm/charge.h" #include "app_charge.h" #include "ui_manage.h" #include "app_chargestore.h" #include "app_umidigi_chargestore.h" #include "app_testbox.h" #include "app_online_cfg.h" #include "app_main.h" #include "app_power_manage.h" #include "gSensor/gSensor_manage.h" #include "key_event_deal.h" #include "classic/tws_api.h" #include "asm/pwm_led.h" #include "ir_sensor/ir_manage.h" #include "in_ear_detect/in_ear_manage.h" #include "vol_sync.h" #include "bt_background.h" #include "default_event_handler.h" #include "debug.h" #include "system/event.h" #include "./ano/ano_protocol.h" #include "./sensor/MMC56.h" #include "./sensor/BMP280.h" #include "./sensor/AK8963.h" #include "./calculate/skiing_tracker.h" /////////////////////////////////////////////////////////////////////////////////////////////////// //宏定义 #define LOG_TAG_CONST EARPHONE #define LOG_TAG "[EARPHONE]" #define LOG_ERROR_ENABLE #define LOG_DEBUG_ENABLE #define xlog_ENABLE #if(USE_DMA_UART_TEST) //使用dm串口测试时不能同时打开 #define MY_SNIFF_EN 0 #else #define MY_SNIFF_EN 1 //默认打开 #endif #define ENABLE_XLOG 1 #ifdef xlog #undef xlog #endif #if ENABLE_XLOG #define xlog(format, ...) printf("[XT:%s] " format, __func__, ##__VA_ARGS__) #else #define xlog(format, ...) ((void)0) #endif // /////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////// //变量 extern u8 init_ok; extern u8 sniff_out; unsigned char xtell_bl_state=0; //存放经典蓝牙的连接状态,0断开,1是连接 u8 bt_newname =0; unsigned char xt_ble_new_name[9] = "CM-22222"; static u16 play_poweron_ok_timer_id = 0; // -- 初始化标志位 -- u8 SC7U22_init = 0x10; //六轴是否初始化 u8 MMC5603nj_init = 0x20; //地磁是否初始化 u8 BMP280_init = 0x30; //气压计初始化 u8 foot_init = 0x40; //数据来源初始化:左脚0x41 or 右脚0x42 // -- 线程id -- u16 gsensor_test_id = 0; // /////////////////////////////////////////////////////////////////////////////////////////////////// extern int bt_hci_event_handler(struct bt_event *bt); extern void SC7U22_static_calibration(void); extern void create_process(u16* pid, const char* name, void *priv, void (*func)(void *priv), u32 msec); extern void close_process(u16* pid,char* name); extern void start_collect_fuc(void); extern void BLE_send_fuc(void); extern void start_calibration(void); extern void start_clloct(void); extern void stop_clloct(void); extern void set_foot_state(u8 state); /////////////////////////////////////////////////////////////////////////////////////////////////// /* * 模式状态机, 通过start_app()控制状态切换 */ /* extern int audio_mic_init(); */ static int state_machine(struct application *app, enum app_state state, struct intent *it){ int error = 0; static u8 tone_player_err = 0; xlog("bt_state_machine=%d\n", state); switch (state) { case APP_STA_CREATE: xlog("APP_STA_CREATE\n"); /* set_adjust_conn_dac_check(0); */ break; case APP_STA_START: xlog("APP_STA_START\n"); if (!it) { xlog("APP_STA_START:it none\n"); break; } switch (it->action) { case ACTION_EARPHONE_MAIN: xlog("ble init\n"); /* * handler 初始化 */ clk_set("sys", BT_NORMAL_HZ); u32 sys_clk = clk_get("sys"); bt_pll_para(TCFG_CLOCK_OSC_HZ, sys_clk, 0, 0); /* bredr_set_dut_enble(1, 1); */ bt_function_select_init(); bredr_handle_register(); EARPHONE_STATE_INIT(); btstack_init(); sys_auto_shut_down_enable(); bt_sniff_feature_init(); sys_auto_sniff_controle(MY_SNIFF_EN, NULL); app_var.dev_volume = -1; break; case ACTION_A2DP_START: //蓝牙音频传输协议 xlog("ACTION_A2DP_START\n"); break; case ACTION_BY_KEY_MODE: xlog("ACTION_BY_KEY_MODE\n"); break; case ACTION_TONE_PLAY: xlog("ACTION_TONE_PLAY\n"); // STATUS *p_tone = get_tone_config(); // tone_play_index(p_tone->bt_init_ok, 1); break; case ACTION_DO_NOTHING: xlog("ACTION_DO_NOTHING\n"); break; } break; case APP_STA_PAUSE: xlog("APP_STA_PAUSE\n"); break; case APP_STA_RESUME: xlog("APP_STA_RESUME\n"); //恢复前台运行 sys_auto_shut_down_disable(); sys_key_event_enable(); break; case APP_STA_STOP: xlog("APP_STA_STOP\n"); break; case APP_STA_DESTROY: xlog("APP_STA_DESTROY\n"); r_printf("APP_STA_DESTROY\n"); if (!app_var.goto_poweroff_flag) { bt_app_exit(NULL); } break; } xlog("state machine error\n"); return error; } /////////////////////////////////////////////////////////////////////////////////////////////////// //handle void le_user_app_send_event(size_t command, unsigned char* data, size_t size) { // 中断->事件 static unsigned char buffer[512]; if(data && size && size <= sizeof(buffer)) { // 拷贝到缓存,避免转发事件的时候,地址发送改变。 memcpy(buffer, data, size); struct sys_event event; event.type = SYS_APP_USER_EVENT; event.u.app.command = command; event.u.app.buffer = buffer; event.u.app.size = size; sys_event_notify(&event); } } void le_user_app_event_handler(struct sys_event* event){ switch (event->type) { // 打印接收到的数据 printf("BLE data\n"); put_buf(event->u.app.buffer, event->u.app.size); case SYS_APP_USER_EVENT: if (event->u.app.buffer[0] == 0xBE && event->u.app.buffer[1] == 0xBB) { if(event->u.app.buffer[2] == 0x01){ //后面的数据长度 1 switch (event->u.app.buffer[3]){ case 0x01: extern void gsensor_test(void); create_process(&gsensor_test_id,"gsensor_test",NULL,gsensor_test,1000); break; case 0xff: //测试 u8 device_buff[10]; u8 founds = 0; extern void i2c_scanner_probe(u8* device_addr, u8* found_number); i2c_scanner_probe(device_buff,&founds); for(int i = 0;i < founds;i++){ send_data_to_ble_client(&device_buff,founds); } break; default: break; } }else if(event->u.app.buffer[2] == 0x02){ //后面数据长度为2 switch (event->u.app.buffer[3]){ //数据包类型 case 0x00: //数据包类型为:指定传感器初始化 u8 send2_0[5] = {0xBB,0xBE,0x02,0x00,0x00}; if(event->u.app.buffer[4] == 0x01){ //六轴 if (SL_SC7U22_Config() == 0) { send2_0[4] = 0x00; //初始化失败 SC7U22_init = 0x10; send_data_to_ble_client(&send2_0,5); return; } start_calibration(); }else if(event->u.app.buffer[4] == 0x02){ //地磁 if(mmc5603nj_init() == 0){ MMC5603nj_init = 0x20; send2_0[4] = MMC5603nj_init; //地磁初始化失败 send_data_to_ble_client(&send2_0,5); return; } MMC5603nj_init = 0x21; send2_0[4] = MMC5603nj_init; //地磁初始化成功 send_data_to_ble_client(&send2_0,5); }else if(event->u.app.buffer[4] == 0x03){ //气压计初始化 if(bmp280_init() != 0){ //初始化失败 BMP280_init = 0x30; send2_0[4] = BMP280_init; send_data_to_ble_client(&send2_0,5); return; } BMP280_init = 0x31; send2_0[4] = BMP280_init; //气压计初始化成功 send_data_to_ble_client(&send2_0,5); } break; case 0x01: //设置传感器采集对象:左脚or右脚 u8 send2_1[9] = {0xBB,0xBE,0x06,0x05,0x00,0x00,0x00,0x00,0x00}; if(event->u.app.buffer[4] == 0x01){ //设定数据来源是左脚 foot_init = 0x41; }else if(event->u.app.buffer[4] == 0x02){//设定数据来源是右脚 foot_init = 0x42; } send2_1[4] = foot_init; send_data_to_ble_client(&send2_1,9); break; case 0x02: //数据包类型为:获取指定传感器初始化状态 u8 send2_2[5] = {0xBB,0xBE,0x02,0x00,0x00}; if(event->u.app.buffer[4] == 0x01){ //六轴 send2_2[4] = SC7U22_init; }else if(event->u.app.buffer[4] == 0x02){ //地磁 send2_2[4] = MMC5603nj_init; }else if(event->u.app.buffer[4] == 0x03){ //气压计 send2_2[4] = BMP280_init; } send_data_to_ble_client(&send2_2,5); break; case 0x03: //开始/停止滑雪计算 if(event->u.app.buffer[4] == 0x01){ //开始滑雪计算 if(SC7U22_init == 0x10 || MMC5603nj_init == 0x20 || BMP280_init == 0x30){ //传感器未进行初始化 u8 send2_3[5] = {0xBB,0xBE,0x02,0x00,0x00}; send_data_to_ble_client(&send2_3,5); return; } start_clloct(); }else if(event->u.app.buffer[4] == 0x02){ //停止滑雪计算 stop_clloct(); } break; } } } break; default: xlog("%d\n",event->type); break; } } static void play_poweron_ok_timer(void *priv) { app_var.wait_timer_do = 0; log_d("\n-------play_poweron_ok_timer-------\n", priv); if (is_dac_power_off()) { #if TCFG_USER_TWS_ENABLE bt_tws_poweron(); #else bt_wait_connect_and_phone_connect_switch(0); #endif return; } app_var.wait_timer_do = sys_timeout_add(priv, play_poweron_ok_timer, 100); } static void play_bt_connect_dly(void *priv) { app_var.wait_timer_do = 0; log_d("\n-------play_bt_connect_dly-------\n", priv); if (!app_var.goto_poweroff_flag) { STATUS *p_tone = get_tone_config(); tone_play_index(p_tone->bt_connect_ok, 1); } } static int bt_connction_status_event_handler(struct bt_event *bt) { STATUS *p_tone = get_tone_config(); u8 *phone_number = NULL; switch (bt->event) { case BT_STATUS_INIT_OK: /* * 蓝牙初始化完成 */ xlog("BT_STATUS_INIT_OK\n"); init_ok = 1; __set_sbc_cap_bitpool(38); #if (TCFG_USER_BLE_ENABLE) if (BT_MODE_IS(BT_BQB)) { ble_bqb_test_thread_init(); } else { #if !TCFG_WIRELESS_MIC_ENABLE bt_ble_init(); #endif } #endif bt_init_ok_search_index(); #if TCFG_TEST_BOX_ENABLE testbox_set_bt_init_ok(1); #endif #if ((CONFIG_BT_MODE == BT_BQB)||(CONFIG_BT_MODE == BT_PER)) bt_wait_phone_connect_control(1); #else if (is_dac_power_off()) { bt_wait_connect_and_phone_connect_switch(0); } else { app_var.wait_timer_do = sys_timeout_add(NULL, play_poweron_ok_timer, 100); } #endif /*if (app_var.play_poweron_tone) { tone_play_index(p_tone->power_on, 1); }*/ break; case BT_STATUS_SECOND_CONNECTED: clear_current_poweron_memory_search_index(0); case BT_STATUS_FIRST_CONNECTED: xlog("BT_STATUS_CONNECTED\n"); xtell_bl_state = 1; //蓝牙连接成功 置1 if(strcmp(xt_ble_new_name,"CM-11111") != 0){ //蓝牙连接成功 bt_newname =1; u8 temp[5]={0xBB,0xBE,0x02,0x04,0x00}; temp[4] = xtell_bl_state; //经典蓝牙连接状态 send_data_to_ble_client(&temp,5); } earphone_change_pwr_mode(PWR_DCDC15, 3000); sys_auto_shut_down_disable(); ui_update_status(STATUS_BT_CONN); //单台在此处设置连接状态,对耳的连接状态需要同步,在bt_tws.c中去设置 /* tone_play(TONE_CONN); */ /*os_time_dly(40); // for test*/ xlog("tone status:%d\n", tone_get_status()); if (get_call_status() == BT_CALL_HANGUP) { if (app_var.phone_dly_discon_time) { sys_timeout_del(app_var.phone_dly_discon_time); app_var.phone_dly_discon_time = 0; } else { app_var.wait_timer_do = sys_timeout_add(NULL, play_bt_connect_dly, 1600); /* tone_play_index(p_tone->bt_connect_ok, 1); */ } } /*int timeout = 5000 + rand32() % 10000; sys_timeout_add(NULL, connect_phone_test, timeout);*/ break; case BT_STATUS_FIRST_DISCONNECT: case BT_STATUS_SECOND_DISCONNECT: xlog("BT_STATUS_DISCONNECT\n"); xtell_bl_state = 0; //断开蓝牙 清0 //蓝牙断开连接 if(bt_newname){ //已经改成新蓝牙名字,断开才播报 bt_newname=0; u8 temp[5]={0xBB,0xBE,0x02,0x04,0x00}; temp[4] = xtell_bl_state; //经典蓝牙连接状态 send_data_to_ble_client(&temp,5); } if (app_var.goto_poweroff_flag) { /*关机不播断开提示音*/ /*关机时不改UI*/ break; } // bt_discon_dly_handle(NULL); break; //phone status deal case BT_STATUS_PHONE_INCOME: break; case BT_STATUS_PHONE_OUT: break; case BT_STATUS_PHONE_ACTIVE: break; case BT_STATUS_PHONE_HANGUP: break; case BT_STATUS_PHONE_NUMBER: break; case BT_STATUS_INBAND_RINGTONE: //铃声 break; case BT_STATUS_CALL_VOL_CHANGE: break; case BT_STATUS_SNIFF_STATE_UPDATE: xlog(" BT_STATUS_SNIFF_STATE_UPDATE %d\n", bt->value); //0退出SNIFF if (bt->value == 0) { sniff_out = 1; sys_auto_sniff_controle(MY_SNIFF_EN, bt->args); } else { sys_auto_sniff_controle(0, bt->args); } break; case BT_STATUS_LAST_CALL_TYPE_CHANGE: break; case BT_STATUS_CONN_A2DP_CH: case BT_STATUS_CONN_HFP_CH: if ((!is_1t2_connection()) && (get_current_poweron_memory_search_index(NULL))) { //回连下一个device if (get_esco_coder_busy_flag()) { clear_current_poweron_memory_search_index(0); } else { user_send_cmd_prepare(USER_CTRL_START_CONNECTION, 0, NULL); } } break; case BT_STATUS_PHONE_MANUFACTURER: break; case BT_STATUS_VOICE_RECOGNITION: break; case BT_STATUS_AVRCP_INCOME_OPID: xlog("BT_STATUS_AVRCP_INCOME_OPID:%d\n", bt->value); break; default: xlog(" BT STATUS DEFAULT\n"); break; } return 0; } static int event_handler(struct application *app, struct sys_event *event) { le_user_app_event_handler(event); if (SYS_EVENT_REMAP(event)) { g_printf("****SYS_EVENT_REMAP**** \n"); return 0; } switch (event->type) { case SYS_KEY_EVENT: break; case SYS_BT_EVENT: /* * 蓝牙事件处理 */ if ((u32)event->arg == SYS_BT_EVENT_TYPE_CON_STATUS) { printf("in event_handler:bt_connction_status_event_handler"); bt_connction_status_event_handler(&event->u.bt); } else if ((u32)event->arg == SYS_BT_EVENT_TYPE_HCI_STATUS) { bt_hci_event_handler(&event->u.bt); } break; case SYS_DEVICE_EVENT: /* * 系统设备事件处理 */ if ((u32)event->arg == DEVICE_EVENT_FROM_CHARGE) { } else if ((u32)event->arg == DEVICE_EVENT_FROM_POWER) { return app_power_event_handler(&event->u.dev); } #if TCFG_UMIDIGI_BOX_ENABLE else if ((u32)event->arg == DEVICE_EVENT_UMIDIGI_CHARGE_STORE) { app_umidigi_chargestore_event_handler(&event->u.umidigi_chargestore); } #endif #if TCFG_TEST_BOX_ENABLE else if ((u32)event->arg == DEVICE_EVENT_TEST_BOX) { app_testbox_event_handler(&event->u.testbox); } #endif break; default: return false; } SYS_EVENT_HANDLER_SPECIFIC(event); #ifdef CONFIG_BT_BACKGROUND_ENABLE if (app) { default_event_handler(event); } #endif return false; } /////////////////////////////////////////////////////////////////////////////////////////////////// static const struct application_operation app_handler_ops = { .state_machine = state_machine, .event_handler = event_handler, }; /* * 注册earphone模式 */ REGISTER_APPLICATION(app_handler) = { .name = "handler", .action = ACTION_EARPHONE_MAIN, .ops = &app_handler_ops, .state = APP_STA_DESTROY, };