11#include <furi.h>
22#include <furi_hal.h>
3- #include <furi_hal_bt_hid.h>
3+ #include <furi_hal_bt.h>
4+ #include <extra_profiles/hid_profile.h>
45#include <bt/bt_service/bt.h>
6+
57#include <gui/gui.h>
68#include <gui/view_dispatcher.h>
79#include <gui/modules/submenu.h>
1315
1416#define TAG "SensorModule"
1517
16- #define BLE_HID_KEYS_PATH "/ext/apps_data/hid_ble/ .bt_hid.keys"
18+ #define HID_BT_KEYS_STORAGE_NAME " .bt_hid.keys"
1719
1820typedef struct {
1921 Gui * gui ;
@@ -25,6 +27,7 @@ typedef struct {
2527 ICM42688P * icm42688p ;
2628 FuriHalUsbInterface * usb_mode_prev ;
2729 Bt * bt ;
30+ FuriHalBleProfileBase * ble_hid_profile ;
2831} AirMouseApp ;
2932
3033typedef enum {
@@ -39,19 +42,60 @@ enum StertSubmenuIndex {
3942 StartSubmenuIndexBleReset ,
4043};
4144
45+ static const BleProfileHidParams ble_hid_params = {
46+ .device_name_prefix = "AirMouse" ,
47+ .mac_xor = 0x0001 ,
48+ };
49+
50+ static bool usb_hid_mouse_move (void * inst , int8_t dx , int8_t dy ) {
51+ UNUSED (inst );
52+ return furi_hal_hid_mouse_move (dx , dy );
53+ }
54+
55+ static bool usb_hid_mouse_key_press (void * inst , uint8_t button ) {
56+ UNUSED (inst );
57+ return furi_hal_hid_mouse_press (button );
58+ }
59+
60+ static bool usb_hid_mouse_key_release (void * inst , uint8_t button ) {
61+ UNUSED (inst );
62+ return furi_hal_hid_mouse_release (button );
63+ }
64+
65+ static bool usb_hid_mouse_scroll (void * inst , int8_t value ) {
66+ UNUSED (inst );
67+ return furi_hal_hid_mouse_scroll (value );
68+ }
69+
4270static const ImuHidApi hid_api_usb = {
43- .mouse_move = furi_hal_hid_mouse_move ,
44- .mouse_key_press = furi_hal_hid_mouse_press ,
45- .mouse_key_release = furi_hal_hid_mouse_release ,
46- .mouse_scroll = furi_hal_hid_mouse_scroll ,
71+ .mouse_move = usb_hid_mouse_move ,
72+ .mouse_key_press = usb_hid_mouse_key_press ,
73+ .mouse_key_release = usb_hid_mouse_key_release ,
74+ .mouse_scroll = usb_hid_mouse_scroll ,
4775 .report_rate_max = 200 ,
4876};
4977
78+ static bool ble_hid_mouse_move (void * inst , int8_t dx , int8_t dy ) {
79+ return ble_profile_hid_mouse_move (inst , dx , dy );
80+ }
81+
82+ static bool ble_hid_mouse_key_press (void * inst , uint8_t button ) {
83+ return ble_profile_hid_mouse_press (inst , button );
84+ }
85+
86+ static bool ble_hid_mouse_key_release (void * inst , uint8_t button ) {
87+ return ble_profile_hid_mouse_release (inst , button );
88+ }
89+
90+ static bool ble_hid_mouse_scroll (void * inst , int8_t value ) {
91+ return ble_profile_hid_mouse_scroll (inst , value );
92+ }
93+
5094static const ImuHidApi hid_api_ble = {
51- .mouse_move = furi_hal_bt_hid_mouse_move ,
52- .mouse_key_press = furi_hal_bt_hid_mouse_press ,
53- .mouse_key_release = furi_hal_bt_hid_mouse_release ,
54- .mouse_scroll = furi_hal_bt_hid_mouse_scroll ,
95+ .mouse_move = ble_hid_mouse_move ,
96+ .mouse_key_press = ble_hid_mouse_key_press ,
97+ .mouse_key_release = ble_hid_mouse_key_release ,
98+ .mouse_scroll = ble_hid_mouse_scroll ,
5599 .report_rate_max = 30 ,
56100};
57101
@@ -62,14 +106,16 @@ static void ble_hid_remove_pairing(void) {
62106 // Wait 2nd core to update nvm storage
63107 furi_delay_ms (200 );
64108
65- bt_keys_storage_set_storage_path (bt , BLE_HID_KEYS_PATH );
109+ furi_hal_bt_stop_advertising ();
110+
111+ bt_keys_storage_set_storage_path (bt , APP_DATA_PATH (HID_BT_KEYS_STORAGE_NAME ));
66112 bt_forget_bonded_devices (bt );
67113
68114 // Wait 2nd core to update nvm storage
69115 furi_delay_ms (200 );
70116 bt_keys_storage_set_default_path (bt );
71117
72- furi_check (bt_set_profile (bt , BtProfileSerial ));
118+ furi_check (bt_profile_restore_default (bt ));
73119 furi_record_close (RECORD_BT );
74120}
75121
@@ -80,32 +126,36 @@ static void ble_hid_connection_status_callback(BtStatus status, void* context) {
80126 air_mouse_view_set_connected_status (app -> air_mouse_view , connected );
81127}
82128
83- static Bt * ble_hid_init (AirMouseApp * app ) {
84- Bt * bt = furi_record_open (RECORD_BT );
85- bt_disconnect (bt );
129+ static FuriHalBleProfileBase * ble_hid_init (AirMouseApp * app ) {
130+ app -> bt = furi_record_open (RECORD_BT );
131+ bt_disconnect (app -> bt );
86132
87133 // Wait 2nd core to update nvm storage
88134 furi_delay_ms (200 );
89135
90- bt_keys_storage_set_storage_path (bt , BLE_HID_KEYS_PATH );
136+ bt_keys_storage_set_storage_path (app -> bt , APP_DATA_PATH ( HID_BT_KEYS_STORAGE_NAME ) );
91137
92- furi_check (bt_set_profile (bt , BtProfileHidKeyboard ));
138+ FuriHalBleProfileBase * ble_hid_profile =
139+ bt_profile_start (app -> bt , ble_profile_hid , (void * )& ble_hid_params );
140+ furi_check (ble_hid_profile );
93141
94142 furi_hal_bt_start_advertising ();
95- bt_set_status_changed_callback (bt , ble_hid_connection_status_callback , app );
96- return bt ;
143+ bt_set_status_changed_callback (app -> bt , ble_hid_connection_status_callback , app );
144+
145+ return ble_hid_profile ;
97146}
98147
99- static void ble_hid_deinit (Bt * bt ) {
100- bt_set_status_changed_callback (bt , NULL , NULL );
101- bt_disconnect (bt );
148+ static void ble_hid_deinit (AirMouseApp * app ) {
149+ bt_set_status_changed_callback (app -> bt , NULL , NULL );
150+ bt_disconnect (app -> bt );
102151
103152 // Wait 2nd core to update nvm storage
104153 furi_delay_ms (200 );
105- bt_keys_storage_set_default_path (bt );
154+ bt_keys_storage_set_default_path (app -> bt );
106155
107- furi_check (bt_set_profile ( bt , BtProfileSerial ));
156+ furi_check (bt_profile_restore_default ( app -> bt ));
108157 furi_record_close (RECORD_BT );
158+ app -> bt = NULL ;
109159}
110160
111161static uint32_t air_mouse_exit (void * context ) {
@@ -123,8 +173,8 @@ static void air_mouse_hid_deinit(void* context) {
123173 AirMouseApp * app = context ;
124174
125175 if (app -> bt ) {
126- ble_hid_deinit (app -> bt );
127- app -> bt = NULL ;
176+ ble_hid_deinit (app );
177+ app -> ble_hid_profile = NULL ;
128178 } else if (app -> usb_mode_prev ) {
129179 furi_hal_usb_set_config (app -> usb_mode_prev , NULL );
130180 app -> usb_mode_prev = NULL ;
@@ -139,12 +189,12 @@ static void air_mouse_submenu_callback(void* context, uint32_t index) {
139189 furi_hal_usb_unlock ();
140190 furi_hal_usb_set_config (& usb_hid , NULL );
141191
142- air_mouse_view_set_hid_api (app -> air_mouse_view , & hid_api_usb , false);
192+ air_mouse_view_set_hid_api (app -> air_mouse_view , & hid_api_usb , NULL , false);
143193 view_dispatcher_switch_to_view (app -> view_dispatcher , AirMouseViewMain );
144194 } else if (index == StartSubmenuIndexBle ) {
145- app -> bt = ble_hid_init (app );
195+ app -> ble_hid_profile = ble_hid_init (app );
146196
147- air_mouse_view_set_hid_api (app -> air_mouse_view , & hid_api_ble , true);
197+ air_mouse_view_set_hid_api (app -> air_mouse_view , & hid_api_ble , app -> ble_hid_profile , true);
148198 view_dispatcher_switch_to_view (app -> view_dispatcher , AirMouseViewMain );
149199 } else if (index == StartSubmenuIndexBleReset ) {
150200 ble_hid_remove_pairing ();
0 commit comments