add silence wakeup and touch feedback
This commit is contained in:
@@ -23,9 +23,12 @@
|
||||
#include <TTGO.h>
|
||||
|
||||
#include "display.h"
|
||||
#include "powermgm.h"
|
||||
|
||||
display_config_t display_config;
|
||||
|
||||
static uint8_t dest_brightness = 0;
|
||||
static uint8_t brightness = 0;
|
||||
/*
|
||||
*
|
||||
*/
|
||||
@@ -41,8 +44,49 @@ void display_setup( TTGOClass *ttgo ) {
|
||||
* loop routine for handling IRQ in main loop
|
||||
*/
|
||||
void display_loop( TTGOClass *ttgo ) {
|
||||
if ( !powermgm_get_event( POWERMGM_STANDBY ) && !powermgm_get_event( POWERMGM_SILENCE_WAKEUP )) {
|
||||
if ( dest_brightness != brightness ) {
|
||||
if ( brightness < dest_brightness ) {
|
||||
brightness++;
|
||||
ttgo->bl->adjust( brightness );
|
||||
}
|
||||
else {
|
||||
brightness--;
|
||||
ttgo->bl->adjust( brightness );
|
||||
}
|
||||
}
|
||||
if ( lv_disp_get_inactive_time(NULL) > ( ( display_get_timeout() * 1000 ) - display_get_brightness() * 8 ) ) {
|
||||
dest_brightness = ( ( display_get_timeout() * 1000 ) - lv_disp_get_inactive_time( NULL ) ) / 8 ;
|
||||
}
|
||||
else {
|
||||
dest_brightness = display_get_brightness();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void display_go_wakeup( TTGOClass *ttgo ) {
|
||||
ttgo->openBL();
|
||||
ttgo->displayWakeup();
|
||||
ttgo->bl->adjust( 0 );
|
||||
brightness = 0;
|
||||
dest_brightness = display_get_brightness();
|
||||
}
|
||||
|
||||
void display_go_silence_wakeup( TTGOClass *ttgo ) {
|
||||
ttgo->openBL();
|
||||
ttgo->displayWakeup();
|
||||
ttgo->bl->adjust( 0 );
|
||||
brightness = 0;
|
||||
dest_brightness = 0;
|
||||
}
|
||||
|
||||
void display_go_sleep( TTGOClass *ttgo ) {
|
||||
ttgo->bl->adjust( 0 );
|
||||
ttgo->displaySleep();
|
||||
ttgo->closeBL();
|
||||
brightness = 0;
|
||||
dest_brightness = 0;
|
||||
}
|
||||
/*
|
||||
*
|
||||
*/
|
||||
@@ -92,10 +136,8 @@ uint32_t display_get_brightness( void ) {
|
||||
}
|
||||
|
||||
void display_set_brightness( uint32_t brightness ) {
|
||||
TTGOClass *ttgo = TTGOClass::getWatch();
|
||||
|
||||
display_config.brightness = brightness;
|
||||
ttgo->bl->adjust( brightness );
|
||||
dest_brightness = brightness;
|
||||
}
|
||||
|
||||
uint32_t display_get_rotation( void ) {
|
||||
|
||||
@@ -95,5 +95,8 @@
|
||||
* @param rotation from 0-270 in 90 degree steps
|
||||
*/
|
||||
void display_set_rotation( uint32_t rotation );
|
||||
void display_go_silence_wakeup( TTGOClass *ttgo );
|
||||
void display_go_wakeup( TTGOClass *ttgo );
|
||||
void display_go_sleep( TTGOClass *ttgo );
|
||||
|
||||
#endif // _DISPLAY_H
|
||||
@@ -20,7 +20,7 @@ void pmu_setup( TTGOClass *ttgo ) {
|
||||
|
||||
// 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_ON );
|
||||
ttgo->power->enableIRQ( AXP202_VBUS_REMOVED_IRQ | AXP202_VBUS_CONNECT_IRQ | AXP202_CHARGING_FINISHED_IRQ | AXP202_TIMER_TIMEOUT_IRQ, AXP202_ON );
|
||||
ttgo->power->clearIRQ();
|
||||
|
||||
// enable coulumb counter
|
||||
@@ -95,6 +95,14 @@ void pmu_loop( TTGOClass *ttgo ) {
|
||||
ttgo->power->clearIRQ();
|
||||
return;
|
||||
}
|
||||
if ( ttgo->power->isTimerTimeoutIRQ() ) {
|
||||
updatetrigger = true;
|
||||
powermgm_set_event( POWERMGM_SILENCE_WAKEUP_REQUEST );
|
||||
ttgo->power->clearTimerStatus();
|
||||
ttgo->power->offTimer();
|
||||
ttgo->power->clearIRQ();
|
||||
return;
|
||||
}
|
||||
ttgo->power->clearIRQ();
|
||||
xEventGroupClearBits( pmu_event_handle, PMU_EVENT_AXP_INT );
|
||||
}
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
#include "timesync.h"
|
||||
#include "motor.h"
|
||||
#include "touch.h"
|
||||
#include "display.h"
|
||||
|
||||
#include "gui/mainbar/mainbar.h"
|
||||
|
||||
@@ -43,7 +44,7 @@ EventGroupHandle_t powermgm_status = NULL;
|
||||
void powermgm_setup( TTGOClass *ttgo ) {
|
||||
|
||||
powermgm_status = xEventGroupCreate();
|
||||
xEventGroupClearBits( powermgm_status, POWERMGM_STANDBY | POWERMGM_PMU_BUTTON | POWERMGM_PMU_BATTERY );
|
||||
xEventGroupClearBits( powermgm_status, POWERMGM_STANDBY | POWERMGM_PMU_BUTTON | POWERMGM_PMU_BATTERY | POWERMGM_SILENCE_WAKEUP | POWERMGM_SILENCE_WAKEUP_REQUEST );
|
||||
|
||||
pmu_setup( ttgo );
|
||||
bma_setup( ttgo );
|
||||
@@ -58,28 +59,42 @@ 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 ) ) {
|
||||
// if we are in standby, wake up
|
||||
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 );
|
||||
}
|
||||
|
||||
if ( powermgm_get_event( POWERMGM_STANDBY ) ) {
|
||||
powermgm_clear_event( POWERMGM_STANDBY );
|
||||
ttgo->power->setDCDC3Voltage( 3300 );
|
||||
ttgo->openBL();
|
||||
ttgo->displayWakeup();
|
||||
ttgo->bl->adjust( 0 );
|
||||
// normal wake up from standby
|
||||
if ( powermgm_get_event( POWERMGM_PMU_BUTTON | POWERMGM_PMU_BATTERY | POWERMGM_BMA_WAKEUP ) ) {
|
||||
Serial.printf("wakeup\r\n");
|
||||
display_go_wakeup( ttgo );
|
||||
motor_vibe( 1 );
|
||||
}
|
||||
// silence wakeup request from standby
|
||||
else if ( powermgm_get_event( POWERMGM_SILENCE_WAKEUP_REQUEST ) ) {
|
||||
Serial.printf("silence wakeup\r\n");
|
||||
display_go_silence_wakeup( ttgo );
|
||||
powermgm_set_event( POWERMGM_SILENCE_WAKEUP );
|
||||
}
|
||||
ttgo->rtc->syncToSystem();
|
||||
ttgo->startLvglTick();
|
||||
mainbar_jump_to_maintile( LV_ANIM_OFF );
|
||||
lv_disp_trig_activity(NULL);
|
||||
if ( bma_get_config( BMA_STEPCOUNTER ) )
|
||||
ttgo->bma->enableStepCountInterrupt( true );
|
||||
motor_vibe( 1 );
|
||||
wifictl_on();
|
||||
}
|
||||
// if we are nor in stand by, go sleep
|
||||
wifictl_on();
|
||||
ttgo->power->clearTimerStatus();
|
||||
ttgo->power->offTimer();
|
||||
}
|
||||
else {
|
||||
ttgo->bl->adjust( 0 );
|
||||
ttgo->displaySleep();
|
||||
ttgo->closeBL();
|
||||
Serial.printf("go to standby\r\n");
|
||||
display_go_sleep( ttgo );
|
||||
ttgo->rtc->syncToRtc();
|
||||
if ( powermgm_get_event( POWERMGM_WIFI_ACTIVE ) ) wifictl_off();
|
||||
while( powermgm_get_event( POWERMGM_WIFI_ACTIVE | POWERMGM_WIFI_CONNECTED | POWERMGM_WIFI_OFF_REQUEST | POWERMGM_WIFI_ON_REQUEST | POWERMGM_WIFI_SCAN ) ) { yield(); }
|
||||
@@ -87,7 +102,10 @@ void powermgm_loop( TTGOClass *ttgo ) {
|
||||
if ( bma_get_config( BMA_STEPCOUNTER ) )
|
||||
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( 30 );
|
||||
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);
|
||||
@@ -95,10 +113,11 @@ void powermgm_loop( TTGOClass *ttgo ) {
|
||||
esp_light_sleep_start();
|
||||
}
|
||||
// clear event
|
||||
powermgm_clear_event( POWERMGM_PMU_BUTTON | POWERMGM_PMU_BATTERY | POWERMGM_BMA_WAKEUP );
|
||||
powermgm_clear_event( POWERMGM_PMU_BUTTON | POWERMGM_PMU_BATTERY | POWERMGM_BMA_WAKEUP | POWERMGM_STANDBY_REQUEST | POWERMGM_SILENCE_WAKEUP_REQUEST );
|
||||
}
|
||||
pmu_loop( ttgo );
|
||||
bma_loop( ttgo );
|
||||
display_loop( ttgo );
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -24,17 +24,19 @@
|
||||
|
||||
#include "TTGO.h"
|
||||
|
||||
#define POWERMGM_STANDBY _BV(0)
|
||||
#define POWERMGM_SILENCE_WAKEUP _BV(1)
|
||||
#define POWERMGM_PMU_BUTTON _BV(2)
|
||||
#define POWERMGM_PMU_BATTERY _BV(3)
|
||||
#define POWERMGM_PMU_ALARM _BV(4)
|
||||
#define POWERMGM_BMA_WAKEUP _BV(5)
|
||||
#define POWERMGM_WIFI_ON_REQUEST _BV(6)
|
||||
#define POWERMGM_WIFI_OFF_REQUEST _BV(7)
|
||||
#define POWERMGM_WIFI_ACTIVE _BV(8)
|
||||
#define POWERMGM_WIFI_SCAN _BV(9)
|
||||
#define POWERMGM_WIFI_CONNECTED _BV(10)
|
||||
#define POWERMGM_STANDBY _BV(0)
|
||||
#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_ACTIVE _BV(10)
|
||||
#define POWERMGM_WIFI_SCAN _BV(11)
|
||||
#define POWERMGM_WIFI_CONNECTED _BV(12)
|
||||
|
||||
/*
|
||||
* @brief setp power managment, coordinate managment beween CPU, wifictl, pmu, bma, display, backlight and lvgl
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
*/
|
||||
#include "config.h"
|
||||
#include "touch.h"
|
||||
#include "powermgm.h"
|
||||
|
||||
lv_indev_t *touch_indev = NULL;
|
||||
|
||||
@@ -37,8 +38,13 @@ static bool touch_getXY( int16_t &x, int16_t &y ) {
|
||||
TTGOClass *ttgo = TTGOClass::getWatch();
|
||||
TP_Point p;
|
||||
|
||||
// disable touch when we are in standby or silence wakeup
|
||||
if ( powermgm_get_event( POWERMGM_STANDBY | POWERMGM_SILENCE_WAKEUP ) ) {
|
||||
return( false );
|
||||
}
|
||||
|
||||
if ( !ttgo->touch->touched() ) {
|
||||
return false;
|
||||
return( false );
|
||||
}
|
||||
|
||||
p = ttgo->touch->getPoint();
|
||||
@@ -62,10 +68,10 @@ static bool touch_getXY( int16_t &x, int16_t &y ) {
|
||||
x = p.x;
|
||||
y = p.y;
|
||||
}
|
||||
return true;
|
||||
return( true );
|
||||
}
|
||||
|
||||
static bool touch_read(lv_indev_drv_t * drv, lv_indev_data_t*data) {
|
||||
data->state = touch_getXY(data->point.x, data->point.y) ? LV_INDEV_STATE_PR : LV_INDEV_STATE_REL;
|
||||
return false;
|
||||
return( false );
|
||||
}
|
||||
Reference in New Issue
Block a user