From 7545e02a8e9963e086387edcb4792e83596b645f Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Wed, 26 Oct 2022 10:05:37 -0500 Subject: [PATCH 01/12] add feather rp2040 scorpio --- .../adafruit_feather_rp2040_scorpio/board.c | 29 +++++++++++ .../mpconfigboard.h | 14 ++++++ .../mpconfigboard.mk | 9 ++++ .../pico-sdk-configboard.h | 4 ++ .../adafruit_feather_rp2040_scorpio/pins.c | 48 +++++++++++++++++++ 5 files changed, 104 insertions(+) create mode 100644 ports/raspberrypi/boards/adafruit_feather_rp2040_scorpio/board.c create mode 100644 ports/raspberrypi/boards/adafruit_feather_rp2040_scorpio/mpconfigboard.h create mode 100644 ports/raspberrypi/boards/adafruit_feather_rp2040_scorpio/mpconfigboard.mk create mode 100644 ports/raspberrypi/boards/adafruit_feather_rp2040_scorpio/pico-sdk-configboard.h create mode 100644 ports/raspberrypi/boards/adafruit_feather_rp2040_scorpio/pins.c diff --git a/ports/raspberrypi/boards/adafruit_feather_rp2040_scorpio/board.c b/ports/raspberrypi/boards/adafruit_feather_rp2040_scorpio/board.c new file mode 100644 index 0000000000..331653173e --- /dev/null +++ b/ports/raspberrypi/boards/adafruit_feather_rp2040_scorpio/board.c @@ -0,0 +1,29 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2021 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "supervisor/board.h" + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/raspberrypi/boards/adafruit_feather_rp2040_scorpio/mpconfigboard.h b/ports/raspberrypi/boards/adafruit_feather_rp2040_scorpio/mpconfigboard.h new file mode 100644 index 0000000000..94b6fcee7b --- /dev/null +++ b/ports/raspberrypi/boards/adafruit_feather_rp2040_scorpio/mpconfigboard.h @@ -0,0 +1,14 @@ +#define MICROPY_HW_BOARD_NAME "Adafruit Feather RP2040 Scorpio" +#define MICROPY_HW_MCU_NAME "rp2040" + +#define MICROPY_HW_NEOPIXEL (&pin_GPIO16) + +#define DEFAULT_I2C_BUS_SCL (&pin_GPIO3) +#define DEFAULT_I2C_BUS_SDA (&pin_GPIO2) + +#define DEFAULT_SPI_BUS_SCK (&pin_GPIO14) +#define DEFAULT_SPI_BUS_MOSI (&pin_GPIO15) +#define DEFAULT_SPI_BUS_MISO (&pin_GPIO8) + +#define DEFAULT_UART_BUS_RX (&pin_GPIO1) +#define DEFAULT_UART_BUS_TX (&pin_GPIO0) diff --git a/ports/raspberrypi/boards/adafruit_feather_rp2040_scorpio/mpconfigboard.mk b/ports/raspberrypi/boards/adafruit_feather_rp2040_scorpio/mpconfigboard.mk new file mode 100644 index 0000000000..db06fd728b --- /dev/null +++ b/ports/raspberrypi/boards/adafruit_feather_rp2040_scorpio/mpconfigboard.mk @@ -0,0 +1,9 @@ +USB_VID = 0x239A +USB_PID = 0x8122 +USB_PRODUCT = "Feather RP2040 Scorpio" +USB_MANUFACTURER = "Adafruit" + +CHIP_VARIANT = RP2040 +CHIP_FAMILY = rp2 + +EXTERNAL_FLASH_DEVICES = "GD25Q64C,W25Q64JVxQ" diff --git a/ports/raspberrypi/boards/adafruit_feather_rp2040_scorpio/pico-sdk-configboard.h b/ports/raspberrypi/boards/adafruit_feather_rp2040_scorpio/pico-sdk-configboard.h new file mode 100644 index 0000000000..a41131dd22 --- /dev/null +++ b/ports/raspberrypi/boards/adafruit_feather_rp2040_scorpio/pico-sdk-configboard.h @@ -0,0 +1,4 @@ +// Put board-specific pico-sdk definitions here. This file must exist. + +// Allow extra time for xosc to start. +#define PICO_XOSC_STARTUP_DELAY_MULTIPLIER 64 diff --git a/ports/raspberrypi/boards/adafruit_feather_rp2040_scorpio/pins.c b/ports/raspberrypi/boards/adafruit_feather_rp2040_scorpio/pins.c new file mode 100644 index 0000000000..9bf3a71e25 --- /dev/null +++ b/ports/raspberrypi/boards/adafruit_feather_rp2040_scorpio/pins.c @@ -0,0 +1,48 @@ +#include "shared-bindings/board/__init__.h" + +STATIC const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_GPIO28) }, + { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_GPIO29) }, + { MP_ROM_QSTR(MP_QSTR_D24), MP_ROM_PTR(&pin_GPIO24) }, + { MP_ROM_QSTR(MP_QSTR_D25), MP_ROM_PTR(&pin_GPIO25) }, + { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_GPIO14) }, + { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_BOOT), MP_ROM_PTR(&pin_GPIO7) }, + + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO13) }, + + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL0), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL1), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL2), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL3), MP_ROM_PTR(&pin_GPIO19) }, + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL4), MP_ROM_PTR(&pin_GPIO20) }, + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL5), MP_ROM_PTR(&pin_GPIO21) }, + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL6), MP_ROM_PTR(&pin_GPIO22) }, + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL7), MP_ROM_PTR(&pin_GPIO23) }, + + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_STEMMA_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); From 5a2d1ef49f6d4b8f69af8e959d82efecbd0cd228 Mon Sep 17 00:00:00 2001 From: Jonny Bergdahl Date: Sun, 30 Oct 2022 12:27:19 +0000 Subject: [PATCH 02/12] Translated using Weblate (Swedish) Currently translated at 100.0% (1003 of 1003 strings) Translation: CircuitPython/main Translate-URL: https://hosted.weblate.org/projects/circuitpython/main/sv/ --- locale/sv.po | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/locale/sv.po b/locale/sv.po index b1737876f1..598843479c 100644 --- a/locale/sv.po +++ b/locale/sv.po @@ -6,7 +6,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-01-04 12:55-0600\n" -"PO-Revision-Date: 2022-10-29 22:00+0000\n" +"PO-Revision-Date: 2022-10-31 13:02+0000\n" "Last-Translator: Jonny Bergdahl \n" "Language-Team: LANGUAGE \n" "Language: sv\n" @@ -600,7 +600,7 @@ msgstr "Både RX och TX krävs för handskakning" #: ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.h #: ports/atmel-samd/boards/meowmeow/mpconfigboard.h msgid "Both buttons were pressed at start up.\n" -msgstr "" +msgstr "Båda knapparna trycktes ned vid start.\n" #: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c msgid "Both pins must support hardware interrupts" @@ -670,7 +670,7 @@ msgstr "Busspinne %d används redan" #: ports/espressif/boards/m5stack_core_basic/mpconfigboard.h #: ports/espressif/boards/m5stack_core_fire/mpconfigboard.h msgid "Button A was pressed at start up.\n" -msgstr "" +msgstr "Knapp A trycktes ned vid start.\n" #: shared-bindings/_bleio/UUID.c msgid "Byte buffer must be 16 bytes." @@ -2024,7 +2024,7 @@ msgstr "Temperaturavläsning tog för lång tid" #: supervisor/shared/safe_mode.c msgid "The BOOT button was pressed at start up.\n" -msgstr "" +msgstr "BOOT-knappen trycktes ner vid start.\n" #: supervisor/shared/safe_mode.c msgid "" @@ -2036,11 +2036,11 @@ msgstr "" #: ports/espressif/boards/adafruit_feather_esp32_v2/mpconfigboard.h msgid "The SW38 button was pressed at start up.\n" -msgstr "" +msgstr "SW38-knappen trycktes ned vid start.\n" #: ports/espressif/boards/hardkernel_odroid_go/mpconfigboard.h msgid "The VOLUME button was pressed at start up.\n" -msgstr "" +msgstr "VOLUME-knappen trycktes ned vid start.\n" #: supervisor/shared/safe_mode.c msgid "" @@ -2052,11 +2052,11 @@ msgstr "" #: ports/espressif/boards/m5stack_atom_lite/mpconfigboard.h msgid "The central button was pressed at start up.\n" -msgstr "" +msgstr "Mittknappen trycktes in vid start.\n" #: ports/nrf/boards/aramcon2_badge/mpconfigboard.h msgid "The left button was pressed at start up.\n" -msgstr "" +msgstr "Den vänstra knappen trycktes ned vid start.\n" #: shared-bindings/rgbmatrix/RGBMatrix.c msgid "The length of rgb_pins must be 6, 12, 18, 24, or 30" @@ -2125,7 +2125,7 @@ msgstr "Åtgärden tog för lång tid: Max väntetid är %d sekunder" #: supervisor/shared/safe_mode.c msgid "To exit, please reset the board without requesting safe mode." -msgstr "" +msgstr "För att avsluta, återställ kortet utan att begära säkert läge." #: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Too many channels in sample" From 92803a5d5834fe371036ff59a7775ea18d0d1826 Mon Sep 17 00:00:00 2001 From: Rose Hooper Date: Mon, 31 Oct 2022 20:46:18 -0400 Subject: [PATCH 03/12] Add note about rust to BUILDING.md --- BUILDING.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/BUILDING.md b/BUILDING.md index 37800e689f..4793824cf1 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -35,6 +35,8 @@ Failing to install these will prevent from properly building. pip3 install -r requirements-dev.txt +If you run into an error installing minify_html, you may need to install `rust`. + ### mpy-cross As part of the build process, mpy-cross is needed to compile .py files into .mpy files. From 52de6e855975c0c50164563fc006847ba05eb176 Mon Sep 17 00:00:00 2001 From: Wellington Terumi Uemura Date: Tue, 1 Nov 2022 08:37:06 +0000 Subject: [PATCH 04/12] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (1003 of 1003 strings) Translation: CircuitPython/main Translate-URL: https://hosted.weblate.org/projects/circuitpython/main/pt_BR/ --- locale/pt_BR.po | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/locale/pt_BR.po b/locale/pt_BR.po index 9aea2605f2..23c301996b 100644 --- a/locale/pt_BR.po +++ b/locale/pt_BR.po @@ -6,7 +6,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-01-04 12:55-0600\n" -"PO-Revision-Date: 2022-10-29 22:00+0000\n" +"PO-Revision-Date: 2022-11-02 09:33+0000\n" "Last-Translator: Wellington Terumi Uemura \n" "Language-Team: \n" "Language: pt_BR\n" @@ -608,7 +608,7 @@ msgstr "Ambos os RX e TX são necessários para o controle do fluxo" #: ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.h #: ports/atmel-samd/boards/meowmeow/mpconfigboard.h msgid "Both buttons were pressed at start up.\n" -msgstr "" +msgstr "Ambos os botões foram pressionados na inicialização.\n" #: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c msgid "Both pins must support hardware interrupts" @@ -678,7 +678,7 @@ msgstr "O pino bus %d já está em uso" #: ports/espressif/boards/m5stack_core_basic/mpconfigboard.h #: ports/espressif/boards/m5stack_core_fire/mpconfigboard.h msgid "Button A was pressed at start up.\n" -msgstr "" +msgstr "O botão A foi pressionado na inicialização.\n" #: shared-bindings/_bleio/UUID.c msgid "Byte buffer must be 16 bytes." @@ -2045,7 +2045,7 @@ msgstr "A leitura da temperatura expirou" #: supervisor/shared/safe_mode.c msgid "The BOOT button was pressed at start up.\n" -msgstr "" +msgstr "O botão BOOT foi pressionado na inicialização.\n" #: supervisor/shared/safe_mode.c msgid "" @@ -2058,11 +2058,11 @@ msgstr "" #: ports/espressif/boards/adafruit_feather_esp32_v2/mpconfigboard.h msgid "The SW38 button was pressed at start up.\n" -msgstr "" +msgstr "O botão SW38 foi pressionado na inicialização.\n" #: ports/espressif/boards/hardkernel_odroid_go/mpconfigboard.h msgid "The VOLUME button was pressed at start up.\n" -msgstr "" +msgstr "O botão VOLUME foi pressionado na inicialização.\n" #: supervisor/shared/safe_mode.c msgid "" @@ -2074,11 +2074,11 @@ msgstr "" #: ports/espressif/boards/m5stack_atom_lite/mpconfigboard.h msgid "The central button was pressed at start up.\n" -msgstr "" +msgstr "O botão central foi pressionado na inicialização.\n" #: ports/nrf/boards/aramcon2_badge/mpconfigboard.h msgid "The left button was pressed at start up.\n" -msgstr "" +msgstr "O botão esquerdo foi pressionado na inicialização.\n" #: shared-bindings/rgbmatrix/RGBMatrix.c msgid "The length of rgb_pins must be 6, 12, 18, 24, or 30" @@ -2149,7 +2149,7 @@ msgstr "" #: supervisor/shared/safe_mode.c msgid "To exit, please reset the board without requesting safe mode." -msgstr "" +msgstr "Para sair, reinicie a placa sem solicitar o modo de segurança." #: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Too many channels in sample" From 1f6cd7bfac6fa208847e8da9fddc1dafd50fbc40 Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Wed, 2 Nov 2022 17:39:34 -0500 Subject: [PATCH 05/12] This compatibility name has been removed in 8.x --- shared-bindings/adafruit_pixelbuf/__init__.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/shared-bindings/adafruit_pixelbuf/__init__.c b/shared-bindings/adafruit_pixelbuf/__init__.c index 7b8d0da829..40bf80094c 100644 --- a/shared-bindings/adafruit_pixelbuf/__init__.c +++ b/shared-bindings/adafruit_pixelbuf/__init__.c @@ -38,8 +38,6 @@ //| The `adafruit_pixelbuf` module provides the :py:class:`PixelBuf` class to accelerate //| RGB(W) strip/matrix manipulation, such as DotStar and Neopixel. //| -//| Also available as ``_pixelbuf``. This usage has been deprecated. -//| //| Byteorders are configured with strings, such as "RGB" or "RGBD".""" // TODO: Pull in docs from adafruit_pixelbuf. From 91da267a8764e48e8cbc5f996abe317e9b3ecd6b Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Wed, 2 Nov 2022 19:23:52 -0500 Subject: [PATCH 06/12] Pin python version 3.10 for builds Python 3.11 started to roll out to github actions, and .. it doesn't work. This MAY affect just the espressif build, but I'm pinning it back at 3.10 for all builds. Typical failure, during "Run $IDF_PATH/tools/idf_tools.py --non-interactive install required" shows a lot of failures building gevent: ``` ... Collecting gevent<2.0,>=1.2.2 Downloading gevent-1.5.0.tar.gz (5.3 MB) ... Building wheel for gevent (pyproject.toml): finished with status 'error' ... src/gevent/_greenlet_primitives.c:216:12: fatal error: longintrepr.h: No such file or directory 216 | #include "longintrepr.h" | ^~~~~~~~~~~~~~~ compilation terminated. error: command '/usr/bin/gcc' failed with exit code 1 ``` I notice that gevent is pinned at <2.0 while the current version is 22.10.2! This is a dependency of gdbgui==0.13.2.0, which is installed by esp-idf pinned at that version. --- .github/workflows/build.yml | 14 +++++++------- .github/workflows/create_website_pr.yml | 2 +- .github/workflows/pre-commit.yml | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8338528c42..0dc47946b5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -37,7 +37,7 @@ jobs: - name: Set up Python 3 uses: actions/setup-python@v4 with: - python-version: "3.x" + python-version: "3.10" - name: Get CP deps run: python tools/ci_fetch_deps.py test ${{ github.sha }} - name: CircuitPython version @@ -156,7 +156,7 @@ jobs: - name: Set up Python 3 uses: actions/setup-python@v4 with: - python-version: "3.x" + python-version: "3.10" - name: Get CP deps run: python tools/ci_fetch_deps.py mpy-cross-mac ${{ github.sha }} - name: CircuitPython version @@ -220,7 +220,7 @@ jobs: - name: Set up Python 3 uses: actions/setup-python@v4 with: - python-version: "3.x" + python-version: "3.10" - name: Install dependencies run: | sudo apt-get update @@ -278,7 +278,7 @@ jobs: - name: Set up Python 3 uses: actions/setup-python@v4 with: - python-version: "3.x" + python-version: "3.10" - uses: actions/checkout@v3 with: submodules: false @@ -331,7 +331,7 @@ jobs: - name: Set up Python 3 uses: actions/setup-python@v4 with: - python-version: "3.x" + python-version: "3.10" - uses: actions/checkout@v3 with: submodules: false @@ -384,7 +384,7 @@ jobs: id: py3 uses: actions/setup-python@v4 with: - python-version: "3.x" + python-version: "3.10" - uses: actions/checkout@v3 with: submodules: false @@ -473,7 +473,7 @@ jobs: - name: Set up Python 3 uses: actions/setup-python@v4 with: - python-version: "3.x" + python-version: "3.10" - uses: actions/checkout@v3 with: submodules: false diff --git a/.github/workflows/create_website_pr.yml b/.github/workflows/create_website_pr.yml index 75de556c68..1658fe092c 100644 --- a/.github/workflows/create_website_pr.yml +++ b/.github/workflows/create_website_pr.yml @@ -23,7 +23,7 @@ jobs: - name: Set up Python 3 uses: actions/setup-python@v4 with: - python-version: "3.x" + python-version: "3.10" - name: Get CP deps run: python tools/ci_fetch_deps.py website ${{ github.sha }} - name: Install deps diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index a23dcd1d11..556f89e63c 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -20,7 +20,7 @@ jobs: - name: Set up Python 3 uses: actions/setup-python@v4 with: - python-version: "3.x" + python-version: "3.10" - name: Install deps run: | sudo apt-get install -y gettext uncrustify From f3ec46bbb5a97e5218282f1f3ae02cf7dfbadc0d Mon Sep 17 00:00:00 2001 From: Petr Sedlacek Date: Thu, 3 Nov 2022 15:35:49 +0100 Subject: [PATCH 07/12] Add missing pin definitions for 42. Keebs Frood --- ports/raspberrypi/boards/42keebs_frood/pins.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ports/raspberrypi/boards/42keebs_frood/pins.c b/ports/raspberrypi/boards/42keebs_frood/pins.c index d5cf864768..972d5354b6 100644 --- a/ports/raspberrypi/boards/42keebs_frood/pins.c +++ b/ports/raspberrypi/boards/42keebs_frood/pins.c @@ -43,6 +43,11 @@ STATIC const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_D15), MP_ROM_PTR(&pin_GPIO15) }, { MP_ROM_QSTR(MP_QSTR_D16), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_D17), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_VBUS_SENSE), MP_ROM_PTR(&pin_GPIO19) }, + { MP_ROM_QSTR(MP_QSTR_D19), MP_ROM_PTR(&pin_GPIO19) }, + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, From 9dc559bb90bcb8ced99014ea8992087dd7c24a07 Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Sat, 5 Nov 2022 11:50:19 -0500 Subject: [PATCH 08/12] uasyncio: fix definition of ticks again supervisor_ticks_ms is ALREADY a small int, so passing it to MP_OBJ_SMALL_INT again messes things up. I don't know why this passed muster with the C type system, but oh well. --- extmod/moduasyncio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extmod/moduasyncio.c b/extmod/moduasyncio.c index 8af32f21d9..1e1c5de7e7 100644 --- a/extmod/moduasyncio.c +++ b/extmod/moduasyncio.c @@ -83,7 +83,7 @@ STATIC mp_obj_t ticks(void) { // shared-bindings/supervisor/__init__.c). We assume/require that // supervisor.ticks_ms is picked as the ticks implementation under // CircuitPython for the Python-coded bits of asyncio. -#define ticks() MP_OBJ_NEW_SMALL_INT(supervisor_ticks_ms()) +#define ticks() supervisor_ticks_ms() #endif STATIC mp_int_t ticks_diff(mp_obj_t t1_in, mp_obj_t t0_in) { From 452ebe27aec89c973f2b8385729d9ce95b7c026c Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Sat, 5 Nov 2022 11:24:36 -0500 Subject: [PATCH 09/12] socketpool: make socket objects selectable .. which will lead to them being usable in async contexts, pending relevant changes in asyncio --- .../espressif/common-hal/socketpool/Socket.c | 24 +++++++++++ .../common-hal/socketpool/Socket.c | 43 +++++++++++++++++++ shared-bindings/socketpool/Socket.c | 35 +++++++++++++-- shared-bindings/socketpool/Socket.h | 3 +- 4 files changed, 100 insertions(+), 5 deletions(-) diff --git a/ports/espressif/common-hal/socketpool/Socket.c b/ports/espressif/common-hal/socketpool/Socket.c index 53db7ab393..ce177f3821 100644 --- a/ports/espressif/common-hal/socketpool/Socket.c +++ b/ports/espressif/common-hal/socketpool/Socket.c @@ -553,3 +553,27 @@ mp_uint_t common_hal_socketpool_socket_sendto(socketpool_socket_obj_t *self, void common_hal_socketpool_socket_settimeout(socketpool_socket_obj_t *self, uint32_t timeout_ms) { self->timeout_ms = timeout_ms; } + +bool common_hal_socketpool_readable(socketpool_socket_obj_t *self) { + struct timeval immediate = {0, 0}; + + fd_set fds; + FD_ZERO(&fds); + FD_SET(self->num, &fds); + int num_triggered = select(self->num + 1, &fds, NULL, &fds, &immediate); + + // including returning true in the error case + return num_triggered != 0; +} + +bool common_hal_socketpool_writable(socketpool_socket_obj_t *self) { + struct timeval immediate = {0, 0}; + + fd_set fds; + FD_ZERO(&fds); + FD_SET(self->num, &fds); + int num_triggered = select(self->num + 1, NULL, &fds, &fds, &immediate); + + // including returning true in the error case + return num_triggered != 0; +} diff --git a/ports/raspberrypi/common-hal/socketpool/Socket.c b/ports/raspberrypi/common-hal/socketpool/Socket.c index a099ef9f79..440fe56d42 100644 --- a/ports/raspberrypi/common-hal/socketpool/Socket.c +++ b/ports/raspberrypi/common-hal/socketpool/Socket.c @@ -1163,3 +1163,46 @@ mp_uint_t common_hal_socketpool_socket_sendto(socketpool_socket_obj_t *socket, void common_hal_socketpool_socket_settimeout(socketpool_socket_obj_t *self, uint32_t timeout_ms) { self->timeout = timeout_ms; } + +bool common_hal_socketpool_readable(socketpool_socket_obj_t *self) { + + MICROPY_PY_LWIP_ENTER; + + bool result = self->incoming.pbuf != NULL; + + if (self->state == STATE_PEER_CLOSED) { + result = true; + } + + if (self->type == SOCKETPOOL_SOCK_STREAM && self->pcb.tcp->state == LISTEN) { + struct tcp_pcb *volatile *incoming_connection = &lwip_socket_incoming_array(self)[self->incoming.connection.iget]; + result = (incoming_connection != NULL); + } + + MICROPY_PY_LWIP_EXIT; + + return result; +} + +bool common_hal_socketpool_writable(socketpool_socket_obj_t *self) { + bool result = false; + + MICROPY_PY_LWIP_ENTER; + + switch (self->type) { + case SOCKETPOOL_SOCK_STREAM: { + result = tcp_sndbuf(self->pcb.tcp) != 0; + break; + } + case SOCKETPOOL_SOCK_DGRAM: + #if MICROPY_PY_LWIP_SOCK_RAW + case SOCKETPOOL_SOCK_RAW: + #endif + result = true; + break; + } + + MICROPY_PY_LWIP_EXIT; + + return result; +} diff --git a/shared-bindings/socketpool/Socket.c b/shared-bindings/socketpool/Socket.c index 89b23125c5..7a60463c4b 100644 --- a/shared-bindings/socketpool/Socket.c +++ b/shared-bindings/socketpool/Socket.c @@ -30,13 +30,14 @@ #include #include -#include "shared/runtime/context_manager_helpers.h" -#include "py/objtuple.h" -#include "py/objlist.h" -#include "py/runtime.h" #include "py/mperrno.h" +#include "py/objlist.h" +#include "py/objtuple.h" +#include "py/runtime.h" +#include "py/stream.h" #include "shared/netutils/netutils.h" +#include "shared/runtime/context_manager_helpers.h" #include "shared/runtime/interrupt_char.h" //| class Socket: @@ -422,6 +423,31 @@ STATIC const mp_rom_map_elem_t socketpool_socket_locals_dict_table[] = { STATIC MP_DEFINE_CONST_DICT(socketpool_socket_locals_dict, socketpool_socket_locals_dict_table); +STATIC mp_uint_t socket_ioctl(mp_obj_t self_in, mp_uint_t request, mp_uint_t arg, int *errcode) { + socketpool_socket_obj_t *self = MP_OBJ_TO_PTR(self_in); + mp_uint_t ret; + if (request == MP_STREAM_POLL) { + mp_uint_t flags = arg; + ret = 0; + if ((flags & MP_STREAM_POLL_RD) && common_hal_socketpool_readable(self) > 0) { + ret |= MP_STREAM_POLL_RD; + } + if ((flags & MP_STREAM_POLL_WR) && common_hal_socketpool_writable(self)) { + ret |= MP_STREAM_POLL_WR; + } + } else { + *errcode = MP_EINVAL; + ret = MP_STREAM_ERROR; + } + return ret; +} + +STATIC const mp_stream_p_t socket_stream_p = { + MP_PROTO_IMPLEMENT(MP_QSTR_protocol_stream) + .ioctl = socket_ioctl, + .is_text = false, +}; + const mp_obj_type_t socketpool_socket_type = { { &mp_type_type }, .flags = MP_TYPE_FLAG_EXTENDED, @@ -429,5 +455,6 @@ const mp_obj_type_t socketpool_socket_type = { .locals_dict = (mp_obj_dict_t *)&socketpool_socket_locals_dict, MP_TYPE_EXTENDED_FIELDS( .unary_op = mp_generic_unary_op, + .protocol = &socket_stream_p, ) }; diff --git a/shared-bindings/socketpool/Socket.h b/shared-bindings/socketpool/Socket.h index c6c2a66630..cf5a97a428 100644 --- a/shared-bindings/socketpool/Socket.h +++ b/shared-bindings/socketpool/Socket.h @@ -46,6 +46,8 @@ mp_uint_t common_hal_socketpool_socket_send(socketpool_socket_obj_t *self, const mp_uint_t common_hal_socketpool_socket_sendto(socketpool_socket_obj_t *self, const char *host, size_t hostlen, uint32_t port, const uint8_t *buf, uint32_t len); void common_hal_socketpool_socket_settimeout(socketpool_socket_obj_t *self, uint32_t timeout_ms); +bool common_hal_socketpool_readable(socketpool_socket_obj_t *self); +bool common_hal_socketpool_writable(socketpool_socket_obj_t *self); // Non-allocating versions for internal use. int socketpool_socket_accept(socketpool_socket_obj_t *self, uint8_t *ip, uint32_t *port); @@ -53,5 +55,4 @@ void socketpool_socket_close(socketpool_socket_obj_t *self); int socketpool_socket_send(socketpool_socket_obj_t *self, const uint8_t *buf, uint32_t len); int socketpool_socket_recv_into(socketpool_socket_obj_t *self, const uint8_t *buf, uint32_t len); - #endif // MICROPY_INCLUDED_SHARED_BINDINGS_SOCKETPOOL_SOCKET_H From 2c2c9153ec7c24975048d90bd457138de4ee5f1a Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Sat, 5 Nov 2022 11:33:47 -0500 Subject: [PATCH 10/12] uselect: Allow interrupting poll with ctrl-c --- extmod/moduselect.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/extmod/moduselect.c b/extmod/moduselect.c index 5744d2839c..d388438313 100644 --- a/extmod/moduselect.c +++ b/extmod/moduselect.c @@ -16,6 +16,7 @@ #include "py/stream.h" #include "py/mperrno.h" #include "py/mphal.h" +#include "shared/runtime/interrupt_char.h" // Flags for poll() #define FLAG_ONESHOT (1) @@ -230,6 +231,9 @@ STATIC mp_uint_t poll_poll_internal(uint n_args, const mp_obj_t *args) { break; } RUN_BACKGROUND_TASKS; + if (mp_hal_is_interrupted()) { + return 0; + } } return n_ready; From 9cdfba2e47ff148439e9c03dc5298ce5364bc691 Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Mon, 7 Nov 2022 09:47:56 -0600 Subject: [PATCH 11/12] Simplify argument checking to reduce translated strings Build size on proxlight trinkey m0 en_US: Before: 2412 (en_US) 820 (ru) After: 2544 (en_US) 984 (ru) Savings: +132 (en_US) +164 (ru) bytes available flash --- locale/circuitpython.pot | 44 ++---------------------- py/obj.c | 26 ++------------ py/objstr.c | 4 +-- py/objtype.c | 4 +-- shared-bindings/busio/UART.c | 4 +-- shared-bindings/touchio/TouchIn.c | 5 +-- shared-bindings/usb_hid/__init__.c | 4 +-- shared-bindings/watchdog/WatchDogTimer.c | 8 ++--- 8 files changed, 13 insertions(+), 86 deletions(-) diff --git a/locale/circuitpython.pot b/locale/circuitpython.pot index 768daa8651..779a75deb6 100755 --- a/locale/circuitpython.pot +++ b/locale/circuitpython.pot @@ -110,10 +110,6 @@ msgstr "" msgid "%q index out of range" msgstr "" -#: py/obj.c -msgid "%q indices must be integers, not %s" -msgstr "" - #: shared-module/bitbangio/SPI.c msgid "%q init failed" msgstr "" @@ -2341,10 +2337,6 @@ msgstr "" msgid "WatchDogTimer.mode cannot be changed once set to WatchDogMode.RESET" msgstr "" -#: shared-bindings/watchdog/WatchDogTimer.c -msgid "WatchDogTimer.timeout must be greater than 0" -msgstr "" - #: py/builtinhelp.c #, c-format msgid "" @@ -3166,10 +3158,6 @@ msgstr "" msgid "index out of range" msgstr "" -#: py/obj.c -msgid "indices must be integers" -msgstr "" - #: extmod/ulab/code/ndarray.c msgid "indices must be integers, slices, or Boolean lists" msgstr "" @@ -3586,10 +3574,6 @@ msgstr "" msgid "no such attribute" msgstr "" -#: shared-bindings/usb_hid/__init__.c -msgid "non-Device in %q" -msgstr "" - #: ports/espressif/common-hal/_bleio/Connection.c #: ports/nrf/common-hal/_bleio/Connection.c msgid "non-UUID found in service_uuids_whitelist" @@ -3863,11 +3847,6 @@ msgstr "" msgid "relative import" msgstr "" -#: py/obj.c -#, c-format -msgid "requested length %d but object has length %d" -msgstr "" - #: extmod/ulab/code/ndarray_operators.c msgid "results cannot be cast to specified type" msgstr "" @@ -3931,10 +3910,6 @@ msgstr "" msgid "sign not allowed with integer format specifier 'c'" msgstr "" -#: py/objstr.c -msgid "single '}' encountered in format string" -msgstr "" - #: extmod/ulab/code/ulab_tools.c msgid "size is defined for ndarrays only" msgstr "" @@ -4047,10 +4022,6 @@ msgstr "" msgid "syntax error in uctypes descriptor" msgstr "" -#: shared-bindings/touchio/TouchIn.c -msgid "threshold must be in the range 0-65536" -msgstr "" - #: shared-bindings/time/__init__.c msgid "time.struct_time() takes a 9-sequence" msgstr "" @@ -4062,10 +4033,6 @@ msgstr "" msgid "timeout duration exceeded the maximum supported value" msgstr "" -#: shared-bindings/busio/UART.c -msgid "timeout must be 0.0-100.0 seconds" -msgstr "" - #: ports/nrf/common-hal/_bleio/Adapter.c msgid "timeout must be < 655.35 secs" msgstr "" @@ -4119,10 +4086,6 @@ msgstr "" msgid "trapz is defined for 1D iterables" msgstr "" -#: py/obj.c -msgid "tuple/list has wrong length" -msgstr "" - #: ports/espressif/common-hal/canio/CAN.c #, c-format msgid "twai_driver_install returned esp-idf error #%d" @@ -4201,7 +4164,8 @@ msgid "unknown type '%q'" msgstr "" #: py/objstr.c -msgid "unmatched '{' in format" +#, c-format +msgid "unmatched '%c' in format" msgstr "" #: py/objtype.c py/runtime.c @@ -4272,10 +4236,6 @@ msgstr "" msgid "watchdog not initialized" msgstr "" -#: shared-bindings/watchdog/WatchDogTimer.c -msgid "watchdog timeout must be greater than 0" -msgstr "" - #: shared-bindings/is31fl3741/FrameBuffer.c msgid "width must be greater than zero" msgstr "" diff --git a/py/obj.c b/py/obj.c index da609aa8ce..af2f4c1b68 100644 --- a/py/obj.c +++ b/py/obj.c @@ -488,14 +488,7 @@ void mp_obj_get_array(mp_obj_t o, size_t *len, mp_obj_t **items) { void mp_obj_get_array_fixed_n(mp_obj_t o, size_t len, mp_obj_t **items) { size_t seq_len; mp_obj_get_array(o, &seq_len, items); - if (seq_len != len) { - #if MICROPY_ERROR_REPORTING <= MICROPY_ERROR_REPORTING_TERSE - mp_raise_ValueError(MP_ERROR_TEXT("tuple/list has wrong length")); - #else - mp_raise_ValueError_varg( - MP_ERROR_TEXT("requested length %d but object has length %d"), (int)len, (int)seq_len); - #endif - } + mp_arg_validate_length(seq_len, len, mp_obj_get_type(o)->name); } // is_slice determines whether the index is a slice index @@ -504,13 +497,7 @@ size_t mp_get_index(const mp_obj_type_t *type, size_t len, mp_obj_t index, bool if (mp_obj_is_small_int(index)) { i = MP_OBJ_SMALL_INT_VALUE(index); } else if (!mp_obj_get_int_maybe(index, &i)) { - #if MICROPY_ERROR_REPORTING <= MICROPY_ERROR_REPORTING_TERSE - mp_raise_TypeError(MP_ERROR_TEXT("indices must be integers")); - #else - mp_raise_TypeError_varg( - MP_ERROR_TEXT("%q indices must be integers, not %s"), - type->name, mp_obj_get_type_str(index)); - #endif + mp_raise_TypeError_varg(translate("%q must be of type %q"), MP_QSTR_index, MP_QSTR_int); } if (i < 0) { @@ -523,14 +510,7 @@ size_t mp_get_index(const mp_obj_type_t *type, size_t len, mp_obj_t index, bool i = len; } } else { - if (i < 0 || (mp_uint_t)i >= len) { - #if MICROPY_ERROR_REPORTING <= MICROPY_ERROR_REPORTING_TERSE - mp_raise_IndexError(MP_ERROR_TEXT("index out of range")); - #else - mp_raise_msg_varg(&mp_type_IndexError, - MP_ERROR_TEXT("%q index out of range"), type->name); - #endif - } + mp_arg_validate_index_range(i, 0, len - 1, MP_QSTR_index); } // By this point 0 <= i <= len and so fits in a size_t diff --git a/py/objstr.c b/py/objstr.c index df735a45cd..fbb044c65e 100644 --- a/py/objstr.c +++ b/py/objstr.c @@ -986,7 +986,7 @@ STATIC vstr_t mp_obj_str_format_helper(const char *str, const char *top, int *ar #if MICROPY_ERROR_REPORTING <= MICROPY_ERROR_REPORTING_TERSE terse_str_format_value_error(); #else - mp_raise_ValueError(MP_ERROR_TEXT("single '}' encountered in format string")); + mp_raise_ValueError_varg(MP_ERROR_TEXT("unmatched '%c' in format"), '}'); #endif } if (*str != '{') { @@ -1063,7 +1063,7 @@ STATIC vstr_t mp_obj_str_format_helper(const char *str, const char *top, int *ar #if MICROPY_ERROR_REPORTING <= MICROPY_ERROR_REPORTING_TERSE terse_str_format_value_error(); #else - mp_raise_ValueError(MP_ERROR_TEXT("unmatched '{' in format")); + mp_raise_ValueError_varg(MP_ERROR_TEXT("unmatched '%c' in format"), '{'); #endif } if (*str != '}') { diff --git a/py/objtype.c b/py/objtype.c index 071065041f..0914ad5f2e 100644 --- a/py/objtype.c +++ b/py/objtype.c @@ -1181,9 +1181,7 @@ mp_obj_t mp_obj_new_type(qstr name, mp_obj_t bases_tuple, mp_obj_t locals_dict) mp_obj_t *bases_items; mp_obj_tuple_get(bases_tuple, &bases_len, &bases_items); for (size_t i = 0; i < bases_len; i++) { - if (!mp_obj_is_type(bases_items[i], &mp_type_type)) { - mp_raise_TypeError(MP_ERROR_TEXT("type is not an acceptable base type")); - } + mp_arg_validate_type(bases_items[i], &mp_type_type, MP_QSTR___class__); mp_obj_type_t *t = MP_OBJ_TO_PTR(bases_items[i]); // TODO: Verify with CPy, tested on function type if (t->make_new == NULL) { diff --git a/shared-bindings/busio/UART.c b/shared-bindings/busio/UART.c index eb4f15afe5..eb1d1685a5 100644 --- a/shared-bindings/busio/UART.c +++ b/shared-bindings/busio/UART.c @@ -91,9 +91,7 @@ extern const busio_uart_parity_obj_t busio_uart_parity_odd_obj; #if CIRCUITPY_BUSIO_UART STATIC void validate_timeout(mp_float_t timeout) { - if (timeout < (mp_float_t)0.0f || timeout > (mp_float_t)100.0f) { - mp_raise_ValueError(translate("timeout must be 0.0-100.0 seconds")); - } + mp_arg_validate_int_range((int)timeout, 0, 100, MP_QSTR_timeout); } #endif // CIRCUITPY_BUSIO_UART diff --git a/shared-bindings/touchio/TouchIn.c b/shared-bindings/touchio/TouchIn.c index 63da84e885..226fa445da 100644 --- a/shared-bindings/touchio/TouchIn.c +++ b/shared-bindings/touchio/TouchIn.c @@ -159,10 +159,7 @@ STATIC mp_obj_t touchio_touchin_obj_set_threshold(mp_obj_t self_in, mp_obj_t thr touchio_touchin_obj_t *self = MP_OBJ_TO_PTR(self_in); check_for_deinit(self); uint32_t new_threshold = mp_obj_get_int(threshold_obj); - if (new_threshold < 0 || new_threshold > UINT16_MAX) { - // I would use MP_STRINGIFY(UINT16_MAX), but that prints "0xffff" instead of 65536. - mp_raise_ValueError(translate("threshold must be in the range 0-65536")); - } + mp_arg_validate_int_range(new_threshold, 0, UINT16_MAX, MP_QSTR_threshold); common_hal_touchio_touchin_set_threshold(self, new_threshold); return mp_const_none; } diff --git a/shared-bindings/usb_hid/__init__.c b/shared-bindings/usb_hid/__init__.c index 1c51502455..9cb9303143 100644 --- a/shared-bindings/usb_hid/__init__.c +++ b/shared-bindings/usb_hid/__init__.c @@ -123,9 +123,7 @@ STATIC mp_obj_t usb_hid_enable(size_t n_args, const mp_obj_t *pos_args, mp_map_t const mp_int_t len = mp_obj_get_int(mp_obj_len(devices)); for (mp_int_t i = 0; i < len; i++) { mp_obj_t item = mp_obj_subscr(devices, MP_OBJ_NEW_SMALL_INT(i), MP_OBJ_SENTINEL); - if (!mp_obj_is_type(item, &usb_hid_device_type)) { - mp_raise_ValueError_varg(translate("non-Device in %q"), MP_QSTR_devices); - } + mp_arg_validate_type(item, &usb_hid_device_type, MP_QSTR___class__); } uint8_t boot_device = diff --git a/shared-bindings/watchdog/WatchDogTimer.c b/shared-bindings/watchdog/WatchDogTimer.c index 1d47e88b9f..acfd353c34 100644 --- a/shared-bindings/watchdog/WatchDogTimer.c +++ b/shared-bindings/watchdog/WatchDogTimer.c @@ -94,9 +94,7 @@ STATIC mp_obj_t watchdog_watchdogtimer_obj_set_timeout(mp_obj_t self_in, mp_obj_ watchdog_watchdogtimer_obj_t *self = MP_OBJ_TO_PTR(self_in); mp_float_t timeout = mp_obj_get_float(timeout_obj); - if (timeout <= 0) { - mp_raise_ValueError(translate("watchdog timeout must be greater than 0")); - } + mp_arg_validate_int_min((int)timeout, 0, MP_QSTR_timeout); common_hal_watchdog_set_timeout(self, timeout); return mp_const_none; @@ -136,9 +134,7 @@ STATIC mp_obj_t watchdog_watchdogtimer_obj_set_mode(mp_obj_t self_in, mp_obj_t m // When setting the mode, the timeout value must be greater than zero if (new_mode == WATCHDOGMODE_RESET || new_mode == WATCHDOGMODE_RAISE) { - if (current_timeout <= 0) { - mp_raise_ValueError(translate("WatchDogTimer.timeout must be greater than 0")); - } + mp_arg_validate_int_min((int)current_timeout, 0, MP_QSTR_timeout); } // Don't allow changing the mode once the watchdog timer has been started From 319d9b04f13389bdc6469fe19771125f2b4ef719 Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Mon, 7 Nov 2022 13:51:58 -0600 Subject: [PATCH 12/12] Fix type annotation mistake --- shared-bindings/terminalio/Terminal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared-bindings/terminalio/Terminal.c b/shared-bindings/terminalio/Terminal.c index 2dfe29035e..46e171ff7e 100644 --- a/shared-bindings/terminalio/Terminal.c +++ b/shared-bindings/terminalio/Terminal.c @@ -61,7 +61,7 @@ //| scroll_area: displayio.TileGrid, //| font: fontio.BuiltinFont, //| *, -//| status_bar: displayio.TileGrid = None +//| status_bar: Optional[displayio.TileGrid] = None //| ) -> None: //| """Terminal manages tile indices and cursor position based on VT100 commands. The font should be //| a `fontio.BuiltinFont` and the TileGrid's bitmap should match the font's bitmap."""