diff --git a/MicroPython_BUILD/components/micropython/esp32/modlvesp32.c b/MicroPython_BUILD/components/micropython/esp32/modlvesp32.c index 44f543f7..bc06218c 100644 --- a/MicroPython_BUILD/components/micropython/esp32/modlvesp32.c +++ b/MicroPython_BUILD/components/micropython/esp32/modlvesp32.c @@ -5,14 +5,13 @@ #include "py/obj.h" #include "py/runtime.h" -#include "py/binary.h" #include "libs/lvgl/lv_binding/lvgl/lvgl.h" #include "freertos/FreeRTOS.h" -#include "freertos/timers.h" +#include "freertos/task.h" +#include "esp_freertos_hooks.h" #include "esp_log.h" static const char TAG[] = "[LVGL]"; -static TimerHandle_t xTimer; STATIC mp_obj_t mp_lv_task_handler(mp_obj_t arg) { @@ -22,29 +21,38 @@ STATIC mp_obj_t mp_lv_task_handler(mp_obj_t arg) STATIC MP_DEFINE_CONST_FUN_OBJ_1(mp_lv_task_handler_obj, mp_lv_task_handler); -static void vTimerCallback(TimerHandle_t pxTimer) + +static void lv_task(void* param) +{ + while(1) + { + vTaskDelay(5); + mp_sched_schedule((mp_obj_t)&mp_lv_task_handler_obj, mp_const_none, NULL); + } +} + + + +static void lv_tick_task(void) { lv_tick_inc(portTICK_RATE_MS); - mp_sched_schedule((mp_obj_t)&mp_lv_task_handler_obj, mp_const_none,NULL); } +static TaskHandle_t lvglTaskHandle; STATIC mp_obj_t mp_init_lvesp32() { - lv_init(); + BaseType_t xReturned; - xTimer = xTimerCreate( - "lvgl_timer", - 1, // The timer period in ticks. - pdTRUE, // The timers will auto-reload themselves when they expire. - NULL, // User data passed to callback - vTimerCallback // Callback function - ); + lv_init(); - if (xTimer == NULL || xTimerStart( xTimer, 0 ) != pdPASS){ - ESP_LOGE(TAG, "Failed creating or starting LVGL timer!"); - } + esp_register_freertos_tick_hook(lv_tick_task); - return mp_const_none; + xReturned = xTaskCreate(lv_task, "LVGL Task", 4096, NULL, 5, &lvglTaskHandle); + if (xReturned != pdPASS){ + vTaskDelete(lvglTaskHandle); + ESP_LOGE(TAG, "Failed creating LVGL task!"); + } + return mp_const_none; } STATIC MP_DEFINE_CONST_FUN_OBJ_0(mp_init_lvesp32_obj, mp_init_lvesp32); @@ -54,7 +62,6 @@ STATIC const mp_rom_map_elem_t lvesp32_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_lvesp32) }, { MP_ROM_QSTR(MP_QSTR___init__), MP_ROM_PTR(&mp_init_lvesp32_obj) }, }; - STATIC MP_DEFINE_CONST_DICT ( mp_module_lvesp32_globals, diff --git a/MicroPython_BUILD/components/micropython/esp32/modules/axp202.py b/MicroPython_BUILD/components/micropython/esp32/modules/axp202.py index c9b9cd57..82bd6fdb 100644 --- a/MicroPython_BUILD/components/micropython/esp32/modules/axp202.py +++ b/MicroPython_BUILD/components/micropython/esp32/modules/axp202.py @@ -26,7 +26,6 @@ github:https://github.com/lewisxhe/AXP202X_Libraries Updated by Anodev https://github.com/OPHoperHPO ''' - import time from ustruct import unpack @@ -78,7 +77,6 @@ def __init__(self, i2c, address=None): self._irq = memoryview(self.buffer[0:5]) self.bus = i2c self.init_device() - self.threadIRQupdate = None def write_byte(self, reg, val): self.bytebuf[0] = val diff --git a/MicroPython_BUILD/components/micropython/esp32/modules/ttgo.py b/MicroPython_BUILD/components/micropython/esp32/modules/ttgo.py index eb89b05a..9de3b28c 100644 --- a/MicroPython_BUILD/components/micropython/esp32/modules/ttgo.py +++ b/MicroPython_BUILD/components/micropython/esp32/modules/ttgo.py @@ -1,28 +1,29 @@ # -*- coding: utf-8 -*- # Порт официальной библиотеки ttgo для часов LilyGo TTGO T-Watch 2020. # Автор: Nikita Selin (Anodev)[https://github.com/OPHoperHPO] +import gc import lvgl as lv -import lvgl_helper as lv_h -import lvesp32 import display from ft5206 import FT5206 import bma423 as BMA423 from pcf8563 import PCF8563 import axp202 -from machine import Pin, I2C, PWM +import lvgl_helper as lv_h +from machine import Pin, I2C, PWM, Timer class TTGO: def __init__(self): self.__i2c__ = I2C(scl=22, sda=21) + self.__i2c2__ = I2C(id=1, scl=32, sda=23, speed=400000) self.pmu = axp202.PMU(self.__i2c__) self.init_power() - self.rtc = PCF8563(self.__i2c__) self.tft = self.__init_display__() - self.bma = self.__init_bma__() - self.__i2c2__ = I2C(id=1, scl=32, sda=23, speed=400000) self.touch = FT5206(self.__i2c2__) self.motor = Motor() + self.rtc = PCF8563(self.__i2c__) + self.bma = self.__init_bma__() + self.ticker = Ticker() def __init_bma__(self): BMA423.init(self.__i2c__) @@ -31,14 +32,20 @@ def __init_bma__(self): def __init_display__(self): return Display(self.pmu) - def pmu_attach_interrupt(self, callback): + @staticmethod + def pmu_attach_interrupt(callback): irq = Pin(35, mode=Pin.IN, handler=callback, trigger=Pin.IRQ_FALLING) + return irq - def bma_attach_interrupt(self, callback): + @staticmethod + def bma_attach_interrupt(callback): irq = Pin(39, mode=Pin.IN, handler=callback, trigger=Pin.IRQ_RISING) + return irq - def rtc_attach_interrupt(self, rtc_callback): - Pin(37, mode=Pin.IN, handler=rtc_callback, trigger=Pin.IRQ_FALLING) + @staticmethod + def rtc_attach_interrupt(rtc_callback): + irq = Pin(37, mode=Pin.IN, handler=rtc_callback, trigger=Pin.IRQ_FALLING) + return irq def enable_audio_power(self, en=True): self.pmu.setLDO3Mode(1) @@ -46,21 +53,22 @@ def enable_audio_power(self, en=True): def lvgl_begin(self): lv.init() + self.ticker.init() disp_buf1 = lv.disp_buf_t() buf1_1 = bytes(240 * 10) - lv.disp_buf_init(disp_buf1, buf1_1, None, len(buf1_1) // 4) + disp_buf1.init(buf1_1, None, len(buf1_1) // 4) disp_drv = lv.disp_drv_t() - lv.disp_drv_init(disp_drv) + disp_drv.init() disp_drv.buffer = disp_buf1 disp_drv.flush_cb = lv_h.flush disp_drv.hor_res = 240 disp_drv.ver_res = 240 - lv.disp_drv_register(disp_drv) + disp_drv.register() indev_drv = lv.indev_drv_t() - lv.indev_drv_init(indev_drv) + indev_drv.init() indev_drv.type = lv.INDEV_TYPE.POINTER indev_drv.read_cb = self.touch.lvgl_touch_read - lv.indev_drv_register(indev_drv) + indev_drv.register() def init_power(self): # Change the button boot time to 4 seconds @@ -89,7 +97,7 @@ def __init__(self, pmu): tft = display.TFT() tft.init(tft.ST7789, width=240, invrot=3, rot=1, bgr=False, height=240, miso=2, mosi=19, clk=18, cs=5, dc=27, - speed=40000000, color_bits=tft.COLOR_BITS16, backl_pin=12, backl_on=1, splash= False) + speed=40000000, color_bits=tft.COLOR_BITS16, backl_pin=12, backl_on=1, splash=False) self.tft = tft self.pmu = pmu self.set_backlight_level(0) # Turn backlight off @@ -157,6 +165,38 @@ def __rgb_tuple2rgb_int__(self, rgb_tuple): return rgb_tuple[0] << 16 | rgb_tuple[1] << 8 | rgb_tuple[2] +class Ticker: + def __init__(self): + lv.init() + self.timer = Timer(1) + self.period = 15 + + def __cb__(self, timer): + lv.tick_inc(self.period) + lv.task_handler() + + def init(self): + self.timer.init(period=self.period, mode=self.timer.PERIODIC, callback=self.__cb__) + + def set_period(self, data=None): + if data: + self.period = int(data) + self.timer.period(int(data)) + else: + return self.period + + def resume(self): + self.timer.resume() + + def pause(self): + if self.timer.isrunning(): + self.timer.pause() + + def deinit(self): + if self.timer.isrunning(): + self.timer.deinit() + + class Motor: def __init__(self): self.pwm = PWM(4, freq=1000, duty=0) diff --git a/MicroPython_BUILD/sdkconfig b/MicroPython_BUILD/sdkconfig index 2a3466c3..e5a830dd 100644 --- a/MicroPython_BUILD/sdkconfig +++ b/MicroPython_BUILD/sdkconfig @@ -8,7 +8,7 @@ # CONFIG_TOOLPREFIX="xtensa-esp32-elf-" CONFIG_PYTHON="python3" -CONFIG_MAKE_WARN_UNDEFINED_VARIABLES=y +CONFIG_MAKE_WARN_UNDEFINED_VARIABLES= # # Bootloader config @@ -79,7 +79,7 @@ CONFIG_MONITOR_BAUD=115200 # # MicroPython # -CONFIG_MICROPY_HW_BOARD_NAME="LilyGO-TTGO-TWatch-2020" +CONFIG_MICROPY_HW_BOARD_NAME="LilyGo-T-Watch-2020-V1" CONFIG_MICROPY_HW_MCU_NAME="ESP32" CONFIG_MICROPY_TIMEZONE="GMT0BST" CONFIG_MICROPY_USE_OTA= @@ -105,12 +105,12 @@ CONFIG_MICROPY_GC_THRESHOLD_VALUE=90 CONFIG_MICROPY_SCHEDULER_DEPTH=8 CONFIG_MICROPY_PY_THREAD_GIL_VM_DIVISOR=32 CONFIG_MICROPY_RX_BUFFER_SIZE=1080 -CONFIG_MICROPY_USE_BOTH_CORES= +CONFIG_MICROPY_USE_BOTH_CORES=y CONFIG_MICROPY_TASK_PRIORITY=5 -CONFIG_MICROPY_STACK_SIZE=20 +CONFIG_MICROPY_STACK_SIZE=24 CONFIG_MICROPY_HEAP_SIZE=3072 -CONFIG_MICROPY_THREAD_MAX_THREADS=4 -CONFIG_MICROPY_THREAD_STACK_SIZE=4 +CONFIG_MICROPY_THREAD_MAX_THREADS=16 +CONFIG_MICROPY_THREAD_STACK_SIZE=6 CONFIG_MICROPY_USE_TELNET=y CONFIG_MICROPY_USE_WEBSERVER= CONFIG_MICROPY_USE_FTPSERVER=y @@ -140,11 +140,10 @@ CONFIG_MICROPY_USE_LVGL=y CONFIG_MICROPY_USE_EPD= CONFIG_MICROPY_USE_EVE= CONFIG_MICROPY_USE_BMA423=y -CONFIG_MICROPY_USE_GSM= -CONFIG_MICROPY_USE_GPS= +CONFIG_MICROPY_USE_GSM=y +CONFIG_MICROPY_USE_GPS=y +CONFIG_MICROPY_GPS_SERVICE_STACK=3072 CONFIG_MICROPY_USE_ETHERNET= -CONFIG_MICROPY_USE_BLUETOOTH= -CONFIG_MICROPY_USE_RFCOMM=y CONFIG_MICROPY_USE_MDNS=y CONFIG_MICROPY_USE_REQUESTS=y CONFIG_MICROPY_USE_CURL=y @@ -202,8 +201,8 @@ CONFIG_PARTITION_TABLE_MD5=y # # Compiler options # -CONFIG_OPTIMIZATION_LEVEL_DEBUG= -CONFIG_OPTIMIZATION_LEVEL_RELEASE=y +CONFIG_OPTIMIZATION_LEVEL_DEBUG=y +CONFIG_OPTIMIZATION_LEVEL_RELEASE= CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y CONFIG_OPTIMIZATION_ASSERTIONS_SILENT= CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED= @@ -231,41 +230,9 @@ CONFIG_AWS_IOT_SDK= # # Bluetooth # -CONFIG_BT_ENABLED=y -CONFIG_BTDM_CONTROLLER_PINNED_TO_CORE_0=y -CONFIG_BTDM_CONTROLLER_PINNED_TO_CORE_1= +CONFIG_BT_ENABLED= CONFIG_BTDM_CONTROLLER_PINNED_TO_CORE=0 -CONFIG_BTDM_CONTROLLER_HCI_MODE_VHCI=y -CONFIG_BTDM_CONTROLLER_HCI_MODE_UART_H4= - -# -# MODEM SLEEP Options -# -CONFIG_BTDM_CONTROLLER_MODEM_SLEEP= -CONFIG_BLUEDROID_ENABLED=y -CONFIG_BLUEDROID_PINNED_TO_CORE_0=y -CONFIG_BLUEDROID_PINNED_TO_CORE_1= -CONFIG_BLUEDROID_PINNED_TO_CORE=0 -CONFIG_BTC_TASK_STACK_SIZE=3072 -CONFIG_BLUEDROID_MEM_DEBUG= -CONFIG_CLASSIC_BT_ENABLED=y -CONFIG_A2DP_ENABLE= -CONFIG_BT_SPP_ENABLED=y -CONFIG_HFP_ENABLE= -CONFIG_GATTS_ENABLE=y -CONFIG_GATTC_ENABLE=y -CONFIG_GATTC_CACHE_NVS_FLASH= -CONFIG_BLE_SMP_ENABLE= -CONFIG_BT_STACK_NO_LOG=y -CONFIG_BT_ACL_CONNECTIONS=4 -CONFIG_BT_ALLOCATION_FROM_SPIRAM_FIRST=y -CONFIG_BT_BLE_DYNAMIC_ENV_MEMORY=y -CONFIG_BLE_HOST_QUEUE_CONGESTION_CHECK= -CONFIG_BLE_SCAN_DUPLICATE=y -CONFIG_DUPLICATE_SCAN_CACHE_SIZE=20 -CONFIG_BLE_MESH_SCAN_DUPLICATE_EN= -CONFIG_SMP_ENABLE=y -CONFIG_BT_RESERVE_DRAM=0x10000 +CONFIG_BT_RESERVE_DRAM=0 # # Driver configurations @@ -318,7 +285,7 @@ CONFIG_TWO_UNIVERSAL_MAC_ADDRESS= CONFIG_FOUR_UNIVERSAL_MAC_ADDRESS=y CONFIG_NUMBER_OF_UNIVERSAL_MAC_ADDRESS=4 CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32 -CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2304 +CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2048 CONFIG_MAIN_TASK_STACK_SIZE=3584 CONFIG_IPC_TASK_STACK_SIZE=1024 CONFIG_TIMER_TASK_STACK_SIZE=3584 @@ -373,6 +340,7 @@ CONFIG_ESP32_XTAL_FREQ_26= CONFIG_ESP32_XTAL_FREQ_AUTO=y CONFIG_ESP32_XTAL_FREQ=0 CONFIG_DISABLE_BASIC_ROM_CONSOLE= +CONFIG_NO_BLOBS= CONFIG_ESP_TIMER_PROFILING= CONFIG_COMPATIBLE_PRE_V2_1_BOOTLOADERS= CONFIG_ESP_ERR_TO_NAME_LOOKUP=y @@ -380,11 +348,6 @@ CONFIG_ESP_ERR_TO_NAME_LOOKUP=y # # Wi-Fi # -CONFIG_SW_COEXIST_ENABLE=y -CONFIG_SW_COEXIST_PREFERENCE_WIFI= -CONFIG_SW_COEXIST_PREFERENCE_BT= -CONFIG_SW_COEXIST_PREFERENCE_BALANCE=y -CONFIG_SW_COEXIST_PREFERENCE_VALUE=2 CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=8 CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=16 CONFIG_ESP32_WIFI_STATIC_TX_BUFFER=y @@ -532,7 +495,7 @@ CONFIG_LOG_COLORS=y CONFIG_L2_TO_L3_COPY= CONFIG_LWIP_IRAM_OPTIMIZATION= CONFIG_LWIP_MAX_SOCKETS=8 -CONFIG_USE_ONLY_LWIP_SELECT=y +CONFIG_USE_ONLY_LWIP_SELECT= CONFIG_LWIP_SO_REUSE=y CONFIG_LWIP_SO_REUSE_RXTOALL=y CONFIG_LWIP_SO_RCVBUF= diff --git a/python_examples/lvgl_PEK_sleep_example.py b/python_examples/lvgl_PEK_sleep_example.py index 981a4268..3bef3068 100644 --- a/python_examples/lvgl_PEK_sleep_example.py +++ b/python_examples/lvgl_PEK_sleep_example.py @@ -1,16 +1,12 @@ -import time -import ttgo import lvgl as lv import machine +import ttgo + + def axp_callback(pin): power.clearIRQ() - for i in reversed(range(5, 0)): - text_label.set_text("Go to sleep after {} seconds".format(i)) - time.sleep(1) - tft.clear() - text_label.set_text("Sleep now...") - time.sleep(2) + print("PEK was pressed! Go to sleep!!!!") watch.tft.backlight_fade(0) watch.tft.display_sleep() watch.power_off() @@ -19,27 +15,31 @@ def axp_callback(pin): power.clearIRQ() machine.deepsleep() -rtc = machine.RTC() + +# Init watch watch = ttgo.TTGO() +power = watch.pmu +tft = watch.tft + +rtc = machine.RTC() # Init micropython RTC module + +# Init lvgl +lv.init() watch.lvgl_begin() +# Init interface scr = lv.obj() win = lv.win(scr) win.set_title("PowerKey Sleep Example") text_label = lv.label(win) -text_label.set_text("Wait for the PEKKey interrupt to come...") - -watch.tft.backlight_fade(100) - -tft = watch.tft.tft -power = watch.pmu +text_label.set_text("Wait for the PEKKey\n interrupt to come...") +lv.scr_load(scr) +# Init irq watch.pmu_attach_interrupt(axp_callback) power.enableIRQ(ttgo.axp202.AXP202_PEK_SHORTPRESS_IRQ, True) +power.clearIRQ() -lv.scr_load(scr) - -while True: - power.clearIRQ() - +# Enable backlight +watch.tft.backlight_fade(100)