bt call and pairing dialog. powermgm refactoring

This commit is contained in:
sharandac
2020-08-14 15:40:34 +02:00
parent 174ab77d2f
commit 46122f4c1a
19 changed files with 1145 additions and 173 deletions

View File

@@ -42,12 +42,16 @@ portMUX_TYPE blectlMux = portMUX_INITIALIZER_UNLOCKED;
blectl_config_t blectl_config;
blectl_event_t *blectl_event_cb_table = NULL;
uint32_t blectl_event_cb_entrys = 0;
void blectl_send_event_cb( EventBits_t event, char *msg );
BLEServer *pServer = NULL;
BLECharacteristic *pTxCharacteristic;
uint8_t txValue = 0;
#define MAX_MESSAGE_SIZE 512
String message;
char *gadgetbridge_msg = NULL;
uint32_t gadgetbridge_msg_size = 0;
/*
*
@@ -55,13 +59,15 @@ String message;
class BleCtlServerCallbacks: public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
blectl_set_event( BLECTL_CONNECT );
statusbar_style_icon( STATUSBAR_BLUETOOTH, STATUSBAR_STYLE_WHITE );
blectl_clear_event( BLECTL_DISCONNECT );
blectl_send_event_cb( BLECTL_CONNECT, (char*)"connected" );
log_i("BLE connected");
};
void onDisconnect(BLEServer* pServer) {
blectl_set_event( BLECTL_DISCONNECT );
blectl_clear_event( BLECTL_CONNECT );
statusbar_style_icon( STATUSBAR_BLUETOOTH, STATUSBAR_STYLE_GRAY );
blectl_send_event_cb( BLECTL_DISCONNECT, (char*)"disconnected" );
log_i("BLE disconnected");
delay(500);
if ( blectl_get_advertising() ) {
@@ -77,24 +83,19 @@ class BleCtlServerCallbacks: public BLEServerCallbacks {
class BtlCtlSecurity : public BLESecurityCallbacks {
uint32_t onPassKeyRequest(){
log_i("BLE: PassKeyRequest");
// TODO: when is this used?
return 123456;
}
void onPassKeyNotify(uint32_t pass_key){
blectl_set_event( BLECTL_PAIRING );
log_i("Bluetooth Pairing Request\r\nPIN: %06d", pass_key);
char pin[16]="";
snprintf( pin, sizeof( pin ), "%06d", pass_key );
blectl_set_event( BLECTL_PIN_AUTH );
blectl_send_event_cb( BLECTL_PIN_AUTH, pin );
log_i("Bluetooth Pairing Request\r\nPIN: %s", pin );
}
bool onConfirmPIN(uint32_t pass_key){
log_i("BLE: The passkey YES/NO number :%06d", pass_key);
// vTaskDelay(5000);
// return true;
// TODO: when is this used?
return false;
}
bool onSecurityRequest(){
log_i("BLE: SecurityRequest");
// TODO: when is this used?
return true;
}
@@ -102,52 +103,103 @@ class BtlCtlSecurity : public BLESecurityCallbacks {
log_i("Bluetooth pairing %s", cmpl.success ? "successful" : "unsuccessful");
if( cmpl.success ){
uint16_t length;
esp_ble_gap_get_whitelist_size( &length );
log_i("size: %d", length );
} else {
// Restart advertising
if ( blectl_get_event( BLECTL_PIN_AUTH ) ) {
blectl_send_event_cb( BLECTL_PAIRING_SUCCESS, (char*)"success" );
}
}
else {
if ( blectl_get_event( BLECTL_PIN_AUTH ) ) {
blectl_send_event_cb( BLECTL_PAIRING_ABORT, (char*)"abort" );
}
pServer->startAdvertising();
}
if ( blectl_get_event( BLECTL_PAIRING )) {
blectl_clear_event( BLECTL_PAIRING );
if ( blectl_get_event( BLECTL_PIN_AUTH ) ) {
blectl_clear_event( BLECTL_PIN_AUTH );
}
}
};
void blectl_add_char_to_gadgetbridge_msg( char msg_char ) {
gadgetbridge_msg_size++;
if ( gadgetbridge_msg == NULL ) {
gadgetbridge_msg = (char *)ps_calloc( gadgetbridge_msg_size + 1, 1 );
if ( gadgetbridge_msg == NULL ) {
log_e("gadgetbridge_msg alloc fail");
while(true);
}
}
else {
char *new_gadgetbridge_msg = NULL;
new_gadgetbridge_msg = (char *)ps_realloc( gadgetbridge_msg, gadgetbridge_msg_size + 1 );
if ( new_gadgetbridge_msg == NULL ) {
log_e("gadgetbridge_msg realloc fail");
while(true);
}
gadgetbridge_msg = new_gadgetbridge_msg;
}
gadgetbridge_msg[ gadgetbridge_msg_size - 1 ] = msg_char;
gadgetbridge_msg[ gadgetbridge_msg_size ] = '\0';
}
void blectl_delete_gadgetbridge_msg ( void ) {
gadgetbridge_msg_size = 0;
if ( gadgetbridge_msg == NULL ) {
gadgetbridge_msg = (char *)ps_calloc( gadgetbridge_msg_size + 1, 1 );
if ( gadgetbridge_msg == NULL ) {
log_e("gadgetbridge_msg alloc fail");
while(true);
}
}
else {
char *new_gadgetbridge_msg = NULL;
new_gadgetbridge_msg = (char *)ps_realloc( gadgetbridge_msg, gadgetbridge_msg_size + 1 );
if ( new_gadgetbridge_msg == NULL ) {
log_e("gadgetbridge_msg realloc fail");
while(true);
}
gadgetbridge_msg = new_gadgetbridge_msg;
}
gadgetbridge_msg[ gadgetbridge_msg_size ] = '\0';
}
class BleCtlCallbacks : public BLECharacteristicCallbacks
{
void onWrite(BLECharacteristic *pCharacteristic)
{
std::string rxValue = pCharacteristic->getValue();
if (rxValue.length() > 0)
{
for (int i = 0; i < rxValue.length(); i++) {
if (rxValue[i] == 0x10) {
if ( message.length() ) {
log_i("BLE: Discarding %d bytes", message.length());
}
message.clear();
} else if (rxValue[i] == '\n') {
if (message.length()+1 > MAX_MESSAGE_SIZE) {
message.clear();
log_e("BLE Error: Message too long");
return;
}
message[message.length()] = 0;
Serial.println("BLE message: " + message );
message.clear();
} else {
message += rxValue[i];
if (message.length() > MAX_MESSAGE_SIZE) {
message.clear();
log_e("BLE Error: Message too long");
return;
}
char *msg = (char *)ps_calloc( pCharacteristic->getValue().length() + 1, 1 );
if ( msg == NULL ) {
Serial.printf("ps_calloc fail\r\n");
return;
}
else {
strlcpy( msg, pCharacteristic->getValue().c_str(), pCharacteristic->getValue().length() + 1 );
for ( int i = 0 ; i < pCharacteristic->getValue().length(); i++ ) {
switch( msg[ i ] ) {
case EndofText: blectl_delete_gadgetbridge_msg();
log_i("attention, new link establish");
break;
case DataLinkEscape: blectl_delete_gadgetbridge_msg();
log_i("attention, new message");
break;
case LineFeed: log_i("message complete, fire BLTCTL_MSG callback");
if( gadgetbridge_msg[ 0 ] == 'G' && gadgetbridge_msg[ 1 ] == 'B' ) {
log_i("gadgetbridge message identified, cut down to json");
gadgetbridge_msg[ gadgetbridge_msg_size - 1 ] = '\0';
log_i("msg: %s", &gadgetbridge_msg[ 3 ] );
blectl_send_event_cb( BLECTL_MSG, &gadgetbridge_msg[ 3 ] );
}
else {
log_i("msg: %s", gadgetbridge_msg );
blectl_send_event_cb( BLECTL_MSG, gadgetbridge_msg );
}
break;
default: blectl_add_char_to_gadgetbridge_msg( msg[ i ] );
}
}
free(msg);
}
}
};
@@ -158,7 +210,6 @@ class BleCtlCallbacks : public BLECharacteristicCallbacks
void blectl_setup( void ) {
blectl_status = xEventGroupCreate();
blectl_set_event( BLECTL_CONNECT | BLECTL_OFF_REQUEST | BLECTL_ON_REQUEST | BLECTL_PAIRING | BLECTL_STANDBY_REQUEST | BLECTL_ACTIVE | BLECTL_SCAN );
esp_bt_controller_enable( ESP_BT_MODE_BLE );
esp_bt_controller_mem_release( ESP_BT_MODE_CLASSIC_BT );
@@ -239,19 +290,61 @@ void blectl_clear_event( EventBits_t bits ) {
/*
*
*/
EventBits_t blectl_get_event( EventBits_t bits ) {
bool blectl_get_event( EventBits_t bits ) {
portENTER_CRITICAL(&blectlMux);
EventBits_t temp = xEventGroupGetBits( blectl_status ) & bits;
portEXIT_CRITICAL(&blectlMux);
return( temp );
if ( temp )
return( true );
return( false );
}
void blectl_register_cb( EventBits_t event, BLECTL_CALLBACK_FUNC blectl_event_cb ) {
blectl_event_cb_entrys++;
if ( blectl_event_cb_table == NULL ) {
blectl_event_cb_table = ( blectl_event_t * )ps_malloc( sizeof( blectl_event_t ) * blectl_event_cb_entrys );
if ( blectl_event_cb_table == NULL ) {
log_e("blectl_event_cb_table malloc faild");
while(true);
}
}
else {
blectl_event_t *new_blectl_event_cb_table = NULL;
new_blectl_event_cb_table = ( blectl_event_t * )ps_realloc( blectl_event_cb_table, sizeof( blectl_event_t ) * blectl_event_cb_entrys );
if ( new_blectl_event_cb_table == NULL ) {
log_e("blectl_event_cb_table realloc faild");
while(true);
}
blectl_event_cb_table = new_blectl_event_cb_table;
}
blectl_event_cb_table[ blectl_event_cb_entrys - 1 ].event = event;
blectl_event_cb_table[ blectl_event_cb_entrys - 1 ].event_cb = blectl_event_cb;
log_i("register event_cb success");
}
/*
*
*/
void blectl_send_event_cb( EventBits_t event, char *msg ) {
for ( int entry = 0 ; entry < blectl_event_cb_entrys ; entry++ ){
if ( event & blectl_event_cb_table[ entry ].event ) {
log_i("call event_cb");
blectl_event_cb_table[ entry ].event_cb( event, msg );
}
}
}
void blectl_standby( void ) {
statusbar_style_icon( STATUSBAR_BLUETOOTH, STATUSBAR_STYLE_GRAY );
/*
*/
}
void blectl_wakeup( void ) {
statusbar_style_icon( STATUSBAR_BLUETOOTH, STATUSBAR_STYLE_GRAY );
/*
*/
}
void blectl_set_enable_on_standby( bool enable_on_standby ) {

View File

@@ -32,18 +32,33 @@
#define BLECTL_JSON_COFIG_FILE "/blectl.json"
#define EndofText 0x03
#define LineFeed 0x0a
#define DataLinkEscape 0x10
typedef struct {
bool advertising = true;
bool enable_on_standby = false;
} blectl_config_t;
typedef void ( * BLECTL_CALLBACK_FUNC ) ( EventBits_t event, char *msg );
typedef struct {
EventBits_t event;
BLECTL_CALLBACK_FUNC event_cb;
} blectl_event_t;
#define BLECTL_CONNECT _BV(0)
#define BLECTL_STANDBY_REQUEST _BV(1)
#define BLECTL_ON_REQUEST _BV(2)
#define BLECTL_OFF_REQUEST _BV(3)
#define BLECTL_ACTIVE _BV(4)
#define BLECTL_SCAN _BV(5)
#define BLECTL_PAIRING _BV(6)
#define BLECTL_DISCONNECT _BV(1)
#define BLECTL_STANDBY _BV(2)
#define BLECTL_ON _BV(3)
#define BLECTL_OFF _BV(4)
#define BLECTL_ACTIVE _BV(5)
#define BLECTL_MSG _BV(6)
#define BLECTL_PIN_AUTH _BV(7)
#define BLECTL_PAIRING _BV(8)
#define BLECTL_PAIRING_SUCCESS _BV(9)
#define BLECTL_PAIRING_ABORT _BV(10)
void blectl_setup( void );
@@ -64,7 +79,9 @@
*
* @param bits event state, example: POWERMGM_STANDBY to evaluate if the system in standby
*/
EventBits_t blectl_get_event( EventBits_t bits );
bool blectl_get_event( EventBits_t bits );
void blectl_register_cb( EventBits_t event, BLECTL_CALLBACK_FUNC blectl_event_cb );
void blectl_standby( void );
void blectl_wakeup( void );
void blectl_set_enable_on_standby( bool enable_on_standby );

View File

@@ -127,7 +127,7 @@ void bma_loop( TTGOClass *ttgo ) {
if ( xEventGroupGetBitsFromISR( bma_event_handle ) & BMA_EVENT_INT ) {
while( !ttgo->bma->readInterrupt() );
if ( ttgo->bma->isDoubleClick() ) {
powermgm_set_event( POWERMGM_BMA_WAKEUP );
powermgm_set_event( POWERMGM_BMA_DOUBLECLICK );
xEventGroupClearBitsFromISR( bma_event_handle, BMA_EVENT_INT );
return;
}

View File

@@ -79,11 +79,20 @@ void display_standby( void ) {
dest_brightness = 0;
}
void display_wakeup( void ) {
void display_wakeup( bool silence ) {
TTGOClass *ttgo = TTGOClass::getWatch();
// normal wake up from standby
if ( powermgm_get_event( POWERMGM_PMU_BUTTON | POWERMGM_PMU_BATTERY | POWERMGM_BMA_WAKEUP ) ) {
// wakeup without display
if ( silence ) {
log_i("go silence wakeup");
ttgo->openBL();
ttgo->displayWakeup();
ttgo->bl->adjust( 0 );
brightness = 0;
dest_brightness = 0;
}
// wakeup with display
else {
log_i("go wakeup");
ttgo->openBL();
ttgo->displayWakeup();
@@ -92,16 +101,6 @@ void display_wakeup( void ) {
dest_brightness = display_get_brightness();
motor_vibe( 1 );
}
// silence wakeup request from standby
else if ( powermgm_get_event( POWERMGM_SILENCE_WAKEUP_REQUEST ) ) {
log_i("go silence wakeup");
ttgo->openBL();
ttgo->displayWakeup();
ttgo->bl->adjust( 0 );
brightness = 0;
dest_brightness = 0;
powermgm_set_event( POWERMGM_SILENCE_WAKEUP );
}
}
/*

View File

@@ -116,7 +116,7 @@
/*
* @brief set display into normal mode or leave it in standby if a silence wakeup occur
*/
void display_wakeup( void );
void display_wakeup( bool silence );
#endif // _DISPLAY_H

View File

@@ -224,26 +224,20 @@ void pmu_loop( TTGOClass *ttgo ) {
/*
* handle IRQ event
*/
if ( xEventGroupGetBitsFromISR( pmu_event_handle ) & PMU_EVENT_AXP_INT ) {
if ( powermgm_get_event( POWERMGM_PMU_BATTERY | POWERMGM_PMU_BUTTON | POWERMGM_STANDBY_REQUEST ) ) {
ttgo->power->clearIRQ();
xEventGroupClearBits( pmu_event_handle, PMU_EVENT_AXP_INT );
return;
}
if ( xEventGroupGetBitsFromISR( pmu_event_handle ) & PMU_EVENT_AXP_INT ) {
ttgo->power->readIRQ();
if (ttgo->power->isVbusPlugInIRQ()) {
powermgm_set_event( POWERMGM_PMU_BATTERY );
powermgm_set_event( POWERMGM_WAKEUP_REQUEST );
motor_vibe( 1 );
updatetrigger = true;
}
if (ttgo->power->isVbusRemoveIRQ()) {
powermgm_set_event( POWERMGM_PMU_BATTERY );
powermgm_set_event( POWERMGM_WAKEUP_REQUEST );
motor_vibe( 1 );
updatetrigger = true;
}
if (ttgo->power->isChargingDoneIRQ()) {
powermgm_set_event( POWERMGM_PMU_BATTERY );
powermgm_set_event( POWERMGM_WAKEUP_REQUEST );
motor_vibe( 1 );
updatetrigger = true;
}

View File

@@ -49,7 +49,6 @@ portMUX_TYPE powermgmMux = portMUX_INITIALIZER_UNLOCKED;
void powermgm_setup( TTGOClass *ttgo ) {
powermgm_status = xEventGroupCreate();
xEventGroupClearBits( powermgm_status, POWERMGM_STANDBY | POWERMGM_PMU_BUTTON | POWERMGM_PMU_BATTERY | POWERMGM_SILENCE_WAKEUP | POWERMGM_SILENCE_WAKEUP_REQUEST );
pmu_setup( ttgo );
bma_setup( ttgo );
@@ -65,86 +64,92 @@ void powermgm_setup( TTGOClass *ttgo ) {
*/
void powermgm_loop( TTGOClass *ttgo ) {
// event-tripper pmu-button or pmu-battery state change
if ( powermgm_get_event( POWERMGM_PMU_BUTTON | POWERMGM_PMU_BATTERY | POWERMGM_BMA_WAKEUP | POWERMGM_SILENCE_WAKEUP_REQUEST | POWERMGM_STANDBY_REQUEST ) ) {
// if we have an request when we are in silence mode, emulate an wakeup from standby
if ( powermgm_get_event( POWERMGM_SILENCE_WAKEUP ) && powermgm_get_event( POWERMGM_PMU_BUTTON | POWERMGM_PMU_BATTERY | POWERMGM_BMA_WAKEUP ) ) {
powermgm_set_event( POWERMGM_STANDBY );
powermgm_clear_event( POWERMGM_SILENCE_WAKEUP );
// check if a button or doubleclick was release
if( powermgm_get_event( POWERMGM_PMU_BUTTON | POWERMGM_BMA_DOUBLECLICK ) ) {
if ( powermgm_get_event( POWERMGM_STANDBY ) || powermgm_get_event( POWERMGM_SILENCE_WAKEUP ) ) {
powermgm_set_event( POWERMGM_WAKEUP_REQUEST );
}
if ( powermgm_get_event( POWERMGM_STANDBY ) ) {
powermgm_clear_event( POWERMGM_STANDBY );
log_i("go wakeup");
setCpuFrequencyMhz(240);
pmu_wakeup();
bma_wakeup();
display_wakeup();
timesyncToSystem();
wifictl_wakeup();
blectl_wakeup();
Serial.printf("Total heap: %d\r\n", ESP.getHeapSize());
Serial.printf("Free heap: %d\r\n", ESP.getFreeHeap());
Serial.printf("Total PSRAM: %d\r\n", ESP.getPsramSize());
Serial.printf("Free PSRAM: %d\r\n", ESP.getFreePsram());
ttgo->startLvglTick();
lv_disp_trig_activity(NULL);
if ( !display_get_block_return_maintile() ) {
mainbar_jump_to_maintile( LV_ANIM_OFF );
}
}
else {
ttgo->stopLvglTick();
Serial.printf("Total heap: %d\r\n", ESP.getHeapSize());
Serial.printf("Free heap: %d\r\n", ESP.getFreeHeap());
Serial.printf("Total PSRAM: %d\r\n", ESP.getPsramSize());
Serial.printf("Free PSRAM: %d\r\n", ESP.getFreePsram());
display_standby();
timesyncToRTC();
bma_standby();
pmu_standby();
wifictl_standby();
blectl_standby();
powermgm_set_event( POWERMGM_STANDBY );
powermgm_clear_event( POWERMGM_SILENCE_WAKEUP );
adc_power_off();
if ( !blectl_get_enable_on_standby() ) {
motor_vibe(3);
delay(50);
log_i("go standby");
setCpuFrequencyMhz( 10 );
gpio_wakeup_enable ( (gpio_num_t)AXP202_INT, GPIO_INTR_LOW_LEVEL );
gpio_wakeup_enable ( (gpio_num_t)BMA423_INT1, GPIO_INTR_HIGH_LEVEL );
esp_sleep_enable_gpio_wakeup ();
esp_light_sleep_start();
// from here, the consumption is round about 2.5mA
// total standby time is 152h (6days) without use?
}
else {
log_i("standby block by bluetooth");
setCpuFrequencyMhz( 80 );
// from here, the consumption is round about 23mA
// total standby time is 19h without use?
}
powermgm_set_event( POWERMGM_STANDBY_REQUEST );
}
// clear event
powermgm_clear_event( POWERMGM_PMU_BUTTON | POWERMGM_PMU_BATTERY | POWERMGM_BMA_WAKEUP | POWERMGM_STANDBY_REQUEST | POWERMGM_SILENCE_WAKEUP_REQUEST );
powermgm_clear_event( POWERMGM_PMU_BUTTON | POWERMGM_BMA_DOUBLECLICK );
}
// drive into
if ( powermgm_get_event( POWERMGM_SILENCE_WAKEUP_REQUEST | POWERMGM_WAKEUP_REQUEST ) ) {
powermgm_clear_event( POWERMGM_STANDBY | POWERMGM_SILENCE_WAKEUP );
log_i("go wakeup");
setCpuFrequencyMhz(240);
pmu_wakeup();
bma_wakeup();
display_wakeup( powermgm_get_event( POWERMGM_SILENCE_WAKEUP_REQUEST )?true:false );
timesyncToSystem();
wifictl_wakeup();
blectl_wakeup();
Serial.printf("Total heap: %d\r\n", ESP.getHeapSize());
Serial.printf("Free heap: %d\r\n", ESP.getFreeHeap());
Serial.printf("Total PSRAM: %d\r\n", ESP.getPsramSize());
Serial.printf("Free PSRAM: %d\r\n", ESP.getFreePsram());
ttgo->startLvglTick();
lv_disp_trig_activity(NULL);
if ( powermgm_get_event( POWERMGM_SILENCE_WAKEUP_REQUEST ) ) {
powermgm_set_event( POWERMGM_SILENCE_WAKEUP );
}
}
else if( powermgm_get_event( POWERMGM_STANDBY_REQUEST ) ) {
powermgm_set_event( POWERMGM_STANDBY );
powermgm_clear_event( POWERMGM_SILENCE_WAKEUP );
if ( !display_get_block_return_maintile() ) {
mainbar_jump_to_maintile( LV_ANIM_OFF );
}
ttgo->stopLvglTick();
Serial.printf("Total heap: %d\r\n", ESP.getHeapSize());
Serial.printf("Free heap: %d\r\n", ESP.getFreeHeap());
Serial.printf("Total PSRAM: %d\r\n", ESP.getPsramSize());
Serial.printf("Free PSRAM: %d\r\n", ESP.getFreePsram());
display_standby();
timesyncToRTC();
bma_standby();
pmu_standby();
wifictl_standby();
blectl_standby();
adc_power_off();
if ( !blectl_get_enable_on_standby() ) {
motor_vibe(3);
delay(50);
log_i("go standby");
setCpuFrequencyMhz( 10 );
gpio_wakeup_enable ( (gpio_num_t)AXP202_INT, GPIO_INTR_LOW_LEVEL );
gpio_wakeup_enable ( (gpio_num_t)BMA423_INT1, GPIO_INTR_HIGH_LEVEL );
esp_sleep_enable_gpio_wakeup ();
esp_light_sleep_start();
// from here, the consumption is round about 2.5mA
// total standby time is 152h (6days) without use?
}
else {
log_i("standby block by bluetooth");
setCpuFrequencyMhz( 80 );
// from here, the consumption is round about 23mA
// total standby time is 19h without use?
}
}
powermgm_clear_event( POWERMGM_SILENCE_WAKEUP_REQUEST | POWERMGM_WAKEUP_REQUEST | POWERMGM_STANDBY_REQUEST );
pmu_loop( ttgo );
bma_loop( ttgo );
display_loop( ttgo );

View File

@@ -28,16 +28,16 @@
#define POWERMGM_STANDBY_REQUEST _BV(1)
#define POWERMGM_SILENCE_WAKEUP _BV(2)
#define POWERMGM_SILENCE_WAKEUP_REQUEST _BV(3)
#define POWERMGM_PMU_BUTTON _BV(4)
#define POWERMGM_PMU_BATTERY _BV(5)
#define POWERMGM_PMU_ALARM _BV(6)
#define POWERMGM_BMA_WAKEUP _BV(7)
#define POWERMGM_WIFI_ON_REQUEST _BV(8)
#define POWERMGM_WIFI_OFF_REQUEST _BV(9)
#define POWERMGM_WIFI_WPS_REQUEST _BV(10)
#define POWERMGM_WIFI_ACTIVE _BV(11)
#define POWERMGM_WIFI_SCAN _BV(12)
#define POWERMGM_WIFI_CONNECTED _BV(13)
#define POWERMGM_WAKEUP _BV(4)
#define POWERMGM_WAKEUP_REQUEST _BV(5)
#define POWERMGM_PMU_BUTTON _BV(6)
#define POWERMGM_BMA_DOUBLECLICK _BV(9)
#define POWERMGM_WIFI_ON_REQUEST _BV(10)
#define POWERMGM_WIFI_OFF_REQUEST _BV(11)
#define POWERMGM_WIFI_WPS_REQUEST _BV(12)
#define POWERMGM_WIFI_ACTIVE _BV(13)
#define POWERMGM_WIFI_SCAN _BV(14)
#define POWERMGM_WIFI_CONNECTED _BV(15)
/*
* @brief setp power managment, coordinate managment beween CPU, wifictl, pmu, bma, display, backlight and lvgl