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 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. 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) { 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; 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/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" 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" 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/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) }, 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); 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/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/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. 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/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 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.""" 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