@@ -77,8 +77,7 @@ use esp_idf_hal::i2c;
77
77
use esp_idf_hal:: prelude:: * ;
78
78
use esp_idf_hal:: spi;
79
79
80
- use esp_idf_sys:: { self , c_types} ;
81
- use esp_idf_sys:: { esp, EspError } ;
80
+ use esp_idf_sys:: { self , c_types, esp, esp_nofail, EspError } ;
82
81
83
82
use display_interface_spi:: SPIInterfaceNoCS ;
84
83
@@ -264,6 +263,9 @@ fn main() -> Result<()> {
264
263
None ,
265
264
) ?) ) ?;
266
265
266
+ #[ cfg( not( feature = "qemu" ) ) ]
267
+ bluetooth ( ) ?;
268
+
267
269
test_tcp ( ) ?;
268
270
269
271
test_tcp_bind ( ) ?;
@@ -910,7 +912,7 @@ fn heltec_hello_world(
910
912
. init ( )
911
913
. map_err ( |e| anyhow:: anyhow!( "Display error: {:?}" , e) ) ?;
912
914
913
- led_draw ( & mut display) ?;
915
+ led_draw ( & mut display) . map_err ( |e| anyhow :: anyhow! ( "Display error: {:?}" , e ) ) ?;
914
916
915
917
display
916
918
. flush ( )
@@ -1100,6 +1102,158 @@ where
1100
1102
Ok ( ( ) )
1101
1103
}
1102
1104
1105
+ #[ cfg( not( feature = "qemu" ) ) ]
1106
+ fn bluetooth ( ) -> Result < ( ) > {
1107
+ info ! ( "About to start BLE scan" ) ;
1108
+
1109
+ unsafe extern "C" fn bluetooth_gap_callback (
1110
+ event : esp_idf_sys:: esp_gap_ble_cb_event_t ,
1111
+ param : * mut esp_idf_sys:: esp_ble_gap_cb_param_t ,
1112
+ ) {
1113
+ let mut param = * param;
1114
+ match event {
1115
+ esp_idf_sys:: esp_gap_ble_cb_event_t_ESP_GAP_BLE_SCAN_PARAM_SET_COMPLETE_EVT => {
1116
+ let duration_seconds = 2 ;
1117
+ esp_nofail ! ( esp_idf_sys:: esp_ble_gap_start_scanning( duration_seconds) ) ;
1118
+ }
1119
+ esp_idf_sys:: esp_gap_ble_cb_event_t_ESP_GAP_BLE_SCAN_START_COMPLETE_EVT => {
1120
+ if param. scan_start_cmpl . status
1121
+ != esp_idf_sys:: esp_bt_status_t_ESP_BT_STATUS_SUCCESS
1122
+ {
1123
+ error ! (
1124
+ "BLE scan starting failed, error status: {}" ,
1125
+ param. scan_start_cmpl. status
1126
+ ) ;
1127
+ }
1128
+ debug ! ( "BLE scan started successfully" ) ;
1129
+ }
1130
+ esp_idf_sys:: esp_gap_ble_cb_event_t_ESP_GAP_BLE_SCAN_RESULT_EVT => {
1131
+ if param. scan_rst . search_evt
1132
+ == esp_idf_sys:: esp_gap_search_evt_t_ESP_GAP_SEARCH_INQ_RES_EVT
1133
+ {
1134
+ let mut advertisment_name_length = 0 ;
1135
+ let advertisment_name_raw = esp_idf_sys:: esp_ble_resolve_adv_data (
1136
+ param. scan_rst . ble_adv . as_mut_ptr ( ) ,
1137
+ esp_idf_sys:: esp_ble_adv_data_type_ESP_BLE_AD_TYPE_NAME_CMPL as u8 ,
1138
+ & mut advertisment_name_length,
1139
+ ) ;
1140
+ debug ! (
1141
+ "BLE scan result advertisement data len {}, scan response len {}" ,
1142
+ param. scan_rst. adv_data_len, param. scan_rst. scan_rsp_len
1143
+ ) ;
1144
+ if advertisment_name_length == 0 {
1145
+ debug ! ( "Reached end of scan results" ) ;
1146
+ return ;
1147
+ }
1148
+ let advertisment_name =
1149
+ std:: str:: from_utf8_unchecked ( std:: slice:: from_raw_parts (
1150
+ advertisment_name_raw,
1151
+ advertisment_name_length as usize ,
1152
+ ) ) ;
1153
+ info ! (
1154
+ "BLE scan found device during advertisment: {:02x?} {}" ,
1155
+ & param. scan_rst. bda, advertisment_name
1156
+ ) ;
1157
+ }
1158
+ }
1159
+ esp_idf_sys:: esp_gap_ble_cb_event_t_ESP_GAP_BLE_SCAN_STOP_COMPLETE_EVT => {
1160
+ if param. scan_stop_cmpl . status != esp_idf_sys:: esp_bt_status_t_ESP_BT_STATUS_SUCCESS
1161
+ {
1162
+ error ! (
1163
+ "BLE scan stopping failed, error status: {}" ,
1164
+ param. scan_start_cmpl. status
1165
+ ) ;
1166
+ }
1167
+ debug ! ( "BLE scan stopped successfully" ) ;
1168
+ }
1169
+ esp_idf_sys:: esp_gap_ble_cb_event_t_ESP_GAP_BLE_EXT_ADV_STOP_COMPLETE_EVT => {
1170
+ if param. adv_stop_cmpl . status != esp_idf_sys:: esp_bt_status_t_ESP_BT_STATUS_SUCCESS
1171
+ {
1172
+ error ! (
1173
+ "BLE advertisment stop scanfailed, error status: {}" ,
1174
+ param. adv_stop_cmpl. status
1175
+ ) ;
1176
+ }
1177
+ debug ! ( "BLE advertisment stopped successfully" ) ;
1178
+ }
1179
+ esp_idf_sys:: esp_gap_ble_cb_event_t_ESP_GAP_BLE_UPDATE_CONN_PARAMS_EVT => {
1180
+ info ! ( "BLE update connection params status = {}, min_int = {}, max_int = {}, conn_int = {}, latency = {}, timeout = {}" ,
1181
+ param. update_conn_params. status,
1182
+ param. update_conn_params. min_int,
1183
+ param. update_conn_params. max_int,
1184
+ param. update_conn_params. conn_int,
1185
+ param. update_conn_params. latency,
1186
+ param. update_conn_params. timeout) ;
1187
+ }
1188
+ _ => info ! ( "Received unhandled GAP event: {}" , event) ,
1189
+ }
1190
+ }
1191
+
1192
+ unsafe {
1193
+ esp ! ( esp_idf_sys:: esp_bt_controller_mem_release(
1194
+ esp_idf_sys:: esp_bt_mode_t_ESP_BT_MODE_CLASSIC_BT,
1195
+ ) ) ?;
1196
+ }
1197
+
1198
+ // Same defaults as the macro at https://github.com/espressif/esp-idf/blob/8377a3fff1/components/bt/include/esp32/include/esp_bt.h#L163
1199
+ // TODO This should eventually be nicely wrapped in esp_idf_svc.
1200
+ let mut bt_controller_config = esp_idf_sys:: esp_bt_controller_config_t {
1201
+ controller_task_stack_size : esp_idf_sys:: ESP_TASK_BT_CONTROLLER_STACK as u16 ,
1202
+ controller_task_prio : esp_idf_sys:: ESP_TASK_BT_CONTROLLER_PRIO as u8 ,
1203
+ hci_uart_no : esp_idf_sys:: BT_HCI_UART_NO_DEFAULT as u8 ,
1204
+ hci_uart_baudrate : esp_idf_sys:: BT_HCI_UART_BAUDRATE_DEFAULT ,
1205
+ scan_duplicate_mode : esp_idf_sys:: SCAN_DUPLICATE_MODE as u8 ,
1206
+ scan_duplicate_type : esp_idf_sys:: SCAN_DUPLICATE_TYPE_VALUE as u8 ,
1207
+ normal_adv_size : esp_idf_sys:: NORMAL_SCAN_DUPLICATE_CACHE_SIZE as u16 ,
1208
+ mesh_adv_size : esp_idf_sys:: MESH_DUPLICATE_SCAN_CACHE_SIZE as u16 ,
1209
+ send_adv_reserved_size : esp_idf_sys:: SCAN_SEND_ADV_RESERVED_SIZE as u16 ,
1210
+ controller_debug_flag : esp_idf_sys:: CONTROLLER_ADV_LOST_DEBUG_BIT ,
1211
+ mode : esp_idf_sys:: esp_bt_mode_t_ESP_BT_MODE_BLE as u8 ,
1212
+ ble_max_conn : esp_idf_sys:: CONFIG_BTDM_CTRL_BLE_MAX_CONN_EFF as u8 ,
1213
+ bt_max_acl_conn : esp_idf_sys:: CONFIG_BTDM_CTRL_BR_EDR_MAX_ACL_CONN_EFF as u8 ,
1214
+ bt_sco_datapath : esp_idf_sys:: CONFIG_BTDM_CTRL_BR_EDR_SCO_DATA_PATH_EFF as u8 ,
1215
+ auto_latency : esp_idf_sys:: BTDM_CTRL_AUTO_LATENCY_EFF != 0 ,
1216
+ bt_legacy_auth_vs_evt : esp_idf_sys:: BTDM_CTRL_LEGACY_AUTH_VENDOR_EVT_EFF != 0 ,
1217
+ bt_max_sync_conn : esp_idf_sys:: CONFIG_BTDM_CTRL_BR_EDR_MAX_SYNC_CONN_EFF as u8 ,
1218
+ ble_sca : esp_idf_sys:: CONFIG_BTDM_BLE_SLEEP_CLOCK_ACCURACY_INDEX_EFF as u8 ,
1219
+ pcm_role : esp_idf_sys:: CONFIG_BTDM_CTRL_PCM_ROLE_EFF as u8 ,
1220
+ pcm_polar : esp_idf_sys:: CONFIG_BTDM_CTRL_PCM_POLAR_EFF as u8 ,
1221
+ hli : esp_idf_sys:: BTDM_CTRL_HLI != 0 ,
1222
+ magic : esp_idf_sys:: ESP_BT_CONTROLLER_CONFIG_MAGIC_VAL ,
1223
+ } ;
1224
+
1225
+ // Same defaults as in https://github.com/espressif/esp-idf/blob/8377a3fff1927862ba5a17d0f9518e1a9e5fc8dd/examples/bluetooth/bluedroid/ble/gatt_client/main/gattc_demo.c#L68
1226
+ // TODO This should eventually be nicely wrapped in esp_idf_svc.
1227
+ let mut ble_scan_params = esp_idf_sys:: esp_ble_scan_params_t {
1228
+ scan_type : esp_idf_sys:: esp_ble_scan_type_t_BLE_SCAN_TYPE_ACTIVE,
1229
+ own_addr_type : esp_idf_sys:: esp_ble_addr_type_t_BLE_ADDR_TYPE_PUBLIC,
1230
+ scan_filter_policy : esp_idf_sys:: esp_ble_scan_filter_t_BLE_SCAN_FILTER_ALLOW_ALL,
1231
+ scan_interval : 0x50 ,
1232
+ scan_window : 0x30 ,
1233
+ scan_duplicate : esp_idf_sys:: esp_ble_scan_duplicate_t_BLE_SCAN_DUPLICATE_DISABLE,
1234
+ } ;
1235
+
1236
+ unsafe {
1237
+ esp ! ( esp_idf_sys:: esp_bt_controller_init(
1238
+ & mut bt_controller_config
1239
+ ) ) ?;
1240
+ esp ! ( esp_idf_sys:: esp_bt_controller_enable(
1241
+ esp_idf_sys:: esp_bt_mode_t_ESP_BT_MODE_BLE
1242
+ ) ) ?;
1243
+ esp ! ( esp_idf_sys:: esp_bluedroid_init( ) ) ?;
1244
+ esp ! ( esp_idf_sys:: esp_bluedroid_enable( ) ) ?;
1245
+ esp ! ( esp_idf_sys:: esp_ble_gap_register_callback( Some (
1246
+ bluetooth_gap_callback
1247
+ ) ) ) ?;
1248
+ esp ! ( esp_idf_sys:: esp_ble_gap_set_scan_params(
1249
+ & mut ble_scan_params
1250
+ ) ) ?;
1251
+ }
1252
+
1253
+ thread:: sleep ( Duration :: from_secs ( 3 ) ) ;
1254
+ Ok ( ( ) )
1255
+ }
1256
+
1103
1257
#[ allow( unused_variables) ]
1104
1258
fn httpd ( mutex : Arc < ( Mutex < Option < u32 > > , Condvar ) > ) -> Result < idf:: Server > {
1105
1259
let server = idf:: ServerRegistry :: new ( )
0 commit comments