diff --git a/platformio.ini b/platformio.ini index 7b50617..4fc3701 100644 --- a/platformio.ini +++ b/platformio.ini @@ -14,10 +14,11 @@ board = ttgo-t-watch framework = arduino board_build.f_flash = 80000000L monitor_speed = 115200 +monitor_filters = + default + esp32_exception_decoder build_flags = -; -DCORE_DEBUG_LEVEL=3 - -DBOARD_HAS_PSRAM - -mfix-esp32-psram-cache-issue + -DCORE_DEBUG_LEVEL=3 src_filter = +<*> lib_deps = @@ -25,5 +26,4 @@ lib_deps = ESP Async WebServer@>=1.2.0 AsyncTCP@>=1.1.1 ArduinoJson@>=6.15.2 - ESP32SSPD@>=1.1.0 -;monitor_filters= default, esp32_exception_decoder \ No newline at end of file + ESP32SSPD@>=1.1.0 \ No newline at end of file diff --git a/src/app/weather/weather.cpp b/src/app/weather/weather.cpp index 5ed1beb..6f6ff2f 100644 --- a/src/app/weather/weather.cpp +++ b/src/app/weather/weather.cpp @@ -36,6 +36,7 @@ #include "gui/statusbar.h" #include "gui/keyboard.h" #include "hardware/motor.h" +#include "hardware/powermgm.h" EventGroupHandle_t weather_widget_event_handle = NULL; TaskHandle_t _weather_widget_sync_Task; diff --git a/src/app/weather/weather_forecast.cpp b/src/app/weather/weather_forecast.cpp index 0c220db..ce1e090 100644 --- a/src/app/weather/weather_forecast.cpp +++ b/src/app/weather/weather_forecast.cpp @@ -33,6 +33,8 @@ #include "gui/statusbar.h" #include "gui/keyboard.h" +#include "hardware/powermgm.h" + EventGroupHandle_t weather_forecast_event_handle = NULL; TaskHandle_t _weather_forecast_sync_Task; void weather_forecast_sync_Task( void * pvParameters ); diff --git a/src/config.h b/src/config.h index 901daa4..8a62517 100644 --- a/src/config.h +++ b/src/config.h @@ -26,11 +26,12 @@ #define LILYGO_WATCH_2020_V1 //To use T-Watch2020, please uncomment this line #define LILYGO_WATCH_LVGL //To use LVGL, you need to enable the macro LVGL + #define TWATCH_USE_PSRAM_ALLOC_LVGL #include /* * firmeware version string */ - #define __FIRMWARE__ "2020080702" + #define __FIRMWARE__ "2020081004" #endif // _CONFIG_H diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index e1a463b..725f6f3 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -88,7 +88,12 @@ void gui_setup(void) * */ void gui_loop( TTGOClass *ttgo ) { - // if we run in silence mode + // if we run in silence mode + if ( powermgm_get_event( POWERMGM_SILENCE_WAKEUP ) &&!powermgm_get_event( POWERMGM_STANDBY ) ) { + log_e("error while silence standby"); + while(1); + } + if ( powermgm_get_event( POWERMGM_SILENCE_WAKEUP ) ) { if ( lv_disp_get_inactive_time(NULL) < display_get_timeout() * 1000 ) { lv_task_handler(); diff --git a/src/gui/mainbar/setup_tile/update/update.cpp b/src/gui/mainbar/setup_tile/update/update.cpp index 80321a5..33634e4 100644 --- a/src/gui/mainbar/setup_tile/update/update.cpp +++ b/src/gui/mainbar/setup_tile/update/update.cpp @@ -33,6 +33,7 @@ #include "gui/mainbar/setup_tile/setup.h" #include "gui/statusbar.h" #include "hardware/display.h" +#include "hardware/powermgm.h" EventGroupHandle_t update_event_handle = NULL; TaskHandle_t _update_Task; diff --git a/src/gui/mainbar/setup_tile/wlan_settings/wlan_settings.cpp b/src/gui/mainbar/setup_tile/wlan_settings/wlan_settings.cpp index 590f73d..f80c16c 100644 --- a/src/gui/mainbar/setup_tile/wlan_settings/wlan_settings.cpp +++ b/src/gui/mainbar/setup_tile/wlan_settings/wlan_settings.cpp @@ -292,8 +292,10 @@ static void exit_wifi_password_event_cb( lv_obj_t * obj, lv_event_t event ) { } lv_obj_t *wifi_autoon_onoff; +lv_obj_t *wifi_webserver_onoff; static void wps_start_event_handler( lv_obj_t * obj, lv_event_t event ); static void wifi_autoon_onoff_event_handler( lv_obj_t * obj, lv_event_t event ); +static void wifi_webserver_onoff_event_handler( lv_obj_t * obj, lv_event_t event ); void wlan_setup_tile_setup( uint32_t wifi_setup_tile_num ) { // get an app tile and copy mainstyle @@ -334,9 +336,25 @@ void wlan_setup_tile_setup( uint32_t wifi_setup_tile_num ) { lv_label_set_text( wifi_autoon_label, "enable on wakeup"); lv_obj_align( wifi_autoon_label, wifi_autoon_onoff_cont, LV_ALIGN_IN_LEFT_MID, 5, 0 ); + lv_obj_t *wifi_webserver_onoff_cont = lv_obj_create( wifi_setup_tile, NULL ); + lv_obj_set_size(wifi_webserver_onoff_cont, LV_HOR_RES_MAX , 40); + lv_obj_add_style( wifi_webserver_onoff_cont, LV_OBJ_PART_MAIN, &wifi_setup_style ); + lv_obj_align( wifi_webserver_onoff_cont, wifi_autoon_onoff_cont, LV_ALIGN_OUT_BOTTOM_MID, 0, 0 ); + + wifi_webserver_onoff = lv_switch_create( wifi_setup_tile, NULL ); + lv_obj_add_protect( wifi_webserver_onoff, LV_PROTECT_CLICK_FOCUS); + lv_obj_add_style( wifi_webserver_onoff, LV_SWITCH_PART_INDIC, mainbar_get_switch_style() ); + lv_switch_off( wifi_webserver_onoff, LV_ANIM_ON ); + lv_obj_align( wifi_webserver_onoff, wifi_webserver_onoff_cont, LV_ALIGN_IN_RIGHT_MID, -5, 0 ); + lv_obj_set_event_cb( wifi_webserver_onoff, wifi_webserver_onoff_event_handler ); + lv_obj_t *wifi_webserver_label = lv_label_create( wifi_webserver_onoff_cont, NULL); + lv_obj_add_style( wifi_webserver_label, LV_OBJ_PART_MAIN, &wifi_setup_style ); + lv_label_set_text( wifi_webserver_label, "enable webserver"); + lv_obj_align( wifi_webserver_label, wifi_webserver_onoff_cont, LV_ALIGN_IN_LEFT_MID, 5, 0 ); + lv_obj_t *wps_btn = lv_btn_create( wifi_setup_tile, NULL); lv_obj_set_event_cb( wps_btn, wps_start_event_handler ); - lv_obj_align( wps_btn, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, -40); + lv_obj_align( wps_btn, wifi_webserver_onoff_cont, LV_ALIGN_OUT_BOTTOM_MID, 0, 10); lv_obj_t *wps_btn_label = lv_label_create( wps_btn, NULL ); lv_label_set_text( wps_btn_label, "start WPS"); @@ -344,6 +362,11 @@ void wlan_setup_tile_setup( uint32_t wifi_setup_tile_num ) { lv_switch_on( wifi_autoon_onoff, LV_ANIM_OFF); else lv_switch_off( wifi_autoon_onoff, LV_ANIM_OFF); + + if ( wifictl_get_webserver() ) + lv_switch_on( wifi_webserver_onoff, LV_ANIM_OFF); + else + lv_switch_off( wifi_webserver_onoff, LV_ANIM_OFF); } static void wps_start_event_handler( lv_obj_t * obj, lv_event_t event ) { @@ -372,4 +395,11 @@ static void wifi_autoon_onoff_event_handler( lv_obj_t * obj, lv_event_t event ) case (LV_EVENT_VALUE_CHANGED): wifictl_set_autoon( lv_switch_get_state( obj ) ); break; } +} + +static void wifi_webserver_onoff_event_handler( lv_obj_t * obj, lv_event_t event ) { + switch (event) { + case (LV_EVENT_VALUE_CHANGED): wifictl_set_webserver( lv_switch_get_state( obj ) ); + break; + } } \ No newline at end of file diff --git a/src/gui/screenshot.cpp b/src/gui/screenshot.cpp index 6ded53c..07a2321 100644 --- a/src/gui/screenshot.cpp +++ b/src/gui/screenshot.cpp @@ -28,6 +28,10 @@ static void screenshot_disp_flush( lv_disp_drv_t *disp_drv, const lv_area_t *are void screenshot_setup( void ) { png = (uint16_t*)ps_malloc( LV_HOR_RES_MAX * LV_VER_RES_MAX * sizeof( lv_color_t ) ); + if ( png == NULL ) { + log_e("error memory alloc"); + while(1); + } } void screenshot_take( void ) { diff --git a/src/hardware/bma.cpp b/src/hardware/bma.cpp index 14ced08..5646b12 100644 --- a/src/hardware/bma.cpp +++ b/src/hardware/bma.cpp @@ -72,7 +72,7 @@ void bma_setup( TTGOClass *ttgo ) { void bma_standby( void ) { TTGOClass *ttgo = TTGOClass::getWatch(); - log_i("standby"); + log_i("go standby"); if ( bma_get_config( BMA_STEPCOUNTER ) ) ttgo->bma->enableStepCountInterrupt( false ); @@ -82,7 +82,7 @@ void bma_standby( void ) { void bma_wakeup( void ) { TTGOClass *ttgo = TTGOClass::getWatch(); - log_i("wakeup"); + log_i("go wakeup"); if ( bma_get_config( BMA_STEPCOUNTER ) ) ttgo->bma->enableStepCountInterrupt( true ); @@ -114,7 +114,6 @@ void IRAM_ATTR bma_irq( void ) { { portYIELD_FROM_ISR (); } - setCpuFrequencyMhz( 240 ); } /* @@ -125,7 +124,9 @@ void bma_loop( TTGOClass *ttgo ) { * handle IRQ event */ if ( xEventGroupGetBitsFromISR( bma_event_handle ) & BMA_EVENT_INT ) { - while( !ttgo->bma->readInterrupt() ); + setCpuFrequencyMhz(240); + + while( !ttgo->bma->readInterrupt() ); if ( ttgo->bma->isDoubleClick() ) { powermgm_set_event( POWERMGM_BMA_WAKEUP ); xEventGroupClearBitsFromISR( bma_event_handle, BMA_EVENT_INT ); diff --git a/src/hardware/display.cpp b/src/hardware/display.cpp index 0340205..f32cd8b 100644 --- a/src/hardware/display.cpp +++ b/src/hardware/display.cpp @@ -69,7 +69,7 @@ void display_loop( TTGOClass *ttgo ) { void display_standby( void ) { TTGOClass *ttgo = TTGOClass::getWatch(); - log_i("standby"); + log_i("go standby"); ttgo->bl->adjust( 0 ); ttgo->displaySleep(); ttgo->closeBL(); @@ -82,7 +82,7 @@ void display_wakeup( void ) { // normal wake up from standby if ( powermgm_get_event( POWERMGM_PMU_BUTTON | POWERMGM_PMU_BATTERY | POWERMGM_BMA_WAKEUP ) ) { - log_i("wakeup"); + log_i("go wakeup"); ttgo->openBL(); ttgo->displayWakeup(); ttgo->bl->adjust( 0 ); @@ -92,7 +92,7 @@ void display_wakeup( void ) { } // silence wakeup request from standby else if ( powermgm_get_event( POWERMGM_SILENCE_WAKEUP_REQUEST ) ) { - log_i("silence wakeup"); + log_i("go silence wakeup"); ttgo->openBL(); ttgo->displayWakeup(); ttgo->bl->adjust( 0 ); diff --git a/src/hardware/pmu.cpp b/src/hardware/pmu.cpp index 37417fa..6fd2ac5 100644 --- a/src/hardware/pmu.cpp +++ b/src/hardware/pmu.cpp @@ -81,11 +81,11 @@ void pmu_standby( void ) { if ( pmu_get_experimental_power_save() ) { ttgo->power->setDCDC3Voltage( 2700 ); - log_i("enable 2.7V standby voltage"); + log_i("go standby, enable 2.7V standby voltage"); } else { ttgo->power->setDCDC3Voltage( 3000 ); - log_i("enable 3.0V standby voltage"); + log_i("go standby, enable 3.0V standby voltage"); } ttgo->power->setPowerOutPut(AXP202_LDO3, AXP202_OFF ); } @@ -95,11 +95,11 @@ void pmu_wakeup( void ) { if ( pmu_get_experimental_power_save() ) { ttgo->power->setDCDC3Voltage( 3000 ); - log_i("enable 3.0V voltage"); + log_i("go wakeup, enable 3.0V voltage"); } else { ttgo->power->setDCDC3Voltage( 3300 ); - log_i("enable 3.3V voltage"); + log_i("go wakeup, enable 3.3V voltage"); } ttgo->power->clearTimerStatus(); @@ -174,6 +174,11 @@ void pmu_loop( TTGOClass *ttgo ) { */ if ( xEventGroupGetBitsFromISR( pmu_event_handle ) & PMU_EVENT_AXP_INT ) { setCpuFrequencyMhz(240); + 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; + } ttgo->power->readIRQ(); if (ttgo->power->isVbusPlugInIRQ()) { diff --git a/src/hardware/powermgm.cpp b/src/hardware/powermgm.cpp index 56c3fa5..ea0cf1f 100644 --- a/src/hardware/powermgm.cpp +++ b/src/hardware/powermgm.cpp @@ -42,6 +42,7 @@ #include "gui/mainbar/mainbar.h" EventGroupHandle_t powermgm_status = NULL; +portMUX_TYPE powermgmMux = portMUX_INITIALIZER_UNLOCKED; /* * @@ -83,16 +84,26 @@ void powermgm_loop( TTGOClass *ttgo ) { display_wakeup(); timesyncToSystem(); - ttgo->startLvglTick(); - lv_disp_trig_activity(NULL); wifictl_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); } 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(); mainbar_jump_to_maintile( LV_ANIM_OFF ); - ttgo->stopLvglTick(); timesyncToRTC(); bma_standby(); @@ -126,19 +137,26 @@ void powermgm_loop( TTGOClass *ttgo ) { * */ void powermgm_set_event( EventBits_t bits ) { + portENTER_CRITICAL_ISR(&powermgmMux); xEventGroupSetBits( powermgm_status, bits ); + portEXIT_CRITICAL_ISR(&powermgmMux); } /* * */ void powermgm_clear_event( EventBits_t bits ) { + portENTER_CRITICAL_ISR(&powermgmMux); xEventGroupClearBits( powermgm_status, bits ); + portEXIT_CRITICAL_ISR(&powermgmMux); } /* * */ EventBits_t powermgm_get_event( EventBits_t bits ) { - return( xEventGroupGetBits( powermgm_status ) & bits ); + portENTER_CRITICAL_ISR(&powermgmMux); + EventBits_t temp = xEventGroupGetBits( powermgm_status ) & bits; + portEXIT_CRITICAL_ISR(&powermgmMux); + return( temp ); } diff --git a/src/hardware/timesync.cpp b/src/hardware/timesync.cpp index 9698b0e..f6b6354 100644 --- a/src/hardware/timesync.cpp +++ b/src/hardware/timesync.cpp @@ -23,6 +23,7 @@ #include #include "config.h" #include "timesync.h" +#include "powermgm.h" EventGroupHandle_t time_event_handle = NULL; TaskHandle_t _timesync_Task; diff --git a/src/hardware/wifictl.cpp b/src/hardware/wifictl.cpp index d5dcd3d..eb79b3a 100644 --- a/src/hardware/wifictl.cpp +++ b/src/hardware/wifictl.cpp @@ -124,7 +124,9 @@ void wifictl_setup( void ) { // label.concat('\n'); // label.concat(WiFi.localIPv6().toString()); statusbar_wifi_set_state( true, label.c_str() ); - asyncwebserver_setup(); + if ( wifictl_config.webserver ) { + asyncwebserver_start(); + } lv_obj_invalidate( lv_scr_act() ); }, WiFiEvent_t::SYSTEM_EVENT_STA_GOT_IP ); @@ -144,10 +146,11 @@ void wifictl_setup( void ) { }, WiFiEvent_t::SYSTEM_EVENT_WIFI_READY ); WiFi.onEvent([](WiFiEvent_t event, WiFiEventInfo_t info) { - powermgm_clear_event( POWERMGM_WIFI_ACTIVE | POWERMGM_WIFI_CONNECTED | POWERMGM_WIFI_OFF_REQUEST | POWERMGM_WIFI_ON_REQUEST | POWERMGM_WIFI_SCAN | POWERMGM_WIFI_WPS_REQUEST ); statusbar_hide_icon( STATUSBAR_WIFI ); statusbar_wifi_set_state( false, "" ); lv_obj_invalidate( lv_scr_act() ); + asyncwebserver_end(); + powermgm_clear_event( POWERMGM_WIFI_ACTIVE | POWERMGM_WIFI_CONNECTED | POWERMGM_WIFI_OFF_REQUEST | POWERMGM_WIFI_ON_REQUEST | POWERMGM_WIFI_SCAN | POWERMGM_WIFI_WPS_REQUEST ); }, WiFiEvent_t::SYSTEM_EVENT_STA_STOP ); WiFi.onEvent([](WiFiEvent_t event, WiFiEventInfo_t info) { @@ -222,6 +225,15 @@ void wifictl_set_autoon( bool autoon ) { wifictl_config.autoon = autoon; wifictl_save_config(); } + +bool wifictl_get_webserver( void ) { + return( wifictl_config.webserver ); +} + +void wifictl_set_webserver( bool webserver ) { + wifictl_config.webserver = webserver; + wifictl_save_config(); +} /* * */ @@ -329,6 +341,7 @@ void wifictl_on( void ) { if ( wifi_init == false ) return; + log_i("request wifictl on"); if ( powermgm_get_event( POWERMGM_WIFI_OFF_REQUEST ) || powermgm_get_event( POWERMGM_WIFI_ON_REQUEST ) ) { return; } @@ -345,6 +358,7 @@ void wifictl_off( void ) { if ( wifi_init == false ) return; + log_i("request wifictl off"); if ( powermgm_get_event( POWERMGM_WIFI_OFF_REQUEST ) || powermgm_get_event( POWERMGM_WIFI_ON_REQUEST )) { return; } @@ -355,15 +369,19 @@ void wifictl_off( void ) { } void wifictl_standby( void ) { - log_i("standby"); - 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 | POWERMGM_WIFI_WPS_REQUEST ) ) { yield(); } + log_i("request wifictl standby"); + wifictl_off(); + while( powermgm_get_event( POWERMGM_WIFI_ACTIVE | POWERMGM_WIFI_CONNECTED | POWERMGM_WIFI_OFF_REQUEST | POWERMGM_WIFI_ON_REQUEST | POWERMGM_WIFI_SCAN | POWERMGM_WIFI_WPS_REQUEST ) ) { + yield(); + } + log_i("request wifictl standby done"); } void wifictl_wakeup( void ) { if ( wifictl_config.autoon ) { - log_i("wakeup"); + log_i("request wifictl wakeup"); wifictl_on(); + log_i("request wifictl wakeup done"); } } @@ -411,6 +429,7 @@ void wifictl_Task( void * pvParameters ) { lv_obj_invalidate( lv_scr_act() ); WiFi.mode( WIFI_STA ); powermgm_clear_event( POWERMGM_WIFI_OFF_REQUEST | POWERMGM_WIFI_ACTIVE | POWERMGM_WIFI_CONNECTED | POWERMGM_WIFI_SCAN | POWERMGM_WIFI_ON_REQUEST ); + log_i("request wifictl on done"); } else if ( powermgm_get_event( POWERMGM_WIFI_OFF_REQUEST ) ) { statusbar_wifi_set_state( false, "" ); @@ -418,6 +437,7 @@ void wifictl_Task( void * pvParameters ) { 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 ); + log_i("request wifictl off done"); } vTaskSuspend( _wifictl_Task ); } diff --git a/src/hardware/wifictl.h b/src/hardware/wifictl.h index c0cd58a..d1fe7f4 100644 --- a/src/hardware/wifictl.h +++ b/src/hardware/wifictl.h @@ -40,6 +40,7 @@ typedef struct { bool autoon = true; + bool webserver = true; } wifictl_config_t; /* @@ -82,5 +83,7 @@ bool wifictl_get_autoon( void ); void wifictl_set_autoon( bool autoon ); void wifictl_start_wps( void ); + bool wifictl_get_webserver( void ); + void wifictl_set_webserver( bool webserver ); #endif // _WIFICTL_H \ No newline at end of file diff --git a/src/my-ttgo-watch.ino b/src/my-ttgo-watch.ino index 7e9e850..73c474c 100644 --- a/src/my-ttgo-watch.ino +++ b/src/my-ttgo-watch.ino @@ -91,6 +91,7 @@ void setup() void loop() { + delay(10); gui_loop( ttgo ); powermgm_loop( ttgo ); } diff --git a/src/webserver/webserver.cpp b/src/webserver/webserver.cpp index a32f80b..5d53501 100644 --- a/src/webserver/webserver.cpp +++ b/src/webserver/webserver.cpp @@ -77,7 +77,7 @@ void handleUpdate( AsyncWebServerRequest *request, const String& filename, size_ /* * */ -void asyncwebserver_setup(void){ +void asyncwebserver_start(void){ asyncserver.on("/info", HTTP_GET, [](AsyncWebServerRequest *request) { String message("Firmwarestand: " __DATE__ " " __TIME__ "\nGCC-Version: " __VERSION__ "\n"); @@ -217,4 +217,12 @@ void asyncwebserver_setup(void){ SSDP.begin(); asyncserver.begin(); + + log_i("enable webserver and ssdp"); +} + +void asyncwebserver_end(void) { + SSDP.end(); + asyncserver.end(); + log_i("disable webserver and ssdp"); } \ No newline at end of file diff --git a/src/webserver/webserver.h b/src/webserver/webserver.h index 4e0c855..198dba0 100644 --- a/src/webserver/webserver.h +++ b/src/webserver/webserver.h @@ -33,6 +33,7 @@ /* * @brief setup builtin webserver, call after first wifi-connection. otherwise esp32 will crash */ - void asyncwebserver_setup(void); + void asyncwebserver_start(void); + void asyncwebserver_end(void); #endif // _ASYNCWEBSERVER_H \ No newline at end of file diff --git a/ttgo-t-watch2020_v1.ino.bin b/ttgo-t-watch2020_v1.ino.bin index d9b71f1..cae6940 100644 Binary files a/ttgo-t-watch2020_v1.ino.bin and b/ttgo-t-watch2020_v1.ino.bin differ diff --git a/ttgo-t-watch2020_v1.version.json b/ttgo-t-watch2020_v1.version.json index df38553..c5d7709 100644 --- a/ttgo-t-watch2020_v1.version.json +++ b/ttgo-t-watch2020_v1.version.json @@ -1 +1 @@ -{"version":"2020080702","host":"http://www.neo-guerillaz.de","file":"ttgo-t-watch2020_v1.ino.bin"} +{"version":"2020081001","host":"http://www.neo-guerillaz.de","file":"ttgo-t-watch2020_v1.ino.bin"}