add update and battery settings

This commit is contained in:
sharandac
2020-07-31 14:29:04 +02:00
parent 194c7deb02
commit a5aafb885e
22 changed files with 938 additions and 189 deletions

View File

@@ -29,11 +29,13 @@
#include "gui/statusbar.h"
EventGroupHandle_t bma_event_handle = NULL;
void IRAM_ATTR bma_irq( void );
bma_config_t bma_config[ BMA_CONFIG_NUM ];
__NOINIT_ATTR uint32_t stepcounter_valid;
__NOINIT_ATTR uint32_t stepcounter;
void IRAM_ATTR bma_irq( void );
/*
*
*/
@@ -45,6 +47,12 @@ void bma_setup( TTGOClass *ttgo ) {
bma_config[ i ].enable = true;
}
if ( stepcounter_valid != 0xa5a5a5a5 ) {
stepcounter = 0;
stepcounter_valid = 0xa5a5a5a5;
log_e("stepcounter not valid. reset");
}
bma_read_config();
ttgo->bma->begin();
@@ -101,7 +109,8 @@ void bma_loop( TTGOClass *ttgo ) {
}
if ( !powermgm_get_event( POWERMGM_STANDBY ) && xEventGroupGetBitsFromISR( bma_event_handle ) & BMA_EVENT_INT ) {
statusbar_update_stepcounter( ttgo->bma->getCounter() );
stepcounter =+ ttgo->bma->getCounter();
statusbar_update_stepcounter( stepcounter );
xEventGroupClearBitsFromISR( bma_event_handle, BMA_EVENT_INT );
}
}

View File

@@ -25,7 +25,7 @@
#define DISPLAY_MIN_TIMEOUT 15
#define DISPLAY_MAX_TIMEOUT 300
#define DISPLAY_MIN_BRIGHTNESS 32
#define DISPLAY_MIN_BRIGHTNESS 8
#define DISPLAY_MAX_BRIGHTNESS 255
#define DISPLAY_MIN_ROTATE 0

View File

@@ -12,12 +12,16 @@ EventGroupHandle_t pmu_event_handle = NULL;
void IRAM_ATTR pmu_irq( void );
pmu_config_t pmu_config;
/*
* init the pmu: AXP202
*/
void pmu_setup( TTGOClass *ttgo ) {
pmu_event_handle = xEventGroupCreate();
pmu_read_config();
// Turn on the IRQ used
ttgo->power->adc1Enable( AXP202_BATT_VOL_ADC1 | AXP202_BATT_CUR_ADC1 | AXP202_VBUS_VOL_ADC1 | AXP202_VBUS_CUR_ADC1, AXP202_ON);
ttgo->power->enableIRQ( AXP202_VBUS_REMOVED_IRQ | AXP202_VBUS_CONNECT_IRQ | AXP202_CHARGING_FINISHED_IRQ | AXP202_TIMER_TIMEOUT_IRQ, AXP202_ON );
@@ -62,6 +66,61 @@ void IRAM_ATTR pmu_irq( void ) {
setCpuFrequencyMhz(240);
}
/*
*
*/
void pmu_save_config( void ) {
fs::File file = SPIFFS.open( PMU_CONFIG_FILE, FILE_WRITE );
if ( !file ) {
log_e("Can't save file: %s", PMU_CONFIG_FILE );
}
else {
file.write( (uint8_t *)&pmu_config, sizeof( pmu_config ) );
file.close();
}
}
/*
*
*/
void pmu_read_config( void ) {
fs::File file = SPIFFS.open( PMU_CONFIG_FILE, FILE_READ );
if (!file) {
log_e("Can't open file: %s!", PMU_CONFIG_FILE );
}
else {
int filesize = file.size();
if ( filesize > sizeof( pmu_config ) ) {
log_e("Failed to read configfile. Wrong filesize!" );
}
else {
file.read( (uint8_t *)&pmu_config, filesize );
}
file.close();
}
}
bool pmu_get_calculated_percent( void ) {
return( pmu_config.compute_percent );
}
bool pmu_get_experimental_power_save( void ) {
return( pmu_config.experimental_power_save );
}
void pmu_set_calculated_percent( bool value ) {
pmu_config.compute_percent = value;
pmu_save_config();
}
void pmu_set_experimental_power_save( bool value ) {
pmu_config.experimental_power_save = value;
pmu_save_config();
}
/*
* loop routine for handling IRQ in main loop
*/
@@ -110,16 +169,21 @@ void pmu_loop( TTGOClass *ttgo ) {
if ( !powermgm_get_event( POWERMGM_STANDBY ) ) {
if ( nextmillis < millis() || updatetrigger == true ) {
nextmillis = millis() + 1000;
statusbar_update_battery( pmu_get_byttery_percent( ttgo ), ttgo->power->isChargeing(), ttgo->power->isVBUSPlug() );
statusbar_update_battery( pmu_get_battery_percent( ttgo ), ttgo->power->isChargeing(), ttgo->power->isVBUSPlug() );
}
}
}
uint32_t pmu_get_byttery_percent( TTGOClass *ttgo ) {
// discharg coulumb higher then charge coulumb, battery state unknow and set to zero
if ( ttgo->power->getBattChargeCoulomb() < ttgo->power->getBattDischargeCoulomb() || ttgo->power->getBattVoltage() < 3200 ) {
ttgo->power->ClearCoulombcounter();
return( -1 );
int32_t pmu_get_battery_percent( TTGOClass *ttgo ) {
if ( pmu_get_calculated_percent() ) {
if ( ttgo->power->getBattChargeCoulomb() < ttgo->power->getBattDischargeCoulomb() || ttgo->power->getBattVoltage() < 3200 ) {
ttgo->power->ClearCoulombcounter();
return( -1 );
}
return( ( ttgo->power->getCoulombData() / PMU_BATTERY_CAP ) * 100 );
}
return( ( ttgo->power->getCoulombData() / PMU_BATTERY_CAP ) * 100 );
else {
return( ttgo->power->getBattPercentage() );
}
// discharg coulumb higher then charge coulumb, battery state unknow and set to zero
}

View File

@@ -26,6 +26,13 @@
#define PMU_BATTERY_CAP 300
#define PMU_CONFIG_FILE "/pmu.cfg"
typedef struct {
bool compute_percent = false;
bool experimental_power_save = false;
} pmu_config_t;
/*
* @brief setup pmu: axp202
*
@@ -46,6 +53,12 @@
*
* @return charge in percent or -1 if unknown
*/
uint32_t pmu_get_byttery_percent( TTGOClass *ttgo );
int32_t pmu_get_battery_percent( TTGOClass *ttgo );
void pmu_save_config( void );
void pmu_read_config( void );
bool pmu_get_calculated_percent( void );
bool pmu_get_experimental_power_save( void );
void pmu_set_calculated_percent( bool value );
void pmu_set_experimental_power_save( bool value );
#endif // _PMU_H

View File

@@ -70,7 +70,14 @@ void powermgm_loop( TTGOClass *ttgo ) {
if ( powermgm_get_event( POWERMGM_STANDBY ) ) {
powermgm_clear_event( POWERMGM_STANDBY );
ttgo->power->setDCDC3Voltage( 3300 );
if ( pmu_get_experimental_power_save() ) {
ttgo->power->setDCDC3Voltage( 3000 );
log_e("enable 3.0V voltage");
}
else {
ttgo->power->setDCDC3Voltage( 3300 );
log_e("enable 3.3V voltage");
}
// normal wake up from standby
if ( powermgm_get_event( POWERMGM_PMU_BUTTON | POWERMGM_PMU_BATTERY | POWERMGM_BMA_WAKEUP ) ) {
log_i("wakeup");
@@ -89,7 +96,11 @@ void powermgm_loop( TTGOClass *ttgo ) {
lv_disp_trig_activity(NULL);
if ( bma_get_config( BMA_STEPCOUNTER ) )
ttgo->bma->enableStepCountInterrupt( true );
wifictl_on();
if ( ttgo->power->getBattVoltage() > 3300 ) {
wifictl_on();
}
ttgo->power->clearTimerStatus();
ttgo->power->offTimer();
}
@@ -104,9 +115,16 @@ void powermgm_loop( TTGOClass *ttgo ) {
ttgo->bma->enableStepCountInterrupt( false );
powermgm_set_event( POWERMGM_STANDBY );
powermgm_clear_event( POWERMGM_SILENCE_WAKEUP );
ttgo->power->setDCDC3Voltage( 3000 );
ttgo->power->clearTimerStatus();
ttgo->power->setTimer( 60 );
if ( pmu_get_experimental_power_save() ) {
ttgo->power->setDCDC3Voltage( 2700 );
log_e("enable 2.7V standby voltage");
}
else {
ttgo->power->setDCDC3Voltage( 3000 );
log_e("enable 3.0V standby voltage");
}
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);

View File

@@ -52,6 +52,7 @@ void wifictl_Task( void * pvParameters );
void wifictl_setup( void ) {
if ( wifi_init == true )
return;
wifi_init = true;
powermgm_clear_event( POWERMGM_WIFI_ACTIVE | POWERMGM_WIFI_OFF_REQUEST | POWERMGM_WIFI_ON_REQUEST | POWERMGM_WIFI_CONNECTED | POWERMGM_WIFI_SCAN );
@@ -122,14 +123,6 @@ void wifictl_setup( void ) {
statusbar_hide_icon( STATUSBAR_WIFI );
statusbar_wifi_set_state( false, "" );
}, WiFiEvent_t::SYSTEM_EVENT_STA_STOP );
// start Wifo controll task
xTaskCreate( wifictl_Task, /* Function to implement the task */
"wifictl Task", /* Name of the task */
2000, /* Stack size in words */
NULL, /* Task input parameter */
1, /* Priority of the task */
&_wifictl_Task ); /* Task handle. */
}
/*
@@ -172,6 +165,9 @@ void wifictl_load_network( void ) {
*
*/
bool wifictl_is_known( const char* networkname ) {
if ( wifi_init == false )
return( false );
for( int entry = 0 ; entry < NETWORKLIST_ENTRYS; entry++ ) {
if( !strcmp( networkname, wifictl_networklist[ entry ].ssid ) ) {
return( true );
@@ -184,6 +180,9 @@ bool wifictl_is_known( const char* networkname ) {
*
*/
bool wifictl_delete_network( const char *ssid ) {
if ( wifi_init == false )
return( false );
for( int entry = 0 ; entry < NETWORKLIST_ENTRYS; entry++ ) {
if( !strcmp( ssid, wifictl_networklist[ entry ].ssid ) ) {
wifictl_networklist[ entry ].ssid[ 0 ] = '\0';
@@ -199,6 +198,9 @@ bool wifictl_delete_network( const char *ssid ) {
*
*/
bool wifictl_insert_network( const char *ssid, const char *password ) {
if ( wifi_init == false )
return( false );
// check if existin
for( int entry = 0 ; entry < NETWORKLIST_ENTRYS; entry++ ) {
if( !strcmp( ssid, wifictl_networklist[ entry ].ssid ) ) {
@@ -229,13 +231,19 @@ bool wifictl_insert_network( const char *ssid, const char *password ) {
void wifictl_on( void ) {
if ( wifi_init == false )
return;
if ( powermgm_get_event( POWERMGM_WIFI_OFF_REQUEST ) || powermgm_get_event( POWERMGM_WIFI_ON_REQUEST )) {
return;
}
else {
powermgm_set_event( POWERMGM_WIFI_ON_REQUEST );
vTaskResume( _wifictl_Task );
}
if ( powermgm_get_event( POWERMGM_WIFI_OFF_REQUEST ) || powermgm_get_event( POWERMGM_WIFI_ON_REQUEST )) {
return;
}
else {
powermgm_set_event( POWERMGM_WIFI_ON_REQUEST );
xTaskCreate( wifictl_Task, /* Function to implement the task */
"wifictl Task", /* Name of the task */
2000, /* Stack size in words */
NULL, /* Task input parameter */
1, /* Priority of the task */
&_wifictl_Task ); /* Task handle. */
}
}
/*
@@ -244,13 +252,19 @@ void wifictl_on( void ) {
void wifictl_off( void ) {
if ( wifi_init == false )
return;
if ( powermgm_get_event( POWERMGM_WIFI_OFF_REQUEST ) || powermgm_get_event( POWERMGM_WIFI_ON_REQUEST )) {
return;
}
else {
powermgm_set_event( POWERMGM_WIFI_OFF_REQUEST );
vTaskResume( _wifictl_Task );
}
if ( powermgm_get_event( POWERMGM_WIFI_OFF_REQUEST ) || powermgm_get_event( POWERMGM_WIFI_ON_REQUEST )) {
return;
}
else {
powermgm_set_event( POWERMGM_WIFI_OFF_REQUEST );
xTaskCreate( wifictl_Task, /* Function to implement the task */
"wifictl Task", /* Name of the task */
2000, /* Stack size in words */
NULL, /* Task input parameter */
1, /* Priority of the task */
&_wifictl_Task ); /* Task handle. */
}
}
/*
@@ -260,19 +274,16 @@ void wifictl_Task( void * pvParameters ) {
if ( wifi_init == false )
return;
while( true ) {
vTaskDelay( 125 );
if ( powermgm_get_event( POWERMGM_WIFI_ON_REQUEST ) ) {
statusbar_wifi_set_state( true, "activate" );
WiFi.mode( WIFI_STA );
powermgm_clear_event( POWERMGM_WIFI_OFF_REQUEST | POWERMGM_WIFI_ACTIVE | POWERMGM_WIFI_CONNECTED | POWERMGM_WIFI_SCAN | POWERMGM_WIFI_ON_REQUEST );
}
else if ( powermgm_get_event( POWERMGM_WIFI_OFF_REQUEST ) ) {
statusbar_wifi_set_state( false, "" );
WiFi.mode( WIFI_OFF );
esp_wifi_stop();
powermgm_clear_event( POWERMGM_WIFI_OFF_REQUEST | POWERMGM_WIFI_ACTIVE | POWERMGM_WIFI_CONNECTED | POWERMGM_WIFI_SCAN | POWERMGM_WIFI_ON_REQUEST );
}
vTaskSuspend( _wifictl_Task );
if ( powermgm_get_event( POWERMGM_WIFI_ON_REQUEST ) ) {
statusbar_wifi_set_state( true, "activate" );
WiFi.mode( WIFI_STA );
powermgm_clear_event( POWERMGM_WIFI_OFF_REQUEST | POWERMGM_WIFI_ACTIVE | POWERMGM_WIFI_CONNECTED | POWERMGM_WIFI_SCAN | POWERMGM_WIFI_ON_REQUEST );
}
else if ( powermgm_get_event( POWERMGM_WIFI_OFF_REQUEST ) ) {
statusbar_wifi_set_state( false, "" );
WiFi.mode( WIFI_OFF );
esp_wifi_stop();
powermgm_clear_event( POWERMGM_WIFI_OFF_REQUEST | POWERMGM_WIFI_ACTIVE | POWERMGM_WIFI_CONNECTED | POWERMGM_WIFI_SCAN | POWERMGM_WIFI_ON_REQUEST );
}
vTaskDelete( NULL );
}