From bd55e5333764aee87e46a55d3066d7ae1ee8bf5e Mon Sep 17 00:00:00 2001 From: "Ben V. Brown" Date: Sun, 5 Feb 2023 18:27:13 +1100 Subject: [PATCH] Split out LED control + key handler --- apps/main/apps.cpp | 574 ++------------------------------ apps/main/apps.h | 35 +- apps/main/common_apps_imports.h | 111 ++++++ apps/main/gfps.cpp | 33 ++ apps/main/ibrt.cpp | 32 ++ apps/main/ibrt.h | 16 + apps/main/key_handler.cpp | 271 +++++++++++++++ apps/main/key_handler.h | 7 + apps/main/led_control.cpp | 40 +++ apps/main/led_control.h | 9 + apps/main/lhdc.cpp | 41 +++ 11 files changed, 609 insertions(+), 560 deletions(-) create mode 100644 apps/main/common_apps_imports.h create mode 100644 apps/main/gfps.cpp create mode 100644 apps/main/ibrt.cpp create mode 100644 apps/main/ibrt.h create mode 100644 apps/main/key_handler.cpp create mode 100644 apps/main/key_handler.h create mode 100644 apps/main/led_control.cpp create mode 100644 apps/main/led_control.h create mode 100644 apps/main/lhdc.cpp diff --git a/apps/main/apps.cpp b/apps/main/apps.cpp index fd0c0a2..39e25df 100644 --- a/apps/main/apps.cpp +++ b/apps/main/apps.cpp @@ -14,115 +14,42 @@ * ****************************************************************************/ #include "apps.h" -#include "a2dp_api.h" -#include "app_audio.h" -#include "app_battery.h" -#include "app_ble_include.h" -#include "app_bt.h" -#include "app_bt_func.h" -#include "app_bt_media_manager.h" -#include "app_key.h" -#include "app_overlay.h" -#include "app_pwl.h" -#include "app_status_ind.h" -#include "app_thread.h" -#include "app_utils.h" -#include "audioflinger.h" -#include "besbt.h" -#include "bt_drv_interface.h" -#include "bt_if.h" -#include "btapp.h" -#include "cmsis_os.h" -#include "crash_dump_section.h" -#include "factory_section.h" -#include "gapm_task.h" -#include "hal_bootmode.h" -#include "hal_i2c.h" -#include "hal_sleep.h" -#include "hal_timer.h" -#include "hal_trace.h" -#include "list.h" -#include "log_section.h" -#include "me_api.h" -#include "norflash_api.h" -#include "nvrecord.h" -#include "nvrecord_dev.h" -#include "nvrecord_env.h" -#include "os_api.h" -#include "pmu.h" -#include "stdio.h" -#include "string.h" -#include "tgt_hardware.h" -#ifdef __AI_VOICE__ -#include "ai_manager.h" -#include "app_ai_if.h" -#include "app_ai_manager_api.h" -#include "app_ai_tws.h" -#endif -#include "app_tws_ibrt_cmd_handler.h" -#include "audio_process.h" - -#ifdef __PC_CMD_UART__ -#include "app_cmd.h" -#endif - -#ifdef __FACTORY_MODE_SUPPORT__ -#include "app_factory.h" -#include "app_factory_bt.h" -#endif - -#ifdef __INTERCONNECTION__ -#include "app_ble_mode_switch.h" -#include "app_interconnection.h" -#include "app_interconnection_ble.h" -#include "app_interconnection_logic_protocol.h" -#endif - -#ifdef __INTERACTION__ -#include "app_interaction.h" -#endif - -#ifdef BISTO_ENABLED -#include "app_ai_manager_api.h" -#include "gsound_custom_actions.h" -#include "gsound_custom_ota.h" -#include "gsound_custom_reset.h" -#include "nvrecord_gsound.h" -#endif - -#ifdef IBRT_OTA -#include "ota_bes.h" -#endif - -#ifdef MEDIA_PLAYER_SUPPORT -#include "app_media_player.h" -#include "resources.h" -#endif - -#ifdef VOICE_DATAPATH -#include "app_voicepath.h" -#endif - -#ifdef BT_USB_AUDIO_DUAL_MODE -#include "btusb_audio.h" -#include "usbaudio_thread.h" -#endif - -#ifdef TILE_DATAPATH -#include "tile_target_ble.h" -#endif - -#if defined(IBRT) -#include "app_ibrt_customif_cmd.h" -#include "app_ibrt_customif_ui.h" -#include "app_ibrt_if.h" -#include "app_ibrt_ui_test.h" -#include "app_ibrt_voice_report.h" -#include "app_tws_if.h" -#endif - +#include "common_apps_imports.h" +#include "ibrt.h" +#include "key_handler.h" +#include "led_control.h" #ifdef GFPS_ENABLED #include "app_gfps.h" +#ifdef GFPS_ENABLED +static void app_tell_battery_info_handler(uint8_t *batteryValueCount, + uint8_t *batteryValue) { + GFPS_BATTERY_STATUS_E status; + if (app_battery_is_charging()) { + status = BATTERY_CHARGING; + } else { + status = BATTERY_NOT_CHARGING; + } + + // TODO: add the charger case's battery level +#ifdef IBRT + if (app_tws_ibrt_tws_link_connected()) { + *batteryValueCount = 2; + } else { + *batteryValueCount = 1; + } +#else + *batteryValueCount = 1; +#endif + + TRACE(2, "%s,*batteryValueCount is %d", __func__, *batteryValueCount); + if (1 == *batteryValueCount) { + batteryValue[0] = ((app_battery_current_level() + 1) * 10) | (status << 7); + } else { + batteryValue[0] = ((app_battery_current_level() + 1) * 10) | (status << 7); + batteryValue[1] = ((app_battery_current_level() + 1) * 10) | (status << 7); + } +} +#endif #endif #ifdef BTIF_BLE_APP_DATAPATH_SERVER @@ -1486,217 +1413,6 @@ void app_latency_switch_key_handler(void) { } } -/* - * handling of touch events when the devices are turned on - - * Both pods active: - - * Right Ear: - * Single tap : Play/Pause - * Double tap : Next track - * Hold : ANC on/off - * Triple tap : Volume Up - * - * Left Ear: - * Single tap : Play/Pause - * Double tap : Previous track - * Hold : ANC on/off - * Triple tap : Volume Down - - * Single pod active: - - * Single tap : Play/Pause - * Double tap : Next track - * Hold : Previous track - * Triple tap : Volume Up - * Quad tap : Volume Down - - - - * We use app_ibrt_if_start_user_action for handling actions, as this will apply - locally if we are link master - * OR send it over the link to the other bud if we are not -*/ - -void send_vol_up(void) { - uint8_t action[] = {IBRT_ACTION_LOCAL_VOLUP}; - app_ibrt_if_start_user_action(action, sizeof(action)); -} -void send_play_pause(void) { - if (app_bt_device.a2dp_play_pause_flag != 0) { - uint8_t action[] = {IBRT_ACTION_PAUSE}; - app_ibrt_if_start_user_action(action, sizeof(action)); - } else { - uint8_t action[] = {IBRT_ACTION_PLAY}; - app_ibrt_if_start_user_action(action, sizeof(action)); - } -} -void send_vol_down(void) { - uint8_t action[] = {IBRT_ACTION_LOCAL_VOLDN}; - app_ibrt_if_start_user_action(action, sizeof(action)); -} - -void send_next_track(void) { - uint8_t action[] = {IBRT_ACTION_FORWARD}; - app_ibrt_if_start_user_action(action, sizeof(action)); -} - -void send_prev_track(void) { - uint8_t action[] = {IBRT_ACTION_BACKWARD}; - app_ibrt_if_start_user_action(action, sizeof(action)); -} -void app_key_single_tap(APP_KEY_STATUS *status, void *param) { - TRACE(2, "%s event %d", __func__, status->event); - - if (!app_tws_ibrt_tws_link_connected()) { - // No other bud paired - TRACE(0, "Handling %s in single bud mode", __func__); - send_play_pause(); - } else { - // Bud's are working as a pair - if (app_tws_is_left_side()) { - TRACE(0, "Handling %s as left bud", __func__); - // Lefty - send_play_pause(); - } else { - TRACE(0, "Handling %s as right bud", __func__); - // Righty - send_play_pause(); - } - } -} -void app_key_double_tap(APP_KEY_STATUS *status, void *param) { - TRACE(2, "%s event %d", __func__, status->event); - - if (!app_tws_ibrt_tws_link_connected()) { - // No other bud paired - TRACE(0, "Handling %s in single bud mode", __func__); - send_next_track(); - } else { - // Bud's are working as a pair - if (app_tws_is_left_side()) { - TRACE(0, "Handling %s as left bud", __func__); - // Lefty - send_prev_track(); - } else { - TRACE(0, "Handling %s as right bud", __func__); - // Righty - send_next_track(); - } - } -} - -void app_key_triple_tap(APP_KEY_STATUS *status, void *param) { - TRACE(2, "%s event %d", __func__, status->event); - - if (!app_tws_ibrt_tws_link_connected()) { - // No other bud paired - TRACE(0, "Handling %s in single bud mode", __func__); - send_vol_up(); - } else { - // Bud's are working as a pair - if (app_tws_is_left_side()) { - TRACE(0, "Handling %s as left bud", __func__); - // Lefty - send_vol_down(); - } else { - TRACE(0, "Handling %s as right bud", __func__); - // Righty - send_vol_up(); - } - } -} -void app_key_quad_tap(APP_KEY_STATUS *status, void *param) { - TRACE(2, "%s event %d", __func__, status->event); - - if (!app_tws_ibrt_tws_link_connected()) { - // No other bud paired - TRACE(0, "Handling %s in single bud mode", __func__); - send_vol_down(); - } else { - // Bud's are working as a pair - if (app_tws_is_left_side()) { - TRACE(0, "Handling %s as left bud", __func__); - // Lefty - } else { - TRACE(0, "Handling %s as right bud", __func__); - // Righty - } - } -} - -void app_key_long_press_down(APP_KEY_STATUS *status, void *param) { - TRACE(2, "%s event %d", __func__, status->event); - - if (!app_tws_ibrt_tws_link_connected()) { - // No other bud paired - TRACE(0, "Handling %s in single bud mode", __func__); - send_prev_track(); - } else { - // Bud's are working as a pair - app_anc_key(status, param); - } -} - -void app_key_reboot(APP_KEY_STATUS *status, void *param) { - TRACE(1, "%s ", __func__); - hal_cmu_sys_reboot(); -} - -void app_key_init(void) { - uint8_t i = 0; - TRACE(1, "%s", __func__); - - const APP_KEY_HANDLE key_cfg[] = { - - {{APP_KEY_CODE_PWR, APP_KEY_EVENT_CLICK}, "", app_key_single_tap, NULL}, - {{APP_KEY_CODE_PWR, APP_KEY_EVENT_DOUBLECLICK}, - "", - app_key_double_tap, - NULL}, - {{APP_KEY_CODE_PWR, APP_KEY_EVENT_TRIPLECLICK}, - "", - app_key_triple_tap, - NULL}, - {{APP_KEY_CODE_PWR, APP_KEY_EVENT_ULTRACLICK}, - "", - app_key_quad_tap, - NULL}, - {{APP_KEY_CODE_PWR, APP_KEY_EVENT_LONGPRESS}, - "", - app_key_long_press_down, - NULL}, - }; - - app_key_handle_clear(); - for (i = 0; i < (sizeof(key_cfg) / sizeof(APP_KEY_HANDLE)); i++) { - app_key_handle_registration(&key_cfg[i]); - } -} - -void app_key_init_on_charging(void) { - uint8_t i = 0; - const APP_KEY_HANDLE key_cfg[] = { - {{APP_KEY_CODE_PWR, APP_KEY_EVENT_LONGLONGPRESS}, - "long press reboot", - app_key_reboot, - NULL}, - // {{APP_KEY_CODE_PWR,APP_KEY_EVENT_CLICK},"bt function - // key",app_dfu_key_handler, NULL}, -#ifdef __USB_COMM__ - {{APP_KEY_CODE_PWR, APP_KEY_EVENT_LONGPRESS}, - "usb cdc key", - app_usb_cdc_comm_key_handler, - NULL}, -#endif - }; - - TRACE(1, "%s", __func__); - for (i = 0; i < (sizeof(key_cfg) / sizeof(APP_KEY_HANDLE)); i++) { - app_key_handle_registration(&key_cfg[i]); - } -} - void stopAuto_Shutdowm_Timer(void); bool MobileLinkLose_reboot = false; @@ -1987,36 +1703,6 @@ void stoponce_delay_event_Timer_(void) { /********************************once_delay_event_Timer__timer*******************************************************/ /***********************************************************************************************/ -#include "hal_gpio.h" -#include "tgt_hardware.h" -extern struct BT_DEVICE_T app_bt_device; -extern void hal_gpio_pin_set(enum HAL_GPIO_PIN_T pin); - -bool Curr_Is_Master(void) { - static ibrt_ctrl_t *p_ibrt_ctrl = app_tws_ibrt_get_bt_ctrl_ctx(); - if (p_ibrt_ctrl->current_role == IBRT_MASTER) - return 1; - else - return 0; -} - -bool Curr_Is_Slave(void) { - static ibrt_ctrl_t *p_ibrt_ctrl = app_tws_ibrt_get_bt_ctrl_ctx(); - if (p_ibrt_ctrl->current_role == IBRT_SLAVE) - return 1; - else - return 0; -} - -uint8_t get_curr_role(void) { - static ibrt_ctrl_t *p_ibrt_ctrl = app_tws_ibrt_get_bt_ctrl_ctx(); - return p_ibrt_ctrl->current_role; -} - -uint8_t get_nv_role(void) { - static ibrt_ctrl_t *p_ibrt_ctrl = app_tws_ibrt_get_bt_ctrl_ctx(); - return p_ibrt_ctrl->nv_role; -} extern bt_status_t LinkDisconnectDirectly(bool PowerOffFlag); void a2dp_suspend_music_force(void); @@ -2103,34 +1789,6 @@ int app_deinit(int deinit_case) { return nRet; } -#ifdef APP_TEST_MODE -extern void app_test_init(void); -int app_init(void) { - int nRet = 0; - // uint8_t pwron_case = APP_POWERON_CASE_INVALID; - TRACE(1, "%s", __func__); - app_poweroff_flag = 0; - - app_sysfreq_req(APP_SYSFREQ_USER_APP_INIT, APP_SYSFREQ_52M); - list_init(); - af_open(); - app_os_init(); - app_pwl_open(); - app_audio_open(); - app_audio_manager_open(); - app_overlay_open(); - if (app_key_open(true)) { - nRet = -1; - goto exit; - } - - app_test_init(); -exit: - app_sysfreq_req(APP_SYSFREQ_USER_APP_INIT, APP_SYSFREQ_32K); - return nRet; -} -#else /* !defined(APP_TEST_MODE) */ - int app_bt_connect2tester_init(void) { btif_device_record_t rec; bt_bdaddr_t tester_addr; @@ -2273,130 +1931,6 @@ void app_ibrt_init(void) { #endif } -#ifdef GFPS_ENABLED -static void app_tell_battery_info_handler(uint8_t *batteryValueCount, - uint8_t *batteryValue) { - GFPS_BATTERY_STATUS_E status; - if (app_battery_is_charging()) { - status = BATTERY_CHARGING; - } else { - status = BATTERY_NOT_CHARGING; - } - - // TODO: add the charger case's battery level -#ifdef IBRT - if (app_tws_ibrt_tws_link_connected()) { - *batteryValueCount = 2; - } else { - *batteryValueCount = 1; - } -#else - *batteryValueCount = 1; -#endif - - TRACE(2, "%s,*batteryValueCount is %d", __func__, *batteryValueCount); - if (1 == *batteryValueCount) { - batteryValue[0] = ((app_battery_current_level() + 1) * 10) | (status << 7); - } else { - batteryValue[0] = ((app_battery_current_level() + 1) * 10) | (status << 7); - batteryValue[1] = ((app_battery_current_level() + 1) * 10) | (status << 7); - } -} -#endif -/* -#define regaddr0 0x40 -#define regaddr1 0x41 -#define regaddr2 0x42 -#define regaddr3 0x43 - -#define regaddr4 0xc8 - -#define decice_firstreg 0x00 -*/ -void touch_evt_handler(enum HAL_GPIO_PIN_T pin) { - TRACE(3, "SCL_TOUCH !!!!"); - - /* - unsigned char keyEventBUff0 ; - unsigned char keyEventBUff1 ; - unsigned char keyEventBUff2 ; - unsigned char keyEventBUff3 ; - unsigned char temp = 0; - //hal_gpio_i2c_simple_recv((unsigned char)0x60, 0x40, 1,&keyEventBUff,4); - I2C_ReadByte(regaddr0,&keyEventBUff0); - I2C_ReadByte(regaddr1,&keyEventBUff1); - I2C_ReadByte(regaddr2,&keyEventBUff2); - I2C_ReadByte(regaddr3,&keyEventBUff3); - unsigned char firstaddr; - - I2C_ReadByte(decice_firstreg,&firstaddr); - TRACE(3,"0X00 REG = 0x%x",firstaddr); - unsigned char keyEventBUff4byte[4] ; - I2C_Read4Byte(regaddr0,keyEventBUff4byte); - - I2C_ReadByte(0xC8,&temp); - temp |= 0x01; - I2C_WriteByte(0xC8,temp); - TRACE(3,"REG0X40 = 0x%x, REG0X41 = 0x%x, REG0X42 = 0x%x, REG0X43 = - 0x%x",keyEventBUff0,keyEventBUff1,keyEventBUff2,keyEventBUff3); - TRACE(3,"keyEventBUff4BYTE :"); - DUMP8("0x%02x ",keyEventBUff4byte,4); - - uint8_t keyEventBUff0[4]; - uint8_t keyEventBUff4[1]; - - touch_key_i2c_read(regaddr0,&keyEventBUff0[0],1); - touch_key_i2c_read(regaddr1,&keyEventBUff0[1],1); - touch_key_i2c_read(regaddr2,&keyEventBUff0[2],1); - touch_key_i2c_read(regaddr3,&keyEventBUff0[3],1); - touch_key_i2c_read(regaddr4,keyEventBUff4,1); - TRACE(3,"keyEventBUff0 :"); - DUMP8("0x%02x ",keyEventBUff0,4); - TRACE(3,"keyEventBUff1 :"); - DUMP8("0x%02x ",keyEventBUff4,1); - keyEventBUff4[0] |= 0x1; - touch_key_i2c_write(0,regaddr4,1,keyEventBUff4); - */ -} - -/******************************LED_status_timer*********************************************************/ -osTimerId LED_statusid = NULL; -void startLED_status(int ms); -void stopLED_status(void); -static void LED_statusfun(const void *); -osTimerDef(defLED_status, LED_statusfun); -void LED_statusinit(void) { - LED_statusid = osTimerCreate(osTimer(defLED_status), osTimerOnce, (void *)0); -} -static void LED_statusfun(const void *) { - // TRACE("\n\n!!!!!!enter %s\n\n",__func__); - if ((Curr_Is_Slave() || app_device_bt_is_connected()) && - (!app_battery_is_charging())) { - app_status_indication_set(APP_STATUS_INDICATION_CONNECTED); - } else if (!app_device_bt_is_connected() && (!app_battery_is_charging())) { - app_status_indication_set(APP_STATUS_INDICATION_BOTHSCAN); - } else if (app_battery_is_charging()) { - app_status_indication_set(APP_STATUS_INDICATION_CHARGING); - } - // unsigned char firstaddr; - // I2C_ReadByte(decice_firstreg,&firstaddr); - // TRACE(3,"0X00 REG = 0x%x",firstaddr); - startLED_status(1000); -} - -void startLED_status(int ms) { - // TRACE("\n\n !!!!!!!!!!start %s\n\n",__func__); - osTimerStart(LED_statusid, ms); -} -void stopLED_status(void) { - // TRACE("\n\n!!!!!!!!!! stop %s\n\n",__func__); - osTimerStop(LED_statusid); -} - -/********************************LED_status_timer*******************************************************/ - -/********************************TOUCH_INT_TEST_timer*******************************************************/ - void user_io_timer_init(void) { // app_mute_ctrl_init(); LED_statusinit(); @@ -2418,44 +1952,6 @@ extern uint32_t __aud_start[]; extern uint32_t __userdata_start[]; extern uint32_t __factory_start[]; -#if defined(A2DP_LHDC_ON) -extern "C" { -typedef struct bes_bt_local_info_t { - uint8_t bt_addr[BTIF_BD_ADDR_SIZE]; - const char *bt_name; - uint8_t bt_len; - uint8_t ble_addr[BTIF_BD_ADDR_SIZE]; - const char *ble_name; - uint8_t ble_len; -} bes_bt_local_info; - -typedef int (*LHDC_GET_BT_INFO)(bes_bt_local_info *bt_info); -extern bool lhdcSetLicenseKeyTable(uint8_t *licTable, LHDC_GET_BT_INFO pFunc); -} -extern int bes_bt_local_info_get(bes_bt_local_info *local_info); - -void lhdc_license_check() { - uint8_t lhdc_license_key = 0; - uint8_t *lhdc_license_data = (uint8_t *)__lhdc_license_start + 0x98; - TRACE(5, "lhdc_license_data:%p, lhdc license %02x %02x %02x %02x", - lhdc_license_data, lhdc_license_data[0], lhdc_license_data[1], - lhdc_license_data[2], lhdc_license_data[3]); - - app_overlay_select(APP_OVERLAY_A2DP_LHDC); - TRACE(1, "current_overlay = %d", app_get_current_overlay()); - - lhdc_license_key = - lhdcSetLicenseKeyTable(lhdc_license_data, bes_bt_local_info_get); - TRACE(0, "lhdc_license_key:%d", lhdc_license_key); - - if (lhdc_license_key) { - TRACE(0, "LHDC OK"); - } else { - TRACE(0, "LHDC ERROR"); - } -} -#endif - int app_init(void) { int nRet = 0; struct nvrecord_env_t *nvrecord_env; @@ -3020,5 +2516,3 @@ exit: return nRet; } - -#endif /* APP_TEST_MODE */ diff --git a/apps/main/apps.h b/apps/main/apps.h index 96d3b27..c3765f0 100644 --- a/apps/main/apps.h +++ b/apps/main/apps.h @@ -18,7 +18,7 @@ #include "app_status_ind.h" -#define STACK_READY_BT 0x01 +#define STACK_READY_BT 0x01 #define STACK_READY_BLE 0x02 #ifdef __cplusplus @@ -37,20 +37,20 @@ int app_reset(void); int app_status_battery_report(uint8_t level); -int app_voice_report( APP_STATUS_INDICATION_T status,uint8_t device_id); -int app_voice_report_generic(APP_STATUS_INDICATION_T status, uint8_t device_id, uint8_t isMerging); +int app_voice_report(APP_STATUS_INDICATION_T status, uint8_t device_id); +int app_voice_report_generic(APP_STATUS_INDICATION_T status, uint8_t device_id, + uint8_t isMerging); int app_voice_stop(APP_STATUS_INDICATION_T status, uint8_t device_id); - /*FixME*/ -void app_status_set_num(const char* p); +void app_status_set_num(const char *p); ////////////10 second tiemr/////////////// -#define APP_FAST_PAIRING_TIMEOUT_IN_SECOND 120 +#define APP_FAST_PAIRING_TIMEOUT_IN_SECOND 120 -#define APP_PAIR_TIMER_ID 0 -#define APP_POWEROFF_TIMER_ID 1 -#define APP_FASTPAIR_LASTING_TIMER_ID 2 +#define APP_PAIR_TIMER_ID 0 +#define APP_POWEROFF_TIMER_ID 1 +#define APP_FASTPAIR_LASTING_TIMER_ID 2 void app_stop_10_second_timer(uint8_t timer_id); void app_start_10_second_timer(uint8_t timer_id); @@ -61,33 +61,28 @@ void app_start_postponed_reset(void); bool app_is_power_off_in_progress(void); -#define CHIP_ID_C 1 -#define CHIP_ID_D 2 +#define CHIP_ID_C 1 +#define CHIP_ID_D 2 void app_disconnect_all_bt_connections(void); bool app_is_stack_ready(void); extern uint8_t latency_mode_is_open; -bool Curr_Is_Master(void); -bool Curr_Is_Slave(void); -extern uint8_t get_nv_role(void); -extern uint8_t get_curr_role(void); -extern uint8_t app_poweroff_flag; +extern uint8_t app_poweroff_flag; extern bool MobileLinkLose_reboot; extern bool factory_mode_status; -extern uint8_t app_poweroff_flag; +extern uint8_t app_poweroff_flag; extern bool MobileLinkLose_reboot; extern void startclr_info_timer(int ms); extern void app_enterpairing_timer_start(void); extern void app_enterpairing_timer_stop(void); -extern void startdelay_report_tone(int ms,APP_STATUS_INDICATION_T status); +extern void startdelay_report_tone(int ms, APP_STATUS_INDICATION_T status); extern void box_cmd_app_bt_enter_mono_pairing_mode(void); extern int app_nvrecord_rebuild(void); extern void app_bt_power_off_customize(); //////////////////// - #ifdef __cplusplus } #endif -#endif//__FMDEC_H__ +#endif //__FMDEC_H__ diff --git a/apps/main/common_apps_imports.h b/apps/main/common_apps_imports.h new file mode 100644 index 0000000..51925c6 --- /dev/null +++ b/apps/main/common_apps_imports.h @@ -0,0 +1,111 @@ +#ifndef COMMON_APP_IMPORTS +#define COMMON_APP_IMPORTS + +#include "a2dp_api.h" +#include "app_audio.h" +#include "app_battery.h" +#include "app_ble_include.h" +#include "app_bt.h" +#include "app_bt_func.h" +#include "app_bt_media_manager.h" +#include "app_key.h" +#include "app_overlay.h" +#include "app_pwl.h" +#include "app_status_ind.h" +#include "app_thread.h" +#include "app_utils.h" +#include "audioflinger.h" +#include "besbt.h" +#include "bt_drv_interface.h" +#include "bt_if.h" +#include "btapp.h" +#include "cmsis_os.h" +#include "crash_dump_section.h" +#include "factory_section.h" +#include "gapm_task.h" +#include "hal_bootmode.h" +#include "hal_i2c.h" +#include "hal_sleep.h" +#include "hal_timer.h" +#include "hal_trace.h" +#include "list.h" +#include "log_section.h" +#include "me_api.h" +#include "norflash_api.h" +#include "nvrecord.h" +#include "nvrecord_dev.h" +#include "nvrecord_env.h" +#include "os_api.h" +#include "pmu.h" +#include "stdio.h" +#include "string.h" +#include "tgt_hardware.h" +#ifdef __AI_VOICE__ +#include "ai_manager.h" +#include "app_ai_if.h" +#include "app_ai_manager_api.h" +#include "app_ai_tws.h" +#endif +#include "app_tws_ibrt_cmd_handler.h" +#include "audio_process.h" + +#ifdef __PC_CMD_UART__ +#include "app_cmd.h" +#endif + +#ifdef __FACTORY_MODE_SUPPORT__ +#include "app_factory.h" +#include "app_factory_bt.h" +#endif + +#ifdef __INTERCONNECTION__ +#include "app_ble_mode_switch.h" +#include "app_interconnection.h" +#include "app_interconnection_ble.h" +#include "app_interconnection_logic_protocol.h" +#endif + +#ifdef __INTERACTION__ +#include "app_interaction.h" +#endif + +#ifdef BISTO_ENABLED +#include "app_ai_manager_api.h" +#include "gsound_custom_actions.h" +#include "gsound_custom_ota.h" +#include "gsound_custom_reset.h" +#include "nvrecord_gsound.h" +#endif + +#ifdef IBRT_OTA +#include "ota_bes.h" +#endif + +#ifdef MEDIA_PLAYER_SUPPORT +#include "app_media_player.h" +#include "resources.h" +#endif + +#ifdef VOICE_DATAPATH +#include "app_voicepath.h" +#endif + +#ifdef BT_USB_AUDIO_DUAL_MODE +#include "btusb_audio.h" +#include "usbaudio_thread.h" +#endif + +#ifdef TILE_DATAPATH +#include "tile_target_ble.h" +#endif + +#if defined(IBRT) +#include "app_ibrt_customif_cmd.h" +#include "app_ibrt_customif_ui.h" +#include "app_ibrt_if.h" +#include "app_ibrt_ui_test.h" +#include "app_ibrt_voice_report.h" +#include "app_tws_if.h" +#endif + +#endif \ No newline at end of file diff --git a/apps/main/gfps.cpp b/apps/main/gfps.cpp new file mode 100644 index 0000000..c88990c --- /dev/null +++ b/apps/main/gfps.cpp @@ -0,0 +1,33 @@ + +// Google Fast pairing Service + +#ifdef GFPS_ENABLED +static void app_tell_battery_info_handler(uint8_t *batteryValueCount, + uint8_t *batteryValue) { + GFPS_BATTERY_STATUS_E status; + if (app_battery_is_charging()) { + status = BATTERY_CHARGING; + } else { + status = BATTERY_NOT_CHARGING; + } + + // TODO: add the charger case's battery level +#ifdef IBRT + if (app_tws_ibrt_tws_link_connected()) { + *batteryValueCount = 2; + } else { + *batteryValueCount = 1; + } +#else + *batteryValueCount = 1; +#endif + + TRACE(2, "%s,*batteryValueCount is %d", __func__, *batteryValueCount); + if (1 == *batteryValueCount) { + batteryValue[0] = ((app_battery_current_level() + 1) * 10) | (status << 7); + } else { + batteryValue[0] = ((app_battery_current_level() + 1) * 10) | (status << 7); + batteryValue[1] = ((app_battery_current_level() + 1) * 10) | (status << 7); + } +} +#endif \ No newline at end of file diff --git a/apps/main/ibrt.cpp b/apps/main/ibrt.cpp new file mode 100644 index 0000000..c6e9753 --- /dev/null +++ b/apps/main/ibrt.cpp @@ -0,0 +1,32 @@ +#include "ibrt.h" +#include "common_apps_imports.h" +#include "hal_gpio.h" +#include "tgt_hardware.h" +extern struct BT_DEVICE_T app_bt_device; +extern void hal_gpio_pin_set(enum HAL_GPIO_PIN_T pin); + +bool Curr_Is_Master(void) { + static ibrt_ctrl_t *p_ibrt_ctrl = app_tws_ibrt_get_bt_ctrl_ctx(); + if (p_ibrt_ctrl->current_role == IBRT_MASTER) + return 1; + else + return 0; +} + +bool Curr_Is_Slave(void) { + static ibrt_ctrl_t *p_ibrt_ctrl = app_tws_ibrt_get_bt_ctrl_ctx(); + if (p_ibrt_ctrl->current_role == IBRT_SLAVE) + return 1; + else + return 0; +} + +uint8_t get_curr_role(void) { + static ibrt_ctrl_t *p_ibrt_ctrl = app_tws_ibrt_get_bt_ctrl_ctx(); + return p_ibrt_ctrl->current_role; +} + +uint8_t get_nv_role(void) { + static ibrt_ctrl_t *p_ibrt_ctrl = app_tws_ibrt_get_bt_ctrl_ctx(); + return p_ibrt_ctrl->nv_role; +} diff --git a/apps/main/ibrt.h b/apps/main/ibrt.h new file mode 100644 index 0000000..a3183a0 --- /dev/null +++ b/apps/main/ibrt.h @@ -0,0 +1,16 @@ +#ifndef IBRT_H_ +#define IBRT_H_ +#include + +#ifdef __cplusplus +extern "C" { +#endif +bool Curr_Is_Master(void); +uint8_t get_curr_role(void); +bool Curr_Is_Slave(void); +uint8_t get_nv_role(void); + +#ifdef __cplusplus +}; +#endif +#endif \ No newline at end of file diff --git a/apps/main/key_handler.cpp b/apps/main/key_handler.cpp new file mode 100644 index 0000000..6a596c4 --- /dev/null +++ b/apps/main/key_handler.cpp @@ -0,0 +1,271 @@ +#include "a2dp_api.h" +#include "app_audio.h" +#include "app_battery.h" +#include "app_ble_include.h" +#include "app_bt.h" +#include "app_bt_func.h" +#include "app_bt_media_manager.h" +#include "app_key.h" +#include "app_overlay.h" +#include "app_pwl.h" +#include "app_status_ind.h" +#include "app_thread.h" +#include "app_tws_ibrt_cmd_handler.h" +#include "app_utils.h" +#include "apps.h" +#include "audio_process.h" +#include "audioflinger.h" +#include "besbt.h" +#include "bt_drv_interface.h" +#include "bt_if.h" +#include "btapp.h" +#include "cmsis_os.h" +#include "crash_dump_section.h" +#include "factory_section.h" +#include "gapm_task.h" +#include "hal_bootmode.h" +#include "hal_i2c.h" +#include "hal_sleep.h" +#include "hal_timer.h" +#include "hal_trace.h" +#include "list.h" +#include "log_section.h" +#include "me_api.h" +#include "norflash_api.h" +#include "nvrecord.h" +#include "nvrecord_dev.h" +#include "nvrecord_env.h" +#include "os_api.h" +#include "pmu.h" +#include "stdio.h" +#include "string.h" +#include "tgt_hardware.h" + +#ifdef __INTERCONNECTION__ +#include "app_ble_mode_switch.h" +#include "app_interconnection.h" +#include "app_interconnection_ble.h" +#include "app_interconnection_logic_protocol.h" +#endif + +#include "app_ibrt_customif_cmd.h" +#include "app_ibrt_customif_ui.h" +#include "app_ibrt_if.h" +#include "app_ibrt_ui_test.h" +#include "app_ibrt_voice_report.h" +#include "app_tws_if.h" + +#include "app_anc.h" + +extern struct BT_DEVICE_T app_bt_device; + +/* + * handling of touch events when the devices are turned on + + * Both pods active: + + * Right Ear: + * Single tap : Play/Pause + * Double tap : Next track + * Hold : ANC on/off + * Triple tap : Volume Up + * + * Left Ear: + * Single tap : Play/Pause + * Double tap : Previous track + * Hold : ANC on/off + * Triple tap : Volume Down + + * Single pod active: + + * Single tap : Play/Pause + * Double tap : Next track + * Hold : Previous track + * Triple tap : Volume Up + * Quad tap : Volume Down + + + + * We use app_ibrt_if_start_user_action for handling actions, as this will apply + locally if we are link master + * OR send it over the link to the other bud if we are not +*/ + +void send_vol_up(void) { + uint8_t action[] = {IBRT_ACTION_LOCAL_VOLUP}; + app_ibrt_if_start_user_action(action, sizeof(action)); +} +void send_play_pause(void) { + if (app_bt_device.a2dp_play_pause_flag != 0) { + uint8_t action[] = {IBRT_ACTION_PAUSE}; + app_ibrt_if_start_user_action(action, sizeof(action)); + } else { + uint8_t action[] = {IBRT_ACTION_PLAY}; + app_ibrt_if_start_user_action(action, sizeof(action)); + } +} +void send_vol_down(void) { + uint8_t action[] = {IBRT_ACTION_LOCAL_VOLDN}; + app_ibrt_if_start_user_action(action, sizeof(action)); +} + +void send_next_track(void) { + uint8_t action[] = {IBRT_ACTION_FORWARD}; + app_ibrt_if_start_user_action(action, sizeof(action)); +} + +void send_prev_track(void) { + uint8_t action[] = {IBRT_ACTION_BACKWARD}; + app_ibrt_if_start_user_action(action, sizeof(action)); +} +void app_key_single_tap(APP_KEY_STATUS *status, void *param) { + TRACE(2, "%s event %d", __func__, status->event); + + if (!app_tws_ibrt_tws_link_connected()) { + // No other bud paired + TRACE(0, "Handling %s in single bud mode", __func__); + send_play_pause(); + } else { + // Bud's are working as a pair + if (app_tws_is_left_side()) { + TRACE(0, "Handling %s as left bud", __func__); + // Lefty + send_play_pause(); + } else { + TRACE(0, "Handling %s as right bud", __func__); + // Righty + send_play_pause(); + } + } +} +void app_key_double_tap(APP_KEY_STATUS *status, void *param) { + TRACE(2, "%s event %d", __func__, status->event); + + if (!app_tws_ibrt_tws_link_connected()) { + // No other bud paired + TRACE(0, "Handling %s in single bud mode", __func__); + send_next_track(); + } else { + // Bud's are working as a pair + if (app_tws_is_left_side()) { + TRACE(0, "Handling %s as left bud", __func__); + // Lefty + send_prev_track(); + } else { + TRACE(0, "Handling %s as right bud", __func__); + // Righty + send_next_track(); + } + } +} + +void app_key_triple_tap(APP_KEY_STATUS *status, void *param) { + TRACE(2, "%s event %d", __func__, status->event); + + if (!app_tws_ibrt_tws_link_connected()) { + // No other bud paired + TRACE(0, "Handling %s in single bud mode", __func__); + send_vol_up(); + } else { + // Bud's are working as a pair + if (app_tws_is_left_side()) { + TRACE(0, "Handling %s as left bud", __func__); + // Lefty + send_vol_down(); + } else { + TRACE(0, "Handling %s as right bud", __func__); + // Righty + send_vol_up(); + } + } +} +void app_key_quad_tap(APP_KEY_STATUS *status, void *param) { + TRACE(2, "%s event %d", __func__, status->event); + + if (!app_tws_ibrt_tws_link_connected()) { + // No other bud paired + TRACE(0, "Handling %s in single bud mode", __func__); + send_vol_down(); + } else { + // Bud's are working as a pair + if (app_tws_is_left_side()) { + TRACE(0, "Handling %s as left bud", __func__); + // Lefty + } else { + TRACE(0, "Handling %s as right bud", __func__); + // Righty + } + } +} + +void app_key_long_press_down(APP_KEY_STATUS *status, void *param) { + TRACE(2, "%s event %d", __func__, status->event); + + if (!app_tws_ibrt_tws_link_connected()) { + // No other bud paired + TRACE(0, "Handling %s in single bud mode", __func__); + send_prev_track(); + } else { + // Bud's are working as a pair + app_anc_key(status, param); + } +} + +void app_key_reboot(APP_KEY_STATUS *status, void *param) { + TRACE(1, "%s ", __func__); + hal_cmu_sys_reboot(); +} + +void app_key_init(void) { + uint8_t i = 0; + TRACE(1, "%s", __func__); + + const APP_KEY_HANDLE key_cfg[] = { + + {{APP_KEY_CODE_PWR, APP_KEY_EVENT_CLICK}, "", app_key_single_tap, NULL}, + {{APP_KEY_CODE_PWR, APP_KEY_EVENT_DOUBLECLICK}, + "", + app_key_double_tap, + NULL}, + {{APP_KEY_CODE_PWR, APP_KEY_EVENT_TRIPLECLICK}, + "", + app_key_triple_tap, + NULL}, + {{APP_KEY_CODE_PWR, APP_KEY_EVENT_ULTRACLICK}, + "", + app_key_quad_tap, + NULL}, + {{APP_KEY_CODE_PWR, APP_KEY_EVENT_LONGPRESS}, + "", + app_key_long_press_down, + NULL}, + }; + + app_key_handle_clear(); + for (i = 0; i < (sizeof(key_cfg) / sizeof(APP_KEY_HANDLE)); i++) { + app_key_handle_registration(&key_cfg[i]); + } +} + +void app_key_init_on_charging(void) { + uint8_t i = 0; + const APP_KEY_HANDLE key_cfg[] = { + {{APP_KEY_CODE_PWR, APP_KEY_EVENT_LONGLONGPRESS}, + "long press reboot", + app_key_reboot, + NULL}, + // {{APP_KEY_CODE_PWR,APP_KEY_EVENT_CLICK},"bt function + // key",app_dfu_key_handler, NULL}, +#ifdef __USB_COMM__ + {{APP_KEY_CODE_PWR, APP_KEY_EVENT_LONGPRESS}, + "usb cdc key", + app_usb_cdc_comm_key_handler, + NULL}, +#endif + }; + + TRACE(1, "%s", __func__); + for (i = 0; i < (sizeof(key_cfg) / sizeof(APP_KEY_HANDLE)); i++) { + app_key_handle_registration(&key_cfg[i]); + } +} \ No newline at end of file diff --git a/apps/main/key_handler.h b/apps/main/key_handler.h new file mode 100644 index 0000000..7618ab8 --- /dev/null +++ b/apps/main/key_handler.h @@ -0,0 +1,7 @@ +#ifndef KEY_HANDLER_H_ +#define KEY_HANDLER_H_ + +void app_key_init(void); + +void app_key_init_on_charging(void); +#endif \ No newline at end of file diff --git a/apps/main/led_control.cpp b/apps/main/led_control.cpp new file mode 100644 index 0000000..2c8b2ff --- /dev/null +++ b/apps/main/led_control.cpp @@ -0,0 +1,40 @@ + +#include "led_control.h" +#include "common_apps_imports.h" +#include "ibrt.h" + +/******************************LED_status_timer*********************************************************/ +osTimerId LED_statusid = NULL; + +osTimerDef(defLED_status, LED_statusfun); + +void LED_statusinit(void) { + LED_statusid = osTimerCreate(osTimer(defLED_status), osTimerOnce, (void *)0); +} + +void LED_statusfun(const void *) { + // TRACE("\n\n!!!!!!enter %s\n\n",__func__); + if ((Curr_Is_Slave() || app_device_bt_is_connected()) && + (!app_battery_is_charging())) { + app_status_indication_set(APP_STATUS_INDICATION_CONNECTED); + } else if (!app_device_bt_is_connected() && (!app_battery_is_charging())) { + app_status_indication_set(APP_STATUS_INDICATION_BOTHSCAN); + } else if (app_battery_is_charging()) { + app_status_indication_set(APP_STATUS_INDICATION_CHARGING); + } + // unsigned char firstaddr; + // I2C_ReadByte(decice_firstreg,&firstaddr); + // TRACE(3,"0X00 REG = 0x%x",firstaddr); + startLED_status(1000); +} + +void startLED_status(int ms) { + // TRACE("\n\n !!!!!!!!!!start %s\n\n",__func__); + osTimerStart(LED_statusid, ms); +} +void stopLED_status(void) { + // TRACE("\n\n!!!!!!!!!! stop %s\n\n",__func__); + osTimerStop(LED_statusid); +} + +/********************************LED_status_timer*******************************************************/ diff --git a/apps/main/led_control.h b/apps/main/led_control.h new file mode 100644 index 0000000..c9ede3d --- /dev/null +++ b/apps/main/led_control.h @@ -0,0 +1,9 @@ +#ifndef LED_CONTROL_H_ +#define LED_CONTROL_H_ + +void LED_statusinit(void); +void startLED_status(int ms); +void stopLED_status(void); +void LED_statusfun(const void *); + +#endif \ No newline at end of file diff --git a/apps/main/lhdc.cpp b/apps/main/lhdc.cpp new file mode 100644 index 0000000..4c246ad --- /dev/null +++ b/apps/main/lhdc.cpp @@ -0,0 +1,41 @@ +// LHDC needs a licence key +// We dont have one; so probably cant ever officially use this. But its here for +// preservation at the least + +#if defined(A2DP_LHDC_ON) +extern "C" { +typedef struct bes_bt_local_info_t { + uint8_t bt_addr[BTIF_BD_ADDR_SIZE]; + const char *bt_name; + uint8_t bt_len; + uint8_t ble_addr[BTIF_BD_ADDR_SIZE]; + const char *ble_name; + uint8_t ble_len; +} bes_bt_local_info; + +typedef int (*LHDC_GET_BT_INFO)(bes_bt_local_info *bt_info); +extern bool lhdcSetLicenseKeyTable(uint8_t *licTable, LHDC_GET_BT_INFO pFunc); +} +extern int bes_bt_local_info_get(bes_bt_local_info *local_info); + +void lhdc_license_check() { + uint8_t lhdc_license_key = 0; + uint8_t *lhdc_license_data = (uint8_t *)__lhdc_license_start + 0x98; + TRACE(5, "lhdc_license_data:%p, lhdc license %02x %02x %02x %02x", + lhdc_license_data, lhdc_license_data[0], lhdc_license_data[1], + lhdc_license_data[2], lhdc_license_data[3]); + + app_overlay_select(APP_OVERLAY_A2DP_LHDC); + TRACE(1, "current_overlay = %d", app_get_current_overlay()); + + lhdc_license_key = + lhdcSetLicenseKeyTable(lhdc_license_data, bes_bt_local_info_get); + TRACE(0, "lhdc_license_key:%d", lhdc_license_key); + + if (lhdc_license_key) { + TRACE(0, "LHDC OK"); + } else { + TRACE(0, "LHDC ERROR"); + } +} +#endif