summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavePutz <dwputz@gmail.com>2020-12-10 12:05:51 -0600
committerGitHub <noreply@github.com>2020-12-10 12:05:51 -0600
commit3d5c77c601fa8297861416dde52211809c3e7b58 (patch)
treed4d606afaabfae6632110824db0fd098521ea878
parent3abc671bbdf617dcf87cbd4eda1201c944c05651 (diff)
parente9fd689d576f834eff255d5f15edcad07c46e2ec (diff)
Merge pull request #35 from adafruit/main
Update from adafruit/main
-rw-r--r--.github/workflows/build.yml18
-rw-r--r--.github/workflows/create_website_pr.yml2
-rw-r--r--.github/workflows/pre-commit.yml2
-rw-r--r--.gitmodules5
-rw-r--r--Makefile2
-rw-r--r--README.rst4
-rw-r--r--conf.py1
-rw-r--r--docs/design_guide.rst8
-rw-r--r--docs/drivers.rst2
-rw-r--r--docs/library/hashlib.rst4
-rw-r--r--docs/library/index.rst4
-rw-r--r--docs/library/network.rst2
-rw-r--r--docs/porting.rst2
-rw-r--r--docs/troubleshooting.rst4
-rw-r--r--extmod/machine_mem.c2
-rw-r--r--extmod/moduheapq.c2
-rw-r--r--extmod/modujson.c36
-rw-r--r--extmod/modure.c6
-rw-r--r--extmod/moduzlib.c2
m---------extmod/ulab0
-rw-r--r--extmod/vfs_posix_file.c2
m---------frozen/Adafruit_CircuitPython_Requests0
m---------lib/tinyusb0
-rwxr-xr-xlib/utils/pyexec.c6
-rw-r--r--lib/utils/pyexec.h1
-rw-r--r--locale/ID.po225
-rw-r--r--locale/circuitpython.pot234
-rw-r--r--locale/cs.po261
-rw-r--r--locale/de_DE.po293
-rw-r--r--locale/el.po225
-rw-r--r--locale/es.po372
-rw-r--r--locale/fil.po225
-rw-r--r--locale/fr.po316
-rw-r--r--locale/hi.po225
-rw-r--r--locale/it_IT.po225
-rw-r--r--locale/ja.po280
-rw-r--r--locale/ko.po225
-rw-r--r--locale/nl.po286
-rw-r--r--locale/pl.po264
-rw-r--r--locale/pt_BR.po297
-rw-r--r--locale/sv.po297
-rw-r--r--locale/zh_Latn_pinyin.po293
-rwxr-xr-xmain.c180
-rw-r--r--ports/atmel-samd/boards/8086_commander/board.c2
-rw-r--r--ports/atmel-samd/boards/8086_commander/mpconfigboard.mk2
-rw-r--r--ports/atmel-samd/boards/aloriumtech_evo_m51/board.c2
-rw-r--r--ports/atmel-samd/boards/arduino_mkr1300/board.c2
-rw-r--r--ports/atmel-samd/boards/arduino_mkrzero/board.c2
-rw-r--r--ports/atmel-samd/boards/arduino_nano_33_iot/board.c2
-rw-r--r--ports/atmel-samd/boards/arduino_zero/board.c2
-rw-r--r--ports/atmel-samd/boards/bast_pro_mini_m0/board.c2
-rw-r--r--ports/atmel-samd/boards/bdmicro_vina_d21/board.c2
-rw-r--r--ports/atmel-samd/boards/bdmicro_vina_d21/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/bdmicro_vina_d51/board.c2
-rw-r--r--ports/atmel-samd/boards/blm_badge/board.c4
-rw-r--r--ports/atmel-samd/boards/blm_badge/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/capablerobot_usbhub/board.c2
-rw-r--r--ports/atmel-samd/boards/catwan_usbstick/board.c2
-rwxr-xr-xports/atmel-samd/boards/circuitbrains_basic_m0/board.c2
-rwxr-xr-xports/atmel-samd/boards/circuitbrains_deluxe_m4/board.c2
-rw-r--r--ports/atmel-samd/boards/circuitplayground_express/board.c4
-rw-r--r--ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/circuitplayground_express_crickit/board.c4
-rw-r--r--ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/circuitplayground_express_displayio/board.c4
-rw-r--r--ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/cp32-m4/board.c2
-rw-r--r--ports/atmel-samd/boards/cp_sapling_m0/board.c (renamed from ports/litex/boards/board.h)27
-rw-r--r--ports/atmel-samd/boards/cp_sapling_m0/mpconfigboard.h57
-rw-r--r--ports/atmel-samd/boards/cp_sapling_m0/mpconfigboard.mk24
-rw-r--r--ports/atmel-samd/boards/cp_sapling_m0/pins.c38
-rw-r--r--ports/atmel-samd/boards/cp_sapling_m0_spiflash/board.c (renamed from ports/stm/boards/board.h)27
-rw-r--r--ports/atmel-samd/boards/cp_sapling_m0_spiflash/mpconfigboard.h62
-rw-r--r--ports/atmel-samd/boards/cp_sapling_m0_spiflash/mpconfigboard.mk33
-rw-r--r--ports/atmel-samd/boards/cp_sapling_m0_spiflash/pins.c38
-rw-r--r--ports/atmel-samd/boards/datalore_ip_m4/board.c2
-rw-r--r--ports/atmel-samd/boards/datum_distance/board.c2
-rw-r--r--ports/atmel-samd/boards/datum_imu/board.c2
-rw-r--r--ports/atmel-samd/boards/datum_light/board.c2
-rw-r--r--ports/atmel-samd/boards/datum_weather/board.c2
-rw-r--r--ports/atmel-samd/boards/dynossat_edu_eps/board.c2
-rw-r--r--ports/atmel-samd/boards/dynossat_edu_eps/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/dynossat_edu_obc/board.c2
-rw-r--r--ports/atmel-samd/boards/escornabot_makech/board.c2
-rw-r--r--ports/atmel-samd/boards/feather_m0_adalogger/board.c2
-rw-r--r--ports/atmel-samd/boards/feather_m0_basic/board.c2
-rw-r--r--ports/atmel-samd/boards/feather_m0_express/board.c2
-rw-r--r--ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/feather_m0_express_crickit/board.c2
-rw-r--r--ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/feather_m0_rfm69/board.c2
-rw-r--r--ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.mk2
-rw-r--r--ports/atmel-samd/boards/feather_m0_rfm9x/board.c2
-rw-r--r--ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.mk2
-rw-r--r--ports/atmel-samd/boards/feather_m0_supersized/board.c2
-rw-r--r--ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/feather_m4_can/board.c2
-rw-r--r--ports/atmel-samd/boards/feather_m4_express/board.c2
-rwxr-xr-xports/atmel-samd/boards/feather_radiofruit_zigbee/board.c2
-rw-r--r--ports/atmel-samd/boards/fluff_m0/board.c2
-rw-r--r--ports/atmel-samd/boards/gemma_m0/board.c2
-rw-r--r--ports/atmel-samd/boards/grandcentral_m4_express/board.c2
-rw-r--r--ports/atmel-samd/boards/hallowing_m0_express/board.c2
-rw-r--r--ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/hallowing_m0_express/pins.c2
-rw-r--r--ports/atmel-samd/boards/hallowing_m4_express/board.c2
-rw-r--r--ports/atmel-samd/boards/itsybitsy_m0_express/board.c2
-rw-r--r--ports/atmel-samd/boards/itsybitsy_m4_express/board.c2
-rw-r--r--ports/atmel-samd/boards/kicksat-sprite/board.c2
-rw-r--r--ports/atmel-samd/boards/kicksat-sprite/pins.c2
-rw-r--r--ports/atmel-samd/boards/loc_ber_m4_base_board/board.c2
-rw-r--r--ports/atmel-samd/boards/matrixportal_m4/board.c2
-rw-r--r--ports/atmel-samd/boards/meowmeow/board.c2
-rw-r--r--ports/atmel-samd/boards/metro_m0_express/board.c2
-rw-r--r--ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/metro_m4_airlift_lite/board.c2
-rw-r--r--ports/atmel-samd/boards/metro_m4_express/board.c2
-rw-r--r--ports/atmel-samd/boards/mini_sam_m4/board.c2
-rw-r--r--ports/atmel-samd/boards/monster_m4sk/board.c2
-rw-r--r--ports/atmel-samd/boards/monster_m4sk/pins.c2
-rw-r--r--ports/atmel-samd/boards/ndgarage_ndbit6/board.c2
-rw-r--r--ports/atmel-samd/boards/ndgarage_ndbit6_v2/board.c2
-rw-r--r--ports/atmel-samd/boards/nfc_copy_cat/board.c2
-rw-r--r--ports/atmel-samd/boards/openbook_m4/board.c2
-rw-r--r--ports/atmel-samd/boards/openbook_m4/pins.c2
-rw-r--r--ports/atmel-samd/boards/pewpew10/board.c2
-rw-r--r--ports/atmel-samd/boards/pewpew_m4/board.c2
-rw-r--r--ports/atmel-samd/boards/picoplanet/board.c2
-rw-r--r--ports/atmel-samd/boards/pirkey_m0/board.c2
-rw-r--r--ports/atmel-samd/boards/pybadge/board.c4
-rw-r--r--ports/atmel-samd/boards/pybadge/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/pybadge/pins.c2
-rw-r--r--ports/atmel-samd/boards/pybadge_airlift/board.c4
-rw-r--r--ports/atmel-samd/boards/pybadge_airlift/mpconfigboard.h5
-rw-r--r--ports/atmel-samd/boards/pybadge_airlift/pins.c9
-rw-r--r--ports/atmel-samd/boards/pycubed/board.c2
-rw-r--r--ports/atmel-samd/boards/pycubed/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/pycubed/pins.c2
-rw-r--r--ports/atmel-samd/boards/pycubed_mram/board.c2
-rw-r--r--ports/atmel-samd/boards/pycubed_mram/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/pycubed_mram/pins.c2
-rw-r--r--ports/atmel-samd/boards/pygamer/board.c4
-rw-r--r--ports/atmel-samd/boards/pygamer/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/pygamer/pins.c2
-rw-r--r--ports/atmel-samd/boards/pygamer_advance/board.c4
-rw-r--r--ports/atmel-samd/boards/pygamer_advance/mpconfigboard.h2
-rw-r--r--ports/atmel-samd/boards/pygamer_advance/pins.c2
-rw-r--r--ports/atmel-samd/boards/pyportal/board.c2
-rw-r--r--ports/atmel-samd/boards/pyportal/mpconfigboard.h3
-rw-r--r--ports/atmel-samd/boards/pyportal/pins.c9
-rw-r--r--ports/atmel-samd/boards/pyportal_titano/board.c2
-rw-r--r--ports/atmel-samd/boards/pyportal_titano/mpconfigboard.h3
-rw-r--r--ports/atmel-samd/boards/pyportal_titano/pins.c9
-rw-r--r--ports/atmel-samd/boards/pyruler/board.c2
-rw-r--r--ports/atmel-samd/boards/qtpy_m0/board.c2
-rw-r--r--ports/atmel-samd/boards/qtpy_m0_haxpress/board.c2
-rw-r--r--ports/atmel-samd/boards/robohatmm1_m4/board.c2
-rw-r--r--ports/atmel-samd/boards/sam32/board.c2
-rw-r--r--ports/atmel-samd/boards/sam32/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/same54_xplained/board.c2
-rw-r--r--ports/atmel-samd/boards/seeeduino_wio_terminal/board.c2
-rw-r--r--ports/atmel-samd/boards/seeeduino_xiao/board.c2
-rw-r--r--ports/atmel-samd/boards/serpente/board.c2
-rw-r--r--ports/atmel-samd/boards/shirtty/board.c2
-rw-r--r--ports/atmel-samd/boards/snekboard/board.c2
-rw-r--r--ports/atmel-samd/boards/snekboard/mpconfigboard.mk1
-rwxr-xr-xports/atmel-samd/boards/sparkfun_lumidrive/board.c2
-rw-r--r--ports/atmel-samd/boards/sparkfun_qwiic_micro_no_flash/board.c2
-rw-r--r--ports/atmel-samd/boards/sparkfun_qwiic_micro_with_flash/board.c2
-rwxr-xr-xports/atmel-samd/boards/sparkfun_redboard_turbo/board.c2
-rwxr-xr-xports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.mk1
-rw-r--r--ports/atmel-samd/boards/sparkfun_samd21_dev/board.c2
-rw-r--r--ports/atmel-samd/boards/sparkfun_samd21_mini/board.c2
-rw-r--r--ports/atmel-samd/boards/sparkfun_samd51_thing_plus/board.c2
-rw-r--r--ports/atmel-samd/boards/stringcar_m0_express/board.c2
-rw-r--r--ports/atmel-samd/boards/trellis_m4_express/board.c2
-rw-r--r--ports/atmel-samd/boards/trinket_m0/board.c2
-rw-r--r--ports/atmel-samd/boards/trinket_m0_haxpress/board.c2
-rw-r--r--ports/atmel-samd/boards/uartlogger2/board.c2
-rw-r--r--ports/atmel-samd/boards/uchip/board.c2
-rw-r--r--ports/atmel-samd/boards/ugame10/board.c2
-rw-r--r--ports/atmel-samd/boards/winterbloom_big_honking_button/board.c2
-rw-r--r--ports/atmel-samd/boards/winterbloom_sol/board.c2
-rw-r--r--ports/atmel-samd/boards/xinabox_cc03/board.c2
-rw-r--r--ports/atmel-samd/boards/xinabox_cc03/mpconfigboard.mk2
-rw-r--r--ports/atmel-samd/boards/xinabox_cs11/board.c2
-rw-r--r--ports/atmel-samd/boards/xinabox_cs11/mpconfigboard.mk2
-rw-r--r--ports/atmel-samd/common-hal/audiobusio/PDMIn.c8
-rw-r--r--ports/atmel-samd/common-hal/busio/SPI.c2
-rw-r--r--ports/atmel-samd/common-hal/microcontroller/Processor.c5
-rw-r--r--ports/atmel-samd/common-hal/sdioio/SDCard.c1
-rw-r--r--ports/atmel-samd/mpconfigport.h1
-rw-r--r--ports/atmel-samd/mpconfigport.mk4
-rw-r--r--ports/atmel-samd/supervisor/port.c8
-rw-r--r--ports/cxd56/boards/spresense/board.c2
-rw-r--r--ports/cxd56/common-hal/microcontroller/Processor.c5
-rw-r--r--ports/cxd56/supervisor/port.c8
-rw-r--r--ports/esp32s2/Makefile8
-rw-r--r--ports/esp32s2/boards/adafruit_magtag_2.9_grayscale/board.c22
-rw-r--r--ports/esp32s2/boards/adafruit_magtag_2.9_grayscale/pins.c9
-rw-r--r--ports/esp32s2/boards/adafruit_metro_esp32s2/board.c5
-rw-r--r--ports/esp32s2/boards/electroniccats_bastwifi/board.c5
-rw-r--r--ports/esp32s2/boards/espressif_kaluga_1/board.c5
-rw-r--r--ports/esp32s2/boards/espressif_saola_1_wroom/board.c5
-rw-r--r--ports/esp32s2/boards/espressif_saola_1_wrover/board.c5
-rw-r--r--ports/esp32s2/boards/microdev_micro_s2/board.c5
-rw-r--r--ports/esp32s2/boards/muselab_nanoesp32_s2/board.c5
-rw-r--r--ports/esp32s2/boards/targett_module_clip_wroom/board.c5
-rw-r--r--ports/esp32s2/boards/targett_module_clip_wrover/board.c5
-rw-r--r--ports/esp32s2/boards/unexpectedmaker_feathers2/board.c5
-rw-r--r--ports/esp32s2/boards/unexpectedmaker_feathers2_prerelease/board.c5
-rw-r--r--ports/esp32s2/certificates/README.md3
m---------ports/esp32s2/certificates/nina-fw0
-rw-r--r--ports/esp32s2/common-hal/alarm/__init__.c152
-rw-r--r--ports/esp32s2/common-hal/alarm/__init__.h32
-rw-r--r--ports/esp32s2/common-hal/alarm/pin/PinAlarm.c53
-rw-r--r--ports/esp32s2/common-hal/alarm/pin/PinAlarm.h37
-rw-r--r--ports/esp32s2/common-hal/alarm/pin/__init__.c35
-rw-r--r--ports/esp32s2/common-hal/alarm/time/TimeAlarm.c104
-rw-r--r--ports/esp32s2/common-hal/alarm/time/TimeAlarm.h40
-rw-r--r--ports/esp32s2/common-hal/busio/I2C.c23
-rw-r--r--ports/esp32s2/common-hal/busio/SPI.c9
-rw-r--r--ports/esp32s2/common-hal/frequencyio/FrequencyIn.c193
-rw-r--r--ports/esp32s2/common-hal/frequencyio/FrequencyIn.h45
-rw-r--r--ports/esp32s2/common-hal/frequencyio/__init__.c1
-rw-r--r--ports/esp32s2/common-hal/microcontroller/Pin.c4
-rw-r--r--ports/esp32s2/common-hal/microcontroller/Processor.c48
-rw-r--r--ports/esp32s2/common-hal/microcontroller/Processor.h6
-rw-r--r--ports/esp32s2/common-hal/microcontroller/__init__.c30
-rw-r--r--ports/esp32s2/common-hal/nvm/ByteArray.c97
-rw-r--r--ports/esp32s2/common-hal/nvm/ByteArray.h38
-rw-r--r--ports/esp32s2/common-hal/nvm/__init__.c1
-rw-r--r--ports/esp32s2/common-hal/ps2io/Ps2.c392
-rw-r--r--ports/esp32s2/common-hal/ps2io/Ps2.h (renamed from ports/atmel-samd/boards/board.h)43
-rw-r--r--ports/esp32s2/common-hal/ps2io/__init__.c1
-rw-r--r--ports/esp32s2/common-hal/pulseio/PulseIn.c8
-rw-r--r--ports/esp32s2/common-hal/rtc/RTC.h6
-rw-r--r--ports/esp32s2/common-hal/socketpool/Socket.c84
-rw-r--r--ports/esp32s2/common-hal/socketpool/SocketPool.c7
-rw-r--r--ports/esp32s2/common-hal/supervisor/Runtime.h6
-rw-r--r--ports/esp32s2/common-hal/time/__init__.c2
-rw-r--r--ports/esp32s2/common-hal/touchio/TouchIn.c26
-rw-r--r--ports/esp32s2/common-hal/watchdog/WatchDogMode.c1
-rw-r--r--ports/esp32s2/common-hal/watchdog/WatchDogTimer.c93
-rw-r--r--ports/esp32s2/common-hal/watchdog/WatchDogTimer.h43
-rw-r--r--ports/esp32s2/common-hal/watchdog/__init__.c1
-rw-r--r--ports/esp32s2/common-hal/wifi/Radio.c19
-rw-r--r--ports/esp32s2/common-hal/wifi/Radio.h2
-rw-r--r--ports/esp32s2/common-hal/wifi/__init__.c24
m---------ports/esp32s2/esp-idf0
-rw-r--r--ports/esp32s2/esp-idf-config/sdkconfig.defaults13
-rw-r--r--ports/esp32s2/mpconfigport.h7
-rw-r--r--ports/esp32s2/mpconfigport.mk10
-rw-r--r--ports/esp32s2/peripherals/timer.c76
-rw-r--r--ports/esp32s2/peripherals/timer.h41
-rw-r--r--ports/esp32s2/supervisor/internal_flash_root_pointers.h6
-rw-r--r--ports/esp32s2/supervisor/port.c91
-rw-r--r--ports/litex/boards/fomu/board.c3
-rw-r--r--ports/litex/common-hal/microcontroller/Processor.c8
-rw-r--r--ports/litex/common-hal/time/__init__.c2
-rw-r--r--ports/litex/mpconfigport.mk1
-rw-r--r--ports/litex/supervisor/port.c8
-rw-r--r--ports/mimxrt10xx/board.h1
-rw-r--r--ports/mimxrt10xx/boards/feather_m7_1011/board.c3
-rw-r--r--ports/mimxrt10xx/boards/feather_m7_1011/flash_config.c4
-rw-r--r--ports/mimxrt10xx/boards/feather_m7_1011/pins.c2
-rw-r--r--ports/mimxrt10xx/boards/feather_mimxrt1011/board.c3
-rw-r--r--ports/mimxrt10xx/boards/feather_mimxrt1011/flash_config.c4
-rw-r--r--ports/mimxrt10xx/boards/feather_mimxrt1011/pins.c2
-rw-r--r--ports/mimxrt10xx/boards/feather_mimxrt1062/board.c3
-rw-r--r--ports/mimxrt10xx/boards/feather_mimxrt1062/flash_config.c3
-rw-r--r--ports/mimxrt10xx/boards/feather_mimxrt1062/pins.c2
-rw-r--r--ports/mimxrt10xx/boards/flash_config.h (renamed from ports/mimxrt10xx/boards/board.h)20
-rw-r--r--ports/mimxrt10xx/boards/imxrt1010_evk/board.c3
-rw-r--r--ports/mimxrt10xx/boards/imxrt1010_evk/flash_config.c3
-rw-r--r--ports/mimxrt10xx/boards/imxrt1010_evk/pins.c2
-rw-r--r--ports/mimxrt10xx/boards/imxrt1020_evk/board.c3
-rw-r--r--ports/mimxrt10xx/boards/imxrt1020_evk/flash_config.c3
-rw-r--r--ports/mimxrt10xx/boards/imxrt1020_evk/pins.c2
-rw-r--r--ports/mimxrt10xx/boards/imxrt1060_evk/board.c3
-rw-r--r--ports/mimxrt10xx/boards/imxrt1060_evk/flash_config.c3
-rw-r--r--ports/mimxrt10xx/boards/imxrt1060_evk/pins.c2
-rw-r--r--ports/mimxrt10xx/boards/metro_m7_1011/board.c3
-rw-r--r--ports/mimxrt10xx/boards/metro_m7_1011/flash_config.c3
-rw-r--r--ports/mimxrt10xx/boards/metro_m7_1011/pins.c2
-rw-r--r--ports/mimxrt10xx/boards/teensy40/board.c3
-rw-r--r--ports/mimxrt10xx/boards/teensy40/flash_config.c3
-rw-r--r--ports/mimxrt10xx/boards/teensy40/pins.c2
-rw-r--r--ports/mimxrt10xx/boards/teensy41/board.c3
-rw-r--r--ports/mimxrt10xx/boards/teensy41/flash_config.c3
-rw-r--r--ports/mimxrt10xx/boards/teensy41/pins.c2
-rw-r--r--ports/mimxrt10xx/common-hal/microcontroller/Processor.c5
-rw-r--r--ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1011/periph.h6
-rw-r--r--ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1062/periph.h6
-rw-r--r--ports/mimxrt10xx/supervisor/flexspi_nor_flash_ops.c2
-rw-r--r--ports/mimxrt10xx/supervisor/internal_flash.c2
-rw-r--r--ports/mimxrt10xx/supervisor/port.c11
-rw-r--r--ports/nrf/boards/ADM_B_NRF52840_1/board.c2
-rw-r--r--ports/nrf/boards/TG-Watch02A/board.c2
-rw-r--r--ports/nrf/boards/aramcon_badge_2019/board.c2
-rw-r--r--ports/nrf/boards/arduino_nano_33_ble/board.c2
-rw-r--r--ports/nrf/boards/bless_dev_board_multi_sensor/board.c2
-rw-r--r--ports/nrf/boards/circuitplayground_bluefruit/board.c4
-rw-r--r--ports/nrf/boards/circuitplayground_bluefruit/mpconfigboard.h2
-rw-r--r--ports/nrf/boards/clue_nrf52840_express/board.c2
-rw-r--r--ports/nrf/boards/clue_nrf52840_express/pins.c2
-rw-r--r--ports/nrf/boards/electronut_labs_blip/board.c2
-rw-r--r--ports/nrf/boards/electronut_labs_papyr/board.c2
-rw-r--r--ports/nrf/boards/feather_bluefruit_sense/board.c2
-rw-r--r--ports/nrf/boards/feather_nrf52840_express/board.c2
-rw-r--r--ports/nrf/boards/hiibot_bluefi/board.c2
-rw-r--r--ports/nrf/boards/hiibot_bluefi/pins.c2
-rw-r--r--ports/nrf/boards/ikigaisense_vita/board.c2
-rw-r--r--ports/nrf/boards/itsybitsy_nrf52840_express/board.c2
-rw-r--r--ports/nrf/boards/makerdiary_m60_keyboard/board.c2
-rw-r--r--ports/nrf/boards/makerdiary_m60_keyboard/pins.c2
-rw-r--r--ports/nrf/boards/makerdiary_nrf52840_m2_devkit/board.c2
-rw-r--r--ports/nrf/boards/makerdiary_nrf52840_m2_devkit/pins.c2
-rw-r--r--ports/nrf/boards/makerdiary_nrf52840_mdk/board.c2
-rw-r--r--ports/nrf/boards/makerdiary_nrf52840_mdk_usb_dongle/board.c2
-rw-r--r--ports/nrf/boards/metro_nrf52840_express/board.c2
-rw-r--r--ports/nrf/boards/nice_nano/board.c2
-rw-r--r--ports/nrf/boards/ohs2020_badge/board.c2
-rw-r--r--ports/nrf/boards/particle_argon/board.c2
-rw-r--r--ports/nrf/boards/particle_boron/board.c2
-rw-r--r--ports/nrf/boards/particle_xenon/board.c2
-rw-r--r--ports/nrf/boards/pca10056/board.c2
-rw-r--r--ports/nrf/boards/pca10059/board.c2
-rw-r--r--ports/nrf/boards/pca10100/board.c2
-rw-r--r--ports/nrf/boards/pitaya_go/board.c2
-rw-r--r--ports/nrf/boards/raytac_mdbt50q-db-40/board.c2
-rw-r--r--ports/nrf/boards/simmel/board.c2
-rw-r--r--ports/nrf/boards/simmel/mpconfigboard.mk1
-rw-r--r--ports/nrf/boards/sparkfun_nrf52840_mini/board.c2
-rw-r--r--ports/nrf/boards/teknikio_bluebird/board.c2
-rw-r--r--ports/nrf/boards/tinkeringtech_scoutmakes_azul/board.c2
-rw-r--r--ports/nrf/common-hal/microcontroller/Processor.c8
-rw-r--r--ports/nrf/common-hal/rgbmatrix/RGBMatrix.h4
-rw-r--r--ports/nrf/common-hal/watchdog/WatchDogTimer.c3
-rw-r--r--ports/nrf/supervisor/port.c8
-rw-r--r--ports/stm/boards/STM32F411_nvm_nofs.ld27
-rw-r--r--ports/stm/boards/espruino_pico/board.c2
-rw-r--r--ports/stm/boards/espruino_wifi/board.c2
-rw-r--r--ports/stm/boards/feather_stm32f405_express/board.c2
-rw-r--r--ports/stm/boards/meowbit_v121/board.c2
-rw-r--r--ports/stm/boards/meowbit_v121/mpconfigboard.mk2
-rw-r--r--ports/stm/boards/nucleo_f746zg/board.c2
-rw-r--r--ports/stm/boards/nucleo_f767zi/board.c2
-rw-r--r--ports/stm/boards/nucleo_h743zi_2/board.c2
-rw-r--r--ports/stm/boards/openmv_h7/board.c2
-rw-r--r--ports/stm/boards/pyb_nano_v2/board.c2
-rw-r--r--ports/stm/boards/pyboard_v11/board.c2
-rw-r--r--ports/stm/boards/stm32f411ce_blackpill/board.c2
-rw-r--r--ports/stm/boards/stm32f411ve_discovery/board.c2
-rw-r--r--ports/stm/boards/stm32f412zg_discovery/board.c2
-rw-r--r--ports/stm/boards/stm32f4_discovery/board.c2
-rw-r--r--ports/stm/boards/stm32f746g_discovery/board.c2
-rw-r--r--ports/stm/boards/thunderpack_v11/board.c (renamed from ports/stm/boards/thunderpack/board.c)2
-rw-r--r--ports/stm/boards/thunderpack_v11/mpconfigboard.h (renamed from ports/stm/boards/thunderpack/mpconfigboard.h)2
-rw-r--r--ports/stm/boards/thunderpack_v11/mpconfigboard.mk (renamed from ports/stm/boards/thunderpack/mpconfigboard.mk)2
-rw-r--r--ports/stm/boards/thunderpack_v11/pins.c (renamed from ports/stm/boards/thunderpack/pins.c)0
-rw-r--r--ports/stm/boards/thunderpack_v12/board.c (renamed from ports/nrf/boards/board.h)23
-rw-r--r--ports/stm/boards/thunderpack_v12/mpconfigboard.h57
-rw-r--r--ports/stm/boards/thunderpack_v12/mpconfigboard.mk21
-rw-r--r--ports/stm/boards/thunderpack_v12/pins.c39
-rw-r--r--ports/stm/common-hal/busio/SPI.c2
-rw-r--r--ports/stm/common-hal/microcontroller/Pin.c40
-rw-r--r--ports/stm/common-hal/microcontroller/Processor.c9
-rw-r--r--ports/stm/common-hal/nvm/ByteArray.c2
-rw-r--r--ports/stm/common-hal/rgbmatrix/RGBMatrix.h4
-rw-r--r--ports/stm/common-hal/sdioio/SDCard.c2
-rw-r--r--ports/stm/supervisor/internal_flash.h8
-rw-r--r--ports/stm/supervisor/port.c8
-rw-r--r--ports/unix/modjni.c4
-rw-r--r--py/argcheck.c18
-rw-r--r--py/bc.c4
-rw-r--r--py/builtinimport.c12
-rw-r--r--py/circuitpy_defns.mk22
-rw-r--r--py/circuitpy_mpconfig.h32
-rw-r--r--py/circuitpy_mpconfig.mk12
-rw-r--r--py/compile.c12
-rw-r--r--py/enum.h4
-rw-r--r--py/genlast.py4
-rw-r--r--py/modbuiltins.c6
-rw-r--r--py/modsys.c6
-rw-r--r--py/obj.c67
-rw-r--r--py/obj.h5
-rw-r--r--py/objdict.c6
-rw-r--r--py/objexcept.c3
-rw-r--r--py/objfloat.c7
-rw-r--r--py/objnamedtuple.c20
-rw-r--r--py/objset.c2
-rw-r--r--py/objstr.c113
-rw-r--r--py/objtype.c24
-rw-r--r--py/parsenum.c10
-rw-r--r--py/py.mk4
-rw-r--r--py/pystack.c4
-rw-r--r--py/reload.c22
-rw-r--r--py/reload.h22
-rw-r--r--py/runtime.c84
-rw-r--r--py/runtime.h1
-rw-r--r--shared-bindings/_typing/__init__.pyi14
-rw-r--r--shared-bindings/adafruit_bus_device/I2CDevice.c259
-rw-r--r--shared-bindings/adafruit_bus_device/I2CDevice.h53
-rw-r--r--shared-bindings/adafruit_bus_device/SPIDevice.c128
-rw-r--r--shared-bindings/adafruit_bus_device/SPIDevice.h50
-rw-r--r--shared-bindings/adafruit_bus_device/__init__.c78
-rw-r--r--shared-bindings/adafruit_bus_device/__init__.h32
-rw-r--r--shared-bindings/alarm/__init__.c209
-rw-r--r--shared-bindings/alarm/__init__.h52
-rw-r--r--shared-bindings/alarm/pin/PinAlarm.c131
-rw-r--r--shared-bindings/alarm/pin/PinAlarm.h43
-rw-r--r--shared-bindings/alarm/time/TimeAlarm.c143
-rw-r--r--shared-bindings/alarm/time/TimeAlarm.h (renamed from ports/cxd56/boards/board.h)24
-rw-r--r--shared-bindings/audiopwmio/__init__.h6
-rw-r--r--shared-bindings/displayio/ColorConverter.c4
-rw-r--r--shared-bindings/displayio/EPaperDisplay.c24
-rw-r--r--shared-bindings/displayio/EPaperDisplay.h2
-rw-r--r--shared-bindings/i2cperipheral/I2CPeripheral.c8
-rw-r--r--shared-bindings/microcontroller/Processor.c18
-rw-r--r--shared-bindings/microcontroller/Processor.h2
-rw-r--r--shared-bindings/microcontroller/ResetReason.c77
-rw-r--r--shared-bindings/microcontroller/ResetReason.h45
-rw-r--r--shared-bindings/microcontroller/__init__.c12
-rw-r--r--shared-bindings/microcontroller/__init__.h5
-rw-r--r--shared-bindings/os/__init__.c6
-rw-r--r--shared-bindings/ps2io/Ps2.c5
-rw-r--r--shared-bindings/random/__init__.h2
-rw-r--r--shared-bindings/rotaryio/__init__.c2
-rw-r--r--shared-bindings/socketpool/Socket.c122
-rw-r--r--shared-bindings/socketpool/Socket.h4
-rw-r--r--shared-bindings/supervisor/RunReason.c62
-rw-r--r--shared-bindings/supervisor/RunReason.h36
-rwxr-xr-xshared-bindings/supervisor/Runtime.c27
-rwxr-xr-xshared-bindings/supervisor/Runtime.h3
-rw-r--r--shared-bindings/supervisor/__init__.c10
-rw-r--r--shared-bindings/time/__init__.c5
-rw-r--r--shared-bindings/time/__init__.h2
-rw-r--r--shared-bindings/watchdog/WatchDogTimer.c7
-rw-r--r--shared-bindings/wifi/Radio.c35
-rw-r--r--shared-bindings/wifi/__init__.h1
-rw-r--r--shared-module/_eve/__init__.c4
-rw-r--r--shared-module/adafruit_bus_device/I2CDevice.c79
-rw-r--r--shared-module/adafruit_bus_device/I2CDevice.h39
-rw-r--r--shared-module/adafruit_bus_device/SPIDevice.c85
-rw-r--r--shared-module/adafruit_bus_device/SPIDevice.h44
-rw-r--r--shared-module/adafruit_bus_device/__init__.c0
-rw-r--r--shared-module/displayio/EPaperDisplay.c23
-rw-r--r--shared-module/displayio/Palette.c3
-rw-r--r--shared-module/random/__init__.c2
-rw-r--r--shared-module/rgbmatrix/RGBMatrix.c25
-rw-r--r--shared-module/sharpdisplay/SharpMemoryFramebuffer.c57
-rw-r--r--shared-module/sharpdisplay/SharpMemoryFramebuffer.h1
-rw-r--r--shared-module/time/__init__.c2
-rw-r--r--shared-module/usb_midi/__init__.c8
-rw-r--r--supervisor/board.h (renamed from ports/esp32s2/boards/board.h)22
-rwxr-xr-xsupervisor/memory.h33
-rw-r--r--supervisor/port.h14
-rw-r--r--supervisor/shared/board.c19
-rw-r--r--supervisor/shared/board.h14
-rw-r--r--supervisor/shared/display.c57
-rw-r--r--supervisor/shared/external_flash/external_flash.c2
-rwxr-xr-xsupervisor/shared/memory.c319
-rw-r--r--supervisor/shared/rgb_led_status.c8
-rw-r--r--supervisor/shared/rgb_led_status.h2
-rw-r--r--supervisor/shared/safe_mode.c8
-rw-r--r--supervisor/shared/serial.c4
-rwxr-xr-xsupervisor/shared/stack.c38
-rwxr-xr-xsupervisor/shared/stack.h6
-rw-r--r--supervisor/shared/tick.c4
-rw-r--r--supervisor/shared/usb/usb.c1
-rw-r--r--supervisor/shared/workflow.c47
-rw-r--r--supervisor/shared/workflow.h32
-rw-r--r--supervisor/supervisor.mk1
-rwxr-xr-xsupervisor/workflow.h30
-rw-r--r--tools/build_board_info.py137
-rw-r--r--tools/extract_pyi.py2
480 files changed, 9267 insertions, 2256 deletions
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index c83f37e6e..2378a0965 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -14,7 +14,7 @@ on:
jobs:
test:
- runs-on: ubuntu-18.04
+ runs-on: ubuntu-20.04
steps:
- name: Dump GitHub context
env:
@@ -119,6 +119,7 @@ jobs:
zip -9r circuitpython-stubs.zip circuitpython-stubs
[ -z "$AWS_ACCESS_KEY_ID" ] || aws s3 cp circuitpython-stubs.zip s3://adafruit-circuit-python/bin/stubs/circuitpython-stubs-${{ env.CP_VERSION }}.zip --no-progress --region us-east-1
env:
+ AWS_PAGER: ''
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
if: github.event_name == 'push' || (github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested'))
@@ -159,13 +160,14 @@ jobs:
run: |
[ -z "$AWS_ACCESS_KEY_ID" ] || aws s3 cp mpy-cross/mpy-cross s3://adafruit-circuit-python/bin/mpy-cross/mpy-cross-macos-catalina-${{ env.CP_VERSION }} --no-progress --region us-east-1
env:
+ AWS_PAGER: ''
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
if: github.event_name == 'push' || (github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested'))
build-arm:
- runs-on: ubuntu-18.04
+ runs-on: ubuntu-20.04
needs: test
strategy:
fail-fast: false
@@ -196,6 +198,8 @@ jobs:
- "circuitplayground_express_displayio"
- "clue_nrf52840_express"
- "cp32-m4"
+ - "cp_sapling_m0"
+ - "cp_sapling_m0_spiflash"
- "datalore_ip_m4"
- "datum_distance"
- "datum_imu"
@@ -315,7 +319,8 @@ jobs:
- "teensy40"
- "teensy41"
- "teknikio_bluebird"
- - "thunderpack"
+ - "thunderpack_v11"
+ - "thunderpack_v12"
- "tinkeringtech_scoutmakes_azul"
- "trellis_m4_express"
- "trinket_m0"
@@ -363,12 +368,13 @@ jobs:
- name: Upload to S3
run: "[ -z \"$AWS_ACCESS_KEY_ID\" ] || aws s3 cp bin/ s3://adafruit-circuit-python/bin/ --recursive --no-progress --region us-east-1"
env:
+ AWS_PAGER: ''
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
if: github.event_name == 'push' || (github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested'))
build-riscv:
- runs-on: ubuntu-18.04
+ runs-on: ubuntu-20.04
needs: test
strategy:
fail-fast: false
@@ -411,11 +417,12 @@ jobs:
- name: Upload to S3
run: "[ -z \"$AWS_ACCESS_KEY_ID\" ] || aws s3 cp bin/ s3://adafruit-circuit-python/bin/ --recursive --no-progress --region us-east-1"
env:
+ AWS_PAGER: ''
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
if: github.event_name == 'push' || (github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested'))
build-xtensa:
- runs-on: ubuntu-latest
+ runs-on: ubuntu-20.04
needs: test
strategy:
fail-fast: false
@@ -505,6 +512,7 @@ jobs:
- name: Upload to S3
run: "[ -z \"$AWS_ACCESS_KEY_ID\" ] || aws s3 cp bin/ s3://adafruit-circuit-python/bin/ --recursive --no-progress --region us-east-1"
env:
+ AWS_PAGER: ''
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
if: github.event_name == 'push' || (github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested'))
diff --git a/.github/workflows/create_website_pr.yml b/.github/workflows/create_website_pr.yml
index 71959ffdc..c8aca30e4 100644
--- a/.github/workflows/create_website_pr.yml
+++ b/.github/workflows/create_website_pr.yml
@@ -10,7 +10,7 @@ on:
jobs:
website:
- runs-on: ubuntu-latest
+ runs-on: ubuntu-20.04
steps:
- name: Dump GitHub context
env:
diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml
index eac9bfe09..8caf56d26 100644
--- a/.github/workflows/pre-commit.yml
+++ b/.github/workflows/pre-commit.yml
@@ -11,7 +11,7 @@ on:
jobs:
pre-commit:
- runs-on: ubuntu-latest
+ runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v1
- uses: actions/setup-python@v1
diff --git a/.gitmodules b/.gitmodules
index f66ce8aaf..d36613d60 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -152,4 +152,7 @@
url = https://github.com/adafruit/Adafruit_CircuitPython_RFM69.git
[submodule "ports/esp32s2/esp-idf"]
path = ports/esp32s2/esp-idf
- url = https://github.com/espressif/esp-idf.git
+ url = https://github.com/jepler/esp-idf.git
+[submodule "ports/esp32s2/certificates/nina-fw"]
+ path = ports/esp32s2/certificates/nina-fw
+ url = https://github.com/adafruit/nina-fw.git
diff --git a/Makefile b/Makefile
index e553b85e8..a1807c308 100644
--- a/Makefile
+++ b/Makefile
@@ -265,7 +265,7 @@ update-frozen-libraries:
@echo "Updating all frozen libraries to latest tagged version."
cd frozen; for library in *; do cd $$library; ../../tools/git-checkout-latest-tag.sh; cd ..; done
-one-of-each: samd21 samd51 esp32s2 litex mimxrt10xx nrf stm
+one-of-each: samd21 litex mimxrt10xx nrf stm
samd21:
$(MAKE) -C ports/atmel-samd BOARD=trinket_m0
diff --git a/README.rst b/README.rst
index d21e8d8d3..19992d284 100644
--- a/README.rst
+++ b/README.rst
@@ -114,14 +114,14 @@ Behavior
finishes or is interrupted. After it is done running, the vm and
hardware is reinitialized. **This means you cannot read state from**
``code.py`` **in the REPL anymore.** CircuitPython's goal for this
- change includes reduce confusion about pins and memory being used.
+ change includes reducing confusion about pins and memory being used.
- After ``code.py`` the REPL can be entered by pressing any key. It no
longer shares state with ``code.py`` so it is a fresh vm.
- Autoreload state will be maintained across reload.
- Adds a safe mode that does not run user code after a hard crash or
brown out. The hope is that this will make it easier to fix code that
causes nasty crashes by making it available through mass storage
- after the crash. A reset (the button) is needed after its fixed to
+ after the crash. A reset (the button) is needed after it's fixed to
get back into normal mode.
- RGB status LED indicating CircuitPython state, and errors through a sequence of colored flashes.
- Re-runs ``code.py`` or other main file after file system writes over USB mass storage. (Disable with
diff --git a/conf.py b/conf.py
index 1d4c42048..1a90b617b 100644
--- a/conf.py
+++ b/conf.py
@@ -172,6 +172,7 @@ exclude_patterns = ["**/build*",
"ports/atmel-samd/tools",
"ports/cxd56/mkspk",
"ports/cxd56/spresense-exported-sdk",
+ "ports/esp32s2/certificates",
"ports/esp32s2/esp-idf",
"ports/esp32s2/peripherals",
"ports/litex/hw",
diff --git a/docs/design_guide.rst b/docs/design_guide.rst
index cc2a3b296..75825893a 100644
--- a/docs/design_guide.rst
+++ b/docs/design_guide.rst
@@ -421,7 +421,7 @@ SPI Example
"""Widget's one register."""
with self.spi_device as spi:
spi.write(b'0x00')
- i2c.readinto(self.buf)
+ spi.readinto(self.buf)
return self.buf[0]
Use composition
@@ -462,7 +462,7 @@ like properties for state even if it sacrifices a bit of speed.
Avoid allocations in drivers
--------------------------------------------------------------------------------
-Although Python doesn't require managing memory, its still a good practice for
+Although Python doesn't require managing memory, it's still a good practice for
library writers to think about memory allocations. Avoid them in drivers if
you can because you never know how much something will be called. Fewer
allocations means less time spent cleaning up. So, where you can, prefer
@@ -471,7 +471,7 @@ object with methods that read or write into the buffer instead of creating new
objects. Unified hardware API classes such as `busio.SPI` are design to read and
write to subsections of buffers.
-Its ok to allocate an object to return to the user. Just beware of causing more
+It's ok to allocate an object to return to the user. Just beware of causing more
than one allocation per call due to internal logic.
**However**, this is a memory tradeoff so do not do it for large or rarely used
@@ -580,4 +580,4 @@ MicroPython compatibility
--------------------------------------------------------------------------------
Keeping compatibility with MicroPython isn't a high priority. It should be done
-when its not in conflict with any of the above goals.
+when it's not in conflict with any of the above goals.
diff --git a/docs/drivers.rst b/docs/drivers.rst
index 241415cc1..8855abbd2 100644
--- a/docs/drivers.rst
+++ b/docs/drivers.rst
@@ -12,7 +12,7 @@ Adafruit CircuitPython Library Bundle
We provide a bundle of all our libraries to ease installation of drivers and
their dependencies. The bundle is primarily geared to the Adafruit Express line
of boards which feature a relatively large external flash. With Express boards,
-its easy to copy them all onto the filesystem. However, if you don't have
+it's easy to copy them all onto the filesystem. However, if you don't have
enough space simply copy things over as they are needed.
- The Adafruit bundles are available on GitHub: <https://github.com/adafruit/Adafruit_CircuitPython_Bundle/releases>.
diff --git a/docs/library/hashlib.rst b/docs/library/hashlib.rst
index 0205d5e6a..8e5ebc2d1 100644
--- a/docs/library/hashlib.rst
+++ b/docs/library/hashlib.rst
@@ -20,10 +20,10 @@ be implemented:
* SHA1 - A previous generation algorithm. Not recommended for new usages,
but SHA1 is a part of number of Internet standards and existing
applications, so boards targeting network connectivity and
- interoperatiability will try to provide this.
+ interoperability will try to provide this.
* MD5 - A legacy algorithm, not considered cryptographically secure. Only
- selected boards, targeting interoperatibility with legacy applications,
+ selected boards, targeting interoperability with legacy applications,
will offer this.
Constructors
diff --git a/docs/library/index.rst b/docs/library/index.rst
index f847ead0a..e91387242 100644
--- a/docs/library/index.rst
+++ b/docs/library/index.rst
@@ -21,7 +21,7 @@ standard Python library.
You may need to change your code later if you rely
on any non-standard functionality they currently provide.
-CircuitPython's goal long-term goalis that code written in CircuitPython
+CircuitPython's long-term goal is that code written in CircuitPython
using Python standard libraries will be runnable on CPython without changes.
Some libraries below are not enabled on CircuitPython builds with
@@ -69,7 +69,7 @@ CircuitPython/MicroPython-specific libraries
--------------------------------------------
Functionality specific to the CircuitPython/MicroPython implementation is available in
-the following libraries. These libraries may change signficantly or be removed in future
+the following libraries. These libraries may change significantly or be removed in future
versions of CircuitPython.
.. toctree::
diff --git a/docs/library/network.rst b/docs/library/network.rst
index bd32267fe..3bd41150d 100644
--- a/docs/library/network.rst
+++ b/docs/library/network.rst
@@ -71,7 +71,7 @@ parameter should be `id`.
(password) required to access said service. There can be further
arbitrary keyword-only parameters, depending on the networking medium
type and/or particular device. Parameters can be used to: a)
- specify alternative service identifer types; b) provide additional
+ specify alternative service identifier types; b) provide additional
connection parameters. For various medium types, there are different
sets of predefined/recommended parameters, among them:
diff --git a/docs/porting.rst b/docs/porting.rst
index 6cd59fefb..8d0262455 100644
--- a/docs/porting.rst
+++ b/docs/porting.rst
@@ -106,7 +106,7 @@ request a safe mode state which prevents the supervisor from running user code
while still allowing access to the REPL and other resources.
The core port initialization and reset methods are defined in
-``supervisor/port.c`` and should be the first to be implemented. Its required
+``supervisor/port.c`` and should be the first to be implemented. It's required
that they be implemented in the ``supervisor`` directory within the port
directory. That way, they are always in the expected place.
diff --git a/docs/troubleshooting.rst b/docs/troubleshooting.rst
index 66bcc2764..45c637f34 100644
--- a/docs/troubleshooting.rst
+++ b/docs/troubleshooting.rst
@@ -13,7 +13,7 @@ When CircuitPython restarts it will create a fresh empty ``CIRCUITPY`` filesyste
This often happens on Windows when the ``CIRCUITPY`` disk is not safely ejected
before being reset by the button or being disconnected from USB. This can also
-happen on Linux and Mac OSX but its less likely.
+happen on Linux and Mac OSX but it's less likely.
.. caution:: To erase and re-create ``CIRCUITPY`` (for example, to correct a corrupted filesystem),
follow one of the procedures below. It's important to note that **any files stored on the**
@@ -43,7 +43,7 @@ ValueError: Incompatible ``.mpy`` file.
This error occurs when importing a module that is stored as a ``mpy`` binary file
(rather than a ``py`` text file) that was generated by a different version of
-CircuitPython than the one its being loaded into. Most versions are compatible
+CircuitPython than the one it's being loaded into. Most versions are compatible
but, rarely they aren't. In particular, the ``mpy`` binary format changed between
CircuitPython versions 1.x and 2.x, and will change again between 2.x and 3.x.
diff --git a/extmod/machine_mem.c b/extmod/machine_mem.c
index 6c6e11063..8944c3a66 100644
--- a/extmod/machine_mem.c
+++ b/extmod/machine_mem.c
@@ -21,7 +21,7 @@
STATIC uintptr_t machine_mem_get_addr(mp_obj_t addr_o, uint align) {
uintptr_t addr = mp_obj_int_get_truncated(addr_o);
if ((addr & (align - 1)) != 0) {
- nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, translate("address %08x is not aligned to %d bytes"), addr, align));
+ mp_raise_ValueError_varg(translate("address %08x is not aligned to %d bytes"), addr, align);
}
return addr;
}
diff --git a/extmod/moduheapq.c b/extmod/moduheapq.c
index bc4b97ff5..50fe6c051 100644
--- a/extmod/moduheapq.c
+++ b/extmod/moduheapq.c
@@ -62,7 +62,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(mod_uheapq_heappush_obj, mod_uheapq_heappush);
STATIC mp_obj_t mod_uheapq_heappop(mp_obj_t heap_in) {
mp_obj_list_t *heap = get_heap(heap_in);
if (heap->len == 0) {
- nlr_raise(mp_obj_new_exception_msg(&mp_type_IndexError, translate("empty heap")));
+ mp_raise_IndexError(translate("empty heap"));
}
mp_obj_t item = heap->items[0];
heap->len -= 1;
diff --git a/extmod/modujson.c b/extmod/modujson.c
index 431b5e0cf..3bb4b3301 100644
--- a/extmod/modujson.c
+++ b/extmod/modujson.c
@@ -57,6 +57,8 @@ typedef struct _ujson_stream_t {
int errcode;
mp_obj_t python_readinto[2 + 1];
mp_obj_array_t bytearray_obj;
+ size_t start;
+ size_t end;
byte cur;
} ujson_stream_t;
@@ -77,28 +79,44 @@ STATIC byte ujson_stream_next(ujson_stream_t *s) {
return s->cur;
}
+// We read from an object's `readinto` method in chunks larger than the json
+// parser needs to reduce the number of function calls done.
+
+#define CIRCUITPY_JSON_READ_CHUNK_SIZE 64
+
STATIC mp_uint_t ujson_python_readinto(mp_obj_t obj, void *buf, mp_uint_t size, int *errcode) {
+ (void) size; // Ignore size because we know it's always 1.
ujson_stream_t* s = obj;
- s->bytearray_obj.items = buf;
- s->bytearray_obj.len = size;
- *errcode = 0;
- mp_obj_t ret = mp_call_method_n_kw(1, 0, s->python_readinto);
- if (ret == mp_const_none) {
- *errcode = MP_EAGAIN;
- return MP_STREAM_ERROR;
+
+ if (s->start == s->end) {
+ *errcode = 0;
+ mp_obj_t ret = mp_call_method_n_kw(1, 0, s->python_readinto);
+ if (ret == mp_const_none) {
+ *errcode = MP_EAGAIN;
+ return MP_STREAM_ERROR;
+ }
+ s->start = 0;
+ s->end = mp_obj_get_int(ret);
}
- return mp_obj_get_int(ret);
+
+ *((uint8_t *)buf) = ((uint8_t*) s->bytearray_obj.items)[s->start];
+ s->start++;
+ return 1;
}
STATIC mp_obj_t _mod_ujson_load(mp_obj_t stream_obj, bool return_first_json) {
const mp_stream_p_t *stream_p = mp_proto_get(MP_QSTR_protocol_stream, stream_obj);
ujson_stream_t s;
+ uint8_t character_buffer[CIRCUITPY_JSON_READ_CHUNK_SIZE];
if (stream_p == NULL) {
+ s.start = 0;
+ s.end = 0;
mp_load_method(stream_obj, MP_QSTR_readinto, s.python_readinto);
s.bytearray_obj.base.type = &mp_type_bytearray;
s.bytearray_obj.typecode = BYTEARRAY_TYPECODE;
+ s.bytearray_obj.len = CIRCUITPY_JSON_READ_CHUNK_SIZE;
s.bytearray_obj.free = 0;
- // len and items are set at read time
+ s.bytearray_obj.items = character_buffer;
s.python_readinto[2] = MP_OBJ_FROM_PTR(&s.bytearray_obj);
s.stream_obj = &s;
s.read = ujson_python_readinto;
diff --git a/extmod/modure.c b/extmod/modure.c
index a20f3ee42..bb54bc732 100644
--- a/extmod/modure.c
+++ b/extmod/modure.c
@@ -43,7 +43,7 @@ STATIC mp_obj_t match_group(mp_obj_t self_in, mp_obj_t no_in) {
mp_obj_match_t *self = MP_OBJ_TO_PTR(self_in);
mp_int_t no = mp_obj_get_int(no_in);
if (no < 0 || no >= self->num_matches) {
- nlr_raise(mp_obj_new_exception_arg1(&mp_type_IndexError, no_in));
+ mp_raise_arg1(&mp_type_IndexError, no_in);
}
const char *start = self->caps[no * 2];
@@ -82,7 +82,7 @@ STATIC void match_span_helper(size_t n_args, const mp_obj_t *args, mp_obj_t span
if (n_args == 2) {
no = mp_obj_get_int(args[1]);
if (no < 0 || no >= self->num_matches) {
- nlr_raise(mp_obj_new_exception_arg1(&mp_type_IndexError, args[1]));
+ mp_raise_arg1(&mp_type_IndexError, args[1]);
}
}
@@ -326,7 +326,7 @@ STATIC mp_obj_t re_sub_helper(mp_obj_t self_in, size_t n_args, const mp_obj_t *a
}
if (match_no >= (unsigned int)match->num_matches) {
- nlr_raise(mp_obj_new_exception_arg1(&mp_type_IndexError, MP_OBJ_NEW_SMALL_INT(match_no)));
+ mp_raise_arg1(&mp_type_IndexError, MP_OBJ_NEW_SMALL_INT(match_no));
}
const char *start_match = match->caps[match_no * 2];
diff --git a/extmod/moduzlib.c b/extmod/moduzlib.c
index 8422e7598..b344f9642 100644
--- a/extmod/moduzlib.c
+++ b/extmod/moduzlib.c
@@ -179,7 +179,7 @@ STATIC mp_obj_t mod_uzlib_decompress(size_t n_args, const mp_obj_t *args) {
return res;
error:
- nlr_raise(mp_obj_new_exception_arg1(&mp_type_ValueError, MP_OBJ_NEW_SMALL_INT(st)));
+ mp_raise_arg1(&mp_type_ValueError, MP_OBJ_NEW_SMALL_INT(st));
}
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_uzlib_decompress_obj, 1, 3, mod_uzlib_decompress);
diff --git a/extmod/ulab b/extmod/ulab
-Subproject 8242b84753355433b61230ab6631c06e5ac77f3
+Subproject aa7e741530df471d206a4a321823a37a913a0eb
diff --git a/extmod/vfs_posix_file.c b/extmod/vfs_posix_file.c
index 3f887785e..593b8d6a2 100644
--- a/extmod/vfs_posix_file.c
+++ b/extmod/vfs_posix_file.c
@@ -24,7 +24,7 @@ typedef struct _mp_obj_vfs_posix_file_t {
#ifdef MICROPY_CPYTHON_COMPAT
STATIC void check_fd_is_open(const mp_obj_vfs_posix_file_t *o) {
if (o->fd < 0) {
- nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, translate("I/O operation on closed file")));
+ mp_raise_ValueError(translate("I/O operation on closed file"));
}
}
#else
diff --git a/frozen/Adafruit_CircuitPython_Requests b/frozen/Adafruit_CircuitPython_Requests
-Subproject 43017e30a1e772b67ac68293a944e863c031e38
+Subproject 53902152c674b0ba31536b50291f7ddd28960f4
diff --git a/lib/tinyusb b/lib/tinyusb
-Subproject 8b2c82255750488232eae72f3d5dcbacfd6227f
+Subproject 218b80e63ab6ff87c1851e403f08b3d716d68f5
diff --git a/lib/utils/pyexec.c b/lib/utils/pyexec.c
index 378fb6267..68a3710ce 100755
--- a/lib/utils/pyexec.c
+++ b/lib/utils/pyexec.c
@@ -101,7 +101,7 @@ STATIC int parse_compile_execute(const void *source, mp_parse_input_kind_t input
#endif
}
- // If the code was loaded from a file its likely to be running for a while so we'll long
+ // If the code was loaded from a file it's likely to be running for a while so we'll long
// live it and collect any garbage before running.
if (input_kind == MP_PARSE_FILE_INPUT) {
module_fun = make_obj_long_lived(module_fun, 6);
@@ -132,6 +132,10 @@ STATIC int parse_compile_execute(const void *source, mp_parse_input_kind_t input
if (mp_obj_is_subclass_fast(mp_obj_get_type((mp_obj_t)nlr.ret_val), &mp_type_SystemExit)) {
// at the moment, the value of SystemExit is unused
ret = pyexec_system_exit;
+#if CIRCUITPY_ALARM
+ } else if (mp_obj_is_subclass_fast(mp_obj_get_type((mp_obj_t)nlr.ret_val), &mp_type_DeepSleepRequest)) {
+ ret = PYEXEC_DEEP_SLEEP;
+#endif
} else {
if ((mp_obj_t) nlr.ret_val != MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_reload_exception))) {
mp_obj_print_exception(&mp_plat_print, (mp_obj_t)nlr.ret_val);
diff --git a/lib/utils/pyexec.h b/lib/utils/pyexec.h
index cef72a76c..4c773cd64 100644
--- a/lib/utils/pyexec.h
+++ b/lib/utils/pyexec.h
@@ -49,6 +49,7 @@ extern int pyexec_system_exit;
#define PYEXEC_FORCED_EXIT (0x100)
#define PYEXEC_SWITCH_MODE (0x200)
#define PYEXEC_EXCEPTION (0x400)
+#define PYEXEC_DEEP_SLEEP (0x800)
int pyexec_raw_repl(void);
int pyexec_friendly_repl(void);
diff --git a/locale/ID.po b/locale/ID.po
index 90e416b3b..9645dc702 100644
--- a/locale/ID.po
+++ b/locale/ID.po
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-04 21:18+0530\n"
+"POT-Creation-Date: 2020-11-27 23:57-0500\n"
"PO-Revision-Date: 2020-10-10 23:51+0000\n"
"Last-Translator: oon arfiandwi <oon.arfiandwi@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -300,7 +300,9 @@ msgstr ""
msgid "All I2C peripherals are in use"
msgstr "Semua perangkat I2C sedang digunakan"
-#: ports/esp32s2/peripherals/pcnt_handler.c
+#: ports/esp32s2/common-hal/countio/Counter.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/rotaryio/IncrementalEncoder.c
msgid "All PCNT units in use"
msgstr ""
@@ -336,6 +338,7 @@ msgstr "Semua timer untuk pin ini sedang digunakan"
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
#: ports/cxd56/common-hal/pulseio/PulseOut.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
#: ports/esp32s2/common-hal/neopixel_write/__init__.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c
#: ports/esp32s2/common-hal/pulseio/PulseOut.c
@@ -501,7 +504,8 @@ msgstr "Panjang buffer harus kelipatan 512"
msgid "Buffer must be a multiple of 512 bytes"
msgstr ""
-#: shared-bindings/bitbangio/I2C.c shared-bindings/busio/I2C.c
+#: shared-bindings/bitbangio/I2C.c shared-bindings/busdevice/I2CDevice.c
+#: shared-bindings/busio/I2C.c
msgid "Buffer must be at least length 1"
msgstr "Penyangga harus memiliki panjang setidaknya 1"
@@ -859,6 +863,10 @@ msgstr "Diharapkan sebuah UUID"
msgid "Expected an Address"
msgstr "Diharapkan sebuah Alamat"
+#: shared-bindings/alarm/__init__.c
+msgid "Expected an alarm"
+msgstr ""
+
#: shared-module/_pixelbuf/PixelBuf.c
#, c-format
msgid "Expected tuple of length %d, got %d"
@@ -872,6 +880,10 @@ msgstr "Penyebaran yang diperluas dengan respon pindai tidak didukung."
msgid "FFT is defined for ndarrays only"
msgstr "FFT didefinisikan hanya untuk ndarrays"
+#: extmod/ulab/code/fft/fft.c
+msgid "FFT is implemented for linear arrays only"
+msgstr ""
+
#: ports/esp32s2/common-hal/socketpool/Socket.c
msgid "Failed SSL handshake"
msgstr ""
@@ -1001,6 +1013,10 @@ msgstr "Gagal Inisialisasi I2C"
msgid "I2SOut not available"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "IOs 0, 2 & 4 do not support internal pullup in sleep"
+msgstr ""
+
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
@@ -1018,6 +1034,10 @@ msgstr ""
msgid "Incorrect buffer size"
msgstr "Ukuran penyangga salah"
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "Initialization failed due to lack of memory"
+msgstr ""
+
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
msgid "Input taking too long"
msgstr ""
@@ -1098,6 +1118,7 @@ msgid "Invalid byteorder string"
msgstr "String byteorder tidak valid"
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
msgid "Invalid capture period. Valid range: 1 - 500"
msgstr "Periode penangkapan tidak valid. Kisaran yang valid: 1 - 500"
@@ -1274,6 +1295,10 @@ msgstr "Harus menyediakan pin MISO atau MOSI"
msgid "Must use a multiple of 6 rgb pins, not %d"
msgstr "Harus menggunakan kelipatan 6 pin rgb, bukan %d"
+#: ports/esp32s2/common-hal/nvm/ByteArray.c
+msgid "NVS Error"
+msgstr ""
+
#: py/parse.c
msgid "Name too long"
msgstr "Nama terlalu panjang"
@@ -1292,6 +1317,11 @@ msgstr "Tidak ada DAC (Digital Analog Converter) di dalam chip"
msgid "No DMA channel found"
msgstr "tidak ada channel DMA ditemukan"
+#: shared-module/busdevice/I2CDevice.c
+#, c-format
+msgid "No I2C device at address: %x"
+msgstr ""
+
#: ports/esp32s2/common-hal/busio/SPI.c ports/mimxrt10xx/common-hal/busio/SPI.c
#: ports/stm/common-hal/busio/SPI.c
msgid "No MISO Pin"
@@ -1426,14 +1456,14 @@ msgstr "Parity ganjil tidak didukung"
msgid "Only 8 or 16 bit mono with "
msgstr "Hanya 8 atau 16 bit mono dengan "
-#: ports/esp32s2/common-hal/socketpool/SocketPool.c
-msgid "Only IPv4 SOCK_STREAM sockets supported"
-msgstr ""
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr ""
+#: ports/esp32s2/common-hal/socketpool/SocketPool.c
+msgid "Only IPv4 sockets supported"
+msgstr ""
+
#: shared-module/displayio/OnDiskBitmap.c
#, c-format
msgid ""
@@ -1451,6 +1481,10 @@ msgstr ""
"Hanya monokrom, 4bpp atau 8bpp yang diindeks, dan 16bpp atau lebih yang "
"didukung: %d bpp diberikan"
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "Only one alarm.time alarm can be set."
+msgstr ""
+
#: shared-module/displayio/ColorConverter.c
msgid "Only one color can be transparent at a time"
msgstr ""
@@ -1510,6 +1544,10 @@ msgstr "Pin harus mendukung interupsi perangkat keras"
msgid "Pin number already reserved by EXTI"
msgstr "Nomor pin sudah dipesan oleh EXTI"
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "PinAlarm not yet implemented"
+msgstr ""
+
#: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format
msgid ""
@@ -1576,7 +1614,7 @@ msgstr "Pembalikan RS485 ditentukan saat tidak dalam mode RS485"
msgid "RTC calibration is not supported on this board"
msgstr "Kalibrasi RTC tidak didukung pada board ini"
-#: shared-bindings/time/__init__.c
+#: shared-bindings/alarm/time/TimeAlarm.c shared-bindings/time/__init__.c
msgid "RTC is not supported on this board"
msgstr "RTC tidak didukung di board ini"
@@ -1723,6 +1761,10 @@ msgstr "Aliran tidak menemukan metode readinto() atau write()."
msgid "Supply at least one UART pin"
msgstr "Berikan setidaknya satu pin UART"
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Supply one of monotonic_time or epoch_time"
+msgstr ""
+
#: shared-bindings/gnss/GNSS.c
msgid "System entry must be gnss.SatelliteSystem"
msgstr ""
@@ -1790,6 +1832,10 @@ msgstr ""
msgid "Tile width must exactly divide bitmap width"
msgstr ""
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Time is in the past."
+msgstr ""
+
#: ports/nrf/common-hal/_bleio/Adapter.c
#, c-format
msgid "Timeout is too long: Maximum timeout length is %d seconds"
@@ -1986,7 +2032,7 @@ msgstr ""
msgid "WARNING: Your code filename has two extensions\n"
msgstr "PERINGATAN: Nama file kode anda mempunyai dua ekstensi\n"
-#: shared-bindings/watchdog/WatchDogTimer.c
+#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "WatchDogTimer cannot be deinitialized once mode is set to RESET"
msgstr ""
@@ -2071,10 +2117,6 @@ msgstr ""
msgid "addresses is empty"
msgstr ""
-#: extmod/ulab/code/vector/vectorise.c
-msgid "arctan2 is implemented for scalars and ndarrays only"
-msgstr ""
-
#: py/modbuiltins.c
msgid "arg is an empty sequence"
msgstr ""
@@ -2083,6 +2125,10 @@ msgstr ""
msgid "argsort argument must be an ndarray"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
+msgid "argsort is not implemented for flattened arrays"
+msgstr ""
+
#: py/runtime.c
msgid "argument has wrong type"
msgstr ""
@@ -2100,15 +2146,23 @@ msgstr "argumen num/types tidak cocok"
msgid "argument should be a '%q' not a '%q'"
msgstr ""
-#: extmod/ulab/code/linalg/linalg.c
+#: extmod/ulab/code/linalg/linalg.c extmod/ulab/code/numerical/numerical.c
msgid "arguments must be ndarrays"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "array and index length must be equal"
+msgstr ""
+
#: py/objarray.c shared-bindings/nvm/ByteArray.c
msgid "array/bytes required on right side"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
+msgid "attempt to get (arg)min/(arg)max of empty sequence"
+msgstr ""
+
+#: extmod/ulab/code/numerical/numerical.c
msgid "attempt to get argmin/argmax of an empty sequence"
msgstr ""
@@ -2117,15 +2171,15 @@ msgid "attributes not supported yet"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, None, or 1"
+msgid "axis is out of bounds"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, or 1"
+msgid "axis must be None, or an integer"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be None, 0, or 1"
+msgid "axis too long"
msgstr ""
#: py/builtinevex.c
@@ -2330,6 +2384,10 @@ msgid ""
"can't switch from manual field specification to automatic field numbering"
msgstr ""
+#: extmod/ulab/code/ndarray_operators.c
+msgid "cannot cast output with casting rule"
+msgstr ""
+
#: py/objtype.c
msgid "cannot create '%q' instances"
msgstr ""
@@ -2346,10 +2404,6 @@ msgstr ""
msgid "cannot perform relative import"
msgstr "tidak dapat melakukan relative import"
-#: extmod/ulab/code/ndarray.c
-msgid "cannot reshape array (incompatible input/output shape)"
-msgstr ""
-
#: py/emitnative.c
msgid "casting"
msgstr ""
@@ -2422,10 +2476,6 @@ msgstr ""
msgid "convolve arguments must not be empty"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "could not broadast input array from shape"
-msgstr ""
-
#: extmod/ulab/code/poly/poly.c
msgid "could not invert Vandermonde matrix"
msgstr ""
@@ -2434,6 +2484,10 @@ msgstr ""
msgid "couldn't determine SD card version"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
+msgid "cross is defined for 1D arrays of length 3"
+msgstr ""
+
#: extmod/ulab/code/approx/approx.c
msgid "data must be iterable"
msgstr ""
@@ -2442,10 +2496,6 @@ msgstr ""
msgid "data must be of equal length"
msgstr ""
-#: extmod/ulab/code/numerical/numerical.c
-msgid "ddof must be smaller than length of data set"
-msgstr ""
-
#: py/parsenum.c
msgid "decimal numbers not supported"
msgstr ""
@@ -2475,6 +2525,10 @@ msgstr ""
msgid "diff argument must be an ndarray"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
+msgid "differentiation order out of range"
+msgstr ""
+
#: py/modmath.c py/objfloat.c py/objint_longlong.c py/objint_mpz.c py/runtime.c
#: shared-bindings/math/__init__.c
msgid "division by zero"
@@ -2504,6 +2558,10 @@ msgstr ""
msgid "end_x should be an int"
msgstr ""
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "epoch_time not supported on this board"
+msgstr ""
+
#: ports/nrf/common-hal/busio/UART.c
#, c-format
msgid "error = 0x%08lX"
@@ -2590,6 +2648,10 @@ msgstr ""
msgid "first argument must be a function"
msgstr ""
+#: extmod/ulab/code/ulab_create.c
+msgid "first argument must be a tuple of ndarrays"
+msgstr ""
+
#: extmod/ulab/code/ndarray.c
msgid "first argument must be an iterable"
msgstr ""
@@ -2643,8 +2705,8 @@ msgstr "fungsi mendapatkan nilai ganda untuk argumen '%q'"
msgid "function has the same sign at the ends of interval"
msgstr ""
-#: extmod/ulab/code/compare/compare.c
-msgid "function is implemented for scalars and ndarrays only"
+#: extmod/ulab/code/ndarray.c
+msgid "function is defined for ndarrays only"
msgstr ""
#: py/argcheck.c
@@ -2714,6 +2776,7 @@ msgstr "lapisan (padding) tidak benar"
msgid "index is out of bounds"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c py/obj.c
msgid "index out of range"
msgstr "index keluar dari jangkauan"
@@ -2738,6 +2801,10 @@ msgstr ""
msgid "inline assembler must be a function"
msgstr "inline assembler harus sebuah fungsi"
+#: extmod/ulab/code/ndarray.c
+msgid "input and output shapes are not compatible"
+msgstr ""
+
#: extmod/ulab/code/ulab_create.c
msgid "input argument must be an integer or a 2-tuple"
msgstr ""
@@ -2746,6 +2813,10 @@ msgstr ""
msgid "input array length must be power of 2"
msgstr ""
+#: extmod/ulab/code/ulab_create.c
+msgid "input arrays are not compatible"
+msgstr ""
+
#: extmod/ulab/code/poly/poly.c
msgid "input data must be an iterable"
msgstr ""
@@ -2758,6 +2829,22 @@ msgstr ""
msgid "input matrix is singular"
msgstr ""
+#: extmod/ulab/code/user/user.c
+msgid "input must be a dense ndarray"
+msgstr ""
+
+#: extmod/ulab/code/ulab_create.c
+msgid "input must be a tensor of rank 2"
+msgstr ""
+
+#: extmod/ulab/code/ulab_create.c extmod/ulab/code/user/user.c
+msgid "input must be an ndarray"
+msgstr ""
+
+#: extmod/ulab/code/filter/filter.c
+msgid "input must be one-dimensional"
+msgstr ""
+
#: extmod/ulab/code/linalg/linalg.c
msgid "input must be square matrix"
msgstr ""
@@ -2770,6 +2857,10 @@ msgstr ""
msgid "input vectors must be of equal length"
msgstr ""
+#: extmod/ulab/code/poly/poly.c
+msgid "inputs are not iterable"
+msgstr ""
+
#: py/parsenum.c
msgid "int() arg 2 must be >= 2 and <= 36"
msgstr ""
@@ -2840,6 +2931,10 @@ msgstr ""
msgid "invalid syntax for number"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "io must be rtc io"
+msgstr ""
+
#: py/objtype.c
msgid "issubclass() arg 1 must be a class"
msgstr ""
@@ -2938,6 +3033,10 @@ msgstr ""
msgid "max_length must be > 0"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "maximum number of dimensions is 4"
+msgstr ""
+
#: py/runtime.c
msgid "maximum recursion depth exceeded"
msgstr ""
@@ -2987,10 +3086,6 @@ msgstr ""
msgid "must use keyword argument for key function"
msgstr ""
-#: extmod/ulab/code/numerical/numerical.c
-msgid "n must be between 0, and 9"
-msgstr ""
-
#: py/runtime.c
msgid "name '%q' is not defined"
msgstr ""
@@ -3073,6 +3168,10 @@ msgstr "non-keyword arg setelah */**"
msgid "non-keyword arg after keyword arg"
msgstr "non-keyword arg setelah keyword arg"
+#: extmod/ulab/code/linalg/linalg.c
+msgid "norm is defined for 1D and 2D arrays"
+msgstr ""
+
#: shared-bindings/_bleio/UUID.c
msgid "not a 128-bit UUID"
msgstr ""
@@ -3085,10 +3184,6 @@ msgstr ""
msgid "not enough arguments for format string"
msgstr ""
-#: extmod/ulab/code/poly/poly.c
-msgid "number of arguments must be 2, or 3"
-msgstr ""
-
#: extmod/ulab/code/ulab_create.c
msgid "number of points must be at least 2"
msgstr ""
@@ -3141,6 +3236,10 @@ msgstr ""
msgid "odd-length string"
msgstr "panjang data string memiliki keganjilan (odd-length)"
+#: extmod/ulab/code/ulab_create.c
+msgid "offset is too large"
+msgstr ""
+
#: py/objstr.c py/objstrunicode.c
#, fuzzy
msgid "offset out of bounds"
@@ -3164,6 +3263,14 @@ msgstr ""
msgid "operands could not be broadcast together"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "operation is implemented for 1D Boolean arrays only"
+msgstr ""
+
+#: extmod/ulab/code/numerical/numerical.c
+msgid "operation is not implemented for flattened array"
+msgstr ""
+
#: extmod/ulab/code/numerical/numerical.c
msgid "operation is not implemented on ndarrays"
msgstr ""
@@ -3254,6 +3361,7 @@ msgstr ""
msgid "pow() with 3 arguments requires integers"
msgstr ""
+#: ports/esp32s2/boards/adafruit_magtag_2.9_grayscale/mpconfigboard.h
#: ports/esp32s2/boards/adafruit_metro_esp32s2/mpconfigboard.h
#: ports/esp32s2/boards/electroniccats_bastwifi/mpconfigboard.h
#: ports/esp32s2/boards/espressif_kaluga_1/mpconfigboard.h
@@ -3297,6 +3405,10 @@ msgstr "relative import"
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 ""
+
#: py/compile.c
msgid "return annotation must be an identifier"
msgstr "anotasi return harus sebuah identifier"
@@ -3315,8 +3427,8 @@ msgstr ""
msgid "rgb_pins[%d] is not on the same port as clock"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "right hand side must be an ndarray, or a scalar"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "roll argument must be an ndarray"
msgstr ""
#: py/objstr.c
@@ -3342,7 +3454,7 @@ msgid "script compilation not supported"
msgstr "kompilasi script tidak didukung"
#: extmod/ulab/code/ndarray.c
-msgid "shape must be a 2-tuple"
+msgid "shape must be a tuple"
msgstr ""
#: py/objstr.c
@@ -3385,10 +3497,6 @@ msgstr "memulai ulang software(soft reboot)\n"
msgid "sort argument must be an ndarray"
msgstr ""
-#: extmod/ulab/code/numerical/numerical.c
-msgid "sorted axis can't be longer than 65535"
-msgstr ""
-
#: extmod/ulab/code/filter/filter.c
msgid "sos array must be of shape (n_section, 6)"
msgstr ""
@@ -3469,6 +3577,7 @@ msgstr ""
msgid "time.struct_time() takes a 9-sequence"
msgstr ""
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "timeout duration exceeded the maximum supported value"
msgstr ""
@@ -3494,6 +3603,10 @@ msgstr ""
msgid "timestamp out of range for platform time_t"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "tobytes can be invoked for dense arrays only"
+msgstr ""
+
#: shared-module/struct/__init__.c
msgid "too many arguments provided with the given format"
msgstr ""
@@ -3511,6 +3624,10 @@ msgstr ""
msgid "trapz is defined for 1D arrays of equal length"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "trigger level must be 0 or 1"
+msgstr ""
+
#: extmod/ulab/code/linalg/linalg.c
msgid "tuple index out of range"
msgstr ""
@@ -3653,6 +3770,14 @@ msgstr ""
msgid "vectors must have same lengths"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "wakeup conflict"
+msgstr ""
+
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "watchdog not initialized"
+msgstr ""
+
#: shared-bindings/watchdog/WatchDogTimer.c
msgid "watchdog timeout must be greater than 0"
msgstr ""
@@ -3665,12 +3790,12 @@ msgstr ""
msgid "window must be <= interval"
msgstr ""
-#: extmod/ulab/code/linalg/linalg.c
-msgid "wrong argument type"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "wrong axis index"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "wrong index type"
+#: extmod/ulab/code/ulab_create.c
+msgid "wrong axis specified"
msgstr ""
#: extmod/ulab/code/vector/vectorise.c
diff --git a/locale/circuitpython.pot b/locale/circuitpython.pot
index 0a4303f66..11ca8c814 100644
--- a/locale/circuitpython.pot
+++ b/locale/circuitpython.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-04 21:18+0530\n"
+"POT-Creation-Date: 2020-12-08 09:56-0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -296,7 +296,9 @@ msgstr ""
msgid "All I2C peripherals are in use"
msgstr ""
-#: ports/esp32s2/peripherals/pcnt_handler.c
+#: ports/esp32s2/common-hal/countio/Counter.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/rotaryio/IncrementalEncoder.c
msgid "All PCNT units in use"
msgstr ""
@@ -332,6 +334,7 @@ msgstr ""
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
#: ports/cxd56/common-hal/pulseio/PulseOut.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
#: ports/esp32s2/common-hal/neopixel_write/__init__.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c
#: ports/esp32s2/common-hal/pulseio/PulseOut.c
@@ -495,6 +498,7 @@ msgstr ""
msgid "Buffer must be a multiple of 512 bytes"
msgstr ""
+#: shared-bindings/adafruit_bus_device/I2CDevice.c
#: shared-bindings/bitbangio/I2C.c shared-bindings/busio/I2C.c
msgid "Buffer must be at least length 1"
msgstr ""
@@ -841,6 +845,10 @@ msgstr ""
msgid "Expected an Address"
msgstr ""
+#: shared-bindings/alarm/__init__.c
+msgid "Expected an alarm"
+msgstr ""
+
#: shared-module/_pixelbuf/PixelBuf.c
#, c-format
msgid "Expected tuple of length %d, got %d"
@@ -854,6 +862,10 @@ msgstr ""
msgid "FFT is defined for ndarrays only"
msgstr ""
+#: extmod/ulab/code/fft/fft.c
+msgid "FFT is implemented for linear arrays only"
+msgstr ""
+
#: ports/esp32s2/common-hal/socketpool/Socket.c
msgid "Failed SSL handshake"
msgstr ""
@@ -982,6 +994,10 @@ msgstr ""
msgid "I2SOut not available"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "IOs 0, 2 & 4 do not support internal pullup in sleep"
+msgstr ""
+
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
@@ -997,6 +1013,10 @@ msgstr ""
msgid "Incorrect buffer size"
msgstr ""
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "Initialization failed due to lack of memory"
+msgstr ""
+
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
msgid "Input taking too long"
msgstr ""
@@ -1077,6 +1097,7 @@ msgid "Invalid byteorder string"
msgstr ""
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
msgid "Invalid capture period. Valid range: 1 - 500"
msgstr ""
@@ -1253,6 +1274,10 @@ msgstr ""
msgid "Must use a multiple of 6 rgb pins, not %d"
msgstr ""
+#: ports/esp32s2/common-hal/nvm/ByteArray.c
+msgid "NVS Error"
+msgstr ""
+
#: py/parse.c
msgid "Name too long"
msgstr ""
@@ -1271,6 +1296,11 @@ msgstr ""
msgid "No DMA channel found"
msgstr ""
+#: shared-module/adafruit_bus_device/I2CDevice.c
+#, c-format
+msgid "No I2C device at address: %x"
+msgstr ""
+
#: ports/esp32s2/common-hal/busio/SPI.c ports/mimxrt10xx/common-hal/busio/SPI.c
#: ports/stm/common-hal/busio/SPI.c
msgid "No MISO Pin"
@@ -1403,14 +1433,14 @@ msgstr ""
msgid "Only 8 or 16 bit mono with "
msgstr ""
-#: ports/esp32s2/common-hal/socketpool/SocketPool.c
-msgid "Only IPv4 SOCK_STREAM sockets supported"
-msgstr ""
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr ""
+#: ports/esp32s2/common-hal/socketpool/SocketPool.c
+msgid "Only IPv4 sockets supported"
+msgstr ""
+
#: shared-module/displayio/OnDiskBitmap.c
#, c-format
msgid ""
@@ -1424,6 +1454,10 @@ msgid ""
"%d bpp given"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "Only one alarm.time alarm can be set."
+msgstr ""
+
#: shared-module/displayio/ColorConverter.c
msgid "Only one color can be transparent at a time"
msgstr ""
@@ -1469,6 +1503,7 @@ msgstr ""
msgid "Pin does not have ADC capabilities"
msgstr ""
+#: shared-bindings/adafruit_bus_device/SPIDevice.c
#: shared-bindings/digitalio/DigitalInOut.c
msgid "Pin is input only"
msgstr ""
@@ -1481,6 +1516,10 @@ msgstr ""
msgid "Pin number already reserved by EXTI"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "PinAlarm not yet implemented"
+msgstr ""
+
#: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format
msgid ""
@@ -1517,7 +1556,11 @@ msgid "Prefix buffer must be on the heap"
msgstr ""
#: main.c
-msgid "Press any key to enter the REPL. Use CTRL-D to reload."
+msgid "Press any key to enter the REPL. Use CTRL-D to reload.\n"
+msgstr ""
+
+#: main.c
+msgid "Pretending to deep sleep until alarm, any key or file write.\n"
msgstr ""
#: shared-bindings/digitalio/DigitalInOut.c
@@ -1542,7 +1585,7 @@ msgstr ""
msgid "RTC calibration is not supported on this board"
msgstr ""
-#: shared-bindings/time/__init__.c
+#: shared-bindings/alarm/time/TimeAlarm.c shared-bindings/time/__init__.c
msgid "RTC is not supported on this board"
msgstr ""
@@ -1688,6 +1731,10 @@ msgstr ""
msgid "Supply at least one UART pin"
msgstr ""
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Supply one of monotonic_time or epoch_time"
+msgstr ""
+
#: shared-bindings/gnss/GNSS.c
msgid "System entry must be gnss.SatelliteSystem"
msgstr ""
@@ -1751,6 +1798,10 @@ msgstr ""
msgid "Tile width must exactly divide bitmap width"
msgstr ""
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Time is in the past."
+msgstr ""
+
#: ports/nrf/common-hal/_bleio/Adapter.c
#, c-format
msgid "Timeout is too long: Maximum timeout length is %d seconds"
@@ -1946,7 +1997,7 @@ msgstr ""
msgid "WARNING: Your code filename has two extensions\n"
msgstr ""
-#: shared-bindings/watchdog/WatchDogTimer.c
+#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "WatchDogTimer cannot be deinitialized once mode is set to RESET"
msgstr ""
@@ -1980,6 +2031,10 @@ msgstr ""
msgid "WiFi password must be between 8 and 63 characters"
msgstr ""
+#: main.c
+msgid "Woken up by alarm.\n"
+msgstr ""
+
#: ports/nrf/common-hal/_bleio/PacketBuffer.c
msgid "Writes not supported on Characteristic"
msgstr ""
@@ -2025,10 +2080,6 @@ msgstr ""
msgid "addresses is empty"
msgstr ""
-#: extmod/ulab/code/vector/vectorise.c
-msgid "arctan2 is implemented for scalars and ndarrays only"
-msgstr ""
-
#: py/modbuiltins.c
msgid "arg is an empty sequence"
msgstr ""
@@ -2037,6 +2088,10 @@ msgstr ""
msgid "argsort argument must be an ndarray"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
+msgid "argsort is not implemented for flattened arrays"
+msgstr ""
+
#: py/runtime.c
msgid "argument has wrong type"
msgstr ""
@@ -2054,15 +2109,23 @@ msgstr ""
msgid "argument should be a '%q' not a '%q'"
msgstr ""
-#: extmod/ulab/code/linalg/linalg.c
+#: extmod/ulab/code/linalg/linalg.c extmod/ulab/code/numerical/numerical.c
msgid "arguments must be ndarrays"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "array and index length must be equal"
+msgstr ""
+
#: py/objarray.c shared-bindings/nvm/ByteArray.c
msgid "array/bytes required on right side"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
+msgid "attempt to get (arg)min/(arg)max of empty sequence"
+msgstr ""
+
+#: extmod/ulab/code/numerical/numerical.c
msgid "attempt to get argmin/argmax of an empty sequence"
msgstr ""
@@ -2071,15 +2134,15 @@ msgid "attributes not supported yet"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, None, or 1"
+msgid "axis is out of bounds"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, or 1"
+msgid "axis must be None, or an integer"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be None, 0, or 1"
+msgid "axis too long"
msgstr ""
#: py/builtinevex.c
@@ -2283,6 +2346,10 @@ msgid ""
"can't switch from manual field specification to automatic field numbering"
msgstr ""
+#: extmod/ulab/code/ndarray_operators.c
+msgid "cannot cast output with casting rule"
+msgstr ""
+
#: py/objtype.c
msgid "cannot create '%q' instances"
msgstr ""
@@ -2299,10 +2366,6 @@ msgstr ""
msgid "cannot perform relative import"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "cannot reshape array (incompatible input/output shape)"
-msgstr ""
-
#: py/emitnative.c
msgid "casting"
msgstr ""
@@ -2375,10 +2438,6 @@ msgstr ""
msgid "convolve arguments must not be empty"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "could not broadast input array from shape"
-msgstr ""
-
#: extmod/ulab/code/poly/poly.c
msgid "could not invert Vandermonde matrix"
msgstr ""
@@ -2387,6 +2446,10 @@ msgstr ""
msgid "couldn't determine SD card version"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
+msgid "cross is defined for 1D arrays of length 3"
+msgstr ""
+
#: extmod/ulab/code/approx/approx.c
msgid "data must be iterable"
msgstr ""
@@ -2395,10 +2458,6 @@ msgstr ""
msgid "data must be of equal length"
msgstr ""
-#: extmod/ulab/code/numerical/numerical.c
-msgid "ddof must be smaller than length of data set"
-msgstr ""
-
#: py/parsenum.c
msgid "decimal numbers not supported"
msgstr ""
@@ -2428,6 +2487,10 @@ msgstr ""
msgid "diff argument must be an ndarray"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
+msgid "differentiation order out of range"
+msgstr ""
+
#: py/modmath.c py/objfloat.c py/objint_longlong.c py/objint_mpz.c py/runtime.c
#: shared-bindings/math/__init__.c
msgid "division by zero"
@@ -2457,6 +2520,10 @@ msgstr ""
msgid "end_x should be an int"
msgstr ""
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "epoch_time not supported on this board"
+msgstr ""
+
#: ports/nrf/common-hal/busio/UART.c
#, c-format
msgid "error = 0x%08lX"
@@ -2543,6 +2610,10 @@ msgstr ""
msgid "first argument must be a function"
msgstr ""
+#: extmod/ulab/code/ulab_create.c
+msgid "first argument must be a tuple of ndarrays"
+msgstr ""
+
#: extmod/ulab/code/ndarray.c
msgid "first argument must be an iterable"
msgstr ""
@@ -2596,8 +2667,8 @@ msgstr ""
msgid "function has the same sign at the ends of interval"
msgstr ""
-#: extmod/ulab/code/compare/compare.c
-msgid "function is implemented for scalars and ndarrays only"
+#: extmod/ulab/code/ndarray.c
+msgid "function is defined for ndarrays only"
msgstr ""
#: py/argcheck.c
@@ -2667,6 +2738,7 @@ msgstr ""
msgid "index is out of bounds"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c py/obj.c
msgid "index out of range"
msgstr ""
@@ -2691,6 +2763,10 @@ msgstr ""
msgid "inline assembler must be a function"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "input and output shapes are not compatible"
+msgstr ""
+
#: extmod/ulab/code/ulab_create.c
msgid "input argument must be an integer or a 2-tuple"
msgstr ""
@@ -2699,6 +2775,10 @@ msgstr ""
msgid "input array length must be power of 2"
msgstr ""
+#: extmod/ulab/code/ulab_create.c
+msgid "input arrays are not compatible"
+msgstr ""
+
#: extmod/ulab/code/poly/poly.c
msgid "input data must be an iterable"
msgstr ""
@@ -2711,6 +2791,22 @@ msgstr ""
msgid "input matrix is singular"
msgstr ""
+#: extmod/ulab/code/user/user.c
+msgid "input must be a dense ndarray"
+msgstr ""
+
+#: extmod/ulab/code/ulab_create.c
+msgid "input must be a tensor of rank 2"
+msgstr ""
+
+#: extmod/ulab/code/ulab_create.c extmod/ulab/code/user/user.c
+msgid "input must be an ndarray"
+msgstr ""
+
+#: extmod/ulab/code/filter/filter.c
+msgid "input must be one-dimensional"
+msgstr ""
+
#: extmod/ulab/code/linalg/linalg.c
msgid "input must be square matrix"
msgstr ""
@@ -2723,6 +2819,10 @@ msgstr ""
msgid "input vectors must be of equal length"
msgstr ""
+#: extmod/ulab/code/poly/poly.c
+msgid "inputs are not iterable"
+msgstr ""
+
#: py/parsenum.c
msgid "int() arg 2 must be >= 2 and <= 36"
msgstr ""
@@ -2793,6 +2893,10 @@ msgstr ""
msgid "invalid syntax for number"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "io must be rtc io"
+msgstr ""
+
#: py/objtype.c
msgid "issubclass() arg 1 must be a class"
msgstr ""
@@ -2891,6 +2995,10 @@ msgstr ""
msgid "max_length must be > 0"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "maximum number of dimensions is 4"
+msgstr ""
+
#: py/runtime.c
msgid "maximum recursion depth exceeded"
msgstr ""
@@ -2940,10 +3048,6 @@ msgstr ""
msgid "must use keyword argument for key function"
msgstr ""
-#: extmod/ulab/code/numerical/numerical.c
-msgid "n must be between 0, and 9"
-msgstr ""
-
#: py/runtime.c
msgid "name '%q' is not defined"
msgstr ""
@@ -3026,6 +3130,10 @@ msgstr ""
msgid "non-keyword arg after keyword arg"
msgstr ""
+#: extmod/ulab/code/linalg/linalg.c
+msgid "norm is defined for 1D and 2D arrays"
+msgstr ""
+
#: shared-bindings/_bleio/UUID.c
msgid "not a 128-bit UUID"
msgstr ""
@@ -3038,10 +3146,6 @@ msgstr ""
msgid "not enough arguments for format string"
msgstr ""
-#: extmod/ulab/code/poly/poly.c
-msgid "number of arguments must be 2, or 3"
-msgstr ""
-
#: extmod/ulab/code/ulab_create.c
msgid "number of points must be at least 2"
msgstr ""
@@ -3094,6 +3198,10 @@ msgstr ""
msgid "odd-length string"
msgstr ""
+#: extmod/ulab/code/ulab_create.c
+msgid "offset is too large"
+msgstr ""
+
#: py/objstr.c py/objstrunicode.c
msgid "offset out of bounds"
msgstr ""
@@ -3116,6 +3224,14 @@ msgstr ""
msgid "operands could not be broadcast together"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "operation is implemented for 1D Boolean arrays only"
+msgstr ""
+
+#: extmod/ulab/code/numerical/numerical.c
+msgid "operation is not implemented for flattened array"
+msgstr ""
+
#: extmod/ulab/code/numerical/numerical.c
msgid "operation is not implemented on ndarrays"
msgstr ""
@@ -3206,6 +3322,7 @@ msgstr ""
msgid "pow() with 3 arguments requires integers"
msgstr ""
+#: ports/esp32s2/boards/adafruit_magtag_2.9_grayscale/mpconfigboard.h
#: ports/esp32s2/boards/adafruit_metro_esp32s2/mpconfigboard.h
#: ports/esp32s2/boards/electroniccats_bastwifi/mpconfigboard.h
#: ports/esp32s2/boards/espressif_kaluga_1/mpconfigboard.h
@@ -3249,6 +3366,10 @@ msgstr ""
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 ""
+
#: py/compile.c
msgid "return annotation must be an identifier"
msgstr ""
@@ -3267,8 +3388,8 @@ msgstr ""
msgid "rgb_pins[%d] is not on the same port as clock"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "right hand side must be an ndarray, or a scalar"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "roll argument must be an ndarray"
msgstr ""
#: py/objstr.c
@@ -3294,7 +3415,7 @@ msgid "script compilation not supported"
msgstr ""
#: extmod/ulab/code/ndarray.c
-msgid "shape must be a 2-tuple"
+msgid "shape must be a tuple"
msgstr ""
#: py/objstr.c
@@ -3337,10 +3458,6 @@ msgstr ""
msgid "sort argument must be an ndarray"
msgstr ""
-#: extmod/ulab/code/numerical/numerical.c
-msgid "sorted axis can't be longer than 65535"
-msgstr ""
-
#: extmod/ulab/code/filter/filter.c
msgid "sos array must be of shape (n_section, 6)"
msgstr ""
@@ -3421,6 +3538,7 @@ msgstr ""
msgid "time.struct_time() takes a 9-sequence"
msgstr ""
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "timeout duration exceeded the maximum supported value"
msgstr ""
@@ -3445,6 +3563,10 @@ msgstr ""
msgid "timestamp out of range for platform time_t"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "tobytes can be invoked for dense arrays only"
+msgstr ""
+
#: shared-module/struct/__init__.c
msgid "too many arguments provided with the given format"
msgstr ""
@@ -3462,6 +3584,10 @@ msgstr ""
msgid "trapz is defined for 1D arrays of equal length"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "trigger level must be 0 or 1"
+msgstr ""
+
#: extmod/ulab/code/linalg/linalg.c
msgid "tuple index out of range"
msgstr ""
@@ -3604,6 +3730,14 @@ msgstr ""
msgid "vectors must have same lengths"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "wakeup conflict"
+msgstr ""
+
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "watchdog not initialized"
+msgstr ""
+
#: shared-bindings/watchdog/WatchDogTimer.c
msgid "watchdog timeout must be greater than 0"
msgstr ""
@@ -3616,12 +3750,12 @@ msgstr ""
msgid "window must be <= interval"
msgstr ""
-#: extmod/ulab/code/linalg/linalg.c
-msgid "wrong argument type"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "wrong axis index"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "wrong index type"
+#: extmod/ulab/code/ulab_create.c
+msgid "wrong axis specified"
msgstr ""
#: extmod/ulab/code/vector/vectorise.c
diff --git a/locale/cs.po b/locale/cs.po
index f02d31e4d..e8287d266 100644
--- a/locale/cs.po
+++ b/locale/cs.po
@@ -5,16 +5,16 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-04 21:18+0530\n"
-"PO-Revision-Date: 2020-05-24 03:22+0000\n"
-"Last-Translator: dronecz <mzuzelka@gmail.com>\n"
+"POT-Creation-Date: 2020-11-27 23:57-0500\n"
+"PO-Revision-Date: 2020-12-02 20:29+0000\n"
+"Last-Translator: vkuthan <vit.kuthan@seznam.cz>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: cs\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
-"X-Generator: Weblate 4.1-dev\n"
+"X-Generator: Weblate 4.4-dev\n"
#: main.c
msgid ""
@@ -74,7 +74,7 @@ msgstr "%q index je mimo rozsah"
#: py/obj.c
msgid "%q indices must be integers, not %q"
-msgstr ""
+msgstr "%q indexy musí být celá Äísla, ne %q"
#: shared-bindings/vectorio/Polygon.c
msgid "%q list must be a list"
@@ -82,7 +82,7 @@ msgstr "Seznam %q musí být seznam"
#: shared-bindings/memorymonitor/AllocationAlarm.c
msgid "%q must be >= 0"
-msgstr ""
+msgstr "%q musí být >= 0"
#: shared-bindings/_bleio/CharacteristicBuffer.c
#: shared-bindings/_bleio/PacketBuffer.c shared-bindings/displayio/Group.c
@@ -98,7 +98,7 @@ msgstr " %q musí být n-tice délky 2"
#: shared-bindings/canio/Match.c
msgid "%q out of range"
-msgstr ""
+msgstr "%q je mimo rozsah"
#: ports/atmel-samd/common-hal/microcontroller/Pin.c
msgid "%q pin invalid"
@@ -122,35 +122,35 @@ msgstr ""
#: py/proto.c
msgid "'%q' object does not support '%q'"
-msgstr ""
+msgstr "Objekt '%q' nepodporuje '%q'"
#: py/obj.c
msgid "'%q' object does not support item assignment"
-msgstr ""
+msgstr "Objekt '%q' nepodporuje přiřazení položek"
#: py/obj.c
msgid "'%q' object does not support item deletion"
-msgstr ""
+msgstr "Objekt '%q' nepodporuje mazání položek"
#: py/runtime.c
msgid "'%q' object has no attribute '%q'"
-msgstr ""
+msgstr "Objekt '%q' nemá žádný atribut"
#: py/runtime.c
msgid "'%q' object is not an iterator"
-msgstr ""
+msgstr "Objekt '%q' není iterátor"
#: py/objtype.c py/runtime.c
msgid "'%q' object is not callable"
-msgstr ""
+msgstr "Objekt '%q' nelze volat"
#: py/runtime.c
msgid "'%q' object is not iterable"
-msgstr ""
+msgstr "Objekt '%q' není iterovatelný"
#: py/obj.c
msgid "'%q' object is not subscriptable"
-msgstr ""
+msgstr "Objekt '%q' nelze zapsat"
#: py/emitinlinethumb.c py/emitinlinextensa.c
#, c-format
@@ -170,17 +170,17 @@ msgstr ""
#: py/emitinlinethumb.c
#, c-format
msgid "'%s' expects an FPU register"
-msgstr ""
+msgstr "'%s' oÄekává register FPU"
#: py/emitinlinethumb.c
#, c-format
msgid "'%s' expects an address of the form [a, b]"
-msgstr ""
+msgstr "'%s' oÄekává adresu ve formátu [a, b]"
#: py/emitinlinethumb.c py/emitinlinextensa.c
#, c-format
msgid "'%s' expects an integer"
-msgstr ""
+msgstr "'%s' oÄekává integer (celé Äíslo)"
#: py/emitinlinethumb.c
#, c-format
@@ -190,7 +190,7 @@ msgstr ""
#: py/emitinlinethumb.c
#, c-format
msgid "'%s' expects {r0, r1, ...}"
-msgstr ""
+msgstr "'%s' oÄekává {r0, r1, ...}"
#: py/emitinlinextensa.c
#, c-format
@@ -300,7 +300,9 @@ msgstr ""
msgid "All I2C peripherals are in use"
msgstr ""
-#: ports/esp32s2/peripherals/pcnt_handler.c
+#: ports/esp32s2/common-hal/countio/Counter.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/rotaryio/IncrementalEncoder.c
msgid "All PCNT units in use"
msgstr ""
@@ -336,6 +338,7 @@ msgstr ""
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
#: ports/cxd56/common-hal/pulseio/PulseOut.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
#: ports/esp32s2/common-hal/neopixel_write/__init__.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c
#: ports/esp32s2/common-hal/pulseio/PulseOut.c
@@ -499,7 +502,8 @@ msgstr ""
msgid "Buffer must be a multiple of 512 bytes"
msgstr ""
-#: shared-bindings/bitbangio/I2C.c shared-bindings/busio/I2C.c
+#: shared-bindings/bitbangio/I2C.c shared-bindings/busdevice/I2CDevice.c
+#: shared-bindings/busio/I2C.c
msgid "Buffer must be at least length 1"
msgstr ""
@@ -845,6 +849,10 @@ msgstr ""
msgid "Expected an Address"
msgstr ""
+#: shared-bindings/alarm/__init__.c
+msgid "Expected an alarm"
+msgstr ""
+
#: shared-module/_pixelbuf/PixelBuf.c
#, c-format
msgid "Expected tuple of length %d, got %d"
@@ -858,6 +866,10 @@ msgstr ""
msgid "FFT is defined for ndarrays only"
msgstr ""
+#: extmod/ulab/code/fft/fft.c
+msgid "FFT is implemented for linear arrays only"
+msgstr ""
+
#: ports/esp32s2/common-hal/socketpool/Socket.c
msgid "Failed SSL handshake"
msgstr ""
@@ -986,6 +998,10 @@ msgstr ""
msgid "I2SOut not available"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "IOs 0, 2 & 4 do not support internal pullup in sleep"
+msgstr ""
+
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
@@ -1001,6 +1017,10 @@ msgstr ""
msgid "Incorrect buffer size"
msgstr ""
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "Initialization failed due to lack of memory"
+msgstr ""
+
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
msgid "Input taking too long"
msgstr ""
@@ -1081,6 +1101,7 @@ msgid "Invalid byteorder string"
msgstr ""
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
msgid "Invalid capture period. Valid range: 1 - 500"
msgstr ""
@@ -1257,6 +1278,10 @@ msgstr ""
msgid "Must use a multiple of 6 rgb pins, not %d"
msgstr ""
+#: ports/esp32s2/common-hal/nvm/ByteArray.c
+msgid "NVS Error"
+msgstr ""
+
#: py/parse.c
msgid "Name too long"
msgstr ""
@@ -1275,6 +1300,11 @@ msgstr ""
msgid "No DMA channel found"
msgstr ""
+#: shared-module/busdevice/I2CDevice.c
+#, c-format
+msgid "No I2C device at address: %x"
+msgstr ""
+
#: ports/esp32s2/common-hal/busio/SPI.c ports/mimxrt10xx/common-hal/busio/SPI.c
#: ports/stm/common-hal/busio/SPI.c
msgid "No MISO Pin"
@@ -1407,14 +1437,14 @@ msgstr ""
msgid "Only 8 or 16 bit mono with "
msgstr ""
-#: ports/esp32s2/common-hal/socketpool/SocketPool.c
-msgid "Only IPv4 SOCK_STREAM sockets supported"
-msgstr ""
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr ""
+#: ports/esp32s2/common-hal/socketpool/SocketPool.c
+msgid "Only IPv4 sockets supported"
+msgstr ""
+
#: shared-module/displayio/OnDiskBitmap.c
#, c-format
msgid ""
@@ -1428,6 +1458,10 @@ msgid ""
"%d bpp given"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "Only one alarm.time alarm can be set."
+msgstr ""
+
#: shared-module/displayio/ColorConverter.c
msgid "Only one color can be transparent at a time"
msgstr ""
@@ -1485,6 +1519,10 @@ msgstr ""
msgid "Pin number already reserved by EXTI"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "PinAlarm not yet implemented"
+msgstr ""
+
#: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format
msgid ""
@@ -1546,7 +1584,7 @@ msgstr ""
msgid "RTC calibration is not supported on this board"
msgstr ""
-#: shared-bindings/time/__init__.c
+#: shared-bindings/alarm/time/TimeAlarm.c shared-bindings/time/__init__.c
msgid "RTC is not supported on this board"
msgstr ""
@@ -1692,6 +1730,10 @@ msgstr ""
msgid "Supply at least one UART pin"
msgstr ""
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Supply one of monotonic_time or epoch_time"
+msgstr ""
+
#: shared-bindings/gnss/GNSS.c
msgid "System entry must be gnss.SatelliteSystem"
msgstr ""
@@ -1755,6 +1797,10 @@ msgstr ""
msgid "Tile width must exactly divide bitmap width"
msgstr ""
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Time is in the past."
+msgstr ""
+
#: ports/nrf/common-hal/_bleio/Adapter.c
#, c-format
msgid "Timeout is too long: Maximum timeout length is %d seconds"
@@ -1950,7 +1996,7 @@ msgstr ""
msgid "WARNING: Your code filename has two extensions\n"
msgstr ""
-#: shared-bindings/watchdog/WatchDogTimer.c
+#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "WatchDogTimer cannot be deinitialized once mode is set to RESET"
msgstr ""
@@ -2029,10 +2075,6 @@ msgstr ""
msgid "addresses is empty"
msgstr ""
-#: extmod/ulab/code/vector/vectorise.c
-msgid "arctan2 is implemented for scalars and ndarrays only"
-msgstr ""
-
#: py/modbuiltins.c
msgid "arg is an empty sequence"
msgstr ""
@@ -2041,6 +2083,10 @@ msgstr ""
msgid "argsort argument must be an ndarray"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
+msgid "argsort is not implemented for flattened arrays"
+msgstr ""
+
#: py/runtime.c
msgid "argument has wrong type"
msgstr ""
@@ -2058,15 +2104,23 @@ msgstr ""
msgid "argument should be a '%q' not a '%q'"
msgstr ""
-#: extmod/ulab/code/linalg/linalg.c
+#: extmod/ulab/code/linalg/linalg.c extmod/ulab/code/numerical/numerical.c
msgid "arguments must be ndarrays"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "array and index length must be equal"
+msgstr ""
+
#: py/objarray.c shared-bindings/nvm/ByteArray.c
msgid "array/bytes required on right side"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
+msgid "attempt to get (arg)min/(arg)max of empty sequence"
+msgstr ""
+
+#: extmod/ulab/code/numerical/numerical.c
msgid "attempt to get argmin/argmax of an empty sequence"
msgstr ""
@@ -2075,15 +2129,15 @@ msgid "attributes not supported yet"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, None, or 1"
+msgid "axis is out of bounds"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, or 1"
+msgid "axis must be None, or an integer"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be None, 0, or 1"
+msgid "axis too long"
msgstr ""
#: py/builtinevex.c
@@ -2287,6 +2341,10 @@ msgid ""
"can't switch from manual field specification to automatic field numbering"
msgstr ""
+#: extmod/ulab/code/ndarray_operators.c
+msgid "cannot cast output with casting rule"
+msgstr ""
+
#: py/objtype.c
msgid "cannot create '%q' instances"
msgstr ""
@@ -2303,10 +2361,6 @@ msgstr ""
msgid "cannot perform relative import"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "cannot reshape array (incompatible input/output shape)"
-msgstr ""
-
#: py/emitnative.c
msgid "casting"
msgstr ""
@@ -2379,10 +2433,6 @@ msgstr ""
msgid "convolve arguments must not be empty"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "could not broadast input array from shape"
-msgstr ""
-
#: extmod/ulab/code/poly/poly.c
msgid "could not invert Vandermonde matrix"
msgstr ""
@@ -2391,6 +2441,10 @@ msgstr ""
msgid "couldn't determine SD card version"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
+msgid "cross is defined for 1D arrays of length 3"
+msgstr ""
+
#: extmod/ulab/code/approx/approx.c
msgid "data must be iterable"
msgstr ""
@@ -2399,10 +2453,6 @@ msgstr ""
msgid "data must be of equal length"
msgstr ""
-#: extmod/ulab/code/numerical/numerical.c
-msgid "ddof must be smaller than length of data set"
-msgstr ""
-
#: py/parsenum.c
msgid "decimal numbers not supported"
msgstr ""
@@ -2432,6 +2482,10 @@ msgstr ""
msgid "diff argument must be an ndarray"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
+msgid "differentiation order out of range"
+msgstr ""
+
#: py/modmath.c py/objfloat.c py/objint_longlong.c py/objint_mpz.c py/runtime.c
#: shared-bindings/math/__init__.c
msgid "division by zero"
@@ -2461,6 +2515,10 @@ msgstr ""
msgid "end_x should be an int"
msgstr ""
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "epoch_time not supported on this board"
+msgstr ""
+
#: ports/nrf/common-hal/busio/UART.c
#, c-format
msgid "error = 0x%08lX"
@@ -2547,6 +2605,10 @@ msgstr ""
msgid "first argument must be a function"
msgstr ""
+#: extmod/ulab/code/ulab_create.c
+msgid "first argument must be a tuple of ndarrays"
+msgstr ""
+
#: extmod/ulab/code/ndarray.c
msgid "first argument must be an iterable"
msgstr ""
@@ -2600,8 +2662,8 @@ msgstr ""
msgid "function has the same sign at the ends of interval"
msgstr ""
-#: extmod/ulab/code/compare/compare.c
-msgid "function is implemented for scalars and ndarrays only"
+#: extmod/ulab/code/ndarray.c
+msgid "function is defined for ndarrays only"
msgstr ""
#: py/argcheck.c
@@ -2671,6 +2733,7 @@ msgstr ""
msgid "index is out of bounds"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c py/obj.c
msgid "index out of range"
msgstr ""
@@ -2695,6 +2758,10 @@ msgstr ""
msgid "inline assembler must be a function"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "input and output shapes are not compatible"
+msgstr ""
+
#: extmod/ulab/code/ulab_create.c
msgid "input argument must be an integer or a 2-tuple"
msgstr ""
@@ -2703,6 +2770,10 @@ msgstr ""
msgid "input array length must be power of 2"
msgstr ""
+#: extmod/ulab/code/ulab_create.c
+msgid "input arrays are not compatible"
+msgstr ""
+
#: extmod/ulab/code/poly/poly.c
msgid "input data must be an iterable"
msgstr ""
@@ -2715,6 +2786,22 @@ msgstr ""
msgid "input matrix is singular"
msgstr ""
+#: extmod/ulab/code/user/user.c
+msgid "input must be a dense ndarray"
+msgstr ""
+
+#: extmod/ulab/code/ulab_create.c
+msgid "input must be a tensor of rank 2"
+msgstr ""
+
+#: extmod/ulab/code/ulab_create.c extmod/ulab/code/user/user.c
+msgid "input must be an ndarray"
+msgstr ""
+
+#: extmod/ulab/code/filter/filter.c
+msgid "input must be one-dimensional"
+msgstr ""
+
#: extmod/ulab/code/linalg/linalg.c
msgid "input must be square matrix"
msgstr ""
@@ -2727,6 +2814,10 @@ msgstr ""
msgid "input vectors must be of equal length"
msgstr ""
+#: extmod/ulab/code/poly/poly.c
+msgid "inputs are not iterable"
+msgstr ""
+
#: py/parsenum.c
msgid "int() arg 2 must be >= 2 and <= 36"
msgstr ""
@@ -2797,6 +2888,10 @@ msgstr ""
msgid "invalid syntax for number"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "io must be rtc io"
+msgstr ""
+
#: py/objtype.c
msgid "issubclass() arg 1 must be a class"
msgstr ""
@@ -2895,6 +2990,10 @@ msgstr ""
msgid "max_length must be > 0"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "maximum number of dimensions is 4"
+msgstr ""
+
#: py/runtime.c
msgid "maximum recursion depth exceeded"
msgstr ""
@@ -2944,10 +3043,6 @@ msgstr ""
msgid "must use keyword argument for key function"
msgstr ""
-#: extmod/ulab/code/numerical/numerical.c
-msgid "n must be between 0, and 9"
-msgstr ""
-
#: py/runtime.c
msgid "name '%q' is not defined"
msgstr ""
@@ -3030,6 +3125,10 @@ msgstr ""
msgid "non-keyword arg after keyword arg"
msgstr ""
+#: extmod/ulab/code/linalg/linalg.c
+msgid "norm is defined for 1D and 2D arrays"
+msgstr ""
+
#: shared-bindings/_bleio/UUID.c
msgid "not a 128-bit UUID"
msgstr ""
@@ -3042,10 +3141,6 @@ msgstr ""
msgid "not enough arguments for format string"
msgstr ""
-#: extmod/ulab/code/poly/poly.c
-msgid "number of arguments must be 2, or 3"
-msgstr ""
-
#: extmod/ulab/code/ulab_create.c
msgid "number of points must be at least 2"
msgstr ""
@@ -3098,6 +3193,10 @@ msgstr ""
msgid "odd-length string"
msgstr ""
+#: extmod/ulab/code/ulab_create.c
+msgid "offset is too large"
+msgstr ""
+
#: py/objstr.c py/objstrunicode.c
msgid "offset out of bounds"
msgstr ""
@@ -3120,6 +3219,14 @@ msgstr ""
msgid "operands could not be broadcast together"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "operation is implemented for 1D Boolean arrays only"
+msgstr ""
+
+#: extmod/ulab/code/numerical/numerical.c
+msgid "operation is not implemented for flattened array"
+msgstr ""
+
#: extmod/ulab/code/numerical/numerical.c
msgid "operation is not implemented on ndarrays"
msgstr ""
@@ -3210,6 +3317,7 @@ msgstr ""
msgid "pow() with 3 arguments requires integers"
msgstr ""
+#: ports/esp32s2/boards/adafruit_magtag_2.9_grayscale/mpconfigboard.h
#: ports/esp32s2/boards/adafruit_metro_esp32s2/mpconfigboard.h
#: ports/esp32s2/boards/electroniccats_bastwifi/mpconfigboard.h
#: ports/esp32s2/boards/espressif_kaluga_1/mpconfigboard.h
@@ -3253,6 +3361,10 @@ msgstr ""
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 ""
+
#: py/compile.c
msgid "return annotation must be an identifier"
msgstr ""
@@ -3271,8 +3383,8 @@ msgstr ""
msgid "rgb_pins[%d] is not on the same port as clock"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "right hand side must be an ndarray, or a scalar"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "roll argument must be an ndarray"
msgstr ""
#: py/objstr.c
@@ -3298,7 +3410,7 @@ msgid "script compilation not supported"
msgstr ""
#: extmod/ulab/code/ndarray.c
-msgid "shape must be a 2-tuple"
+msgid "shape must be a tuple"
msgstr ""
#: py/objstr.c
@@ -3341,10 +3453,6 @@ msgstr ""
msgid "sort argument must be an ndarray"
msgstr ""
-#: extmod/ulab/code/numerical/numerical.c
-msgid "sorted axis can't be longer than 65535"
-msgstr ""
-
#: extmod/ulab/code/filter/filter.c
msgid "sos array must be of shape (n_section, 6)"
msgstr ""
@@ -3425,6 +3533,7 @@ msgstr ""
msgid "time.struct_time() takes a 9-sequence"
msgstr ""
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "timeout duration exceeded the maximum supported value"
msgstr ""
@@ -3449,6 +3558,10 @@ msgstr ""
msgid "timestamp out of range for platform time_t"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "tobytes can be invoked for dense arrays only"
+msgstr ""
+
#: shared-module/struct/__init__.c
msgid "too many arguments provided with the given format"
msgstr ""
@@ -3466,6 +3579,10 @@ msgstr ""
msgid "trapz is defined for 1D arrays of equal length"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "trigger level must be 0 or 1"
+msgstr ""
+
#: extmod/ulab/code/linalg/linalg.c
msgid "tuple index out of range"
msgstr ""
@@ -3608,6 +3725,14 @@ msgstr ""
msgid "vectors must have same lengths"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "wakeup conflict"
+msgstr ""
+
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "watchdog not initialized"
+msgstr ""
+
#: shared-bindings/watchdog/WatchDogTimer.c
msgid "watchdog timeout must be greater than 0"
msgstr ""
@@ -3620,12 +3745,12 @@ msgstr ""
msgid "window must be <= interval"
msgstr ""
-#: extmod/ulab/code/linalg/linalg.c
-msgid "wrong argument type"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "wrong axis index"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "wrong index type"
+#: extmod/ulab/code/ulab_create.c
+msgid "wrong axis specified"
msgstr ""
#: extmod/ulab/code/vector/vectorise.c
diff --git a/locale/de_DE.po b/locale/de_DE.po
index c2cb26550..1aedb6ce1 100644
--- a/locale/de_DE.po
+++ b/locale/de_DE.po
@@ -5,15 +5,15 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-04 21:18+0530\n"
-"PO-Revision-Date: 2020-06-16 18:24+0000\n"
-"Last-Translator: Andreas Buchen <andreas.buchen@gmail.com>\n"
+"POT-Creation-Date: 2020-11-27 23:57-0500\n"
+"PO-Revision-Date: 2020-11-26 03:11+0000\n"
+"Last-Translator: Daniel Bravo Darriba <bravodarriba@gmail.com>\n"
"Language: de_DE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.1.1-dev\n"
+"X-Generator: Weblate 4.4-dev\n"
#: main.c
msgid ""
@@ -57,7 +57,7 @@ msgstr "%d Adress-Pins und %d rgb-Pins zeigen eine Höhe von %d, nicht von %d"
#: ports/atmel-samd/common-hal/sdioio/SDCard.c
msgid "%q failure: %d"
-msgstr ""
+msgstr "%q Fehler: %d"
#: shared-bindings/microcontroller/Pin.c
msgid "%q in use"
@@ -299,7 +299,9 @@ msgstr ""
msgid "All I2C peripherals are in use"
msgstr "Alle I2C-Peripheriegeräte sind in Benutzung"
-#: ports/esp32s2/peripherals/pcnt_handler.c
+#: ports/esp32s2/common-hal/countio/Counter.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/rotaryio/IncrementalEncoder.c
msgid "All PCNT units in use"
msgstr ""
@@ -335,6 +337,7 @@ msgstr "Alle timer für diesen Pin werden bereits benutzt"
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
#: ports/cxd56/common-hal/pulseio/PulseOut.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
#: ports/esp32s2/common-hal/neopixel_write/__init__.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c
#: ports/esp32s2/common-hal/pulseio/PulseOut.c
@@ -502,7 +505,8 @@ msgstr "Die Pufferlänge muss ein vielfaches von 512 sein"
msgid "Buffer must be a multiple of 512 bytes"
msgstr "Der Puffer muss ein vielfaches von 512 bytes sein"
-#: shared-bindings/bitbangio/I2C.c shared-bindings/busio/I2C.c
+#: shared-bindings/bitbangio/I2C.c shared-bindings/busdevice/I2CDevice.c
+#: shared-bindings/busio/I2C.c
msgid "Buffer must be at least length 1"
msgstr "Der Puffer muss eine Mindestenslänge von 1 haben"
@@ -855,6 +859,10 @@ msgstr "Eine UUID wird erwartet"
msgid "Expected an Address"
msgstr "Erwartet eine Adresse"
+#: shared-bindings/alarm/__init__.c
+msgid "Expected an alarm"
+msgstr ""
+
#: shared-module/_pixelbuf/PixelBuf.c
#, c-format
msgid "Expected tuple of length %d, got %d"
@@ -869,6 +877,10 @@ msgstr ""
msgid "FFT is defined for ndarrays only"
msgstr "FFT ist nur für ndarrays definiert"
+#: extmod/ulab/code/fft/fft.c
+msgid "FFT is implemented for linear arrays only"
+msgstr ""
+
#: ports/esp32s2/common-hal/socketpool/Socket.c
msgid "Failed SSL handshake"
msgstr "SSL Handshake fehlgeschlagen"
@@ -1001,6 +1013,10 @@ msgstr "I2C-Init-Fehler"
msgid "I2SOut not available"
msgstr "I2SOut nicht verfügbar"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "IOs 0, 2 & 4 do not support internal pullup in sleep"
+msgstr ""
+
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
@@ -1018,6 +1034,10 @@ msgstr ""
msgid "Incorrect buffer size"
msgstr "Inkorrekte Puffergröße"
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "Initialization failed due to lack of memory"
+msgstr ""
+
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
msgid "Input taking too long"
msgstr ""
@@ -1098,6 +1118,7 @@ msgid "Invalid byteorder string"
msgstr "Ungültige Byteorder String"
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
msgid "Invalid capture period. Valid range: 1 - 500"
msgstr "Ungültiger Aufnahmezeitraum. Gültiger Bereich: 1 - 500"
@@ -1276,6 +1297,10 @@ msgstr "Muss MISO- oder MOSI-Pin bereitstellen"
msgid "Must use a multiple of 6 rgb pins, not %d"
msgstr "Muss ein Vielfaches von 6 RGB-Pins verwenden, nicht %d"
+#: ports/esp32s2/common-hal/nvm/ByteArray.c
+msgid "NVS Error"
+msgstr ""
+
#: py/parse.c
msgid "Name too long"
msgstr "Name zu lang"
@@ -1294,6 +1319,11 @@ msgstr "Kein DAC im Chip vorhanden"
msgid "No DMA channel found"
msgstr "Kein DMA Kanal gefunden"
+#: shared-module/busdevice/I2CDevice.c
+#, c-format
+msgid "No I2C device at address: %x"
+msgstr ""
+
#: ports/esp32s2/common-hal/busio/SPI.c ports/mimxrt10xx/common-hal/busio/SPI.c
#: ports/stm/common-hal/busio/SPI.c
msgid "No MISO Pin"
@@ -1428,14 +1458,14 @@ msgstr "Eine ungerade Parität wird nicht unterstützt"
msgid "Only 8 or 16 bit mono with "
msgstr "Nur 8 oder 16 bit mono mit "
-#: ports/esp32s2/common-hal/socketpool/SocketPool.c
-msgid "Only IPv4 SOCK_STREAM sockets supported"
-msgstr ""
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr ""
+#: ports/esp32s2/common-hal/socketpool/SocketPool.c
+msgid "Only IPv4 sockets supported"
+msgstr ""
+
#: shared-module/displayio/OnDiskBitmap.c
#, c-format
msgid ""
@@ -1453,6 +1483,10 @@ msgstr ""
"Nur monochrome, indizierte 4bpp oder 8bpp, und 16bpp oder größere BMPs "
"unterstützt: %d bpp wurden gegeben"
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "Only one alarm.time alarm can be set."
+msgstr ""
+
#: shared-module/displayio/ColorConverter.c
msgid "Only one color can be transparent at a time"
msgstr ""
@@ -1510,6 +1544,10 @@ msgstr "Pin muss Hardware-Interrupts unterstützen"
msgid "Pin number already reserved by EXTI"
msgstr "PIN-Nummer bereits von EXTI reserviert"
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "PinAlarm not yet implemented"
+msgstr ""
+
#: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format
msgid ""
@@ -1576,7 +1614,7 @@ msgstr "RS485-Inversion angegeben, wenn nicht im RS485-Modus"
msgid "RTC calibration is not supported on this board"
msgstr "Die RTC-Kalibrierung wird auf diesem Board nicht unterstützt"
-#: shared-bindings/time/__init__.c
+#: shared-bindings/alarm/time/TimeAlarm.c shared-bindings/time/__init__.c
msgid "RTC is not supported on this board"
msgstr "Eine RTC wird auf diesem Board nicht unterstützt"
@@ -1722,6 +1760,10 @@ msgstr "Stream fehlt readinto() oder write() Methode."
msgid "Supply at least one UART pin"
msgstr "Geben Sie mindestens einen UART-Pin an"
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Supply one of monotonic_time or epoch_time"
+msgstr ""
+
#: shared-bindings/gnss/GNSS.c
msgid "System entry must be gnss.SatelliteSystem"
msgstr ""
@@ -1796,6 +1838,10 @@ msgstr "Kachelwert außerhalb der Grenzen"
msgid "Tile width must exactly divide bitmap width"
msgstr "Die Kachelbreite muss die Bitmap-Breite genau teilen"
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Time is in the past."
+msgstr ""
+
#: ports/nrf/common-hal/_bleio/Adapter.c
#, c-format
msgid "Timeout is too long: Maximum timeout length is %d seconds"
@@ -1999,7 +2045,7 @@ msgid "WARNING: Your code filename has two extensions\n"
msgstr ""
"WARNUNG: Der Dateiname deines Programms hat zwei Dateityperweiterungen\n"
-#: shared-bindings/watchdog/WatchDogTimer.c
+#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "WatchDogTimer cannot be deinitialized once mode is set to RESET"
msgstr ""
@@ -2088,10 +2134,6 @@ msgstr "Adresse außerhalb der Grenzen"
msgid "addresses is empty"
msgstr "adresses ist leer"
-#: extmod/ulab/code/vector/vectorise.c
-msgid "arctan2 is implemented for scalars and ndarrays only"
-msgstr "arctan2 ist nur für Skalare und ndarrays implementiert"
-
#: py/modbuiltins.c
msgid "arg is an empty sequence"
msgstr "arg ist eine leere Sequenz"
@@ -2100,6 +2142,10 @@ msgstr "arg ist eine leere Sequenz"
msgid "argsort argument must be an ndarray"
msgstr "Das Argument argsort muss ein ndarray sein"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "argsort is not implemented for flattened arrays"
+msgstr ""
+
#: py/runtime.c
msgid "argument has wrong type"
msgstr "Argument hat falschen Typ"
@@ -2117,15 +2163,23 @@ msgstr "Anzahl/Typen der Argumente passen nicht"
msgid "argument should be a '%q' not a '%q'"
msgstr "Argument sollte '%q' sein, nicht '%q'"
-#: extmod/ulab/code/linalg/linalg.c
+#: extmod/ulab/code/linalg/linalg.c extmod/ulab/code/numerical/numerical.c
msgid "arguments must be ndarrays"
msgstr "Argumente müssen ndarrays sein"
+#: extmod/ulab/code/ndarray.c
+msgid "array and index length must be equal"
+msgstr ""
+
#: py/objarray.c shared-bindings/nvm/ByteArray.c
msgid "array/bytes required on right side"
msgstr "Array/Bytes auf der rechten Seite erforderlich"
#: extmod/ulab/code/numerical/numerical.c
+msgid "attempt to get (arg)min/(arg)max of empty sequence"
+msgstr ""
+
+#: extmod/ulab/code/numerical/numerical.c
msgid "attempt to get argmin/argmax of an empty sequence"
msgstr "Sie haben versucht argmin/argmax von einer leeren Sequenz zu bekommen"
@@ -2134,16 +2188,16 @@ msgid "attributes not supported yet"
msgstr "Attribute werden noch nicht unterstützt"
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, None, or 1"
-msgstr "Die Achse muss -1, 0, Keine oder 1 sein"
+msgid "axis is out of bounds"
+msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, or 1"
-msgstr "Die Achse muss -1, 0 oder 1 sein"
+msgid "axis must be None, or an integer"
+msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be None, 0, or 1"
-msgstr "Die Achse muss None, 0 oder 1 sein"
+msgid "axis too long"
+msgstr ""
#: py/builtinevex.c
msgid "bad compile mode"
@@ -2354,6 +2408,10 @@ msgstr ""
"kann nicht von der manuellen Feldspezifikation zur automatischen "
"Feldnummerierung wechseln"
+#: extmod/ulab/code/ndarray_operators.c
+msgid "cannot cast output with casting rule"
+msgstr ""
+
#: py/objtype.c
msgid "cannot create '%q' instances"
msgstr "Kann '%q' Instanzen nicht erstellen"
@@ -2370,11 +2428,6 @@ msgstr "Name %q kann nicht importiert werden"
msgid "cannot perform relative import"
msgstr "kann keinen relativen Import durchführen"
-#: extmod/ulab/code/ndarray.c
-msgid "cannot reshape array (incompatible input/output shape)"
-msgstr ""
-"Array kann nicht umgeformt werden (inkompatible Eingabe- / Ausgabeform)"
-
#: py/emitnative.c
msgid "casting"
msgstr "Umwandlung (cast)"
@@ -2449,10 +2502,6 @@ msgstr "Convolve-Argumente müssen ndarrays sein"
msgid "convolve arguments must not be empty"
msgstr "Convolve Argumente dürfen nicht leer sein"
-#: extmod/ulab/code/ndarray.c
-msgid "could not broadast input array from shape"
-msgstr "Eingabearray konnte nicht aus der Form übertragen werden"
-
#: extmod/ulab/code/poly/poly.c
msgid "could not invert Vandermonde matrix"
msgstr "Vandermonde-Matrix konnte nicht invertiert werden"
@@ -2461,6 +2510,10 @@ msgstr "Vandermonde-Matrix konnte nicht invertiert werden"
msgid "couldn't determine SD card version"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
+msgid "cross is defined for 1D arrays of length 3"
+msgstr ""
+
#: extmod/ulab/code/approx/approx.c
msgid "data must be iterable"
msgstr ""
@@ -2469,10 +2522,6 @@ msgstr ""
msgid "data must be of equal length"
msgstr ""
-#: extmod/ulab/code/numerical/numerical.c
-msgid "ddof must be smaller than length of data set"
-msgstr "ddof muss kleiner als die Länge des Datensatzes sein"
-
#: py/parsenum.c
msgid "decimal numbers not supported"
msgstr "Dezimalzahlen nicht unterstützt"
@@ -2504,6 +2553,10 @@ msgstr "Die Wörterbuch-Aktualisierungssequenz hat eine falsche Länge"
msgid "diff argument must be an ndarray"
msgstr "diff Argument muss ein ndarray sein"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "differentiation order out of range"
+msgstr ""
+
#: py/modmath.c py/objfloat.c py/objint_longlong.c py/objint_mpz.c py/runtime.c
#: shared-bindings/math/__init__.c
msgid "division by zero"
@@ -2533,6 +2586,10 @@ msgstr "Ende des Formats wärend der Suche nach einem conversion specifier"
msgid "end_x should be an int"
msgstr "end_x sollte ein int sein"
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "epoch_time not supported on this board"
+msgstr ""
+
#: ports/nrf/common-hal/busio/UART.c
#, c-format
msgid "error = 0x%08lX"
@@ -2619,6 +2676,10 @@ msgstr ""
msgid "first argument must be a function"
msgstr ""
+#: extmod/ulab/code/ulab_create.c
+msgid "first argument must be a tuple of ndarrays"
+msgstr ""
+
#: extmod/ulab/code/ndarray.c
msgid "first argument must be an iterable"
msgstr "Das erste Argument muss iterierbar sein"
@@ -2672,9 +2733,9 @@ msgstr "Funktion hat mehrere Werte für Argument '%q'"
msgid "function has the same sign at the ends of interval"
msgstr ""
-#: extmod/ulab/code/compare/compare.c
-msgid "function is implemented for scalars and ndarrays only"
-msgstr "Die Funktion ist nur für Skalare und Ndarrays implementiert"
+#: extmod/ulab/code/ndarray.c
+msgid "function is defined for ndarrays only"
+msgstr ""
#: py/argcheck.c
#, c-format
@@ -2744,6 +2805,7 @@ msgstr "padding ist inkorrekt"
msgid "index is out of bounds"
msgstr "Index ist außerhalb der Grenzen"
+#: extmod/ulab/code/numerical/numerical.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c py/obj.c
msgid "index out of range"
msgstr "index außerhalb der Reichweite"
@@ -2768,6 +2830,10 @@ msgstr "Länge von initial_value ist falsch"
msgid "inline assembler must be a function"
msgstr "inline assembler muss eine function sein"
+#: extmod/ulab/code/ndarray.c
+msgid "input and output shapes are not compatible"
+msgstr ""
+
#: extmod/ulab/code/ulab_create.c
msgid "input argument must be an integer or a 2-tuple"
msgstr "Das Eingabeargument muss eine Ganzzahl oder ein 2-Tupel sein"
@@ -2776,6 +2842,10 @@ msgstr "Das Eingabeargument muss eine Ganzzahl oder ein 2-Tupel sein"
msgid "input array length must be power of 2"
msgstr "Die Länge des Eingabearrays muss eine Potenz von 2 sein"
+#: extmod/ulab/code/ulab_create.c
+msgid "input arrays are not compatible"
+msgstr ""
+
#: extmod/ulab/code/poly/poly.c
msgid "input data must be an iterable"
msgstr "Eingabedaten müssen iterierbar sein"
@@ -2788,6 +2858,22 @@ msgstr "Eingabematrix ist asymmetrisch"
msgid "input matrix is singular"
msgstr "Eingabematrix ist singulär"
+#: extmod/ulab/code/user/user.c
+msgid "input must be a dense ndarray"
+msgstr ""
+
+#: extmod/ulab/code/ulab_create.c
+msgid "input must be a tensor of rank 2"
+msgstr ""
+
+#: extmod/ulab/code/ulab_create.c extmod/ulab/code/user/user.c
+msgid "input must be an ndarray"
+msgstr ""
+
+#: extmod/ulab/code/filter/filter.c
+msgid "input must be one-dimensional"
+msgstr ""
+
#: extmod/ulab/code/linalg/linalg.c
msgid "input must be square matrix"
msgstr "Die Eingabe muss eine quadratische Matrix sein"
@@ -2800,6 +2886,10 @@ msgstr "Die Eingabe muss Tupel, Liste, Bereich oder Ndarray sein"
msgid "input vectors must be of equal length"
msgstr "Eingabevektoren müssen gleich lang sein"
+#: extmod/ulab/code/poly/poly.c
+msgid "inputs are not iterable"
+msgstr ""
+
#: py/parsenum.c
msgid "int() arg 2 must be >= 2 and <= 36"
msgstr "int() arg 2 muss >= 2 und <= 36 sein"
@@ -2870,6 +2960,10 @@ msgstr "ungültige Syntax für integer mit Basis %d"
msgid "invalid syntax for number"
msgstr "ungültige Syntax für number"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "io must be rtc io"
+msgstr ""
+
#: py/objtype.c
msgid "issubclass() arg 1 must be a class"
msgstr "issubclass() arg 1 muss eine Klasse sein"
@@ -2974,6 +3068,10 @@ msgstr "max_length muss 0-%d sein, wenn fixed_length %s ist"
msgid "max_length must be > 0"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "maximum number of dimensions is 4"
+msgstr ""
+
#: py/runtime.c
msgid "maximum recursion depth exceeded"
msgstr "maximale Rekursionstiefe überschritten"
@@ -3023,10 +3121,6 @@ msgstr "muss ein Objekt verursachen (raise)"
msgid "must use keyword argument for key function"
msgstr "muss Schlüsselwortargument für key function verwenden"
-#: extmod/ulab/code/numerical/numerical.c
-msgid "n must be between 0, and 9"
-msgstr "n muss zwischen 0 und 9 liegen"
-
#: py/runtime.c
msgid "name '%q' is not defined"
msgstr "Name '%q' ist nirgends definiert worden (Schreibweise kontrollieren)"
@@ -3109,6 +3203,10 @@ msgstr "Nicht-Schlüsselwort arg nach * / **"
msgid "non-keyword arg after keyword arg"
msgstr "Nicht-Schlüsselwort Argument nach Schlüsselwort Argument"
+#: extmod/ulab/code/linalg/linalg.c
+msgid "norm is defined for 1D and 2D arrays"
+msgstr ""
+
#: shared-bindings/_bleio/UUID.c
msgid "not a 128-bit UUID"
msgstr "keine 128-bit UUID"
@@ -3122,10 +3220,6 @@ msgstr ""
msgid "not enough arguments for format string"
msgstr "Nicht genügend Argumente für den Formatierungs-String"
-#: extmod/ulab/code/poly/poly.c
-msgid "number of arguments must be 2, or 3"
-msgstr "Die Anzahl der Argumente muss 2 oder 3 sein"
-
#: extmod/ulab/code/ulab_create.c
msgid "number of points must be at least 2"
msgstr "Die Anzahl der Punkte muss mindestens 2 betragen"
@@ -3178,6 +3272,10 @@ msgstr "Objekt mit Pufferprotokoll (buffer protocol) erforderlich"
msgid "odd-length string"
msgstr "String mit ungerader Länge"
+#: extmod/ulab/code/ulab_create.c
+msgid "offset is too large"
+msgstr ""
+
#: py/objstr.c py/objstrunicode.c
msgid "offset out of bounds"
msgstr "offset außerhalb der Grenzen"
@@ -3201,6 +3299,14 @@ msgstr ""
msgid "operands could not be broadcast together"
msgstr "Operanden konnten nicht zusammen gesendet werden"
+#: extmod/ulab/code/ndarray.c
+msgid "operation is implemented for 1D Boolean arrays only"
+msgstr ""
+
+#: extmod/ulab/code/numerical/numerical.c
+msgid "operation is not implemented for flattened array"
+msgstr ""
+
#: extmod/ulab/code/numerical/numerical.c
msgid "operation is not implemented on ndarrays"
msgstr "Die Operation ist für ndarrays nicht implementiert"
@@ -3293,6 +3399,7 @@ msgstr "pow() drittes Argument darf nicht 0 sein"
msgid "pow() with 3 arguments requires integers"
msgstr "pow () mit 3 Argumenten erfordert Integer"
+#: ports/esp32s2/boards/adafruit_magtag_2.9_grayscale/mpconfigboard.h
#: ports/esp32s2/boards/adafruit_metro_esp32s2/mpconfigboard.h
#: ports/esp32s2/boards/electroniccats_bastwifi/mpconfigboard.h
#: ports/esp32s2/boards/espressif_kaluga_1/mpconfigboard.h
@@ -3336,6 +3443,10 @@ msgstr "relativer Import"
msgid "requested length %d but object has length %d"
msgstr "die ersuchte Länge ist %d, aber das Objekt hat eine Länge von %d"
+#: extmod/ulab/code/ndarray_operators.c
+msgid "results cannot be cast to specified type"
+msgstr ""
+
#: py/compile.c
msgid "return annotation must be an identifier"
msgstr "Rückgabewert-Beschreibung muss ein Identifier sein"
@@ -3354,9 +3465,9 @@ msgstr "rgb_pins[%d] dupliziert eine andere Pinbelegung"
msgid "rgb_pins[%d] is not on the same port as clock"
msgstr "rgb_pins [%d] befindet sich nicht am selben Port wie clock"
-#: extmod/ulab/code/ndarray.c
-msgid "right hand side must be an ndarray, or a scalar"
-msgstr "Die rechte Seite muss ein Ndarray oder ein Skalar sein"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "roll argument must be an ndarray"
+msgstr ""
#: py/objstr.c
msgid "rsplit(None,n)"
@@ -3383,8 +3494,8 @@ msgid "script compilation not supported"
msgstr "kompilieren von Skripten nicht unterstützt"
#: extmod/ulab/code/ndarray.c
-msgid "shape must be a 2-tuple"
-msgstr "Form muss ein 2-Tupel sein"
+msgid "shape must be a tuple"
+msgstr ""
#: py/objstr.c
msgid "sign not allowed in string format specifier"
@@ -3426,10 +3537,6 @@ msgstr "weicher reboot\n"
msgid "sort argument must be an ndarray"
msgstr "sortierungs Argument muss ein ndarray sein"
-#: extmod/ulab/code/numerical/numerical.c
-msgid "sorted axis can't be longer than 65535"
-msgstr ""
-
#: extmod/ulab/code/filter/filter.c
msgid "sos array must be of shape (n_section, 6)"
msgstr ""
@@ -3511,6 +3618,7 @@ msgstr "threshold muss im Intervall 0-65536 liegen"
msgid "time.struct_time() takes a 9-sequence"
msgstr "time.struct_time() nimmt eine 9-Sequenz an"
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "timeout duration exceeded the maximum supported value"
msgstr "Das Zeitlimit hat den maximal zulässigen Wert überschritten"
@@ -3535,6 +3643,10 @@ msgstr "Zeitlimit beim warten auf v2 Karte"
msgid "timestamp out of range for platform time_t"
msgstr "Zeitstempel außerhalb des Bereichs für Plattform time_t"
+#: extmod/ulab/code/ndarray.c
+msgid "tobytes can be invoked for dense arrays only"
+msgstr ""
+
#: shared-module/struct/__init__.c
msgid "too many arguments provided with the given format"
msgstr "zu viele Argumente mit dem angegebenen Format"
@@ -3552,6 +3664,10 @@ msgstr "zu viele Werte zum Auspacken (erwartet %d)"
msgid "trapz is defined for 1D arrays of equal length"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "trigger level must be 0 or 1"
+msgstr ""
+
#: extmod/ulab/code/linalg/linalg.c
msgid "tuple index out of range"
msgstr "Tupelindex außerhalb des Bereichs"
@@ -3698,6 +3814,14 @@ msgstr "value_count muss größer als 0 sein"
msgid "vectors must have same lengths"
msgstr "Vektoren müssen die selbe Länge haben"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "wakeup conflict"
+msgstr ""
+
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "watchdog not initialized"
+msgstr ""
+
#: shared-bindings/watchdog/WatchDogTimer.c
msgid "watchdog timeout must be greater than 0"
msgstr ""
@@ -3710,13 +3834,13 @@ msgstr ""
msgid "window must be <= interval"
msgstr "Fenster muss <= Intervall sein"
-#: extmod/ulab/code/linalg/linalg.c
-msgid "wrong argument type"
-msgstr "falscher Argumenttyp"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "wrong axis index"
+msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "wrong index type"
-msgstr "falscher Indextyp"
+#: extmod/ulab/code/ulab_create.c
+msgid "wrong axis specified"
+msgstr ""
#: extmod/ulab/code/vector/vectorise.c
msgid "wrong input type"
@@ -3766,6 +3890,49 @@ msgstr ""
msgid "zi must be of shape (n_section, 2)"
msgstr ""
+#~ msgid "arctan2 is implemented for scalars and ndarrays only"
+#~ msgstr "arctan2 ist nur für Skalare und ndarrays implementiert"
+
+#~ msgid "axis must be -1, 0, None, or 1"
+#~ msgstr "Die Achse muss -1, 0, Keine oder 1 sein"
+
+#~ msgid "axis must be -1, 0, or 1"
+#~ msgstr "Die Achse muss -1, 0 oder 1 sein"
+
+#~ msgid "axis must be None, 0, or 1"
+#~ msgstr "Die Achse muss None, 0 oder 1 sein"
+
+#~ msgid "cannot reshape array (incompatible input/output shape)"
+#~ msgstr ""
+#~ "Array kann nicht umgeformt werden (inkompatible Eingabe- / Ausgabeform)"
+
+#~ msgid "could not broadast input array from shape"
+#~ msgstr "Eingabearray konnte nicht aus der Form übertragen werden"
+
+#~ msgid "ddof must be smaller than length of data set"
+#~ msgstr "ddof muss kleiner als die Länge des Datensatzes sein"
+
+#~ msgid "function is implemented for scalars and ndarrays only"
+#~ msgstr "Die Funktion ist nur für Skalare und Ndarrays implementiert"
+
+#~ msgid "n must be between 0, and 9"
+#~ msgstr "n muss zwischen 0 und 9 liegen"
+
+#~ msgid "number of arguments must be 2, or 3"
+#~ msgstr "Die Anzahl der Argumente muss 2 oder 3 sein"
+
+#~ msgid "right hand side must be an ndarray, or a scalar"
+#~ msgstr "Die rechte Seite muss ein Ndarray oder ein Skalar sein"
+
+#~ msgid "shape must be a 2-tuple"
+#~ msgstr "Form muss ein 2-Tupel sein"
+
+#~ msgid "wrong argument type"
+#~ msgstr "falscher Argumenttyp"
+
+#~ msgid "wrong index type"
+#~ msgstr "falscher Indextyp"
+
#~ msgid ""
#~ "\n"
#~ "To exit, please reset the board without "
diff --git a/locale/el.po b/locale/el.po
index 4d7bff193..6a4f7cdbb 100644
--- a/locale/el.po
+++ b/locale/el.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-04 21:18+0530\n"
+"POT-Creation-Date: 2020-11-27 23:57-0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@@ -295,7 +295,9 @@ msgstr ""
msgid "All I2C peripherals are in use"
msgstr ""
-#: ports/esp32s2/peripherals/pcnt_handler.c
+#: ports/esp32s2/common-hal/countio/Counter.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/rotaryio/IncrementalEncoder.c
msgid "All PCNT units in use"
msgstr ""
@@ -331,6 +333,7 @@ msgstr ""
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
#: ports/cxd56/common-hal/pulseio/PulseOut.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
#: ports/esp32s2/common-hal/neopixel_write/__init__.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c
#: ports/esp32s2/common-hal/pulseio/PulseOut.c
@@ -494,7 +497,8 @@ msgstr ""
msgid "Buffer must be a multiple of 512 bytes"
msgstr ""
-#: shared-bindings/bitbangio/I2C.c shared-bindings/busio/I2C.c
+#: shared-bindings/bitbangio/I2C.c shared-bindings/busdevice/I2CDevice.c
+#: shared-bindings/busio/I2C.c
msgid "Buffer must be at least length 1"
msgstr ""
@@ -840,6 +844,10 @@ msgstr ""
msgid "Expected an Address"
msgstr ""
+#: shared-bindings/alarm/__init__.c
+msgid "Expected an alarm"
+msgstr ""
+
#: shared-module/_pixelbuf/PixelBuf.c
#, c-format
msgid "Expected tuple of length %d, got %d"
@@ -853,6 +861,10 @@ msgstr ""
msgid "FFT is defined for ndarrays only"
msgstr ""
+#: extmod/ulab/code/fft/fft.c
+msgid "FFT is implemented for linear arrays only"
+msgstr ""
+
#: ports/esp32s2/common-hal/socketpool/Socket.c
msgid "Failed SSL handshake"
msgstr ""
@@ -981,6 +993,10 @@ msgstr ""
msgid "I2SOut not available"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "IOs 0, 2 & 4 do not support internal pullup in sleep"
+msgstr ""
+
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
@@ -996,6 +1012,10 @@ msgstr ""
msgid "Incorrect buffer size"
msgstr ""
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "Initialization failed due to lack of memory"
+msgstr ""
+
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
msgid "Input taking too long"
msgstr ""
@@ -1076,6 +1096,7 @@ msgid "Invalid byteorder string"
msgstr ""
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
msgid "Invalid capture period. Valid range: 1 - 500"
msgstr ""
@@ -1252,6 +1273,10 @@ msgstr ""
msgid "Must use a multiple of 6 rgb pins, not %d"
msgstr ""
+#: ports/esp32s2/common-hal/nvm/ByteArray.c
+msgid "NVS Error"
+msgstr ""
+
#: py/parse.c
msgid "Name too long"
msgstr ""
@@ -1270,6 +1295,11 @@ msgstr ""
msgid "No DMA channel found"
msgstr ""
+#: shared-module/busdevice/I2CDevice.c
+#, c-format
+msgid "No I2C device at address: %x"
+msgstr ""
+
#: ports/esp32s2/common-hal/busio/SPI.c ports/mimxrt10xx/common-hal/busio/SPI.c
#: ports/stm/common-hal/busio/SPI.c
msgid "No MISO Pin"
@@ -1402,14 +1432,14 @@ msgstr ""
msgid "Only 8 or 16 bit mono with "
msgstr ""
-#: ports/esp32s2/common-hal/socketpool/SocketPool.c
-msgid "Only IPv4 SOCK_STREAM sockets supported"
-msgstr ""
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr ""
+#: ports/esp32s2/common-hal/socketpool/SocketPool.c
+msgid "Only IPv4 sockets supported"
+msgstr ""
+
#: shared-module/displayio/OnDiskBitmap.c
#, c-format
msgid ""
@@ -1423,6 +1453,10 @@ msgid ""
"%d bpp given"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "Only one alarm.time alarm can be set."
+msgstr ""
+
#: shared-module/displayio/ColorConverter.c
msgid "Only one color can be transparent at a time"
msgstr ""
@@ -1480,6 +1514,10 @@ msgstr ""
msgid "Pin number already reserved by EXTI"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "PinAlarm not yet implemented"
+msgstr ""
+
#: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format
msgid ""
@@ -1541,7 +1579,7 @@ msgstr ""
msgid "RTC calibration is not supported on this board"
msgstr ""
-#: shared-bindings/time/__init__.c
+#: shared-bindings/alarm/time/TimeAlarm.c shared-bindings/time/__init__.c
msgid "RTC is not supported on this board"
msgstr ""
@@ -1687,6 +1725,10 @@ msgstr ""
msgid "Supply at least one UART pin"
msgstr ""
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Supply one of monotonic_time or epoch_time"
+msgstr ""
+
#: shared-bindings/gnss/GNSS.c
msgid "System entry must be gnss.SatelliteSystem"
msgstr ""
@@ -1750,6 +1792,10 @@ msgstr ""
msgid "Tile width must exactly divide bitmap width"
msgstr ""
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Time is in the past."
+msgstr ""
+
#: ports/nrf/common-hal/_bleio/Adapter.c
#, c-format
msgid "Timeout is too long: Maximum timeout length is %d seconds"
@@ -1945,7 +1991,7 @@ msgstr ""
msgid "WARNING: Your code filename has two extensions\n"
msgstr ""
-#: shared-bindings/watchdog/WatchDogTimer.c
+#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "WatchDogTimer cannot be deinitialized once mode is set to RESET"
msgstr ""
@@ -2024,10 +2070,6 @@ msgstr ""
msgid "addresses is empty"
msgstr ""
-#: extmod/ulab/code/vector/vectorise.c
-msgid "arctan2 is implemented for scalars and ndarrays only"
-msgstr ""
-
#: py/modbuiltins.c
msgid "arg is an empty sequence"
msgstr ""
@@ -2036,6 +2078,10 @@ msgstr ""
msgid "argsort argument must be an ndarray"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
+msgid "argsort is not implemented for flattened arrays"
+msgstr ""
+
#: py/runtime.c
msgid "argument has wrong type"
msgstr ""
@@ -2053,15 +2099,23 @@ msgstr ""
msgid "argument should be a '%q' not a '%q'"
msgstr ""
-#: extmod/ulab/code/linalg/linalg.c
+#: extmod/ulab/code/linalg/linalg.c extmod/ulab/code/numerical/numerical.c
msgid "arguments must be ndarrays"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "array and index length must be equal"
+msgstr ""
+
#: py/objarray.c shared-bindings/nvm/ByteArray.c
msgid "array/bytes required on right side"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
+msgid "attempt to get (arg)min/(arg)max of empty sequence"
+msgstr ""
+
+#: extmod/ulab/code/numerical/numerical.c
msgid "attempt to get argmin/argmax of an empty sequence"
msgstr ""
@@ -2070,15 +2124,15 @@ msgid "attributes not supported yet"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, None, or 1"
+msgid "axis is out of bounds"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, or 1"
+msgid "axis must be None, or an integer"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be None, 0, or 1"
+msgid "axis too long"
msgstr ""
#: py/builtinevex.c
@@ -2282,6 +2336,10 @@ msgid ""
"can't switch from manual field specification to automatic field numbering"
msgstr ""
+#: extmod/ulab/code/ndarray_operators.c
+msgid "cannot cast output with casting rule"
+msgstr ""
+
#: py/objtype.c
msgid "cannot create '%q' instances"
msgstr ""
@@ -2298,10 +2356,6 @@ msgstr ""
msgid "cannot perform relative import"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "cannot reshape array (incompatible input/output shape)"
-msgstr ""
-
#: py/emitnative.c
msgid "casting"
msgstr ""
@@ -2374,10 +2428,6 @@ msgstr ""
msgid "convolve arguments must not be empty"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "could not broadast input array from shape"
-msgstr ""
-
#: extmod/ulab/code/poly/poly.c
msgid "could not invert Vandermonde matrix"
msgstr ""
@@ -2386,6 +2436,10 @@ msgstr ""
msgid "couldn't determine SD card version"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
+msgid "cross is defined for 1D arrays of length 3"
+msgstr ""
+
#: extmod/ulab/code/approx/approx.c
msgid "data must be iterable"
msgstr ""
@@ -2394,10 +2448,6 @@ msgstr ""
msgid "data must be of equal length"
msgstr ""
-#: extmod/ulab/code/numerical/numerical.c
-msgid "ddof must be smaller than length of data set"
-msgstr ""
-
#: py/parsenum.c
msgid "decimal numbers not supported"
msgstr ""
@@ -2427,6 +2477,10 @@ msgstr ""
msgid "diff argument must be an ndarray"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
+msgid "differentiation order out of range"
+msgstr ""
+
#: py/modmath.c py/objfloat.c py/objint_longlong.c py/objint_mpz.c py/runtime.c
#: shared-bindings/math/__init__.c
msgid "division by zero"
@@ -2456,6 +2510,10 @@ msgstr ""
msgid "end_x should be an int"
msgstr ""
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "epoch_time not supported on this board"
+msgstr ""
+
#: ports/nrf/common-hal/busio/UART.c
#, c-format
msgid "error = 0x%08lX"
@@ -2542,6 +2600,10 @@ msgstr ""
msgid "first argument must be a function"
msgstr ""
+#: extmod/ulab/code/ulab_create.c
+msgid "first argument must be a tuple of ndarrays"
+msgstr ""
+
#: extmod/ulab/code/ndarray.c
msgid "first argument must be an iterable"
msgstr ""
@@ -2595,8 +2657,8 @@ msgstr ""
msgid "function has the same sign at the ends of interval"
msgstr ""
-#: extmod/ulab/code/compare/compare.c
-msgid "function is implemented for scalars and ndarrays only"
+#: extmod/ulab/code/ndarray.c
+msgid "function is defined for ndarrays only"
msgstr ""
#: py/argcheck.c
@@ -2666,6 +2728,7 @@ msgstr ""
msgid "index is out of bounds"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c py/obj.c
msgid "index out of range"
msgstr ""
@@ -2690,6 +2753,10 @@ msgstr ""
msgid "inline assembler must be a function"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "input and output shapes are not compatible"
+msgstr ""
+
#: extmod/ulab/code/ulab_create.c
msgid "input argument must be an integer or a 2-tuple"
msgstr ""
@@ -2698,6 +2765,10 @@ msgstr ""
msgid "input array length must be power of 2"
msgstr ""
+#: extmod/ulab/code/ulab_create.c
+msgid "input arrays are not compatible"
+msgstr ""
+
#: extmod/ulab/code/poly/poly.c
msgid "input data must be an iterable"
msgstr ""
@@ -2710,6 +2781,22 @@ msgstr ""
msgid "input matrix is singular"
msgstr ""
+#: extmod/ulab/code/user/user.c
+msgid "input must be a dense ndarray"
+msgstr ""
+
+#: extmod/ulab/code/ulab_create.c
+msgid "input must be a tensor of rank 2"
+msgstr ""
+
+#: extmod/ulab/code/ulab_create.c extmod/ulab/code/user/user.c
+msgid "input must be an ndarray"
+msgstr ""
+
+#: extmod/ulab/code/filter/filter.c
+msgid "input must be one-dimensional"
+msgstr ""
+
#: extmod/ulab/code/linalg/linalg.c
msgid "input must be square matrix"
msgstr ""
@@ -2722,6 +2809,10 @@ msgstr ""
msgid "input vectors must be of equal length"
msgstr ""
+#: extmod/ulab/code/poly/poly.c
+msgid "inputs are not iterable"
+msgstr ""
+
#: py/parsenum.c
msgid "int() arg 2 must be >= 2 and <= 36"
msgstr ""
@@ -2792,6 +2883,10 @@ msgstr ""
msgid "invalid syntax for number"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "io must be rtc io"
+msgstr ""
+
#: py/objtype.c
msgid "issubclass() arg 1 must be a class"
msgstr ""
@@ -2890,6 +2985,10 @@ msgstr ""
msgid "max_length must be > 0"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "maximum number of dimensions is 4"
+msgstr ""
+
#: py/runtime.c
msgid "maximum recursion depth exceeded"
msgstr ""
@@ -2939,10 +3038,6 @@ msgstr ""
msgid "must use keyword argument for key function"
msgstr ""
-#: extmod/ulab/code/numerical/numerical.c
-msgid "n must be between 0, and 9"
-msgstr ""
-
#: py/runtime.c
msgid "name '%q' is not defined"
msgstr ""
@@ -3025,6 +3120,10 @@ msgstr ""
msgid "non-keyword arg after keyword arg"
msgstr ""
+#: extmod/ulab/code/linalg/linalg.c
+msgid "norm is defined for 1D and 2D arrays"
+msgstr ""
+
#: shared-bindings/_bleio/UUID.c
msgid "not a 128-bit UUID"
msgstr ""
@@ -3037,10 +3136,6 @@ msgstr ""
msgid "not enough arguments for format string"
msgstr ""
-#: extmod/ulab/code/poly/poly.c
-msgid "number of arguments must be 2, or 3"
-msgstr ""
-
#: extmod/ulab/code/ulab_create.c
msgid "number of points must be at least 2"
msgstr ""
@@ -3093,6 +3188,10 @@ msgstr ""
msgid "odd-length string"
msgstr ""
+#: extmod/ulab/code/ulab_create.c
+msgid "offset is too large"
+msgstr ""
+
#: py/objstr.c py/objstrunicode.c
msgid "offset out of bounds"
msgstr ""
@@ -3115,6 +3214,14 @@ msgstr ""
msgid "operands could not be broadcast together"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "operation is implemented for 1D Boolean arrays only"
+msgstr ""
+
+#: extmod/ulab/code/numerical/numerical.c
+msgid "operation is not implemented for flattened array"
+msgstr ""
+
#: extmod/ulab/code/numerical/numerical.c
msgid "operation is not implemented on ndarrays"
msgstr ""
@@ -3205,6 +3312,7 @@ msgstr ""
msgid "pow() with 3 arguments requires integers"
msgstr ""
+#: ports/esp32s2/boards/adafruit_magtag_2.9_grayscale/mpconfigboard.h
#: ports/esp32s2/boards/adafruit_metro_esp32s2/mpconfigboard.h
#: ports/esp32s2/boards/electroniccats_bastwifi/mpconfigboard.h
#: ports/esp32s2/boards/espressif_kaluga_1/mpconfigboard.h
@@ -3248,6 +3356,10 @@ msgstr ""
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 ""
+
#: py/compile.c
msgid "return annotation must be an identifier"
msgstr ""
@@ -3266,8 +3378,8 @@ msgstr ""
msgid "rgb_pins[%d] is not on the same port as clock"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "right hand side must be an ndarray, or a scalar"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "roll argument must be an ndarray"
msgstr ""
#: py/objstr.c
@@ -3293,7 +3405,7 @@ msgid "script compilation not supported"
msgstr ""
#: extmod/ulab/code/ndarray.c
-msgid "shape must be a 2-tuple"
+msgid "shape must be a tuple"
msgstr ""
#: py/objstr.c
@@ -3336,10 +3448,6 @@ msgstr ""
msgid "sort argument must be an ndarray"
msgstr ""
-#: extmod/ulab/code/numerical/numerical.c
-msgid "sorted axis can't be longer than 65535"
-msgstr ""
-
#: extmod/ulab/code/filter/filter.c
msgid "sos array must be of shape (n_section, 6)"
msgstr ""
@@ -3420,6 +3528,7 @@ msgstr ""
msgid "time.struct_time() takes a 9-sequence"
msgstr ""
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "timeout duration exceeded the maximum supported value"
msgstr ""
@@ -3444,6 +3553,10 @@ msgstr ""
msgid "timestamp out of range for platform time_t"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "tobytes can be invoked for dense arrays only"
+msgstr ""
+
#: shared-module/struct/__init__.c
msgid "too many arguments provided with the given format"
msgstr ""
@@ -3461,6 +3574,10 @@ msgstr ""
msgid "trapz is defined for 1D arrays of equal length"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "trigger level must be 0 or 1"
+msgstr ""
+
#: extmod/ulab/code/linalg/linalg.c
msgid "tuple index out of range"
msgstr ""
@@ -3603,6 +3720,14 @@ msgstr ""
msgid "vectors must have same lengths"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "wakeup conflict"
+msgstr ""
+
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "watchdog not initialized"
+msgstr ""
+
#: shared-bindings/watchdog/WatchDogTimer.c
msgid "watchdog timeout must be greater than 0"
msgstr ""
@@ -3615,12 +3740,12 @@ msgstr ""
msgid "window must be <= interval"
msgstr ""
-#: extmod/ulab/code/linalg/linalg.c
-msgid "wrong argument type"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "wrong axis index"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "wrong index type"
+#: extmod/ulab/code/ulab_create.c
+msgid "wrong axis specified"
msgstr ""
#: extmod/ulab/code/vector/vectorise.c
diff --git a/locale/es.po b/locale/es.po
index ed7431eb7..57b317e00 100644
--- a/locale/es.po
+++ b/locale/es.po
@@ -7,16 +7,16 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-04 21:18+0530\n"
-"PO-Revision-Date: 2020-11-01 16:26+0000\n"
-"Last-Translator: Alvaro Figueroa <alvaro@greencore.co.cr>\n"
+"POT-Creation-Date: 2020-11-27 23:57-0500\n"
+"PO-Revision-Date: 2020-11-27 18:34+0000\n"
+"Last-Translator: Iván Montiel Cardona <ivan_montiel2013@hotmail.com>\n"
"Language-Team: \n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.3.2-dev\n"
+"X-Generator: Weblate 4.4-dev\n"
#: main.c
msgid ""
@@ -303,9 +303,11 @@ msgstr "Todos los periféricos CAN están en uso"
msgid "All I2C peripherals are in use"
msgstr "Todos los periféricos I2C están siendo usados"
-#: ports/esp32s2/peripherals/pcnt_handler.c
+#: ports/esp32s2/common-hal/countio/Counter.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/rotaryio/IncrementalEncoder.c
msgid "All PCNT units in use"
-msgstr ""
+msgstr "Todas las unidades PCNT en uso"
#: ports/atmel-samd/common-hal/canio/Listener.c
#: ports/esp32s2/common-hal/canio/Listener.c
@@ -341,6 +343,7 @@ msgstr "Todos los timers para este pin están siendo utilizados"
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
#: ports/cxd56/common-hal/pulseio/PulseOut.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
#: ports/esp32s2/common-hal/neopixel_write/__init__.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c
#: ports/esp32s2/common-hal/pulseio/PulseOut.c
@@ -436,7 +439,7 @@ msgstr "El periférico no maneja el Baudrate"
#: shared-module/displayio/Display.c
#: shared-module/framebufferio/FramebufferDisplay.c
msgid "Below minimum frame rate"
-msgstr "Por debajo de taza mínima de refrescamiento"
+msgstr "Por debajo de la tasa mínima de refrescamiento"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
msgid "Bit clock and word select must share a clock unit"
@@ -445,7 +448,7 @@ msgstr "Bit clock y word select deben compartir una unidad de reloj"
#: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format
msgid "Bit depth must be from 1 to 6 inclusive, not %d"
-msgstr ""
+msgstr "Bit depth tiene que ser de 1 a 6 inclusivo, no %d"
#: shared-bindings/audiobusio/PDMIn.c
msgid "Bit depth must be multiple of 8."
@@ -497,7 +500,7 @@ msgstr "El buffer es muy pequeño"
#: ports/nrf/common-hal/audiopwmio/PWMAudioOut.c
#, c-format
msgid "Buffer length %d too big. It must be less than %d"
-msgstr "La longitud del buffer %d es muy grande. Debe ser menor a %d"
+msgstr "Longitud del buffer %d es demasiado grande. Tiene que ser menor a %d"
#: ports/atmel-samd/common-hal/sdioio/SDCard.c
#: ports/cxd56/common-hal/sdioio/SDCard.c shared-module/sdcardio/SDCard.c
@@ -508,7 +511,8 @@ msgstr "El tamaño del búfer debe ser múltiplo de 512"
msgid "Buffer must be a multiple of 512 bytes"
msgstr "Búfer deber ser un múltiplo de 512 bytes"
-#: shared-bindings/bitbangio/I2C.c shared-bindings/busio/I2C.c
+#: shared-bindings/bitbangio/I2C.c shared-bindings/busdevice/I2CDevice.c
+#: shared-bindings/busio/I2C.c
msgid "Buffer must be at least length 1"
msgstr "Buffer debe ser de longitud 1 como minimo"
@@ -519,7 +523,7 @@ msgstr "Buffer demasiado grande e incapaz de asignar"
#: shared-bindings/_bleio/PacketBuffer.c
#, c-format
msgid "Buffer too short by %d bytes"
-msgstr "Búfer muy corto por %d bytes"
+msgstr "Búffer muy corto por %d bytes"
#: ports/atmel-samd/common-hal/displayio/ParallelBus.c
#: ports/nrf/common-hal/displayio/ParallelBus.c
@@ -728,7 +732,7 @@ msgstr "No se puede definir la dirección"
#: ports/stm/common-hal/pwmio/PWMOut.c
msgid "Could not start PWM"
-msgstr "No se pudo iniciar el PWM"
+msgstr "No se pudo iniciar PWM"
#: ports/stm/common-hal/busio/UART.c
msgid "Could not start interrupt, RX busy"
@@ -745,7 +749,7 @@ msgstr "No se pudo asignar el primer buffer"
#: shared-module/audiomp3/MP3Decoder.c
msgid "Couldn't allocate input buffer"
-msgstr "No se pudo encontrar el búfer de entrada"
+msgstr "No se pudo encontrar el buffer de entrada"
#: shared-module/audiocore/WaveFile.c shared-module/audiomixer/Mixer.c
#: shared-module/audiomp3/MP3Decoder.c
@@ -860,6 +864,10 @@ msgstr "Se esperaba un UUID"
msgid "Expected an Address"
msgstr "Se esperaba una dirección"
+#: shared-bindings/alarm/__init__.c
+msgid "Expected an alarm"
+msgstr ""
+
#: shared-module/_pixelbuf/PixelBuf.c
#, c-format
msgid "Expected tuple of length %d, got %d"
@@ -873,6 +881,10 @@ msgstr "No se admiten anuncios extendidos con respuesta de escaneo."
msgid "FFT is defined for ndarrays only"
msgstr "FFT se define solo para ndarrays"
+#: extmod/ulab/code/fft/fft.c
+msgid "FFT is implemented for linear arrays only"
+msgstr "FFT solo esta implementado para arrays lineales"
+
#: ports/esp32s2/common-hal/socketpool/Socket.c
msgid "Failed SSL handshake"
msgstr "Fallo en saludo SSL"
@@ -931,7 +943,7 @@ msgstr "No se puede liberar el mutex, err 0x%04x"
#: supervisor/shared/safe_mode.c
msgid "Failed to write internal flash."
-msgstr "Error al escribir al flash interno."
+msgstr "Error al escribir el flash interno."
#: py/moduerrno.c
msgid "File exists"
@@ -970,7 +982,7 @@ msgstr "La función requiere lock"
#: shared-bindings/displayio/EPaperDisplay.c
#: shared-bindings/framebufferio/FramebufferDisplay.c
msgid "Group already used"
-msgstr "El grupo ya está siendo utilizado"
+msgstr "Grupo ya está siendo utilizado"
#: shared-module/displayio/Group.c
msgid "Group full"
@@ -996,12 +1008,16 @@ msgstr "Operación I/O en archivo cerrado"
#: ports/stm/common-hal/busio/I2C.c
msgid "I2C Init Error"
-msgstr "Error de inicio de I2C"
+msgstr "I2C Error de inicio"
#: shared-bindings/audiobusio/I2SOut.c
msgid "I2SOut not available"
msgstr "I2SOut no disponible"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "IOs 0, 2 & 4 do not support internal pullup in sleep"
+msgstr ""
+
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
@@ -1019,6 +1035,10 @@ msgstr ""
msgid "Incorrect buffer size"
msgstr "Tamaño incorrecto del buffer"
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "Initialization failed due to lack of memory"
+msgstr "Inicializacion fallida por falta de memoria"
+
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
msgid "Input taking too long"
msgstr "La entrada está durando mucho tiempo"
@@ -1099,6 +1119,7 @@ msgid "Invalid byteorder string"
msgstr "Cadena de byteorder inválida"
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
msgid "Invalid capture period. Valid range: 1 - 500"
msgstr "Inválido periodo de captura. Rango válido: 1 - 500"
@@ -1275,6 +1296,10 @@ msgstr "Debe proporcionar un pin MISO o MOSI"
msgid "Must use a multiple of 6 rgb pins, not %d"
msgstr "Debe usar un múltiplo de 6 pines rgb, no %d"
+#: ports/esp32s2/common-hal/nvm/ByteArray.c
+msgid "NVS Error"
+msgstr "Error NVS"
+
#: py/parse.c
msgid "Name too long"
msgstr "Nombre muy largo"
@@ -1293,6 +1318,11 @@ msgstr "El chip no tiene DAC"
msgid "No DMA channel found"
msgstr "No se encontró el canal DMA"
+#: shared-module/busdevice/I2CDevice.c
+#, c-format
+msgid "No I2C device at address: %x"
+msgstr ""
+
#: ports/esp32s2/common-hal/busio/SPI.c ports/mimxrt10xx/common-hal/busio/SPI.c
#: ports/stm/common-hal/busio/SPI.c
msgid "No MISO Pin"
@@ -1388,7 +1418,7 @@ msgstr "No hay temporizador disponible"
#: supervisor/shared/safe_mode.c
msgid "Nordic Soft Device failure assertion."
-msgstr "fallo de aserción de dispositivo Nordic Soft."
+msgstr "Fallo de aserción de dispositivo Nordic Soft."
#: shared-bindings/ipaddress/IPv4Address.c shared-bindings/ipaddress/__init__.c
msgid "Not a valid IP string"
@@ -1427,14 +1457,14 @@ msgstr "Paridad impar no soportada"
msgid "Only 8 or 16 bit mono with "
msgstr "Solo mono de 8 ó 16 bit con "
-#: ports/esp32s2/common-hal/socketpool/SocketPool.c
-msgid "Only IPv4 SOCK_STREAM sockets supported"
-msgstr "Solo hay capacidad para enchufes IPv4 SOCK_STREAM"
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr "Solo hay capacidad para direcciones IPv4"
+#: ports/esp32s2/common-hal/socketpool/SocketPool.c
+msgid "Only IPv4 sockets supported"
+msgstr "Solo se admiten sockets IPv4"
+
#: shared-module/displayio/OnDiskBitmap.c
#, c-format
msgid ""
@@ -1452,6 +1482,10 @@ msgstr ""
"Solo se admiten BMP monocromáticos, indexados de 4 bpp u 8 bpp y 16 bpp o "
"más: %d bpp proporcionados"
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "Only one alarm.time alarm can be set."
+msgstr ""
+
#: shared-module/displayio/ColorConverter.c
msgid "Only one color can be transparent at a time"
msgstr "Solo un color puede ser transparente a la vez"
@@ -1484,7 +1518,7 @@ msgstr ""
#: ports/mimxrt10xx/common-hal/displayio/ParallelBus.c
#: ports/stm/common-hal/displayio/ParallelBus.c
msgid "ParallelBus not yet supported"
-msgstr "ParallelBus no soportado aún"
+msgstr "ParallelBus todavía no soportado"
#: py/moduerrno.c
msgid "Permission denied"
@@ -1511,6 +1545,10 @@ msgstr "El pin debe admitir interrupciones de hardware"
msgid "Pin number already reserved by EXTI"
msgstr "Número de pin ya reservado por EXTI"
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "PinAlarm not yet implemented"
+msgstr ""
+
#: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format
msgid ""
@@ -1518,8 +1556,9 @@ msgid ""
"bytes. If this cannot be avoided, pass allow_inefficient=True to the "
"constructor"
msgstr ""
-"El pinout utiliza %d bytes por elemento, lo que consume más del ideal de %d "
-"bytes. Si esto no se puede evitar, pase allow_inefficient=True al constructor"
+"El pinout utiliza %d bytes por elemento, lo que consume más de los %d bytes "
+"ideales. Si esto no se puede evitar, pase allow_inefficient=True al "
+"constructor"
#: py/builtinhelp.c
msgid "Plus any modules on the filesystem\n"
@@ -1550,7 +1589,7 @@ msgstr ""
#: shared-bindings/_bleio/Adapter.c
msgid "Prefix buffer must be on the heap"
-msgstr "El búfer de prefijo debe estar en el montículo"
+msgstr "El prefijo del buffer debe estar en el heap"
#: main.c
msgid "Press any key to enter the REPL. Use CTRL-D to reload."
@@ -1563,7 +1602,7 @@ msgstr "Pull no se usa cuando la dirección es output."
#: ports/stm/common-hal/os/__init__.c
msgid "RNG DeInit Error"
-msgstr "Error de desinicializado del RNG"
+msgstr "Error de desinicialización de RNG"
#: ports/stm/common-hal/os/__init__.c
msgid "RNG Init Error"
@@ -1572,14 +1611,14 @@ msgstr "Error de inicialización de RNG"
#: ports/esp32s2/common-hal/busio/UART.c
#: ports/mimxrt10xx/common-hal/busio/UART.c
msgid "RS485 inversion specified when not in RS485 mode"
-msgstr "Se especifica inversión de RS485 sin estar en modo RS485"
+msgstr "Se especifica inversión de RS485 si no está en modo RS485"
#: ports/cxd56/common-hal/rtc/RTC.c ports/esp32s2/common-hal/rtc/RTC.c
#: ports/mimxrt10xx/common-hal/rtc/RTC.c ports/nrf/common-hal/rtc/RTC.c
msgid "RTC calibration is not supported on this board"
msgstr "Calibración de RTC no es soportada en esta placa"
-#: shared-bindings/time/__init__.c
+#: shared-bindings/alarm/time/TimeAlarm.c shared-bindings/time/__init__.c
msgid "RTC is not supported on this board"
msgstr "RTC no soportado en esta placa"
@@ -1607,7 +1646,7 @@ msgstr "Objeto de solo-lectura"
#: shared-bindings/displayio/EPaperDisplay.c
msgid "Refresh too soon"
-msgstr "Actualizando demasiado pronto"
+msgstr "Refresco demasiado pronto"
#: shared-bindings/canio/RemoteTransmissionRequest.c
msgid "RemoteTransmissionRequests limited to 8 bytes"
@@ -1667,7 +1706,7 @@ msgstr "Frecuencia de muestreo demasiado alta. Debe ser menor a %d"
#: ports/nrf/common-hal/_bleio/Adapter.c
msgid "Scan already in progess. Stop with stop_scan."
-msgstr "Escaneo en progreso. Use stop_scan para detener."
+msgstr "Escaneo en progreso. Usa stop_scan para detener."
#: ports/mimxrt10xx/common-hal/busio/UART.c
msgid "Selected CTS pin not valid"
@@ -1707,7 +1746,7 @@ msgstr "SocketPool solo se puede usar con wifi.radio"
#: shared-bindings/aesio/aes.c
msgid "Source and destination buffers must be the same length"
-msgstr "Los búferes de fuente y destino deben ser del mismo tamaño"
+msgstr "Los buffers de fuente y destino deben ser del mismo tamaño"
#: extmod/modure.c
msgid "Splitting with sub-captures"
@@ -1725,6 +1764,10 @@ msgstr "A Stream le falta el método readinto() o write()."
msgid "Supply at least one UART pin"
msgstr "Suministre al menos un pin UART"
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Supply one of monotonic_time or epoch_time"
+msgstr ""
+
#: shared-bindings/gnss/GNSS.c
msgid "System entry must be gnss.SatelliteSystem"
msgstr "La entrada del sistema debe ser gnss.SatelliteSystem"
@@ -1738,7 +1781,7 @@ msgid ""
"The CircuitPython heap was corrupted because the stack was too small.\n"
"Please increase the stack size if you know how, or if not:"
msgstr ""
-"El montículo de CircuitPython se dañó porque la pila era demasiado pequeña.\n"
+"El heap de CircuitPython se dañó porque la pila era demasiado pequeña.\n"
"Aumente el tamaño de la pila si sabe cómo, o si no:"
#: supervisor/shared/safe_mode.c
@@ -1746,8 +1789,8 @@ msgid ""
"The `microcontroller` module was used to boot into safe mode. Press reset to "
"exit safe mode.\n"
msgstr ""
-"El módulo de `microcontroller` fue utilizado para bootear en modo seguro. "
-"Presione reset para salir del modo seguro.\n"
+"El módulo de `microcontroller` fue utilizado para arrancar en modo seguro. "
+"Presiona reset para salir del modo seguro.\n"
#: shared-bindings/rgbmatrix/RGBMatrix.c
msgid "The length of rgb_pins must be 6, 12, 18, 24, or 30"
@@ -1759,9 +1802,9 @@ msgid ""
"enough power for the whole circuit and press reset (after ejecting "
"CIRCUITPY).\n"
msgstr ""
-"La alimentación de la microntroladora bajó. Asegúrate que tu fuente de "
-"poder\n"
-"pueda suplir suficiente energía para todo el circuito y presione reset "
+"La alimentación del microntrolador cayó. Asegúrate que tu fuente de "
+"alimentación\n"
+"pueda aportar suficiente energía para todo el circuito y presiona reset "
"(luego de\n"
"expulsar CIRCUITPY)\n"
@@ -1797,6 +1840,10 @@ msgstr "Valor de mosaico fuera de límites"
msgid "Tile width must exactly divide bitmap width"
msgstr "Ancho del Tile debe dividir exactamente el ancho de mapa de bits"
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Time is in the past."
+msgstr ""
+
#: ports/nrf/common-hal/_bleio/Adapter.c
#, c-format
msgid "Timeout is too long: Maximum timeout length is %d seconds"
@@ -1941,7 +1988,7 @@ msgstr "Error de seguridad desconocido: 0x%04x"
#: ports/nrf/common-hal/_bleio/__init__.c
#, c-format
msgid "Unknown soft device error: %04x"
-msgstr "Error suave desconocido en dispositivo: %04x"
+msgstr "Error leve desconocido en dispositivo: %04x"
#: shared-bindings/_pixelbuf/PixelBuf.c
#, c-format
@@ -1954,7 +2001,7 @@ msgid ""
"declined or ignored."
msgstr ""
"Problema no especificado. Puede ser que la señal de emparejamiento del otro "
-"dispositivo fue declinada o ignorada."
+"dispositivo fue denegada o ignorada."
#: ports/atmel-samd/common-hal/busio/I2C.c ports/cxd56/common-hal/busio/I2C.c
#: ports/esp32s2/common-hal/busio/UART.c ports/stm/common-hal/busio/I2C.c
@@ -1999,7 +2046,7 @@ msgstr "Tiempo de espera agotado para lectura de voltaje"
msgid "WARNING: Your code filename has two extensions\n"
msgstr "ADVERTENCIA: El nombre de archivo de tu código tiene dos extensiones\n"
-#: shared-bindings/watchdog/WatchDogTimer.c
+#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "WatchDogTimer cannot be deinitialized once mode is set to RESET"
msgstr ""
"WatchDogTimer no se puede desinicializar luego de definirse en modo RESET"
@@ -2044,7 +2091,7 @@ msgstr "La clave de WiFi debe ser entre 8 y 63 caracteres"
#: ports/nrf/common-hal/_bleio/PacketBuffer.c
msgid "Writes not supported on Characteristic"
-msgstr "Escrituras no admitidas en la característica"
+msgstr "Escrituras no admitidas en Characteristic"
#: supervisor/shared/safe_mode.c
msgid "You are in safe mode: something unanticipated happened.\n"
@@ -2087,10 +2134,6 @@ msgstr "address fuera de límites"
msgid "addresses is empty"
msgstr "addresses esta vacío"
-#: extmod/ulab/code/vector/vectorise.c
-msgid "arctan2 is implemented for scalars and ndarrays only"
-msgstr "arctan2 se encuentra implementado solo para escalares y ndarrays"
-
#: py/modbuiltins.c
msgid "arg is an empty sequence"
msgstr "argumento es una secuencia vacía"
@@ -2099,6 +2142,10 @@ msgstr "argumento es una secuencia vacía"
msgid "argsort argument must be an ndarray"
msgstr "El argumento para argsort debe ser un ndarray"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "argsort is not implemented for flattened arrays"
+msgstr "El argot no está implementado para arrays aplanados"
+
#: py/runtime.c
msgid "argument has wrong type"
msgstr "el argumento tiene un tipo erroneo"
@@ -2116,33 +2163,41 @@ msgstr "argumento número/tipos no coinciden"
msgid "argument should be a '%q' not a '%q'"
msgstr "argumento deberia ser un '%q' no un '%q'"
-#: extmod/ulab/code/linalg/linalg.c
+#: extmod/ulab/code/linalg/linalg.c extmod/ulab/code/numerical/numerical.c
msgid "arguments must be ndarrays"
msgstr "argumentos deben ser ndarrays"
+#: extmod/ulab/code/ndarray.c
+msgid "array and index length must be equal"
+msgstr "Longitud del array e índice tienen que ser iguales"
+
#: py/objarray.c shared-bindings/nvm/ByteArray.c
msgid "array/bytes required on right side"
msgstr "array/bytes requeridos en el lado derecho"
#: extmod/ulab/code/numerical/numerical.c
+msgid "attempt to get (arg)min/(arg)max of empty sequence"
+msgstr "Intendo de obteber (arg)min/(arg)max de secuencia vacía"
+
+#: extmod/ulab/code/numerical/numerical.c
msgid "attempt to get argmin/argmax of an empty sequence"
-msgstr "se trató de traer argmin/argmax de una secuencia vacía"
+msgstr "intento de obtener argmin/argmax de una secuencia vacía"
#: py/objstr.c
msgid "attributes not supported yet"
msgstr "atributos aún no soportados"
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, None, or 1"
-msgstr "eje debe ser -1, 0, None o 1"
+msgid "axis is out of bounds"
+msgstr "Eje está fuera de sus límites"
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, or 1"
-msgstr "eje debe ser -1, 0, o 1"
+msgid "axis must be None, or an integer"
+msgstr "Eje tiene que ser None, o un entero"
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be None, 0, or 1"
-msgstr "eje debe ser None, 0, o 1"
+msgid "axis too long"
+msgstr "Eje demasiado largo"
#: py/builtinevex.c
msgid "bad compile mode"
@@ -2350,6 +2405,10 @@ msgstr ""
"no se puede cambiar de especificación de campo manual a numeración "
"automática de campos"
+#: extmod/ulab/code/ndarray_operators.c
+msgid "cannot cast output with casting rule"
+msgstr "No se puede realizar cast de la salida sin una regla de cast"
+
#: py/objtype.c
msgid "cannot create '%q' instances"
msgstr "no se pueden crear '%q' instancias"
@@ -2366,10 +2425,6 @@ msgstr "no se puede importar name '%q'"
msgid "cannot perform relative import"
msgstr "no se puedo realizar importación relativa"
-#: extmod/ulab/code/ndarray.c
-msgid "cannot reshape array (incompatible input/output shape)"
-msgstr "no se puede reformar el arreglo (forma de entrada/salida incompatible)"
-
#: py/emitnative.c
msgid "casting"
msgstr "convirtiendo tipo"
@@ -2388,7 +2443,7 @@ msgstr "El argumento de chr() no esta en el rango(256)"
#: shared-module/vectorio/Circle.c
msgid "circle can only be registered in one parent"
-msgstr "circle solo puede ser registrado con un pariente"
+msgstr "circulo solo puede ser registrado con un pariente"
#: shared-bindings/displayio/Palette.c
msgid "color buffer must be 3 bytes (RGB) or 4 bytes (RGB + pad byte)"
@@ -2442,10 +2497,6 @@ msgstr "los argumentos para convolve deben ser ndarrays"
msgid "convolve arguments must not be empty"
msgstr "los argumentos para convolve no deben estar vacíos"
-#: extmod/ulab/code/ndarray.c
-msgid "could not broadast input array from shape"
-msgstr "no se pudo anunciar la matriz de entrada desde la forma"
-
#: extmod/ulab/code/poly/poly.c
msgid "could not invert Vandermonde matrix"
msgstr "no se pudo invertir la matriz de Vandermonde"
@@ -2454,6 +2505,10 @@ msgstr "no se pudo invertir la matriz de Vandermonde"
msgid "couldn't determine SD card version"
msgstr "no se pudo determinar la versión de la tarjeta SD"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "cross is defined for 1D arrays of length 3"
+msgstr "Cruce está definido para un array 1D de longitud 3"
+
#: extmod/ulab/code/approx/approx.c
msgid "data must be iterable"
msgstr "los datos deben permitir iteración"
@@ -2462,10 +2517,6 @@ msgstr "los datos deben permitir iteración"
msgid "data must be of equal length"
msgstr "los datos deben ser de igual tamaño"
-#: extmod/ulab/code/numerical/numerical.c
-msgid "ddof must be smaller than length of data set"
-msgstr "ddof debe ser menor que la longitud del conjunto de datos"
-
#: py/parsenum.c
msgid "decimal numbers not supported"
msgstr "números decimales no soportados"
@@ -2497,6 +2548,10 @@ msgstr "la secuencia de actualizacion del dict tiene una longitud incorrecta"
msgid "diff argument must be an ndarray"
msgstr "El argumento diff debe ser un ndarray"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "differentiation order out of range"
+msgstr "Orden de diferenciación fuera de rango"
+
#: py/modmath.c py/objfloat.c py/objint_longlong.c py/objint_mpz.c py/runtime.c
#: shared-bindings/math/__init__.c
msgid "division by zero"
@@ -2526,6 +2581,10 @@ msgstr "el final del formato mientras se busca el especificador de conversión"
msgid "end_x should be an int"
msgstr "end_x debe ser un int"
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "epoch_time not supported on this board"
+msgstr ""
+
#: ports/nrf/common-hal/busio/UART.c
#, c-format
msgid "error = 0x%08lX"
@@ -2612,9 +2671,13 @@ msgstr "se debe poder llamar al primer argumento"
msgid "first argument must be a function"
msgstr "el primer argumento debe ser una función"
+#: extmod/ulab/code/ulab_create.c
+msgid "first argument must be a tuple of ndarrays"
+msgstr "Primer argumento tiene que ser una tupla de ndarrays"
+
#: extmod/ulab/code/ndarray.c
msgid "first argument must be an iterable"
-msgstr "el primer argumento debe permitir iteración"
+msgstr "el primer argumento debe ser un iterable"
#: extmod/ulab/code/vector/vectorise.c
msgid "first argument must be an ndarray"
@@ -2634,7 +2697,7 @@ msgstr "el argumento invertido debe ser un ndarray"
#: py/objint.c
msgid "float too big"
-msgstr "punto flotante muy grande"
+msgstr "punto flotante demasiado grande"
#: shared-bindings/_stage/Text.c
msgid "font must be 2048 bytes long"
@@ -2665,9 +2728,9 @@ msgstr "la función tiene múltiples valores para el argumento '%q'"
msgid "function has the same sign at the ends of interval"
msgstr "la función tiene el mismo signo a extremos del intervalo"
-#: extmod/ulab/code/compare/compare.c
-msgid "function is implemented for scalars and ndarrays only"
-msgstr "la función está implementada solo para escalares y ndarrays"
+#: extmod/ulab/code/ndarray.c
+msgid "function is defined for ndarrays only"
+msgstr "Función solo definida para ndarrays"
#: py/argcheck.c
#, c-format
@@ -2736,6 +2799,7 @@ msgstr "relleno (padding) incorrecto"
msgid "index is out of bounds"
msgstr "el índice está fuera de límites"
+#: extmod/ulab/code/numerical/numerical.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c py/obj.c
msgid "index out of range"
msgstr "index fuera de rango"
@@ -2760,6 +2824,10 @@ msgstr "el tamaño de initial_value es incorrecto"
msgid "inline assembler must be a function"
msgstr "ensamblador en línea debe ser una función"
+#: extmod/ulab/code/ndarray.c
+msgid "input and output shapes are not compatible"
+msgstr "Formas de entrada y salida no son compactibles"
+
#: extmod/ulab/code/ulab_create.c
msgid "input argument must be an integer or a 2-tuple"
msgstr "el argumento de entrada debe ser un entero o una tupla de par"
@@ -2768,9 +2836,13 @@ msgstr "el argumento de entrada debe ser un entero o una tupla de par"
msgid "input array length must be power of 2"
msgstr "el tamaño del arreglo de entrada debe ser potencia de 2"
+#: extmod/ulab/code/ulab_create.c
+msgid "input arrays are not compatible"
+msgstr "Arrays de entrada no son compactibles"
+
#: extmod/ulab/code/poly/poly.c
msgid "input data must be an iterable"
-msgstr "los datos de entrada deben permitir iteración"
+msgstr "los datos de entrada deben ser iterables"
#: extmod/ulab/code/linalg/linalg.c
msgid "input matrix is asymmetric"
@@ -2780,6 +2852,22 @@ msgstr "la matriz de entrada es asimétrica"
msgid "input matrix is singular"
msgstr "la matriz de entrada es singular"
+#: extmod/ulab/code/user/user.c
+msgid "input must be a dense ndarray"
+msgstr "Entrada tiene que ser un ndarray denso"
+
+#: extmod/ulab/code/ulab_create.c
+msgid "input must be a tensor of rank 2"
+msgstr "Entrada tiene que ser un tensor de rango 2"
+
+#: extmod/ulab/code/ulab_create.c extmod/ulab/code/user/user.c
+msgid "input must be an ndarray"
+msgstr "Entrada tiene que ser un ndarray"
+
+#: extmod/ulab/code/filter/filter.c
+msgid "input must be one-dimensional"
+msgstr "Entrada tiene que ser unidimensional"
+
#: extmod/ulab/code/linalg/linalg.c
msgid "input must be square matrix"
msgstr "la entrada debe ser una matriz cuadrada"
@@ -2792,6 +2880,10 @@ msgstr "la entrada debe ser una tupla, lista, rango o ndarray"
msgid "input vectors must be of equal length"
msgstr "los vectores de entrada deben ser de igual tamaño"
+#: extmod/ulab/code/poly/poly.c
+msgid "inputs are not iterable"
+msgstr "Entradas no son iterables"
+
#: py/parsenum.c
msgid "int() arg 2 must be >= 2 and <= 36"
msgstr "int() arg 2 debe ser >= 2 y <= 36"
@@ -2862,6 +2954,10 @@ msgstr "sintaxis inválida para entero con base %d"
msgid "invalid syntax for number"
msgstr "sintaxis inválida para número"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "io must be rtc io"
+msgstr ""
+
#: py/objtype.c
msgid "issubclass() arg 1 must be a class"
msgstr "issubclass() arg 1 debe ser una clase"
@@ -2931,7 +3027,7 @@ msgstr "long int no soportado en esta compilación"
#: ports/esp32s2/common-hal/canio/CAN.c
msgid "loopback + silent mode not supported by peripheral"
-msgstr ""
+msgstr "Loopback + modo silencioso no están soportados por periférico"
#: py/parse.c
msgid "malformed f-string"
@@ -2963,17 +3059,21 @@ msgstr "max_length debe ser 0-%d cuando fixed_length es %s"
msgid "max_length must be > 0"
msgstr "max_lenght debe ser > 0"
+#: extmod/ulab/code/ndarray.c
+msgid "maximum number of dimensions is 4"
+msgstr "Máximo número de dimensiones es 4"
+
#: py/runtime.c
msgid "maximum recursion depth exceeded"
msgstr "profundidad máxima de recursión excedida"
#: extmod/ulab/code/approx/approx.c
msgid "maxiter must be > 0"
-msgstr ""
+msgstr "maxiter tiene que ser > 0"
#: extmod/ulab/code/approx/approx.c
msgid "maxiter should be > 0"
-msgstr ""
+msgstr "maxiter debe ser > 0"
#: py/runtime.c
#, c-format
@@ -3012,10 +3112,6 @@ msgstr "debe hacer un raise de un objeto"
msgid "must use keyword argument for key function"
msgstr "debe utilizar argumento de palabra clave para la función clave"
-#: extmod/ulab/code/numerical/numerical.c
-msgid "n must be between 0, and 9"
-msgstr "n debe estar entre 0 y 9"
-
#: py/runtime.c
msgid "name '%q' is not defined"
msgstr "name '%q' no esta definido"
@@ -3100,6 +3196,10 @@ msgstr ""
"no deberia estar/tener agumento por palabra clave despues de argumento por "
"palabra clave"
+#: extmod/ulab/code/linalg/linalg.c
+msgid "norm is defined for 1D and 2D arrays"
+msgstr "norma está definida para arrays 1D y 2D"
+
#: shared-bindings/_bleio/UUID.c
msgid "not a 128-bit UUID"
msgstr "no es 128-bit UUID"
@@ -3113,10 +3213,6 @@ msgstr ""
msgid "not enough arguments for format string"
msgstr "no suficientes argumentos para format string"
-#: extmod/ulab/code/poly/poly.c
-msgid "number of arguments must be 2, or 3"
-msgstr "el número de argumentos debe ser 2 o 3"
-
#: extmod/ulab/code/ulab_create.c
msgid "number of points must be at least 2"
msgstr "el número de puntos debe ser al menos 2"
@@ -3169,6 +3265,10 @@ msgstr "objeto con protocolo de buffer requerido"
msgid "odd-length string"
msgstr "string de longitud impar"
+#: extmod/ulab/code/ulab_create.c
+msgid "offset is too large"
+msgstr "offset es demasiado grande"
+
#: py/objstr.c py/objstrunicode.c
msgid "offset out of bounds"
msgstr "offset fuera de límites"
@@ -3191,6 +3291,14 @@ msgstr "solo se admiten segmentos con step=1 (alias None)"
msgid "operands could not be broadcast together"
msgstr "los operandos no se pueden transmitir juntos"
+#: extmod/ulab/code/ndarray.c
+msgid "operation is implemented for 1D Boolean arrays only"
+msgstr "operación solo está implementada para arrays booleanos de 1D"
+
+#: extmod/ulab/code/numerical/numerical.c
+msgid "operation is not implemented for flattened array"
+msgstr "operación no está implementada para arrays aplanados"
+
#: extmod/ulab/code/numerical/numerical.c
msgid "operation is not implemented on ndarrays"
msgstr "la operación no está implementada para ndarrays"
@@ -3281,6 +3389,7 @@ msgstr "el 3er argumento de pow() no puede ser 0"
msgid "pow() with 3 arguments requires integers"
msgstr "pow() con 3 argumentos requiere enteros"
+#: ports/esp32s2/boards/adafruit_magtag_2.9_grayscale/mpconfigboard.h
#: ports/esp32s2/boards/adafruit_metro_esp32s2/mpconfigboard.h
#: ports/esp32s2/boards/electroniccats_bastwifi/mpconfigboard.h
#: ports/esp32s2/boards/espressif_kaluga_1/mpconfigboard.h
@@ -3324,6 +3433,10 @@ msgstr "import relativo"
msgid "requested length %d but object has length %d"
msgstr "longitud solicitada %d pero el objeto tiene longitud %d"
+#: extmod/ulab/code/ndarray_operators.c
+msgid "results cannot be cast to specified type"
+msgstr "resultados no pueden aplicar cast a un tipo específico"
+
#: py/compile.c
msgid "return annotation must be an identifier"
msgstr "la anotación de retorno debe ser un identificador"
@@ -3342,9 +3455,9 @@ msgstr "rgb_pins[%d] duplica otra asignación de pin"
msgid "rgb_pins[%d] is not on the same port as clock"
msgstr "rgb_pins[%d] no está en el mismo puerto que el reloj"
-#: extmod/ulab/code/ndarray.c
-msgid "right hand side must be an ndarray, or a scalar"
-msgstr "el lado derecho debe ser un ndarray o escalar"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "roll argument must be an ndarray"
+msgstr "Argumento enrolado tiene que ser un ndarray"
#: py/objstr.c
msgid "rsplit(None,n)"
@@ -3371,8 +3484,8 @@ msgid "script compilation not supported"
msgstr "script de compilación no soportado"
#: extmod/ulab/code/ndarray.c
-msgid "shape must be a 2-tuple"
-msgstr "la forma debe ser una tupla de 2"
+msgid "shape must be a tuple"
+msgstr "forma tiene que ser una tupla"
#: py/objstr.c
msgid "sign not allowed in string format specifier"
@@ -3414,10 +3527,6 @@ msgstr "reinicio suave\n"
msgid "sort argument must be an ndarray"
msgstr "argumento de ordenado debe ser un ndarray"
-#: extmod/ulab/code/numerical/numerical.c
-msgid "sorted axis can't be longer than 65535"
-msgstr ""
-
#: extmod/ulab/code/filter/filter.c
msgid "sos array must be of shape (n_section, 6)"
msgstr "el arreglo sos debe de forma (n_section, 6)"
@@ -3498,6 +3607,7 @@ msgstr "limite debe ser en el rango 0-65536"
msgid "time.struct_time() takes a 9-sequence"
msgstr "time.struct_time() toma un sequencio 9"
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "timeout duration exceeded the maximum supported value"
msgstr ""
@@ -3523,6 +3633,10 @@ msgstr "tiempo de espera agotado esperando a tarjeta v2"
msgid "timestamp out of range for platform time_t"
msgstr "timestamp fuera de rango para plataform time_t"
+#: extmod/ulab/code/ndarray.c
+msgid "tobytes can be invoked for dense arrays only"
+msgstr "tobytes solo pueden ser invocados por arrays densos"
+
#: shared-module/struct/__init__.c
msgid "too many arguments provided with the given format"
msgstr "demasiados argumentos provistos con el formato dado"
@@ -3540,6 +3654,10 @@ msgstr "demasiados valores para descomprimir (%d esperado)"
msgid "trapz is defined for 1D arrays of equal length"
msgstr "trapz está definido para arreglos 1D de igual tamaño"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "trigger level must be 0 or 1"
+msgstr ""
+
#: extmod/ulab/code/linalg/linalg.c
msgid "tuple index out of range"
msgstr "tuple index fuera de rango"
@@ -3551,12 +3669,12 @@ msgstr "tupla/lista tiene una longitud incorrecta"
#: ports/esp32s2/common-hal/canio/CAN.c
#, c-format
msgid "twai_driver_install returned esp-idf error #%d"
-msgstr ""
+msgstr "twai_driver_install devolvió esp-idf error #%d"
#: ports/esp32s2/common-hal/canio/CAN.c
#, c-format
msgid "twai_start returned esp-idf error #%d"
-msgstr ""
+msgstr "twai_start devolvió esp-idf error #%d"
#: ports/atmel-samd/common-hal/busio/UART.c
#: ports/esp32s2/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
@@ -3682,6 +3800,14 @@ msgstr "value_count debe ser > 0"
msgid "vectors must have same lengths"
msgstr "los vectores deben tener el mismo tamaño"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "wakeup conflict"
+msgstr ""
+
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "watchdog not initialized"
+msgstr "watchdog no inicializado"
+
#: shared-bindings/watchdog/WatchDogTimer.c
msgid "watchdog timeout must be greater than 0"
msgstr "el tiempo de espera del perro guardián debe ser mayor a 0"
@@ -3694,13 +3820,13 @@ msgstr "el ancho debe ser mayor que cero"
msgid "window must be <= interval"
msgstr "la ventana debe ser <= intervalo"
-#: extmod/ulab/code/linalg/linalg.c
-msgid "wrong argument type"
-msgstr "tipo de argumento incorrecto"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "wrong axis index"
+msgstr "indice de eje erróneo"
-#: extmod/ulab/code/ndarray.c
-msgid "wrong index type"
-msgstr "tipo de índice incorrecto"
+#: extmod/ulab/code/ulab_create.c
+msgid "wrong axis specified"
+msgstr "eje especificado erróneo"
#: extmod/ulab/code/vector/vectorise.c
msgid "wrong input type"
@@ -3750,6 +3876,52 @@ msgstr "zi debe ser de tipo flotante"
msgid "zi must be of shape (n_section, 2)"
msgstr "zi debe ser una forma (n_section,2)"
+#~ msgid "Only IPv4 SOCK_STREAM sockets supported"
+#~ msgstr "Solo hay capacidad para enchufes IPv4 SOCK_STREAM"
+
+#~ msgid "arctan2 is implemented for scalars and ndarrays only"
+#~ msgstr "arctan2 se encuentra implementado solo para escalares y ndarrays"
+
+#~ msgid "axis must be -1, 0, None, or 1"
+#~ msgstr "eje debe ser -1, 0, None o 1"
+
+#~ msgid "axis must be -1, 0, or 1"
+#~ msgstr "eje debe ser -1, 0, o 1"
+
+#~ msgid "axis must be None, 0, or 1"
+#~ msgstr "eje debe ser None, 0, o 1"
+
+#~ msgid "cannot reshape array (incompatible input/output shape)"
+#~ msgstr ""
+#~ "no se puede reformar el arreglo (forma de entrada/salida incompatible)"
+
+#~ msgid "could not broadast input array from shape"
+#~ msgstr "no se pudo anunciar la matriz de entrada desde la forma"
+
+#~ msgid "ddof must be smaller than length of data set"
+#~ msgstr "ddof debe ser menor que la longitud del conjunto de datos"
+
+#~ msgid "function is implemented for scalars and ndarrays only"
+#~ msgstr "la función está implementada solo para escalares y ndarrays"
+
+#~ msgid "n must be between 0, and 9"
+#~ msgstr "n debe estar entre 0 y 9"
+
+#~ msgid "number of arguments must be 2, or 3"
+#~ msgstr "el número de argumentos debe ser 2 o 3"
+
+#~ msgid "right hand side must be an ndarray, or a scalar"
+#~ msgstr "el lado derecho debe ser un ndarray o escalar"
+
+#~ msgid "shape must be a 2-tuple"
+#~ msgstr "la forma debe ser una tupla de 2"
+
+#~ msgid "wrong argument type"
+#~ msgstr "tipo de argumento incorrecto"
+
+#~ msgid "wrong index type"
+#~ msgstr "tipo de índice incorrecto"
+
#~ msgid "specify size or data, but not both"
#~ msgstr "especifique o tamaño o datos, pero no ambos"
diff --git a/locale/fil.po b/locale/fil.po
index 93f41a88e..4a9e9591e 100644
--- a/locale/fil.po
+++ b/locale/fil.po
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-04 21:18+0530\n"
+"POT-Creation-Date: 2020-11-27 23:57-0500\n"
"PO-Revision-Date: 2018-12-20 22:15-0800\n"
"Last-Translator: Timothy <me@timothygarcia.ca>\n"
"Language-Team: fil\n"
@@ -297,7 +297,9 @@ msgstr ""
msgid "All I2C peripherals are in use"
msgstr "Lahat ng I2C peripherals ginagamit"
-#: ports/esp32s2/peripherals/pcnt_handler.c
+#: ports/esp32s2/common-hal/countio/Counter.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/rotaryio/IncrementalEncoder.c
msgid "All PCNT units in use"
msgstr ""
@@ -334,6 +336,7 @@ msgstr "Lahat ng timers para sa pin na ito ay ginagamit"
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
#: ports/cxd56/common-hal/pulseio/PulseOut.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
#: ports/esp32s2/common-hal/neopixel_write/__init__.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c
#: ports/esp32s2/common-hal/pulseio/PulseOut.c
@@ -499,7 +502,8 @@ msgstr ""
msgid "Buffer must be a multiple of 512 bytes"
msgstr ""
-#: shared-bindings/bitbangio/I2C.c shared-bindings/busio/I2C.c
+#: shared-bindings/bitbangio/I2C.c shared-bindings/busdevice/I2CDevice.c
+#: shared-bindings/busio/I2C.c
msgid "Buffer must be at least length 1"
msgstr "Buffer dapat ay hindi baba sa 1 na haba"
@@ -853,6 +857,10 @@ msgstr "Umasa ng %q"
msgid "Expected an Address"
msgstr ""
+#: shared-bindings/alarm/__init__.c
+msgid "Expected an alarm"
+msgstr ""
+
#: shared-module/_pixelbuf/PixelBuf.c
#, c-format
msgid "Expected tuple of length %d, got %d"
@@ -866,6 +874,10 @@ msgstr ""
msgid "FFT is defined for ndarrays only"
msgstr ""
+#: extmod/ulab/code/fft/fft.c
+msgid "FFT is implemented for linear arrays only"
+msgstr ""
+
#: ports/esp32s2/common-hal/socketpool/Socket.c
msgid "Failed SSL handshake"
msgstr ""
@@ -994,6 +1006,10 @@ msgstr ""
msgid "I2SOut not available"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "IOs 0, 2 & 4 do not support internal pullup in sleep"
+msgstr ""
+
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
@@ -1011,6 +1027,10 @@ msgstr ""
msgid "Incorrect buffer size"
msgstr ""
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "Initialization failed due to lack of memory"
+msgstr ""
+
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
msgid "Input taking too long"
msgstr ""
@@ -1091,6 +1111,7 @@ msgid "Invalid byteorder string"
msgstr ""
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
msgid "Invalid capture period. Valid range: 1 - 500"
msgstr ""
@@ -1267,6 +1288,10 @@ msgstr ""
msgid "Must use a multiple of 6 rgb pins, not %d"
msgstr ""
+#: ports/esp32s2/common-hal/nvm/ByteArray.c
+msgid "NVS Error"
+msgstr ""
+
#: py/parse.c
msgid "Name too long"
msgstr ""
@@ -1285,6 +1310,11 @@ msgstr "Walang DAC sa chip"
msgid "No DMA channel found"
msgstr "Walang DMA channel na mahanap"
+#: shared-module/busdevice/I2CDevice.c
+#, c-format
+msgid "No I2C device at address: %x"
+msgstr ""
+
#: ports/esp32s2/common-hal/busio/SPI.c ports/mimxrt10xx/common-hal/busio/SPI.c
#: ports/stm/common-hal/busio/SPI.c
msgid "No MISO Pin"
@@ -1420,14 +1450,14 @@ msgstr "Odd na parity ay hindi supportado"
msgid "Only 8 or 16 bit mono with "
msgstr "Tanging 8 o 16 na bit mono na may "
-#: ports/esp32s2/common-hal/socketpool/SocketPool.c
-msgid "Only IPv4 SOCK_STREAM sockets supported"
-msgstr ""
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr ""
+#: ports/esp32s2/common-hal/socketpool/SocketPool.c
+msgid "Only IPv4 sockets supported"
+msgstr ""
+
#: shared-module/displayio/OnDiskBitmap.c
#, c-format
msgid ""
@@ -1441,6 +1471,10 @@ msgid ""
"%d bpp given"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "Only one alarm.time alarm can be set."
+msgstr ""
+
#: shared-module/displayio/ColorConverter.c
msgid "Only one color can be transparent at a time"
msgstr ""
@@ -1499,6 +1533,10 @@ msgstr ""
msgid "Pin number already reserved by EXTI"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "PinAlarm not yet implemented"
+msgstr ""
+
#: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format
msgid ""
@@ -1562,7 +1600,7 @@ msgstr ""
msgid "RTC calibration is not supported on this board"
msgstr "RTC calibration ay hindi supportado ng board na ito"
-#: shared-bindings/time/__init__.c
+#: shared-bindings/alarm/time/TimeAlarm.c shared-bindings/time/__init__.c
msgid "RTC is not supported on this board"
msgstr "Hindi supportado ang RTC sa board na ito"
@@ -1709,6 +1747,10 @@ msgstr "Stream kulang ng readinto() o write() method."
msgid "Supply at least one UART pin"
msgstr ""
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Supply one of monotonic_time or epoch_time"
+msgstr ""
+
#: shared-bindings/gnss/GNSS.c
msgid "System entry must be gnss.SatelliteSystem"
msgstr ""
@@ -1772,6 +1814,10 @@ msgstr ""
msgid "Tile width must exactly divide bitmap width"
msgstr ""
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Time is in the past."
+msgstr ""
+
#: ports/nrf/common-hal/_bleio/Adapter.c
#, c-format
msgid "Timeout is too long: Maximum timeout length is %d seconds"
@@ -1971,7 +2017,7 @@ msgstr ""
msgid "WARNING: Your code filename has two extensions\n"
msgstr "BABALA: Ang pangalan ng file ay may dalawang extension\n"
-#: shared-bindings/watchdog/WatchDogTimer.c
+#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "WatchDogTimer cannot be deinitialized once mode is set to RESET"
msgstr ""
@@ -2056,10 +2102,6 @@ msgstr "wala sa sakop ang address"
msgid "addresses is empty"
msgstr "walang laman ang address"
-#: extmod/ulab/code/vector/vectorise.c
-msgid "arctan2 is implemented for scalars and ndarrays only"
-msgstr ""
-
#: py/modbuiltins.c
msgid "arg is an empty sequence"
msgstr "arg ay walang laman na sequence"
@@ -2068,6 +2110,10 @@ msgstr "arg ay walang laman na sequence"
msgid "argsort argument must be an ndarray"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
+msgid "argsort is not implemented for flattened arrays"
+msgstr ""
+
#: py/runtime.c
msgid "argument has wrong type"
msgstr "may maling type ang argument"
@@ -2085,15 +2131,23 @@ msgstr "hindi tugma ang argument num/types"
msgid "argument should be a '%q' not a '%q'"
msgstr "argument ay dapat na '%q' hindi '%q'"
-#: extmod/ulab/code/linalg/linalg.c
+#: extmod/ulab/code/linalg/linalg.c extmod/ulab/code/numerical/numerical.c
msgid "arguments must be ndarrays"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "array and index length must be equal"
+msgstr ""
+
#: py/objarray.c shared-bindings/nvm/ByteArray.c
msgid "array/bytes required on right side"
msgstr "array/bytes kinakailangan sa kanang bahagi"
#: extmod/ulab/code/numerical/numerical.c
+msgid "attempt to get (arg)min/(arg)max of empty sequence"
+msgstr ""
+
+#: extmod/ulab/code/numerical/numerical.c
msgid "attempt to get argmin/argmax of an empty sequence"
msgstr ""
@@ -2102,15 +2156,15 @@ msgid "attributes not supported yet"
msgstr "attributes hindi sinusuportahan"
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, None, or 1"
+msgid "axis is out of bounds"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, or 1"
+msgid "axis must be None, or an integer"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be None, 0, or 1"
+msgid "axis too long"
msgstr ""
#: py/builtinevex.c
@@ -2321,6 +2375,10 @@ msgstr ""
"hindi mapalitan ang manual field specification sa awtomatikong field "
"numbering"
+#: extmod/ulab/code/ndarray_operators.c
+msgid "cannot cast output with casting rule"
+msgstr ""
+
#: py/objtype.c
msgid "cannot create '%q' instances"
msgstr "hindi magawa '%q' instances"
@@ -2337,10 +2395,6 @@ msgstr "hindi ma-import ang name %q"
msgid "cannot perform relative import"
msgstr "hindi maaring isagawa ang relative import"
-#: extmod/ulab/code/ndarray.c
-msgid "cannot reshape array (incompatible input/output shape)"
-msgstr ""
-
#: py/emitnative.c
msgid "casting"
msgstr "casting"
@@ -2413,10 +2467,6 @@ msgstr ""
msgid "convolve arguments must not be empty"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "could not broadast input array from shape"
-msgstr ""
-
#: extmod/ulab/code/poly/poly.c
msgid "could not invert Vandermonde matrix"
msgstr ""
@@ -2425,6 +2475,10 @@ msgstr ""
msgid "couldn't determine SD card version"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
+msgid "cross is defined for 1D arrays of length 3"
+msgstr ""
+
#: extmod/ulab/code/approx/approx.c
msgid "data must be iterable"
msgstr ""
@@ -2433,10 +2487,6 @@ msgstr ""
msgid "data must be of equal length"
msgstr ""
-#: extmod/ulab/code/numerical/numerical.c
-msgid "ddof must be smaller than length of data set"
-msgstr ""
-
#: py/parsenum.c
msgid "decimal numbers not supported"
msgstr "decimal numbers hindi sinusuportahan"
@@ -2470,6 +2520,10 @@ msgstr "may mali sa haba ng dict update sequence"
msgid "diff argument must be an ndarray"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
+msgid "differentiation order out of range"
+msgstr ""
+
#: py/modmath.c py/objfloat.c py/objint_longlong.c py/objint_mpz.c py/runtime.c
#: shared-bindings/math/__init__.c
msgid "division by zero"
@@ -2500,6 +2554,10 @@ msgstr "sa huli ng format habang naghahanap sa conversion specifier"
msgid "end_x should be an int"
msgstr "y ay dapat int"
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "epoch_time not supported on this board"
+msgstr ""
+
#: ports/nrf/common-hal/busio/UART.c
#, c-format
msgid "error = 0x%08lX"
@@ -2586,6 +2644,10 @@ msgstr ""
msgid "first argument must be a function"
msgstr ""
+#: extmod/ulab/code/ulab_create.c
+msgid "first argument must be a tuple of ndarrays"
+msgstr ""
+
#: extmod/ulab/code/ndarray.c
msgid "first argument must be an iterable"
msgstr ""
@@ -2639,8 +2701,8 @@ msgstr "ang function ay nakakuha ng maraming values para sa argument '%q'"
msgid "function has the same sign at the ends of interval"
msgstr ""
-#: extmod/ulab/code/compare/compare.c
-msgid "function is implemented for scalars and ndarrays only"
+#: extmod/ulab/code/ndarray.c
+msgid "function is defined for ndarrays only"
msgstr ""
#: py/argcheck.c
@@ -2711,6 +2773,7 @@ msgstr "mali ang padding"
msgid "index is out of bounds"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c py/obj.c
msgid "index out of range"
msgstr "index wala sa sakop"
@@ -2735,6 +2798,10 @@ msgstr ""
msgid "inline assembler must be a function"
msgstr "inline assembler ay dapat na function"
+#: extmod/ulab/code/ndarray.c
+msgid "input and output shapes are not compatible"
+msgstr ""
+
#: extmod/ulab/code/ulab_create.c
msgid "input argument must be an integer or a 2-tuple"
msgstr ""
@@ -2743,6 +2810,10 @@ msgstr ""
msgid "input array length must be power of 2"
msgstr ""
+#: extmod/ulab/code/ulab_create.c
+msgid "input arrays are not compatible"
+msgstr ""
+
#: extmod/ulab/code/poly/poly.c
msgid "input data must be an iterable"
msgstr ""
@@ -2755,6 +2826,22 @@ msgstr ""
msgid "input matrix is singular"
msgstr ""
+#: extmod/ulab/code/user/user.c
+msgid "input must be a dense ndarray"
+msgstr ""
+
+#: extmod/ulab/code/ulab_create.c
+msgid "input must be a tensor of rank 2"
+msgstr ""
+
+#: extmod/ulab/code/ulab_create.c extmod/ulab/code/user/user.c
+msgid "input must be an ndarray"
+msgstr ""
+
+#: extmod/ulab/code/filter/filter.c
+msgid "input must be one-dimensional"
+msgstr ""
+
#: extmod/ulab/code/linalg/linalg.c
msgid "input must be square matrix"
msgstr ""
@@ -2767,6 +2854,10 @@ msgstr ""
msgid "input vectors must be of equal length"
msgstr ""
+#: extmod/ulab/code/poly/poly.c
+msgid "inputs are not iterable"
+msgstr ""
+
#: py/parsenum.c
msgid "int() arg 2 must be >= 2 and <= 36"
msgstr "int() arg 2 ay dapat >=2 at <= 36"
@@ -2837,6 +2928,10 @@ msgstr "maling sintaks sa integer na may base %d"
msgid "invalid syntax for number"
msgstr "maling sintaks sa number"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "io must be rtc io"
+msgstr ""
+
#: py/objtype.c
msgid "issubclass() arg 1 must be a class"
msgstr "issubclass() arg 1 ay dapat na class"
@@ -2939,6 +3034,10 @@ msgstr ""
msgid "max_length must be > 0"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "maximum number of dimensions is 4"
+msgstr ""
+
#: py/runtime.c
msgid "maximum recursion depth exceeded"
msgstr "lumagpas ang maximum recursion depth"
@@ -2988,10 +3087,6 @@ msgstr "dapat itaas ang isang object"
msgid "must use keyword argument for key function"
msgstr "dapat gumamit ng keyword argument para sa key function"
-#: extmod/ulab/code/numerical/numerical.c
-msgid "n must be between 0, and 9"
-msgstr ""
-
#: py/runtime.c
msgid "name '%q' is not defined"
msgstr "name '%q' ay hindi defined"
@@ -3074,6 +3169,10 @@ msgstr "non-keyword arg sa huli ng */**"
msgid "non-keyword arg after keyword arg"
msgstr "non-keyword arg sa huli ng keyword arg"
+#: extmod/ulab/code/linalg/linalg.c
+msgid "norm is defined for 1D and 2D arrays"
+msgstr ""
+
#: shared-bindings/_bleio/UUID.c
msgid "not a 128-bit UUID"
msgstr ""
@@ -3086,10 +3185,6 @@ msgstr "hindi lahat ng arguments na i-convert habang string formatting"
msgid "not enough arguments for format string"
msgstr "kulang sa arguments para sa format string"
-#: extmod/ulab/code/poly/poly.c
-msgid "number of arguments must be 2, or 3"
-msgstr ""
-
#: extmod/ulab/code/ulab_create.c
msgid "number of points must be at least 2"
msgstr ""
@@ -3142,6 +3237,10 @@ msgstr "object na may buffer protocol kinakailangan"
msgid "odd-length string"
msgstr "odd-length string"
+#: extmod/ulab/code/ulab_create.c
+msgid "offset is too large"
+msgstr ""
+
#: py/objstr.c py/objstrunicode.c
#, fuzzy
msgid "offset out of bounds"
@@ -3165,6 +3264,14 @@ msgstr "ang mga slices lamang na may hakbang = 1 (aka None) ang sinusuportahan"
msgid "operands could not be broadcast together"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "operation is implemented for 1D Boolean arrays only"
+msgstr ""
+
+#: extmod/ulab/code/numerical/numerical.c
+msgid "operation is not implemented for flattened array"
+msgstr ""
+
#: extmod/ulab/code/numerical/numerical.c
msgid "operation is not implemented on ndarrays"
msgstr ""
@@ -3256,6 +3363,7 @@ msgstr "pow() 3rd argument ay hindi maaring 0"
msgid "pow() with 3 arguments requires integers"
msgstr "pow() na may 3 argumento kailangan ng integers"
+#: ports/esp32s2/boards/adafruit_magtag_2.9_grayscale/mpconfigboard.h
#: ports/esp32s2/boards/adafruit_metro_esp32s2/mpconfigboard.h
#: ports/esp32s2/boards/electroniccats_bastwifi/mpconfigboard.h
#: ports/esp32s2/boards/espressif_kaluga_1/mpconfigboard.h
@@ -3299,6 +3407,10 @@ msgstr "relative import"
msgid "requested length %d but object has length %d"
msgstr "hiniling ang haba %d ngunit may haba ang object na %d"
+#: extmod/ulab/code/ndarray_operators.c
+msgid "results cannot be cast to specified type"
+msgstr ""
+
#: py/compile.c
msgid "return annotation must be an identifier"
msgstr "return annotation ay dapat na identifier"
@@ -3317,8 +3429,8 @@ msgstr ""
msgid "rgb_pins[%d] is not on the same port as clock"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "right hand side must be an ndarray, or a scalar"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "roll argument must be an ndarray"
msgstr ""
#: py/objstr.c
@@ -3346,7 +3458,7 @@ msgid "script compilation not supported"
msgstr "script kompilasyon hindi supportado"
#: extmod/ulab/code/ndarray.c
-msgid "shape must be a 2-tuple"
+msgid "shape must be a tuple"
msgstr ""
#: py/objstr.c
@@ -3389,10 +3501,6 @@ msgstr "malambot na reboot\n"
msgid "sort argument must be an ndarray"
msgstr ""
-#: extmod/ulab/code/numerical/numerical.c
-msgid "sorted axis can't be longer than 65535"
-msgstr ""
-
#: extmod/ulab/code/filter/filter.c
msgid "sos array must be of shape (n_section, 6)"
msgstr ""
@@ -3474,6 +3582,7 @@ msgstr "ang threshold ay dapat sa range 0-65536"
msgid "time.struct_time() takes a 9-sequence"
msgstr "time.struct_time() kumukuha ng 9-sequence"
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "timeout duration exceeded the maximum supported value"
msgstr ""
@@ -3499,6 +3608,10 @@ msgstr ""
msgid "timestamp out of range for platform time_t"
msgstr "wala sa sakop ng timestamp ang platform time_t"
+#: extmod/ulab/code/ndarray.c
+msgid "tobytes can be invoked for dense arrays only"
+msgstr ""
+
#: shared-module/struct/__init__.c
msgid "too many arguments provided with the given format"
msgstr "masyadong maraming mga argumento na ibinigay sa ibinigay na format"
@@ -3516,6 +3629,10 @@ msgstr "masyadong maraming values para i-unpact (umaasa ng %d)"
msgid "trapz is defined for 1D arrays of equal length"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "trigger level must be 0 or 1"
+msgstr ""
+
#: extmod/ulab/code/linalg/linalg.c
msgid "tuple index out of range"
msgstr "indeks ng tuple wala sa sakop"
@@ -3658,6 +3775,14 @@ msgstr ""
msgid "vectors must have same lengths"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "wakeup conflict"
+msgstr ""
+
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "watchdog not initialized"
+msgstr ""
+
#: shared-bindings/watchdog/WatchDogTimer.c
msgid "watchdog timeout must be greater than 0"
msgstr ""
@@ -3670,12 +3795,12 @@ msgstr ""
msgid "window must be <= interval"
msgstr ""
-#: extmod/ulab/code/linalg/linalg.c
-msgid "wrong argument type"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "wrong axis index"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "wrong index type"
+#: extmod/ulab/code/ulab_create.c
+msgid "wrong axis specified"
msgstr ""
#: extmod/ulab/code/vector/vectorise.c
diff --git a/locale/fr.po b/locale/fr.po
index ff15b527e..12d3feca0 100644
--- a/locale/fr.po
+++ b/locale/fr.po
@@ -7,15 +7,15 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-04 21:18+0530\n"
-"PO-Revision-Date: 2020-10-22 20:48+0000\n"
+"POT-Creation-Date: 2020-11-27 23:57-0500\n"
+"PO-Revision-Date: 2020-11-24 22:45+0000\n"
"Last-Translator: Antonin ENFRUN <antonin.e@me.com>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 4.3.1\n"
+"X-Generator: Weblate 4.4-dev\n"
#: main.c
msgid ""
@@ -298,15 +298,17 @@ msgstr "Type d'adresse hors plage"
#: ports/esp32s2/common-hal/canio/CAN.c
msgid "All CAN peripherals are in use"
-msgstr ""
+msgstr "Tous les périphériques CAN sont utilisés"
#: ports/esp32s2/common-hal/busio/I2C.c ports/nrf/common-hal/busio/I2C.c
msgid "All I2C peripherals are in use"
msgstr "Tous les périphériques I2C sont utilisés"
-#: ports/esp32s2/peripherals/pcnt_handler.c
+#: ports/esp32s2/common-hal/countio/Counter.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/rotaryio/IncrementalEncoder.c
msgid "All PCNT units in use"
-msgstr ""
+msgstr "Toutes les unités PCNT sont utilisées"
#: ports/atmel-samd/common-hal/canio/Listener.c
#: ports/esp32s2/common-hal/canio/Listener.c
@@ -340,6 +342,7 @@ msgstr "Tous les timers pour cette broche sont utilisés"
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
#: ports/cxd56/common-hal/pulseio/PulseOut.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
#: ports/esp32s2/common-hal/neopixel_write/__init__.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c
#: ports/esp32s2/common-hal/pulseio/PulseOut.c
@@ -431,7 +434,7 @@ msgstr ""
#: ports/esp32s2/common-hal/canio/CAN.c
msgid "Baudrate not supported by peripheral"
-msgstr ""
+msgstr "Baudrate non prise en charge par le périphérique"
#: shared-module/displayio/Display.c
#: shared-module/framebufferio/FramebufferDisplay.c
@@ -445,7 +448,7 @@ msgstr "'bit clock' et 'word select' doivent partager une horloge"
#: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format
msgid "Bit depth must be from 1 to 6 inclusive, not %d"
-msgstr ""
+msgstr "Bit depth doit être compris entre 1 et 6 inclus, et non %d"
#: shared-bindings/audiobusio/PDMIn.c
msgid "Bit depth must be multiple of 8."
@@ -508,7 +511,8 @@ msgstr "La longueur de la mémoire tampon doit être un multiple de 512"
msgid "Buffer must be a multiple of 512 bytes"
msgstr "La mémoire tampon doit être un multiple de 512"
-#: shared-bindings/bitbangio/I2C.c shared-bindings/busio/I2C.c
+#: shared-bindings/bitbangio/I2C.c shared-bindings/busdevice/I2CDevice.c
+#: shared-bindings/busio/I2C.c
msgid "Buffer must be at least length 1"
msgstr "Le tampon doit être de longueur au moins 1"
@@ -864,6 +868,10 @@ msgstr "Un UUID est attendu"
msgid "Expected an Address"
msgstr "Attendu une adresse"
+#: shared-bindings/alarm/__init__.c
+msgid "Expected an alarm"
+msgstr ""
+
#: shared-module/_pixelbuf/PixelBuf.c
#, c-format
msgid "Expected tuple of length %d, got %d"
@@ -878,6 +886,10 @@ msgstr ""
msgid "FFT is defined for ndarrays only"
msgstr "La FFT est définie pour les ndarrays uniquement"
+#: extmod/ulab/code/fft/fft.c
+msgid "FFT is implemented for linear arrays only"
+msgstr "FFT n'est implémenté que pour les tableaux linéaires"
+
#: ports/esp32s2/common-hal/socketpool/Socket.c
msgid "Failed SSL handshake"
msgstr "Échec du handshake SSL"
@@ -1007,6 +1019,10 @@ msgstr "Erreur d'initialisation I2C"
msgid "I2SOut not available"
msgstr "I2SOut n'est pas disponible"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "IOs 0, 2 & 4 do not support internal pullup in sleep"
+msgstr ""
+
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
@@ -1024,6 +1040,10 @@ msgstr ""
msgid "Incorrect buffer size"
msgstr "Taille de tampon incorrecte"
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "Initialization failed due to lack of memory"
+msgstr "L'initialisation a échoué par manque de mémoire"
+
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
msgid "Input taking too long"
msgstr "L'entrée prend trop de temps"
@@ -1104,6 +1124,7 @@ msgid "Invalid byteorder string"
msgstr "Chaîne d'octets non valide"
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
msgid "Invalid capture period. Valid range: 1 - 500"
msgstr "Période de capture invalide. Gamme valide : 1 à 500"
@@ -1280,6 +1301,10 @@ msgstr "Doit fournir une broche MISO ou MOSI"
msgid "Must use a multiple of 6 rgb pins, not %d"
msgstr "Doit utiliser un multiple de 6 broches RVB, pas %d"
+#: ports/esp32s2/common-hal/nvm/ByteArray.c
+msgid "NVS Error"
+msgstr ""
+
#: py/parse.c
msgid "Name too long"
msgstr "Nom trop long"
@@ -1298,6 +1323,11 @@ msgstr "Pas de DAC sur la puce"
msgid "No DMA channel found"
msgstr "Aucun canal DMA trouvé"
+#: shared-module/busdevice/I2CDevice.c
+#, c-format
+msgid "No I2C device at address: %x"
+msgstr ""
+
#: ports/esp32s2/common-hal/busio/SPI.c ports/mimxrt10xx/common-hal/busio/SPI.c
#: ports/stm/common-hal/busio/SPI.c
msgid "No MISO Pin"
@@ -1432,14 +1462,14 @@ msgstr "Parité impaire non supportée"
msgid "Only 8 or 16 bit mono with "
msgstr "Uniquement 8 ou 16 bit mono avec "
-#: ports/esp32s2/common-hal/socketpool/SocketPool.c
-msgid "Only IPv4 SOCK_STREAM sockets supported"
-msgstr "Seules les sockets IPv4 SOCK_STREAM sont prises en charge"
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr "Seules les adresses IPv4 sont prises en charge"
+#: ports/esp32s2/common-hal/socketpool/SocketPool.c
+msgid "Only IPv4 sockets supported"
+msgstr ""
+
#: shared-module/displayio/OnDiskBitmap.c
#, c-format
msgid ""
@@ -1457,6 +1487,10 @@ msgstr ""
"Prise en charge uniquement des monochromes, 4 bpp ou 8 bpp indexés et 16 bpp "
"ou plus : %d bpp fournis"
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "Only one alarm.time alarm can be set."
+msgstr ""
+
#: shared-module/displayio/ColorConverter.c
msgid "Only one color can be transparent at a time"
msgstr "Une seule couleur peut être transparente à la fois"
@@ -1518,6 +1552,10 @@ msgstr "La broche doit prendre en charge les interruptions matérielles"
msgid "Pin number already reserved by EXTI"
msgstr "Numéro de broche déjà réservé par EXTI"
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "PinAlarm not yet implemented"
+msgstr ""
+
#: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format
msgid ""
@@ -1586,7 +1624,7 @@ msgstr "Inversion RS485 spécifiée lorsqu'elle n'est pas en mode RS485"
msgid "RTC calibration is not supported on this board"
msgstr "étalonnage de la RTC non supportée sur cette carte"
-#: shared-bindings/time/__init__.c
+#: shared-bindings/alarm/time/TimeAlarm.c shared-bindings/time/__init__.c
msgid "RTC is not supported on this board"
msgstr "RTC non supportée sur cette carte"
@@ -1732,6 +1770,10 @@ msgstr "Il manque une méthode readinto() ou write() au flux."
msgid "Supply at least one UART pin"
msgstr "Fournissez au moins une broche UART"
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Supply one of monotonic_time or epoch_time"
+msgstr ""
+
#: shared-bindings/gnss/GNSS.c
msgid "System entry must be gnss.SatelliteSystem"
msgstr "L'entrée du système doit être gnss.SatelliteSystem"
@@ -1804,6 +1846,10 @@ msgstr "Valeur de tuile hors limites"
msgid "Tile width must exactly divide bitmap width"
msgstr "La largeur de la tuile doit diviser exactement la largeur de l'image"
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Time is in the past."
+msgstr ""
+
#: ports/nrf/common-hal/_bleio/Adapter.c
#, c-format
msgid "Timeout is too long: Maximum timeout length is %d seconds"
@@ -2009,7 +2055,7 @@ msgstr "La lecture de la tension a expiré"
msgid "WARNING: Your code filename has two extensions\n"
msgstr "ATTENTION : le nom de fichier de votre code a deux extensions\n"
-#: shared-bindings/watchdog/WatchDogTimer.c
+#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "WatchDogTimer cannot be deinitialized once mode is set to RESET"
msgstr ""
"WatchDogTimer ne peut pas être désinitialisé une fois que le mode est réglé "
@@ -2097,10 +2143,6 @@ msgstr "adresse hors limites"
msgid "addresses is empty"
msgstr "adresses vides"
-#: extmod/ulab/code/vector/vectorise.c
-msgid "arctan2 is implemented for scalars and ndarrays only"
-msgstr "arctan2 est implémenté uniquement pour les scalaires et les ndarrays"
-
#: py/modbuiltins.c
msgid "arg is an empty sequence"
msgstr "l'argument est une séquence vide"
@@ -2109,6 +2151,10 @@ msgstr "l'argument est une séquence vide"
msgid "argsort argument must be an ndarray"
msgstr "L'argument argsort doit être un ndarray"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "argsort is not implemented for flattened arrays"
+msgstr "argsort n'est pas mis en œuvre pour les tableaux aplatis"
+
#: py/runtime.c
msgid "argument has wrong type"
msgstr "l'argument est d'un mauvais type"
@@ -2126,15 +2172,23 @@ msgstr "argument num/types ne correspond pas"
msgid "argument should be a '%q' not a '%q'"
msgstr "l'argument devrait être un(e) '%q', pas '%q'"
-#: extmod/ulab/code/linalg/linalg.c
+#: extmod/ulab/code/linalg/linalg.c extmod/ulab/code/numerical/numerical.c
msgid "arguments must be ndarrays"
msgstr "les arguments doivent être des ndarrays"
+#: extmod/ulab/code/ndarray.c
+msgid "array and index length must be equal"
+msgstr "la longueur du tableau et de l'index doit être égale"
+
#: py/objarray.c shared-bindings/nvm/ByteArray.c
msgid "array/bytes required on right side"
msgstr "tableau/octets requis à droite"
#: extmod/ulab/code/numerical/numerical.c
+msgid "attempt to get (arg)min/(arg)max of empty sequence"
+msgstr "tentative d’obtenir (arg)min/(arg)max d'une séquence vide"
+
+#: extmod/ulab/code/numerical/numerical.c
msgid "attempt to get argmin/argmax of an empty sequence"
msgstr "tenter d'obtenir argmin / argmax d'une séquence vide"
@@ -2143,16 +2197,16 @@ msgid "attributes not supported yet"
msgstr "attribut pas encore supporté"
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, None, or 1"
-msgstr "l'axe doit être -1, 0, None ou 1"
+msgid "axis is out of bounds"
+msgstr "axis est hors limites"
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, or 1"
-msgstr "l'axe doit être -1, 0 ou 1"
+msgid "axis must be None, or an integer"
+msgstr "axis doit être None ou un entier"
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be None, 0, or 1"
-msgstr "l'axe doit être None, 0 ou 1"
+msgid "axis too long"
+msgstr "axis trop long"
#: py/builtinevex.c
msgid "bad compile mode"
@@ -2364,6 +2418,10 @@ msgstr ""
"impossible de passer d'une spécification manuelle des champs à une "
"énumération auto"
+#: extmod/ulab/code/ndarray_operators.c
+msgid "cannot cast output with casting rule"
+msgstr ""
+
#: py/objtype.c
msgid "cannot create '%q' instances"
msgstr "ne peut pas créer une instance de '%q'"
@@ -2380,11 +2438,6 @@ msgstr "ne peut pas importer le nom %q"
msgid "cannot perform relative import"
msgstr "ne peut pas réaliser un import relatif"
-#: extmod/ulab/code/ndarray.c
-msgid "cannot reshape array (incompatible input/output shape)"
-msgstr ""
-"ne peut pas remodeler le tableau (forme d'entrée / sortie incompatible)"
-
#: py/emitnative.c
msgid "casting"
msgstr "typage"
@@ -2459,10 +2512,6 @@ msgstr "les arguments convolve doivent être des ndarrays"
msgid "convolve arguments must not be empty"
msgstr "les arguments convolve ne doivent pas être vides"
-#: extmod/ulab/code/ndarray.c
-msgid "could not broadast input array from shape"
-msgstr "n'a pas pu diffuser le tableau d'entrée à partir de la forme"
-
#: extmod/ulab/code/poly/poly.c
msgid "could not invert Vandermonde matrix"
msgstr "n'a pas pu inverser la matrice Vandermonde"
@@ -2471,6 +2520,10 @@ msgstr "n'a pas pu inverser la matrice Vandermonde"
msgid "couldn't determine SD card version"
msgstr "impossible de déterminer la version de la carte SD"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "cross is defined for 1D arrays of length 3"
+msgstr "cross est défini pour les tableaux 1D de longueur 3"
+
#: extmod/ulab/code/approx/approx.c
msgid "data must be iterable"
msgstr "les données doivent être les objets iterables"
@@ -2479,10 +2532,6 @@ msgstr "les données doivent être les objets iterables"
msgid "data must be of equal length"
msgstr "les données doivent être de longueur égale"
-#: extmod/ulab/code/numerical/numerical.c
-msgid "ddof must be smaller than length of data set"
-msgstr "ddof doit être inférieur à la longueur de l'ensemble de données"
-
#: py/parsenum.c
msgid "decimal numbers not supported"
msgstr "nombres décimaux non supportés"
@@ -2514,6 +2563,10 @@ msgstr "la séquence de mise à jour de dict a une mauvaise longueur"
msgid "diff argument must be an ndarray"
msgstr "l'argument diff doit être un ndarray"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "differentiation order out of range"
+msgstr "differentiation order hors plage"
+
#: py/modmath.c py/objfloat.c py/objint_longlong.c py/objint_mpz.c py/runtime.c
#: shared-bindings/math/__init__.c
msgid "division by zero"
@@ -2543,6 +2596,10 @@ msgstr "fin de format en cherchant une spécification de conversion"
msgid "end_x should be an int"
msgstr "end_x doit être un entier 'int'"
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "epoch_time not supported on this board"
+msgstr ""
+
#: ports/nrf/common-hal/busio/UART.c
#, c-format
msgid "error = 0x%08lX"
@@ -2631,6 +2688,10 @@ msgstr "le premier argument doit être un appelable"
msgid "first argument must be a function"
msgstr "le premier argument doit être une fonction"
+#: extmod/ulab/code/ulab_create.c
+msgid "first argument must be a tuple of ndarrays"
+msgstr "le premier argument doit être un tuple de ndarrays"
+
#: extmod/ulab/code/ndarray.c
msgid "first argument must be an iterable"
msgstr "le premier argument doit être un itérable"
@@ -2684,10 +2745,9 @@ msgstr "la fonction a reçu plusieurs valeurs pour l'argument '%q'"
msgid "function has the same sign at the ends of interval"
msgstr "la fonction a le même signe aux extrémités de l’intervalle"
-#: extmod/ulab/code/compare/compare.c
-msgid "function is implemented for scalars and ndarrays only"
-msgstr ""
-"la fonction est implémentée pour les scalaires et les ndarrays uniquement"
+#: extmod/ulab/code/ndarray.c
+msgid "function is defined for ndarrays only"
+msgstr "La fonction n'est définie que pour les ndarrays"
#: py/argcheck.c
#, c-format
@@ -2756,6 +2816,7 @@ msgstr "espacement incorrect"
msgid "index is out of bounds"
msgstr "l'index est hors limites"
+#: extmod/ulab/code/numerical/numerical.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c py/obj.c
msgid "index out of range"
msgstr "index hors gamme"
@@ -2781,6 +2842,10 @@ msgstr "la longueur de initial_value est incorrecte"
msgid "inline assembler must be a function"
msgstr "l'assembleur doit être une fonction"
+#: extmod/ulab/code/ndarray.c
+msgid "input and output shapes are not compatible"
+msgstr "les formes d'entrée et de sortie ne sont pas compatibles"
+
#: extmod/ulab/code/ulab_create.c
msgid "input argument must be an integer or a 2-tuple"
msgstr "l'argument d'entrée doit être un entier ou un tuple 2"
@@ -2789,6 +2854,10 @@ msgstr "l'argument d'entrée doit être un entier ou un tuple 2"
msgid "input array length must be power of 2"
msgstr "la longueur du tableau d'entrée doit être une puissance de 2"
+#: extmod/ulab/code/ulab_create.c
+msgid "input arrays are not compatible"
+msgstr "les tableaux d'entrée ne sont pas compatibles"
+
#: extmod/ulab/code/poly/poly.c
msgid "input data must be an iterable"
msgstr "les données d'entrée doivent être un itérable"
@@ -2801,6 +2870,22 @@ msgstr "la matrice d'entrée est asymétrique"
msgid "input matrix is singular"
msgstr "la matrice d'entrée est singulière"
+#: extmod/ulab/code/user/user.c
+msgid "input must be a dense ndarray"
+msgstr "l'entrée doit être un tableau dense"
+
+#: extmod/ulab/code/ulab_create.c
+msgid "input must be a tensor of rank 2"
+msgstr "l'entrée doit être un tenseur de rang 2"
+
+#: extmod/ulab/code/ulab_create.c extmod/ulab/code/user/user.c
+msgid "input must be an ndarray"
+msgstr ""
+
+#: extmod/ulab/code/filter/filter.c
+msgid "input must be one-dimensional"
+msgstr ""
+
#: extmod/ulab/code/linalg/linalg.c
msgid "input must be square matrix"
msgstr "l'entrée doit être une matrice carrée"
@@ -2813,6 +2898,10 @@ msgstr "l'entrée doit être tuple, list, range ou ndarray"
msgid "input vectors must be of equal length"
msgstr "les vecteurs d'entrée doivent être de longueur égale"
+#: extmod/ulab/code/poly/poly.c
+msgid "inputs are not iterable"
+msgstr ""
+
#: py/parsenum.c
msgid "int() arg 2 must be >= 2 and <= 36"
msgstr "l'argument 2 de int() doit être >=2 et <=36"
@@ -2883,6 +2972,10 @@ msgstr "syntaxe invalide pour un entier de base %d"
msgid "invalid syntax for number"
msgstr "syntaxe invalide pour un nombre"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "io must be rtc io"
+msgstr ""
+
#: py/objtype.c
msgid "issubclass() arg 1 must be a class"
msgstr "l'argument 1 de issubclass() doit être une classe"
@@ -2953,7 +3046,7 @@ msgstr "entiers longs non supportés dans cette build"
#: ports/esp32s2/common-hal/canio/CAN.c
msgid "loopback + silent mode not supported by peripheral"
-msgstr ""
+msgstr "loopback + silent mode non pris en charge par le périphérique"
#: py/parse.c
msgid "malformed f-string"
@@ -2985,17 +3078,21 @@ msgstr "max_length doit être 0-%d lorsque fixed_length est %s"
msgid "max_length must be > 0"
msgstr "max_length doit être > 0"
+#: extmod/ulab/code/ndarray.c
+msgid "maximum number of dimensions is 4"
+msgstr ""
+
#: py/runtime.c
msgid "maximum recursion depth exceeded"
msgstr "profondeur maximale de récursivité dépassée"
#: extmod/ulab/code/approx/approx.c
msgid "maxiter must be > 0"
-msgstr ""
+msgstr "maxiter doit être > 0"
#: extmod/ulab/code/approx/approx.c
msgid "maxiter should be > 0"
-msgstr ""
+msgstr "maxiter devrait être > 0"
#: py/runtime.c
#, c-format
@@ -3034,10 +3131,6 @@ msgstr "doit lever un objet"
msgid "must use keyword argument for key function"
msgstr "doit utiliser un argument nommé pour une fonction key"
-#: extmod/ulab/code/numerical/numerical.c
-msgid "n must be between 0, and 9"
-msgstr "n doit être compris entre 0 et 9"
-
#: py/runtime.c
msgid "name '%q' is not defined"
msgstr "nom '%q' non défini"
@@ -3121,6 +3214,10 @@ msgstr "argument non-nommé après */**"
msgid "non-keyword arg after keyword arg"
msgstr "argument non-nommé après argument nommé"
+#: extmod/ulab/code/linalg/linalg.c
+msgid "norm is defined for 1D and 2D arrays"
+msgstr ""
+
#: shared-bindings/_bleio/UUID.c
msgid "not a 128-bit UUID"
msgstr "n'est pas un UUID 128 bits"
@@ -3134,10 +3231,6 @@ msgstr ""
msgid "not enough arguments for format string"
msgstr "pas assez d'arguments pour la chaîne de format"
-#: extmod/ulab/code/poly/poly.c
-msgid "number of arguments must be 2, or 3"
-msgstr "le nombre d'arguments doit être 2 ou 3"
-
#: extmod/ulab/code/ulab_create.c
msgid "number of points must be at least 2"
msgstr "le nombre de points doit être d'au moins 2"
@@ -3190,6 +3283,10 @@ msgstr "un objet avec un protocole de tampon est nécessaire"
msgid "odd-length string"
msgstr "chaîne de longueur impaire"
+#: extmod/ulab/code/ulab_create.c
+msgid "offset is too large"
+msgstr ""
+
#: py/objstr.c py/objstrunicode.c
msgid "offset out of bounds"
msgstr "décalage hors limites"
@@ -3212,6 +3309,14 @@ msgstr "seules les tranches avec 'step=1' (cad None) sont supportées"
msgid "operands could not be broadcast together"
msgstr "les opérandes ne pouvaient pas être diffusés ensemble"
+#: extmod/ulab/code/ndarray.c
+msgid "operation is implemented for 1D Boolean arrays only"
+msgstr ""
+
+#: extmod/ulab/code/numerical/numerical.c
+msgid "operation is not implemented for flattened array"
+msgstr ""
+
#: extmod/ulab/code/numerical/numerical.c
msgid "operation is not implemented on ndarrays"
msgstr "l'opération n'est pas implémentée sur les ndarrays"
@@ -3305,6 +3410,7 @@ msgstr "le 3e argument de pow() ne peut être 0"
msgid "pow() with 3 arguments requires integers"
msgstr "pow() avec 3 arguments nécessite des entiers"
+#: ports/esp32s2/boards/adafruit_magtag_2.9_grayscale/mpconfigboard.h
#: ports/esp32s2/boards/adafruit_metro_esp32s2/mpconfigboard.h
#: ports/esp32s2/boards/electroniccats_bastwifi/mpconfigboard.h
#: ports/esp32s2/boards/espressif_kaluga_1/mpconfigboard.h
@@ -3348,6 +3454,10 @@ msgstr "import relatif"
msgid "requested length %d but object has length %d"
msgstr "la longueur requise est %d mais l'objet est long de %d"
+#: extmod/ulab/code/ndarray_operators.c
+msgid "results cannot be cast to specified type"
+msgstr ""
+
#: py/compile.c
msgid "return annotation must be an identifier"
msgstr "l'annotation de return doit être un identifiant"
@@ -3366,9 +3476,9 @@ msgstr "rgb_pins[%d] duplique une autre affectation de broches"
msgid "rgb_pins[%d] is not on the same port as clock"
msgstr "rgb_pins[%d] n'est pas sur le même port que l'horloge"
-#: extmod/ulab/code/ndarray.c
-msgid "right hand side must be an ndarray, or a scalar"
-msgstr "le côté droit doit être un ndarray ou un scalaire"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "roll argument must be an ndarray"
+msgstr ""
#: py/objstr.c
msgid "rsplit(None,n)"
@@ -3395,8 +3505,8 @@ msgid "script compilation not supported"
msgstr "compilation de script non supportée"
#: extmod/ulab/code/ndarray.c
-msgid "shape must be a 2-tuple"
-msgstr "la forme doit être un tuple 2"
+msgid "shape must be a tuple"
+msgstr ""
#: py/objstr.c
msgid "sign not allowed in string format specifier"
@@ -3438,10 +3548,6 @@ msgstr "redémarrage logiciel\n"
msgid "sort argument must be an ndarray"
msgstr "l'argument de «sort» doit être un ndarray"
-#: extmod/ulab/code/numerical/numerical.c
-msgid "sorted axis can't be longer than 65535"
-msgstr ""
-
#: extmod/ulab/code/filter/filter.c
msgid "sos array must be of shape (n_section, 6)"
msgstr "le tableau sos doit être de forme (n_section, 6)"
@@ -3523,6 +3629,7 @@ msgstr "le seuil doit être dans la gamme 0-65536"
msgid "time.struct_time() takes a 9-sequence"
msgstr "time.struct_time() prend une séquence de longueur 9"
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "timeout duration exceeded the maximum supported value"
msgstr "le délai d'expiration a dépassé la valeur maximale prise en charge"
@@ -3547,6 +3654,10 @@ msgstr "Délai d’expiration dépassé en attendant une carte v2"
msgid "timestamp out of range for platform time_t"
msgstr "'timestamp' hors bornes pour 'time_t' de la plateforme"
+#: extmod/ulab/code/ndarray.c
+msgid "tobytes can be invoked for dense arrays only"
+msgstr ""
+
#: shared-module/struct/__init__.c
msgid "too many arguments provided with the given format"
msgstr "trop d'arguments fournis avec ce format"
@@ -3564,6 +3675,10 @@ msgstr "trop de valeur à dégrouper (%d attendues)"
msgid "trapz is defined for 1D arrays of equal length"
msgstr "trapz n'est défini que pour des tableaux 1D de longueur égale"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "trigger level must be 0 or 1"
+msgstr ""
+
#: extmod/ulab/code/linalg/linalg.c
msgid "tuple index out of range"
msgstr "index du tuple hors gamme"
@@ -3575,12 +3690,12 @@ msgstr "tuple/liste a une mauvaise longueur"
#: ports/esp32s2/common-hal/canio/CAN.c
#, c-format
msgid "twai_driver_install returned esp-idf error #%d"
-msgstr ""
+msgstr "twai_driver_install a renvoyé l'erreur esp-idf #%d"
#: ports/esp32s2/common-hal/canio/CAN.c
#, c-format
msgid "twai_start returned esp-idf error #%d"
-msgstr ""
+msgstr "twai_start a renvoyé l'erreur esp-idf #%d"
#: ports/atmel-samd/common-hal/busio/UART.c
#: ports/esp32s2/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
@@ -3706,6 +3821,14 @@ msgstr "'value_count' doit être > 0"
msgid "vectors must have same lengths"
msgstr "les vecteurs doivent avoir la même longueur"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "wakeup conflict"
+msgstr ""
+
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "watchdog not initialized"
+msgstr "chien de garde non initialisé"
+
#: shared-bindings/watchdog/WatchDogTimer.c
msgid "watchdog timeout must be greater than 0"
msgstr "watchdog timeout doit être supérieur à 0"
@@ -3718,13 +3841,13 @@ msgstr "width doit être plus grand que zero"
msgid "window must be <= interval"
msgstr "la fenêtre doit être <= intervalle"
-#: extmod/ulab/code/linalg/linalg.c
-msgid "wrong argument type"
-msgstr "type d'argument incorrect"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "wrong axis index"
+msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "wrong index type"
-msgstr "type d'index incorrect"
+#: extmod/ulab/code/ulab_create.c
+msgid "wrong axis specified"
+msgstr ""
#: extmod/ulab/code/vector/vectorise.c
msgid "wrong input type"
@@ -3774,6 +3897,57 @@ msgstr "zi doit être de type float"
msgid "zi must be of shape (n_section, 2)"
msgstr "zi doit être de forme (n_section, 2)"
+#~ msgid "Only IPv4 SOCK_STREAM sockets supported"
+#~ msgstr "Seules les sockets IPv4 SOCK_STREAM sont prises en charge"
+
+#~ msgid "arctan2 is implemented for scalars and ndarrays only"
+#~ msgstr ""
+#~ "arctan2 est implémenté uniquement pour les scalaires et les ndarrays"
+
+#~ msgid "axis must be -1, 0, None, or 1"
+#~ msgstr "l'axe doit être -1, 0, None ou 1"
+
+#~ msgid "axis must be -1, 0, or 1"
+#~ msgstr "l'axe doit être -1, 0 ou 1"
+
+#~ msgid "axis must be None, 0, or 1"
+#~ msgstr "l'axe doit être None, 0 ou 1"
+
+#~ msgid "cannot reshape array (incompatible input/output shape)"
+#~ msgstr ""
+#~ "ne peut pas remodeler le tableau (forme d'entrée / sortie incompatible)"
+
+#~ msgid "could not broadast input array from shape"
+#~ msgstr "n'a pas pu diffuser le tableau d'entrée à partir de la forme"
+
+#~ msgid "ddof must be smaller than length of data set"
+#~ msgstr "ddof doit être inférieur à la longueur de l'ensemble de données"
+
+#~ msgid "function is implemented for scalars and ndarrays only"
+#~ msgstr ""
+#~ "la fonction est implémentée pour les scalaires et les ndarrays uniquement"
+
+#~ msgid "n must be between 0, and 9"
+#~ msgstr "n doit être compris entre 0 et 9"
+
+#~ msgid "number of arguments must be 2, or 3"
+#~ msgstr "le nombre d'arguments doit être 2 ou 3"
+
+#~ msgid "right hand side must be an ndarray, or a scalar"
+#~ msgstr "le côté droit doit être un ndarray ou un scalaire"
+
+#~ msgid "shape must be a 2-tuple"
+#~ msgstr "la forme doit être un tuple 2"
+
+#~ msgid "sorted axis can't be longer than 65535"
+#~ msgstr "sorted axis ne peut pas dépasser 65535"
+
+#~ msgid "wrong argument type"
+#~ msgstr "type d'argument incorrect"
+
+#~ msgid "wrong index type"
+#~ msgstr "type d'index incorrect"
+
#~ msgid "Must provide SCK pin"
#~ msgstr "Vous devez fournir un code PIN SCK"
diff --git a/locale/hi.po b/locale/hi.po
index aea2b3f0c..7361e41e6 100644
--- a/locale/hi.po
+++ b/locale/hi.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-04 21:18+0530\n"
+"POT-Creation-Date: 2020-11-27 23:57-0500\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
@@ -295,7 +295,9 @@ msgstr ""
msgid "All I2C peripherals are in use"
msgstr ""
-#: ports/esp32s2/peripherals/pcnt_handler.c
+#: ports/esp32s2/common-hal/countio/Counter.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/rotaryio/IncrementalEncoder.c
msgid "All PCNT units in use"
msgstr ""
@@ -331,6 +333,7 @@ msgstr ""
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
#: ports/cxd56/common-hal/pulseio/PulseOut.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
#: ports/esp32s2/common-hal/neopixel_write/__init__.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c
#: ports/esp32s2/common-hal/pulseio/PulseOut.c
@@ -494,7 +497,8 @@ msgstr ""
msgid "Buffer must be a multiple of 512 bytes"
msgstr ""
-#: shared-bindings/bitbangio/I2C.c shared-bindings/busio/I2C.c
+#: shared-bindings/bitbangio/I2C.c shared-bindings/busdevice/I2CDevice.c
+#: shared-bindings/busio/I2C.c
msgid "Buffer must be at least length 1"
msgstr ""
@@ -840,6 +844,10 @@ msgstr ""
msgid "Expected an Address"
msgstr ""
+#: shared-bindings/alarm/__init__.c
+msgid "Expected an alarm"
+msgstr ""
+
#: shared-module/_pixelbuf/PixelBuf.c
#, c-format
msgid "Expected tuple of length %d, got %d"
@@ -853,6 +861,10 @@ msgstr ""
msgid "FFT is defined for ndarrays only"
msgstr ""
+#: extmod/ulab/code/fft/fft.c
+msgid "FFT is implemented for linear arrays only"
+msgstr ""
+
#: ports/esp32s2/common-hal/socketpool/Socket.c
msgid "Failed SSL handshake"
msgstr ""
@@ -981,6 +993,10 @@ msgstr ""
msgid "I2SOut not available"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "IOs 0, 2 & 4 do not support internal pullup in sleep"
+msgstr ""
+
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
@@ -996,6 +1012,10 @@ msgstr ""
msgid "Incorrect buffer size"
msgstr ""
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "Initialization failed due to lack of memory"
+msgstr ""
+
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
msgid "Input taking too long"
msgstr ""
@@ -1076,6 +1096,7 @@ msgid "Invalid byteorder string"
msgstr ""
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
msgid "Invalid capture period. Valid range: 1 - 500"
msgstr ""
@@ -1252,6 +1273,10 @@ msgstr ""
msgid "Must use a multiple of 6 rgb pins, not %d"
msgstr ""
+#: ports/esp32s2/common-hal/nvm/ByteArray.c
+msgid "NVS Error"
+msgstr ""
+
#: py/parse.c
msgid "Name too long"
msgstr ""
@@ -1270,6 +1295,11 @@ msgstr ""
msgid "No DMA channel found"
msgstr ""
+#: shared-module/busdevice/I2CDevice.c
+#, c-format
+msgid "No I2C device at address: %x"
+msgstr ""
+
#: ports/esp32s2/common-hal/busio/SPI.c ports/mimxrt10xx/common-hal/busio/SPI.c
#: ports/stm/common-hal/busio/SPI.c
msgid "No MISO Pin"
@@ -1402,14 +1432,14 @@ msgstr ""
msgid "Only 8 or 16 bit mono with "
msgstr ""
-#: ports/esp32s2/common-hal/socketpool/SocketPool.c
-msgid "Only IPv4 SOCK_STREAM sockets supported"
-msgstr ""
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr ""
+#: ports/esp32s2/common-hal/socketpool/SocketPool.c
+msgid "Only IPv4 sockets supported"
+msgstr ""
+
#: shared-module/displayio/OnDiskBitmap.c
#, c-format
msgid ""
@@ -1423,6 +1453,10 @@ msgid ""
"%d bpp given"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "Only one alarm.time alarm can be set."
+msgstr ""
+
#: shared-module/displayio/ColorConverter.c
msgid "Only one color can be transparent at a time"
msgstr ""
@@ -1480,6 +1514,10 @@ msgstr ""
msgid "Pin number already reserved by EXTI"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "PinAlarm not yet implemented"
+msgstr ""
+
#: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format
msgid ""
@@ -1541,7 +1579,7 @@ msgstr ""
msgid "RTC calibration is not supported on this board"
msgstr ""
-#: shared-bindings/time/__init__.c
+#: shared-bindings/alarm/time/TimeAlarm.c shared-bindings/time/__init__.c
msgid "RTC is not supported on this board"
msgstr ""
@@ -1687,6 +1725,10 @@ msgstr ""
msgid "Supply at least one UART pin"
msgstr ""
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Supply one of monotonic_time or epoch_time"
+msgstr ""
+
#: shared-bindings/gnss/GNSS.c
msgid "System entry must be gnss.SatelliteSystem"
msgstr ""
@@ -1750,6 +1792,10 @@ msgstr ""
msgid "Tile width must exactly divide bitmap width"
msgstr ""
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Time is in the past."
+msgstr ""
+
#: ports/nrf/common-hal/_bleio/Adapter.c
#, c-format
msgid "Timeout is too long: Maximum timeout length is %d seconds"
@@ -1945,7 +1991,7 @@ msgstr ""
msgid "WARNING: Your code filename has two extensions\n"
msgstr ""
-#: shared-bindings/watchdog/WatchDogTimer.c
+#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "WatchDogTimer cannot be deinitialized once mode is set to RESET"
msgstr ""
@@ -2024,10 +2070,6 @@ msgstr ""
msgid "addresses is empty"
msgstr ""
-#: extmod/ulab/code/vector/vectorise.c
-msgid "arctan2 is implemented for scalars and ndarrays only"
-msgstr ""
-
#: py/modbuiltins.c
msgid "arg is an empty sequence"
msgstr ""
@@ -2036,6 +2078,10 @@ msgstr ""
msgid "argsort argument must be an ndarray"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
+msgid "argsort is not implemented for flattened arrays"
+msgstr ""
+
#: py/runtime.c
msgid "argument has wrong type"
msgstr ""
@@ -2053,15 +2099,23 @@ msgstr ""
msgid "argument should be a '%q' not a '%q'"
msgstr ""
-#: extmod/ulab/code/linalg/linalg.c
+#: extmod/ulab/code/linalg/linalg.c extmod/ulab/code/numerical/numerical.c
msgid "arguments must be ndarrays"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "array and index length must be equal"
+msgstr ""
+
#: py/objarray.c shared-bindings/nvm/ByteArray.c
msgid "array/bytes required on right side"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
+msgid "attempt to get (arg)min/(arg)max of empty sequence"
+msgstr ""
+
+#: extmod/ulab/code/numerical/numerical.c
msgid "attempt to get argmin/argmax of an empty sequence"
msgstr ""
@@ -2070,15 +2124,15 @@ msgid "attributes not supported yet"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, None, or 1"
+msgid "axis is out of bounds"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, or 1"
+msgid "axis must be None, or an integer"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be None, 0, or 1"
+msgid "axis too long"
msgstr ""
#: py/builtinevex.c
@@ -2282,6 +2336,10 @@ msgid ""
"can't switch from manual field specification to automatic field numbering"
msgstr ""
+#: extmod/ulab/code/ndarray_operators.c
+msgid "cannot cast output with casting rule"
+msgstr ""
+
#: py/objtype.c
msgid "cannot create '%q' instances"
msgstr ""
@@ -2298,10 +2356,6 @@ msgstr ""
msgid "cannot perform relative import"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "cannot reshape array (incompatible input/output shape)"
-msgstr ""
-
#: py/emitnative.c
msgid "casting"
msgstr ""
@@ -2374,10 +2428,6 @@ msgstr ""
msgid "convolve arguments must not be empty"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "could not broadast input array from shape"
-msgstr ""
-
#: extmod/ulab/code/poly/poly.c
msgid "could not invert Vandermonde matrix"
msgstr ""
@@ -2386,6 +2436,10 @@ msgstr ""
msgid "couldn't determine SD card version"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
+msgid "cross is defined for 1D arrays of length 3"
+msgstr ""
+
#: extmod/ulab/code/approx/approx.c
msgid "data must be iterable"
msgstr ""
@@ -2394,10 +2448,6 @@ msgstr ""
msgid "data must be of equal length"
msgstr ""
-#: extmod/ulab/code/numerical/numerical.c
-msgid "ddof must be smaller than length of data set"
-msgstr ""
-
#: py/parsenum.c
msgid "decimal numbers not supported"
msgstr ""
@@ -2427,6 +2477,10 @@ msgstr ""
msgid "diff argument must be an ndarray"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
+msgid "differentiation order out of range"
+msgstr ""
+
#: py/modmath.c py/objfloat.c py/objint_longlong.c py/objint_mpz.c py/runtime.c
#: shared-bindings/math/__init__.c
msgid "division by zero"
@@ -2456,6 +2510,10 @@ msgstr ""
msgid "end_x should be an int"
msgstr ""
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "epoch_time not supported on this board"
+msgstr ""
+
#: ports/nrf/common-hal/busio/UART.c
#, c-format
msgid "error = 0x%08lX"
@@ -2542,6 +2600,10 @@ msgstr ""
msgid "first argument must be a function"
msgstr ""
+#: extmod/ulab/code/ulab_create.c
+msgid "first argument must be a tuple of ndarrays"
+msgstr ""
+
#: extmod/ulab/code/ndarray.c
msgid "first argument must be an iterable"
msgstr ""
@@ -2595,8 +2657,8 @@ msgstr ""
msgid "function has the same sign at the ends of interval"
msgstr ""
-#: extmod/ulab/code/compare/compare.c
-msgid "function is implemented for scalars and ndarrays only"
+#: extmod/ulab/code/ndarray.c
+msgid "function is defined for ndarrays only"
msgstr ""
#: py/argcheck.c
@@ -2666,6 +2728,7 @@ msgstr ""
msgid "index is out of bounds"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c py/obj.c
msgid "index out of range"
msgstr ""
@@ -2690,6 +2753,10 @@ msgstr ""
msgid "inline assembler must be a function"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "input and output shapes are not compatible"
+msgstr ""
+
#: extmod/ulab/code/ulab_create.c
msgid "input argument must be an integer or a 2-tuple"
msgstr ""
@@ -2698,6 +2765,10 @@ msgstr ""
msgid "input array length must be power of 2"
msgstr ""
+#: extmod/ulab/code/ulab_create.c
+msgid "input arrays are not compatible"
+msgstr ""
+
#: extmod/ulab/code/poly/poly.c
msgid "input data must be an iterable"
msgstr ""
@@ -2710,6 +2781,22 @@ msgstr ""
msgid "input matrix is singular"
msgstr ""
+#: extmod/ulab/code/user/user.c
+msgid "input must be a dense ndarray"
+msgstr ""
+
+#: extmod/ulab/code/ulab_create.c
+msgid "input must be a tensor of rank 2"
+msgstr ""
+
+#: extmod/ulab/code/ulab_create.c extmod/ulab/code/user/user.c
+msgid "input must be an ndarray"
+msgstr ""
+
+#: extmod/ulab/code/filter/filter.c
+msgid "input must be one-dimensional"
+msgstr ""
+
#: extmod/ulab/code/linalg/linalg.c
msgid "input must be square matrix"
msgstr ""
@@ -2722,6 +2809,10 @@ msgstr ""
msgid "input vectors must be of equal length"
msgstr ""
+#: extmod/ulab/code/poly/poly.c
+msgid "inputs are not iterable"
+msgstr ""
+
#: py/parsenum.c
msgid "int() arg 2 must be >= 2 and <= 36"
msgstr ""
@@ -2792,6 +2883,10 @@ msgstr ""
msgid "invalid syntax for number"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "io must be rtc io"
+msgstr ""
+
#: py/objtype.c
msgid "issubclass() arg 1 must be a class"
msgstr ""
@@ -2890,6 +2985,10 @@ msgstr ""
msgid "max_length must be > 0"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "maximum number of dimensions is 4"
+msgstr ""
+
#: py/runtime.c
msgid "maximum recursion depth exceeded"
msgstr ""
@@ -2939,10 +3038,6 @@ msgstr ""
msgid "must use keyword argument for key function"
msgstr ""
-#: extmod/ulab/code/numerical/numerical.c
-msgid "n must be between 0, and 9"
-msgstr ""
-
#: py/runtime.c
msgid "name '%q' is not defined"
msgstr ""
@@ -3025,6 +3120,10 @@ msgstr ""
msgid "non-keyword arg after keyword arg"
msgstr ""
+#: extmod/ulab/code/linalg/linalg.c
+msgid "norm is defined for 1D and 2D arrays"
+msgstr ""
+
#: shared-bindings/_bleio/UUID.c
msgid "not a 128-bit UUID"
msgstr ""
@@ -3037,10 +3136,6 @@ msgstr ""
msgid "not enough arguments for format string"
msgstr ""
-#: extmod/ulab/code/poly/poly.c
-msgid "number of arguments must be 2, or 3"
-msgstr ""
-
#: extmod/ulab/code/ulab_create.c
msgid "number of points must be at least 2"
msgstr ""
@@ -3093,6 +3188,10 @@ msgstr ""
msgid "odd-length string"
msgstr ""
+#: extmod/ulab/code/ulab_create.c
+msgid "offset is too large"
+msgstr ""
+
#: py/objstr.c py/objstrunicode.c
msgid "offset out of bounds"
msgstr ""
@@ -3115,6 +3214,14 @@ msgstr ""
msgid "operands could not be broadcast together"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "operation is implemented for 1D Boolean arrays only"
+msgstr ""
+
+#: extmod/ulab/code/numerical/numerical.c
+msgid "operation is not implemented for flattened array"
+msgstr ""
+
#: extmod/ulab/code/numerical/numerical.c
msgid "operation is not implemented on ndarrays"
msgstr ""
@@ -3205,6 +3312,7 @@ msgstr ""
msgid "pow() with 3 arguments requires integers"
msgstr ""
+#: ports/esp32s2/boards/adafruit_magtag_2.9_grayscale/mpconfigboard.h
#: ports/esp32s2/boards/adafruit_metro_esp32s2/mpconfigboard.h
#: ports/esp32s2/boards/electroniccats_bastwifi/mpconfigboard.h
#: ports/esp32s2/boards/espressif_kaluga_1/mpconfigboard.h
@@ -3248,6 +3356,10 @@ msgstr ""
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 ""
+
#: py/compile.c
msgid "return annotation must be an identifier"
msgstr ""
@@ -3266,8 +3378,8 @@ msgstr ""
msgid "rgb_pins[%d] is not on the same port as clock"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "right hand side must be an ndarray, or a scalar"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "roll argument must be an ndarray"
msgstr ""
#: py/objstr.c
@@ -3293,7 +3405,7 @@ msgid "script compilation not supported"
msgstr ""
#: extmod/ulab/code/ndarray.c
-msgid "shape must be a 2-tuple"
+msgid "shape must be a tuple"
msgstr ""
#: py/objstr.c
@@ -3336,10 +3448,6 @@ msgstr ""
msgid "sort argument must be an ndarray"
msgstr ""
-#: extmod/ulab/code/numerical/numerical.c
-msgid "sorted axis can't be longer than 65535"
-msgstr ""
-
#: extmod/ulab/code/filter/filter.c
msgid "sos array must be of shape (n_section, 6)"
msgstr ""
@@ -3420,6 +3528,7 @@ msgstr ""
msgid "time.struct_time() takes a 9-sequence"
msgstr ""
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "timeout duration exceeded the maximum supported value"
msgstr ""
@@ -3444,6 +3553,10 @@ msgstr ""
msgid "timestamp out of range for platform time_t"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "tobytes can be invoked for dense arrays only"
+msgstr ""
+
#: shared-module/struct/__init__.c
msgid "too many arguments provided with the given format"
msgstr ""
@@ -3461,6 +3574,10 @@ msgstr ""
msgid "trapz is defined for 1D arrays of equal length"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "trigger level must be 0 or 1"
+msgstr ""
+
#: extmod/ulab/code/linalg/linalg.c
msgid "tuple index out of range"
msgstr ""
@@ -3603,6 +3720,14 @@ msgstr ""
msgid "vectors must have same lengths"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "wakeup conflict"
+msgstr ""
+
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "watchdog not initialized"
+msgstr ""
+
#: shared-bindings/watchdog/WatchDogTimer.c
msgid "watchdog timeout must be greater than 0"
msgstr ""
@@ -3615,12 +3740,12 @@ msgstr ""
msgid "window must be <= interval"
msgstr ""
-#: extmod/ulab/code/linalg/linalg.c
-msgid "wrong argument type"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "wrong axis index"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "wrong index type"
+#: extmod/ulab/code/ulab_create.c
+msgid "wrong axis specified"
msgstr ""
#: extmod/ulab/code/vector/vectorise.c
diff --git a/locale/it_IT.po b/locale/it_IT.po
index 603cf9fd0..4966002d2 100644
--- a/locale/it_IT.po
+++ b/locale/it_IT.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-04 21:18+0530\n"
+"POT-Creation-Date: 2020-11-27 23:57-0500\n"
"PO-Revision-Date: 2018-10-02 16:27+0200\n"
"Last-Translator: Enrico Paganin <enrico.paganin@mail.com>\n"
"Language-Team: \n"
@@ -296,7 +296,9 @@ msgstr ""
msgid "All I2C peripherals are in use"
msgstr "Tutte le periferiche I2C sono in uso"
-#: ports/esp32s2/peripherals/pcnt_handler.c
+#: ports/esp32s2/common-hal/countio/Counter.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/rotaryio/IncrementalEncoder.c
msgid "All PCNT units in use"
msgstr ""
@@ -333,6 +335,7 @@ msgstr "Tutti i timer per questo pin sono in uso"
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
#: ports/cxd56/common-hal/pulseio/PulseOut.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
#: ports/esp32s2/common-hal/neopixel_write/__init__.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c
#: ports/esp32s2/common-hal/pulseio/PulseOut.c
@@ -499,7 +502,8 @@ msgstr ""
msgid "Buffer must be a multiple of 512 bytes"
msgstr ""
-#: shared-bindings/bitbangio/I2C.c shared-bindings/busio/I2C.c
+#: shared-bindings/bitbangio/I2C.c shared-bindings/busdevice/I2CDevice.c
+#: shared-bindings/busio/I2C.c
msgid "Buffer must be at least length 1"
msgstr "Il buffer deve essere lungo almeno 1"
@@ -853,6 +857,10 @@ msgstr "Atteso un %q"
msgid "Expected an Address"
msgstr ""
+#: shared-bindings/alarm/__init__.c
+msgid "Expected an alarm"
+msgstr ""
+
#: shared-module/_pixelbuf/PixelBuf.c
#, c-format
msgid "Expected tuple of length %d, got %d"
@@ -866,6 +874,10 @@ msgstr ""
msgid "FFT is defined for ndarrays only"
msgstr ""
+#: extmod/ulab/code/fft/fft.c
+msgid "FFT is implemented for linear arrays only"
+msgstr ""
+
#: ports/esp32s2/common-hal/socketpool/Socket.c
msgid "Failed SSL handshake"
msgstr ""
@@ -994,6 +1006,10 @@ msgstr ""
msgid "I2SOut not available"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "IOs 0, 2 & 4 do not support internal pullup in sleep"
+msgstr ""
+
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
@@ -1011,6 +1027,10 @@ msgstr ""
msgid "Incorrect buffer size"
msgstr ""
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "Initialization failed due to lack of memory"
+msgstr ""
+
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
msgid "Input taking too long"
msgstr ""
@@ -1092,6 +1112,7 @@ msgid "Invalid byteorder string"
msgstr ""
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
msgid "Invalid capture period. Valid range: 1 - 500"
msgstr "periodo di cattura invalido. Zona valida: 1 - 500"
@@ -1271,6 +1292,10 @@ msgstr ""
msgid "Must use a multiple of 6 rgb pins, not %d"
msgstr ""
+#: ports/esp32s2/common-hal/nvm/ByteArray.c
+msgid "NVS Error"
+msgstr ""
+
#: py/parse.c
msgid "Name too long"
msgstr ""
@@ -1289,6 +1314,11 @@ msgstr "Nessun DAC sul chip"
msgid "No DMA channel found"
msgstr "Nessun canale DMA trovato"
+#: shared-module/busdevice/I2CDevice.c
+#, c-format
+msgid "No I2C device at address: %x"
+msgstr ""
+
#: ports/esp32s2/common-hal/busio/SPI.c ports/mimxrt10xx/common-hal/busio/SPI.c
#: ports/stm/common-hal/busio/SPI.c
msgid "No MISO Pin"
@@ -1425,14 +1455,14 @@ msgstr "operazione I2C non supportata"
msgid "Only 8 or 16 bit mono with "
msgstr ""
-#: ports/esp32s2/common-hal/socketpool/SocketPool.c
-msgid "Only IPv4 SOCK_STREAM sockets supported"
-msgstr ""
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr ""
+#: ports/esp32s2/common-hal/socketpool/SocketPool.c
+msgid "Only IPv4 sockets supported"
+msgstr ""
+
#: shared-module/displayio/OnDiskBitmap.c
#, c-format
msgid ""
@@ -1446,6 +1476,10 @@ msgid ""
"%d bpp given"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "Only one alarm.time alarm can be set."
+msgstr ""
+
#: shared-module/displayio/ColorConverter.c
msgid "Only one color can be transparent at a time"
msgstr ""
@@ -1508,6 +1542,10 @@ msgstr ""
msgid "Pin number already reserved by EXTI"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "PinAlarm not yet implemented"
+msgstr ""
+
#: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format
msgid ""
@@ -1571,7 +1609,7 @@ msgstr ""
msgid "RTC calibration is not supported on this board"
msgstr "calibrazione RTC non supportata su questa scheda"
-#: shared-bindings/time/__init__.c
+#: shared-bindings/alarm/time/TimeAlarm.c shared-bindings/time/__init__.c
msgid "RTC is not supported on this board"
msgstr "RTC non supportato su questa scheda"
@@ -1720,6 +1758,10 @@ msgstr "Metodi mancanti readinto() o write() allo stream."
msgid "Supply at least one UART pin"
msgstr ""
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Supply one of monotonic_time or epoch_time"
+msgstr ""
+
#: shared-bindings/gnss/GNSS.c
msgid "System entry must be gnss.SatelliteSystem"
msgstr ""
@@ -1783,6 +1825,10 @@ msgstr ""
msgid "Tile width must exactly divide bitmap width"
msgstr ""
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Time is in the past."
+msgstr ""
+
#: ports/nrf/common-hal/_bleio/Adapter.c
#, c-format
msgid "Timeout is too long: Maximum timeout length is %d seconds"
@@ -1980,7 +2026,7 @@ msgstr ""
msgid "WARNING: Your code filename has two extensions\n"
msgstr "ATTENZIONE: Il nome del sorgente ha due estensioni\n"
-#: shared-bindings/watchdog/WatchDogTimer.c
+#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "WatchDogTimer cannot be deinitialized once mode is set to RESET"
msgstr ""
@@ -2059,10 +2105,6 @@ msgstr "indirizzo fuori limite"
msgid "addresses is empty"
msgstr "gli indirizzi sono vuoti"
-#: extmod/ulab/code/vector/vectorise.c
-msgid "arctan2 is implemented for scalars and ndarrays only"
-msgstr ""
-
#: py/modbuiltins.c
msgid "arg is an empty sequence"
msgstr "l'argomento è una sequenza vuota"
@@ -2071,6 +2113,10 @@ msgstr "l'argomento è una sequenza vuota"
msgid "argsort argument must be an ndarray"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
+msgid "argsort is not implemented for flattened arrays"
+msgstr ""
+
#: py/runtime.c
msgid "argument has wrong type"
msgstr "il tipo dell'argomento è errato"
@@ -2088,15 +2134,23 @@ msgstr "discrepanza di numero/tipo di argomenti"
msgid "argument should be a '%q' not a '%q'"
msgstr "l'argomento dovrebbe essere un '%q' e non un '%q'"
-#: extmod/ulab/code/linalg/linalg.c
+#: extmod/ulab/code/linalg/linalg.c extmod/ulab/code/numerical/numerical.c
msgid "arguments must be ndarrays"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "array and index length must be equal"
+msgstr ""
+
#: py/objarray.c shared-bindings/nvm/ByteArray.c
msgid "array/bytes required on right side"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
+msgid "attempt to get (arg)min/(arg)max of empty sequence"
+msgstr ""
+
+#: extmod/ulab/code/numerical/numerical.c
msgid "attempt to get argmin/argmax of an empty sequence"
msgstr ""
@@ -2105,15 +2159,15 @@ msgid "attributes not supported yet"
msgstr "attributi non ancora supportati"
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, None, or 1"
+msgid "axis is out of bounds"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, or 1"
+msgid "axis must be None, or an integer"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be None, 0, or 1"
+msgid "axis too long"
msgstr ""
#: py/builtinevex.c
@@ -2321,6 +2375,10 @@ msgid ""
"can't switch from manual field specification to automatic field numbering"
msgstr ""
+#: extmod/ulab/code/ndarray_operators.c
+msgid "cannot cast output with casting rule"
+msgstr ""
+
#: py/objtype.c
msgid "cannot create '%q' instances"
msgstr "creare '%q' istanze"
@@ -2337,10 +2395,6 @@ msgstr "impossibile imporate il nome %q"
msgid "cannot perform relative import"
msgstr "impossibile effettuare l'importazione relativa"
-#: extmod/ulab/code/ndarray.c
-msgid "cannot reshape array (incompatible input/output shape)"
-msgstr ""
-
#: py/emitnative.c
msgid "casting"
msgstr "casting"
@@ -2415,10 +2469,6 @@ msgstr ""
msgid "convolve arguments must not be empty"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "could not broadast input array from shape"
-msgstr ""
-
#: extmod/ulab/code/poly/poly.c
msgid "could not invert Vandermonde matrix"
msgstr ""
@@ -2427,6 +2477,10 @@ msgstr ""
msgid "couldn't determine SD card version"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
+msgid "cross is defined for 1D arrays of length 3"
+msgstr ""
+
#: extmod/ulab/code/approx/approx.c
msgid "data must be iterable"
msgstr ""
@@ -2435,10 +2489,6 @@ msgstr ""
msgid "data must be of equal length"
msgstr ""
-#: extmod/ulab/code/numerical/numerical.c
-msgid "ddof must be smaller than length of data set"
-msgstr ""
-
#: py/parsenum.c
msgid "decimal numbers not supported"
msgstr "numeri decimali non supportati"
@@ -2471,6 +2521,10 @@ msgstr "sequanza di aggiornamento del dizionario ha la lunghezza errata"
msgid "diff argument must be an ndarray"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
+msgid "differentiation order out of range"
+msgstr ""
+
#: py/modmath.c py/objfloat.c py/objint_longlong.c py/objint_mpz.c py/runtime.c
#: shared-bindings/math/__init__.c
msgid "division by zero"
@@ -2501,6 +2555,10 @@ msgstr ""
msgid "end_x should be an int"
msgstr "y dovrebbe essere un int"
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "epoch_time not supported on this board"
+msgstr ""
+
#: ports/nrf/common-hal/busio/UART.c
#, c-format
msgid "error = 0x%08lX"
@@ -2587,6 +2645,10 @@ msgstr ""
msgid "first argument must be a function"
msgstr ""
+#: extmod/ulab/code/ulab_create.c
+msgid "first argument must be a tuple of ndarrays"
+msgstr ""
+
#: extmod/ulab/code/ndarray.c
msgid "first argument must be an iterable"
msgstr ""
@@ -2640,8 +2702,8 @@ msgstr "la funzione ha ricevuto valori multipli per l'argomento '%q'"
msgid "function has the same sign at the ends of interval"
msgstr ""
-#: extmod/ulab/code/compare/compare.c
-msgid "function is implemented for scalars and ndarrays only"
+#: extmod/ulab/code/ndarray.c
+msgid "function is defined for ndarrays only"
msgstr ""
#: py/argcheck.c
@@ -2712,6 +2774,7 @@ msgstr "padding incorretto"
msgid "index is out of bounds"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c py/obj.c
msgid "index out of range"
msgstr "indice fuori intervallo"
@@ -2736,6 +2799,10 @@ msgstr ""
msgid "inline assembler must be a function"
msgstr "inline assembler deve essere una funzione"
+#: extmod/ulab/code/ndarray.c
+msgid "input and output shapes are not compatible"
+msgstr ""
+
#: extmod/ulab/code/ulab_create.c
msgid "input argument must be an integer or a 2-tuple"
msgstr ""
@@ -2744,6 +2811,10 @@ msgstr ""
msgid "input array length must be power of 2"
msgstr ""
+#: extmod/ulab/code/ulab_create.c
+msgid "input arrays are not compatible"
+msgstr ""
+
#: extmod/ulab/code/poly/poly.c
msgid "input data must be an iterable"
msgstr ""
@@ -2756,6 +2827,22 @@ msgstr ""
msgid "input matrix is singular"
msgstr ""
+#: extmod/ulab/code/user/user.c
+msgid "input must be a dense ndarray"
+msgstr ""
+
+#: extmod/ulab/code/ulab_create.c
+msgid "input must be a tensor of rank 2"
+msgstr ""
+
+#: extmod/ulab/code/ulab_create.c extmod/ulab/code/user/user.c
+msgid "input must be an ndarray"
+msgstr ""
+
+#: extmod/ulab/code/filter/filter.c
+msgid "input must be one-dimensional"
+msgstr ""
+
#: extmod/ulab/code/linalg/linalg.c
msgid "input must be square matrix"
msgstr ""
@@ -2768,6 +2855,10 @@ msgstr ""
msgid "input vectors must be of equal length"
msgstr ""
+#: extmod/ulab/code/poly/poly.c
+msgid "inputs are not iterable"
+msgstr ""
+
#: py/parsenum.c
msgid "int() arg 2 must be >= 2 and <= 36"
msgstr "il secondo argomanto di int() deve essere >= 2 e <= 36"
@@ -2838,6 +2929,10 @@ msgstr "sintassi invalida per l'intero con base %d"
msgid "invalid syntax for number"
msgstr "sintassi invalida per il numero"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "io must be rtc io"
+msgstr ""
+
#: py/objtype.c
msgid "issubclass() arg 1 must be a class"
msgstr "il primo argomento di issubclass() deve essere una classe"
@@ -2941,6 +3036,10 @@ msgstr ""
msgid "max_length must be > 0"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "maximum number of dimensions is 4"
+msgstr ""
+
#: py/runtime.c
msgid "maximum recursion depth exceeded"
msgstr "profondità massima di ricorsione superata"
@@ -2990,10 +3089,6 @@ msgstr "deve lanciare un oggetto"
msgid "must use keyword argument for key function"
msgstr ""
-#: extmod/ulab/code/numerical/numerical.c
-msgid "n must be between 0, and 9"
-msgstr ""
-
#: py/runtime.c
msgid "name '%q' is not defined"
msgstr "nome '%q'non definito"
@@ -3077,6 +3172,10 @@ msgstr "argomento non nominato dopo */**"
msgid "non-keyword arg after keyword arg"
msgstr "argomento non nominato seguito da argomento nominato"
+#: extmod/ulab/code/linalg/linalg.c
+msgid "norm is defined for 1D and 2D arrays"
+msgstr ""
+
#: shared-bindings/_bleio/UUID.c
msgid "not a 128-bit UUID"
msgstr ""
@@ -3091,10 +3190,6 @@ msgstr ""
msgid "not enough arguments for format string"
msgstr "argomenti non sufficienti per la stringa di formattazione"
-#: extmod/ulab/code/poly/poly.c
-msgid "number of arguments must be 2, or 3"
-msgstr ""
-
#: extmod/ulab/code/ulab_create.c
msgid "number of points must be at least 2"
msgstr ""
@@ -3147,6 +3242,10 @@ msgstr ""
msgid "odd-length string"
msgstr "stringa di lunghezza dispari"
+#: extmod/ulab/code/ulab_create.c
+msgid "offset is too large"
+msgstr ""
+
#: py/objstr.c py/objstrunicode.c
#, fuzzy
msgid "offset out of bounds"
@@ -3170,6 +3269,14 @@ msgstr "solo slice con step=1 (aka None) sono supportate"
msgid "operands could not be broadcast together"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "operation is implemented for 1D Boolean arrays only"
+msgstr ""
+
+#: extmod/ulab/code/numerical/numerical.c
+msgid "operation is not implemented for flattened array"
+msgstr ""
+
#: extmod/ulab/code/numerical/numerical.c
msgid "operation is not implemented on ndarrays"
msgstr ""
@@ -3263,6 +3370,7 @@ msgstr "il terzo argomento di pow() non può essere 0"
msgid "pow() with 3 arguments requires integers"
msgstr "pow() con 3 argomenti richiede interi"
+#: ports/esp32s2/boards/adafruit_magtag_2.9_grayscale/mpconfigboard.h
#: ports/esp32s2/boards/adafruit_metro_esp32s2/mpconfigboard.h
#: ports/esp32s2/boards/electroniccats_bastwifi/mpconfigboard.h
#: ports/esp32s2/boards/espressif_kaluga_1/mpconfigboard.h
@@ -3306,6 +3414,10 @@ msgstr "importazione relativa"
msgid "requested length %d but object has length %d"
msgstr "lunghezza %d richiesta ma l'oggetto ha lunghezza %d"
+#: extmod/ulab/code/ndarray_operators.c
+msgid "results cannot be cast to specified type"
+msgstr ""
+
#: py/compile.c
msgid "return annotation must be an identifier"
msgstr ""
@@ -3324,8 +3436,8 @@ msgstr ""
msgid "rgb_pins[%d] is not on the same port as clock"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "right hand side must be an ndarray, or a scalar"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "roll argument must be an ndarray"
msgstr ""
#: py/objstr.c
@@ -3353,7 +3465,7 @@ msgid "script compilation not supported"
msgstr "compilazione dello scrip non suportata"
#: extmod/ulab/code/ndarray.c
-msgid "shape must be a 2-tuple"
+msgid "shape must be a tuple"
msgstr ""
#: py/objstr.c
@@ -3396,10 +3508,6 @@ msgstr "soft reboot\n"
msgid "sort argument must be an ndarray"
msgstr ""
-#: extmod/ulab/code/numerical/numerical.c
-msgid "sorted axis can't be longer than 65535"
-msgstr ""
-
#: extmod/ulab/code/filter/filter.c
msgid "sos array must be of shape (n_section, 6)"
msgstr ""
@@ -3481,6 +3589,7 @@ msgstr "la soglia deve essere nell'intervallo 0-65536"
msgid "time.struct_time() takes a 9-sequence"
msgstr ""
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "timeout duration exceeded the maximum supported value"
msgstr ""
@@ -3506,6 +3615,10 @@ msgstr ""
msgid "timestamp out of range for platform time_t"
msgstr "timestamp è fuori intervallo per il time_t della piattaforma"
+#: extmod/ulab/code/ndarray.c
+msgid "tobytes can be invoked for dense arrays only"
+msgstr ""
+
#: shared-module/struct/__init__.c
msgid "too many arguments provided with the given format"
msgstr "troppi argomenti forniti con il formato specificato"
@@ -3523,6 +3636,10 @@ msgstr "troppi valori da scompattare (%d attesi)"
msgid "trapz is defined for 1D arrays of equal length"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "trigger level must be 0 or 1"
+msgstr ""
+
#: extmod/ulab/code/linalg/linalg.c
msgid "tuple index out of range"
msgstr "indice della tupla fuori intervallo"
@@ -3665,6 +3782,14 @@ msgstr ""
msgid "vectors must have same lengths"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "wakeup conflict"
+msgstr ""
+
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "watchdog not initialized"
+msgstr ""
+
#: shared-bindings/watchdog/WatchDogTimer.c
msgid "watchdog timeout must be greater than 0"
msgstr ""
@@ -3677,12 +3802,12 @@ msgstr ""
msgid "window must be <= interval"
msgstr ""
-#: extmod/ulab/code/linalg/linalg.c
-msgid "wrong argument type"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "wrong axis index"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "wrong index type"
+#: extmod/ulab/code/ulab_create.c
+msgid "wrong axis specified"
msgstr ""
#: extmod/ulab/code/vector/vectorise.c
diff --git a/locale/ja.po b/locale/ja.po
index 80486dc21..27e094a0a 100644
--- a/locale/ja.po
+++ b/locale/ja.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-04 21:18+0530\n"
-"PO-Revision-Date: 2020-11-12 22:51+0000\n"
+"POT-Creation-Date: 2020-11-27 23:57-0500\n"
+"PO-Revision-Date: 2020-11-27 18:34+0000\n"
"Last-Translator: sporeball <sporeballdev@gmail.com>\n"
"Language-Team: none\n"
"Language: ja\n"
@@ -182,7 +182,7 @@ msgstr ""
#: py/emitinlinethumb.c py/emitinlinextensa.c
#, c-format
msgid "'%s' expects an integer"
-msgstr ""
+msgstr "'%s' ã«ã¯æ•´æ•°ãŒå¿…è¦"
#: py/emitinlinethumb.c
#, c-format
@@ -302,7 +302,9 @@ msgstr "å…¨ã¦ã®CAN周辺機器ãŒä½¿ç”¨ä¸­"
msgid "All I2C peripherals are in use"
msgstr "å…¨ã¦ã®I2C周辺機器ãŒä½¿ç”¨ä¸­"
-#: ports/esp32s2/peripherals/pcnt_handler.c
+#: ports/esp32s2/common-hal/countio/Counter.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/rotaryio/IncrementalEncoder.c
msgid "All PCNT units in use"
msgstr ""
@@ -338,6 +340,7 @@ msgstr "ã“ã®ãƒ”ン用ã®å…¨ã¦ã®ã‚¿ã‚¤ãƒžãŒä½¿ç”¨ä¸­"
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
#: ports/cxd56/common-hal/pulseio/PulseOut.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
#: ports/esp32s2/common-hal/neopixel_write/__init__.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c
#: ports/esp32s2/common-hal/pulseio/PulseOut.c
@@ -503,7 +506,8 @@ msgstr "ãƒãƒƒãƒ•ã‚¡é•·ã¯512ã®å€æ•°ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
msgid "Buffer must be a multiple of 512 bytes"
msgstr "ãƒãƒƒãƒ•ã‚¡ã¯512ã®å€æ•°ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
-#: shared-bindings/bitbangio/I2C.c shared-bindings/busio/I2C.c
+#: shared-bindings/bitbangio/I2C.c shared-bindings/busdevice/I2CDevice.c
+#: shared-bindings/busio/I2C.c
msgid "Buffer must be at least length 1"
msgstr "ãƒãƒƒãƒ•ã‚¡é•·ã¯å°‘ãªãã¨ã‚‚1以上ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
@@ -853,6 +857,10 @@ msgstr "UUIDãŒå¿…è¦"
msgid "Expected an Address"
msgstr "AddressãŒå¿…è¦"
+#: shared-bindings/alarm/__init__.c
+msgid "Expected an alarm"
+msgstr ""
+
#: shared-module/_pixelbuf/PixelBuf.c
#, c-format
msgid "Expected tuple of length %d, got %d"
@@ -866,6 +874,10 @@ msgstr ""
msgid "FFT is defined for ndarrays only"
msgstr "FFTã¯ndarrayã§ã®ã¿ä½¿ãˆã¾ã™"
+#: extmod/ulab/code/fft/fft.c
+msgid "FFT is implemented for linear arrays only"
+msgstr ""
+
#: ports/esp32s2/common-hal/socketpool/Socket.c
msgid "Failed SSL handshake"
msgstr ""
@@ -994,6 +1006,10 @@ msgstr "I2CåˆæœŸåŒ–エラー"
msgid "I2SOut not available"
msgstr "I2SOutãŒåˆ©ç”¨ã§ãã¾ã›ã‚“"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "IOs 0, 2 & 4 do not support internal pullup in sleep"
+msgstr ""
+
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
@@ -1011,6 +1027,10 @@ msgstr ""
msgid "Incorrect buffer size"
msgstr "ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºãŒæ­£ã—ãã‚りã¾ã›ã‚“"
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "Initialization failed due to lack of memory"
+msgstr ""
+
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
msgid "Input taking too long"
msgstr ""
@@ -1091,6 +1111,7 @@ msgid "Invalid byteorder string"
msgstr "䏿­£ãªãƒã‚¤ãƒˆã‚ªãƒ¼ãƒ€ãƒ¼æ–‡å­—列"
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
msgid "Invalid capture period. Valid range: 1 - 500"
msgstr "䏿­£ãªã‚­ãƒ£ãƒ—ãƒãƒ£å‘¨æœŸã€‚有効ãªå‘¨æœŸã¯1-500"
@@ -1267,6 +1288,10 @@ msgstr "MISOピンã¾ãŸã¯MOSIピンãŒå¿…è¦"
msgid "Must use a multiple of 6 rgb pins, not %d"
msgstr "%d個ã§ãªã6ã®å€æ•°å€‹ã®rgbピンを使ã£ã¦ãã ã•ã„"
+#: ports/esp32s2/common-hal/nvm/ByteArray.c
+msgid "NVS Error"
+msgstr ""
+
#: py/parse.c
msgid "Name too long"
msgstr "åå‰ãŒé•·ã™ãŽã¾ã™"
@@ -1285,6 +1310,11 @@ msgstr "ãƒãƒƒãƒ—ã«DACãŒã‚りã¾ã›ã‚“"
msgid "No DMA channel found"
msgstr "DMAãƒãƒ£ãƒãƒ«ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+#: shared-module/busdevice/I2CDevice.c
+#, c-format
+msgid "No I2C device at address: %x"
+msgstr ""
+
#: ports/esp32s2/common-hal/busio/SPI.c ports/mimxrt10xx/common-hal/busio/SPI.c
#: ports/stm/common-hal/busio/SPI.c
msgid "No MISO Pin"
@@ -1419,14 +1449,14 @@ msgstr "奇数パリティã«ã¯å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“"
msgid "Only 8 or 16 bit mono with "
msgstr "8ã¾ãŸã¯16ビット㮠"
-#: ports/esp32s2/common-hal/socketpool/SocketPool.c
-msgid "Only IPv4 SOCK_STREAM sockets supported"
-msgstr ""
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr ""
+#: ports/esp32s2/common-hal/socketpool/SocketPool.c
+msgid "Only IPv4 sockets supported"
+msgstr ""
+
#: shared-module/displayio/OnDiskBitmap.c
#, c-format
msgid ""
@@ -1440,6 +1470,10 @@ msgid ""
"%d bpp given"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "Only one alarm.time alarm can be set."
+msgstr ""
+
#: shared-module/displayio/ColorConverter.c
msgid "Only one color can be transparent at a time"
msgstr ""
@@ -1498,6 +1532,10 @@ msgstr "ピンã¯ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢å‰²ã‚Šè¾¼ã¿ã«å¯¾å¿œã—ã¦ã„ãªã‘れã°ãª
msgid "Pin number already reserved by EXTI"
msgstr "ピン番å·ã¯ã™ã§ã«EXTIã«ã‚ˆã£ã¦äºˆç´„ã•れã¦ã„ã¾ã™"
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "PinAlarm not yet implemented"
+msgstr ""
+
#: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format
msgid ""
@@ -1559,7 +1597,7 @@ msgstr ""
msgid "RTC calibration is not supported on this board"
msgstr "ã“ã®ãƒœãƒ¼ãƒ‰ã¯RTCã®ã‚­ãƒ£ãƒªãƒ–レーションã«éžå¯¾å¿œ"
-#: shared-bindings/time/__init__.c
+#: shared-bindings/alarm/time/TimeAlarm.c shared-bindings/time/__init__.c
msgid "RTC is not supported on this board"
msgstr "ã“ã®ãƒœãƒ¼ãƒ‰ã¯RTCã«å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“"
@@ -1705,6 +1743,10 @@ msgstr "ストリームã«readinto()ã¾ãŸã¯write()メソッドãŒã‚りã¾ã›ã
msgid "Supply at least one UART pin"
msgstr "å°‘ãªãã¨ã‚‚1ã¤ã®UARTピンãŒå¿…è¦"
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Supply one of monotonic_time or epoch_time"
+msgstr ""
+
#: shared-bindings/gnss/GNSS.c
msgid "System entry must be gnss.SatelliteSystem"
msgstr "system引数ã¯gnss.SatelliteSystemã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
@@ -1774,6 +1816,10 @@ msgstr "タイル値ãŒç¯„囲外"
msgid "Tile width must exactly divide bitmap width"
msgstr "タイルã®å¹…ã¯ãƒ“ットマップã®å¹…を割り切れる値ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Time is in the past."
+msgstr ""
+
#: ports/nrf/common-hal/_bleio/Adapter.c
#, c-format
msgid "Timeout is too long: Maximum timeout length is %d seconds"
@@ -1970,7 +2016,7 @@ msgstr "電圧読ã¿å–りãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆ"
msgid "WARNING: Your code filename has two extensions\n"
msgstr ""
-#: shared-bindings/watchdog/WatchDogTimer.c
+#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "WatchDogTimer cannot be deinitialized once mode is set to RESET"
msgstr ""
@@ -2049,10 +2095,6 @@ msgstr "アドレスãŒç¯„囲外"
msgid "addresses is empty"
msgstr ""
-#: extmod/ulab/code/vector/vectorise.c
-msgid "arctan2 is implemented for scalars and ndarrays only"
-msgstr ""
-
#: py/modbuiltins.c
msgid "arg is an empty sequence"
msgstr ""
@@ -2061,6 +2103,10 @@ msgstr ""
msgid "argsort argument must be an ndarray"
msgstr "argsortã®å¼•æ•°ã¯ndarrayã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "argsort is not implemented for flattened arrays"
+msgstr ""
+
#: py/runtime.c
msgid "argument has wrong type"
msgstr ""
@@ -2078,15 +2124,23 @@ msgstr ""
msgid "argument should be a '%q' not a '%q'"
msgstr "引数ã«ã¯ '%q' ãŒå¿…è¦ï¼ˆ'%q' ã§ã¯ãªã)"
-#: extmod/ulab/code/linalg/linalg.c
+#: extmod/ulab/code/linalg/linalg.c extmod/ulab/code/numerical/numerical.c
msgid "arguments must be ndarrays"
msgstr "引数ã¯ndarrayã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
+#: extmod/ulab/code/ndarray.c
+msgid "array and index length must be equal"
+msgstr ""
+
#: py/objarray.c shared-bindings/nvm/ByteArray.c
msgid "array/bytes required on right side"
msgstr "å³è¾ºã«ã¯array/bytesãŒå¿…è¦"
#: extmod/ulab/code/numerical/numerical.c
+msgid "attempt to get (arg)min/(arg)max of empty sequence"
+msgstr ""
+
+#: extmod/ulab/code/numerical/numerical.c
msgid "attempt to get argmin/argmax of an empty sequence"
msgstr ""
@@ -2095,16 +2149,16 @@ msgid "attributes not supported yet"
msgstr "å±žæ€§ã¯æœªå¯¾å¿œã§ã™"
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, None, or 1"
-msgstr "axis㯠-1, 0, 1, None ã®ã„ãšã‚Œã‹ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
+msgid "axis is out of bounds"
+msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, or 1"
-msgstr "axis㯠-1, 0, 1 ã®ã„ãšã‚Œã‹ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
+msgid "axis must be None, or an integer"
+msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be None, 0, or 1"
-msgstr "axis㯠None, 0, 1 ã®ã„ãšã‚Œã‹"
+msgid "axis too long"
+msgstr ""
#: py/builtinevex.c
msgid "bad compile mode"
@@ -2307,6 +2361,10 @@ msgid ""
"can't switch from manual field specification to automatic field numbering"
msgstr "手動ã¨è‡ªå‹•ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰æŒ‡å®šã¯æ··åœ¨ã§ãã¾ã›ã‚“"
+#: extmod/ulab/code/ndarray_operators.c
+msgid "cannot cast output with casting rule"
+msgstr ""
+
#: py/objtype.c
msgid "cannot create '%q' instances"
msgstr ""
@@ -2323,10 +2381,6 @@ msgstr ""
msgid "cannot perform relative import"
msgstr "相対インãƒãƒ¼ãƒˆã¯ã§ãã¾ã›ã‚“"
-#: extmod/ulab/code/ndarray.c
-msgid "cannot reshape array (incompatible input/output shape)"
-msgstr "入力/出力シェイプãŒäº’æ›ã§ãªãreshapeã§ãã¾ã›ã‚“"
-
#: py/emitnative.c
msgid "casting"
msgstr ""
@@ -2401,10 +2455,6 @@ msgstr "convolve引数ã¯ndarrayã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
msgid "convolve arguments must not be empty"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "could not broadast input array from shape"
-msgstr ""
-
#: extmod/ulab/code/poly/poly.c
msgid "could not invert Vandermonde matrix"
msgstr "ヴァンデルモンド行列ã®é€†è¡Œåˆ—を求ã‚られã¾ã›ã‚“"
@@ -2413,6 +2463,10 @@ msgstr "ヴァンデルモンド行列ã®é€†è¡Œåˆ—を求ã‚られã¾ã›ã‚“"
msgid "couldn't determine SD card version"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
+msgid "cross is defined for 1D arrays of length 3"
+msgstr ""
+
#: extmod/ulab/code/approx/approx.c
msgid "data must be iterable"
msgstr "dataã¯ã‚¤ãƒ†ãƒ¬ãƒ¼ãƒˆå¯èƒ½ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
@@ -2421,10 +2475,6 @@ msgstr "dataã¯ã‚¤ãƒ†ãƒ¬ãƒ¼ãƒˆå¯èƒ½ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
msgid "data must be of equal length"
msgstr "dataã¯åŒã˜é•·ã•ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
-#: extmod/ulab/code/numerical/numerical.c
-msgid "ddof must be smaller than length of data set"
-msgstr ""
-
#: py/parsenum.c
msgid "decimal numbers not supported"
msgstr ""
@@ -2456,6 +2506,10 @@ msgstr ""
msgid "diff argument must be an ndarray"
msgstr "引数ã¯ndarrayã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "differentiation order out of range"
+msgstr ""
+
#: py/modmath.c py/objfloat.c py/objint_longlong.c py/objint_mpz.c py/runtime.c
#: shared-bindings/math/__init__.c
msgid "division by zero"
@@ -2485,6 +2539,10 @@ msgstr ""
msgid "end_x should be an int"
msgstr "end_xã¯æ•´æ•°ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "epoch_time not supported on this board"
+msgstr ""
+
#: ports/nrf/common-hal/busio/UART.c
#, c-format
msgid "error = 0x%08lX"
@@ -2571,6 +2629,10 @@ msgstr "1ã¤ç›®ã®å¼•æ•°ã¯å‘¼ã³å‡ºã—å¯èƒ½ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
msgid "first argument must be a function"
msgstr "1ã¤ç›®ã®å¼•æ•°ã¯é–¢æ•°ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
+#: extmod/ulab/code/ulab_create.c
+msgid "first argument must be a tuple of ndarrays"
+msgstr ""
+
#: extmod/ulab/code/ndarray.c
msgid "first argument must be an iterable"
msgstr "1ã¤ç›®ã®å¼•æ•°ã¯ã‚¤ãƒ†ãƒ¬ãƒ¼ãƒˆå¯èƒ½ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
@@ -2624,9 +2686,9 @@ msgstr ""
msgid "function has the same sign at the ends of interval"
msgstr ""
-#: extmod/ulab/code/compare/compare.c
-msgid "function is implemented for scalars and ndarrays only"
-msgstr "スカラ値ãŠã‚ˆã³ndarrayã®ã¿ã‚’å—ã‘å–りã¾ã™"
+#: extmod/ulab/code/ndarray.c
+msgid "function is defined for ndarrays only"
+msgstr ""
#: py/argcheck.c
#, c-format
@@ -2695,6 +2757,7 @@ msgstr ""
msgid "index is out of bounds"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c py/obj.c
msgid "index out of range"
msgstr "インデクスãŒç¯„囲外"
@@ -2720,6 +2783,10 @@ msgstr ""
msgid "inline assembler must be a function"
msgstr "インラインアセンブラã¯é–¢æ•°ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
+#: extmod/ulab/code/ndarray.c
+msgid "input and output shapes are not compatible"
+msgstr ""
+
#: extmod/ulab/code/ulab_create.c
msgid "input argument must be an integer or a 2-tuple"
msgstr ""
@@ -2728,6 +2795,10 @@ msgstr ""
msgid "input array length must be power of 2"
msgstr "入力arrayé•·ã¯2ã®ç´¯ä¹—ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
+#: extmod/ulab/code/ulab_create.c
+msgid "input arrays are not compatible"
+msgstr ""
+
#: extmod/ulab/code/poly/poly.c
msgid "input data must be an iterable"
msgstr ""
@@ -2740,6 +2811,22 @@ msgstr "入力行列ãŒéžå¯¾ç§°"
msgid "input matrix is singular"
msgstr "入力ãŒéžæ­£å‰‡è¡Œåˆ—"
+#: extmod/ulab/code/user/user.c
+msgid "input must be a dense ndarray"
+msgstr ""
+
+#: extmod/ulab/code/ulab_create.c
+msgid "input must be a tensor of rank 2"
+msgstr ""
+
+#: extmod/ulab/code/ulab_create.c extmod/ulab/code/user/user.c
+msgid "input must be an ndarray"
+msgstr ""
+
+#: extmod/ulab/code/filter/filter.c
+msgid "input must be one-dimensional"
+msgstr ""
+
#: extmod/ulab/code/linalg/linalg.c
msgid "input must be square matrix"
msgstr "å…¥åŠ›ã¯æ­£æ–¹è¡Œåˆ—ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
@@ -2752,6 +2839,10 @@ msgstr "入力ã¯tuple, list, range, ndarrayã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
msgid "input vectors must be of equal length"
msgstr ""
+#: extmod/ulab/code/poly/poly.c
+msgid "inputs are not iterable"
+msgstr ""
+
#: py/parsenum.c
msgid "int() arg 2 must be >= 2 and <= 36"
msgstr "int()ã®ç¬¬2引数ã¯2以上36以下ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
@@ -2822,6 +2913,10 @@ msgstr ""
msgid "invalid syntax for number"
msgstr "æ•°å­—ã¨ã—ã¦ä¸æ­£ãªæ§‹æ–‡"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "io must be rtc io"
+msgstr ""
+
#: py/objtype.c
msgid "issubclass() arg 1 must be a class"
msgstr "issubclass()ã®ç¬¬1引数ã¯ã‚¯ãƒ©ã‚¹ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
@@ -2920,6 +3015,10 @@ msgstr ""
msgid "max_length must be > 0"
msgstr "max_lengthã¯0より大ãããªã‘れã°ãªã‚Šã¾ã›ã‚“"
+#: extmod/ulab/code/ndarray.c
+msgid "maximum number of dimensions is 4"
+msgstr ""
+
#: py/runtime.c
msgid "maximum recursion depth exceeded"
msgstr "最大ã®å†å¸°æ·±åº¦ã‚’è¶…ãˆã¾ã—ãŸ"
@@ -2969,10 +3068,6 @@ msgstr ""
msgid "must use keyword argument for key function"
msgstr ""
-#: extmod/ulab/code/numerical/numerical.c
-msgid "n must be between 0, and 9"
-msgstr "nã¯0ã‹ã‚‰9ã¾ã§"
-
#: py/runtime.c
msgid "name '%q' is not defined"
msgstr "åå‰ '%q' ã¯å®šç¾©ã•れã¦ã„ã¾ã›ã‚“"
@@ -3055,6 +3150,10 @@ msgstr "*/** ã®å¾Œã«éžã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰å¼•æ•°ã¯ç½®ã‘ã¾ã›ã‚“"
msgid "non-keyword arg after keyword arg"
msgstr "キーワード引数ã®å¾Œã«éžã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰å¼•æ•°ã¯ç½®ã‘ã¾ã›ã‚“"
+#: extmod/ulab/code/linalg/linalg.c
+msgid "norm is defined for 1D and 2D arrays"
+msgstr ""
+
#: shared-bindings/_bleio/UUID.c
msgid "not a 128-bit UUID"
msgstr "128ビットã®UUIDã§ã¯ã‚りã¾ã›ã‚“"
@@ -3067,10 +3166,6 @@ msgstr "文字列書å¼åŒ–ã§å…¨ã¦ã®å¼•æ•°ãŒä½¿ã‚れã¦ã„ã¾ã›ã‚“"
msgid "not enough arguments for format string"
msgstr "書å¼åŒ–文字列ã¸ã®å¼•æ•°ãŒè¶³ã‚Šã¾ã›ã‚“"
-#: extmod/ulab/code/poly/poly.c
-msgid "number of arguments must be 2, or 3"
-msgstr "引数ã¯2個ã¾ãŸã¯3個ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
-
#: extmod/ulab/code/ulab_create.c
msgid "number of points must be at least 2"
msgstr ""
@@ -3123,6 +3218,10 @@ msgstr ""
msgid "odd-length string"
msgstr "å¥‡æ•°é•·ã®æ–‡å­—列"
+#: extmod/ulab/code/ulab_create.c
+msgid "offset is too large"
+msgstr ""
+
#: py/objstr.c py/objstrunicode.c
msgid "offset out of bounds"
msgstr ""
@@ -3145,6 +3244,14 @@ msgstr ""
msgid "operands could not be broadcast together"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "operation is implemented for 1D Boolean arrays only"
+msgstr ""
+
+#: extmod/ulab/code/numerical/numerical.c
+msgid "operation is not implemented for flattened array"
+msgstr ""
+
#: extmod/ulab/code/numerical/numerical.c
msgid "operation is not implemented on ndarrays"
msgstr "ã“ã®æ¼”ç®—ã¯ndarray上ã§å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“"
@@ -3237,6 +3344,7 @@ msgstr "pow()ã®3ã¤ç›®ã®å¼•æ•°ã¯0ã«ã§ãã¾ã›ã‚“"
msgid "pow() with 3 arguments requires integers"
msgstr "pow()ã®ç¬¬3引数ã«ã¯æ•´æ•°ãŒå¿…è¦"
+#: ports/esp32s2/boards/adafruit_magtag_2.9_grayscale/mpconfigboard.h
#: ports/esp32s2/boards/adafruit_metro_esp32s2/mpconfigboard.h
#: ports/esp32s2/boards/electroniccats_bastwifi/mpconfigboard.h
#: ports/esp32s2/boards/espressif_kaluga_1/mpconfigboard.h
@@ -3280,6 +3388,10 @@ msgstr "相対インãƒãƒ¼ãƒˆ"
msgid "requested length %d but object has length %d"
msgstr "å¿…è¦ãªé•·ã•ã¯%dã§ã™ãŒã‚ªãƒ–ジェクトã®é•·ã•ã¯%d"
+#: extmod/ulab/code/ndarray_operators.c
+msgid "results cannot be cast to specified type"
+msgstr ""
+
#: py/compile.c
msgid "return annotation must be an identifier"
msgstr "戻り値ã®ã‚¢ãƒŽãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ã¯è­˜åˆ¥å­ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
@@ -3298,9 +3410,9 @@ msgstr ""
msgid "rgb_pins[%d] is not on the same port as clock"
msgstr "rgb_pins[%d]ã¯ã‚¯ãƒ­ãƒƒã‚¯ã¨åŒã˜ãƒãƒ¼ãƒˆã§ã¯ã‚りã¾ã›ã‚“"
-#: extmod/ulab/code/ndarray.c
-msgid "right hand side must be an ndarray, or a scalar"
-msgstr "å³è¾ºã¯ ndarray ã¾ãŸã¯ã‚¹ã‚«ãƒ©å€¤ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "roll argument must be an ndarray"
+msgstr ""
#: py/objstr.c
msgid "rsplit(None,n)"
@@ -3326,8 +3438,8 @@ msgid "script compilation not supported"
msgstr "スクリプトã®ã‚³ãƒ³ãƒ‘イルã¯éžå¯¾å¿œ"
#: extmod/ulab/code/ndarray.c
-msgid "shape must be a 2-tuple"
-msgstr "shapeã¯2値ã®ã‚¿ãƒ—ルã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
+msgid "shape must be a tuple"
+msgstr ""
#: py/objstr.c
msgid "sign not allowed in string format specifier"
@@ -3369,10 +3481,6 @@ msgstr "ソフトリブート\n"
msgid "sort argument must be an ndarray"
msgstr ""
-#: extmod/ulab/code/numerical/numerical.c
-msgid "sorted axis can't be longer than 65535"
-msgstr ""
-
#: extmod/ulab/code/filter/filter.c
msgid "sos array must be of shape (n_section, 6)"
msgstr ""
@@ -3453,6 +3561,7 @@ msgstr "threshouldã¯0ã‹ã‚‰65536ã¾ã§"
msgid "time.struct_time() takes a 9-sequence"
msgstr "time.struct_time()ã¯9è¦ç´ ã®ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ã‚’å—ã‘å–りã¾ã™"
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "timeout duration exceeded the maximum supported value"
msgstr "タイムアウト長ã¯å¯¾å¿œã™ã‚‹æœ€å¤§å€¤ã‚’è¶…ãˆã¦ã„ã¾ã™"
@@ -3477,6 +3586,10 @@ msgstr "v2カードã®å¾…機ãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã—ã¾ã—ãŸ"
msgid "timestamp out of range for platform time_t"
msgstr "timestampãŒãƒ—ラットフォームã®time_tã®ç¯„囲外"
+#: extmod/ulab/code/ndarray.c
+msgid "tobytes can be invoked for dense arrays only"
+msgstr ""
+
#: shared-module/struct/__init__.c
msgid "too many arguments provided with the given format"
msgstr "指定ã•ã‚ŒãŸæ›¸å¼ã«å¯¾ã—ã¦å¼•æ•°ãŒå¤šã™ãŽã¾ã™"
@@ -3494,6 +3607,10 @@ msgstr "アンパックã™ã‚‹å€¤ãŒå¤šã™ãŽã¾ã™ (%d個を期待)"
msgid "trapz is defined for 1D arrays of equal length"
msgstr "trapzã¯åŒã˜é•·ã•ã®1次元arrayã«å¯¾ã—ã¦å®šç¾©ã•れã¦ã„ã¾ã™"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "trigger level must be 0 or 1"
+msgstr ""
+
#: extmod/ulab/code/linalg/linalg.c
msgid "tuple index out of range"
msgstr ""
@@ -3636,6 +3753,14 @@ msgstr "value_countã¯0より大ãããªã‘れã°ãªã‚Šã¾ã›ã‚“"
msgid "vectors must have same lengths"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "wakeup conflict"
+msgstr ""
+
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "watchdog not initialized"
+msgstr ""
+
#: shared-bindings/watchdog/WatchDogTimer.c
msgid "watchdog timeout must be greater than 0"
msgstr "watchdogã®timeoutã¯0以上ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
@@ -3648,13 +3773,13 @@ msgstr ""
msgid "window must be <= interval"
msgstr "windowã¯interval以下ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
-#: extmod/ulab/code/linalg/linalg.c
-msgid "wrong argument type"
-msgstr "引数ã®åž‹ãŒä¸æ­£"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "wrong axis index"
+msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "wrong index type"
-msgstr "インデクスã®åž‹ãŒä¸æ­£"
+#: extmod/ulab/code/ulab_create.c
+msgid "wrong axis specified"
+msgstr ""
#: extmod/ulab/code/vector/vectorise.c
msgid "wrong input type"
@@ -3678,7 +3803,7 @@ msgstr ""
#: shared-module/displayio/Shape.c
msgid "x value out of bounds"
-msgstr ""
+msgstr "xãŒç¯„囲外"
#: shared-bindings/displayio/Shape.c
msgid "y should be an int"
@@ -3704,6 +3829,39 @@ msgstr "ziã¯float値ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
msgid "zi must be of shape (n_section, 2)"
msgstr ""
+#~ msgid "axis must be -1, 0, None, or 1"
+#~ msgstr "axis㯠-1, 0, 1, None ã®ã„ãšã‚Œã‹ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
+
+#~ msgid "axis must be -1, 0, or 1"
+#~ msgstr "axis㯠-1, 0, 1 ã®ã„ãšã‚Œã‹ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
+
+#~ msgid "axis must be None, 0, or 1"
+#~ msgstr "axis㯠None, 0, 1 ã®ã„ãšã‚Œã‹"
+
+#~ msgid "cannot reshape array (incompatible input/output shape)"
+#~ msgstr "入力/出力シェイプãŒäº’æ›ã§ãªãreshapeã§ãã¾ã›ã‚“"
+
+#~ msgid "function is implemented for scalars and ndarrays only"
+#~ msgstr "スカラ値ãŠã‚ˆã³ndarrayã®ã¿ã‚’å—ã‘å–りã¾ã™"
+
+#~ msgid "n must be between 0, and 9"
+#~ msgstr "nã¯0ã‹ã‚‰9ã¾ã§"
+
+#~ msgid "number of arguments must be 2, or 3"
+#~ msgstr "引数ã¯2個ã¾ãŸã¯3個ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
+
+#~ msgid "right hand side must be an ndarray, or a scalar"
+#~ msgstr "å³è¾ºã¯ ndarray ã¾ãŸã¯ã‚¹ã‚«ãƒ©å€¤ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
+
+#~ msgid "shape must be a 2-tuple"
+#~ msgstr "shapeã¯2値ã®ã‚¿ãƒ—ルã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“"
+
+#~ msgid "wrong argument type"
+#~ msgstr "引数ã®åž‹ãŒä¸æ­£"
+
+#~ msgid "wrong index type"
+#~ msgstr "インデクスã®åž‹ãŒä¸æ­£"
+
#~ msgid "Must provide SCK pin"
#~ msgstr "SCKピンãŒå¿…è¦"
diff --git a/locale/ko.po b/locale/ko.po
index c9215fb85..407b495b8 100644
--- a/locale/ko.po
+++ b/locale/ko.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-04 21:18+0530\n"
+"POT-Creation-Date: 2020-11-27 23:57-0500\n"
"PO-Revision-Date: 2020-10-05 12:12+0000\n"
"Last-Translator: Michal ÄŒihaÅ™ <michal@cihar.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -298,7 +298,9 @@ msgstr ""
msgid "All I2C peripherals are in use"
msgstr "ì‚¬ìš©ì¤‘ì¸ ëª¨ë“  I2C주변 기기"
-#: ports/esp32s2/peripherals/pcnt_handler.c
+#: ports/esp32s2/common-hal/countio/Counter.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/rotaryio/IncrementalEncoder.c
msgid "All PCNT units in use"
msgstr ""
@@ -334,6 +336,7 @@ msgstr "í•€ì˜ ëª¨ë“  타ì´ë¨¸ê°€ 사용 중입니다"
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
#: ports/cxd56/common-hal/pulseio/PulseOut.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
#: ports/esp32s2/common-hal/neopixel_write/__init__.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c
#: ports/esp32s2/common-hal/pulseio/PulseOut.c
@@ -499,7 +502,8 @@ msgstr ""
msgid "Buffer must be a multiple of 512 bytes"
msgstr ""
-#: shared-bindings/bitbangio/I2C.c shared-bindings/busio/I2C.c
+#: shared-bindings/bitbangio/I2C.c shared-bindings/busdevice/I2CDevice.c
+#: shared-bindings/busio/I2C.c
msgid "Buffer must be at least length 1"
msgstr "ìž˜ëª»ëœ í¬ê¸°ì˜ 버í¼. >1 여야합니다"
@@ -845,6 +849,10 @@ msgstr "UUIDì´ ì˜ˆìƒë˜ì—ˆìŠµë‹ˆë‹¤."
msgid "Expected an Address"
msgstr ""
+#: shared-bindings/alarm/__init__.c
+msgid "Expected an alarm"
+msgstr ""
+
#: shared-module/_pixelbuf/PixelBuf.c
#, c-format
msgid "Expected tuple of length %d, got %d"
@@ -858,6 +866,10 @@ msgstr ""
msgid "FFT is defined for ndarrays only"
msgstr ""
+#: extmod/ulab/code/fft/fft.c
+msgid "FFT is implemented for linear arrays only"
+msgstr ""
+
#: ports/esp32s2/common-hal/socketpool/Socket.c
msgid "Failed SSL handshake"
msgstr ""
@@ -986,6 +998,10 @@ msgstr ""
msgid "I2SOut not available"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "IOs 0, 2 & 4 do not support internal pullup in sleep"
+msgstr ""
+
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
@@ -1001,6 +1017,10 @@ msgstr ""
msgid "Incorrect buffer size"
msgstr ""
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "Initialization failed due to lack of memory"
+msgstr ""
+
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
msgid "Input taking too long"
msgstr ""
@@ -1081,6 +1101,7 @@ msgid "Invalid byteorder string"
msgstr ""
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
msgid "Invalid capture period. Valid range: 1 - 500"
msgstr ""
@@ -1257,6 +1278,10 @@ msgstr ""
msgid "Must use a multiple of 6 rgb pins, not %d"
msgstr ""
+#: ports/esp32s2/common-hal/nvm/ByteArray.c
+msgid "NVS Error"
+msgstr ""
+
#: py/parse.c
msgid "Name too long"
msgstr ""
@@ -1275,6 +1300,11 @@ msgstr ""
msgid "No DMA channel found"
msgstr ""
+#: shared-module/busdevice/I2CDevice.c
+#, c-format
+msgid "No I2C device at address: %x"
+msgstr ""
+
#: ports/esp32s2/common-hal/busio/SPI.c ports/mimxrt10xx/common-hal/busio/SPI.c
#: ports/stm/common-hal/busio/SPI.c
msgid "No MISO Pin"
@@ -1407,14 +1437,14 @@ msgstr ""
msgid "Only 8 or 16 bit mono with "
msgstr ""
-#: ports/esp32s2/common-hal/socketpool/SocketPool.c
-msgid "Only IPv4 SOCK_STREAM sockets supported"
-msgstr ""
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr ""
+#: ports/esp32s2/common-hal/socketpool/SocketPool.c
+msgid "Only IPv4 sockets supported"
+msgstr ""
+
#: shared-module/displayio/OnDiskBitmap.c
#, c-format
msgid ""
@@ -1428,6 +1458,10 @@ msgid ""
"%d bpp given"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "Only one alarm.time alarm can be set."
+msgstr ""
+
#: shared-module/displayio/ColorConverter.c
msgid "Only one color can be transparent at a time"
msgstr ""
@@ -1485,6 +1519,10 @@ msgstr ""
msgid "Pin number already reserved by EXTI"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "PinAlarm not yet implemented"
+msgstr ""
+
#: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format
msgid ""
@@ -1546,7 +1584,7 @@ msgstr ""
msgid "RTC calibration is not supported on this board"
msgstr ""
-#: shared-bindings/time/__init__.c
+#: shared-bindings/alarm/time/TimeAlarm.c shared-bindings/time/__init__.c
msgid "RTC is not supported on this board"
msgstr ""
@@ -1692,6 +1730,10 @@ msgstr ""
msgid "Supply at least one UART pin"
msgstr ""
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Supply one of monotonic_time or epoch_time"
+msgstr ""
+
#: shared-bindings/gnss/GNSS.c
msgid "System entry must be gnss.SatelliteSystem"
msgstr ""
@@ -1755,6 +1797,10 @@ msgstr ""
msgid "Tile width must exactly divide bitmap width"
msgstr ""
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Time is in the past."
+msgstr ""
+
#: ports/nrf/common-hal/_bleio/Adapter.c
#, c-format
msgid "Timeout is too long: Maximum timeout length is %d seconds"
@@ -1951,7 +1997,7 @@ msgstr ""
msgid "WARNING: Your code filename has two extensions\n"
msgstr ""
-#: shared-bindings/watchdog/WatchDogTimer.c
+#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "WatchDogTimer cannot be deinitialized once mode is set to RESET"
msgstr ""
@@ -2030,10 +2076,6 @@ msgstr ""
msgid "addresses is empty"
msgstr ""
-#: extmod/ulab/code/vector/vectorise.c
-msgid "arctan2 is implemented for scalars and ndarrays only"
-msgstr ""
-
#: py/modbuiltins.c
msgid "arg is an empty sequence"
msgstr ""
@@ -2042,6 +2084,10 @@ msgstr ""
msgid "argsort argument must be an ndarray"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
+msgid "argsort is not implemented for flattened arrays"
+msgstr ""
+
#: py/runtime.c
msgid "argument has wrong type"
msgstr ""
@@ -2059,15 +2105,23 @@ msgstr ""
msgid "argument should be a '%q' not a '%q'"
msgstr ""
-#: extmod/ulab/code/linalg/linalg.c
+#: extmod/ulab/code/linalg/linalg.c extmod/ulab/code/numerical/numerical.c
msgid "arguments must be ndarrays"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "array and index length must be equal"
+msgstr ""
+
#: py/objarray.c shared-bindings/nvm/ByteArray.c
msgid "array/bytes required on right side"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
+msgid "attempt to get (arg)min/(arg)max of empty sequence"
+msgstr ""
+
+#: extmod/ulab/code/numerical/numerical.c
msgid "attempt to get argmin/argmax of an empty sequence"
msgstr ""
@@ -2076,15 +2130,15 @@ msgid "attributes not supported yet"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, None, or 1"
+msgid "axis is out of bounds"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, or 1"
+msgid "axis must be None, or an integer"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be None, 0, or 1"
+msgid "axis too long"
msgstr ""
#: py/builtinevex.c
@@ -2288,6 +2342,10 @@ msgid ""
"can't switch from manual field specification to automatic field numbering"
msgstr ""
+#: extmod/ulab/code/ndarray_operators.c
+msgid "cannot cast output with casting rule"
+msgstr ""
+
#: py/objtype.c
msgid "cannot create '%q' instances"
msgstr ""
@@ -2304,10 +2362,6 @@ msgstr ""
msgid "cannot perform relative import"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "cannot reshape array (incompatible input/output shape)"
-msgstr ""
-
#: py/emitnative.c
msgid "casting"
msgstr ""
@@ -2380,10 +2434,6 @@ msgstr ""
msgid "convolve arguments must not be empty"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "could not broadast input array from shape"
-msgstr ""
-
#: extmod/ulab/code/poly/poly.c
msgid "could not invert Vandermonde matrix"
msgstr ""
@@ -2392,6 +2442,10 @@ msgstr ""
msgid "couldn't determine SD card version"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
+msgid "cross is defined for 1D arrays of length 3"
+msgstr ""
+
#: extmod/ulab/code/approx/approx.c
msgid "data must be iterable"
msgstr ""
@@ -2400,10 +2454,6 @@ msgstr ""
msgid "data must be of equal length"
msgstr ""
-#: extmod/ulab/code/numerical/numerical.c
-msgid "ddof must be smaller than length of data set"
-msgstr ""
-
#: py/parsenum.c
msgid "decimal numbers not supported"
msgstr ""
@@ -2433,6 +2483,10 @@ msgstr ""
msgid "diff argument must be an ndarray"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
+msgid "differentiation order out of range"
+msgstr ""
+
#: py/modmath.c py/objfloat.c py/objint_longlong.c py/objint_mpz.c py/runtime.c
#: shared-bindings/math/__init__.c
msgid "division by zero"
@@ -2462,6 +2516,10 @@ msgstr ""
msgid "end_x should be an int"
msgstr ""
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "epoch_time not supported on this board"
+msgstr ""
+
#: ports/nrf/common-hal/busio/UART.c
#, c-format
msgid "error = 0x%08lX"
@@ -2548,6 +2606,10 @@ msgstr ""
msgid "first argument must be a function"
msgstr ""
+#: extmod/ulab/code/ulab_create.c
+msgid "first argument must be a tuple of ndarrays"
+msgstr ""
+
#: extmod/ulab/code/ndarray.c
msgid "first argument must be an iterable"
msgstr ""
@@ -2601,8 +2663,8 @@ msgstr ""
msgid "function has the same sign at the ends of interval"
msgstr ""
-#: extmod/ulab/code/compare/compare.c
-msgid "function is implemented for scalars and ndarrays only"
+#: extmod/ulab/code/ndarray.c
+msgid "function is defined for ndarrays only"
msgstr ""
#: py/argcheck.c
@@ -2672,6 +2734,7 @@ msgstr ""
msgid "index is out of bounds"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c py/obj.c
msgid "index out of range"
msgstr ""
@@ -2696,6 +2759,10 @@ msgstr ""
msgid "inline assembler must be a function"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "input and output shapes are not compatible"
+msgstr ""
+
#: extmod/ulab/code/ulab_create.c
msgid "input argument must be an integer or a 2-tuple"
msgstr ""
@@ -2704,6 +2771,10 @@ msgstr ""
msgid "input array length must be power of 2"
msgstr ""
+#: extmod/ulab/code/ulab_create.c
+msgid "input arrays are not compatible"
+msgstr ""
+
#: extmod/ulab/code/poly/poly.c
msgid "input data must be an iterable"
msgstr ""
@@ -2716,6 +2787,22 @@ msgstr ""
msgid "input matrix is singular"
msgstr ""
+#: extmod/ulab/code/user/user.c
+msgid "input must be a dense ndarray"
+msgstr ""
+
+#: extmod/ulab/code/ulab_create.c
+msgid "input must be a tensor of rank 2"
+msgstr ""
+
+#: extmod/ulab/code/ulab_create.c extmod/ulab/code/user/user.c
+msgid "input must be an ndarray"
+msgstr ""
+
+#: extmod/ulab/code/filter/filter.c
+msgid "input must be one-dimensional"
+msgstr ""
+
#: extmod/ulab/code/linalg/linalg.c
msgid "input must be square matrix"
msgstr ""
@@ -2728,6 +2815,10 @@ msgstr ""
msgid "input vectors must be of equal length"
msgstr ""
+#: extmod/ulab/code/poly/poly.c
+msgid "inputs are not iterable"
+msgstr ""
+
#: py/parsenum.c
msgid "int() arg 2 must be >= 2 and <= 36"
msgstr ""
@@ -2798,6 +2889,10 @@ msgstr "구문(syntax)가 정수가 유효하지 않습니다"
msgid "invalid syntax for number"
msgstr "숫ìžì— 대한 구문(syntax)ê°€ 유효하지 않습니다"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "io must be rtc io"
+msgstr ""
+
#: py/objtype.c
msgid "issubclass() arg 1 must be a class"
msgstr ""
@@ -2896,6 +2991,10 @@ msgstr ""
msgid "max_length must be > 0"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "maximum number of dimensions is 4"
+msgstr ""
+
#: py/runtime.c
msgid "maximum recursion depth exceeded"
msgstr ""
@@ -2945,10 +3044,6 @@ msgstr ""
msgid "must use keyword argument for key function"
msgstr ""
-#: extmod/ulab/code/numerical/numerical.c
-msgid "n must be between 0, and 9"
-msgstr ""
-
#: py/runtime.c
msgid "name '%q' is not defined"
msgstr ""
@@ -3031,6 +3126,10 @@ msgstr ""
msgid "non-keyword arg after keyword arg"
msgstr ""
+#: extmod/ulab/code/linalg/linalg.c
+msgid "norm is defined for 1D and 2D arrays"
+msgstr ""
+
#: shared-bindings/_bleio/UUID.c
msgid "not a 128-bit UUID"
msgstr ""
@@ -3043,10 +3142,6 @@ msgstr ""
msgid "not enough arguments for format string"
msgstr ""
-#: extmod/ulab/code/poly/poly.c
-msgid "number of arguments must be 2, or 3"
-msgstr ""
-
#: extmod/ulab/code/ulab_create.c
msgid "number of points must be at least 2"
msgstr ""
@@ -3099,6 +3194,10 @@ msgstr ""
msgid "odd-length string"
msgstr ""
+#: extmod/ulab/code/ulab_create.c
+msgid "offset is too large"
+msgstr ""
+
#: py/objstr.c py/objstrunicode.c
msgid "offset out of bounds"
msgstr ""
@@ -3121,6 +3220,14 @@ msgstr ""
msgid "operands could not be broadcast together"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "operation is implemented for 1D Boolean arrays only"
+msgstr ""
+
+#: extmod/ulab/code/numerical/numerical.c
+msgid "operation is not implemented for flattened array"
+msgstr ""
+
#: extmod/ulab/code/numerical/numerical.c
msgid "operation is not implemented on ndarrays"
msgstr ""
@@ -3211,6 +3318,7 @@ msgstr ""
msgid "pow() with 3 arguments requires integers"
msgstr ""
+#: ports/esp32s2/boards/adafruit_magtag_2.9_grayscale/mpconfigboard.h
#: ports/esp32s2/boards/adafruit_metro_esp32s2/mpconfigboard.h
#: ports/esp32s2/boards/electroniccats_bastwifi/mpconfigboard.h
#: ports/esp32s2/boards/espressif_kaluga_1/mpconfigboard.h
@@ -3254,6 +3362,10 @@ msgstr ""
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 ""
+
#: py/compile.c
msgid "return annotation must be an identifier"
msgstr ""
@@ -3272,8 +3384,8 @@ msgstr ""
msgid "rgb_pins[%d] is not on the same port as clock"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "right hand side must be an ndarray, or a scalar"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "roll argument must be an ndarray"
msgstr ""
#: py/objstr.c
@@ -3299,7 +3411,7 @@ msgid "script compilation not supported"
msgstr ""
#: extmod/ulab/code/ndarray.c
-msgid "shape must be a 2-tuple"
+msgid "shape must be a tuple"
msgstr ""
#: py/objstr.c
@@ -3342,10 +3454,6 @@ msgstr ""
msgid "sort argument must be an ndarray"
msgstr ""
-#: extmod/ulab/code/numerical/numerical.c
-msgid "sorted axis can't be longer than 65535"
-msgstr ""
-
#: extmod/ulab/code/filter/filter.c
msgid "sos array must be of shape (n_section, 6)"
msgstr ""
@@ -3426,6 +3534,7 @@ msgstr ""
msgid "time.struct_time() takes a 9-sequence"
msgstr ""
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "timeout duration exceeded the maximum supported value"
msgstr ""
@@ -3450,6 +3559,10 @@ msgstr ""
msgid "timestamp out of range for platform time_t"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "tobytes can be invoked for dense arrays only"
+msgstr ""
+
#: shared-module/struct/__init__.c
msgid "too many arguments provided with the given format"
msgstr ""
@@ -3467,6 +3580,10 @@ msgstr ""
msgid "trapz is defined for 1D arrays of equal length"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "trigger level must be 0 or 1"
+msgstr ""
+
#: extmod/ulab/code/linalg/linalg.c
msgid "tuple index out of range"
msgstr ""
@@ -3609,6 +3726,14 @@ msgstr ""
msgid "vectors must have same lengths"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "wakeup conflict"
+msgstr ""
+
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "watchdog not initialized"
+msgstr ""
+
#: shared-bindings/watchdog/WatchDogTimer.c
msgid "watchdog timeout must be greater than 0"
msgstr ""
@@ -3621,12 +3746,12 @@ msgstr ""
msgid "window must be <= interval"
msgstr ""
-#: extmod/ulab/code/linalg/linalg.c
-msgid "wrong argument type"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "wrong axis index"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "wrong index type"
+#: extmod/ulab/code/ulab_create.c
+msgid "wrong axis specified"
msgstr ""
#: extmod/ulab/code/vector/vectorise.c
diff --git a/locale/nl.po b/locale/nl.po
index cfe2193bb..e45f9338d 100644
--- a/locale/nl.po
+++ b/locale/nl.po
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-04 21:18+0530\n"
+"POT-Creation-Date: 2020-11-27 23:57-0500\n"
"PO-Revision-Date: 2020-10-27 16:47+0000\n"
"Last-Translator: Jelle Jager <jell@jjc.id.au>\n"
"Language-Team: none\n"
@@ -300,7 +300,9 @@ msgstr ""
msgid "All I2C peripherals are in use"
msgstr "Alle I2C peripherals zijn in gebruik"
-#: ports/esp32s2/peripherals/pcnt_handler.c
+#: ports/esp32s2/common-hal/countio/Counter.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/rotaryio/IncrementalEncoder.c
msgid "All PCNT units in use"
msgstr ""
@@ -336,6 +338,7 @@ msgstr "Alle timers voor deze pin zijn in gebruik"
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
#: ports/cxd56/common-hal/pulseio/PulseOut.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
#: ports/esp32s2/common-hal/neopixel_write/__init__.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c
#: ports/esp32s2/common-hal/pulseio/PulseOut.c
@@ -501,7 +504,8 @@ msgstr "Buffer lengte moet een veelvoud van 512 zijn"
msgid "Buffer must be a multiple of 512 bytes"
msgstr "Buffer moet een veelvoud van 512 bytes zijn"
-#: shared-bindings/bitbangio/I2C.c shared-bindings/busio/I2C.c
+#: shared-bindings/bitbangio/I2C.c shared-bindings/busdevice/I2CDevice.c
+#: shared-bindings/busio/I2C.c
msgid "Buffer must be at least length 1"
msgstr "Buffer moet op zijn minst lengte 1 zijn"
@@ -853,6 +857,10 @@ msgstr "Verwachtte een UUID"
msgid "Expected an Address"
msgstr "Verwachtte een adres"
+#: shared-bindings/alarm/__init__.c
+msgid "Expected an alarm"
+msgstr ""
+
#: shared-module/_pixelbuf/PixelBuf.c
#, c-format
msgid "Expected tuple of length %d, got %d"
@@ -866,6 +874,10 @@ msgstr "Extended advertisements met scan antwoord niet ondersteund."
msgid "FFT is defined for ndarrays only"
msgstr "FFT alleen voor ndarrays gedefineerd"
+#: extmod/ulab/code/fft/fft.c
+msgid "FFT is implemented for linear arrays only"
+msgstr ""
+
#: ports/esp32s2/common-hal/socketpool/Socket.c
msgid "Failed SSL handshake"
msgstr "SSL handdruk mislukt"
@@ -996,6 +1008,10 @@ msgstr "I2C Init Fout"
msgid "I2SOut not available"
msgstr "I2SOut is niet beschikbaar"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "IOs 0, 2 & 4 do not support internal pullup in sleep"
+msgstr ""
+
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
@@ -1013,6 +1029,10 @@ msgstr ""
msgid "Incorrect buffer size"
msgstr "Incorrecte buffer grootte"
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "Initialization failed due to lack of memory"
+msgstr ""
+
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
msgid "Input taking too long"
msgstr "Invoer duurt te lang"
@@ -1093,6 +1113,7 @@ msgid "Invalid byteorder string"
msgstr "Ongeldige byteorder string"
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
msgid "Invalid capture period. Valid range: 1 - 500"
msgstr "Ongeldige vastlegging periode. Geldig bereik: 1 - 500"
@@ -1269,6 +1290,10 @@ msgstr "MISO of MOSI moeten worden gegeven"
msgid "Must use a multiple of 6 rgb pins, not %d"
msgstr "Een meervoud van 6 rgb pinnen moet worden gebruikt, niet %d"
+#: ports/esp32s2/common-hal/nvm/ByteArray.c
+msgid "NVS Error"
+msgstr ""
+
#: py/parse.c
msgid "Name too long"
msgstr "Naam te lang"
@@ -1287,6 +1312,11 @@ msgstr "Geen DAC op de chip"
msgid "No DMA channel found"
msgstr "Geen DMA kanaal gevonden"
+#: shared-module/busdevice/I2CDevice.c
+#, c-format
+msgid "No I2C device at address: %x"
+msgstr ""
+
#: ports/esp32s2/common-hal/busio/SPI.c ports/mimxrt10xx/common-hal/busio/SPI.c
#: ports/stm/common-hal/busio/SPI.c
msgid "No MISO Pin"
@@ -1421,14 +1451,14 @@ msgstr "Oneven pariteit is niet ondersteund"
msgid "Only 8 or 16 bit mono with "
msgstr "Alleen 8 of 16 bit mono met "
-#: ports/esp32s2/common-hal/socketpool/SocketPool.c
-msgid "Only IPv4 SOCK_STREAM sockets supported"
-msgstr "Alleen IPv4 SOCK_STREAM sockets worden ondersteund"
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr "Alleen IPv4 adressen worden ondersteund"
+#: ports/esp32s2/common-hal/socketpool/SocketPool.c
+msgid "Only IPv4 sockets supported"
+msgstr ""
+
#: shared-module/displayio/OnDiskBitmap.c
#, c-format
msgid ""
@@ -1446,6 +1476,10 @@ msgstr ""
"Alleen monochrome en 4bpp of 8bpp, en 16bpp of grotere geïndiceerde BMP's "
"zijn ondersteund: %d bpp is gegeven"
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "Only one alarm.time alarm can be set."
+msgstr ""
+
#: shared-module/displayio/ColorConverter.c
msgid "Only one color can be transparent at a time"
msgstr "Er kan maar één kleur per keer transparant zijn"
@@ -1506,6 +1540,10 @@ msgstr "Pin moet hardware interrupts ondersteunen"
msgid "Pin number already reserved by EXTI"
msgstr "Pin nummer al gereserveerd door EXTI"
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "PinAlarm not yet implemented"
+msgstr ""
+
#: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format
msgid ""
@@ -1576,7 +1614,7 @@ msgstr "RS485 inversie gespecificeerd terwijl niet in RS485 modus"
msgid "RTC calibration is not supported on this board"
msgstr "RTC calibratie niet ondersteund door dit board"
-#: shared-bindings/time/__init__.c
+#: shared-bindings/alarm/time/TimeAlarm.c shared-bindings/time/__init__.c
msgid "RTC is not supported on this board"
msgstr "RTC is niet ondersteund door dit board"
@@ -1722,6 +1760,10 @@ msgstr "Stream mist readinto() of write() methode."
msgid "Supply at least one UART pin"
msgstr "Geef op zijn minst 1 UART pin op"
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Supply one of monotonic_time or epoch_time"
+msgstr ""
+
#: shared-bindings/gnss/GNSS.c
msgid "System entry must be gnss.SatelliteSystem"
msgstr "Systeem invoer moet gnss.SatelliteSystem zijn"
@@ -1793,6 +1835,10 @@ msgstr "Tile waarde buiten bereik"
msgid "Tile width must exactly divide bitmap width"
msgstr "Tile breedte moet exact de bitmap breedte verdelen"
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Time is in the past."
+msgstr ""
+
#: ports/nrf/common-hal/_bleio/Adapter.c
#, c-format
msgid "Timeout is too long: Maximum timeout length is %d seconds"
@@ -1992,7 +2038,7 @@ msgstr "Voltage lees time-out"
msgid "WARNING: Your code filename has two extensions\n"
msgstr "WAARSCHUWING: De bestandsnaam van de code heeft twee extensies\n"
-#: shared-bindings/watchdog/WatchDogTimer.c
+#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "WatchDogTimer cannot be deinitialized once mode is set to RESET"
msgstr ""
"WatchDogTimer kan niet worden gedeïnitialiseerd zodra de modus in ingesteld "
@@ -2080,10 +2126,6 @@ msgstr "adres buiten bereik"
msgid "addresses is empty"
msgstr "adressen zijn leeg"
-#: extmod/ulab/code/vector/vectorise.c
-msgid "arctan2 is implemented for scalars and ndarrays only"
-msgstr "arctan2 is alleen geïmplementeerd voor scalars en ndarrays"
-
#: py/modbuiltins.c
msgid "arg is an empty sequence"
msgstr "arg is een lege sequentie"
@@ -2092,6 +2134,10 @@ msgstr "arg is een lege sequentie"
msgid "argsort argument must be an ndarray"
msgstr "argsort argument moet een ndarray zijn"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "argsort is not implemented for flattened arrays"
+msgstr ""
+
#: py/runtime.c
msgid "argument has wrong type"
msgstr "argument heeft onjuist type"
@@ -2109,15 +2155,23 @@ msgstr "argument num/typen komen niet overeen"
msgid "argument should be a '%q' not a '%q'"
msgstr "argument moet een '%q' zijn en niet een '%q'"
-#: extmod/ulab/code/linalg/linalg.c
+#: extmod/ulab/code/linalg/linalg.c extmod/ulab/code/numerical/numerical.c
msgid "arguments must be ndarrays"
msgstr "argumenten moeten ndarrays zijn"
+#: extmod/ulab/code/ndarray.c
+msgid "array and index length must be equal"
+msgstr ""
+
#: py/objarray.c shared-bindings/nvm/ByteArray.c
msgid "array/bytes required on right side"
msgstr "array/bytes vereist aan de rechterkant"
#: extmod/ulab/code/numerical/numerical.c
+msgid "attempt to get (arg)min/(arg)max of empty sequence"
+msgstr ""
+
+#: extmod/ulab/code/numerical/numerical.c
msgid "attempt to get argmin/argmax of an empty sequence"
msgstr "poging om argmin/argmax van een lege sequentie te krijgen"
@@ -2126,16 +2180,16 @@ msgid "attributes not supported yet"
msgstr "attributen nog niet ondersteund"
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, None, or 1"
-msgstr "as moet -1, 0, None, of 1 zijn"
+msgid "axis is out of bounds"
+msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, or 1"
-msgstr "as moet -1, 0, of 1 zijn"
+msgid "axis must be None, or an integer"
+msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be None, 0, or 1"
-msgstr "as moet None, 0, of 1 zijn"
+msgid "axis too long"
+msgstr ""
#: py/builtinevex.c
msgid "bad compile mode"
@@ -2339,6 +2393,10 @@ msgid ""
"can't switch from manual field specification to automatic field numbering"
msgstr "kan niet schakelen tussen handmatige en automatische veld specificatie"
+#: extmod/ulab/code/ndarray_operators.c
+msgid "cannot cast output with casting rule"
+msgstr ""
+
#: py/objtype.c
msgid "cannot create '%q' instances"
msgstr "kan geen instanties van '%q' creëren"
@@ -2355,10 +2413,6 @@ msgstr "kan naam %q niet importeren"
msgid "cannot perform relative import"
msgstr "kan geen relatieve import uitvoeren"
-#: extmod/ulab/code/ndarray.c
-msgid "cannot reshape array (incompatible input/output shape)"
-msgstr "kan de array niet hervormen (niet verenigbare input/output vorm)"
-
#: py/emitnative.c
msgid "casting"
msgstr "casting"
@@ -2432,10 +2486,6 @@ msgstr "convolutie argumenten moeten ndarrays zijn"
msgid "convolve arguments must not be empty"
msgstr "convolutie argumenten mogen niet leeg zijn"
-#: extmod/ulab/code/ndarray.c
-msgid "could not broadast input array from shape"
-msgstr "kon de invoerarray niet vanuit vorm uitzenden"
-
#: extmod/ulab/code/poly/poly.c
msgid "could not invert Vandermonde matrix"
msgstr "kon de Vandermonde matrix niet omkeren"
@@ -2444,6 +2494,10 @@ msgstr "kon de Vandermonde matrix niet omkeren"
msgid "couldn't determine SD card version"
msgstr "kon SD kaart versie niet bepalen"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "cross is defined for 1D arrays of length 3"
+msgstr ""
+
#: extmod/ulab/code/approx/approx.c
msgid "data must be iterable"
msgstr "data moet itereerbaar zijn"
@@ -2452,10 +2506,6 @@ msgstr "data moet itereerbaar zijn"
msgid "data must be of equal length"
msgstr "data moet van gelijke lengte zijn"
-#: extmod/ulab/code/numerical/numerical.c
-msgid "ddof must be smaller than length of data set"
-msgstr "ddof kleiner dan de lengte van de data set"
-
#: py/parsenum.c
msgid "decimal numbers not supported"
msgstr "decimale getallen zijn niet ondersteund"
@@ -2487,6 +2537,10 @@ msgstr "dict update sequence heeft de verkeerde lengte"
msgid "diff argument must be an ndarray"
msgstr "diff argument moet een ndarray zijn"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "differentiation order out of range"
+msgstr ""
+
#: py/modmath.c py/objfloat.c py/objint_longlong.c py/objint_mpz.c py/runtime.c
#: shared-bindings/math/__init__.c
msgid "division by zero"
@@ -2516,6 +2570,10 @@ msgstr "einde van format terwijl zoekend naar conversie-specifier"
msgid "end_x should be an int"
msgstr "end_x moet een int zijn"
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "epoch_time not supported on this board"
+msgstr ""
+
#: ports/nrf/common-hal/busio/UART.c
#, c-format
msgid "error = 0x%08lX"
@@ -2602,6 +2660,10 @@ msgstr "eerste argument moet een aanroepbare (callable) zijn"
msgid "first argument must be a function"
msgstr "eerste argument moet een functie zijn"
+#: extmod/ulab/code/ulab_create.c
+msgid "first argument must be a tuple of ndarrays"
+msgstr ""
+
#: extmod/ulab/code/ndarray.c
msgid "first argument must be an iterable"
msgstr "eerst argument moet een iterabel zijn"
@@ -2655,9 +2717,9 @@ msgstr "functie kreeg meedere waarden voor argument '%q'"
msgid "function has the same sign at the ends of interval"
msgstr "functie heeft hetzelfde teken aan beide uiteinden van het interval"
-#: extmod/ulab/code/compare/compare.c
-msgid "function is implemented for scalars and ndarrays only"
-msgstr "funtie is alleen geïmplementeerd voor scalars en ndarrays"
+#: extmod/ulab/code/ndarray.c
+msgid "function is defined for ndarrays only"
+msgstr ""
#: py/argcheck.c
#, c-format
@@ -2727,6 +2789,7 @@ msgstr "vulling (padding) is onjuist"
msgid "index is out of bounds"
msgstr "index is buiten bereik"
+#: extmod/ulab/code/numerical/numerical.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c py/obj.c
msgid "index out of range"
msgstr "index is buiten bereik"
@@ -2751,6 +2814,10 @@ msgstr "lengte van initial_value is onjuist"
msgid "inline assembler must be a function"
msgstr "inline assembler moet een functie zijn"
+#: extmod/ulab/code/ndarray.c
+msgid "input and output shapes are not compatible"
+msgstr ""
+
#: extmod/ulab/code/ulab_create.c
msgid "input argument must be an integer or a 2-tuple"
msgstr "invoerargument moet een integer of 2-tuple zijn"
@@ -2759,6 +2826,10 @@ msgstr "invoerargument moet een integer of 2-tuple zijn"
msgid "input array length must be power of 2"
msgstr "invoer array lengte moet een macht van 2 zijn"
+#: extmod/ulab/code/ulab_create.c
+msgid "input arrays are not compatible"
+msgstr ""
+
#: extmod/ulab/code/poly/poly.c
msgid "input data must be an iterable"
msgstr "invoerdata moet itereerbaar zijn"
@@ -2771,6 +2842,22 @@ msgstr "invoermatrix is asymmetrisch"
msgid "input matrix is singular"
msgstr "invoermatrix is singulier"
+#: extmod/ulab/code/user/user.c
+msgid "input must be a dense ndarray"
+msgstr ""
+
+#: extmod/ulab/code/ulab_create.c
+msgid "input must be a tensor of rank 2"
+msgstr ""
+
+#: extmod/ulab/code/ulab_create.c extmod/ulab/code/user/user.c
+msgid "input must be an ndarray"
+msgstr ""
+
+#: extmod/ulab/code/filter/filter.c
+msgid "input must be one-dimensional"
+msgstr ""
+
#: extmod/ulab/code/linalg/linalg.c
msgid "input must be square matrix"
msgstr "invoer moet een vierkante matrix zijn"
@@ -2783,6 +2870,10 @@ msgstr "invoer moet een tuple, lijst, bereik of ndarray zijn"
msgid "input vectors must be of equal length"
msgstr "invoervectors moeten van gelijke lengte zijn"
+#: extmod/ulab/code/poly/poly.c
+msgid "inputs are not iterable"
+msgstr ""
+
#: py/parsenum.c
msgid "int() arg 2 must be >= 2 and <= 36"
msgstr "int() argument 2 moet >=2 en <= 36 zijn"
@@ -2853,6 +2944,10 @@ msgstr "ongeldige syntax voor integer met grondtal %d"
msgid "invalid syntax for number"
msgstr "ongeldige syntax voor nummer"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "io must be rtc io"
+msgstr ""
+
#: py/objtype.c
msgid "issubclass() arg 1 must be a class"
msgstr "issubclass() argument 1 moet een klasse zijn"
@@ -2954,6 +3049,10 @@ msgstr "max_length moet 0-%d zijn als fixed_length %s is"
msgid "max_length must be > 0"
msgstr "max_length moet >0 zijn"
+#: extmod/ulab/code/ndarray.c
+msgid "maximum number of dimensions is 4"
+msgstr ""
+
#: py/runtime.c
msgid "maximum recursion depth exceeded"
msgstr "maximale recursiediepte overschreden"
@@ -3003,10 +3102,6 @@ msgstr "moet een object oproepen (raise)"
msgid "must use keyword argument for key function"
msgstr "voor sleutelfunctie moet een trefwoordargument gebruikt worden"
-#: extmod/ulab/code/numerical/numerical.c
-msgid "n must be between 0, and 9"
-msgstr "n moet tussen 0 en 9 liggen"
-
#: py/runtime.c
msgid "name '%q' is not defined"
msgstr "naam '%q' is niet gedefinieerd"
@@ -3089,6 +3184,10 @@ msgstr "niet-trefwoord argument na */**"
msgid "non-keyword arg after keyword arg"
msgstr "niet-trefwoord argument na trefwoord argument"
+#: extmod/ulab/code/linalg/linalg.c
+msgid "norm is defined for 1D and 2D arrays"
+msgstr ""
+
#: shared-bindings/_bleio/UUID.c
msgid "not a 128-bit UUID"
msgstr "geen 128-bit UUID"
@@ -3101,10 +3200,6 @@ msgstr "niet alle argumenten omgezet bij formattering van string"
msgid "not enough arguments for format string"
msgstr "niet genoeg argumenten om string te formatteren"
-#: extmod/ulab/code/poly/poly.c
-msgid "number of arguments must be 2, or 3"
-msgstr "aantal argumenten moet 2 of 3 zijn"
-
#: extmod/ulab/code/ulab_create.c
msgid "number of points must be at least 2"
msgstr "aantal punten moet minimaal 2 zijn"
@@ -3157,6 +3252,10 @@ msgstr "object met buffer protocol vereist"
msgid "odd-length string"
msgstr "string met oneven lengte"
+#: extmod/ulab/code/ulab_create.c
+msgid "offset is too large"
+msgstr ""
+
#: py/objstr.c py/objstrunicode.c
msgid "offset out of bounds"
msgstr "offset buiten bereik"
@@ -3179,6 +3278,14 @@ msgstr "alleen segmenten met step=1 (ook wel None) worden ondersteund"
msgid "operands could not be broadcast together"
msgstr "operands konden niet samen verzonden worden"
+#: extmod/ulab/code/ndarray.c
+msgid "operation is implemented for 1D Boolean arrays only"
+msgstr ""
+
+#: extmod/ulab/code/numerical/numerical.c
+msgid "operation is not implemented for flattened array"
+msgstr ""
+
#: extmod/ulab/code/numerical/numerical.c
msgid "operation is not implemented on ndarrays"
msgstr "bewerking is voor ndarrays niet geïmplementeerd"
@@ -3270,6 +3377,7 @@ msgstr "derde argument van pow() mag geen 0 zijn"
msgid "pow() with 3 arguments requires integers"
msgstr "pow() met 3 argumenten vereist integers"
+#: ports/esp32s2/boards/adafruit_magtag_2.9_grayscale/mpconfigboard.h
#: ports/esp32s2/boards/adafruit_metro_esp32s2/mpconfigboard.h
#: ports/esp32s2/boards/electroniccats_bastwifi/mpconfigboard.h
#: ports/esp32s2/boards/espressif_kaluga_1/mpconfigboard.h
@@ -3313,6 +3421,10 @@ msgstr "relatieve import"
msgid "requested length %d but object has length %d"
msgstr "gevraagde lengte is %d maar object heeft lengte %d"
+#: extmod/ulab/code/ndarray_operators.c
+msgid "results cannot be cast to specified type"
+msgstr ""
+
#: py/compile.c
msgid "return annotation must be an identifier"
msgstr "return annotatie moet een identifier zijn"
@@ -3331,9 +3443,9 @@ msgstr "rgb_pins[%d] is hetzelfde als een andere pintoewijzing"
msgid "rgb_pins[%d] is not on the same port as clock"
msgstr "rgb_pins[%d] bevindt zich niet op dezelfde poort als klok"
-#: extmod/ulab/code/ndarray.c
-msgid "right hand side must be an ndarray, or a scalar"
-msgstr "de rechterkant moet een ndarray of scalar zijn"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "roll argument must be an ndarray"
+msgstr ""
#: py/objstr.c
msgid "rsplit(None,n)"
@@ -3360,8 +3472,8 @@ msgid "script compilation not supported"
msgstr "scriptcompilatie wordt niet ondersteund"
#: extmod/ulab/code/ndarray.c
-msgid "shape must be a 2-tuple"
-msgstr "vorm moet een 2-tuple zijn"
+msgid "shape must be a tuple"
+msgstr ""
#: py/objstr.c
msgid "sign not allowed in string format specifier"
@@ -3403,10 +3515,6 @@ msgstr "zachte herstart\n"
msgid "sort argument must be an ndarray"
msgstr "sorteerargument moet een ndarray zijn"
-#: extmod/ulab/code/numerical/numerical.c
-msgid "sorted axis can't be longer than 65535"
-msgstr ""
-
#: extmod/ulab/code/filter/filter.c
msgid "sos array must be of shape (n_section, 6)"
msgstr "sos array moet vorm (n_section, 6) hebben"
@@ -3487,6 +3595,7 @@ msgstr "drempelwaarde moet in het bereik 0-65536 liggen"
msgid "time.struct_time() takes a 9-sequence"
msgstr "time.struct_time() accepteert een 9-rij"
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "timeout duration exceeded the maximum supported value"
msgstr "time-outduur is groter dan de ondersteunde maximale waarde"
@@ -3511,6 +3620,10 @@ msgstr "timeout bij wachten op v2 kaart"
msgid "timestamp out of range for platform time_t"
msgstr "timestamp buiten bereik voor platform time_t"
+#: extmod/ulab/code/ndarray.c
+msgid "tobytes can be invoked for dense arrays only"
+msgstr ""
+
#: shared-module/struct/__init__.c
msgid "too many arguments provided with the given format"
msgstr "te veel argumenten opgegeven bij dit formaat"
@@ -3528,6 +3641,10 @@ msgstr "te veel waarden om uit te pakken (%d verwacht)"
msgid "trapz is defined for 1D arrays of equal length"
msgstr "trapz is gedefinieerd voor eendimensionale arrays van gelijke lengte"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "trigger level must be 0 or 1"
+msgstr ""
+
#: extmod/ulab/code/linalg/linalg.c
msgid "tuple index out of range"
msgstr "tuple index buiten bereik"
@@ -3670,6 +3787,14 @@ msgstr "value_count moet groter dan 0 zijn"
msgid "vectors must have same lengths"
msgstr "vectoren moeten van gelijke lengte zijn"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "wakeup conflict"
+msgstr ""
+
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "watchdog not initialized"
+msgstr ""
+
#: shared-bindings/watchdog/WatchDogTimer.c
msgid "watchdog timeout must be greater than 0"
msgstr "watchdog time-out moet groter zijn dan 0"
@@ -3682,13 +3807,13 @@ msgstr "breedte moet groter dan nul zijn"
msgid "window must be <= interval"
msgstr "window moet <= interval zijn"
-#: extmod/ulab/code/linalg/linalg.c
-msgid "wrong argument type"
-msgstr "onjuist argumenttype"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "wrong axis index"
+msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "wrong index type"
-msgstr "onjuist indextype"
+#: extmod/ulab/code/ulab_create.c
+msgid "wrong axis specified"
+msgstr ""
#: extmod/ulab/code/vector/vectorise.c
msgid "wrong input type"
@@ -3738,6 +3863,51 @@ msgstr "zi moet van type float zijn"
msgid "zi must be of shape (n_section, 2)"
msgstr "zi moet vorm (n_section, 2) hebben"
+#~ msgid "Only IPv4 SOCK_STREAM sockets supported"
+#~ msgstr "Alleen IPv4 SOCK_STREAM sockets worden ondersteund"
+
+#~ msgid "arctan2 is implemented for scalars and ndarrays only"
+#~ msgstr "arctan2 is alleen geïmplementeerd voor scalars en ndarrays"
+
+#~ msgid "axis must be -1, 0, None, or 1"
+#~ msgstr "as moet -1, 0, None, of 1 zijn"
+
+#~ msgid "axis must be -1, 0, or 1"
+#~ msgstr "as moet -1, 0, of 1 zijn"
+
+#~ msgid "axis must be None, 0, or 1"
+#~ msgstr "as moet None, 0, of 1 zijn"
+
+#~ msgid "cannot reshape array (incompatible input/output shape)"
+#~ msgstr "kan de array niet hervormen (niet verenigbare input/output vorm)"
+
+#~ msgid "could not broadast input array from shape"
+#~ msgstr "kon de invoerarray niet vanuit vorm uitzenden"
+
+#~ msgid "ddof must be smaller than length of data set"
+#~ msgstr "ddof kleiner dan de lengte van de data set"
+
+#~ msgid "function is implemented for scalars and ndarrays only"
+#~ msgstr "funtie is alleen geïmplementeerd voor scalars en ndarrays"
+
+#~ msgid "n must be between 0, and 9"
+#~ msgstr "n moet tussen 0 en 9 liggen"
+
+#~ msgid "number of arguments must be 2, or 3"
+#~ msgstr "aantal argumenten moet 2 of 3 zijn"
+
+#~ msgid "right hand side must be an ndarray, or a scalar"
+#~ msgstr "de rechterkant moet een ndarray of scalar zijn"
+
+#~ msgid "shape must be a 2-tuple"
+#~ msgstr "vorm moet een 2-tuple zijn"
+
+#~ msgid "wrong argument type"
+#~ msgstr "onjuist argumenttype"
+
+#~ msgid "wrong index type"
+#~ msgstr "onjuist indextype"
+
#~ msgid "Must provide SCK pin"
#~ msgstr "SCK pin moet opgegeven worden"
diff --git a/locale/pl.po b/locale/pl.po
index 623acd4c5..31d446b3b 100644
--- a/locale/pl.po
+++ b/locale/pl.po
@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-04 21:18+0530\n"
-"PO-Revision-Date: 2020-11-11 19:13+0000\n"
+"POT-Creation-Date: 2020-11-27 23:57-0500\n"
+"PO-Revision-Date: 2020-12-02 20:29+0000\n"
"Last-Translator: Maciej Stankiewicz <tawezik@gmail.com>\n"
"Language-Team: pl\n"
"Language: pl\n"
@@ -128,11 +128,11 @@ msgstr "Obiekt '%q' nie wspiera '%q'"
#: py/obj.c
msgid "'%q' object does not support item assignment"
-msgstr ""
+msgstr "'%q' obiekt nie wspiera dopisywania elementów"
#: py/obj.c
msgid "'%q' object does not support item deletion"
-msgstr ""
+msgstr "obiekt '%q' nie wspiera usuwania elementów"
#: py/runtime.c
msgid "'%q' object has no attribute '%q'"
@@ -152,7 +152,7 @@ msgstr "Obiekt '%q' nie jest iterowalny"
#: py/obj.c
msgid "'%q' object is not subscriptable"
-msgstr ""
+msgstr "obiekt '%q' nie jest indeksowany"
#: py/emitinlinethumb.c py/emitinlinextensa.c
#, c-format
@@ -292,7 +292,7 @@ msgstr "Adres musi mieć %d bajtów"
#: shared-bindings/_bleio/Address.c
msgid "Address type out of range"
-msgstr ""
+msgstr "Typ adresu poza zakresem"
#: ports/esp32s2/common-hal/canio/CAN.c
msgid "All CAN peripherals are in use"
@@ -302,7 +302,9 @@ msgstr ""
msgid "All I2C peripherals are in use"
msgstr "Wszystkie peryferia I2C w użyciu"
-#: ports/esp32s2/peripherals/pcnt_handler.c
+#: ports/esp32s2/common-hal/countio/Counter.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/rotaryio/IncrementalEncoder.c
msgid "All PCNT units in use"
msgstr ""
@@ -338,6 +340,7 @@ msgstr "Wszystkie timery tej nóżki w użyciu"
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
#: ports/cxd56/common-hal/pulseio/PulseOut.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
#: ports/esp32s2/common-hal/neopixel_write/__init__.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c
#: ports/esp32s2/common-hal/pulseio/PulseOut.c
@@ -406,7 +409,7 @@ msgstr "Próba przydzielenia %d bloków"
#: supervisor/shared/safe_mode.c
msgid "Attempted heap allocation when MicroPython VM not running."
-msgstr ""
+msgstr "Próba przydziału sterty, gdy MicroPython VM nie działa."
#: shared-bindings/wifi/Radio.c
msgid "Authentication failure"
@@ -503,7 +506,8 @@ msgstr "Długość bufora musi być wielokrotnością 512"
msgid "Buffer must be a multiple of 512 bytes"
msgstr "Bufor musi być wielokrotnością 512 bajtów"
-#: shared-bindings/bitbangio/I2C.c shared-bindings/busio/I2C.c
+#: shared-bindings/bitbangio/I2C.c shared-bindings/busdevice/I2CDevice.c
+#: shared-bindings/busio/I2C.c
msgid "Buffer must be at least length 1"
msgstr "Bufor musi mieć długość 1 lub więcej"
@@ -853,6 +857,10 @@ msgstr "Oczekiwano UUID"
msgid "Expected an Address"
msgstr "Oczekiwano adresu"
+#: shared-bindings/alarm/__init__.c
+msgid "Expected an alarm"
+msgstr ""
+
#: shared-module/_pixelbuf/PixelBuf.c
#, c-format
msgid "Expected tuple of length %d, got %d"
@@ -866,6 +874,10 @@ msgstr ""
msgid "FFT is defined for ndarrays only"
msgstr ""
+#: extmod/ulab/code/fft/fft.c
+msgid "FFT is implemented for linear arrays only"
+msgstr ""
+
#: ports/esp32s2/common-hal/socketpool/Socket.c
msgid "Failed SSL handshake"
msgstr ""
@@ -994,6 +1006,10 @@ msgstr "Błąd inicjalizacji I2C"
msgid "I2SOut not available"
msgstr "I2SOut niedostępne"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "IOs 0, 2 & 4 do not support internal pullup in sleep"
+msgstr ""
+
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
@@ -1011,6 +1027,10 @@ msgstr ""
msgid "Incorrect buffer size"
msgstr "Niewłaściwa wielkość bufora"
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "Initialization failed due to lack of memory"
+msgstr ""
+
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
msgid "Input taking too long"
msgstr ""
@@ -1091,6 +1111,7 @@ msgid "Invalid byteorder string"
msgstr ""
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
msgid "Invalid capture period. Valid range: 1 - 500"
msgstr "Zły okres. Poprawny zakres to: 1 - 500"
@@ -1179,7 +1200,7 @@ msgstr "Zły tryb uruchomienia."
#: shared-module/_bleio/Attribute.c
msgid "Invalid security_mode"
-msgstr ""
+msgstr "Nieprawidłowy security_mode"
#: shared-bindings/audiomixer/Mixer.c
msgid "Invalid voice"
@@ -1268,6 +1289,10 @@ msgstr "Należy podać pin MISO lub MOSI"
msgid "Must use a multiple of 6 rgb pins, not %d"
msgstr ""
+#: ports/esp32s2/common-hal/nvm/ByteArray.c
+msgid "NVS Error"
+msgstr ""
+
#: py/parse.c
msgid "Name too long"
msgstr "Za długa nazwa"
@@ -1286,6 +1311,11 @@ msgstr "Brak DAC"
msgid "No DMA channel found"
msgstr "Nie znaleziono kanału DMA"
+#: shared-module/busdevice/I2CDevice.c
+#, c-format
+msgid "No I2C device at address: %x"
+msgstr ""
+
#: ports/esp32s2/common-hal/busio/SPI.c ports/mimxrt10xx/common-hal/busio/SPI.c
#: ports/stm/common-hal/busio/SPI.c
msgid "No MISO Pin"
@@ -1377,7 +1407,7 @@ msgstr "Brak pliku/katalogu"
#: shared-module/rgbmatrix/RGBMatrix.c
msgid "No timer available"
-msgstr ""
+msgstr "Brak dostępnego timera"
#: supervisor/shared/safe_mode.c
msgid "Nordic Soft Device failure assertion."
@@ -1418,14 +1448,14 @@ msgstr "Nieparzysta parzystość nie jest wspierana"
msgid "Only 8 or 16 bit mono with "
msgstr "Tylko 8 lub 16 bitów mono z "
-#: ports/esp32s2/common-hal/socketpool/SocketPool.c
-msgid "Only IPv4 SOCK_STREAM sockets supported"
-msgstr ""
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr ""
+#: ports/esp32s2/common-hal/socketpool/SocketPool.c
+msgid "Only IPv4 sockets supported"
+msgstr ""
+
#: shared-module/displayio/OnDiskBitmap.c
#, c-format
msgid ""
@@ -1439,6 +1469,10 @@ msgid ""
"%d bpp given"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "Only one alarm.time alarm can be set."
+msgstr ""
+
#: shared-module/displayio/ColorConverter.c
msgid "Only one color can be transparent at a time"
msgstr "W danym momencie przezroczysty może być tylko jeden kolor"
@@ -1496,6 +1530,10 @@ msgstr "Pin musi obsługiwać przerwania sprzętowe"
msgid "Pin number already reserved by EXTI"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "PinAlarm not yet implemented"
+msgstr ""
+
#: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format
msgid ""
@@ -1557,7 +1595,7 @@ msgstr ""
msgid "RTC calibration is not supported on this board"
msgstr "Brak obsługi kalibracji RTC"
-#: shared-bindings/time/__init__.c
+#: shared-bindings/alarm/time/TimeAlarm.c shared-bindings/time/__init__.c
msgid "RTC is not supported on this board"
msgstr "Brak obsługi RTC"
@@ -1568,7 +1606,7 @@ msgstr ""
#: ports/stm/common-hal/os/__init__.c
msgid "Random number generation error"
-msgstr ""
+msgstr "Błąd generowania liczb losowych"
#: shared-bindings/memorymonitor/AllocationSize.c
#: shared-bindings/pulseio/PulseIn.c
@@ -1649,11 +1687,11 @@ msgstr "Skanuj już w toku. Zatrzymaj za pomocą stop_scan."
#: ports/mimxrt10xx/common-hal/busio/UART.c
msgid "Selected CTS pin not valid"
-msgstr ""
+msgstr "Wybrany pin CTS jest nieprawidłowy"
#: ports/mimxrt10xx/common-hal/busio/UART.c
msgid "Selected RTS pin not valid"
-msgstr ""
+msgstr "Wybrany pin RTS jest nieprawidłowy"
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
@@ -1701,6 +1739,10 @@ msgstr "Strumień nie ma metod readinto() lub write()."
#: ports/mimxrt10xx/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
msgid "Supply at least one UART pin"
+msgstr "Podaj co najmniej jeden pin UART"
+
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Supply one of monotonic_time or epoch_time"
msgstr ""
#: shared-bindings/gnss/GNSS.c
@@ -1766,6 +1808,10 @@ msgstr ""
msgid "Tile width must exactly divide bitmap width"
msgstr "Szerokość bitmapy musi być wielokrotnością szerokości kafelka"
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Time is in the past."
+msgstr ""
+
#: ports/nrf/common-hal/_bleio/Adapter.c
#, c-format
msgid "Timeout is too long: Maximum timeout length is %d seconds"
@@ -1961,7 +2007,7 @@ msgstr ""
msgid "WARNING: Your code filename has two extensions\n"
msgstr "UWAGA: Nazwa pliku ma dwa rozszerzenia\n"
-#: shared-bindings/watchdog/WatchDogTimer.c
+#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "WatchDogTimer cannot be deinitialized once mode is set to RESET"
msgstr ""
@@ -2046,10 +2092,6 @@ msgstr "adres poza zakresem"
msgid "addresses is empty"
msgstr "adres jest pusty"
-#: extmod/ulab/code/vector/vectorise.c
-msgid "arctan2 is implemented for scalars and ndarrays only"
-msgstr ""
-
#: py/modbuiltins.c
msgid "arg is an empty sequence"
msgstr "arg jest puste"
@@ -2058,6 +2100,10 @@ msgstr "arg jest puste"
msgid "argsort argument must be an ndarray"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
+msgid "argsort is not implemented for flattened arrays"
+msgstr ""
+
#: py/runtime.c
msgid "argument has wrong type"
msgstr "argument ma zły typ"
@@ -2075,15 +2121,23 @@ msgstr "zła liczba lub typ argumentów"
msgid "argument should be a '%q' not a '%q'"
msgstr "argument powinien być '%q' a nie '%q'"
-#: extmod/ulab/code/linalg/linalg.c
+#: extmod/ulab/code/linalg/linalg.c extmod/ulab/code/numerical/numerical.c
msgid "arguments must be ndarrays"
msgstr ""
+#: extmod/ulab/code/ndarray.c
+msgid "array and index length must be equal"
+msgstr ""
+
#: py/objarray.c shared-bindings/nvm/ByteArray.c
msgid "array/bytes required on right side"
msgstr "tablica/bytes wymagane po prawej stronie"
#: extmod/ulab/code/numerical/numerical.c
+msgid "attempt to get (arg)min/(arg)max of empty sequence"
+msgstr ""
+
+#: extmod/ulab/code/numerical/numerical.c
msgid "attempt to get argmin/argmax of an empty sequence"
msgstr ""
@@ -2092,15 +2146,15 @@ msgid "attributes not supported yet"
msgstr "atrybuty nie są jeszcze obsługiwane"
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, None, or 1"
+msgid "axis is out of bounds"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, or 1"
+msgid "axis must be None, or an integer"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be None, 0, or 1"
+msgid "axis too long"
msgstr ""
#: py/builtinevex.c
@@ -2304,6 +2358,10 @@ msgid ""
"can't switch from manual field specification to automatic field numbering"
msgstr "nie można zmienić z ręcznego numerowaniu pól do automatycznego"
+#: extmod/ulab/code/ndarray_operators.c
+msgid "cannot cast output with casting rule"
+msgstr ""
+
#: py/objtype.c
msgid "cannot create '%q' instances"
msgstr "nie można tworzyć instancji '%q'"
@@ -2320,10 +2378,6 @@ msgstr "nie można zaimportować nazwy %q"
msgid "cannot perform relative import"
msgstr "nie można wykonać relatywnego importu"
-#: extmod/ulab/code/ndarray.c
-msgid "cannot reshape array (incompatible input/output shape)"
-msgstr ""
-
#: py/emitnative.c
msgid "casting"
msgstr "rzutowanie"
@@ -2396,10 +2450,6 @@ msgstr ""
msgid "convolve arguments must not be empty"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "could not broadast input array from shape"
-msgstr ""
-
#: extmod/ulab/code/poly/poly.c
msgid "could not invert Vandermonde matrix"
msgstr ""
@@ -2408,6 +2458,10 @@ msgstr ""
msgid "couldn't determine SD card version"
msgstr "nie można określić wersji karty SD"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "cross is defined for 1D arrays of length 3"
+msgstr ""
+
#: extmod/ulab/code/approx/approx.c
msgid "data must be iterable"
msgstr ""
@@ -2416,10 +2470,6 @@ msgstr ""
msgid "data must be of equal length"
msgstr ""
-#: extmod/ulab/code/numerical/numerical.c
-msgid "ddof must be smaller than length of data set"
-msgstr ""
-
#: py/parsenum.c
msgid "decimal numbers not supported"
msgstr "liczby dziesiętne nieobsługiwane"
@@ -2450,6 +2500,10 @@ msgstr "sekwencja ma złą długość"
msgid "diff argument must be an ndarray"
msgstr ""
+#: extmod/ulab/code/numerical/numerical.c
+msgid "differentiation order out of range"
+msgstr ""
+
#: py/modmath.c py/objfloat.c py/objint_longlong.c py/objint_mpz.c py/runtime.c
#: shared-bindings/math/__init__.c
msgid "division by zero"
@@ -2479,6 +2533,10 @@ msgstr "koniec formatu przy szukaniu specyfikacji konwersji"
msgid "end_x should be an int"
msgstr "end_x powinien być całkowity"
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "epoch_time not supported on this board"
+msgstr ""
+
#: ports/nrf/common-hal/busio/UART.c
#, c-format
msgid "error = 0x%08lX"
@@ -2565,6 +2623,10 @@ msgstr ""
msgid "first argument must be a function"
msgstr "pierwszy argument musi być funkcją"
+#: extmod/ulab/code/ulab_create.c
+msgid "first argument must be a tuple of ndarrays"
+msgstr ""
+
#: extmod/ulab/code/ndarray.c
msgid "first argument must be an iterable"
msgstr "pierwszy argument musi być iterowalny"
@@ -2618,8 +2680,8 @@ msgstr "funkcja dostała wiele wartości dla argumentu '%q'"
msgid "function has the same sign at the ends of interval"
msgstr ""
-#: extmod/ulab/code/compare/compare.c
-msgid "function is implemented for scalars and ndarrays only"
+#: extmod/ulab/code/ndarray.c
+msgid "function is defined for ndarrays only"
msgstr ""
#: py/argcheck.c
@@ -2689,6 +2751,7 @@ msgstr "złe wypełnienie"
msgid "index is out of bounds"
msgstr "indeks jest poza zakresem"
+#: extmod/ulab/code/numerical/numerical.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c py/obj.c
msgid "index out of range"
msgstr "indeks poza zakresem"
@@ -2713,6 +2776,10 @@ msgstr "długość initial_value jest nieprawidłowa"
msgid "inline assembler must be a function"
msgstr "wtrącony asembler musi być funkcją"
+#: extmod/ulab/code/ndarray.c
+msgid "input and output shapes are not compatible"
+msgstr ""
+
#: extmod/ulab/code/ulab_create.c
msgid "input argument must be an integer or a 2-tuple"
msgstr ""
@@ -2721,6 +2788,10 @@ msgstr ""
msgid "input array length must be power of 2"
msgstr "długość tablicy wejściowej musi być potęgą 2"
+#: extmod/ulab/code/ulab_create.c
+msgid "input arrays are not compatible"
+msgstr ""
+
#: extmod/ulab/code/poly/poly.c
msgid "input data must be an iterable"
msgstr ""
@@ -2733,6 +2804,22 @@ msgstr ""
msgid "input matrix is singular"
msgstr ""
+#: extmod/ulab/code/user/user.c
+msgid "input must be a dense ndarray"
+msgstr ""
+
+#: extmod/ulab/code/ulab_create.c
+msgid "input must be a tensor of rank 2"
+msgstr ""
+
+#: extmod/ulab/code/ulab_create.c extmod/ulab/code/user/user.c
+msgid "input must be an ndarray"
+msgstr ""
+
+#: extmod/ulab/code/filter/filter.c
+msgid "input must be one-dimensional"
+msgstr ""
+
#: extmod/ulab/code/linalg/linalg.c
msgid "input must be square matrix"
msgstr "wejście musi być macierzą kwadratową"
@@ -2745,6 +2832,10 @@ msgstr ""
msgid "input vectors must be of equal length"
msgstr "wektory wejściowe muszą być równej długości"
+#: extmod/ulab/code/poly/poly.c
+msgid "inputs are not iterable"
+msgstr ""
+
#: py/parsenum.c
msgid "int() arg 2 must be >= 2 and <= 36"
msgstr "argument 2 do int() busi być pomiędzy 2 a 36"
@@ -2815,6 +2906,10 @@ msgstr "zła składnia dla liczby całkowitej w bazie %d"
msgid "invalid syntax for number"
msgstr "zła składnia dla liczby"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "io must be rtc io"
+msgstr ""
+
#: py/objtype.c
msgid "issubclass() arg 1 must be a class"
msgstr "argument 1 dla issubclass() musi być klasą"
@@ -2913,6 +3008,10 @@ msgstr ""
msgid "max_length must be > 0"
msgstr "max_length musi być > 0"
+#: extmod/ulab/code/ndarray.c
+msgid "maximum number of dimensions is 4"
+msgstr ""
+
#: py/runtime.c
msgid "maximum recursion depth exceeded"
msgstr "przekroczono dozwoloną głębokość rekurencji"
@@ -2962,10 +3061,6 @@ msgstr "wyjątek musi być obiektem"
msgid "must use keyword argument for key function"
msgstr "funkcja key musi być podana jako argument nazwany"
-#: extmod/ulab/code/numerical/numerical.c
-msgid "n must be between 0, and 9"
-msgstr ""
-
#: py/runtime.c
msgid "name '%q' is not defined"
msgstr "nazwa '%q' niezdefiniowana"
@@ -3048,6 +3143,10 @@ msgstr "argument nienazwany po */**"
msgid "non-keyword arg after keyword arg"
msgstr "argument nienazwany po nazwanym"
+#: extmod/ulab/code/linalg/linalg.c
+msgid "norm is defined for 1D and 2D arrays"
+msgstr ""
+
#: shared-bindings/_bleio/UUID.c
msgid "not a 128-bit UUID"
msgstr "to nie jest 128-bitowy UUID"
@@ -3060,10 +3159,6 @@ msgstr "nie wszystkie argumenty wykorzystane w formatowaniu"
msgid "not enough arguments for format string"
msgstr "nie dość argumentów przy formatowaniu"
-#: extmod/ulab/code/poly/poly.c
-msgid "number of arguments must be 2, or 3"
-msgstr "liczba argumentów musi wynosić 2 lub 3"
-
#: extmod/ulab/code/ulab_create.c
msgid "number of points must be at least 2"
msgstr "liczba punktów musi wynosić co najmniej 2"
@@ -3116,6 +3211,10 @@ msgstr "wymagany obiekt z protokołem buforu"
msgid "odd-length string"
msgstr "łańcuch o nieparzystej długości"
+#: extmod/ulab/code/ulab_create.c
+msgid "offset is too large"
+msgstr ""
+
#: py/objstr.c py/objstrunicode.c
msgid "offset out of bounds"
msgstr "offset poza zakresem"
@@ -3136,6 +3235,14 @@ msgstr "tylko fragmenty ze step=1 (lub None) sÄ… wspierane"
#: extmod/ulab/code/compare/compare.c extmod/ulab/code/ndarray.c
#: extmod/ulab/code/vector/vectorise.c
msgid "operands could not be broadcast together"
+msgstr "operandy nie mogły być rozgłaszane razem"
+
+#: extmod/ulab/code/ndarray.c
+msgid "operation is implemented for 1D Boolean arrays only"
+msgstr ""
+
+#: extmod/ulab/code/numerical/numerical.c
+msgid "operation is not implemented for flattened array"
msgstr ""
#: extmod/ulab/code/numerical/numerical.c
@@ -3229,6 +3336,7 @@ msgstr "trzeci argument pow() nie może być 0"
msgid "pow() with 3 arguments requires integers"
msgstr "trzyargumentowe pow() wymaga liczb całkowitych"
+#: ports/esp32s2/boards/adafruit_magtag_2.9_grayscale/mpconfigboard.h
#: ports/esp32s2/boards/adafruit_metro_esp32s2/mpconfigboard.h
#: ports/esp32s2/boards/electroniccats_bastwifi/mpconfigboard.h
#: ports/esp32s2/boards/espressif_kaluga_1/mpconfigboard.h
@@ -3272,6 +3380,10 @@ msgstr "relatywny import"
msgid "requested length %d but object has length %d"
msgstr "zażądano długości %d ale obiekt ma długość %d"
+#: extmod/ulab/code/ndarray_operators.c
+msgid "results cannot be cast to specified type"
+msgstr ""
+
#: py/compile.c
msgid "return annotation must be an identifier"
msgstr "anotacja wartości musi być identyfikatorem"
@@ -3290,8 +3402,8 @@ msgstr ""
msgid "rgb_pins[%d] is not on the same port as clock"
msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "right hand side must be an ndarray, or a scalar"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "roll argument must be an ndarray"
msgstr ""
#: py/objstr.c
@@ -3318,7 +3430,7 @@ msgid "script compilation not supported"
msgstr "kompilowanie skryptów nieobsługiwane"
#: extmod/ulab/code/ndarray.c
-msgid "shape must be a 2-tuple"
+msgid "shape must be a tuple"
msgstr ""
#: py/objstr.c
@@ -3359,11 +3471,7 @@ msgstr "programowy reset\n"
#: extmod/ulab/code/numerical/numerical.c
msgid "sort argument must be an ndarray"
-msgstr ""
-
-#: extmod/ulab/code/numerical/numerical.c
-msgid "sorted axis can't be longer than 65535"
-msgstr ""
+msgstr "argument sort musi być ndarray"
#: extmod/ulab/code/filter/filter.c
msgid "sos array must be of shape (n_section, 6)"
@@ -3445,6 +3553,7 @@ msgstr "threshold musi być w zakresie 0-65536"
msgid "time.struct_time() takes a 9-sequence"
msgstr "time.struct_time() wymaga 9-elementowej sekwencji"
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "timeout duration exceeded the maximum supported value"
msgstr ""
@@ -3469,6 +3578,10 @@ msgstr ""
msgid "timestamp out of range for platform time_t"
msgstr "timestamp poza zakresem dla time_t na tej platformie"
+#: extmod/ulab/code/ndarray.c
+msgid "tobytes can be invoked for dense arrays only"
+msgstr ""
+
#: shared-module/struct/__init__.c
msgid "too many arguments provided with the given format"
msgstr "zbyt wiele argumentów podanych dla tego formatu"
@@ -3486,6 +3599,10 @@ msgstr "zbyt wiele wartości do rozpakowania (oczekiwano %d)"
msgid "trapz is defined for 1D arrays of equal length"
msgstr ""
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "trigger level must be 0 or 1"
+msgstr ""
+
#: extmod/ulab/code/linalg/linalg.c
msgid "tuple index out of range"
msgstr "indeks krotki poza zakresem"
@@ -3628,6 +3745,14 @@ msgstr "value_count musi być > 0"
msgid "vectors must have same lengths"
msgstr "wektory muszą mieć identyczną długość"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "wakeup conflict"
+msgstr ""
+
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "watchdog not initialized"
+msgstr ""
+
#: shared-bindings/watchdog/WatchDogTimer.c
msgid "watchdog timeout must be greater than 0"
msgstr ""
@@ -3640,13 +3765,13 @@ msgstr ""
msgid "window must be <= interval"
msgstr ""
-#: extmod/ulab/code/linalg/linalg.c
-msgid "wrong argument type"
-msgstr "zły typ argumentu"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "wrong axis index"
+msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "wrong index type"
-msgstr "zły typ indeksu"
+#: extmod/ulab/code/ulab_create.c
+msgid "wrong axis specified"
+msgstr ""
#: extmod/ulab/code/vector/vectorise.c
msgid "wrong input type"
@@ -3662,7 +3787,7 @@ msgstr "zła liczba wartości do rozpakowania"
#: extmod/ulab/code/ndarray.c
msgid "wrong operand type"
-msgstr ""
+msgstr "zły typ operandu"
#: extmod/ulab/code/vector/vectorise.c
msgid "wrong output type"
@@ -3696,6 +3821,15 @@ msgstr ""
msgid "zi must be of shape (n_section, 2)"
msgstr ""
+#~ msgid "number of arguments must be 2, or 3"
+#~ msgstr "liczba argumentów musi wynosić 2 lub 3"
+
+#~ msgid "wrong argument type"
+#~ msgstr "zły typ argumentu"
+
+#~ msgid "wrong index type"
+#~ msgstr "zły typ indeksu"
+
#~ msgid "Must provide SCK pin"
#~ msgstr "Należy podać pin SCK"
diff --git a/locale/pt_BR.po b/locale/pt_BR.po
index 67b3dc8a7..239a83037 100644
--- a/locale/pt_BR.po
+++ b/locale/pt_BR.po
@@ -5,8 +5,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-04 21:18+0530\n"
-"PO-Revision-Date: 2020-11-08 10:26+0000\n"
+"POT-Creation-Date: 2020-11-27 23:57-0500\n"
+"PO-Revision-Date: 2020-11-30 18:06+0000\n"
"Last-Translator: Wellington Terumi Uemura <wellingtonuemura@gmail.com>\n"
"Language-Team: \n"
"Language: pt_BR\n"
@@ -14,7 +14,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 4.3.2\n"
+"X-Generator: Weblate 4.4-dev\n"
#: main.c
msgid ""
@@ -304,7 +304,9 @@ msgstr "Todos os periféricos CAN estão em uso"
msgid "All I2C peripherals are in use"
msgstr "Todos os periféricos I2C estão em uso"
-#: ports/esp32s2/peripherals/pcnt_handler.c
+#: ports/esp32s2/common-hal/countio/Counter.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/rotaryio/IncrementalEncoder.c
msgid "All PCNT units in use"
msgstr "Todas as unidades PCNT estão em uso"
@@ -340,6 +342,7 @@ msgstr "Todos os temporizadores para este pino estão em uso"
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
#: ports/cxd56/common-hal/pulseio/PulseOut.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
#: ports/esp32s2/common-hal/neopixel_write/__init__.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c
#: ports/esp32s2/common-hal/pulseio/PulseOut.c
@@ -446,7 +449,7 @@ msgstr ""
#: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format
msgid "Bit depth must be from 1 to 6 inclusive, not %d"
-msgstr ""
+msgstr "A profundidade dos bits deve ser de 1 até 6 inclusive, porém não %d"
#: shared-bindings/audiobusio/PDMIn.c
msgid "Bit depth must be multiple of 8."
@@ -509,7 +512,8 @@ msgstr "O comprimento do Buffer deve ser um múltiplo de 512"
msgid "Buffer must be a multiple of 512 bytes"
msgstr "O buffer deve ser um múltiplo de 512 bytes"
-#: shared-bindings/bitbangio/I2C.c shared-bindings/busio/I2C.c
+#: shared-bindings/bitbangio/I2C.c shared-bindings/busdevice/I2CDevice.c
+#: shared-bindings/busio/I2C.c
msgid "Buffer must be at least length 1"
msgstr "O comprimento do buffer deve ter pelo menos 1"
@@ -862,6 +866,10 @@ msgstr "Um UUID é necessário"
msgid "Expected an Address"
msgstr "Um endereço esperado"
+#: shared-bindings/alarm/__init__.c
+msgid "Expected an alarm"
+msgstr ""
+
#: shared-module/_pixelbuf/PixelBuf.c
#, c-format
msgid "Expected tuple of length %d, got %d"
@@ -875,6 +883,10 @@ msgstr "Anúncios estendidos não compatíveis com a resposta da varredura."
msgid "FFT is defined for ndarrays only"
msgstr "O FFT é definido apenas para ndarrays"
+#: extmod/ulab/code/fft/fft.c
+msgid "FFT is implemented for linear arrays only"
+msgstr "O FFT é implementado apenas para matrizes lineares"
+
#: ports/esp32s2/common-hal/socketpool/Socket.c
msgid "Failed SSL handshake"
msgstr "Houve uma falha no handshake do SSL"
@@ -1005,6 +1017,10 @@ msgstr "Erro de inicialização do I2C"
msgid "I2SOut not available"
msgstr "O I2SOut não está disponível"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "IOs 0, 2 & 4 do not support internal pullup in sleep"
+msgstr ""
+
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
@@ -1022,6 +1038,10 @@ msgstr ""
msgid "Incorrect buffer size"
msgstr "O tamanho do buffer está incorreto"
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "Initialization failed due to lack of memory"
+msgstr "A inicialização falhou devido à falta de memória"
+
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
msgid "Input taking too long"
msgstr "A entrada está demorando demais"
@@ -1102,6 +1122,7 @@ msgid "Invalid byteorder string"
msgstr "A cadeia de bytes é inválida"
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
msgid "Invalid capture period. Valid range: 1 - 500"
msgstr "O período de captura é inválido. O intervalo válido é: 1 - 500"
@@ -1278,6 +1299,10 @@ msgstr "Deve informar os pinos MISO ou MOSI"
msgid "Must use a multiple of 6 rgb pins, not %d"
msgstr "Deve utilizar um múltiplo de 6 pinos rgb, não %d"
+#: ports/esp32s2/common-hal/nvm/ByteArray.c
+msgid "NVS Error"
+msgstr "Erro NVS"
+
#: py/parse.c
msgid "Name too long"
msgstr "Nome muito longo"
@@ -1296,6 +1321,11 @@ msgstr "Nenhum DAC no chip"
msgid "No DMA channel found"
msgstr "Nenhum canal DMA encontrado"
+#: shared-module/busdevice/I2CDevice.c
+#, c-format
+msgid "No I2C device at address: %x"
+msgstr ""
+
#: ports/esp32s2/common-hal/busio/SPI.c ports/mimxrt10xx/common-hal/busio/SPI.c
#: ports/stm/common-hal/busio/SPI.c
msgid "No MISO Pin"
@@ -1429,14 +1459,14 @@ msgstr "A paridade ímpar não é compatível"
msgid "Only 8 or 16 bit mono with "
msgstr "Apenas mono com 8 ou 16 bits com "
-#: ports/esp32s2/common-hal/socketpool/SocketPool.c
-msgid "Only IPv4 SOCK_STREAM sockets supported"
-msgstr "São suportados apenas soquetes IPv4 SOCK_STREAM"
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr "Somente os endereços IPv4 são suportados"
+#: ports/esp32s2/common-hal/socketpool/SocketPool.c
+msgid "Only IPv4 sockets supported"
+msgstr "Apenas soquetes IPv4 são suportados"
+
#: shared-module/displayio/OnDiskBitmap.c
#, c-format
msgid ""
@@ -1454,6 +1484,10 @@ msgstr ""
"São compatíveis apenas os BMPs monocromáticos, indexados em 4bpp ou 8bpp e "
"16bpp ou superior: determinado %d bpp"
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "Only one alarm.time alarm can be set."
+msgstr ""
+
#: shared-module/displayio/ColorConverter.c
msgid "Only one color can be transparent at a time"
msgstr "Apenas uma cor pode ser transparente de cada vez"
@@ -1515,6 +1549,10 @@ msgstr "O pino deve ser compatível com as interrupções do hardware"
msgid "Pin number already reserved by EXTI"
msgstr "Número do PIN já está reservado através da EXTI"
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "PinAlarm not yet implemented"
+msgstr ""
+
#: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format
msgid ""
@@ -1586,7 +1624,7 @@ msgstr "A definição da inversão do RS485 quando não está no modo RS485"
msgid "RTC calibration is not supported on this board"
msgstr "A calibração RTC não é suportada nesta placa"
-#: shared-bindings/time/__init__.c
+#: shared-bindings/alarm/time/TimeAlarm.c shared-bindings/time/__init__.c
msgid "RTC is not supported on this board"
msgstr "O RTC não é suportado nesta placa"
@@ -1732,6 +1770,10 @@ msgstr "Transmita o método ausente readinto() ou write()."
msgid "Supply at least one UART pin"
msgstr "Forneça pelo menos um pino UART"
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Supply one of monotonic_time or epoch_time"
+msgstr ""
+
#: shared-bindings/gnss/GNSS.c
msgid "System entry must be gnss.SatelliteSystem"
msgstr "A entrada no sistema deve ser gnss.SatelliteSystem"
@@ -1804,6 +1846,10 @@ msgstr "O valor do bloco está fora dos limites"
msgid "Tile width must exactly divide bitmap width"
msgstr "A largura do bloco deve dividir exatamente com a largura do bitmap"
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Time is in the past."
+msgstr ""
+
#: ports/nrf/common-hal/_bleio/Adapter.c
#, c-format
msgid "Timeout is too long: Maximum timeout length is %d seconds"
@@ -2006,7 +2052,7 @@ msgstr "O tempo limite de leitura da tensão expirou"
msgid "WARNING: Your code filename has two extensions\n"
msgstr "AVISO: Seu arquivo de código tem duas extensões\n"
-#: shared-bindings/watchdog/WatchDogTimer.c
+#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "WatchDogTimer cannot be deinitialized once mode is set to RESET"
msgstr ""
"O WatchDogTimer não pode ser não-inicializado uma vez que o modo é definido "
@@ -2095,10 +2141,6 @@ msgstr "endereço fora dos limites"
msgid "addresses is empty"
msgstr "os endereços estão vazios"
-#: extmod/ulab/code/vector/vectorise.c
-msgid "arctan2 is implemented for scalars and ndarrays only"
-msgstr "O arctan2 está implementado apenas para escalares e ndarrays"
-
#: py/modbuiltins.c
msgid "arg is an empty sequence"
msgstr "o arg é uma sequência vazia"
@@ -2107,6 +2149,10 @@ msgstr "o arg é uma sequência vazia"
msgid "argsort argument must be an ndarray"
msgstr "O argumento argsort deve ser um ndarray"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "argsort is not implemented for flattened arrays"
+msgstr "argsort não é implementado para matrizes achatadas"
+
#: py/runtime.c
msgid "argument has wrong type"
msgstr "argumento tem tipo errado"
@@ -2124,15 +2170,23 @@ msgstr "o argumento num/tipos não combinam"
msgid "argument should be a '%q' not a '%q'"
msgstr "o argumento deve ser um '%q' e não um '%q'"
-#: extmod/ulab/code/linalg/linalg.c
+#: extmod/ulab/code/linalg/linalg.c extmod/ulab/code/numerical/numerical.c
msgid "arguments must be ndarrays"
msgstr "os argumentos devem ser ndarrays"
+#: extmod/ulab/code/ndarray.c
+msgid "array and index length must be equal"
+msgstr "a matriz e comprimento do índice devem ser iguais"
+
#: py/objarray.c shared-bindings/nvm/ByteArray.c
msgid "array/bytes required on right side"
msgstr "matriz/bytes são necessários no lado direito"
#: extmod/ulab/code/numerical/numerical.c
+msgid "attempt to get (arg)min/(arg)max of empty sequence"
+msgstr "tentativa de obter (arg)min/(arg)max da sequência vazia"
+
+#: extmod/ulab/code/numerical/numerical.c
msgid "attempt to get argmin/argmax of an empty sequence"
msgstr "tente obter argmin/argmax de uma sequência vazia"
@@ -2141,16 +2195,16 @@ msgid "attributes not supported yet"
msgstr "atributos ainda não suportados"
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, None, or 1"
-msgstr "o eixo deve ser -1, 0, Nenhum ou 1"
+msgid "axis is out of bounds"
+msgstr "o eixo está fora dos limites"
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, or 1"
-msgstr "o eixo deve ser -1, 0 ou 1"
+msgid "axis must be None, or an integer"
+msgstr "eixo deve ser Nenhum ou um número inteiro"
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be None, 0, or 1"
-msgstr "o eixo deve ser Nenhum, 0 ou 1"
+msgid "axis too long"
+msgstr "o eixo é muito longo"
#: py/builtinevex.c
msgid "bad compile mode"
@@ -2357,6 +2411,10 @@ msgid ""
msgstr ""
"não é possível alternar da especificação de campo manual para a automática"
+#: extmod/ulab/code/ndarray_operators.c
+msgid "cannot cast output with casting rule"
+msgstr "não pode lançar a saída com a regra de fundição"
+
#: py/objtype.c
msgid "cannot create '%q' instances"
msgstr "não é possível criar instâncias '%q'"
@@ -2373,11 +2431,6 @@ msgstr "não pode importar nome %q"
msgid "cannot perform relative import"
msgstr "não pode executar a importação relativa"
-#: extmod/ulab/code/ndarray.c
-msgid "cannot reshape array (incompatible input/output shape)"
-msgstr ""
-"não é possível remodelar a matriz (formato de entrada/saída incompatível)"
-
#: py/emitnative.c
msgid "casting"
msgstr "fundição"
@@ -2452,10 +2505,6 @@ msgstr "os argumentos convolutivos devem ser ndarrays"
msgid "convolve arguments must not be empty"
msgstr "os argumentos convolutivos não devem estar vazios"
-#: extmod/ulab/code/ndarray.c
-msgid "could not broadast input array from shape"
-msgstr "não foi possível transmitir a matriz da entrada a partir da forma"
-
#: extmod/ulab/code/poly/poly.c
msgid "could not invert Vandermonde matrix"
msgstr "não foi possível inverter a matriz Vandermonde"
@@ -2464,6 +2513,10 @@ msgstr "não foi possível inverter a matriz Vandermonde"
msgid "couldn't determine SD card version"
msgstr "não foi possível determinar a versão do cartão SD"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "cross is defined for 1D arrays of length 3"
+msgstr "a cruz é definida para matrizes 1D de comprimento 3"
+
#: extmod/ulab/code/approx/approx.c
msgid "data must be iterable"
msgstr "os dados devem ser iteráveis"
@@ -2472,10 +2525,6 @@ msgstr "os dados devem ser iteráveis"
msgid "data must be of equal length"
msgstr "os dados devem ser de igual comprimento"
-#: extmod/ulab/code/numerical/numerical.c
-msgid "ddof must be smaller than length of data set"
-msgstr "O ddof deve ser menor que o comprimento do conjunto dos dados"
-
#: py/parsenum.c
msgid "decimal numbers not supported"
msgstr "os números decimais não são compatíveis"
@@ -2508,6 +2557,10 @@ msgstr "sequência da atualização dict tem o comprimento errado"
msgid "diff argument must be an ndarray"
msgstr "O argumento diff deve ser um ndarray"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "differentiation order out of range"
+msgstr "ordem de diferenciação fora do alcance"
+
#: py/modmath.c py/objfloat.c py/objint_longlong.c py/objint_mpz.c py/runtime.c
#: shared-bindings/math/__init__.c
msgid "division by zero"
@@ -2537,6 +2590,10 @@ msgstr "final de formato enquanto procura pelo especificador de conversão"
msgid "end_x should be an int"
msgstr "end_x deve ser um int"
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "epoch_time not supported on this board"
+msgstr ""
+
#: ports/nrf/common-hal/busio/UART.c
#, c-format
msgid "error = 0x%08lX"
@@ -2623,6 +2680,10 @@ msgstr "o primeiro argumento deve ser chamável"
msgid "first argument must be a function"
msgstr "o primeiro argumento deve ser uma função"
+#: extmod/ulab/code/ulab_create.c
+msgid "first argument must be a tuple of ndarrays"
+msgstr "o primeiro argumento deve ser um tuple de ndarrays"
+
#: extmod/ulab/code/ndarray.c
msgid "first argument must be an iterable"
msgstr "o primeiro argumento deve ser um iterável"
@@ -2676,9 +2737,9 @@ msgstr "A função obteve vários valores para o argumento '%q'"
msgid "function has the same sign at the ends of interval"
msgstr "a função tem o mesmo sinal nas extremidades do intervalo"
-#: extmod/ulab/code/compare/compare.c
-msgid "function is implemented for scalars and ndarrays only"
-msgstr "A função foi implementada apenas para escalares e ndarrays"
+#: extmod/ulab/code/ndarray.c
+msgid "function is defined for ndarrays only"
+msgstr "A função é definida apenas para ndarrays"
#: py/argcheck.c
#, c-format
@@ -2747,6 +2808,7 @@ msgstr "preenchimento incorreto"
msgid "index is out of bounds"
msgstr "o índice está fora dos limites"
+#: extmod/ulab/code/numerical/numerical.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c py/obj.c
msgid "index out of range"
msgstr "Ãndice fora do intervalo"
@@ -2771,6 +2833,10 @@ msgstr "O comprimento do initial_value está errado"
msgid "inline assembler must be a function"
msgstr "o assembler em linha deve ser uma função"
+#: extmod/ulab/code/ndarray.c
+msgid "input and output shapes are not compatible"
+msgstr "as formas de entrada e saída não são compatíveis"
+
#: extmod/ulab/code/ulab_create.c
msgid "input argument must be an integer or a 2-tuple"
msgstr "o argumento da entrada deve ser um número inteiro ou uma tupla de 2"
@@ -2779,6 +2845,10 @@ msgstr "o argumento da entrada deve ser um número inteiro ou uma tupla de 2"
msgid "input array length must be power of 2"
msgstr "comprimento da matriz da entrada deve ter potência de 2"
+#: extmod/ulab/code/ulab_create.c
+msgid "input arrays are not compatible"
+msgstr "as matrizes da entrada não são compatíveis"
+
#: extmod/ulab/code/poly/poly.c
msgid "input data must be an iterable"
msgstr "os dados da entrada devem ser iteráveis"
@@ -2791,6 +2861,22 @@ msgstr "a matriz da entrada é assimétrica"
msgid "input matrix is singular"
msgstr "a matriz da entrada é singular"
+#: extmod/ulab/code/user/user.c
+msgid "input must be a dense ndarray"
+msgstr "a entrada deve ser um ndarray denso"
+
+#: extmod/ulab/code/ulab_create.c
+msgid "input must be a tensor of rank 2"
+msgstr "a entrada dos dados deve ser um tensor de nível 2"
+
+#: extmod/ulab/code/ulab_create.c extmod/ulab/code/user/user.c
+msgid "input must be an ndarray"
+msgstr "a entrada deve ser um ndarray"
+
+#: extmod/ulab/code/filter/filter.c
+msgid "input must be one-dimensional"
+msgstr "a entrada deve ser unidimensional"
+
#: extmod/ulab/code/linalg/linalg.c
msgid "input must be square matrix"
msgstr "a entrada deve ser uma matriz quadrada"
@@ -2803,6 +2889,10 @@ msgstr "A entrada deve ser tupla, lista, intervalo ou matriz"
msgid "input vectors must be of equal length"
msgstr "os vetores da entrada devem ter o mesmo comprimento"
+#: extmod/ulab/code/poly/poly.c
+msgid "inputs are not iterable"
+msgstr "as entradas não são iteráveis"
+
#: py/parsenum.c
msgid "int() arg 2 must be >= 2 and <= 36"
msgstr "int() arg 2 deve ser >= 2 e <= 36"
@@ -2873,6 +2963,10 @@ msgstr "sintaxe inválida para o número inteiro com base %d"
msgid "invalid syntax for number"
msgstr "sintaxe inválida para o número"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "io must be rtc io"
+msgstr ""
+
#: py/objtype.c
msgid "issubclass() arg 1 must be a class"
msgstr "issubclass() arg 1 deve ser uma classe"
@@ -2974,6 +3068,10 @@ msgstr "o max_length deve ser 0-%d quando Fixed_length for %s"
msgid "max_length must be > 0"
msgstr "max_length deve ser > 0"
+#: extmod/ulab/code/ndarray.c
+msgid "maximum number of dimensions is 4"
+msgstr "O número máximo de dimensões são 4"
+
#: py/runtime.c
msgid "maximum recursion depth exceeded"
msgstr "a recursão máxima da profundidade foi excedida"
@@ -3025,10 +3123,6 @@ msgstr "deve levantar um objeto"
msgid "must use keyword argument for key function"
msgstr "deve usar o argumento da palavra-chave para a função da chave"
-#: extmod/ulab/code/numerical/numerical.c
-msgid "n must be between 0, and 9"
-msgstr "n deve estar entre 0 e 9"
-
#: py/runtime.c
msgid "name '%q' is not defined"
msgstr "o nome '%q' não está definido"
@@ -3111,6 +3205,10 @@ msgstr "um arg sem palavra-chave após */ **"
msgid "non-keyword arg after keyword arg"
msgstr "um arg não-palavra-chave após a palavra-chave arg"
+#: extmod/ulab/code/linalg/linalg.c
+msgid "norm is defined for 1D and 2D arrays"
+msgstr "a norma é definida para matrizes 1D e 2D"
+
#: shared-bindings/_bleio/UUID.c
msgid "not a 128-bit UUID"
msgstr "não é um UUID com 128 bits"
@@ -3123,10 +3221,6 @@ msgstr "nem todos os argumentos são convertidos durante a formatação da strin
msgid "not enough arguments for format string"
msgstr "argumentos insuficientes para o formato da string"
-#: extmod/ulab/code/poly/poly.c
-msgid "number of arguments must be 2, or 3"
-msgstr "a quantidade dos argumentos deve ser 2 ou 3"
-
#: extmod/ulab/code/ulab_create.c
msgid "number of points must be at least 2"
msgstr "a quantidade dos pontos deve ser pelo menos 2"
@@ -3179,6 +3273,10 @@ msgstr "é necessário objeto com protocolo do buffer"
msgid "odd-length string"
msgstr "sequência com comprimento ímpar"
+#: extmod/ulab/code/ulab_create.c
+msgid "offset is too large"
+msgstr "o offset é muito grande"
+
#: py/objstr.c py/objstrunicode.c
msgid "offset out of bounds"
msgstr "desvio fora dos limites"
@@ -3202,6 +3300,14 @@ msgstr ""
msgid "operands could not be broadcast together"
msgstr "os operandos não puderam ser transmitidos juntos"
+#: extmod/ulab/code/ndarray.c
+msgid "operation is implemented for 1D Boolean arrays only"
+msgstr "A operação é implementada apenas para matrizes booleanas 1D"
+
+#: extmod/ulab/code/numerical/numerical.c
+msgid "operation is not implemented for flattened array"
+msgstr "a operação não é implementada para a matriz achatada"
+
#: extmod/ulab/code/numerical/numerical.c
msgid "operation is not implemented on ndarrays"
msgstr "a operação não foi implementada nos ndarrays"
@@ -3296,6 +3402,7 @@ msgstr "O terceiro argumento pow() não pode ser 0"
msgid "pow() with 3 arguments requires integers"
msgstr "o pow() com 3 argumentos requer números inteiros"
+#: ports/esp32s2/boards/adafruit_magtag_2.9_grayscale/mpconfigboard.h
#: ports/esp32s2/boards/adafruit_metro_esp32s2/mpconfigboard.h
#: ports/esp32s2/boards/electroniccats_bastwifi/mpconfigboard.h
#: ports/esp32s2/boards/espressif_kaluga_1/mpconfigboard.h
@@ -3339,6 +3446,10 @@ msgstr "importação relativa"
msgid "requested length %d but object has length %d"
msgstr "o comprimento solicitado %d, porém o objeto tem comprimento %d"
+#: extmod/ulab/code/ndarray_operators.c
+msgid "results cannot be cast to specified type"
+msgstr "os resultados não podem ser lançados para um determinado tipo"
+
#: py/compile.c
msgid "return annotation must be an identifier"
msgstr "a anotação do retorno deve ser um identificador"
@@ -3357,9 +3468,9 @@ msgstr "rgb_pins[%d] duplica outra atribuição dos pinos"
msgid "rgb_pins[%d] is not on the same port as clock"
msgstr "rgb_pins[%d] não está na mesma porta que o clock"
-#: extmod/ulab/code/ndarray.c
-msgid "right hand side must be an ndarray, or a scalar"
-msgstr "o lado direito deve ser um ndarray ou um escalar"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "roll argument must be an ndarray"
+msgstr "argumento de enrolar deve ser um ndarray"
#: py/objstr.c
msgid "rsplit(None,n)"
@@ -3386,8 +3497,8 @@ msgid "script compilation not supported"
msgstr "compilação de script não suportada"
#: extmod/ulab/code/ndarray.c
-msgid "shape must be a 2-tuple"
-msgstr "a forma deve ser uma tupla de 2"
+msgid "shape must be a tuple"
+msgstr "a forma deve ser uma tupla"
#: py/objstr.c
msgid "sign not allowed in string format specifier"
@@ -3429,10 +3540,6 @@ msgstr "reinicialização soft\n"
msgid "sort argument must be an ndarray"
msgstr "o argumento da classificação deve ser um ndarray"
-#: extmod/ulab/code/numerical/numerical.c
-msgid "sorted axis can't be longer than 65535"
-msgstr "o eixo ordenado não pode ser maior do que 65535"
-
#: extmod/ulab/code/filter/filter.c
msgid "sos array must be of shape (n_section, 6)"
msgstr "o sos da matriz deve estar na forma (n_section, 6)"
@@ -3513,6 +3620,7 @@ msgstr "Limite deve estar no alcance de 0-65536"
msgid "time.struct_time() takes a 9-sequence"
msgstr "time.struct_time() leva uma sequência com 9"
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "timeout duration exceeded the maximum supported value"
msgstr "a duração do tempo limite excedeu o valor máximo suportado"
@@ -3537,6 +3645,10 @@ msgstr "o tempo limite na espera pelo cartão v2"
msgid "timestamp out of range for platform time_t"
msgstr "timestamp fora do intervalo para a plataforma time_t"
+#: extmod/ulab/code/ndarray.c
+msgid "tobytes can be invoked for dense arrays only"
+msgstr "os tobytes podem ser invocados apenas nas matrizes densas"
+
#: shared-module/struct/__init__.c
msgid "too many arguments provided with the given format"
msgstr "Muitos argumentos fornecidos com o formato dado"
@@ -3554,6 +3666,10 @@ msgstr "valores demais para descompactar (esperado %d)"
msgid "trapz is defined for 1D arrays of equal length"
msgstr "o trapz está definido para 1D arrays de igual tamanho"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "trigger level must be 0 or 1"
+msgstr ""
+
#: extmod/ulab/code/linalg/linalg.c
msgid "tuple index out of range"
msgstr "o índice da tupla está fora do intervalo"
@@ -3696,6 +3812,14 @@ msgstr "o value_count deve ser > 0"
msgid "vectors must have same lengths"
msgstr "os vetores devem ter os mesmos comprimentos"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "wakeup conflict"
+msgstr ""
+
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "watchdog not initialized"
+msgstr "o watchdog não foi inicializado"
+
#: shared-bindings/watchdog/WatchDogTimer.c
msgid "watchdog timeout must be greater than 0"
msgstr "o tempo limite do watchdog deve ser maior que 0"
@@ -3708,13 +3832,13 @@ msgstr "a largura deve ser maior que zero"
msgid "window must be <= interval"
msgstr "a janela deve ser <= intervalo"
-#: extmod/ulab/code/linalg/linalg.c
-msgid "wrong argument type"
-msgstr "tipo do argumento errado"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "wrong axis index"
+msgstr "índice do eixo errado"
-#: extmod/ulab/code/ndarray.c
-msgid "wrong index type"
-msgstr "tipo do índice errado"
+#: extmod/ulab/code/ulab_create.c
+msgid "wrong axis specified"
+msgstr "um eixo errado foi definido"
#: extmod/ulab/code/vector/vectorise.c
msgid "wrong input type"
@@ -3764,6 +3888,55 @@ msgstr "zi deve ser de um tipo float"
msgid "zi must be of shape (n_section, 2)"
msgstr "zi deve estar na forma (n_section, 2)"
+#~ msgid "Only IPv4 SOCK_STREAM sockets supported"
+#~ msgstr "São suportados apenas soquetes IPv4 SOCK_STREAM"
+
+#~ msgid "arctan2 is implemented for scalars and ndarrays only"
+#~ msgstr "O arctan2 está implementado apenas para escalares e ndarrays"
+
+#~ msgid "axis must be -1, 0, None, or 1"
+#~ msgstr "o eixo deve ser -1, 0, Nenhum ou 1"
+
+#~ msgid "axis must be -1, 0, or 1"
+#~ msgstr "o eixo deve ser -1, 0 ou 1"
+
+#~ msgid "axis must be None, 0, or 1"
+#~ msgstr "o eixo deve ser Nenhum, 0 ou 1"
+
+#~ msgid "cannot reshape array (incompatible input/output shape)"
+#~ msgstr ""
+#~ "não é possível remodelar a matriz (formato de entrada/saída incompatível)"
+
+#~ msgid "could not broadast input array from shape"
+#~ msgstr "não foi possível transmitir a matriz da entrada a partir da forma"
+
+#~ msgid "ddof must be smaller than length of data set"
+#~ msgstr "O ddof deve ser menor que o comprimento do conjunto dos dados"
+
+#~ msgid "function is implemented for scalars and ndarrays only"
+#~ msgstr "A função foi implementada apenas para escalares e ndarrays"
+
+#~ msgid "n must be between 0, and 9"
+#~ msgstr "n deve estar entre 0 e 9"
+
+#~ msgid "number of arguments must be 2, or 3"
+#~ msgstr "a quantidade dos argumentos deve ser 2 ou 3"
+
+#~ msgid "right hand side must be an ndarray, or a scalar"
+#~ msgstr "o lado direito deve ser um ndarray ou um escalar"
+
+#~ msgid "shape must be a 2-tuple"
+#~ msgstr "a forma deve ser uma tupla de 2"
+
+#~ msgid "sorted axis can't be longer than 65535"
+#~ msgstr "o eixo ordenado não pode ser maior do que 65535"
+
+#~ msgid "wrong argument type"
+#~ msgstr "tipo do argumento errado"
+
+#~ msgid "wrong index type"
+#~ msgstr "tipo do índice errado"
+
#~ msgid "specify size or data, but not both"
#~ msgstr "defina o tamanho ou os dados, porém não ambos"
diff --git a/locale/sv.po b/locale/sv.po
index be7eb0894..db8d6a2d9 100644
--- a/locale/sv.po
+++ b/locale/sv.po
@@ -5,8 +5,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-04 21:18+0530\n"
-"PO-Revision-Date: 2020-11-05 20:26+0000\n"
+"POT-Creation-Date: 2020-11-27 23:57-0500\n"
+"PO-Revision-Date: 2020-11-30 18:06+0000\n"
"Last-Translator: Jonny Bergdahl <jonny@bergdahl.it>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: sv\n"
@@ -14,7 +14,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.3.2\n"
+"X-Generator: Weblate 4.4-dev\n"
#: main.c
msgid ""
@@ -300,9 +300,11 @@ msgstr "All I2C-kringutrustning används"
msgid "All I2C peripherals are in use"
msgstr "All I2C-kringutrustning används"
-#: ports/esp32s2/peripherals/pcnt_handler.c
+#: ports/esp32s2/common-hal/countio/Counter.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/rotaryio/IncrementalEncoder.c
msgid "All PCNT units in use"
-msgstr ""
+msgstr "Alla PCNT-enheter används"
#: ports/atmel-samd/common-hal/canio/Listener.c
#: ports/esp32s2/common-hal/canio/Listener.c
@@ -336,6 +338,7 @@ msgstr "Alla timers för denna pinne är i bruk"
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
#: ports/cxd56/common-hal/pulseio/PulseOut.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
#: ports/esp32s2/common-hal/neopixel_write/__init__.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c
#: ports/esp32s2/common-hal/pulseio/PulseOut.c
@@ -438,7 +441,7 @@ msgstr "Bitklocka och ordval måste dela en klockenhet"
#: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format
msgid "Bit depth must be from 1 to 6 inclusive, not %d"
-msgstr ""
+msgstr "Bitdjup måste vara inom 1 till 6, inte %d"
#: shared-bindings/audiobusio/PDMIn.c
msgid "Bit depth must be multiple of 8."
@@ -501,7 +504,8 @@ msgstr "Buffertlängd måste vara en multipel av 512"
msgid "Buffer must be a multiple of 512 bytes"
msgstr "Bufferten måste vara en multipel av 512 byte"
-#: shared-bindings/bitbangio/I2C.c shared-bindings/busio/I2C.c
+#: shared-bindings/bitbangio/I2C.c shared-bindings/busdevice/I2CDevice.c
+#: shared-bindings/busio/I2C.c
msgid "Buffer must be at least length 1"
msgstr "Bufferten måste ha minst längd 1"
@@ -853,6 +857,10 @@ msgstr "Förväntade en UUID"
msgid "Expected an Address"
msgstr "Förväntade en adress"
+#: shared-bindings/alarm/__init__.c
+msgid "Expected an alarm"
+msgstr ""
+
#: shared-module/_pixelbuf/PixelBuf.c
#, c-format
msgid "Expected tuple of length %d, got %d"
@@ -866,6 +874,10 @@ msgstr "Utökad annonsering i kombination med skanningssvar stöds inte."
msgid "FFT is defined for ndarrays only"
msgstr "FFT är enbart definierade för ndarrays"
+#: extmod/ulab/code/fft/fft.c
+msgid "FFT is implemented for linear arrays only"
+msgstr "FTT är enbart implementerad för linjära matriser"
+
#: ports/esp32s2/common-hal/socketpool/Socket.c
msgid "Failed SSL handshake"
msgstr "Misslyckad SSL-handskakning"
@@ -994,6 +1006,10 @@ msgstr "I2C init-fel"
msgid "I2SOut not available"
msgstr "I2SOut är inte tillgängligt"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "IOs 0, 2 & 4 do not support internal pullup in sleep"
+msgstr ""
+
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
@@ -1011,6 +1027,10 @@ msgstr ""
msgid "Incorrect buffer size"
msgstr "Fel buffertstorlek"
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "Initialization failed due to lack of memory"
+msgstr "Initieringen misslyckades på grund av minnesbrist"
+
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
msgid "Input taking too long"
msgstr "Indata tar för lång tid"
@@ -1091,6 +1111,7 @@ msgid "Invalid byteorder string"
msgstr "Ogiltig byteorder-sträng"
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
msgid "Invalid capture period. Valid range: 1 - 500"
msgstr "Ogiltig inspelningsperiod. Giltigt intervall: 1 - 500"
@@ -1268,6 +1289,10 @@ msgstr "MÃ¥ste ange MISO- eller MOSI-pinne"
msgid "Must use a multiple of 6 rgb pins, not %d"
msgstr "Måste använda ett multipel av 6 rgb-pinnar, inte %d"
+#: ports/esp32s2/common-hal/nvm/ByteArray.c
+msgid "NVS Error"
+msgstr "NVS-fel"
+
#: py/parse.c
msgid "Name too long"
msgstr "Name är för långt"
@@ -1286,6 +1311,11 @@ msgstr "Ingen DAC på chipet"
msgid "No DMA channel found"
msgstr "Ingen DMA-kanal hittades"
+#: shared-module/busdevice/I2CDevice.c
+#, c-format
+msgid "No I2C device at address: %x"
+msgstr ""
+
#: ports/esp32s2/common-hal/busio/SPI.c ports/mimxrt10xx/common-hal/busio/SPI.c
#: ports/stm/common-hal/busio/SPI.c
msgid "No MISO Pin"
@@ -1420,14 +1450,14 @@ msgstr "Udda paritet stöds inte"
msgid "Only 8 or 16 bit mono with "
msgstr "Endast 8 eller 16 bitars mono med "
-#: ports/esp32s2/common-hal/socketpool/SocketPool.c
-msgid "Only IPv4 SOCK_STREAM sockets supported"
-msgstr "Endast IPv4 SOCK_STREAM sockets stöds"
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr "Endast IPv4-adresser stöds"
+#: ports/esp32s2/common-hal/socketpool/SocketPool.c
+msgid "Only IPv4 sockets supported"
+msgstr "Endast IPv4-socket stöds"
+
#: shared-module/displayio/OnDiskBitmap.c
#, c-format
msgid ""
@@ -1444,6 +1474,10 @@ msgstr ""
"Endast monokrom, indexerad 4 bpp eller 8 bpp och 16 bpp eller högre BMP: er "
"stöds: %d bpp angiven"
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "Only one alarm.time alarm can be set."
+msgstr ""
+
#: shared-module/displayio/ColorConverter.c
msgid "Only one color can be transparent at a time"
msgstr "Bara en färg kan vara genomskinlig i taget"
@@ -1503,6 +1537,10 @@ msgstr "Pinnen måste stödja hårdvaruavbrott"
msgid "Pin number already reserved by EXTI"
msgstr "PInn-nummer redan reserverat av EXTI"
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "PinAlarm not yet implemented"
+msgstr ""
+
#: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format
msgid ""
@@ -1572,7 +1610,7 @@ msgstr "RS485-inversion specificerad när den inte är i RS485-läge"
msgid "RTC calibration is not supported on this board"
msgstr "RTC-kalibrering stöds inte av detta kort"
-#: shared-bindings/time/__init__.c
+#: shared-bindings/alarm/time/TimeAlarm.c shared-bindings/time/__init__.c
msgid "RTC is not supported on this board"
msgstr "RTC stöds inte av detta kort"
@@ -1718,6 +1756,10 @@ msgstr "Stream saknar readinto() eller write() metod."
msgid "Supply at least one UART pin"
msgstr "Ange minst en UART-pinne"
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Supply one of monotonic_time or epoch_time"
+msgstr ""
+
#: shared-bindings/gnss/GNSS.c
msgid "System entry must be gnss.SatelliteSystem"
msgstr "Systeminträdet måste vara gnss. SatellitSystem"
@@ -1789,6 +1831,10 @@ msgstr "Tile-värde utanför intervall"
msgid "Tile width must exactly divide bitmap width"
msgstr "Tile-bredd måste vara jämnt delbar med bredd på bitmap"
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Time is in the past."
+msgstr ""
+
#: ports/nrf/common-hal/_bleio/Adapter.c
#, c-format
msgid "Timeout is too long: Maximum timeout length is %d seconds"
@@ -1988,7 +2034,7 @@ msgstr "Avläsning av spänning tog för lång tid"
msgid "WARNING: Your code filename has two extensions\n"
msgstr "VARNING: Ditt filnamn för kod har två tillägg\n"
-#: shared-bindings/watchdog/WatchDogTimer.c
+#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "WatchDogTimer cannot be deinitialized once mode is set to RESET"
msgstr "WatchDogTimer kan inte avinitialiseras när läget är inställt på RESET"
@@ -2073,10 +2119,6 @@ msgstr "adress utanför gränsen"
msgid "addresses is empty"
msgstr "adresserna är tomma"
-#: extmod/ulab/code/vector/vectorise.c
-msgid "arctan2 is implemented for scalars and ndarrays only"
-msgstr "arctan2 är enbart implementerad för scalar och ndarray"
-
#: py/modbuiltins.c
msgid "arg is an empty sequence"
msgstr "arg är en tom sekvens"
@@ -2085,6 +2127,10 @@ msgstr "arg är en tom sekvens"
msgid "argsort argument must be an ndarray"
msgstr "argumentet argsort måste vara en ndarray"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "argsort is not implemented for flattened arrays"
+msgstr "argsort är inte implementerad för tillplattade matriser"
+
#: py/runtime.c
msgid "argument has wrong type"
msgstr "argumentet har fel typ"
@@ -2102,15 +2148,23 @@ msgstr "argument antal/typ matchar inte"
msgid "argument should be a '%q' not a '%q'"
msgstr "argumentet skall vara en '%q', inte en '%q'"
-#: extmod/ulab/code/linalg/linalg.c
+#: extmod/ulab/code/linalg/linalg.c extmod/ulab/code/numerical/numerical.c
msgid "arguments must be ndarrays"
msgstr "argumenten måste vara ndarray"
+#: extmod/ulab/code/ndarray.c
+msgid "array and index length must be equal"
+msgstr "array och indexlängd måste vara lika"
+
#: py/objarray.c shared-bindings/nvm/ByteArray.c
msgid "array/bytes required on right side"
msgstr "array/bytes krävs på höger sida"
#: extmod/ulab/code/numerical/numerical.c
+msgid "attempt to get (arg)min/(arg)max of empty sequence"
+msgstr "försök att läsa (arg)min/(arg)max av tom sekvens"
+
+#: extmod/ulab/code/numerical/numerical.c
msgid "attempt to get argmin/argmax of an empty sequence"
msgstr "försök att få argmin/argmax för en tom sekvens"
@@ -2119,16 +2173,16 @@ msgid "attributes not supported yet"
msgstr "attribut stöds inte än"
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, None, or 1"
-msgstr "axis ska vara -1, 0, None eller 1"
+msgid "axis is out of bounds"
+msgstr "axis är utanför gränsen"
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, or 1"
-msgstr "axis ska vara -1, 0 eller 1"
+msgid "axis must be None, or an integer"
+msgstr "axis måste vara None eller ett heltal"
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be None, 0, or 1"
-msgstr "axis ska vara None, 0, eller 1"
+msgid "axis too long"
+msgstr "axis för lång"
#: py/builtinevex.c
msgid "bad compile mode"
@@ -2333,6 +2387,10 @@ msgid ""
msgstr ""
"kan inte byta från manuell fältspecifikation till automatisk fältnumrering"
+#: extmod/ulab/code/ndarray_operators.c
+msgid "cannot cast output with casting rule"
+msgstr "kan inte casta utdata med regel"
+
#: py/objtype.c
msgid "cannot create '%q' instances"
msgstr "kan inte skapa instanser av '%q'"
@@ -2349,10 +2407,6 @@ msgstr "kan inte importera namn %q"
msgid "cannot perform relative import"
msgstr "kan inte utföra relativ import"
-#: extmod/ulab/code/ndarray.c
-msgid "cannot reshape array (incompatible input/output shape)"
-msgstr "kan inte omforma matris (inkompatibel indata-/utdataform)"
-
#: py/emitnative.c
msgid "casting"
msgstr "casting inte implementerad"
@@ -2425,10 +2479,6 @@ msgstr "Argumenten convolve måste vara ndarray:er"
msgid "convolve arguments must not be empty"
msgstr "Argumenten convolve kan inte vara tomma"
-#: extmod/ulab/code/ndarray.c
-msgid "could not broadast input array from shape"
-msgstr "Kan inte sända indatamatris från form"
-
#: extmod/ulab/code/poly/poly.c
msgid "could not invert Vandermonde matrix"
msgstr "kan inte invertera Vandermonde-matris"
@@ -2437,6 +2487,10 @@ msgstr "kan inte invertera Vandermonde-matris"
msgid "couldn't determine SD card version"
msgstr "kan inte avgöra SD-kortversion"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "cross is defined for 1D arrays of length 3"
+msgstr "cross är definierad för 1D-matriser med längd 3"
+
#: extmod/ulab/code/approx/approx.c
msgid "data must be iterable"
msgstr "data måste vara itererbar"
@@ -2445,10 +2499,6 @@ msgstr "data måste vara itererbar"
msgid "data must be of equal length"
msgstr "data måste vara av samma längd"
-#: extmod/ulab/code/numerical/numerical.c
-msgid "ddof must be smaller than length of data set"
-msgstr "ddof måste vara mindre än längden på datauppsättningen"
-
#: py/parsenum.c
msgid "decimal numbers not supported"
msgstr "decimaltal stöds inte"
@@ -2481,6 +2531,10 @@ msgstr "uppdateringssekvensen för dict har fel längd"
msgid "diff argument must be an ndarray"
msgstr "argumentet diff måste vara en ndarray"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "differentiation order out of range"
+msgstr "differentieringsordning utanför intervallet"
+
#: py/modmath.c py/objfloat.c py/objint_longlong.c py/objint_mpz.c py/runtime.c
#: shared-bindings/math/__init__.c
msgid "division by zero"
@@ -2510,6 +2564,10 @@ msgstr "slut på format vid sökning efter konverteringsspecificerare"
msgid "end_x should be an int"
msgstr "color ska vara en int"
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "epoch_time not supported on this board"
+msgstr ""
+
#: ports/nrf/common-hal/busio/UART.c
#, c-format
msgid "error = 0x%08lX"
@@ -2596,6 +2654,10 @@ msgstr "första argumentet måste vara en callable"
msgid "first argument must be a function"
msgstr "första argumentet måste vara en funktion"
+#: extmod/ulab/code/ulab_create.c
+msgid "first argument must be a tuple of ndarrays"
+msgstr "första argumentet måste vara en tupel av ndarray"
+
#: extmod/ulab/code/ndarray.c
msgid "first argument must be an iterable"
msgstr "första argumentet måste vara en iterable"
@@ -2649,9 +2711,9 @@ msgstr "funktionen fick flera värden för argumentet '%q'"
msgid "function has the same sign at the ends of interval"
msgstr "funktionen har samma teckenvärden vid slutet av intervall"
-#: extmod/ulab/code/compare/compare.c
-msgid "function is implemented for scalars and ndarrays only"
-msgstr "funktionen är endast implementerad för scalar och ndarray"
+#: extmod/ulab/code/ndarray.c
+msgid "function is defined for ndarrays only"
+msgstr "funktionen är enbart definierad för ndarray"
#: py/argcheck.c
#, c-format
@@ -2720,6 +2782,7 @@ msgstr "felaktig utfyllnad"
msgid "index is out of bounds"
msgstr "index är utanför gränserna"
+#: extmod/ulab/code/numerical/numerical.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c py/obj.c
msgid "index out of range"
msgstr "index utanför intervallet"
@@ -2744,6 +2807,10 @@ msgstr "initial_value-längd är fel"
msgid "inline assembler must be a function"
msgstr "inline assembler måste vara en funktion"
+#: extmod/ulab/code/ndarray.c
+msgid "input and output shapes are not compatible"
+msgstr "indata- och utdataformer är inte kompatibla"
+
#: extmod/ulab/code/ulab_create.c
msgid "input argument must be an integer or a 2-tuple"
msgstr "indataargumentet måste vara ett heltal eller en 2-tupel"
@@ -2752,6 +2819,10 @@ msgstr "indataargumentet måste vara ett heltal eller en 2-tupel"
msgid "input array length must be power of 2"
msgstr "indataarraylängden måste vara en multipel av 2"
+#: extmod/ulab/code/ulab_create.c
+msgid "input arrays are not compatible"
+msgstr "indatamatriser är inte kompatibla"
+
#: extmod/ulab/code/poly/poly.c
msgid "input data must be an iterable"
msgstr "indata måste vara en iterable"
@@ -2764,6 +2835,22 @@ msgstr "indatamatrisen är asymmetrisk"
msgid "input matrix is singular"
msgstr "indatamatrisen är singulär"
+#: extmod/ulab/code/user/user.c
+msgid "input must be a dense ndarray"
+msgstr "indata måste vara en dense ndarray"
+
+#: extmod/ulab/code/ulab_create.c
+msgid "input must be a tensor of rank 2"
+msgstr "indata måste vara en tensor av rank 2"
+
+#: extmod/ulab/code/ulab_create.c extmod/ulab/code/user/user.c
+msgid "input must be an ndarray"
+msgstr "indata måste vara en ndarray"
+
+#: extmod/ulab/code/filter/filter.c
+msgid "input must be one-dimensional"
+msgstr "indata måste vara endimensionell"
+
#: extmod/ulab/code/linalg/linalg.c
msgid "input must be square matrix"
msgstr "indata måste vara kvadratmatris"
@@ -2776,6 +2863,10 @@ msgstr "indata måste vara tupel, lista, range, eller ndarray"
msgid "input vectors must be of equal length"
msgstr "indatavektorer måste ha samma längd"
+#: extmod/ulab/code/poly/poly.c
+msgid "inputs are not iterable"
+msgstr "indata är inte iterbara"
+
#: py/parsenum.c
msgid "int() arg 2 must be >= 2 and <= 36"
msgstr "int() arg 2 måste vara >= 2 och <= 36"
@@ -2846,6 +2937,10 @@ msgstr "ogiltig syntax för heltal med bas %d"
msgid "invalid syntax for number"
msgstr "ogiltig syntax för tal"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "io must be rtc io"
+msgstr ""
+
#: py/objtype.c
msgid "issubclass() arg 1 must be a class"
msgstr "issubclass() arg 1 måste vara en klass"
@@ -2947,6 +3042,10 @@ msgstr "max_length måste vara 0-%d när fixed_length är %s"
msgid "max_length must be > 0"
msgstr "max_length måste vara > 0"
+#: extmod/ulab/code/ndarray.c
+msgid "maximum number of dimensions is 4"
+msgstr "maximalt antal dimensioner är 4"
+
#: py/runtime.c
msgid "maximum recursion depth exceeded"
msgstr "maximal rekursionsdjup överskriden"
@@ -2996,10 +3095,6 @@ msgstr "måste ge ett objekt"
msgid "must use keyword argument for key function"
msgstr "måste använda nyckelordsargument för nyckelfunktion"
-#: extmod/ulab/code/numerical/numerical.c
-msgid "n must be between 0, and 9"
-msgstr "n måste vara mellan 0 och 9"
-
#: py/runtime.c
msgid "name '%q' is not defined"
msgstr "namnet '%q' är inte definierat"
@@ -3082,6 +3177,10 @@ msgstr "icke nyckelord arg efter * / **"
msgid "non-keyword arg after keyword arg"
msgstr "icke nyckelord arg efter nyckelord arg"
+#: extmod/ulab/code/linalg/linalg.c
+msgid "norm is defined for 1D and 2D arrays"
+msgstr "norm är definierad för 1D- och 2D-matriser"
+
#: shared-bindings/_bleio/UUID.c
msgid "not a 128-bit UUID"
msgstr "inte en 128-bitars UUID"
@@ -3094,10 +3193,6 @@ msgstr "inte alla argument omvandlade under strängformatering"
msgid "not enough arguments for format string"
msgstr "inte tillräckligt med argument för formatsträng"
-#: extmod/ulab/code/poly/poly.c
-msgid "number of arguments must be 2, or 3"
-msgstr "antal argument måste vara 2 eller 3"
-
#: extmod/ulab/code/ulab_create.c
msgid "number of points must be at least 2"
msgstr "antal punkter måste vara minst 2"
@@ -3150,6 +3245,10 @@ msgstr "objekt med buffertprotokoll krävs"
msgid "odd-length string"
msgstr "sträng har udda längd"
+#: extmod/ulab/code/ulab_create.c
+msgid "offset is too large"
+msgstr "offset är för stor"
+
#: py/objstr.c py/objstrunicode.c
msgid "offset out of bounds"
msgstr "offset utanför gränserna"
@@ -3172,6 +3271,14 @@ msgstr "endast segment med steg=1 (aka Ingen) stöds"
msgid "operands could not be broadcast together"
msgstr "operander kan inte sändas tillsammans"
+#: extmod/ulab/code/ndarray.c
+msgid "operation is implemented for 1D Boolean arrays only"
+msgstr "operationen är enbart implementerad för 1D Boolean-matriser"
+
+#: extmod/ulab/code/numerical/numerical.c
+msgid "operation is not implemented for flattened array"
+msgstr "operationen inte implementeras för tillplattad matris"
+
#: extmod/ulab/code/numerical/numerical.c
msgid "operation is not implemented on ndarrays"
msgstr "åtgärden är inte implementerad för ndarray:er"
@@ -3263,6 +3370,7 @@ msgstr "pow() 3: e argument kan inte vara 0"
msgid "pow() with 3 arguments requires integers"
msgstr "pow() med 3 argument kräver heltal"
+#: ports/esp32s2/boards/adafruit_magtag_2.9_grayscale/mpconfigboard.h
#: ports/esp32s2/boards/adafruit_metro_esp32s2/mpconfigboard.h
#: ports/esp32s2/boards/electroniccats_bastwifi/mpconfigboard.h
#: ports/esp32s2/boards/espressif_kaluga_1/mpconfigboard.h
@@ -3306,6 +3414,10 @@ msgstr "relativ import"
msgid "requested length %d but object has length %d"
msgstr "begärd längd %d men objektet har längden %d"
+#: extmod/ulab/code/ndarray_operators.c
+msgid "results cannot be cast to specified type"
+msgstr "resultaten kan inte castas till angiven typ"
+
#: py/compile.c
msgid "return annotation must be an identifier"
msgstr "retur-annotation måste vara en identifierare"
@@ -3324,9 +3436,9 @@ msgstr "rgb_pins[%d] duplicerar en annan pinntilldelning"
msgid "rgb_pins[%d] is not on the same port as clock"
msgstr "rgb_pins[%d] är inte på samma port som en klocka"
-#: extmod/ulab/code/ndarray.c
-msgid "right hand side must be an ndarray, or a scalar"
-msgstr "höger sida måste vara en ndarray, eller en scalar"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "roll argument must be an ndarray"
+msgstr "argumentet roll måste vara en ndarray"
#: py/objstr.c
msgid "rsplit(None,n)"
@@ -3353,8 +3465,8 @@ msgid "script compilation not supported"
msgstr "skriptkompilering stöds inte"
#: extmod/ulab/code/ndarray.c
-msgid "shape must be a 2-tuple"
-msgstr "shape måste vara en 2-tupel"
+msgid "shape must be a tuple"
+msgstr "shape måste vara en tuple"
#: py/objstr.c
msgid "sign not allowed in string format specifier"
@@ -3396,10 +3508,6 @@ msgstr "mjuk omstart\n"
msgid "sort argument must be an ndarray"
msgstr "argumentet sort måste vara en ndarray"
-#: extmod/ulab/code/numerical/numerical.c
-msgid "sorted axis can't be longer than 65535"
-msgstr "sorterad axel kan inte vara längre än 65535"
-
#: extmod/ulab/code/filter/filter.c
msgid "sos array must be of shape (n_section, 6)"
msgstr "sos array måste ha form (n_section, 6)"
@@ -3480,6 +3588,7 @@ msgstr "tröskelvärdet måste ligga i intervallet 0-65536"
msgid "time.struct_time() takes a 9-sequence"
msgstr "time.struct_time() kräver en 9-sekvens"
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "timeout duration exceeded the maximum supported value"
msgstr "timeout-längd överskred det maximala värde som stöds"
@@ -3504,6 +3613,10 @@ msgstr "timeout för v2-kort"
msgid "timestamp out of range for platform time_t"
msgstr "timestamp utom räckvidd för plattformens \"time_t\""
+#: extmod/ulab/code/ndarray.c
+msgid "tobytes can be invoked for dense arrays only"
+msgstr "tobyte kan enbart anropas för täta matriser"
+
#: shared-module/struct/__init__.c
msgid "too many arguments provided with the given format"
msgstr "för många argument för det givna formatet"
@@ -3521,6 +3634,10 @@ msgstr "för många värden att packa upp (förväntat %d)"
msgid "trapz is defined for 1D arrays of equal length"
msgstr "trapz är definierad för 1D-matriser med samma längd"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "trigger level must be 0 or 1"
+msgstr ""
+
#: extmod/ulab/code/linalg/linalg.c
msgid "tuple index out of range"
msgstr "tupelindex utanför intervallet"
@@ -3663,6 +3780,14 @@ msgstr "value_count måste vara > 0"
msgid "vectors must have same lengths"
msgstr "vektorer måste ha samma längd"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "wakeup conflict"
+msgstr ""
+
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "watchdog not initialized"
+msgstr "watchdog är inte initierad"
+
#: shared-bindings/watchdog/WatchDogTimer.c
msgid "watchdog timeout must be greater than 0"
msgstr "watchdog timeout måste vara större än 0"
@@ -3675,13 +3800,13 @@ msgstr "width måste vara större än noll"
msgid "window must be <= interval"
msgstr "window måste vara <= interval"
-#: extmod/ulab/code/linalg/linalg.c
-msgid "wrong argument type"
-msgstr "fel typ av argument"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "wrong axis index"
+msgstr "fel axelindex"
-#: extmod/ulab/code/ndarray.c
-msgid "wrong index type"
-msgstr "fel indextyp"
+#: extmod/ulab/code/ulab_create.c
+msgid "wrong axis specified"
+msgstr "fel axel angiven"
#: extmod/ulab/code/vector/vectorise.c
msgid "wrong input type"
@@ -3731,6 +3856,54 @@ msgstr "zi måste vara av typ float"
msgid "zi must be of shape (n_section, 2)"
msgstr "zi måste vara i formen (n_section, 2)"
+#~ msgid "Only IPv4 SOCK_STREAM sockets supported"
+#~ msgstr "Endast IPv4 SOCK_STREAM sockets stöds"
+
+#~ msgid "arctan2 is implemented for scalars and ndarrays only"
+#~ msgstr "arctan2 är enbart implementerad för scalar och ndarray"
+
+#~ msgid "axis must be -1, 0, None, or 1"
+#~ msgstr "axis ska vara -1, 0, None eller 1"
+
+#~ msgid "axis must be -1, 0, or 1"
+#~ msgstr "axis ska vara -1, 0 eller 1"
+
+#~ msgid "axis must be None, 0, or 1"
+#~ msgstr "axis ska vara None, 0, eller 1"
+
+#~ msgid "cannot reshape array (incompatible input/output shape)"
+#~ msgstr "kan inte omforma matris (inkompatibel indata-/utdataform)"
+
+#~ msgid "could not broadast input array from shape"
+#~ msgstr "Kan inte sända indatamatris från form"
+
+#~ msgid "ddof must be smaller than length of data set"
+#~ msgstr "ddof måste vara mindre än längden på datauppsättningen"
+
+#~ msgid "function is implemented for scalars and ndarrays only"
+#~ msgstr "funktionen är endast implementerad för scalar och ndarray"
+
+#~ msgid "n must be between 0, and 9"
+#~ msgstr "n måste vara mellan 0 och 9"
+
+#~ msgid "number of arguments must be 2, or 3"
+#~ msgstr "antal argument måste vara 2 eller 3"
+
+#~ msgid "right hand side must be an ndarray, or a scalar"
+#~ msgstr "höger sida måste vara en ndarray, eller en scalar"
+
+#~ msgid "shape must be a 2-tuple"
+#~ msgstr "shape måste vara en 2-tupel"
+
+#~ msgid "sorted axis can't be longer than 65535"
+#~ msgstr "sorterad axel kan inte vara längre än 65535"
+
+#~ msgid "wrong argument type"
+#~ msgstr "fel typ av argument"
+
+#~ msgid "wrong index type"
+#~ msgstr "fel indextyp"
+
#~ msgid "specify size or data, but not both"
#~ msgstr "ange storlek eller data, men inte båda"
diff --git a/locale/zh_Latn_pinyin.po b/locale/zh_Latn_pinyin.po
index 4ac1c3e1e..5ef4b0e2a 100644
--- a/locale/zh_Latn_pinyin.po
+++ b/locale/zh_Latn_pinyin.po
@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: circuitpython-cn\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-11-04 21:18+0530\n"
-"PO-Revision-Date: 2020-11-11 19:13+0000\n"
+"POT-Creation-Date: 2020-11-27 23:57-0500\n"
+"PO-Revision-Date: 2020-11-19 01:28+0000\n"
"Last-Translator: hexthat <hexthat@gmail.com>\n"
"Language-Team: Chinese Hanyu Pinyin\n"
"Language: zh_Latn_pinyin\n"
@@ -302,7 +302,9 @@ msgstr "suÇ’ yÇ’u CAN wài shè dÅu zài shÇ yòng zhÅng"
msgid "All I2C peripherals are in use"
msgstr "SuÇ’yÇ’u I2C wàiwéi qì zhèngzài shÇyòng"
-#: ports/esp32s2/peripherals/pcnt_handler.c
+#: ports/esp32s2/common-hal/countio/Counter.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/rotaryio/IncrementalEncoder.c
msgid "All PCNT units in use"
msgstr "suÇ’ yÇ’u zhèng zài shÇ yòng zhÅng de PCNT dÄn yuán"
@@ -338,6 +340,7 @@ msgstr "CÇ yÇn jiÇŽo de suÇ’yÇ’u jìshí qì zhèngzài shÇyòng"
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/atmel-samd/common-hal/pulseio/PulseOut.c
#: ports/cxd56/common-hal/pulseio/PulseOut.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
#: ports/esp32s2/common-hal/neopixel_write/__init__.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c
#: ports/esp32s2/common-hal/pulseio/PulseOut.c
@@ -440,7 +443,7 @@ msgstr "BÇtè shízhÅng hé dÄnzì xuÇŽnzé bìxÅ« gòngxiÇŽng shízhÅng dÄ
#: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format
msgid "Bit depth must be from 1 to 6 inclusive, not %d"
-msgstr ""
+msgstr "wèi shÄ“n dù bì xÅ« bÄo hán 1 dào 6, ér bù shì %d"
#: shared-bindings/audiobusio/PDMIn.c
msgid "Bit depth must be multiple of 8."
@@ -503,7 +506,8 @@ msgstr "HuÇŽn chÅng qÅ« cháng dù bì xÅ« wéi 512 de bèi shù"
msgid "Buffer must be a multiple of 512 bytes"
msgstr "HuÇŽn chÅng qÅ« bì xÅ« shì 512 zì jié de bèi shù"
-#: shared-bindings/bitbangio/I2C.c shared-bindings/busio/I2C.c
+#: shared-bindings/bitbangio/I2C.c shared-bindings/busdevice/I2CDevice.c
+#: shared-bindings/busio/I2C.c
msgid "Buffer must be at least length 1"
msgstr "HuÇŽnchÅng qÅ« bìxÅ« zhìshÇŽo chángdù 1"
@@ -851,6 +855,10 @@ msgstr "Yùqí UUID"
msgid "Expected an Address"
msgstr "Qídài yÄ«gè dìzhÇ"
+#: shared-bindings/alarm/__init__.c
+msgid "Expected an alarm"
+msgstr ""
+
#: shared-module/_pixelbuf/PixelBuf.c
#, c-format
msgid "Expected tuple of length %d, got %d"
@@ -864,6 +872,10 @@ msgstr "Bù zhīchí dài yǒu sǎomiáo xiǎngyìng de kuòzhǎn guǎngbò."
msgid "FFT is defined for ndarrays only"
msgstr "FFT jÇn wéi ndarrays dìng yì"
+#: extmod/ulab/code/fft/fft.c
+msgid "FFT is implemented for linear arrays only"
+msgstr ""
+
#: ports/esp32s2/common-hal/socketpool/Socket.c
msgid "Failed SSL handshake"
msgstr "SSL wòshǒu shībài"
@@ -992,6 +1004,10 @@ msgstr "I2C chÅ«shÇhuà cuòwù"
msgid "I2SOut not available"
msgstr "I2SOut bù kě yòng"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "IOs 0, 2 & 4 do not support internal pullup in sleep"
+msgstr ""
+
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
@@ -1009,6 +1025,10 @@ msgstr ""
msgid "Incorrect buffer size"
msgstr "HuÇŽnchÅng qÅ« dàxiÇŽo bù zhèngquè"
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "Initialization failed due to lack of memory"
+msgstr "yóu yú nèi cún bù zú, chÅ« shÇ huà shÄ« bài"
+
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
msgid "Input taking too long"
msgstr "ShÅ«rù shíjiÄnguò zhÇŽng"
@@ -1089,6 +1109,7 @@ msgid "Invalid byteorder string"
msgstr "Wúxiào de zì jié shùnxù zìfú chuàn"
#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c
+#: ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
msgid "Invalid capture period. Valid range: 1 - 500"
msgstr "Wúxiào de bÇ”huò zhÅuqí. YÇ’uxiào fànwéi: 1-500"
@@ -1265,6 +1286,10 @@ msgstr "BìxÅ« tígÅng MISO huò MOSI yÇn jiÇŽo"
msgid "Must use a multiple of 6 rgb pins, not %d"
msgstr "bì xÅ« shÇ yòng 6 RGB yÇn jiÇŽo de bèi shù, ér bù shì %d"
+#: ports/esp32s2/common-hal/nvm/ByteArray.c
+msgid "NVS Error"
+msgstr ""
+
#: py/parse.c
msgid "Name too long"
msgstr "Míngchēng tài zhǎng"
@@ -1283,6 +1308,11 @@ msgstr "Méiyǒu DAC zài xīnpiàn shàng de"
msgid "No DMA channel found"
msgstr "Wèi zhǎodào DMA píndào"
+#: shared-module/busdevice/I2CDevice.c
+#, c-format
+msgid "No I2C device at address: %x"
+msgstr ""
+
#: ports/esp32s2/common-hal/busio/SPI.c ports/mimxrt10xx/common-hal/busio/SPI.c
#: ports/stm/common-hal/busio/SPI.c
msgid "No MISO Pin"
@@ -1416,14 +1446,14 @@ msgstr "Bù zhīchí jīshù"
msgid "Only 8 or 16 bit mono with "
msgstr "ZhÇyÇ’u 8 huò 16 wèi dÄnwèi "
-#: ports/esp32s2/common-hal/socketpool/SocketPool.c
-msgid "Only IPv4 SOCK_STREAM sockets supported"
-msgstr "JÇn zhÄ«chí IPv4 SOCK_STREAM tào jiÄ“ zì"
-
#: ports/esp32s2/common-hal/wifi/__init__.c
msgid "Only IPv4 addresses supported"
msgstr "JÇn zhÄ«chí IPv4 dìzhÇ"
+#: ports/esp32s2/common-hal/socketpool/SocketPool.c
+msgid "Only IPv4 sockets supported"
+msgstr ""
+
#: shared-module/displayio/OnDiskBitmap.c
#, c-format
msgid ""
@@ -1441,6 +1471,10 @@ msgstr ""
"JÇn zhÄ«chí dÄn sè, suÇ’yÇn wéi 4bpp huò 8bpp yÇjí 16bpp huò gèng gÄo de BMP: "
"Gěi chū %d bpp"
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "Only one alarm.time alarm can be set."
+msgstr ""
+
#: shared-module/displayio/ColorConverter.c
msgid "Only one color can be transparent at a time"
msgstr "YÄ«cì zhÇ néng yÇ’uyÄ« zhÇ’ng yánsè shì tòumíng de"
@@ -1499,6 +1533,10 @@ msgstr "YÇn jiÇŽo bìxÅ« zhÄ«chí yìngjiàn zhÅngduàn"
msgid "Pin number already reserved by EXTI"
msgstr "ZhÄ“n hào yÇ bèi EXTI bÇŽoliú"
+#: ports/esp32s2/common-hal/alarm/__init__.c
+msgid "PinAlarm not yet implemented"
+msgstr ""
+
#: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format
msgid ""
@@ -1564,7 +1602,7 @@ msgstr "Wèi chÇ”yú RS485 móshì shí zhÇdìngle RS485 fÇŽn zhuÇŽn"
msgid "RTC calibration is not supported on this board"
msgstr "CÇ bÇŽn bù zhÄ«chí RTC jiàozhÇ”n"
-#: shared-bindings/time/__init__.c
+#: shared-bindings/alarm/time/TimeAlarm.c shared-bindings/time/__init__.c
msgid "RTC is not supported on this board"
msgstr "CÇ bÇŽn bù zhÄ«chí RTC"
@@ -1710,6 +1748,10 @@ msgstr "Liú quÄ“shÇŽo readinto() huò write() fÄngfÇŽ."
msgid "Supply at least one UART pin"
msgstr "Dìngyì zhìshÇŽo yÄ«gè UART yÇn jiÇŽo"
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Supply one of monotonic_time or epoch_time"
+msgstr ""
+
#: shared-bindings/gnss/GNSS.c
msgid "System entry must be gnss.SatelliteSystem"
msgstr "Xìtǒng tiáomù bìxū shì gnss.SatelliteSystem"
@@ -1780,6 +1822,10 @@ msgstr "Píng pÅ« zhí chÄochÅ« fànwéi"
msgid "Tile width must exactly divide bitmap width"
msgstr "Píng pÅ« kuÄndù bìxÅ« huàfÄ“n wèi tú kuÄndù"
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "Time is in the past."
+msgstr ""
+
#: ports/nrf/common-hal/_bleio/Adapter.c
#, c-format
msgid "Timeout is too long: Maximum timeout length is %d seconds"
@@ -1979,7 +2025,7 @@ msgstr "DiànyÄ dòu qÇ” chÄoshí"
msgid "WARNING: Your code filename has two extensions\n"
msgstr "JÇnggào: NÇ de dàimÇŽ wénjiàn míng yÇ’u liÇŽng gè kuòzhÇŽn míng\n"
-#: shared-bindings/watchdog/WatchDogTimer.c
+#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "WatchDogTimer cannot be deinitialized once mode is set to RESET"
msgstr "YÄ«dàn jiÄng móshì shèzhì wèi RESET, jiù wúfÇŽ chÅ«shÇhuà WatchDog Timer"
@@ -2065,10 +2111,6 @@ msgstr "dìzhÇ chÄochÅ« biÄnjiè"
msgid "addresses is empty"
msgstr "dìzhÇ wèi kÅng"
-#: extmod/ulab/code/vector/vectorise.c
-msgid "arctan2 is implemented for scalars and ndarrays only"
-msgstr "arctan2 jÇn zhÄ“nduì biÄoliàng hé ndarray shíxiàn"
-
#: py/modbuiltins.c
msgid "arg is an empty sequence"
msgstr "cÄnshù shì yÄ«gè kÅng de xùliè"
@@ -2077,6 +2119,10 @@ msgstr "cÄnshù shì yÄ«gè kÅng de xùliè"
msgid "argsort argument must be an ndarray"
msgstr "argsort cÄnshù bìxÅ« shì ndarray"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "argsort is not implemented for flattened arrays"
+msgstr ""
+
#: py/runtime.c
msgid "argument has wrong type"
msgstr "cÄnshù lèixíng cuòwù"
@@ -2094,15 +2140,23 @@ msgstr "cÄnshù biÄnhào/lèixíng bù pÇpèi"
msgid "argument should be a '%q' not a '%q'"
msgstr "cÄnshù yÄ«nggÄi shì '%q', 'bùshì '%q'"
-#: extmod/ulab/code/linalg/linalg.c
+#: extmod/ulab/code/linalg/linalg.c extmod/ulab/code/numerical/numerical.c
msgid "arguments must be ndarrays"
msgstr "cÄnshù bìxÅ« shì ndarrays"
+#: extmod/ulab/code/ndarray.c
+msgid "array and index length must be equal"
+msgstr ""
+
#: py/objarray.c shared-bindings/nvm/ByteArray.c
msgid "array/bytes required on right side"
msgstr "yòu cè xūyào shùzǔ/zì jié"
#: extmod/ulab/code/numerical/numerical.c
+msgid "attempt to get (arg)min/(arg)max of empty sequence"
+msgstr ""
+
+#: extmod/ulab/code/numerical/numerical.c
msgid "attempt to get argmin/argmax of an empty sequence"
msgstr "chángshì huòqÇ” kÅng xùliè de argmin/ argmax"
@@ -2111,16 +2165,16 @@ msgid "attributes not supported yet"
msgstr "shǔxìng shàngwèi zhīchí"
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, None, or 1"
-msgstr "zhóu bìxū wèi-1,0, wú huò 1"
+msgid "axis is out of bounds"
+msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be -1, 0, or 1"
-msgstr "zhóu bìxū wèi-1,0 huò 1"
+msgid "axis must be None, or an integer"
+msgstr ""
#: extmod/ulab/code/numerical/numerical.c
-msgid "axis must be None, 0, or 1"
-msgstr "zhóu bìxū wèi None,0 huò 1"
+msgid "axis too long"
+msgstr ""
#: py/builtinevex.c
msgid "bad compile mode"
@@ -2323,6 +2377,10 @@ msgid ""
"can't switch from manual field specification to automatic field numbering"
msgstr "wúfÇŽ cóng shÇ’udòng zìduàn guÄ«gé qiÄ“huàn dào zìdòng zìduàn biÄnhào"
+#: extmod/ulab/code/ndarray_operators.c
+msgid "cannot cast output with casting rule"
+msgstr ""
+
#: py/objtype.c
msgid "cannot create '%q' instances"
msgstr "wúfǎ chuàngjiàn '%q' ' shílì"
@@ -2339,10 +2397,6 @@ msgstr "wúfǎ dǎorù míngchēng %q"
msgid "cannot perform relative import"
msgstr "wúfÇŽ zhíxíng xiÄngguÄn dÇŽorù"
-#: extmod/ulab/code/ndarray.c
-msgid "cannot reshape array (incompatible input/output shape)"
-msgstr "wúfÇŽ zhÄ›ngxíng shùzÇ” (bù jiÄnróng de shÅ«rù/shÅ«chÅ« xíngzhuàng)"
-
#: py/emitnative.c
msgid "casting"
msgstr "tóuyÇng"
@@ -2418,10 +2472,6 @@ msgstr "juàn jÄ« cÄnshù bìxÅ« shì ndarrays"
msgid "convolve arguments must not be empty"
msgstr "juàn jÄ« cÄn shÇ” bùnéng wéi kÅng"
-#: extmod/ulab/code/ndarray.c
-msgid "could not broadast input array from shape"
-msgstr "wúfǎ guǎngbò xíngzhuàng de shūrù shùzǔ"
-
#: extmod/ulab/code/poly/poly.c
msgid "could not invert Vandermonde matrix"
msgstr "wúfǎ fǎn zhuǎn fàndéméng dé jǔzhèn"
@@ -2430,6 +2480,10 @@ msgstr "wúfǎ fǎn zhuǎn fàndéméng dé jǔzhèn"
msgid "couldn't determine SD card version"
msgstr "wúfǎ quèdìng SD kǎ bǎnběn"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "cross is defined for 1D arrays of length 3"
+msgstr ""
+
#: extmod/ulab/code/approx/approx.c
msgid "data must be iterable"
msgstr "shùjù bìxū shì kě diédài de"
@@ -2438,10 +2492,6 @@ msgstr "shùjù bìxū shì kě diédài de"
msgid "data must be of equal length"
msgstr "shùjù chángdù bìxÅ« xiÄngdÄ›ng"
-#: extmod/ulab/code/numerical/numerical.c
-msgid "ddof must be smaller than length of data set"
-msgstr "ddof bìxū xiǎoyú shùjù jí de chángdù"
-
#: py/parsenum.c
msgid "decimal numbers not supported"
msgstr "bù zhīchí xiǎoshù shù"
@@ -2473,6 +2523,10 @@ msgstr "yǔfǎ gēngxīn xùliè de chángdù cuòwù"
msgid "diff argument must be an ndarray"
msgstr "bùtóng de cÄnshù bìxÅ« shì ndarray"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "differentiation order out of range"
+msgstr ""
+
#: py/modmath.c py/objfloat.c py/objint_longlong.c py/objint_mpz.c py/runtime.c
#: shared-bindings/math/__init__.c
msgid "division by zero"
@@ -2502,6 +2556,10 @@ msgstr "xúnzhÇŽo zhuÇŽnhuàn biÄozhù géshì de jiéshù"
msgid "end_x should be an int"
msgstr "jiéwÄ›i_x yÄ«nggÄi shì yÄ«gè zhÄ›ngshù"
+#: shared-bindings/alarm/time/TimeAlarm.c
+msgid "epoch_time not supported on this board"
+msgstr ""
+
#: ports/nrf/common-hal/busio/UART.c
#, c-format
msgid "error = 0x%08lX"
@@ -2588,6 +2646,10 @@ msgstr "dì yÄ« gè cÄnshù bìxÅ« shì kÄ› tiáo yòng de"
msgid "first argument must be a function"
msgstr "dì yÄ«gè cÄnshù bìxÅ« shì yÄ« gè hánshù"
+#: extmod/ulab/code/ulab_create.c
+msgid "first argument must be a tuple of ndarrays"
+msgstr ""
+
#: extmod/ulab/code/ndarray.c
msgid "first argument must be an iterable"
msgstr "dì yÄ« gè cÄnshù bìxÅ« shì kÄ› diédài de"
@@ -2641,9 +2703,9 @@ msgstr "hánshù huòdé cÄnshù '%q' de duÅchóng zhí"
msgid "function has the same sign at the ends of interval"
msgstr "hánshù zài jiàngé mòwÄ›i jùyÇ’u xiÄngtóng de fúhào"
-#: extmod/ulab/code/compare/compare.c
-msgid "function is implemented for scalars and ndarrays only"
-msgstr "gÄi hánshù jÇn zhÄ“nduì biÄoliàng hé ndarray shíxiàn"
+#: extmod/ulab/code/ndarray.c
+msgid "function is defined for ndarrays only"
+msgstr ""
#: py/argcheck.c
#, c-format
@@ -2712,6 +2774,7 @@ msgstr "bù zhèngquè de tiánchÅng"
msgid "index is out of bounds"
msgstr "suÇ’yÇn chÄochÅ« fànwéi"
+#: extmod/ulab/code/numerical/numerical.c
#: ports/esp32s2/common-hal/pulseio/PulseIn.c py/obj.c
msgid "index out of range"
msgstr "suÇ’yÇn chÄochÅ« fànwéi"
@@ -2736,6 +2799,10 @@ msgstr "Initial_value chángdù cuòwù"
msgid "inline assembler must be a function"
msgstr "nèi lián jíhé bìxū shì yīgè hánshù"
+#: extmod/ulab/code/ndarray.c
+msgid "input and output shapes are not compatible"
+msgstr ""
+
#: extmod/ulab/code/ulab_create.c
msgid "input argument must be an integer or a 2-tuple"
msgstr "shÅ«rù cÄnshù bìxÅ« shì zhÄ›ngshù huò 2 yuán zÇ”"
@@ -2744,6 +2811,10 @@ msgstr "shÅ«rù cÄnshù bìxÅ« shì zhÄ›ngshù huò 2 yuán zÇ”"
msgid "input array length must be power of 2"
msgstr "shūrù shùzǔ de chángdù bìxū shì 2 de mì"
+#: extmod/ulab/code/ulab_create.c
+msgid "input arrays are not compatible"
+msgstr ""
+
#: extmod/ulab/code/poly/poly.c
msgid "input data must be an iterable"
msgstr "shūrù shùjù bìxū shì kě diédài de"
@@ -2756,6 +2827,22 @@ msgstr "shūrù jǔzhèn bù duìchèn"
msgid "input matrix is singular"
msgstr "shūrù jǔzhèn shì qíyì de"
+#: extmod/ulab/code/user/user.c
+msgid "input must be a dense ndarray"
+msgstr ""
+
+#: extmod/ulab/code/ulab_create.c
+msgid "input must be a tensor of rank 2"
+msgstr ""
+
+#: extmod/ulab/code/ulab_create.c extmod/ulab/code/user/user.c
+msgid "input must be an ndarray"
+msgstr ""
+
+#: extmod/ulab/code/filter/filter.c
+msgid "input must be one-dimensional"
+msgstr ""
+
#: extmod/ulab/code/linalg/linalg.c
msgid "input must be square matrix"
msgstr "shÅ«rù bìxÅ« wèi fÄng jÇ”zhèn"
@@ -2768,6 +2855,10 @@ msgstr "shūrù bìxū shì yuán zǔ, lièbiǎo, fànwéi huò ndarray"
msgid "input vectors must be of equal length"
msgstr "shÅ«rù xiàngliàng de chángdù bìxÅ« xiÄngdÄ›ng"
+#: extmod/ulab/code/poly/poly.c
+msgid "inputs are not iterable"
+msgstr ""
+
#: py/parsenum.c
msgid "int() arg 2 must be >= 2 and <= 36"
msgstr "zhÄ›ngshù() cÄnshù 2 bìxÅ« > = 2 qiÄ› <= 36"
@@ -2838,6 +2929,10 @@ msgstr "jīshù wèi %d de zhěng shǔ de yǔfǎ wúxiào"
msgid "invalid syntax for number"
msgstr "wúxiào de hàomǎ yǔfǎ"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "io must be rtc io"
+msgstr ""
+
#: py/objtype.c
msgid "issubclass() arg 1 must be a class"
msgstr "issubclass() cÄnshù 1 bìxÅ« shì yÄ«gè lèi"
@@ -2937,6 +3032,10 @@ msgstr "DÄng gùdìng chángdù wèi %s shí, zuìdà chángdù bìxÅ« wèi 0-%
msgid "max_length must be > 0"
msgstr "Max_length bìxū > 0"
+#: extmod/ulab/code/ndarray.c
+msgid "maximum number of dimensions is 4"
+msgstr ""
+
#: py/runtime.c
msgid "maximum recursion depth exceeded"
msgstr "chÄochÅ« zuìdà dìguÄ« shÄ“ndù"
@@ -2986,10 +3085,6 @@ msgstr "bìxū tíchū duìxiàng"
msgid "must use keyword argument for key function"
msgstr "bìxÅ« shÇyòng guÄnjiàn cí cÄnshù"
-#: extmod/ulab/code/numerical/numerical.c
-msgid "n must be between 0, and 9"
-msgstr "n bìxÅ« jiè yú 0 dào 9 zhÄ« jiÄn"
-
#: py/runtime.c
msgid "name '%q' is not defined"
msgstr "míngchēng '%q' wèi dìngyì"
@@ -3072,6 +3167,10 @@ msgstr "zài */** zhÄ«hòu fÄ“i guÄnjiàn cí cÄnshù"
msgid "non-keyword arg after keyword arg"
msgstr "guÄnjiàn zì cÄnshù zhÄ«hòu de fÄ“i guÄnjiàn zì cÄnshù"
+#: extmod/ulab/code/linalg/linalg.c
+msgid "norm is defined for 1D and 2D arrays"
+msgstr ""
+
#: shared-bindings/_bleio/UUID.c
msgid "not a 128-bit UUID"
msgstr "bùshì 128 wèi UUID"
@@ -3084,10 +3183,6 @@ msgstr "bùshì zì chuàn géshì huà guòchéng zhÅng zhuÇŽnhuàn de suÇ’yÇ’
msgid "not enough arguments for format string"
msgstr "géshì zìfú chuàn cÄn shÇ” bùzú"
-#: extmod/ulab/code/poly/poly.c
-msgid "number of arguments must be 2, or 3"
-msgstr "cÄnshù shùliàng bìxÅ« wèi 2 huò 3"
-
#: extmod/ulab/code/ulab_create.c
msgid "number of points must be at least 2"
msgstr "diǎnshù bìxū zhìshǎo wèi 2"
@@ -3140,6 +3235,10 @@ msgstr "xÅ«yào huÇŽnchÅng qÅ« xiéyì de duìxiàng"
msgid "odd-length string"
msgstr "jīshù zìfú chuàn"
+#: extmod/ulab/code/ulab_create.c
+msgid "offset is too large"
+msgstr ""
+
#: py/objstr.c py/objstrunicode.c
msgid "offset out of bounds"
msgstr "piÄnlí biÄnjiè"
@@ -3162,6 +3261,14 @@ msgstr "jÇn zhÄ«chí bù zhÇŽng = 1(jí wú) de qiÄ“piàn"
msgid "operands could not be broadcast together"
msgstr "cÄozuò shÇ” bùnéng yÄ«qÇ guÇŽngbò"
+#: extmod/ulab/code/ndarray.c
+msgid "operation is implemented for 1D Boolean arrays only"
+msgstr ""
+
+#: extmod/ulab/code/numerical/numerical.c
+msgid "operation is not implemented for flattened array"
+msgstr ""
+
#: extmod/ulab/code/numerical/numerical.c
msgid "operation is not implemented on ndarrays"
msgstr "cÄozuò wèi zài ndarrays shàng shíxiàn"
@@ -3252,6 +3359,7 @@ msgstr "pow() 3 cÄn shÇ” bùnéng wéi 0"
msgid "pow() with 3 arguments requires integers"
msgstr "pow() yÇ’u 3 cÄnshù xÅ«yào zhÄ›ngshù"
+#: ports/esp32s2/boards/adafruit_magtag_2.9_grayscale/mpconfigboard.h
#: ports/esp32s2/boards/adafruit_metro_esp32s2/mpconfigboard.h
#: ports/esp32s2/boards/electroniccats_bastwifi/mpconfigboard.h
#: ports/esp32s2/boards/espressif_kaluga_1/mpconfigboard.h
@@ -3295,6 +3403,10 @@ msgstr "xiÄngduì dÇŽorù"
msgid "requested length %d but object has length %d"
msgstr "qÇngqiú chángdù %d dàn duìxiàng chángdù %d"
+#: extmod/ulab/code/ndarray_operators.c
+msgid "results cannot be cast to specified type"
+msgstr ""
+
#: py/compile.c
msgid "return annotation must be an identifier"
msgstr "fÇŽnhuí zhùshì bìxÅ« shì biÄozhì fú"
@@ -3313,9 +3425,9 @@ msgstr "rgb_pins[%d] fùzhì lìng yÄ«gè yÇn jiÇŽo fÄ“npèi"
msgid "rgb_pins[%d] is not on the same port as clock"
msgstr "rgb_pins[%d] yÇ” shízhÅng bùzài tóng yÄ«gè duÄnkÇ’u shàng"
-#: extmod/ulab/code/ndarray.c
-msgid "right hand side must be an ndarray, or a scalar"
-msgstr "yòubiÄn bìxÅ« shì ndarray huò biÄoliàng"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "roll argument must be an ndarray"
+msgstr ""
#: py/objstr.c
msgid "rsplit(None,n)"
@@ -3342,8 +3454,8 @@ msgid "script compilation not supported"
msgstr "bù zhÄ«chí jiÇŽobÄ›n biÄnyì"
#: extmod/ulab/code/ndarray.c
-msgid "shape must be a 2-tuple"
-msgstr "xíngzhuàng bìxū shì 2 yuán zǔ"
+msgid "shape must be a tuple"
+msgstr ""
#: py/objstr.c
msgid "sign not allowed in string format specifier"
@@ -3385,10 +3497,6 @@ msgstr "ruÇŽn chóngqÇ\n"
msgid "sort argument must be an ndarray"
msgstr "páixù cÄnshù bìxÅ« shì ndarray"
-#: extmod/ulab/code/numerical/numerical.c
-msgid "sorted axis can't be longer than 65535"
-msgstr "pái xù zhóu bù néng chÄo guò 65535"
-
#: extmod/ulab/code/filter/filter.c
msgid "sos array must be of shape (n_section, 6)"
msgstr "sos shùzǔ de xíngzhuàng bìxū wèi (n_section, 6)"
@@ -3469,6 +3577,7 @@ msgstr "yùzhí bìxū zài fànwéi 0-65536"
msgid "time.struct_time() takes a 9-sequence"
msgstr "time.struct_time() xūyào 9 xùliè"
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
msgid "timeout duration exceeded the maximum supported value"
msgstr "chÄoshí shíjiÄn chÄoguò zuìdà zhÄ«chí zhí"
@@ -3493,6 +3602,10 @@ msgstr "dÄ›ngdài v2 kÇŽ chÄoshí"
msgid "timestamp out of range for platform time_t"
msgstr "time_t shíjiÄn chuÅ chÄochÅ« píngtái fànwéi"
+#: extmod/ulab/code/ndarray.c
+msgid "tobytes can be invoked for dense arrays only"
+msgstr ""
+
#: shared-module/struct/__init__.c
msgid "too many arguments provided with the given format"
msgstr "tígÅng jÇ dìng géshì de cÄnshù tài duÅ"
@@ -3510,6 +3623,10 @@ msgstr "dÇŽkÄi tài duÅ zhí (yùqí %d)"
msgid "trapz is defined for 1D arrays of equal length"
msgstr "Trapz shì wèi děng zhǎng de 1D shùzǔ dìngyì de"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "trigger level must be 0 or 1"
+msgstr ""
+
#: extmod/ulab/code/linalg/linalg.c
msgid "tuple index out of range"
msgstr "yuán zÇ” suÇ’yÇn chÄochÅ« fànwéi"
@@ -3652,6 +3769,14 @@ msgstr "zhí jìshù bìxū wèi > 0"
msgid "vectors must have same lengths"
msgstr "xiàngliàng bìxÅ« jùyÇ’u xiÄngtóng de chángdù"
+#: ports/esp32s2/common-hal/alarm/pin/__init__.c
+msgid "wakeup conflict"
+msgstr ""
+
+#: ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
+msgid "watchdog not initialized"
+msgstr "wèi chÅ« shÇ huà jiÄn shì qì"
+
#: shared-bindings/watchdog/WatchDogTimer.c
msgid "watchdog timeout must be greater than 0"
msgstr "kÄn mén gÇ’u chÄoshí bìxÅ« dàyú 0"
@@ -3664,13 +3789,13 @@ msgstr "kuÄndù bìxÅ« dàyú líng"
msgid "window must be <= interval"
msgstr "ChuÄngkÇ’u bìxÅ« shì <= jiàngé"
-#: extmod/ulab/code/linalg/linalg.c
-msgid "wrong argument type"
-msgstr "cuòwù de cÄnshù lèixíng"
+#: extmod/ulab/code/numerical/numerical.c
+msgid "wrong axis index"
+msgstr ""
-#: extmod/ulab/code/ndarray.c
-msgid "wrong index type"
-msgstr "cuòwù de suÇ’yÇn lèixíng"
+#: extmod/ulab/code/ulab_create.c
+msgid "wrong axis specified"
+msgstr ""
#: extmod/ulab/code/vector/vectorise.c
msgid "wrong input type"
@@ -3720,6 +3845,54 @@ msgstr "zi bìxū wèi fú diǎn xíng"
msgid "zi must be of shape (n_section, 2)"
msgstr "zi bìxū jùyǒu xíngzhuàng (n_section,2)"
+#~ msgid "Only IPv4 SOCK_STREAM sockets supported"
+#~ msgstr "JÇn zhÄ«chí IPv4 SOCK_STREAM tào jiÄ“ zì"
+
+#~ msgid "arctan2 is implemented for scalars and ndarrays only"
+#~ msgstr "arctan2 jÇn zhÄ“nduì biÄoliàng hé ndarray shíxiàn"
+
+#~ msgid "axis must be -1, 0, None, or 1"
+#~ msgstr "zhóu bìxū wèi-1,0, wú huò 1"
+
+#~ msgid "axis must be -1, 0, or 1"
+#~ msgstr "zhóu bìxū wèi-1,0 huò 1"
+
+#~ msgid "axis must be None, 0, or 1"
+#~ msgstr "zhóu bìxū wèi None,0 huò 1"
+
+#~ msgid "cannot reshape array (incompatible input/output shape)"
+#~ msgstr "wúfÇŽ zhÄ›ngxíng shùzÇ” (bù jiÄnróng de shÅ«rù/shÅ«chÅ« xíngzhuàng)"
+
+#~ msgid "could not broadast input array from shape"
+#~ msgstr "wúfǎ guǎngbò xíngzhuàng de shūrù shùzǔ"
+
+#~ msgid "ddof must be smaller than length of data set"
+#~ msgstr "ddof bìxū xiǎoyú shùjù jí de chángdù"
+
+#~ msgid "function is implemented for scalars and ndarrays only"
+#~ msgstr "gÄi hánshù jÇn zhÄ“nduì biÄoliàng hé ndarray shíxiàn"
+
+#~ msgid "n must be between 0, and 9"
+#~ msgstr "n bìxÅ« jiè yú 0 dào 9 zhÄ« jiÄn"
+
+#~ msgid "number of arguments must be 2, or 3"
+#~ msgstr "cÄnshù shùliàng bìxÅ« wèi 2 huò 3"
+
+#~ msgid "right hand side must be an ndarray, or a scalar"
+#~ msgstr "yòubiÄn bìxÅ« shì ndarray huò biÄoliàng"
+
+#~ msgid "shape must be a 2-tuple"
+#~ msgstr "xíngzhuàng bìxū shì 2 yuán zǔ"
+
+#~ msgid "sorted axis can't be longer than 65535"
+#~ msgstr "pái xù zhóu bù néng chÄo guò 65535"
+
+#~ msgid "wrong argument type"
+#~ msgstr "cuòwù de cÄnshù lèixíng"
+
+#~ msgid "wrong index type"
+#~ msgstr "cuòwù de suÇ’yÇn lèixíng"
+
#~ msgid "Must provide SCK pin"
#~ msgstr "bì xÅ« tí gòng SCK yÇn jiÇŽo"
diff --git a/main.c b/main.c
index 80b163f60..da04ada46 100755
--- a/main.c
+++ b/main.c
@@ -46,19 +46,28 @@
#include "background.h"
#include "mpconfigboard.h"
#include "supervisor/background_callback.h"
+#include "supervisor/board.h"
#include "supervisor/cpu.h"
+#include "supervisor/filesystem.h"
#include "supervisor/memory.h"
#include "supervisor/port.h"
-#include "supervisor/filesystem.h"
+#include "supervisor/serial.h"
#include "supervisor/shared/autoreload.h"
-#include "supervisor/shared/translate.h"
#include "supervisor/shared/rgb_led_status.h"
#include "supervisor/shared/safe_mode.h"
-#include "supervisor/shared/status_leds.h"
#include "supervisor/shared/stack.h"
-#include "supervisor/serial.h"
+#include "supervisor/shared/status_leds.h"
+#include "supervisor/shared/translate.h"
+#include "supervisor/shared/workflow.h"
+#include "supervisor/usb.h"
-#include "boards/board.h"
+#include "shared-bindings/microcontroller/__init__.h"
+#include "shared-bindings/microcontroller/Processor.h"
+#include "shared-bindings/supervisor/Runtime.h"
+
+#if CIRCUITPY_ALARM
+#include "shared-bindings/alarm/__init__.h"
+#endif
#if CIRCUITPY_DISPLAYIO
#include "shared-module/displayio/__init__.h"
@@ -85,25 +94,9 @@
#include "common-hal/canio/CAN.h"
#endif
-void do_str(const char *src, mp_parse_input_kind_t input_kind) {
- mp_lexer_t *lex = mp_lexer_new_from_str_len(MP_QSTR__lt_stdin_gt_, src, strlen(src), 0);
- if (lex == NULL) {
- //printf("MemoryError: lexer could not allocate memory\n");
- return;
- }
-
- nlr_buf_t nlr;
- if (nlr_push(&nlr) == 0) {
- qstr source_name = lex->source_name;
- mp_parse_tree_t parse_tree = mp_parse(lex, input_kind);
- mp_obj_t module_fun = mp_compile(&parse_tree, source_name, MP_EMIT_OPT_NONE, true);
- mp_call_function_0(module_fun);
- nlr_pop();
- } else {
- // uncaught exception
- mp_obj_print_exception(&mp_plat_print, (mp_obj_t)nlr.ret_val);
- }
-}
+#if CIRCUITPY_WIFI
+#include "shared-bindings/wifi/__init__.h"
+#endif
#if MICROPY_ENABLE_PYSTACK
static size_t PLACE_IN_DTCM_BSS(_pystack[CIRCUITPY_PYSTACK_SIZE / sizeof(size_t)]);
@@ -115,23 +108,27 @@ static void reset_devices(void) {
#endif
}
-void start_mp(supervisor_allocation* heap) {
+STATIC void start_mp(supervisor_allocation* heap) {
reset_status_led();
autoreload_stop();
+ supervisor_workflow_reset();
+#if CIRCUITPY_ALARM
+ alarm_reset();
+#endif
// Stack limit should be less than real stack size, so we have a chance
// to recover from limit hit. (Limit is measured in bytes.)
mp_stack_ctrl_init();
- if (stack_alloc != NULL) {
- mp_stack_set_limit(stack_alloc->length - 1024);
+ if (stack_get_bottom() != NULL) {
+ mp_stack_set_limit(stack_get_length() - 1024);
}
#if MICROPY_MAX_STACK_USAGE
// _ezero (same as _ebss) is an int, so start 4 bytes above it.
- if (stack_alloc != NULL) {
- mp_stack_set_bottom(stack_alloc->ptr);
+ if (stack_get_bottom() != NULL) {
+ mp_stack_set_bottom(stack_get_bottom());
mp_stack_fill_with_sentinel();
}
#endif
@@ -148,7 +145,7 @@ void start_mp(supervisor_allocation* heap) {
#endif
#if MICROPY_ENABLE_GC
- gc_init(heap->ptr, heap->ptr + heap->length / 4);
+ gc_init(heap->ptr, heap->ptr + get_allocation_length(heap) / 4);
#endif
mp_init();
mp_obj_list_init(mp_sys_path, 0);
@@ -166,7 +163,7 @@ void start_mp(supervisor_allocation* heap) {
#endif
}
-void stop_mp(void) {
+STATIC void stop_mp(void) {
#if CIRCUITPY_NETWORK
network_module_deinit();
#endif
@@ -191,7 +188,7 @@ void stop_mp(void) {
// Look for the first file that exists in the list of filenames, using mp_import_stat().
// Return its index. If no file found, return -1.
-const char* first_existing_file_in_list(const char * const * filenames) {
+STATIC const char* first_existing_file_in_list(const char * const * filenames) {
for (int i = 0; filenames[i] != (char*)""; i++) {
mp_import_stat_t stat = mp_import_stat(filenames[i]);
if (stat == MP_IMPORT_STAT_FILE) {
@@ -201,7 +198,7 @@ const char* first_existing_file_in_list(const char * const * filenames) {
return NULL;
}
-bool maybe_run_list(const char * const * filenames, pyexec_result_t* exec_result) {
+STATIC bool maybe_run_list(const char * const * filenames, pyexec_result_t* exec_result) {
const char* filename = first_existing_file_in_list(filenames);
if (filename == NULL) {
return false;
@@ -215,10 +212,10 @@ bool maybe_run_list(const char * const * filenames, pyexec_result_t* exec_result
return true;
}
-void cleanup_after_vm(supervisor_allocation* heap) {
+STATIC void cleanup_after_vm(supervisor_allocation* heap) {
// Reset port-independent devices, like CIRCUITPY_BLEIO_HCI.
reset_devices();
- // Turn off the display and flush the fileystem before the heap disappears.
+ // Turn off the display and flush the filesystem before the heap disappears.
#if CIRCUITPY_DISPLAYIO
reset_displays();
#endif
@@ -244,7 +241,7 @@ void cleanup_after_vm(supervisor_allocation* heap) {
reset_status_led();
}
-void print_code_py_status_message(safe_mode_t safe_mode) {
+STATIC void print_code_py_status_message(safe_mode_t safe_mode) {
if (autoreload_is_enabled()) {
serial_write_compressed(translate("Auto-reload is on. Simply save files over USB to run them or enter REPL to disable.\n"));
} else {
@@ -256,7 +253,7 @@ void print_code_py_status_message(safe_mode_t safe_mode) {
}
}
-bool run_code_py(safe_mode_t safe_mode) {
+STATIC bool run_code_py(safe_mode_t safe_mode) {
bool serial_connected_at_start = serial_connected();
#if CIRCUITPY_AUTORELOAD_DELAY_MS > 0
if (serial_connected_at_start) {
@@ -276,10 +273,12 @@ bool run_code_py(safe_mode_t safe_mode) {
if (safe_mode == NO_SAFE_MODE) {
new_status_color(MAIN_RUNNING);
- static const char * const supported_filenames[] = STRING_LIST("code.txt", "code.py", "main.py", "main.txt");
+ static const char * const supported_filenames[] = STRING_LIST(
+ "code.txt", "code.py", "main.py", "main.txt");
#if CIRCUITPY_FULL_BUILD
- static const char * const double_extension_filenames[] = STRING_LIST("code.txt.py", "code.py.txt", "code.txt.txt","code.py.py",
- "main.txt.py", "main.py.txt", "main.txt.txt","main.py.py");
+ static const char * const double_extension_filenames[] = STRING_LIST(
+ "code.txt.py", "code.py.txt", "code.txt.txt","code.py.py",
+ "main.txt.py", "main.py.txt", "main.txt.txt","main.py.py");
#endif
stack_resize();
@@ -295,6 +294,9 @@ bool run_code_py(safe_mode_t safe_mode) {
}
}
#endif
+
+ // TODO: on deep sleep, make sure display is refreshed before sleeping (for e-ink).
+
cleanup_after_vm(heap);
if (result.return_code & PYEXEC_FORCED_EXIT) {
@@ -302,6 +304,8 @@ bool run_code_py(safe_mode_t safe_mode) {
}
}
+ // Program has finished running.
+
// Display a different completion message if the user has no USB attached (cannot save files)
if (!serial_connected_at_start) {
serial_write_compressed(translate("\nCode done running. Waiting for reload.\n"));
@@ -311,27 +315,58 @@ bool run_code_py(safe_mode_t safe_mode) {
#if CIRCUITPY_DISPLAYIO
bool refreshed_epaper_display = false;
#endif
+
rgb_status_animation_t animation;
prep_rgb_status_animation(&result, found_main, safe_mode, &animation);
+ bool asleep = false;
while (true) {
RUN_BACKGROUND_TASKS;
if (reload_requested) {
+ #if CIRCUITPY_ALARM
+ if (asleep) {
+ board_init();
+ }
+ #endif
+ supervisor_set_run_reason(RUN_REASON_AUTO_RELOAD);
reload_requested = false;
return true;
}
if (serial_connected() && serial_bytes_available()) {
+ #if CIRCUITPY_ALARM
+ if (asleep) {
+ board_init();
+ }
+ #endif
// Skip REPL if reload was requested.
- return (serial_read() == CHAR_CTRL_D);
+ bool ctrl_d = serial_read() == CHAR_CTRL_D;
+ if (ctrl_d) {
+ supervisor_set_run_reason(RUN_REASON_REPL_RELOAD);
+ }
+ return ctrl_d;
+ }
+
+ // Check for a deep sleep alarm and restart the VM. This can happen if
+ // an alarm alerts faster than our USB delay or if we pretended to deep
+ // sleep.
+ #if CIRCUITPY_ALARM
+ if (asleep && alarm_woken_from_sleep()) {
+ serial_write_compressed(translate("Woken up by alarm.\n"));
+ board_init();
+ supervisor_set_run_reason(RUN_REASON_STARTUP);
+ // TODO: Reset any volatile memory the user may have access to.
+ return true;
}
+ #endif
if (!serial_connected_before_animation && serial_connected()) {
if (!serial_connected_at_start) {
print_code_py_status_message(safe_mode);
}
+
print_safe_mode_message(safe_mode);
serial_write("\n");
- serial_write_compressed(translate("Press any key to enter the REPL. Use CTRL-D to reload."));
+ serial_write_compressed(translate("Press any key to enter the REPL. Use CTRL-D to reload.\n"));
}
if (serial_connected_before_animation && !serial_connected()) {
serial_connected_at_start = false;
@@ -340,18 +375,58 @@ bool run_code_py(safe_mode_t safe_mode) {
// Refresh the ePaper display if we have one. That way it'll show an error message.
#if CIRCUITPY_DISPLAYIO
+ // Don't refresh the display if we're about to deep sleep.
+ #if CIRCUITPY_ALARM
+ refreshed_epaper_display = refreshed_epaper_display || result.return_code & PYEXEC_DEEP_SLEEP;
+ #endif
if (!refreshed_epaper_display) {
refreshed_epaper_display = maybe_refresh_epaperdisplay();
}
#endif
- tick_rgb_status_animation(&animation);
+ // Sleep until our next interrupt.
+ #if CIRCUITPY_ALARM
+ if (result.return_code & PYEXEC_DEEP_SLEEP) {
+ // Make sure we have been awake long enough for USB to connect (enumeration delay).
+ int64_t connecting_delay_ticks = CIRCUITPY_USB_CONNECTED_SLEEP_DELAY * 1024 - port_get_raw_ticks(NULL);
+ if (connecting_delay_ticks > 0) {
+ // Set when we've waited long enough so that we wake up from the
+ // port_idle_until_interrupt below and loop around to the real deep
+ // sleep in the else clause.
+ port_interrupt_after_ticks(connecting_delay_ticks);
+ // Deep sleep if we're not connected to a host.
+ } else if (!asleep) {
+ asleep = true;
+ new_status_color(BLACK);
+ board_deinit();
+ if (!supervisor_workflow_active()) {
+ // Enter true deep sleep. When we wake up we'll be back at the
+ // top of main(), not in this loop.
+ alarm_enter_deep_sleep();
+ // Does not return.
+ } else {
+ serial_write_compressed(translate("Pretending to deep sleep until alarm, any key or file write.\n"));
+ }
+ }
+ }
+ #endif
+
+ if (!asleep) {
+ tick_rgb_status_animation(&animation);
+ } else {
+ // This waits until a pretend deep sleep alarm occurs. They are set
+ // during common_hal_alarm_set_deep_sleep_alarms. On some platforms
+ // it may also return due to another interrupt, that's why we check
+ // for deep sleep alarms above. If it wasn't a deep sleep alarm,
+ // then we'll idle here again.
+ port_idle_until_interrupt();
+ }
}
}
FIL* boot_output_file;
-void __attribute__ ((noinline)) run_boot_py(safe_mode_t safe_mode) {
+STATIC void __attribute__ ((noinline)) run_boot_py(safe_mode_t safe_mode) {
// If not in safe mode, run boot before initing USB and capture output in a
// file.
if (filesystem_present() && safe_mode == NO_SAFE_MODE && MP_STATE_VM(vfs_mount_table) != NULL) {
@@ -392,8 +467,9 @@ void __attribute__ ((noinline)) run_boot_py(safe_mode_t safe_mode) {
if (!skip_boot_output) {
// Wait 1.5 seconds before opening CIRCUITPY_BOOT_OUTPUT_FILE for write,
// in case power is momentary or will fail shortly due to, say a low, battery.
- mp_hal_delay_ms(1500);
-
+ if (common_hal_mcu_processor_get_reset_reason() == RESET_REASON_POWER_ON) {
+ mp_hal_delay_ms(1500);
+ }
// USB isn't up, so we can write the file.
filesystem_set_internal_writable_by_usb(false);
f_open(fs, boot_output_file, CIRCUITPY_BOOT_OUTPUT_FILE, FA_WRITE | FA_CREATE_ALWAYS);
@@ -429,7 +505,7 @@ void __attribute__ ((noinline)) run_boot_py(safe_mode_t safe_mode) {
}
}
-int run_repl(void) {
+STATIC int run_repl(void) {
int exit_code = PYEXEC_FORCED_EXIT;
stack_resize();
filesystem_flush();
@@ -451,9 +527,6 @@ int __attribute__((used)) main(void) {
// initialise the cpu and peripherals
safe_mode_t safe_mode = port_init();
- // Init memory after the port in case the port needs to set aside memory.
- memory_init();
-
// Turn on LEDs
init_status_leds();
rgb_led_status_init();
@@ -482,6 +555,9 @@ int __attribute__((used)) main(void) {
reset_devices();
reset_board();
+ // This is first time we are running CircuitPython after a reset or power-up.
+ supervisor_set_run_reason(RUN_REASON_STARTUP);
+
// If not in safe mode turn on autoreload by default but before boot.py in case it wants to change it.
if (safe_mode == NO_SAFE_MODE) {
autoreload_enable();
@@ -543,6 +619,10 @@ void gc_collect(void) {
common_hal_bleio_gc_collect();
#endif
+ #if CIRCUITPY_WIFI
+ common_hal_wifi_gc_collect();
+ #endif
+
// This naively collects all object references from an approximate stack
// range.
gc_collect_root((void**)sp, ((uint32_t)port_stack_get_top() - sp) / sizeof(uint32_t));
diff --git a/ports/atmel-samd/boards/8086_commander/board.c b/ports/atmel-samd/boards/8086_commander/board.c
index d7e856d61..84960e73c 100644
--- a/ports/atmel-samd/boards/8086_commander/board.c
+++ b/ports/atmel-samd/boards/8086_commander/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/atmel-samd/boards/8086_commander/mpconfigboard.mk b/ports/atmel-samd/boards/8086_commander/mpconfigboard.mk
index 9151040a0..f976dfe78 100644
--- a/ports/atmel-samd/boards/8086_commander/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/8086_commander/mpconfigboard.mk
@@ -19,9 +19,9 @@ SUPEROPT_GC = 0
CFLAGS_INLINE_LIMIT = 60
CIRCUITPY_GAMEPAD = 1
+CIRCUITPY_BUSDEVICE = 1
# Include these Python libraries in firmware.
-FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_BusDevice
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_HID
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_SD
#FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_ADXL34x
diff --git a/ports/atmel-samd/boards/aloriumtech_evo_m51/board.c b/ports/atmel-samd/boards/aloriumtech_evo_m51/board.c
index 1e9ab029e..5973eeec1 100644
--- a/ports/atmel-samd/boards/aloriumtech_evo_m51/board.c
+++ b/ports/atmel-samd/boards/aloriumtech_evo_m51/board.c
@@ -28,7 +28,7 @@
// Author: Bryan Craker
// Date: 2020-05-20
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
void board_init(void) {
diff --git a/ports/atmel-samd/boards/arduino_mkr1300/board.c b/ports/atmel-samd/boards/arduino_mkr1300/board.c
index 770bc8259..112b173ec 100644
--- a/ports/atmel-samd/boards/arduino_mkr1300/board.c
+++ b/ports/atmel-samd/boards/arduino_mkr1300/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
diff --git a/ports/atmel-samd/boards/arduino_mkrzero/board.c b/ports/atmel-samd/boards/arduino_mkrzero/board.c
index 0f60736a2..7af05ba45 100644
--- a/ports/atmel-samd/boards/arduino_mkrzero/board.c
+++ b/ports/atmel-samd/boards/arduino_mkrzero/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
diff --git a/ports/atmel-samd/boards/arduino_nano_33_iot/board.c b/ports/atmel-samd/boards/arduino_nano_33_iot/board.c
index 770bc8259..112b173ec 100644
--- a/ports/atmel-samd/boards/arduino_nano_33_iot/board.c
+++ b/ports/atmel-samd/boards/arduino_nano_33_iot/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
diff --git a/ports/atmel-samd/boards/arduino_zero/board.c b/ports/atmel-samd/boards/arduino_zero/board.c
index 770bc8259..112b173ec 100644
--- a/ports/atmel-samd/boards/arduino_zero/board.c
+++ b/ports/atmel-samd/boards/arduino_zero/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
diff --git a/ports/atmel-samd/boards/bast_pro_mini_m0/board.c b/ports/atmel-samd/boards/bast_pro_mini_m0/board.c
index c8e20206a..6baa43ffa 100644
--- a/ports/atmel-samd/boards/bast_pro_mini_m0/board.c
+++ b/ports/atmel-samd/boards/bast_pro_mini_m0/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void)
{
diff --git a/ports/atmel-samd/boards/bdmicro_vina_d21/board.c b/ports/atmel-samd/boards/bdmicro_vina_d21/board.c
index bd63baa6f..bb1c5335c 100644
--- a/ports/atmel-samd/boards/bdmicro_vina_d21/board.c
+++ b/ports/atmel-samd/boards/bdmicro_vina_d21/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
void board_init(void)
diff --git a/ports/atmel-samd/boards/bdmicro_vina_d21/mpconfigboard.mk b/ports/atmel-samd/boards/bdmicro_vina_d21/mpconfigboard.mk
index a9885d064..a0d9a779f 100644
--- a/ports/atmel-samd/boards/bdmicro_vina_d21/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/bdmicro_vina_d21/mpconfigboard.mk
@@ -15,6 +15,7 @@ CIRCUITPY_BITBANGIO = 0
CIRCUITPY_COUNTIO = 0
CIRCUITPY_I2CPERIPHERAL = 0
CIRCUITPY_VECTORIO = 0
+CIRCUITPY_BUSDEVICE = 0
CFLAGS_INLINE_LIMIT = 60
SUPEROPT_GC = 0
diff --git a/ports/atmel-samd/boards/bdmicro_vina_d51/board.c b/ports/atmel-samd/boards/bdmicro_vina_d51/board.c
index bd63baa6f..bb1c5335c 100644
--- a/ports/atmel-samd/boards/bdmicro_vina_d51/board.c
+++ b/ports/atmel-samd/boards/bdmicro_vina_d51/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
void board_init(void)
diff --git a/ports/atmel-samd/boards/blm_badge/board.c b/ports/atmel-samd/boards/blm_badge/board.c
index ee353c810..e374899a6 100644
--- a/ports/atmel-samd/boards/blm_badge/board.c
+++ b/ports/atmel-samd/boards/blm_badge/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "supervisor/shared/board.h"
void board_init(void) {
@@ -35,5 +35,5 @@ bool board_requests_safe_mode(void) {
}
void reset_board(void) {
- board_reset_user_neopixels();
+ board_reset_user_neopixels(&pin_PA05, 10);
}
diff --git a/ports/atmel-samd/boards/blm_badge/mpconfigboard.h b/ports/atmel-samd/boards/blm_badge/mpconfigboard.h
index 4f56d23b0..7343455b8 100644
--- a/ports/atmel-samd/boards/blm_badge/mpconfigboard.h
+++ b/ports/atmel-samd/boards/blm_badge/mpconfigboard.h
@@ -13,8 +13,6 @@
#define DEFAULT_UART_BUS_RX (&pin_PA01)
#define DEFAULT_UART_BUS_TX (&pin_PA00)
-#define USER_NEOPIXELS_PIN (&pin_PA05)
-
#define IGNORE_PIN_PA09 1
#define IGNORE_PIN_PA12 1
#define IGNORE_PIN_PA13 1
diff --git a/ports/atmel-samd/boards/capablerobot_usbhub/board.c b/ports/atmel-samd/boards/capablerobot_usbhub/board.c
index 46385f094..d65582379 100644
--- a/ports/atmel-samd/boards/capablerobot_usbhub/board.c
+++ b/ports/atmel-samd/boards/capablerobot_usbhub/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
#include "common-hal/microcontroller/Pin.h"
diff --git a/ports/atmel-samd/boards/catwan_usbstick/board.c b/ports/atmel-samd/boards/catwan_usbstick/board.c
index c8e20206a..6baa43ffa 100644
--- a/ports/atmel-samd/boards/catwan_usbstick/board.c
+++ b/ports/atmel-samd/boards/catwan_usbstick/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void)
{
diff --git a/ports/atmel-samd/boards/circuitbrains_basic_m0/board.c b/ports/atmel-samd/boards/circuitbrains_basic_m0/board.c
index efafd152d..59d573ce9 100755
--- a/ports/atmel-samd/boards/circuitbrains_basic_m0/board.c
+++ b/ports/atmel-samd/boards/circuitbrains_basic_m0/board.c
@@ -25,7 +25,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
diff --git a/ports/atmel-samd/boards/circuitbrains_deluxe_m4/board.c b/ports/atmel-samd/boards/circuitbrains_deluxe_m4/board.c
index efafd152d..59d573ce9 100755
--- a/ports/atmel-samd/boards/circuitbrains_deluxe_m4/board.c
+++ b/ports/atmel-samd/boards/circuitbrains_deluxe_m4/board.c
@@ -25,7 +25,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
diff --git a/ports/atmel-samd/boards/circuitplayground_express/board.c b/ports/atmel-samd/boards/circuitplayground_express/board.c
index 85c37ee62..f771c214b 100644
--- a/ports/atmel-samd/boards/circuitplayground_express/board.c
+++ b/ports/atmel-samd/boards/circuitplayground_express/board.c
@@ -26,7 +26,7 @@
#include <string.h>
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "common-hal/microcontroller/Pin.h"
#include "supervisor/shared/board.h"
#include "hal/include/hal_gpio.h"
@@ -53,5 +53,5 @@ bool board_requests_safe_mode(void) {
}
void reset_board(void) {
- board_reset_user_neopixels();
+ board_reset_user_neopixels(&pin_PB23, 10);
}
diff --git a/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.h b/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.h
index 4321335e5..e46e477e4 100644
--- a/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.h
+++ b/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.h
@@ -30,8 +30,6 @@
// Increase stack size slightly due to CPX library import nesting
#define CIRCUITPY_DEFAULT_STACK_SIZE (4248) //divisible by 8
-#define USER_NEOPIXELS_PIN (&pin_PB23)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PB03)
#define DEFAULT_I2C_BUS_SDA (&pin_PB02)
diff --git a/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.mk b/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.mk
index 13ec9e861..5389fc89a 100644
--- a/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.mk
@@ -21,7 +21,6 @@ SUPEROPT_GC = 0
CFLAGS_INLINE_LIMIT = 55
# Include these Python libraries in firmware.
-FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_BusDevice
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_CircuitPlayground
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_HID
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_LIS3DH
diff --git a/ports/atmel-samd/boards/circuitplayground_express_crickit/board.c b/ports/atmel-samd/boards/circuitplayground_express_crickit/board.c
index 21217caac..13fed598e 100644
--- a/ports/atmel-samd/boards/circuitplayground_express_crickit/board.c
+++ b/ports/atmel-samd/boards/circuitplayground_express_crickit/board.c
@@ -26,7 +26,7 @@
#include <string.h>
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "common-hal/microcontroller/Pin.h"
#include "hal/include/hal_gpio.h"
#include "supervisor/shared/board.h"
@@ -53,5 +53,5 @@ bool board_requests_safe_mode(void) {
}
void reset_board(void) {
- board_reset_user_neopixels();
+ board_reset_user_neopixels(&pin_PB23, 10);
}
diff --git a/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.h b/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.h
index 5673be290..bc4055421 100644
--- a/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.h
+++ b/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.h
@@ -24,8 +24,6 @@
#define CALIBRATE_CRYSTALLESS 1
-#define USER_NEOPIXELS_PIN (&pin_PB23)
-
// Explanation of how a user got into safe mode.
#define BOARD_USER_SAFE_MODE_ACTION translate("pressing both buttons at start up.\n")
diff --git a/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk b/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk
index 7aa45eb39..31e10d736 100644
--- a/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk
@@ -25,7 +25,6 @@ CFLAGS_INLINE_LIMIT = 50
# Include these Python libraries in firmware.
-FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_BusDevice
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_CircuitPlayground
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Crickit
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_LIS3DH
diff --git a/ports/atmel-samd/boards/circuitplayground_express_displayio/board.c b/ports/atmel-samd/boards/circuitplayground_express_displayio/board.c
index 21217caac..13fed598e 100644
--- a/ports/atmel-samd/boards/circuitplayground_express_displayio/board.c
+++ b/ports/atmel-samd/boards/circuitplayground_express_displayio/board.c
@@ -26,7 +26,7 @@
#include <string.h>
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "common-hal/microcontroller/Pin.h"
#include "hal/include/hal_gpio.h"
#include "supervisor/shared/board.h"
@@ -53,5 +53,5 @@ bool board_requests_safe_mode(void) {
}
void reset_board(void) {
- board_reset_user_neopixels();
+ board_reset_user_neopixels(&pin_PB23, 10);
}
diff --git a/ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.h b/ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.h
index fab235149..4b0c324fa 100644
--- a/ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.h
+++ b/ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.h
@@ -30,8 +30,6 @@
// Increase stack size slightly due to CPX library import nesting.
#define CIRCUITPY_DEFAULT_STACK_SIZE (4248) // divisible by 8
-#define USER_NEOPIXELS_PIN (&pin_PB23)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PB03)
#define DEFAULT_I2C_BUS_SDA (&pin_PB02)
diff --git a/ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.mk b/ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.mk
index 3a43093a9..36b49b0ee 100644
--- a/ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.mk
@@ -26,7 +26,6 @@ SUPEROPT_GC = 0
CFLAGS_INLINE_LIMIT = 55
# Include these Python libraries in firmware.
-FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_BusDevice
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_CircuitPlayground
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_LIS3DH
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel
diff --git a/ports/atmel-samd/boards/cp32-m4/board.c b/ports/atmel-samd/boards/cp32-m4/board.c
index 0f60736a2..7af05ba45 100644
--- a/ports/atmel-samd/boards/cp32-m4/board.c
+++ b/ports/atmel-samd/boards/cp32-m4/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
diff --git a/ports/litex/boards/board.h b/ports/atmel-samd/boards/cp_sapling_m0/board.c
index 837b37190..cde441b3d 100644
--- a/ports/litex/boards/board.h
+++ b/ports/atmel-samd/boards/cp_sapling_m0/board.c
@@ -24,22 +24,17 @@
* THE SOFTWARE.
*/
-// This file defines board specific functions.
+#include "supervisor/board.h"
+#include "common-hal/microcontroller/Pin.h"
+#include "supervisor/shared/board.h"
+#include "hal/include/hal_gpio.h"
-#ifndef MICROPY_INCLUDED_LITEX_BOARDS_BOARD_H
-#define MICROPY_INCLUDED_LITEX_BOARDS_BOARD_H
+void board_init(void) {
+}
-#include <stdbool.h>
+bool board_requests_safe_mode(void) {
+ return false;
+}
-// Initializes board related state once on start up.
-void board_init(void);
-
-// Returns true if the user initiates safe mode in a board specific way.
-// Also add BOARD_USER_SAFE_MODE in mpconfigboard.h to explain the board specific
-// way.
-bool board_requests_safe_mode(void);
-
-// Reset the state of off MCU components such as neopixels.
-void reset_board(void);
-
-#endif // MICROPY_INCLUDED_LITEX_BOARDS_BOARD_H
+void reset_board(void) {
+}
diff --git a/ports/atmel-samd/boards/cp_sapling_m0/mpconfigboard.h b/ports/atmel-samd/boards/cp_sapling_m0/mpconfigboard.h
new file mode 100644
index 000000000..c67f022eb
--- /dev/null
+++ b/ports/atmel-samd/boards/cp_sapling_m0/mpconfigboard.h
@@ -0,0 +1,57 @@
+#define MICROPY_HW_BOARD_NAME "CP Sapling M0"
+#define MICROPY_HW_MCU_NAME "samd21e18"
+
+#define MICROPY_HW_NEOPIXEL (&pin_PA15)
+
+#define MICROPY_PORT_A (0)
+#define MICROPY_PORT_B (0)
+#define MICROPY_PORT_C (0)
+
+#define IGNORE_PIN_PA02 1
+#define IGNORE_PIN_PA03 1
+#define IGNORE_PIN_PA04 1
+#define IGNORE_PIN_PA05 1
+#define IGNORE_PIN_PA06 1
+#define IGNORE_PIN_PA07 1
+#define IGNORE_PIN_PA12 1
+#define IGNORE_PIN_PA13 1
+#define IGNORE_PIN_PA14 1
+#define IGNORE_PIN_PA20 1
+#define IGNORE_PIN_PA21 1
+// USB is always used internally so skip the pin objects for it.
+#define IGNORE_PIN_PA24 1
+#define IGNORE_PIN_PA25 1
+#define IGNORE_PIN_PA27 1
+#define IGNORE_PIN_PA28 1
+#define IGNORE_PIN_PA30 1
+#define IGNORE_PIN_PA31 1
+#define IGNORE_PIN_PB01 1
+#define IGNORE_PIN_PB02 1
+#define IGNORE_PIN_PB03 1
+#define IGNORE_PIN_PB04 1
+#define IGNORE_PIN_PB05 1
+#define IGNORE_PIN_PB06 1
+#define IGNORE_PIN_PB07 1
+#define IGNORE_PIN_PB08 1
+#define IGNORE_PIN_PB09 1
+#define IGNORE_PIN_PB10 1
+#define IGNORE_PIN_PB11 1
+#define IGNORE_PIN_PB12 1
+#define IGNORE_PIN_PB13 1
+#define IGNORE_PIN_PB14 1
+#define IGNORE_PIN_PB15 1
+#define IGNORE_PIN_PB16 1
+#define IGNORE_PIN_PB17 1
+#define IGNORE_PIN_PB22 1
+#define IGNORE_PIN_PB23 1
+#define IGNORE_PIN_PB30 1
+#define IGNORE_PIN_PB31 1
+#define IGNORE_PIN_PB00 1
+
+#define DEFAULT_I2C_BUS_SCL (&pin_PA09)
+#define DEFAULT_I2C_BUS_SDA (&pin_PA08)
+
+#define DEFAULT_SPI_BUS_SS (&pin_PA22)
+#define DEFAULT_SPI_BUS_SCK (&pin_PA19)
+#define DEFAULT_SPI_BUS_MOSI (&pin_PA18)
+#define DEFAULT_SPI_BUS_MISO (&pin_PA17)
diff --git a/ports/atmel-samd/boards/cp_sapling_m0/mpconfigboard.mk b/ports/atmel-samd/boards/cp_sapling_m0/mpconfigboard.mk
new file mode 100644
index 000000000..861a0a5f7
--- /dev/null
+++ b/ports/atmel-samd/boards/cp_sapling_m0/mpconfigboard.mk
@@ -0,0 +1,24 @@
+USB_VID = 0x1209
+USB_PID = 0x4DDD
+USB_PRODUCT = "CP Sapling"
+USB_MANUFACTURER = "Oak Development Technologies"
+
+CHIP_VARIANT = SAMD21E18A
+CHIP_FAMILY = samd21
+
+INTERNAL_FLASH_FILESYSTEM = 1
+LONGINT_IMPL = NONE
+CIRCUITPY_FULL_BUILD = 0
+
+SUPEROPT_GC = 0
+
+CFLAGS_BOARD = --param max-inline-insns-auto=15
+ifeq ($(TRANSLATION), zh_Latn_pinyin)
+RELEASE_NEEDS_CLEAN_BUILD = 1
+CFLAGS_INLINE_LIMIT = 35
+endif
+ifeq ($(TRANSLATION), de_DE)
+RELEASE_NEEDS_CLEAN_BUILD = 1
+CFLAGS_INLINE_LIMIT = 35
+SUPEROPT_VM = 0
+endif
diff --git a/ports/atmel-samd/boards/cp_sapling_m0/pins.c b/ports/atmel-samd/boards/cp_sapling_m0/pins.c
new file mode 100644
index 000000000..d527aaddc
--- /dev/null
+++ b/ports/atmel-samd/boards/cp_sapling_m0/pins.c
@@ -0,0 +1,38 @@
+#include "shared-bindings/board/__init__.h"
+
+STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
+
+ { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_PA08) },
+ { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_PA08) },
+
+ { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_PA00) },
+ { MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_PA00) },
+
+ { MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_PA01) },
+ { MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_PA01) },
+
+ { MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_PA09) },
+ { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_PA09) },
+
+ { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_PA22) },
+ { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA22) },
+ { MP_ROM_QSTR(MP_QSTR_SS), MP_ROM_PTR(&pin_PA22) },
+
+ { MP_ROM_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_PA19) },
+ { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_PA19) },
+ { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_PA19) },
+
+ { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_PA17) },
+ { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_PA17) },
+ { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_PA17) },
+
+ { MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_PA18) },
+ { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_PA18) },
+ { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_PA18) },
+
+ { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_PA15) },
+
+ { 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_DEFINE_CONST_DICT(board_module_globals, board_global_dict_table);
diff --git a/ports/stm/boards/board.h b/ports/atmel-samd/boards/cp_sapling_m0_spiflash/board.c
index 22d9e99be..cde441b3d 100644
--- a/ports/stm/boards/board.h
+++ b/ports/atmel-samd/boards/cp_sapling_m0_spiflash/board.c
@@ -24,22 +24,17 @@
* THE SOFTWARE.
*/
-// This file defines board specific functions.
+#include "supervisor/board.h"
+#include "common-hal/microcontroller/Pin.h"
+#include "supervisor/shared/board.h"
+#include "hal/include/hal_gpio.h"
-#ifndef MICROPY_INCLUDED_STM32F4_BOARDS_BOARD_H
-#define MICROPY_INCLUDED_STM32F4_BOARDS_BOARD_H
+void board_init(void) {
+}
-#include <stdbool.h>
+bool board_requests_safe_mode(void) {
+ return false;
+}
-// Initializes board related state once on start up.
-void board_init(void);
-
-// Returns true if the user initiates safe mode in a board specific way.
-// Also add BOARD_USER_SAFE_MODE in mpconfigboard.h to explain the board specific
-// way.
-bool board_requests_safe_mode(void);
-
-// Reset the state of off MCU components such as neopixels.
-void reset_board(void);
-
-#endif // MICROPY_INCLUDED_STM32F4_BOARDS_BOARD_H
+void reset_board(void) {
+}
diff --git a/ports/atmel-samd/boards/cp_sapling_m0_spiflash/mpconfigboard.h b/ports/atmel-samd/boards/cp_sapling_m0_spiflash/mpconfigboard.h
new file mode 100644
index 000000000..9c69c4802
--- /dev/null
+++ b/ports/atmel-samd/boards/cp_sapling_m0_spiflash/mpconfigboard.h
@@ -0,0 +1,62 @@
+#define MICROPY_HW_BOARD_NAME "CP Sapling M0 w/ SPI Flash"
+#define MICROPY_HW_MCU_NAME "samd21e18"
+
+#define MICROPY_HW_NEOPIXEL (&pin_PA15)
+
+#define MICROPY_PORT_A (0)
+#define MICROPY_PORT_B (0)
+#define MICROPY_PORT_C (0)
+
+#define SPI_FLASH_MOSI_PIN &pin_PA18
+#define SPI_FLASH_MISO_PIN &pin_PA17
+#define SPI_FLASH_SCK_PIN &pin_PA19
+#define SPI_FLASH_CS_PIN &pin_PA22
+
+#define IGNORE_PIN_PA02 1
+#define IGNORE_PIN_PA03 1
+#define IGNORE_PIN_PA04 1
+#define IGNORE_PIN_PA05 1
+#define IGNORE_PIN_PA06 1
+#define IGNORE_PIN_PA07 1
+#define IGNORE_PIN_PA12 1
+#define IGNORE_PIN_PA13 1
+#define IGNORE_PIN_PA14 1
+#define IGNORE_PIN_PA20 1
+#define IGNORE_PIN_PA21 1
+// USB is always used internally so skip the pin objects for it.
+#define IGNORE_PIN_PA24 1
+#define IGNORE_PIN_PA25 1
+#define IGNORE_PIN_PA27 1
+#define IGNORE_PIN_PA28 1
+#define IGNORE_PIN_PA30 1
+#define IGNORE_PIN_PA31 1
+#define IGNORE_PIN_PB01 1
+#define IGNORE_PIN_PB02 1
+#define IGNORE_PIN_PB03 1
+#define IGNORE_PIN_PB04 1
+#define IGNORE_PIN_PB05 1
+#define IGNORE_PIN_PB06 1
+#define IGNORE_PIN_PB07 1
+#define IGNORE_PIN_PB08 1
+#define IGNORE_PIN_PB09 1
+#define IGNORE_PIN_PB10 1
+#define IGNORE_PIN_PB11 1
+#define IGNORE_PIN_PB12 1
+#define IGNORE_PIN_PB13 1
+#define IGNORE_PIN_PB14 1
+#define IGNORE_PIN_PB15 1
+#define IGNORE_PIN_PB16 1
+#define IGNORE_PIN_PB17 1
+#define IGNORE_PIN_PB22 1
+#define IGNORE_PIN_PB23 1
+#define IGNORE_PIN_PB30 1
+#define IGNORE_PIN_PB31 1
+#define IGNORE_PIN_PB00 1
+
+#define DEFAULT_I2C_BUS_SCL (&pin_PA09)
+#define DEFAULT_I2C_BUS_SDA (&pin_PA08)
+
+#define DEFAULT_SPI_BUS_SS (&pin_PA22)
+#define DEFAULT_SPI_BUS_SCK (&pin_PA19)
+#define DEFAULT_SPI_BUS_MOSI (&pin_PA18)
+#define DEFAULT_SPI_BUS_MISO (&pin_PA17)
diff --git a/ports/atmel-samd/boards/cp_sapling_m0_spiflash/mpconfigboard.mk b/ports/atmel-samd/boards/cp_sapling_m0_spiflash/mpconfigboard.mk
new file mode 100644
index 000000000..99e13f791
--- /dev/null
+++ b/ports/atmel-samd/boards/cp_sapling_m0_spiflash/mpconfigboard.mk
@@ -0,0 +1,33 @@
+USB_VID = 0x1209
+USB_PID = 0x4DDE
+USB_PRODUCT = "CP Sapling M0 w/ SPI Flash"
+USB_MANUFACTURER = "Oak Development Technologies"
+
+CHIP_VARIANT = SAMD21E18A
+CHIP_FAMILY = samd21
+
+INTERNAL_FLASH_FILESYSTEM = 0
+LONGINT_IMPL = MPZ
+SPI_FLASH_FILESYSTEM = 1
+EXTERNAL_FLASH_DEVICE_COUNT = 1
+EXTERNAL_FLASH_DEVICES = AT25DF081A
+
+CIRCUITPY_AUDIOIO = 0
+CIRCUITPY_AUDIOBUSIO = 0
+CIRCUITPY_BITBANGIO = 0
+CIRCUITPY_COUNTIO = 0
+CIRCUITPY_FREQUENCYIO = 0
+CIRCUITPY_I2CPERIPHERAL = 0
+
+SUPEROPT_GC = 0
+
+CFLAGS_BOARD = --param max-inline-insns-auto=15
+ifeq ($(TRANSLATION), zh_Latn_pinyin)
+RELEASE_NEEDS_CLEAN_BUILD = 1
+CFLAGS_INLINE_LIMIT = 35
+endif
+ifeq ($(TRANSLATION), de_DE)
+RELEASE_NEEDS_CLEAN_BUILD = 1
+CFLAGS_INLINE_LIMIT = 35
+SUPEROPT_VM = 0
+endif
diff --git a/ports/atmel-samd/boards/cp_sapling_m0_spiflash/pins.c b/ports/atmel-samd/boards/cp_sapling_m0_spiflash/pins.c
new file mode 100644
index 000000000..d527aaddc
--- /dev/null
+++ b/ports/atmel-samd/boards/cp_sapling_m0_spiflash/pins.c
@@ -0,0 +1,38 @@
+#include "shared-bindings/board/__init__.h"
+
+STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
+
+ { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_PA08) },
+ { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_PA08) },
+
+ { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_PA00) },
+ { MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_PA00) },
+
+ { MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_PA01) },
+ { MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_PA01) },
+
+ { MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_PA09) },
+ { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_PA09) },
+
+ { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_PA22) },
+ { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA22) },
+ { MP_ROM_QSTR(MP_QSTR_SS), MP_ROM_PTR(&pin_PA22) },
+
+ { MP_ROM_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_PA19) },
+ { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_PA19) },
+ { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_PA19) },
+
+ { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_PA17) },
+ { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_PA17) },
+ { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_PA17) },
+
+ { MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_PA18) },
+ { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_PA18) },
+ { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_PA18) },
+
+ { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_PA15) },
+
+ { 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_DEFINE_CONST_DICT(board_module_globals, board_global_dict_table);
diff --git a/ports/atmel-samd/boards/datalore_ip_m4/board.c b/ports/atmel-samd/boards/datalore_ip_m4/board.c
index 0f60736a2..7af05ba45 100644
--- a/ports/atmel-samd/boards/datalore_ip_m4/board.c
+++ b/ports/atmel-samd/boards/datalore_ip_m4/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
diff --git a/ports/atmel-samd/boards/datum_distance/board.c b/ports/atmel-samd/boards/datum_distance/board.c
index c8e20206a..6baa43ffa 100644
--- a/ports/atmel-samd/boards/datum_distance/board.c
+++ b/ports/atmel-samd/boards/datum_distance/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void)
{
diff --git a/ports/atmel-samd/boards/datum_imu/board.c b/ports/atmel-samd/boards/datum_imu/board.c
index c8e20206a..6baa43ffa 100644
--- a/ports/atmel-samd/boards/datum_imu/board.c
+++ b/ports/atmel-samd/boards/datum_imu/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void)
{
diff --git a/ports/atmel-samd/boards/datum_light/board.c b/ports/atmel-samd/boards/datum_light/board.c
index c8e20206a..6baa43ffa 100644
--- a/ports/atmel-samd/boards/datum_light/board.c
+++ b/ports/atmel-samd/boards/datum_light/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void)
{
diff --git a/ports/atmel-samd/boards/datum_weather/board.c b/ports/atmel-samd/boards/datum_weather/board.c
index c8e20206a..6baa43ffa 100644
--- a/ports/atmel-samd/boards/datum_weather/board.c
+++ b/ports/atmel-samd/boards/datum_weather/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void)
{
diff --git a/ports/atmel-samd/boards/dynossat_edu_eps/board.c b/ports/atmel-samd/boards/dynossat_edu_eps/board.c
index c8e20206a..6baa43ffa 100644
--- a/ports/atmel-samd/boards/dynossat_edu_eps/board.c
+++ b/ports/atmel-samd/boards/dynossat_edu_eps/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void)
{
diff --git a/ports/atmel-samd/boards/dynossat_edu_eps/mpconfigboard.mk b/ports/atmel-samd/boards/dynossat_edu_eps/mpconfigboard.mk
index 6d2c1379d..303df650e 100644
--- a/ports/atmel-samd/boards/dynossat_edu_eps/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/dynossat_edu_eps/mpconfigboard.mk
@@ -18,6 +18,7 @@ CIRCUITPY_FREQUENCYIO = 0
CIRCUITPY_COUNTIO = 0
CIRCUITPY_I2CPERIPHERAL = 1
CIRCUITPY_VECTORIO = 0
+CIRCUITPY_BUSDEVICE = 0
CIRCUITPY_DISPLAYIO = 0
CIRCUITPY_TOUCHIO = 0
CIRCUITPY_ROTARYIO = 0
diff --git a/ports/atmel-samd/boards/dynossat_edu_obc/board.c b/ports/atmel-samd/boards/dynossat_edu_obc/board.c
index c8e20206a..6baa43ffa 100644
--- a/ports/atmel-samd/boards/dynossat_edu_obc/board.c
+++ b/ports/atmel-samd/boards/dynossat_edu_obc/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void)
{
diff --git a/ports/atmel-samd/boards/escornabot_makech/board.c b/ports/atmel-samd/boards/escornabot_makech/board.c
index 881e15e0c..5afe2fb65 100644
--- a/ports/atmel-samd/boards/escornabot_makech/board.c
+++ b/ports/atmel-samd/boards/escornabot_makech/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void)
{
diff --git a/ports/atmel-samd/boards/feather_m0_adalogger/board.c b/ports/atmel-samd/boards/feather_m0_adalogger/board.c
index c8e20206a..6baa43ffa 100644
--- a/ports/atmel-samd/boards/feather_m0_adalogger/board.c
+++ b/ports/atmel-samd/boards/feather_m0_adalogger/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void)
{
diff --git a/ports/atmel-samd/boards/feather_m0_basic/board.c b/ports/atmel-samd/boards/feather_m0_basic/board.c
index c8e20206a..6baa43ffa 100644
--- a/ports/atmel-samd/boards/feather_m0_basic/board.c
+++ b/ports/atmel-samd/boards/feather_m0_basic/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void)
{
diff --git a/ports/atmel-samd/boards/feather_m0_express/board.c b/ports/atmel-samd/boards/feather_m0_express/board.c
index c8e20206a..6baa43ffa 100644
--- a/ports/atmel-samd/boards/feather_m0_express/board.c
+++ b/ports/atmel-samd/boards/feather_m0_express/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void)
{
diff --git a/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk
index dc02e1f60..2fe085567 100644
--- a/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk
@@ -16,6 +16,7 @@ CIRCUITPY_FREQUENCYIO = 0
CIRCUITPY_COUNTIO = 0
CIRCUITPY_I2CPERIPHERAL = 0
CIRCUITPY_VECTORIO = 0
+CIRCUITPY_BUSDEVICE = 0
CFLAGS_INLINE_LIMIT = 60
SUPEROPT_GC = 0
diff --git a/ports/atmel-samd/boards/feather_m0_express_crickit/board.c b/ports/atmel-samd/boards/feather_m0_express_crickit/board.c
index c8e20206a..6baa43ffa 100644
--- a/ports/atmel-samd/boards/feather_m0_express_crickit/board.c
+++ b/ports/atmel-samd/boards/feather_m0_express_crickit/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void)
{
diff --git a/ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.mk
index 5624144e8..331a3110e 100644
--- a/ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.mk
@@ -20,7 +20,6 @@ CIRCUITPY_GAMEPAD = 0
CFLAGS_INLINE_LIMIT = 50
# Include these Python libraries in firmware.
-FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_BusDevice
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Crickit
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Motor
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel
diff --git a/ports/atmel-samd/boards/feather_m0_rfm69/board.c b/ports/atmel-samd/boards/feather_m0_rfm69/board.c
index c8e20206a..6baa43ffa 100644
--- a/ports/atmel-samd/boards/feather_m0_rfm69/board.c
+++ b/ports/atmel-samd/boards/feather_m0_rfm69/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void)
{
diff --git a/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.mk
index d746cdf81..6ea21ed82 100644
--- a/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.mk
@@ -21,11 +21,11 @@ CIRCUITPY_SAMD = 0
CIRCUITPY_USB_MIDI = 0
CIRCUITPY_USB_HID = 0
CIRCUITPY_TOUCHIO = 0
+CIRCUITPY_BUSDEVICE = 1
CFLAGS_INLINE_LIMIT = 35
# Make more room.
SUPEROPT_GC = 0
# Include these Python libraries in firmware.
-FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_BusDevice
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_RFM69
diff --git a/ports/atmel-samd/boards/feather_m0_rfm9x/board.c b/ports/atmel-samd/boards/feather_m0_rfm9x/board.c
index c8e20206a..6baa43ffa 100644
--- a/ports/atmel-samd/boards/feather_m0_rfm9x/board.c
+++ b/ports/atmel-samd/boards/feather_m0_rfm9x/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void)
{
diff --git a/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.mk
index d37334688..76a6be2e3 100644
--- a/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.mk
@@ -22,11 +22,11 @@ CIRCUITPY_SAMD = 0
CIRCUITPY_USB_MIDI = 0
CIRCUITPY_USB_HID = 0
CIRCUITPY_TOUCHIO = 0
+CIRCUITPY_BUSDEVICE = 1
CFLAGS_INLINE_LIMIT = 35
# Make more room.
SUPEROPT_GC = 0
# Include these Python libraries in firmware.
-FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_BusDevice
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_RFM9x
diff --git a/ports/atmel-samd/boards/feather_m0_supersized/board.c b/ports/atmel-samd/boards/feather_m0_supersized/board.c
index c8e20206a..6baa43ffa 100644
--- a/ports/atmel-samd/boards/feather_m0_supersized/board.c
+++ b/ports/atmel-samd/boards/feather_m0_supersized/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void)
{
diff --git a/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk
index 6f7f2d8b6..c2d692f9b 100644
--- a/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/feather_m0_supersized/mpconfigboard.mk
@@ -17,6 +17,7 @@ CIRCUITPY_COUNTIO = 0
CIRCUITPY_I2CPERIPHERAL = 0
# supersized, not ultra-supersized
CIRCUITPY_VECTORIO = 0
+CIRCUITPY_BUSDEVICE = 0
CFLAGS_INLINE_LIMIT = 60
SUPEROPT_GC = 0
diff --git a/ports/atmel-samd/boards/feather_m4_can/board.c b/ports/atmel-samd/boards/feather_m4_can/board.c
index 8096b9b8e..5fca974e9 100644
--- a/ports/atmel-samd/boards/feather_m4_can/board.c
+++ b/ports/atmel-samd/boards/feather_m4_can/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
void board_init(void) {
diff --git a/ports/atmel-samd/boards/feather_m4_express/board.c b/ports/atmel-samd/boards/feather_m4_express/board.c
index 8096b9b8e..5fca974e9 100644
--- a/ports/atmel-samd/boards/feather_m4_express/board.c
+++ b/ports/atmel-samd/boards/feather_m4_express/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
void board_init(void) {
diff --git a/ports/atmel-samd/boards/feather_radiofruit_zigbee/board.c b/ports/atmel-samd/boards/feather_radiofruit_zigbee/board.c
index c8e20206a..6baa43ffa 100755
--- a/ports/atmel-samd/boards/feather_radiofruit_zigbee/board.c
+++ b/ports/atmel-samd/boards/feather_radiofruit_zigbee/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void)
{
diff --git a/ports/atmel-samd/boards/fluff_m0/board.c b/ports/atmel-samd/boards/fluff_m0/board.c
index c8e20206a..6baa43ffa 100644
--- a/ports/atmel-samd/boards/fluff_m0/board.c
+++ b/ports/atmel-samd/boards/fluff_m0/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void)
{
diff --git a/ports/atmel-samd/boards/gemma_m0/board.c b/ports/atmel-samd/boards/gemma_m0/board.c
index c8e20206a..6baa43ffa 100644
--- a/ports/atmel-samd/boards/gemma_m0/board.c
+++ b/ports/atmel-samd/boards/gemma_m0/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void)
{
diff --git a/ports/atmel-samd/boards/grandcentral_m4_express/board.c b/ports/atmel-samd/boards/grandcentral_m4_express/board.c
index 7599f02b8..5ed8c8404 100644
--- a/ports/atmel-samd/boards/grandcentral_m4_express/board.c
+++ b/ports/atmel-samd/boards/grandcentral_m4_express/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
diff --git a/ports/atmel-samd/boards/hallowing_m0_express/board.c b/ports/atmel-samd/boards/hallowing_m0_express/board.c
index 14a2bdb81..8b922d6be 100644
--- a/ports/atmel-samd/boards/hallowing_m0_express/board.c
+++ b/ports/atmel-samd/boards/hallowing_m0_express/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "shared-bindings/board/__init__.h"
#include "shared-bindings/displayio/FourWire.h"
diff --git a/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.mk b/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.mk
index 1931ceb9a..2b211abd4 100644
--- a/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.mk
@@ -27,7 +27,6 @@ CFLAGS_INLINE_LIMIT = 55
SUPEROPT_GC = 0
# Include these Python libraries in firmware.
-FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_BusDevice
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_LIS3DH
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel
diff --git a/ports/atmel-samd/boards/hallowing_m0_express/pins.c b/ports/atmel-samd/boards/hallowing_m0_express/pins.c
index 3e670a676..5d1dda51a 100644
--- a/ports/atmel-samd/boards/hallowing_m0_express/pins.c
+++ b/ports/atmel-samd/boards/hallowing_m0_express/pins.c
@@ -1,6 +1,6 @@
#include "shared-bindings/board/__init__.h"
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "shared-module/displayio/__init__.h"
STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
diff --git a/ports/atmel-samd/boards/hallowing_m4_express/board.c b/ports/atmel-samd/boards/hallowing_m4_express/board.c
index 61e797d65..f51d4282d 100644
--- a/ports/atmel-samd/boards/hallowing_m4_express/board.c
+++ b/ports/atmel-samd/boards/hallowing_m4_express/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
#include "shared-bindings/busio/SPI.h"
diff --git a/ports/atmel-samd/boards/itsybitsy_m0_express/board.c b/ports/atmel-samd/boards/itsybitsy_m0_express/board.c
index d7e856d61..84960e73c 100644
--- a/ports/atmel-samd/boards/itsybitsy_m0_express/board.c
+++ b/ports/atmel-samd/boards/itsybitsy_m0_express/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/atmel-samd/boards/itsybitsy_m4_express/board.c b/ports/atmel-samd/boards/itsybitsy_m4_express/board.c
index 0f60736a2..7af05ba45 100644
--- a/ports/atmel-samd/boards/itsybitsy_m4_express/board.c
+++ b/ports/atmel-samd/boards/itsybitsy_m4_express/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
diff --git a/ports/atmel-samd/boards/kicksat-sprite/board.c b/ports/atmel-samd/boards/kicksat-sprite/board.c
index 75cdfbc82..d7f78e764 100644
--- a/ports/atmel-samd/boards/kicksat-sprite/board.c
+++ b/ports/atmel-samd/boards/kicksat-sprite/board.c
@@ -27,7 +27,7 @@
#include <string.h>
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "py/mpconfig.h"
void board_init(void) {
diff --git a/ports/atmel-samd/boards/kicksat-sprite/pins.c b/ports/atmel-samd/boards/kicksat-sprite/pins.c
index 87d894c58..27ee90323 100644
--- a/ports/atmel-samd/boards/kicksat-sprite/pins.c
+++ b/ports/atmel-samd/boards/kicksat-sprite/pins.c
@@ -1,5 +1,5 @@
#include "shared-bindings/board/__init__.h"
-#include "boards/board.h"
+#include "supervisor/board.h"
STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_PA05) },
diff --git a/ports/atmel-samd/boards/loc_ber_m4_base_board/board.c b/ports/atmel-samd/boards/loc_ber_m4_base_board/board.c
index 0f60736a2..7af05ba45 100644
--- a/ports/atmel-samd/boards/loc_ber_m4_base_board/board.c
+++ b/ports/atmel-samd/boards/loc_ber_m4_base_board/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
diff --git a/ports/atmel-samd/boards/matrixportal_m4/board.c b/ports/atmel-samd/boards/matrixportal_m4/board.c
index 2d4f30239..52ecd8302 100644
--- a/ports/atmel-samd/boards/matrixportal_m4/board.c
+++ b/ports/atmel-samd/boards/matrixportal_m4/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
diff --git a/ports/atmel-samd/boards/meowmeow/board.c b/ports/atmel-samd/boards/meowmeow/board.c
index 881e15e0c..5afe2fb65 100644
--- a/ports/atmel-samd/boards/meowmeow/board.c
+++ b/ports/atmel-samd/boards/meowmeow/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void)
{
diff --git a/ports/atmel-samd/boards/metro_m0_express/board.c b/ports/atmel-samd/boards/metro_m0_express/board.c
index bd63baa6f..bb1c5335c 100644
--- a/ports/atmel-samd/boards/metro_m0_express/board.c
+++ b/ports/atmel-samd/boards/metro_m0_express/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
void board_init(void)
diff --git a/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk b/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk
index 7dd965000..c35854758 100644
--- a/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk
@@ -15,6 +15,7 @@ CIRCUITPY_BITBANGIO = 0
CIRCUITPY_COUNTIO = 0
CIRCUITPY_I2CPERIPHERAL = 0
CIRCUITPY_VECTORIO = 0
+CIRCUITPY_BUSDEVICE = 0
CFLAGS_INLINE_LIMIT = 60
SUPEROPT_GC = 0
diff --git a/ports/atmel-samd/boards/metro_m4_airlift_lite/board.c b/ports/atmel-samd/boards/metro_m4_airlift_lite/board.c
index 0f60736a2..7af05ba45 100644
--- a/ports/atmel-samd/boards/metro_m4_airlift_lite/board.c
+++ b/ports/atmel-samd/boards/metro_m4_airlift_lite/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
diff --git a/ports/atmel-samd/boards/metro_m4_express/board.c b/ports/atmel-samd/boards/metro_m4_express/board.c
index 0f60736a2..7af05ba45 100644
--- a/ports/atmel-samd/boards/metro_m4_express/board.c
+++ b/ports/atmel-samd/boards/metro_m4_express/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
diff --git a/ports/atmel-samd/boards/mini_sam_m4/board.c b/ports/atmel-samd/boards/mini_sam_m4/board.c
index 0f60736a2..7af05ba45 100644
--- a/ports/atmel-samd/boards/mini_sam_m4/board.c
+++ b/ports/atmel-samd/boards/mini_sam_m4/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
diff --git a/ports/atmel-samd/boards/monster_m4sk/board.c b/ports/atmel-samd/boards/monster_m4sk/board.c
index 45fea9d52..2b757d091 100644
--- a/ports/atmel-samd/boards/monster_m4sk/board.c
+++ b/ports/atmel-samd/boards/monster_m4sk/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
#include "shared-bindings/busio/SPI.h"
diff --git a/ports/atmel-samd/boards/monster_m4sk/pins.c b/ports/atmel-samd/boards/monster_m4sk/pins.c
index 7272b9ed8..c3eff7cc3 100644
--- a/ports/atmel-samd/boards/monster_m4sk/pins.c
+++ b/ports/atmel-samd/boards/monster_m4sk/pins.c
@@ -1,6 +1,6 @@
#include "shared-bindings/board/__init__.h"
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "shared-module/displayio/__init__.h"
STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
diff --git a/ports/atmel-samd/boards/ndgarage_ndbit6/board.c b/ports/atmel-samd/boards/ndgarage_ndbit6/board.c
index 0f60736a2..7af05ba45 100644
--- a/ports/atmel-samd/boards/ndgarage_ndbit6/board.c
+++ b/ports/atmel-samd/boards/ndgarage_ndbit6/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
diff --git a/ports/atmel-samd/boards/ndgarage_ndbit6_v2/board.c b/ports/atmel-samd/boards/ndgarage_ndbit6_v2/board.c
index 0f60736a2..7af05ba45 100644
--- a/ports/atmel-samd/boards/ndgarage_ndbit6_v2/board.c
+++ b/ports/atmel-samd/boards/ndgarage_ndbit6_v2/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
diff --git a/ports/atmel-samd/boards/nfc_copy_cat/board.c b/ports/atmel-samd/boards/nfc_copy_cat/board.c
index c8e20206a..6baa43ffa 100644
--- a/ports/atmel-samd/boards/nfc_copy_cat/board.c
+++ b/ports/atmel-samd/boards/nfc_copy_cat/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void)
{
diff --git a/ports/atmel-samd/boards/openbook_m4/board.c b/ports/atmel-samd/boards/openbook_m4/board.c
index 07dd1741a..a110779a6 100644
--- a/ports/atmel-samd/boards/openbook_m4/board.c
+++ b/ports/atmel-samd/boards/openbook_m4/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
#include "shared-bindings/busio/SPI.h"
diff --git a/ports/atmel-samd/boards/openbook_m4/pins.c b/ports/atmel-samd/boards/openbook_m4/pins.c
index 47de3043d..45a7bc1dd 100644
--- a/ports/atmel-samd/boards/openbook_m4/pins.c
+++ b/ports/atmel-samd/boards/openbook_m4/pins.c
@@ -1,6 +1,6 @@
#include "shared-bindings/board/__init__.h"
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "shared-module/displayio/__init__.h"
STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
diff --git a/ports/atmel-samd/boards/pewpew10/board.c b/ports/atmel-samd/boards/pewpew10/board.c
index d7e856d61..84960e73c 100644
--- a/ports/atmel-samd/boards/pewpew10/board.c
+++ b/ports/atmel-samd/boards/pewpew10/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/atmel-samd/boards/pewpew_m4/board.c b/ports/atmel-samd/boards/pewpew_m4/board.c
index d02e0dc01..26bd53cad 100644
--- a/ports/atmel-samd/boards/pewpew_m4/board.c
+++ b/ports/atmel-samd/boards/pewpew_m4/board.c
@@ -25,7 +25,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
#include "shared-bindings/busio/SPI.h"
diff --git a/ports/atmel-samd/boards/picoplanet/board.c b/ports/atmel-samd/boards/picoplanet/board.c
index d7e856d61..84960e73c 100644
--- a/ports/atmel-samd/boards/picoplanet/board.c
+++ b/ports/atmel-samd/boards/picoplanet/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/atmel-samd/boards/pirkey_m0/board.c b/ports/atmel-samd/boards/pirkey_m0/board.c
index c8e20206a..6baa43ffa 100644
--- a/ports/atmel-samd/boards/pirkey_m0/board.c
+++ b/ports/atmel-samd/boards/pirkey_m0/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void)
{
diff --git a/ports/atmel-samd/boards/pybadge/board.c b/ports/atmel-samd/boards/pybadge/board.c
index 35f228c75..188bf7bf6 100644
--- a/ports/atmel-samd/boards/pybadge/board.c
+++ b/ports/atmel-samd/boards/pybadge/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
#include "shared-bindings/busio/SPI.h"
@@ -123,5 +123,5 @@ bool board_requests_safe_mode(void) {
}
void reset_board(void) {
- board_reset_user_neopixels();
+ board_reset_user_neopixels(&pin_PA15, 5);
}
diff --git a/ports/atmel-samd/boards/pybadge/mpconfigboard.h b/ports/atmel-samd/boards/pybadge/mpconfigboard.h
index 74a13eb1c..435185322 100644
--- a/ports/atmel-samd/boards/pybadge/mpconfigboard.h
+++ b/ports/atmel-samd/boards/pybadge/mpconfigboard.h
@@ -14,8 +14,6 @@
#define MICROPY_PORT_C (0)
#define MICROPY_PORT_D (0)
-#define USER_NEOPIXELS_PIN (&pin_PA15)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA13)
#define DEFAULT_I2C_BUS_SDA (&pin_PA12)
diff --git a/ports/atmel-samd/boards/pybadge/pins.c b/ports/atmel-samd/boards/pybadge/pins.c
index ca65d9df4..a1802bb07 100644
--- a/ports/atmel-samd/boards/pybadge/pins.c
+++ b/ports/atmel-samd/boards/pybadge/pins.c
@@ -1,6 +1,6 @@
#include "shared-bindings/board/__init__.h"
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "shared-module/displayio/__init__.h"
STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
diff --git a/ports/atmel-samd/boards/pybadge_airlift/board.c b/ports/atmel-samd/boards/pybadge_airlift/board.c
index fe3e4a017..de7eeda09 100644
--- a/ports/atmel-samd/boards/pybadge_airlift/board.c
+++ b/ports/atmel-samd/boards/pybadge_airlift/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
#include "shared-bindings/busio/SPI.h"
@@ -101,5 +101,5 @@ bool board_requests_safe_mode(void) {
}
void reset_board(void) {
- board_reset_user_neopixels();
+ board_reset_user_neopixels(&pin_PA15, 5);
}
diff --git a/ports/atmel-samd/boards/pybadge_airlift/mpconfigboard.h b/ports/atmel-samd/boards/pybadge_airlift/mpconfigboard.h
index c6ab4ed8e..921669d8c 100644
--- a/ports/atmel-samd/boards/pybadge_airlift/mpconfigboard.h
+++ b/ports/atmel-samd/boards/pybadge_airlift/mpconfigboard.h
@@ -14,8 +14,6 @@
#define MICROPY_PORT_C (0)
#define MICROPY_PORT_D (0)
-#define USER_NEOPIXELS_PIN (&pin_PA15)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA13)
#define DEFAULT_I2C_BUS_SDA (&pin_PA12)
@@ -23,9 +21,6 @@
#define DEFAULT_SPI_BUS_MOSI (&pin_PB23)
#define DEFAULT_SPI_BUS_MISO (&pin_PB22)
-#define DEFAULT_UART_BUS_RX (&pin_PB17)
-#define DEFAULT_UART_BUS_TX (&pin_PB16)
-
// USB is always used internally so skip the pin objects for it.
#define IGNORE_PIN_PA24 1
#define IGNORE_PIN_PA25 1
diff --git a/ports/atmel-samd/boards/pybadge_airlift/pins.c b/ports/atmel-samd/boards/pybadge_airlift/pins.c
index d39650246..cdf8071da 100644
--- a/ports/atmel-samd/boards/pybadge_airlift/pins.c
+++ b/ports/atmel-samd/boards/pybadge_airlift/pins.c
@@ -1,6 +1,6 @@
#include "shared-bindings/board/__init__.h"
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "shared-module/displayio/__init__.h"
STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
@@ -30,10 +30,6 @@ STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
{MP_OBJ_NEW_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_PA22)},
{MP_OBJ_NEW_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_PA23)},
- // UART
- {MP_OBJ_NEW_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_PB17)},
- {MP_OBJ_NEW_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_PB16)},
-
// I2C
{MP_OBJ_NEW_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_PA12)},
{MP_OBJ_NEW_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_PA13)},
@@ -58,6 +54,8 @@ STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
{MP_OBJ_NEW_QSTR(MP_QSTR_ESP_GPIO0), MP_ROM_PTR(&pin_PA31)},
{MP_OBJ_NEW_QSTR(MP_QSTR_ESP_BUSY), MP_ROM_PTR(&pin_PA00)},
{MP_OBJ_NEW_QSTR(MP_QSTR_ESP_RESET), MP_ROM_PTR(&pin_PB12)},
+ {MP_OBJ_NEW_QSTR(MP_QSTR_ESP_TX), MP_ROM_PTR(&pin_PB16)},
+ {MP_OBJ_NEW_QSTR(MP_QSTR_ESP_RX), MP_ROM_PTR(&pin_PB17)},
// TFT control pins
{MP_OBJ_NEW_QSTR(MP_QSTR_TFT_LITE), MP_ROM_PTR(&pin_PA01)},
@@ -69,7 +67,6 @@ STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
{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)},
{MP_ROM_QSTR(MP_QSTR_DISPLAY), MP_ROM_PTR(&displays[0].display)}};
MP_DEFINE_CONST_DICT(board_module_globals, board_global_dict_table);
diff --git a/ports/atmel-samd/boards/pycubed/board.c b/ports/atmel-samd/boards/pycubed/board.c
index 0bf586ad8..f092a8d20 100644
--- a/ports/atmel-samd/boards/pycubed/board.c
+++ b/ports/atmel-samd/boards/pycubed/board.c
@@ -27,7 +27,7 @@
#include <string.h>
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "py/mpconfig.h"
#include "shared-bindings/nvm/ByteArray.h"
#include "common-hal/microcontroller/Pin.h"
diff --git a/ports/atmel-samd/boards/pycubed/mpconfigboard.mk b/ports/atmel-samd/boards/pycubed/mpconfigboard.mk
index b7b8073ab..a82362b8d 100644
--- a/ports/atmel-samd/boards/pycubed/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/pycubed/mpconfigboard.mk
@@ -21,7 +21,6 @@ CIRCUITPY_GAMEPAD = 0
CIRCUITPY_RGBMATRIX = 0
CIRCUITPY_PS2IO = 0
-FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_BusDevice
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Register
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_SD
diff --git a/ports/atmel-samd/boards/pycubed/pins.c b/ports/atmel-samd/boards/pycubed/pins.c
index e494fb54b..93f349ffa 100644
--- a/ports/atmel-samd/boards/pycubed/pins.c
+++ b/ports/atmel-samd/boards/pycubed/pins.c
@@ -1,5 +1,5 @@
#include "shared-bindings/board/__init__.h"
-#include "boards/board.h"
+#include "supervisor/board.h"
STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_PA13) },
diff --git a/ports/atmel-samd/boards/pycubed_mram/board.c b/ports/atmel-samd/boards/pycubed_mram/board.c
index 0bf586ad8..f092a8d20 100644
--- a/ports/atmel-samd/boards/pycubed_mram/board.c
+++ b/ports/atmel-samd/boards/pycubed_mram/board.c
@@ -27,7 +27,7 @@
#include <string.h>
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "py/mpconfig.h"
#include "shared-bindings/nvm/ByteArray.h"
#include "common-hal/microcontroller/Pin.h"
diff --git a/ports/atmel-samd/boards/pycubed_mram/mpconfigboard.mk b/ports/atmel-samd/boards/pycubed_mram/mpconfigboard.mk
index f49bb3fef..3bf42d705 100644
--- a/ports/atmel-samd/boards/pycubed_mram/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/pycubed_mram/mpconfigboard.mk
@@ -21,7 +21,6 @@ CIRCUITPY_GAMEPAD = 0
CIRCUITPY_RGBMATRIX = 0
CIRCUITPY_PS2IO = 0
-FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_BusDevice
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Register
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_SD
diff --git a/ports/atmel-samd/boards/pycubed_mram/pins.c b/ports/atmel-samd/boards/pycubed_mram/pins.c
index e494fb54b..93f349ffa 100644
--- a/ports/atmel-samd/boards/pycubed_mram/pins.c
+++ b/ports/atmel-samd/boards/pycubed_mram/pins.c
@@ -1,5 +1,5 @@
#include "shared-bindings/board/__init__.h"
-#include "boards/board.h"
+#include "supervisor/board.h"
STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_PA13) },
diff --git a/ports/atmel-samd/boards/pygamer/board.c b/ports/atmel-samd/boards/pygamer/board.c
index b478b5947..4614e347c 100644
--- a/ports/atmel-samd/boards/pygamer/board.c
+++ b/ports/atmel-samd/boards/pygamer/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
#include "shared-bindings/busio/SPI.h"
@@ -123,5 +123,5 @@ bool board_requests_safe_mode(void) {
}
void reset_board(void) {
- board_reset_user_neopixels();
+ board_reset_user_neopixels(&pin_PA15, 5);
}
diff --git a/ports/atmel-samd/boards/pygamer/mpconfigboard.h b/ports/atmel-samd/boards/pygamer/mpconfigboard.h
index 21f75d272..102c25956 100644
--- a/ports/atmel-samd/boards/pygamer/mpconfigboard.h
+++ b/ports/atmel-samd/boards/pygamer/mpconfigboard.h
@@ -13,8 +13,6 @@
#define MICROPY_PORT_C (0)
#define MICROPY_PORT_D (0)
-#define USER_NEOPIXELS_PIN (&pin_PA15)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA13)
#define DEFAULT_I2C_BUS_SDA (&pin_PA12)
diff --git a/ports/atmel-samd/boards/pygamer/pins.c b/ports/atmel-samd/boards/pygamer/pins.c
index 107d780a8..8bfaa6479 100644
--- a/ports/atmel-samd/boards/pygamer/pins.c
+++ b/ports/atmel-samd/boards/pygamer/pins.c
@@ -1,6 +1,6 @@
#include "shared-bindings/board/__init__.h"
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "shared-module/displayio/__init__.h"
STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
diff --git a/ports/atmel-samd/boards/pygamer_advance/board.c b/ports/atmel-samd/boards/pygamer_advance/board.c
index 7dfe07c00..39bf65602 100644
--- a/ports/atmel-samd/boards/pygamer_advance/board.c
+++ b/ports/atmel-samd/boards/pygamer_advance/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
#include "shared-bindings/busio/SPI.h"
@@ -101,5 +101,5 @@ bool board_requests_safe_mode(void) {
}
void reset_board(void) {
- board_reset_user_neopixels();
+ board_reset_user_neopixels(&pin_PA15, 5);
}
diff --git a/ports/atmel-samd/boards/pygamer_advance/mpconfigboard.h b/ports/atmel-samd/boards/pygamer_advance/mpconfigboard.h
index 7c631d1c3..fbe946b72 100644
--- a/ports/atmel-samd/boards/pygamer_advance/mpconfigboard.h
+++ b/ports/atmel-samd/boards/pygamer_advance/mpconfigboard.h
@@ -13,8 +13,6 @@
#define MICROPY_PORT_C (0)
#define MICROPY_PORT_D (0)
-#define USER_NEOPIXELS_PIN (&pin_PA15)
-
#define DEFAULT_I2C_BUS_SCL (&pin_PA13)
#define DEFAULT_I2C_BUS_SDA (&pin_PA12)
diff --git a/ports/atmel-samd/boards/pygamer_advance/pins.c b/ports/atmel-samd/boards/pygamer_advance/pins.c
index 653a1bb2e..8db63f2f0 100644
--- a/ports/atmel-samd/boards/pygamer_advance/pins.c
+++ b/ports/atmel-samd/boards/pygamer_advance/pins.c
@@ -1,6 +1,6 @@
#include "shared-bindings/board/__init__.h"
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "shared-module/displayio/__init__.h"
STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
diff --git a/ports/atmel-samd/boards/pyportal/board.c b/ports/atmel-samd/boards/pyportal/board.c
index cd94f6887..db474a820 100644
--- a/ports/atmel-samd/boards/pyportal/board.c
+++ b/ports/atmel-samd/boards/pyportal/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
diff --git a/ports/atmel-samd/boards/pyportal/mpconfigboard.h b/ports/atmel-samd/boards/pyportal/mpconfigboard.h
index 2c4cf4f58..00c376ad9 100644
--- a/ports/atmel-samd/boards/pyportal/mpconfigboard.h
+++ b/ports/atmel-samd/boards/pyportal/mpconfigboard.h
@@ -24,9 +24,6 @@
#define DEFAULT_SPI_BUS_MOSI (&pin_PA12)
#define DEFAULT_SPI_BUS_MISO (&pin_PA14)
-#define DEFAULT_UART_BUS_RX (&pin_PB13)
-#define DEFAULT_UART_BUS_TX (&pin_PB12)
-
// USB is always used internally so skip the pin objects for it.
#define IGNORE_PIN_PA24 1
#define IGNORE_PIN_PA25 1
diff --git a/ports/atmel-samd/boards/pyportal/pins.c b/ports/atmel-samd/boards/pyportal/pins.c
index 14699a209..1a1846492 100644
--- a/ports/atmel-samd/boards/pyportal/pins.c
+++ b/ports/atmel-samd/boards/pyportal/pins.c
@@ -1,6 +1,6 @@
#include "shared-bindings/board/__init__.h"
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "shared-module/displayio/__init__.h"
// This mapping only includes functional names because pins broken
@@ -58,10 +58,8 @@ STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
{ MP_OBJ_NEW_QSTR(MP_QSTR_ESP_BUSY), MP_ROM_PTR(&pin_PB16) },
{ MP_OBJ_NEW_QSTR(MP_QSTR_ESP_RESET), MP_ROM_PTR(&pin_PB17) },
{ MP_OBJ_NEW_QSTR(MP_QSTR_ESP_RTS), MP_ROM_PTR(&pin_PA15) },
-
- // UART
- { MP_OBJ_NEW_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_PB12) },
- { MP_OBJ_NEW_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_PB13) },
+ { MP_OBJ_NEW_QSTR(MP_QSTR_ESP_TX), MP_ROM_PTR(&pin_PB12) },
+ { MP_OBJ_NEW_QSTR(MP_QSTR_ESP_RX), MP_ROM_PTR(&pin_PB13) },
// SPI
{ MP_OBJ_NEW_QSTR(MP_QSTR_MOSI),MP_ROM_PTR(&pin_PA12) },
@@ -78,7 +76,6 @@ STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
{ 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) },
{ MP_ROM_QSTR(MP_QSTR_DISPLAY), MP_ROM_PTR(&displays[0].display) },
};
diff --git a/ports/atmel-samd/boards/pyportal_titano/board.c b/ports/atmel-samd/boards/pyportal_titano/board.c
index dc417f5d1..59a25c4ac 100644
--- a/ports/atmel-samd/boards/pyportal_titano/board.c
+++ b/ports/atmel-samd/boards/pyportal_titano/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
diff --git a/ports/atmel-samd/boards/pyportal_titano/mpconfigboard.h b/ports/atmel-samd/boards/pyportal_titano/mpconfigboard.h
index 4d58b8183..a76f1db5c 100644
--- a/ports/atmel-samd/boards/pyportal_titano/mpconfigboard.h
+++ b/ports/atmel-samd/boards/pyportal_titano/mpconfigboard.h
@@ -22,9 +22,6 @@
#define DEFAULT_SPI_BUS_MOSI (&pin_PA12)
#define DEFAULT_SPI_BUS_MISO (&pin_PA14)
-#define DEFAULT_UART_BUS_RX (&pin_PB13)
-#define DEFAULT_UART_BUS_TX (&pin_PB12)
-
// USB is always used internally so skip the pin objects for it.
#define IGNORE_PIN_PA24 1
#define IGNORE_PIN_PA25 1
diff --git a/ports/atmel-samd/boards/pyportal_titano/pins.c b/ports/atmel-samd/boards/pyportal_titano/pins.c
index 14699a209..1a1846492 100644
--- a/ports/atmel-samd/boards/pyportal_titano/pins.c
+++ b/ports/atmel-samd/boards/pyportal_titano/pins.c
@@ -1,6 +1,6 @@
#include "shared-bindings/board/__init__.h"
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "shared-module/displayio/__init__.h"
// This mapping only includes functional names because pins broken
@@ -58,10 +58,8 @@ STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
{ MP_OBJ_NEW_QSTR(MP_QSTR_ESP_BUSY), MP_ROM_PTR(&pin_PB16) },
{ MP_OBJ_NEW_QSTR(MP_QSTR_ESP_RESET), MP_ROM_PTR(&pin_PB17) },
{ MP_OBJ_NEW_QSTR(MP_QSTR_ESP_RTS), MP_ROM_PTR(&pin_PA15) },
-
- // UART
- { MP_OBJ_NEW_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_PB12) },
- { MP_OBJ_NEW_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_PB13) },
+ { MP_OBJ_NEW_QSTR(MP_QSTR_ESP_TX), MP_ROM_PTR(&pin_PB12) },
+ { MP_OBJ_NEW_QSTR(MP_QSTR_ESP_RX), MP_ROM_PTR(&pin_PB13) },
// SPI
{ MP_OBJ_NEW_QSTR(MP_QSTR_MOSI),MP_ROM_PTR(&pin_PA12) },
@@ -78,7 +76,6 @@ STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
{ 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) },
{ MP_ROM_QSTR(MP_QSTR_DISPLAY), MP_ROM_PTR(&displays[0].display) },
};
diff --git a/ports/atmel-samd/boards/pyruler/board.c b/ports/atmel-samd/boards/pyruler/board.c
index d7e856d61..84960e73c 100644
--- a/ports/atmel-samd/boards/pyruler/board.c
+++ b/ports/atmel-samd/boards/pyruler/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/atmel-samd/boards/qtpy_m0/board.c b/ports/atmel-samd/boards/qtpy_m0/board.c
index 1a65a561f..6b948a9a7 100644
--- a/ports/atmel-samd/boards/qtpy_m0/board.c
+++ b/ports/atmel-samd/boards/qtpy_m0/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "common-hal/microcontroller/Pin.h"
#include "supervisor/shared/board.h"
#include "hal/include/hal_gpio.h"
diff --git a/ports/atmel-samd/boards/qtpy_m0_haxpress/board.c b/ports/atmel-samd/boards/qtpy_m0_haxpress/board.c
index 1a65a561f..6b948a9a7 100644
--- a/ports/atmel-samd/boards/qtpy_m0_haxpress/board.c
+++ b/ports/atmel-samd/boards/qtpy_m0_haxpress/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "common-hal/microcontroller/Pin.h"
#include "supervisor/shared/board.h"
#include "hal/include/hal_gpio.h"
diff --git a/ports/atmel-samd/boards/robohatmm1_m4/board.c b/ports/atmel-samd/boards/robohatmm1_m4/board.c
index 0f60736a2..7af05ba45 100644
--- a/ports/atmel-samd/boards/robohatmm1_m4/board.c
+++ b/ports/atmel-samd/boards/robohatmm1_m4/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
diff --git a/ports/atmel-samd/boards/sam32/board.c b/ports/atmel-samd/boards/sam32/board.c
index e03260144..560edd9c2 100644
--- a/ports/atmel-samd/boards/sam32/board.c
+++ b/ports/atmel-samd/boards/sam32/board.c
@@ -27,7 +27,7 @@
#include <string.h>
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "py/mpconfig.h"
#include "common-hal/digitalio/DigitalInOut.h"
diff --git a/ports/atmel-samd/boards/sam32/mpconfigboard.mk b/ports/atmel-samd/boards/sam32/mpconfigboard.mk
index 1dc686ef8..9ac24a014 100644
--- a/ports/atmel-samd/boards/sam32/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/sam32/mpconfigboard.mk
@@ -13,5 +13,4 @@ LONGINT_IMPL = MPZ
CIRCUITPY_AUDIOBUSIO = 0
CIRCUITPY_USTACK = 1
-FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_BusDevice
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel
diff --git a/ports/atmel-samd/boards/same54_xplained/board.c b/ports/atmel-samd/boards/same54_xplained/board.c
index 7599f02b8..5ed8c8404 100644
--- a/ports/atmel-samd/boards/same54_xplained/board.c
+++ b/ports/atmel-samd/boards/same54_xplained/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
diff --git a/ports/atmel-samd/boards/seeeduino_wio_terminal/board.c b/ports/atmel-samd/boards/seeeduino_wio_terminal/board.c
index 49db49860..53c43cd44 100644
--- a/ports/atmel-samd/boards/seeeduino_wio_terminal/board.c
+++ b/ports/atmel-samd/boards/seeeduino_wio_terminal/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
#include "shared-bindings/busio/SPI.h"
diff --git a/ports/atmel-samd/boards/seeeduino_xiao/board.c b/ports/atmel-samd/boards/seeeduino_xiao/board.c
index 0f60736a2..7af05ba45 100644
--- a/ports/atmel-samd/boards/seeeduino_xiao/board.c
+++ b/ports/atmel-samd/boards/seeeduino_xiao/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
diff --git a/ports/atmel-samd/boards/serpente/board.c b/ports/atmel-samd/boards/serpente/board.c
index d7e856d61..84960e73c 100644
--- a/ports/atmel-samd/boards/serpente/board.c
+++ b/ports/atmel-samd/boards/serpente/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/atmel-samd/boards/shirtty/board.c b/ports/atmel-samd/boards/shirtty/board.c
index d7e856d61..84960e73c 100644
--- a/ports/atmel-samd/boards/shirtty/board.c
+++ b/ports/atmel-samd/boards/shirtty/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/atmel-samd/boards/snekboard/board.c b/ports/atmel-samd/boards/snekboard/board.c
index c8e20206a..6baa43ffa 100644
--- a/ports/atmel-samd/boards/snekboard/board.c
+++ b/ports/atmel-samd/boards/snekboard/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void)
{
diff --git a/ports/atmel-samd/boards/snekboard/mpconfigboard.mk b/ports/atmel-samd/boards/snekboard/mpconfigboard.mk
index e0262b6b2..67e5b2312 100644
--- a/ports/atmel-samd/boards/snekboard/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/snekboard/mpconfigboard.mk
@@ -15,6 +15,7 @@ CIRCUITPY_BITBANGIO = 0
CIRCUITPY_GAMEPAD = 0
CIRCUITPY_I2CPERIPHERAL = 0
CIRCUITPY_VECTORIO = 0
+CIRCUITPY_BUSDEVICE = 0
CFLAGS_INLINE_LIMIT = 60
diff --git a/ports/atmel-samd/boards/sparkfun_lumidrive/board.c b/ports/atmel-samd/boards/sparkfun_lumidrive/board.c
index c8e20206a..6baa43ffa 100755
--- a/ports/atmel-samd/boards/sparkfun_lumidrive/board.c
+++ b/ports/atmel-samd/boards/sparkfun_lumidrive/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void)
{
diff --git a/ports/atmel-samd/boards/sparkfun_qwiic_micro_no_flash/board.c b/ports/atmel-samd/boards/sparkfun_qwiic_micro_no_flash/board.c
index c8e20206a..6baa43ffa 100644
--- a/ports/atmel-samd/boards/sparkfun_qwiic_micro_no_flash/board.c
+++ b/ports/atmel-samd/boards/sparkfun_qwiic_micro_no_flash/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void)
{
diff --git a/ports/atmel-samd/boards/sparkfun_qwiic_micro_with_flash/board.c b/ports/atmel-samd/boards/sparkfun_qwiic_micro_with_flash/board.c
index c8e20206a..6baa43ffa 100644
--- a/ports/atmel-samd/boards/sparkfun_qwiic_micro_with_flash/board.c
+++ b/ports/atmel-samd/boards/sparkfun_qwiic_micro_with_flash/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void)
{
diff --git a/ports/atmel-samd/boards/sparkfun_redboard_turbo/board.c b/ports/atmel-samd/boards/sparkfun_redboard_turbo/board.c
index c8e20206a..6baa43ffa 100755
--- a/ports/atmel-samd/boards/sparkfun_redboard_turbo/board.c
+++ b/ports/atmel-samd/boards/sparkfun_redboard_turbo/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void)
{
diff --git a/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.mk b/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.mk
index 5170f8a23..590c4795f 100755
--- a/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.mk
@@ -16,6 +16,7 @@ CIRCUITPY_COUNTIO = 0
CIRCUITPY_GAMEPAD = 0
CIRCUITPY_I2CPERIPHERAL = 0
CIRCUITPY_VECTORIO = 0
+CIRCUITPY_BUSDEVICE = 0
CFLAGS_INLINE_LIMIT = 60
SUPEROPT_GC = 0
diff --git a/ports/atmel-samd/boards/sparkfun_samd21_dev/board.c b/ports/atmel-samd/boards/sparkfun_samd21_dev/board.c
index 0f60736a2..7af05ba45 100644
--- a/ports/atmel-samd/boards/sparkfun_samd21_dev/board.c
+++ b/ports/atmel-samd/boards/sparkfun_samd21_dev/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
diff --git a/ports/atmel-samd/boards/sparkfun_samd21_mini/board.c b/ports/atmel-samd/boards/sparkfun_samd21_mini/board.c
index 0f60736a2..7af05ba45 100644
--- a/ports/atmel-samd/boards/sparkfun_samd21_mini/board.c
+++ b/ports/atmel-samd/boards/sparkfun_samd21_mini/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
diff --git a/ports/atmel-samd/boards/sparkfun_samd51_thing_plus/board.c b/ports/atmel-samd/boards/sparkfun_samd51_thing_plus/board.c
index 8096b9b8e..5fca974e9 100644
--- a/ports/atmel-samd/boards/sparkfun_samd51_thing_plus/board.c
+++ b/ports/atmel-samd/boards/sparkfun_samd51_thing_plus/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
void board_init(void) {
diff --git a/ports/atmel-samd/boards/stringcar_m0_express/board.c b/ports/atmel-samd/boards/stringcar_m0_express/board.c
index d7e856d61..84960e73c 100644
--- a/ports/atmel-samd/boards/stringcar_m0_express/board.c
+++ b/ports/atmel-samd/boards/stringcar_m0_express/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/atmel-samd/boards/trellis_m4_express/board.c b/ports/atmel-samd/boards/trellis_m4_express/board.c
index a9b5f8163..e6f8b5917 100644
--- a/ports/atmel-samd/boards/trellis_m4_express/board.c
+++ b/ports/atmel-samd/boards/trellis_m4_express/board.c
@@ -26,7 +26,7 @@
#include <string.h>
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "py/mpconfig.h"
#include "common-hal/digitalio/DigitalInOut.h"
diff --git a/ports/atmel-samd/boards/trinket_m0/board.c b/ports/atmel-samd/boards/trinket_m0/board.c
index d7e856d61..84960e73c 100644
--- a/ports/atmel-samd/boards/trinket_m0/board.c
+++ b/ports/atmel-samd/boards/trinket_m0/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/atmel-samd/boards/trinket_m0_haxpress/board.c b/ports/atmel-samd/boards/trinket_m0_haxpress/board.c
index d7e856d61..84960e73c 100644
--- a/ports/atmel-samd/boards/trinket_m0_haxpress/board.c
+++ b/ports/atmel-samd/boards/trinket_m0_haxpress/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/atmel-samd/boards/uartlogger2/board.c b/ports/atmel-samd/boards/uartlogger2/board.c
index 0f60736a2..7af05ba45 100644
--- a/ports/atmel-samd/boards/uartlogger2/board.c
+++ b/ports/atmel-samd/boards/uartlogger2/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
diff --git a/ports/atmel-samd/boards/uchip/board.c b/ports/atmel-samd/boards/uchip/board.c
index 0f60736a2..7af05ba45 100644
--- a/ports/atmel-samd/boards/uchip/board.c
+++ b/ports/atmel-samd/boards/uchip/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
diff --git a/ports/atmel-samd/boards/ugame10/board.c b/ports/atmel-samd/boards/ugame10/board.c
index 9f2b8d039..918fe2d59 100644
--- a/ports/atmel-samd/boards/ugame10/board.c
+++ b/ports/atmel-samd/boards/ugame10/board.c
@@ -25,7 +25,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "shared-bindings/board/__init__.h"
#include "shared-bindings/displayio/FourWire.h"
diff --git a/ports/atmel-samd/boards/winterbloom_big_honking_button/board.c b/ports/atmel-samd/boards/winterbloom_big_honking_button/board.c
index c8e20206a..6baa43ffa 100644
--- a/ports/atmel-samd/boards/winterbloom_big_honking_button/board.c
+++ b/ports/atmel-samd/boards/winterbloom_big_honking_button/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void)
{
diff --git a/ports/atmel-samd/boards/winterbloom_sol/board.c b/ports/atmel-samd/boards/winterbloom_sol/board.c
index 8096b9b8e..5fca974e9 100644
--- a/ports/atmel-samd/boards/winterbloom_sol/board.c
+++ b/ports/atmel-samd/boards/winterbloom_sol/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
void board_init(void) {
diff --git a/ports/atmel-samd/boards/xinabox_cc03/board.c b/ports/atmel-samd/boards/xinabox_cc03/board.c
index 770bc8259..112b173ec 100644
--- a/ports/atmel-samd/boards/xinabox_cc03/board.c
+++ b/ports/atmel-samd/boards/xinabox_cc03/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
diff --git a/ports/atmel-samd/boards/xinabox_cc03/mpconfigboard.mk b/ports/atmel-samd/boards/xinabox_cc03/mpconfigboard.mk
index fdcde4a07..d6f333b5b 100644
--- a/ports/atmel-samd/boards/xinabox_cc03/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/xinabox_cc03/mpconfigboard.mk
@@ -21,6 +21,6 @@ CIRCUITPY_PULSEIO=0
CIRCUITPY_ROTARYIO=0
CIRCUITPY_TOUCHIO_USE_NATIVE=0
CIRCUITPY_TOUCHIO=0
+CIRCUITPY_BUSDEVICE=1
# Include these Python libraries in firmware.
-FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_BusDevice
diff --git a/ports/atmel-samd/boards/xinabox_cs11/board.c b/ports/atmel-samd/boards/xinabox_cs11/board.c
index 770bc8259..112b173ec 100644
--- a/ports/atmel-samd/boards/xinabox_cs11/board.c
+++ b/ports/atmel-samd/boards/xinabox_cs11/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "hal/include/hal_gpio.h"
diff --git a/ports/atmel-samd/boards/xinabox_cs11/mpconfigboard.mk b/ports/atmel-samd/boards/xinabox_cs11/mpconfigboard.mk
index 9309fdce0..fd2fa044a 100644
--- a/ports/atmel-samd/boards/xinabox_cs11/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/xinabox_cs11/mpconfigboard.mk
@@ -24,7 +24,7 @@ CIRCUITPY_TOUCHIO=0
CIRCUITPY_USB_MIDI=0
CIRCUITPY_RTC=0
CIRCUITPY_COUNTIO=0
+CIRCUITPY_BUSDEVICE=1
# Include these Python libraries in firmware.
-FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_BusDevice
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_SD
diff --git a/ports/atmel-samd/common-hal/audiobusio/PDMIn.c b/ports/atmel-samd/common-hal/audiobusio/PDMIn.c
index 3c9ec05c2..8911aef2f 100644
--- a/ports/atmel-samd/common-hal/audiobusio/PDMIn.c
+++ b/ports/atmel-samd/common-hal/audiobusio/PDMIn.c
@@ -337,7 +337,11 @@ const uint16_t sinc_filter [OVERSAMPLING] = {
94, 63, 39, 21, 9, 2, 0, 0
};
-#define REPEAT_16_TIMES(X) X X X X X X X X X X X X X X X X
+#ifdef SAMD21
+#define REPEAT_16_TIMES(X) do { for(uint8_t j=0; j<4; j++) { X X X X } } while (0)
+#else
+#define REPEAT_16_TIMES(X) do { X X X X X X X X X X X X X X X X } while(0)
+#endif
static uint16_t filter_sample(uint32_t pdm_samples[4]) {
uint16_t running_sum = 0;
@@ -354,7 +358,7 @@ static uint16_t filter_sample(uint32_t pdm_samples[4]) {
filter_ptr++;
pdm_sample <<= 1;
}
- )
+ );
}
return running_sum;
}
diff --git a/ports/atmel-samd/common-hal/busio/SPI.c b/ports/atmel-samd/common-hal/busio/SPI.c
index 189fd93b5..9646f9cf1 100644
--- a/ports/atmel-samd/common-hal/busio/SPI.c
+++ b/ports/atmel-samd/common-hal/busio/SPI.c
@@ -31,7 +31,7 @@
#include "hpl_sercom_config.h"
#include "peripheral_clk_config.h"
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "common-hal/microcontroller/Pin.h"
#include "hal/include/hal_gpio.h"
#include "hal/include/hal_spi_m_sync.h"
diff --git a/ports/atmel-samd/common-hal/microcontroller/Processor.c b/ports/atmel-samd/common-hal/microcontroller/Processor.c
index ba8daf3fb..8c288a352 100644
--- a/ports/atmel-samd/common-hal/microcontroller/Processor.c
+++ b/ports/atmel-samd/common-hal/microcontroller/Processor.c
@@ -65,6 +65,7 @@
#include "py/mphal.h"
#include "common-hal/microcontroller/Processor.h"
+#include "shared-bindings/microcontroller/ResetReason.h"
#include "samd/adc.h"
@@ -349,3 +350,7 @@ void common_hal_mcu_processor_get_uid(uint8_t raw_id[]) {
}
}
}
+
+mcu_reset_reason_t common_hal_mcu_processor_get_reset_reason(void) {
+ return RESET_REASON_UNKNOWN;
+}
diff --git a/ports/atmel-samd/common-hal/sdioio/SDCard.c b/ports/atmel-samd/common-hal/sdioio/SDCard.c
index 4d2539aa5..14c6f29de 100644
--- a/ports/atmel-samd/common-hal/sdioio/SDCard.c
+++ b/ports/atmel-samd/common-hal/sdioio/SDCard.c
@@ -28,7 +28,6 @@
#include "py/mperrno.h"
#include "py/runtime.h"
-#include "boards/board.h"
#include "common-hal/microcontroller/Pin.h"
#include "shared-bindings/sdioio/SDCard.h"
#include "shared-bindings/microcontroller/Pin.h"
diff --git a/ports/atmel-samd/mpconfigport.h b/ports/atmel-samd/mpconfigport.h
index ed10da9b9..bce89e0b9 100644
--- a/ports/atmel-samd/mpconfigport.h
+++ b/ports/atmel-samd/mpconfigport.h
@@ -42,6 +42,7 @@
#define CIRCUITPY_MCU_FAMILY samd21
#define MICROPY_PY_SYS_PLATFORM "Atmel SAMD21"
#define SPI_FLASH_MAX_BAUDRATE 8000000
+#define MICROPY_PY_BUILTINS_COMPLEX (0)
#define MICROPY_PY_BUILTINS_NOTIMPLEMENTED (0)
#define MICROPY_PY_FUNCTION_ATTRS (0)
// MICROPY_PY_UJSON depends on MICROPY_PY_IO
diff --git a/ports/atmel-samd/mpconfigport.mk b/ports/atmel-samd/mpconfigport.mk
index 1929e146d..17e3995bf 100644
--- a/ports/atmel-samd/mpconfigport.mk
+++ b/ports/atmel-samd/mpconfigport.mk
@@ -29,6 +29,10 @@ ifndef CIRCUITPY_AUDIOMP3
CIRCUITPY_AUDIOMP3 = 0
endif
+ifndef CIRCUITPY_BUILTINS_POW3
+CIRCUITPY_BUILTINS_POW3 = 0
+endif
+
ifndef CIRCUITPY_FREQUENCYIO
CIRCUITPY_FREQUENCYIO = 0
endif
diff --git a/ports/atmel-samd/supervisor/port.c b/ports/atmel-samd/supervisor/port.c
index d65d09825..7d02789e8 100644
--- a/ports/atmel-samd/supervisor/port.c
+++ b/ports/atmel-samd/supervisor/port.c
@@ -27,7 +27,7 @@
#include <string.h>
#include <stdlib.h>
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "supervisor/port.h"
// ASF 4
@@ -390,8 +390,8 @@ void reset_cpu(void) {
reset();
}
-supervisor_allocation* port_fixed_stack(void) {
- return NULL;
+bool port_has_fixed_stack(void) {
+ return false;
}
uint32_t *port_stack_get_limit(void) {
@@ -543,7 +543,7 @@ void port_interrupt_after_ticks(uint32_t ticks) {
_port_interrupt_after_ticks(ticks);
}
-void port_sleep_until_interrupt(void) {
+void port_idle_until_interrupt(void) {
#ifdef SAM_D5X_E5X
// Clear the FPU interrupt because it can prevent us from sleeping.
if (__get_FPSCR() & ~(0x9f)) {
diff --git a/ports/cxd56/boards/spresense/board.c b/ports/cxd56/boards/spresense/board.c
index 2af7cfdcf..fd27d3493 100644
--- a/ports/cxd56/boards/spresense/board.c
+++ b/ports/cxd56/boards/spresense/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void)
{
diff --git a/ports/cxd56/common-hal/microcontroller/Processor.c b/ports/cxd56/common-hal/microcontroller/Processor.c
index 1eddbb01d..3cb187de6 100644
--- a/ports/cxd56/common-hal/microcontroller/Processor.c
+++ b/ports/cxd56/common-hal/microcontroller/Processor.c
@@ -31,6 +31,7 @@
// For NAN: remove when not needed.
#include <math.h>
#include "py/mphal.h"
+#include "shared-bindings/microcontroller/ResetReason.h"
uint32_t common_hal_mcu_processor_get_frequency(void) {
return cxd56_get_cpu_baseclk();
@@ -47,3 +48,7 @@ float common_hal_mcu_processor_get_voltage(void) {
void common_hal_mcu_processor_get_uid(uint8_t raw_id[]) {
boardctl(BOARDIOC_UNIQUEID, (uintptr_t) raw_id);
}
+
+mcu_reset_reason_t common_hal_mcu_processor_get_reset_reason(void) {
+ return RESET_REASON_UNKNOWN;
+}
diff --git a/ports/cxd56/supervisor/port.c b/ports/cxd56/supervisor/port.c
index 92d335cd5..523d6a496 100644
--- a/ports/cxd56/supervisor/port.c
+++ b/ports/cxd56/supervisor/port.c
@@ -33,7 +33,7 @@
#include "sched/sched.h"
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "supervisor/port.h"
#include "supervisor/background_callback.h"
@@ -98,8 +98,8 @@ void reset_to_bootloader(void) {
}
}
-supervisor_allocation* port_fixed_stack(void) {
- return NULL;
+bool port_has_fixed_stack(void) {
+ return true;
}
uint32_t *port_stack_get_limit(void) {
@@ -169,6 +169,6 @@ void port_disable_tick(void) {
void port_interrupt_after_ticks(uint32_t ticks) {
}
-void port_sleep_until_interrupt(void) {
+void port_idle_until_interrupt(void) {
// TODO: Implement sleep.
}
diff --git a/ports/esp32s2/Makefile b/ports/esp32s2/Makefile
index 55d6e91d4..4486cb598 100644
--- a/ports/esp32s2/Makefile
+++ b/ports/esp32s2/Makefile
@@ -104,6 +104,8 @@ INC += -isystem esp-idf/components/soc/soc/include
INC += -isystem esp-idf/components/soc/soc/esp32s2/include
INC += -isystem esp-idf/components/heap/include
INC += -isystem esp-idf/components/esp_system/include
+INC += -isystem esp-idf/components/spi_flash/include
+INC += -isystem esp-idf/components/nvs_flash/include
INC += -I$(BUILD)/esp-idf/config
CFLAGS += -DHAVE_CONFIG_H \
@@ -188,6 +190,8 @@ SRC_C += \
lib/utils/pyexec.c \
lib/utils/stdout_helpers.c \
lib/utils/sys_stdio_mphal.c \
+ lib/netutils/netutils.c \
+ peripherals/timer.c \
peripherals/pcnt.c \
peripherals/pins.c \
peripherals/rmt.c \
@@ -332,10 +336,10 @@ $(BUILD)/firmware.uf2: $(BUILD)/circuitpython-firmware.bin
$(Q)$(PYTHON3) $(TOP)/tools/uf2/utils/uf2conv.py -f 0xbfdd4eee -b 0x0000 -c -o $@ $^
flash: $(BUILD)/firmware.bin
- esptool.py --chip esp32s2 -p $(PORT) --no-stub -b 460800 --before=default_reset --after=hard_reset write_flash $(FLASH_FLAGS) 0x0000 $^
+ esptool.py --chip esp32s2 -p $(PORT) --no-stub -b 460800 --before=default_reset --after=no_reset write_flash $(FLASH_FLAGS) 0x0000 $^
flash-circuitpython-only: $(BUILD)/circuitpython-firmware.bin
- esptool.py --chip esp32s2 -p $(PORT) --no-stub -b 460800 --before=default_reset --after=hard_reset write_flash $(FLASH_FLAGS) 0x10000 $^
+ esptool.py --chip esp32s2 -p $(PORT) --no-stub -b 460800 --before=default_reset --after=no_reset write_flash $(FLASH_FLAGS) 0x10000 $^
include $(TOP)/py/mkrules.mk
diff --git a/ports/esp32s2/boards/adafruit_magtag_2.9_grayscale/board.c b/ports/esp32s2/boards/adafruit_magtag_2.9_grayscale/board.c
index ecd44e423..a9d1074f7 100644
--- a/ports/esp32s2/boards/adafruit_magtag_2.9_grayscale/board.c
+++ b/ports/esp32s2/boards/adafruit_magtag_2.9_grayscale/board.c
@@ -24,7 +24,8 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
+
#include "mpconfigboard.h"
#include "shared-bindings/busio/SPI.h"
#include "shared-bindings/displayio/FourWire.h"
@@ -32,6 +33,10 @@
#include "shared-module/displayio/__init__.h"
#include "supervisor/shared/board.h"
+#include "components/log/include/esp_log.h"
+
+static const char* TAG = "board";
+
#define DELAY 0x80
// This is an ILO373 control chip. The display is a 2.9" grayscale EInk.
@@ -167,3 +172,18 @@ bool board_requests_safe_mode(void) {
void reset_board(void) {
}
+
+void board_deinit(void) {
+ displayio_epaperdisplay_obj_t* display = &displays[0].epaper_display;
+ if (display->base.type == &displayio_epaperdisplay_type) {
+ size_t i = 0;
+ while (common_hal_displayio_epaperdisplay_get_busy(display)) {
+ RUN_BACKGROUND_TASKS;
+ i++;
+ }
+ ESP_LOGI(TAG, "waited %d iterations for display", i);
+ } else {
+ ESP_LOGI(TAG, "didn't wait for display");
+ }
+ common_hal_displayio_release_displays();
+}
diff --git a/ports/esp32s2/boards/adafruit_magtag_2.9_grayscale/pins.c b/ports/esp32s2/boards/adafruit_magtag_2.9_grayscale/pins.c
index 40c9e91e4..0cefb6dfb 100644
--- a/ports/esp32s2/boards/adafruit_magtag_2.9_grayscale/pins.c
+++ b/ports/esp32s2/boards/adafruit_magtag_2.9_grayscale/pins.c
@@ -16,11 +16,19 @@ STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_EPD_CS), MP_ROM_PTR(&pin_GPIO8) },
{ MP_ROM_QSTR(MP_QSTR_BUTTON_A), MP_ROM_PTR(&pin_GPIO15) },
+ { MP_ROM_QSTR(MP_QSTR_D15), MP_ROM_PTR(&pin_GPIO15) },
+
{ MP_ROM_QSTR(MP_QSTR_BUTTON_B), MP_ROM_PTR(&pin_GPIO14) },
+ { MP_ROM_QSTR(MP_QSTR_D14), MP_ROM_PTR(&pin_GPIO14) },
+
{ MP_ROM_QSTR(MP_QSTR_BUTTON_C), MP_ROM_PTR(&pin_GPIO12) },
+ { MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_GPIO12) },
+
{ MP_ROM_QSTR(MP_QSTR_BUTTON_D), MP_ROM_PTR(&pin_GPIO11) },
+ { MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_GPIO11) },
{ MP_ROM_QSTR(MP_QSTR_LIGHT), MP_ROM_PTR(&pin_GPIO3) },
+ { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_GPIO3) },
{ MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_GPIO4) },
{ MP_ROM_QSTR(MP_QSTR_BATTERY), MP_ROM_PTR(&pin_GPIO4) },
@@ -36,6 +44,7 @@ STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_NEOPIXEL_POWER), MP_ROM_PTR(&pin_GPIO21) },
{ MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO1) },
+ { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_GPIO1) },
{ MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) },
{ MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) },
diff --git a/ports/esp32s2/boards/adafruit_metro_esp32s2/board.c b/ports/esp32s2/boards/adafruit_metro_esp32s2/board.c
index 7380be6da..5abd1ce1b 100644
--- a/ports/esp32s2/boards/adafruit_metro_esp32s2/board.c
+++ b/ports/esp32s2/boards/adafruit_metro_esp32s2/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "shared-bindings/microcontroller/Pin.h"
@@ -41,3 +41,6 @@ bool board_requests_safe_mode(void) {
void reset_board(void) {
}
+
+void board_deinit(void) {
+}
diff --git a/ports/esp32s2/boards/electroniccats_bastwifi/board.c b/ports/esp32s2/boards/electroniccats_bastwifi/board.c
index 9f708874b..ff5d9cfb6 100644
--- a/ports/esp32s2/boards/electroniccats_bastwifi/board.c
+++ b/ports/esp32s2/boards/electroniccats_bastwifi/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "shared-bindings/microcontroller/Pin.h"
@@ -45,3 +45,6 @@ bool board_requests_safe_mode(void) {
void reset_board(void) {
}
+
+void board_deinit(void) {
+}
diff --git a/ports/esp32s2/boards/espressif_kaluga_1/board.c b/ports/esp32s2/boards/espressif_kaluga_1/board.c
index 9f708874b..ff5d9cfb6 100644
--- a/ports/esp32s2/boards/espressif_kaluga_1/board.c
+++ b/ports/esp32s2/boards/espressif_kaluga_1/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "shared-bindings/microcontroller/Pin.h"
@@ -45,3 +45,6 @@ bool board_requests_safe_mode(void) {
void reset_board(void) {
}
+
+void board_deinit(void) {
+}
diff --git a/ports/esp32s2/boards/espressif_saola_1_wroom/board.c b/ports/esp32s2/boards/espressif_saola_1_wroom/board.c
index 9f708874b..ff5d9cfb6 100644
--- a/ports/esp32s2/boards/espressif_saola_1_wroom/board.c
+++ b/ports/esp32s2/boards/espressif_saola_1_wroom/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "shared-bindings/microcontroller/Pin.h"
@@ -45,3 +45,6 @@ bool board_requests_safe_mode(void) {
void reset_board(void) {
}
+
+void board_deinit(void) {
+}
diff --git a/ports/esp32s2/boards/espressif_saola_1_wrover/board.c b/ports/esp32s2/boards/espressif_saola_1_wrover/board.c
index 9f708874b..ff5d9cfb6 100644
--- a/ports/esp32s2/boards/espressif_saola_1_wrover/board.c
+++ b/ports/esp32s2/boards/espressif_saola_1_wrover/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "shared-bindings/microcontroller/Pin.h"
@@ -45,3 +45,6 @@ bool board_requests_safe_mode(void) {
void reset_board(void) {
}
+
+void board_deinit(void) {
+}
diff --git a/ports/esp32s2/boards/microdev_micro_s2/board.c b/ports/esp32s2/boards/microdev_micro_s2/board.c
index 1dc30b5af..abd22091e 100644
--- a/ports/esp32s2/boards/microdev_micro_s2/board.c
+++ b/ports/esp32s2/boards/microdev_micro_s2/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "shared-bindings/microcontroller/Pin.h"
@@ -54,3 +54,6 @@ bool board_requests_safe_mode(void) {
void reset_board(void) {
}
+
+void board_deinit(void) {
+}
diff --git a/ports/esp32s2/boards/muselab_nanoesp32_s2/board.c b/ports/esp32s2/boards/muselab_nanoesp32_s2/board.c
index 9f708874b..ff5d9cfb6 100644
--- a/ports/esp32s2/boards/muselab_nanoesp32_s2/board.c
+++ b/ports/esp32s2/boards/muselab_nanoesp32_s2/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "shared-bindings/microcontroller/Pin.h"
@@ -45,3 +45,6 @@ bool board_requests_safe_mode(void) {
void reset_board(void) {
}
+
+void board_deinit(void) {
+}
diff --git a/ports/esp32s2/boards/targett_module_clip_wroom/board.c b/ports/esp32s2/boards/targett_module_clip_wroom/board.c
index 7f5de0e0d..c2022d292 100644
--- a/ports/esp32s2/boards/targett_module_clip_wroom/board.c
+++ b/ports/esp32s2/boards/targett_module_clip_wroom/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "shared-bindings/microcontroller/Pin.h"
@@ -49,3 +49,6 @@ bool board_requests_safe_mode(void) {
void reset_board(void) {
}
+
+void board_deinit(void) {
+}
diff --git a/ports/esp32s2/boards/targett_module_clip_wrover/board.c b/ports/esp32s2/boards/targett_module_clip_wrover/board.c
index 83dcb920a..5a9fbcbee 100644
--- a/ports/esp32s2/boards/targett_module_clip_wrover/board.c
+++ b/ports/esp32s2/boards/targett_module_clip_wrover/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "shared-bindings/microcontroller/Pin.h"
@@ -49,3 +49,6 @@ bool board_requests_safe_mode(void) {
void reset_board(void) {
}
+
+void board_deinit(void) {
+}
diff --git a/ports/esp32s2/boards/unexpectedmaker_feathers2/board.c b/ports/esp32s2/boards/unexpectedmaker_feathers2/board.c
index 1dc30b5af..abd22091e 100644
--- a/ports/esp32s2/boards/unexpectedmaker_feathers2/board.c
+++ b/ports/esp32s2/boards/unexpectedmaker_feathers2/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "shared-bindings/microcontroller/Pin.h"
@@ -54,3 +54,6 @@ bool board_requests_safe_mode(void) {
void reset_board(void) {
}
+
+void board_deinit(void) {
+}
diff --git a/ports/esp32s2/boards/unexpectedmaker_feathers2_prerelease/board.c b/ports/esp32s2/boards/unexpectedmaker_feathers2_prerelease/board.c
index 1dc30b5af..abd22091e 100644
--- a/ports/esp32s2/boards/unexpectedmaker_feathers2_prerelease/board.c
+++ b/ports/esp32s2/boards/unexpectedmaker_feathers2_prerelease/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "shared-bindings/microcontroller/Pin.h"
@@ -54,3 +54,6 @@ bool board_requests_safe_mode(void) {
void reset_board(void) {
}
+
+void board_deinit(void) {
+}
diff --git a/ports/esp32s2/certificates/README.md b/ports/esp32s2/certificates/README.md
new file mode 100644
index 000000000..dd5cf25b0
--- /dev/null
+++ b/ports/esp32s2/certificates/README.md
@@ -0,0 +1,3 @@
+We share root certificates with the nina-fw to ensure they both use the same roots.
+
+https://github.com/adafruit/nina-fw
diff --git a/ports/esp32s2/certificates/nina-fw b/ports/esp32s2/certificates/nina-fw
new file mode 160000
+Subproject f2a0e601b23212dda4fe305eab30af49a7c7fb4
diff --git a/ports/esp32s2/common-hal/alarm/__init__.c b/ports/esp32s2/common-hal/alarm/__init__.c
new file mode 100644
index 000000000..529179200
--- /dev/null
+++ b/ports/esp32s2/common-hal/alarm/__init__.c
@@ -0,0 +1,152 @@
+ /*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2016 Scott Shawcroft for Adafruit Industries
+ * Copyright (c) 2019 Lucian Copeland 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 "py/obj.h"
+#include "py/objtuple.h"
+#include "py/runtime.h"
+
+#include "shared-bindings/alarm/pin/PinAlarm.h"
+#include "shared-bindings/alarm/time/TimeAlarm.h"
+#include "shared-bindings/microcontroller/__init__.h"
+#include "shared-bindings/wifi/__init__.h"
+
+#include "supervisor/port.h"
+#include "supervisor/shared/workflow.h"
+
+#include "common-hal/alarm/__init__.h"
+
+#include "esp_sleep.h"
+
+void alarm_reset(void) {
+ alarm_time_timealarm_reset();
+ esp_sleep_disable_wakeup_source(ESP_SLEEP_WAKEUP_ALL);
+}
+
+STATIC esp_sleep_wakeup_cause_t _get_wakeup_cause(void) {
+ if (alarm_time_timealarm_woke_us_up()) {
+ return ESP_SLEEP_WAKEUP_TIMER;
+ }
+
+ return esp_sleep_get_wakeup_cause();
+}
+
+bool alarm_woken_from_sleep(void) {
+ return _get_wakeup_cause() != ESP_SLEEP_WAKEUP_UNDEFINED;
+}
+
+STATIC mp_obj_t _get_wake_alarm(size_t n_alarms, const mp_obj_t *alarms) {
+ switch (_get_wakeup_cause()) {
+ case ESP_SLEEP_WAKEUP_TIMER: {
+ return alarm_time_timealarm_get_wakeup_alarm(n_alarms, alarms);
+ }
+
+ case ESP_SLEEP_WAKEUP_EXT0: {
+ // TODO: implement pin alarm wake.
+ break;
+ }
+
+ case ESP_SLEEP_WAKEUP_TOUCHPAD:
+ // TODO: implement TouchIO
+ // Wake up from touch on pad, esp_sleep_get_touchpad_wakeup_status()
+ break;
+
+ case ESP_SLEEP_WAKEUP_UNDEFINED:
+ default:
+ // Not a deep sleep reset.
+ break;
+ }
+ return mp_const_none;
+}
+
+mp_obj_t common_hal_alarm_get_wake_alarm(void) {
+ return _get_wake_alarm(0, NULL);
+}
+
+// Set up light sleep or deep sleep alarms.
+STATIC void _setup_sleep_alarms(bool deep_sleep, size_t n_alarms, const mp_obj_t *alarms) {
+ bool time_alarm_set = false;
+ alarm_time_time_alarm_obj_t *time_alarm = MP_OBJ_NULL;
+
+ for (size_t i = 0; i < n_alarms; i++) {
+ if (MP_OBJ_IS_TYPE(alarms[i], &alarm_pin_pin_alarm_type)) {
+ mp_raise_NotImplementedError(translate("PinAlarm not yet implemented"));
+ } else if (MP_OBJ_IS_TYPE(alarms[i], &alarm_time_time_alarm_type)) {
+ if (time_alarm_set) {
+ mp_raise_ValueError(translate("Only one alarm.time alarm can be set."));
+ }
+ time_alarm = MP_OBJ_TO_PTR(alarms[i]);
+ time_alarm_set = true;
+ }
+ }
+
+ if (time_alarm_set) {
+ alarm_time_timealarm_set_alarm(time_alarm);
+ }
+}
+
+STATIC void _idle_until_alarm(void) {
+ // Poll for alarms.
+ while (!mp_hal_is_interrupted()) {
+ RUN_BACKGROUND_TASKS;
+ // Allow ctrl-C interrupt.
+ if (alarm_woken_from_sleep()) {
+ return;
+ }
+
+ port_idle_until_interrupt();
+ }
+}
+
+// Is it safe to do a light sleep? Check whether WiFi is on or there are
+// other ongoing tasks that should not be shut down.
+STATIC bool _light_sleep_ok(void) {
+ return !common_hal_wifi_radio_get_enabled(&common_hal_wifi_radio_obj) && !supervisor_workflow_active();
+}
+
+mp_obj_t common_hal_alarm_light_sleep_until_alarms(size_t n_alarms, const mp_obj_t *alarms) {
+ _setup_sleep_alarms(false, n_alarms, alarms);
+
+ // Light sleep can break some functionality so only do it when possible. Otherwise we idle.
+ if (_light_sleep_ok()) {
+ esp_light_sleep_start();
+ } else {
+ _idle_until_alarm();
+ }
+ mp_obj_t wake_alarm = _get_wake_alarm(n_alarms, alarms);
+ alarm_reset();
+ return wake_alarm;
+}
+
+void common_hal_alarm_set_deep_sleep_alarms(size_t n_alarms, const mp_obj_t *alarms) {
+ _setup_sleep_alarms(true, n_alarms, alarms);
+}
+
+void NORETURN alarm_enter_deep_sleep(void) {
+ // The ESP-IDF caches the deep sleep settings and applies them before sleep.
+ // We don't need to worry about resetting them in the interim.
+ esp_deep_sleep_start();
+}
diff --git a/ports/esp32s2/common-hal/alarm/__init__.h b/ports/esp32s2/common-hal/alarm/__init__.h
new file mode 100644
index 000000000..5678a0e7f
--- /dev/null
+++ b/ports/esp32s2/common-hal/alarm/__init__.h
@@ -0,0 +1,32 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Dan Halbert 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.
+ */
+
+#ifndef MICROPY_INCLUDED_ESP32S2_COMMON_HAL_ALARM__INIT__H
+#define MICROPY_INCLUDED_ESP32S2_COMMON_HAL_ALARM__INIT__H
+
+void alarm_reset(void);
+
+#endif // MICROPY_INCLUDED_ESP32S2_COMMON_HAL_ALARM__INIT__H
diff --git a/ports/esp32s2/common-hal/alarm/pin/PinAlarm.c b/ports/esp32s2/common-hal/alarm/pin/PinAlarm.c
new file mode 100644
index 000000000..582a66572
--- /dev/null
+++ b/ports/esp32s2/common-hal/alarm/pin/PinAlarm.c
@@ -0,0 +1,53 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Dan Halbert 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 "esp_sleep.h"
+
+#include "shared-bindings/alarm/pin/PinAlarm.h"
+#include "shared-bindings/microcontroller/Pin.h"
+
+void common_hal_alarm_pin_pin_alarm_construct(alarm_pin_pin_alarm_obj_t *self, mcu_pin_obj_t *pin, bool value, bool edge, bool pull) {
+ self->pin = pin;
+ self->value = value;
+ self->edge = edge;
+ self->pull = pull;
+}
+
+mcu_pin_obj_t *common_hal_alarm_pin_pin_alarm_get_pin(alarm_pin_pin_alarm_obj_t *self) {
+ return self->pin;
+}
+
+bool common_hal_alarm_pin_pin_alarm_get_value(alarm_pin_pin_alarm_obj_t *self) {
+ return self->value;
+}
+
+bool common_hal_alarm_pin_pin_alarm_get_edge(alarm_pin_pin_alarm_obj_t *self) {
+ return self->edge;
+}
+
+bool common_hal_alarm_pin_pin_alarm_get_pull(alarm_pin_pin_alarm_obj_t *self) {
+ return self->pull;
+}
diff --git a/ports/esp32s2/common-hal/alarm/pin/PinAlarm.h b/ports/esp32s2/common-hal/alarm/pin/PinAlarm.h
new file mode 100644
index 000000000..0eaa7777f
--- /dev/null
+++ b/ports/esp32s2/common-hal/alarm/pin/PinAlarm.h
@@ -0,0 +1,37 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Dan Halbert 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 "py/obj.h"
+#include "py/objtuple.h"
+
+typedef struct {
+ mp_obj_base_t base;
+ mcu_pin_obj_t *pin;
+ bool value;
+ bool all_same_value;
+ bool edge;
+ bool pull;
+} alarm_pin_pin_alarm_obj_t;
diff --git a/ports/esp32s2/common-hal/alarm/pin/__init__.c b/ports/esp32s2/common-hal/alarm/pin/__init__.c
new file mode 100644
index 000000000..b39693c6a
--- /dev/null
+++ b/ports/esp32s2/common-hal/alarm/pin/__init__.c
@@ -0,0 +1,35 @@
+#include "shared-bindings/alarm_io/__init__.h"
+
+#include "esp_sleep.h"
+#include "driver/rtc_io.h"
+
+mp_obj_t common_hal_alarm_io_pin_state (alarm_io_obj_t *self_in) {
+ if (!rtc_gpio_is_valid_gpio(self_in->gpio)) {
+ mp_raise_ValueError(translate("io must be rtc io"));
+ }
+
+ if (self_in->pull && !self_in->level) {
+ for (uint8_t i = 0; i<=4; i+=2) {
+ if (self_in->gpio == i) {
+ mp_raise_ValueError(translate("IOs 0, 2 & 4 do not support internal pullup in sleep"));
+ }
+ }
+ }
+
+ switch(esp_sleep_enable_ext0_wakeup(self_in->gpio, self_in->level)) {
+ case ESP_ERR_INVALID_ARG:
+ mp_raise_ValueError(translate("trigger level must be 0 or 1"));
+ case ESP_ERR_INVALID_STATE:
+ mp_raise_RuntimeError(translate("wakeup conflict"));
+ default:
+ break;
+ }
+
+ if (self_in->pull) { (self_in->level) ? rtc_gpio_pulldown_en(self_in->gpio) : rtc_gpio_pullup_en(self_in->gpio); }
+
+ return self_in;
+}
+
+void common_hal_alarm_io_disable (void) {
+ esp_sleep_disable_wakeup_source(ESP_SLEEP_WAKEUP_EXT0 | ESP_SLEEP_WAKEUP_EXT1);
+}
diff --git a/ports/esp32s2/common-hal/alarm/time/TimeAlarm.c b/ports/esp32s2/common-hal/alarm/time/TimeAlarm.c
new file mode 100644
index 000000000..d5e896c01
--- /dev/null
+++ b/ports/esp32s2/common-hal/alarm/time/TimeAlarm.c
@@ -0,0 +1,104 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Dan Halbert 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 "esp_sleep.h"
+
+#include "py/runtime.h"
+#include "supervisor/esp_port.h"
+
+#include "components/esp_timer/include/esp_timer.h"
+
+#include "shared-bindings/alarm/time/TimeAlarm.h"
+#include "shared-bindings/time/__init__.h"
+
+void common_hal_alarm_time_time_alarm_construct(alarm_time_time_alarm_obj_t *self, mp_float_t monotonic_time) {
+ self->monotonic_time = monotonic_time;
+}
+
+mp_float_t common_hal_alarm_time_time_alarm_get_monotonic_time(alarm_time_time_alarm_obj_t *self) {
+ return self->monotonic_time;
+}
+
+mp_obj_t alarm_time_timealarm_get_wakeup_alarm(size_t n_alarms, const mp_obj_t *alarms) {
+ // First, check to see if we match
+ for (size_t i = 0; i < n_alarms; i++) {
+ if (MP_OBJ_IS_TYPE(alarms[i], &alarm_time_time_alarm_type)) {
+ return alarms[i];
+ }
+ }
+ alarm_time_time_alarm_obj_t *timer = m_new_obj(alarm_time_time_alarm_obj_t);
+ timer->base.type = &alarm_time_time_alarm_type;
+ // TODO: Set monotonic_time based on the RTC state.
+ return timer;
+}
+
+esp_timer_handle_t pretend_sleep_timer;
+STATIC bool woke_up = false;
+
+// This is run in the timer task. We use it to wake the main CircuitPython task.
+void timer_callback(void *arg) {
+ (void) arg;
+ woke_up = true;
+ if (sleeping_circuitpython_task) {
+ xTaskNotifyGive(sleeping_circuitpython_task);
+ }
+}
+
+bool alarm_time_timealarm_woke_us_up(void) {
+ return woke_up;
+}
+
+void alarm_time_timealarm_reset(void) {
+ esp_timer_stop(pretend_sleep_timer);
+ esp_timer_delete(pretend_sleep_timer);
+ pretend_sleep_timer = NULL;
+ woke_up = false;
+}
+
+void alarm_time_timealarm_set_alarm(alarm_time_time_alarm_obj_t *self) {
+ if (pretend_sleep_timer != NULL) {
+ esp_timer_stop(pretend_sleep_timer);
+ } else {
+ // Configure the timer to use during pretend sleep.
+ esp_timer_create_args_t args;
+ args.callback = timer_callback;
+ args.arg = NULL;
+ args.dispatch_method = ESP_TIMER_TASK;
+ args.name = "Pretend deep sleep";
+ esp_timer_create(&args, &pretend_sleep_timer);
+ }
+
+ // Compute how long to actually sleep, considering the time now.
+ mp_float_t now_secs = uint64_to_float(common_hal_time_monotonic_ms()) / 1000.0f;
+ mp_float_t wakeup_in_secs = MAX(0.0f, self->monotonic_time - now_secs);
+ const uint64_t sleep_for_us = (uint64_t) (wakeup_in_secs * 1000000);
+ esp_sleep_enable_timer_wakeup(sleep_for_us);
+
+ // Also set the RTC interrupt so it can wake our task. This will be wiped out
+ // if we actually deep sleep.
+ woke_up = false;
+ esp_timer_start_once(pretend_sleep_timer, sleep_for_us);
+}
diff --git a/ports/esp32s2/common-hal/alarm/time/TimeAlarm.h b/ports/esp32s2/common-hal/alarm/time/TimeAlarm.h
new file mode 100644
index 000000000..04c553009
--- /dev/null
+++ b/ports/esp32s2/common-hal/alarm/time/TimeAlarm.h
@@ -0,0 +1,40 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Dan Halbert 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 "py/obj.h"
+
+typedef struct {
+ mp_obj_base_t base;
+ mp_float_t monotonic_time; // values compatible with time.monotonic_time()
+} alarm_time_time_alarm_obj_t;
+
+// Find the alarm object that caused us to wake up or create an equivalent one.
+mp_obj_t alarm_time_timealarm_get_wakeup_alarm(size_t n_alarms, const mp_obj_t *alarms);
+// Check for the wake up alarm from pretend deep sleep.
+bool alarm_time_timealarm_woke_us_up(void);
+void alarm_time_timealarm_set_alarm(alarm_time_time_alarm_obj_t *self);
+void alarm_time_timealarm_reset(void);
diff --git a/ports/esp32s2/common-hal/busio/I2C.c b/ports/esp32s2/common-hal/busio/I2C.c
index 6f1953128..772262d0a 100644
--- a/ports/esp32s2/common-hal/busio/I2C.c
+++ b/ports/esp32s2/common-hal/busio/I2C.c
@@ -49,11 +49,11 @@ void never_reset_i2c(i2c_port_t num) {
void i2c_reset(void) {
for (i2c_port_t num = 0; num < I2C_NUM_MAX; num++) {
if (i2c_status[num] == STATUS_IN_USE) {
- i2c_driver_delete(num);
i2c_status[num] = STATUS_FREE;
}
}
}
+static bool i2c_inited[I2C_NUM_MAX];
void common_hal_busio_i2c_construct(busio_i2c_obj_t *self,
const mcu_pin_obj_t* scl, const mcu_pin_obj_t* sda, uint32_t frequency, uint32_t timeout) {
@@ -121,13 +121,19 @@ void common_hal_busio_i2c_construct(busio_i2c_obj_t *self,
if (result != ESP_OK) {
mp_raise_ValueError(translate("Invalid pins"));
}
- result = i2c_driver_install(self->i2c_num,
- I2C_MODE_MASTER,
- 0,
- 0,
- 0);
- if (result != ESP_OK) {
- mp_raise_OSError(MP_EIO);
+
+
+ if (!i2c_inited[self->i2c_num]) {
+ result = i2c_driver_install(self->i2c_num,
+ I2C_MODE_MASTER,
+ 0,
+ 0,
+ 0);
+ if (result != ESP_OK) {
+ mp_raise_OSError(MP_EIO);
+ }
+ i2c_inited[self->i2c_num] = true;
+
}
claim_pin(sda);
@@ -143,7 +149,6 @@ void common_hal_busio_i2c_deinit(busio_i2c_obj_t *self) {
return;
}
- i2c_driver_delete(self->i2c_num);
i2c_status[self->i2c_num] = STATUS_FREE;
common_hal_reset_pin(self->sda_pin);
diff --git a/ports/esp32s2/common-hal/busio/SPI.c b/ports/esp32s2/common-hal/busio/SPI.c
index 490419f34..562881585 100644
--- a/ports/esp32s2/common-hal/busio/SPI.c
+++ b/ports/esp32s2/common-hal/busio/SPI.c
@@ -28,7 +28,6 @@
#include "py/mperrno.h"
#include "py/runtime.h"
-#include "boards/board.h"
#include "shared-bindings/microcontroller/Pin.h"
#include "supervisor/shared/rgb_led_status.h"
@@ -204,6 +203,14 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
// hal->dummy_bits = 0;
// hal->addr = 0;
+ claim_pin(self->clock_pin);
+ if (self->MOSI_pin != NULL) {
+ claim_pin(self->MOSI_pin);
+ }
+ if (self->MISO_pin != NULL) {
+ claim_pin(self->MISO_pin);
+ }
+
hal->io_mode = SPI_LL_IO_MODE_NORMAL;
common_hal_busio_spi_configure(self, 250000, 0, 0, 8);
diff --git a/ports/esp32s2/common-hal/frequencyio/FrequencyIn.c b/ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
new file mode 100644
index 000000000..12d612abb
--- /dev/null
+++ b/ports/esp32s2/common-hal/frequencyio/FrequencyIn.c
@@ -0,0 +1,193 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 microDev
+ *
+ * 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 "shared-bindings/frequencyio/FrequencyIn.h"
+
+#include "py/runtime.h"
+
+static void IRAM_ATTR pcnt_overflow_handler(void *self_in) {
+ frequencyio_frequencyin_obj_t * self = self_in;
+ // reset counter
+ pcnt_counter_clear(self->unit);
+
+ // increase multiplier
+ self->multiplier++;
+
+ // reset interrupt
+ PCNT.int_clr.val = BIT(self->unit);
+}
+
+static void IRAM_ATTR timer_interrupt_handler(void *self_in) {
+ frequencyio_frequencyin_obj_t * self = self_in;
+ // get counter value
+ int16_t count;
+ pcnt_get_counter_value(self->unit, &count);
+ self->frequency = ((count / 2.0) + (self->multiplier * INT16_MAX / 4.0)) / (self->capture_period);
+
+ // reset multiplier
+ self->multiplier = 0;
+
+ // reset counter
+ pcnt_counter_clear(self->unit);
+
+ // reset interrupt
+ timg_dev_t *device = self->timer.group ? &(TIMERG1) : &(TIMERG0);
+ if (self->timer.idx) {
+ device->int_clr.t1 = 1;
+ } else {
+ device->int_clr.t0 = 1;
+ }
+ device->hw_timer[self->timer.idx].config.alarm_en = 1;
+}
+
+static void init_pcnt(frequencyio_frequencyin_obj_t* self) {
+ // Prepare configuration for the PCNT unit
+ const pcnt_config_t pcnt_config = {
+ // Set PCNT input signal and control GPIOs
+ .pulse_gpio_num = self->pin,
+ .ctrl_gpio_num = PCNT_PIN_NOT_USED,
+ .channel = PCNT_CHANNEL_0,
+ // What to do on the positive / negative edge of pulse input?
+ .pos_mode = PCNT_COUNT_INC, // count both rising and falling edges
+ .neg_mode = PCNT_COUNT_INC,
+ // Set counter limit
+ .counter_h_lim = INT16_MAX,
+ .counter_l_lim = 0,
+ };
+
+ // initialize PCNT
+ const int8_t unit = peripherals_pcnt_init(pcnt_config);
+ if (unit == -1) {
+ mp_raise_RuntimeError(translate("All PCNT units in use"));
+ }
+
+ // set the GPIO back to high-impedance, as pcnt_unit_config sets it as pull-up
+ gpio_set_pull_mode(self->pin, GPIO_FLOATING);
+
+ self->unit = (pcnt_unit_t)unit;
+
+ // enable pcnt interrupt
+ pcnt_event_enable(self->unit, PCNT_EVT_H_LIM);
+ pcnt_isr_register(pcnt_overflow_handler, (void *)self, ESP_INTR_FLAG_IRAM, &self->handle);
+ pcnt_intr_enable(self->unit);
+}
+
+static void init_timer(frequencyio_frequencyin_obj_t* self) {
+ // Prepare configuration for the timer module
+ const timer_config_t config = {
+ .alarm_en = true,
+ .counter_en = false,
+ .intr_type = TIMER_INTR_LEVEL,
+ .counter_dir = TIMER_COUNT_UP,
+ .auto_reload = true,
+ .divider = 80 // 1 us per tick
+ };
+
+ // initialize Timer
+ peripherals_timer_init(&config, &self->timer);
+ if (self->timer.idx == TIMER_MAX || self->timer.group == TIMER_GROUP_MAX) {
+ mp_raise_RuntimeError(translate("All timers in use"));
+ }
+
+ timer_idx_t idx = self->timer.idx;
+ timer_group_t group = self->timer.group;
+
+ // enable timer interrupt
+ timer_set_alarm_value(group, idx, self->capture_period * 1000000);
+ timer_isr_register(group, idx, timer_interrupt_handler, (void *)self, ESP_INTR_FLAG_IRAM, &self->handle);
+ timer_enable_intr(group, idx);
+
+ // start timer
+ timer_start(self->timer.group, self->timer.idx);
+}
+
+void common_hal_frequencyio_frequencyin_construct(frequencyio_frequencyin_obj_t* self,
+ const mcu_pin_obj_t* pin, const uint16_t capture_period) {
+ if ((capture_period == 0) || (capture_period > 500)) {
+ mp_raise_ValueError(translate("Invalid capture period. Valid range: 1 - 500"));
+ }
+
+ self->pin = pin->number;
+ self->handle = NULL;
+ self->multiplier = 0;
+ self->capture_period = capture_period;
+
+ // initialize pcnt and timer
+ init_pcnt(self);
+ init_timer(self);
+
+ claim_pin(pin);
+}
+
+bool common_hal_frequencyio_frequencyin_deinited(frequencyio_frequencyin_obj_t* self) {
+ return self->unit == PCNT_UNIT_MAX;
+}
+
+void common_hal_frequencyio_frequencyin_deinit(frequencyio_frequencyin_obj_t* self) {
+ if (common_hal_frequencyio_frequencyin_deinited(self)) {
+ return;
+ }
+ reset_pin_number(self->pin);
+ peripherals_pcnt_deinit(&self->unit);
+ peripherals_timer_deinit(&self->timer);
+ if (self->handle) {
+ esp_intr_free(self->handle);
+ self->handle = NULL;
+ }
+}
+
+uint32_t common_hal_frequencyio_frequencyin_get_item(frequencyio_frequencyin_obj_t* self) {
+ return self->frequency;
+}
+
+void common_hal_frequencyio_frequencyin_pause(frequencyio_frequencyin_obj_t* self) {
+ pcnt_counter_pause(self->unit);
+ timer_pause(self->timer.group, self->timer.idx);
+}
+
+void common_hal_frequencyio_frequencyin_resume(frequencyio_frequencyin_obj_t* self) {
+ pcnt_counter_resume(self->unit);
+ timer_start(self->timer.group, self->timer.idx);
+}
+
+void common_hal_frequencyio_frequencyin_clear(frequencyio_frequencyin_obj_t* self) {
+ self->frequency = 0;
+ pcnt_counter_clear(self->unit);
+ timer_set_counter_value(self->timer.group, self->timer.idx, 0);
+}
+
+uint16_t common_hal_frequencyio_frequencyin_get_capture_period(frequencyio_frequencyin_obj_t *self) {
+ return self->capture_period;
+}
+
+void common_hal_frequencyio_frequencyin_set_capture_period(frequencyio_frequencyin_obj_t *self, uint16_t capture_period) {
+ if ((capture_period == 0) || (capture_period > 500)) {
+ mp_raise_ValueError(translate("Invalid capture period. Valid range: 1 - 500"));
+ }
+ self->capture_period = capture_period;
+ common_hal_frequencyio_frequencyin_clear(self);
+ timer_set_alarm_value(self->timer.group, self->timer.idx, capture_period * 1000000);
+}
diff --git a/ports/esp32s2/common-hal/frequencyio/FrequencyIn.h b/ports/esp32s2/common-hal/frequencyio/FrequencyIn.h
new file mode 100644
index 000000000..cf9d2ae53
--- /dev/null
+++ b/ports/esp32s2/common-hal/frequencyio/FrequencyIn.h
@@ -0,0 +1,45 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 microDev
+ *
+ * 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.
+ */
+
+#ifndef MICROPY_INCLUDED_ESP32S2_COMMON_HAL_FREQUENCYIO_FREQUENCYIN_H
+#define MICROPY_INCLUDED_ESP32S2_COMMON_HAL_FREQUENCYIO_FREQUENCYIN_H
+
+#include "py/obj.h"
+#include "peripherals/pcnt.h"
+#include "peripherals/timer.h"
+
+typedef struct {
+ mp_obj_base_t base;
+ pcnt_unit_t unit;
+ timer_index_t timer;
+ intr_handle_t handle;
+ uint8_t pin;
+ uint8_t multiplier;
+ uint32_t frequency;
+ uint16_t capture_period;
+} frequencyio_frequencyin_obj_t;
+
+#endif // MICROPY_INCLUDED_ESP32S2_COMMON_HAL_FREQUENCYIO_FREQUENCYIN_H
diff --git a/ports/esp32s2/common-hal/frequencyio/__init__.c b/ports/esp32s2/common-hal/frequencyio/__init__.c
new file mode 100644
index 000000000..487814bd0
--- /dev/null
+++ b/ports/esp32s2/common-hal/frequencyio/__init__.c
@@ -0,0 +1 @@
+// No ferquencyio module functions.
diff --git a/ports/esp32s2/common-hal/microcontroller/Pin.c b/ports/esp32s2/common-hal/microcontroller/Pin.c
index 3c2611efe..394a19e69 100644
--- a/ports/esp32s2/common-hal/microcontroller/Pin.c
+++ b/ports/esp32s2/common-hal/microcontroller/Pin.c
@@ -96,7 +96,7 @@ void reset_all_pins(void) {
}
void claim_pin(const mcu_pin_obj_t* pin) {
- in_use[pin->number / 32] |= (1 << pin->number % 32);
+ in_use[pin->number / 32] |= (1 << (pin->number % 32));
#ifdef MICROPY_HW_NEOPIXEL
if (pin == MICROPY_HW_NEOPIXEL) {
neopixel_in_use = true;
@@ -116,7 +116,7 @@ bool pin_number_is_free(gpio_num_t pin_number) {
#endif
uint8_t offset = pin_number / 32;
- uint8_t mask = 1 << pin_number % 32;
+ uint32_t mask = 1 << (pin_number % 32);
return (never_reset_pins[offset] & mask) == 0 && (in_use[offset] & mask) == 0;
}
diff --git a/ports/esp32s2/common-hal/microcontroller/Processor.c b/ports/esp32s2/common-hal/microcontroller/Processor.c
index b81521601..fffd1a1b1 100644
--- a/ports/esp32s2/common-hal/microcontroller/Processor.c
+++ b/ports/esp32s2/common-hal/microcontroller/Processor.c
@@ -28,10 +28,15 @@
#include <math.h>
#include <string.h>
-#include "common-hal/microcontroller/Processor.h"
#include "py/runtime.h"
+
+#include "common-hal/microcontroller/Processor.h"
+#include "shared-bindings/microcontroller/ResetReason.h"
#include "supervisor/shared/translate.h"
+#include "esp_sleep.h"
+#include "esp_system.h"
+
#include "soc/efuse_reg.h"
#include "components/driver/esp32s2/include/driver/temp_sensor.h"
@@ -74,3 +79,44 @@ void common_hal_mcu_processor_get_uid(uint8_t raw_id[]) {
*ptr-- = swap_nibbles(mac_address_part & 0xff); mac_address_part >>= 8;
*ptr-- = swap_nibbles(mac_address_part & 0xff);
}
+
+mcu_reset_reason_t common_hal_mcu_processor_get_reset_reason(void) {
+ switch (esp_reset_reason()) {
+ case ESP_RST_POWERON:
+ return RESET_REASON_POWER_ON;
+
+ case ESP_RST_SW:
+ case ESP_RST_PANIC:
+ return RESET_REASON_SOFTWARE;
+
+ case ESP_RST_INT_WDT:
+ case ESP_RST_TASK_WDT:
+ case ESP_RST_WDT:
+ return RESET_REASON_WATCHDOG;
+
+ case ESP_RST_BROWNOUT:
+ return RESET_REASON_BROWNOUT;
+
+ case ESP_RST_SDIO:
+ case ESP_RST_EXT:
+ return RESET_REASON_RESET_PIN;
+
+ case ESP_RST_DEEPSLEEP:
+ switch (esp_sleep_get_wakeup_cause()) {
+ case ESP_SLEEP_WAKEUP_TIMER:
+ case ESP_SLEEP_WAKEUP_EXT0:
+ case ESP_SLEEP_WAKEUP_EXT1:
+ case ESP_SLEEP_WAKEUP_TOUCHPAD:
+ return RESET_REASON_DEEP_SLEEP_ALARM;
+
+ case ESP_SLEEP_WAKEUP_UNDEFINED:
+ default:
+ return RESET_REASON_UNKNOWN;
+ }
+
+ case ESP_RST_UNKNOWN:
+ default:
+ return RESET_REASON_UNKNOWN;
+
+ }
+}
diff --git a/ports/esp32s2/common-hal/microcontroller/Processor.h b/ports/esp32s2/common-hal/microcontroller/Processor.h
index f6636b333..641a11d55 100644
--- a/ports/esp32s2/common-hal/microcontroller/Processor.h
+++ b/ports/esp32s2/common-hal/microcontroller/Processor.h
@@ -24,8 +24,8 @@
* THE SOFTWARE.
*/
-#ifndef MICROPY_INCLUDED_LITEX_COMMON_HAL_MICROCONTROLLER_PROCESSOR_H
-#define MICROPY_INCLUDED_LITEX_COMMON_HAL_MICROCONTROLLER_PROCESSOR_H
+#ifndef MICROPY_INCLUDED_ESP32S2_COMMON_HAL_MICROCONTROLLER_PROCESSOR_H
+#define MICROPY_INCLUDED_ESP32S2_COMMON_HAL_MICROCONTROLLER_PROCESSOR_H
#define COMMON_HAL_MCU_PROCESSOR_UID_LENGTH 6
@@ -36,4 +36,4 @@ typedef struct {
// Stores no state currently.
} mcu_processor_obj_t;
-#endif // MICROPY_INCLUDED_LITEX_COMMON_HAL_MICROCONTROLLER_PROCESSOR_H
+#endif // MICROPY_INCLUDED_ESP32S2_COMMON_HAL_MICROCONTROLLER_PROCESSOR_H
diff --git a/ports/esp32s2/common-hal/microcontroller/__init__.c b/ports/esp32s2/common-hal/microcontroller/__init__.c
index 6b2e18673..e425cbf54 100644
--- a/ports/esp32s2/common-hal/microcontroller/__init__.c
+++ b/ports/esp32s2/common-hal/microcontroller/__init__.c
@@ -25,8 +25,8 @@
* THE SOFTWARE.
*/
-#include "py/mphal.h"
#include "py/obj.h"
+#include "py/mphal.h"
#include "py/runtime.h"
#include "common-hal/microcontroller/Pin.h"
@@ -35,6 +35,7 @@
#include "shared-bindings/microcontroller/__init__.h"
#include "shared-bindings/microcontroller/Pin.h"
#include "shared-bindings/microcontroller/Processor.h"
+#include "shared-bindings/nvm/ByteArray.h"
#include "supervisor/filesystem.h"
#include "supervisor/shared/safe_mode.h"
@@ -42,7 +43,7 @@
#include "freertos/FreeRTOS.h"
void common_hal_mcu_delay_us(uint32_t delay) {
-
+ mp_hal_delay_us(delay);
}
volatile uint32_t nesting_count = 0;
@@ -73,8 +74,7 @@ void common_hal_mcu_on_next_reset(mcu_runmode_t runmode) {
void common_hal_mcu_reset(void) {
filesystem_flush(); //TODO: implement as part of flash improvements
- // NVIC_SystemReset();
- while(1);
+ esp_restart();
}
// The singleton microcontroller.Processor object, bound to microcontroller.cpu
@@ -85,6 +85,28 @@ const mcu_processor_obj_t common_hal_mcu_processor_obj = {
},
};
+#if CIRCUITPY_INTERNAL_NVM_SIZE > 0
+// The singleton nvm.ByteArray object.
+const nvm_bytearray_obj_t common_hal_mcu_nvm_obj = {
+ .base = {
+ .type = &nvm_bytearray_type,
+ },
+ .start_address = (uint8_t*) CIRCUITPY_INTERNAL_NVM_START_ADDR,
+ .len = CIRCUITPY_INTERNAL_NVM_SIZE,
+};
+#endif
+
+#if CIRCUITPY_WATCHDOG
+// The singleton watchdog.WatchDogTimer object.
+watchdog_watchdogtimer_obj_t common_hal_mcu_watchdogtimer_obj = {
+ .base = {
+ .type = &watchdog_watchdogtimer_type,
+ },
+ .timeout = 0.0f,
+ .mode = WATCHDOGMODE_NONE,
+};
+#endif
+
// This maps MCU pin names to pin objects.
STATIC const mp_rom_map_elem_t mcu_pin_global_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_GPIO0), MP_ROM_PTR(&pin_GPIO0) },
diff --git a/ports/esp32s2/common-hal/nvm/ByteArray.c b/ports/esp32s2/common-hal/nvm/ByteArray.c
new file mode 100644
index 000000000..71321e7e6
--- /dev/null
+++ b/ports/esp32s2/common-hal/nvm/ByteArray.c
@@ -0,0 +1,97 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 microDev
+ *
+ * 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 "common-hal/nvm/ByteArray.h"
+
+#include "py/runtime.h"
+#include "nvs_flash.h"
+
+uint32_t common_hal_nvm_bytearray_get_length(nvm_bytearray_obj_t *self) {
+ return self->len;
+}
+
+static void get_nvs_handle(nvs_handle_t * nvs_handle) {
+ // Initialize NVS
+ esp_err_t err = nvs_flash_init();
+ if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) {
+ // NVS partition was truncated and needs to be erased
+ // Retry nvs_flash_init
+ ESP_ERROR_CHECK(nvs_flash_erase());
+ err = nvs_flash_init();
+ }
+ ESP_ERROR_CHECK(err);
+
+ // Open NVS handle
+ if (nvs_open("CPY", NVS_READWRITE, nvs_handle) != ESP_OK) {
+ mp_raise_RuntimeError(translate("NVS Error"));
+ }
+}
+
+bool common_hal_nvm_bytearray_set_bytes(nvm_bytearray_obj_t *self,
+ uint32_t start_index, uint8_t* values, uint32_t len) {
+ char index[9];
+
+ // start nvs
+ nvs_handle_t handle;
+ get_nvs_handle(&handle);
+
+ // stage flash changes
+ for (uint32_t i = 0; i < len; i++) {
+ sprintf(index, "%i", start_index + i);
+ if (nvs_set_u8(handle, (const char *)index, values[i]) != ESP_OK) {
+ return false;
+ }
+ }
+
+ // commit flash changes
+ if (nvs_commit(handle) != ESP_OK) {
+ return false;
+ }
+
+ // close nvs
+ nvs_close(handle);
+ return true;
+}
+
+void common_hal_nvm_bytearray_get_bytes(nvm_bytearray_obj_t *self,
+ uint32_t start_index, uint32_t len, uint8_t* values) {
+ char index[9];
+
+ // start nvs
+ nvs_handle_t handle;
+ get_nvs_handle(&handle);
+
+ // get from flash
+ for (uint32_t i = 0; i < len; i++) {
+ sprintf(index, "%i", start_index + i);
+ if (nvs_get_u8(handle, (const char *)index, &values[i]) != ESP_OK) {
+ mp_raise_RuntimeError(translate("NVS Error"));
+ }
+ }
+
+ // close nvs
+ nvs_close(handle);
+}
diff --git a/ports/esp32s2/common-hal/nvm/ByteArray.h b/ports/esp32s2/common-hal/nvm/ByteArray.h
new file mode 100644
index 000000000..44b63d724
--- /dev/null
+++ b/ports/esp32s2/common-hal/nvm/ByteArray.h
@@ -0,0 +1,38 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 microDev
+ *
+ * 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.
+ */
+
+#ifndef MICROPY_INCLUDED_ESP32S2_COMMON_HAL_NVM_BYTEARRAY_H
+#define MICROPY_INCLUDED_ESP32S2_COMMON_HAL_NVM_BYTEARRAY_H
+
+#include "py/obj.h"
+
+typedef struct {
+ mp_obj_base_t base;
+ uint8_t* start_address;
+ uint32_t len;
+} nvm_bytearray_obj_t;
+
+#endif // MICROPY_INCLUDED_ESP32S2_COMMON_HAL_NVM_BYTEARRAY_H
diff --git a/ports/esp32s2/common-hal/nvm/__init__.c b/ports/esp32s2/common-hal/nvm/__init__.c
new file mode 100644
index 000000000..1b702a158
--- /dev/null
+++ b/ports/esp32s2/common-hal/nvm/__init__.c
@@ -0,0 +1 @@
+// No nvm module functions.
diff --git a/ports/esp32s2/common-hal/ps2io/Ps2.c b/ports/esp32s2/common-hal/ps2io/Ps2.c
new file mode 100644
index 000000000..003f0d827
--- /dev/null
+++ b/ports/esp32s2/common-hal/ps2io/Ps2.c
@@ -0,0 +1,392 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 microDev
+ *
+ * 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 "common-hal/ps2io/Ps2.h"
+
+#include "supervisor/port.h"
+#include "shared-bindings/microcontroller/__init__.h"
+
+#define STATE_IDLE 0
+#define STATE_RECV 1
+#define STATE_RECV_PARITY 2
+#define STATE_RECV_STOP 3
+#define STATE_RECV_ERR 10
+
+#define ERROR_STARTBIT 0x01
+#define ERROR_TIMEOUT 0x02
+#define ERROR_PARITY 0x04
+#define ERROR_STOPBIT 0x08
+#define ERROR_BUFFER 0x10
+
+#define ERROR_TX_CLKLO 0x100
+#define ERROR_TX_CLKHI 0x200
+#define ERROR_TX_ACKDATA 0x400
+#define ERROR_TX_ACKCLK 0x800
+#define ERROR_TX_RTS 0x1000
+#define ERROR_TX_NORESP 0x2000
+
+void ps2_reset(void) {
+ gpio_uninstall_isr_service();
+}
+
+static void delay_us(uint32_t t) {
+ common_hal_mcu_delay_us(t);
+}
+
+/* interrupt handling */
+
+static void IRAM_ATTR ps2_interrupt_handler(void *self_in) {
+ // Grab the current time first.
+ uint64_t current_tick = port_get_raw_ticks(NULL);
+
+ ps2io_ps2_obj_t * self = self_in;
+ int data_bit = gpio_get_level(self->data_pin) ? 1 : 0;
+
+ // test for timeout
+ if (self->state != STATE_IDLE) {
+ int64_t diff_ms = current_tick - self->last_raw_ticks;
+ if (diff_ms > 1) { // a.k.a. > 1.001ms
+ self->last_errors |= ERROR_TIMEOUT;
+ self->state = STATE_IDLE;
+ }
+ }
+
+ self->last_raw_ticks = current_tick;
+
+ if (self->state == STATE_IDLE) {
+ self->bits = 0;
+ self->parity = false;
+ self->bitcount = 0;
+ self->state = STATE_RECV;
+ if (data_bit) {
+ // start bit should be 0
+ self->last_errors |= ERROR_STARTBIT;
+ self->state = STATE_RECV_ERR;
+ } else {
+ self->state = STATE_RECV;
+ }
+
+ } else if (self->state == STATE_RECV) {
+ if (data_bit) {
+ self->bits |= data_bit << self->bitcount;
+ self->parity = !self->parity;
+ }
+ ++self->bitcount;
+ if (self->bitcount >= 8) {
+ self->state = STATE_RECV_PARITY;
+ }
+
+ } else if (self->state == STATE_RECV_PARITY) {
+ ++self->bitcount;
+ if (data_bit) {
+ self->parity = !self->parity;
+ }
+ if (!self->parity) {
+ self->last_errors |= ERROR_PARITY;
+ self->state = STATE_RECV_ERR;
+ } else {
+ self->state = STATE_RECV_STOP;
+ }
+
+ } else if (self->state == STATE_RECV_STOP) {
+ ++self->bitcount;
+ if (! data_bit) {
+ self->last_errors |= ERROR_STOPBIT;
+ } else if (self->waiting_cmd_response) {
+ self->cmd_response = self->bits;
+ self->waiting_cmd_response = false;
+ } else if (self->bufcount >= sizeof(self->buffer)) {
+ self->last_errors |= ERROR_BUFFER;
+ } else {
+ self->buffer[self->bufposw] = self->bits;
+ self->bufposw = (self->bufposw + 1) % sizeof(self->buffer);
+ self->bufcount++;
+ }
+ self->state = STATE_IDLE;
+
+ } else if (self->state == STATE_RECV_ERR) {
+ // just count the bits until idle
+ if (++self->bitcount >= 10) {
+ self->state = STATE_IDLE;
+ }
+ }
+}
+
+static void enable_interrupt(ps2io_ps2_obj_t* self) {
+ // turn on falling edge interrupt
+ gpio_install_isr_service(ESP_INTR_FLAG_IRAM);
+ gpio_set_intr_type(self->clk_pin, GPIO_INTR_NEGEDGE);
+ gpio_isr_handler_add(self->clk_pin, ps2_interrupt_handler, (void*)self);
+}
+
+static void disable_interrupt(ps2io_ps2_obj_t* self) {
+ // turn off fallling edge interrupt
+ gpio_isr_handler_remove(self->clk_pin);
+}
+
+static void resume_interrupt(ps2io_ps2_obj_t* self) {
+ self->state = STATE_IDLE;
+ gpio_isr_handler_add(self->clk_pin, ps2_interrupt_handler, (void*)self);
+}
+
+/* gpio handling */
+
+static void clk_hi(ps2io_ps2_obj_t* self) {
+ // external pull-up
+ gpio_set_direction(self->clk_pin, GPIO_MODE_INPUT);
+}
+
+static bool wait_clk_lo(ps2io_ps2_obj_t* self, uint32_t us) {
+ clk_hi(self);
+ delay_us(1);
+ while (gpio_get_level(self->clk_pin) && us) {
+ --us;
+ delay_us(1);
+ }
+ return us;
+}
+
+static bool wait_clk_hi(ps2io_ps2_obj_t* self, uint32_t us) {
+ clk_hi(self);
+ delay_us(1);
+ while (!gpio_get_level(self->clk_pin) && us) {
+ --us;
+ delay_us(1);
+ }
+ return us;
+}
+
+static void clk_lo(ps2io_ps2_obj_t* self) {
+ gpio_set_direction(self->clk_pin, GPIO_MODE_OUTPUT);
+ gpio_set_level(self->clk_pin, 0);
+}
+
+static void data_hi(ps2io_ps2_obj_t* self) {
+ // external pull-up
+ gpio_set_direction(self->data_pin, GPIO_MODE_INPUT);
+}
+
+static bool wait_data_lo(ps2io_ps2_obj_t* self, uint32_t us) {
+ data_hi(self);
+ delay_us(1);
+ while (gpio_get_level(self->data_pin) && us) {
+ --us;
+ delay_us(1);
+ }
+ return us;
+}
+
+static bool wait_data_hi(ps2io_ps2_obj_t* self, uint32_t us) {
+ data_hi(self);
+ delay_us(1);
+ while (!gpio_get_level(self->data_pin) && us) {
+ --us;
+ delay_us(1);
+ }
+ return us;
+}
+
+static void data_lo(ps2io_ps2_obj_t* self) {
+ gpio_set_direction(self->data_pin, GPIO_MODE_OUTPUT);
+ gpio_set_level(self->data_pin, 0);
+}
+
+static void idle(ps2io_ps2_obj_t* self) {
+ clk_hi(self);
+ data_hi(self);
+}
+
+static void inhibit(ps2io_ps2_obj_t* self) {
+ clk_lo(self);
+ data_hi(self);
+}
+
+/* ps2io module functions */
+
+void common_hal_ps2io_ps2_construct(ps2io_ps2_obj_t* self,
+ const mcu_pin_obj_t* data_pin, const mcu_pin_obj_t* clk_pin) {
+ self->clk_pin = (gpio_num_t)clk_pin->number;
+ self->data_pin = (gpio_num_t)data_pin->number;
+ self->state = STATE_IDLE;
+ self->bufcount = 0;
+ self->bufposr = 0;
+ self->bufposw = 0;
+ self->waiting_cmd_response = false;
+
+ idle(self);
+ enable_interrupt(self);
+
+ claim_pin(clk_pin);
+ claim_pin(data_pin);
+}
+
+bool common_hal_ps2io_ps2_deinited(ps2io_ps2_obj_t* self) {
+ return self->clk_pin == GPIO_NUM_MAX;
+}
+
+void common_hal_ps2io_ps2_deinit(ps2io_ps2_obj_t* self) {
+ if (common_hal_ps2io_ps2_deinited(self)) {
+ return;
+ }
+ gpio_uninstall_isr_service();
+ reset_pin_number(self->clk_pin);
+ reset_pin_number(self->data_pin);
+ self->clk_pin = GPIO_NUM_MAX;
+ self->data_pin = GPIO_NUM_MAX;
+}
+
+uint16_t common_hal_ps2io_ps2_get_len(ps2io_ps2_obj_t* self) {
+ return self->bufcount;
+}
+
+int16_t common_hal_ps2io_ps2_popleft(ps2io_ps2_obj_t* self) {
+ common_hal_mcu_disable_interrupts();
+ if (self->bufcount <= 0) {
+ common_hal_mcu_enable_interrupts();
+ return -1;
+ }
+ uint8_t b = self->buffer[self->bufposr];
+ self->bufposr = (self->bufposr + 1) % sizeof(self->buffer);
+ self->bufcount -= 1;
+ common_hal_mcu_enable_interrupts();
+ return b;
+}
+
+uint16_t common_hal_ps2io_ps2_clear_errors(ps2io_ps2_obj_t* self) {
+ common_hal_mcu_disable_interrupts();
+ uint16_t errors = self->last_errors;
+ self->last_errors = 0;
+ common_hal_mcu_enable_interrupts();
+ return errors;
+}
+
+// Based upon TMK implementation of PS/2 protocol
+// https://github.com/tmk/tmk_keyboard/blob/master/tmk_core/protocol/ps2_interrupt.c
+
+int16_t common_hal_ps2io_ps2_sendcmd(ps2io_ps2_obj_t* self, uint8_t b) {
+ disable_interrupt(self);
+
+ /* terminate a transmission if we have */
+ inhibit(self);
+ delay_us(100);
+
+ /* RTS and start bit */
+ data_lo(self);
+ clk_hi(self);
+ if (!wait_clk_lo(self, 10000)) {
+ self->last_errors |= ERROR_TX_RTS;
+ goto ERROR;
+ }
+
+ bool parity = true;
+ for (uint8_t i = 0; i < 8; i++) {
+ delay_us(15);
+ if (b & (1 << i)) {
+ parity = !parity;
+ data_hi(self);
+ } else {
+ data_lo(self);
+ }
+ if (!wait_clk_hi(self, 50)) {
+ self->last_errors |= ERROR_TX_CLKHI;
+ goto ERROR;
+ }
+ if (!wait_clk_lo(self, 50)) {
+ self->last_errors |= ERROR_TX_CLKLO;
+ goto ERROR;
+ }
+ }
+
+ /* Parity bit */
+ delay_us(15);
+ if (parity) {
+ data_hi(self);
+ } else {
+ data_lo(self);
+ }
+ if (!wait_clk_hi(self, 50)) {
+ self->last_errors |= ERROR_TX_CLKHI;
+ goto ERROR;
+ }
+ if (!wait_clk_lo(self, 50)) {
+ self->last_errors |= ERROR_TX_CLKLO;
+ goto ERROR;
+ }
+
+ /* Stop bit */
+ delay_us(15);
+ data_hi(self);
+
+ /* Ack */
+ if (!wait_data_lo(self, 50)) {
+ self->last_errors |= ERROR_TX_ACKDATA;
+ goto ERROR;
+ }
+ if (!wait_clk_lo(self, 50)) {
+ self->last_errors |= ERROR_TX_ACKCLK;
+ goto ERROR;
+ }
+
+ /* wait for idle state */
+ if (!wait_clk_hi(self, 50)) {
+ self->last_errors |= ERROR_TX_ACKCLK;
+ goto ERROR;
+ }
+ if (!wait_data_hi(self, 50)) {
+ self->last_errors |= ERROR_TX_ACKDATA;
+ goto ERROR;
+ }
+
+ /* Wait for response byte */
+ self->waiting_cmd_response = true;
+ idle(self);
+ resume_interrupt(self);
+
+ for (int i = 0; i < 25; ++i) {
+ delay_us(1000);
+ common_hal_mcu_disable_interrupts();
+ bool has_response = !self->waiting_cmd_response;
+ uint8_t response = self->cmd_response;
+ common_hal_mcu_enable_interrupts();
+
+ if (has_response) {
+ return response;
+ }
+ }
+
+ /* No response */
+ common_hal_mcu_disable_interrupts();
+ self->waiting_cmd_response = false;
+ self->last_errors |= ERROR_TX_NORESP;
+ common_hal_mcu_enable_interrupts();
+ return -1;
+
+ /* Other errors */
+ERROR:
+ idle(self);
+ resume_interrupt(self);
+ return -1;
+}
diff --git a/ports/atmel-samd/boards/board.h b/ports/esp32s2/common-hal/ps2io/Ps2.h
index 4f0ae9d72..497952b25 100644
--- a/ports/atmel-samd/boards/board.h
+++ b/ports/esp32s2/common-hal/ps2io/Ps2.h
@@ -3,7 +3,7 @@
*
* The MIT License (MIT)
*
- * Copyright (c) 2017 Scott Shawcroft for Adafruit Industries
+ * Copyright (c) 2020 microDev
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -24,24 +24,37 @@
* THE SOFTWARE.
*/
-// This file defines board specific functions.
+#ifndef MICROPY_INCLUDED_ESP32S2_COMMON_HAL_PS2IO_PS2_H
+#define MICROPY_INCLUDED_ESP32S2_COMMON_HAL_PS2IO_PS2_H
-#ifndef MICROPY_INCLUDED_ATMEL_SAMD_BOARDS_BOARD_H
-#define MICROPY_INCLUDED_ATMEL_SAMD_BOARDS_BOARD_H
+#include "common-hal/microcontroller/Pin.h"
-#include <stdbool.h>
+#include "py/obj.h"
+#include "driver/gpio.h"
-#include "py/mpconfig.h"
+typedef struct {
+ mp_obj_base_t base;
+ gpio_num_t clk_pin;
+ gpio_num_t data_pin;
-// Initializes board related state once on start up.
-void board_init(void);
+ uint8_t state;
+ uint64_t last_raw_ticks;
-// Returns true if the user initiates safe mode in a board specific way.
-// Also add BOARD_USER_SAFE_MODE in mpconfigboard.h to explain the board specific
-// way.
-bool board_requests_safe_mode(void);
+ uint16_t bits;
+ bool parity;
+ uint8_t bitcount;
-// Reset the state of off MCU components such as neopixels.
-void reset_board(void);
+ uint8_t buffer[16];
+ uint8_t bufcount;
+ uint8_t bufposr;
+ uint8_t bufposw;
-#endif // MICROPY_INCLUDED_ATMEL_SAMD_BOARDS_BOARD_H
+ uint16_t last_errors;
+
+ bool waiting_cmd_response;
+ uint8_t cmd_response;
+} ps2io_ps2_obj_t;
+
+void ps2_reset(void);
+
+#endif // MICROPY_INCLUDED_ESP32S2_COMMON_HAL_PS2IO_PS2_H
diff --git a/ports/esp32s2/common-hal/ps2io/__init__.c b/ports/esp32s2/common-hal/ps2io/__init__.c
new file mode 100644
index 000000000..ba4b4249f
--- /dev/null
+++ b/ports/esp32s2/common-hal/ps2io/__init__.c
@@ -0,0 +1 @@
+// No ps2io module functions.
diff --git a/ports/esp32s2/common-hal/pulseio/PulseIn.c b/ports/esp32s2/common-hal/pulseio/PulseIn.c
index f7429ec12..9feeea147 100644
--- a/ports/esp32s2/common-hal/pulseio/PulseIn.c
+++ b/ports/esp32s2/common-hal/pulseio/PulseIn.c
@@ -77,7 +77,9 @@ void pulsein_reset(void) {
for (size_t i = 0; i < RMT_CHANNEL_MAX; i++) {
handles[i] = NULL;
}
- supervisor_disable_tick();
+ if (refcount != 0) {
+ supervisor_disable_tick();
+ }
refcount = 0;
}
@@ -122,8 +124,10 @@ void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t* self, const mcu
// start RMT RX, and enable ticks so the core doesn't turn off.
rmt_rx_start(channel, true);
- supervisor_enable_tick();
refcount++;
+ if (refcount == 1) {
+ supervisor_enable_tick();
+ }
}
bool common_hal_pulseio_pulsein_deinited(pulseio_pulsein_obj_t* self) {
diff --git a/ports/esp32s2/common-hal/rtc/RTC.h b/ports/esp32s2/common-hal/rtc/RTC.h
index e51f1f784..233cde3fd 100644
--- a/ports/esp32s2/common-hal/rtc/RTC.h
+++ b/ports/esp32s2/common-hal/rtc/RTC.h
@@ -24,11 +24,11 @@
* THE SOFTWARE.
*/
-#ifndef MICROPY_INCLUDED_NRF_COMMON_HAL_RTC_RTC_H
-#define MICROPY_INCLUDED_NRF_COMMON_HAL_RTC_RTC_H
+#ifndef MICROPY_INCLUDED_ESP32S2_COMMON_HAL_RTC_RTC_H
+#define MICROPY_INCLUDED_ESP32S2_COMMON_HAL_RTC_RTC_H
extern void rtc_init(void);
extern void rtc_reset(void);
extern void common_hal_rtc_init(void);
-#endif // MICROPY_INCLUDED_NRF_COMMON_HAL_RTC_RTC_H
+#endif // MICROPY_INCLUDED_ESP32S2_COMMON_HAL_RTC_RTC_H
diff --git a/ports/esp32s2/common-hal/socketpool/Socket.c b/ports/esp32s2/common-hal/socketpool/Socket.c
index 750415dc7..32c5fc72f 100644
--- a/ports/esp32s2/common-hal/socketpool/Socket.c
+++ b/ports/esp32s2/common-hal/socketpool/Socket.c
@@ -32,6 +32,11 @@
#include "py/runtime.h"
#include "supervisor/shared/tick.h"
+#include "components/lwip/lwip/src/include/lwip/err.h"
+#include "components/lwip/lwip/src/include/lwip/sockets.h"
+#include "components/lwip/lwip/src/include/lwip/sys.h"
+#include "components/lwip/lwip/src/include/lwip/netdb.h"
+
void common_hal_socketpool_socket_settimeout(socketpool_socket_obj_t* self, mp_uint_t timeout_ms) {
self->timeout_ms = timeout_ms;
}
@@ -59,6 +64,18 @@ bool common_hal_socketpool_socket_connect(socketpool_socket_obj_t* self, const c
} else {
mp_raise_OSError_msg_varg(translate("Unhandled ESP TLS error %d %d %x %d"), esp_tls_code, flags, err, result);
}
+ } else {
+ // Connection successful, set the timeout on the underlying socket. We can't rely on the IDF
+ // to do it because the config structure is only used for TLS connections. Generally, we
+ // shouldn't hit this timeout because we try to only read available data. However, there is
+ // always a chance that we try to read something that is used internally.
+ int fd;
+ esp_tls_get_conn_sockfd(self->tcp, &fd);
+ struct timeval tv;
+ tv.tv_sec = 2 * 60; // Two minutes
+ tv.tv_usec = 0;
+ setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
+ setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv));
}
return self->connected;
@@ -103,6 +120,11 @@ mp_uint_t common_hal_socketpool_socket_recv_into(socketpool_socket_obj_t* self,
}
if (available > 0) {
status = esp_tls_conn_read(self->tcp, (void*) buf + received, available);
+ if (status == 0) {
+ // Reading zero when something is available indicates a closed
+ // connection. (The available bytes could have been TLS internal.)
+ break;
+ }
if (status > 0) {
received += status;
}
@@ -113,10 +135,61 @@ mp_uint_t common_hal_socketpool_socket_recv_into(socketpool_socket_obj_t* self,
// socket closed
common_hal_socketpool_socket_close(self);
}
- if (status < 0) {
+ return received;
+}
+
+mp_uint_t common_hal_socketpool_socket_sendto(socketpool_socket_obj_t* self,
+ const char* host, size_t hostlen, uint8_t port, const uint8_t* buf, mp_uint_t len) {
+
+ // Get the IP address string
+ const struct addrinfo hints = {
+ .ai_family = AF_INET,
+ .ai_socktype = SOCK_STREAM,
+ };
+ struct addrinfo *result;
+ int error = lwip_getaddrinfo(host, NULL, &hints, &result);
+ if (error != 0 || result == NULL) {
+ return 0;
+ }
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wcast-align"
+ struct in_addr *addr = &((struct sockaddr_in *)result->ai_addr)->sin_addr;
+ #pragma GCC diagnostic pop
+ char ip_str[IP4ADDR_STRLEN_MAX];
+ inet_ntoa_r(*addr, ip_str, IP4ADDR_STRLEN_MAX);
+ freeaddrinfo(result);
+
+ // Set parameters
+ struct sockaddr_in dest_addr;
+ dest_addr.sin_addr.s_addr = inet_addr((const char *)ip_str);
+ dest_addr.sin_family = AF_INET;
+ dest_addr.sin_port = htons(port);
+
+ int bytes_sent = lwip_sendto(self->num, buf, len, 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
+ if (bytes_sent < 0) {
mp_raise_BrokenPipeError();
+ return 0;
+ }
+ return bytes_sent;
+}
+
+mp_uint_t common_hal_socketpool_socket_recvfrom_into(socketpool_socket_obj_t* self,
+ uint8_t* buf, mp_uint_t len, uint8_t* ip, uint *port) {
+
+ struct sockaddr_in source_addr;
+ socklen_t socklen = sizeof(source_addr);
+ int bytes_received = lwip_recvfrom(self->num, buf, len - 1, 0, (struct sockaddr *)&source_addr, &socklen);
+
+ memcpy((void *)ip, (void*)&source_addr.sin_addr.s_addr, sizeof source_addr.sin_addr.s_addr);
+ *port = source_addr.sin_port;
+
+ if (bytes_received < 0) {
+ mp_raise_BrokenPipeError();
+ return 0;
+ } else {
+ buf[bytes_received] = 0; // Null-terminate whatever we received
+ return bytes_received;
}
- return received;
}
void common_hal_socketpool_socket_close(socketpool_socket_obj_t* self) {
@@ -125,10 +198,15 @@ void common_hal_socketpool_socket_close(socketpool_socket_obj_t* self) {
esp_tls_conn_destroy(self->tcp);
self->tcp = NULL;
}
+ if (self->num >= 0) {
+ lwip_shutdown(self->num, 0);
+ lwip_close(self->num);
+ self->num = -1;
+ }
}
bool common_hal_socketpool_socket_get_closed(socketpool_socket_obj_t* self) {
- return self->tcp == NULL;
+ return self->tcp == NULL && self->num < 0;
}
diff --git a/ports/esp32s2/common-hal/socketpool/SocketPool.c b/ports/esp32s2/common-hal/socketpool/SocketPool.c
index 1d4d04b03..3bec5f337 100644
--- a/ports/esp32s2/common-hal/socketpool/SocketPool.c
+++ b/ports/esp32s2/common-hal/socketpool/SocketPool.c
@@ -61,15 +61,14 @@ socketpool_socket_obj_t* common_hal_socketpool_socket(socketpool_socketpool_obj_
socket_type = SOCK_RAW;
}
- if (socket_type == SOCK_DGRAM || socket_type == SOCK_RAW ||
- addr_family == AF_INET6 || ipproto == IPPROTO_IPV6) {
- mp_raise_NotImplementedError(translate("Only IPv4 SOCK_STREAM sockets supported"));
+ if (addr_family == AF_INET6 || ipproto == IPPROTO_IPV6) {
+ mp_raise_NotImplementedError(translate("Only IPv4 sockets supported"));
}
int socknum = -1;
esp_tls_t* tcp_handle = NULL;
if (socket_type == SOCK_DGRAM || socket_type == SOCK_RAW) {
- // socknum = lwip_socket(addr_family, socket_type, ipproto);
+ socknum = lwip_socket(addr_family, socket_type, ipproto);
} else {
tcp_handle = esp_tls_init();
diff --git a/ports/esp32s2/common-hal/supervisor/Runtime.h b/ports/esp32s2/common-hal/supervisor/Runtime.h
index d1fe24621..840ce1bbb 100644
--- a/ports/esp32s2/common-hal/supervisor/Runtime.h
+++ b/ports/esp32s2/common-hal/supervisor/Runtime.h
@@ -24,8 +24,8 @@
* THE SOFTWARE.
*/
-#ifndef MICROPY_INCLUDED_LITEX_COMMON_HAL_SUPERVISOR_RUNTIME_H
-#define MICROPY_INCLUDED_LITEX_COMMON_HAL_SUPERVISOR_RUNTIME_H
+#ifndef MICROPY_INCLUDED_ESP32S2_COMMON_HAL_SUPERVISOR_RUNTIME_H
+#define MICROPY_INCLUDED_ESP32S2_COMMON_HAL_SUPERVISOR_RUNTIME_H
#include "py/obj.h"
@@ -34,4 +34,4 @@ typedef struct {
// Stores no state currently.
} super_runtime_obj_t;
-#endif // MICROPY_INCLUDED_LITEX_COMMON_HAL_SUPERVISOR_RUNTIME_H
+#endif // MICROPY_INCLUDED_ESP32S2_COMMON_HAL_SUPERVISOR_RUNTIME_H
diff --git a/ports/esp32s2/common-hal/time/__init__.c b/ports/esp32s2/common-hal/time/__init__.c
index c85077868..398df0c1b 100644
--- a/ports/esp32s2/common-hal/time/__init__.c
+++ b/ports/esp32s2/common-hal/time/__init__.c
@@ -28,7 +28,7 @@
#include "tick.h"
-uint64_t common_hal_time_monotonic(void) {
+uint64_t common_hal_time_monotonic_ms(void) {
return supervisor_ticks_ms64();
}
diff --git a/ports/esp32s2/common-hal/touchio/TouchIn.c b/ports/esp32s2/common-hal/touchio/TouchIn.c
index b44234775..b27cbcf86 100644
--- a/ports/esp32s2/common-hal/touchio/TouchIn.c
+++ b/ports/esp32s2/common-hal/touchio/TouchIn.c
@@ -25,10 +25,19 @@
*/
#include "shared-bindings/touchio/TouchIn.h"
-#include "py/runtime.h"
+#include "py/runtime.h"
#include "driver/touch_pad.h"
+bool touch_inited = false;
+
+void touchin_reset(void) {
+ if (touch_inited) {
+ touch_pad_deinit();
+ touch_inited = false;
+ }
+}
+
static uint16_t get_raw_reading(touchio_touchin_obj_t *self) {
uint32_t touch_value;
touch_pad_read_raw_data((touch_pad_t)self->pin->touch_channel, &touch_value);
@@ -45,11 +54,14 @@ void common_hal_touchio_touchin_construct(touchio_touchin_obj_t* self,
}
claim_pin(pin);
- touch_pad_init();
- touch_pad_config((touch_pad_t)pin->touch_channel);
+ if (!touch_inited) {
+ touch_pad_init();
+ touch_pad_set_fsm_mode(TOUCH_FSM_MODE_TIMER);
+ touch_pad_fsm_start();
+ touch_inited = true;
+ }
- touch_pad_set_fsm_mode(TOUCH_FSM_MODE_TIMER);
- touch_pad_fsm_start();
+ touch_pad_config((touch_pad_t)pin->touch_channel);
// wait for "raw data" to reset
mp_hal_delay_ms(10);
@@ -73,14 +85,12 @@ void common_hal_touchio_touchin_deinit(touchio_touchin_obj_t* self) {
if (common_hal_touchio_touchin_deinited(self)) {
return;
}
- touch_pad_deinit();
reset_pin_number(self->pin->touch_channel);
self->pin = NULL;
}
bool common_hal_touchio_touchin_get_value(touchio_touchin_obj_t *self) {
- uint16_t reading = get_raw_reading(self);
- return reading > self->threshold;
+ return get_raw_reading(self) > self->threshold;
}
uint16_t common_hal_touchio_touchin_get_raw_value(touchio_touchin_obj_t *self) {
diff --git a/ports/esp32s2/common-hal/watchdog/WatchDogMode.c b/ports/esp32s2/common-hal/watchdog/WatchDogMode.c
new file mode 100644
index 000000000..fc4e0e008
--- /dev/null
+++ b/ports/esp32s2/common-hal/watchdog/WatchDogMode.c
@@ -0,0 +1 @@
+// No watchdog module functions.
diff --git a/ports/esp32s2/common-hal/watchdog/WatchDogTimer.c b/ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
new file mode 100644
index 000000000..b51a391b7
--- /dev/null
+++ b/ports/esp32s2/common-hal/watchdog/WatchDogTimer.c
@@ -0,0 +1,93 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 microDev
+ *
+ * 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 "py/runtime.h"
+#include "common-hal/watchdog/WatchDogTimer.h"
+
+#include "shared-bindings/watchdog/__init__.h"
+#include "shared-bindings/microcontroller/__init__.h"
+
+#include "esp_task_wdt.h"
+
+void esp_task_wdt_isr_user_handler(void) {
+ mp_obj_exception_clear_traceback(MP_OBJ_FROM_PTR(&mp_watchdog_timeout_exception));
+ MP_STATE_VM(mp_pending_exception) = &mp_watchdog_timeout_exception;
+#if MICROPY_ENABLE_SCHEDULER
+ if (MP_STATE_VM(sched_state) == MP_SCHED_IDLE) {
+ MP_STATE_VM(sched_state) = MP_SCHED_PENDING;
+ }
+#endif
+}
+
+void common_hal_watchdog_feed(watchdog_watchdogtimer_obj_t *self) {
+ if (esp_task_wdt_reset() != ESP_OK) {
+ mp_raise_RuntimeError(translate("watchdog not initialized"));
+ }
+}
+
+void common_hal_watchdog_deinit(watchdog_watchdogtimer_obj_t *self) {
+ if (esp_task_wdt_deinit() == ESP_OK) {
+ self->mode = WATCHDOGMODE_NONE;
+ }
+}
+
+void watchdog_reset(void) {
+ common_hal_watchdog_deinit(&common_hal_mcu_watchdogtimer_obj);
+}
+
+static void wdt_config(watchdog_watchdogtimer_obj_t *self) {
+ // enable panic hanler in WATCHDOGMODE_RESET mode
+ // initialize Task Watchdog Timer (TWDT)
+ if (esp_task_wdt_init((uint32_t)self->timeout, (self->mode == WATCHDOGMODE_RESET)) != ESP_OK) {
+ mp_raise_RuntimeError(translate("Initialization failed due to lack of memory"));
+ }
+ esp_task_wdt_add(NULL);
+}
+
+mp_float_t common_hal_watchdog_get_timeout(watchdog_watchdogtimer_obj_t *self) {
+ return self->timeout;
+}
+
+void common_hal_watchdog_set_timeout(watchdog_watchdogtimer_obj_t *self, mp_float_t new_timeout) {
+ if ((uint64_t)new_timeout > UINT32_MAX) {
+ mp_raise_ValueError(translate("timeout duration exceeded the maximum supported value"));
+ }
+ if ((uint32_t)self->timeout != (uint32_t)new_timeout) {
+ self->timeout = new_timeout;
+ wdt_config(self);
+ }
+}
+
+watchdog_watchdogmode_t common_hal_watchdog_get_mode(watchdog_watchdogtimer_obj_t *self) {
+ return self->mode;
+}
+
+void common_hal_watchdog_set_mode(watchdog_watchdogtimer_obj_t *self, watchdog_watchdogmode_t new_mode) {
+ if (self->mode != new_mode) {
+ self->mode = new_mode;
+ wdt_config(self);
+ }
+}
diff --git a/ports/esp32s2/common-hal/watchdog/WatchDogTimer.h b/ports/esp32s2/common-hal/watchdog/WatchDogTimer.h
new file mode 100644
index 000000000..04d9aeee6
--- /dev/null
+++ b/ports/esp32s2/common-hal/watchdog/WatchDogTimer.h
@@ -0,0 +1,43 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 microDev
+ *
+ * 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.
+ */
+
+#ifndef MICROPY_INCLUDED_ESP32S2_COMMON_HAL_WATCHDOG_WATCHDOGTIMER_H
+#define MICROPY_INCLUDED_ESP32S2_COMMON_HAL_WATCHDOG_WATCHDOGTIMER_H
+
+#include "py/obj.h"
+#include "shared-bindings/watchdog/WatchDogMode.h"
+#include "shared-bindings/watchdog/WatchDogTimer.h"
+
+struct _watchdog_watchdogtimer_obj_t {
+ mp_obj_base_t base;
+ mp_float_t timeout;
+ watchdog_watchdogmode_t mode;
+};
+
+// This needs to be called in order to disable the watchdog
+void watchdog_reset(void);
+
+#endif // MICROPY_INCLUDED_ESP32S2_COMMON_HAL_WATCHDOG_WATCHDOGTIMER_H
diff --git a/ports/esp32s2/common-hal/watchdog/__init__.c b/ports/esp32s2/common-hal/watchdog/__init__.c
new file mode 100644
index 000000000..fc4e0e008
--- /dev/null
+++ b/ports/esp32s2/common-hal/watchdog/__init__.c
@@ -0,0 +1 @@
+// No watchdog module functions.
diff --git a/ports/esp32s2/common-hal/wifi/Radio.c b/ports/esp32s2/common-hal/wifi/Radio.c
index 275bae31a..49cb8ec30 100644
--- a/ports/esp32s2/common-hal/wifi/Radio.c
+++ b/ports/esp32s2/common-hal/wifi/Radio.c
@@ -31,6 +31,7 @@
#include "common-hal/wifi/__init__.h"
#include "lib/utils/interrupt_char.h"
+#include "py/gc.h"
#include "py/runtime.h"
#include "shared-bindings/ipaddress/IPv4Address.h"
#include "shared-bindings/wifi/ScannedNetworks.h"
@@ -72,6 +73,8 @@ void common_hal_wifi_radio_set_enabled(wifi_radio_obj_t *self, bool enabled) {
return;
}
if (!self->started && enabled) {
+ // esp_wifi_start() would default to soft-AP, thus setting it to station
+ ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
ESP_ERROR_CHECK(esp_wifi_start());
self->started = true;
return;
@@ -136,9 +139,16 @@ wifi_radio_error_t common_hal_wifi_radio_connect(wifi_radio_obj_t *self, uint8_t
if (bssid_len > 0){
memcpy(&config->sta.bssid, bssid, bssid_len);
config->sta.bssid[bssid_len] = 0;
- config->sta.bssid_set = 1;
+ config->sta.bssid_set = true;
} else {
- config->sta.bssid_set = 0;
+ config->sta.bssid_set = false;
+ }
+ // If channel is 0 (default/unset) and BSSID is not given, do a full scan instead of fast scan
+ // This will ensure that the best AP in range is chosen automatically
+ if ((config->sta.bssid_set == 0) && (config->sta.channel == 0)) {
+ config->sta.scan_method = WIFI_ALL_CHANNEL_SCAN;
+ } else {
+ config->sta.scan_method = WIFI_FAST_SCAN;
}
esp_wifi_set_config(ESP_IF_WIFI_STA, config);
self->starting_retries = 5;
@@ -253,3 +263,8 @@ mp_int_t common_hal_wifi_radio_ping(wifi_radio_obj_t *self, mp_obj_t ip_address,
return elapsed_time;
}
+
+void common_hal_wifi_radio_gc_collect(wifi_radio_obj_t *self) {
+ // Only bother to scan the actual object references.
+ gc_collect_ptr(self->current_scan);
+}
diff --git a/ports/esp32s2/common-hal/wifi/Radio.h b/ports/esp32s2/common-hal/wifi/Radio.h
index c7f484eaf..1dac47016 100644
--- a/ports/esp32s2/common-hal/wifi/Radio.h
+++ b/ports/esp32s2/common-hal/wifi/Radio.h
@@ -59,4 +59,6 @@ typedef struct {
uint8_t last_disconnect_reason;
} wifi_radio_obj_t;
+extern void common_hal_wifi_radio_gc_collect(wifi_radio_obj_t *self);
+
#endif // MICROPY_INCLUDED_ESP32S2_COMMON_HAL_WIFI_RADIO_H
diff --git a/ports/esp32s2/common-hal/wifi/__init__.c b/ports/esp32s2/common-hal/wifi/__init__.c
index 833ef0623..8de377537 100644
--- a/ports/esp32s2/common-hal/wifi/__init__.c
+++ b/ports/esp32s2/common-hal/wifi/__init__.c
@@ -47,8 +47,15 @@ static void event_handler(void* arg, esp_event_base_t event_base,
if (event_base == WIFI_EVENT) {
switch (event_id) {
case WIFI_EVENT_SCAN_DONE:
+ ESP_EARLY_LOGW(TAG, "scan");
xEventGroupSetBits(radio->event_group_handle, WIFI_SCAN_DONE_BIT);
break;
+ case WIFI_EVENT_STA_START:
+ ESP_EARLY_LOGW(TAG, "start");
+ break;
+ case WIFI_EVENT_STA_STOP:
+ ESP_EARLY_LOGW(TAG, "stop");
+ break;
case WIFI_EVENT_STA_CONNECTED:
ESP_EARLY_LOGW(TAG, "connected");
break;
@@ -59,6 +66,7 @@ static void event_handler(void* arg, esp_event_base_t event_base,
ESP_EARLY_LOGW(TAG, "reason %d 0x%02x", reason, reason);
if (radio->retries_left > 0 &&
(reason == WIFI_REASON_AUTH_EXPIRE ||
+ reason == WIFI_REASON_NOT_AUTHED ||
reason == WIFI_REASON_ASSOC_EXPIRE ||
reason == WIFI_REASON_CONNECTION_FAIL ||
reason == WIFI_REASON_4WAY_HANDSHAKE_TIMEOUT)) {
@@ -73,8 +81,6 @@ static void event_handler(void* arg, esp_event_base_t event_base,
}
// Cases to handle later.
- // case WIFI_EVENT_STA_START:
- // case WIFI_EVENT_STA_STOP:
// case WIFI_EVENT_STA_AUTHMODE_CHANGE:
default:
break;
@@ -88,14 +94,17 @@ static void event_handler(void* arg, esp_event_base_t event_base,
}
}
-static bool wifi_inited;
+static bool wifi_inited, wifi_ever_inited;
void common_hal_wifi_init(void) {
wifi_inited = true;
common_hal_wifi_radio_obj.base.type = &wifi_radio_type;
- ESP_ERROR_CHECK(esp_netif_init());
- ESP_ERROR_CHECK(esp_event_loop_create_default());
+ if (!wifi_ever_inited) {
+ ESP_ERROR_CHECK(esp_netif_init());
+ ESP_ERROR_CHECK(esp_event_loop_create_default());
+ }
+ wifi_ever_inited = true;
wifi_radio_obj_t* self = &common_hal_wifi_radio_obj;
self->netif = esp_netif_create_default_wifi_sta();
@@ -144,7 +153,6 @@ void wifi_reset(void) {
ESP_ERROR_CHECK(esp_wifi_deinit());
esp_netif_destroy(radio->netif);
radio->netif = NULL;
- ESP_ERROR_CHECK(esp_netif_deinit());
}
void ipaddress_ipaddress_to_esp_idf(mp_obj_t ip_address, ip_addr_t* esp_ip_address) {
@@ -157,3 +165,7 @@ void ipaddress_ipaddress_to_esp_idf(mp_obj_t ip_address, ip_addr_t* esp_ip_addre
IP_ADDR4(esp_ip_address, bytes[0], bytes[1], bytes[2], bytes[3]);
}
+
+void common_hal_wifi_gc_collect(void) {
+ common_hal_wifi_radio_gc_collect(&common_hal_wifi_radio_obj);
+}
diff --git a/ports/esp32s2/esp-idf b/ports/esp32s2/esp-idf
-Subproject 8bc19ba893e5544d571a753d82b44a84799b94b
+Subproject d06744f5efc382c61cbad8758107cec308feef0
diff --git a/ports/esp32s2/esp-idf-config/sdkconfig.defaults b/ports/esp32s2/esp-idf-config/sdkconfig.defaults
index 025b05caa..cc59e2a7e 100644
--- a/ports/esp32s2/esp-idf-config/sdkconfig.defaults
+++ b/ports/esp32s2/esp-idf-config/sdkconfig.defaults
@@ -575,10 +575,11 @@ CONFIG_MBEDTLS_DYNAMIC_FREE_CONFIG_DATA=y
# Certificate Bundle
#
CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y
-CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=y
+# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL is not set
# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN is not set
-# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE is not set
-# CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE is not set
+CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE=y
+CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE=y
+CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE_PATH="certificates/nina-fw/data/roots.pem"
# end of Certificate Bundle
# CONFIG_MBEDTLS_ECP_RESTARTABLE is not set
@@ -717,10 +718,8 @@ CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
# CONFIG_SPI_FLASH_USE_LEGACY_IMPL is not set
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
-CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
-CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS=20
-CONFIG_SPI_FLASH_ERASE_YIELD_TICKS=1
-CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192
+# CONFIG_SPI_FLASH_YIELD_DURING_ERASE is not set
+CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=4096
# CONFIG_SPI_FLASH_SIZE_OVERRIDE is not set
#
diff --git a/ports/esp32s2/mpconfigport.h b/ports/esp32s2/mpconfigport.h
index cec8dd35d..db7393d8e 100644
--- a/ports/esp32s2/mpconfigport.h
+++ b/ports/esp32s2/mpconfigport.h
@@ -28,7 +28,6 @@
#ifndef ESP32S2_MPCONFIGPORT_H__
#define ESP32S2_MPCONFIGPORT_H__
-#define CIRCUITPY_INTERNAL_NVM_SIZE (0)
#define MICROPY_NLR_THUMB (0)
#define MICROPY_PY_UJSON (1)
@@ -36,11 +35,15 @@
#include "py/circuitpy_mpconfig.h"
-
#define MICROPY_PORT_ROOT_POINTERS \
CIRCUITPY_COMMON_ROOT_POINTERS
#define MICROPY_NLR_SETJMP (1)
#define CIRCUITPY_DEFAULT_STACK_SIZE 0x6000
+#define CIRCUITPY_INTERNAL_NVM_START_ADDR (0x9000)
+
+#ifndef CIRCUITPY_INTERNAL_NVM_SIZE
+#define CIRCUITPY_INTERNAL_NVM_SIZE (20 * 1024)
+#endif
#endif // __INCLUDED_ESP32S2_MPCONFIGPORT_H
diff --git a/ports/esp32s2/mpconfigport.mk b/ports/esp32s2/mpconfigport.mk
index 4579b95ab..b3b2a6d70 100644
--- a/ports/esp32s2/mpconfigport.mk
+++ b/ports/esp32s2/mpconfigport.mk
@@ -14,19 +14,25 @@ LONGINT_IMPL = MPZ
# These modules are implemented in ports/<port>/common-hal:
CIRCUITPY_FULL_BUILD = 1
+CIRCUITPY_ALARM = 1
CIRCUITPY_AUDIOBUSIO = 0
CIRCUITPY_AUDIOIO = 0
CIRCUITPY_CANIO = 1
CIRCUITPY_COUNTIO = 1
-CIRCUITPY_FREQUENCYIO = 0
+CIRCUITPY_FREQUENCYIO = 1
CIRCUITPY_I2CPERIPHERAL = 0
CIRCUITPY_ROTARYIO = 1
-CIRCUITPY_NVM = 0
+CIRCUITPY_NVM = 1
# We don't have enough endpoints to include MIDI.
CIRCUITPY_USB_MIDI = 0
CIRCUITPY_WIFI = 1
+CIRCUITPY_WATCHDOG ?= 1
CIRCUITPY_ESPIDF = 1
+ifndef CIRCUITPY_PS2IO
+CIRCUITPY_PS2IO = 1
+endif
+
ifndef CIRCUITPY_TOUCHIO_USE_NATIVE
CIRCUITPY_TOUCHIO_USE_NATIVE = 1
endif
diff --git a/ports/esp32s2/peripherals/timer.c b/ports/esp32s2/peripherals/timer.c
new file mode 100644
index 000000000..0ae140387
--- /dev/null
+++ b/ports/esp32s2/peripherals/timer.c
@@ -0,0 +1,76 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 microDev
+ *
+ * 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 "peripherals/timer.h"
+
+#define TIMER_FREE 1
+#define TIMER_BUSY 0
+
+static uint8_t timer_state[2][2];
+
+void peripherals_timer_reset(void) {
+ timer_index_t timer;
+ for (uint8_t i = 0; i < 2; i++) {
+ for (uint8_t j = 0; j < 2; j++) {
+ if (timer_state[i][j] == TIMER_BUSY) {
+ timer.idx = (timer_idx_t)j;
+ timer.group = (timer_group_t)i;
+ timer_state[i][j] = TIMER_FREE;
+ peripherals_timer_deinit(&timer);
+ }
+ }
+ }
+}
+
+void peripherals_timer_init(const timer_config_t * config, timer_index_t * timer) {
+ bool break_loop = false;
+
+ // get free timer
+ for (uint8_t i = 0; i < 2; i++) {
+ for (uint8_t j = 0; j < 2; j++) {
+ if (timer_state[i][j] == TIMER_FREE) {
+ timer->idx = (timer_idx_t)j;
+ timer->group = (timer_group_t)i;
+ timer_state[i][j] = TIMER_BUSY;
+ break_loop = true;
+ break;
+ } else if (i == 1 && j == 1) {
+ timer->idx = TIMER_MAX;
+ timer->group = TIMER_GROUP_MAX;
+ return;
+ }
+ }
+ if (break_loop) {break;}
+ }
+
+ // initialize timer module
+ timer_init(timer->group, timer->idx, config);
+ timer_set_counter_value(timer->group, timer->idx, 0);
+}
+
+void peripherals_timer_deinit(timer_index_t * timer) {
+ timer_deinit(timer->group, timer->idx);
+}
diff --git a/ports/esp32s2/peripherals/timer.h b/ports/esp32s2/peripherals/timer.h
new file mode 100644
index 000000000..8c9ebd91c
--- /dev/null
+++ b/ports/esp32s2/peripherals/timer.h
@@ -0,0 +1,41 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 microDev
+ *
+ * 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.
+ */
+
+#ifndef MICROPY_INCLUDED_ESP32S2_PERIPHERALS_TIMER_HANDLER_H
+#define MICROPY_INCLUDED_ESP32S2_PERIPHERALS_TIMER_HANDLER_H
+
+#include "driver/timer.h"
+
+typedef struct {
+ timer_idx_t idx;
+ timer_group_t group;
+} timer_index_t;
+
+extern void peripherals_timer_init(const timer_config_t * config, timer_index_t * timer);
+extern void peripherals_timer_deinit(timer_index_t * timer);
+extern void peripherals_timer_reset(void);
+
+#endif // MICROPY_INCLUDED_ESP32S2_PERIPHERALS_TIMER_HANDLER_H
diff --git a/ports/esp32s2/supervisor/internal_flash_root_pointers.h b/ports/esp32s2/supervisor/internal_flash_root_pointers.h
index ae3e45e14..a9a8c2a22 100644
--- a/ports/esp32s2/supervisor/internal_flash_root_pointers.h
+++ b/ports/esp32s2/supervisor/internal_flash_root_pointers.h
@@ -23,9 +23,9 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
-#ifndef MICROPY_INCLUDED_LITEX_INTERNAL_FLASH_ROOT_POINTERS_H
-#define MICROPY_INCLUDED_LITEX_INTERNAL_FLASH_ROOT_POINTERS_H
+#ifndef MICROPY_INCLUDED_ESP32S2_INTERNAL_FLASH_ROOT_POINTERS_H
+#define MICROPY_INCLUDED_ESP32S2_INTERNAL_FLASH_ROOT_POINTERS_H
#define FLASH_ROOT_POINTERS
-#endif // MICROPY_INCLUDED_LITEX_INTERNAL_FLASH_ROOT_POINTERS_H
+#endif // MICROPY_INCLUDED_ESP32S2_INTERNAL_FLASH_ROOT_POINTERS_H
diff --git a/ports/esp32s2/supervisor/port.c b/ports/esp32s2/supervisor/port.c
index ef032c4a7..7037b4f05 100644
--- a/ports/esp32s2/supervisor/port.c
+++ b/ports/esp32s2/supervisor/port.c
@@ -27,8 +27,8 @@
#include <stdint.h>
#include <sys/time.h>
+#include "supervisor/board.h"
#include "supervisor/port.h"
-#include "boards/board.h"
#include "modules/module.h"
#include "py/runtime.h"
#include "supervisor/esp_port.h"
@@ -41,8 +41,11 @@
#include "common-hal/busio/I2C.h"
#include "common-hal/busio/SPI.h"
#include "common-hal/busio/UART.h"
+#include "common-hal/ps2io/Ps2.h"
#include "common-hal/pulseio/PulseIn.h"
#include "common-hal/pwmio/PWMOut.h"
+#include "common-hal/touchio/TouchIn.h"
+#include "common-hal/watchdog/WatchDogTimer.h"
#include "common-hal/wifi/__init__.h"
#include "supervisor/memory.h"
#include "supervisor/shared/tick.h"
@@ -50,8 +53,12 @@
#include "peripherals/rmt.h"
#include "peripherals/pcnt.h"
+#include "peripherals/timer.h"
+#include "components/esp_rom/include/esp_rom_uart.h"
#include "components/heap/include/esp_heap_caps.h"
+#include "components/xtensa/include/esp_debug_helpers.h"
#include "components/soc/soc/esp32s2/include/soc/cache_memory.h"
+#include "components/soc/soc/esp32s2/include/soc/rtc_cntl_reg.h"
#define HEAP_SIZE (48 * 1024)
@@ -74,6 +81,11 @@ safe_mode_t port_init(void) {
args.name = "CircuitPython Tick";
esp_timer_create(&args, &_tick_timer);
+ #ifdef DEBUG
+ // Send the ROM output out of the UART. This includes early logs.
+ esp_rom_install_channel_putc(1, esp_rom_uart_putc);
+ #endif
+
heap = NULL;
never_reset_module_internal_pins();
@@ -90,6 +102,14 @@ safe_mode_t port_init(void) {
return NO_HEAP;
}
+ esp_reset_reason_t reason = esp_reset_reason();
+ if (reason == ESP_RST_BROWNOUT) {
+ return BROWNOUT;
+ }
+ if (reason == ESP_RST_PANIC) {
+ return HARD_CRASH;
+ }
+
return NO_SAFE_MODE;
}
@@ -103,6 +123,10 @@ void reset_port(void) {
analogout_reset();
#endif
+#if CIRCUITPY_PS2IO
+ ps2_reset();
+#endif
+
#if CIRCUITPY_PULSEIO
esp32s2_peripherals_rmt_reset();
pulsein_reset();
@@ -122,10 +146,31 @@ void reset_port(void) {
peripherals_pcnt_reset();
#endif
+#if CIRCUITPY_FREQUENCYIO
+ peripherals_timer_reset();
+#endif
+
+#if CIRCUITPY_PULSEIO
+ esp32s2_peripherals_rmt_reset();
+ pulsein_reset();
+#endif
+
+#if CIRCUITPY_PWMIO
+ pwmout_reset();
+#endif
+
#if CIRCUITPY_RTC
rtc_reset();
#endif
+#if CIRCUITPY_TOUCHIO_USE_NATIVE
+ touchin_reset();
+#endif
+
+#if CIRCUITPY_WATCHDOG
+ watchdog_reset();
+#endif
+
#if CIRCUITPY_WIFI
wifi_reset();
#endif
@@ -136,6 +181,7 @@ void reset_to_bootloader(void) {
}
void reset_cpu(void) {
+ esp_backtrace_print(100);
esp_restart();
}
@@ -169,31 +215,28 @@ uint32_t *port_stack_get_top(void) {
return port_stack_get_limit() + ESP_TASK_MAIN_STACK / (sizeof(uint32_t) / sizeof(StackType_t));
}
-supervisor_allocation _fixed_stack;
-
-supervisor_allocation* port_fixed_stack(void) {
- _fixed_stack.ptr = port_stack_get_limit();
- _fixed_stack.length = (port_stack_get_top() - port_stack_get_limit()) * sizeof(uint32_t);
- return &_fixed_stack;
+bool port_has_fixed_stack(void) {
+ return true;
}
// Place the word to save just after our BSS section that gets blanked.
void port_set_saved_word(uint32_t value) {
+ REG_WRITE(RTC_CNTL_STORE0_REG, value);
}
uint32_t port_get_saved_word(void) {
- return 0;
+ return REG_READ(RTC_CNTL_STORE0_REG);
}
uint64_t port_get_raw_ticks(uint8_t* subticks) {
- struct timeval tv_now;
- gettimeofday(&tv_now, NULL);
- // convert usec back to ticks
- uint64_t all_subticks = (uint64_t)(tv_now.tv_usec * 2) / 71;
+ // Convert microseconds to subticks of 1/32768 seconds
+ // 32768/1000000 = 64/15625 in lowest terms
+ // this arithmetic overflows after 570 years
+ int64_t all_subticks = esp_timer_get_time() * 512 / 15625;
if (subticks != NULL) {
*subticks = all_subticks % 32;
}
- return (uint64_t)tv_now.tv_sec * 1024L + all_subticks / 32;
+ return all_subticks / 32;
}
// Enable 1/1024 second tick.
@@ -204,27 +247,31 @@ void port_enable_tick(void) {
// Disable 1/1024 second tick.
void port_disable_tick(void) {
esp_timer_stop(_tick_timer);
+
+ // CircuitPython's VM is run in a separate FreeRTOS task from TinyUSB.
+ // Tick disable can happen via auto-reload so poke the main task here.
+ if (sleeping_circuitpython_task != NULL) {
+ xTaskNotifyGive(sleeping_circuitpython_task);
+ }
}
TickType_t sleep_time_duration;
void port_interrupt_after_ticks(uint32_t ticks) {
sleep_time_duration = (ticks * 100)/1024;
- sleeping_circuitpython_task = xTaskGetCurrentTaskHandle();
}
-void port_sleep_until_interrupt(void) {
-
- uint32_t NotifyValue = 0;
+void port_idle_until_interrupt(void) {
+ uint32_t notify_value = 0;
if (sleep_time_duration == 0) {
return;
}
- xTaskNotifyWait(0x01,0x01,&NotifyValue,
- sleep_time_duration );
- if (NotifyValue == 1) {
- sleeping_circuitpython_task = NULL;
- mp_handle_pending();
+ sleeping_circuitpython_task = xTaskGetCurrentTaskHandle();
+ xTaskNotifyWait(0x01, 0x01, &notify_value, sleep_time_duration );
+ sleeping_circuitpython_task = NULL;
+ if (notify_value == 1) {
+ mp_handle_pending();
}
}
diff --git a/ports/litex/boards/fomu/board.c b/ports/litex/boards/fomu/board.c
index 97e1ecadd..a90f22f81 100644
--- a/ports/litex/boards/fomu/board.c
+++ b/ports/litex/boards/fomu/board.c
@@ -24,7 +24,8 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
+
#include "mpconfigboard.h"
#include "csr.h"
diff --git a/ports/litex/common-hal/microcontroller/Processor.c b/ports/litex/common-hal/microcontroller/Processor.c
index 9d2b05aad..4d4f88288 100644
--- a/ports/litex/common-hal/microcontroller/Processor.c
+++ b/ports/litex/common-hal/microcontroller/Processor.c
@@ -26,8 +26,10 @@
*/
#include <math.h>
-#include "common-hal/microcontroller/Processor.h"
#include "py/runtime.h"
+
+#include "common-hal/microcontroller/Processor.h"
+#include "shared-bindings/microcontroller/ResetReason.h"
#include "supervisor/shared/translate.h"
#include "csr.h"
@@ -62,3 +64,7 @@ void common_hal_mcu_processor_get_uid(uint8_t raw_id[]) {
raw_id[13] = csr_readl(CSR_VERSION_SEED_ADDR + 8);
raw_id[14] = csr_readl(CSR_VERSION_SEED_ADDR + 12);
}
+
+mcu_reset_reason_t common_hal_mcu_processor_get_reset_reason(void) {
+ return RESET_REASON_UNKNOWN;
+}
diff --git a/ports/litex/common-hal/time/__init__.c b/ports/litex/common-hal/time/__init__.c
index c85077868..398df0c1b 100644
--- a/ports/litex/common-hal/time/__init__.c
+++ b/ports/litex/common-hal/time/__init__.c
@@ -28,7 +28,7 @@
#include "tick.h"
-uint64_t common_hal_time_monotonic(void) {
+uint64_t common_hal_time_monotonic_ms(void) {
return supervisor_ticks_ms64();
}
diff --git a/ports/litex/mpconfigport.mk b/ports/litex/mpconfigport.mk
index 485a75fde..003fb5c2c 100644
--- a/ports/litex/mpconfigport.mk
+++ b/ports/litex/mpconfigport.mk
@@ -18,6 +18,7 @@ CIRCUITPY_AUDIOIO = 0
CIRCUITPY_BITBANGIO = 0
CIRCUITPY_BLEIO_HCI = 0
CIRCUITPY_BOARD = 0
+CIRCUITPY_BUSDEVICE = 0
CIRCUITPY_BUSIO = 0
CIRCUITPY_COUNTIO = 0
CIRCUITPY_DISPLAYIO = 0
diff --git a/ports/litex/supervisor/port.c b/ports/litex/supervisor/port.c
index 02617b9af..4dea02065 100644
--- a/ports/litex/supervisor/port.c
+++ b/ports/litex/supervisor/port.c
@@ -26,9 +26,9 @@
*/
#include <stdint.h>
+#include "supervisor/board.h"
#include "supervisor/port.h"
#include "supervisor/shared/tick.h"
-#include "boards/board.h"
#include "irq.h"
#include "csr.h"
@@ -98,8 +98,8 @@ void reset_cpu(void) {
for(;;) {}
}
-supervisor_allocation* port_fixed_stack(void) {
- return NULL;
+bool port_has_fixed_stack(void) {
+ return false;
}
uint32_t *port_heap_get_bottom(void) {
@@ -147,5 +147,5 @@ void port_interrupt_after_ticks(uint32_t ticks) {
}
// TODO: Add sleep support if the SoC supports sleep.
-void port_sleep_until_interrupt(void) {
+void port_idle_until_interrupt(void) {
}
diff --git a/ports/mimxrt10xx/board.h b/ports/mimxrt10xx/board.h
new file mode 100644
index 000000000..1c9596e7d
--- /dev/null
+++ b/ports/mimxrt10xx/board.h
@@ -0,0 +1 @@
+// Empty but needed for the SDK
diff --git a/ports/mimxrt10xx/boards/feather_m7_1011/board.c b/ports/mimxrt10xx/boards/feather_m7_1011/board.c
index ed543e1b0..1db1dd686 100644
--- a/ports/mimxrt10xx/boards/feather_m7_1011/board.c
+++ b/ports/mimxrt10xx/boards/feather_m7_1011/board.c
@@ -25,7 +25,8 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
+#include "boards/flash_config.h"
#include "mpconfigboard.h"
#include "shared-bindings/microcontroller/Pin.h"
diff --git a/ports/mimxrt10xx/boards/feather_m7_1011/flash_config.c b/ports/mimxrt10xx/boards/feather_m7_1011/flash_config.c
index 282464c75..9ba3e168f 100644
--- a/ports/mimxrt10xx/boards/feather_m7_1011/flash_config.c
+++ b/ports/mimxrt10xx/boards/feather_m7_1011/flash_config.c
@@ -5,9 +5,9 @@
* SPDX-License-Identifier: BSD-3-Clause
*/
-#include "fsl_flexspi_nor_boot.h"
-#include "boards/board.h"
+#include "boards/flash_config.h"
+#include "fsl_flexspi_nor_boot.h"
__attribute__((section(".boot_hdr.ivt")))
/*************************************
diff --git a/ports/mimxrt10xx/boards/feather_m7_1011/pins.c b/ports/mimxrt10xx/boards/feather_m7_1011/pins.c
index 09e321761..04fbeea59 100644
--- a/ports/mimxrt10xx/boards/feather_m7_1011/pins.c
+++ b/ports/mimxrt10xx/boards/feather_m7_1011/pins.c
@@ -1,6 +1,6 @@
#include "shared-bindings/board/__init__.h"
-#include "boards/board.h"
+#include "supervisor/board.h"
STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
// Analog
diff --git a/ports/mimxrt10xx/boards/feather_mimxrt1011/board.c b/ports/mimxrt10xx/boards/feather_mimxrt1011/board.c
index ed543e1b0..1db1dd686 100644
--- a/ports/mimxrt10xx/boards/feather_mimxrt1011/board.c
+++ b/ports/mimxrt10xx/boards/feather_mimxrt1011/board.c
@@ -25,7 +25,8 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
+#include "boards/flash_config.h"
#include "mpconfigboard.h"
#include "shared-bindings/microcontroller/Pin.h"
diff --git a/ports/mimxrt10xx/boards/feather_mimxrt1011/flash_config.c b/ports/mimxrt10xx/boards/feather_mimxrt1011/flash_config.c
index 51cc0f164..eafc9ac3a 100644
--- a/ports/mimxrt10xx/boards/feather_mimxrt1011/flash_config.c
+++ b/ports/mimxrt10xx/boards/feather_mimxrt1011/flash_config.c
@@ -5,9 +5,9 @@
* SPDX-License-Identifier: BSD-3-Clause
*/
-#include "fsl_flexspi_nor_boot.h"
-#include "boards/board.h"
+#include "boards/flash_config.h"
+#include "fsl_flexspi_nor_boot.h"
__attribute__((section(".boot_hdr.ivt")))
/*************************************
diff --git a/ports/mimxrt10xx/boards/feather_mimxrt1011/pins.c b/ports/mimxrt10xx/boards/feather_mimxrt1011/pins.c
index 2c6c1ce93..4e5de8de2 100644
--- a/ports/mimxrt10xx/boards/feather_mimxrt1011/pins.c
+++ b/ports/mimxrt10xx/boards/feather_mimxrt1011/pins.c
@@ -1,6 +1,6 @@
#include "shared-bindings/board/__init__.h"
-#include "boards/board.h"
+#include "supervisor/board.h"
STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
// Analog
diff --git a/ports/mimxrt10xx/boards/feather_mimxrt1062/board.c b/ports/mimxrt10xx/boards/feather_mimxrt1062/board.c
index 9878a62a2..26f55f96e 100644
--- a/ports/mimxrt10xx/boards/feather_mimxrt1062/board.c
+++ b/ports/mimxrt10xx/boards/feather_mimxrt1062/board.c
@@ -25,7 +25,8 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
+#include "boards/flash_config.h"
#include "mpconfigboard.h"
#include "shared-bindings/microcontroller/Pin.h"
diff --git a/ports/mimxrt10xx/boards/feather_mimxrt1062/flash_config.c b/ports/mimxrt10xx/boards/feather_mimxrt1062/flash_config.c
index 51cc0f164..fef1c11e3 100644
--- a/ports/mimxrt10xx/boards/feather_mimxrt1062/flash_config.c
+++ b/ports/mimxrt10xx/boards/feather_mimxrt1062/flash_config.c
@@ -5,8 +5,9 @@
* SPDX-License-Identifier: BSD-3-Clause
*/
+#include "boards/flash_config.h"
+
#include "fsl_flexspi_nor_boot.h"
-#include "boards/board.h"
__attribute__((section(".boot_hdr.ivt")))
diff --git a/ports/mimxrt10xx/boards/feather_mimxrt1062/pins.c b/ports/mimxrt10xx/boards/feather_mimxrt1062/pins.c
index eb287b87a..d372b951f 100644
--- a/ports/mimxrt10xx/boards/feather_mimxrt1062/pins.c
+++ b/ports/mimxrt10xx/boards/feather_mimxrt1062/pins.c
@@ -1,6 +1,6 @@
#include "shared-bindings/board/__init__.h"
-#include "boards/board.h"
+#include "supervisor/board.h"
STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
// Analog
diff --git a/ports/mimxrt10xx/boards/board.h b/ports/mimxrt10xx/boards/flash_config.h
index 678c223ae..25f1550ae 100644
--- a/ports/mimxrt10xx/boards/board.h
+++ b/ports/mimxrt10xx/boards/flash_config.h
@@ -26,26 +26,16 @@
// This file defines board specific functions.
-#ifndef MICROPY_INCLUDED_MIMXRT10XX_BOARDS_BOARD_H
-#define MICROPY_INCLUDED_MIMXRT10XX_BOARDS_BOARD_H
+#ifndef MICROPY_INCLUDED_MIMXRT10XX_BOARDS_FLASH_CONFIG_H
+#define MICROPY_INCLUDED_MIMXRT10XX_BOARDS_FLASH_CONFIG_H
#include <stdbool.h>
-#include "py/mpconfig.h"
+#include "mpconfigboard.h" // For flash size settings
+
#include "fsl_common.h"
#include "fsl_flexspi_nor_config.h"
-// Initializes board related state once on start up.
-void board_init(void);
-
-// Returns true if the user initiates safe mode in a board specific way.
-// Also add BOARD_USER_SAFE_MODE in mpconfigboard.h to explain the board specific
-// way.
-bool board_requests_safe_mode(void);
-
-// Reset the state of off MCU components such as neopixels.
-void reset_board(void);
-
#define SEQUENCE(first, second, third, fourth) first, second, third, fourth
#define TWO_EMPTY_STEPS 0x00000000
#define EMPTY_SEQUENCE SEQUENCE(TWO_EMPTY_STEPS, TWO_EMPTY_STEPS, TWO_EMPTY_STEPS, TWO_EMPTY_STEPS)
@@ -53,4 +43,4 @@ void reset_board(void);
// FlexSPI configuration that stores command info.
extern const flexspi_nor_config_t qspiflash_config;
-#endif // MICROPY_INCLUDED_MIMXRT10XX_BOARDS_BOARD_H
+#endif // MICROPY_INCLUDED_MIMXRT10XX_BOARDS_FLASH_CONFIG_H
diff --git a/ports/mimxrt10xx/boards/imxrt1010_evk/board.c b/ports/mimxrt10xx/boards/imxrt1010_evk/board.c
index ba3498581..8519893a5 100644
--- a/ports/mimxrt10xx/boards/imxrt1010_evk/board.c
+++ b/ports/mimxrt10xx/boards/imxrt1010_evk/board.c
@@ -25,7 +25,8 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
+#include "boards/flash_config.h"
#include "mpconfigboard.h"
#include "shared-bindings/microcontroller/Pin.h"
diff --git a/ports/mimxrt10xx/boards/imxrt1010_evk/flash_config.c b/ports/mimxrt10xx/boards/imxrt1010_evk/flash_config.c
index 19573bd99..00ee47c98 100644
--- a/ports/mimxrt10xx/boards/imxrt1010_evk/flash_config.c
+++ b/ports/mimxrt10xx/boards/imxrt1010_evk/flash_config.c
@@ -5,8 +5,9 @@
* SPDX-License-Identifier: BSD-3-Clause
*/
+#include "boards/flash_config.h"
+
#include "fsl_flexspi_nor_boot.h"
-#include "boards/board.h"
__attribute__((section(".boot_hdr.ivt")))
diff --git a/ports/mimxrt10xx/boards/imxrt1010_evk/pins.c b/ports/mimxrt10xx/boards/imxrt1010_evk/pins.c
index a0221a2ad..4aad9aaeb 100644
--- a/ports/mimxrt10xx/boards/imxrt1010_evk/pins.c
+++ b/ports/mimxrt10xx/boards/imxrt1010_evk/pins.c
@@ -1,6 +1,6 @@
#include "shared-bindings/board/__init__.h"
-#include "boards/board.h"
+#include "supervisor/board.h"
STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
{ MP_OBJ_NEW_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_GPIO_09) },
diff --git a/ports/mimxrt10xx/boards/imxrt1020_evk/board.c b/ports/mimxrt10xx/boards/imxrt1020_evk/board.c
index d5166b356..531c0c6f6 100644
--- a/ports/mimxrt10xx/boards/imxrt1020_evk/board.c
+++ b/ports/mimxrt10xx/boards/imxrt1020_evk/board.c
@@ -25,7 +25,8 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
+#include "boards/flash_config.h"
#include "mpconfigboard.h"
#include "shared-bindings/microcontroller/Pin.h"
diff --git a/ports/mimxrt10xx/boards/imxrt1020_evk/flash_config.c b/ports/mimxrt10xx/boards/imxrt1020_evk/flash_config.c
index 40b566618..4c3ba4717 100644
--- a/ports/mimxrt10xx/boards/imxrt1020_evk/flash_config.c
+++ b/ports/mimxrt10xx/boards/imxrt1020_evk/flash_config.c
@@ -5,8 +5,9 @@
* SPDX-License-Identifier: BSD-3-Clause
*/
+#include "boards/flash_config.h"
+
#include "fsl_flexspi_nor_boot.h"
-#include "boards/board.h"
__attribute__((section(".boot_hdr.ivt")))
diff --git a/ports/mimxrt10xx/boards/imxrt1020_evk/pins.c b/ports/mimxrt10xx/boards/imxrt1020_evk/pins.c
index ef8115a64..2052a1242 100644
--- a/ports/mimxrt10xx/boards/imxrt1020_evk/pins.c
+++ b/ports/mimxrt10xx/boards/imxrt1020_evk/pins.c
@@ -1,6 +1,6 @@
#include "shared-bindings/board/__init__.h"
-#include "boards/board.h"
+#include "supervisor/board.h"
STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
{ MP_OBJ_NEW_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_GPIO_AD_B1_09) },
diff --git a/ports/mimxrt10xx/boards/imxrt1060_evk/board.c b/ports/mimxrt10xx/boards/imxrt1060_evk/board.c
index 25bc4e8c9..e7d74ab49 100644
--- a/ports/mimxrt10xx/boards/imxrt1060_evk/board.c
+++ b/ports/mimxrt10xx/boards/imxrt1060_evk/board.c
@@ -25,7 +25,8 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
+#include "boards/flash_config.h"
#include "mpconfigboard.h"
#include "shared-bindings/microcontroller/Pin.h"
diff --git a/ports/mimxrt10xx/boards/imxrt1060_evk/flash_config.c b/ports/mimxrt10xx/boards/imxrt1060_evk/flash_config.c
index d79a8d0f9..502e21a3b 100644
--- a/ports/mimxrt10xx/boards/imxrt1060_evk/flash_config.c
+++ b/ports/mimxrt10xx/boards/imxrt1060_evk/flash_config.c
@@ -5,8 +5,9 @@
* SPDX-License-Identifier: BSD-3-Clause
*/
+#include "boards/flash_config.h"
+
#include "fsl_flexspi_nor_boot.h"
-#include "boards/board.h"
__attribute__((section(".boot_hdr.ivt")))
diff --git a/ports/mimxrt10xx/boards/imxrt1060_evk/pins.c b/ports/mimxrt10xx/boards/imxrt1060_evk/pins.c
index 2d268952d..b24e4dc86 100644
--- a/ports/mimxrt10xx/boards/imxrt1060_evk/pins.c
+++ b/ports/mimxrt10xx/boards/imxrt1060_evk/pins.c
@@ -1,6 +1,6 @@
#include "shared-bindings/board/__init__.h"
-#include "boards/board.h"
+#include "supervisor/board.h"
STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
{ MP_OBJ_NEW_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_GPIO_AD_B1_07) },
diff --git a/ports/mimxrt10xx/boards/metro_m7_1011/board.c b/ports/mimxrt10xx/boards/metro_m7_1011/board.c
index ed543e1b0..1db1dd686 100644
--- a/ports/mimxrt10xx/boards/metro_m7_1011/board.c
+++ b/ports/mimxrt10xx/boards/metro_m7_1011/board.c
@@ -25,7 +25,8 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
+#include "boards/flash_config.h"
#include "mpconfigboard.h"
#include "shared-bindings/microcontroller/Pin.h"
diff --git a/ports/mimxrt10xx/boards/metro_m7_1011/flash_config.c b/ports/mimxrt10xx/boards/metro_m7_1011/flash_config.c
index 30ce67523..991bc43e4 100644
--- a/ports/mimxrt10xx/boards/metro_m7_1011/flash_config.c
+++ b/ports/mimxrt10xx/boards/metro_m7_1011/flash_config.c
@@ -5,8 +5,9 @@
* SPDX-License-Identifier: BSD-3-Clause
*/
+#include "boards/flash_config.h"
+
#include "fsl_flexspi_nor_boot.h"
-#include "boards/board.h"
__attribute__((section(".boot_hdr.ivt")))
diff --git a/ports/mimxrt10xx/boards/metro_m7_1011/pins.c b/ports/mimxrt10xx/boards/metro_m7_1011/pins.c
index e88493413..ea9ae5529 100644
--- a/ports/mimxrt10xx/boards/metro_m7_1011/pins.c
+++ b/ports/mimxrt10xx/boards/metro_m7_1011/pins.c
@@ -1,6 +1,6 @@
#include "shared-bindings/board/__init__.h"
-#include "boards/board.h"
+#include "supervisor/board.h"
STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
// Analog
diff --git a/ports/mimxrt10xx/boards/teensy40/board.c b/ports/mimxrt10xx/boards/teensy40/board.c
index 09f0bf3f2..33ad5ff04 100644
--- a/ports/mimxrt10xx/boards/teensy40/board.c
+++ b/ports/mimxrt10xx/boards/teensy40/board.c
@@ -25,7 +25,8 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
+#include "boards/flash_config.h"
#include "mpconfigboard.h"
#include "shared-bindings/microcontroller/Pin.h"
diff --git a/ports/mimxrt10xx/boards/teensy40/flash_config.c b/ports/mimxrt10xx/boards/teensy40/flash_config.c
index 30ce67523..991bc43e4 100644
--- a/ports/mimxrt10xx/boards/teensy40/flash_config.c
+++ b/ports/mimxrt10xx/boards/teensy40/flash_config.c
@@ -5,8 +5,9 @@
* SPDX-License-Identifier: BSD-3-Clause
*/
+#include "boards/flash_config.h"
+
#include "fsl_flexspi_nor_boot.h"
-#include "boards/board.h"
__attribute__((section(".boot_hdr.ivt")))
diff --git a/ports/mimxrt10xx/boards/teensy40/pins.c b/ports/mimxrt10xx/boards/teensy40/pins.c
index 9066ce0d2..64b4aa7f6 100644
--- a/ports/mimxrt10xx/boards/teensy40/pins.c
+++ b/ports/mimxrt10xx/boards/teensy40/pins.c
@@ -1,6 +1,6 @@
#include "shared-bindings/board/__init__.h"
-#include "boards/board.h"
+#include "supervisor/board.h"
STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
// With USB on left. Bottom edge.
diff --git a/ports/mimxrt10xx/boards/teensy41/board.c b/ports/mimxrt10xx/boards/teensy41/board.c
index 09f0bf3f2..33ad5ff04 100644
--- a/ports/mimxrt10xx/boards/teensy41/board.c
+++ b/ports/mimxrt10xx/boards/teensy41/board.c
@@ -25,7 +25,8 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
+#include "boards/flash_config.h"
#include "mpconfigboard.h"
#include "shared-bindings/microcontroller/Pin.h"
diff --git a/ports/mimxrt10xx/boards/teensy41/flash_config.c b/ports/mimxrt10xx/boards/teensy41/flash_config.c
index 7b2bfb768..c0e0c86f9 100644
--- a/ports/mimxrt10xx/boards/teensy41/flash_config.c
+++ b/ports/mimxrt10xx/boards/teensy41/flash_config.c
@@ -5,8 +5,9 @@
* SPDX-License-Identifier: BSD-3-Clause
*/
+#include "boards/flash_config.h"
+
#include "fsl_flexspi_nor_boot.h"
-#include "boards/board.h"
__attribute__((section(".boot_hdr.ivt")))
diff --git a/ports/mimxrt10xx/boards/teensy41/pins.c b/ports/mimxrt10xx/boards/teensy41/pins.c
index 5eb5ab0f5..cf2451301 100644
--- a/ports/mimxrt10xx/boards/teensy41/pins.c
+++ b/ports/mimxrt10xx/boards/teensy41/pins.c
@@ -1,6 +1,6 @@
#include "shared-bindings/board/__init__.h"
-#include "boards/board.h"
+#include "supervisor/board.h"
STATIC const mp_rom_map_elem_t board_global_dict_table[] = {
// With USB on left. Bottom edge.
diff --git a/ports/mimxrt10xx/common-hal/microcontroller/Processor.c b/ports/mimxrt10xx/common-hal/microcontroller/Processor.c
index f3a578014..efbde35d2 100644
--- a/ports/mimxrt10xx/common-hal/microcontroller/Processor.c
+++ b/ports/mimxrt10xx/common-hal/microcontroller/Processor.c
@@ -28,6 +28,7 @@
#include <math.h>
#include "common-hal/microcontroller/Processor.h"
+#include "shared-bindings/microcontroller/ResetReason.h"
#include "fsl_tempmon.h"
#include "fsl_ocotp.h"
@@ -70,3 +71,7 @@ void common_hal_mcu_processor_get_uid(uint8_t raw_id[]) {
}
OCOTP_Deinit(OCOTP);
}
+
+mcu_reset_reason_t common_hal_mcu_processor_get_reset_reason(void) {
+ return RESET_REASON_UNKNOWN;
+}
diff --git a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1011/periph.h b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1011/periph.h
index c3f04a049..c50d73294 100644
--- a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1011/periph.h
+++ b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1011/periph.h
@@ -24,8 +24,8 @@
* THE SOFTWARE.
*/
-#ifndef MICROPY_INCLUDED_MIMXRT10XX_PERIPHERALS_MIMXRT1011_PERIPH_H
-#define MICROPY_INCLUDED_MIMXRT10XX_PERIPHERALS_MIMXRT1011_PERIPH_H
+#ifndef MICROPY_INCLUDED_MIMXRT10XX_MIMXRT1011_PERIPHERALS_MIMXRT1011_PERIPH_H
+#define MICROPY_INCLUDED_MIMXRT10XX_MIMXRT1011_PERIPHERALS_MIMXRT1011_PERIPH_H
extern LPI2C_Type *mcu_i2c_banks[2];
@@ -47,4 +47,4 @@ extern const mcu_periph_obj_t mcu_uart_cts_list[4];
extern const mcu_pwm_obj_t mcu_pwm_list[20];
-#endif // MICROPY_INCLUDED_MIMXRT10XX_PERIPHERALS_MIMXRT1011_PERIP_H
+#endif // MICROPY_INCLUDED_MIMXRT10XX_MIMXRT1011_PERIPHERALS_MIMXRT1011_PERIPH_H
diff --git a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1062/periph.h b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1062/periph.h
index 4f6ab6261..067c05d0d 100644
--- a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1062/periph.h
+++ b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1062/periph.h
@@ -24,8 +24,8 @@
* THE SOFTWARE.
*/
-#ifndef MICROPY_INCLUDED_MIMXRT10XX_PERIPHERALS_MIMXRT1011_PERIPH_H
-#define MICROPY_INCLUDED_MIMXRT10XX_PERIPHERALS_MIMXRT1011_PERIPH_H
+#ifndef MICROPY_INCLUDED_MIMXRT10XX_MIMXRT1062_PERIPHERALS_MIMXRT1011_PERIPH_H
+#define MICROPY_INCLUDED_MIMXRT10XX_MIMXRT1062_PERIPHERALS_MIMXRT1011_PERIPH_H
extern LPI2C_Type *mcu_i2c_banks[4];
@@ -47,4 +47,4 @@ extern const mcu_periph_obj_t mcu_uart_cts_list[9];
extern const mcu_pwm_obj_t mcu_pwm_list[67];
-#endif // MICROPY_INCLUDED_MIMXRT10XX_PERIPHERALS_MIMXRT1011_PERIPH_H
+#endif // MICROPY_INCLUDED_MIMXRT10XX_MIMXRT1062_PERIPHERALS_MIMXRT1011_PERIPH_H
diff --git a/ports/mimxrt10xx/supervisor/flexspi_nor_flash_ops.c b/ports/mimxrt10xx/supervisor/flexspi_nor_flash_ops.c
index 353ba3176..bd471f930 100644
--- a/ports/mimxrt10xx/supervisor/flexspi_nor_flash_ops.c
+++ b/ports/mimxrt10xx/supervisor/flexspi_nor_flash_ops.c
@@ -9,7 +9,7 @@
#include "fsl_flexspi.h"
#include "internal_flash.h"
-#include "boards/board.h"
+#include "boards/flash_config.h"
#include "supervisor/linker.h"
status_t PLACE_IN_ITCM(flexspi_nor_write_enable)(FLEXSPI_Type *base, uint32_t baseAddr)
diff --git a/ports/mimxrt10xx/supervisor/internal_flash.c b/ports/mimxrt10xx/supervisor/internal_flash.c
index e194cbed9..9c0d9f895 100644
--- a/ports/mimxrt10xx/supervisor/internal_flash.c
+++ b/ports/mimxrt10xx/supervisor/internal_flash.c
@@ -30,7 +30,7 @@
#include <string.h>
#include <stdio.h>
-#include "boards/board.h"
+#include "boards/flash_config.h"
#include "extmod/vfs.h"
#include "extmod/vfs_fat.h"
#include "py/mphal.h"
diff --git a/ports/mimxrt10xx/supervisor/port.c b/ports/mimxrt10xx/supervisor/port.c
index e3fef373f..33a85d2b7 100644
--- a/ports/mimxrt10xx/supervisor/port.c
+++ b/ports/mimxrt10xx/supervisor/port.c
@@ -31,7 +31,7 @@
* SPDX-License-Identifier: BSD-3-Clause
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "supervisor/port.h"
#include "fsl_device_registers.h"
@@ -334,11 +334,8 @@ uint32_t *port_stack_get_top(void) {
return &_ld_stack_top;
}
-supervisor_allocation _fixed_stack;
-supervisor_allocation* port_fixed_stack(void) {
- _fixed_stack.ptr = port_stack_get_limit();
- _fixed_stack.length = (port_stack_get_top() - port_stack_get_limit()) * sizeof(uint32_t);
- return &_fixed_stack;
+bool port_has_fixed_stack(void) {
+ return true;
}
uint32_t *port_heap_get_bottom(void) {
@@ -406,7 +403,7 @@ void port_interrupt_after_ticks(uint32_t ticks) {
SNVS->HPCR |= SNVS_HPCR_HPTA_EN_MASK;
}
-void port_sleep_until_interrupt(void) {
+void port_idle_until_interrupt(void) {
// App note here: https://www.nxp.com/docs/en/application-note/AN12085.pdf
// Clear the FPU interrupt because it can prevent us from sleeping.
diff --git a/ports/nrf/boards/ADM_B_NRF52840_1/board.c b/ports/nrf/boards/ADM_B_NRF52840_1/board.c
index 4421970ee..781793328 100644
--- a/ports/nrf/boards/ADM_B_NRF52840_1/board.c
+++ b/ports/nrf/boards/ADM_B_NRF52840_1/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/nrf/boards/TG-Watch02A/board.c b/ports/nrf/boards/TG-Watch02A/board.c
index 4421970ee..781793328 100644
--- a/ports/nrf/boards/TG-Watch02A/board.c
+++ b/ports/nrf/boards/TG-Watch02A/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/nrf/boards/aramcon_badge_2019/board.c b/ports/nrf/boards/aramcon_badge_2019/board.c
index efb449285..8f3830b00 100644
--- a/ports/nrf/boards/aramcon_badge_2019/board.c
+++ b/ports/nrf/boards/aramcon_badge_2019/board.c
@@ -25,7 +25,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "common-hal/microcontroller/Pin.h"
void board_init(void) {
diff --git a/ports/nrf/boards/arduino_nano_33_ble/board.c b/ports/nrf/boards/arduino_nano_33_ble/board.c
index ddfcde284..d1689e9dd 100644
--- a/ports/nrf/boards/arduino_nano_33_ble/board.c
+++ b/ports/nrf/boards/arduino_nano_33_ble/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "nrf.h"
#include "nrf_rtc.h"
diff --git a/ports/nrf/boards/bless_dev_board_multi_sensor/board.c b/ports/nrf/boards/bless_dev_board_multi_sensor/board.c
index 71b9a0657..6970294ec 100644
--- a/ports/nrf/boards/bless_dev_board_multi_sensor/board.c
+++ b/ports/nrf/boards/bless_dev_board_multi_sensor/board.c
@@ -1,4 +1,4 @@
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/nrf/boards/circuitplayground_bluefruit/board.c b/ports/nrf/boards/circuitplayground_bluefruit/board.c
index 3aa6857da..ff731d8f9 100644
--- a/ports/nrf/boards/circuitplayground_bluefruit/board.c
+++ b/ports/nrf/boards/circuitplayground_bluefruit/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "py/obj.h"
#include "peripherals/nrf/pins.h"
@@ -49,5 +49,5 @@ void reset_board(void) {
NRF_GPIO_PIN_NOSENSE);
nrf_gpio_pin_write(POWER_SWITCH_PIN->number, false);
- board_reset_user_neopixels();
+ board_reset_user_neopixels(&pin_P0_13, 10);
}
diff --git a/ports/nrf/boards/circuitplayground_bluefruit/mpconfigboard.h b/ports/nrf/boards/circuitplayground_bluefruit/mpconfigboard.h
index ef34465dc..da32230a6 100644
--- a/ports/nrf/boards/circuitplayground_bluefruit/mpconfigboard.h
+++ b/ports/nrf/boards/circuitplayground_bluefruit/mpconfigboard.h
@@ -54,8 +54,6 @@
// Disables onboard peripherals and neopixels to save power.
#define POWER_SWITCH_PIN (&pin_P0_06)
-#define USER_NEOPIXELS_PIN (&pin_P0_13)
-
#define DEFAULT_I2C_BUS_SCL (&pin_P0_04)
#define DEFAULT_I2C_BUS_SDA (&pin_P0_05)
diff --git a/ports/nrf/boards/clue_nrf52840_express/board.c b/ports/nrf/boards/clue_nrf52840_express/board.c
index 523bd7677..cd46ce75d 100644
--- a/ports/nrf/boards/clue_nrf52840_express/board.c
+++ b/ports/nrf/boards/clue_nrf52840_express/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "shared-bindings/busio/SPI.h"
diff --git a/ports/nrf/boards/clue_nrf52840_express/pins.c b/ports/nrf/boards/clue_nrf52840_express/pins.c
index ab0738893..61d77cedc 100644
--- a/ports/nrf/boards/clue_nrf52840_express/pins.c
+++ b/ports/nrf/boards/clue_nrf52840_express/pins.c
@@ -1,6 +1,6 @@
#include "shared-bindings/board/__init__.h"
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "shared-module/displayio/__init__.h"
STATIC const mp_rom_map_elem_t board_module_globals_table[] = {
diff --git a/ports/nrf/boards/electronut_labs_blip/board.c b/ports/nrf/boards/electronut_labs_blip/board.c
index 4421970ee..781793328 100644
--- a/ports/nrf/boards/electronut_labs_blip/board.c
+++ b/ports/nrf/boards/electronut_labs_blip/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/nrf/boards/electronut_labs_papyr/board.c b/ports/nrf/boards/electronut_labs_papyr/board.c
index 4421970ee..781793328 100644
--- a/ports/nrf/boards/electronut_labs_papyr/board.c
+++ b/ports/nrf/boards/electronut_labs_papyr/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/nrf/boards/feather_bluefruit_sense/board.c b/ports/nrf/boards/feather_bluefruit_sense/board.c
index 4421970ee..781793328 100644
--- a/ports/nrf/boards/feather_bluefruit_sense/board.c
+++ b/ports/nrf/boards/feather_bluefruit_sense/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/nrf/boards/feather_nrf52840_express/board.c b/ports/nrf/boards/feather_nrf52840_express/board.c
index 4421970ee..781793328 100644
--- a/ports/nrf/boards/feather_nrf52840_express/board.c
+++ b/ports/nrf/boards/feather_nrf52840_express/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/nrf/boards/hiibot_bluefi/board.c b/ports/nrf/boards/hiibot_bluefi/board.c
index 93e31aef0..a3fd5cf12 100644
--- a/ports/nrf/boards/hiibot_bluefi/board.c
+++ b/ports/nrf/boards/hiibot_bluefi/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "shared-bindings/busio/SPI.h"
diff --git a/ports/nrf/boards/hiibot_bluefi/pins.c b/ports/nrf/boards/hiibot_bluefi/pins.c
index bce4ee52d..c7879c4c2 100644
--- a/ports/nrf/boards/hiibot_bluefi/pins.c
+++ b/ports/nrf/boards/hiibot_bluefi/pins.c
@@ -1,6 +1,6 @@
#include "shared-bindings/board/__init__.h"
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "shared-module/displayio/__init__.h"
STATIC const mp_rom_map_elem_t board_module_globals_table[] = {
diff --git a/ports/nrf/boards/ikigaisense_vita/board.c b/ports/nrf/boards/ikigaisense_vita/board.c
index 4421970ee..781793328 100644
--- a/ports/nrf/boards/ikigaisense_vita/board.c
+++ b/ports/nrf/boards/ikigaisense_vita/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/nrf/boards/itsybitsy_nrf52840_express/board.c b/ports/nrf/boards/itsybitsy_nrf52840_express/board.c
index 4421970ee..781793328 100644
--- a/ports/nrf/boards/itsybitsy_nrf52840_express/board.c
+++ b/ports/nrf/boards/itsybitsy_nrf52840_express/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/nrf/boards/makerdiary_m60_keyboard/board.c b/ports/nrf/boards/makerdiary_m60_keyboard/board.c
index 4421970ee..781793328 100644
--- a/ports/nrf/boards/makerdiary_m60_keyboard/board.c
+++ b/ports/nrf/boards/makerdiary_m60_keyboard/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/nrf/boards/makerdiary_m60_keyboard/pins.c b/ports/nrf/boards/makerdiary_m60_keyboard/pins.c
index 63c3ad171..fc85fa24b 100644
--- a/ports/nrf/boards/makerdiary_m60_keyboard/pins.c
+++ b/ports/nrf/boards/makerdiary_m60_keyboard/pins.c
@@ -1,6 +1,6 @@
#include "shared-bindings/board/__init__.h"
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "shared-module/displayio/__init__.h"
STATIC const mp_rom_map_elem_t board_module_globals_table[] = {
diff --git a/ports/nrf/boards/makerdiary_nrf52840_m2_devkit/board.c b/ports/nrf/boards/makerdiary_nrf52840_m2_devkit/board.c
index e08d00dac..569106ec2 100644
--- a/ports/nrf/boards/makerdiary_nrf52840_m2_devkit/board.c
+++ b/ports/nrf/boards/makerdiary_nrf52840_m2_devkit/board.c
@@ -25,7 +25,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "shared-bindings/busio/SPI.h"
diff --git a/ports/nrf/boards/makerdiary_nrf52840_m2_devkit/pins.c b/ports/nrf/boards/makerdiary_nrf52840_m2_devkit/pins.c
index 7dc6db18f..189286833 100644
--- a/ports/nrf/boards/makerdiary_nrf52840_m2_devkit/pins.c
+++ b/ports/nrf/boards/makerdiary_nrf52840_m2_devkit/pins.c
@@ -1,6 +1,6 @@
#include "shared-bindings/board/__init__.h"
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "shared-module/displayio/__init__.h"
STATIC const mp_rom_map_elem_t board_module_globals_table[] = {
diff --git a/ports/nrf/boards/makerdiary_nrf52840_mdk/board.c b/ports/nrf/boards/makerdiary_nrf52840_mdk/board.c
index 4421970ee..781793328 100644
--- a/ports/nrf/boards/makerdiary_nrf52840_mdk/board.c
+++ b/ports/nrf/boards/makerdiary_nrf52840_mdk/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/nrf/boards/makerdiary_nrf52840_mdk_usb_dongle/board.c b/ports/nrf/boards/makerdiary_nrf52840_mdk_usb_dongle/board.c
index 4421970ee..781793328 100644
--- a/ports/nrf/boards/makerdiary_nrf52840_mdk_usb_dongle/board.c
+++ b/ports/nrf/boards/makerdiary_nrf52840_mdk_usb_dongle/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/nrf/boards/metro_nrf52840_express/board.c b/ports/nrf/boards/metro_nrf52840_express/board.c
index 4421970ee..781793328 100644
--- a/ports/nrf/boards/metro_nrf52840_express/board.c
+++ b/ports/nrf/boards/metro_nrf52840_express/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/nrf/boards/nice_nano/board.c b/ports/nrf/boards/nice_nano/board.c
index 4421970ee..781793328 100644
--- a/ports/nrf/boards/nice_nano/board.c
+++ b/ports/nrf/boards/nice_nano/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/nrf/boards/ohs2020_badge/board.c b/ports/nrf/boards/ohs2020_badge/board.c
index ec52690ce..20abf4e2a 100644
--- a/ports/nrf/boards/ohs2020_badge/board.c
+++ b/ports/nrf/boards/ohs2020_badge/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "shared-bindings/busio/SPI.h"
diff --git a/ports/nrf/boards/particle_argon/board.c b/ports/nrf/boards/particle_argon/board.c
index f891f54a1..a41f0ae06 100644
--- a/ports/nrf/boards/particle_argon/board.c
+++ b/ports/nrf/boards/particle_argon/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/nrf/boards/particle_boron/board.c b/ports/nrf/boards/particle_boron/board.c
index f891f54a1..a41f0ae06 100644
--- a/ports/nrf/boards/particle_boron/board.c
+++ b/ports/nrf/boards/particle_boron/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/nrf/boards/particle_xenon/board.c b/ports/nrf/boards/particle_xenon/board.c
index f891f54a1..a41f0ae06 100644
--- a/ports/nrf/boards/particle_xenon/board.c
+++ b/ports/nrf/boards/particle_xenon/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/nrf/boards/pca10056/board.c b/ports/nrf/boards/pca10056/board.c
index 4421970ee..781793328 100644
--- a/ports/nrf/boards/pca10056/board.c
+++ b/ports/nrf/boards/pca10056/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/nrf/boards/pca10059/board.c b/ports/nrf/boards/pca10059/board.c
index 4421970ee..781793328 100644
--- a/ports/nrf/boards/pca10059/board.c
+++ b/ports/nrf/boards/pca10059/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/nrf/boards/pca10100/board.c b/ports/nrf/boards/pca10100/board.c
index f891f54a1..a41f0ae06 100644
--- a/ports/nrf/boards/pca10100/board.c
+++ b/ports/nrf/boards/pca10100/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/nrf/boards/pitaya_go/board.c b/ports/nrf/boards/pitaya_go/board.c
index 4421970ee..781793328 100644
--- a/ports/nrf/boards/pitaya_go/board.c
+++ b/ports/nrf/boards/pitaya_go/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/nrf/boards/raytac_mdbt50q-db-40/board.c b/ports/nrf/boards/raytac_mdbt50q-db-40/board.c
index 4421970ee..781793328 100644
--- a/ports/nrf/boards/raytac_mdbt50q-db-40/board.c
+++ b/ports/nrf/boards/raytac_mdbt50q-db-40/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/nrf/boards/simmel/board.c b/ports/nrf/boards/simmel/board.c
index f891f54a1..a41f0ae06 100644
--- a/ports/nrf/boards/simmel/board.c
+++ b/ports/nrf/boards/simmel/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/nrf/boards/simmel/mpconfigboard.mk b/ports/nrf/boards/simmel/mpconfigboard.mk
index e34739c0f..704881b3c 100644
--- a/ports/nrf/boards/simmel/mpconfigboard.mk
+++ b/ports/nrf/boards/simmel/mpconfigboard.mk
@@ -25,6 +25,7 @@ CIRCUITPY_RTC = 1
CIRCUITPY_TOUCHIO = 0
CIRCUITPY_ULAB = 0
CIRCUITPY_WATCHDOG = 1
+CIRCUITPY_BUSDEVICE = 0
# Enable micropython.native
#CIRCUITPY_ENABLE_MPY_NATIVE = 1
diff --git a/ports/nrf/boards/sparkfun_nrf52840_mini/board.c b/ports/nrf/boards/sparkfun_nrf52840_mini/board.c
index 4421970ee..781793328 100644
--- a/ports/nrf/boards/sparkfun_nrf52840_mini/board.c
+++ b/ports/nrf/boards/sparkfun_nrf52840_mini/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/nrf/boards/teknikio_bluebird/board.c b/ports/nrf/boards/teknikio_bluebird/board.c
index 4421970ee..781793328 100644
--- a/ports/nrf/boards/teknikio_bluebird/board.c
+++ b/ports/nrf/boards/teknikio_bluebird/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/nrf/boards/tinkeringtech_scoutmakes_azul/board.c b/ports/nrf/boards/tinkeringtech_scoutmakes_azul/board.c
index 4421970ee..781793328 100644
--- a/ports/nrf/boards/tinkeringtech_scoutmakes_azul/board.c
+++ b/ports/nrf/boards/tinkeringtech_scoutmakes_azul/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/nrf/common-hal/microcontroller/Processor.c b/ports/nrf/common-hal/microcontroller/Processor.c
index 03d9c4d3f..ab5f29b5d 100644
--- a/ports/nrf/common-hal/microcontroller/Processor.c
+++ b/ports/nrf/common-hal/microcontroller/Processor.c
@@ -24,8 +24,10 @@
* THE SOFTWARE.
*/
-#include "common-hal/microcontroller/Processor.h"
#include "py/runtime.h"
+
+#include "common-hal/microcontroller/Processor.h"
+#include "shared-bindings/microcontroller/ResetReason.h"
#include "supervisor/shared/translate.h"
#include "nrfx_saadc.h"
@@ -119,3 +121,7 @@ void common_hal_mcu_processor_get_uid(uint8_t raw_id[]) {
((uint32_t*) raw_id)[i] = NRF_FICR->DEVICEID[i];
}
}
+
+mcu_reset_reason_t common_hal_mcu_processor_get_reset_reason(void) {
+ return RESET_REASON_UNKNOWN;
+}
diff --git a/ports/nrf/common-hal/rgbmatrix/RGBMatrix.h b/ports/nrf/common-hal/rgbmatrix/RGBMatrix.h
index 48de4dcb2..24d86f177 100644
--- a/ports/nrf/common-hal/rgbmatrix/RGBMatrix.h
+++ b/ports/nrf/common-hal/rgbmatrix/RGBMatrix.h
@@ -24,8 +24,8 @@
* THE SOFTWARE.
*/
-#ifndef MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_RGBMATRIX_RGBMATRIX_H
-#define MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_RGBMATRIX_RGBMATRIX_H
+#ifndef MICROPY_INCLUDED_NRF_COMMON_HAL_RGBMATRIX_RGBMATRIX_H
+#define MICROPY_INCLUDED_NRF_COMMON_HAL_RGBMATRIX_RGBMATRIX_H
void *common_hal_rgbmatrix_timer_allocate(void);
void common_hal_rgbmatrix_timer_enable(void*);
diff --git a/ports/nrf/common-hal/watchdog/WatchDogTimer.c b/ports/nrf/common-hal/watchdog/WatchDogTimer.c
index bec0ac473..539b43e76 100644
--- a/ports/nrf/common-hal/watchdog/WatchDogTimer.c
+++ b/ports/nrf/common-hal/watchdog/WatchDogTimer.c
@@ -93,6 +93,9 @@ void common_hal_watchdog_feed(watchdog_watchdogtimer_obj_t *self) {
}
void common_hal_watchdog_deinit(watchdog_watchdogtimer_obj_t *self) {
+ if (self->mode == WATCHDOGMODE_RESET) {
+ mp_raise_NotImplementedError(translate("WatchDogTimer cannot be deinitialized once mode is set to RESET"));
+ }
if (timer) {
timer_free();
}
diff --git a/ports/nrf/supervisor/port.c b/ports/nrf/supervisor/port.c
index 493de43e0..00485d858 100644
--- a/ports/nrf/supervisor/port.c
+++ b/ports/nrf/supervisor/port.c
@@ -26,7 +26,7 @@
#include <stdint.h>
#include "supervisor/port.h"
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "nrfx/hal/nrf_clock.h"
#include "nrfx/hal/nrf_power.h"
@@ -251,8 +251,8 @@ uint32_t *port_heap_get_top(void) {
return port_stack_get_top();
}
-supervisor_allocation* port_fixed_stack(void) {
- return NULL;
+bool port_has_fixed_stack(void) {
+ return false;
}
uint32_t *port_stack_get_limit(void) {
@@ -307,7 +307,7 @@ void port_interrupt_after_ticks(uint32_t ticks) {
nrfx_rtc_cc_set(&rtc_instance, 0, current_ticks + diff, true);
}
-void port_sleep_until_interrupt(void) {
+void port_idle_until_interrupt(void) {
#if defined(MICROPY_QSPI_CS)
qspi_disable();
#endif
diff --git a/ports/stm/boards/STM32F411_nvm_nofs.ld b/ports/stm/boards/STM32F411_nvm_nofs.ld
new file mode 100644
index 000000000..e4630518c
--- /dev/null
+++ b/ports/stm/boards/STM32F411_nvm_nofs.ld
@@ -0,0 +1,27 @@
+/*
+ GNU linker script for STM32F411 with nvm and an external flash chip.
+ No space is reserved for a filesystem.
+*/
+
+/* Specify the memory areas */
+MEMORY
+{
+ FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K /* entire flash */
+ FLASH_ISR (rx) : ORIGIN = 0x08000000, LENGTH = 16K /* sector 0 */
+ FLASH_NVM (rwx) : ORIGIN = 0x08004000, LENGTH = 16K /* sector 1 is 16K */
+ FLASH_FIRMWARE (rx) : ORIGIN = 0x08008000, LENGTH = 480K /* sector 2,3 is 16k, sector 4 is 64K, sectors 5,6,7 are 128K */
+ RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
+}
+
+/* produce a link error if there is not this amount of RAM for these sections */
+_minimum_stack_size = 24K;
+_minimum_heap_size = 16K;
+
+/* Define the top end of the stack. The stack is full descending so begins just
+ above last byte of RAM. Note that EABI requires the stack to be 8-byte
+ aligned for a call. */
+_estack = ORIGIN(RAM) + LENGTH(RAM);
+
+/* RAM extents for the garbage collector */
+_ram_start = ORIGIN(RAM);
+_ram_end = ORIGIN(RAM) + LENGTH(RAM);
diff --git a/ports/stm/boards/espruino_pico/board.c b/ports/stm/boards/espruino_pico/board.c
index 82b0c506e..f8e462f93 100644
--- a/ports/stm/boards/espruino_pico/board.c
+++ b/ports/stm/boards/espruino_pico/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
void board_init(void) {
diff --git a/ports/stm/boards/espruino_wifi/board.c b/ports/stm/boards/espruino_wifi/board.c
index 4421970ee..781793328 100644
--- a/ports/stm/boards/espruino_wifi/board.c
+++ b/ports/stm/boards/espruino_wifi/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/stm/boards/feather_stm32f405_express/board.c b/ports/stm/boards/feather_stm32f405_express/board.c
index 82b0c506e..f8e462f93 100644
--- a/ports/stm/boards/feather_stm32f405_express/board.c
+++ b/ports/stm/boards/feather_stm32f405_express/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
void board_init(void) {
diff --git a/ports/stm/boards/meowbit_v121/board.c b/ports/stm/boards/meowbit_v121/board.c
index f67b4a49d..4a8014a3a 100644
--- a/ports/stm/boards/meowbit_v121/board.c
+++ b/ports/stm/boards/meowbit_v121/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
#include "shared-bindings/board/__init__.h"
diff --git a/ports/stm/boards/meowbit_v121/mpconfigboard.mk b/ports/stm/boards/meowbit_v121/mpconfigboard.mk
index c416700e3..86b0cb5ab 100644
--- a/ports/stm/boards/meowbit_v121/mpconfigboard.mk
+++ b/ports/stm/boards/meowbit_v121/mpconfigboard.mk
@@ -20,3 +20,5 @@ LD_COMMON = boards/common_default.ld
LD_FILE = boards/STM32F401xe_boot.ld
# For debugging - also comment BOOTLOADER_OFFSET and BOARD_VTOR_DEFER
# LD_FILE = boards/STM32F401xe_fs.ld
+
+CIRCUITPY_ULAB = 0
diff --git a/ports/stm/boards/nucleo_f746zg/board.c b/ports/stm/boards/nucleo_f746zg/board.c
index 4421970ee..781793328 100644
--- a/ports/stm/boards/nucleo_f746zg/board.c
+++ b/ports/stm/boards/nucleo_f746zg/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/stm/boards/nucleo_f767zi/board.c b/ports/stm/boards/nucleo_f767zi/board.c
index 4421970ee..781793328 100644
--- a/ports/stm/boards/nucleo_f767zi/board.c
+++ b/ports/stm/boards/nucleo_f767zi/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/stm/boards/nucleo_h743zi_2/board.c b/ports/stm/boards/nucleo_h743zi_2/board.c
index 4421970ee..781793328 100644
--- a/ports/stm/boards/nucleo_h743zi_2/board.c
+++ b/ports/stm/boards/nucleo_h743zi_2/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/stm/boards/openmv_h7/board.c b/ports/stm/boards/openmv_h7/board.c
index 4421970ee..781793328 100644
--- a/ports/stm/boards/openmv_h7/board.c
+++ b/ports/stm/boards/openmv_h7/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/stm/boards/pyb_nano_v2/board.c b/ports/stm/boards/pyb_nano_v2/board.c
index 82b0c506e..f8e462f93 100644
--- a/ports/stm/boards/pyb_nano_v2/board.c
+++ b/ports/stm/boards/pyb_nano_v2/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
void board_init(void) {
diff --git a/ports/stm/boards/pyboard_v11/board.c b/ports/stm/boards/pyboard_v11/board.c
index 4421970ee..781793328 100644
--- a/ports/stm/boards/pyboard_v11/board.c
+++ b/ports/stm/boards/pyboard_v11/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/stm/boards/stm32f411ce_blackpill/board.c b/ports/stm/boards/stm32f411ce_blackpill/board.c
index 82b0c506e..f8e462f93 100644
--- a/ports/stm/boards/stm32f411ce_blackpill/board.c
+++ b/ports/stm/boards/stm32f411ce_blackpill/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "mpconfigboard.h"
void board_init(void) {
diff --git a/ports/stm/boards/stm32f411ve_discovery/board.c b/ports/stm/boards/stm32f411ve_discovery/board.c
index 4421970ee..781793328 100644
--- a/ports/stm/boards/stm32f411ve_discovery/board.c
+++ b/ports/stm/boards/stm32f411ve_discovery/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/stm/boards/stm32f412zg_discovery/board.c b/ports/stm/boards/stm32f412zg_discovery/board.c
index 4421970ee..781793328 100644
--- a/ports/stm/boards/stm32f412zg_discovery/board.c
+++ b/ports/stm/boards/stm32f412zg_discovery/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/stm/boards/stm32f4_discovery/board.c b/ports/stm/boards/stm32f4_discovery/board.c
index 4421970ee..781793328 100644
--- a/ports/stm/boards/stm32f4_discovery/board.c
+++ b/ports/stm/boards/stm32f4_discovery/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/stm/boards/stm32f746g_discovery/board.c b/ports/stm/boards/stm32f746g_discovery/board.c
index aafc69cf0..db2c72727 100644
--- a/ports/stm/boards/stm32f746g_discovery/board.c
+++ b/ports/stm/boards/stm32f746g_discovery/board.c
@@ -25,7 +25,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "stm32f7xx_hal.h"
#include "common-hal/microcontroller/Pin.h"
diff --git a/ports/stm/boards/thunderpack/board.c b/ports/stm/boards/thunderpack_v11/board.c
index 4421970ee..781793328 100644
--- a/ports/stm/boards/thunderpack/board.c
+++ b/ports/stm/boards/thunderpack_v11/board.c
@@ -24,7 +24,7 @@
* THE SOFTWARE.
*/
-#include "boards/board.h"
+#include "supervisor/board.h"
void board_init(void) {
}
diff --git a/ports/stm/boards/thunderpack/mpconfigboard.h b/ports/stm/boards/thunderpack_v11/mpconfigboard.h
index c2649e255..7d4a8dff3 100644
--- a/ports/stm/boards/thunderpack/mpconfigboard.h
+++ b/ports/stm/boards/thunderpack_v11/mpconfigboard.h
@@ -23,7 +23,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
-#define MICROPY_HW_BOARD_NAME "THUNDERPACK"
+#define MICROPY_HW_BOARD_NAME "THUNDERPACK_v11"
#define MICROPY_HW_MCU_NAME "STM32F411CE"
// Non-volatile memory config
diff --git a/ports/stm/boards/thunderpack/mpconfigboard.mk b/ports/stm/boards/thunderpack_v11/mpconfigboard.mk
index d303582e0..8f645068d 100644
--- a/ports/stm/boards/thunderpack/mpconfigboard.mk
+++ b/ports/stm/boards/thunderpack_v11/mpconfigboard.mk
@@ -15,3 +15,5 @@ MCU_PACKAGE = UFQFPN48
LD_COMMON = boards/common_nvm.ld
LD_FILE = boards/STM32F411_nvm.ld
+
+CIRCUITPY_ULAB = 0
diff --git a/ports/stm/boards/thunderpack/pins.c b/ports/stm/boards/thunderpack_v11/pins.c
index eed54eb3c..eed54eb3c 100644
--- a/ports/stm/boards/thunderpack/pins.c
+++ b/ports/stm/boards/thunderpack_v11/pins.c
diff --git a/ports/nrf/boards/board.h b/ports/stm/boards/thunderpack_v12/board.c
index ec98f04fb..781793328 100644
--- a/ports/nrf/boards/board.h
+++ b/ports/stm/boards/thunderpack_v12/board.c
@@ -24,22 +24,15 @@
* THE SOFTWARE.
*/
-// This file defines board specific functions.
+#include "supervisor/board.h"
-#ifndef MICROPY_INCLUDED_NRF_BOARDS_BOARD_H
-#define MICROPY_INCLUDED_NRF_BOARDS_BOARD_H
+void board_init(void) {
+}
-#include <stdbool.h>
+bool board_requests_safe_mode(void) {
+ return false;
+}
-// Initializes board related state once on start up.
-void board_init(void);
+void reset_board(void) {
-// Returns true if the user initiates safe mode in a board specific way.
-// Also add BOARD_USER_SAFE_MODE in mpconfigboard.h to explain the board specific
-// way.
-bool board_requests_safe_mode(void);
-
-// Reset the state of off MCU components such as neopixels.
-void reset_board(void);
-
-#endif // MICROPY_INCLUDED_NRF_BOARDS_BOARD_H
+}
diff --git a/ports/stm/boards/thunderpack_v12/mpconfigboard.h b/ports/stm/boards/thunderpack_v12/mpconfigboard.h
new file mode 100644
index 000000000..fb5f389a3
--- /dev/null
+++ b/ports/stm/boards/thunderpack_v12/mpconfigboard.h
@@ -0,0 +1,57 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Lucian Copeland 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.
+ */
+#define MICROPY_HW_BOARD_NAME "THUNDERPACK_v12"
+#define MICROPY_HW_MCU_NAME "STM32F411CE"
+
+// Non-volatile memory config
+#define CIRCUITPY_INTERNAL_NVM_SIZE (0x4000)
+#define CIRCUITPY_INTERNAL_NVM_START_ADDR (0x08004000)
+#define CIRCUITPY_INTERNAL_NVM_SECTOR FLASH_SECTOR_1
+#define NVM_BYTEARRAY_BUFFER_SIZE 512
+
+// Flash config
+#define FLASH_SIZE (0x80000)
+#define FLASH_PAGE_SIZE (0x4000)
+#define BOARD_FLASH_SIZE (FLASH_SIZE - CIRCUITPY_INTERNAL_NVM_SIZE- 0x2000 - 0xC000)
+#define INTERNAL_FLASH_FILESYSTEM_SIZE 0x8000
+
+// On-board flash
+#define SPI_FLASH_MOSI_PIN (&pin_PB15)
+#define SPI_FLASH_MISO_PIN (&pin_PB14)
+#define SPI_FLASH_SCK_PIN (&pin_PB13)
+#define SPI_FLASH_CS_PIN (&pin_PB12)
+
+#define HSE_VALUE ((uint32_t)24000000U)
+#define BOARD_OVERWRITE_SWD (1)
+#define BOARD_NO_VBUS_SENSE (1)
+#define BOARD_HAS_LOW_SPEED_CRYSTAL (0)
+
+// Status LEDs
+#define MICROPY_HW_APA102_MOSI (&pin_PB08)
+#define MICROPY_HW_APA102_SCK (&pin_PB00)
+// I2C
+#define DEFAULT_I2C_BUS_SCL (&pin_PB06)
+#define DEFAULT_I2C_BUS_SDA (&pin_PB07)
diff --git a/ports/stm/boards/thunderpack_v12/mpconfigboard.mk b/ports/stm/boards/thunderpack_v12/mpconfigboard.mk
new file mode 100644
index 000000000..a2e1da101
--- /dev/null
+++ b/ports/stm/boards/thunderpack_v12/mpconfigboard.mk
@@ -0,0 +1,21 @@
+USB_VID = 0x239A
+USB_PID = 0x8071
+USB_PRODUCT = "Thunderpack STM32F411"
+USB_MANUFACTURER = "Jeremy Gillick"
+USB_DEVICES = "CDC,MSC"
+
+LONGINT_IMPL = NONE
+
+SPI_FLASH_FILESYSTEM = 1
+EXTERNAL_FLASH_DEVICE_COUNT = 1
+EXTERNAL_FLASH_DEVICES = GD25Q16C
+
+CIRCUITPY_NVM = 1
+CIRCUITPY_BLEIO_HCI = 0
+
+MCU_SERIES = F4
+MCU_VARIANT = STM32F411xE
+MCU_PACKAGE = UFQFPN48
+
+LD_COMMON = boards/common_nvm.ld
+LD_FILE = boards/STM32F411_nvm_nofs.ld
diff --git a/ports/stm/boards/thunderpack_v12/pins.c b/ports/stm/boards/thunderpack_v12/pins.c
new file mode 100644
index 000000000..1e07621ea
--- /dev/null
+++ b/ports/stm/boards/thunderpack_v12/pins.c
@@ -0,0 +1,39 @@
+#include "shared-bindings/board/__init__.h"
+
+STATIC const mp_rom_map_elem_t board_module_globals_table[] = {
+ { MP_ROM_QSTR(MP_QSTR_PA0), MP_ROM_PTR(&pin_PA00) },
+ { MP_ROM_QSTR(MP_QSTR_PA1), MP_ROM_PTR(&pin_PA01) },
+ { MP_ROM_QSTR(MP_QSTR_PA2), MP_ROM_PTR(&pin_PA02) },
+ { MP_ROM_QSTR(MP_QSTR_PA3), MP_ROM_PTR(&pin_PA03) },
+ { MP_ROM_QSTR(MP_QSTR_PA4), MP_ROM_PTR(&pin_PA04) },
+ { MP_ROM_QSTR(MP_QSTR_PA5), MP_ROM_PTR(&pin_PA05) },
+ { MP_ROM_QSTR(MP_QSTR_PA6), MP_ROM_PTR(&pin_PA06) },
+ { MP_ROM_QSTR(MP_QSTR_PA7), MP_ROM_PTR(&pin_PA07) },
+ { MP_ROM_QSTR(MP_QSTR_PA8), MP_ROM_PTR(&pin_PA08) },
+ { MP_ROM_QSTR(MP_QSTR_PA9), MP_ROM_PTR(&pin_PA09) },
+ { MP_ROM_QSTR(MP_QSTR_PA10), MP_ROM_PTR(&pin_PA10) },
+ { MP_ROM_QSTR(MP_QSTR_PA13), MP_ROM_PTR(&pin_PA13) },
+ { MP_ROM_QSTR(MP_QSTR_PA14), MP_ROM_PTR(&pin_PA14) },
+
+ { MP_ROM_QSTR(MP_QSTR_PB0), MP_ROM_PTR(&pin_PB00) },
+ { MP_ROM_QSTR(MP_QSTR_PB5), MP_ROM_PTR(&pin_PB05) },
+ { MP_ROM_QSTR(MP_QSTR_PB6), MP_ROM_PTR(&pin_PB06) },
+ { MP_ROM_QSTR(MP_QSTR_PB7), MP_ROM_PTR(&pin_PB07) },
+ { MP_ROM_QSTR(MP_QSTR_PB8), MP_ROM_PTR(&pin_PB08) },
+
+ { MP_ROM_QSTR(MP_QSTR_LED1), MP_ROM_PTR(&pin_PA00) },
+ { MP_ROM_QSTR(MP_QSTR_LED2), MP_ROM_PTR(&pin_PA01) },
+ { MP_ROM_QSTR(MP_QSTR_LED3), MP_ROM_PTR(&pin_PA02) },
+ { MP_ROM_QSTR(MP_QSTR_LED4), MP_ROM_PTR(&pin_PA03) },
+
+ { MP_ROM_QSTR(MP_QSTR_BUTTON), MP_ROM_PTR(&pin_PB04) },
+
+ { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_PB06) },
+ { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_PB07) },
+
+ { MP_ROM_QSTR(MP_QSTR_APA102_MOSI), MP_ROM_PTR(&pin_PB08) },
+ { MP_ROM_QSTR(MP_QSTR_APA102_SCK), MP_ROM_PTR(&pin_PB00) },
+
+ { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) },
+};
+MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table);
diff --git a/ports/stm/common-hal/busio/SPI.c b/ports/stm/common-hal/busio/SPI.c
index 29fbdee56..20ee0f6e1 100644
--- a/ports/stm/common-hal/busio/SPI.c
+++ b/ports/stm/common-hal/busio/SPI.c
@@ -32,7 +32,7 @@
#include "py/runtime.h"
#include "shared-bindings/microcontroller/__init__.h"
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "supervisor/shared/translate.h"
#include "shared-bindings/microcontroller/Pin.h"
diff --git a/ports/stm/common-hal/microcontroller/Pin.c b/ports/stm/common-hal/microcontroller/Pin.c
index 996513270..0e333c71c 100644
--- a/ports/stm/common-hal/microcontroller/Pin.c
+++ b/ports/stm/common-hal/microcontroller/Pin.c
@@ -35,6 +35,10 @@
#ifdef MICROPY_HW_NEOPIXEL
bool neopixel_in_use;
#endif
+#if defined(MICROPY_HW_APA102_MOSI) && defined(MICROPY_HW_APA102_SCK)
+bool apa102_sck_in_use;
+bool apa102_mosi_in_use;
+#endif
#if defined(TFBGA216)
GPIO_TypeDef * ports[] = {GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH, GPIOI, GPIOJ, GPIOK};
@@ -66,6 +70,10 @@ void reset_all_pins(void) {
#ifdef MICROPY_HW_NEOPIXEL
neopixel_in_use = false;
#endif
+ #if defined(MICROPY_HW_APA102_MOSI) && defined(MICROPY_HW_APA102_SCK)
+ apa102_sck_in_use = false;
+ apa102_mosi_in_use = false;
+ #endif
}
// Mark pin as free and return it to a quiescent state.
@@ -89,6 +97,18 @@ void reset_pin_number(uint8_t pin_port, uint8_t pin_number) {
return;
}
#endif
+ #if defined(MICROPY_HW_APA102_MOSI) && defined(MICROPY_HW_APA102_SCK)
+ if (
+ (pin_port == MICROPY_HW_APA102_MOSI->port && pin_number == MICROPY_HW_APA102_MOSI->number)
+ || (pin_port == MICROPY_HW_APA102_SCK->port && pin_number == MICROPY_HW_APA102_MOSI->number)
+ )
+ {
+ apa102_mosi_in_use = false;
+ apa102_sck_in_use = false;
+ rgb_led_status_init();
+ return;
+ }
+ #endif
}
void never_reset_pin_number(uint8_t pin_port, uint8_t pin_number) {
@@ -123,6 +143,16 @@ bool common_hal_mcu_pin_is_free(const mcu_pin_obj_t *pin) {
return !neopixel_in_use;
}
#endif
+ #if defined(MICROPY_HW_APA102_MOSI) && defined(MICROPY_HW_APA102_SCK)
+ if (pin == MICROPY_HW_APA102_MOSI)
+ {
+ return !apa102_mosi_in_use;
+ }
+ if (pin == MICROPY_HW_APA102_SCK)
+ {
+ return !apa102_sck_in_use;
+ }
+ #endif
return pin_number_is_free(pin->port, pin->number);
}
@@ -146,6 +176,16 @@ void common_hal_mcu_pin_claim(const mcu_pin_obj_t* pin) {
neopixel_in_use = true;
}
#endif
+ #if defined(MICROPY_HW_APA102_MOSI) && defined(MICROPY_HW_APA102_SCK)
+ if (pin == MICROPY_HW_APA102_MOSI)
+ {
+ apa102_mosi_in_use = true;
+ }
+ if (pin == MICROPY_HW_APA102_SCK)
+ {
+ apa102_sck_in_use = true;
+ }
+ #endif
}
void common_hal_mcu_pin_reset_number(uint8_t pin_no) {
diff --git a/ports/stm/common-hal/microcontroller/Processor.c b/ports/stm/common-hal/microcontroller/Processor.c
index 8dc968b36..dd04c56dc 100644
--- a/ports/stm/common-hal/microcontroller/Processor.c
+++ b/ports/stm/common-hal/microcontroller/Processor.c
@@ -25,9 +25,12 @@
*/
#include <math.h>
-#include "common-hal/microcontroller/Processor.h"
#include "py/runtime.h"
+
+#include "common-hal/microcontroller/Processor.h"
+#include "shared-bindings/microcontroller/ResetReason.h"
#include "supervisor/shared/translate.h"
+
#include STM32_HAL_H
#if CPY_STM32F4
@@ -138,3 +141,7 @@ void common_hal_mcu_processor_get_uid(uint8_t raw_id[]) {
}
#endif
}
+
+mcu_reset_reason_t common_hal_mcu_processor_get_reset_reason(void) {
+ return RESET_REASON_UNKNOWN;
+}
diff --git a/ports/stm/common-hal/nvm/ByteArray.c b/ports/stm/common-hal/nvm/ByteArray.c
index 462d3aa9d..b7a1ff035 100644
--- a/ports/stm/common-hal/nvm/ByteArray.c
+++ b/ports/stm/common-hal/nvm/ByteArray.c
@@ -48,7 +48,7 @@ bool common_hal_nvm_bytearray_set_bytes(nvm_bytearray_obj_t *self,
// Erase flash sector
HAL_FLASH_Unlock();
- __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR );
+ __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR );
FLASH_Erase_Sector(CIRCUITPY_INTERNAL_NVM_SECTOR, VOLTAGE_RANGE_3);
// Write bytes to flash
diff --git a/ports/stm/common-hal/rgbmatrix/RGBMatrix.h b/ports/stm/common-hal/rgbmatrix/RGBMatrix.h
index 48de4dcb2..323878d20 100644
--- a/ports/stm/common-hal/rgbmatrix/RGBMatrix.h
+++ b/ports/stm/common-hal/rgbmatrix/RGBMatrix.h
@@ -24,8 +24,8 @@
* THE SOFTWARE.
*/
-#ifndef MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_RGBMATRIX_RGBMATRIX_H
-#define MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_RGBMATRIX_RGBMATRIX_H
+#ifndef MICROPY_INCLUDED_STM_COMMON_HAL_RGBMATRIX_RGBMATRIX_H
+#define MICROPY_INCLUDED_STM_COMMON_HAL_RGBMATRIX_RGBMATRIX_H
void *common_hal_rgbmatrix_timer_allocate(void);
void common_hal_rgbmatrix_timer_enable(void*);
diff --git a/ports/stm/common-hal/sdioio/SDCard.c b/ports/stm/common-hal/sdioio/SDCard.c
index 5f6010f01..de0e8d111 100644
--- a/ports/stm/common-hal/sdioio/SDCard.c
+++ b/ports/stm/common-hal/sdioio/SDCard.c
@@ -31,7 +31,7 @@
#include "shared-bindings/microcontroller/__init__.h"
#include "shared-bindings/util.h"
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "supervisor/shared/translate.h"
#include "common-hal/microcontroller/Pin.h"
#include "shared-bindings/microcontroller/Pin.h"
diff --git a/ports/stm/supervisor/internal_flash.h b/ports/stm/supervisor/internal_flash.h
index ad5cba62d..19ae03e0b 100644
--- a/ports/stm/supervisor/internal_flash.h
+++ b/ports/stm/supervisor/internal_flash.h
@@ -41,8 +41,12 @@
#ifdef STM32F411xE
#define STM32_FLASH_SIZE 0x80000 //512KiB
-#define INTERNAL_FLASH_FILESYSTEM_SIZE 0xC000 //48KiB
-#define INTERNAL_FLASH_FILESYSTEM_START_ADDR 0x08004000
+#ifndef INTERNAL_FLASH_FILESYSTEM_SIZE
+ #define INTERNAL_FLASH_FILESYSTEM_SIZE 0xC000 //48KiB
+#endif
+#ifndef INTERNAL_FLASH_FILESYSTEM_START_ADDR
+ #define INTERNAL_FLASH_FILESYSTEM_START_ADDR 0x08004000
+#endif
#endif
#ifdef STM32F412Zx
diff --git a/ports/stm/supervisor/port.c b/ports/stm/supervisor/port.c
index a8aab00ff..3103a0716 100644
--- a/ports/stm/supervisor/port.c
+++ b/ports/stm/supervisor/port.c
@@ -27,7 +27,7 @@
#include <stdint.h>
#include "supervisor/port.h"
-#include "boards/board.h"
+#include "supervisor/board.h"
#include "lib/timeutils/timeutils.h"
#include "common-hal/microcontroller/Pin.h"
@@ -267,8 +267,8 @@ uint32_t *port_heap_get_top(void) {
return &_ld_heap_end;
}
-supervisor_allocation* port_fixed_stack(void) {
- return NULL;
+bool port_has_fixed_stack(void) {
+ return false;
}
uint32_t *port_stack_get_limit(void) {
@@ -436,7 +436,7 @@ void port_interrupt_after_ticks(uint32_t ticks) {
alarmed_already = false;
}
-void port_sleep_until_interrupt(void) {
+void port_idle_until_interrupt(void) {
// Clear the FPU interrupt because it can prevent us from sleeping.
if (__get_FPSCR() & ~(0x9f)) {
__set_FPSCR(__get_FPSCR() & ~(0x9f));
diff --git a/ports/unix/modjni.c b/ports/unix/modjni.c
index 8ec5ae54d..82d1ccd55 100644
--- a/ports/unix/modjni.c
+++ b/ports/unix/modjni.c
@@ -102,9 +102,9 @@ STATIC void check_exception(void) {
mp_obj_t py_e = new_jobject(exc);
JJ1(ExceptionClear);
if (JJ(IsInstanceOf, exc, IndexException_class)) {
- nlr_raise(mp_obj_new_exception_arg1(&mp_type_IndexError, py_e));
+ mp_raise_arg1(&mp_type_IndexError, py_e);
}
- nlr_raise(mp_obj_new_exception_arg1(&mp_type_Exception, py_e));
+ mp_raise_arg1(&mp_type_Exception, py_e);
}
}
diff --git a/py/argcheck.c b/py/argcheck.c
index 9341c02a6..af5c81bf3 100644
--- a/py/argcheck.c
+++ b/py/argcheck.c
@@ -99,12 +99,12 @@ void mp_arg_parse_all(size_t n_pos, const mp_obj_t *pos, mp_map_t *kws, size_t n
mp_map_elem_t *kw = mp_map_lookup(kws, MP_OBJ_NEW_QSTR(allowed[i].qst), MP_MAP_LOOKUP);
if (kw == NULL) {
if (allowed[i].flags & MP_ARG_REQUIRED) {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_arg_error_terse_mismatch();
- } else {
+ #else
mp_raise_TypeError_varg(
translate("'%q' argument required"), allowed[i].qst);
- }
+ #endif
}
out_vals[i] = allowed[i].defval;
continue;
@@ -124,20 +124,20 @@ void mp_arg_parse_all(size_t n_pos, const mp_obj_t *pos, mp_map_t *kws, size_t n
}
if (pos_found < n_pos) {
extra_positional:
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_arg_error_terse_mismatch();
- } else {
+ #else
// TODO better error message
mp_raise_TypeError(translate("extra positional arguments given"));
- }
+ #endif
}
if (kws_found < kws->used) {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_arg_error_terse_mismatch();
- } else {
+ #else
// TODO better error message
mp_raise_TypeError(translate("extra keyword arguments given"));
- }
+ #endif
}
}
diff --git a/py/bc.c b/py/bc.c
index 640671338..01131cb4c 100644
--- a/py/bc.c
+++ b/py/bc.c
@@ -214,8 +214,8 @@ void mp_setup_code_state(mp_code_state_t *code_state, size_t n_args, size_t n_kw
#if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_TypeError(translate("unexpected keyword argument"));
#else
- nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
- translate("unexpected keyword argument '%q'"), MP_OBJ_QSTR_VALUE(wanted_arg_name)));
+ mp_raise_TypeError_varg(
+ translate("unexpected keyword argument '%q'"), MP_OBJ_QSTR_VALUE(wanted_arg_name));
#endif
}
mp_obj_dict_store(dict, kwargs[2 * i], kwargs[2 * i + 1]);
diff --git a/py/builtinimport.c b/py/builtinimport.c
index 47ffab519..c4768cc77 100644
--- a/py/builtinimport.c
+++ b/py/builtinimport.c
@@ -426,12 +426,12 @@ mp_obj_t mp_builtin___import__(size_t n_args, const mp_obj_t *args) {
mp_module_call_init(mod_name, module_obj);
} else {
// couldn't find the file, so fail
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_ImportError(translate("module not found"));
- } else {
+ #else
mp_raise_msg_varg(&mp_type_ImportError,
translate("no module named '%q'"), mod_name);
- }
+ #endif
}
} else {
// found the file, so get the module
@@ -538,12 +538,12 @@ mp_obj_t mp_builtin___import__(size_t n_args, const mp_obj_t *args) {
#endif
// Couldn't find the module, so fail
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_msg(&mp_type_ImportError, translate("module not found"));
- } else {
+ #else
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ImportError,
translate("no module named '%q'"), module_name_qstr));
- }
+ #endif
}
#endif // MICROPY_ENABLE_EXTERNAL_IMPORT
diff --git a/py/circuitpy_defns.mk b/py/circuitpy_defns.mk
index ccdf973e9..e9253682e 100644
--- a/py/circuitpy_defns.mk
+++ b/py/circuitpy_defns.mk
@@ -99,6 +99,9 @@ endif
ifeq ($(CIRCUITPY_AESIO),1)
SRC_PATTERNS += aesio/%
endif
+ifeq ($(CIRCUITPY_ALARM),1)
+SRC_PATTERNS += alarm/%
+endif
ifeq ($(CIRCUITPY_ANALOGIO),1)
SRC_PATTERNS += analogio/%
endif
@@ -133,6 +136,9 @@ endif
ifeq ($(CIRCUITPY_BOARD),1)
SRC_PATTERNS += board/%
endif
+ifeq ($(CIRCUITPY_BUSDEVICE),1)
+SRC_PATTERNS += adafruit_bus_device/%
+endif
ifeq ($(CIRCUITPY_BUSIO),1)
SRC_PATTERNS += busio/% bitbangio/OneWire.%
endif
@@ -298,6 +304,9 @@ SRC_COMMON_HAL_ALL = \
_bleio/__init__.c \
_pew/PewPew.c \
_pew/__init__.c \
+ alarm/__init__.c \
+ alarm/pin/PinAlarm.c \
+ alarm/time/TimeAlarm.c \
analogio/AnalogIn.c \
analogio/AnalogOut.c \
analogio/__init__.c \
@@ -387,15 +396,17 @@ $(filter $(SRC_PATTERNS), \
_bleio/Address.c \
_bleio/Attribute.c \
_bleio/ScanEntry.c \
- canio/Match.c \
_eve/__init__.c \
camera/ImageFormat.c \
+ canio/Match.c \
digitalio/Direction.c \
digitalio/DriveMode.c \
digitalio/Pull.c \
fontio/Glyph.c \
math/__init__.c \
+ microcontroller/ResetReason.c \
microcontroller/RunMode.c \
+ supervisor/RunReason.c \
)
SRC_BINDINGS_ENUMS += \
@@ -406,9 +417,6 @@ SRC_SHARED_MODULE_ALL = \
_bleio/Attribute.c \
_bleio/ScanEntry.c \
_bleio/ScanResults.c \
- canio/Match.c \
- canio/Message.c \
- canio/RemoteTransmissionRequest.c \
_eve/__init__.c \
_pixelbuf/PixelBuf.c \
_pixelbuf/__init__.c \
@@ -432,7 +440,13 @@ SRC_SHARED_MODULE_ALL = \
bitbangio/SPI.c \
bitbangio/__init__.c \
board/__init__.c \
+ adafruit_bus_device/__init__.c \
+ adafruit_bus_device/I2CDevice.c \
+ adafruit_bus_device/SPIDevice.c \
busio/OneWire.c \
+ canio/Match.c \
+ canio/Message.c \
+ canio/RemoteTransmissionRequest.c \
displayio/Bitmap.c \
displayio/ColorConverter.c \
displayio/Display.c \
diff --git a/py/circuitpy_mpconfig.h b/py/circuitpy_mpconfig.h
index 85e152670..0bd889ccd 100644
--- a/py/circuitpy_mpconfig.h
+++ b/py/circuitpy_mpconfig.h
@@ -184,11 +184,13 @@ typedef long mp_off_t;
// Turning off FULL_BUILD removes some functionality to reduce flash size on tiny SAMD21s
#define MICROPY_BUILTIN_METHOD_CHECK_SELF_ARG (CIRCUITPY_FULL_BUILD)
#define MICROPY_CPYTHON_COMPAT (CIRCUITPY_FULL_BUILD)
-#define MICROPY_PY_BUILTINS_POW3 (CIRCUITPY_FULL_BUILD)
+#define MICROPY_PY_BUILTINS_POW3 (CIRCUITPY_BUILTINS_POW3)
#define MICROPY_COMP_FSTRING_LITERAL (MICROPY_CPYTHON_COMPAT)
#define MICROPY_MODULE_WEAK_LINKS (0)
#define MICROPY_PY_ALL_SPECIAL_METHODS (CIRCUITPY_FULL_BUILD)
+#ifndef MICROPY_PY_BUILTINS_COMPLEX
#define MICROPY_PY_BUILTINS_COMPLEX (CIRCUITPY_FULL_BUILD)
+#endif
#define MICROPY_PY_BUILTINS_FROZENSET (CIRCUITPY_FULL_BUILD)
#define MICROPY_PY_BUILTINS_STR_CENTER (CIRCUITPY_FULL_BUILD)
#define MICROPY_PY_BUILTINS_STR_PARTITION (CIRCUITPY_FULL_BUILD)
@@ -243,6 +245,13 @@ extern const struct _mp_obj_module_t aesio_module;
#define AESIO_MODULE
#endif
+#if CIRCUITPY_ALARM
+extern const struct _mp_obj_module_t alarm_module;
+#define ALARM_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_alarm), (mp_obj_t)&alarm_module },
+#else
+#define ALARM_MODULE
+#endif
+
#if CIRCUITPY_ANALOGIO
#define ANALOGIO_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_analogio), (mp_obj_t)&analogio_module },
extern const struct _mp_obj_module_t analogio_module;
@@ -327,6 +336,13 @@ extern const struct _mp_obj_module_t board_module;
#define BOARD_UART_ROOT_POINTER
#endif
+#if CIRCUITPY_BUSDEVICE
+extern const struct _mp_obj_module_t adafruit_bus_device_module;
+#define BUSDEVICE_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_adafruit_bus_device), (mp_obj_t)&adafruit_bus_device_module },
+#else
+#define BUSDEVICE_MODULE
+#endif
+
#if CIRCUITPY_BUSIO
extern const struct _mp_obj_module_t busio_module;
#define BUSIO_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_busio), (mp_obj_t)&busio_module },
@@ -607,7 +623,6 @@ extern const struct _mp_obj_module_t sdioio_module;
#define SDIOIO_MODULE
#endif
-
#if CIRCUITPY_SHARPDISPLAY
extern const struct _mp_obj_module_t sharpdisplay_module;
#define SHARPDISPLAY_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_sharpdisplay),(mp_obj_t)&sharpdisplay_module },
@@ -772,6 +787,7 @@ extern const struct _mp_obj_module_t wifi_module;
// Some are omitted because they're in MICROPY_PORT_BUILTIN_MODULE_WEAK_LINKS above.
#define MICROPY_PORT_BUILTIN_MODULES_STRONG_LINKS \
AESIO_MODULE \
+ ALARM_MODULE \
ANALOGIO_MODULE \
AUDIOBUSIO_MODULE \
AUDIOCORE_MODULE \
@@ -783,6 +799,7 @@ extern const struct _mp_obj_module_t wifi_module;
BITBANGIO_MODULE \
BLEIO_MODULE \
BOARD_MODULE \
+ BUSDEVICE_MODULE \
BUSIO_MODULE \
CAMERA_MODULE \
CANIO_MODULE \
@@ -858,17 +875,20 @@ extern const struct _mp_obj_module_t wifi_module;
#include "supervisor/flash_root_pointers.h"
+// From supervisor/memory.c
+struct _supervisor_allocation_node;
+
#define CIRCUITPY_COMMON_ROOT_POINTERS \
const char *readline_hist[8]; \
vstr_t *repl_line; \
mp_obj_t rtc_time_source; \
GAMEPAD_ROOT_POINTERS \
mp_obj_t pew_singleton; \
- mp_obj_t terminal_tilegrid_tiles; \
BOARD_UART_ROOT_POINTER \
FLASH_ROOT_POINTERS \
MEMORYMONITOR_ROOT_POINTERS \
NETWORK_ROOT_POINTERS \
+ struct _supervisor_allocation_node* first_embedded_allocation; \
void supervisor_run_background_tasks_if_tick(void);
#define RUN_BACKGROUND_TASKS (supervisor_run_background_tasks_if_tick())
@@ -892,6 +912,12 @@ void supervisor_run_background_tasks_if_tick(void);
#define CIRCUITPY_PYSTACK_SIZE 1536
#endif
+
+// Wait this long imediately after startup to see if we are connected to USB.
+#ifndef CIRCUITPY_USB_CONNECTED_SLEEP_DELAY
+#define CIRCUITPY_USB_CONNECTED_SLEEP_DELAY 5
+#endif
+
#define CIRCUITPY_BOOT_OUTPUT_FILE "/boot_out.txt"
#define CIRCUITPY_VERBOSE_BLE 0
diff --git a/py/circuitpy_mpconfig.mk b/py/circuitpy_mpconfig.mk
index a6aabec33..370f13373 100644
--- a/py/circuitpy_mpconfig.mk
+++ b/py/circuitpy_mpconfig.mk
@@ -39,6 +39,12 @@ CFLAGS += -DMICROPY_PY_ASYNC_AWAIT=$(MICROPY_PY_ASYNC_AWAIT)
CIRCUITPY_AESIO ?= 0
CFLAGS += -DCIRCUITPY_AESIO=$(CIRCUITPY_AESIO)
+# TODO: CIRCUITPY_ALARM will gradually be added to
+# as many ports as possible
+# so make this 1 or CIRCUITPY_FULL_BUILD eventually
+CIRCUITPY_ALARM ?= 0
+CFLAGS += -DCIRCUITPY_ALARM=$(CIRCUITPY_ALARM)
+
CIRCUITPY_ANALOGIO ?= 1
CFLAGS += -DCIRCUITPY_ANALOGIO=$(CIRCUITPY_ANALOGIO)
@@ -90,6 +96,12 @@ CFLAGS += -DCIRCUITPY_BLEIO=$(CIRCUITPY_BLEIO)
CIRCUITPY_BOARD ?= 1
CFLAGS += -DCIRCUITPY_BOARD=$(CIRCUITPY_BOARD)
+CIRCUITPY_BUSDEVICE ?= $(CIRCUITPY_FULL_BUILD)
+CFLAGS += -DCIRCUITPY_BUSDEVICE=$(CIRCUITPY_BUSDEVICE)
+
+CIRCUITPY_BUILTINS_POW3 ?= $(CIRCUITPY_FULL_BUILD)
+CFLAGS += -DCIRCUITPY_BUILTINS_POW3=$(CIRCUITPY_BUILTINS_POW3)
+
CIRCUITPY_BUSIO ?= 1
CFLAGS += -DCIRCUITPY_BUSIO=$(CIRCUITPY_BUSIO)
diff --git a/py/compile.c b/py/compile.c
index 04bcf5bc1..b4d81ed44 100644
--- a/py/compile.c
+++ b/py/compile.c
@@ -2486,21 +2486,21 @@ STATIC void compile_atom_brace(compiler_t *comp, mp_parse_node_struct_t *pns) {
compile_node(comp, pn_i);
if (is_dict) {
if (!is_key_value) {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
compile_syntax_error(comp, (mp_parse_node_t)pns, translate("invalid syntax"));
- } else {
+ #else
compile_syntax_error(comp, (mp_parse_node_t)pns, translate("expecting key:value for dict"));
- }
+ #endif
return;
}
EMIT(store_map);
} else {
if (is_key_value) {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
compile_syntax_error(comp, (mp_parse_node_t)pns, translate("invalid syntax"));
- } else {
+ #else
compile_syntax_error(comp, (mp_parse_node_t)pns, translate("expecting just a value for set"));
- }
+ #endif
return;
}
}
diff --git a/py/enum.h b/py/enum.h
index 1c38ae5ae..708678eb6 100644
--- a/py/enum.h
+++ b/py/enum.h
@@ -35,12 +35,12 @@ typedef struct {
} cp_enum_obj_t;
#define MAKE_ENUM_VALUE(type, prefix, name, value) \
- STATIC const cp_enum_obj_t prefix ## _ ## name ## _obj = { \
+ const cp_enum_obj_t prefix ## _ ## name ## _obj = { \
{ &type }, value, MP_QSTR_ ## name, \
}
#define MAKE_ENUM_MAP(name) \
- STATIC const mp_rom_map_elem_t name ## _locals_table[] =
+ const mp_rom_map_elem_t name ## _locals_table[] =
#define MAKE_ENUM_MAP_ENTRY(prefix, name) \
{ MP_ROM_QSTR(MP_QSTR_ ## name), MP_ROM_PTR(&prefix ## _ ## name ## _obj) }
diff --git a/py/genlast.py b/py/genlast.py
index 1df2a2482..5b195d23e 100644
--- a/py/genlast.py
+++ b/py/genlast.py
@@ -47,7 +47,9 @@ def preprocess(command, output_dir, fn):
print(e, file=sys.stderr)
def maybe_preprocess(command, output_dir, fn):
- if subprocess.call(["grep", "-lqE", "(MP_QSTR|translate)", fn]) == 0:
+ # Preprocess the source file if it contains "MP_QSTR", "translate",
+ # or if it uses enum.h (which generates "MP_QSTR" strings.
+ if subprocess.call(["grep", "-lqE", r"(MP_QSTR|translate|enum\.h)", fn]) == 0:
preprocess(command, output_dir, fn)
if __name__ == '__main__':
diff --git a/py/modbuiltins.c b/py/modbuiltins.c
index 41e1d4e48..fe3c366ee 100644
--- a/py/modbuiltins.c
+++ b/py/modbuiltins.c
@@ -346,12 +346,12 @@ STATIC mp_obj_t mp_builtin_ord(mp_obj_t o_in) {
}
}
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_TypeError(translate("ord expects a character"));
- } else {
+ #else
mp_raise_TypeError_varg(
translate("ord() expected a character, but string of length %d found"), (int)len);
- }
+ #endif
}
MP_DEFINE_CONST_FUN_OBJ_1(mp_builtin_ord_obj, mp_builtin_ord);
diff --git a/py/modsys.c b/py/modsys.c
index a1d2cf831..81628683d 100644
--- a/py/modsys.c
+++ b/py/modsys.c
@@ -92,13 +92,11 @@ STATIC const MP_DEFINE_STR_OBJ(platform_obj, MICROPY_PY_SYS_PLATFORM);
// exit([retval]): raise SystemExit, with optional argument given to the exception
STATIC mp_obj_t mp_sys_exit(size_t n_args, const mp_obj_t *args) {
- mp_obj_t exc;
if (n_args == 0) {
- exc = mp_obj_new_exception(&mp_type_SystemExit);
+ nlr_raise(mp_obj_new_exception(&mp_type_SystemExit));
} else {
- exc = mp_obj_new_exception_arg1(&mp_type_SystemExit, args[0]);
+ mp_raise_arg1(&mp_type_SystemExit, args[0]);
}
- nlr_raise(exc);
}
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_sys_exit_obj, 0, 1, mp_sys_exit);
diff --git a/py/obj.c b/py/obj.c
index 9dc0cf474..d8e34746c 100644
--- a/py/obj.c
+++ b/py/obj.c
@@ -125,6 +125,7 @@ void mp_obj_print_exception(const mp_print_t *print, mp_obj_t exc) {
mp_printf(print, decompressed_block, block);
}
}
+ mp_obj_exception_clear_traceback(exc);
}
}
mp_obj_print_helper(print, exc, PRINT_EXC);
@@ -261,12 +262,12 @@ mp_int_t mp_obj_get_int(mp_const_obj_t arg) {
} else if (MP_OBJ_IS_TYPE(arg, &mp_type_int)) {
return mp_obj_int_get_checked(arg);
} else {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_TypeError_varg(translate("can't convert to %q"), MP_QSTR_int);
- } else {
+ #else
mp_raise_TypeError_varg(
translate("can't convert %q to %q"), mp_obj_get_type_qstr(arg), MP_QSTR_int);
- }
+ #endif
}
}
@@ -324,12 +325,12 @@ mp_float_t mp_obj_get_float(mp_obj_t arg) {
mp_float_t val;
if (!mp_obj_get_float_maybe(arg, &val)) {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_TypeError_varg(translate("can't convert to %q"), MP_QSTR_float);
- } else {
+ #else
mp_raise_TypeError_varg(
translate("can't convert %q to %q"), mp_obj_get_type_qstr(arg), MP_QSTR_float);
- }
+ #endif
}
return val;
@@ -357,12 +358,12 @@ void mp_obj_get_complex(mp_obj_t arg, mp_float_t *real, mp_float_t *imag) {
} else if (MP_OBJ_IS_TYPE(arg, &mp_type_complex)) {
mp_obj_complex_get(arg, real, imag);
} else {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_TypeError_varg(translate("can't convert to %q"), MP_QSTR_complex);
- } else {
+ #else
mp_raise_TypeError_varg(
translate("can't convert %q to %q"), mp_obj_get_type_qstr(arg), MP_QSTR_complex);
- }
+ #endif
}
}
#endif
@@ -375,12 +376,12 @@ void mp_obj_get_array(mp_obj_t o, size_t *len, mp_obj_t **items) {
} else if (MP_OBJ_IS_TYPE(o, &mp_type_list)) {
mp_obj_list_get(o, len, items);
} else {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_TypeError(translate("expected tuple/list"));
- } else {
+ #else
mp_raise_TypeError_varg(
translate("object '%q' is not a tuple or list"), mp_obj_get_type_qstr(o));
- }
+ #endif
}
}
@@ -389,12 +390,12 @@ 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) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_ValueError(translate("tuple/list has wrong length"));
- } else {
+ #else
mp_raise_ValueError_varg(translate("requested length %d but object has length %d"),
(int)len, (int)seq_len);
- }
+ #endif
}
}
@@ -404,13 +405,13 @@ 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) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_TypeError(translate("indices must be integers"));
- } else {
+ #else
mp_raise_TypeError_varg(
translate("%q indices must be integers, not %q"),
type->name, mp_obj_get_type_qstr(index));
- }
+ #endif
}
if (i < 0) {
@@ -424,12 +425,12 @@ size_t mp_get_index(const mp_obj_type_t *type, size_t len, mp_obj_t index, bool
}
} else {
if (i < 0 || (mp_uint_t)i >= len) {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_IndexError(translate("index out of range"));
- } else {
+ #else
mp_raise_msg_varg(&mp_type_IndexError,
translate("%q index out of range"), type->name);
- }
+ #endif
}
}
@@ -459,12 +460,12 @@ mp_obj_t mp_obj_id(mp_obj_t o_in) {
mp_obj_t mp_obj_len(mp_obj_t o_in) {
mp_obj_t len = mp_obj_len_maybe(o_in);
if (len == MP_OBJ_NULL) {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_TypeError(translate("object has no len"));
- } else {
+ #else
mp_raise_TypeError_varg(
translate("object of type '%q' has no len()"), mp_obj_get_type_qstr(o_in));
- }
+ #endif
} else {
return len;
}
@@ -502,26 +503,26 @@ mp_obj_t mp_obj_subscr(mp_obj_t base, mp_obj_t index, mp_obj_t value) {
}
}
if (value == MP_OBJ_NULL) {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_TypeError(translate("object does not support item deletion"));
- } else {
+ #else
mp_raise_TypeError_varg(
translate("'%q' object does not support item deletion"), mp_obj_get_type_qstr(base));
- }
+ #endif
} else if (value == MP_OBJ_SENTINEL) {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_TypeError(translate("object is not subscriptable"));
- } else {
+ #else
mp_raise_TypeError_varg(
translate("'%q' object is not subscriptable"), mp_obj_get_type_qstr(base));
- }
+ #endif
} else {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_TypeError(translate("object does not support item assignment"));
- } else {
+ #else
mp_raise_TypeError_varg(
translate("'%q' object does not support item assignment"), mp_obj_get_type_qstr(base));
- }
+ #endif
}
}
diff --git a/py/obj.h b/py/obj.h
index 805b26e48..066562cc4 100644
--- a/py/obj.h
+++ b/py/obj.h
@@ -640,6 +640,10 @@ extern const mp_obj_type_t mp_type_UnicodeError;
extern const mp_obj_type_t mp_type_ValueError;
extern const mp_obj_type_t mp_type_ViperTypeError;
extern const mp_obj_type_t mp_type_ZeroDivisionError;
+#if CIRCUITPY_ALARM
+extern const mp_obj_type_t mp_type_DeepSleepRequest;
+#endif
+
// Constant objects, globally accessible
// The macros are for convenience only
@@ -679,6 +683,7 @@ mp_obj_t mp_obj_new_bytearray_by_ref(size_t n, void *items);
#if MICROPY_PY_BUILTINS_FLOAT
mp_obj_t mp_obj_new_int_from_float(mp_float_t val);
mp_obj_t mp_obj_new_complex(mp_float_t real, mp_float_t imag);
+extern mp_float_t uint64_to_float(uint64_t ui64);
#endif
mp_obj_t mp_obj_new_exception(const mp_obj_type_t *exc_type);
mp_obj_t mp_obj_new_exception_arg1(const mp_obj_type_t *exc_type, mp_obj_t arg);
diff --git a/py/objdict.c b/py/objdict.c
index 63fd86f35..098aec5d2 100644
--- a/py/objdict.c
+++ b/py/objdict.c
@@ -169,7 +169,7 @@ mp_obj_t mp_obj_dict_get(mp_obj_t self_in, mp_obj_t index) {
mp_obj_dict_t *self = MP_OBJ_TO_PTR(self_in);
mp_map_elem_t *elem = mp_map_lookup(&self->map, index, MP_MAP_LOOKUP);
if (elem == NULL) {
- nlr_raise(mp_obj_new_exception_arg1(&mp_type_KeyError, index));
+ mp_raise_arg1(&mp_type_KeyError, index);
} else {
return elem->value;
}
@@ -185,7 +185,7 @@ STATIC mp_obj_t dict_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
mp_obj_dict_t *self = MP_OBJ_TO_PTR(self_in);
mp_map_elem_t *elem = mp_map_lookup(&self->map, index, MP_MAP_LOOKUP);
if (elem == NULL) {
- nlr_raise(mp_obj_new_exception_arg1(&mp_type_KeyError, index));
+ mp_raise_arg1(&mp_type_KeyError, index);
} else {
return elem->value;
}
@@ -272,7 +272,7 @@ STATIC mp_obj_t dict_get_helper(size_t n_args, const mp_obj_t *args, mp_map_look
if (elem == NULL || elem->value == MP_OBJ_NULL) {
if (n_args == 2) {
if (lookup_kind == MP_MAP_LOOKUP_REMOVE_IF_FOUND) {
- nlr_raise(mp_obj_new_exception_arg1(&mp_type_KeyError, args[1]));
+ mp_raise_arg1(&mp_type_KeyError, args[1]);
} else {
value = mp_const_none;
}
diff --git a/py/objexcept.c b/py/objexcept.c
index 01ba6da9c..afefee2ca 100644
--- a/py/objexcept.c
+++ b/py/objexcept.c
@@ -319,6 +319,9 @@ MP_DEFINE_EXCEPTION(Exception, BaseException)
MP_DEFINE_EXCEPTION(UnicodeError, ValueError)
//TODO: Implement more UnicodeError subclasses which take arguments
#endif
+#if CIRCUITPY_ALARM
+ MP_DEFINE_EXCEPTION(DeepSleepRequest, BaseException)
+#endif
MP_DEFINE_EXCEPTION(MpyError, ValueError)
/*
MP_DEFINE_EXCEPTION(Warning, Exception)
diff --git a/py/objfloat.c b/py/objfloat.c
index 59f1eb2f6..80f10e816 100644
--- a/py/objfloat.c
+++ b/py/objfloat.c
@@ -333,6 +333,13 @@ mp_obj_t mp_obj_float_binary_op(mp_binary_op_t op, mp_float_t lhs_val, mp_obj_t
return mp_obj_new_float(lhs_val);
}
+// Convert a uint64_t to a 32-bit float without invoking the double-precision math routines,
+// which are large.
+mp_float_t uint64_to_float(uint64_t ui64) {
+ // 4294967296 = 2^32
+ return (mp_float_t) ((uint32_t) (ui64 >> 32) * 4294967296.0f + (uint32_t) (ui64 & 0xffffffff));
+}
+
#pragma GCC diagnostic pop
#endif // MICROPY_PY_BUILTINS_FLOAT
diff --git a/py/objnamedtuple.c b/py/objnamedtuple.c
index ab2f2f3c0..8b595da57 100644
--- a/py/objnamedtuple.c
+++ b/py/objnamedtuple.c
@@ -102,17 +102,17 @@ mp_obj_t namedtuple_make_new(const mp_obj_type_t *type_in, size_t n_args, const
n_kw = kw_args->used;
}
if (n_args + n_kw != num_fields) {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_arg_error_terse_mismatch();
- } else if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_NORMAL) {
+ #elif MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_NORMAL
mp_raise_TypeError_varg(
translate("function takes %d positional arguments but %d were given"),
num_fields, n_args + n_kw);
- } else if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_DETAILED) {
+ #else
mp_raise_TypeError_varg(
translate("%q() takes %d positional arguments but %d were given"),
type->base.name, num_fields, n_args + n_kw);
- }
+ #endif
}
// Create a tuple and set the type to this namedtuple
@@ -128,20 +128,20 @@ mp_obj_t namedtuple_make_new(const mp_obj_type_t *type_in, size_t n_args, const
qstr kw = mp_obj_str_get_qstr(kw_args->table[i].key);
size_t id = mp_obj_namedtuple_find_field(type, kw);
if (id == (size_t)-1) {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_arg_error_terse_mismatch();
- } else {
+ #else
mp_raise_TypeError_varg(
translate("unexpected keyword argument '%q'"), kw);
- }
+ #endif
}
if (tuple->items[id] != MP_OBJ_NULL) {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_arg_error_terse_mismatch();
- } else {
+ #else
mp_raise_TypeError_varg(
translate("function got multiple values for argument '%q'"), kw);
- }
+ #endif
}
tuple->items[id] = kw_args->table[i].value;
}
diff --git a/py/objset.c b/py/objset.c
index 45b5c1260..c5d54aede 100644
--- a/py/objset.c
+++ b/py/objset.c
@@ -378,7 +378,7 @@ STATIC mp_obj_t set_remove(mp_obj_t self_in, mp_obj_t item) {
check_set(self_in);
mp_obj_set_t *self = MP_OBJ_TO_PTR(self_in);
if (mp_set_lookup(&self->set, item, MP_MAP_LOOKUP_REMOVE_IF_FOUND) == MP_OBJ_NULL) {
- nlr_raise(mp_obj_new_exception_arg1(&mp_type_KeyError, item));
+ mp_raise_arg1(&mp_type_KeyError, item);
}
return mp_const_none;
}
diff --git a/py/objstr.c b/py/objstr.c
index edb562df2..1a59aeaec 100644
--- a/py/objstr.c
+++ b/py/objstr.c
@@ -971,11 +971,11 @@ STATIC vstr_t mp_obj_str_format_helper(const char *str, const char *top, int *ar
vstr_add_byte(&vstr, '}');
continue;
}
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
terse_str_format_value_error();
- } else {
+ #else
mp_raise_ValueError(translate("single '}' encountered in format string"));
- }
+ #endif
}
if (*str != '{') {
vstr_add_byte(&vstr, *str);
@@ -1010,18 +1010,18 @@ STATIC vstr_t mp_obj_str_format_helper(const char *str, const char *top, int *ar
if (str < top && (*str == 'r' || *str == 's')) {
conversion = *str++;
} else {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
terse_str_format_value_error();
- } else if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_NORMAL) {
+ #elif MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_NORMAL
mp_raise_ValueError(translate("bad conversion specifier"));
- } else {
+ #else
if (str >= top) {
mp_raise_ValueError(
translate("end of format while looking for conversion specifier"));
} else {
mp_raise_ValueError_varg(translate("unknown conversion specifier %c"), *str);
}
- }
+ #endif
}
}
@@ -1047,18 +1047,18 @@ STATIC vstr_t mp_obj_str_format_helper(const char *str, const char *top, int *ar
}
}
if (str >= top) {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
terse_str_format_value_error();
- } else {
+ #else
mp_raise_ValueError(translate("unmatched '{' in format"));
- }
+ #endif
}
if (*str != '}') {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
- terse_str_format_value_error();
- } else {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
+:w
+ #else
mp_raise_ValueError(translate("expected ':' after format specifier"));
- }
+ #endif
}
mp_obj_t arg = mp_const_none;
@@ -1067,12 +1067,12 @@ STATIC vstr_t mp_obj_str_format_helper(const char *str, const char *top, int *ar
int index = 0;
if (MP_LIKELY(unichar_isdigit(*field_name))) {
if (*arg_i > 0) {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
terse_str_format_value_error();
- } else {
+ #else
mp_raise_ValueError(
translate("can't switch from automatic field numbering to manual field specification"));
- }
+ #endif
}
field_name = str_to_int(field_name, field_name_top, &index);
if ((uint)index >= n_args - 1) {
@@ -1087,7 +1087,7 @@ STATIC vstr_t mp_obj_str_format_helper(const char *str, const char *top, int *ar
field_name = lookup;
mp_map_elem_t *key_elem = mp_map_lookup(kwargs, field_q, MP_MAP_LOOKUP);
if (key_elem == NULL) {
- nlr_raise(mp_obj_new_exception_arg1(&mp_type_KeyError, field_q));
+ mp_raise_arg1(&mp_type_KeyError, field_q);
}
arg = key_elem->value;
}
@@ -1096,12 +1096,12 @@ STATIC vstr_t mp_obj_str_format_helper(const char *str, const char *top, int *ar
}
} else {
if (*arg_i < 0) {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
terse_str_format_value_error();
- } else {
+ #else
mp_raise_ValueError(
translate("can't switch from manual field specification to automatic field numbering"));
- }
+ #endif
}
if ((uint)*arg_i >= n_args - 1) {
mp_raise_IndexError_varg(translate("%q index out of range"), MP_QSTR_tuple);
@@ -1189,11 +1189,11 @@ STATIC vstr_t mp_obj_str_format_helper(const char *str, const char *top, int *ar
type = *s++;
}
if (*s) {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
terse_str_format_value_error();
- } else {
+ #else
mp_raise_ValueError(translate("invalid format specifier"));
- }
+ #endif
}
vstr_clear(&format_spec_vstr);
}
@@ -1210,19 +1210,19 @@ STATIC vstr_t mp_obj_str_format_helper(const char *str, const char *top, int *ar
if (flags & (PF_FLAG_SHOW_SIGN | PF_FLAG_SPACE_SIGN)) {
if (type == 's') {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
terse_str_format_value_error();
- } else {
+ #else
mp_raise_ValueError(translate("sign not allowed in string format specifier"));
- }
+ #endif
}
if (type == 'c') {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
terse_str_format_value_error();
- } else {
+ #else
mp_raise_ValueError(
translate("sign not allowed with integer format specifier 'c'"));
- }
+ #endif
}
}
@@ -1276,13 +1276,13 @@ STATIC vstr_t mp_obj_str_format_helper(const char *str, const char *top, int *ar
break;
default:
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
terse_str_format_value_error();
- } else {
+ #else
mp_raise_ValueError_varg(
translate("unknown format code '%c' for object of type '%q'"),
type, mp_obj_get_type_qstr(arg));
- }
+ #endif
}
}
@@ -1348,24 +1348,24 @@ STATIC vstr_t mp_obj_str_format_helper(const char *str, const char *top, int *ar
#endif
default:
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
terse_str_format_value_error();
- } else {
+ #else
mp_raise_ValueError_varg(
translate("unknown format code '%c' for object of type '%q'"),
type, mp_obj_get_type_qstr(arg));
- }
+ #endif
}
} else {
// arg doesn't look like a number
if (align == '=') {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
terse_str_format_value_error();
- } else {
+ #else
mp_raise_ValueError(
translate("'=' alignment not allowed in string format specifier"));
- }
+ #endif
}
switch (type) {
@@ -1384,13 +1384,13 @@ STATIC vstr_t mp_obj_str_format_helper(const char *str, const char *top, int *ar
}
default:
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
terse_str_format_value_error();
- } else {
+ #else
mp_raise_ValueError_varg(
translate("unknown format code '%c' for object of type '%q'"),
type, mp_obj_get_type_qstr(arg));
- }
+ #endif
}
}
}
@@ -1442,11 +1442,11 @@ STATIC mp_obj_t str_modulo_format(mp_obj_t pattern, size_t n_args, const mp_obj_
const byte *key = ++str;
while (*str != ')') {
if (str >= top) {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
terse_str_format_value_error();
- } else {
+ #else
mp_raise_ValueError(translate("incomplete format key"));
- }
+ #endif
}
++str;
}
@@ -1500,11 +1500,11 @@ STATIC mp_obj_t str_modulo_format(mp_obj_t pattern, size_t n_args, const mp_obj_
if (str >= top) {
incomplete_format:
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
terse_str_format_value_error();
- } else {
+ #else
mp_raise_ValueError(translate("incomplete format"));
- }
+ #endif
}
// Tuple value lookup
@@ -1587,13 +1587,13 @@ not_enough_args:
break;
default:
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
terse_str_format_value_error();
- } else {
+ #else
mp_raise_ValueError_varg(
translate("unsupported format character '%c' (0x%x) at index %d"),
*str, *str, str - start_str);
- }
+ #endif
}
}
@@ -2130,14 +2130,13 @@ bool mp_obj_str_equal(mp_obj_t s1, mp_obj_t s2) {
}
STATIC NORETURN void bad_implicit_conversion(mp_obj_t self_in) {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_TypeError(translate("can't convert to str implicitly"));
- } else {
+ #else
const qstr src_name = mp_obj_get_type_qstr(self_in);
- nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError,
- translate("can't convert '%q' object to %q implicitly"),
- src_name, src_name == MP_QSTR_str ? MP_QSTR_bytes : MP_QSTR_str));
- }
+ mp_raise_TypeError_varg(translate("can't convert '%q' object to %q implicitly"),
+ src_name, src_name == MP_QSTR_str ? MP_QSTR_bytes : MP_QSTR_str);
+ #endif
}
// use this if you will anyway convert the string to a qstr
diff --git a/py/objtype.c b/py/objtype.c
index ccd014c33..1254b015c 100644
--- a/py/objtype.c
+++ b/py/objtype.c
@@ -373,12 +373,12 @@ mp_obj_t mp_obj_instance_make_new(const mp_obj_type_t *self, size_t n_args, cons
m_del(mp_obj_t, args2, 2 + n_args + 2 * n_kw);
}
if (init_ret != mp_const_none) {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_TypeError(translate("__init__() should return None"));
- } else {
+ #else
mp_raise_TypeError_varg(translate("__init__() should return None, not '%q'"),
mp_obj_get_type_qstr(init_ret));
- }
+ #endif
}
}
@@ -888,12 +888,12 @@ mp_obj_t mp_obj_instance_call(mp_obj_t self_in, size_t n_args, size_t n_kw, cons
mp_obj_t member[2] = {MP_OBJ_NULL, MP_OBJ_NULL};
mp_obj_t call = mp_obj_instance_get_call(self_in, member);
if (call == MP_OBJ_NULL) {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_TypeError(translate("object not callable"));
- } else {
+ #else
mp_raise_TypeError_varg(translate("'%q' object is not callable"),
mp_obj_get_type_qstr(self_in));
- }
+ #endif
}
mp_obj_instance_t *self = MP_OBJ_TO_PTR(self_in);
if (call == MP_OBJ_SENTINEL) {
@@ -1024,11 +1024,11 @@ STATIC mp_obj_t type_call(mp_obj_t self_in, size_t n_args, size_t n_kw, const mp
mp_obj_type_t *self = MP_OBJ_TO_PTR(self_in);
if (self->make_new == NULL) {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_TypeError(translate("cannot create instance"));
- } else {
+ #else
mp_raise_TypeError_varg(translate("cannot create '%q' instances"), self->name);
- }
+ #endif
}
// create a map directly from the given args array and make a new instance
@@ -1134,12 +1134,12 @@ mp_obj_t mp_obj_new_type(qstr name, mp_obj_t bases_tuple, mp_obj_t locals_dict)
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) {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_TypeError(translate("type is not an acceptable base type"));
- } else {
+ #else
mp_raise_TypeError_varg(
translate("type '%q' is not an acceptable base type"), t->name);
- }
+ #endif
}
#if ENABLE_SPECIAL_ACCESSORS
if (mp_obj_is_instance_type(t)) {
diff --git a/py/parsenum.c b/py/parsenum.c
index da63825e4..a72829b20 100644
--- a/py/parsenum.c
+++ b/py/parsenum.c
@@ -145,16 +145,16 @@ overflow:
goto have_ret_val;
}
-value_error:
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+value_error: ;
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_obj_t exc = mp_obj_new_exception_msg(&mp_type_ValueError,
translate("invalid syntax for integer"));
raise_exc(exc, lex);
- } else if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_NORMAL) {
+ #elif MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_NORMAL
mp_obj_t exc = mp_obj_new_exception_msg_varg(&mp_type_ValueError,
translate("invalid syntax for integer with base %d"), base);
raise_exc(exc, lex);
- } else {
+ #else
vstr_t vstr;
mp_print_t print;
vstr_init_print(&vstr, 50, &print);
@@ -163,7 +163,7 @@ value_error:
mp_obj_t exc = mp_obj_new_exception_arg1(&mp_type_ValueError,
mp_obj_new_str_from_vstr(&mp_type_str, &vstr));
raise_exc(exc, lex);
- }
+ #endif
}
typedef enum {
diff --git a/py/py.mk b/py/py.mk
index acf5d127b..1a8f1219a 100644
--- a/py/py.mk
+++ b/py/py.mk
@@ -7,7 +7,7 @@ HEADER_BUILD = $(BUILD)/genhdr
# file containing qstr defs for the core Python bit
PY_QSTR_DEFS = $(PY_SRC)/qstrdefs.h
-TRANSLATION := en_US
+TRANSLATION ?= en_US
# If qstr autogeneration is not disabled we specify the output header
# for all collected qstrings.
@@ -109,7 +109,7 @@ ifeq ($(CIRCUITPY_ULAB),1)
SRC_MOD += $(patsubst $(TOP)/%,%,$(wildcard $(TOP)/extmod/ulab/code/*.c))
SRC_MOD += $(patsubst $(TOP)/%,%,$(wildcard $(TOP)/extmod/ulab/code/*/*.c))
CFLAGS_MOD += -DCIRCUITPY_ULAB=1 -DMODULE_ULAB_ENABLED=1
-$(BUILD)/extmod/ulab/code/%.o: CFLAGS += -Wno-float-equal -Wno-sign-compare -DCIRCUITPY
+$(BUILD)/extmod/ulab/code/%.o: CFLAGS += -Wno-missing-declarations -Wno-missing-prototypes -Wno-unused-parameter -Wno-float-equal -Wno-sign-compare -Wno-cast-align -Wno-shadow -DCIRCUITPY
endif
# External modules written in C.
diff --git a/py/pystack.c b/py/pystack.c
index f79ea9210..0def75b10 100644
--- a/py/pystack.c
+++ b/py/pystack.c
@@ -43,8 +43,8 @@ void *mp_pystack_alloc(size_t n_bytes) {
#endif
if (MP_STATE_THREAD(pystack_cur) + n_bytes > MP_STATE_THREAD(pystack_end)) {
// out of memory in the pystack
- nlr_raise(mp_obj_new_exception_arg1(&mp_type_RuntimeError,
- MP_OBJ_NEW_QSTR(MP_QSTR_pystack_space_exhausted)));
+ mp_raise_arg1(&mp_type_RuntimeError,
+ MP_OBJ_NEW_QSTR(MP_QSTR_pystack_space_exhausted));
}
void *ptr = MP_STATE_THREAD(pystack_cur);
MP_STATE_THREAD(pystack_cur) += n_bytes;
diff --git a/py/reload.c b/py/reload.c
index 95305f2c9..f9f8a590a 100644
--- a/py/reload.c
+++ b/py/reload.c
@@ -1,6 +1,22 @@
-//
-// Created by Roy Hooper on 2018-05-14.
-//
+ /*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2018 by Roy Hooper
+ * 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 "reload.h"
#include "py/mpstate.h"
diff --git a/py/reload.h b/py/reload.h
index 72e84e5ca..3e8928a32 100644
--- a/py/reload.h
+++ b/py/reload.h
@@ -1,6 +1,22 @@
-//
-// Created by Roy Hooper on 2018-05-14.
-//
+ /*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2018 by Roy Hooper
+ * 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.
+ */
#ifndef CIRCUITPYTHON_RELOAD_H
#define CIRCUITPYTHON_RELOAD_H
diff --git a/py/runtime.c b/py/runtime.c
index e63e2337d..a3acb954a 100644
--- a/py/runtime.c
+++ b/py/runtime.c
@@ -177,12 +177,12 @@ mp_obj_t mp_load_global(qstr qst) {
#endif
elem = mp_map_lookup((mp_map_t*)&mp_module_builtins_globals.map, MP_OBJ_NEW_QSTR(qst), MP_MAP_LOOKUP);
if (elem == NULL) {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_msg(&mp_type_NameError, translate("name not defined"));
- } else {
+ #else
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_NameError,
translate("name '%q' is not defined"), qst));
- }
+ #endif
}
}
return elem->value;
@@ -275,13 +275,13 @@ mp_obj_t mp_unary_op(mp_unary_op_t op, mp_obj_t arg) {
return result;
}
}
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_TypeError(translate("unsupported type for operator"));
- } else {
+ #else
mp_raise_TypeError_varg(
translate("unsupported type for %q: '%q'"),
mp_unary_op_method_name[op], mp_obj_get_type_qstr(arg));
- }
+ #endif
}
}
@@ -582,13 +582,13 @@ generic_binary_op:
}
unsupported_op:
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_TypeError(translate("unsupported type for operator"));
- } else {
+ #else
mp_raise_TypeError_varg(
translate("unsupported types for %q: '%q', '%q'"),
mp_binary_op_method_name[op], mp_obj_get_type_qstr(lhs), mp_obj_get_type_qstr(rhs));
- }
+ #endif
zero_division:
mp_raise_msg(&mp_type_ZeroDivisionError, translate("division by zero"));
@@ -624,11 +624,11 @@ mp_obj_t mp_call_function_n_kw(mp_obj_t fun_in, size_t n_args, size_t n_kw, cons
return type->call(fun_in, n_args, n_kw, args);
}
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_TypeError(translate("object not callable"));
- } else {
+ #else
mp_raise_TypeError_varg(translate("'%q' object is not callable"), mp_obj_get_type_qstr(fun_in));
- }
+ #endif
}
// args contains: fun self/NULL arg(0) ... arg(n_args-2) arg(n_args-1) kw_key(0) kw_val(0) ... kw_key(n_kw-1) kw_val(n_kw-1)
@@ -852,19 +852,19 @@ void mp_unpack_sequence(mp_obj_t seq_in, size_t num, mp_obj_t *items) {
return;
too_short:
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_ValueError(translate("wrong number of values to unpack"));
- } else {
+ #else
mp_raise_ValueError_varg(translate("need more than %d values to unpack"),
(int)seq_len);
- }
+ #endif
too_long:
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_ValueError(translate("wrong number of values to unpack"));
- } else {
+ #else
mp_raise_ValueError_varg(translate("too many values to unpack (expected %d)"),
(int)num);
- }
+ #endif
}
// unpacked items are stored in reverse order into the array pointed to by items
@@ -916,12 +916,12 @@ void mp_unpack_ex(mp_obj_t seq_in, size_t num_in, mp_obj_t *items) {
return;
too_short:
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_ValueError(translate("wrong number of values to unpack"));
- } else {
+ #else
mp_raise_ValueError_varg(translate("need more than %d values to unpack"),
(int)seq_len);
- }
+ #endif
}
mp_obj_t mp_load_attr(mp_obj_t base, qstr attr) {
@@ -1094,9 +1094,9 @@ void mp_load_method(mp_obj_t base, qstr attr, mp_obj_t *dest) {
if (dest[0] == MP_OBJ_NULL) {
// no attribute/method called attr
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_AttributeError(translate("no such attribute"));
- } else {
+ #elif MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_DETAILED
// following CPython, we give a more detailed error message for type objects
if (MP_OBJ_IS_TYPE(base, &mp_type_type)) {
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_AttributeError,
@@ -1107,7 +1107,11 @@ void mp_load_method(mp_obj_t base, qstr attr, mp_obj_t *dest) {
translate("'%q' object has no attribute '%q'"),
mp_obj_get_type_qstr(base), attr));
}
- }
+ #else
+ nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_AttributeError,
+ translate("'%q' object has no attribute '%q'"),
+ mp_obj_get_type_qstr(base), attr));
+ #endif
}
}
@@ -1168,13 +1172,13 @@ void mp_store_attr(mp_obj_t base, qstr attr, mp_obj_t value) {
}
#endif
}
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_AttributeError(translate("no such attribute"));
- } else {
+ #else
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_AttributeError,
translate("'%q' object cannot assign attribute '%q'"),
mp_obj_get_type_qstr(base), attr));
- }
+ #endif
}
mp_obj_t mp_getiter(mp_obj_t o_in, mp_obj_iter_buf_t *iter_buf) {
@@ -1209,12 +1213,12 @@ mp_obj_t mp_getiter(mp_obj_t o_in, mp_obj_iter_buf_t *iter_buf) {
}
// object not iterable
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_TypeError(translate("object not iterable"));
- } else {
+ #else
mp_raise_TypeError_varg(
translate("'%q' object is not iterable"), mp_obj_get_type_qstr(o_in));
- }
+ #endif
}
// may return MP_OBJ_STOP_ITERATION as an optimisation instead of raise StopIteration()
@@ -1231,12 +1235,12 @@ mp_obj_t mp_iternext_allow_raise(mp_obj_t o_in) {
// __next__ exists, call it and return its result
return mp_call_method_n_kw(0, 0, dest);
} else {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_TypeError(translate("object not an iterator"));
- } else {
+ #else
mp_raise_TypeError_varg(translate("'%q' object is not an iterator"),
mp_obj_get_type_qstr(o_in));
- }
+ #endif
}
}
}
@@ -1267,12 +1271,12 @@ mp_obj_t mp_iternext(mp_obj_t o_in) {
}
}
} else {
- if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) {
+ #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE
mp_raise_TypeError(translate("object not an iterator"));
- } else {
+ #else
mp_raise_TypeError_varg(translate("'%q' object is not an iterator"),
mp_obj_get_type_qstr(o_in));
- }
+ #endif
}
}
}
@@ -1514,6 +1518,10 @@ NORETURN void m_malloc_fail(size_t num_bytes) {
translate("memory allocation failed, allocating %u bytes"), (uint)num_bytes);
}
+NORETURN void mp_raise_arg1(const mp_obj_type_t *exc_type, mp_obj_t arg) {
+ nlr_raise(mp_obj_new_exception_arg1(exc_type, arg));
+}
+
NORETURN void mp_raise_msg(const mp_obj_type_t *exc_type, const compressed_string_t *msg) {
if (msg == NULL) {
nlr_raise(mp_obj_new_exception(exc_type));
@@ -1580,7 +1588,7 @@ NORETURN void mp_raise_TypeError_varg(const compressed_string_t *fmt, ...) {
}
NORETURN void mp_raise_OSError(int errno_) {
- nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(errno_)));
+ mp_raise_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(errno_));
}
NORETURN void mp_raise_OSError_msg(const compressed_string_t *msg) {
@@ -1607,7 +1615,7 @@ NORETURN void mp_raise_ConnectionError(const compressed_string_t *msg) {
}
NORETURN void mp_raise_BrokenPipeError(void) {
- nlr_raise(mp_obj_new_exception_arg1(&mp_type_BrokenPipeError, MP_OBJ_NEW_SMALL_INT(MP_EPIPE)));
+ mp_raise_arg1(&mp_type_BrokenPipeError, MP_OBJ_NEW_SMALL_INT(MP_EPIPE));
}
NORETURN void mp_raise_NotImplementedError(const compressed_string_t *msg) {
diff --git a/py/runtime.h b/py/runtime.h
index ad7d0feab..5e8fda35c 100644
--- a/py/runtime.h
+++ b/py/runtime.h
@@ -150,6 +150,7 @@ mp_obj_t mp_import_name(qstr name, mp_obj_t fromlist, mp_obj_t level);
mp_obj_t mp_import_from(mp_obj_t module, qstr name);
void mp_import_all(mp_obj_t module);
+NORETURN void mp_raise_arg1(const mp_obj_type_t *exc_type, mp_obj_t arg);
NORETURN void mp_raise_msg(const mp_obj_type_t *exc_type, const compressed_string_t *msg);
NORETURN void mp_raise_msg_varg(const mp_obj_type_t *exc_type, const compressed_string_t *fmt, ...);
NORETURN void mp_raise_msg_vlist(const mp_obj_type_t *exc_type, const compressed_string_t *fmt, va_list argptr);
diff --git a/shared-bindings/_typing/__init__.pyi b/shared-bindings/_typing/__init__.pyi
index 48e68a8d5..cc4a0a439 100644
--- a/shared-bindings/_typing/__init__.pyi
+++ b/shared-bindings/_typing/__init__.pyi
@@ -2,6 +2,9 @@
from typing import Union
+import alarm
+import alarm.pin
+import alarm.time
import array
import audiocore
import audiomixer
@@ -52,3 +55,14 @@ FrameBuffer = Union[rgbmatrix.RGBMatrix]
- `rgbmatrix.RGBMatrix`
"""
+
+Alarm = Union[
+ alarm.pin.PinAlarm, alarm.time.TimeAlarm
+]
+"""Classes that implement alarms for sleeping and asynchronous notification.
+
+ - `alarm.pin.PinAlarm`
+ - `alarm.time.TimeAlarm`
+
+ You can use these alarms to wake up from light or deep sleep.
+"""
diff --git a/shared-bindings/adafruit_bus_device/I2CDevice.c b/shared-bindings/adafruit_bus_device/I2CDevice.c
new file mode 100644
index 000000000..4c9086162
--- /dev/null
+++ b/shared-bindings/adafruit_bus_device/I2CDevice.c
@@ -0,0 +1,259 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Mark Komus
+ *
+ * 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.
+ */
+
+// This file contains all of the Python API definitions for the
+// busio.I2C class.
+
+#include "shared-bindings/microcontroller/Pin.h"
+#include "shared-bindings/adafruit_bus_device/I2CDevice.h"
+#include "shared-bindings/util.h"
+#include "shared-module/adafruit_bus_device/I2CDevice.h"
+
+#include "lib/utils/buffer_helper.h"
+#include "lib/utils/context_manager_helpers.h"
+#include "py/runtime.h"
+#include "supervisor/shared/translate.h"
+
+
+//| class I2CDevice:
+//| """I2C Device Manager"""
+//|
+//| def __init__(self, i2c: busio.I2C, device_address: int, probe: bool = True) -> None:
+//|
+//| """Represents a single I2C device and manages locking the bus and the device
+//| address.
+//| :param ~busio.I2C i2c: The I2C bus the device is on
+//| :param int device_address: The 7 bit device address
+//| :param bool probe: Probe for the device upon object creation, default is true
+//|
+//| Example::
+//|
+//| import busio
+//| from board import *
+//| from adafruit_bus_device.i2c_device import I2CDevice
+//| with busio.I2C(SCL, SDA) as i2c:
+//| device = I2CDevice(i2c, 0x70)
+//| bytes_read = bytearray(4)
+//| with device:
+//| device.readinto(bytes_read)
+//| # A second transaction
+//| with device:
+//| device.write(bytes_read)"""
+//| ...
+//|
+STATIC mp_obj_t adafruit_bus_device_i2cdevice_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
+ adafruit_bus_device_i2cdevice_obj_t *self = m_new_obj(adafruit_bus_device_i2cdevice_obj_t);
+ self->base.type = &adafruit_bus_device_i2cdevice_type;
+ enum { ARG_i2c, ARG_device_address, ARG_probe };
+ static const mp_arg_t allowed_args[] = {
+ { MP_QSTR_i2c, MP_ARG_REQUIRED | MP_ARG_OBJ },
+ { MP_QSTR_device_address, MP_ARG_REQUIRED | MP_ARG_INT },
+ { MP_QSTR_probe, MP_ARG_BOOL, {.u_bool = true} },
+ };
+ mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
+ mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
+
+ busio_i2c_obj_t* i2c = args[ARG_i2c].u_obj;
+
+ common_hal_adafruit_bus_device_i2cdevice_construct(MP_OBJ_TO_PTR(self), i2c, args[ARG_device_address].u_int);
+ if (args[ARG_probe].u_bool == true) {
+ common_hal_adafruit_bus_device_i2cdevice_probe_for_device(self);
+ }
+
+ return (mp_obj_t)self;
+}
+
+//| def __enter__(self) -> I2CDevice:
+//| """Context manager entry to lock bus."""
+//| ...
+//|
+STATIC mp_obj_t adafruit_bus_device_i2cdevice_obj___enter__(mp_obj_t self_in) {
+ adafruit_bus_device_i2cdevice_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ common_hal_adafruit_bus_device_i2cdevice_lock(self);
+ return self;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(adafruit_bus_device_i2cdevice___enter___obj, adafruit_bus_device_i2cdevice_obj___enter__);
+
+//| def __exit__(self) -> None:
+//| """Automatically unlocks the bus on exit."""
+//| ...
+//|
+STATIC mp_obj_t adafruit_bus_device_i2cdevice_obj___exit__(size_t n_args, const mp_obj_t *args) {
+ common_hal_adafruit_bus_device_i2cdevice_unlock(MP_OBJ_TO_PTR(args[0]));
+ return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(adafruit_bus_device_i2cdevice___exit___obj, 4, 4, adafruit_bus_device_i2cdevice_obj___exit__);
+
+//| def readinto(self, buf: WriteableBuffer, *, start: int = 0, end: int = 0) -> None:
+//| """Read into ``buf`` from the device. The number of bytes read will be the
+//| length of ``buf``.
+//| If ``start`` or ``end`` is provided, then the buffer will be sliced
+//| as if ``buf[start:end]``. This will not cause an allocation like
+//| ``buf[start:end]`` will so it saves memory.
+//| :param bytearray buf: buffer to write into
+//| :param int start: Index to start writing at
+//| :param int end: Index to write up to but not include; if None, use ``len(buf)``"""
+//| ...
+//|
+STATIC void readinto(adafruit_bus_device_i2cdevice_obj_t *self, mp_obj_t buffer, int32_t start, mp_int_t end) {
+ mp_buffer_info_t bufinfo;
+ mp_get_buffer_raise(buffer, &bufinfo, MP_BUFFER_WRITE);
+
+ size_t length = bufinfo.len;
+ normalize_buffer_bounds(&start, end, &length);
+ if (length == 0) {
+ mp_raise_ValueError(translate("Buffer must be at least length 1"));
+ }
+
+ uint8_t status = common_hal_adafruit_bus_device_i2cdevice_readinto(MP_OBJ_TO_PTR(self), ((uint8_t*)bufinfo.buf) + start, length);
+ if (status != 0) {
+ mp_raise_OSError(status);
+ }
+}
+
+STATIC mp_obj_t adafruit_bus_device_i2cdevice_readinto(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
+ enum { ARG_buffer, ARG_start, ARG_end };
+ static const mp_arg_t allowed_args[] = {
+ { MP_QSTR_buffer, MP_ARG_REQUIRED | MP_ARG_OBJ },
+ { MP_QSTR_start, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} },
+ { MP_QSTR_end, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = INT_MAX} },
+ };
+
+ adafruit_bus_device_i2cdevice_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
+
+ mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
+ mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
+
+ readinto(self, args[ARG_buffer].u_obj, args[ARG_start].u_int, args[ARG_end].u_int);
+ return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_KW(adafruit_bus_device_i2cdevice_readinto_obj, 2, adafruit_bus_device_i2cdevice_readinto);
+
+//| def write(self, buf: ReadableBuffer, *, start: int = 0, end: int = 0) -> None:
+//| """Write the bytes from ``buffer`` to the device, then transmit a stop bit.
+//| If ``start`` or ``end`` is provided, then the buffer will be sliced
+//| as if ``buffer[start:end]``. This will not cause an allocation like
+//| ``buffer[start:end]`` will so it saves memory.
+//| :param bytearray buf: buffer containing the bytes to write
+//| :param int start: Index to start writing from
+//| :param int end: Index to read up to but not include; if None, use ``len(buf)``
+//| """
+//| ...
+//|
+STATIC void write(adafruit_bus_device_i2cdevice_obj_t *self, mp_obj_t buffer, int32_t start, mp_int_t end) {
+ mp_buffer_info_t bufinfo;
+ mp_get_buffer_raise(buffer, &bufinfo, MP_BUFFER_READ);
+
+ size_t length = bufinfo.len;
+ normalize_buffer_bounds(&start, end, &length);
+ if (length == 0) {
+ mp_raise_ValueError(translate("Buffer must be at least length 1"));
+ }
+
+ uint8_t status = common_hal_adafruit_bus_device_i2cdevice_write(MP_OBJ_TO_PTR(self), ((uint8_t*)bufinfo.buf) + start, length);
+ if (status != 0) {
+ mp_raise_OSError(status);
+ }
+}
+
+STATIC mp_obj_t adafruit_bus_device_i2cdevice_write(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
+ enum { ARG_buffer, ARG_start, ARG_end };
+ static const mp_arg_t allowed_args[] = {
+ { MP_QSTR_buffer, MP_ARG_REQUIRED | MP_ARG_OBJ },
+ { MP_QSTR_start, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} },
+ { MP_QSTR_end, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = INT_MAX} },
+ };
+ adafruit_bus_device_i2cdevice_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
+
+ mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
+ mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
+
+ write(self, args[ARG_buffer].u_obj, args[ARG_start].u_int, args[ARG_end].u_int);
+ return mp_const_none;
+}
+MP_DEFINE_CONST_FUN_OBJ_KW(adafruit_bus_device_i2cdevice_write_obj, 2, adafruit_bus_device_i2cdevice_write);
+
+
+//| def write_then_readinto(self, out_buffer: WriteableBuffer, in_buffer: ReadableBuffer, *, out_start: int = 0, out_end: int = 0, in_start: int = 0, in_end: int = 0) -> None:
+//| """Write the bytes from ``out_buffer`` to the device, then immediately
+//| reads into ``in_buffer`` from the device. The number of bytes read
+//| will be the length of ``in_buffer``.
+//| If ``out_start`` or ``out_end`` is provided, then the output buffer
+//| will be sliced as if ``out_buffer[out_start:out_end]``. This will
+//| not cause an allocation like ``buffer[out_start:out_end]`` will so
+//| it saves memory.
+//| If ``in_start`` or ``in_end`` is provided, then the input buffer
+//| will be sliced as if ``in_buffer[in_start:in_end]``. This will not
+//| cause an allocation like ``in_buffer[in_start:in_end]`` will so
+//| it saves memory.
+//| :param bytearray out_buffer: buffer containing the bytes to write
+//| :param bytearray in_buffer: buffer containing the bytes to read into
+//| :param int out_start: Index to start writing from
+//| :param int out_end: Index to read up to but not include; if None, use ``len(out_buffer)``
+//| :param int in_start: Index to start writing at
+//| :param int in_end: Index to write up to but not include; if None, use ``len(in_buffer)``
+//| """
+//| ...
+//|
+STATIC mp_obj_t adafruit_bus_device_i2cdevice_write_then_readinto(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
+ enum { ARG_out_buffer, ARG_in_buffer, ARG_out_start, ARG_out_end, ARG_in_start, ARG_in_end };
+ static const mp_arg_t allowed_args[] = {
+ { MP_QSTR_out_buffer, MP_ARG_REQUIRED | MP_ARG_OBJ },
+ { MP_QSTR_in_buffer, MP_ARG_REQUIRED | MP_ARG_OBJ },
+ { MP_QSTR_out_start, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} },
+ { MP_QSTR_out_end, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = INT_MAX} },
+ { MP_QSTR_in_start, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} },
+ { MP_QSTR_in_end, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = INT_MAX} },
+ };
+ adafruit_bus_device_i2cdevice_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
+
+ mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
+ mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
+
+ write(self, args[ARG_out_buffer].u_obj, args[ARG_out_start].u_int, args[ARG_out_end].u_int);
+
+ readinto(self, args[ARG_in_buffer].u_obj, args[ARG_in_start].u_int, args[ARG_in_end].u_int);
+
+ return mp_const_none;
+}
+MP_DEFINE_CONST_FUN_OBJ_KW(adafruit_bus_device_i2cdevice_write_then_readinto_obj, 3, adafruit_bus_device_i2cdevice_write_then_readinto);
+
+STATIC const mp_rom_map_elem_t adafruit_bus_device_i2cdevice_locals_dict_table[] = {
+ { MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&adafruit_bus_device_i2cdevice___enter___obj) },
+ { MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&adafruit_bus_device_i2cdevice___exit___obj) },
+ { MP_ROM_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&adafruit_bus_device_i2cdevice_readinto_obj) },
+ { MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&adafruit_bus_device_i2cdevice_write_obj) },
+ { MP_ROM_QSTR(MP_QSTR_write_then_readinto), MP_ROM_PTR(&adafruit_bus_device_i2cdevice_write_then_readinto_obj) },
+};
+
+STATIC MP_DEFINE_CONST_DICT(adafruit_bus_device_i2cdevice_locals_dict, adafruit_bus_device_i2cdevice_locals_dict_table);
+
+const mp_obj_type_t adafruit_bus_device_i2cdevice_type = {
+ { &mp_type_type },
+ .name = MP_QSTR_I2CDevice,
+ .make_new = adafruit_bus_device_i2cdevice_make_new,
+ .locals_dict = (mp_obj_dict_t*)&adafruit_bus_device_i2cdevice_locals_dict,
+};
diff --git a/shared-bindings/adafruit_bus_device/I2CDevice.h b/shared-bindings/adafruit_bus_device/I2CDevice.h
new file mode 100644
index 000000000..7b2182ff0
--- /dev/null
+++ b/shared-bindings/adafruit_bus_device/I2CDevice.h
@@ -0,0 +1,53 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Mark Komus
+ *
+ * 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.
+ */
+
+// Machine is the HAL for low-level, hardware accelerated functions. It is not
+// meant to simplify APIs, its only meant to unify them so that other modules
+// do not require port specific logic.
+//
+// This file includes externs for all functions a port should implement to
+// support the machine module.
+
+#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_BUSDEVICE_I2CDEVICE_H
+#define MICROPY_INCLUDED_SHARED_BINDINGS_BUSDEVICE_I2CDEVICE_H
+
+#include "py/obj.h"
+
+#include "shared-module/adafruit_bus_device/I2CDevice.h"
+//#include "shared-bindings/busio/I2C.h"
+
+// Type object used in Python. Should be shared between ports.
+extern const mp_obj_type_t adafruit_bus_device_i2cdevice_type;
+
+// Initializes the hardware peripheral.
+extern void common_hal_adafruit_bus_device_i2cdevice_construct(adafruit_bus_device_i2cdevice_obj_t *self, busio_i2c_obj_t *i2c, uint8_t device_address);
+extern uint8_t common_hal_adafruit_bus_device_i2cdevice_readinto(adafruit_bus_device_i2cdevice_obj_t *self, mp_obj_t buffer, size_t length);
+extern uint8_t common_hal_adafruit_bus_device_i2cdevice_write(adafruit_bus_device_i2cdevice_obj_t *self, mp_obj_t buffer, size_t length);
+extern void common_hal_adafruit_bus_device_i2cdevice_lock(adafruit_bus_device_i2cdevice_obj_t *self);
+extern void common_hal_adafruit_bus_device_i2cdevice_unlock(adafruit_bus_device_i2cdevice_obj_t *self);
+extern void common_hal_adafruit_bus_device_i2cdevice_probe_for_device(adafruit_bus_device_i2cdevice_obj_t *self);
+
+#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BUSDEVICE_I2CDEVICE_H
diff --git a/shared-bindings/adafruit_bus_device/SPIDevice.c b/shared-bindings/adafruit_bus_device/SPIDevice.c
new file mode 100644
index 000000000..e127e39b8
--- /dev/null
+++ b/shared-bindings/adafruit_bus_device/SPIDevice.c
@@ -0,0 +1,128 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Mark Komus
+ *
+ * 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 "shared-bindings/microcontroller/Pin.h"
+#include "shared-bindings/adafruit_bus_device/SPIDevice.h"
+#include "shared-bindings/util.h"
+#include "shared-module/adafruit_bus_device/SPIDevice.h"
+#include "common-hal/digitalio/DigitalInOut.h"
+#include "shared-bindings/digitalio/DigitalInOut.h"
+
+
+#include "lib/utils/buffer_helper.h"
+#include "lib/utils/context_manager_helpers.h"
+#include "py/runtime.h"
+#include "supervisor/shared/translate.h"
+
+
+//| class SPIDevice:
+//| """SPI Device Manager"""
+//|
+//| def __init__(self, spi: busio.SPI, chip_select: microcontroller.Pin, *, baudrate: int = 100000, polarity: int = 0, phase: int = 0, extra_clocks : int = 0) -> None:
+//|
+//| """
+//| Represents a single SPI device and manages locking the bus and the device address.
+//| :param ~busio.SPI spi: The SPI bus the device is on
+//| :param ~digitalio.DigitalInOut chip_select: The chip select pin object that implements the DigitalInOut API.
+//| :param int extra_clocks: The minimum number of clock cycles to cycle the bus after CS is high. (Used for SD cards.)
+//|
+//| Example::
+//|
+//| import busio
+//| import digitalio
+//| from board import *
+//| from adafruit_bus_device.spi_device import SPIDevice
+//| with busio.SPI(SCK, MOSI, MISO) as spi_bus:
+//| cs = digitalio.DigitalInOut(D10)
+//| device = SPIDevice(spi_bus, cs)
+//| bytes_read = bytearray(4)
+//| # The object assigned to spi in the with statements below
+//| # is the original spi_bus object. We are using the busio.SPI
+//| # operations busio.SPI.readinto() and busio.SPI.write().
+//| with device as spi:
+//| spi.readinto(bytes_read)
+//| # A second transaction
+//| with device as spi:
+//| spi.write(bytes_read)"""
+//| ...
+//|
+STATIC mp_obj_t adafruit_bus_device_spidevice_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
+ adafruit_bus_device_spidevice_obj_t *self = m_new_obj(adafruit_bus_device_spidevice_obj_t);
+ self->base.type = &adafruit_bus_device_spidevice_type;
+ enum { ARG_spi, ARG_chip_select, ARG_baudrate, ARG_polarity, ARG_phase, ARG_extra_clocks };
+ static const mp_arg_t allowed_args[] = {
+ { MP_QSTR_spi, MP_ARG_REQUIRED | MP_ARG_OBJ },
+ { MP_QSTR_chip_select, MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
+ { MP_QSTR_baudrate, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 100000} },
+ { MP_QSTR_polarity, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} },
+ { MP_QSTR_phase, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} },
+ { MP_QSTR_extra_clocks, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} },
+ };
+ mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
+ mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
+
+ busio_spi_obj_t* spi = args[ARG_spi].u_obj;
+
+ common_hal_adafruit_bus_device_spidevice_construct(MP_OBJ_TO_PTR(self), spi, args[ARG_chip_select].u_obj, args[ARG_baudrate].u_int, args[ARG_polarity].u_int,
+ args[ARG_phase].u_int, args[ARG_extra_clocks].u_int);
+
+ if (args[ARG_chip_select].u_obj != MP_OBJ_NULL) {
+ digitalinout_result_t result = common_hal_digitalio_digitalinout_switch_to_output(MP_OBJ_TO_PTR(args[ARG_chip_select].u_obj),
+ true, DRIVE_MODE_PUSH_PULL);
+ if (result == DIGITALINOUT_INPUT_ONLY) {
+ mp_raise_NotImplementedError(translate("Pin is input only"));
+ }
+ }
+
+ return (mp_obj_t)self;
+}
+
+STATIC mp_obj_t adafruit_bus_device_spidevice_obj___enter__(mp_obj_t self_in) {
+ adafruit_bus_device_spidevice_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ common_hal_adafruit_bus_device_spidevice_enter(self);
+ return self->spi;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(adafruit_bus_device_spidevice___enter___obj, adafruit_bus_device_spidevice_obj___enter__);
+
+STATIC mp_obj_t adafruit_bus_device_spidevice_obj___exit__(size_t n_args, const mp_obj_t *args) {
+ common_hal_adafruit_bus_device_spidevice_exit(MP_OBJ_TO_PTR(args[0]));
+ return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(adafruit_bus_device_spidevice___exit___obj, 4, 4, adafruit_bus_device_spidevice_obj___exit__);
+
+STATIC const mp_rom_map_elem_t adafruit_bus_device_spidevice_locals_dict_table[] = {
+ { MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&adafruit_bus_device_spidevice___enter___obj) },
+ { MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&adafruit_bus_device_spidevice___exit___obj) },
+};
+
+STATIC MP_DEFINE_CONST_DICT(adafruit_bus_device_spidevice_locals_dict, adafruit_bus_device_spidevice_locals_dict_table);
+
+const mp_obj_type_t adafruit_bus_device_spidevice_type = {
+ { &mp_type_type },
+ .name = MP_QSTR_SPIDevice,
+ .make_new = adafruit_bus_device_spidevice_make_new,
+ .locals_dict = (mp_obj_dict_t*)&adafruit_bus_device_spidevice_locals_dict,
+};
diff --git a/shared-bindings/adafruit_bus_device/SPIDevice.h b/shared-bindings/adafruit_bus_device/SPIDevice.h
new file mode 100644
index 000000000..5596b157f
--- /dev/null
+++ b/shared-bindings/adafruit_bus_device/SPIDevice.h
@@ -0,0 +1,50 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Mark Komus
+ *
+ * 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.
+ */
+
+// Machine is the HAL for low-level, hardware accelerated functions. It is not
+// meant to simplify APIs, its only meant to unify them so that other modules
+// do not require port specific logic.
+//
+// This file includes externs for all functions a port should implement to
+// support the machine module.
+
+#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_BUSDEVICE_SPIDEVICE_H
+#define MICROPY_INCLUDED_SHARED_BINDINGS_BUSDEVICE_SPIDEVICE_H
+
+#include "py/obj.h"
+
+#include "shared-module/adafruit_bus_device/SPIDevice.h"
+
+// Type object used in Python. Should be shared between ports.
+extern const mp_obj_type_t adafruit_bus_device_spidevice_type;
+
+// Initializes the hardware peripheral.
+extern void common_hal_adafruit_bus_device_spidevice_construct(adafruit_bus_device_spidevice_obj_t *self, busio_spi_obj_t *spi, digitalio_digitalinout_obj_t *cs,
+ uint32_t baudrate, uint8_t polarity, uint8_t phase, uint8_t extra_clocks);
+extern void common_hal_adafruit_bus_device_spidevice_enter(adafruit_bus_device_spidevice_obj_t *self);
+extern void common_hal_adafruit_bus_device_spidevice_exit(adafruit_bus_device_spidevice_obj_t *self);
+
+#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BUSDEVICE_SPIDEVICE_H
diff --git a/shared-bindings/adafruit_bus_device/__init__.c b/shared-bindings/adafruit_bus_device/__init__.c
new file mode 100644
index 000000000..e01abcab3
--- /dev/null
+++ b/shared-bindings/adafruit_bus_device/__init__.c
@@ -0,0 +1,78 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Mark Komus
+ *
+ * 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 <stdint.h>
+
+#include "py/obj.h"
+#include "py/runtime.h"
+#include "py/mphal.h"
+#include "py/objproperty.h"
+
+#include "shared-bindings/adafruit_bus_device/__init__.h"
+#include "shared-bindings/adafruit_bus_device/I2CDevice.h"
+#include "shared-bindings/adafruit_bus_device/SPIDevice.h"
+
+STATIC const mp_rom_map_elem_t adafruit_bus_device_i2c_device_globals_table[] = {
+ { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_i2c_device) },
+ { MP_ROM_QSTR(MP_QSTR_I2CDevice), MP_ROM_PTR(&adafruit_bus_device_i2cdevice_type) },
+};
+STATIC MP_DEFINE_CONST_DICT(adafruit_bus_device_i2c_device_globals, adafruit_bus_device_i2c_device_globals_table);
+
+const mp_obj_module_t adafruit_bus_device_i2c_device_module = {
+ .base = { &mp_type_module },
+ .globals = (mp_obj_dict_t*)&adafruit_bus_device_i2c_device_globals,
+};
+
+STATIC const mp_rom_map_elem_t adafruit_bus_device_spi_device_globals_table[] = {
+ { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_spi_device) },
+ { MP_ROM_QSTR(MP_QSTR_SPIDevice), MP_ROM_PTR(&adafruit_bus_device_spidevice_type) },
+};
+STATIC MP_DEFINE_CONST_DICT(adafruit_bus_device_spi_device_globals, adafruit_bus_device_spi_device_globals_table);
+
+const mp_obj_module_t adafruit_bus_device_spi_device_module = {
+ .base = { &mp_type_module },
+ .globals = (mp_obj_dict_t*)&adafruit_bus_device_spi_device_globals,
+};
+
+//| """Hardware accelerated external bus access
+//|
+//| The I2CDevice and SPIDevice helper classes make managing transaction state on a bus easy.
+//| For example, they manage locking the bus to prevent other concurrent access. For SPI
+//| devices, it manages the chip select and protocol changes such as mode. For I2C, it
+//| manages the device address."""
+//|
+STATIC const mp_rom_map_elem_t adafruit_bus_device_module_globals_table[] = {
+ { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_adafruit_bus_device) },
+ { MP_ROM_QSTR(MP_QSTR_i2c_device), MP_ROM_PTR(&adafruit_bus_device_i2c_device_module) },
+ { MP_ROM_QSTR(MP_QSTR_spi_device), MP_ROM_PTR(&adafruit_bus_device_spi_device_module) },
+};
+
+STATIC MP_DEFINE_CONST_DICT(adafruit_bus_device_module_globals, adafruit_bus_device_module_globals_table);
+
+const mp_obj_module_t adafruit_bus_device_module = {
+ .base = { &mp_type_module },
+ .globals = (mp_obj_dict_t*)&adafruit_bus_device_module_globals,
+};
diff --git a/shared-bindings/adafruit_bus_device/__init__.h b/shared-bindings/adafruit_bus_device/__init__.h
new file mode 100644
index 000000000..4a669807b
--- /dev/null
+++ b/shared-bindings/adafruit_bus_device/__init__.h
@@ -0,0 +1,32 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Mark Komus
+ *
+ * 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.
+ */
+
+#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_BUSDEVICE___INIT___H
+#define MICROPY_INCLUDED_SHARED_BINDINGS_BUSDEVICE___INIT___H
+
+// Nothing now.
+
+#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BUSDEVICE___INIT___H
diff --git a/shared-bindings/alarm/__init__.c b/shared-bindings/alarm/__init__.c
new file mode 100644
index 000000000..5420b8404
--- /dev/null
+++ b/shared-bindings/alarm/__init__.c
@@ -0,0 +1,209 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Dan Halbert 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 "py/obj.h"
+#include "py/reload.h"
+#include "py/runtime.h"
+
+#include "shared-bindings/alarm/__init__.h"
+#include "shared-bindings/alarm/pin/PinAlarm.h"
+#include "shared-bindings/alarm/time/TimeAlarm.h"
+#include "shared-bindings/supervisor/Runtime.h"
+#include "shared-bindings/time/__init__.h"
+#include "supervisor/shared/autoreload.h"
+#include "supervisor/shared/workflow.h"
+
+//| """Alarms and sleep
+//|
+//| Provides alarms that trigger based on time intervals or on external events, such as pin
+//| changes.
+//| The program can simply wait for these alarms, or go to sleep and be awoken when they trigger.
+//|
+//| There are two supported levels of sleep: light sleep and deep sleep.
+//|
+//| Light sleep keeps sufficient state so the program can resume after sleeping.
+//| It does not shut down WiFi, BLE, or other communications, or ongoing activities such
+//| as audio playback. It reduces power consumption to the extent possible that leaves
+//| these continuing activities running. In some cases there may be no decrease in power consumption.
+//|
+//| Deep sleep shuts down power to nearly all of the microcontroller including the CPU and RAM. This can save
+//| a more significant amount of power, but CircuitPython must restart ``code.py`` from the beginning when
+//| awakened.
+//|
+//| For both light sleep and deep sleep, if CircuitPython is connected to a host computer,
+//| maintaining the connection takes priority and power consumption may not be reduced.
+//| """
+
+//|
+//| wake_alarm: Alarm
+//| """The most recently triggered alarm. If CircuitPython was sleeping, the alarm the woke it from sleep."""
+//|
+
+// wake_alarm is implemented as a dictionary entry, so there's no code here.
+
+void validate_objs_are_alarms(size_t n_args, const mp_obj_t *objs) {
+ for (size_t i = 0; i < n_args; i++) {
+ if (MP_OBJ_IS_TYPE(objs[i], &alarm_pin_pin_alarm_type) ||
+ MP_OBJ_IS_TYPE(objs[i], &alarm_time_time_alarm_type)) {
+ continue;
+ }
+ mp_raise_TypeError_varg(translate("Expected an alarm"));
+ }
+}
+
+//| def light_sleep_until_alarms(*alarms: Alarm) -> Alarm:
+//| """Go into a light sleep until awakened one of the alarms. The alarm causing the wake-up
+//| is returned, and is also available as `alarm.wake_alarm`.
+//|
+//| If no alarms are specified, return immediately.
+//|
+//| **If CircuitPython is connected to a host computer, the connection will be maintained,
+//| and the microcontroller may not actually go into a light sleep.**
+//| This allows the user to interrupt an existing program with ctrl-C,
+//| and to edit the files in CIRCUITPY, which would not be possible in true light sleep.
+//| Thus, to use light sleep and save significant power,
+// it may be necessary to disconnect from the host.
+//| """
+//| ...
+//|
+STATIC mp_obj_t alarm_light_sleep_until_alarms(size_t n_args, const mp_obj_t *args) {
+ if (n_args == 0) {
+ return mp_const_none;
+ }
+
+ validate_objs_are_alarms(n_args, args);
+
+ return common_hal_alarm_light_sleep_until_alarms(n_args, args);
+}
+MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(alarm_light_sleep_until_alarms_obj, 1, MP_OBJ_FUN_ARGS_MAX, alarm_light_sleep_until_alarms);
+
+//| def exit_and_deep_sleep_until_alarms(*alarms: Alarm) -> None:
+//| """Exit the program and go into a deep sleep, until awakened by one of the alarms.
+//| This function does not return.
+//|
+//| When awakened, the microcontroller will restart and will run ``boot.py`` and ``code.py``
+//| from the beginning.
+//|
+//| After restart, an alarm *equivalent* to the one that caused the wake-up
+//| will be available as `alarm.wake_alarm`.
+//| Its type and/or attributes may not correspond exactly to the original alarm.
+//| For time-base alarms, currently, an `alarm.time.TimeAlarm()` is created.
+//|
+//| If no alarms are specified, the microcontroller will deep sleep until reset.
+//|
+//| **If CircuitPython is connected to a host computer, the connection will be maintained,
+//| and the system will not go into deep sleep.**
+//| This allows the user to interrupt an existing program with ctrl-C,
+//| and to edit the files in CIRCUITPY, which would not be possible in true deep sleep.
+//| Thus, to use deep sleep and save significant power, you will need to disconnect from the host.
+//|
+//| Here is skeletal example that deep-sleeps and restarts every 60 seconds:
+//|
+//| .. code-block:: python
+//|
+//| import alarm
+//| import time
+//|
+//| print("Waking up")
+//|
+//| # Set an alarm for 60 seconds from now.
+//| time_alarm = alarm.time.TimeAlarm(monotonic_time=time.monotonic() + 60)
+//|
+//| # Deep sleep until the alarm goes off. Then restart the program.
+//| alarm.exit_and_deep_sleep_until_alarms(time_alarm)
+//| """
+//| ...
+//|
+STATIC mp_obj_t alarm_exit_and_deep_sleep_until_alarms(size_t n_args, const mp_obj_t *args) {
+ validate_objs_are_alarms(n_args, args);
+
+ // Validate the alarms and set them.
+ common_hal_alarm_set_deep_sleep_alarms(n_args, args);
+
+ // Raise an exception, which will be processed in main.c.
+ mp_raise_arg1(&mp_type_DeepSleepRequest, NULL);
+
+ // Doesn't get here.
+ return mp_const_none;
+}
+MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(alarm_exit_and_deep_sleep_until_alarms_obj, 1, MP_OBJ_FUN_ARGS_MAX, alarm_exit_and_deep_sleep_until_alarms);
+
+STATIC const mp_map_elem_t alarm_pin_globals_table[] = {
+ { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_pin) },
+
+ { MP_ROM_QSTR(MP_QSTR_PinAlarm), MP_OBJ_FROM_PTR(&alarm_pin_pin_alarm_type) },
+};
+
+STATIC MP_DEFINE_CONST_DICT(alarm_pin_globals, alarm_pin_globals_table);
+
+STATIC const mp_obj_module_t alarm_pin_module = {
+ .base = { &mp_type_module },
+ .globals = (mp_obj_dict_t*)&alarm_pin_globals,
+};
+
+STATIC const mp_map_elem_t alarm_time_globals_table[] = {
+ { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_time) },
+
+ { MP_ROM_QSTR(MP_QSTR_TimeAlarm), MP_OBJ_FROM_PTR(&alarm_time_time_alarm_type) },
+};
+
+STATIC MP_DEFINE_CONST_DICT(alarm_time_globals, alarm_time_globals_table);
+
+STATIC const mp_obj_module_t alarm_time_module = {
+ .base = { &mp_type_module },
+ .globals = (mp_obj_dict_t*)&alarm_time_globals,
+};
+
+STATIC mp_map_elem_t alarm_module_globals_table[] = {
+ { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_alarm) },
+
+ // wake_alarm is a mutable attribute.
+ { MP_ROM_QSTR(MP_QSTR_wake_alarm), mp_const_none },
+
+ { MP_ROM_QSTR(MP_QSTR_light_sleep_until_alarms), MP_OBJ_FROM_PTR(&alarm_light_sleep_until_alarms_obj) },
+ { MP_ROM_QSTR(MP_QSTR_exit_and_deep_sleep_until_alarms),
+ MP_OBJ_FROM_PTR(&alarm_exit_and_deep_sleep_until_alarms_obj) },
+
+ { MP_ROM_QSTR(MP_QSTR_pin), MP_OBJ_FROM_PTR(&alarm_pin_module) },
+ { MP_ROM_QSTR(MP_QSTR_time), MP_OBJ_FROM_PTR(&alarm_time_module) }
+
+};
+STATIC MP_DEFINE_MUTABLE_DICT(alarm_module_globals, alarm_module_globals_table);
+
+void common_hal_alarm_set_wake_alarm(mp_obj_t alarm) {
+ // Equivalent of:
+ // alarm.wake_alarm = alarm
+ mp_map_elem_t *elem =
+ mp_map_lookup(&alarm_module_globals.map, MP_ROM_QSTR(MP_QSTR_wake_alarm), MP_MAP_LOOKUP);
+ if (elem) {
+ elem->value = alarm;
+ }
+}
+
+const mp_obj_module_t alarm_module = {
+ .base = { &mp_type_module },
+ .globals = (mp_obj_dict_t*)&alarm_module_globals,
+};
diff --git a/shared-bindings/alarm/__init__.h b/shared-bindings/alarm/__init__.h
new file mode 100644
index 000000000..5a8c613d9
--- /dev/null
+++ b/shared-bindings/alarm/__init__.h
@@ -0,0 +1,52 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Dan Halbert 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.
+ */
+
+#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_ALARM___INIT___H
+#define MICROPY_INCLUDED_SHARED_BINDINGS_ALARM___INIT___H
+
+#include "py/obj.h"
+
+#include "common-hal/alarm/__init__.h"
+
+extern mp_obj_t common_hal_alarm_light_sleep_until_alarms(size_t n_alarms, const mp_obj_t *alarms);
+
+// Deep sleep is a two step process. Alarms are set when the VM is valid but
+// everything is reset before entering deep sleep. Furthermore, deep sleep may
+// not actually happen if the user is connected to the device. In this case, the
+// supervisor will idle using `port_wait_for_interrupt`. After each call, it will
+// call alarm_woken_from_sleep to see if we've been woken by an alarm and if so,
+// it will exit idle as if deep sleep was exited.
+extern void common_hal_alarm_set_deep_sleep_alarms(size_t n_alarms, const mp_obj_t *alarms);
+// Deep sleep is entered outside of the VM so we omit the `common_hal_` prefix.
+extern NORETURN void alarm_enter_deep_sleep(void);
+
+// Used by wake-up code.
+extern void common_hal_alarm_set_wake_alarm(mp_obj_t alarm);
+
+// True if an alarm is alerting. This is most useful for pretend deep sleep.
+extern bool alarm_woken_from_sleep(void);
+
+#endif // MICROPY_INCLUDED_SHARED_BINDINGS_ALARM___INIT___H
diff --git a/shared-bindings/alarm/pin/PinAlarm.c b/shared-bindings/alarm/pin/PinAlarm.c
new file mode 100644
index 000000000..7a5617142
--- /dev/null
+++ b/shared-bindings/alarm/pin/PinAlarm.c
@@ -0,0 +1,131 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Dan Halbert 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 "shared-bindings/board/__init__.h"
+#include "shared-bindings/microcontroller/__init__.h"
+#include "shared-bindings/microcontroller/Pin.h"
+#include "shared-bindings/alarm/pin/PinAlarm.h"
+
+#include "py/nlr.h"
+#include "py/obj.h"
+#include "py/objproperty.h"
+#include "py/runtime.h"
+#include "supervisor/shared/translate.h"
+
+//| class PinAlarm:
+//| """Trigger an alarm when a pin changes state."""
+//|
+//| def __init__(self, pin: microcontroller.Pin, value: bool, edge: bool = False, pull: bool = False) -> None:
+//| """Create an alarm triggered by a `microcontroller.Pin` level. The alarm is not active
+//| until it is passed to an `alarm`-enabling function, such as `alarm.light_sleep_until_alarms()` or
+//| `alarm.exit_and_deep_sleep_until_alarms()`.
+//|
+//| :param microcontroller.Pin pin: The pin to monitor. On some ports, the choice of pin
+//| may be limited due to hardware restrictions, particularly for deep-sleep alarms.
+//| :param bool value: When active, trigger when the pin value is high (``True``) or low (``False``).
+//| On some ports, multiple `PinAlarm` objects may need to have coordinated values
+//| for deep-sleep alarms.
+//| :param bool edge: If ``True``, trigger only when there is a transition to the specified
+//| value of ``value``. If ``True``, if the alarm becomes active when the pin value already
+//| matches ``value``, the alarm is not triggered: the pin must transition from ``not value``
+//| to ``value`` to trigger the alarm. On some ports, edge-triggering may not be available,
+//| particularly for deep-sleep alarms.
+//| :param bool pull: Enable a pull-up or pull-down which pulls the pin to the level opposite
+//| that of ``value``. For instance, if ``value`` is set to ``True``, setting ``pull``
+//| to ``True`` will enable a pull-down, to hold the pin low normally until an outside signal
+//| pulls it high.
+//| """
+//| ...
+//|
+STATIC mp_obj_t alarm_pin_pin_alarm_make_new(const mp_obj_type_t *type, mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
+ alarm_pin_pin_alarm_obj_t *self = m_new_obj(alarm_pin_pin_alarm_obj_t);
+ self->base.type = &alarm_pin_pin_alarm_type;
+ enum { ARG_pin, ARG_value, ARG_edge, ARG_pull };
+ static const mp_arg_t allowed_args[] = {
+ { MP_QSTR_pin, MP_ARG_REQUIRED | MP_ARG_OBJ },
+ { MP_QSTR_value, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_BOOL },
+ { MP_QSTR_edge, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} },
+ { MP_QSTR_pull, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} },
+ };
+ mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
+ mp_arg_parse_all(0, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
+
+ mcu_pin_obj_t *pin = validate_obj_is_free_pin(args[ARG_pin].u_obj);
+
+ common_hal_alarm_pin_pin_alarm_construct(self,
+ pin,
+ args[ARG_value].u_bool,
+ args[ARG_edge].u_bool,
+ args[ARG_pull].u_bool);
+
+ return MP_OBJ_FROM_PTR(self);
+}
+
+//| pin: microcontroller.Pin
+//| """The trigger pin."""
+//|
+STATIC mp_obj_t alarm_pin_pin_alarm_obj_get_pin(mp_obj_t self_in) {
+ alarm_pin_pin_alarm_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ return common_hal_alarm_pin_pin_alarm_get_pin(self);
+}
+MP_DEFINE_CONST_FUN_OBJ_1(alarm_pin_pin_alarm_get_pin_obj, alarm_pin_pin_alarm_obj_get_pin);
+
+const mp_obj_property_t alarm_pin_pin_alarm_pin_obj = {
+ .base.type = &mp_type_property,
+ .proxy = {(mp_obj_t)&alarm_pin_pin_alarm_get_pin_obj,
+ (mp_obj_t)&mp_const_none_obj,
+ (mp_obj_t)&mp_const_none_obj},
+};
+
+//| value: bool
+//| """The value on which to trigger."""
+//|
+STATIC mp_obj_t alarm_pin_pin_alarm_obj_get_value(mp_obj_t self_in) {
+ alarm_pin_pin_alarm_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ return mp_obj_new_bool(common_hal_alarm_pin_pin_alarm_get_value(self));
+}
+MP_DEFINE_CONST_FUN_OBJ_1(alarm_pin_pin_alarm_get_value_obj, alarm_pin_pin_alarm_obj_get_value);
+
+const mp_obj_property_t alarm_pin_pin_alarm_value_obj = {
+ .base.type = &mp_type_property,
+ .proxy = {(mp_obj_t)&alarm_pin_pin_alarm_get_value_obj,
+ (mp_obj_t)&mp_const_none_obj,
+ (mp_obj_t)&mp_const_none_obj},
+};
+
+STATIC const mp_rom_map_elem_t alarm_pin_pin_alarm_locals_dict_table[] = {
+ { MP_ROM_QSTR(MP_QSTR_pin), MP_ROM_PTR(&alarm_pin_pin_alarm_pin_obj) },
+ { MP_ROM_QSTR(MP_QSTR_value), MP_ROM_PTR(&alarm_pin_pin_alarm_value_obj) },
+};
+
+STATIC MP_DEFINE_CONST_DICT(alarm_pin_pin_alarm_locals_dict, alarm_pin_pin_alarm_locals_dict_table);
+
+const mp_obj_type_t alarm_pin_pin_alarm_type = {
+ { &mp_type_type },
+ .name = MP_QSTR_PinAlarm,
+ .make_new = alarm_pin_pin_alarm_make_new,
+ .locals_dict = (mp_obj_t)&alarm_pin_pin_alarm_locals_dict,
+};
diff --git a/shared-bindings/alarm/pin/PinAlarm.h b/shared-bindings/alarm/pin/PinAlarm.h
new file mode 100644
index 000000000..49ba71089
--- /dev/null
+++ b/shared-bindings/alarm/pin/PinAlarm.h
@@ -0,0 +1,43 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Dan Halbert 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.
+ */
+
+#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_ALARM_PIN_PIN_ALARM_H
+#define MICROPY_INCLUDED_SHARED_BINDINGS_ALARM_PIN_PIN_ALARM_H
+
+#include "py/obj.h"
+#include "py/objtuple.h"
+#include "common-hal/microcontroller/Pin.h"
+#include "common-hal/alarm/pin/PinAlarm.h"
+
+extern const mp_obj_type_t alarm_pin_pin_alarm_type;
+
+void common_hal_alarm_pin_pin_alarm_construct(alarm_pin_pin_alarm_obj_t *self, mcu_pin_obj_t *pin, bool value, bool edge, bool pull);
+extern mcu_pin_obj_t *common_hal_alarm_pin_pin_alarm_get_pin(alarm_pin_pin_alarm_obj_t *self);
+extern bool common_hal_alarm_pin_pin_alarm_get_value(alarm_pin_pin_alarm_obj_t *self);
+extern bool common_hal_alarm_pin_pin_alarm_get_edge(alarm_pin_pin_alarm_obj_t *self);
+extern bool common_hal_alarm_pin_pin_alarm_get_pull(alarm_pin_pin_alarm_obj_t *self);
+
+#endif // MICROPY_INCLUDED_SHARED_BINDINGS_ALARM_PIN_PIN_ALARM_H
diff --git a/shared-bindings/alarm/time/TimeAlarm.c b/shared-bindings/alarm/time/TimeAlarm.c
new file mode 100644
index 000000000..1c4d976ad
--- /dev/null
+++ b/shared-bindings/alarm/time/TimeAlarm.c
@@ -0,0 +1,143 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Dan Halbert 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 "py/nlr.h"
+#include "py/obj.h"
+#include "py/objproperty.h"
+#include "py/runtime.h"
+
+#include "shared-bindings/time/__init__.h"
+#include "shared-bindings/alarm/time/TimeAlarm.h"
+
+#include "supervisor/shared/translate.h"
+
+#if MICROPY_LONGINT_IMPL != MICROPY_LONGINT_IMPL_NONE
+mp_obj_t MP_WEAK rtc_get_time_source_time(void) {
+ mp_raise_RuntimeError(translate("RTC is not supported on this board"));
+}
+#endif
+
+//| class TimeAlarm:
+//| """Trigger an alarm when the specified time is reached."""
+//|
+//| def __init__(self, monotonic_time: Optional[float] = None, epoch_time: Optional[int] = None) -> None:
+//| """Create an alarm that will be triggered when `time.monotonic()` would equal
+//| ``monotonic_time``, or when `time.time()` would equal ``epoch_time``.
+//| Only one of the two arguments can be given.
+//| The alarm is not active until it is passed to an
+//| `alarm`-enabling function, such as `alarm.light_sleep_until_alarms()` or
+//| `alarm.exit_and_deep_sleep_until_alarms()`.
+//|
+//| If the given time is in the past when sleep occurs, the alarm will be triggered
+//| immediately.
+//| """
+//| ...
+//|
+STATIC mp_obj_t alarm_time_time_alarm_make_new(const mp_obj_type_t *type,
+ mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
+ alarm_time_time_alarm_obj_t *self = m_new_obj(alarm_time_time_alarm_obj_t);
+ self->base.type = &alarm_time_time_alarm_type;
+
+ enum { ARG_monotonic_time, ARG_epoch_time };
+ static const mp_arg_t allowed_args[] = {
+ { MP_QSTR_monotonic_time, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
+ { MP_QSTR_epoch_time, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
+ };
+
+ mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
+ mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
+
+ bool have_monotonic = args[ARG_monotonic_time].u_obj != mp_const_none;
+ bool have_epoch = args[ARG_epoch_time].u_obj != mp_const_none;
+
+ if (!(have_monotonic ^ have_epoch)) {
+ mp_raise_ValueError(translate("Supply one of monotonic_time or epoch_time"));
+ }
+
+ mp_float_t monotonic_time = 0; // To avoid compiler warning.
+ if (have_monotonic) {
+ monotonic_time = mp_obj_get_float(args[ARG_monotonic_time].u_obj);
+ }
+
+ mp_float_t monotonic_time_now = common_hal_time_monotonic_ms() / 1000.0;
+
+ if (have_epoch) {
+#if MICROPY_LONGINT_IMPL == MICROPY_LONGINT_IMPL_NONE
+ mp_raise_ValueError(translate("epoch_time not supported on this board"));
+#else
+ mp_uint_t epoch_time_secs = mp_obj_int_get_checked(args[ARG_epoch_time].u_obj);
+
+ timeutils_struct_time_t tm;
+ struct_time_to_tm(rtc_get_time_source_time(), &tm);
+ mp_uint_t epoch_secs_now = timeutils_seconds_since_epoch(tm.tm_year, tm.tm_mon, tm.tm_mday,
+ tm.tm_hour, tm.tm_min, tm.tm_sec);
+ // How far in the future (in secs) is the requested time?
+ mp_int_t epoch_diff = epoch_time_secs - epoch_secs_now;
+ // Convert it to a future monotonic time.
+ monotonic_time = monotonic_time_now + epoch_diff;
+#endif
+ }
+
+ if (monotonic_time < monotonic_time_now) {
+ mp_raise_ValueError(translate("Time is in the past."));
+ }
+
+ common_hal_alarm_time_time_alarm_construct(self, monotonic_time);
+
+ return MP_OBJ_FROM_PTR(self);
+}
+
+//| monotonic_time: float
+//| """When this time is reached, the alarm will trigger, based on the `time.monotonic()` clock.
+//| The time may be given as ``epoch_time`` in the constructor, but it is returned
+//| by this property only as a `time.monotonic()` time.
+//| """
+//|
+STATIC mp_obj_t alarm_time_time_alarm_obj_get_monotonic_time(mp_obj_t self_in) {
+ alarm_time_time_alarm_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ return mp_obj_new_float(common_hal_alarm_time_time_alarm_get_monotonic_time(self));
+}
+MP_DEFINE_CONST_FUN_OBJ_1(alarm_time_time_alarm_get_monotonic_time_obj, alarm_time_time_alarm_obj_get_monotonic_time);
+
+const mp_obj_property_t alarm_time_time_alarm_monotonic_time_obj = {
+ .base.type = &mp_type_property,
+ .proxy = {(mp_obj_t)&alarm_time_time_alarm_get_monotonic_time_obj,
+ (mp_obj_t)&mp_const_none_obj,
+ (mp_obj_t)&mp_const_none_obj},
+};
+
+STATIC const mp_rom_map_elem_t alarm_time_time_alarm_locals_dict_table[] = {
+ { MP_ROM_QSTR(MP_QSTR_monotonic_time), MP_ROM_PTR(&alarm_time_time_alarm_monotonic_time_obj) },
+};
+
+STATIC MP_DEFINE_CONST_DICT(alarm_time_time_alarm_locals_dict, alarm_time_time_alarm_locals_dict_table);
+
+const mp_obj_type_t alarm_time_time_alarm_type = {
+ { &mp_type_type },
+ .name = MP_QSTR_TimeAlarm,
+ .make_new = alarm_time_time_alarm_make_new,
+ .locals_dict = (mp_obj_t)&alarm_time_time_alarm_locals_dict,
+};
diff --git a/ports/cxd56/boards/board.h b/shared-bindings/alarm/time/TimeAlarm.h
index 597ae72e6..ceb3291c9 100644
--- a/ports/cxd56/boards/board.h
+++ b/shared-bindings/alarm/time/TimeAlarm.h
@@ -3,7 +3,7 @@
*
* The MIT License (MIT)
*
- * Copyright 2019 Sony Semiconductor Solutions Corporation
+ * Copyright (c) 2020 Dan Halbert 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
@@ -24,22 +24,16 @@
* THE SOFTWARE.
*/
-// This file defines board specific functions.
+#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_ALARM_TIME_MONOTONIC_TIME_ALARM_H
+#define MICROPY_INCLUDED_SHARED_BINDINGS_ALARM_TIME_MONOTINIC_TIME_ALARM_H
-#ifndef MICROPY_INCLUDED_CXD56_BOARDS_BOARD_H
-#define MICROPY_INCLUDED_CXD56_BOARDS_BOARD_H
+#include "py/obj.h"
-#include <stdbool.h>
+#include "common-hal/alarm/time/TimeAlarm.h"
-// Initializes board related state once on start up.
-void board_init(void);
+extern const mp_obj_type_t alarm_time_time_alarm_type;
-// Returns true if the user initiates safe mode in a board specific way.
-// Also add BOARD_USER_SAFE_MODE in mpconfigboard.h to explain the board specific
-// way.
-bool board_requests_safe_mode(void);
+extern void common_hal_alarm_time_time_alarm_construct(alarm_time_time_alarm_obj_t *self, mp_float_t monotonic_time);
+extern mp_float_t common_hal_alarm_time_time_alarm_get_monotonic_time(alarm_time_time_alarm_obj_t *self);
-// Reset the state of off MCU components such as neopixels.
-void reset_board(void);
-
-#endif // MICROPY_INCLUDED_CXD56_BOARDS_BOARD_H
+#endif // MICROPY_INCLUDED_SHARED_BINDINGS_ALARM_TIME_MONOTONIC_TIME_ALARM_H
diff --git a/shared-bindings/audiopwmio/__init__.h b/shared-bindings/audiopwmio/__init__.h
index e4b7067d1..d7956d31e 100644
--- a/shared-bindings/audiopwmio/__init__.h
+++ b/shared-bindings/audiopwmio/__init__.h
@@ -24,11 +24,11 @@
* THE SOFTWARE.
*/
-#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_AUDIOIO___INIT___H
-#define MICROPY_INCLUDED_SHARED_BINDINGS_AUDIOIO___INIT___H
+#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_AUDIOPWMIO___INIT___H
+#define MICROPY_INCLUDED_SHARED_BINDINGS_AUDIOPWMIO___INIT___H
#include "py/obj.h"
// Nothing now.
-#endif // MICROPY_INCLUDED_SHARED_BINDINGS_AUDIOIO___INIT___H
+#endif // MICROPY_INCLUDED_SHARED_BINDINGS_AUDIOPWMIO___INIT___H
diff --git a/shared-bindings/displayio/ColorConverter.c b/shared-bindings/displayio/ColorConverter.c
index 0e6e9bfd9..88d3a1ba8 100644
--- a/shared-bindings/displayio/ColorConverter.c
+++ b/shared-bindings/displayio/ColorConverter.c
@@ -116,7 +116,7 @@ const mp_obj_property_t displayio_colorconverter_dither_obj = {
STATIC mp_obj_t displayio_colorconverter_make_transparent(mp_obj_t self_in, mp_obj_t transparent_color_obj) {
displayio_colorconverter_t *self = MP_OBJ_TO_PTR(self_in);
- mp_int_t transparent_color = mp_obj_get_int(&transparent_color);
+ mp_int_t transparent_color = mp_obj_get_int(transparent_color_obj);
common_hal_displayio_colorconverter_make_transparent(self, transparent_color);
return mp_const_none;
}
@@ -128,7 +128,7 @@ MP_DEFINE_CONST_FUN_OBJ_2(displayio_colorconverter_make_transparent_obj, display
STATIC mp_obj_t displayio_colorconverter_make_opaque(mp_obj_t self_in, mp_obj_t transparent_color_obj) {
displayio_colorconverter_t *self = MP_OBJ_TO_PTR(self_in);
- mp_int_t transparent_color = mp_obj_get_int(&transparent_color);
+ mp_int_t transparent_color = mp_obj_get_int(transparent_color_obj);
common_hal_displayio_colorconverter_make_opaque(self, transparent_color);
return mp_const_none;
}
diff --git a/shared-bindings/displayio/EPaperDisplay.c b/shared-bindings/displayio/EPaperDisplay.c
index ebff64008..4f5c47aca 100644
--- a/shared-bindings/displayio/EPaperDisplay.c
+++ b/shared-bindings/displayio/EPaperDisplay.c
@@ -294,6 +294,29 @@ const mp_obj_property_t displayio_epaperdisplay_height_obj = {
(mp_obj_t)&mp_const_none_obj},
};
+//| rotation: int
+//| """The rotation of the display as an int in degrees."""
+//|
+STATIC mp_obj_t displayio_epaperdisplay_obj_get_rotation(mp_obj_t self_in) {
+ displayio_epaperdisplay_obj_t *self = native_display(self_in);
+ return MP_OBJ_NEW_SMALL_INT(common_hal_displayio_epaperdisplay_get_rotation(self));
+}
+MP_DEFINE_CONST_FUN_OBJ_1(displayio_epaperdisplay_get_rotation_obj, displayio_epaperdisplay_obj_get_rotation);
+STATIC mp_obj_t displayio_epaperdisplay_obj_set_rotation(mp_obj_t self_in, mp_obj_t value) {
+ displayio_epaperdisplay_obj_t *self = native_display(self_in);
+ common_hal_displayio_epaperdisplay_set_rotation(self, mp_obj_get_int(value));
+ return mp_const_none;
+}
+MP_DEFINE_CONST_FUN_OBJ_2(displayio_epaperdisplay_set_rotation_obj, displayio_epaperdisplay_obj_set_rotation);
+
+
+const mp_obj_property_t displayio_epaperdisplay_rotation_obj = {
+ .base.type = &mp_type_property,
+ .proxy = {(mp_obj_t)&displayio_epaperdisplay_get_rotation_obj,
+ (mp_obj_t)&displayio_epaperdisplay_set_rotation_obj,
+ (mp_obj_t)&mp_const_none_obj},
+};
+
//| bus: _DisplayBus
//| """The bus being used by the display"""
//|
@@ -317,6 +340,7 @@ STATIC const mp_rom_map_elem_t displayio_epaperdisplay_locals_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_width), MP_ROM_PTR(&displayio_epaperdisplay_width_obj) },
{ MP_ROM_QSTR(MP_QSTR_height), MP_ROM_PTR(&displayio_epaperdisplay_height_obj) },
+ { MP_ROM_QSTR(MP_QSTR_rotation), MP_ROM_PTR(&displayio_epaperdisplay_rotation_obj) },
{ MP_ROM_QSTR(MP_QSTR_bus), MP_ROM_PTR(&displayio_epaperdisplay_bus_obj) },
{ MP_ROM_QSTR(MP_QSTR_busy), MP_ROM_PTR(&displayio_epaperdisplay_busy_obj) },
{ MP_ROM_QSTR(MP_QSTR_time_to_refresh), MP_ROM_PTR(&displayio_epaperdisplay_time_to_refresh_obj) },
diff --git a/shared-bindings/displayio/EPaperDisplay.h b/shared-bindings/displayio/EPaperDisplay.h
index f785203a4..14d4f6aa9 100644
--- a/shared-bindings/displayio/EPaperDisplay.h
+++ b/shared-bindings/displayio/EPaperDisplay.h
@@ -56,6 +56,8 @@ bool common_hal_displayio_epaperdisplay_get_busy(displayio_epaperdisplay_obj_t*
uint16_t common_hal_displayio_epaperdisplay_get_width(displayio_epaperdisplay_obj_t* self);
uint16_t common_hal_displayio_epaperdisplay_get_height(displayio_epaperdisplay_obj_t* self);
+uint16_t common_hal_displayio_epaperdisplay_get_rotation(displayio_epaperdisplay_obj_t* self);
+void common_hal_displayio_epaperdisplay_set_rotation(displayio_epaperdisplay_obj_t* self, int rotation);
mp_obj_t common_hal_displayio_epaperdisplay_get_bus(displayio_epaperdisplay_obj_t* self);
diff --git a/shared-bindings/i2cperipheral/I2CPeripheral.c b/shared-bindings/i2cperipheral/I2CPeripheral.c
index b5ac861b4..b5c268eb5 100644
--- a/shared-bindings/i2cperipheral/I2CPeripheral.c
+++ b/shared-bindings/i2cperipheral/I2CPeripheral.c
@@ -166,7 +166,7 @@ STATIC mp_obj_t i2cperipheral_i2c_peripheral_request(size_t n_args, const mp_obj
if (timeout_ms == 0) {
forever = true;
} else if (timeout_ms > 0) {
- timeout_end = common_hal_time_monotonic() + timeout_ms;
+ timeout_end = common_hal_time_monotonic_ms() + timeout_ms;
}
int last_error = 0;
@@ -200,7 +200,7 @@ STATIC mp_obj_t i2cperipheral_i2c_peripheral_request(size_t n_args, const mp_obj
}
return mp_obj_new_i2cperipheral_i2c_peripheral_request(self, address, is_read, is_restart);
- } while (forever || common_hal_time_monotonic() < timeout_end);
+ } while (forever || common_hal_time_monotonic_ms() < timeout_end);
if (timeout_ms > 0) {
mp_raise_OSError(MP_ETIMEDOUT);
@@ -322,8 +322,8 @@ STATIC mp_obj_t i2cperipheral_i2c_peripheral_request_read(size_t n_args, const m
int i = 0;
uint8_t *buffer = NULL;
- uint64_t timeout_end = common_hal_time_monotonic() + 10 * 1000;
- while (common_hal_time_monotonic() < timeout_end) {
+ uint64_t timeout_end = common_hal_time_monotonic_ms() + 10 * 1000;
+ while (common_hal_time_monotonic_ms() < timeout_end) {
RUN_BACKGROUND_TASKS;
if (mp_hal_is_interrupted()) {
break;
diff --git a/shared-bindings/microcontroller/Processor.c b/shared-bindings/microcontroller/Processor.c
index 8c703891d..90cc02fe3 100644
--- a/shared-bindings/microcontroller/Processor.c
+++ b/shared-bindings/microcontroller/Processor.c
@@ -67,6 +67,23 @@ const mp_obj_property_t mcu_processor_frequency_obj = {
},
};
+//| reset_reason: microcontroller.ResetReason
+//| """The reason the microcontroller started up from reset state."""
+//|
+STATIC mp_obj_t mcu_processor_get_reset_reason(mp_obj_t self) {
+ return cp_enum_find(&mcu_reset_reason_type, common_hal_mcu_processor_get_reset_reason());
+}
+
+MP_DEFINE_CONST_FUN_OBJ_1(mcu_processor_get_reset_reason_obj, mcu_processor_get_reset_reason);
+
+const mp_obj_property_t mcu_processor_reset_reason_obj = {
+ .base.type = &mp_type_property,
+ .proxy = {(mp_obj_t)&mcu_processor_get_reset_reason_obj, // getter
+ (mp_obj_t)&mp_const_none_obj, // no setter
+ (mp_obj_t)&mp_const_none_obj, // no deleter
+ },
+};
+
//| temperature: Optional[float]
//| """The on-chip temperature, in Celsius, as a float. (read-only)
//|
@@ -128,6 +145,7 @@ const mp_obj_property_t mcu_processor_voltage_obj = {
STATIC const mp_rom_map_elem_t mcu_processor_locals_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_frequency), MP_ROM_PTR(&mcu_processor_frequency_obj) },
+ { MP_ROM_QSTR(MP_QSTR_reset_reason), MP_ROM_PTR(&mcu_processor_reset_reason_obj) },
{ MP_ROM_QSTR(MP_QSTR_temperature), MP_ROM_PTR(&mcu_processor_temperature_obj) },
{ MP_ROM_QSTR(MP_QSTR_uid), MP_ROM_PTR(&mcu_processor_uid_obj) },
{ MP_ROM_QSTR(MP_QSTR_voltage), MP_ROM_PTR(&mcu_processor_voltage_obj) },
diff --git a/shared-bindings/microcontroller/Processor.h b/shared-bindings/microcontroller/Processor.h
index 0f520f940..98d479087 100644
--- a/shared-bindings/microcontroller/Processor.h
+++ b/shared-bindings/microcontroller/Processor.h
@@ -30,10 +30,12 @@
#include "py/obj.h"
#include "common-hal/microcontroller/Processor.h"
+#include "shared-bindings/microcontroller/ResetReason.h"
extern const mp_obj_type_t mcu_processor_type;
uint32_t common_hal_mcu_processor_get_frequency(void);
+mcu_reset_reason_t common_hal_mcu_processor_get_reset_reason(void);
float common_hal_mcu_processor_get_temperature(void);
void common_hal_mcu_processor_get_uid(uint8_t raw_id[]);
float common_hal_mcu_processor_get_voltage(void);
diff --git a/shared-bindings/microcontroller/ResetReason.c b/shared-bindings/microcontroller/ResetReason.c
new file mode 100644
index 000000000..1750e5520
--- /dev/null
+++ b/shared-bindings/microcontroller/ResetReason.c
@@ -0,0 +1,77 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 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 "py/obj.h"
+#include "py/enum.h"
+
+#include "shared-bindings/microcontroller/ResetReason.h"
+
+MAKE_ENUM_VALUE(mcu_reset_reason_type, reset_reason, POWER_ON, RESET_REASON_POWER_ON);
+MAKE_ENUM_VALUE(mcu_reset_reason_type, reset_reason, BROWNOUT, RESET_REASON_BROWNOUT);
+MAKE_ENUM_VALUE(mcu_reset_reason_type, reset_reason, SOFTWARE, RESET_REASON_SOFTWARE);
+MAKE_ENUM_VALUE(mcu_reset_reason_type, reset_reason, DEEP_SLEEP_ALARM, RESET_REASON_DEEP_SLEEP_ALARM);
+MAKE_ENUM_VALUE(mcu_reset_reason_type, reset_reason, RESET_PIN, RESET_REASON_RESET_PIN);
+MAKE_ENUM_VALUE(mcu_reset_reason_type, reset_reason, WATCHDOG, RESET_REASON_WATCHDOG);
+MAKE_ENUM_VALUE(mcu_reset_reason_type, reset_reason, UNKNOWN, RESET_REASON_UNKNOWN);
+
+//| class ResetReason:
+//| """The reason the microntroller was last reset"""
+//|
+//| POWER_ON: object
+//| """The microntroller was started from power off."""
+//|
+//| BROWNOUT: object
+//| """The microntroller was reset due to too low a voltage."""
+//|
+//| SOFTWARE: object
+//| """The microntroller was reset from software."""
+//|
+//| DEEP_SLEEP_ALARM: object
+//| """The microntroller was reset for deep sleep and restarted by an alarm."""
+//|
+//| RESET_PIN: object
+//| """The microntroller was reset by a signal on its reset pin. The pin might be connected to a reset button."""
+//|
+//| WATCHDOG: object
+//| """The microcontroller was reset by its watchdog timer."""
+//|
+//| UNKNOWN: object
+//| """The microntroller restarted for an unknown reason."""
+//|
+MAKE_ENUM_MAP(mcu_reset_reason) {
+ MAKE_ENUM_MAP_ENTRY(reset_reason, POWER_ON),
+ MAKE_ENUM_MAP_ENTRY(reset_reason, BROWNOUT),
+ MAKE_ENUM_MAP_ENTRY(reset_reason, SOFTWARE),
+ MAKE_ENUM_MAP_ENTRY(reset_reason, DEEP_SLEEP_ALARM),
+ MAKE_ENUM_MAP_ENTRY(reset_reason, RESET_PIN),
+ MAKE_ENUM_MAP_ENTRY(reset_reason, WATCHDOG),
+ MAKE_ENUM_MAP_ENTRY(reset_reason, UNKNOWN),
+};
+STATIC MP_DEFINE_CONST_DICT(mcu_reset_reason_locals_dict, mcu_reset_reason_locals_table);
+
+MAKE_PRINTER(microcontroller, mcu_reset_reason);
+
+MAKE_ENUM_TYPE(microcontroller, ResetReason, mcu_reset_reason);
diff --git a/shared-bindings/microcontroller/ResetReason.h b/shared-bindings/microcontroller/ResetReason.h
new file mode 100644
index 000000000..8ed5e4831
--- /dev/null
+++ b/shared-bindings/microcontroller/ResetReason.h
@@ -0,0 +1,45 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 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.
+ */
+
+#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_MCU_RESET_REASON__H
+#define MICROPY_INCLUDED_SHARED_BINDINGS_MCU_RESET_REASON__H
+
+#include "py/obj.h"
+#include "py/enum.h"
+
+typedef enum {
+ RESET_REASON_POWER_ON,
+ RESET_REASON_BROWNOUT,
+ RESET_REASON_SOFTWARE,
+ RESET_REASON_DEEP_SLEEP_ALARM,
+ RESET_REASON_RESET_PIN,
+ RESET_REASON_WATCHDOG,
+ RESET_REASON_UNKNOWN,
+} mcu_reset_reason_t;
+
+extern const mp_obj_type_t mcu_reset_reason_type;
+
+#endif // MICROPY_INCLUDED_SHARED_BINDINGS_MCU_RESET_REASON__H
diff --git a/shared-bindings/microcontroller/__init__.c b/shared-bindings/microcontroller/__init__.c
index 2e58bdcc2..035587c30 100644
--- a/shared-bindings/microcontroller/__init__.c
+++ b/shared-bindings/microcontroller/__init__.c
@@ -39,7 +39,6 @@
#include "shared-bindings/microcontroller/Pin.h"
#include "shared-bindings/microcontroller/Processor.h"
-#include "py/runtime.h"
#include "supervisor/shared/translate.h"
//| """Pin references and cpu functionality
@@ -148,16 +147,6 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_0(mcu_reset_obj, mcu_reset);
//| This object is the sole instance of `watchdog.WatchDogTimer` when available or ``None`` otherwise."""
//|
-
-//| """:mod:`microcontroller.pin` --- Microcontroller pin names
-//| --------------------------------------------------------
-//|
-//| .. module:: microcontroller.pin
-//| :synopsis: Microcontroller pin names
-//| :platform: SAMD21
-//|
-//| References to pins as named by the microcontroller"""
-//|
const mp_obj_module_t mcu_pin_module = {
.base = { &mp_type_module },
.globals = (mp_obj_dict_t*)&mcu_pin_globals,
@@ -181,6 +170,7 @@ STATIC const mp_rom_map_elem_t mcu_module_globals_table[] = {
#else
{ MP_ROM_QSTR(MP_QSTR_watchdog), MP_ROM_PTR(&mp_const_none_obj) },
#endif
+ { MP_ROM_QSTR(MP_QSTR_ResetReason), MP_ROM_PTR(&mcu_reset_reason_type) },
{ MP_ROM_QSTR(MP_QSTR_RunMode), MP_ROM_PTR(&mcu_runmode_type) },
{ MP_ROM_QSTR(MP_QSTR_Pin), MP_ROM_PTR(&mcu_pin_type) },
{ MP_ROM_QSTR(MP_QSTR_pin), MP_ROM_PTR(&mcu_pin_module) },
diff --git a/shared-bindings/microcontroller/__init__.h b/shared-bindings/microcontroller/__init__.h
index 8abdff763..0dafc74c7 100644
--- a/shared-bindings/microcontroller/__init__.h
+++ b/shared-bindings/microcontroller/__init__.h
@@ -1,4 +1,3 @@
-
/*
* This file is part of the MicroPython project, http://micropython.org/
*
@@ -28,11 +27,11 @@
#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_MICROCONTROLLER___INIT___H
#define MICROPY_INCLUDED_SHARED_BINDINGS_MICROCONTROLLER___INIT___H
-#include "py/mpconfig.h"
#include "py/obj.h"
+#include "py/mpconfig.h"
#include "common-hal/microcontroller/Processor.h"
-
+#include "shared-bindings/microcontroller/ResetReason.h"
#include "shared-bindings/microcontroller/RunMode.h"
extern void common_hal_mcu_delay_us(uint32_t);
diff --git a/shared-bindings/os/__init__.c b/shared-bindings/os/__init__.c
index c499df972..8b9b38911 100644
--- a/shared-bindings/os/__init__.c
+++ b/shared-bindings/os/__init__.c
@@ -160,7 +160,7 @@ mp_obj_t os_stat(mp_obj_t path_in) {
MP_DEFINE_CONST_FUN_OBJ_1(os_stat_obj, os_stat);
//| def statvfs(path: str) -> Tuple[int, int, int, int, int, int, int, int, int, int]:
-//| """Get the status of a fileystem.
+//| """Get the status of a filesystem.
//|
//| Returns a tuple with the filesystem information in the following order:
//|
@@ -168,10 +168,10 @@ MP_DEFINE_CONST_FUN_OBJ_1(os_stat_obj, os_stat);
//| * ``f_frsize`` -- fragment size
//| * ``f_blocks`` -- size of fs in f_frsize units
//| * ``f_bfree`` -- number of free blocks
-//| * ``f_bavail`` -- number of free blocks for unpriviliged users
+//| * ``f_bavail`` -- number of free blocks for unprivileged users
//| * ``f_files`` -- number of inodes
//| * ``f_ffree`` -- number of free inodes
-//| * ``f_favail`` -- number of free inodes for unpriviliged users
+//| * ``f_favail`` -- number of free inodes for unprivileged users
//| * ``f_flag`` -- mount flags
//| * ``f_namemax`` -- maximum filename length
//|
diff --git a/shared-bindings/ps2io/Ps2.c b/shared-bindings/ps2io/Ps2.c
index 0977e08ff..07fa5cebb 100644
--- a/shared-bindings/ps2io/Ps2.c
+++ b/shared-bindings/ps2io/Ps2.c
@@ -116,8 +116,9 @@ STATIC void check_for_deinit(ps2io_ps2_obj_t *self) {
//| ...
//|
STATIC mp_obj_t ps2io_ps2_obj___exit__(size_t n_args, const mp_obj_t *args) {
- (void)n_args;
- common_hal_ps2io_ps2_deinit(args[0]);
+ mp_check_self(MP_OBJ_IS_TYPE(args[0], &ps2io_ps2_type));
+ ps2io_ps2_obj_t *self = MP_OBJ_TO_PTR(args[0]);
+ common_hal_ps2io_ps2_deinit(self);
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(ps2io_ps2___exit___obj, 4, 4, ps2io_ps2_obj___exit__);
diff --git a/shared-bindings/random/__init__.h b/shared-bindings/random/__init__.h
index b5011b1a8..9e058051f 100644
--- a/shared-bindings/random/__init__.h
+++ b/shared-bindings/random/__init__.h
@@ -29,7 +29,7 @@
// This depends on shared_module because nearly all functionality is port
// agnostic. The random module only depends on the common_hal_os_urandom or
-// common_hal_time_monotonic to seed it initially.
+// common_hal_time_monotonic_ms to seed it initially.
void shared_modules_random_seed(mp_uint_t seed);
mp_uint_t shared_modules_random_getrandbits(uint8_t n);
diff --git a/shared-bindings/rotaryio/__init__.c b/shared-bindings/rotaryio/__init__.c
index fd8578753..cd967baa4 100644
--- a/shared-bindings/rotaryio/__init__.c
+++ b/shared-bindings/rotaryio/__init__.c
@@ -39,8 +39,6 @@
//| `Wikipedia's Rotary Encoder page <https://en.wikipedia.org/wiki/Rotary_encoder>`_ for more
//| background.
//|
-//| .. warning:: This module is not available in some SAMD21 (aka M0) builds. See the :ref:`module-support-matrix` for more info.
-//|
//| All classes change hardware state and should be deinitialized when they
//| are no longer needed if the program continues after use. To do so, either
//| call :py:meth:`!deinit` or use a context manager. See
diff --git a/shared-bindings/socketpool/Socket.c b/shared-bindings/socketpool/Socket.c
index 362e4d7e8..0e6968d5f 100644
--- a/shared-bindings/socketpool/Socket.c
+++ b/shared-bindings/socketpool/Socket.c
@@ -36,6 +36,8 @@
#include "py/runtime.h"
#include "py/mperrno.h"
+#include "lib/netutils/netutils.h"
+
//| class Socket:
//| """TCP, UDP and RAW socket. Cannot be created directly. Instead, call
//| `SocketPool.socket()`.
@@ -274,79 +276,63 @@ STATIC mp_obj_t socketpool_socket_recv_into(size_t n_args, const mp_obj_t *args)
}
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socketpool_socket_recv_into_obj, 2, 3, socketpool_socket_recv_into);
-// //| def sendto(self, bytes: ReadableBuffer, address: tuple) -> int:
-// //| """Send some bytes to a specific address.
-// //| Suits sockets of type SOCK_DGRAM
-// //|
-// //| :param ~bytes bytes: some bytes to send
-// //| :param ~tuple address: tuple of (remote_address, remote_port)"""
-// //| ...
-// //|
-
-// STATIC mp_obj_t socketpool_socket_sendto(mp_obj_t self_in, mp_obj_t data_in, mp_obj_t addr_in) {
-// // mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
+//| def sendto(self, bytes: ReadableBuffer, address: Tuple[str, int]) -> int:
+//| """Send some bytes to a specific address.
+//| Suits sockets of type SOCK_DGRAM
+//|
+//| :param ~bytes bytes: some bytes to send
+//| :param ~tuple address: tuple of (remote_address, remote_port)"""
+//| ...
+//|
-// // // get the data
-// // mp_buffer_info_t bufinfo;
-// // mp_get_buffer_raise(data_in, &bufinfo, MP_BUFFER_READ);
+STATIC mp_obj_t socketpool_socket_sendto(mp_obj_t self_in, mp_obj_t data_in, mp_obj_t addr_in) {
+ socketpool_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
-// // // get address
-// // uint8_t ip[MOD_NETWORK_IPADDR_BUF_SIZE];
-// // mp_uint_t port = netutils_parse_inet_addr(addr_in, ip, NETUTILS_BIG);
+ // get the data
+ mp_buffer_info_t bufinfo;
+ mp_get_buffer_raise(data_in, &bufinfo, MP_BUFFER_READ);
-// // // check if we need to select a NIC
-// // socket_select_nic(self, ip);
+ mp_obj_t *addr_items;
+ mp_obj_get_array_fixed_n(addr_in, 2, &addr_items);
-// // // call the NIC to sendto
-// // int _errno;
-// // mp_int_t ret = self->nic_type->sendto(self, bufinfo.buf, bufinfo.len, ip, port, &_errno);
-// // if (ret == -1) {
-// // mp_raise_OSError(_errno);
-// // }
-// mp_int_t ret = 0;
+ size_t hostlen;
+ const char* host = mp_obj_str_get_data(addr_items[0], &hostlen);
+ mp_int_t port = mp_obj_get_int(addr_items[1]);
-// return mp_obj_new_int(ret);
-// }
-// STATIC MP_DEFINE_CONST_FUN_OBJ_3(socketpool_socket_sendto_obj, socketpool_socket_sendto);
+ mp_int_t ret = common_hal_socketpool_socket_sendto(self, host, hostlen, port, bufinfo.buf, bufinfo.len);
+ if (!ret) {
+ mp_raise_OSError(0);
+ }
-// //| def recvfrom(self, bufsize: int) -> Tuple[bytes, tuple]:
-// //| """Reads some bytes from the connected remote address.
-// //| Suits sockets of type SOCK_STREAM
-// //|
-// //| Returns a tuple containing
-// //| * a bytes() of length <= bufsize
-// //| * a remote_address, which is a tuple of ip address and port number
-// //|
-// //| :param ~int bufsize: maximum number of bytes to receive"""
-// //| ...
-// //|
+ return mp_obj_new_int_from_uint(ret);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_3(socketpool_socket_sendto_obj, socketpool_socket_sendto);
-// STATIC mp_obj_t socketpool_socket_recvfrom_into(mp_obj_t self_in, mp_obj_t len_in) {
-// // mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
-// // if (self->nic == MP_OBJ_NULL) {
-// // // not connected
-// // mp_raise_OSError(MP_ENOTCONN);
-// // }
-// // vstr_t vstr;
-// // vstr_init_len(&vstr, mp_obj_get_int(len_in));
-// // byte ip[4];
-// // mp_uint_t port;
-// // int _errno;
-// // mp_int_t ret = self->nic_type->recvfrom(self, (byte*)vstr.buf, vstr.len, ip, &port, &_errno);
-// // if (ret == -1) {
-// // mp_raise_OSError(_errno);
-// // }
-// mp_obj_t tuple[2];
-// // if (ret == 0) {
-// // tuple[0] = mp_const_empty_bytes;
-// // } else {
-// // vstr.len = ret;
-// // tuple[0] = mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr);
-// // }
-// // tuple[1] = netutils_format_inet_addr(ip, port, NETUTILS_BIG);
-// return mp_obj_new_tuple(2, tuple);
-// }
-// STATIC MP_DEFINE_CONST_FUN_OBJ_2(socketpool_socket_recvfrom_into_obj, socketpool_socket_recvfrom_into);
+//| def recvfrom_into(self, buffer: WriteableBuffer) -> Tuple[int, Tuple[str, int]]:
+//| """Reads some bytes from a remote address.
+//|
+//| Returns a tuple containing
+//| * the number of bytes received into the given buffer
+//| * a remote_address, which is a tuple of ip address and port number
+//|
+//| :param object buffer: buffer to read into"""
+//| ...
+//|
+STATIC mp_obj_t socketpool_socket_recvfrom_into(mp_obj_t self_in, mp_obj_t data_in) {
+ socketpool_socket_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ mp_buffer_info_t bufinfo;
+ mp_get_buffer_raise(data_in, &bufinfo, MP_BUFFER_WRITE);
+
+ byte ip[4];
+ mp_uint_t port;
+ mp_int_t ret = common_hal_socketpool_socket_recvfrom_into(self,
+ (byte*)bufinfo.buf, bufinfo.len, ip, &port);
+ mp_obj_t tuple_contents[2];
+ tuple_contents[0] = mp_obj_new_int_from_uint(ret);
+ tuple_contents[1] = netutils_format_inet_addr(ip, port, NETUTILS_BIG);
+ return mp_obj_new_tuple(2, tuple_contents);
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(socketpool_socket_recvfrom_into_obj, socketpool_socket_recvfrom_into);
// //| def setsockopt(self, level: int, optname: int, value: int) -> None:
// //| """Sets socket options"""
@@ -449,8 +435,8 @@ STATIC const mp_rom_map_elem_t socketpool_socket_locals_dict_table[] = {
// { MP_ROM_QSTR(MP_QSTR_accept), MP_ROM_PTR(&socketpool_socket_accept_obj) },
{ MP_ROM_QSTR(MP_QSTR_connect), MP_ROM_PTR(&socketpool_socket_connect_obj) },
{ MP_ROM_QSTR(MP_QSTR_send), MP_ROM_PTR(&socketpool_socket_send_obj) },
- // { MP_ROM_QSTR(MP_QSTR_sendto), MP_ROM_PTR(&socketpool_socket_sendto_obj) },
- // { MP_ROM_QSTR(MP_QSTR_recvfrom_into), MP_ROM_PTR(&socketpool_socket_recvfrom_into_obj) },
+ { MP_ROM_QSTR(MP_QSTR_sendto), MP_ROM_PTR(&socketpool_socket_sendto_obj) },
+ { MP_ROM_QSTR(MP_QSTR_recvfrom_into), MP_ROM_PTR(&socketpool_socket_recvfrom_into_obj) },
{ MP_ROM_QSTR(MP_QSTR_recv_into), MP_ROM_PTR(&socketpool_socket_recv_into_obj) },
// { MP_ROM_QSTR(MP_QSTR_setsockopt), MP_ROM_PTR(&socketpool_socket_setsockopt_obj) },
{ MP_ROM_QSTR(MP_QSTR_settimeout), MP_ROM_PTR(&socketpool_socket_settimeout_obj) },
diff --git a/shared-bindings/socketpool/Socket.h b/shared-bindings/socketpool/Socket.h
index f0be95c92..54fbe59b2 100644
--- a/shared-bindings/socketpool/Socket.h
+++ b/shared-bindings/socketpool/Socket.h
@@ -35,6 +35,10 @@ void common_hal_socketpool_socket_settimeout(socketpool_socket_obj_t* self, mp_u
bool common_hal_socketpool_socket_connect(socketpool_socket_obj_t* self, const char* host, size_t hostlen, mp_int_t port);
mp_uint_t common_hal_socketpool_socket_send(socketpool_socket_obj_t* self, const uint8_t* buf, mp_uint_t len);
mp_uint_t common_hal_socketpool_socket_recv_into(socketpool_socket_obj_t* self, const uint8_t* buf, mp_uint_t len);
+mp_uint_t common_hal_socketpool_socket_sendto(socketpool_socket_obj_t* self,
+ const char* host, size_t hostlen, uint8_t port, const uint8_t* buf, mp_uint_t len);
+mp_uint_t common_hal_socketpool_socket_recvfrom_into(socketpool_socket_obj_t* self,
+ uint8_t* buf, mp_uint_t len, uint8_t* ip, uint *port);
void common_hal_socketpool_socket_close(socketpool_socket_obj_t* self);
bool common_hal_socketpool_socket_get_closed(socketpool_socket_obj_t* self);
bool common_hal_socketpool_socket_get_connected(socketpool_socket_obj_t* self);
diff --git a/shared-bindings/supervisor/RunReason.c b/shared-bindings/supervisor/RunReason.c
new file mode 100644
index 000000000..a2a5fe13e
--- /dev/null
+++ b/shared-bindings/supervisor/RunReason.c
@@ -0,0 +1,62 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 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 "py/enum.h"
+
+#include "shared-bindings/supervisor/RunReason.h"
+
+MAKE_ENUM_VALUE(supervisor_run_reason_type, run_reason, STARTUP, RUN_REASON_STARTUP);
+MAKE_ENUM_VALUE(supervisor_run_reason_type, run_reason, AUTO_RELOAD, RUN_REASON_AUTO_RELOAD);
+MAKE_ENUM_VALUE(supervisor_run_reason_type, run_reason, SUPERVISOR_RELOAD, RUN_REASON_SUPERVISOR_RELOAD);
+MAKE_ENUM_VALUE(supervisor_run_reason_type, run_reason, REPL_RELOAD, RUN_REASON_REPL_RELOAD);
+
+//| class RunReason:
+//| """The reason that CircuitPython started running."""
+//|
+//| STARTUP: object
+//| """CircuitPython started the microcontroller started up. See `microcontroller.Processor.reset_reason`
+//| for more detail on why the microcontroller was started."""
+//|
+//| AUTO_RELOAD: object
+//| """CircuitPython restarted due to an external write to the filesystem."""
+//|
+//| SUPERVISOR_RELOAD: object
+//| """CircuitPython restarted due to a call to `supervisor.reload()`."""
+//|
+//| REPL_RELOAD: object
+//| """CircuitPython started due to the user typing CTRL-D in the REPL."""
+//|
+MAKE_ENUM_MAP(supervisor_run_reason) {
+ MAKE_ENUM_MAP_ENTRY(run_reason, STARTUP),
+ MAKE_ENUM_MAP_ENTRY(run_reason, AUTO_RELOAD),
+ MAKE_ENUM_MAP_ENTRY(run_reason, SUPERVISOR_RELOAD),
+ MAKE_ENUM_MAP_ENTRY(run_reason, REPL_RELOAD),
+};
+STATIC MP_DEFINE_CONST_DICT(supervisor_run_reason_locals_dict, supervisor_run_reason_locals_table);
+
+MAKE_PRINTER(supervisor, supervisor_run_reason);
+
+MAKE_ENUM_TYPE(supervisor, RunReason, supervisor_run_reason);
diff --git a/shared-bindings/supervisor/RunReason.h b/shared-bindings/supervisor/RunReason.h
new file mode 100644
index 000000000..391e6d306
--- /dev/null
+++ b/shared-bindings/supervisor/RunReason.h
@@ -0,0 +1,36 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 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.
+ */
+
+#pragma once
+
+typedef enum {
+ RUN_REASON_STARTUP,
+ RUN_REASON_AUTO_RELOAD,
+ RUN_REASON_SUPERVISOR_RELOAD,
+ RUN_REASON_REPL_RELOAD,
+} supervisor_run_reason_t;
+
+extern const mp_obj_type_t supervisor_run_reason_type;
diff --git a/shared-bindings/supervisor/Runtime.c b/shared-bindings/supervisor/Runtime.c
index bfca6e7b1..8e0259a3b 100755
--- a/shared-bindings/supervisor/Runtime.c
+++ b/shared-bindings/supervisor/Runtime.c
@@ -25,9 +25,16 @@
*/
#include <stdbool.h>
+#include "py/obj.h"
+#include "py/enum.h"
+#include "py/runtime.h"
#include "py/objproperty.h"
+
+#include "shared-bindings/supervisor/RunReason.h"
#include "shared-bindings/supervisor/Runtime.h"
+STATIC supervisor_run_reason_t _run_reason;
+
//TODO: add USB, REPL to description once they're operational
//| class Runtime:
//| """Current status of runtime objects.
@@ -90,9 +97,29 @@ const mp_obj_property_t supervisor_serial_bytes_available_obj = {
};
+//| run_reason: RunReason
+//| """Returns why CircuitPython started running this particular time."""
+//|
+STATIC mp_obj_t supervisor_get_run_reason(mp_obj_t self) {
+ return cp_enum_find(&supervisor_run_reason_type, _run_reason);
+}
+MP_DEFINE_CONST_FUN_OBJ_1(supervisor_get_run_reason_obj, supervisor_get_run_reason);
+
+const mp_obj_property_t supervisor_run_reason_obj = {
+ .base.type = &mp_type_property,
+ .proxy = {(mp_obj_t)&supervisor_get_run_reason_obj,
+ (mp_obj_t)&mp_const_none_obj,
+ (mp_obj_t)&mp_const_none_obj},
+};
+
+void supervisor_set_run_reason(supervisor_run_reason_t run_reason) {
+ _run_reason = run_reason;
+}
+
STATIC const mp_rom_map_elem_t supervisor_runtime_locals_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_serial_connected), MP_ROM_PTR(&supervisor_serial_connected_obj) },
{ MP_ROM_QSTR(MP_QSTR_serial_bytes_available), MP_ROM_PTR(&supervisor_serial_bytes_available_obj) },
+ { MP_ROM_QSTR(MP_QSTR_run_reason), MP_ROM_PTR(&supervisor_run_reason_obj) },
};
STATIC MP_DEFINE_CONST_DICT(supervisor_runtime_locals_dict, supervisor_runtime_locals_dict_table);
diff --git a/shared-bindings/supervisor/Runtime.h b/shared-bindings/supervisor/Runtime.h
index 2dc59c3ab..51ed7604d 100755
--- a/shared-bindings/supervisor/Runtime.h
+++ b/shared-bindings/supervisor/Runtime.h
@@ -30,9 +30,12 @@
#include <stdbool.h>
#include "py/obj.h"
+#include "shared-bindings/supervisor/RunReason.h"
extern const mp_obj_type_t supervisor_runtime_type;
+void supervisor_set_run_reason(supervisor_run_reason_t run_reason);
+
bool common_hal_get_serial_connected(void);
bool common_hal_get_serial_bytes_available(void);
diff --git a/shared-bindings/supervisor/__init__.c b/shared-bindings/supervisor/__init__.c
index bc6fdbff5..ad8603047 100644
--- a/shared-bindings/supervisor/__init__.c
+++ b/shared-bindings/supervisor/__init__.c
@@ -32,7 +32,9 @@
#include "supervisor/shared/rgb_led_status.h"
#include "supervisor/shared/stack.h"
#include "supervisor/shared/translate.h"
+#include "supervisor/shared/workflow.h"
+#include "shared-bindings/microcontroller/__init__.h"
#include "shared-bindings/supervisor/__init__.h"
#include "shared-bindings/supervisor/Runtime.h"
@@ -88,6 +90,7 @@ MP_DEFINE_CONST_FUN_OBJ_1(supervisor_set_rgb_status_brightness_obj, supervisor_s
//|
STATIC mp_obj_t supervisor_reload(void) {
reload_requested = true;
+ supervisor_set_run_reason(RUN_REASON_SUPERVISOR_RELOAD);
mp_raise_reload_exception();
return mp_const_none;
}
@@ -111,11 +114,12 @@ MP_DEFINE_CONST_FUN_OBJ_1(supervisor_set_next_stack_limit_obj, supervisor_set_ne
STATIC const mp_rom_map_elem_t supervisor_module_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_supervisor) },
- { MP_OBJ_NEW_QSTR(MP_QSTR_enable_autoreload), MP_ROM_PTR(&supervisor_enable_autoreload_obj) },
- { MP_OBJ_NEW_QSTR(MP_QSTR_disable_autoreload), MP_ROM_PTR(&supervisor_disable_autoreload_obj) },
- { MP_OBJ_NEW_QSTR(MP_QSTR_set_rgb_status_brightness), MP_ROM_PTR(&supervisor_set_rgb_status_brightness_obj) },
+ { MP_ROM_QSTR(MP_QSTR_enable_autoreload), MP_ROM_PTR(&supervisor_enable_autoreload_obj) },
+ { MP_ROM_QSTR(MP_QSTR_disable_autoreload), MP_ROM_PTR(&supervisor_disable_autoreload_obj) },
+ { MP_ROM_QSTR(MP_QSTR_set_rgb_status_brightness), MP_ROM_PTR(&supervisor_set_rgb_status_brightness_obj) },
{ MP_ROM_QSTR(MP_QSTR_runtime), MP_ROM_PTR(&common_hal_supervisor_runtime_obj) },
{ MP_ROM_QSTR(MP_QSTR_reload), MP_ROM_PTR(&supervisor_reload_obj) },
+ { MP_ROM_QSTR(MP_QSTR_RunReason), MP_ROM_PTR(&supervisor_run_reason_type) },
{ MP_ROM_QSTR(MP_QSTR_set_next_stack_limit), MP_ROM_PTR(&supervisor_set_next_stack_limit_obj) },
};
diff --git a/shared-bindings/time/__init__.c b/shared-bindings/time/__init__.c
index 44f82c62e..2624384af 100644
--- a/shared-bindings/time/__init__.c
+++ b/shared-bindings/time/__init__.c
@@ -51,9 +51,8 @@
//| ...
//|
STATIC mp_obj_t time_monotonic(void) {
- uint64_t time64 = common_hal_time_monotonic();
- // 4294967296 = 2^32
- return mp_obj_new_float(((uint32_t) (time64 >> 32) * 4294967296.0f + (uint32_t) (time64 & 0xffffffff)) / 1000.0f);
+ uint64_t ticks_ms = common_hal_time_monotonic_ms();
+ return mp_obj_new_float(uint64_to_float(ticks_ms) / 1000.0f);
}
MP_DEFINE_CONST_FUN_OBJ_0(time_monotonic_obj, time_monotonic);
diff --git a/shared-bindings/time/__init__.h b/shared-bindings/time/__init__.h
index ec96aea24..4e716e9df 100644
--- a/shared-bindings/time/__init__.h
+++ b/shared-bindings/time/__init__.h
@@ -35,7 +35,7 @@
extern mp_obj_t struct_time_from_tm(timeutils_struct_time_t *tm);
extern void struct_time_to_tm(mp_obj_t t, timeutils_struct_time_t *tm);
-extern uint64_t common_hal_time_monotonic(void);
+extern uint64_t common_hal_time_monotonic_ms(void);
extern uint64_t common_hal_time_monotonic_ns(void);
extern void common_hal_time_delay_ms(uint32_t);
diff --git a/shared-bindings/watchdog/WatchDogTimer.c b/shared-bindings/watchdog/WatchDogTimer.c
index 09219f710..575021a21 100644
--- a/shared-bindings/watchdog/WatchDogTimer.c
+++ b/shared-bindings/watchdog/WatchDogTimer.c
@@ -66,6 +66,7 @@ STATIC mp_obj_t watchdog_watchdogtimer_feed(mp_obj_t self_in) {
if (current_mode == WATCHDOGMODE_NONE) {
mp_raise_ValueError(translate("WatchDogTimer is not currently running"));
}
+
common_hal_watchdog_feed(self);
return mp_const_none;
}
@@ -78,12 +79,6 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(watchdog_watchdogtimer_feed_obj, watchdog_watch
//|
STATIC mp_obj_t watchdog_watchdogtimer_deinit(mp_obj_t self_in) {
watchdog_watchdogtimer_obj_t *self = MP_OBJ_TO_PTR(self_in);
- watchdog_watchdogmode_t current_mode = common_hal_watchdog_get_mode(self);
-
- if (current_mode == WATCHDOGMODE_RESET) {
- mp_raise_NotImplementedError(translate("WatchDogTimer cannot be deinitialized once mode is set to RESET"));
- }
-
common_hal_watchdog_deinit(self);
return mp_const_none;
}
diff --git a/shared-bindings/wifi/Radio.c b/shared-bindings/wifi/Radio.c
index e81e8793c..edbd9fd2f 100644
--- a/shared-bindings/wifi/Radio.c
+++ b/shared-bindings/wifi/Radio.c
@@ -48,17 +48,28 @@
//|
//| enabled: bool
-//| """True when the wifi radio is enabled."""
+//| """``True`` when the wifi radio is enabled.
+//| If you set the value to ``False``, any open sockets will be closed.
+//| """
//|
STATIC mp_obj_t wifi_radio_get_enabled(mp_obj_t self) {
return mp_obj_new_bool(common_hal_wifi_radio_get_enabled(self));
}
MP_DEFINE_CONST_FUN_OBJ_1(wifi_radio_get_enabled_obj, wifi_radio_get_enabled);
+static mp_obj_t wifi_radio_set_enabled(mp_obj_t self, mp_obj_t value) {
+ const bool enabled = mp_obj_is_true(value);
+
+ common_hal_wifi_radio_set_enabled(self, enabled);
+
+ return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_2(wifi_radio_set_enabled_obj, wifi_radio_set_enabled);
+
const mp_obj_property_t wifi_radio_enabled_obj = {
.base.type = &mp_type_property,
.proxy = { (mp_obj_t)&wifi_radio_get_enabled_obj,
- (mp_obj_t)&mp_const_none_obj,
+ (mp_obj_t)&wifi_radio_set_enabled_obj,
(mp_obj_t)&mp_const_none_obj },
};
@@ -142,9 +153,25 @@ const mp_obj_property_t wifi_radio_hostname_obj = {
(mp_obj_t)&mp_const_none_obj},
};
-//| def connect(self, ssid: ReadableBuffer, password: ReadableBuffer = b"", *, channel: Optional[int] = 0, timeout: Optional[float] = None) -> bool:
+//| def connect(self,
+//| ssid: ReadableBuffer,
+//| password: ReadableBuffer = b"",
+//| *,
+//| channel: Optional[int] = 0,
+//| bssid: Optional[ReadableBuffer] = b"",
+//| timeout: Optional[float] = None) -> bool:
//| """Connects to the given ssid and waits for an ip address. Reconnections are handled
-//| automatically once one connection succeeds."""
+//| automatically once one connection succeeds.
+//|
+//| By default, this will scan all channels and connect to the access point (AP) with the
+//| given ``ssid`` and greatest signal strength (rssi).
+//|
+//| If ``channel`` is given, the scan will begin with the given channel and connect to
+//| the first AP with the given ``ssid``. This can speed up the connection time
+//| significantly because a full scan doesn't occur.
+//|
+//| If ``bssid`` is given, the scan will start at the first channel or the one given and
+//| connect to the AP with the given ``bssid`` and ``ssid``."""
//| ...
//|
STATIC mp_obj_t wifi_radio_connect(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
diff --git a/shared-bindings/wifi/__init__.h b/shared-bindings/wifi/__init__.h
index c06ee16be..124c0bc49 100644
--- a/shared-bindings/wifi/__init__.h
+++ b/shared-bindings/wifi/__init__.h
@@ -34,5 +34,6 @@
extern wifi_radio_obj_t common_hal_wifi_radio_obj;
void common_hal_wifi_init(void);
+void common_hal_wifi_gc_collect(void);
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_WIFI___INIT___H
diff --git a/shared-module/_eve/__init__.c b/shared-module/_eve/__init__.c
index 0f1e12d9f..d95c777dc 100644
--- a/shared-module/_eve/__init__.c
+++ b/shared-module/_eve/__init__.c
@@ -70,8 +70,8 @@ void common_hal__eve_Vertex2f(common_hal__eve_t *eve, mp_float_t x, mp_float_t y
void common_hal__eve_VertexFormat(common_hal__eve_t *eve, uint32_t frac)
{
- C4(eve, ((27 << 24) | ((frac & 7))));
- eve->vscale = 1 << eve->vscale;
+ C4(eve, ((39 << 24) | ((frac & 7))));
+ eve->vscale = 1 << frac;
}
diff --git a/shared-module/adafruit_bus_device/I2CDevice.c b/shared-module/adafruit_bus_device/I2CDevice.c
new file mode 100644
index 000000000..ee4b4fa55
--- /dev/null
+++ b/shared-module/adafruit_bus_device/I2CDevice.c
@@ -0,0 +1,79 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Mark Komus
+ *
+ * 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 "shared-bindings/adafruit_bus_device/I2CDevice.h"
+#include "shared-bindings/busio/I2C.h"
+#include "py/mperrno.h"
+#include "py/nlr.h"
+#include "py/runtime.h"
+#include "lib/utils/interrupt_char.h"
+
+void common_hal_adafruit_bus_device_i2cdevice_construct(adafruit_bus_device_i2cdevice_obj_t *self, busio_i2c_obj_t *i2c, uint8_t device_address) {
+ self->i2c = i2c;
+ self->device_address = device_address;
+}
+
+void common_hal_adafruit_bus_device_i2cdevice_lock(adafruit_bus_device_i2cdevice_obj_t *self) {
+ bool success = common_hal_busio_i2c_try_lock(self->i2c);
+
+ while (!success) {
+ RUN_BACKGROUND_TASKS;
+ if (mp_hal_is_interrupted()) {
+ break;
+ }
+
+ success = common_hal_busio_i2c_try_lock(self->i2c);
+ }
+}
+
+void common_hal_adafruit_bus_device_i2cdevice_unlock(adafruit_bus_device_i2cdevice_obj_t *self) {
+ common_hal_busio_i2c_unlock(self->i2c);
+}
+
+uint8_t common_hal_adafruit_bus_device_i2cdevice_readinto(adafruit_bus_device_i2cdevice_obj_t *self, mp_obj_t buffer, size_t length) {
+ return common_hal_busio_i2c_read(self->i2c, self->device_address, buffer, length);
+}
+
+uint8_t common_hal_adafruit_bus_device_i2cdevice_write(adafruit_bus_device_i2cdevice_obj_t *self, mp_obj_t buffer, size_t length) {
+ return common_hal_busio_i2c_write(self->i2c, self->device_address, buffer, length, true);
+}
+
+void common_hal_adafruit_bus_device_i2cdevice_probe_for_device(adafruit_bus_device_i2cdevice_obj_t *self) {
+ common_hal_adafruit_bus_device_i2cdevice_lock(self);
+
+ mp_buffer_info_t bufinfo;
+ mp_obj_t buffer = mp_obj_new_bytearray_of_zeros(1);
+
+ mp_get_buffer_raise(buffer, &bufinfo, MP_BUFFER_WRITE);
+
+ uint8_t status = common_hal_adafruit_bus_device_i2cdevice_readinto(self, (uint8_t*)bufinfo.buf, 1);
+ if (status != 0) {
+ common_hal_adafruit_bus_device_i2cdevice_unlock(self);
+ mp_raise_ValueError_varg(translate("No I2C device at address: %x"), self->device_address);
+ }
+
+ common_hal_adafruit_bus_device_i2cdevice_unlock(self);
+}
diff --git a/shared-module/adafruit_bus_device/I2CDevice.h b/shared-module/adafruit_bus_device/I2CDevice.h
new file mode 100644
index 000000000..d06adb9f5
--- /dev/null
+++ b/shared-module/adafruit_bus_device/I2CDevice.h
@@ -0,0 +1,39 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2017 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.
+ */
+
+#ifndef MICROPY_INCLUDED_ATMEL_SAMD_SHARED_MODULE_BUSDEVICE_I2CDEVICE_H
+#define MICROPY_INCLUDED_ATMEL_SAMD_SHARED_MODULE_BUSDEVICE_I2CDEVICE_H
+
+#include "py/obj.h"
+#include "common-hal/busio/I2C.h"
+
+typedef struct {
+ mp_obj_base_t base;
+ busio_i2c_obj_t *i2c;
+ uint8_t device_address;
+} adafruit_bus_device_i2cdevice_obj_t;
+
+#endif // MICROPY_INCLUDED_ATMEL_SAMD_SHARED_MODULE_BUSDEVICE_I2CDEVICE_H
diff --git a/shared-module/adafruit_bus_device/SPIDevice.c b/shared-module/adafruit_bus_device/SPIDevice.c
new file mode 100644
index 000000000..e489fc7c0
--- /dev/null
+++ b/shared-module/adafruit_bus_device/SPIDevice.c
@@ -0,0 +1,85 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Mark Komus
+ *
+ * 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 "shared-bindings/adafruit_bus_device/SPIDevice.h"
+#include "shared-bindings/busio/SPI.h"
+#include "shared-bindings/digitalio/DigitalInOut.h"
+#include "py/mperrno.h"
+#include "py/nlr.h"
+#include "py/runtime.h"
+
+void common_hal_adafruit_bus_device_spidevice_construct(adafruit_bus_device_spidevice_obj_t *self, busio_spi_obj_t *spi, digitalio_digitalinout_obj_t *cs,
+ uint32_t baudrate, uint8_t polarity, uint8_t phase, uint8_t extra_clocks) {
+ self->spi = spi;
+ self->baudrate = baudrate;
+ self->polarity = polarity;
+ self->phase = phase;
+ self->extra_clocks = extra_clocks;
+ self->chip_select = cs;
+}
+
+void common_hal_adafruit_bus_device_spidevice_enter(adafruit_bus_device_spidevice_obj_t *self) {
+ bool success = false;
+ while (!success) {
+ success = common_hal_busio_spi_try_lock(self->spi);
+ RUN_BACKGROUND_TASKS;
+ mp_handle_pending();
+ }
+
+ common_hal_busio_spi_configure(self->spi, self->baudrate, self->polarity, self->phase, 8);
+
+ if (self->chip_select != MP_OBJ_NULL) {
+ common_hal_digitalio_digitalinout_set_value(MP_OBJ_TO_PTR(self->chip_select), false);
+ }
+}
+
+void common_hal_adafruit_bus_device_spidevice_exit(adafruit_bus_device_spidevice_obj_t *self) {
+ if (self->chip_select != MP_OBJ_NULL) {
+ common_hal_digitalio_digitalinout_set_value(MP_OBJ_TO_PTR(self->chip_select), true);
+ }
+
+ if (self->extra_clocks > 0) {
+
+ mp_buffer_info_t bufinfo;
+ mp_obj_t buffer = mp_obj_new_bytearray_of_zeros(1);
+
+ mp_get_buffer_raise(buffer, &bufinfo, MP_BUFFER_READ);
+ ((uint8_t*)bufinfo.buf)[0] = 0xFF;
+
+ uint8_t clocks = self->extra_clocks / 8;
+ if ((self->extra_clocks % 8) != 0)
+ clocks += 1;
+
+ while (clocks > 0) {
+ if (!common_hal_busio_spi_write(self->spi, ((uint8_t*)bufinfo.buf), 1)) {
+ mp_raise_OSError(MP_EIO);
+ }
+ clocks--;
+ }
+ }
+
+ common_hal_busio_spi_unlock(self->spi);
+}
diff --git a/shared-module/adafruit_bus_device/SPIDevice.h b/shared-module/adafruit_bus_device/SPIDevice.h
new file mode 100644
index 000000000..1a7c70fa7
--- /dev/null
+++ b/shared-module/adafruit_bus_device/SPIDevice.h
@@ -0,0 +1,44 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2017 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.
+ */
+
+#ifndef MICROPY_INCLUDED_ATMEL_SAMD_SHARED_MODULE_BUSDEVICE_SPIDEVICE_H
+#define MICROPY_INCLUDED_ATMEL_SAMD_SHARED_MODULE_BUSDEVICE_SPIDEVICE_H
+
+#include "py/obj.h"
+#include "common-hal/busio/SPI.h"
+#include "common-hal/digitalio/DigitalInOut.h"
+
+typedef struct {
+ mp_obj_base_t base;
+ busio_spi_obj_t *spi;
+ uint32_t baudrate;
+ uint8_t polarity;
+ uint8_t phase;
+ uint8_t extra_clocks;
+ digitalio_digitalinout_obj_t *chip_select;
+} adafruit_bus_device_spidevice_obj_t;
+
+#endif // MICROPY_INCLUDED_ATMEL_SAMD_SHARED_MODULE_BUSDEVICE_SPIDEVICE_H
diff --git a/shared-module/adafruit_bus_device/__init__.c b/shared-module/adafruit_bus_device/__init__.c
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/shared-module/adafruit_bus_device/__init__.c
diff --git a/shared-module/displayio/EPaperDisplay.c b/shared-module/displayio/EPaperDisplay.c
index 1b285b4b1..3fb37ff21 100644
--- a/shared-module/displayio/EPaperDisplay.c
+++ b/shared-module/displayio/EPaperDisplay.c
@@ -198,6 +198,29 @@ mp_obj_t common_hal_displayio_epaperdisplay_get_bus(displayio_epaperdisplay_obj_
return self->core.bus;
}
+void common_hal_displayio_epaperdisplay_set_rotation(displayio_epaperdisplay_obj_t* self, int rotation){
+ bool transposed = (self->core.rotation == 90 || self->core.rotation == 270);
+ bool will_transposed = (rotation == 90 || rotation == 270);
+ if(transposed != will_transposed) {
+ int tmp = self->core.width;
+ self->core.width = self->core.height;
+ self->core.height = tmp;
+ }
+ displayio_display_core_set_rotation(&self->core, rotation);
+ if (self == &displays[0].epaper_display) {
+ supervisor_stop_terminal();
+ supervisor_start_terminal(self->core.width, self->core.height);
+ }
+ if (self->core.current_group != NULL) {
+ displayio_group_update_transform(self->core.current_group, &self->core.transform);
+ }
+}
+
+uint16_t common_hal_displayio_epaperdisplay_get_rotation(displayio_epaperdisplay_obj_t* self){
+ return self->core.rotation;
+}
+
+
bool displayio_epaperdisplay_refresh_area(displayio_epaperdisplay_obj_t* self, const displayio_area_t* area) {
uint16_t buffer_size = 128; // In uint32_ts
diff --git a/shared-module/displayio/Palette.c b/shared-module/displayio/Palette.c
index facb1fa73..ba5ff665c 100644
--- a/shared-module/displayio/Palette.c
+++ b/shared-module/displayio/Palette.c
@@ -83,7 +83,8 @@ bool displayio_palette_get_color(displayio_palette_t *self, const _displayio_col
uint8_t pixel_hue = self->colors[palette_index].hue;
displayio_colorconverter_compute_tricolor(colorspace, pixel_hue, luma, color);
} else if (colorspace->grayscale) {
- *color = self->colors[palette_index].luma >> (8 - colorspace->depth);
+ size_t bitmask = (1 << colorspace->depth) - 1;
+ *color = (self->colors[palette_index].luma >> colorspace->grayscale_bit) & bitmask;
} else {
uint16_t packed = self->colors[palette_index].rgb565;
if (colorspace->reverse_bytes_in_word) {
diff --git a/shared-module/random/__init__.c b/shared-module/random/__init__.c
index 5cc20e5b5..42499bc0a 100644
--- a/shared-module/random/__init__.c
+++ b/shared-module/random/__init__.c
@@ -44,7 +44,7 @@ STATIC uint32_t yasmarang(void)
{
if (yasmarang_pad == 0xeda4baba) {
if (!common_hal_os_urandom((uint8_t *)&yasmarang_pad, sizeof(uint32_t))) {
- yasmarang_pad = common_hal_time_monotonic() & 0xffffffff;
+ yasmarang_pad = common_hal_time_monotonic_ms() & 0xffffffff;
}
}
yasmarang_pad += yasmarang_dat + yasmarang_d * yasmarang_n;
diff --git a/shared-module/rgbmatrix/RGBMatrix.c b/shared-module/rgbmatrix/RGBMatrix.c
index 94c3eda27..a09767b62 100644
--- a/shared-module/rgbmatrix/RGBMatrix.c
+++ b/shared-module/rgbmatrix/RGBMatrix.c
@@ -78,10 +78,10 @@ void common_hal_rgbmatrix_rgbmatrix_reconstruct(rgbmatrix_rgbmatrix_obj_t* self,
// verify that the matrix is big enough
mp_get_index(mp_obj_get_type(self->framebuffer), self->bufinfo.len, MP_OBJ_NEW_SMALL_INT(self->bufsize-1), false);
} else {
- _PM_free(self->bufinfo.buf);
- _PM_free(self->protomatter.rgbPins);
- _PM_free(self->protomatter.addr);
- _PM_free(self->protomatter.screenData);
+ common_hal_rgbmatrix_free_impl(self->bufinfo.buf);
+ common_hal_rgbmatrix_free_impl(self->protomatter.rgbPins);
+ common_hal_rgbmatrix_free_impl(self->protomatter.addr);
+ common_hal_rgbmatrix_free_impl(self->protomatter.screenData);
self->framebuffer = NULL;
self->bufinfo.buf = common_hal_rgbmatrix_allocator_impl(self->bufsize);
@@ -180,9 +180,6 @@ void common_hal_rgbmatrix_rgbmatrix_deinit(rgbmatrix_rgbmatrix_obj_t* self) {
void rgbmatrix_rgbmatrix_collect_ptrs(rgbmatrix_rgbmatrix_obj_t* self) {
gc_collect_ptr(self->framebuffer);
- gc_collect_ptr(self->protomatter.rgbPins);
- gc_collect_ptr(self->protomatter.addr);
- gc_collect_ptr(self->protomatter.screenData);
}
void common_hal_rgbmatrix_rgbmatrix_set_paused(rgbmatrix_rgbmatrix_obj_t* self, bool paused) {
@@ -217,18 +214,10 @@ int common_hal_rgbmatrix_rgbmatrix_get_height(rgbmatrix_rgbmatrix_obj_t* self) {
}
void *common_hal_rgbmatrix_allocator_impl(size_t sz) {
- if (gc_alloc_possible()) {
- return m_malloc_maybe(sz + sizeof(void*), true);
- } else {
- supervisor_allocation *allocation = allocate_memory(align32_size(sz), false);
- return allocation ? allocation->ptr : NULL;
- }
+ supervisor_allocation *allocation = allocate_memory(align32_size(sz), false, true);
+ return allocation ? allocation->ptr : NULL;
}
void common_hal_rgbmatrix_free_impl(void *ptr_in) {
- supervisor_allocation *allocation = allocation_from_ptr(ptr_in);
-
- if (allocation) {
- free_memory(allocation);
- }
+ free_memory(allocation_from_ptr(ptr_in));
}
diff --git a/shared-module/sharpdisplay/SharpMemoryFramebuffer.c b/shared-module/sharpdisplay/SharpMemoryFramebuffer.c
index b199e98d6..4b92bd637 100644
--- a/shared-module/sharpdisplay/SharpMemoryFramebuffer.c
+++ b/shared-module/sharpdisplay/SharpMemoryFramebuffer.c
@@ -34,32 +34,10 @@
#include "shared-module/sharpdisplay/SharpMemoryFramebuffer.h"
#include "supervisor/memory.h"
-#include "supervisor/shared/safe_mode.h"
#define SHARPMEM_BIT_WRITECMD_LSB (0x80)
#define SHARPMEM_BIT_VCOM_LSB (0x40)
-static void *hybrid_alloc(size_t sz) {
- supervisor_allocation *allocation = allocate_memory(align32_size(sz), false);
- if (allocation) {
- memset(allocation->ptr, 0, sz);
- return allocation->ptr;
- }
- if (gc_alloc_possible()) {
- return m_malloc(sz, true);
- }
- reset_into_safe_mode(MEM_MANAGE);
- return NULL; // unreached
-}
-
-static inline void hybrid_free(void *ptr_in) {
- supervisor_allocation *allocation = allocation_from_ptr(ptr_in);
-
- if (allocation) {
- free_memory(allocation);
- }
-}
-
STATIC uint8_t bitrev(uint8_t n) {
uint8_t r = 0;
for(int i=0;i<8;i++) r |= ((n>>i) & 1)<<(7-i);
@@ -102,9 +80,9 @@ void common_hal_sharpdisplay_framebuffer_reset(sharpdisplay_framebuffer_obj_t *s
}
void common_hal_sharpdisplay_framebuffer_reconstruct(sharpdisplay_framebuffer_obj_t *self) {
- if (!allocation_from_ptr(self->bufinfo.buf)) {
- self->bufinfo.buf = NULL;
- }
+ // Look up the allocation by the old pointer and get the new pointer from it.
+ supervisor_allocation* alloc = allocation_from_ptr(self->bufinfo.buf);
+ self->bufinfo.buf = alloc ? alloc->ptr : NULL;
}
void common_hal_sharpdisplay_framebuffer_get_bufinfo(sharpdisplay_framebuffer_obj_t *self, mp_buffer_info_t *bufinfo) {
@@ -112,7 +90,12 @@ void common_hal_sharpdisplay_framebuffer_get_bufinfo(sharpdisplay_framebuffer_ob
int row_stride = common_hal_sharpdisplay_framebuffer_get_row_stride(self);
int height = common_hal_sharpdisplay_framebuffer_get_height(self);
self->bufinfo.len = row_stride * height + 2;
- self->bufinfo.buf = hybrid_alloc(self->bufinfo.len);
+ supervisor_allocation* alloc = allocate_memory(align32_size(self->bufinfo.len), false, true);
+ if (alloc == NULL) {
+ m_malloc_fail(self->bufinfo.len);
+ }
+ self->bufinfo.buf = alloc->ptr;
+ memset(alloc->ptr, 0, self->bufinfo.len);
uint8_t *data = self->bufinfo.buf;
*data++ = SHARPMEM_BIT_WRITECMD_LSB;
@@ -123,7 +106,9 @@ void common_hal_sharpdisplay_framebuffer_get_bufinfo(sharpdisplay_framebuffer_ob
}
self->full_refresh = true;
}
- *bufinfo = self->bufinfo;
+ if (bufinfo) {
+ *bufinfo = self->bufinfo;
+ }
}
void common_hal_sharpdisplay_framebuffer_deinit(sharpdisplay_framebuffer_obj_t *self) {
@@ -137,7 +122,7 @@ void common_hal_sharpdisplay_framebuffer_deinit(sharpdisplay_framebuffer_obj_t *
common_hal_reset_pin(self->chip_select.pin);
- hybrid_free(self->bufinfo.buf);
+ free_memory(allocation_from_ptr(self->bufinfo.buf));
memset(self, 0, sizeof(*self));
}
@@ -154,19 +139,7 @@ void common_hal_sharpdisplay_framebuffer_construct(sharpdisplay_framebuffer_obj_
self->height = height;
self->baudrate = baudrate;
- int row_stride = common_hal_sharpdisplay_framebuffer_get_row_stride(self);
- self->bufinfo.len = row_stride * height + 2;
- // re-use a supervisor allocation if possible
- self->bufinfo.buf = hybrid_alloc(self->bufinfo.len);
-
- uint8_t *data = self->bufinfo.buf;
- *data++ = SHARPMEM_BIT_WRITECMD_LSB;
-
- for(int y=0; y<self->height; y++) {
- *data = bitrev(y+1);
- data += row_stride;
- }
- self->full_refresh = true;
+ common_hal_sharpdisplay_framebuffer_get_bufinfo(self, NULL);
}
void common_hal_sharpdisplay_framebuffer_swapbuffers(sharpdisplay_framebuffer_obj_t *self, uint8_t *dirty_row_bitmask) {
@@ -271,7 +244,5 @@ const framebuffer_p_t sharpdisplay_framebuffer_proto = {
};
void common_hal_sharpdisplay_framebuffer_collect_ptrs(sharpdisplay_framebuffer_obj_t *self) {
- gc_collect_ptr(self->framebuffer);
gc_collect_ptr(self->bus);
- gc_collect_ptr(self->bufinfo.buf);
}
diff --git a/shared-module/sharpdisplay/SharpMemoryFramebuffer.h b/shared-module/sharpdisplay/SharpMemoryFramebuffer.h
index 8acacc94e..08966a89c 100644
--- a/shared-module/sharpdisplay/SharpMemoryFramebuffer.h
+++ b/shared-module/sharpdisplay/SharpMemoryFramebuffer.h
@@ -33,7 +33,6 @@
typedef struct {
mp_obj_base_t base;
- mp_obj_t framebuffer;
busio_spi_obj_t* bus;
busio_spi_obj_t inline_bus;
digitalio_digitalinout_obj_t chip_select;
diff --git a/shared-module/time/__init__.c b/shared-module/time/__init__.c
index 347e68ae0..c79a5f3ae 100644
--- a/shared-module/time/__init__.c
+++ b/shared-module/time/__init__.c
@@ -28,7 +28,7 @@
#include "supervisor/port.h"
#include "supervisor/shared/tick.h"
-uint64_t common_hal_time_monotonic(void) {
+uint64_t common_hal_time_monotonic_ms(void) {
return supervisor_ticks_ms64();
}
diff --git a/shared-module/usb_midi/__init__.c b/shared-module/usb_midi/__init__.c
index 73a314b99..3fb3f836c 100644
--- a/shared-module/usb_midi/__init__.c
+++ b/shared-module/usb_midi/__init__.c
@@ -40,12 +40,12 @@ supervisor_allocation* usb_midi_allocation;
void usb_midi_init(void) {
// TODO(tannewt): Make this dynamic.
- uint16_t tuple_size = align32_size(sizeof(mp_obj_tuple_t) + sizeof(mp_obj_t*) * 2);
- uint16_t portin_size = align32_size(sizeof(usb_midi_portin_obj_t));
- uint16_t portout_size = align32_size(sizeof(usb_midi_portout_obj_t));
+ size_t tuple_size = align32_size(sizeof(mp_obj_tuple_t) + sizeof(mp_obj_t*) * 2);
+ size_t portin_size = align32_size(sizeof(usb_midi_portin_obj_t));
+ size_t portout_size = align32_size(sizeof(usb_midi_portout_obj_t));
// For each embedded MIDI Jack in the descriptor we create a Port
- usb_midi_allocation = allocate_memory(tuple_size + portin_size + portout_size, false);
+ usb_midi_allocation = allocate_memory(tuple_size + portin_size + portout_size, false, false);
mp_obj_tuple_t *ports = (mp_obj_tuple_t *) usb_midi_allocation->ptr;
ports->base.type = &mp_type_tuple;
diff --git a/ports/esp32s2/boards/board.h b/supervisor/board.h
index 2f0db8135..939ee1c19 100644
--- a/ports/esp32s2/boards/board.h
+++ b/supervisor/board.h
@@ -24,22 +24,30 @@
* THE SOFTWARE.
*/
-// This file defines board specific functions.
-
-#ifndef MICROPY_INCLUDED_ESP32S2_BOARDS_BOARD_H
-#define MICROPY_INCLUDED_ESP32S2_BOARDS_BOARD_H
+#ifndef MICROPY_INCLUDED_SUPERVISOR_BOARD_H
+#define MICROPY_INCLUDED_SUPERVISOR_BOARD_H
#include <stdbool.h>
-// Initializes board related state once on start up.
-void board_init(void);
+#include "supervisor/shared/safe_mode.h"
// Returns true if the user initiates safe mode in a board specific way.
// Also add BOARD_USER_SAFE_MODE in mpconfigboard.h to explain the board specific
// way.
bool board_requests_safe_mode(void);
+// Initializes board related state once on start up.
+void board_init(void);
+
// Reset the state of off MCU components such as neopixels.
void reset_board(void);
-#endif // MICROPY_INCLUDED_ESP32S2_BOARDS_BOARD_H
+#if CIRCUITPY_ALARM
+// Deinit the board. This should put the board in deep sleep durable, low power
+// state. It should not prevent the user access method from working (such as
+// disabling USB, BLE or flash) because CircuitPython may continue to run.
+void board_deinit(void);
+#endif
+
+
+#endif // MICROPY_INCLUDED_SUPERVISOR_BOARD_H
diff --git a/supervisor/memory.h b/supervisor/memory.h
index f4359ca46..0f820eac1 100755
--- a/supervisor/memory.h
+++ b/supervisor/memory.h
@@ -33,32 +33,45 @@
#include <stdbool.h>
#include <stdint.h>
+#include <stddef.h>
typedef struct {
uint32_t* ptr;
- uint32_t length; // in bytes
} supervisor_allocation;
-void memory_init(void);
void free_memory(supervisor_allocation* allocation);
+
+// Find the allocation with the given ptr, NULL if not found. When called from the context of a
+// supervisor_move_memory() callback, finds the allocation that had that ptr *before* the move, but
+// the returned allocation already contains the ptr after the move.
+// When called with NULL, may return either NULL or an unused allocation whose ptr is NULL (this is
+// a feature used internally in allocate_memory to save code size). Passing the return value to
+// free_memory() is a permissible no-op in either case.
supervisor_allocation* allocation_from_ptr(void *ptr);
+
supervisor_allocation* allocate_remaining_memory(void);
// Allocate a piece of a given length in bytes. If high_address is true then it should be allocated
// at a lower address from the top of the stack. Otherwise, addresses will increase starting after
-// statically allocated memory.
-supervisor_allocation* allocate_memory(uint32_t length, bool high_address);
+// statically allocated memory. If movable is false, memory will be taken from outside the GC heap
+// and will stay stationary until freed. While the VM is running, this will fail unless a previous
+// allocation of exactly matching length has recently been freed. If movable is true, memory will be
+// taken from either outside or inside the GC heap, and when the VM exits, will be moved outside.
+// The ptr of the returned supervisor_allocation will change at that point. If you need to be
+// notified of that, add your own callback function at the designated place near the end of
+// supervisor_move_memory().
+supervisor_allocation* allocate_memory(uint32_t length, bool high_address, bool movable);
-static inline uint16_t align32_size(uint16_t size) {
- if (size % 4 != 0) {
- return (size & 0xfffc) + 0x4;
- }
- return size;
+static inline size_t align32_size(size_t size) {
+ return (size + 3) & ~3;
}
-// Called after the heap is freed in case the supervisor wants to save some values.
+size_t get_allocation_length(supervisor_allocation* allocation);
+
+// Called after the GC heap is freed, transfers movable allocations from the GC heap to the
+// supervisor heap and compacts the supervisor heap.
void supervisor_move_memory(void);
#endif // MICROPY_INCLUDED_SUPERVISOR_MEMORY_H
diff --git a/supervisor/port.h b/supervisor/port.h
index f5b3c15d1..862400986 100644
--- a/supervisor/port.h
+++ b/supervisor/port.h
@@ -49,9 +49,6 @@ void reset_cpu(void) NORETURN;
// Reset the microcontroller state.
void reset_port(void);
-// Reset the rest of the board.
-void reset_board(void);
-
// Reset to the bootloader
void reset_to_bootloader(void) NORETURN;
@@ -61,7 +58,8 @@ uint32_t *port_stack_get_limit(void);
// Get stack top address
uint32_t *port_stack_get_top(void);
-supervisor_allocation* port_fixed_stack(void);
+// True if stack is not located inside heap (at the top)
+bool port_has_fixed_stack(void);
// Get heap bottom address
uint32_t *port_heap_get_bottom(void);
@@ -69,8 +67,6 @@ uint32_t *port_heap_get_bottom(void);
// Get heap top address
uint32_t *port_heap_get_top(void);
-supervisor_allocation* port_fixed_heap(void);
-
// Save and retrieve a word from memory that is preserved over reset. Used for safe mode.
void port_set_saved_word(uint32_t);
uint32_t port_get_saved_word(void);
@@ -90,8 +86,9 @@ void port_disable_tick(void);
// Only the common sleep routine should use it.
void port_interrupt_after_ticks(uint32_t ticks);
-// Sleep the CPU until an interrupt is received.
-void port_sleep_until_interrupt(void);
+// Sleep the CPU until an interrupt is received. We call this idle because it
+// may not be a system level sleep.
+void port_idle_until_interrupt(void);
// Execute port specific actions during background tasks.
void port_background_task(void);
@@ -101,4 +98,5 @@ void port_background_task(void);
// work" should be done in port_background_task() instead.
void port_start_background_task(void);
void port_finish_background_task(void);
+
#endif // MICROPY_INCLUDED_SUPERVISOR_PORT_H
diff --git a/supervisor/shared/board.c b/supervisor/shared/board.c
index e3eb8fd0d..30603aa66 100644
--- a/supervisor/shared/board.c
+++ b/supervisor/shared/board.c
@@ -26,23 +26,22 @@
#include "supervisor/shared/board.h"
-#include "shared-bindings/digitalio/DigitalInOut.h"
-#include "shared-bindings/neopixel_write/__init__.h"
+#if CIRCUITPY_DIGITALIO && CIRCUITPY_NEOPIXEL_WRITE
-#ifdef USER_NEOPIXELS_PIN
+#include <string.h>
-// The maximum number of user neopixels right now is 10, on Circuit Playgrounds.
-// PyBadge and PyGamer have max 5
-#define USER_NEOPIXELS_MAX_COUNT 10
+#include "shared-bindings/digitalio/DigitalInOut.h"
+#include "shared-bindings/neopixel_write/__init__.h"
-void board_reset_user_neopixels(void) {
+void board_reset_user_neopixels(const mcu_pin_obj_t* pin, size_t count) {
// Turn off on-board NeoPixel string
- uint8_t empty[USER_NEOPIXELS_MAX_COUNT * 3] = { 0 };
+ uint8_t empty[count * 3];
+ memset(empty, 0, count);
digitalio_digitalinout_obj_t neopixel_pin;
- common_hal_digitalio_digitalinout_construct(&neopixel_pin, USER_NEOPIXELS_PIN);
+ common_hal_digitalio_digitalinout_construct(&neopixel_pin, pin);
common_hal_digitalio_digitalinout_switch_to_output(&neopixel_pin, false,
DRIVE_MODE_PUSH_PULL);
- common_hal_neopixel_write(&neopixel_pin, empty, USER_NEOPIXELS_MAX_COUNT * 3);
+ common_hal_neopixel_write(&neopixel_pin, empty, count * 3);
common_hal_digitalio_digitalinout_deinit(&neopixel_pin);
}
diff --git a/supervisor/shared/board.h b/supervisor/shared/board.h
index 0e4d73455..fe887a933 100644
--- a/supervisor/shared/board.h
+++ b/supervisor/shared/board.h
@@ -24,15 +24,13 @@
* THE SOFTWARE.
*/
-#ifndef MICROPY_INCLUDED_SUPERVISOR_BOARD_H
-#define MICROPY_INCLUDED_SUPERVISOR_BOARD_H
+#ifndef MICROPY_INCLUDED_SUPERVISOR_SHARED_BOARD_H
+#define MICROPY_INCLUDED_SUPERVISOR_SHARED_BOARD_H
-#include "py/mpconfig.h"
+#include <stddef.h>
-#ifdef USER_NEOPIXELS_PIN
+#include "shared-bindings/microcontroller/Pin.h"
-void board_reset_user_neopixels(void);
+void board_reset_user_neopixels(const mcu_pin_obj_t* pin, size_t count);
-#endif
-
-#endif // MICROPY_INCLUDED_SUPERVISOR_BOARD_H
+#endif // MICROPY_INCLUDED_SUPERVISOR_SHARED_BOARD_H
diff --git a/supervisor/shared/display.c b/supervisor/shared/display.c
index afb3f3a9a..9c9c66cd7 100644
--- a/supervisor/shared/display.c
+++ b/supervisor/shared/display.c
@@ -60,38 +60,44 @@ void supervisor_start_terminal(uint16_t width_px, uint16_t height_px) {
#if CIRCUITPY_TERMINALIO
displayio_tilegrid_t* grid = &supervisor_terminal_text_grid;
- uint16_t width_in_tiles = (width_px - blinka_bitmap.width) / grid->tile_width;
+ bool tall = height_px > width_px;
+ uint16_t terminal_width_px = tall ? width_px : width_px - blinka_bitmap.width;
+ uint16_t terminal_height_px = tall ? height_px - blinka_bitmap.height : height_px ;
+ uint16_t width_in_tiles = terminal_width_px / grid->tile_width;
// determine scale based on h
if (width_in_tiles < 80) {
scale = 1;
}
- width_in_tiles = (width_px - blinka_bitmap.width * scale) / (grid->tile_width * scale);
+ width_in_tiles = terminal_width_px / (grid->tile_width * scale);
if (width_in_tiles < 1) {
width_in_tiles = 1;
}
- uint16_t height_in_tiles = height_px / (grid->tile_height * scale);
- uint16_t remaining_pixels = height_px % (grid->tile_height * scale);
+ uint16_t height_in_tiles = terminal_height_px / (grid->tile_height * scale);
+ uint16_t remaining_pixels = tall ? 0 : terminal_height_px % (grid->tile_height * scale);
if (height_in_tiles < 1 || remaining_pixels > 0) {
height_in_tiles += 1;
}
uint16_t total_tiles = width_in_tiles * height_in_tiles;
- // First try to allocate outside the heap. This will fail when the VM is running.
- tilegrid_tiles = allocate_memory(align32_size(total_tiles), false);
- uint8_t* tiles;
- if (tilegrid_tiles == NULL) {
- tiles = m_malloc(total_tiles, true);
- MP_STATE_VM(terminal_tilegrid_tiles) = tiles;
- } else {
- tiles = (uint8_t*) tilegrid_tiles->ptr;
+ // Reuse the previous allocation if possible
+ if (tilegrid_tiles) {
+ if (get_allocation_length(tilegrid_tiles) != align32_size(total_tiles)) {
+ free_memory(tilegrid_tiles);
+ tilegrid_tiles = NULL;
+ }
}
-
- if (tiles == NULL) {
- return;
+ if (!tilegrid_tiles) {
+ tilegrid_tiles = allocate_memory(align32_size(total_tiles), false, true);
+ if (!tilegrid_tiles) {
+ return;
+ }
}
- grid->y = 0;
+ uint8_t* tiles = (uint8_t*) tilegrid_tiles->ptr;
+
+ grid->y = tall ? blinka_bitmap.height : 0;
+ grid->x = tall ? 0 : blinka_bitmap.width;
grid->top_left_y = 0;
if (remaining_pixels > 0) {
grid->y -= (grid->tile_height - remaining_pixels);
@@ -116,7 +122,6 @@ void supervisor_stop_terminal(void) {
if (tilegrid_tiles != NULL) {
free_memory(tilegrid_tiles);
tilegrid_tiles = NULL;
- supervisor_terminal_text_grid.inline_tiles = false;
supervisor_terminal_text_grid.tiles = NULL;
}
#endif
@@ -124,20 +129,10 @@ void supervisor_stop_terminal(void) {
void supervisor_display_move_memory(void) {
#if CIRCUITPY_TERMINALIO
- displayio_tilegrid_t* grid = &supervisor_terminal_text_grid;
- if (MP_STATE_VM(terminal_tilegrid_tiles) != NULL &&
- grid->tiles == MP_STATE_VM(terminal_tilegrid_tiles)) {
- uint16_t total_tiles = grid->width_in_tiles * grid->height_in_tiles;
-
- tilegrid_tiles = allocate_memory(align32_size(total_tiles), false);
- if (tilegrid_tiles != NULL) {
- memcpy(tilegrid_tiles->ptr, grid->tiles, total_tiles);
- grid->tiles = (uint8_t*) tilegrid_tiles->ptr;
- } else {
- grid->tiles = NULL;
- grid->inline_tiles = false;
- }
- MP_STATE_VM(terminal_tilegrid_tiles) = NULL;
+ if (tilegrid_tiles != NULL) {
+ supervisor_terminal_text_grid.tiles = (uint8_t*) tilegrid_tiles->ptr;
+ } else {
+ supervisor_terminal_text_grid.tiles = NULL;
}
#endif
diff --git a/supervisor/shared/external_flash/external_flash.c b/supervisor/shared/external_flash/external_flash.c
index 5bde7fd48..e2d767235 100644
--- a/supervisor/shared/external_flash/external_flash.c
+++ b/supervisor/shared/external_flash/external_flash.c
@@ -338,7 +338,7 @@ static bool allocate_ram_cache(void) {
uint32_t table_size = blocks_per_sector * pages_per_block * sizeof(uint32_t);
// Attempt to allocate outside the heap first.
- supervisor_cache = allocate_memory(table_size + SPI_FLASH_ERASE_SIZE, false);
+ supervisor_cache = allocate_memory(table_size + SPI_FLASH_ERASE_SIZE, false, false);
if (supervisor_cache != NULL) {
MP_STATE_VM(flash_ram_cache) = (uint8_t **) supervisor_cache->ptr;
uint8_t* page_start = (uint8_t *) supervisor_cache->ptr + table_size;
diff --git a/supervisor/shared/memory.c b/supervisor/shared/memory.c
index 0f96ae273..480c322b0 100755
--- a/supervisor/shared/memory.c
+++ b/supervisor/shared/memory.c
@@ -27,78 +27,111 @@
#include "supervisor/memory.h"
#include "supervisor/port.h"
-#include <stddef.h>
+#include <string.h>
+#include "py/gc.h"
#include "supervisor/shared/display.h"
-#define CIRCUITPY_SUPERVISOR_ALLOC_COUNT (12)
-
-// Using a zero length to mark an unused allocation makes the code a bit shorter (but makes it
-// impossible to support zero-length allocations).
-#define FREE 0
+enum {
+ CIRCUITPY_SUPERVISOR_IMMOVABLE_ALLOC_COUNT =
+ // stack + heap
+ 2
+#ifdef EXTERNAL_FLASH_DEVICES
+ + 1
+#endif
+#if CIRCUITPY_USB_MIDI
+ + 1
+#endif
+ ,
+ CIRCUITPY_SUPERVISOR_MOVABLE_ALLOC_COUNT =
+ 0
+#if CIRCUITPY_DISPLAYIO
+ #if CIRCUITPY_TERMINALIO
+ + 1
+ #endif
+ + CIRCUITPY_DISPLAY_LIMIT * (
+ // Maximum needs of one display: max(4 if RGBMATRIX, 1 if SHARPDISPLAY, 0)
+ #if CIRCUITPY_RGBMATRIX
+ 4
+ #elif CIRCUITPY_SHARPDISPLAY
+ 1
+ #else
+ 0
+ #endif
+ )
+#endif
+ ,
+ CIRCUITPY_SUPERVISOR_ALLOC_COUNT = CIRCUITPY_SUPERVISOR_IMMOVABLE_ALLOC_COUNT + CIRCUITPY_SUPERVISOR_MOVABLE_ALLOC_COUNT
+};
// The lowest two bits of a valid length are always zero, so we can use them to mark an allocation
-// as freed by the client but not yet reclaimed into the FREE middle.
+// as a hole (freed by the client but not yet reclaimed into the free middle) and as movable.
+#define FLAGS 3
#define HOLE 1
+#define MOVABLE 2
static supervisor_allocation allocations[CIRCUITPY_SUPERVISOR_ALLOC_COUNT];
-// We use uint32_t* to ensure word (4 byte) alignment.
-uint32_t* low_address;
-uint32_t* high_address;
+supervisor_allocation* old_allocations;
-void memory_init(void) {
- low_address = port_heap_get_bottom();
- high_address = port_heap_get_top();
-}
+typedef struct _supervisor_allocation_node {
+ struct _supervisor_allocation_node* next;
+ size_t length;
+ // We use uint32_t to ensure word (4 byte) alignment.
+ uint32_t data[];
+} supervisor_allocation_node;
+
+supervisor_allocation_node* low_head;
+supervisor_allocation_node* high_head;
+
+// Intermediate (void*) is to suppress -Wcast-align warning. Alignment will always be correct
+// because this only reverses how (alloc)->ptr was obtained as &(node->data[0]).
+#define ALLOCATION_NODE(alloc) ((supervisor_allocation_node*)(void*)((char*)((alloc)->ptr) - sizeof(supervisor_allocation_node)))
void free_memory(supervisor_allocation* allocation) {
- if (allocation == NULL) {
+ if (allocation == NULL || allocation->ptr == NULL) {
return;
}
- int32_t index = 0;
- bool found = false;
- for (index = 0; index < CIRCUITPY_SUPERVISOR_ALLOC_COUNT; index++) {
- found = allocation == &allocations[index];
- if (found) {
- break;
- }
+ supervisor_allocation_node* node = ALLOCATION_NODE(allocation);
+ if (node == low_head) {
+ do {
+ low_head = low_head->next;
+ } while (low_head != NULL && (low_head->length & HOLE));
}
- if (!found) {
- // Bad!
- // TODO(tannewt): Add a way to escape into safe mode on error.
+ else if (node == high_head) {
+ do {
+ high_head = high_head->next;
+ } while (high_head != NULL && (high_head->length & HOLE));
}
- if (allocation->ptr == high_address) {
- high_address += allocation->length / 4;
- allocation->length = FREE;
- for (index++; index < CIRCUITPY_SUPERVISOR_ALLOC_COUNT; index++) {
- if (!(allocations[index].length & HOLE)) {
- break;
- }
- // Division automatically shifts out the HOLE bit.
- high_address += allocations[index].length / 4;
- allocations[index].length = FREE;
+ else {
+ // Check if it's in the list of embedded allocations.
+ supervisor_allocation_node** emb = &MP_STATE_VM(first_embedded_allocation);
+ while (*emb != NULL && *emb != node) {
+ emb = &((*emb)->next);
}
- } else if (allocation->ptr + allocation->length / 4 == low_address) {
- low_address = allocation->ptr;
- allocation->length = FREE;
- for (index--; index >= 0; index--) {
- if (!(allocations[index].length & HOLE)) {
- break;
- }
- low_address -= allocations[index].length / 4;
- allocations[index].length = FREE;
+ if (*emb != NULL) {
+ // Found, remove it from the list.
+ *emb = node->next;
+ m_free(node
+#if MICROPY_MALLOC_USES_ALLOCATED_SIZE
+ , sizeof(supervisor_allocation_node) + (node->length & ~FLAGS)
+#endif
+ );
+ }
+ else {
+ // Else it must be within the low or high ranges and becomes a hole.
+ node->length = ((node->length & ~FLAGS) | HOLE);
}
- } else {
- // Freed memory isn't in the middle so skip updating bounds. The memory will be added to the
- // middle when the memory to the inside is freed. We still need its length, but setting
- // only the lowest bit is nondestructive.
- allocation->length |= HOLE;
}
+ allocation->ptr = NULL;
}
supervisor_allocation* allocation_from_ptr(void *ptr) {
+ // When called from the context of supervisor_move_memory() (old_allocations != NULL), search
+ // by old pointer to give clients a way of mapping from old to new pointer. But not if
+ // ptr == NULL, then the caller wants an allocation whose current ptr is NULL.
+ supervisor_allocation* list = (old_allocations && ptr) ? old_allocations : &allocations[0];
for (size_t index = 0; index < CIRCUITPY_SUPERVISOR_ALLOC_COUNT; index++) {
- if (allocations[index].ptr == ptr) {
+ if (list[index].ptr == ptr) {
return &allocations[index];
}
}
@@ -106,50 +139,182 @@ supervisor_allocation* allocation_from_ptr(void *ptr) {
}
supervisor_allocation* allocate_remaining_memory(void) {
- if (low_address == high_address) {
- return NULL;
+ return allocate_memory((uint32_t)-1, false, false);
+}
+
+static supervisor_allocation_node* find_hole(supervisor_allocation_node* node, size_t length) {
+ for (; node != NULL; node = node->next) {
+ if (node->length == (length | HOLE)) {
+ break;
+ }
}
- return allocate_memory((high_address - low_address) * 4, false);
+ return node;
}
-supervisor_allocation* allocate_memory(uint32_t length, bool high) {
+static supervisor_allocation_node* allocate_memory_node(uint32_t length, bool high, bool movable) {
+ if (CIRCUITPY_SUPERVISOR_MOVABLE_ALLOC_COUNT == 0) {
+ assert(!movable);
+ }
+ // supervisor_move_memory() currently does not support movable allocations on the high side, it
+ // must be extended first if this is ever needed.
+ assert(!(high && movable));
+ uint32_t* low_address = low_head ? low_head->data + low_head->length / 4 : port_heap_get_bottom();
+ uint32_t* high_address = high_head ? (uint32_t*)high_head : port_heap_get_top();
+ // Special case for allocate_remaining_memory(), avoids computing low/high_address twice.
+ if (length == (uint32_t)-1) {
+ length = (high_address - low_address) * 4 - sizeof(supervisor_allocation_node);
+ }
if (length == 0 || length % 4 != 0) {
return NULL;
}
- uint8_t index = 0;
- int8_t direction = 1;
- if (high) {
- index = CIRCUITPY_SUPERVISOR_ALLOC_COUNT - 1;
- direction = -1;
- }
- supervisor_allocation* alloc;
- for (; index < CIRCUITPY_SUPERVISOR_ALLOC_COUNT; index += direction) {
- alloc = &allocations[index];
- if (alloc->length == FREE && (high_address - low_address) * 4 >= (int32_t) length) {
- break;
+ // 1. Matching hole on the requested side?
+ supervisor_allocation_node* node = find_hole(high ? high_head : low_head, length);
+ if (!node) {
+ // 2. Enough free space in the middle?
+ if ((high_address - low_address) * 4 >= (int32_t)(sizeof(supervisor_allocation_node) + length)) {
+ if (high) {
+ high_address -= (sizeof(supervisor_allocation_node) + length) / 4;
+ node = (supervisor_allocation_node*)high_address;
+ node->next = high_head;
+ high_head = node;
+ }
+ else {
+ node = (supervisor_allocation_node*)low_address;
+ node->next = low_head;
+ low_head = node;
+ }
}
- // If a hole matches in length exactly, we can reuse it.
- if (alloc->length == (length | HOLE)) {
- alloc->length = length;
- return alloc;
+ else {
+ // 3. Matching hole on the other side?
+ node = find_hole(high ? low_head : high_head, length);
+ if (!node) {
+ // 4. GC allocation?
+ if (movable && gc_alloc_possible()) {
+ node = m_malloc_maybe(sizeof(supervisor_allocation_node) + length, true);
+ if (node) {
+ node->next = MP_STATE_VM(first_embedded_allocation);
+ MP_STATE_VM(first_embedded_allocation) = node;
+ }
+ }
+ if (!node) {
+ // 5. Give up.
+ return NULL;
+ }
+ }
}
}
- if (index >= CIRCUITPY_SUPERVISOR_ALLOC_COUNT) {
+ node->length = length;
+ if (movable) {
+ node->length |= MOVABLE;
+ }
+ return node;
+}
+
+supervisor_allocation* allocate_memory(uint32_t length, bool high, bool movable) {
+ supervisor_allocation_node* node = allocate_memory_node(length, high, movable);
+ if (!node) {
return NULL;
}
- if (high) {
- high_address -= length / 4;
- alloc->ptr = high_address;
- } else {
- alloc->ptr = low_address;
- low_address += length / 4;
+ // Find the first free allocation.
+ supervisor_allocation* alloc = allocation_from_ptr(NULL);
+ if (!alloc) {
+ // We should free node again to avoid leaking, but something is wrong anyway if clients try
+ // to make more allocations than available, so don't bother.
+ return NULL;
}
- alloc->length = length;
+ alloc->ptr = &(node->data[0]);
return alloc;
}
+size_t get_allocation_length(supervisor_allocation* allocation) {
+ return ALLOCATION_NODE(allocation)->length & ~FLAGS;
+}
+
void supervisor_move_memory(void) {
+ // This whole function is not needed when there are no movable allocations, let it be optimized
+ // out.
+ if (CIRCUITPY_SUPERVISOR_MOVABLE_ALLOC_COUNT == 0) {
+ return;
+ }
+ // This must be called exactly after freeing the heap, so that the embedded allocations, if any,
+ // are now in the free region.
+ assert(MP_STATE_VM(first_embedded_allocation) == NULL || (low_head < MP_STATE_VM(first_embedded_allocation) && MP_STATE_VM(first_embedded_allocation) < high_head));
+
+ // Save the old pointers for allocation_from_ptr().
+ supervisor_allocation old_allocations_array[CIRCUITPY_SUPERVISOR_ALLOC_COUNT];
+ memcpy(old_allocations_array, allocations, sizeof(allocations));
+
+ // Compact the low side. Traverse the list repeatedly, finding movable allocations preceded by a
+ // hole and swapping them, until no more are found. This is not the most runtime-efficient way,
+ // but probably the shortest and simplest code.
+ bool acted;
+ do {
+ acted = false;
+ supervisor_allocation_node** nodep = &low_head;
+ while (*nodep != NULL && (*nodep)->next != NULL) {
+ if (((*nodep)->length & MOVABLE) && ((*nodep)->next->length & HOLE)) {
+ supervisor_allocation_node* oldnode = *nodep;
+ supervisor_allocation_node* start = oldnode->next;
+ supervisor_allocation* alloc = allocation_from_ptr(&(oldnode->data[0]));
+ assert(alloc != NULL);
+ alloc->ptr = &(start->data[0]);
+ oldnode->next = start->next;
+ size_t holelength = start->length;
+ size_t size = sizeof(supervisor_allocation_node) + (oldnode->length & ~FLAGS);
+ memmove(start, oldnode, size);
+ supervisor_allocation_node* newhole = (supervisor_allocation_node*)(void*)((char*)start + size);
+ newhole->next = start;
+ newhole->length = holelength;
+ *nodep = newhole;
+ acted = true;
+ }
+ nodep = &((*nodep)->next);
+ }
+ } while (acted);
+ // Any holes bubbled to the top can be absorbed into the free middle.
+ while (low_head != NULL && (low_head->length & HOLE)) {
+ low_head = low_head->next;
+ };
+
+ // Don't bother compacting the high side, there are no movable allocations and no holes there in
+ // current usage.
+
+ // Promote the embedded allocations to top-level ones, compacting them at the beginning of the
+ // now free region (or possibly in matching holes).
+ // The linked list is unordered, but allocations must be processed in order to avoid risking
+ // overwriting each other. To that end, repeatedly find the lowest element of the list, remove
+ // it from the list, and process it. This ad-hoc selection sort results in substantially shorter
+ // code than using the qsort() function from the C library.
+ while (MP_STATE_VM(first_embedded_allocation)) {
+ // First element is first candidate.
+ supervisor_allocation_node** pminnode = &MP_STATE_VM(first_embedded_allocation);
+ // Iterate from second element (if any) on.
+ for (supervisor_allocation_node** pnode = &(MP_STATE_VM(first_embedded_allocation)->next); *pnode != NULL; pnode = &(*pnode)->next) {
+ if (*pnode < *pminnode) {
+ pminnode = pnode;
+ }
+ }
+ // Remove from list.
+ supervisor_allocation_node* node = *pminnode;
+ *pminnode = node->next;
+ // Process.
+ size_t length = (node->length & ~FLAGS);
+ supervisor_allocation* alloc = allocation_from_ptr(&(node->data[0]));
+ assert(alloc != NULL);
+ // This may overwrite the header of node if it happened to be there already, but not the
+ // data.
+ supervisor_allocation_node* new_node = allocate_memory_node(length, false, true);
+ // There must be enough free space.
+ assert(new_node != NULL);
+ memmove(&(new_node->data[0]), &(node->data[0]), length);
+ alloc->ptr = &(new_node->data[0]);
+ }
+
+ // Notify clients that their movable allocations may have moved.
+ old_allocations = &old_allocations_array[0];
#if CIRCUITPY_DISPLAYIO
supervisor_display_move_memory();
#endif
+ // Add calls to further clients here.
+ old_allocations = NULL;
}
diff --git a/supervisor/shared/rgb_led_status.c b/supervisor/shared/rgb_led_status.c
index 283b9da12..006bb1b34 100644
--- a/supervisor/shared/rgb_led_status.c
+++ b/supervisor/shared/rgb_led_status.c
@@ -411,14 +411,15 @@ void prep_rgb_status_animation(const pyexec_result_t* result,
#endif
}
-void tick_rgb_status_animation(rgb_status_animation_t* status) {
+bool tick_rgb_status_animation(rgb_status_animation_t* status) {
#if defined(MICROPY_HW_NEOPIXEL) || (defined(MICROPY_HW_APA102_MOSI) && defined(MICROPY_HW_APA102_SCK)) || (defined(CP_RGB_STATUS_LED))
uint32_t tick_diff = supervisor_ticks_ms32() - status->pattern_start;
if (status->ok) {
// All is good. Ramp ALL_DONE up and down.
if (tick_diff > ALL_GOOD_CYCLE_MS) {
status->pattern_start = supervisor_ticks_ms32();
- tick_diff = 0;
+ new_status_color(BLACK);
+ return true;
}
uint16_t brightness = tick_diff * 255 / (ALL_GOOD_CYCLE_MS / 2);
@@ -433,7 +434,7 @@ void tick_rgb_status_animation(rgb_status_animation_t* status) {
} else {
if (tick_diff > status->total_exception_cycle) {
status->pattern_start = supervisor_ticks_ms32();
- tick_diff = 0;
+ return true;
}
// First flash the file color.
if (tick_diff < EXCEPTION_TYPE_LENGTH_MS) {
@@ -482,4 +483,5 @@ void tick_rgb_status_animation(rgb_status_animation_t* status) {
}
}
#endif
+ return false; // Animation is not finished.
}
diff --git a/supervisor/shared/rgb_led_status.h b/supervisor/shared/rgb_led_status.h
index e4e1981a2..84c97796a 100644
--- a/supervisor/shared/rgb_led_status.h
+++ b/supervisor/shared/rgb_led_status.h
@@ -76,6 +76,6 @@ void prep_rgb_status_animation(const pyexec_result_t* result,
bool found_main,
safe_mode_t safe_mode,
rgb_status_animation_t* status);
-void tick_rgb_status_animation(rgb_status_animation_t* status);
+bool tick_rgb_status_animation(rgb_status_animation_t* status);
#endif // MICROPY_INCLUDED_SUPERVISOR_RGB_LED_STATUS_H
diff --git a/supervisor/shared/safe_mode.c b/supervisor/shared/safe_mode.c
index d59e754ed..9032e4045 100644
--- a/supervisor/shared/safe_mode.c
+++ b/supervisor/shared/safe_mode.c
@@ -29,6 +29,8 @@
#include "mphalport.h"
#include "shared-bindings/digitalio/DigitalInOut.h"
+#include "shared-bindings/microcontroller/Processor.h"
+#include "shared-bindings/microcontroller/ResetReason.h"
#include "supervisor/serial.h"
#include "supervisor/shared/rgb_led_colors.h"
@@ -52,6 +54,12 @@ safe_mode_t wait_for_safe_mode_reset(void) {
current_safe_mode = safe_mode;
return safe_mode;
}
+
+ const mcu_reset_reason_t reset_reason = common_hal_mcu_processor_get_reset_reason();
+ if (reset_reason != RESET_REASON_POWER_ON &&
+ reset_reason != RESET_REASON_RESET_PIN) {
+ return NO_SAFE_MODE;
+ }
port_set_saved_word(SAFE_MODE_DATA_GUARD | (MANUAL_SAFE_MODE << 8));
// Wait for a while to allow for reset.
temp_status_color(SAFE_MODE);
diff --git a/supervisor/shared/serial.c b/supervisor/shared/serial.c
index 7383cc228..303f89e75 100644
--- a/supervisor/shared/serial.c
+++ b/supervisor/shared/serial.c
@@ -69,9 +69,7 @@ bool serial_connected(void) {
#if defined(DEBUG_UART_TX) && defined(DEBUG_UART_RX)
return true;
#else
- // True if DTR is asserted, and the USB connection is up.
- // tud_cdc_get_line_state(): bit 0 is DTR, bit 1 is RTS
- return (tud_cdc_get_line_state() & 1) && tud_ready();
+ return tud_cdc_connected();
#endif
}
diff --git a/supervisor/shared/stack.c b/supervisor/shared/stack.c
index e7aa956b0..afea20401 100755
--- a/supervisor/shared/stack.c
+++ b/supervisor/shared/stack.c
@@ -34,36 +34,42 @@
extern uint32_t _estack;
+// Requested size.
static uint32_t next_stack_size = CIRCUITPY_DEFAULT_STACK_SIZE;
static uint32_t current_stack_size = 0;
-supervisor_allocation* stack_alloc = NULL;
+// Actual location and size, may be larger than requested.
+static uint32_t* stack_limit = NULL;
+static size_t stack_length = 0;
#define EXCEPTION_STACK_SIZE 1024
void allocate_stack(void) {
- if (port_fixed_stack() != NULL) {
- stack_alloc = port_fixed_stack();
- current_stack_size = stack_alloc->length;
+ if (port_has_fixed_stack()) {
+ stack_limit = port_stack_get_limit();
+ stack_length = (port_stack_get_top() - stack_limit)*sizeof(uint32_t);
+ current_stack_size = stack_length;
} else {
mp_uint_t regs[10];
mp_uint_t sp = cpu_get_regs_and_sp(regs);
mp_uint_t c_size = (uint32_t) port_stack_get_top() - sp;
- stack_alloc = allocate_memory(c_size + next_stack_size + EXCEPTION_STACK_SIZE, true);
+ supervisor_allocation* stack_alloc = allocate_memory(c_size + next_stack_size + EXCEPTION_STACK_SIZE, true, false);
if (stack_alloc == NULL) {
- stack_alloc = allocate_memory(c_size + CIRCUITPY_DEFAULT_STACK_SIZE + EXCEPTION_STACK_SIZE, true);
+ stack_alloc = allocate_memory(c_size + CIRCUITPY_DEFAULT_STACK_SIZE + EXCEPTION_STACK_SIZE, true, false);
current_stack_size = CIRCUITPY_DEFAULT_STACK_SIZE;
} else {
current_stack_size = next_stack_size;
}
+ stack_limit = stack_alloc->ptr;
+ stack_length = get_allocation_length(stack_alloc);
}
- *stack_alloc->ptr = STACK_CANARY_VALUE;
+ *stack_limit = STACK_CANARY_VALUE;
}
inline bool stack_ok(void) {
- return stack_alloc == NULL || *stack_alloc->ptr == STACK_CANARY_VALUE;
+ return stack_limit == NULL || *stack_limit == STACK_CANARY_VALUE;
}
inline void assert_heap_ok(void) {
@@ -77,18 +83,26 @@ void stack_init(void) {
}
void stack_resize(void) {
- if (stack_alloc == NULL) {
+ if (stack_limit == NULL) {
return;
}
if (next_stack_size == current_stack_size) {
- *stack_alloc->ptr = STACK_CANARY_VALUE;
+ *stack_limit = STACK_CANARY_VALUE;
return;
}
- free_memory(stack_alloc);
- stack_alloc = NULL;
+ free_memory(allocation_from_ptr(stack_limit));
+ stack_limit = NULL;
allocate_stack();
}
+uint32_t* stack_get_bottom(void) {
+ return stack_limit;
+}
+
+size_t stack_get_length(void) {
+ return stack_length;
+}
+
void set_next_stack_size(uint32_t size) {
next_stack_size = size;
}
diff --git a/supervisor/shared/stack.h b/supervisor/shared/stack.h
index 7096f0b3e..1c75de5f7 100755
--- a/supervisor/shared/stack.h
+++ b/supervisor/shared/stack.h
@@ -31,10 +31,12 @@
#include "supervisor/memory.h"
-extern supervisor_allocation* stack_alloc;
-
void stack_init(void);
void stack_resize(void);
+// Actual stack location and size, may be larger than requested.
+uint32_t* stack_get_bottom(void);
+size_t stack_get_length(void);
+// Next/current requested stack size.
void set_next_stack_size(uint32_t size);
uint32_t get_current_stack_size(void);
bool stack_ok(void);
diff --git a/supervisor/shared/tick.c b/supervisor/shared/tick.c
index a2855a570..d37a585eb 100644
--- a/supervisor/shared/tick.c
+++ b/supervisor/shared/tick.c
@@ -156,8 +156,8 @@ void mp_hal_delay_ms(mp_uint_t delay) {
break;
}
port_interrupt_after_ticks(remaining);
- // Sleep until an interrupt happens.
- port_sleep_until_interrupt();
+ // Idle until an interrupt happens.
+ port_idle_until_interrupt();
remaining = end_tick - port_get_raw_ticks(NULL);
}
}
diff --git a/supervisor/shared/usb/usb.c b/supervisor/shared/usb/usb.c
index 93d3436e9..ff08ade18 100644
--- a/supervisor/shared/usb/usb.c
+++ b/supervisor/shared/usb/usb.c
@@ -31,6 +31,7 @@
#include "supervisor/port.h"
#include "supervisor/serial.h"
#include "supervisor/usb.h"
+#include "supervisor/shared/workflow.h"
#include "lib/utils/interrupt_char.h"
#include "lib/mp-readline/readline.h"
diff --git a/supervisor/shared/workflow.c b/supervisor/shared/workflow.c
new file mode 100644
index 000000000..4986c0957
--- /dev/null
+++ b/supervisor/shared/workflow.c
@@ -0,0 +1,47 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 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 <stdbool.h>
+#include "py/mpconfig.h"
+#include "tusb.h"
+
+void supervisor_workflow_reset(void) {
+}
+
+// Return true as soon as USB communication with host has started,
+// even before enumeration is done.
+// Not that some chips don't notice when USB is unplugged after first being plugged in,
+// so this is not perfect, but tud_suspended() check helps.
+bool supervisor_workflow_connecting(void) {
+ return tud_connected() && !tud_suspended();
+}
+
+// Return true if host has completed connection to us (such as USB enumeration).
+bool supervisor_workflow_active(void) {
+ // Eventually there might be other non-USB workflows, such as BLE.
+ // tud_ready() checks for usb mounted and not suspended.
+ return tud_ready();
+}
diff --git a/supervisor/shared/workflow.h b/supervisor/shared/workflow.h
new file mode 100644
index 000000000..22a9fa468
--- /dev/null
+++ b/supervisor/shared/workflow.h
@@ -0,0 +1,32 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 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.
+ */
+
+#pragma once
+
+extern void supervisor_workflow_reset(void);
+
+extern bool supervisor_workflow_connecting(void);
+extern bool supervisor_workflow_active(void);
diff --git a/supervisor/supervisor.mk b/supervisor/supervisor.mk
index e81c51a88..a59e99e3d 100644
--- a/supervisor/supervisor.mk
+++ b/supervisor/supervisor.mk
@@ -75,6 +75,7 @@ else
lib/tinyusb/src/class/cdc/cdc_device.c \
lib/tinyusb/src/tusb.c \
supervisor/shared/serial.c \
+ supervisor/shared/workflow.c \
supervisor/usb.c \
supervisor/shared/usb/usb_desc.c \
supervisor/shared/usb/usb.c \
diff --git a/supervisor/workflow.h b/supervisor/workflow.h
new file mode 100755
index 000000000..4008b83a1
--- /dev/null
+++ b/supervisor/workflow.h
@@ -0,0 +1,30 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 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.
+ */
+
+#pragma once
+
+// True when the user could be actively iterating on their code.
+bool workflow_active(void);
diff --git a/tools/build_board_info.py b/tools/build_board_info.py
index f83282ea9..ce9d45fe2 100644
--- a/tools/build_board_info.py
+++ b/tools/build_board_info.py
@@ -19,20 +19,24 @@ import shared_bindings_matrix
sys.path.append("adabot")
import adabot.github_requests as github
-SUPPORTED_PORTS = ["atmel-samd", "cxd56", "esp32s2", "litex", "mimxrt10xx", "nrf", "stm"]
-
-BIN = ('bin',)
-UF2 = ('uf2',)
-BIN_UF2 = ('bin', 'uf2')
-HEX = ('hex',)
-HEX_UF2 = ('hex', 'uf2')
-SPK = ('spk',)
-DFU = ('dfu',)
-BIN_DFU = ('bin', 'dfu')
-
-# Example:
-# https://downloads.circuitpython.org/bin/trinket_m0/en_US/adafruit-circuitpython-trinket_m0-en_US-5.0.0-rc.0.uf2
-DOWNLOAD_BASE_URL = "https://downloads.circuitpython.org/bin"
+SUPPORTED_PORTS = [
+ "atmel-samd",
+ "cxd56",
+ "esp32s2",
+ "litex",
+ "mimxrt10xx",
+ "nrf",
+ "stm",
+]
+
+BIN = ("bin",)
+UF2 = ("uf2",)
+BIN_UF2 = ("bin", "uf2")
+HEX = ("hex",)
+HEX_UF2 = ("hex", "uf2")
+SPK = ("spk",)
+DFU = ("dfu",)
+BIN_DFU = ("bin", "dfu")
# Default extensions
extension_by_port = {
@@ -42,7 +46,7 @@ extension_by_port = {
"cxd56": SPK,
"mimxrt10xx": HEX_UF2,
"litex": DFU,
- "esp32s2": BIN_UF2
+ "esp32s2": BIN_UF2,
}
# Per board overrides
@@ -57,26 +61,28 @@ extension_by_board = {
"feather_m0_rfm69": BIN_UF2,
"feather_m0_rfm9x": BIN_UF2,
"uchip": BIN_UF2,
-
# nRF52840 dev kits that may not have UF2 bootloaders,
"makerdiary_nrf52840_mdk": HEX,
"makerdiary_nrf52840_mdk_usb_dongle": HEX_UF2,
"pca10056": BIN_UF2,
"pca10059": BIN_UF2,
"electronut_labs_blip": HEX,
-
# stm32
- "meowbit_v121": UF2
+ "meowbit_v121": UF2,
}
aliases_by_board = {
- "circuitplayground_express": ["circuitplayground_express_4h", "circuitplayground_express_digikey_pycon2019"],
+ "circuitplayground_express": [
+ "circuitplayground_express_4h",
+ "circuitplayground_express_digikey_pycon2019",
+ ],
"pybadge": ["edgebadge"],
"pyportal": ["pyportal_pynt"],
"gemma_m0": ["gemma_m0_pycon2018"],
- "pewpew10": ["pewpew13"]
+ "pewpew10": ["pewpew13"],
}
+
def get_languages():
languages = []
for f in os.scandir("../locale"):
@@ -84,6 +90,7 @@ def get_languages():
languages.append(f.name[:-3])
return languages
+
def get_board_mapping():
boards = {}
for port in SUPPORTED_PORTS:
@@ -95,23 +102,30 @@ def get_board_mapping():
extensions = extension_by_port[port]
extensions = extension_by_board.get(board_path.name, extensions)
aliases = aliases_by_board.get(board_path.name, [])
- boards[board_id] = {"port": port,
- "extensions": extensions,
- "download_count": 0,
- "aliases": aliases}
+ boards[board_id] = {
+ "port": port,
+ "extensions": extensions,
+ "download_count": 0,
+ "aliases": aliases,
+ }
for alias in aliases:
- boards[alias] = {"port": port,
- "extensions": extensions,
- "download_count": 0,
- "alias": True,
- "aliases": []}
+ boards[alias] = {
+ "port": port,
+ "extensions": extensions,
+ "download_count": 0,
+ "alias": True,
+ "aliases": [],
+ }
return boards
+
def get_version_info():
version = None
sha = git("rev-parse", "--short", "HEAD").stdout.decode("utf-8")
try:
- version = git("describe", "--tags", "--exact-match").stdout.decode("utf-8").strip()
+ version = (
+ git("describe", "--tags", "--exact-match").stdout.decode("utf-8").strip()
+ )
except sh.ErrorReturnCode_128:
# No exact match
pass
@@ -120,10 +134,11 @@ def get_version_info():
sha = os.environ["GITHUB_SHA"]
if not version:
- version="{}-{}".format(date.today().strftime("%Y%m%d"), sha[:7])
+ version = "{}-{}".format(date.today().strftime("%Y%m%d"), sha[:7])
return sha, version
+
def get_current_info():
response = github.get("/repos/adafruit/circuitpython-org/git/refs/heads/master")
if not response.ok:
@@ -131,7 +146,9 @@ def get_current_info():
raise RuntimeError("cannot get master sha")
commit_sha = response.json()["object"]["sha"]
- response = github.get("/repos/adafruit/circuitpython-org/contents/_data/files.json?ref=" + commit_sha)
+ response = github.get(
+ "/repos/adafruit/circuitpython-org/contents/_data/files.json?ref=" + commit_sha
+ )
if not response.ok:
print(response.text)
raise RuntimeError("cannot get previous files.json")
@@ -145,6 +162,7 @@ def get_current_info():
current_info[info["id"]] = info
return git_info, current_info
+
def create_pr(changes, updated, git_info, user):
commit_sha, original_blob_sha = git_info
branch_name = "new_release_" + changes["new_release"]
@@ -158,7 +176,7 @@ def create_pr(changes, updated, git_info, user):
updated_list.append(info)
updated = json.dumps(updated_list, sort_keys=True, indent=1).encode("utf-8") + b"\n"
- #print(updated.decode("utf-8"))
+ # print(updated.decode("utf-8"))
pr_title = "Automated website update for release {}".format(changes["new_release"])
boards = ""
if changes["new_boards"]:
@@ -167,16 +185,13 @@ def create_pr(changes, updated, git_info, user):
if changes["new_languages"]:
languages = "New languages:\n* " + "\n* ".join(changes["new_languages"])
message = "Automated website update for release {} by Blinka.\n\n{}\n\n{}\n".format(
- changes["new_release"],
- boards,
- languages
+ changes["new_release"], boards, languages
)
- create_branch = {
- "ref": "refs/heads/" + branch_name,
- "sha": commit_sha
- }
- response = github.post("/repos/{}/circuitpython-org/git/refs".format(user), json=create_branch)
+ create_branch = {"ref": "refs/heads/" + branch_name, "sha": commit_sha}
+ response = github.post(
+ "/repos/{}/circuitpython-org/git/refs".format(user), json=create_branch
+ )
if not response.ok and response.json()["message"] != "Reference already exists":
print("unable to create branch")
print(response.text)
@@ -186,10 +201,13 @@ def create_pr(changes, updated, git_info, user):
"message": message,
"content": base64.b64encode(updated).decode("utf-8"),
"sha": original_blob_sha,
- "branch": branch_name
+ "branch": branch_name,
}
- response = github.put("/repos/{}/circuitpython-org/contents/_data/files.json".format(user), json=update_file)
+ response = github.put(
+ "/repos/{}/circuitpython-org/contents/_data/files.json".format(user),
+ json=update_file,
+ )
if not response.ok:
print("unable to post new file")
print(response.text)
@@ -199,7 +217,7 @@ def create_pr(changes, updated, git_info, user):
"head": user + ":" + branch_name,
"base": "master",
"body": message,
- "maintainer_can_modify": True
+ "maintainer_can_modify": True,
}
response = github.post("/repos/adafruit/circuitpython-org/pulls", json=pr_info)
if not response.ok:
@@ -220,17 +238,14 @@ def print_active_user():
print("Not logged in")
return None
+
def generate_download_info():
boards = {}
errors = []
new_tag = os.environ["RELEASE_TAG"]
- changes = {
- "new_release": new_tag,
- "new_boards": [],
- "new_languages": []
- }
+ changes = {"new_release": new_tag, "new_boards": [], "new_languages": []}
user = print_active_user()
@@ -254,8 +269,9 @@ def generate_download_info():
info = current_info[board]
for version in info["versions"]:
previous_releases.add(version["version"])
- previous_languages.update(version["files"].keys())
- if version["stable"] == new_stable:
+ if version["stable"] == new_stable or (
+ new_stable and version["version"].startswith(this_version)
+ ):
info["versions"].remove(version)
board_mapping = get_board_mapping()
@@ -272,29 +288,15 @@ def generate_download_info():
alias_info = board_mapping[alias]
if alias not in current_info:
changes["new_boards"].append(alias)
- current_info[alias] = {"downloads": 0,
- "versions": []}
+ current_info[alias] = {"downloads": 0, "versions": []}
new_version = {
"stable": new_stable,
"version": new_tag,
"modules": support_matrix.get(alias, "[]"),
- "files": {},
"languages": languages,
- "extensions": board_info["extensions"]
+ "extensions": board_info["extensions"],
}
- for language in languages:
- files = []
- new_version["files"][language] = files
- for extension in board_info["extensions"]:
- files.append(
- "{base_url}/{alias}/{language}/adafruit-circuitpython-{alias}-{language}-{tag}.{extension}"
- .format(
- base_url=DOWNLOAD_BASE_URL,
- tag=new_tag,
- alias=alias,
- language=language,
- extension=extension))
current_info[alias]["downloads"] = alias_info["download_count"]
current_info[alias]["versions"].append(new_version)
@@ -305,6 +307,7 @@ def generate_download_info():
else:
print("No new release to update")
+
if __name__ == "__main__":
if "RELEASE_TAG" in os.environ and os.environ["RELEASE_TAG"]:
generate_download_info()
diff --git a/tools/extract_pyi.py b/tools/extract_pyi.py
index b7ce584a1..2730102ac 100644
--- a/tools/extract_pyi.py
+++ b/tools/extract_pyi.py
@@ -19,7 +19,7 @@ import black
IMPORTS_IGNORE = frozenset({'int', 'float', 'bool', 'str', 'bytes', 'tuple', 'list', 'set', 'dict', 'bytearray', 'slice', 'file', 'buffer', 'range', 'array', 'struct_time'})
IMPORTS_TYPING = frozenset({'Any', 'Optional', 'Union', 'Tuple', 'List', 'Sequence', 'NamedTuple', 'Iterable', 'Iterator', 'Callable', 'AnyStr', 'overload', 'Type'})
IMPORTS_TYPES = frozenset({'TracebackType'})
-CPY_TYPING = frozenset({'ReadableBuffer', 'WriteableBuffer', 'AudioSample', 'FrameBuffer'})
+CPY_TYPING = frozenset({'ReadableBuffer', 'WriteableBuffer', 'AudioSample', 'FrameBuffer', 'Alarm'})
def is_typed(node, allow_any=False):