# include "BluetoothSerial.h"
# include "esp_bt_main.h"
# include "esp_bt_device.h"
BluetoothSerial SerialBT ;
# define BT_PAIRING_TIMEOUT 30000
uint32_t bt_pairing_started = 0 ;
# define BT_DEV_ADDR_LEN 6
# define BT_DEV_HASH_LEN 16
char bt_da [ BT_DEV_ADDR_LEN ] ;
char bt_dh [ BT_DEV_HASH_LEN ] ;
char bt_devname [ 11 ] ;
bool bt_ready = false ;
bool bt_enabled = true ;
bool bt_allow_pairing = false ;
# if MCU_VARIANT == MCU_ESP32
void bt_confirm_pairing ( uint32_t numVal ) {
if ( bt_allow_pairing ) {
bt_state = BT_STATE_ON ;
SerialBT . confirmReply ( true ) ;
} else {
bt_state = BT_STATE_ON ;
SerialBT . confirmReply ( false ) ;
}
}
void bt_pairing_complete ( boolean success ) {
if ( success ) {
Serial . println ( " Paired " ) ;
} else {
Serial . println ( " Not Paired " ) ;
}
}
void bt_enable_pairing ( ) {
bt_allow_pairing = true ;
bt_pairing_started = millis ( ) ;
bt_state = BT_STATE_PAIRING ;
}
void bt_disable_pairing ( ) {
bt_allow_pairing = false ;
bt_state = BT_STATE_ON ;
}
void bt_disable ( ) {
if ( bt_state ! = BT_STATE_OFF ) {
SerialBT . end ( ) ;
bt_state = BT_STATE_OFF ;
}
}
void bt_enable ( ) {
if ( bt_state = = BT_STATE_OFF ) {
SerialBT . begin ( bt_devname ) ;
bt_state = BT_STATE_ON ;
}
}
bool bt_setup_hw ( ) {
if ( ! bt_ready ) {
if ( btStart ( ) ) {
if ( esp_bluedroid_init ( ) = = ESP_OK ) {
if ( esp_bluedroid_enable ( ) = = ESP_OK ) {
const uint8_t * bda_ptr = esp_bt_dev_get_address ( ) ;
char * data = ( char * ) malloc ( BT_DEV_ADDR_LEN ) ;
for ( int i = 0 ; i < BT_DEV_ADDR_LEN ; i + + ) {
data [ i ] = bda_ptr [ i ] ;
}
unsigned char * hash = MD5 : : make_hash ( data , BT_DEV_ADDR_LEN ) ;
memcpy ( bt_dh , hash , BT_DEV_HASH_LEN ) ;
sprintf ( bt_devname , " RNode %02X%02X " , bt_dh [ 14 ] , bt_dh [ 15 ] ) ;
free ( data ) ;
SerialBT . enableSSP ( ) ;
SerialBT . onConfirmRequest ( bt_confirm_pairing ) ;
SerialBT . onAuthComplete ( bt_pairing_complete ) ;
bt_ready = true ;
return true ;
} else { return false ; }
} else { return false ; }
} else { return false ; }
}
}
bool bt_init ( ) {
bt_state = BT_STATE_OFF ;
if ( bt_enabled ) {
if ( bt_setup_hw ( ) ) {
// TODO: Read from conf
bt_enable ( ) ;
return true ;
} else {
return false ;
}
} else {
return false ;
}
}
void update_bt ( ) {
if ( millis ( ) - bt_pairing_started > = BT_PAIRING_TIMEOUT ) {
bt_disable_pairing ( ) ;
}
}
# endif