diff --git a/.devcontainer/Readme.md b/.devcontainer/Readme.md new file mode 100644 index 0000000000..00acbb5786 --- /dev/null +++ b/.devcontainer/Readme.md @@ -0,0 +1,31 @@ +Build CircuitPython in a Github-Devcontainer +============================================ + +To build CircuitPython within a Github-Devcontainer, you need to perform +the following steps. + + 1. checkout the code to a devcontainer + + - click on the green "<> Code"-button + - select the Codespaces-tab + - choose "+ new with options..." from the "..."-menu + - in the following screen select the branch and then + - select ".devcontainer/cortex-m/devcontainer.json" instead + of "Default Codespaces configuration" + - update region as necessary + - finally, click on the green "Create codespace" button + + 2. Your codespace is created. Cloning the images is quite fast, but + preparing it for CircuitPython-development takes about 10 minutes. + Note that this is a one-time task. + + 3. During creation, you can run the command + `tail -f /workspaces/.codespaces/.persistedshare/creation.log` + to see what is going on. + + 4. To actually build CircuitPython, run + + cd ports/raspberrypi + make -j $(nproc) BOARD=whatever TRANSLATION=xx_XX + + This takes about 2m40s. diff --git a/.devcontainer/cortex-m/devcontainer.json b/.devcontainer/cortex-m/devcontainer.json new file mode 100644 index 0000000000..ee8aeb1ea0 --- /dev/null +++ b/.devcontainer/cortex-m/devcontainer.json @@ -0,0 +1,23 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/universal +{ + "name": "CircuitPython Cortex-M Build-Environment (base: Default Linux Universal)", + "image": "mcr.microsoft.com/devcontainers/universal:2-linux", + "postCreateCommand": ".devcontainer/cortex-m/on-create.sh", + "remoteEnv": { "PATH": "/workspaces/gcc-arm-none-eabi/bin:${containerEnv:PATH}" } + + // Features to add to the dev container. More info: https://containers.dev/features. + // "features": {}, + + // Use 'forwardPorts' to make a list of ports inside the container available locally. + // "forwardPorts": [], + + // Use 'postCreateCommand' to run commands after the container is created. + // "postCreateCommand": "uname -a", + + // Configure tool-specific properties. + // "customizations": {}, + + // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. + // "remoteUser": "root" +} diff --git a/.devcontainer/cortex-m/on-create.sh b/.devcontainer/cortex-m/on-create.sh new file mode 100755 index 0000000000..8c4bd0cfed --- /dev/null +++ b/.devcontainer/cortex-m/on-create.sh @@ -0,0 +1,59 @@ +#!/bin/bash +# ----------------------------------------------------------------------------- +# on-create.sh: postCreateCommand-hook for devcontainer.json (Cortex-M build) +# +# Author: Bernhard Bablok +# +# ----------------------------------------------------------------------------- + +echo -e "[on-create.sh] downloading and installing gcc-arm-non-eabi toolchain" +cd /workspaces +wget -qO gcc-arm-none-eabi.tar.bz2 https://adafru.it/Pid +tar -xjf gcc-arm-none-eabi.tar.bz2 +ln -s gcc-arm-none-eabi-10-2020-q4-major gcc-arm-none-eabi +rm -f /workspaces/gcc-arm-none-eabi.tar.bz2 +export PATH=/workspaces/gcc-arm-none-eabi/bin:$PATH + +# add repository and install tools +echo -e "[on-create.sh] adding pybricks/ppa" +sudo add-apt-repository -y ppa:pybricks/ppa +echo -e "[on-create.sh] installing uncrustify and mtools" +sudo apt-get -y install uncrustify mtools + +# dosfstools >= 4.2 needed, standard repo only has 4.1 +echo -e "[on-create.sh] downloading and installing dosfstools" +wget https://github.com/dosfstools/dosfstools/releases/download/v4.2/dosfstools-4.2.tar.gz +tar -xzf dosfstools-4.2.tar.gz +cd dosfstools-4.2/ +./configure +make -j $(nproc) +sudo make install +cd /workspaces +rm -fr /workspaces/dosfstools-4.2 /workspaces/dosfstools-4.2.tar.gz + +# prepare source-code tree +cd /workspaces/circuitpython/ +echo -e "[on-create.sh] fetching submodules" +make fetch-submodules +echo -e "[on-create.sh] fetching tags" +git fetch --tags --recurse-submodules=no --shallow-since="2021-07-01" https://github.com/adafruit/circuitpython HEAD + +# additional python requirements +echo -e "[on-create.sh] pip-installing requirements" +pip install --upgrade -r requirements-dev.txt +pip install --upgrade -r requirements-doc.txt + +# add pre-commit +echo -e "[on-create.sh] installing pre-commit" +pre-commit install + +# create cross-compiler +echo -e "[on-create.sh] building mpy-cross" +make -j $(nproc) -C mpy-cross # time: about 36 sec + +# that's it! +echo -e "[on-create.sh] setup complete" + +#commands to actually build CP: +#cd ports/raspberrypi +#time make -j $(nproc) BOARD=pimoroni_tufty2040 TRANSLATION=de_DE diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0dc47946b5..c584f5f427 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -37,7 +37,7 @@ jobs: - name: Set up Python 3 uses: actions/setup-python@v4 with: - python-version: "3.10" + python-version: "3.x" - name: Get CP deps run: python tools/ci_fetch_deps.py test ${{ github.sha }} - name: CircuitPython version @@ -125,20 +125,30 @@ jobs: [ -z "$AWS_ACCESS_KEY_ID" ] || aws s3 cp mpy-cross/mpy-cross.static-raspbian s3://adafruit-circuit-python/bin/mpy-cross/mpy-cross.static-raspbian-${{ env.CP_VERSION }} --no-progress --region us-east-1 [ -z "$AWS_ACCESS_KEY_ID" ] || aws s3 cp mpy-cross/mpy-cross.static s3://adafruit-circuit-python/bin/mpy-cross/mpy-cross.static-amd64-linux-${{ env.CP_VERSION }} --no-progress --region us-east-1 [ -z "$AWS_ACCESS_KEY_ID" ] || aws s3 cp mpy-cross/mpy-cross.static.exe s3://adafruit-circuit-python/bin/mpy-cross/mpy-cross.static-x64-windows-${{ env.CP_VERSION }}.exe --no-progress --region us-east-1 - - name: "Get changes" + - name: Get last commit with checks + id: get-last-commit-with-checks if: github.event_name == 'pull_request' - uses: dorny/paths-filter@v2 - id: filter + working-directory: tools + env: + REPO: ${{ github.repository }} + PULL: ${{ github.event.number }} + GITHUB_TOKEN: ${{ github.token }} + EXCLUDE_COMMIT: ${{ github.event.after }} + run: python3 -u ci_changes_per_commit.py + - name: Get changes + id: get-changes + if: github.event_name == 'pull_request' + uses: tj-actions/changed-files@v34 with: - list-files: json - filters: | - changed: - - '**' - - name: "Set matrix" + json: true + sha: ${{ steps.get-last-commit-with-checks.outputs.commit && github.event.after }} + base_sha: ${{ steps.get-last-commit-with-checks.outputs.commit }} + - name: Set matrix id: set-matrix working-directory: tools env: - CHANGED_FILES: ${{ steps.filter.outputs.changed_files }} + CHANGED_FILES: ${{ steps.get-changes.outputs.all_changed_and_modified_files }} + LAST_FAILED_JOBS: ${{ steps.get-last-commit-with-checks.outputs.checkruns }} run: python3 -u ci_set_matrix.py diff --git a/.github/workflows/create_website_pr.yml b/.github/workflows/create_website_pr.yml index 1658fe092c..75de556c68 100644 --- a/.github/workflows/create_website_pr.yml +++ b/.github/workflows/create_website_pr.yml @@ -23,7 +23,7 @@ jobs: - name: Set up Python 3 uses: actions/setup-python@v4 with: - python-version: "3.10" + python-version: "3.x" - name: Get CP deps run: python tools/ci_fetch_deps.py website ${{ github.sha }} - name: Install deps diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 556f89e63c..a23dcd1d11 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -20,7 +20,7 @@ jobs: - name: Set up Python 3 uses: actions/setup-python@v4 with: - python-version: "3.10" + python-version: "3.x" - name: Install deps run: | sudo apt-get install -y gettext uncrustify diff --git a/.gitignore b/.gitignore index 2fdfe207a2..9cb1e9ea5e 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ !atmel-samd/asf/**/*.a *.elf *.bin +!*.toml.bin *.map *.hex *.dis diff --git a/.gitmodules b/.gitmodules index f13eb79e45..dfd718630c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -146,7 +146,7 @@ [submodule "ports/espressif/esp-idf"] path = ports/espressif/esp-idf url = https://github.com/adafruit/esp-idf.git - branch = circuitpython8 + branch = release/v4.4-circuitpython [submodule "ports/espressif/certificates/nina-fw"] path = lib/certificates/nina-fw url = https://github.com/adafruit/nina-fw.git @@ -310,12 +310,15 @@ [submodule "ports/espressif/esp32-camera"] path = ports/espressif/esp32-camera url = https://github.com/adafruit/esp32-camera/ + branch = circuitpython [submodule "ports/raspberrypi/lib/cyw43-driver"] path = ports/raspberrypi/lib/cyw43-driver - url = https://github.com/georgerobotics/cyw43-driver.git + url = https://github.com/adafruit/cyw43-driver.git + branch = circuitpython8 [submodule "ports/raspberrypi/lib/lwip"] path = ports/raspberrypi/lib/lwip - url = https://github.com/lwip-tcpip/lwip.git + url = https://github.com/adafruit/lwip.git + branch = circuitpython8 [submodule "lib/mbedtls"] path = lib/mbedtls url = https://github.com/ARMmbed/mbedtls.git diff --git a/Makefile b/Makefile index b35b5c66b9..40952d261d 100644 --- a/Makefile +++ b/Makefile @@ -90,7 +90,7 @@ clean: rm -rf autoapi rm -rf $(STUBDIR) $(DISTDIR) *.egg-info -html: stubs +html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." diff --git a/conf.py b/conf.py index 90f58979d9..7b3b4ca585 100644 --- a/conf.py +++ b/conf.py @@ -171,6 +171,7 @@ exclude_patterns = ["**/build*", ".env", ".venv", ".direnv", + ".devcontainer/Readme.md", "data", "docs/autoapi", "docs/README.md", diff --git a/devices/ble_hci/common-hal/_bleio/Adapter.c b/devices/ble_hci/common-hal/_bleio/Adapter.c index 8c7b8f67eb..f558d66d40 100644 --- a/devices/ble_hci/common-hal/_bleio/Adapter.c +++ b/devices/ble_hci/common-hal/_bleio/Adapter.c @@ -49,8 +49,8 @@ #include "shared-bindings/_bleio/ScanEntry.h" #include "shared-bindings/time/__init__.h" -#if CIRCUITPY_DOTENV -#include "shared-module/dotenv/__init__.h" +#if CIRCUITPY_OS_GETENV +#include "shared-bindings/os/__init__.h" #endif #define MSEC_TO_UNITS(TIME, RESOLUTION) (((TIME) * 1000) / (RESOLUTION)) @@ -284,15 +284,15 @@ char default_ble_name[] = { 'C', 'I', 'R', 'C', 'U', 'I', 'T', 'P', 'Y', 0, 0, 0 STATIC void bleio_adapter_hci_init(bleio_adapter_obj_t *self) { mp_int_t name_len = 0; - #if CIRCUITPY_DOTENV - char ble_name[32]; - name_len = dotenv_get_key("/.env", "CIRCUITPY_BLE_NAME", ble_name, sizeof(ble_name) - 1); - if (name_len > 0) { - self->name = mp_obj_new_str(ble_name, (size_t)name_len); + #if CIRCUITPY_OS_GETENV + mp_obj_t name = common_hal_os_getenv("CIRCUITPY_BLE_NAME", mp_const_none); + if (name != mp_const_none) { + mp_arg_validate_type_string(name, MP_QSTR_CIRCUITPY_BLE_NAME); + self->name = name; } #endif - if (name_len <= 0) { + if (!self->name) { name_len = sizeof(default_ble_name); bt_addr_t addr; hci_check_error(hci_read_bd_addr(&addr)); diff --git a/docs/drivers.rst b/docs/drivers.rst deleted file mode 100644 index 8855abbd2d..0000000000 --- a/docs/drivers.rst +++ /dev/null @@ -1,33 +0,0 @@ -Additional CircuitPython Libraries and Drivers on GitHub -========================================================= - -These are libraries and drivers available in separate GitHub repos. They are -designed for use with CircuitPython and may or may not work with -`MicroPython `_. - - -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, -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: . - -- Documentation for the bundle, which includes links to documentation for all - libraries, is available here: . - - -CircuitPython Community Library Bundle ---------------------------------------- - -This bundle contains non-Adafruit sponsored libraries, that are written and submitted -by members of the community. - -- The Community bundles are available on GitHub: . - -- Documentation is not available on ReadTheDocs at this time. See each library for any - included documentation. diff --git a/docs/environment.rst b/docs/environment.rst index 5766b54380..58ada402c6 100644 --- a/docs/environment.rst +++ b/docs/environment.rst @@ -6,24 +6,49 @@ variables are commonly used to store "secrets" such as Wi-Fi passwords and API keys. This method *does not* make them secure. It only separates them from the code. -CircuitPython supports these by mimicking the `dotenv `_ -CPython library. Other languages such as Javascript, PHP and Ruby also have -dotenv libraries. +CircuitPython uses a file called ``settings.toml`` at the drive root (no +folder) as the environment. User code can access the values from the file +using `os.getenv()`. It is recommended to save any values used repeatedly in a +variable because `os.getenv()` will parse the ``settings.toml`` file contents +on every access. -These libraries store environment variables in a ``.env`` file. Here is a simple -example: +CircuitPython only supports a subset of the full toml specification, see below +for more details. The subset is very "Python-like", which is a key reason we +selected the format. -.. code-block:: bash +Due to technical limitations it probably also accepts some files that are +not valid TOML files; bugs of this nature are subject to change (i.e., be +fixed) without the usual deprecation period for incompatible changes. - KEY1='value1' - # Comment - KEY2='value2 - is multiple lines' +File format example: -CircuitPython uses the ``.env`` at the drive root (no folder) as the environment. -User code can access the values from the file using `os.getenv()`. It is -recommended to save any values used repeatedly in a variable because `os.getenv()` -will parse the ``/.env`` on every access. +.. code-block:: + + str_key="Hello world" # with trailing comment + int_key = 7 + unicode_key="œuvre" + unicode_key2="\\u0153uvre" # same as above + unicode_key3="\\U00000153uvre" # same as above + escape_codes="supported, including \\r\\n\\"\\\\" + # comment + [subtable] + subvalue="cannot retrieve this using getenv" + + +Details of the toml language subset +----------------------------------- + +* The content is required to be in UTF-8 encoding +* The supported data types are string and integer +* Only basic strings are supported, not triple-quoted strings +* Only integers supported by strtol. (no 0o, no 0b, no underscores 1_000, 011 + is 9, not 11) +* Only bare keys are supported +* Duplicate keys are not diagnosed. +* Comments are supported +* Only values from the "root table" can be retrieved +* due to technical limitations, the content of multi-line + strings can erroneously be parsed as a value. CircuitPython behavior ---------------------- diff --git a/docs/index.rst b/docs/index.rst index abc0236995..e49b74b4e3 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -21,7 +21,7 @@ Full Table of Contents ../shared-bindings/index.rst supported_ports.rst troubleshooting.rst - drivers.rst + libraries.rst workflows environment.rst diff --git a/docs/libraries.rst b/docs/libraries.rst new file mode 100644 index 0000000000..2d34ccbe3f --- /dev/null +++ b/docs/libraries.rst @@ -0,0 +1,31 @@ +Adafruit CircuitPython Libraries +================================ + +Documentation for all Adafruit-sponsored CircuitPython libraries is at: +. + + +CircuitPython Library Bundles +============================= + +Many Python libraries, including device drivers, have been written for use with CircuitPython. +They are maintained in separate GitHub repos, one per library. + +Libraries are packaged in *bundles*, which are ZIP files that are snapshots in time of a group of libraries. + +Adafruit sponsors and maintains several hundred libraries, packaged in the **Adafruit Library Bundle**. +Adafruit-sponsored libraries are also available on . + +Yet other libraries are maintained by members of the CircuitPython community, +and are packaged in the **CircuitPython Community Library Bundle**. + +The Adafruit bundles are available on GitHub: . +The Community bundles are available at: . + +More detailed information about the bundles, and download links for the latest bundles +are at . + +Documentation about bundle construction is at: . + +Documentation for Community Libraries is not available on ReadTheDocs at this time. See the GitHub repository +for each library for any included documentation. diff --git a/docs/library/asyncio.rst b/docs/library/asyncio.rst deleted file mode 100644 index 87417f55e2..0000000000 --- a/docs/library/asyncio.rst +++ /dev/null @@ -1,323 +0,0 @@ -:mod:`uasyncio` --- asynchronous I/O scheduler -============================================== - -.. module:: uasyncio - :synopsis: asynchronous I/O scheduler for writing concurrent code - -|see_cpython_module| -`asyncio `_ - -Example:: - - import uasyncio - - async def blink(led, period_ms): - while True: - led.on() - await uasyncio.sleep_ms(5) - led.off() - await uasyncio.sleep_ms(period_ms) - - async def main(led1, led2): - uasyncio.create_task(blink(led1, 700)) - uasyncio.create_task(blink(led2, 400)) - await uasyncio.sleep_ms(10_000) - - # Running on a pyboard - from pyb import LED - uasyncio.run(main(LED(1), LED(2))) - - # Running on a generic board - from machine import Pin - uasyncio.run(main(Pin(1), Pin(2))) - -Core functions --------------- - -.. function:: create_task(coro) - - Create a new task from the given coroutine and schedule it to run. - - Returns the corresponding `Task` object. - -.. function:: current_task() - - Return the `Task` object associated with the currently running task. - -.. function:: run(coro) - - Create a new task from the given coroutine and run it until it completes. - - Returns the value returned by *coro*. - -.. function:: sleep(t) - - Sleep for *t* seconds (can be a float). - - This is a coroutine. - -.. function:: sleep_ms(t) - - Sleep for *t* milliseconds. - - This is a coroutine, and a MicroPython extension. - -Additional functions --------------------- - -.. function:: wait_for(awaitable, timeout) - - Wait for the *awaitable* to complete, but cancel it if it takes longer - that *timeout* seconds. If *awaitable* is not a task then a task will be - created from it. - - If a timeout occurs, it cancels the task and raises ``asyncio.TimeoutError``: - this should be trapped by the caller. - - Returns the return value of *awaitable*. - - This is a coroutine. - -.. function:: wait_for_ms(awaitable, timeout) - - Similar to `wait_for` but *timeout* is an integer in milliseconds. - - This is a coroutine, and a MicroPython extension. - -.. function:: gather(*awaitables, return_exceptions=False) - - Run all *awaitables* concurrently. Any *awaitables* that are not tasks are - promoted to tasks. - - Returns a list of return values of all *awaitables*. - - This is a coroutine. - -class Task ----------- - -.. class:: Task() - - This object wraps a coroutine into a running task. Tasks can be waited on - using ``await task``, which will wait for the task to complete and return - the return value of the task. - - Tasks should not be created directly, rather use `create_task` to create them. - -.. method:: Task.cancel() - - Cancel the task by injecting a ``CancelledError`` into it. The task may - or may not ignore this exception. - -class Event ------------ - -.. class:: Event() - - Create a new event which can be used to synchronise tasks. Events start - in the cleared state. - -.. method:: Event.is_set() - - Returns ``True`` if the event is set, ``False`` otherwise. - -.. method:: Event.set() - - Set the event. Any tasks waiting on the event will be scheduled to run. - -.. method:: Event.clear() - - Clear the event. - -.. method:: Event.wait() - - Wait for the event to be set. If the event is already set then it returns - immediately. - - This is a coroutine. - -class Lock ----------- - -.. class:: Lock() - - Create a new lock which can be used to coordinate tasks. Locks start in - the unlocked state. - - In addition to the methods below, locks can be used in an ``async with`` statement. - -.. method:: Lock.locked() - - Returns ``True`` if the lock is locked, otherwise ``False``. - -.. method:: Lock.acquire() - - Wait for the lock to be in the unlocked state and then lock it in an atomic - way. Only one task can acquire the lock at any one time. - - This is a coroutine. - -.. method:: Lock.release() - - Release the lock. If any tasks are waiting on the lock then the next one in the - queue is scheduled to run and the lock remains locked. Otherwise, no tasks are - waiting an the lock becomes unlocked. - -TCP stream connections ----------------------- - -.. function:: open_connection(host, port) - - Open a TCP connection to the given *host* and *port*. The *host* address will be - resolved using `socket.getaddrinfo`, which is currently a blocking call. - - Returns a pair of streams: a reader and a writer stream. - Will raise a socket-specific ``OSError`` if the host could not be resolved or if - the connection could not be made. - - This is a coroutine. - -.. function:: start_server(callback, host, port, backlog=5) - - Start a TCP server on the given *host* and *port*. The *callback* will be - called with incoming, accepted connections, and be passed 2 arguments: reader - and writer streams for the connection. - - Returns a `Server` object. - - This is a coroutine. - -.. class:: Stream() - - This represents a TCP stream connection. To minimise code this class implements - both a reader and a writer, and both ``StreamReader`` and ``StreamWriter`` alias to - this class. - -.. method:: Stream.get_extra_info(v) - - Get extra information about the stream, given by *v*. The valid values for *v* are: - ``peername``. - -.. method:: Stream.close() - - Close the stream. - -.. method:: Stream.wait_closed() - - Wait for the stream to close. - - This is a coroutine. - -.. method:: Stream.read(n) - - Read up to *n* bytes and return them. - - This is a coroutine. - -.. method:: Stream.readinto(buf) - - Read up to n bytes into *buf* with n being equal to the length of *buf*. - - Return the number of bytes read into *buf*. - - This is a coroutine, and a MicroPython extension. - -.. method:: Stream.readexactly(n) - - Read exactly *n* bytes and return them as a bytes object. - - Raises an ``EOFError`` exception if the stream ends before reading *n* bytes. - - This is a coroutine. - -.. method:: Stream.readline() - - Read a line and return it. - - This is a coroutine. - -.. method:: Stream.write(buf) - - Accumulated *buf* to the output buffer. The data is only flushed when - `Stream.drain` is called. It is recommended to call `Stream.drain` immediately - after calling this function. - -.. method:: Stream.drain() - - Drain (write) all buffered output data out to the stream. - - This is a coroutine. - -.. class:: Server() - - This represents the server class returned from `start_server`. It can be used - in an ``async with`` statement to close the server upon exit. - -.. method:: Server.close() - - Close the server. - -.. method:: Server.wait_closed() - - Wait for the server to close. - - This is a coroutine. - -Event Loop ----------- - -.. function:: get_event_loop() - - Return the event loop used to schedule and run tasks. See `Loop`. - -.. function:: new_event_loop() - - Reset the event loop and return it. - - Note: since MicroPython only has a single event loop this function just - resets the loop's state, it does not create a new one. - -.. class:: Loop() - - This represents the object which schedules and runs tasks. It cannot be - created, use `get_event_loop` instead. - -.. method:: Loop.create_task(coro) - - Create a task from the given *coro* and return the new `Task` object. - -.. method:: Loop.run_forever() - - Run the event loop until `stop()` is called. - -.. method:: Loop.run_until_complete(awaitable) - - Run the given *awaitable* until it completes. If *awaitable* is not a task - then it will be promoted to one. - -.. method:: Loop.stop() - - Stop the event loop. - -.. method:: Loop.close() - - Close the event loop. - -.. method:: Loop.set_exception_handler(handler) - - Set the exception handler to call when a Task raises an exception that is not - caught. The *handler* should accept two arguments: ``(loop, context)``. - -.. method:: Loop.get_exception_handler() - - Get the current exception handler. Returns the handler, or ``None`` if no - custom handler is set. - -.. method:: Loop.default_exception_handler(context) - - The default exception handler that is called. - -.. method:: Loop.call_exception_handler(context) - - Call the current exception handler. The argument *context* is passed through and - is a dictionary containing keys: ``'message'``, ``'exception'``, ``'future'``. diff --git a/docs/library/index.rst b/docs/library/index.rst index b71949c2dd..2a8e37a8f4 100644 --- a/docs/library/index.rst +++ b/docs/library/index.rst @@ -35,7 +35,6 @@ These libraries are not currently enabled in any CircuitPython build, but may be json.rst re.rst sys.rst - asyncio.rst ctypes.rst select.rst diff --git a/docs/workflows.md b/docs/workflows.md index 26f5179b51..29229bd00e 100644 --- a/docs/workflows.md +++ b/docs/workflows.md @@ -46,7 +46,7 @@ connection, the central device can discover two default services. One for file t CircuitPython specifically that includes serial characteristics. To change the default BLE advertising name without (or before) running user code, the desired name -can be put in the `/.env` file. The key is `CIRCUITPY_BLE_NAME`. It's limited to approximately +can be put in the `settings.toml` file. The key is `CIRCUITPY_BLE_NAME`. It's limited to approximately 30 characters depending on the port's settings and will be truncated if longer. ### File Transfer API @@ -69,21 +69,21 @@ Read-only characteristic that returns the UTF-8 encoded version string. ## Web -The web workflow is depends on adding Wi-Fi credentials into the `/.env` file. The keys are +The web workflow is depends on adding Wi-Fi credentials into the `settings.toml` file. The keys are `CIRCUITPY_WIFI_SSID` and `CIRCUITPY_WIFI_PASSWORD`. Once these are defined, CircuitPython will automatically connect to the network and start the webserver used for the workflow. The webserver is on port 80 unless overridden by `CIRCUITPY_WEB_API_PORT`. It also enables MDNS. -Here is an example `/.env`: +Here is an example `/settings.toml`: ```bash # To auto-connect to Wi-Fi -CIRCUITPY_WIFI_SSID='scottswifi' -CIRCUITPY_WIFI_PASSWORD='secretpassword' +CIRCUITPY_WIFI_SSID="scottswifi" +CIRCUITPY_WIFI_PASSWORD="secretpassword" # To enable modifying files from the web. Change this too! # Leave the User field blank in the browser. -CIRCUITPY_WEB_API_PASSWORD='passw0rd' +CIRCUITPY_WEB_API_PASSWORD="passw0rd" CIRCUITPY_WEB_API_PORT=80 ``` @@ -124,7 +124,7 @@ All file system related APIs are protected by HTTP basic authentication. It is * hopefully prevent some griefing in shared settings. The password is sent unencrypted so do not reuse a password with something important. The user field is left blank. -The password is taken from `/.env` with the key `CIRCUITPY_WEB_API_PASSWORD`. If this is unset, the +The password is taken from `settings.toml` with the key `CIRCUITPY_WEB_API_PASSWORD`. If this is unset, the server will respond with `403 Forbidden`. When a password is set, but not provided in a request, it will respond `401 Unauthorized`. diff --git a/extmod/ulab b/extmod/ulab index 25a825e41c..e68bb707b2 160000 --- a/extmod/ulab +++ b/extmod/ulab @@ -1 +1 @@ -Subproject commit 25a825e41c26cfcee018b762416741d0d63aeabf +Subproject commit e68bb707b20ee326d84ab75fc9fb35f2e85b87e3 diff --git a/extmod/vfs_fat.c b/extmod/vfs_fat.c index 2a00566317..0a9737e53a 100644 --- a/extmod/vfs_fat.c +++ b/extmod/vfs_fat.c @@ -429,6 +429,18 @@ STATIC mp_obj_t vfs_fat_utime(mp_obj_t vfs_in, mp_obj_t path_in, mp_obj_t times_ } STATIC MP_DEFINE_CONST_FUN_OBJ_3(fat_vfs_utime_obj, vfs_fat_utime); +STATIC mp_obj_t vfs_fat_getreadonly(mp_obj_t self_in) { + fs_user_mount_t *self = MP_OBJ_TO_PTR(self_in); + return mp_obj_new_bool(!filesystem_is_writable_by_python(self)); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(fat_vfs_getreadonly_obj, vfs_fat_getreadonly); +STATIC const mp_obj_property_t fat_vfs_readonly_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&fat_vfs_getreadonly_obj, + MP_ROM_NONE, + MP_ROM_NONE}, +}; + #if MICROPY_FATFS_USE_LABEL STATIC mp_obj_t vfs_fat_getlabel(mp_obj_t self_in) { fs_user_mount_t *self = MP_OBJ_TO_PTR(self_in); @@ -481,6 +493,7 @@ STATIC const mp_rom_map_elem_t fat_vfs_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_mount), MP_ROM_PTR(&vfs_fat_mount_obj) }, { MP_ROM_QSTR(MP_QSTR_umount), MP_ROM_PTR(&fat_vfs_umount_obj) }, { MP_ROM_QSTR(MP_QSTR_utime), MP_ROM_PTR(&fat_vfs_utime_obj) }, + { MP_ROM_QSTR(MP_QSTR_readonly), MP_ROM_PTR(&fat_vfs_readonly_obj) }, #if MICROPY_FATFS_USE_LABEL { MP_ROM_QSTR(MP_QSTR_label), MP_ROM_PTR(&fat_vfs_label_obj) }, #endif diff --git a/lib/oofatfs/ff.c b/lib/oofatfs/ff.c index e6afd57800..9d3c67cf7d 100644 --- a/lib/oofatfs/ff.c +++ b/lib/oofatfs/ff.c @@ -257,6 +257,11 @@ #define GET_FATTIME() get_fattime() #endif +#if FF_FS_MAKE_VOLID == 1 +#define MAKE_VOLID(x) (make_volid()) +#else +#define MAKE_VOLID(x) (GET_FATTIME()) +#endif /* File lock controls */ #if FF_FS_LOCK != 0 @@ -5421,6 +5426,7 @@ FRESULT f_mkfs ( DWORD tbl[3]; #endif + DWORD volid = MAKE_VOLID(); /* Check mounted drive and clear work area */ fs->fs_type = 0; /* Clear mounted volume */ @@ -5622,7 +5628,7 @@ FRESULT f_mkfs ( st_dword(buf + BPB_DataOfsEx, b_data - b_vol); /* Data offset [sector] */ st_dword(buf + BPB_NumClusEx, n_clst); /* Number of clusters */ st_dword(buf + BPB_RootClusEx, 2 + tbl[0] + tbl[1]); /* Root dir cluster # */ - st_dword(buf + BPB_VolIDEx, GET_FATTIME()); /* VSN */ + st_dword(buf + BPB_VolIDEx, volid); /* VSN */ st_word(buf + BPB_FSVerEx, 0x100); /* Filesystem version (1.00) */ for (buf[BPB_BytsPerSecEx] = 0, i = ss; i >>= 1; buf[BPB_BytsPerSecEx]++) ; /* Log2 of sector size [byte] */ for (buf[BPB_SecPerClusEx] = 0, i = au; i >>= 1; buf[BPB_SecPerClusEx]++) ; /* Log2 of cluster size [sector] */ @@ -5758,7 +5764,7 @@ FRESULT f_mkfs ( st_dword(buf + BPB_HiddSec, b_vol); /* Volume offset in the physical drive [sector] */ #if FF_MKFS_FAT32 if (fmt == FS_FAT32) { - st_dword(buf + BS_VolID32, GET_FATTIME()); /* VSN */ + st_dword(buf + BS_VolID32, volid); /* VSN */ st_dword(buf + BPB_FATSz32, sz_fat); /* FAT size [sector] */ st_dword(buf + BPB_RootClus32, 2); /* Root directory cluster # (2) */ st_word(buf + BPB_FSInfo32, 1); /* Offset of FSINFO sector (VBR + 1) */ @@ -5769,7 +5775,7 @@ FRESULT f_mkfs ( } else #endif { - st_dword(buf + BS_VolID, GET_FATTIME()); /* VSN */ + st_dword(buf + BS_VolID, volid); /* VSN */ st_word(buf + BPB_FATSz16, (WORD)sz_fat); /* FAT size [sector] */ buf[BS_DrvNum] = 0x80; /* Drive number (for int13) */ buf[BS_BootSig] = 0x29; /* Extended boot signature */ diff --git a/lib/oofatfs/ff.h b/lib/oofatfs/ff.h index a8aa00e9af..b133d770db 100644 --- a/lib/oofatfs/ff.h +++ b/lib/oofatfs/ff.h @@ -334,6 +334,10 @@ FRESULT f_setcp (WORD cp); /* Set curre DWORD get_fattime (void); #endif +#if FF_FS_MAKE_VOLID +DWORD make_volid (void); +#endif + /* LFN support functions */ #if FF_USE_LFN >= 1 /* Code conversion (defined in unicode.c) */ WCHAR ff_oem2uni (WCHAR oem, WORD cp); /* OEM code to Unicode conversion */ diff --git a/lib/oofatfs/ffconf.h b/lib/oofatfs/ffconf.h index 248987dda3..52ff6d0a7a 100644 --- a/lib/oofatfs/ffconf.h +++ b/lib/oofatfs/ffconf.h @@ -373,6 +373,10 @@ / SemaphoreHandle_t and etc. A header file for O/S definitions needs to be / included somewhere in the scope of ff.h. */ - +#ifndef FF_FS_MAKE_VOLID +#define FF_FS_MAKE_VOLID (0) +#endif +/* The option FF_FS_MAKE_VOLID enables the use of a function to return a 32-bit volume identifier. +/ If it is disabled, a Volume ID based on the current time is used. */ /*--- End of configuration options ---*/ diff --git a/lib/protomatter b/lib/protomatter index cc93ff18c3..d0a07e14ad 160000 --- a/lib/protomatter +++ b/lib/protomatter @@ -1 +1 @@ -Subproject commit cc93ff18c3a20b25396cb2babaee8ed33bb79528 +Subproject commit d0a07e14adcd71a7c22bcceb16c55aadb5e0d104 diff --git a/locale/ID.po b/locale/ID.po index fe346373ef..9f1e185dff 100644 --- a/locale/ID.po +++ b/locale/ID.po @@ -70,6 +70,11 @@ msgstr "%%c harus int atau char" msgid "%02X" msgstr "" +#: shared-module/os/getenv.c +#, c-format +msgid "%S" +msgstr "" + #: shared-bindings/rgbmatrix/RGBMatrix.c #, c-format msgid "" @@ -106,13 +111,14 @@ msgstr "%q berisi pin duplikat" msgid "%q failure: %d" msgstr "%q gagal: %d" +#: ports/espressif/common-hal/espulp/ULP.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/microcontroller/Pin.c msgid "%q in use" msgstr "%q sedang digunakan" -#: py/obj.c py/objstr.c py/objstrunicode.c +#: py/objstr.c py/objstrunicode.c msgid "%q index out of range" msgstr "%q indeks di luar batas" @@ -124,7 +130,11 @@ msgstr "" msgid "%q is %q" msgstr "" -#: py/argcheck.c +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "%q is read-only for this board" +msgstr "" + +#: py/argcheck.c shared-bindings/usb_hid/Device.c msgid "%q length must be %d" msgstr "" @@ -140,10 +150,6 @@ msgstr "" msgid "%q length must be >= %d" msgstr "" -#: shared-bindings/busio/I2C.c -msgid "%q length must be >= 1" -msgstr "%q panjang harus >= 1" - #: py/argcheck.c msgid "%q must be %d" msgstr "" @@ -165,23 +171,18 @@ msgid "%q must be >= %d" msgstr "%q harus >= %d" #: shared-bindings/analogbufio/BufferedIn.c +msgid "%q must be a bytearray or array of type 'H' or 'B'" +msgstr "" + #: shared-bindings/audiocore/RawSample.c msgid "%q must be a bytearray or array of type 'h', 'H', 'b', or 'B'" msgstr "" -#: py/argcheck.c -msgid "%q must be a string" -msgstr "%q harus berupa string" - -#: py/argcheck.c -msgid "%q must be an int" -msgstr "" - -#: py/argcheck.c +#: py/argcheck.c py/obj.c py/objstrunicode.c msgid "%q must be of type %q" msgstr "%q harus bertipe %q" -#: shared-bindings/digitalio/Pull.c +#: py/objexcept.c shared-bindings/digitalio/Pull.c msgid "%q must be of type %q or None" msgstr "" @@ -195,7 +196,6 @@ msgstr "" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c #: ports/cxd56/common-hal/pulseio/PulseIn.c -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/nrf/common-hal/pulseio/PulseIn.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c @@ -207,8 +207,8 @@ msgstr "%q di luar jangkauan" msgid "%q pin invalid" msgstr "pin %q tidak valid" -#: shared-bindings/usb_hid/Device.c -msgid "%q with a report ID of 0 must be of length 1" +#: py/objrange.c py/objslice.c shared-bindings/random/__init__.c +msgid "%q step cannot be zero" msgstr "" #: py/bc.c py/objnamedtuple.c @@ -308,7 +308,7 @@ msgstr "" msgid "'%s' object doesn't support item deletion" msgstr "" -#: ports/raspberrypi/common-hal/wifi/Radio.c py/runtime.c +#: py/runtime.c msgid "'%s' object has no attribute '%q'" msgstr "Objek '%s' tidak memiliki atribut '%q'" @@ -408,6 +408,10 @@ msgstr "ADC2 sedang digunakan oleh WiFi" msgid "Address must be %d bytes long" msgstr "Alamat harus sepanjang %d byte" +#: ports/espressif/common-hal/memorymap/AddressRange.c +msgid "Address range not allowed" +msgstr "" + #: ports/espressif/common-hal/canio/CAN.c msgid "All CAN peripherals are in use" msgstr "" @@ -488,7 +492,7 @@ msgstr "Sudah disebarkan." msgid "Already have all-matches listener" msgstr "" -#: ports/espressif/common-hal/coproc/__init__.c +#: ports/espressif/common-hal/espulp/ULP.c #: shared-module/memorymonitor/AllocationAlarm.c #: shared-module/memorymonitor/AllocationSize.c msgid "Already running" @@ -499,6 +503,11 @@ msgstr "" msgid "Already scanning for wifi networks" msgstr "" +#: shared-module/os/getenv.c +#, c-format +msgid "An error occurred while retrieving '%s':\n" +msgstr "" + #: ports/stm/common-hal/audiopwmio/PWMAudioOut.c msgid "Another PWMAudioOut is already active" msgstr "" @@ -512,15 +521,11 @@ msgstr "Send yang lain sudah aktif" msgid "Array must contain halfwords (type 'H')" msgstr "Array harus mengandung halfwords (ketik 'H')" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Array values should be single bytes." msgstr "Nilai array harus berupa byte tunggal." -#: shared-bindings/microcontroller/Pin.c -msgid "At most %d %q may be specified (not %d)" -msgstr "Paling banyak %d %q dapat ditentukan (bukan %d)" - #: shared-module/memorymonitor/AllocationAlarm.c #, c-format msgid "Attempt to allocate %d blocks" @@ -907,6 +912,10 @@ msgstr "" msgid "Drive mode not used when direction is input." msgstr "Mode kendara tidak digunakan saat arah input." +#: py/obj.c +msgid "During handling of the above exception, another exception occurred:" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "ECB only operates on 16 bytes at a time" msgstr "ECB hanya beroperasi pada 16 byte di satu waktu" @@ -936,10 +945,10 @@ msgstr "Error pada regex" msgid "Error: Failure to bind" msgstr "" -#: py/enum.c shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c -#: shared-bindings/alarm/__init__.c shared-bindings/alarm/coproc/CoprocAlarm.c -#: shared-bindings/busio/SPI.c shared-bindings/coproc/Coproc.c -#: shared-bindings/coproc/__init__.c shared-bindings/microcontroller/Pin.c +#: ports/espressif/bindings/espulp/ULP.c py/enum.c +#: shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c +#: shared-bindings/alarm/__init__.c shared-bindings/busio/SPI.c +#: shared-bindings/microcontroller/Pin.c #: shared-bindings/neopixel_write/__init__.c msgid "Expected a %q" msgstr "Diharapkan %q" @@ -1024,6 +1033,10 @@ msgstr "" msgid "File exists" msgstr "File sudah ada" +#: shared-module/os/getenv.c +msgid "File not found" +msgstr "" + #: ports/atmel-samd/common-hal/canio/Listener.c #: ports/espressif/common-hal/canio/Listener.c #: ports/stm/common-hal/canio/Listener.c @@ -1038,7 +1051,6 @@ msgstr "" msgid "Firmware is invalid" msgstr "" -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/espressif/common-hal/dualbank/__init__.c msgid "Firmware is too big" msgstr "" @@ -1080,6 +1092,8 @@ msgstr "" #: shared-bindings/displayio/Display.c #: shared-bindings/displayio/EPaperDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c +#: shared-module/displayio/Display.c +#: shared-module/framebufferio/FramebufferDisplay.c msgid "Group already used" msgstr "Grup sudah digunakan" @@ -1208,6 +1222,7 @@ msgid "Internal define error" msgstr "Kesalahan definisi internal" #: ports/espressif/common-hal/paralleldisplay/ParallelBus.c +#: shared-module/os/getenv.c msgid "Internal error" msgstr "" @@ -1254,6 +1269,11 @@ msgstr "Argumen tidak valid" msgid "Invalid bits per value" msgstr "Bit per nilai tidak valid" +#: shared-module/os/getenv.c +#, c-format +msgid "Invalid byte %.*s" +msgstr "" + #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #, c-format msgid "Invalid data_pins[%d]" @@ -1271,10 +1291,6 @@ msgstr "Akses memori tidak valid." msgid "Invalid multicast MAC address" msgstr "" -#: shared-bindings/busio/UART.c -msgid "Invalid pins" -msgstr "Pin-pin tidak valid" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Invalid size" msgstr "" @@ -1288,10 +1304,18 @@ msgstr "" msgid "Invalid state" msgstr "" +#: shared-module/os/getenv.c +msgid "Invalid unicode escape" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "Key must be 16, 24, or 32 bytes long" msgstr "Panjang kunci harus 16, 24, atau 32 byte" +#: shared-module/os/getenv.c +msgid "Key not found" +msgstr "" + #: shared-module/is31fl3741/FrameBuffer.c msgid "LED mappings must match display size" msgstr "" @@ -1398,6 +1422,10 @@ msgstr "" msgid "NVS Error" msgstr "" +#: shared-bindings/socketpool/SocketPool.c +msgid "Name or service not known" +msgstr "" + #: py/qstr.c msgid "Name too long" msgstr "Nama terlalu panjang" @@ -1512,11 +1540,6 @@ msgstr "Tidak ada kunci yang ditentukan" msgid "No long integer support" msgstr "Tidak ada dukungan bilangan bulat yang panjang" -#: shared-module/usb_hid/__init__.c -#, c-format -msgid "No more than %d HID devices allowed" -msgstr "" - #: shared-bindings/wifi/Radio.c msgid "No network with that ssid" msgstr "" @@ -1646,11 +1669,14 @@ msgstr "" "Hanya monokrom, 4bpp atau 8bpp yang diindeks, dan 16bpp atau lebih yang " "didukung: %d bpp diberikan" -#: ports/espressif/common-hal/alarm/coproc/CoprocAlarm.c #: ports/espressif/common-hal/alarm/touch/TouchAlarm.c msgid "Only one %q can be set in deep sleep." msgstr "" +#: ports/espressif/common-hal/espulp/ULPAlarm.c +msgid "Only one %q can be set." +msgstr "" + #: ports/espressif/common-hal/i2ctarget/I2CTarget.c #: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c msgid "Only one address is allowed" @@ -1683,6 +1709,10 @@ msgstr "" msgid "Operation timed out" msgstr "Waktu habis" +#: ports/raspberrypi/common-hal/mdns/Server.c +msgid "Out of MDNS service slots" +msgstr "" + #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Out of memory" msgstr "Kehabisan memori" @@ -1813,6 +1843,10 @@ msgstr "" msgid "Program size invalid" msgstr "" +#: ports/espressif/common-hal/espulp/ULP.c +msgid "Program too long" +msgstr "" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." msgstr "Pull tidak digunakan saat arah output." @@ -1853,7 +1887,7 @@ msgid "Random number generation error" msgstr "Kesalahan pembuatan nomor acak" #: shared-bindings/memorymonitor/AllocationSize.c -#: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/pulseio/PulseIn.c shared-module/displayio/Bitmap.c msgid "Read-only" msgstr "Baca-saja" @@ -1861,10 +1895,6 @@ msgstr "Baca-saja" msgid "Read-only filesystem" msgstr "sistem file (filesystem) bersifat Read-only" -#: shared-module/displayio/Bitmap.c -msgid "Read-only object" -msgstr "Objek Read-only" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Received response was invalid" msgstr "" @@ -1959,7 +1989,7 @@ msgstr "" msgid "Sleep Memory not available" msgstr "" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Slice and value different lengths." msgstr "Potongan dan nilai panjangnya berbeda." @@ -1996,6 +2026,10 @@ msgstr "" msgid "Stereo right must be on PWM channel B" msgstr "" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Stopping AP is not supported." +msgstr "" + #: ports/mimxrt10xx/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "Supply at least one UART pin" msgstr "Berikan setidaknya satu pin UART" @@ -2036,6 +2070,10 @@ msgid "" "exit safe mode." msgstr "" +#: py/obj.c +msgid "The above exception was the direct cause of the following exception:" +msgstr "" + #: ports/espressif/boards/m5stack_atom_lite/mpconfigboard.h msgid "The central button was pressed at start up.\n" msgstr "" @@ -2221,11 +2259,12 @@ msgid "Unable to read color palette data" msgstr "Tidak dapat membaca data palet warna" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "Unable to start mDNS query" msgstr "" -#: shared-bindings/coproc/CoprocMemory.c -msgid "Unable to write" +#: shared-bindings/memorymap/AddressRange.c +msgid "Unable to write to address." msgstr "" #: shared-bindings/nvm/ByteArray.c @@ -2296,6 +2335,7 @@ msgid "Unkown error code %d" msgstr "" #: shared-bindings/adafruit_pixelbuf/PixelBuf.c +#: shared-module/_pixelmap/PixelMap.c #, c-format msgid "Unmatched number of items on RHS (expected %d, got %d)." msgstr "Jumlah item pada RHS tidak cocok (diharapkan %d, didapatkan %d)." @@ -2382,6 +2422,18 @@ msgstr "" msgid "Wi-Fi: " msgstr "" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in access point mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in station mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is not enabled" +msgstr "" + #: main.c msgid "Woken up by alarm.\n" msgstr "" @@ -2470,7 +2522,7 @@ msgid "array has too many dimensions" msgstr "" #: py/objarray.c shared-bindings/alarm/SleepMemory.c -#: shared-bindings/coproc/CoprocMemory.c shared-bindings/nvm/ByteArray.c +#: shared-bindings/memorymap/AddressRange.c shared-bindings/nvm/ByteArray.c msgid "array/bytes required on right side" msgstr "diperlukan array/byte di sisi kanan" @@ -2563,10 +2615,6 @@ msgstr "" msgid "buffer too small for requested bytes" msgstr "" -#: shared-bindings/adafruit_pixelbuf/PixelBuf.c -msgid "byteorder is not a string" -msgstr "" - #: py/objarray.c msgid "bytes length not a multiple of item size" msgstr "" @@ -2608,14 +2656,10 @@ msgstr "tidak dapat menetapkan ke ekspresi" msgid "can't cancel self" msgstr "" -#: py/obj.c py/objint.c shared-module/adafruit_pixelbuf/PixelBuf.c +#: py/obj.c py/objint.c py/runtime.c shared-module/adafruit_pixelbuf/PixelBuf.c msgid "can't convert %q to %q" msgstr "" -#: py/runtime.c -msgid "can't convert %q to int" -msgstr "" - #: py/obj.c #, c-format msgid "can't convert %s to complex" @@ -2697,6 +2741,10 @@ msgstr "" msgid "can't set attribute" msgstr "" +#: py/runtime.c +msgid "can't set attribute '%q'" +msgstr "" + #: py/emitnative.c msgid "can't store '%q'" msgstr "" @@ -2799,10 +2847,6 @@ msgstr "" msgid "comparison of int and uint" msgstr "" -#: py/objcomplex.c -msgid "complex division by zero" -msgstr "" - #: py/objfloat.c py/parsenum.c msgid "complex values not supported" msgstr "" @@ -2905,12 +2949,7 @@ msgstr "" msgid "div/mod not implemented for uint" msgstr "" -#: py/objfloat.c py/objint_mpz.c -msgid "divide by zero" -msgstr "" - -#: py/modmath.c py/objint_longlong.c py/runtime.c -#: shared-bindings/math/__init__.c +#: py/runtime.c msgid "division by zero" msgstr "" @@ -3067,10 +3106,6 @@ msgstr "" msgid "format requires a dict" msgstr "" -#: shared-bindings/microcontroller/Processor.c -msgid "frequency is read-only for this board" -msgstr "" - #: py/objdeque.c msgid "full" msgstr "" @@ -3183,8 +3218,12 @@ msgstr "lapisan (padding) tidak benar" msgid "index is out of bounds" msgstr "" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "index must be tuple or int" +msgstr "" + #: extmod/ulab/code/numpy/numerical.c extmod/ulab/code/ulab_tools.c -#: ports/espressif/common-hal/pulseio/PulseIn.c py/obj.c +#: ports/espressif/common-hal/pulseio/PulseIn.c #: shared-bindings/bitmaptools/__init__.c msgid "index out of range" msgstr "index keluar dari jangkauan" @@ -3282,10 +3321,6 @@ msgstr "" msgid "inputs are not iterable" msgstr "" -#: py/parsenum.c -msgid "int() arg 2 must be >= 2 and <= 36" -msgstr "" - #: extmod/ulab/code/numpy/approx.c msgid "interp is defined for 1D iterables of equal length" msgstr "" @@ -3367,10 +3402,6 @@ msgstr "" msgid "invalid syntax for number" msgstr "" -#: py/objexcept.c -msgid "invalid traceback" -msgstr "" - #: py/objtype.c msgid "issubclass() arg 1 must be a class" msgstr "" @@ -3427,19 +3458,17 @@ msgstr "" msgid "local variable referenced before assignment" msgstr "" -#: py/objint.c -msgid "long int not supported in this build" -msgstr "" - #: ports/espressif/common-hal/canio/CAN.c msgid "loopback + silent mode not supported by peripheral" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS already initialized" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS only works with built-in WiFi" msgstr "" @@ -3568,6 +3597,10 @@ msgstr "" msgid "negative shift count" msgstr "" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "nested index must be int" +msgstr "" + #: shared-module/sdcardio/SDCard.c msgid "no SD card" msgstr "" @@ -3748,7 +3781,7 @@ msgid "only sample_rate=16000 is supported" msgstr "" #: py/objarray.c py/objstr.c py/objstrunicode.c py/objtuple.c -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "only slices with step=1 (aka None) are supported" msgstr "" @@ -3964,10 +3997,6 @@ msgstr "" msgid "slice step can't be zero" msgstr "" -#: py/objslice.c -msgid "slice step cannot be zero" -msgstr "" - #: py/nativeglue.c msgid "slice unsupported" msgstr "" @@ -4016,10 +4045,6 @@ msgstr "" msgid "start/end indices" msgstr "" -#: shared-bindings/random/__init__.c -msgid "step must be non-zero" -msgstr "" - #: shared-bindings/random/__init__.c msgid "stop not reachable from start" msgstr "" @@ -4028,10 +4053,6 @@ msgstr "" msgid "stream operation not supported" msgstr "" -#: py/objstrunicode.c -msgid "string indices must be integers, not %q" -msgstr "" - #: py/stream.c msgid "string not supported; use bytes or bytearray" msgstr "" @@ -4064,10 +4085,6 @@ msgstr "sintaksis error pada JSON" msgid "syntax error in uctypes descriptor" msgstr "sintaksis error pada pendeskripsi uctypes" -#: shared-bindings/time/__init__.c -msgid "time.struct_time() takes a 9-sequence" -msgstr "" - #: ports/atmel-samd/common-hal/watchdog/WatchDogTimer.c #: ports/espressif/common-hal/watchdog/WatchDogTimer.c #: ports/nrf/common-hal/watchdog/WatchDogTimer.c @@ -4349,10 +4366,6 @@ msgstr "xTaskCreate gagal" msgid "y value out of bounds" msgstr "Nilai y di luar batas" -#: py/objrange.c -msgid "zero step" -msgstr "nol langkah" - #: extmod/ulab/code/scipy/signal/signal.c msgid "zi must be an ndarray" msgstr "zi harus ndarray" @@ -4365,6 +4378,24 @@ msgstr "zi harus berjenis float" msgid "zi must be of shape (n_section, 2)" msgstr "Zi harus berbentuk (n_section, 2)" +#~ msgid "Read-only object" +#~ msgstr "Objek Read-only" + +#~ msgid "%q length must be >= 1" +#~ msgstr "%q panjang harus >= 1" + +#~ msgid "%q must be a string" +#~ msgstr "%q harus berupa string" + +#~ msgid "At most %d %q may be specified (not %d)" +#~ msgstr "Paling banyak %d %q dapat ditentukan (bukan %d)" + +#~ msgid "Invalid pins" +#~ msgstr "Pin-pin tidak valid" + +#~ msgid "zero step" +#~ msgstr "nol langkah" + #~ msgid "%q indices must be integers, not %s" #~ msgstr "indeks %q harus bilangan bulat, bukan %s" diff --git a/locale/circuitpython.pot b/locale/circuitpython.pot old mode 100755 new mode 100644 index 044900bd30..7546dfa0c6 --- a/locale/circuitpython.pot +++ b/locale/circuitpython.pot @@ -65,6 +65,11 @@ msgstr "" msgid "%02X" msgstr "" +#: shared-module/os/getenv.c +#, c-format +msgid "%S" +msgstr "" + #: shared-bindings/rgbmatrix/RGBMatrix.c #, c-format msgid "" @@ -100,13 +105,14 @@ msgstr "" msgid "%q failure: %d" msgstr "" +#: ports/espressif/common-hal/espulp/ULP.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/microcontroller/Pin.c msgid "%q in use" msgstr "" -#: py/obj.c py/objstr.c py/objstrunicode.c +#: py/objstr.c py/objstrunicode.c msgid "%q index out of range" msgstr "" @@ -118,7 +124,11 @@ msgstr "" msgid "%q is %q" msgstr "" -#: py/argcheck.c +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "%q is read-only for this board" +msgstr "" + +#: py/argcheck.c shared-bindings/usb_hid/Device.c msgid "%q length must be %d" msgstr "" @@ -134,10 +144,6 @@ msgstr "" msgid "%q length must be >= %d" msgstr "" -#: shared-bindings/busio/I2C.c -msgid "%q length must be >= 1" -msgstr "" - #: py/argcheck.c msgid "%q must be %d" msgstr "" @@ -159,23 +165,18 @@ msgid "%q must be >= %d" msgstr "" #: shared-bindings/analogbufio/BufferedIn.c +msgid "%q must be a bytearray or array of type 'H' or 'B'" +msgstr "" + #: shared-bindings/audiocore/RawSample.c msgid "%q must be a bytearray or array of type 'h', 'H', 'b', or 'B'" msgstr "" -#: py/argcheck.c -msgid "%q must be a string" -msgstr "" - -#: py/argcheck.c -msgid "%q must be an int" -msgstr "" - -#: py/argcheck.c +#: py/argcheck.c py/obj.c py/objstrunicode.c msgid "%q must be of type %q" msgstr "" -#: shared-bindings/digitalio/Pull.c +#: py/objexcept.c shared-bindings/digitalio/Pull.c msgid "%q must be of type %q or None" msgstr "" @@ -189,7 +190,6 @@ msgstr "" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c #: ports/cxd56/common-hal/pulseio/PulseIn.c -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/nrf/common-hal/pulseio/PulseIn.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c @@ -201,8 +201,8 @@ msgstr "" msgid "%q pin invalid" msgstr "" -#: shared-bindings/usb_hid/Device.c -msgid "%q with a report ID of 0 must be of length 1" +#: py/objrange.c py/objslice.c shared-bindings/random/__init__.c +msgid "%q step cannot be zero" msgstr "" #: py/bc.c py/objnamedtuple.c @@ -302,7 +302,7 @@ msgstr "" msgid "'%s' object doesn't support item deletion" msgstr "" -#: ports/raspberrypi/common-hal/wifi/Radio.c py/runtime.c +#: py/runtime.c msgid "'%s' object has no attribute '%q'" msgstr "" @@ -402,6 +402,10 @@ msgstr "" msgid "Address must be %d bytes long" msgstr "" +#: ports/espressif/common-hal/memorymap/AddressRange.c +msgid "Address range not allowed" +msgstr "" + #: ports/espressif/common-hal/canio/CAN.c msgid "All CAN peripherals are in use" msgstr "" @@ -482,7 +486,7 @@ msgstr "" msgid "Already have all-matches listener" msgstr "" -#: ports/espressif/common-hal/coproc/__init__.c +#: ports/espressif/common-hal/espulp/ULP.c #: shared-module/memorymonitor/AllocationAlarm.c #: shared-module/memorymonitor/AllocationSize.c msgid "Already running" @@ -493,6 +497,11 @@ msgstr "" msgid "Already scanning for wifi networks" msgstr "" +#: shared-module/os/getenv.c +#, c-format +msgid "An error occurred while retrieving '%s':\n" +msgstr "" + #: ports/stm/common-hal/audiopwmio/PWMAudioOut.c msgid "Another PWMAudioOut is already active" msgstr "" @@ -506,15 +515,11 @@ msgstr "" msgid "Array must contain halfwords (type 'H')" msgstr "" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Array values should be single bytes." msgstr "" -#: shared-bindings/microcontroller/Pin.c -msgid "At most %d %q may be specified (not %d)" -msgstr "" - #: shared-module/memorymonitor/AllocationAlarm.c #, c-format msgid "Attempt to allocate %d blocks" @@ -894,6 +899,10 @@ msgstr "" msgid "Drive mode not used when direction is input." msgstr "" +#: py/obj.c +msgid "During handling of the above exception, another exception occurred:" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "ECB only operates on 16 bytes at a time" msgstr "" @@ -923,10 +932,10 @@ msgstr "" msgid "Error: Failure to bind" msgstr "" -#: py/enum.c shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c -#: shared-bindings/alarm/__init__.c shared-bindings/alarm/coproc/CoprocAlarm.c -#: shared-bindings/busio/SPI.c shared-bindings/coproc/Coproc.c -#: shared-bindings/coproc/__init__.c shared-bindings/microcontroller/Pin.c +#: ports/espressif/bindings/espulp/ULP.c py/enum.c +#: shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c +#: shared-bindings/alarm/__init__.c shared-bindings/busio/SPI.c +#: shared-bindings/microcontroller/Pin.c #: shared-bindings/neopixel_write/__init__.c msgid "Expected a %q" msgstr "" @@ -1011,6 +1020,10 @@ msgstr "" msgid "File exists" msgstr "" +#: shared-module/os/getenv.c +msgid "File not found" +msgstr "" + #: ports/atmel-samd/common-hal/canio/Listener.c #: ports/espressif/common-hal/canio/Listener.c #: ports/stm/common-hal/canio/Listener.c @@ -1025,7 +1038,6 @@ msgstr "" msgid "Firmware is invalid" msgstr "" -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/espressif/common-hal/dualbank/__init__.c msgid "Firmware is too big" msgstr "" @@ -1067,6 +1079,8 @@ msgstr "" #: shared-bindings/displayio/Display.c #: shared-bindings/displayio/EPaperDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c +#: shared-module/displayio/Display.c +#: shared-module/framebufferio/FramebufferDisplay.c msgid "Group already used" msgstr "" @@ -1193,6 +1207,7 @@ msgid "Internal define error" msgstr "" #: ports/espressif/common-hal/paralleldisplay/ParallelBus.c +#: shared-module/os/getenv.c msgid "Internal error" msgstr "" @@ -1239,6 +1254,11 @@ msgstr "" msgid "Invalid bits per value" msgstr "" +#: shared-module/os/getenv.c +#, c-format +msgid "Invalid byte %.*s" +msgstr "" + #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #, c-format msgid "Invalid data_pins[%d]" @@ -1256,10 +1276,6 @@ msgstr "" msgid "Invalid multicast MAC address" msgstr "" -#: shared-bindings/busio/UART.c -msgid "Invalid pins" -msgstr "" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Invalid size" msgstr "" @@ -1273,10 +1289,18 @@ msgstr "" msgid "Invalid state" msgstr "" +#: shared-module/os/getenv.c +msgid "Invalid unicode escape" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "Key must be 16, 24, or 32 bytes long" msgstr "" +#: shared-module/os/getenv.c +msgid "Key not found" +msgstr "" + #: shared-module/is31fl3741/FrameBuffer.c msgid "LED mappings must match display size" msgstr "" @@ -1383,6 +1407,10 @@ msgstr "" msgid "NVS Error" msgstr "" +#: shared-bindings/socketpool/SocketPool.c +msgid "Name or service not known" +msgstr "" + #: py/qstr.c msgid "Name too long" msgstr "" @@ -1497,11 +1525,6 @@ msgstr "" msgid "No long integer support" msgstr "" -#: shared-module/usb_hid/__init__.c -#, c-format -msgid "No more than %d HID devices allowed" -msgstr "" - #: shared-bindings/wifi/Radio.c msgid "No network with that ssid" msgstr "" @@ -1626,11 +1649,14 @@ msgid "" "%d bpp given" msgstr "" -#: ports/espressif/common-hal/alarm/coproc/CoprocAlarm.c #: ports/espressif/common-hal/alarm/touch/TouchAlarm.c msgid "Only one %q can be set in deep sleep." msgstr "" +#: ports/espressif/common-hal/espulp/ULPAlarm.c +msgid "Only one %q can be set." +msgstr "" + #: ports/espressif/common-hal/i2ctarget/I2CTarget.c #: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c msgid "Only one address is allowed" @@ -1663,6 +1689,10 @@ msgstr "" msgid "Operation timed out" msgstr "" +#: ports/raspberrypi/common-hal/mdns/Server.c +msgid "Out of MDNS service slots" +msgstr "" + #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Out of memory" msgstr "" @@ -1786,6 +1816,10 @@ msgstr "" msgid "Program size invalid" msgstr "" +#: ports/espressif/common-hal/espulp/ULP.c +msgid "Program too long" +msgstr "" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." msgstr "" @@ -1826,7 +1860,7 @@ msgid "Random number generation error" msgstr "" #: shared-bindings/memorymonitor/AllocationSize.c -#: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/pulseio/PulseIn.c shared-module/displayio/Bitmap.c msgid "Read-only" msgstr "" @@ -1834,10 +1868,6 @@ msgstr "" msgid "Read-only filesystem" msgstr "" -#: shared-module/displayio/Bitmap.c -msgid "Read-only object" -msgstr "" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Received response was invalid" msgstr "" @@ -1930,7 +1960,7 @@ msgstr "" msgid "Sleep Memory not available" msgstr "" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Slice and value different lengths." msgstr "" @@ -1967,6 +1997,10 @@ msgstr "" msgid "Stereo right must be on PWM channel B" msgstr "" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Stopping AP is not supported." +msgstr "" + #: ports/mimxrt10xx/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "Supply at least one UART pin" msgstr "" @@ -2007,6 +2041,10 @@ msgid "" "exit safe mode." msgstr "" +#: py/obj.c +msgid "The above exception was the direct cause of the following exception:" +msgstr "" + #: ports/espressif/boards/m5stack_atom_lite/mpconfigboard.h msgid "The central button was pressed at start up.\n" msgstr "" @@ -2192,11 +2230,12 @@ msgid "Unable to read color palette data" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "Unable to start mDNS query" msgstr "" -#: shared-bindings/coproc/CoprocMemory.c -msgid "Unable to write" +#: shared-bindings/memorymap/AddressRange.c +msgid "Unable to write to address." msgstr "" #: shared-bindings/nvm/ByteArray.c @@ -2267,6 +2306,7 @@ msgid "Unkown error code %d" msgstr "" #: shared-bindings/adafruit_pixelbuf/PixelBuf.c +#: shared-module/_pixelmap/PixelMap.c #, c-format msgid "Unmatched number of items on RHS (expected %d, got %d)." msgstr "" @@ -2351,6 +2391,18 @@ msgstr "" msgid "Wi-Fi: " msgstr "" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in access point mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in station mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is not enabled" +msgstr "" + #: main.c msgid "Woken up by alarm.\n" msgstr "" @@ -2439,7 +2491,7 @@ msgid "array has too many dimensions" msgstr "" #: py/objarray.c shared-bindings/alarm/SleepMemory.c -#: shared-bindings/coproc/CoprocMemory.c shared-bindings/nvm/ByteArray.c +#: shared-bindings/memorymap/AddressRange.c shared-bindings/nvm/ByteArray.c msgid "array/bytes required on right side" msgstr "" @@ -2532,10 +2584,6 @@ msgstr "" msgid "buffer too small for requested bytes" msgstr "" -#: shared-bindings/adafruit_pixelbuf/PixelBuf.c -msgid "byteorder is not a string" -msgstr "" - #: py/objarray.c msgid "bytes length not a multiple of item size" msgstr "" @@ -2577,14 +2625,10 @@ msgstr "" msgid "can't cancel self" msgstr "" -#: py/obj.c py/objint.c shared-module/adafruit_pixelbuf/PixelBuf.c +#: py/obj.c py/objint.c py/runtime.c shared-module/adafruit_pixelbuf/PixelBuf.c msgid "can't convert %q to %q" msgstr "" -#: py/runtime.c -msgid "can't convert %q to int" -msgstr "" - #: py/obj.c #, c-format msgid "can't convert %s to complex" @@ -2666,6 +2710,10 @@ msgstr "" msgid "can't set attribute" msgstr "" +#: py/runtime.c +msgid "can't set attribute '%q'" +msgstr "" + #: py/emitnative.c msgid "can't store '%q'" msgstr "" @@ -2768,10 +2816,6 @@ msgstr "" msgid "comparison of int and uint" msgstr "" -#: py/objcomplex.c -msgid "complex division by zero" -msgstr "" - #: py/objfloat.c py/parsenum.c msgid "complex values not supported" msgstr "" @@ -2874,12 +2918,7 @@ msgstr "" msgid "div/mod not implemented for uint" msgstr "" -#: py/objfloat.c py/objint_mpz.c -msgid "divide by zero" -msgstr "" - -#: py/modmath.c py/objint_longlong.c py/runtime.c -#: shared-bindings/math/__init__.c +#: py/runtime.c msgid "division by zero" msgstr "" @@ -3036,10 +3075,6 @@ msgstr "" msgid "format requires a dict" msgstr "" -#: shared-bindings/microcontroller/Processor.c -msgid "frequency is read-only for this board" -msgstr "" - #: py/objdeque.c msgid "full" msgstr "" @@ -3152,8 +3187,12 @@ msgstr "" msgid "index is out of bounds" msgstr "" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "index must be tuple or int" +msgstr "" + #: extmod/ulab/code/numpy/numerical.c extmod/ulab/code/ulab_tools.c -#: ports/espressif/common-hal/pulseio/PulseIn.c py/obj.c +#: ports/espressif/common-hal/pulseio/PulseIn.c #: shared-bindings/bitmaptools/__init__.c msgid "index out of range" msgstr "" @@ -3251,10 +3290,6 @@ msgstr "" msgid "inputs are not iterable" msgstr "" -#: py/parsenum.c -msgid "int() arg 2 must be >= 2 and <= 36" -msgstr "" - #: extmod/ulab/code/numpy/approx.c msgid "interp is defined for 1D iterables of equal length" msgstr "" @@ -3336,10 +3371,6 @@ msgstr "" msgid "invalid syntax for number" msgstr "" -#: py/objexcept.c -msgid "invalid traceback" -msgstr "" - #: py/objtype.c msgid "issubclass() arg 1 must be a class" msgstr "" @@ -3396,19 +3427,17 @@ msgstr "" msgid "local variable referenced before assignment" msgstr "" -#: py/objint.c -msgid "long int not supported in this build" -msgstr "" - #: ports/espressif/common-hal/canio/CAN.c msgid "loopback + silent mode not supported by peripheral" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS already initialized" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS only works with built-in WiFi" msgstr "" @@ -3537,6 +3566,10 @@ msgstr "" msgid "negative shift count" msgstr "" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "nested index must be int" +msgstr "" + #: shared-module/sdcardio/SDCard.c msgid "no SD card" msgstr "" @@ -3716,7 +3749,7 @@ msgid "only sample_rate=16000 is supported" msgstr "" #: py/objarray.c py/objstr.c py/objstrunicode.c py/objtuple.c -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "only slices with step=1 (aka None) are supported" msgstr "" @@ -3932,10 +3965,6 @@ msgstr "" msgid "slice step can't be zero" msgstr "" -#: py/objslice.c -msgid "slice step cannot be zero" -msgstr "" - #: py/nativeglue.c msgid "slice unsupported" msgstr "" @@ -3984,10 +4013,6 @@ msgstr "" msgid "start/end indices" msgstr "" -#: shared-bindings/random/__init__.c -msgid "step must be non-zero" -msgstr "" - #: shared-bindings/random/__init__.c msgid "stop not reachable from start" msgstr "" @@ -3996,10 +4021,6 @@ msgstr "" msgid "stream operation not supported" msgstr "" -#: py/objstrunicode.c -msgid "string indices must be integers, not %q" -msgstr "" - #: py/stream.c msgid "string not supported; use bytes or bytearray" msgstr "" @@ -4032,10 +4053,6 @@ msgstr "" msgid "syntax error in uctypes descriptor" msgstr "" -#: shared-bindings/time/__init__.c -msgid "time.struct_time() takes a 9-sequence" -msgstr "" - #: ports/atmel-samd/common-hal/watchdog/WatchDogTimer.c #: ports/espressif/common-hal/watchdog/WatchDogTimer.c #: ports/nrf/common-hal/watchdog/WatchDogTimer.c @@ -4317,10 +4334,6 @@ msgstr "" msgid "y value out of bounds" msgstr "" -#: py/objrange.c -msgid "zero step" -msgstr "" - #: extmod/ulab/code/scipy/signal/signal.c msgid "zi must be an ndarray" msgstr "" diff --git a/locale/cs.po b/locale/cs.po index 3ea4c2dcf3..b73fe1df88 100644 --- a/locale/cs.po +++ b/locale/cs.po @@ -72,6 +72,11 @@ msgstr "%%c vyžaduje int nebo char" msgid "%02X" msgstr "" +#: shared-module/os/getenv.c +#, c-format +msgid "%S" +msgstr "" + #: shared-bindings/rgbmatrix/RGBMatrix.c #, c-format msgid "" @@ -107,13 +112,14 @@ msgstr "%q obsahuje duplicitní piny" msgid "%q failure: %d" msgstr "%q: selhání %d" +#: ports/espressif/common-hal/espulp/ULP.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/microcontroller/Pin.c msgid "%q in use" msgstr "%q se právě používá" -#: py/obj.c py/objstr.c py/objstrunicode.c +#: py/objstr.c py/objstrunicode.c msgid "%q index out of range" msgstr "Index %q je mimo rozsah" @@ -125,7 +131,11 @@ msgstr "Inicializace %q selhala" msgid "%q is %q" msgstr "" -#: py/argcheck.c +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "%q is read-only for this board" +msgstr "" + +#: py/argcheck.c shared-bindings/usb_hid/Device.c msgid "%q length must be %d" msgstr "Délka %q musí být %d" @@ -141,10 +151,6 @@ msgstr "Délka %q musí být <= %d" msgid "%q length must be >= %d" msgstr "Délka %q musí být >= %d" -#: shared-bindings/busio/I2C.c -msgid "%q length must be >= 1" -msgstr "%q délka musí být >= 1" - #: py/argcheck.c msgid "%q must be %d" msgstr "%q musí být %d" @@ -166,23 +172,18 @@ msgid "%q must be >= %d" msgstr "%q musí být >= %d" #: shared-bindings/analogbufio/BufferedIn.c +msgid "%q must be a bytearray or array of type 'H' or 'B'" +msgstr "" + #: shared-bindings/audiocore/RawSample.c msgid "%q must be a bytearray or array of type 'h', 'H', 'b', or 'B'" msgstr "" -#: py/argcheck.c -msgid "%q must be a string" -msgstr "%q musí být string" - -#: py/argcheck.c -msgid "%q must be an int" -msgstr "%q musí být int" - -#: py/argcheck.c +#: py/argcheck.c py/obj.c py/objstrunicode.c msgid "%q must be of type %q" msgstr "%q musí být typu %q" -#: shared-bindings/digitalio/Pull.c +#: py/objexcept.c shared-bindings/digitalio/Pull.c msgid "%q must be of type %q or None" msgstr "%q musí být typu %q nebo None" @@ -196,7 +197,6 @@ msgstr "%q je mimo hranice" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c #: ports/cxd56/common-hal/pulseio/PulseIn.c -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/nrf/common-hal/pulseio/PulseIn.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c @@ -208,9 +208,9 @@ msgstr "%q je mimo rozsah" msgid "%q pin invalid" msgstr "pin %q není platný" -#: shared-bindings/usb_hid/Device.c -msgid "%q with a report ID of 0 must be of length 1" -msgstr "%q s ID 0 musím být délky 1" +#: py/objrange.c py/objslice.c shared-bindings/random/__init__.c +msgid "%q step cannot be zero" +msgstr "" #: py/bc.c py/objnamedtuple.c msgid "%q() takes %d positional arguments but %d were given" @@ -309,7 +309,7 @@ msgstr "'%s' objekt nepodporuje přiřazení položky" msgid "'%s' object doesn't support item deletion" msgstr "'%s' objekt nepodporuje smazání položky" -#: ports/raspberrypi/common-hal/wifi/Radio.c py/runtime.c +#: py/runtime.c msgid "'%s' object has no attribute '%q'" msgstr "'%s' objekt nemá žádný atribut '%q'" @@ -409,6 +409,10 @@ msgstr "WiFi používá ADC2" msgid "Address must be %d bytes long" msgstr "Adresa musí být %d bajtů dlouhá" +#: ports/espressif/common-hal/memorymap/AddressRange.c +msgid "Address range not allowed" +msgstr "" + #: ports/espressif/common-hal/canio/CAN.c msgid "All CAN peripherals are in use" msgstr "Všechny CAN periferie jsou používány" @@ -489,7 +493,7 @@ msgstr "Již propagujeme." msgid "Already have all-matches listener" msgstr "" -#: ports/espressif/common-hal/coproc/__init__.c +#: ports/espressif/common-hal/espulp/ULP.c #: shared-module/memorymonitor/AllocationAlarm.c #: shared-module/memorymonitor/AllocationSize.c msgid "Already running" @@ -500,6 +504,11 @@ msgstr "Již běží" msgid "Already scanning for wifi networks" msgstr "Již skenuje wifi sítě" +#: shared-module/os/getenv.c +#, c-format +msgid "An error occurred while retrieving '%s':\n" +msgstr "" + #: ports/stm/common-hal/audiopwmio/PWMAudioOut.c msgid "Another PWMAudioOut is already active" msgstr "Jiný PWMAudioOut je již aktivní" @@ -513,15 +522,11 @@ msgstr "Další odesílání je již aktivní" msgid "Array must contain halfwords (type 'H')" msgstr "Pole musí obsahovat poloviční slova (typ „H“)" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Array values should be single bytes." msgstr "Hodnoty pole by měly být jednoduché bajty." -#: shared-bindings/microcontroller/Pin.c -msgid "At most %d %q may be specified (not %d)" -msgstr "Lze zadat maximálně %d %q (nikoli %d)" - #: shared-module/memorymonitor/AllocationAlarm.c #, c-format msgid "Attempt to allocate %d blocks" @@ -905,6 +910,10 @@ msgstr "" msgid "Drive mode not used when direction is input." msgstr "" +#: py/obj.c +msgid "During handling of the above exception, another exception occurred:" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "ECB only operates on 16 bytes at a time" msgstr "ECB operuje najednou pouze 16 bajtů" @@ -934,10 +943,10 @@ msgstr "Chyba v regulárním výrazu" msgid "Error: Failure to bind" msgstr "" -#: py/enum.c shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c -#: shared-bindings/alarm/__init__.c shared-bindings/alarm/coproc/CoprocAlarm.c -#: shared-bindings/busio/SPI.c shared-bindings/coproc/Coproc.c -#: shared-bindings/coproc/__init__.c shared-bindings/microcontroller/Pin.c +#: ports/espressif/bindings/espulp/ULP.c py/enum.c +#: shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c +#: shared-bindings/alarm/__init__.c shared-bindings/busio/SPI.c +#: shared-bindings/microcontroller/Pin.c #: shared-bindings/neopixel_write/__init__.c msgid "Expected a %q" msgstr "Očekává se %q" @@ -1022,6 +1031,10 @@ msgstr "Fatální chyba." msgid "File exists" msgstr "soubor existuje" +#: shared-module/os/getenv.c +msgid "File not found" +msgstr "" + #: ports/atmel-samd/common-hal/canio/Listener.c #: ports/espressif/common-hal/canio/Listener.c #: ports/stm/common-hal/canio/Listener.c @@ -1036,7 +1049,6 @@ msgstr "" msgid "Firmware is invalid" msgstr "" -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/espressif/common-hal/dualbank/__init__.c msgid "Firmware is too big" msgstr "" @@ -1080,6 +1092,8 @@ msgstr "Základní chyba" #: shared-bindings/displayio/Display.c #: shared-bindings/displayio/EPaperDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c +#: shared-module/displayio/Display.c +#: shared-module/framebufferio/FramebufferDisplay.c msgid "Group already used" msgstr "Skupina již byla použita" @@ -1208,6 +1222,7 @@ msgid "Internal define error" msgstr "" #: ports/espressif/common-hal/paralleldisplay/ParallelBus.c +#: shared-module/os/getenv.c msgid "Internal error" msgstr "Interní chyba" @@ -1254,6 +1269,11 @@ msgstr "Neplatný argument" msgid "Invalid bits per value" msgstr "" +#: shared-module/os/getenv.c +#, c-format +msgid "Invalid byte %.*s" +msgstr "" + #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #, c-format msgid "Invalid data_pins[%d]" @@ -1271,10 +1291,6 @@ msgstr "Neplatný přístup k paměti." msgid "Invalid multicast MAC address" msgstr "Chybná multicastová MAC adresa" -#: shared-bindings/busio/UART.c -msgid "Invalid pins" -msgstr "Neplatné piny" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Invalid size" msgstr "Chybná velikost" @@ -1288,10 +1304,18 @@ msgstr "Chybný soket pro TLS" msgid "Invalid state" msgstr "Chybný stav" +#: shared-module/os/getenv.c +msgid "Invalid unicode escape" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "Key must be 16, 24, or 32 bytes long" msgstr "Klíč musí být dlouhý 16, 24 nebo 32 bajtů" +#: shared-module/os/getenv.c +msgid "Key not found" +msgstr "" + #: shared-module/is31fl3741/FrameBuffer.c msgid "LED mappings must match display size" msgstr "Mapování LED musí korespondovat s velikostí displeje" @@ -1398,6 +1422,10 @@ msgstr "" msgid "NVS Error" msgstr "Chyba NVS" +#: shared-bindings/socketpool/SocketPool.c +msgid "Name or service not known" +msgstr "" + #: py/qstr.c msgid "Name too long" msgstr "Jméno je příliš dlouhé" @@ -1512,11 +1540,6 @@ msgstr "Nebyl zadán klíč" msgid "No long integer support" msgstr "" -#: shared-module/usb_hid/__init__.c -#, c-format -msgid "No more than %d HID devices allowed" -msgstr "Ne více než %d HID zařízení je povoleno" - #: shared-bindings/wifi/Radio.c msgid "No network with that ssid" msgstr "Žádná síť s takovým SSID" @@ -1642,11 +1665,14 @@ msgid "" "%d bpp given" msgstr "" -#: ports/espressif/common-hal/alarm/coproc/CoprocAlarm.c #: ports/espressif/common-hal/alarm/touch/TouchAlarm.c msgid "Only one %q can be set in deep sleep." msgstr "" +#: ports/espressif/common-hal/espulp/ULPAlarm.c +msgid "Only one %q can be set." +msgstr "" + #: ports/espressif/common-hal/i2ctarget/I2CTarget.c #: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c msgid "Only one address is allowed" @@ -1679,6 +1705,10 @@ msgstr "" msgid "Operation timed out" msgstr "" +#: ports/raspberrypi/common-hal/mdns/Server.c +msgid "Out of MDNS service slots" +msgstr "" + #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Out of memory" msgstr "" @@ -1804,6 +1834,10 @@ msgstr "" msgid "Program size invalid" msgstr "" +#: ports/espressif/common-hal/espulp/ULP.c +msgid "Program too long" +msgstr "" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." msgstr "" @@ -1844,7 +1878,7 @@ msgid "Random number generation error" msgstr "" #: shared-bindings/memorymonitor/AllocationSize.c -#: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/pulseio/PulseIn.c shared-module/displayio/Bitmap.c msgid "Read-only" msgstr "" @@ -1852,10 +1886,6 @@ msgstr "" msgid "Read-only filesystem" msgstr "" -#: shared-module/displayio/Bitmap.c -msgid "Read-only object" -msgstr "" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Received response was invalid" msgstr "" @@ -1948,7 +1978,7 @@ msgstr "" msgid "Sleep Memory not available" msgstr "" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Slice and value different lengths." msgstr "" @@ -1985,6 +2015,10 @@ msgstr "" msgid "Stereo right must be on PWM channel B" msgstr "" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Stopping AP is not supported." +msgstr "" + #: ports/mimxrt10xx/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "Supply at least one UART pin" msgstr "" @@ -2025,6 +2059,10 @@ msgid "" "exit safe mode." msgstr "" +#: py/obj.c +msgid "The above exception was the direct cause of the following exception:" +msgstr "" + #: ports/espressif/boards/m5stack_atom_lite/mpconfigboard.h msgid "The central button was pressed at start up.\n" msgstr "" @@ -2210,11 +2248,12 @@ msgid "Unable to read color palette data" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "Unable to start mDNS query" msgstr "" -#: shared-bindings/coproc/CoprocMemory.c -msgid "Unable to write" +#: shared-bindings/memorymap/AddressRange.c +msgid "Unable to write to address." msgstr "" #: shared-bindings/nvm/ByteArray.c @@ -2285,6 +2324,7 @@ msgid "Unkown error code %d" msgstr "" #: shared-bindings/adafruit_pixelbuf/PixelBuf.c +#: shared-module/_pixelmap/PixelMap.c #, c-format msgid "Unmatched number of items on RHS (expected %d, got %d)." msgstr "" @@ -2369,6 +2409,18 @@ msgstr "" msgid "Wi-Fi: " msgstr "" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in access point mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in station mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is not enabled" +msgstr "" + #: main.c msgid "Woken up by alarm.\n" msgstr "" @@ -2457,7 +2509,7 @@ msgid "array has too many dimensions" msgstr "" #: py/objarray.c shared-bindings/alarm/SleepMemory.c -#: shared-bindings/coproc/CoprocMemory.c shared-bindings/nvm/ByteArray.c +#: shared-bindings/memorymap/AddressRange.c shared-bindings/nvm/ByteArray.c msgid "array/bytes required on right side" msgstr "" @@ -2550,10 +2602,6 @@ msgstr "" msgid "buffer too small for requested bytes" msgstr "" -#: shared-bindings/adafruit_pixelbuf/PixelBuf.c -msgid "byteorder is not a string" -msgstr "" - #: py/objarray.c msgid "bytes length not a multiple of item size" msgstr "" @@ -2595,14 +2643,10 @@ msgstr "" msgid "can't cancel self" msgstr "" -#: py/obj.c py/objint.c shared-module/adafruit_pixelbuf/PixelBuf.c +#: py/obj.c py/objint.c py/runtime.c shared-module/adafruit_pixelbuf/PixelBuf.c msgid "can't convert %q to %q" msgstr "" -#: py/runtime.c -msgid "can't convert %q to int" -msgstr "" - #: py/obj.c #, c-format msgid "can't convert %s to complex" @@ -2684,6 +2728,10 @@ msgstr "" msgid "can't set attribute" msgstr "" +#: py/runtime.c +msgid "can't set attribute '%q'" +msgstr "" + #: py/emitnative.c msgid "can't store '%q'" msgstr "" @@ -2786,10 +2834,6 @@ msgstr "" msgid "comparison of int and uint" msgstr "" -#: py/objcomplex.c -msgid "complex division by zero" -msgstr "" - #: py/objfloat.c py/parsenum.c msgid "complex values not supported" msgstr "" @@ -2892,12 +2936,7 @@ msgstr "" msgid "div/mod not implemented for uint" msgstr "" -#: py/objfloat.c py/objint_mpz.c -msgid "divide by zero" -msgstr "" - -#: py/modmath.c py/objint_longlong.c py/runtime.c -#: shared-bindings/math/__init__.c +#: py/runtime.c msgid "division by zero" msgstr "" @@ -3054,10 +3093,6 @@ msgstr "" msgid "format requires a dict" msgstr "" -#: shared-bindings/microcontroller/Processor.c -msgid "frequency is read-only for this board" -msgstr "" - #: py/objdeque.c msgid "full" msgstr "" @@ -3170,8 +3205,12 @@ msgstr "" msgid "index is out of bounds" msgstr "" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "index must be tuple or int" +msgstr "" + #: extmod/ulab/code/numpy/numerical.c extmod/ulab/code/ulab_tools.c -#: ports/espressif/common-hal/pulseio/PulseIn.c py/obj.c +#: ports/espressif/common-hal/pulseio/PulseIn.c #: shared-bindings/bitmaptools/__init__.c msgid "index out of range" msgstr "" @@ -3269,10 +3308,6 @@ msgstr "" msgid "inputs are not iterable" msgstr "" -#: py/parsenum.c -msgid "int() arg 2 must be >= 2 and <= 36" -msgstr "" - #: extmod/ulab/code/numpy/approx.c msgid "interp is defined for 1D iterables of equal length" msgstr "" @@ -3354,10 +3389,6 @@ msgstr "" msgid "invalid syntax for number" msgstr "" -#: py/objexcept.c -msgid "invalid traceback" -msgstr "" - #: py/objtype.c msgid "issubclass() arg 1 must be a class" msgstr "" @@ -3414,19 +3445,17 @@ msgstr "" msgid "local variable referenced before assignment" msgstr "" -#: py/objint.c -msgid "long int not supported in this build" -msgstr "" - #: ports/espressif/common-hal/canio/CAN.c msgid "loopback + silent mode not supported by peripheral" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS already initialized" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS only works with built-in WiFi" msgstr "" @@ -3555,6 +3584,10 @@ msgstr "" msgid "negative shift count" msgstr "" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "nested index must be int" +msgstr "" + #: shared-module/sdcardio/SDCard.c msgid "no SD card" msgstr "" @@ -3734,7 +3767,7 @@ msgid "only sample_rate=16000 is supported" msgstr "" #: py/objarray.c py/objstr.c py/objstrunicode.c py/objtuple.c -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "only slices with step=1 (aka None) are supported" msgstr "" @@ -3950,10 +3983,6 @@ msgstr "" msgid "slice step can't be zero" msgstr "" -#: py/objslice.c -msgid "slice step cannot be zero" -msgstr "" - #: py/nativeglue.c msgid "slice unsupported" msgstr "" @@ -4002,10 +4031,6 @@ msgstr "" msgid "start/end indices" msgstr "" -#: shared-bindings/random/__init__.c -msgid "step must be non-zero" -msgstr "" - #: shared-bindings/random/__init__.c msgid "stop not reachable from start" msgstr "" @@ -4014,10 +4039,6 @@ msgstr "" msgid "stream operation not supported" msgstr "" -#: py/objstrunicode.c -msgid "string indices must be integers, not %q" -msgstr "" - #: py/stream.c msgid "string not supported; use bytes or bytearray" msgstr "" @@ -4050,10 +4071,6 @@ msgstr "" msgid "syntax error in uctypes descriptor" msgstr "" -#: shared-bindings/time/__init__.c -msgid "time.struct_time() takes a 9-sequence" -msgstr "" - #: ports/atmel-samd/common-hal/watchdog/WatchDogTimer.c #: ports/espressif/common-hal/watchdog/WatchDogTimer.c #: ports/nrf/common-hal/watchdog/WatchDogTimer.c @@ -4335,10 +4352,6 @@ msgstr "" msgid "y value out of bounds" msgstr "" -#: py/objrange.c -msgid "zero step" -msgstr "" - #: extmod/ulab/code/scipy/signal/signal.c msgid "zi must be an ndarray" msgstr "" @@ -4351,6 +4364,28 @@ msgstr "" msgid "zi must be of shape (n_section, 2)" msgstr "" +#~ msgid "%q length must be >= 1" +#~ msgstr "%q délka musí být >= 1" + +#~ msgid "%q must be a string" +#~ msgstr "%q musí být string" + +#~ msgid "%q must be an int" +#~ msgstr "%q musí být int" + +#~ msgid "%q with a report ID of 0 must be of length 1" +#~ msgstr "%q s ID 0 musím být délky 1" + +#~ msgid "At most %d %q may be specified (not %d)" +#~ msgstr "Lze zadat maximálně %d %q (nikoli %d)" + +#~ msgid "Invalid pins" +#~ msgstr "Neplatné piny" + +#, c-format +#~ msgid "No more than %d HID devices allowed" +#~ msgstr "Ne více než %d HID zařízení je povoleno" + #~ msgid "%q indices must be integers, not %s" #~ msgstr "Indexy %q musí být celá čísla, nikoli %s" diff --git a/locale/de_DE.po b/locale/de_DE.po index d9c21c5742..69d2e6ee36 100644 --- a/locale/de_DE.po +++ b/locale/de_DE.po @@ -71,6 +71,11 @@ msgstr "%%c erwartet Int oder Char" msgid "%02X" msgstr "%02X" +#: shared-module/os/getenv.c +#, c-format +msgid "%S" +msgstr "" + #: shared-bindings/rgbmatrix/RGBMatrix.c #, c-format msgid "" @@ -108,13 +113,14 @@ msgstr "%q enthält doppelte Pins" msgid "%q failure: %d" msgstr "%q Fehler: %d" +#: ports/espressif/common-hal/espulp/ULP.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/microcontroller/Pin.c msgid "%q in use" msgstr "%q in Benutzung" -#: py/obj.c py/objstr.c py/objstrunicode.c +#: py/objstr.c py/objstrunicode.c msgid "%q index out of range" msgstr "Der Index %q befindet sich außerhalb des Bereiches" @@ -126,7 +132,11 @@ msgstr "%q Initialisierung ist gescheitert" msgid "%q is %q" msgstr "%q ist %q" -#: py/argcheck.c +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "%q is read-only for this board" +msgstr "" + +#: py/argcheck.c shared-bindings/usb_hid/Device.c msgid "%q length must be %d" msgstr "%q länge muss %d betragen" @@ -142,10 +152,6 @@ msgstr "%q länge muss kleiner oder gleich %d sein" msgid "%q length must be >= %d" msgstr "%q länge muss größer oder gleich %d sein" -#: shared-bindings/busio/I2C.c -msgid "%q length must be >= 1" -msgstr "%q Länge muss >= 1 sein" - #: py/argcheck.c msgid "%q must be %d" msgstr "%q muss %d entsprechen" @@ -167,24 +173,19 @@ msgid "%q must be >= %d" msgstr "%q muss >= %d sein" #: shared-bindings/analogbufio/BufferedIn.c +msgid "%q must be a bytearray or array of type 'H' or 'B'" +msgstr "" + #: shared-bindings/audiocore/RawSample.c msgid "%q must be a bytearray or array of type 'h', 'H', 'b', or 'B'" msgstr "" "%q muss ein Byte-Array oder ein array vom Typ 'h', 'H', 'b', oder 'B' sein" -#: py/argcheck.c -msgid "%q must be a string" -msgstr "%q muss ein String sein" - -#: py/argcheck.c -msgid "%q must be an int" -msgstr "%q muss vom Typ Integer sein" - -#: py/argcheck.c +#: py/argcheck.c py/obj.c py/objstrunicode.c msgid "%q must be of type %q" msgstr "%q muss vom Type %q sein" -#: shared-bindings/digitalio/Pull.c +#: py/objexcept.c shared-bindings/digitalio/Pull.c msgid "%q must be of type %q or None" msgstr "%q muss vom Type %q oder None sein" @@ -198,7 +199,6 @@ msgstr "%q außerhalb der Grenzen" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c #: ports/cxd56/common-hal/pulseio/PulseIn.c -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/nrf/common-hal/pulseio/PulseIn.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c @@ -210,9 +210,9 @@ msgstr "%q außerhalb des Bereichs" msgid "%q pin invalid" msgstr "%q Pin ungültig" -#: shared-bindings/usb_hid/Device.c -msgid "%q with a report ID of 0 must be of length 1" -msgstr "%q mit Berichts-ID von 0 muss von Länge 1 sein" +#: py/objrange.c py/objslice.c shared-bindings/random/__init__.c +msgid "%q step cannot be zero" +msgstr "" #: py/bc.c py/objnamedtuple.c msgid "%q() takes %d positional arguments but %d were given" @@ -312,7 +312,7 @@ msgstr "'%s' Objekt unterstützt keine Element-Zuordnung" msgid "'%s' object doesn't support item deletion" msgstr "'%s' Objekt unterstützt keine Löschung von Elementen" -#: ports/raspberrypi/common-hal/wifi/Radio.c py/runtime.c +#: py/runtime.c msgid "'%s' object has no attribute '%q'" msgstr "'%s' Objekt hat kein Attribut '%q'" @@ -412,6 +412,10 @@ msgstr "ADC2 wird vom WiFi benutzt" msgid "Address must be %d bytes long" msgstr "Die Adresse muss %d Bytes lang sein" +#: ports/espressif/common-hal/memorymap/AddressRange.c +msgid "Address range not allowed" +msgstr "" + #: ports/espressif/common-hal/canio/CAN.c msgid "All CAN peripherals are in use" msgstr "Alle CAN-Schnittstellen sind in Benutzung" @@ -492,7 +496,7 @@ msgstr "Bereits am Anbieten (advertising)." msgid "Already have all-matches listener" msgstr "All-Matchers-Listener bereits vorhanden" -#: ports/espressif/common-hal/coproc/__init__.c +#: ports/espressif/common-hal/espulp/ULP.c #: shared-module/memorymonitor/AllocationAlarm.c #: shared-module/memorymonitor/AllocationSize.c msgid "Already running" @@ -503,6 +507,11 @@ msgstr "Läuft bereits" msgid "Already scanning for wifi networks" msgstr "Sucht bereits nach Wifi-Netzwerken" +#: shared-module/os/getenv.c +#, c-format +msgid "An error occurred while retrieving '%s':\n" +msgstr "" + #: ports/stm/common-hal/audiopwmio/PWMAudioOut.c msgid "Another PWMAudioOut is already active" msgstr "Ein anderer PWMAudioOut ist bereits aktiv" @@ -516,15 +525,11 @@ msgstr "Ein anderer Sendevorgang ist schon aktiv" msgid "Array must contain halfwords (type 'H')" msgstr "Array muss Halbwörter enthalten (type 'H')" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Array values should be single bytes." msgstr "Array-Werte sollten aus Einzelbytes bestehen." -#: shared-bindings/microcontroller/Pin.c -msgid "At most %d %q may be specified (not %d)" -msgstr "Es darf höchstens %d %q spezifiziert werden (nicht %d)" - #: shared-module/memorymonitor/AllocationAlarm.c #, c-format msgid "Attempt to allocate %d blocks" @@ -913,6 +918,10 @@ msgstr "Fertig" msgid "Drive mode not used when direction is input." msgstr "Drive mode wird nicht verwendet, wenn die Richtung input ist." +#: py/obj.c +msgid "During handling of the above exception, another exception occurred:" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "ECB only operates on 16 bytes at a time" msgstr "Die EZB arbeitet jeweils nur mit 16 Bytes" @@ -942,10 +951,10 @@ msgstr "Fehler in regex" msgid "Error: Failure to bind" msgstr "Error: Bind Fehler" -#: py/enum.c shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c -#: shared-bindings/alarm/__init__.c shared-bindings/alarm/coproc/CoprocAlarm.c -#: shared-bindings/busio/SPI.c shared-bindings/coproc/Coproc.c -#: shared-bindings/coproc/__init__.c shared-bindings/microcontroller/Pin.c +#: ports/espressif/bindings/espulp/ULP.c py/enum.c +#: shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c +#: shared-bindings/alarm/__init__.c shared-bindings/busio/SPI.c +#: shared-bindings/microcontroller/Pin.c #: shared-bindings/neopixel_write/__init__.c msgid "Expected a %q" msgstr "Erwartet ein(e) %q" @@ -1031,6 +1040,10 @@ msgstr "Fataler Fehler." msgid "File exists" msgstr "Datei existiert" +#: shared-module/os/getenv.c +msgid "File not found" +msgstr "" + #: ports/atmel-samd/common-hal/canio/Listener.c #: ports/espressif/common-hal/canio/Listener.c #: ports/stm/common-hal/canio/Listener.c @@ -1045,7 +1058,6 @@ msgstr "Die Firmware ist doppelt vorhanden" msgid "Firmware is invalid" msgstr "Die Firmware ist ungültig" -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/espressif/common-hal/dualbank/__init__.c msgid "Firmware is too big" msgstr "Die Firmware ist zu groß" @@ -1091,6 +1103,8 @@ msgstr "Generischer Fehler" #: shared-bindings/displayio/Display.c #: shared-bindings/displayio/EPaperDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c +#: shared-module/displayio/Display.c +#: shared-module/framebufferio/FramebufferDisplay.c msgid "Group already used" msgstr "Gruppe schon benutzt" @@ -1223,6 +1237,7 @@ msgid "Internal define error" msgstr "Interner Definitionsfehler" #: ports/espressif/common-hal/paralleldisplay/ParallelBus.c +#: shared-module/os/getenv.c msgid "Internal error" msgstr "Interner Fehler" @@ -1269,6 +1284,11 @@ msgstr "Ungültiges Argument" msgid "Invalid bits per value" msgstr "Ungültige Bits pro Wert" +#: shared-module/os/getenv.c +#, c-format +msgid "Invalid byte %.*s" +msgstr "" + #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #, c-format msgid "Invalid data_pins[%d]" @@ -1286,10 +1306,6 @@ msgstr "Ungültiger Speicherzugriff." msgid "Invalid multicast MAC address" msgstr "Ungültige Multicast-MAC-Adresse" -#: shared-bindings/busio/UART.c -msgid "Invalid pins" -msgstr "Ungültige Pins" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Invalid size" msgstr "Ungültige Größe" @@ -1303,10 +1319,18 @@ msgstr "Ungültiges Socket für TLS" msgid "Invalid state" msgstr "Ungültiger Zustand" +#: shared-module/os/getenv.c +msgid "Invalid unicode escape" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "Key must be 16, 24, or 32 bytes long" msgstr "Der Schlüssel muss 16, 24 oder 32 Byte lang sein" +#: shared-module/os/getenv.c +msgid "Key not found" +msgstr "" + #: shared-module/is31fl3741/FrameBuffer.c msgid "LED mappings must match display size" msgstr "LED-Zuordnungen müssen der Display-Größe entsprechen" @@ -1414,6 +1438,10 @@ msgstr "NLR-Sprung fehlgeschlagen. Mögliche Speicher-Beschädigung." msgid "NVS Error" msgstr "NVS-Fehler" +#: shared-bindings/socketpool/SocketPool.c +msgid "Name or service not known" +msgstr "" + #: py/qstr.c msgid "Name too long" msgstr "Name zu lang" @@ -1528,11 +1556,6 @@ msgstr "Es wurde kein Schlüssel angegeben" msgid "No long integer support" msgstr "Keine langen Integer (long) unterstützt" -#: shared-module/usb_hid/__init__.c -#, c-format -msgid "No more than %d HID devices allowed" -msgstr "Keine weiteren %d HID-Geräte zulässig" - #: shared-bindings/wifi/Radio.c msgid "No network with that ssid" msgstr "Kein Netzwerk mit dieser SSID" @@ -1663,11 +1686,14 @@ msgstr "" "Nur monochrome, indizierte 4bpp oder 8bpp, und 16bpp oder größere BMPs " "unterstützt: %d bpp wurden gegeben" -#: ports/espressif/common-hal/alarm/coproc/CoprocAlarm.c #: ports/espressif/common-hal/alarm/touch/TouchAlarm.c msgid "Only one %q can be set in deep sleep." msgstr "Nur ein %q kann im Deep-Sleep gesetzt werden." +#: ports/espressif/common-hal/espulp/ULPAlarm.c +msgid "Only one %q can be set." +msgstr "" + #: ports/espressif/common-hal/i2ctarget/I2CTarget.c #: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c msgid "Only one address is allowed" @@ -1700,6 +1726,10 @@ msgstr "Vorgang oder Funktion wird nicht unterstützt" msgid "Operation timed out" msgstr "Zeit für Vorgang abgelaufen" +#: ports/raspberrypi/common-hal/mdns/Server.c +msgid "Out of MDNS service slots" +msgstr "" + #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Out of memory" msgstr "Kein Speicher mehr verfügbar" @@ -1829,6 +1859,10 @@ msgstr "Programm macht OUT ohne Laden von OSR" msgid "Program size invalid" msgstr "Programm-Größe ist ungültig" +#: ports/espressif/common-hal/espulp/ULP.c +msgid "Program too long" +msgstr "" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." msgstr "Pull wird nicht verwendet, wenn die Richtung output ist." @@ -1869,7 +1903,7 @@ msgid "Random number generation error" msgstr "Fehler bei der Erzeugung von Zufallszahlen" #: shared-bindings/memorymonitor/AllocationSize.c -#: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/pulseio/PulseIn.c shared-module/displayio/Bitmap.c msgid "Read-only" msgstr "Nur lesen möglich, da Schreibgeschützt" @@ -1877,10 +1911,6 @@ msgstr "Nur lesen möglich, da Schreibgeschützt" msgid "Read-only filesystem" msgstr "Schreibgeschützte Dateisystem" -#: shared-module/displayio/Bitmap.c -msgid "Read-only object" -msgstr "Schreibgeschützte Objekt" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Received response was invalid" msgstr "Erhaltene Antwort ist ungültig" @@ -1973,7 +2003,7 @@ msgstr "Größe nicht unterstützt" msgid "Sleep Memory not available" msgstr "Sleep-Speicher nicht verfügbar" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Slice and value different lengths." msgstr "Slice und Wert (value) haben unterschiedliche Längen." @@ -2010,6 +2040,10 @@ msgstr "Stereo links muss sich auf PWM-Kanal A befinden" msgid "Stereo right must be on PWM channel B" msgstr "Stereo rechts muss sich auf PWM-Kanal B befinden" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Stopping AP is not supported." +msgstr "" + #: ports/mimxrt10xx/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "Supply at least one UART pin" msgstr "Gib mindestens einen UART-Pin an" @@ -2054,6 +2088,10 @@ msgstr "" "Das Modul `microcontroller` wurde zum Booten in den abgesicherten Modus " "verwendet. Drücke Reset, um den abgesicherten Modus zu verlassen." +#: py/obj.c +msgid "The above exception was the direct cause of the following exception:" +msgstr "" + #: ports/espressif/boards/m5stack_atom_lite/mpconfigboard.h msgid "The central button was pressed at start up.\n" msgstr "Beim Starten wurde die zentrale Taste gedrückt.\n" @@ -2249,12 +2287,13 @@ msgid "Unable to read color palette data" msgstr "Konnte Farbpalettendaten nicht lesen" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "Unable to start mDNS query" msgstr "mDNS-Abfrage kann nicht gestartet werden" -#: shared-bindings/coproc/CoprocMemory.c -msgid "Unable to write" -msgstr "Schreiben nicht möglich" +#: shared-bindings/memorymap/AddressRange.c +msgid "Unable to write to address." +msgstr "" #: shared-bindings/nvm/ByteArray.c msgid "Unable to write to nvm." @@ -2324,6 +2363,7 @@ msgid "Unkown error code %d" msgstr "Unbekannter Fehlercode %d" #: shared-bindings/adafruit_pixelbuf/PixelBuf.c +#: shared-module/_pixelmap/PixelMap.c #, c-format msgid "Unmatched number of items on RHS (expected %d, got %d)." msgstr "" @@ -2422,6 +2462,18 @@ msgstr "" msgid "Wi-Fi: " msgstr "Wi-Fi: " +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in access point mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in station mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is not enabled" +msgstr "" + #: main.c msgid "Woken up by alarm.\n" msgstr "Aufgeweckt durch Alarm.\n" @@ -2512,7 +2564,7 @@ msgid "array has too many dimensions" msgstr "Das Array hat zu viele Dimensionen" #: py/objarray.c shared-bindings/alarm/SleepMemory.c -#: shared-bindings/coproc/CoprocMemory.c shared-bindings/nvm/ByteArray.c +#: shared-bindings/memorymap/AddressRange.c shared-bindings/nvm/ByteArray.c msgid "array/bytes required on right side" msgstr "Array/Bytes auf der rechten Seite erforderlich" @@ -2605,10 +2657,6 @@ msgstr "Der Puffer ist zu klein" msgid "buffer too small for requested bytes" msgstr "Der Puffer ist zu klein für die angefragten Bytes" -#: shared-bindings/adafruit_pixelbuf/PixelBuf.c -msgid "byteorder is not a string" -msgstr "Byteorder ist kein String" - #: py/objarray.c msgid "bytes length not a multiple of item size" msgstr "Byte-Länge ist kein vielfaches der Item-Größe" @@ -2652,14 +2700,10 @@ msgstr "kann keinem Ausdruck zuweisen" msgid "can't cancel self" msgstr "kann self nicht abbrechen" -#: py/obj.c py/objint.c shared-module/adafruit_pixelbuf/PixelBuf.c +#: py/obj.c py/objint.c py/runtime.c shared-module/adafruit_pixelbuf/PixelBuf.c msgid "can't convert %q to %q" msgstr "kann %q nicht zu %q konvertieren" -#: py/runtime.c -msgid "can't convert %q to int" -msgstr "kann %q nicht nach int konvertieren" - #: py/obj.c #, c-format msgid "can't convert %s to complex" @@ -2743,6 +2787,10 @@ msgstr "Kann Blockgröße von 512 nicht setzen" msgid "can't set attribute" msgstr "kann Attribut nicht setzen" +#: py/runtime.c +msgid "can't set attribute '%q'" +msgstr "" + #: py/emitnative.c msgid "can't store '%q'" msgstr "Speichern von '%q' nicht möglich" @@ -2851,10 +2899,6 @@ msgstr "Farbe muss zwischen 0x000000 und 0xffffff liegen" msgid "comparison of int and uint" msgstr "Vergleich von int und uint" -#: py/objcomplex.c -msgid "complex division by zero" -msgstr "Komplexe Division durch null" - #: py/objfloat.c py/parsenum.c msgid "complex values not supported" msgstr "Komplexe Zahlen nicht unterstützt" @@ -2959,12 +3003,7 @@ msgstr "Abmessungen stimmen nicht überein" msgid "div/mod not implemented for uint" msgstr "div/mod für uint nicht implementiert" -#: py/objfloat.c py/objint_mpz.c -msgid "divide by zero" -msgstr "durch Null dividieren" - -#: py/modmath.c py/objint_longlong.c py/runtime.c -#: shared-bindings/math/__init__.c +#: py/runtime.c msgid "division by zero" msgstr "Division durch Null" @@ -3123,10 +3162,6 @@ msgstr "Die Schriftart (font) muss 2048 Byte lang sein" msgid "format requires a dict" msgstr "Format erfordert ein Wörterbuch (dict)" -#: shared-bindings/microcontroller/Processor.c -msgid "frequency is read-only for this board" -msgstr "Frequenz ist für dieses Board schreibgeschützt" - #: py/objdeque.c msgid "full" msgstr "voll" @@ -3241,8 +3276,12 @@ msgstr "padding ist inkorrekt" msgid "index is out of bounds" msgstr "Index ist außerhalb der Grenzen" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "index must be tuple or int" +msgstr "" + #: extmod/ulab/code/numpy/numerical.c extmod/ulab/code/ulab_tools.c -#: ports/espressif/common-hal/pulseio/PulseIn.c py/obj.c +#: ports/espressif/common-hal/pulseio/PulseIn.c #: shared-bindings/bitmaptools/__init__.c msgid "index out of range" msgstr "index außerhalb der Reichweite" @@ -3340,10 +3379,6 @@ msgstr "Eingabevektoren müssen gleich lang sein" msgid "inputs are not iterable" msgstr "Eingaben sind nicht iterierbar" -#: py/parsenum.c -msgid "int() arg 2 must be >= 2 and <= 36" -msgstr "int() arg 2 muss >= 2 und <= 36 sein" - #: extmod/ulab/code/numpy/approx.c msgid "interp is defined for 1D iterables of equal length" msgstr "interp ist für 1D-Iterables gleicher Länge definiert" @@ -3425,10 +3460,6 @@ msgstr "ungültige Syntax für integer mit Basis %d" msgid "invalid syntax for number" msgstr "ungültige Syntax für number" -#: py/objexcept.c -msgid "invalid traceback" -msgstr "ungültiger Traceback" - #: py/objtype.c msgid "issubclass() arg 1 must be a class" msgstr "issubclass() arg 1 muss eine Klasse sein" @@ -3491,19 +3522,17 @@ msgstr "" "Es wurde versucht auf eine Variable zuzugreifen, die es (noch) nicht gibt. " "Variablen immer zuerst Zuweisen" -#: py/objint.c -msgid "long int not supported in this build" -msgstr "long int wird in diesem Build nicht unterstützt" - #: ports/espressif/common-hal/canio/CAN.c msgid "loopback + silent mode not supported by peripheral" msgstr "Loopback + Silent Mode wird vom Peripheriegerät nicht unterstützt" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS already initialized" msgstr "mDNS bereits initialisiert" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS only works with built-in WiFi" msgstr "mDNS funktioniert nur mit integriertem WiFi" @@ -3632,6 +3661,10 @@ msgstr "negative Potenz ohne Gleitkomma (float) Unterstützung" msgid "negative shift count" msgstr "Negative shift Anzahl" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "nested index must be int" +msgstr "" + #: shared-module/sdcardio/SDCard.c msgid "no SD card" msgstr "keine SD-Karte" @@ -3813,7 +3846,7 @@ msgid "only sample_rate=16000 is supported" msgstr "nur eine sample_rate=16000 wird unterstützt" #: py/objarray.c py/objstr.c py/objstrunicode.c py/objtuple.c -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "only slices with step=1 (aka None) are supported" msgstr "" @@ -4032,10 +4065,6 @@ msgstr "Die Schlafdauer darf nicht negativ sein" msgid "slice step can't be zero" msgstr "Slice-Schritt darf nicht Null sein" -#: py/objslice.c -msgid "slice step cannot be zero" -msgstr "Der Slice-Schritt kann nicht Null sein" - #: py/nativeglue.c msgid "slice unsupported" msgstr "Slice nicht unterstützt" @@ -4084,10 +4113,6 @@ msgstr "source_bitmap muss value_count von 8 haben" msgid "start/end indices" msgstr "start/end Indizes" -#: shared-bindings/random/__init__.c -msgid "step must be non-zero" -msgstr "Schritt (step) darf nicht Null sein" - #: shared-bindings/random/__init__.c msgid "stop not reachable from start" msgstr "stop ist von start aus nicht erreichbar" @@ -4096,10 +4121,6 @@ msgstr "stop ist von start aus nicht erreichbar" msgid "stream operation not supported" msgstr "stream operation ist nicht unterstützt" -#: py/objstrunicode.c -msgid "string indices must be integers, not %q" -msgstr "String Indizes müssen Integer sein, nicht %q" - #: py/stream.c msgid "string not supported; use bytes or bytearray" msgstr "Zeichenfolgen werden nicht unterstützt; verwende bytes oder bytearray" @@ -4132,10 +4153,6 @@ msgstr "Syntaxfehler in JSON" msgid "syntax error in uctypes descriptor" msgstr "Syntaxfehler in uctypes Deskriptor" -#: shared-bindings/time/__init__.c -msgid "time.struct_time() takes a 9-sequence" -msgstr "time.struct_time() nimmt eine 9-Sequenz an" - #: ports/atmel-samd/common-hal/watchdog/WatchDogTimer.c #: ports/espressif/common-hal/watchdog/WatchDogTimer.c #: ports/nrf/common-hal/watchdog/WatchDogTimer.c @@ -4419,10 +4436,6 @@ msgstr "xTaskCreate fehlgeschlagen" msgid "y value out of bounds" msgstr "y Wert außerhalb der Grenzen" -#: py/objrange.c -msgid "zero step" -msgstr "Nullschritt" - #: extmod/ulab/code/scipy/signal/signal.c msgid "zi must be an ndarray" msgstr "zi muss ein ndarray sein" @@ -4435,6 +4448,73 @@ msgstr "zi muss eine Gleitkommazahl sein" msgid "zi must be of shape (n_section, 2)" msgstr "zi muss die Form (n_section, 2) haben" +#~ msgid "Read-only object" +#~ msgstr "Schreibgeschützte Objekt" + +#~ msgid "frequency is read-only for this board" +#~ msgstr "Frequenz ist für dieses Board schreibgeschützt" + +#~ msgid "Unable to write" +#~ msgstr "Schreiben nicht möglich" + +#~ msgid "%q length must be >= 1" +#~ msgstr "%q Länge muss >= 1 sein" + +#~ msgid "%q must be a string" +#~ msgstr "%q muss ein String sein" + +#~ msgid "%q must be an int" +#~ msgstr "%q muss vom Typ Integer sein" + +#~ msgid "%q with a report ID of 0 must be of length 1" +#~ msgstr "%q mit Berichts-ID von 0 muss von Länge 1 sein" + +#~ msgid "At most %d %q may be specified (not %d)" +#~ msgstr "Es darf höchstens %d %q spezifiziert werden (nicht %d)" + +#~ msgid "Invalid pins" +#~ msgstr "Ungültige Pins" + +#, c-format +#~ msgid "No more than %d HID devices allowed" +#~ msgstr "Keine weiteren %d HID-Geräte zulässig" + +#~ msgid "byteorder is not a string" +#~ msgstr "Byteorder ist kein String" + +#~ msgid "can't convert %q to int" +#~ msgstr "kann %q nicht nach int konvertieren" + +#~ msgid "complex division by zero" +#~ msgstr "Komplexe Division durch null" + +#~ msgid "divide by zero" +#~ msgstr "durch Null dividieren" + +#~ msgid "int() arg 2 must be >= 2 and <= 36" +#~ msgstr "int() arg 2 muss >= 2 und <= 36 sein" + +#~ msgid "long int not supported in this build" +#~ msgstr "long int wird in diesem Build nicht unterstützt" + +#~ msgid "slice step cannot be zero" +#~ msgstr "Der Slice-Schritt kann nicht Null sein" + +#~ msgid "step must be non-zero" +#~ msgstr "Schritt (step) darf nicht Null sein" + +#~ msgid "string indices must be integers, not %q" +#~ msgstr "String Indizes müssen Integer sein, nicht %q" + +#~ msgid "time.struct_time() takes a 9-sequence" +#~ msgstr "time.struct_time() nimmt eine 9-Sequenz an" + +#~ msgid "zero step" +#~ msgstr "Nullschritt" + +#~ msgid "invalid traceback" +#~ msgstr "ungültiger Traceback" + #~ msgid "%q indices must be integers, not %s" #~ msgstr "%q Indizes müssen Integer sein, nicht %s" diff --git a/locale/el.po b/locale/el.po index d47a0c5399..fe882c9f30 100644 --- a/locale/el.po +++ b/locale/el.po @@ -76,6 +76,11 @@ msgstr "%%c απαιτεί int ή char" msgid "%02X" msgstr "" +#: shared-module/os/getenv.c +#, c-format +msgid "%S" +msgstr "" + #: shared-bindings/rgbmatrix/RGBMatrix.c #, c-format msgid "" @@ -112,13 +117,14 @@ msgstr "%q περιέχει διπλότυπα pins" msgid "%q failure: %d" msgstr "%q αποτυχία: %d" +#: ports/espressif/common-hal/espulp/ULP.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/microcontroller/Pin.c msgid "%q in use" msgstr "%q είναι σε χρήση" -#: py/obj.c py/objstr.c py/objstrunicode.c +#: py/objstr.c py/objstrunicode.c msgid "%q index out of range" msgstr "%q δείκτης εκτός εμβέλειας" @@ -130,7 +136,11 @@ msgstr "%q εκκίνηση απέτυχε" msgid "%q is %q" msgstr "" -#: py/argcheck.c +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "%q is read-only for this board" +msgstr "" + +#: py/argcheck.c shared-bindings/usb_hid/Device.c msgid "%q length must be %d" msgstr "%q μήκος πρέπει να είναι %d" @@ -146,10 +156,6 @@ msgstr "%q μήκος πρέπει να είναι <= %d" msgid "%q length must be >= %d" msgstr "%q μήκος πρέπει να είναι >= %d" -#: shared-bindings/busio/I2C.c -msgid "%q length must be >= 1" -msgstr "%q μήκος πρέπει να είναι >= 1" - #: py/argcheck.c msgid "%q must be %d" msgstr "%q πρέπει να είναι %d" @@ -171,23 +177,18 @@ msgid "%q must be >= %d" msgstr "%q πρέπει να είναι >= %d" #: shared-bindings/analogbufio/BufferedIn.c +msgid "%q must be a bytearray or array of type 'H' or 'B'" +msgstr "" + #: shared-bindings/audiocore/RawSample.c msgid "%q must be a bytearray or array of type 'h', 'H', 'b', or 'B'" msgstr "%q πρέπει να είναι bytearray ή array τύπου 'h', 'H', 'b', ή 'B'" -#: py/argcheck.c -msgid "%q must be a string" -msgstr "%q πρέπει να είναι string" - -#: py/argcheck.c -msgid "%q must be an int" -msgstr "%q πρέπει να είναι int" - -#: py/argcheck.c +#: py/argcheck.c py/obj.c py/objstrunicode.c msgid "%q must be of type %q" msgstr "%q πρέπει να είναι τύπου %q" -#: shared-bindings/digitalio/Pull.c +#: py/objexcept.c shared-bindings/digitalio/Pull.c msgid "%q must be of type %q or None" msgstr "%q πρέπει να είναι τύπου %q ή None" @@ -201,7 +202,6 @@ msgstr "%q εκτός ορίων" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c #: ports/cxd56/common-hal/pulseio/PulseIn.c -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/nrf/common-hal/pulseio/PulseIn.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c @@ -213,9 +213,9 @@ msgstr "%q εκτός εμβέλειας" msgid "%q pin invalid" msgstr "%q άκυρο pin" -#: shared-bindings/usb_hid/Device.c -msgid "%q with a report ID of 0 must be of length 1" -msgstr "%q με ID αναφοράς 0 πρέπει να έχει μήκος 1" +#: py/objrange.c py/objslice.c shared-bindings/random/__init__.c +msgid "%q step cannot be zero" +msgstr "" #: py/bc.c py/objnamedtuple.c msgid "%q() takes %d positional arguments but %d were given" @@ -314,7 +314,7 @@ msgstr "'%s' αντικείμενο δεν υποστηρίζει ορισμό msgid "'%s' object doesn't support item deletion" msgstr "'%s' αντικείμενο δεν υποστηρίζει διαγραφή πράγματος" -#: ports/raspberrypi/common-hal/wifi/Radio.c py/runtime.c +#: py/runtime.c msgid "'%s' object has no attribute '%q'" msgstr "'%s' αντικείμενο δεν έχει γνώρισμα '%q'" @@ -415,6 +415,10 @@ msgstr "Το ADC2 χρησιμοποιείται απο το WIFI" msgid "Address must be %d bytes long" msgstr "Η διεύθυνση πρέπει να είναι %d bytes μεγάλη" +#: ports/espressif/common-hal/memorymap/AddressRange.c +msgid "Address range not allowed" +msgstr "" + #: ports/espressif/common-hal/canio/CAN.c msgid "All CAN peripherals are in use" msgstr "Όλα τα περιφεριακά CAN είναι σε χρήση" @@ -495,7 +499,7 @@ msgstr "Ήδη διαφημίζουμε." msgid "Already have all-matches listener" msgstr "Ύπάρχει ήδη all-matches ακροατής" -#: ports/espressif/common-hal/coproc/__init__.c +#: ports/espressif/common-hal/espulp/ULP.c #: shared-module/memorymonitor/AllocationAlarm.c #: shared-module/memorymonitor/AllocationSize.c msgid "Already running" @@ -506,6 +510,11 @@ msgstr "Τρέχει ήδη" msgid "Already scanning for wifi networks" msgstr "Ήδη γίνεται σάρωση για δίκτυα wifi" +#: shared-module/os/getenv.c +#, c-format +msgid "An error occurred while retrieving '%s':\n" +msgstr "" + #: ports/stm/common-hal/audiopwmio/PWMAudioOut.c msgid "Another PWMAudioOut is already active" msgstr "Και άλλο PWMAudioOut είναι σε χρήση" @@ -519,15 +528,11 @@ msgstr "Άλλη αποστολή είναι ήδη ενεργή" msgid "Array must contain halfwords (type 'H')" msgstr "H παράταξη πρέπει να περιέχει halfwords (τύπου 'H')" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Array values should be single bytes." msgstr "Η τιμές της παράταξη πρέπει να είναι μονά bytes." -#: shared-bindings/microcontroller/Pin.c -msgid "At most %d %q may be specified (not %d)" -msgstr "Το πολύ %d %q μπορεί να είναι καθορισμένα (όχι %d)" - #: shared-module/memorymonitor/AllocationAlarm.c #, c-format msgid "Attempt to allocate %d blocks" @@ -919,6 +924,10 @@ msgstr "" msgid "Drive mode not used when direction is input." msgstr "" +#: py/obj.c +msgid "During handling of the above exception, another exception occurred:" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "ECB only operates on 16 bytes at a time" msgstr "" @@ -948,10 +957,10 @@ msgstr "" msgid "Error: Failure to bind" msgstr "" -#: py/enum.c shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c -#: shared-bindings/alarm/__init__.c shared-bindings/alarm/coproc/CoprocAlarm.c -#: shared-bindings/busio/SPI.c shared-bindings/coproc/Coproc.c -#: shared-bindings/coproc/__init__.c shared-bindings/microcontroller/Pin.c +#: ports/espressif/bindings/espulp/ULP.c py/enum.c +#: shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c +#: shared-bindings/alarm/__init__.c shared-bindings/busio/SPI.c +#: shared-bindings/microcontroller/Pin.c #: shared-bindings/neopixel_write/__init__.c msgid "Expected a %q" msgstr "" @@ -1036,6 +1045,10 @@ msgstr "" msgid "File exists" msgstr "" +#: shared-module/os/getenv.c +msgid "File not found" +msgstr "" + #: ports/atmel-samd/common-hal/canio/Listener.c #: ports/espressif/common-hal/canio/Listener.c #: ports/stm/common-hal/canio/Listener.c @@ -1050,7 +1063,6 @@ msgstr "" msgid "Firmware is invalid" msgstr "" -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/espressif/common-hal/dualbank/__init__.c msgid "Firmware is too big" msgstr "" @@ -1092,6 +1104,8 @@ msgstr "" #: shared-bindings/displayio/Display.c #: shared-bindings/displayio/EPaperDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c +#: shared-module/displayio/Display.c +#: shared-module/framebufferio/FramebufferDisplay.c msgid "Group already used" msgstr "" @@ -1218,6 +1232,7 @@ msgid "Internal define error" msgstr "" #: ports/espressif/common-hal/paralleldisplay/ParallelBus.c +#: shared-module/os/getenv.c msgid "Internal error" msgstr "" @@ -1264,6 +1279,11 @@ msgstr "" msgid "Invalid bits per value" msgstr "" +#: shared-module/os/getenv.c +#, c-format +msgid "Invalid byte %.*s" +msgstr "" + #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #, c-format msgid "Invalid data_pins[%d]" @@ -1281,10 +1301,6 @@ msgstr "" msgid "Invalid multicast MAC address" msgstr "" -#: shared-bindings/busio/UART.c -msgid "Invalid pins" -msgstr "" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Invalid size" msgstr "" @@ -1298,10 +1314,18 @@ msgstr "" msgid "Invalid state" msgstr "" +#: shared-module/os/getenv.c +msgid "Invalid unicode escape" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "Key must be 16, 24, or 32 bytes long" msgstr "" +#: shared-module/os/getenv.c +msgid "Key not found" +msgstr "" + #: shared-module/is31fl3741/FrameBuffer.c msgid "LED mappings must match display size" msgstr "" @@ -1408,6 +1432,10 @@ msgstr "" msgid "NVS Error" msgstr "" +#: shared-bindings/socketpool/SocketPool.c +msgid "Name or service not known" +msgstr "" + #: py/qstr.c msgid "Name too long" msgstr "" @@ -1522,11 +1550,6 @@ msgstr "" msgid "No long integer support" msgstr "" -#: shared-module/usb_hid/__init__.c -#, c-format -msgid "No more than %d HID devices allowed" -msgstr "" - #: shared-bindings/wifi/Radio.c msgid "No network with that ssid" msgstr "" @@ -1651,11 +1674,14 @@ msgid "" "%d bpp given" msgstr "" -#: ports/espressif/common-hal/alarm/coproc/CoprocAlarm.c #: ports/espressif/common-hal/alarm/touch/TouchAlarm.c msgid "Only one %q can be set in deep sleep." msgstr "" +#: ports/espressif/common-hal/espulp/ULPAlarm.c +msgid "Only one %q can be set." +msgstr "" + #: ports/espressif/common-hal/i2ctarget/I2CTarget.c #: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c msgid "Only one address is allowed" @@ -1688,6 +1714,10 @@ msgstr "" msgid "Operation timed out" msgstr "" +#: ports/raspberrypi/common-hal/mdns/Server.c +msgid "Out of MDNS service slots" +msgstr "" + #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Out of memory" msgstr "" @@ -1813,6 +1843,10 @@ msgstr "" msgid "Program size invalid" msgstr "" +#: ports/espressif/common-hal/espulp/ULP.c +msgid "Program too long" +msgstr "" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." msgstr "" @@ -1853,7 +1887,7 @@ msgid "Random number generation error" msgstr "" #: shared-bindings/memorymonitor/AllocationSize.c -#: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/pulseio/PulseIn.c shared-module/displayio/Bitmap.c msgid "Read-only" msgstr "" @@ -1861,10 +1895,6 @@ msgstr "" msgid "Read-only filesystem" msgstr "" -#: shared-module/displayio/Bitmap.c -msgid "Read-only object" -msgstr "" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Received response was invalid" msgstr "" @@ -1957,7 +1987,7 @@ msgstr "" msgid "Sleep Memory not available" msgstr "" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Slice and value different lengths." msgstr "" @@ -1994,6 +2024,10 @@ msgstr "" msgid "Stereo right must be on PWM channel B" msgstr "" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Stopping AP is not supported." +msgstr "" + #: ports/mimxrt10xx/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "Supply at least one UART pin" msgstr "" @@ -2034,6 +2068,10 @@ msgid "" "exit safe mode." msgstr "" +#: py/obj.c +msgid "The above exception was the direct cause of the following exception:" +msgstr "" + #: ports/espressif/boards/m5stack_atom_lite/mpconfigboard.h msgid "The central button was pressed at start up.\n" msgstr "" @@ -2219,11 +2257,12 @@ msgid "Unable to read color palette data" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "Unable to start mDNS query" msgstr "" -#: shared-bindings/coproc/CoprocMemory.c -msgid "Unable to write" +#: shared-bindings/memorymap/AddressRange.c +msgid "Unable to write to address." msgstr "" #: shared-bindings/nvm/ByteArray.c @@ -2294,6 +2333,7 @@ msgid "Unkown error code %d" msgstr "" #: shared-bindings/adafruit_pixelbuf/PixelBuf.c +#: shared-module/_pixelmap/PixelMap.c #, c-format msgid "Unmatched number of items on RHS (expected %d, got %d)." msgstr "" @@ -2378,6 +2418,18 @@ msgstr "" msgid "Wi-Fi: " msgstr "" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in access point mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in station mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is not enabled" +msgstr "" + #: main.c msgid "Woken up by alarm.\n" msgstr "" @@ -2466,7 +2518,7 @@ msgid "array has too many dimensions" msgstr "" #: py/objarray.c shared-bindings/alarm/SleepMemory.c -#: shared-bindings/coproc/CoprocMemory.c shared-bindings/nvm/ByteArray.c +#: shared-bindings/memorymap/AddressRange.c shared-bindings/nvm/ByteArray.c msgid "array/bytes required on right side" msgstr "" @@ -2559,10 +2611,6 @@ msgstr "" msgid "buffer too small for requested bytes" msgstr "" -#: shared-bindings/adafruit_pixelbuf/PixelBuf.c -msgid "byteorder is not a string" -msgstr "" - #: py/objarray.c msgid "bytes length not a multiple of item size" msgstr "" @@ -2604,14 +2652,10 @@ msgstr "" msgid "can't cancel self" msgstr "" -#: py/obj.c py/objint.c shared-module/adafruit_pixelbuf/PixelBuf.c +#: py/obj.c py/objint.c py/runtime.c shared-module/adafruit_pixelbuf/PixelBuf.c msgid "can't convert %q to %q" msgstr "" -#: py/runtime.c -msgid "can't convert %q to int" -msgstr "" - #: py/obj.c #, c-format msgid "can't convert %s to complex" @@ -2693,6 +2737,10 @@ msgstr "" msgid "can't set attribute" msgstr "" +#: py/runtime.c +msgid "can't set attribute '%q'" +msgstr "" + #: py/emitnative.c msgid "can't store '%q'" msgstr "" @@ -2795,10 +2843,6 @@ msgstr "" msgid "comparison of int and uint" msgstr "" -#: py/objcomplex.c -msgid "complex division by zero" -msgstr "" - #: py/objfloat.c py/parsenum.c msgid "complex values not supported" msgstr "" @@ -2901,12 +2945,7 @@ msgstr "" msgid "div/mod not implemented for uint" msgstr "" -#: py/objfloat.c py/objint_mpz.c -msgid "divide by zero" -msgstr "" - -#: py/modmath.c py/objint_longlong.c py/runtime.c -#: shared-bindings/math/__init__.c +#: py/runtime.c msgid "division by zero" msgstr "" @@ -3063,10 +3102,6 @@ msgstr "" msgid "format requires a dict" msgstr "" -#: shared-bindings/microcontroller/Processor.c -msgid "frequency is read-only for this board" -msgstr "" - #: py/objdeque.c msgid "full" msgstr "" @@ -3179,8 +3214,12 @@ msgstr "" msgid "index is out of bounds" msgstr "" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "index must be tuple or int" +msgstr "" + #: extmod/ulab/code/numpy/numerical.c extmod/ulab/code/ulab_tools.c -#: ports/espressif/common-hal/pulseio/PulseIn.c py/obj.c +#: ports/espressif/common-hal/pulseio/PulseIn.c #: shared-bindings/bitmaptools/__init__.c msgid "index out of range" msgstr "" @@ -3278,10 +3317,6 @@ msgstr "" msgid "inputs are not iterable" msgstr "" -#: py/parsenum.c -msgid "int() arg 2 must be >= 2 and <= 36" -msgstr "" - #: extmod/ulab/code/numpy/approx.c msgid "interp is defined for 1D iterables of equal length" msgstr "" @@ -3363,10 +3398,6 @@ msgstr "" msgid "invalid syntax for number" msgstr "" -#: py/objexcept.c -msgid "invalid traceback" -msgstr "" - #: py/objtype.c msgid "issubclass() arg 1 must be a class" msgstr "" @@ -3423,19 +3454,17 @@ msgstr "" msgid "local variable referenced before assignment" msgstr "" -#: py/objint.c -msgid "long int not supported in this build" -msgstr "" - #: ports/espressif/common-hal/canio/CAN.c msgid "loopback + silent mode not supported by peripheral" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS already initialized" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS only works with built-in WiFi" msgstr "" @@ -3564,6 +3593,10 @@ msgstr "" msgid "negative shift count" msgstr "" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "nested index must be int" +msgstr "" + #: shared-module/sdcardio/SDCard.c msgid "no SD card" msgstr "" @@ -3743,7 +3776,7 @@ msgid "only sample_rate=16000 is supported" msgstr "" #: py/objarray.c py/objstr.c py/objstrunicode.c py/objtuple.c -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "only slices with step=1 (aka None) are supported" msgstr "" @@ -3959,10 +3992,6 @@ msgstr "" msgid "slice step can't be zero" msgstr "" -#: py/objslice.c -msgid "slice step cannot be zero" -msgstr "" - #: py/nativeglue.c msgid "slice unsupported" msgstr "" @@ -4011,10 +4040,6 @@ msgstr "" msgid "start/end indices" msgstr "" -#: shared-bindings/random/__init__.c -msgid "step must be non-zero" -msgstr "" - #: shared-bindings/random/__init__.c msgid "stop not reachable from start" msgstr "" @@ -4023,10 +4048,6 @@ msgstr "" msgid "stream operation not supported" msgstr "" -#: py/objstrunicode.c -msgid "string indices must be integers, not %q" -msgstr "" - #: py/stream.c msgid "string not supported; use bytes or bytearray" msgstr "" @@ -4059,10 +4080,6 @@ msgstr "" msgid "syntax error in uctypes descriptor" msgstr "" -#: shared-bindings/time/__init__.c -msgid "time.struct_time() takes a 9-sequence" -msgstr "" - #: ports/atmel-samd/common-hal/watchdog/WatchDogTimer.c #: ports/espressif/common-hal/watchdog/WatchDogTimer.c #: ports/nrf/common-hal/watchdog/WatchDogTimer.c @@ -4344,10 +4361,6 @@ msgstr "" msgid "y value out of bounds" msgstr "" -#: py/objrange.c -msgid "zero step" -msgstr "" - #: extmod/ulab/code/scipy/signal/signal.c msgid "zi must be an ndarray" msgstr "" @@ -4360,6 +4373,21 @@ msgstr "" msgid "zi must be of shape (n_section, 2)" msgstr "" +#~ msgid "%q length must be >= 1" +#~ msgstr "%q μήκος πρέπει να είναι >= 1" + +#~ msgid "%q must be a string" +#~ msgstr "%q πρέπει να είναι string" + +#~ msgid "%q must be an int" +#~ msgstr "%q πρέπει να είναι int" + +#~ msgid "%q with a report ID of 0 must be of length 1" +#~ msgstr "%q με ID αναφοράς 0 πρέπει να έχει μήκος 1" + +#~ msgid "At most %d %q may be specified (not %d)" +#~ msgstr "Το πολύ %d %q μπορεί να είναι καθορισμένα (όχι %d)" + #~ msgid "%q indices must be integers, not %s" #~ msgstr "%q δείκτες πρέπει να είναι ακέραιοι, όχι %s" diff --git a/locale/en_GB.po b/locale/en_GB.po index e6fabd93d9..6bb13d2570 100644 --- a/locale/en_GB.po +++ b/locale/en_GB.po @@ -74,6 +74,11 @@ msgstr "%%c requires int or char" msgid "%02X" msgstr "" +#: shared-module/os/getenv.c +#, c-format +msgid "%S" +msgstr "" + #: shared-bindings/rgbmatrix/RGBMatrix.c #, c-format msgid "" @@ -110,13 +115,14 @@ msgstr "%q contains duplicate pins" msgid "%q failure: %d" msgstr "%q failure: %d" +#: ports/espressif/common-hal/espulp/ULP.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/microcontroller/Pin.c msgid "%q in use" msgstr "%q in use" -#: py/obj.c py/objstr.c py/objstrunicode.c +#: py/objstr.c py/objstrunicode.c msgid "%q index out of range" msgstr "%q index out of range" @@ -128,7 +134,11 @@ msgstr "" msgid "%q is %q" msgstr "" -#: py/argcheck.c +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "%q is read-only for this board" +msgstr "" + +#: py/argcheck.c shared-bindings/usb_hid/Device.c msgid "%q length must be %d" msgstr "" @@ -144,10 +154,6 @@ msgstr "" msgid "%q length must be >= %d" msgstr "" -#: shared-bindings/busio/I2C.c -msgid "%q length must be >= 1" -msgstr "%q length must be >= 1" - #: py/argcheck.c msgid "%q must be %d" msgstr "" @@ -169,23 +175,18 @@ msgid "%q must be >= %d" msgstr "%q must be >= %d" #: shared-bindings/analogbufio/BufferedIn.c +msgid "%q must be a bytearray or array of type 'H' or 'B'" +msgstr "" + #: shared-bindings/audiocore/RawSample.c msgid "%q must be a bytearray or array of type 'h', 'H', 'b', or 'B'" msgstr "" -#: py/argcheck.c -msgid "%q must be a string" -msgstr "%q must be a string" - -#: py/argcheck.c -msgid "%q must be an int" -msgstr "" - -#: py/argcheck.c +#: py/argcheck.c py/obj.c py/objstrunicode.c msgid "%q must be of type %q" msgstr "" -#: shared-bindings/digitalio/Pull.c +#: py/objexcept.c shared-bindings/digitalio/Pull.c msgid "%q must be of type %q or None" msgstr "" @@ -199,7 +200,6 @@ msgstr "" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c #: ports/cxd56/common-hal/pulseio/PulseIn.c -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/nrf/common-hal/pulseio/PulseIn.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c @@ -211,8 +211,8 @@ msgstr "%q out of range" msgid "%q pin invalid" msgstr "%q pin invalid" -#: shared-bindings/usb_hid/Device.c -msgid "%q with a report ID of 0 must be of length 1" +#: py/objrange.c py/objslice.c shared-bindings/random/__init__.c +msgid "%q step cannot be zero" msgstr "" #: py/bc.c py/objnamedtuple.c @@ -312,7 +312,7 @@ msgstr "'%s' object doesn't support item assignment" msgid "'%s' object doesn't support item deletion" msgstr "'%s' object doesn't support item deletion" -#: ports/raspberrypi/common-hal/wifi/Radio.c py/runtime.c +#: py/runtime.c msgid "'%s' object has no attribute '%q'" msgstr "'%s' object has no attribute '%q'" @@ -412,6 +412,10 @@ msgstr "ADC2 is being used by WiFi" msgid "Address must be %d bytes long" msgstr "Address must be %d bytes long" +#: ports/espressif/common-hal/memorymap/AddressRange.c +msgid "Address range not allowed" +msgstr "" + #: ports/espressif/common-hal/canio/CAN.c msgid "All CAN peripherals are in use" msgstr "All CAN peripherals are in use" @@ -492,7 +496,7 @@ msgstr "Already advertising." msgid "Already have all-matches listener" msgstr "Already have all-matches listener" -#: ports/espressif/common-hal/coproc/__init__.c +#: ports/espressif/common-hal/espulp/ULP.c #: shared-module/memorymonitor/AllocationAlarm.c #: shared-module/memorymonitor/AllocationSize.c msgid "Already running" @@ -503,6 +507,11 @@ msgstr "Already running" msgid "Already scanning for wifi networks" msgstr "Already scanning for WiFi networks" +#: shared-module/os/getenv.c +#, c-format +msgid "An error occurred while retrieving '%s':\n" +msgstr "" + #: ports/stm/common-hal/audiopwmio/PWMAudioOut.c msgid "Another PWMAudioOut is already active" msgstr "Another PWMAudioOut is already active" @@ -516,15 +525,11 @@ msgstr "Another send is already active" msgid "Array must contain halfwords (type 'H')" msgstr "Array must contain halfwords (type 'H')" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Array values should be single bytes." msgstr "Array values should be single bytes." -#: shared-bindings/microcontroller/Pin.c -msgid "At most %d %q may be specified (not %d)" -msgstr "At most %d %q may be specified (not %d)" - #: shared-module/memorymonitor/AllocationAlarm.c #, c-format msgid "Attempt to allocate %d blocks" @@ -908,6 +913,10 @@ msgstr "" msgid "Drive mode not used when direction is input." msgstr "Drive mode not used when direction is input." +#: py/obj.c +msgid "During handling of the above exception, another exception occurred:" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "ECB only operates on 16 bytes at a time" msgstr "ECB only operates on 16 bytes at a time" @@ -937,10 +946,10 @@ msgstr "Error in regex" msgid "Error: Failure to bind" msgstr "Error: Failure to bind" -#: py/enum.c shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c -#: shared-bindings/alarm/__init__.c shared-bindings/alarm/coproc/CoprocAlarm.c -#: shared-bindings/busio/SPI.c shared-bindings/coproc/Coproc.c -#: shared-bindings/coproc/__init__.c shared-bindings/microcontroller/Pin.c +#: ports/espressif/bindings/espulp/ULP.c py/enum.c +#: shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c +#: shared-bindings/alarm/__init__.c shared-bindings/busio/SPI.c +#: shared-bindings/microcontroller/Pin.c #: shared-bindings/neopixel_write/__init__.c msgid "Expected a %q" msgstr "Expected a %q" @@ -1025,6 +1034,10 @@ msgstr "Fatal error." msgid "File exists" msgstr "File exists" +#: shared-module/os/getenv.c +msgid "File not found" +msgstr "" + #: ports/atmel-samd/common-hal/canio/Listener.c #: ports/espressif/common-hal/canio/Listener.c #: ports/stm/common-hal/canio/Listener.c @@ -1039,7 +1052,6 @@ msgstr "" msgid "Firmware is invalid" msgstr "" -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/espressif/common-hal/dualbank/__init__.c msgid "Firmware is too big" msgstr "" @@ -1081,6 +1093,8 @@ msgstr "Generic Failure" #: shared-bindings/displayio/Display.c #: shared-bindings/displayio/EPaperDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c +#: shared-module/displayio/Display.c +#: shared-module/framebufferio/FramebufferDisplay.c msgid "Group already used" msgstr "Group already used" @@ -1209,6 +1223,7 @@ msgid "Internal define error" msgstr "Internal define error" #: ports/espressif/common-hal/paralleldisplay/ParallelBus.c +#: shared-module/os/getenv.c msgid "Internal error" msgstr "" @@ -1255,6 +1270,11 @@ msgstr "Invalid argument" msgid "Invalid bits per value" msgstr "Invalid bits per value" +#: shared-module/os/getenv.c +#, c-format +msgid "Invalid byte %.*s" +msgstr "" + #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #, c-format msgid "Invalid data_pins[%d]" @@ -1272,10 +1292,6 @@ msgstr "Invalid memory access." msgid "Invalid multicast MAC address" msgstr "" -#: shared-bindings/busio/UART.c -msgid "Invalid pins" -msgstr "Invalid pins" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Invalid size" msgstr "Invalid size" @@ -1289,10 +1305,18 @@ msgstr "Invalid socket for TLS" msgid "Invalid state" msgstr "Invalid state" +#: shared-module/os/getenv.c +msgid "Invalid unicode escape" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "Key must be 16, 24, or 32 bytes long" msgstr "Key must be 16, 24, or 32 bytes long" +#: shared-module/os/getenv.c +msgid "Key not found" +msgstr "" + #: shared-module/is31fl3741/FrameBuffer.c msgid "LED mappings must match display size" msgstr "" @@ -1399,6 +1423,10 @@ msgstr "NLR jump failed. Likely memory corruption." msgid "NVS Error" msgstr "NVS Error" +#: shared-bindings/socketpool/SocketPool.c +msgid "Name or service not known" +msgstr "" + #: py/qstr.c msgid "Name too long" msgstr "Name too long" @@ -1513,11 +1541,6 @@ msgstr "No key was specified" msgid "No long integer support" msgstr "No long integer support" -#: shared-module/usb_hid/__init__.c -#, c-format -msgid "No more than %d HID devices allowed" -msgstr "No more than %d HID devices allowed" - #: shared-bindings/wifi/Radio.c msgid "No network with that ssid" msgstr "No network with that ssid" @@ -1646,11 +1669,14 @@ msgstr "" "Only monochrome, indexed 4bpp or 8bpp, and 16bpp or greater BMPs supported: " "%d bpp given" -#: ports/espressif/common-hal/alarm/coproc/CoprocAlarm.c #: ports/espressif/common-hal/alarm/touch/TouchAlarm.c msgid "Only one %q can be set in deep sleep." msgstr "" +#: ports/espressif/common-hal/espulp/ULPAlarm.c +msgid "Only one %q can be set." +msgstr "" + #: ports/espressif/common-hal/i2ctarget/I2CTarget.c #: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c msgid "Only one address is allowed" @@ -1683,6 +1709,10 @@ msgstr "Operation or feature not supported" msgid "Operation timed out" msgstr "Operation timed out" +#: ports/raspberrypi/common-hal/mdns/Server.c +msgid "Out of MDNS service slots" +msgstr "" + #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Out of memory" msgstr "Out of memory" @@ -1810,6 +1840,10 @@ msgstr "Program does OUT without loading OSR" msgid "Program size invalid" msgstr "Program size invalid" +#: ports/espressif/common-hal/espulp/ULP.c +msgid "Program too long" +msgstr "" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." msgstr "Pull not used when direction is output." @@ -1850,7 +1884,7 @@ msgid "Random number generation error" msgstr "Random number generation error" #: shared-bindings/memorymonitor/AllocationSize.c -#: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/pulseio/PulseIn.c shared-module/displayio/Bitmap.c msgid "Read-only" msgstr "Read-only" @@ -1858,10 +1892,6 @@ msgstr "Read-only" msgid "Read-only filesystem" msgstr "Read-only filesystem" -#: shared-module/displayio/Bitmap.c -msgid "Read-only object" -msgstr "Read-only object" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Received response was invalid" msgstr "Received response was invalid" @@ -1954,7 +1984,7 @@ msgstr "Size not supported" msgid "Sleep Memory not available" msgstr "Sleep Memory not available" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Slice and value different lengths." msgstr "Slice and value different lengths." @@ -1991,6 +2021,10 @@ msgstr "Stereo left must be on PWM channel A" msgid "Stereo right must be on PWM channel B" msgstr "Stereo right must be on PWM channel B" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Stopping AP is not supported." +msgstr "" + #: ports/mimxrt10xx/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "Supply at least one UART pin" msgstr "Supply at least one UART pin" @@ -2035,6 +2069,10 @@ msgstr "" "The `microcontroller` module was used to boot into safe mode. Press reset to " "exit safe mode." +#: py/obj.c +msgid "The above exception was the direct cause of the following exception:" +msgstr "" + #: ports/espressif/boards/m5stack_atom_lite/mpconfigboard.h msgid "The central button was pressed at start up.\n" msgstr "" @@ -2223,11 +2261,12 @@ msgid "Unable to read color palette data" msgstr "Unable to read colour palette data" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "Unable to start mDNS query" msgstr "" -#: shared-bindings/coproc/CoprocMemory.c -msgid "Unable to write" +#: shared-bindings/memorymap/AddressRange.c +msgid "Unable to write to address." msgstr "" #: shared-bindings/nvm/ByteArray.c @@ -2298,6 +2337,7 @@ msgid "Unkown error code %d" msgstr "" #: shared-bindings/adafruit_pixelbuf/PixelBuf.c +#: shared-module/_pixelmap/PixelMap.c #, c-format msgid "Unmatched number of items on RHS (expected %d, got %d)." msgstr "Unmatched number of items on RHS (expected %d, got %d)." @@ -2384,6 +2424,18 @@ msgstr "" msgid "Wi-Fi: " msgstr "" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in access point mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in station mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is not enabled" +msgstr "" + #: main.c msgid "Woken up by alarm.\n" msgstr "Woken up by alarm.\n" @@ -2473,7 +2525,7 @@ msgid "array has too many dimensions" msgstr "" #: py/objarray.c shared-bindings/alarm/SleepMemory.c -#: shared-bindings/coproc/CoprocMemory.c shared-bindings/nvm/ByteArray.c +#: shared-bindings/memorymap/AddressRange.c shared-bindings/nvm/ByteArray.c msgid "array/bytes required on right side" msgstr "array/bytes required on right side" @@ -2566,10 +2618,6 @@ msgstr "Buffer too small" msgid "buffer too small for requested bytes" msgstr "Buffer too small for requested bytes" -#: shared-bindings/adafruit_pixelbuf/PixelBuf.c -msgid "byteorder is not a string" -msgstr "Byteorder is not a string" - #: py/objarray.c msgid "bytes length not a multiple of item size" msgstr "Bytes length not a multiple of item size" @@ -2611,14 +2659,10 @@ msgstr "Can't assign to expression" msgid "can't cancel self" msgstr "can't cancel self" -#: py/obj.c py/objint.c shared-module/adafruit_pixelbuf/PixelBuf.c +#: py/obj.c py/objint.c py/runtime.c shared-module/adafruit_pixelbuf/PixelBuf.c msgid "can't convert %q to %q" msgstr "Can't convert %q to %q" -#: py/runtime.c -msgid "can't convert %q to int" -msgstr "can't convert %q to int" - #: py/obj.c #, c-format msgid "can't convert %s to complex" @@ -2700,6 +2744,10 @@ msgstr "can't set 512 block size" msgid "can't set attribute" msgstr "can't set attribute" +#: py/runtime.c +msgid "can't set attribute '%q'" +msgstr "" + #: py/emitnative.c msgid "can't store '%q'" msgstr "can't store '%q'" @@ -2804,10 +2852,6 @@ msgstr "colour must be between 0x000000 and 0xffffff" msgid "comparison of int and uint" msgstr "comparison of int and uint" -#: py/objcomplex.c -msgid "complex division by zero" -msgstr "complex division by zero" - #: py/objfloat.c py/parsenum.c msgid "complex values not supported" msgstr "complex values not supported" @@ -2911,12 +2955,7 @@ msgstr "dimensions do not match" msgid "div/mod not implemented for uint" msgstr "div/mod not implemented for uint" -#: py/objfloat.c py/objint_mpz.c -msgid "divide by zero" -msgstr "divide by zero" - -#: py/modmath.c py/objint_longlong.c py/runtime.c -#: shared-bindings/math/__init__.c +#: py/runtime.c msgid "division by zero" msgstr "division by zero" @@ -3073,10 +3112,6 @@ msgstr "font must be 2048 bytes long" msgid "format requires a dict" msgstr "format requires a dict" -#: shared-bindings/microcontroller/Processor.c -msgid "frequency is read-only for this board" -msgstr "" - #: py/objdeque.c msgid "full" msgstr "full" @@ -3189,8 +3224,12 @@ msgstr "incorrect padding" msgid "index is out of bounds" msgstr "index is out of bounds" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "index must be tuple or int" +msgstr "" + #: extmod/ulab/code/numpy/numerical.c extmod/ulab/code/ulab_tools.c -#: ports/espressif/common-hal/pulseio/PulseIn.c py/obj.c +#: ports/espressif/common-hal/pulseio/PulseIn.c #: shared-bindings/bitmaptools/__init__.c msgid "index out of range" msgstr "index out of range" @@ -3288,10 +3327,6 @@ msgstr "input vectors must be of equal length" msgid "inputs are not iterable" msgstr "inputs are not iterable" -#: py/parsenum.c -msgid "int() arg 2 must be >= 2 and <= 36" -msgstr "int() arg 2 must be >= 2 and <= 36" - #: extmod/ulab/code/numpy/approx.c msgid "interp is defined for 1D iterables of equal length" msgstr "interp is defined for 1D iterables of equal length" @@ -3373,10 +3408,6 @@ msgstr "invalid syntax for integer with base %d" msgid "invalid syntax for number" msgstr "invalid syntax for number" -#: py/objexcept.c -msgid "invalid traceback" -msgstr "invalid traceback" - #: py/objtype.c msgid "issubclass() arg 1 must be a class" msgstr "issubclass() arg 1 must be a class" @@ -3433,19 +3464,17 @@ msgstr "local '%q' used before type known" msgid "local variable referenced before assignment" msgstr "local variable referenced before assignment" -#: py/objint.c -msgid "long int not supported in this build" -msgstr "long int not supported in this build" - #: ports/espressif/common-hal/canio/CAN.c msgid "loopback + silent mode not supported by peripheral" msgstr "loopback + silent mode not supported by peripheral" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS already initialized" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS only works with built-in WiFi" msgstr "" @@ -3574,6 +3603,10 @@ msgstr "negative power with no float support" msgid "negative shift count" msgstr "negative shift count" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "nested index must be int" +msgstr "" + #: shared-module/sdcardio/SDCard.c msgid "no SD card" msgstr "no SD card" @@ -3753,7 +3786,7 @@ msgid "only sample_rate=16000 is supported" msgstr "only sample_rate=16000 is supported" #: py/objarray.c py/objstr.c py/objstrunicode.c py/objtuple.c -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "only slices with step=1 (aka None) are supported" msgstr "only slices with step=1 (aka None) are supported" @@ -3969,10 +4002,6 @@ msgstr "sleep length must be non-negative" msgid "slice step can't be zero" msgstr "slice step can't be zero" -#: py/objslice.c -msgid "slice step cannot be zero" -msgstr "slice step cannot be zero" - #: py/nativeglue.c msgid "slice unsupported" msgstr "slice unsupported" @@ -4021,10 +4050,6 @@ msgstr "" msgid "start/end indices" msgstr "start/end indices" -#: shared-bindings/random/__init__.c -msgid "step must be non-zero" -msgstr "step must be non-zero" - #: shared-bindings/random/__init__.c msgid "stop not reachable from start" msgstr "stop not reachable from start" @@ -4033,10 +4058,6 @@ msgstr "stop not reachable from start" msgid "stream operation not supported" msgstr "stream operation not supported" -#: py/objstrunicode.c -msgid "string indices must be integers, not %q" -msgstr "string indices must be integers, not %q" - #: py/stream.c msgid "string not supported; use bytes or bytearray" msgstr "string not supported; use bytes or bytearray" @@ -4069,10 +4090,6 @@ msgstr "syntax error in JSON" msgid "syntax error in uctypes descriptor" msgstr "syntax error in uctypes descriptor" -#: shared-bindings/time/__init__.c -msgid "time.struct_time() takes a 9-sequence" -msgstr "time.struct_time() takes a 9-sequence" - #: ports/atmel-samd/common-hal/watchdog/WatchDogTimer.c #: ports/espressif/common-hal/watchdog/WatchDogTimer.c #: ports/nrf/common-hal/watchdog/WatchDogTimer.c @@ -4354,10 +4371,6 @@ msgstr "xTaskCreate failed" msgid "y value out of bounds" msgstr "y value out of bounds" -#: py/objrange.c -msgid "zero step" -msgstr "zero step" - #: extmod/ulab/code/scipy/signal/signal.c msgid "zi must be an ndarray" msgstr "zi must be an ndarray" @@ -4370,6 +4383,61 @@ msgstr "zi must be of float type" msgid "zi must be of shape (n_section, 2)" msgstr "zi must be of shape (n_section, 2)" +#~ msgid "Read-only object" +#~ msgstr "Read-only object" + +#~ msgid "%q length must be >= 1" +#~ msgstr "%q length must be >= 1" + +#~ msgid "%q must be a string" +#~ msgstr "%q must be a string" + +#~ msgid "At most %d %q may be specified (not %d)" +#~ msgstr "At most %d %q may be specified (not %d)" + +#~ msgid "Invalid pins" +#~ msgstr "Invalid pins" + +#, c-format +#~ msgid "No more than %d HID devices allowed" +#~ msgstr "No more than %d HID devices allowed" + +#~ msgid "byteorder is not a string" +#~ msgstr "Byteorder is not a string" + +#~ msgid "can't convert %q to int" +#~ msgstr "can't convert %q to int" + +#~ msgid "complex division by zero" +#~ msgstr "complex division by zero" + +#~ msgid "divide by zero" +#~ msgstr "divide by zero" + +#~ msgid "int() arg 2 must be >= 2 and <= 36" +#~ msgstr "int() arg 2 must be >= 2 and <= 36" + +#~ msgid "long int not supported in this build" +#~ msgstr "long int not supported in this build" + +#~ msgid "slice step cannot be zero" +#~ msgstr "slice step cannot be zero" + +#~ msgid "step must be non-zero" +#~ msgstr "step must be non-zero" + +#~ msgid "string indices must be integers, not %q" +#~ msgstr "string indices must be integers, not %q" + +#~ msgid "time.struct_time() takes a 9-sequence" +#~ msgstr "time.struct_time() takes a 9-sequence" + +#~ msgid "zero step" +#~ msgstr "zero step" + +#~ msgid "invalid traceback" +#~ msgstr "invalid traceback" + #~ msgid "%q indices must be integers, not %s" #~ msgstr "%q indices must be integers, not %s" diff --git a/locale/es.po b/locale/es.po index 13cb9a3821..f65f60a770 100644 --- a/locale/es.po +++ b/locale/es.po @@ -8,15 +8,15 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-01-04 12:55-0600\n" -"PO-Revision-Date: 2022-09-23 17:20+0000\n" -"Last-Translator: Alvaro Figueroa \n" +"PO-Revision-Date: 2022-12-31 17:50+0000\n" +"Last-Translator: Orlando Caro \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.14.1\n" +"X-Generator: Weblate 4.15.1-dev\n" #: main.c msgid "" @@ -74,6 +74,11 @@ msgstr "%%c requiere int o char" msgid "%02X" msgstr "" +#: shared-module/os/getenv.c +#, c-format +msgid "%S" +msgstr "" + #: shared-bindings/rgbmatrix/RGBMatrix.c #, c-format msgid "" @@ -92,9 +97,8 @@ msgstr "" #: ports/raspberrypi/common-hal/analogio/AnalogOut.c #: ports/raspberrypi/common-hal/rtc/RTC.c ports/stm/common-hal/alarm/__init__.c #: ports/stm/common-hal/rtc/RTC.c -#, fuzzy msgid "%q" -msgstr "%q" +msgstr "" #: shared-bindings/microcontroller/Pin.c msgid "%q and %q contain duplicate pins" @@ -112,13 +116,14 @@ msgstr "%q contiene pines duplicados" msgid "%q failure: %d" msgstr "%q fallo: %d" +#: ports/espressif/common-hal/espulp/ULP.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/microcontroller/Pin.c msgid "%q in use" msgstr "%q está siendo utilizado" -#: py/obj.c py/objstr.c py/objstrunicode.c +#: py/objstr.c py/objstrunicode.c msgid "%q index out of range" msgstr "%q indice fuera de rango" @@ -128,9 +133,13 @@ msgstr "%q inicializado fallido" #: shared-bindings/dualbank/__init__.c msgid "%q is %q" +msgstr "%q es %q" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "%q is read-only for this board" msgstr "" -#: py/argcheck.c +#: py/argcheck.c shared-bindings/usb_hid/Device.c msgid "%q length must be %d" msgstr "%q tamaño debe ser %d" @@ -146,10 +155,6 @@ msgstr "%q tamaño debe ser <= %d" msgid "%q length must be >= %d" msgstr "%q tamaño debe ser >= %d" -#: shared-bindings/busio/I2C.c -msgid "%q length must be >= 1" -msgstr "%q tamaño debe ser >= 1" - #: py/argcheck.c msgid "%q must be %d" msgstr "%q debe ser %d" @@ -171,37 +176,31 @@ msgid "%q must be >= %d" msgstr "%q debe ser >= %d" #: shared-bindings/analogbufio/BufferedIn.c +msgid "%q must be a bytearray or array of type 'H' or 'B'" +msgstr "%q debe ser un byte-matriz o matriz de tipo 'H' o 'B'" + #: shared-bindings/audiocore/RawSample.c msgid "%q must be a bytearray or array of type 'h', 'H', 'b', or 'B'" -msgstr "" +msgstr "%q debe ser un byte-matriz o matriz de tipo 'h', 'H', 'b', o 'B'" -#: py/argcheck.c -msgid "%q must be a string" -msgstr "%q debe ser una cadena" - -#: py/argcheck.c -msgid "%q must be an int" -msgstr "" - -#: py/argcheck.c +#: py/argcheck.c py/obj.c py/objstrunicode.c msgid "%q must be of type %q" -msgstr "" +msgstr "%q debe ser de typo %q" -#: shared-bindings/digitalio/Pull.c +#: py/objexcept.c shared-bindings/digitalio/Pull.c msgid "%q must be of type %q or None" -msgstr "" +msgstr "%q debe ser de tipo %q o None" #: ports/atmel-samd/common-hal/busio/UART.c msgid "%q must be power of 2" -msgstr "" +msgstr "%q debe ser potencia de 2" #: shared-bindings/wifi/Monitor.c msgid "%q out of bounds" -msgstr "" +msgstr "%q fuera de limites" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c #: ports/cxd56/common-hal/pulseio/PulseIn.c -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/nrf/common-hal/pulseio/PulseIn.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c @@ -213,9 +212,9 @@ msgstr "%q fuera de rango" msgid "%q pin invalid" msgstr "pin inválido %q" -#: shared-bindings/usb_hid/Device.c -msgid "%q with a report ID of 0 must be of length 1" -msgstr "" +#: py/objrange.c py/objslice.c shared-bindings/random/__init__.c +msgid "%q step cannot be zero" +msgstr "%q paso no puede ser cero" #: py/bc.c py/objnamedtuple.c msgid "%q() takes %d positional arguments but %d were given" @@ -223,11 +222,11 @@ msgstr "%q() toma %d argumentos posicionales pero %d fueron dados" #: shared-bindings/usb_hid/Device.c msgid "%q, %q, and %q must all be the same length" -msgstr "" +msgstr "%q, %q, y %q deben tener el mismo largo" #: py/objint.c shared-bindings/storage/__init__.c msgid "%q=%q" -msgstr "" +msgstr "%q=%q" #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c #, c-format @@ -314,7 +313,7 @@ msgstr "'%s' el objeto no tiene capacidad de asignación de item" msgid "'%s' object doesn't support item deletion" msgstr "'%s' el objeto no tiene capacidad de borrado de item" -#: ports/raspberrypi/common-hal/wifi/Radio.c py/runtime.c +#: py/runtime.c msgid "'%s' object has no attribute '%q'" msgstr "objeto '%s' no tiene atributo '%q'" @@ -414,6 +413,10 @@ msgstr "ADC2 está siendo usado por WiFi" msgid "Address must be %d bytes long" msgstr "La dirección debe tener %d bytes de largo" +#: ports/espressif/common-hal/memorymap/AddressRange.c +msgid "Address range not allowed" +msgstr "Rango de dirección no permitido" + #: ports/espressif/common-hal/canio/CAN.c msgid "All CAN peripherals are in use" msgstr "Todos los periféricos CAN están en uso" @@ -496,7 +499,7 @@ msgstr "Ya se encuentra publicando." msgid "Already have all-matches listener" msgstr "Ya se tiene un escucha de todas las coincidencias" -#: ports/espressif/common-hal/coproc/__init__.c +#: ports/espressif/common-hal/espulp/ULP.c #: shared-module/memorymonitor/AllocationAlarm.c #: shared-module/memorymonitor/AllocationSize.c msgid "Already running" @@ -507,6 +510,11 @@ msgstr "Ya está en ejecución" msgid "Already scanning for wifi networks" msgstr "Ya se están buscando redes wifi" +#: shared-module/os/getenv.c +#, c-format +msgid "An error occurred while retrieving '%s':\n" +msgstr "Un error ocurrió mientras recuperaba '%s':\n" + #: ports/stm/common-hal/audiopwmio/PWMAudioOut.c msgid "Another PWMAudioOut is already active" msgstr "Otra salida PWMAudioOut esta ya activada" @@ -520,15 +528,11 @@ msgstr "Otro envío ya está activo" msgid "Array must contain halfwords (type 'H')" msgstr "El array debe contener medias palabras (escriba 'H')" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Array values should be single bytes." msgstr "Valores del array deben ser bytes individuales." -#: shared-bindings/microcontroller/Pin.c -msgid "At most %d %q may be specified (not %d)" -msgstr "Como máximo %d %q se puede especificar (no %d)" - #: shared-module/memorymonitor/AllocationAlarm.c #, c-format msgid "Attempt to allocate %d blocks" @@ -540,7 +544,7 @@ msgstr "Asignación del montículo mientras la VM no esta ejecutándose." #: ports/raspberrypi/audio_dma.c msgid "Audio conversion not implemented" -msgstr "" +msgstr "Conversión de audio no esta implementada" #: shared-bindings/wifi/Radio.c msgid "AuthMode.OPEN is not used with password" @@ -585,11 +589,12 @@ msgstr "Bits depth debe ser múltiplo de 8." #: shared-bindings/bitmaptools/__init__.c msgid "Bitmap size and bits per value must match" -msgstr "" +msgstr "El tamaño del mapa de bits y los bits por valor deben cotejar" #: supervisor/shared/safe_mode.c msgid "Boot device must be first device (interface #0)." msgstr "" +"El dispositivo de arranque debe de ser el primer dispositivo (interfase #0)." #: ports/mimxrt10xx/common-hal/busio/UART.c msgid "Both RX and TX required for flow control" @@ -600,7 +605,7 @@ msgstr "Ambos RX y TX requeridos para control de flujo" #: ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.h #: ports/atmel-samd/boards/meowmeow/mpconfigboard.h msgid "Both buttons were pressed at start up.\n" -msgstr "" +msgstr "Ambos botones fueron prensados al inicio\n" #: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c msgid "Both pins must support hardware interrupts" @@ -630,17 +635,17 @@ msgstr "" #: shared-bindings/framebufferio/FramebufferDisplay.c msgid "Buffer is not a bytearray." -msgstr "Buffer no es un bytearray." +msgstr "Búfer no es un bytearray." #: ports/cxd56/common-hal/camera/Camera.c shared-bindings/displayio/Display.c #: shared-bindings/framebufferio/FramebufferDisplay.c msgid "Buffer is too small" -msgstr "El buffer es muy pequeño" +msgstr "Búfer es muy pequeño" #: ports/stm/common-hal/audiopwmio/PWMAudioOut.c #, c-format msgid "Buffer length %d too big. It must be less than %d" -msgstr "Longitud del buffer %d es demasiado grande. Tiene que ser menor a %d" +msgstr "Longitud del búfer %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 @@ -654,11 +659,11 @@ msgstr "Búfer deber ser un múltiplo de 512 bytes" #: shared-bindings/_bleio/PacketBuffer.c #, c-format msgid "Buffer too short by %d bytes" -msgstr "Búffer muy corto por %d bytes" +msgstr "Búfer muy corto por %d bytes" #: ports/espressif/common-hal/imagecapture/ParallelImageCapture.c msgid "Buffers must be same size" -msgstr "" +msgstr "Búferes deben ser del mismo tamaño" #: ports/atmel-samd/common-hal/paralleldisplay/ParallelBus.c #: ports/espressif/common-hal/paralleldisplay/ParallelBus.c @@ -671,7 +676,7 @@ msgstr "Bus pin %d ya está siendo utilizado" #: ports/espressif/boards/m5stack_core_basic/mpconfigboard.h #: ports/espressif/boards/m5stack_core_fire/mpconfigboard.h msgid "Button A was pressed at start up.\n" -msgstr "" +msgstr "Botón A fue presionado al inicio.\n" #: shared-bindings/_bleio/UUID.c msgid "Byte buffer must be 16 bytes." @@ -682,8 +687,9 @@ msgid "CBC blocks must be multiples of 16 bytes" msgstr "Los bloques CBC deben ser múltiplos de 16 bytes" #: supervisor/shared/safe_mode.c +#, fuzzy msgid "CIRCUITPY drive could not be found or created." -msgstr "" +msgstr "CIRCUITPY dispositivo de guardo no pudo ser encontrado o creado." #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "CRC or checksum was invalid" @@ -695,7 +701,7 @@ msgstr "Llame a super().__init__() antes de acceder al objeto nativo." #: ports/cxd56/common-hal/camera/Camera.c msgid "Camera init" -msgstr "" +msgstr "Inicialización de cámara" #: ports/espressif/common-hal/alarm/pin/PinAlarm.c msgid "Can only alarm on RTC IO from deep sleep." @@ -918,6 +924,10 @@ msgstr "" msgid "Drive mode not used when direction is input." msgstr "Modo Drive no se usa cuando la dirección es input." +#: py/obj.c +msgid "During handling of the above exception, another exception occurred:" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "ECB only operates on 16 bytes at a time" msgstr "ECB solo opera sobre 16 bytes a la vez" @@ -947,10 +957,10 @@ msgstr "Error en regex" msgid "Error: Failure to bind" msgstr "Error: fallo al vincular" -#: py/enum.c shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c -#: shared-bindings/alarm/__init__.c shared-bindings/alarm/coproc/CoprocAlarm.c -#: shared-bindings/busio/SPI.c shared-bindings/coproc/Coproc.c -#: shared-bindings/coproc/__init__.c shared-bindings/microcontroller/Pin.c +#: ports/espressif/bindings/espulp/ULP.c py/enum.c +#: shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c +#: shared-bindings/alarm/__init__.c shared-bindings/busio/SPI.c +#: shared-bindings/microcontroller/Pin.c #: shared-bindings/neopixel_write/__init__.c msgid "Expected a %q" msgstr "Se espera un %q" @@ -1035,6 +1045,10 @@ msgstr "Error grave." msgid "File exists" msgstr "El archivo ya existe" +#: shared-module/os/getenv.c +msgid "File not found" +msgstr "" + #: ports/atmel-samd/common-hal/canio/Listener.c #: ports/espressif/common-hal/canio/Listener.c #: ports/stm/common-hal/canio/Listener.c @@ -1049,7 +1063,6 @@ msgstr "" msgid "Firmware is invalid" msgstr "" -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/espressif/common-hal/dualbank/__init__.c msgid "Firmware is too big" msgstr "" @@ -1092,6 +1105,8 @@ msgstr "Fallo Genérico" #: shared-bindings/displayio/Display.c #: shared-bindings/displayio/EPaperDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c +#: shared-module/displayio/Display.c +#: shared-module/framebufferio/FramebufferDisplay.c msgid "Group already used" msgstr "Grupo ya está siendo utilizado" @@ -1227,6 +1242,7 @@ msgid "Internal define error" msgstr "Error interno de definición" #: ports/espressif/common-hal/paralleldisplay/ParallelBus.c +#: shared-module/os/getenv.c msgid "Internal error" msgstr "" @@ -1273,6 +1289,11 @@ msgstr "Argumento inválido" msgid "Invalid bits per value" msgstr "Inválido bits por valor" +#: shared-module/os/getenv.c +#, c-format +msgid "Invalid byte %.*s" +msgstr "" + #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #, c-format msgid "Invalid data_pins[%d]" @@ -1290,10 +1311,6 @@ msgstr "Acceso a memoria no válido." msgid "Invalid multicast MAC address" msgstr "" -#: shared-bindings/busio/UART.c -msgid "Invalid pins" -msgstr "pines inválidos" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Invalid size" msgstr "Tamaño incorrecto" @@ -1307,10 +1324,18 @@ msgstr "socket invalido para TLS" msgid "Invalid state" msgstr "Estado invalido" +#: shared-module/os/getenv.c +msgid "Invalid unicode escape" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "Key must be 16, 24, or 32 bytes long" msgstr "La llave debe tener 16, 24 o 32 bytes de longitud" +#: shared-module/os/getenv.c +msgid "Key not found" +msgstr "" + #: shared-module/is31fl3741/FrameBuffer.c msgid "LED mappings must match display size" msgstr "" @@ -1421,6 +1446,10 @@ msgstr "Salto NLR falló. Probablemente corrupción de memoria." msgid "NVS Error" msgstr "Error NVS" +#: shared-bindings/socketpool/SocketPool.c +msgid "Name or service not known" +msgstr "" + #: py/qstr.c msgid "Name too long" msgstr "Nombre muy largo" @@ -1535,11 +1564,6 @@ msgstr "No se especificó ninguna llave" msgid "No long integer support" msgstr "No hay soporte de entero largo" -#: shared-module/usb_hid/__init__.c -#, c-format -msgid "No more than %d HID devices allowed" -msgstr "No se permiten más de %d dispositivos HID permitidos" - #: shared-bindings/wifi/Radio.c msgid "No network with that ssid" msgstr "No hay una red con ese ssid" @@ -1670,11 +1694,14 @@ msgstr "" "Solo se admiten BMP monocromáticos, indexados de 4 bpp u 8 bpp y 16 bpp o " "más: %d bpp proporcionados" -#: ports/espressif/common-hal/alarm/coproc/CoprocAlarm.c #: ports/espressif/common-hal/alarm/touch/TouchAlarm.c msgid "Only one %q can be set in deep sleep." msgstr "" +#: ports/espressif/common-hal/espulp/ULPAlarm.c +msgid "Only one %q can be set." +msgstr "" + #: ports/espressif/common-hal/i2ctarget/I2CTarget.c #: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c msgid "Only one address is allowed" @@ -1707,6 +1734,10 @@ msgstr "Operación no característica no soportada" msgid "Operation timed out" msgstr "Tiempo de espera agotado" +#: ports/raspberrypi/common-hal/mdns/Server.c +msgid "Out of MDNS service slots" +msgstr "" + #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Out of memory" msgstr "Memoria agotada" @@ -1838,6 +1869,10 @@ msgstr "El programa hace OUT sin cargar OSR" msgid "Program size invalid" msgstr "El tamaño del programa no es correcto" +#: ports/espressif/common-hal/espulp/ULP.c +msgid "Program too long" +msgstr "" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." msgstr "Pull no se usa cuando la dirección es output." @@ -1878,7 +1913,7 @@ msgid "Random number generation error" msgstr "Error de generación de números aleatorios" #: shared-bindings/memorymonitor/AllocationSize.c -#: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/pulseio/PulseIn.c shared-module/displayio/Bitmap.c msgid "Read-only" msgstr "Solo-lectura" @@ -1886,10 +1921,6 @@ msgstr "Solo-lectura" msgid "Read-only filesystem" msgstr "Sistema de archivos de solo-Lectura" -#: shared-module/displayio/Bitmap.c -msgid "Read-only object" -msgstr "Objeto de solo-lectura" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Received response was invalid" msgstr "La respuesta recibida es invalida" @@ -1983,7 +2014,7 @@ msgstr "Sin capacidades para el tamaño" msgid "Sleep Memory not available" msgstr "Memoria de sueño no disponible" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Slice and value different lengths." msgstr "Slice y value tienen tamaños diferentes." @@ -2020,6 +2051,10 @@ msgstr "Estéreo izquierdo debe estar en el canal PWM A" msgid "Stereo right must be on PWM channel B" msgstr "Estéreo derecho debe estar en el canal PWM B" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Stopping AP is not supported." +msgstr "" + #: ports/mimxrt10xx/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "Supply at least one UART pin" msgstr "Suministre al menos un pin UART" @@ -2064,6 +2099,10 @@ msgstr "" "El módulo de `microcontroller` se usó para un arranque en modo seguro. " "Presione reset para salir del modo seguro." +#: py/obj.c +msgid "The above exception was the direct cause of the following exception:" +msgstr "" + #: ports/espressif/boards/m5stack_atom_lite/mpconfigboard.h msgid "The central button was pressed at start up.\n" msgstr "" @@ -2255,11 +2294,12 @@ msgid "Unable to read color palette data" msgstr "No se pudo leer los datos de la paleta de colores" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "Unable to start mDNS query" msgstr "" -#: shared-bindings/coproc/CoprocMemory.c -msgid "Unable to write" +#: shared-bindings/memorymap/AddressRange.c +msgid "Unable to write to address." msgstr "" #: shared-bindings/nvm/ByteArray.c @@ -2330,6 +2370,7 @@ msgid "Unkown error code %d" msgstr "" #: shared-bindings/adafruit_pixelbuf/PixelBuf.c +#: shared-module/_pixelmap/PixelMap.c #, c-format msgid "Unmatched number of items on RHS (expected %d, got %d)." msgstr "Número incomparable de elementos en RHS (%d esperado,%d obtenido)." @@ -2419,6 +2460,18 @@ msgstr "" msgid "Wi-Fi: " msgstr "" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in access point mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in station mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is not enabled" +msgstr "" + #: main.c msgid "Woken up by alarm.\n" msgstr "Despertado por la alarma.\n" @@ -2509,7 +2562,7 @@ msgid "array has too many dimensions" msgstr "" #: py/objarray.c shared-bindings/alarm/SleepMemory.c -#: shared-bindings/coproc/CoprocMemory.c shared-bindings/nvm/ByteArray.c +#: shared-bindings/memorymap/AddressRange.c shared-bindings/nvm/ByteArray.c msgid "array/bytes required on right side" msgstr "array/bytes requeridos en el lado derecho" @@ -2602,10 +2655,6 @@ msgstr "buffer demasiado pequeño" msgid "buffer too small for requested bytes" msgstr "búfer muy pequeño para los bytes solicitados" -#: shared-bindings/adafruit_pixelbuf/PixelBuf.c -msgid "byteorder is not a string" -msgstr "byteorder no es una cadena" - #: py/objarray.c msgid "bytes length not a multiple of item size" msgstr "el tamaño en bytes no es un múltiplo del tamaño del item" @@ -2647,14 +2696,10 @@ msgstr "no se puede asignar a la expresión" msgid "can't cancel self" msgstr "no se puede cancelar a si mismo" -#: py/obj.c py/objint.c shared-module/adafruit_pixelbuf/PixelBuf.c +#: py/obj.c py/objint.c py/runtime.c shared-module/adafruit_pixelbuf/PixelBuf.c msgid "can't convert %q to %q" msgstr "no puede convertir %q a %q" -#: py/runtime.c -msgid "can't convert %q to int" -msgstr "no se puede convertir %q a int" - #: py/obj.c #, c-format msgid "can't convert %s to complex" @@ -2737,6 +2782,10 @@ msgstr "no se puede definir un tamaño de bloque de 512" msgid "can't set attribute" msgstr "no se puede asignar el atributo" +#: py/runtime.c +msgid "can't set attribute '%q'" +msgstr "" + #: py/emitnative.c msgid "can't store '%q'" msgstr "no se puede almacenar '%q'" @@ -2843,10 +2892,6 @@ msgstr "color debe estar entre 0x000000 y 0xffffff" msgid "comparison of int and uint" msgstr "comparación entre int y uint" -#: py/objcomplex.c -msgid "complex division by zero" -msgstr "división compleja por cero" - #: py/objfloat.c py/parsenum.c msgid "complex values not supported" msgstr "valores complejos no soportados" @@ -2951,12 +2996,7 @@ msgstr "las dimensiones no concuerdan" msgid "div/mod not implemented for uint" msgstr "div/mod no implementado para uint" -#: py/objfloat.c py/objint_mpz.c -msgid "divide by zero" -msgstr "divide por cero" - -#: py/modmath.c py/objint_longlong.c py/runtime.c -#: shared-bindings/math/__init__.c +#: py/runtime.c msgid "division by zero" msgstr "división por cero" @@ -3113,10 +3153,6 @@ msgstr "font debe ser 2048 bytes de largo" msgid "format requires a dict" msgstr "format requiere un dict" -#: shared-bindings/microcontroller/Processor.c -msgid "frequency is read-only for this board" -msgstr "" - #: py/objdeque.c msgid "full" msgstr "lleno" @@ -3229,8 +3265,12 @@ msgstr "relleno (padding) incorrecto" msgid "index is out of bounds" msgstr "el índice está fuera de límites" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "index must be tuple or int" +msgstr "" + #: extmod/ulab/code/numpy/numerical.c extmod/ulab/code/ulab_tools.c -#: ports/espressif/common-hal/pulseio/PulseIn.c py/obj.c +#: ports/espressif/common-hal/pulseio/PulseIn.c #: shared-bindings/bitmaptools/__init__.c msgid "index out of range" msgstr "index fuera de rango" @@ -3328,10 +3368,6 @@ msgstr "los vectores de entrada deben ser de igual tamaño" 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" - #: extmod/ulab/code/numpy/approx.c msgid "interp is defined for 1D iterables of equal length" msgstr "interp está definido para iterables 1D de igual tamaño" @@ -3413,10 +3449,6 @@ msgstr "sintaxis inválida para entero con base %d" msgid "invalid syntax for number" msgstr "sintaxis inválida para número" -#: py/objexcept.c -msgid "invalid traceback" -msgstr "" - #: py/objtype.c msgid "issubclass() arg 1 must be a class" msgstr "issubclass() arg 1 debe ser una clase" @@ -3476,19 +3508,17 @@ msgstr "variable local '%q' usada antes del tipo conocido" msgid "local variable referenced before assignment" msgstr "variable local referenciada antes de la asignación" -#: py/objint.c -msgid "long int not supported in this build" -msgstr "long int no soportado en esta compilación" - #: ports/espressif/common-hal/canio/CAN.c msgid "loopback + silent mode not supported by peripheral" msgstr "Loopback + modo silencioso no están soportados por periférico" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS already initialized" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS only works with built-in WiFi" msgstr "" @@ -3618,6 +3648,10 @@ msgstr "potencia negativa sin float support" msgid "negative shift count" msgstr "cuenta de corrimientos negativo" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "nested index must be int" +msgstr "" + #: shared-module/sdcardio/SDCard.c msgid "no SD card" msgstr "no hay tarjeta SD" @@ -3800,7 +3834,7 @@ msgid "only sample_rate=16000 is supported" msgstr "solo se admite sample_rate=16000" #: py/objarray.c py/objstr.c py/objstrunicode.c py/objtuple.c -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "only slices with step=1 (aka None) are supported" msgstr "solo se admiten segmentos con step=1 (alias None)" @@ -4016,10 +4050,6 @@ msgstr "la longitud de sleep no puede ser negativa" msgid "slice step can't be zero" msgstr "el tamaño de la división no puede ser cero" -#: py/objslice.c -msgid "slice step cannot be zero" -msgstr "slice step no puede ser cero" - #: py/nativeglue.c msgid "slice unsupported" msgstr "sin capacidades para rebanado" @@ -4068,10 +4098,6 @@ msgstr "" msgid "start/end indices" msgstr "índices inicio/final" -#: shared-bindings/random/__init__.c -msgid "step must be non-zero" -msgstr "paso debe ser numero no cero" - #: shared-bindings/random/__init__.c msgid "stop not reachable from start" msgstr "stop no se puede alcanzar del principio" @@ -4080,10 +4106,6 @@ msgstr "stop no se puede alcanzar del principio" msgid "stream operation not supported" msgstr "operación stream no soportada" -#: py/objstrunicode.c -msgid "string indices must be integers, not %q" -msgstr "índices de cadena deben ser enteros, no %q" - #: py/stream.c msgid "string not supported; use bytes or bytearray" msgstr "string no soportado; usa bytes o bytearray" @@ -4116,10 +4138,6 @@ msgstr "error de sintaxis en JSON" msgid "syntax error in uctypes descriptor" msgstr "error de sintaxis en el descriptor uctypes" -#: shared-bindings/time/__init__.c -msgid "time.struct_time() takes a 9-sequence" -msgstr "time.struct_time() toma un sequencio 9" - #: ports/atmel-samd/common-hal/watchdog/WatchDogTimer.c #: ports/espressif/common-hal/watchdog/WatchDogTimer.c #: ports/nrf/common-hal/watchdog/WatchDogTimer.c @@ -4239,7 +4257,7 @@ msgstr "nombre en unicode escapa" #: py/parse.c msgid "unindent doesn't match any outer indent level" -msgstr "" +msgstr "unindent no coteja ningún nivel de espacio exterior" #: py/objstr.c #, c-format @@ -4261,7 +4279,7 @@ msgstr "tipo desconocido '%q'" #: py/objstr.c #, c-format msgid "unmatched '%c' in format" -msgstr "" +msgstr "no coteja '%c' en formato" #: py/objtype.c py/runtime.c msgid "unreadable attribute" @@ -4283,11 +4301,11 @@ msgstr "instrucción Xtensa '%s' con %d argumentos no soportada" #: shared-module/gifio/GifWriter.c msgid "unsupported colorspace for GifWriter" -msgstr "" +msgstr "espacio de color no soportado para GifWriter" #: shared-bindings/bitmaptools/__init__.c msgid "unsupported colorspace for dither" -msgstr "" +msgstr "espacio de color no soportado para tramado" #: py/objstr.c #, c-format @@ -4308,11 +4326,11 @@ msgstr "tipos no soportados para %q: '%q', '%q'" #: extmod/ulab/code/numpy/io/io.c msgid "usecols is too high" -msgstr "" +msgstr "usecols es muy alto" #: extmod/ulab/code/numpy/io/io.c msgid "usecols keyword must be specified" -msgstr "" +msgstr "usecols palabra clave debe de ser especificada" #: py/objint.c #, c-format @@ -4321,7 +4339,7 @@ msgstr "el valor debe caber en %d byte(s)" #: shared-bindings/bitmaptools/__init__.c msgid "value out of range of target" -msgstr "" +msgstr "valor fuera de alcance al blanco" #: shared-bindings/displayio/Bitmap.c msgid "value_count must be > 0" @@ -4342,7 +4360,7 @@ msgstr "wifi no esta habilitado" #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" -msgstr "" +msgstr "wifi.Monitor no esta disponible" #: shared-bindings/_bleio/Adapter.c msgid "window must be <= interval" @@ -4358,7 +4376,7 @@ msgstr "eje especificado erróneo" #: extmod/ulab/code/numpy/io/io.c msgid "wrong dtype" -msgstr "" +msgstr "erroneo dtype" #: extmod/ulab/code/numpy/transform.c msgid "wrong index type" @@ -4372,11 +4390,11 @@ msgstr "tipo de entrada incorrecta" #: extmod/ulab/code/numpy/transform.c msgid "wrong length of condition array" -msgstr "" +msgstr "largo erroneo en el arreglo de condiciones" #: extmod/ulab/code/numpy/transform.c msgid "wrong length of index array" -msgstr "" +msgstr "largo erroneo en el arreglo de índices" #: extmod/ulab/code/numpy/create.c py/objarray.c py/objstr.c msgid "wrong number of arguments" @@ -4402,10 +4420,6 @@ msgstr "fallo en xTaskCreate" msgid "y value out of bounds" msgstr "valor y fuera de límites" -#: py/objrange.c -msgid "zero step" -msgstr "paso cero" - #: extmod/ulab/code/scipy/signal/signal.c msgid "zi must be an ndarray" msgstr "zi debe ser un ndarray" @@ -4418,6 +4432,58 @@ 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 "Read-only object" +#~ msgstr "Objeto de solo-lectura" + +#~ msgid "%q length must be >= 1" +#~ msgstr "%q tamaño debe ser >= 1" + +#~ msgid "%q must be a string" +#~ msgstr "%q debe ser una cadena" + +#~ msgid "At most %d %q may be specified (not %d)" +#~ msgstr "Como máximo %d %q se puede especificar (no %d)" + +#~ msgid "Invalid pins" +#~ msgstr "pines inválidos" + +#, c-format +#~ msgid "No more than %d HID devices allowed" +#~ msgstr "No se permiten más de %d dispositivos HID permitidos" + +#~ msgid "byteorder is not a string" +#~ msgstr "byteorder no es una cadena" + +#~ msgid "can't convert %q to int" +#~ msgstr "no se puede convertir %q a int" + +#~ msgid "complex division by zero" +#~ msgstr "división compleja por cero" + +#~ msgid "divide by zero" +#~ msgstr "divide por cero" + +#~ msgid "int() arg 2 must be >= 2 and <= 36" +#~ msgstr "int() arg 2 debe ser >= 2 y <= 36" + +#~ msgid "long int not supported in this build" +#~ msgstr "long int no soportado en esta compilación" + +#~ msgid "slice step cannot be zero" +#~ msgstr "slice step no puede ser cero" + +#~ msgid "step must be non-zero" +#~ msgstr "paso debe ser numero no cero" + +#~ msgid "string indices must be integers, not %q" +#~ msgstr "índices de cadena deben ser enteros, no %q" + +#~ msgid "time.struct_time() takes a 9-sequence" +#~ msgstr "time.struct_time() toma un sequencio 9" + +#~ msgid "zero step" +#~ msgstr "paso cero" + #~ msgid "%q indices must be integers, not %s" #~ msgstr "%q indices deben ser enteros, no %s" diff --git a/locale/fil.po b/locale/fil.po index f1e363b149..7a77dab021 100644 --- a/locale/fil.po +++ b/locale/fil.po @@ -6,8 +6,8 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-01-04 12:55-0600\n" -"PO-Revision-Date: 2021-08-23 14:19+0000\n" -"Last-Translator: Jeff Epler \n" +"PO-Revision-Date: 2022-12-27 18:02+0000\n" +"Last-Translator: Blinka CircuitPython \n" "Language-Team: fil\n" "Language: fil\n" "MIME-Version: 1.0\n" @@ -15,7 +15,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1 && n != 2 && n != 3 && (n % 10 == 4 " "|| n % 10 == 6 || n % 10 == 9);\n" -"X-Generator: Weblate 4.8.1-dev\n" +"X-Generator: Weblate 4.15.1-dev\n" #: main.c msgid "" @@ -66,6 +66,11 @@ msgstr "%%c nangangailangan ng int o char" msgid "%02X" msgstr "" +#: shared-module/os/getenv.c +#, c-format +msgid "%S" +msgstr "%S" + #: shared-bindings/rgbmatrix/RGBMatrix.c #, c-format msgid "" @@ -101,13 +106,14 @@ msgstr "" msgid "%q failure: %d" msgstr "" +#: ports/espressif/common-hal/espulp/ULP.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/microcontroller/Pin.c msgid "%q in use" msgstr "%q ay ginagamit" -#: py/obj.c py/objstr.c py/objstrunicode.c +#: py/objstr.c py/objstrunicode.c msgid "%q index out of range" msgstr "%q indeks wala sa sakop" @@ -119,7 +125,11 @@ msgstr "" msgid "%q is %q" msgstr "" -#: py/argcheck.c +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "%q is read-only for this board" +msgstr "" + +#: py/argcheck.c shared-bindings/usb_hid/Device.c msgid "%q length must be %d" msgstr "" @@ -135,10 +145,6 @@ msgstr "" msgid "%q length must be >= %d" msgstr "" -#: shared-bindings/busio/I2C.c -msgid "%q length must be >= 1" -msgstr "" - #: py/argcheck.c msgid "%q must be %d" msgstr "" @@ -160,23 +166,18 @@ msgid "%q must be >= %d" msgstr "" #: shared-bindings/analogbufio/BufferedIn.c +msgid "%q must be a bytearray or array of type 'H' or 'B'" +msgstr "" + #: shared-bindings/audiocore/RawSample.c msgid "%q must be a bytearray or array of type 'h', 'H', 'b', or 'B'" msgstr "" -#: py/argcheck.c -msgid "%q must be a string" -msgstr "" - -#: py/argcheck.c -msgid "%q must be an int" -msgstr "" - -#: py/argcheck.c +#: py/argcheck.c py/obj.c py/objstrunicode.c msgid "%q must be of type %q" msgstr "" -#: shared-bindings/digitalio/Pull.c +#: py/objexcept.c shared-bindings/digitalio/Pull.c msgid "%q must be of type %q or None" msgstr "" @@ -190,7 +191,6 @@ msgstr "" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c #: ports/cxd56/common-hal/pulseio/PulseIn.c -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/nrf/common-hal/pulseio/PulseIn.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c @@ -202,8 +202,8 @@ msgstr "" msgid "%q pin invalid" msgstr "" -#: shared-bindings/usb_hid/Device.c -msgid "%q with a report ID of 0 must be of length 1" +#: py/objrange.c py/objslice.c shared-bindings/random/__init__.c +msgid "%q step cannot be zero" msgstr "" #: py/bc.c py/objnamedtuple.c @@ -282,7 +282,7 @@ msgstr "Inaasahan ng '%s' ang hangang r%d" #: py/emitinlinethumb.c #, c-format msgid "'%s' expects {r0, r1, ...}" -msgstr "Inaasahan ng '%s' ay {r0, r1, …}" +msgstr "Inaasahan ng '%s' ay {r0, r1, ...}" #: py/emitinlinextensa.c #, c-format @@ -304,7 +304,7 @@ msgstr "" msgid "'%s' object doesn't support item deletion" msgstr "" -#: ports/raspberrypi/common-hal/wifi/Radio.c py/runtime.c +#: py/runtime.c msgid "'%s' object has no attribute '%q'" msgstr "'%s' object ay walang attribute '%q'" @@ -404,6 +404,10 @@ msgstr "" msgid "Address must be %d bytes long" msgstr "ang palette ay dapat 32 bytes ang haba" +#: ports/espressif/common-hal/memorymap/AddressRange.c +msgid "Address range not allowed" +msgstr "" + #: ports/espressif/common-hal/canio/CAN.c msgid "All CAN peripherals are in use" msgstr "" @@ -485,7 +489,7 @@ msgstr "" msgid "Already have all-matches listener" msgstr "" -#: ports/espressif/common-hal/coproc/__init__.c +#: ports/espressif/common-hal/espulp/ULP.c #: shared-module/memorymonitor/AllocationAlarm.c #: shared-module/memorymonitor/AllocationSize.c msgid "Already running" @@ -496,6 +500,11 @@ msgstr "" msgid "Already scanning for wifi networks" msgstr "" +#: shared-module/os/getenv.c +#, c-format +msgid "An error occurred while retrieving '%s':\n" +msgstr "" + #: ports/stm/common-hal/audiopwmio/PWMAudioOut.c msgid "Another PWMAudioOut is already active" msgstr "" @@ -509,15 +518,11 @@ msgstr "Isa pang send ay aktibo na" msgid "Array must contain halfwords (type 'H')" msgstr "May halfwords (type 'H') dapat ang array" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Array values should be single bytes." msgstr "Array values ay dapat single bytes." -#: shared-bindings/microcontroller/Pin.c -msgid "At most %d %q may be specified (not %d)" -msgstr "" - #: shared-module/memorymonitor/AllocationAlarm.c #, c-format msgid "Attempt to allocate %d blocks" @@ -904,6 +909,10 @@ msgstr "" msgid "Drive mode not used when direction is input." msgstr "Drive mode ay hindi ginagamit kapag ang direksyon ay input." +#: py/obj.c +msgid "During handling of the above exception, another exception occurred:" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "ECB only operates on 16 bytes at a time" msgstr "" @@ -933,10 +942,10 @@ msgstr "May pagkakamali sa REGEX" msgid "Error: Failure to bind" msgstr "" -#: py/enum.c shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c -#: shared-bindings/alarm/__init__.c shared-bindings/alarm/coproc/CoprocAlarm.c -#: shared-bindings/busio/SPI.c shared-bindings/coproc/Coproc.c -#: shared-bindings/coproc/__init__.c shared-bindings/microcontroller/Pin.c +#: ports/espressif/bindings/espulp/ULP.c py/enum.c +#: shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c +#: shared-bindings/alarm/__init__.c shared-bindings/busio/SPI.c +#: shared-bindings/microcontroller/Pin.c #: shared-bindings/neopixel_write/__init__.c msgid "Expected a %q" msgstr "Umasa ng %q" @@ -1021,6 +1030,10 @@ msgstr "" msgid "File exists" msgstr "Mayroong file" +#: shared-module/os/getenv.c +msgid "File not found" +msgstr "" + #: ports/atmel-samd/common-hal/canio/Listener.c #: ports/espressif/common-hal/canio/Listener.c #: ports/stm/common-hal/canio/Listener.c @@ -1035,7 +1048,6 @@ msgstr "" msgid "Firmware is invalid" msgstr "" -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/espressif/common-hal/dualbank/__init__.c msgid "Firmware is too big" msgstr "" @@ -1077,6 +1089,8 @@ msgstr "" #: shared-bindings/displayio/Display.c #: shared-bindings/displayio/EPaperDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c +#: shared-module/displayio/Display.c +#: shared-module/framebufferio/FramebufferDisplay.c msgid "Group already used" msgstr "" @@ -1205,6 +1219,7 @@ msgid "Internal define error" msgstr "" #: ports/espressif/common-hal/paralleldisplay/ParallelBus.c +#: shared-module/os/getenv.c msgid "Internal error" msgstr "" @@ -1251,6 +1266,11 @@ msgstr "Maling argumento" msgid "Invalid bits per value" msgstr "" +#: shared-module/os/getenv.c +#, c-format +msgid "Invalid byte %.*s" +msgstr "" + #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #, c-format msgid "Invalid data_pins[%d]" @@ -1268,10 +1288,6 @@ msgstr "" msgid "Invalid multicast MAC address" msgstr "" -#: shared-bindings/busio/UART.c -msgid "Invalid pins" -msgstr "Mali ang pins" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Invalid size" msgstr "" @@ -1285,10 +1301,18 @@ msgstr "" msgid "Invalid state" msgstr "" +#: shared-module/os/getenv.c +msgid "Invalid unicode escape" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "Key must be 16, 24, or 32 bytes long" msgstr "" +#: shared-module/os/getenv.c +msgid "Key not found" +msgstr "" + #: shared-module/is31fl3741/FrameBuffer.c msgid "LED mappings must match display size" msgstr "" @@ -1395,6 +1419,10 @@ msgstr "" msgid "NVS Error" msgstr "" +#: shared-bindings/socketpool/SocketPool.c +msgid "Name or service not known" +msgstr "" + #: py/qstr.c msgid "Name too long" msgstr "" @@ -1509,11 +1537,6 @@ msgstr "" msgid "No long integer support" msgstr "" -#: shared-module/usb_hid/__init__.c -#, c-format -msgid "No more than %d HID devices allowed" -msgstr "" - #: shared-bindings/wifi/Radio.c msgid "No network with that ssid" msgstr "" @@ -1641,11 +1664,14 @@ msgid "" "%d bpp given" msgstr "" -#: ports/espressif/common-hal/alarm/coproc/CoprocAlarm.c #: ports/espressif/common-hal/alarm/touch/TouchAlarm.c msgid "Only one %q can be set in deep sleep." msgstr "" +#: ports/espressif/common-hal/espulp/ULPAlarm.c +msgid "Only one %q can be set." +msgstr "" + #: ports/espressif/common-hal/i2ctarget/I2CTarget.c #: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c msgid "Only one address is allowed" @@ -1678,6 +1704,10 @@ msgstr "" msgid "Operation timed out" msgstr "" +#: ports/raspberrypi/common-hal/mdns/Server.c +msgid "Out of MDNS service slots" +msgstr "" + #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Out of memory" msgstr "" @@ -1802,6 +1832,10 @@ msgstr "" msgid "Program size invalid" msgstr "" +#: ports/espressif/common-hal/espulp/ULP.c +msgid "Program too long" +msgstr "" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." msgstr "Pull hindi ginagamit kapag ang direksyon ay output." @@ -1842,7 +1876,7 @@ msgid "Random number generation error" msgstr "" #: shared-bindings/memorymonitor/AllocationSize.c -#: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/pulseio/PulseIn.c shared-module/displayio/Bitmap.c msgid "Read-only" msgstr "Basahin-lamang" @@ -1850,11 +1884,6 @@ msgstr "Basahin-lamang" msgid "Read-only filesystem" msgstr "Basahin-lamang mode" -#: shared-module/displayio/Bitmap.c -#, fuzzy -msgid "Read-only object" -msgstr "Basahin-lamang" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Received response was invalid" msgstr "" @@ -1947,7 +1976,7 @@ msgstr "" msgid "Sleep Memory not available" msgstr "" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Slice and value different lengths." msgstr "Slice at value iba't ibang haba." @@ -1984,6 +2013,10 @@ msgstr "" msgid "Stereo right must be on PWM channel B" msgstr "" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Stopping AP is not supported." +msgstr "" + #: ports/mimxrt10xx/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "Supply at least one UART pin" msgstr "" @@ -2024,6 +2057,10 @@ msgid "" "exit safe mode." msgstr "" +#: py/obj.c +msgid "The above exception was the direct cause of the following exception:" +msgstr "" + #: ports/espressif/boards/m5stack_atom_lite/mpconfigboard.h msgid "The central button was pressed at start up.\n" msgstr "" @@ -2209,11 +2246,12 @@ msgid "Unable to read color palette data" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "Unable to start mDNS query" msgstr "" -#: shared-bindings/coproc/CoprocMemory.c -msgid "Unable to write" +#: shared-bindings/memorymap/AddressRange.c +msgid "Unable to write to address." msgstr "" #: shared-bindings/nvm/ByteArray.c @@ -2285,6 +2323,7 @@ msgid "Unkown error code %d" msgstr "" #: shared-bindings/adafruit_pixelbuf/PixelBuf.c +#: shared-module/_pixelmap/PixelMap.c #, c-format msgid "Unmatched number of items on RHS (expected %d, got %d)." msgstr "" @@ -2370,6 +2409,18 @@ msgstr "" msgid "Wi-Fi: " msgstr "" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in access point mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in station mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is not enabled" +msgstr "" + #: main.c msgid "Woken up by alarm.\n" msgstr "" @@ -2458,7 +2509,7 @@ msgid "array has too many dimensions" msgstr "" #: py/objarray.c shared-bindings/alarm/SleepMemory.c -#: shared-bindings/coproc/CoprocMemory.c shared-bindings/nvm/ByteArray.c +#: shared-bindings/memorymap/AddressRange.c shared-bindings/nvm/ByteArray.c msgid "array/bytes required on right side" msgstr "array/bytes kinakailangan sa kanang bahagi" @@ -2552,10 +2603,6 @@ msgstr "masyadong maliit ang buffer" msgid "buffer too small for requested bytes" msgstr "" -#: shared-bindings/adafruit_pixelbuf/PixelBuf.c -msgid "byteorder is not a string" -msgstr "" - #: py/objarray.c msgid "bytes length not a multiple of item size" msgstr "" @@ -2598,14 +2645,10 @@ msgstr "hindi ma i-assign sa expression" msgid "can't cancel self" msgstr "" -#: py/obj.c py/objint.c shared-module/adafruit_pixelbuf/PixelBuf.c +#: py/obj.c py/objint.c py/runtime.c shared-module/adafruit_pixelbuf/PixelBuf.c msgid "can't convert %q to %q" msgstr "" -#: py/runtime.c -msgid "can't convert %q to int" -msgstr "" - #: py/obj.c #, c-format msgid "can't convert %s to complex" @@ -2688,6 +2731,10 @@ msgstr "" msgid "can't set attribute" msgstr "hindi ma i-set ang attribute" +#: py/runtime.c +msgid "can't set attribute '%q'" +msgstr "" + #: py/emitnative.c msgid "can't store '%q'" msgstr "hindi ma i-store ang '%q'" @@ -2784,7 +2831,7 @@ msgstr "" #: shared-bindings/displayio/Palette.c msgid "color buffer must be a bytearray or array of type 'b' or 'B'" -msgstr "ang color buffer ay dapat bytearray o array na type ‘b’ or ‘B’" +msgstr "ang color buffer ay dapat bytearray o array na type 'b' or 'B'" #: shared-bindings/displayio/Palette.c msgid "color must be between 0x000000 and 0xffffff" @@ -2794,10 +2841,6 @@ msgstr "color ay dapat mula sa 0x000000 hangang 0xffffff" msgid "comparison of int and uint" msgstr "" -#: py/objcomplex.c -msgid "complex division by zero" -msgstr "kumplikadong dibisyon sa pamamagitan ng zero" - #: py/objfloat.c py/parsenum.c msgid "complex values not supported" msgstr "kumplikadong values hindi sinusuportahan" @@ -2904,12 +2947,7 @@ msgstr "" msgid "div/mod not implemented for uint" msgstr "" -#: py/objfloat.c py/objint_mpz.c -msgid "divide by zero" -msgstr "" - -#: py/modmath.c py/objint_longlong.c py/runtime.c -#: shared-bindings/math/__init__.c +#: py/runtime.c msgid "division by zero" msgstr "dibisyon ng zero" @@ -3066,10 +3104,6 @@ msgstr "font ay dapat 2048 bytes ang haba" msgid "format requires a dict" msgstr "kailangan ng format ng dict" -#: shared-bindings/microcontroller/Processor.c -msgid "frequency is read-only for this board" -msgstr "" - #: py/objdeque.c msgid "full" msgstr "puno" @@ -3183,8 +3217,12 @@ msgstr "mali ang padding" msgid "index is out of bounds" msgstr "" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "index must be tuple or int" +msgstr "" + #: extmod/ulab/code/numpy/numerical.c extmod/ulab/code/ulab_tools.c -#: ports/espressif/common-hal/pulseio/PulseIn.c py/obj.c +#: ports/espressif/common-hal/pulseio/PulseIn.c #: shared-bindings/bitmaptools/__init__.c msgid "index out of range" msgstr "index wala sa sakop" @@ -3282,10 +3320,6 @@ msgstr "" 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" - #: extmod/ulab/code/numpy/approx.c msgid "interp is defined for 1D iterables of equal length" msgstr "" @@ -3367,10 +3401,6 @@ msgstr "maling sintaks sa integer na may base %d" msgid "invalid syntax for number" msgstr "maling sintaks sa number" -#: py/objexcept.c -msgid "invalid traceback" -msgstr "" - #: py/objtype.c msgid "issubclass() arg 1 must be a class" msgstr "issubclass() arg 1 ay dapat na class" @@ -3431,19 +3461,17 @@ msgstr "local '%q' ginamit bago alam ang type" msgid "local variable referenced before assignment" msgstr "local variable na reference bago na i-assign" -#: py/objint.c -msgid "long int not supported in this build" -msgstr "long int hindi sinusuportahan sa build na ito" - #: ports/espressif/common-hal/canio/CAN.c msgid "loopback + silent mode not supported by peripheral" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS already initialized" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS only works with built-in WiFi" msgstr "" @@ -3572,6 +3600,10 @@ msgstr "negatibong power na walang float support" msgid "negative shift count" msgstr "negative shift count" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "nested index must be int" +msgstr "" + #: shared-module/sdcardio/SDCard.c msgid "no SD card" msgstr "" @@ -3752,7 +3784,7 @@ msgid "only sample_rate=16000 is supported" msgstr "" #: py/objarray.c py/objstr.c py/objstrunicode.c py/objtuple.c -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "only slices with step=1 (aka None) are supported" msgstr "ang mga slices lamang na may hakbang = 1 (aka None) ang sinusuportahan" @@ -3904,7 +3936,7 @@ msgstr "return annotation ay dapat na identifier" #: py/emitnative.c msgid "return expected '%q' but got '%q'" -msgstr "return umasa ng '%q' pero ang nakuha ay ‘%q’" +msgstr "return umasa ng '%q' pero ang nakuha ay '%q'" #: shared-bindings/rgbmatrix/RGBMatrix.c #, c-format @@ -3969,10 +4001,6 @@ msgstr "sleep length ay dapat hindi negatibo" msgid "slice step can't be zero" msgstr "" -#: py/objslice.c -msgid "slice step cannot be zero" -msgstr "slice step ay hindi puedeng 0" - #: py/nativeglue.c msgid "slice unsupported" msgstr "" @@ -4021,10 +4049,6 @@ msgstr "" msgid "start/end indices" msgstr "start/end indeks" -#: shared-bindings/random/__init__.c -msgid "step must be non-zero" -msgstr "step ay dapat hindi zero" - #: shared-bindings/random/__init__.c msgid "stop not reachable from start" msgstr "stop hindi maabot sa simula" @@ -4033,10 +4057,6 @@ msgstr "stop hindi maabot sa simula" msgid "stream operation not supported" msgstr "stream operation hindi sinusuportahan" -#: py/objstrunicode.c -msgid "string indices must be integers, not %q" -msgstr "" - #: py/stream.c msgid "string not supported; use bytes or bytearray" msgstr "string hindi supportado; gumamit ng bytes o kaya bytearray" @@ -4069,10 +4089,6 @@ msgstr "sintaks error sa JSON" msgid "syntax error in uctypes descriptor" msgstr "may pagkakamali sa sintaks sa uctypes descriptor" -#: shared-bindings/time/__init__.c -msgid "time.struct_time() takes a 9-sequence" -msgstr "time.struct_time() kumukuha ng 9-sequence" - #: ports/atmel-samd/common-hal/watchdog/WatchDogTimer.c #: ports/espressif/common-hal/watchdog/WatchDogTimer.c #: ports/nrf/common-hal/watchdog/WatchDogTimer.c @@ -4356,10 +4372,6 @@ msgstr "" msgid "y value out of bounds" msgstr "wala sa sakop ang address" -#: py/objrange.c -msgid "zero step" -msgstr "zero step" - #: extmod/ulab/code/scipy/signal/signal.c msgid "zi must be an ndarray" msgstr "" @@ -4372,6 +4384,34 @@ msgstr "" msgid "zi must be of shape (n_section, 2)" msgstr "" +#, fuzzy +#~ msgid "Read-only object" +#~ msgstr "Basahin-lamang" + +#~ msgid "Invalid pins" +#~ msgstr "Mali ang pins" + +#~ msgid "complex division by zero" +#~ msgstr "kumplikadong dibisyon sa pamamagitan ng zero" + +#~ msgid "int() arg 2 must be >= 2 and <= 36" +#~ msgstr "int() arg 2 ay dapat >=2 at <= 36" + +#~ msgid "long int not supported in this build" +#~ msgstr "long int hindi sinusuportahan sa build na ito" + +#~ msgid "slice step cannot be zero" +#~ msgstr "slice step ay hindi puedeng 0" + +#~ msgid "step must be non-zero" +#~ msgstr "step ay dapat hindi zero" + +#~ msgid "time.struct_time() takes a 9-sequence" +#~ msgstr "time.struct_time() kumukuha ng 9-sequence" + +#~ msgid "zero step" +#~ msgstr "zero step" + #~ msgid "%q indices must be integers, not %s" #~ msgstr "%q indeks ay dapat integers, hindi %s" @@ -4614,7 +4654,7 @@ msgstr "" #~ "Mangyaring bisitahin ang learn.adafruit.com/category/circuitpython para " #~ "sa project guides.\n" #~ "\n" -#~ "Para makita ang listahan ng modules, `help(“modules”)`.\n" +#~ "Para makita ang listahan ng modules, `help(\"modules\")`.\n" #~ msgid "integer required" #~ msgstr "kailangan ng int" diff --git a/locale/fr.po b/locale/fr.po index 2a4d6b230f..910c11cf57 100644 --- a/locale/fr.po +++ b/locale/fr.po @@ -8,14 +8,14 @@ msgstr "" "Project-Id-Version: 0.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-01-04 12:55-0600\n" -"PO-Revision-Date: 2022-11-09 19:20+0000\n" -"Last-Translator: Deleted User \n" +"PO-Revision-Date: 2022-12-27 18:02+0000\n" +"Last-Translator: Blinka CircuitPython \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.15-dev\n" +"X-Generator: Weblate 4.15.1-dev\n" #: main.c msgid "" @@ -75,6 +75,11 @@ msgstr "%%c nécessite un chiffre entier 'int' ou un caractère 'char'" msgid "%02X" msgstr "%02X" +#: shared-module/os/getenv.c +#, c-format +msgid "%S" +msgstr "%S" + #: shared-bindings/rgbmatrix/RGBMatrix.c #, c-format msgid "" @@ -112,13 +117,14 @@ msgstr "%q contient des broches en double" msgid "%q failure: %d" msgstr "Échec de %q : %d" +#: ports/espressif/common-hal/espulp/ULP.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/microcontroller/Pin.c msgid "%q in use" msgstr "%q en cours d'utilisation" -#: py/obj.c py/objstr.c py/objstrunicode.c +#: py/objstr.c py/objstrunicode.c msgid "%q index out of range" msgstr "index %q hors de portée" @@ -130,7 +136,11 @@ msgstr "échec de l'initialisation %q" msgid "%q is %q" msgstr "" -#: py/argcheck.c +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "%q is read-only for this board" +msgstr "" + +#: py/argcheck.c shared-bindings/usb_hid/Device.c msgid "%q length must be %d" msgstr "La longeur de %q doit être %d" @@ -146,10 +156,6 @@ msgstr "La longeur de %q doit être <= %d" msgid "%q length must be >= %d" msgstr "La longeur de %q doit être >= %d" -#: shared-bindings/busio/I2C.c -msgid "%q length must be >= 1" -msgstr "La longueur de %q doit être >= 1" - #: py/argcheck.c msgid "%q must be %d" msgstr "%q doit être %d" @@ -171,23 +177,18 @@ msgid "%q must be >= %d" msgstr "%q doit être >= %d" #: shared-bindings/analogbufio/BufferedIn.c +msgid "%q must be a bytearray or array of type 'H' or 'B'" +msgstr "" + #: shared-bindings/audiocore/RawSample.c msgid "%q must be a bytearray or array of type 'h', 'H', 'b', or 'B'" msgstr "%q doit être a bytearray ou array de type 'h', 'H', 'b', ou 'B'" -#: py/argcheck.c -msgid "%q must be a string" -msgstr "%q doit être une chaîne de caractères" - -#: py/argcheck.c -msgid "%q must be an int" -msgstr "%q doit être un entier" - -#: py/argcheck.c +#: py/argcheck.c py/obj.c py/objstrunicode.c msgid "%q must be of type %q" msgstr "%q doit être du type %q" -#: shared-bindings/digitalio/Pull.c +#: py/objexcept.c shared-bindings/digitalio/Pull.c msgid "%q must be of type %q or None" msgstr "%q doit être du type %q ou None" @@ -201,7 +202,6 @@ msgstr "%q est hors limites" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c #: ports/cxd56/common-hal/pulseio/PulseIn.c -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/nrf/common-hal/pulseio/PulseIn.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c @@ -213,9 +213,9 @@ msgstr "%q est hors de porté" msgid "%q pin invalid" msgstr "broche %q invalide" -#: shared-bindings/usb_hid/Device.c -msgid "%q with a report ID of 0 must be of length 1" -msgstr "%q avec un identifiant de rapport à 0 doit être de longueur 1" +#: py/objrange.c py/objslice.c shared-bindings/random/__init__.c +msgid "%q step cannot be zero" +msgstr "" #: py/bc.c py/objnamedtuple.c msgid "%q() takes %d positional arguments but %d were given" @@ -314,7 +314,7 @@ msgstr "l'objet %s ne supporte pas l'assignation d'éléments" msgid "'%s' object doesn't support item deletion" msgstr "L'objet '%s' ne prend pas en charge la suppression d'éléments" -#: ports/raspberrypi/common-hal/wifi/Radio.c py/runtime.c +#: py/runtime.c msgid "'%s' object has no attribute '%q'" msgstr "l'objet '%s' n'a pas d'attribut '%q'" @@ -414,6 +414,10 @@ msgstr "ADC2 est utilisé pars le Wifi" msgid "Address must be %d bytes long" msgstr "L'adresse doit être longue de %d octets" +#: ports/espressif/common-hal/memorymap/AddressRange.c +msgid "Address range not allowed" +msgstr "" + #: ports/espressif/common-hal/canio/CAN.c msgid "All CAN peripherals are in use" msgstr "Tous les périphériques CAN sont utilisés" @@ -494,7 +498,7 @@ msgstr "S'annonce déjà." msgid "Already have all-matches listener" msgstr "Il y a déjà un auditeur all-matches" -#: ports/espressif/common-hal/coproc/__init__.c +#: ports/espressif/common-hal/espulp/ULP.c #: shared-module/memorymonitor/AllocationAlarm.c #: shared-module/memorymonitor/AllocationSize.c msgid "Already running" @@ -505,6 +509,11 @@ msgstr "Déjà en cours d'exécution" msgid "Already scanning for wifi networks" msgstr "Déjà à la recherche des réseaux wifi" +#: shared-module/os/getenv.c +#, c-format +msgid "An error occurred while retrieving '%s':\n" +msgstr "" + #: ports/stm/common-hal/audiopwmio/PWMAudioOut.c msgid "Another PWMAudioOut is already active" msgstr "Un autre PWMAudioOut est déjà actif" @@ -518,15 +527,11 @@ msgstr "Un autre envoi est déjà actif" msgid "Array must contain halfwords (type 'H')" msgstr "La matrice doit contenir des demi-mots (type 'H')" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Array values should be single bytes." msgstr "Les valeurs de la matrice doivent être des octets singuliers." -#: shared-bindings/microcontroller/Pin.c -msgid "At most %d %q may be specified (not %d)" -msgstr "Au plus %d %q peut être spécifié (pas %d)" - #: shared-module/memorymonitor/AllocationAlarm.c #, c-format msgid "Attempt to allocate %d blocks" @@ -684,7 +689,7 @@ msgstr "Les blocs CBC doivent être des multiples de 16 octets" #: supervisor/shared/safe_mode.c msgid "CIRCUITPY drive could not be found or created." -msgstr "L’appareil CIRCUITPY ne peut pas être trouvé ou créé." +msgstr "L'appareil CIRCUITPY ne peut pas être trouvé ou créé." #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "CRC or checksum was invalid" @@ -842,11 +847,11 @@ msgstr "Fichier .mpy corrompu" #: ports/espressif/common-hal/neopixel_write/__init__.c msgid "Could not retrieve clock" -msgstr "Impossible d’obtenir l’horloge" +msgstr "Impossible d'obtenir l'horloge" #: shared-bindings/_bleio/Adapter.c msgid "Could not set address" -msgstr "Impossible de définir l’adresse" +msgstr "Impossible de définir l'adresse" #: shared-bindings/pwmio/PWMOut.c msgid "Could not start PWM" @@ -928,6 +933,10 @@ msgid "Drive mode not used when direction is input." msgstr "" "Le mode Drive n'est pas utilisé quand la direction est entrante ('input')." +#: py/obj.c +msgid "During handling of the above exception, another exception occurred:" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "ECB only operates on 16 bytes at a time" msgstr "La BCE ne fonctionne que sur 16 octets à la fois" @@ -957,10 +966,10 @@ msgstr "Erreur dans l'expression régulière" msgid "Error: Failure to bind" msgstr "Erreur : Impossible de lier" -#: py/enum.c shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c -#: shared-bindings/alarm/__init__.c shared-bindings/alarm/coproc/CoprocAlarm.c -#: shared-bindings/busio/SPI.c shared-bindings/coproc/Coproc.c -#: shared-bindings/coproc/__init__.c shared-bindings/microcontroller/Pin.c +#: ports/espressif/bindings/espulp/ULP.c py/enum.c +#: shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c +#: shared-bindings/alarm/__init__.c shared-bindings/busio/SPI.c +#: shared-bindings/microcontroller/Pin.c #: shared-bindings/neopixel_write/__init__.c msgid "Expected a %q" msgstr "Attendu un %q" @@ -1006,7 +1015,7 @@ msgstr "Échec d'allocation du tampon %q" #: ports/espressif/common-hal/wifi/__init__.c msgid "Failed to allocate Wifi memory" -msgstr "Impossible d’allouer la mémoire pour Wifi" +msgstr "Impossible d'allouer la mémoire pour Wifi" #: ports/espressif/common-hal/wifi/ScannedNetworks.c msgid "Failed to allocate wifi scan memory" @@ -1046,6 +1055,10 @@ msgstr "Erreurre fatale." msgid "File exists" msgstr "Le fichier existe" +#: shared-module/os/getenv.c +msgid "File not found" +msgstr "" + #: ports/atmel-samd/common-hal/canio/Listener.c #: ports/espressif/common-hal/canio/Listener.c #: ports/stm/common-hal/canio/Listener.c @@ -1060,7 +1073,6 @@ msgstr "Le logiciel est identique" msgid "Firmware is invalid" msgstr "Logiciel invalide" -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/espressif/common-hal/dualbank/__init__.c msgid "Firmware is too big" msgstr "Logiciel trop volumineux" @@ -1108,6 +1120,8 @@ msgstr "Échec génerique" #: shared-bindings/displayio/Display.c #: shared-bindings/displayio/EPaperDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c +#: shared-module/displayio/Display.c +#: shared-module/framebufferio/FramebufferDisplay.c msgid "Group already used" msgstr "Groupe déjà utilisé" @@ -1246,6 +1260,7 @@ msgid "Internal define error" msgstr "Erreur de définition interne" #: ports/espressif/common-hal/paralleldisplay/ParallelBus.c +#: shared-module/os/getenv.c msgid "Internal error" msgstr "Erreur interne" @@ -1293,6 +1308,11 @@ msgstr "Paramètre invalide" msgid "Invalid bits per value" msgstr "Bits par valeur invalides" +#: shared-module/os/getenv.c +#, c-format +msgid "Invalid byte %.*s" +msgstr "" + #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #, c-format msgid "Invalid data_pins[%d]" @@ -1310,10 +1330,6 @@ msgstr "Accès à la mémoire invalide." msgid "Invalid multicast MAC address" msgstr "Adresse MAC multicast invalide" -#: shared-bindings/busio/UART.c -msgid "Invalid pins" -msgstr "Broches invalides" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Invalid size" msgstr "Taille invalide" @@ -1327,10 +1343,18 @@ msgstr "Socket non valide pour TLS" msgid "Invalid state" msgstr "État invalide" +#: shared-module/os/getenv.c +msgid "Invalid unicode escape" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "Key must be 16, 24, or 32 bytes long" msgstr "La clé doit comporter 16, 24 ou 32 octets" +#: shared-module/os/getenv.c +msgid "Key not found" +msgstr "" + #: shared-module/is31fl3741/FrameBuffer.c msgid "LED mappings must match display size" msgstr "La disposition des LED doit correspondre à la taille de l'écran" @@ -1440,6 +1464,10 @@ msgstr "Saut NLR échoué. Corruption de mémoire probable." msgid "NVS Error" msgstr "Erreur NVS" +#: shared-bindings/socketpool/SocketPool.c +msgid "Name or service not known" +msgstr "" + #: py/qstr.c msgid "Name too long" msgstr "Nom trop long" @@ -1555,11 +1583,6 @@ msgstr "Aucune clé n'a été spécifiée" msgid "No long integer support" msgstr "Pas de support pour chiffre entier long" -#: shared-module/usb_hid/__init__.c -#, c-format -msgid "No more than %d HID devices allowed" -msgstr "Pas plus de %d appareils HID autorisés" - #: shared-bindings/wifi/Radio.c msgid "No network with that ssid" msgstr "Aucun réseau avec ce ssid" @@ -1690,11 +1713,14 @@ msgstr "" "Seulement les BMP monochromes, 4 bpp ou 8 bpp, ou 16 bpp et plus sont " "supportés: %d bpp fournis" -#: ports/espressif/common-hal/alarm/coproc/CoprocAlarm.c #: ports/espressif/common-hal/alarm/touch/TouchAlarm.c msgid "Only one %q can be set in deep sleep." msgstr "Une seul %q autorisée en sommeil profond." +#: ports/espressif/common-hal/espulp/ULPAlarm.c +msgid "Only one %q can be set." +msgstr "" + #: ports/espressif/common-hal/i2ctarget/I2CTarget.c #: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c msgid "Only one address is allowed" @@ -1727,6 +1753,10 @@ msgstr "Opération ou fonction non supportée" msgid "Operation timed out" msgstr "Timeout de l'opération" +#: ports/raspberrypi/common-hal/mdns/Server.c +msgid "Out of MDNS service slots" +msgstr "" + #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Out of memory" msgstr "Mémoire insuffisante" @@ -1829,7 +1859,7 @@ msgstr "Ainsi que tout autres modules présents sur le système de fichiers\n" #: shared-module/vectorio/Polygon.c msgid "Polygon needs at least 3 points" -msgstr "Polygon a besoin d’au moins 3 points" +msgstr "Polygon a besoin d'au moins 3 points" #: shared-bindings/_bleio/Adapter.c msgid "Prefix buffer must be on the heap" @@ -1859,6 +1889,10 @@ msgstr "Le programme fait des sorties sans charger d'OSR" msgid "Program size invalid" msgstr "Taille du programme invalide" +#: ports/espressif/common-hal/espulp/ULP.c +msgid "Program too long" +msgstr "" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." msgstr "Le tirage 'pull' n'est pas utilisé quand la direction est 'output'." @@ -1899,7 +1933,7 @@ msgid "Random number generation error" msgstr "Erreur de génération de chiffres aléatoires" #: shared-bindings/memorymonitor/AllocationSize.c -#: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/pulseio/PulseIn.c shared-module/displayio/Bitmap.c msgid "Read-only" msgstr "Lecture seule" @@ -1907,10 +1941,6 @@ msgstr "Lecture seule" msgid "Read-only filesystem" msgstr "Système de fichier en lecture seule" -#: shared-module/displayio/Bitmap.c -msgid "Read-only object" -msgstr "Objet en lecture seule" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Received response was invalid" msgstr "Réponse reçue invalide" @@ -2003,7 +2033,7 @@ msgstr "Taille n'est pas supportée" msgid "Sleep Memory not available" msgstr "La mémoire de sommeil n'est pas disponible" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Slice and value different lengths." msgstr "Tranche et valeur de tailles différentes." @@ -2040,6 +2070,10 @@ msgstr "Canal stéréo gauche doit être sur le canal PWM A" msgid "Stereo right must be on PWM channel B" msgstr "Canal stéréo droit doit être sur le canal PWM B" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Stopping AP is not supported." +msgstr "" + #: ports/mimxrt10xx/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "Supply at least one UART pin" msgstr "Fournissez au moins une broche UART" @@ -2084,6 +2118,10 @@ msgstr "" "Le module `microcontroller` a été utilisé pour démarrer en mode sûr. Pressez " "reset pour quitter le mode sûr." +#: py/obj.c +msgid "The above exception was the direct cause of the following exception:" +msgstr "" + #: ports/espressif/boards/m5stack_atom_lite/mpconfigboard.h msgid "The central button was pressed at start up.\n" msgstr "Le bouton central était pressé au démarrage.\n" @@ -2280,12 +2318,13 @@ msgid "Unable to read color palette data" msgstr "Impossible de lire les données de la palette de couleurs" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "Unable to start mDNS query" msgstr "Impossible de lancer la requête mDNS" -#: shared-bindings/coproc/CoprocMemory.c -msgid "Unable to write" -msgstr "Écriture impossible" +#: shared-bindings/memorymap/AddressRange.c +msgid "Unable to write to address." +msgstr "" #: shared-bindings/nvm/ByteArray.c msgid "Unable to write to nvm." @@ -2355,6 +2394,7 @@ msgid "Unkown error code %d" msgstr "Erreur inconnue %d" #: shared-bindings/adafruit_pixelbuf/PixelBuf.c +#: shared-module/_pixelmap/PixelMap.c #, c-format msgid "Unmatched number of items on RHS (expected %d, got %d)." msgstr "" @@ -2451,6 +2491,18 @@ msgstr "" msgid "Wi-Fi: " msgstr "Wi-Fi : " +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in access point mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in station mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is not enabled" +msgstr "" + #: main.c msgid "Woken up by alarm.\n" msgstr "Réveil par alarme.\n" @@ -2541,13 +2593,13 @@ msgid "array has too many dimensions" msgstr "la tableau à trop de dimensions" #: py/objarray.c shared-bindings/alarm/SleepMemory.c -#: shared-bindings/coproc/CoprocMemory.c shared-bindings/nvm/ByteArray.c +#: shared-bindings/memorymap/AddressRange.c shared-bindings/nvm/ByteArray.c msgid "array/bytes required on right side" msgstr "matrice/octets requis à la droite" #: extmod/ulab/code/numpy/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" +msgstr "tentative d'obtenir (arg)min/(arg)max d'une séquence vide" #: extmod/ulab/code/numpy/numerical.c msgid "attempt to get argmin/argmax of an empty sequence" @@ -2615,7 +2667,7 @@ msgstr "tampon est plus petit que la taille demandée" #: extmod/ulab/code/numpy/create.c extmod/ulab/code/utils/utils.c msgid "buffer size must be a multiple of element size" -msgstr "taille du tampon doit être un multiple de la taille de l’élément" +msgstr "taille du tampon doit être un multiple de la taille de l'élément" #: shared-module/struct/__init__.c msgid "buffer size must match format" @@ -2634,10 +2686,6 @@ msgstr "tampon trop petit" msgid "buffer too small for requested bytes" msgstr "tampon trop petit pour le nombre d'octets demandé" -#: shared-bindings/adafruit_pixelbuf/PixelBuf.c -msgid "byteorder is not a string" -msgstr "byteorder n'est pas une chaîne" - #: py/objarray.c msgid "bytes length not a multiple of item size" msgstr "bytes length n'est pas un multiple de la taille d'un élément" @@ -2680,14 +2728,10 @@ msgstr "ne peut pas assigner à une expression" msgid "can't cancel self" msgstr "ne peut pas s'annuler soi-même" -#: py/obj.c py/objint.c shared-module/adafruit_pixelbuf/PixelBuf.c +#: py/obj.c py/objint.c py/runtime.c shared-module/adafruit_pixelbuf/PixelBuf.c msgid "can't convert %q to %q" msgstr "impossible de convertir %q en %q" -#: py/runtime.c -msgid "can't convert %q to int" -msgstr "ne peut convertir %q à int" - #: py/obj.c #, c-format msgid "can't convert %s to complex" @@ -2771,6 +2815,10 @@ msgstr "impossible de définir une taille de bloc de 512" msgid "can't set attribute" msgstr "attribut non modifiable" +#: py/runtime.c +msgid "can't set attribute '%q'" +msgstr "" + #: py/emitnative.c msgid "can't store '%q'" msgstr "impossible de stocker '%q'" @@ -2880,10 +2928,6 @@ msgstr "la couleur doit être entre 0x000000 et 0xffffff" msgid "comparison of int and uint" msgstr "comparaison entre int et uint" -#: py/objcomplex.c -msgid "complex division by zero" -msgstr "division complexe par zéro" - #: py/objfloat.c py/parsenum.c msgid "complex values not supported" msgstr "valeurs complexes non supportées" @@ -2989,12 +3033,7 @@ msgstr "les dimensions ne correspondent pas" msgid "div/mod not implemented for uint" msgstr "div/mod ne sont pas implémentés pour uint" -#: py/objfloat.c py/objint_mpz.c -msgid "divide by zero" -msgstr "division par zéro" - -#: py/modmath.c py/objint_longlong.c py/runtime.c -#: shared-bindings/math/__init__.c +#: py/runtime.c msgid "division by zero" msgstr "division par zéro" @@ -3153,10 +3192,6 @@ msgstr "la police doit être longue de 2048 octets" msgid "format requires a dict" msgstr "le format nécessite un dict" -#: shared-bindings/microcontroller/Processor.c -msgid "frequency is read-only for this board" -msgstr "la fréquence est en lecture seule pour cette carte" - #: py/objdeque.c msgid "full" msgstr "plein" @@ -3176,7 +3211,7 @@ msgstr "la fonction a reçu plusieurs valeurs pour l'argument '%q'" #: extmod/ulab/code/scipy/optimize/optimize.c 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" +msgstr "la fonction a le même signe aux extrémités de l'intervalle" #: extmod/ulab/code/ndarray.c msgid "function is defined for ndarrays only" @@ -3269,8 +3304,12 @@ msgstr "espacement incorrect" msgid "index is out of bounds" msgstr "l'index est hors limites" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "index must be tuple or int" +msgstr "" + #: extmod/ulab/code/numpy/numerical.c extmod/ulab/code/ulab_tools.c -#: ports/espressif/common-hal/pulseio/PulseIn.c py/obj.c +#: ports/espressif/common-hal/pulseio/PulseIn.c #: shared-bindings/bitmaptools/__init__.c msgid "index out of range" msgstr "index est hors bornes" @@ -3369,10 +3408,6 @@ msgstr "les vecteurs d'entrée doivent être de longueur égale" msgid "inputs are not iterable" msgstr "les entrées ne sont pas itérables" -#: py/parsenum.c -msgid "int() arg 2 must be >= 2 and <= 36" -msgstr "Le deuxième argument de int() doit être compris entre 2 et 36 inclus" - #: extmod/ulab/code/numpy/approx.c msgid "interp is defined for 1D iterables of equal length" msgstr "interp n'est défini que pour les 1D itérables de taille identique" @@ -3455,10 +3490,6 @@ msgstr "syntaxe invalide pour un entier de base %d" msgid "invalid syntax for number" msgstr "syntaxe invalide pour un nombre" -#: py/objexcept.c -msgid "invalid traceback" -msgstr "traceback invalide" - #: py/objtype.c msgid "issubclass() arg 1 must be a class" msgstr "l'argument 1 de issubclass() doit être une classe" @@ -3520,19 +3551,17 @@ msgstr "variable locale '%q' utilisée avant d'en connaitre le type" msgid "local variable referenced before assignment" msgstr "variable locale référencée avant d'être assignée" -#: py/objint.c -msgid "long int not supported in this build" -msgstr "entiers longs non supportés dans cette build" - #: ports/espressif/common-hal/canio/CAN.c msgid "loopback + silent mode not supported by peripheral" msgstr "loopback + silent mode non pris en charge par le périphérique" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS already initialized" msgstr "mDNS a déjà été initialisé" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS only works with built-in WiFi" msgstr "mDNS ne fonctionne que avec le WiFi intégré" @@ -3661,6 +3690,10 @@ msgstr "puissance négative sans support des nombres à virgule flottante" msgid "negative shift count" msgstr "compte de décalage négatif" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "nested index must be int" +msgstr "" + #: shared-module/sdcardio/SDCard.c msgid "no SD card" msgstr "pas de carte SD" @@ -3843,7 +3876,7 @@ msgid "only sample_rate=16000 is supported" msgstr "seul sample_rate = 16000 est pris en charge" #: py/objarray.c py/objstr.c py/objstrunicode.c py/objtuple.c -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "only slices with step=1 (aka None) are supported" msgstr "seules les tranches avec 'step=1' (cad None) sont supportées" @@ -4061,10 +4094,6 @@ msgstr "la longueur de sleep ne doit pas être négative" msgid "slice step can't be zero" msgstr "le pas 'step' de la tranche ne peut être zéro" -#: py/objslice.c -msgid "slice step cannot be zero" -msgstr "le pas 'step' de la tranche ne peut être zéro" - #: py/nativeglue.c msgid "slice unsupported" msgstr "slice non-supporté" @@ -4113,10 +4142,6 @@ msgstr "source_bitmap doit avoir une value_count de 8" msgid "start/end indices" msgstr "indices de début/fin" -#: shared-bindings/random/__init__.c -msgid "step must be non-zero" -msgstr "le pas 'step' doit être non nul" - #: shared-bindings/random/__init__.c msgid "stop not reachable from start" msgstr "stop n'est pas accessible au démarrage" @@ -4125,10 +4150,6 @@ msgstr "stop n'est pas accessible au démarrage" msgid "stream operation not supported" msgstr "opération de flux non supportée" -#: py/objstrunicode.c -msgid "string indices must be integers, not %q" -msgstr "les indices d'une chaîne doivent être des entiers, pas %q" - #: py/stream.c msgid "string not supported; use bytes or bytearray" msgstr "" @@ -4162,10 +4183,6 @@ msgstr "erreur de syntaxe JSON" msgid "syntax error in uctypes descriptor" msgstr "erreur de syntaxe dans le descripteur d'uctypes" -#: shared-bindings/time/__init__.c -msgid "time.struct_time() takes a 9-sequence" -msgstr "time.struct_time() prend une séquence de longueur 9" - #: ports/atmel-samd/common-hal/watchdog/WatchDogTimer.c #: ports/espressif/common-hal/watchdog/WatchDogTimer.c #: ports/nrf/common-hal/watchdog/WatchDogTimer.c @@ -4179,11 +4196,11 @@ msgstr "le délai (timeout) doit être < 655.35 secondes" #: shared-module/sdcardio/SDCard.c msgid "timeout waiting for v1 card" -msgstr "Délai d’expiration dépassé en attendant une carte v1" +msgstr "Délai d'expiration dépassé en attendant une carte v1" #: shared-module/sdcardio/SDCard.c msgid "timeout waiting for v2 card" -msgstr "Délai d’expiration dépassé en attendant une carte v2" +msgstr "Délai d'expiration dépassé en attendant une carte v2" #: ports/stm/common-hal/pwmio/PWMOut.c msgid "timer re-init" @@ -4383,7 +4400,7 @@ msgstr "width doit être plus que zero" #: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c msgid "wifi is not enabled" -msgstr "wifi n’est pas activé" +msgstr "wifi n'est pas activé" #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" @@ -4447,10 +4464,6 @@ msgstr "Échec de xTaskCreate" msgid "y value out of bounds" msgstr "valeur y hors limites" -#: py/objrange.c -msgid "zero step" -msgstr "'step' nul" - #: extmod/ulab/code/scipy/signal/signal.c msgid "zi must be an ndarray" msgstr "zi doit être un ndarray" @@ -4463,6 +4476,74 @@ 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 "Read-only object" +#~ msgstr "Objet en lecture seule" + +#~ msgid "frequency is read-only for this board" +#~ msgstr "la fréquence est en lecture seule pour cette carte" + +#~ msgid "Unable to write" +#~ msgstr "Écriture impossible" + +#~ msgid "%q length must be >= 1" +#~ msgstr "La longueur de %q doit être >= 1" + +#~ msgid "%q must be a string" +#~ msgstr "%q doit être une chaîne de caractères" + +#~ msgid "%q must be an int" +#~ msgstr "%q doit être un entier" + +#~ msgid "%q with a report ID of 0 must be of length 1" +#~ msgstr "%q avec un identifiant de rapport à 0 doit être de longueur 1" + +#~ msgid "At most %d %q may be specified (not %d)" +#~ msgstr "Au plus %d %q peut être spécifié (pas %d)" + +#~ msgid "Invalid pins" +#~ msgstr "Broches invalides" + +#, c-format +#~ msgid "No more than %d HID devices allowed" +#~ msgstr "Pas plus de %d appareils HID autorisés" + +#~ msgid "byteorder is not a string" +#~ msgstr "byteorder n'est pas une chaîne" + +#~ msgid "can't convert %q to int" +#~ msgstr "ne peut convertir %q à int" + +#~ msgid "complex division by zero" +#~ msgstr "division complexe par zéro" + +#~ msgid "divide by zero" +#~ msgstr "division par zéro" + +#~ msgid "int() arg 2 must be >= 2 and <= 36" +#~ msgstr "" +#~ "Le deuxième argument de int() doit être compris entre 2 et 36 inclus" + +#~ msgid "long int not supported in this build" +#~ msgstr "entiers longs non supportés dans cette build" + +#~ msgid "slice step cannot be zero" +#~ msgstr "le pas 'step' de la tranche ne peut être zéro" + +#~ msgid "step must be non-zero" +#~ msgstr "le pas 'step' doit être non nul" + +#~ msgid "string indices must be integers, not %q" +#~ msgstr "les indices d'une chaîne doivent être des entiers, pas %q" + +#~ msgid "time.struct_time() takes a 9-sequence" +#~ msgstr "time.struct_time() prend une séquence de longueur 9" + +#~ msgid "zero step" +#~ msgstr "'step' nul" + +#~ msgid "invalid traceback" +#~ msgstr "traceback invalide" + #~ msgid "%q indices must be integers, not %s" #~ msgstr "les indices %q doivent être des entiers, pas %s" diff --git a/locale/hi.po b/locale/hi.po index 3c3496600b..6b43cffabc 100644 --- a/locale/hi.po +++ b/locale/hi.po @@ -65,6 +65,11 @@ msgstr "" msgid "%02X" msgstr "" +#: shared-module/os/getenv.c +#, c-format +msgid "%S" +msgstr "" + #: shared-bindings/rgbmatrix/RGBMatrix.c #, c-format msgid "" @@ -100,13 +105,14 @@ msgstr "" msgid "%q failure: %d" msgstr "" +#: ports/espressif/common-hal/espulp/ULP.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/microcontroller/Pin.c msgid "%q in use" msgstr "" -#: py/obj.c py/objstr.c py/objstrunicode.c +#: py/objstr.c py/objstrunicode.c msgid "%q index out of range" msgstr "" @@ -118,7 +124,11 @@ msgstr "" msgid "%q is %q" msgstr "" -#: py/argcheck.c +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "%q is read-only for this board" +msgstr "" + +#: py/argcheck.c shared-bindings/usb_hid/Device.c msgid "%q length must be %d" msgstr "" @@ -134,10 +144,6 @@ msgstr "" msgid "%q length must be >= %d" msgstr "" -#: shared-bindings/busio/I2C.c -msgid "%q length must be >= 1" -msgstr "" - #: py/argcheck.c msgid "%q must be %d" msgstr "" @@ -159,23 +165,18 @@ msgid "%q must be >= %d" msgstr "" #: shared-bindings/analogbufio/BufferedIn.c +msgid "%q must be a bytearray or array of type 'H' or 'B'" +msgstr "" + #: shared-bindings/audiocore/RawSample.c msgid "%q must be a bytearray or array of type 'h', 'H', 'b', or 'B'" msgstr "" -#: py/argcheck.c -msgid "%q must be a string" -msgstr "" - -#: py/argcheck.c -msgid "%q must be an int" -msgstr "" - -#: py/argcheck.c +#: py/argcheck.c py/obj.c py/objstrunicode.c msgid "%q must be of type %q" msgstr "" -#: shared-bindings/digitalio/Pull.c +#: py/objexcept.c shared-bindings/digitalio/Pull.c msgid "%q must be of type %q or None" msgstr "" @@ -189,7 +190,6 @@ msgstr "" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c #: ports/cxd56/common-hal/pulseio/PulseIn.c -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/nrf/common-hal/pulseio/PulseIn.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c @@ -201,8 +201,8 @@ msgstr "" msgid "%q pin invalid" msgstr "" -#: shared-bindings/usb_hid/Device.c -msgid "%q with a report ID of 0 must be of length 1" +#: py/objrange.c py/objslice.c shared-bindings/random/__init__.c +msgid "%q step cannot be zero" msgstr "" #: py/bc.c py/objnamedtuple.c @@ -302,7 +302,7 @@ msgstr "" msgid "'%s' object doesn't support item deletion" msgstr "" -#: ports/raspberrypi/common-hal/wifi/Radio.c py/runtime.c +#: py/runtime.c msgid "'%s' object has no attribute '%q'" msgstr "" @@ -402,6 +402,10 @@ msgstr "" msgid "Address must be %d bytes long" msgstr "" +#: ports/espressif/common-hal/memorymap/AddressRange.c +msgid "Address range not allowed" +msgstr "" + #: ports/espressif/common-hal/canio/CAN.c msgid "All CAN peripherals are in use" msgstr "" @@ -482,7 +486,7 @@ msgstr "" msgid "Already have all-matches listener" msgstr "" -#: ports/espressif/common-hal/coproc/__init__.c +#: ports/espressif/common-hal/espulp/ULP.c #: shared-module/memorymonitor/AllocationAlarm.c #: shared-module/memorymonitor/AllocationSize.c msgid "Already running" @@ -493,6 +497,11 @@ msgstr "" msgid "Already scanning for wifi networks" msgstr "" +#: shared-module/os/getenv.c +#, c-format +msgid "An error occurred while retrieving '%s':\n" +msgstr "" + #: ports/stm/common-hal/audiopwmio/PWMAudioOut.c msgid "Another PWMAudioOut is already active" msgstr "" @@ -506,15 +515,11 @@ msgstr "" msgid "Array must contain halfwords (type 'H')" msgstr "" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Array values should be single bytes." msgstr "" -#: shared-bindings/microcontroller/Pin.c -msgid "At most %d %q may be specified (not %d)" -msgstr "" - #: shared-module/memorymonitor/AllocationAlarm.c #, c-format msgid "Attempt to allocate %d blocks" @@ -894,6 +899,10 @@ msgstr "" msgid "Drive mode not used when direction is input." msgstr "" +#: py/obj.c +msgid "During handling of the above exception, another exception occurred:" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "ECB only operates on 16 bytes at a time" msgstr "" @@ -923,10 +932,10 @@ msgstr "" msgid "Error: Failure to bind" msgstr "" -#: py/enum.c shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c -#: shared-bindings/alarm/__init__.c shared-bindings/alarm/coproc/CoprocAlarm.c -#: shared-bindings/busio/SPI.c shared-bindings/coproc/Coproc.c -#: shared-bindings/coproc/__init__.c shared-bindings/microcontroller/Pin.c +#: ports/espressif/bindings/espulp/ULP.c py/enum.c +#: shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c +#: shared-bindings/alarm/__init__.c shared-bindings/busio/SPI.c +#: shared-bindings/microcontroller/Pin.c #: shared-bindings/neopixel_write/__init__.c msgid "Expected a %q" msgstr "" @@ -1011,6 +1020,10 @@ msgstr "" msgid "File exists" msgstr "" +#: shared-module/os/getenv.c +msgid "File not found" +msgstr "" + #: ports/atmel-samd/common-hal/canio/Listener.c #: ports/espressif/common-hal/canio/Listener.c #: ports/stm/common-hal/canio/Listener.c @@ -1025,7 +1038,6 @@ msgstr "" msgid "Firmware is invalid" msgstr "" -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/espressif/common-hal/dualbank/__init__.c msgid "Firmware is too big" msgstr "" @@ -1067,6 +1079,8 @@ msgstr "" #: shared-bindings/displayio/Display.c #: shared-bindings/displayio/EPaperDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c +#: shared-module/displayio/Display.c +#: shared-module/framebufferio/FramebufferDisplay.c msgid "Group already used" msgstr "" @@ -1193,6 +1207,7 @@ msgid "Internal define error" msgstr "" #: ports/espressif/common-hal/paralleldisplay/ParallelBus.c +#: shared-module/os/getenv.c msgid "Internal error" msgstr "" @@ -1239,6 +1254,11 @@ msgstr "" msgid "Invalid bits per value" msgstr "" +#: shared-module/os/getenv.c +#, c-format +msgid "Invalid byte %.*s" +msgstr "" + #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #, c-format msgid "Invalid data_pins[%d]" @@ -1256,10 +1276,6 @@ msgstr "" msgid "Invalid multicast MAC address" msgstr "" -#: shared-bindings/busio/UART.c -msgid "Invalid pins" -msgstr "" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Invalid size" msgstr "" @@ -1273,10 +1289,18 @@ msgstr "" msgid "Invalid state" msgstr "" +#: shared-module/os/getenv.c +msgid "Invalid unicode escape" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "Key must be 16, 24, or 32 bytes long" msgstr "" +#: shared-module/os/getenv.c +msgid "Key not found" +msgstr "" + #: shared-module/is31fl3741/FrameBuffer.c msgid "LED mappings must match display size" msgstr "" @@ -1383,6 +1407,10 @@ msgstr "" msgid "NVS Error" msgstr "" +#: shared-bindings/socketpool/SocketPool.c +msgid "Name or service not known" +msgstr "" + #: py/qstr.c msgid "Name too long" msgstr "" @@ -1497,11 +1525,6 @@ msgstr "" msgid "No long integer support" msgstr "" -#: shared-module/usb_hid/__init__.c -#, c-format -msgid "No more than %d HID devices allowed" -msgstr "" - #: shared-bindings/wifi/Radio.c msgid "No network with that ssid" msgstr "" @@ -1626,11 +1649,14 @@ msgid "" "%d bpp given" msgstr "" -#: ports/espressif/common-hal/alarm/coproc/CoprocAlarm.c #: ports/espressif/common-hal/alarm/touch/TouchAlarm.c msgid "Only one %q can be set in deep sleep." msgstr "" +#: ports/espressif/common-hal/espulp/ULPAlarm.c +msgid "Only one %q can be set." +msgstr "" + #: ports/espressif/common-hal/i2ctarget/I2CTarget.c #: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c msgid "Only one address is allowed" @@ -1663,6 +1689,10 @@ msgstr "" msgid "Operation timed out" msgstr "" +#: ports/raspberrypi/common-hal/mdns/Server.c +msgid "Out of MDNS service slots" +msgstr "" + #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Out of memory" msgstr "" @@ -1786,6 +1816,10 @@ msgstr "" msgid "Program size invalid" msgstr "" +#: ports/espressif/common-hal/espulp/ULP.c +msgid "Program too long" +msgstr "" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." msgstr "" @@ -1826,7 +1860,7 @@ msgid "Random number generation error" msgstr "" #: shared-bindings/memorymonitor/AllocationSize.c -#: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/pulseio/PulseIn.c shared-module/displayio/Bitmap.c msgid "Read-only" msgstr "" @@ -1834,10 +1868,6 @@ msgstr "" msgid "Read-only filesystem" msgstr "" -#: shared-module/displayio/Bitmap.c -msgid "Read-only object" -msgstr "" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Received response was invalid" msgstr "" @@ -1930,7 +1960,7 @@ msgstr "" msgid "Sleep Memory not available" msgstr "" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Slice and value different lengths." msgstr "" @@ -1967,6 +1997,10 @@ msgstr "" msgid "Stereo right must be on PWM channel B" msgstr "" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Stopping AP is not supported." +msgstr "" + #: ports/mimxrt10xx/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "Supply at least one UART pin" msgstr "" @@ -2007,6 +2041,10 @@ msgid "" "exit safe mode." msgstr "" +#: py/obj.c +msgid "The above exception was the direct cause of the following exception:" +msgstr "" + #: ports/espressif/boards/m5stack_atom_lite/mpconfigboard.h msgid "The central button was pressed at start up.\n" msgstr "" @@ -2192,11 +2230,12 @@ msgid "Unable to read color palette data" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "Unable to start mDNS query" msgstr "" -#: shared-bindings/coproc/CoprocMemory.c -msgid "Unable to write" +#: shared-bindings/memorymap/AddressRange.c +msgid "Unable to write to address." msgstr "" #: shared-bindings/nvm/ByteArray.c @@ -2267,6 +2306,7 @@ msgid "Unkown error code %d" msgstr "" #: shared-bindings/adafruit_pixelbuf/PixelBuf.c +#: shared-module/_pixelmap/PixelMap.c #, c-format msgid "Unmatched number of items on RHS (expected %d, got %d)." msgstr "" @@ -2351,6 +2391,18 @@ msgstr "" msgid "Wi-Fi: " msgstr "" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in access point mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in station mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is not enabled" +msgstr "" + #: main.c msgid "Woken up by alarm.\n" msgstr "" @@ -2439,7 +2491,7 @@ msgid "array has too many dimensions" msgstr "" #: py/objarray.c shared-bindings/alarm/SleepMemory.c -#: shared-bindings/coproc/CoprocMemory.c shared-bindings/nvm/ByteArray.c +#: shared-bindings/memorymap/AddressRange.c shared-bindings/nvm/ByteArray.c msgid "array/bytes required on right side" msgstr "" @@ -2532,10 +2584,6 @@ msgstr "" msgid "buffer too small for requested bytes" msgstr "" -#: shared-bindings/adafruit_pixelbuf/PixelBuf.c -msgid "byteorder is not a string" -msgstr "" - #: py/objarray.c msgid "bytes length not a multiple of item size" msgstr "" @@ -2577,14 +2625,10 @@ msgstr "" msgid "can't cancel self" msgstr "" -#: py/obj.c py/objint.c shared-module/adafruit_pixelbuf/PixelBuf.c +#: py/obj.c py/objint.c py/runtime.c shared-module/adafruit_pixelbuf/PixelBuf.c msgid "can't convert %q to %q" msgstr "" -#: py/runtime.c -msgid "can't convert %q to int" -msgstr "" - #: py/obj.c #, c-format msgid "can't convert %s to complex" @@ -2666,6 +2710,10 @@ msgstr "" msgid "can't set attribute" msgstr "" +#: py/runtime.c +msgid "can't set attribute '%q'" +msgstr "" + #: py/emitnative.c msgid "can't store '%q'" msgstr "" @@ -2768,10 +2816,6 @@ msgstr "" msgid "comparison of int and uint" msgstr "" -#: py/objcomplex.c -msgid "complex division by zero" -msgstr "" - #: py/objfloat.c py/parsenum.c msgid "complex values not supported" msgstr "" @@ -2874,12 +2918,7 @@ msgstr "" msgid "div/mod not implemented for uint" msgstr "" -#: py/objfloat.c py/objint_mpz.c -msgid "divide by zero" -msgstr "" - -#: py/modmath.c py/objint_longlong.c py/runtime.c -#: shared-bindings/math/__init__.c +#: py/runtime.c msgid "division by zero" msgstr "" @@ -3036,10 +3075,6 @@ msgstr "" msgid "format requires a dict" msgstr "" -#: shared-bindings/microcontroller/Processor.c -msgid "frequency is read-only for this board" -msgstr "" - #: py/objdeque.c msgid "full" msgstr "" @@ -3152,8 +3187,12 @@ msgstr "" msgid "index is out of bounds" msgstr "" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "index must be tuple or int" +msgstr "" + #: extmod/ulab/code/numpy/numerical.c extmod/ulab/code/ulab_tools.c -#: ports/espressif/common-hal/pulseio/PulseIn.c py/obj.c +#: ports/espressif/common-hal/pulseio/PulseIn.c #: shared-bindings/bitmaptools/__init__.c msgid "index out of range" msgstr "" @@ -3251,10 +3290,6 @@ msgstr "" msgid "inputs are not iterable" msgstr "" -#: py/parsenum.c -msgid "int() arg 2 must be >= 2 and <= 36" -msgstr "" - #: extmod/ulab/code/numpy/approx.c msgid "interp is defined for 1D iterables of equal length" msgstr "" @@ -3336,10 +3371,6 @@ msgstr "" msgid "invalid syntax for number" msgstr "" -#: py/objexcept.c -msgid "invalid traceback" -msgstr "" - #: py/objtype.c msgid "issubclass() arg 1 must be a class" msgstr "" @@ -3396,19 +3427,17 @@ msgstr "" msgid "local variable referenced before assignment" msgstr "" -#: py/objint.c -msgid "long int not supported in this build" -msgstr "" - #: ports/espressif/common-hal/canio/CAN.c msgid "loopback + silent mode not supported by peripheral" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS already initialized" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS only works with built-in WiFi" msgstr "" @@ -3537,6 +3566,10 @@ msgstr "" msgid "negative shift count" msgstr "" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "nested index must be int" +msgstr "" + #: shared-module/sdcardio/SDCard.c msgid "no SD card" msgstr "" @@ -3716,7 +3749,7 @@ msgid "only sample_rate=16000 is supported" msgstr "" #: py/objarray.c py/objstr.c py/objstrunicode.c py/objtuple.c -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "only slices with step=1 (aka None) are supported" msgstr "" @@ -3932,10 +3965,6 @@ msgstr "" msgid "slice step can't be zero" msgstr "" -#: py/objslice.c -msgid "slice step cannot be zero" -msgstr "" - #: py/nativeglue.c msgid "slice unsupported" msgstr "" @@ -3984,10 +4013,6 @@ msgstr "" msgid "start/end indices" msgstr "" -#: shared-bindings/random/__init__.c -msgid "step must be non-zero" -msgstr "" - #: shared-bindings/random/__init__.c msgid "stop not reachable from start" msgstr "" @@ -3996,10 +4021,6 @@ msgstr "" msgid "stream operation not supported" msgstr "" -#: py/objstrunicode.c -msgid "string indices must be integers, not %q" -msgstr "" - #: py/stream.c msgid "string not supported; use bytes or bytearray" msgstr "" @@ -4032,10 +4053,6 @@ msgstr "" msgid "syntax error in uctypes descriptor" msgstr "" -#: shared-bindings/time/__init__.c -msgid "time.struct_time() takes a 9-sequence" -msgstr "" - #: ports/atmel-samd/common-hal/watchdog/WatchDogTimer.c #: ports/espressif/common-hal/watchdog/WatchDogTimer.c #: ports/nrf/common-hal/watchdog/WatchDogTimer.c @@ -4317,10 +4334,6 @@ msgstr "" msgid "y value out of bounds" msgstr "" -#: py/objrange.c -msgid "zero step" -msgstr "" - #: extmod/ulab/code/scipy/signal/signal.c msgid "zi must be an ndarray" msgstr "" diff --git a/locale/it_IT.po b/locale/it_IT.po index e1ba5c3827..33c397da01 100644 --- a/locale/it_IT.po +++ b/locale/it_IT.po @@ -71,6 +71,11 @@ msgstr "%%c necessita di int o char" msgid "%02X" msgstr "" +#: shared-module/os/getenv.c +#, c-format +msgid "%S" +msgstr "" + #: shared-bindings/rgbmatrix/RGBMatrix.c #, c-format msgid "" @@ -107,13 +112,14 @@ msgstr "" msgid "%q failure: %d" msgstr "%q fallito: %d" +#: ports/espressif/common-hal/espulp/ULP.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/microcontroller/Pin.c msgid "%q in use" msgstr "%q in uso" -#: py/obj.c py/objstr.c py/objstrunicode.c +#: py/objstr.c py/objstrunicode.c msgid "%q index out of range" msgstr "indice %q fuori intervallo" @@ -125,7 +131,11 @@ msgstr "" msgid "%q is %q" msgstr "" -#: py/argcheck.c +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "%q is read-only for this board" +msgstr "" + +#: py/argcheck.c shared-bindings/usb_hid/Device.c msgid "%q length must be %d" msgstr "" @@ -141,10 +151,6 @@ msgstr "" msgid "%q length must be >= %d" msgstr "" -#: shared-bindings/busio/I2C.c -msgid "%q length must be >= 1" -msgstr "" - #: py/argcheck.c msgid "%q must be %d" msgstr "" @@ -166,23 +172,18 @@ msgid "%q must be >= %d" msgstr "" #: shared-bindings/analogbufio/BufferedIn.c +msgid "%q must be a bytearray or array of type 'H' or 'B'" +msgstr "" + #: shared-bindings/audiocore/RawSample.c msgid "%q must be a bytearray or array of type 'h', 'H', 'b', or 'B'" msgstr "" -#: py/argcheck.c -msgid "%q must be a string" -msgstr "" - -#: py/argcheck.c -msgid "%q must be an int" -msgstr "" - -#: py/argcheck.c +#: py/argcheck.c py/obj.c py/objstrunicode.c msgid "%q must be of type %q" msgstr "" -#: shared-bindings/digitalio/Pull.c +#: py/objexcept.c shared-bindings/digitalio/Pull.c msgid "%q must be of type %q or None" msgstr "" @@ -196,7 +197,6 @@ msgstr "" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c #: ports/cxd56/common-hal/pulseio/PulseIn.c -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/nrf/common-hal/pulseio/PulseIn.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c @@ -208,8 +208,8 @@ msgstr "%q oltre il limite" msgid "%q pin invalid" msgstr "%q pin non valido" -#: shared-bindings/usb_hid/Device.c -msgid "%q with a report ID of 0 must be of length 1" +#: py/objrange.c py/objslice.c shared-bindings/random/__init__.c +msgid "%q step cannot be zero" msgstr "" #: py/bc.c py/objnamedtuple.c @@ -309,7 +309,7 @@ msgstr "" msgid "'%s' object doesn't support item deletion" msgstr "" -#: ports/raspberrypi/common-hal/wifi/Radio.c py/runtime.c +#: py/runtime.c msgid "'%s' object has no attribute '%q'" msgstr "l'oggetto '%s' non ha l'attributo '%q'" @@ -410,6 +410,10 @@ msgstr "ADC2 sta usando il WiFi" msgid "Address must be %d bytes long" msgstr "L'indirizzo deve essere lungo %d byte" +#: ports/espressif/common-hal/memorymap/AddressRange.c +msgid "Address range not allowed" +msgstr "" + #: ports/espressif/common-hal/canio/CAN.c msgid "All CAN peripherals are in use" msgstr "Tutte le periferiche CAN sono in uso" @@ -491,7 +495,7 @@ msgstr "" msgid "Already have all-matches listener" msgstr "Già in possesso di tutti i listener abbinati" -#: ports/espressif/common-hal/coproc/__init__.c +#: ports/espressif/common-hal/espulp/ULP.c #: shared-module/memorymonitor/AllocationAlarm.c #: shared-module/memorymonitor/AllocationSize.c msgid "Already running" @@ -502,6 +506,11 @@ msgstr "Già in funzione" msgid "Already scanning for wifi networks" msgstr "Già in ricerca di collegamenti WiFi" +#: shared-module/os/getenv.c +#, c-format +msgid "An error occurred while retrieving '%s':\n" +msgstr "" + #: ports/stm/common-hal/audiopwmio/PWMAudioOut.c msgid "Another PWMAudioOut is already active" msgstr "" @@ -515,15 +524,11 @@ msgstr "Another send è gia activato" msgid "Array must contain halfwords (type 'H')" msgstr "Array deve avere mezzoparole (typo 'H')" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Array values should be single bytes." msgstr "I valori dell'Array dovrebbero essere bytes singoli." -#: shared-bindings/microcontroller/Pin.c -msgid "At most %d %q may be specified (not %d)" -msgstr "Almeno %d %q devono essere specificati (non %d)" - #: shared-module/memorymonitor/AllocationAlarm.c #, c-format msgid "Attempt to allocate %d blocks" @@ -909,6 +914,10 @@ msgstr "" msgid "Drive mode not used when direction is input." msgstr "" +#: py/obj.c +msgid "During handling of the above exception, another exception occurred:" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "ECB only operates on 16 bytes at a time" msgstr "" @@ -938,10 +947,10 @@ msgstr "Errore nella regex" msgid "Error: Failure to bind" msgstr "" -#: py/enum.c shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c -#: shared-bindings/alarm/__init__.c shared-bindings/alarm/coproc/CoprocAlarm.c -#: shared-bindings/busio/SPI.c shared-bindings/coproc/Coproc.c -#: shared-bindings/coproc/__init__.c shared-bindings/microcontroller/Pin.c +#: ports/espressif/bindings/espulp/ULP.c py/enum.c +#: shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c +#: shared-bindings/alarm/__init__.c shared-bindings/busio/SPI.c +#: shared-bindings/microcontroller/Pin.c #: shared-bindings/neopixel_write/__init__.c msgid "Expected a %q" msgstr "Atteso un %q" @@ -1026,6 +1035,10 @@ msgstr "" msgid "File exists" msgstr "File esistente" +#: shared-module/os/getenv.c +msgid "File not found" +msgstr "" + #: ports/atmel-samd/common-hal/canio/Listener.c #: ports/espressif/common-hal/canio/Listener.c #: ports/stm/common-hal/canio/Listener.c @@ -1040,7 +1053,6 @@ msgstr "" msgid "Firmware is invalid" msgstr "" -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/espressif/common-hal/dualbank/__init__.c msgid "Firmware is too big" msgstr "" @@ -1082,6 +1094,8 @@ msgstr "" #: shared-bindings/displayio/Display.c #: shared-bindings/displayio/EPaperDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c +#: shared-module/displayio/Display.c +#: shared-module/framebufferio/FramebufferDisplay.c msgid "Group already used" msgstr "" @@ -1210,6 +1224,7 @@ msgid "Internal define error" msgstr "" #: ports/espressif/common-hal/paralleldisplay/ParallelBus.c +#: shared-module/os/getenv.c msgid "Internal error" msgstr "" @@ -1256,6 +1271,11 @@ msgstr "Argomento non valido" msgid "Invalid bits per value" msgstr "bits per valore invalido" +#: shared-module/os/getenv.c +#, c-format +msgid "Invalid byte %.*s" +msgstr "" + #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #, c-format msgid "Invalid data_pins[%d]" @@ -1273,10 +1293,6 @@ msgstr "" msgid "Invalid multicast MAC address" msgstr "" -#: shared-bindings/busio/UART.c -msgid "Invalid pins" -msgstr "Pin non validi" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Invalid size" msgstr "" @@ -1290,10 +1306,18 @@ msgstr "" msgid "Invalid state" msgstr "" +#: shared-module/os/getenv.c +msgid "Invalid unicode escape" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "Key must be 16, 24, or 32 bytes long" msgstr "" +#: shared-module/os/getenv.c +msgid "Key not found" +msgstr "" + #: shared-module/is31fl3741/FrameBuffer.c msgid "LED mappings must match display size" msgstr "" @@ -1401,6 +1425,10 @@ msgstr "" msgid "NVS Error" msgstr "" +#: shared-bindings/socketpool/SocketPool.c +msgid "Name or service not known" +msgstr "" + #: py/qstr.c msgid "Name too long" msgstr "" @@ -1515,11 +1543,6 @@ msgstr "" msgid "No long integer support" msgstr "" -#: shared-module/usb_hid/__init__.c -#, c-format -msgid "No more than %d HID devices allowed" -msgstr "" - #: shared-bindings/wifi/Radio.c msgid "No network with that ssid" msgstr "" @@ -1648,11 +1671,14 @@ msgid "" "%d bpp given" msgstr "" -#: ports/espressif/common-hal/alarm/coproc/CoprocAlarm.c #: ports/espressif/common-hal/alarm/touch/TouchAlarm.c msgid "Only one %q can be set in deep sleep." msgstr "" +#: ports/espressif/common-hal/espulp/ULPAlarm.c +msgid "Only one %q can be set." +msgstr "" + #: ports/espressif/common-hal/i2ctarget/I2CTarget.c #: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c msgid "Only one address is allowed" @@ -1685,6 +1711,10 @@ msgstr "" msgid "Operation timed out" msgstr "" +#: ports/raspberrypi/common-hal/mdns/Server.c +msgid "Out of MDNS service slots" +msgstr "" + #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Out of memory" msgstr "" @@ -1812,6 +1842,10 @@ msgstr "" msgid "Program size invalid" msgstr "" +#: ports/espressif/common-hal/espulp/ULP.c +msgid "Program too long" +msgstr "" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." msgstr "" @@ -1852,7 +1886,7 @@ msgid "Random number generation error" msgstr "" #: shared-bindings/memorymonitor/AllocationSize.c -#: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/pulseio/PulseIn.c shared-module/displayio/Bitmap.c msgid "Read-only" msgstr "Sola lettura" @@ -1860,11 +1894,6 @@ msgstr "Sola lettura" msgid "Read-only filesystem" msgstr "Filesystem in sola lettura" -#: shared-module/displayio/Bitmap.c -#, fuzzy -msgid "Read-only object" -msgstr "Sola lettura" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Received response was invalid" msgstr "" @@ -1957,7 +1986,7 @@ msgstr "" msgid "Sleep Memory not available" msgstr "" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Slice and value different lengths." msgstr "" @@ -1994,6 +2023,10 @@ msgstr "" msgid "Stereo right must be on PWM channel B" msgstr "" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Stopping AP is not supported." +msgstr "" + #: ports/mimxrt10xx/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "Supply at least one UART pin" msgstr "" @@ -2034,6 +2067,10 @@ msgid "" "exit safe mode." msgstr "" +#: py/obj.c +msgid "The above exception was the direct cause of the following exception:" +msgstr "" + #: ports/espressif/boards/m5stack_atom_lite/mpconfigboard.h msgid "The central button was pressed at start up.\n" msgstr "" @@ -2219,11 +2256,12 @@ msgid "Unable to read color palette data" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "Unable to start mDNS query" msgstr "" -#: shared-bindings/coproc/CoprocMemory.c -msgid "Unable to write" +#: shared-bindings/memorymap/AddressRange.c +msgid "Unable to write to address." msgstr "" #: shared-bindings/nvm/ByteArray.c @@ -2295,6 +2333,7 @@ msgid "Unkown error code %d" msgstr "" #: shared-bindings/adafruit_pixelbuf/PixelBuf.c +#: shared-module/_pixelmap/PixelMap.c #, c-format msgid "Unmatched number of items on RHS (expected %d, got %d)." msgstr "" @@ -2380,6 +2419,18 @@ msgstr "" msgid "Wi-Fi: " msgstr "" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in access point mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in station mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is not enabled" +msgstr "" + #: main.c msgid "Woken up by alarm.\n" msgstr "" @@ -2468,7 +2519,7 @@ msgid "array has too many dimensions" msgstr "" #: py/objarray.c shared-bindings/alarm/SleepMemory.c -#: shared-bindings/coproc/CoprocMemory.c shared-bindings/nvm/ByteArray.c +#: shared-bindings/memorymap/AddressRange.c shared-bindings/nvm/ByteArray.c msgid "array/bytes required on right side" msgstr "" @@ -2564,10 +2615,6 @@ msgstr "buffer troppo piccolo" msgid "buffer too small for requested bytes" msgstr "" -#: shared-bindings/adafruit_pixelbuf/PixelBuf.c -msgid "byteorder is not a string" -msgstr "" - #: py/objarray.c msgid "bytes length not a multiple of item size" msgstr "" @@ -2610,14 +2657,10 @@ msgstr "impossibile assegnare all'espressione" msgid "can't cancel self" msgstr "" -#: py/obj.c py/objint.c shared-module/adafruit_pixelbuf/PixelBuf.c +#: py/obj.c py/objint.c py/runtime.c shared-module/adafruit_pixelbuf/PixelBuf.c msgid "can't convert %q to %q" msgstr "" -#: py/runtime.c -msgid "can't convert %q to int" -msgstr "" - #: py/obj.c #, fuzzy, c-format msgid "can't convert %s to complex" @@ -2699,6 +2742,10 @@ msgstr "" msgid "can't set attribute" msgstr "impossibile impostare attributo" +#: py/runtime.c +msgid "can't set attribute '%q'" +msgstr "" + #: py/emitnative.c msgid "can't store '%q'" msgstr "impossibile memorizzare '%q'" @@ -2803,10 +2850,6 @@ msgstr "il colore deve essere compreso tra 0x000000 e 0xffffff" msgid "comparison of int and uint" msgstr "" -#: py/objcomplex.c -msgid "complex division by zero" -msgstr "complex divisione per zero" - #: py/objfloat.c py/parsenum.c msgid "complex values not supported" msgstr "valori complessi non supportai" @@ -2912,12 +2955,7 @@ msgstr "" msgid "div/mod not implemented for uint" msgstr "" -#: py/objfloat.c py/objint_mpz.c -msgid "divide by zero" -msgstr "" - -#: py/modmath.c py/objint_longlong.c py/runtime.c -#: shared-bindings/math/__init__.c +#: py/runtime.c msgid "division by zero" msgstr "divisione per zero" @@ -3074,10 +3112,6 @@ msgstr "il font deve essere lungo 2048 byte" msgid "format requires a dict" msgstr "la formattazione richiede un dict" -#: shared-bindings/microcontroller/Processor.c -msgid "frequency is read-only for this board" -msgstr "" - #: py/objdeque.c msgid "full" msgstr "pieno" @@ -3191,8 +3225,12 @@ msgstr "padding incorretto" msgid "index is out of bounds" msgstr "" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "index must be tuple or int" +msgstr "" + #: extmod/ulab/code/numpy/numerical.c extmod/ulab/code/ulab_tools.c -#: ports/espressif/common-hal/pulseio/PulseIn.c py/obj.c +#: ports/espressif/common-hal/pulseio/PulseIn.c #: shared-bindings/bitmaptools/__init__.c msgid "index out of range" msgstr "indice fuori intervallo" @@ -3290,10 +3328,6 @@ msgstr "" 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" - #: extmod/ulab/code/numpy/approx.c msgid "interp is defined for 1D iterables of equal length" msgstr "" @@ -3375,10 +3409,6 @@ msgstr "sintassi invalida per l'intero con base %d" msgid "invalid syntax for number" msgstr "sintassi invalida per il numero" -#: py/objexcept.c -msgid "invalid traceback" -msgstr "" - #: py/objtype.c msgid "issubclass() arg 1 must be a class" msgstr "il primo argomento di issubclass() deve essere una classe" @@ -3440,19 +3470,17 @@ msgstr "locla '%q' utilizzato prima che il tipo fosse noto" msgid "local variable referenced before assignment" msgstr "variabile locale richiamata prima di un assegnamento" -#: py/objint.c -msgid "long int not supported in this build" -msgstr "long int non supportata in questa build" - #: ports/espressif/common-hal/canio/CAN.c msgid "loopback + silent mode not supported by peripheral" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS already initialized" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS only works with built-in WiFi" msgstr "" @@ -3581,6 +3609,10 @@ msgstr "potenza negativa senza supporto per float" msgid "negative shift count" msgstr "" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "nested index must be int" +msgstr "" + #: shared-module/sdcardio/SDCard.c msgid "no SD card" msgstr "" @@ -3763,7 +3795,7 @@ msgid "only sample_rate=16000 is supported" msgstr "" #: py/objarray.c py/objstr.c py/objstrunicode.c py/objtuple.c -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "only slices with step=1 (aka None) are supported" msgstr "solo slice con step=1 (aka None) sono supportate" @@ -3982,10 +4014,6 @@ msgstr "la lunghezza di sleed deve essere non negativa" msgid "slice step can't be zero" msgstr "" -#: py/objslice.c -msgid "slice step cannot be zero" -msgstr "la step della slice non può essere zero" - #: py/nativeglue.c msgid "slice unsupported" msgstr "" @@ -4034,10 +4062,6 @@ msgstr "" msgid "start/end indices" msgstr "" -#: shared-bindings/random/__init__.c -msgid "step must be non-zero" -msgstr "step deve essere non zero" - #: shared-bindings/random/__init__.c msgid "stop not reachable from start" msgstr "stop non raggiungibile dall'inizio" @@ -4046,10 +4070,6 @@ msgstr "stop non raggiungibile dall'inizio" msgid "stream operation not supported" msgstr "operazione di stream non supportata" -#: py/objstrunicode.c -msgid "string indices must be integers, not %q" -msgstr "" - #: py/stream.c msgid "string not supported; use bytes or bytearray" msgstr "" @@ -4082,10 +4102,6 @@ msgstr "errore di sintassi nel JSON" msgid "syntax error in uctypes descriptor" msgstr "errore di sintassi nel descrittore uctypes" -#: shared-bindings/time/__init__.c -msgid "time.struct_time() takes a 9-sequence" -msgstr "" - #: ports/atmel-samd/common-hal/watchdog/WatchDogTimer.c #: ports/espressif/common-hal/watchdog/WatchDogTimer.c #: ports/nrf/common-hal/watchdog/WatchDogTimer.c @@ -4369,10 +4385,6 @@ msgstr "" msgid "y value out of bounds" msgstr "indirizzo fuori limite" -#: py/objrange.c -msgid "zero step" -msgstr "zero step" - #: extmod/ulab/code/scipy/signal/signal.c msgid "zi must be an ndarray" msgstr "" @@ -4385,6 +4397,34 @@ msgstr "" msgid "zi must be of shape (n_section, 2)" msgstr "" +#, fuzzy +#~ msgid "Read-only object" +#~ msgstr "Sola lettura" + +#~ msgid "At most %d %q may be specified (not %d)" +#~ msgstr "Almeno %d %q devono essere specificati (non %d)" + +#~ msgid "Invalid pins" +#~ msgstr "Pin non validi" + +#~ msgid "complex division by zero" +#~ msgstr "complex divisione per zero" + +#~ msgid "int() arg 2 must be >= 2 and <= 36" +#~ msgstr "il secondo argomanto di int() deve essere >= 2 e <= 36" + +#~ msgid "long int not supported in this build" +#~ msgstr "long int non supportata in questa build" + +#~ msgid "slice step cannot be zero" +#~ msgstr "la step della slice non può essere zero" + +#~ msgid "step must be non-zero" +#~ msgstr "step deve essere non zero" + +#~ msgid "zero step" +#~ msgstr "zero step" + #~ msgid "%q indices must be integers, not %s" #~ msgstr "gli indici %q devono essere interi, non %s" diff --git a/locale/ja.po b/locale/ja.po index f0755961cf..afe7997d33 100644 --- a/locale/ja.po +++ b/locale/ja.po @@ -8,27 +8,31 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-01-04 12:55-0600\n" -"PO-Revision-Date: 2021-08-24 06:48+0000\n" -"Last-Translator: Jeff Epler \n" +"PO-Revision-Date: 2023-01-05 02:52+0000\n" +"Last-Translator: Matt Watson \n" "Language-Team: none\n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.8.1-dev\n" +"X-Generator: Weblate 4.15.1-dev\n" #: main.c msgid "" "\n" "Code done running.\n" msgstr "" +"\n" +"コード実行完了\n" #: main.c msgid "" "\n" "Code stopped by auto-reload. Reloading soon.\n" msgstr "" +"\n" +"オートリロードでコード実行は中止された。まもなくリロードする。\n" #: supervisor/shared/safe_mode.c msgid "" @@ -54,7 +58,7 @@ msgstr "" #: main.c msgid " not found.\n" -msgstr "" +msgstr " 見るからない\n" #: main.c msgid " output:\n" @@ -66,15 +70,20 @@ msgid "%%c requires int or char" msgstr "%%c にはintまたはcharが必要" #: main.c -#, c-format +#, c-format, fuzzy msgid "%02X" +msgstr "%02X" + +#: shared-module/os/getenv.c +#, c-format +msgid "%S" msgstr "" #: shared-bindings/rgbmatrix/RGBMatrix.c #, c-format msgid "" "%d address pins, %d rgb pins and %d tiles indicate a height of %d, not %d" -msgstr "" +msgstr "%dアドレスピン、%dRGBピン、%dタイルは%dの高さを指示する。%dではない。" #: ports/atmel-samd/common-hal/alarm/__init__.c #: ports/cxd56/common-hal/analogio/AnalogOut.c ports/cxd56/common-hal/rtc/RTC.c @@ -86,8 +95,9 @@ msgstr "" #: ports/raspberrypi/common-hal/analogio/AnalogOut.c #: ports/raspberrypi/common-hal/rtc/RTC.c ports/stm/common-hal/alarm/__init__.c #: ports/stm/common-hal/rtc/RTC.c +#, fuzzy msgid "%q" -msgstr "" +msgstr "%q" #: shared-bindings/microcontroller/Pin.c msgid "%q and %q contain duplicate pins" @@ -95,7 +105,7 @@ msgstr "" #: ports/atmel-samd/common-hal/audioio/AudioOut.c msgid "%q and %q must be different" -msgstr "" +msgstr "%qと%qが必ず異なるのは必要" #: shared-bindings/microcontroller/Pin.c msgid "%q contains duplicate pins" @@ -105,25 +115,30 @@ msgstr "" msgid "%q failure: %d" msgstr "%q 失敗: %d" +#: ports/espressif/common-hal/espulp/ULP.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/microcontroller/Pin.c msgid "%q in use" msgstr "%qは使用中" -#: py/obj.c py/objstr.c py/objstrunicode.c +#: py/objstr.c py/objstrunicode.c msgid "%q index out of range" msgstr "%q インデックスは範囲外" #: shared-module/bitbangio/SPI.c msgid "%q init failed" -msgstr "" +msgstr "%qは初期化には失敗" #: shared-bindings/dualbank/__init__.c msgid "%q is %q" -msgstr "" +msgstr "%qは%q" -#: py/argcheck.c +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "%q is read-only for this board" +msgstr "このボードでは%qが読み取り専用" + +#: py/argcheck.c shared-bindings/usb_hid/Device.c msgid "%q length must be %d" msgstr "" @@ -139,10 +154,6 @@ msgstr "" msgid "%q length must be >= %d" msgstr "" -#: shared-bindings/busio/I2C.c -msgid "%q length must be >= 1" -msgstr "" - #: py/argcheck.c msgid "%q must be %d" msgstr "" @@ -164,23 +175,18 @@ msgid "%q must be >= %d" msgstr "" #: shared-bindings/analogbufio/BufferedIn.c +msgid "%q must be a bytearray or array of type 'H' or 'B'" +msgstr "" + #: shared-bindings/audiocore/RawSample.c msgid "%q must be a bytearray or array of type 'h', 'H', 'b', or 'B'" msgstr "" -#: py/argcheck.c -msgid "%q must be a string" -msgstr "" - -#: py/argcheck.c -msgid "%q must be an int" -msgstr "" - -#: py/argcheck.c +#: py/argcheck.c py/obj.c py/objstrunicode.c msgid "%q must be of type %q" msgstr "" -#: shared-bindings/digitalio/Pull.c +#: py/objexcept.c shared-bindings/digitalio/Pull.c msgid "%q must be of type %q or None" msgstr "" @@ -194,7 +200,6 @@ msgstr "" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c #: ports/cxd56/common-hal/pulseio/PulseIn.c -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/nrf/common-hal/pulseio/PulseIn.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c @@ -206,8 +211,8 @@ msgstr "%q が範囲外" msgid "%q pin invalid" msgstr "%q ピンは無効" -#: shared-bindings/usb_hid/Device.c -msgid "%q with a report ID of 0 must be of length 1" +#: py/objrange.c py/objslice.c shared-bindings/random/__init__.c +msgid "%q step cannot be zero" msgstr "" #: py/bc.c py/objnamedtuple.c @@ -307,7 +312,7 @@ msgstr "" msgid "'%s' object doesn't support item deletion" msgstr "" -#: ports/raspberrypi/common-hal/wifi/Radio.c py/runtime.c +#: py/runtime.c msgid "'%s' object has no attribute '%q'" msgstr "" @@ -407,6 +412,10 @@ msgstr "" msgid "Address must be %d bytes long" msgstr "アドレスは、%dバイト長でなければなりません" +#: ports/espressif/common-hal/memorymap/AddressRange.c +msgid "Address range not allowed" +msgstr "" + #: ports/espressif/common-hal/canio/CAN.c msgid "All CAN peripherals are in use" msgstr "全てのCAN周辺機器が使用中" @@ -487,7 +496,7 @@ msgstr "すでにアドバータイズ中" msgid "Already have all-matches listener" msgstr "" -#: ports/espressif/common-hal/coproc/__init__.c +#: ports/espressif/common-hal/espulp/ULP.c #: shared-module/memorymonitor/AllocationAlarm.c #: shared-module/memorymonitor/AllocationSize.c msgid "Already running" @@ -498,6 +507,11 @@ msgstr "すでに実行中" msgid "Already scanning for wifi networks" msgstr "" +#: shared-module/os/getenv.c +#, c-format +msgid "An error occurred while retrieving '%s':\n" +msgstr "" + #: ports/stm/common-hal/audiopwmio/PWMAudioOut.c msgid "Another PWMAudioOut is already active" msgstr "" @@ -511,15 +525,11 @@ msgstr "他のsendがすでにアクティブ" msgid "Array must contain halfwords (type 'H')" msgstr "array のタイプは16ビット ('H') でなければなりません" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Array values should be single bytes." msgstr "Arrayの各値は1バイトでなければなりません" -#: shared-bindings/microcontroller/Pin.c -msgid "At most %d %q may be specified (not %d)" -msgstr "最大で %d個の %q が指定できます(%d個でなく)" - #: shared-module/memorymonitor/AllocationAlarm.c #, c-format msgid "Attempt to allocate %d blocks" @@ -903,6 +913,10 @@ msgstr "" msgid "Drive mode not used when direction is input." msgstr "方向がinputのときドライブモードは使われません" +#: py/obj.c +msgid "During handling of the above exception, another exception occurred:" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "ECB only operates on 16 bytes at a time" msgstr "ECBは一度に16バイトの演算のみを行います" @@ -932,10 +946,10 @@ msgstr "正規表現にエラーがあります" msgid "Error: Failure to bind" msgstr "" -#: py/enum.c shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c -#: shared-bindings/alarm/__init__.c shared-bindings/alarm/coproc/CoprocAlarm.c -#: shared-bindings/busio/SPI.c shared-bindings/coproc/Coproc.c -#: shared-bindings/coproc/__init__.c shared-bindings/microcontroller/Pin.c +#: ports/espressif/bindings/espulp/ULP.c py/enum.c +#: shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c +#: shared-bindings/alarm/__init__.c shared-bindings/busio/SPI.c +#: shared-bindings/microcontroller/Pin.c #: shared-bindings/neopixel_write/__init__.c msgid "Expected a %q" msgstr "%qが必要" @@ -1020,6 +1034,10 @@ msgstr "" msgid "File exists" msgstr "ファイルが存在します" +#: shared-module/os/getenv.c +msgid "File not found" +msgstr "" + #: ports/atmel-samd/common-hal/canio/Listener.c #: ports/espressif/common-hal/canio/Listener.c #: ports/stm/common-hal/canio/Listener.c @@ -1034,7 +1052,6 @@ msgstr "" msgid "Firmware is invalid" msgstr "" -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/espressif/common-hal/dualbank/__init__.c msgid "Firmware is too big" msgstr "" @@ -1076,6 +1093,8 @@ msgstr "" #: shared-bindings/displayio/Display.c #: shared-bindings/displayio/EPaperDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c +#: shared-module/displayio/Display.c +#: shared-module/framebufferio/FramebufferDisplay.c msgid "Group already used" msgstr "グループはすでに使われています" @@ -1204,6 +1223,7 @@ msgid "Internal define error" msgstr "内部定義エラー" #: ports/espressif/common-hal/paralleldisplay/ParallelBus.c +#: shared-module/os/getenv.c msgid "Internal error" msgstr "" @@ -1250,6 +1270,11 @@ msgstr "不正な引数" msgid "Invalid bits per value" msgstr "不正なbits per value" +#: shared-module/os/getenv.c +#, c-format +msgid "Invalid byte %.*s" +msgstr "" + #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #, c-format msgid "Invalid data_pins[%d]" @@ -1267,10 +1292,6 @@ msgstr "不正なメモリアクセス" msgid "Invalid multicast MAC address" msgstr "" -#: shared-bindings/busio/UART.c -msgid "Invalid pins" -msgstr "ピンが不正" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Invalid size" msgstr "" @@ -1284,10 +1305,18 @@ msgstr "" msgid "Invalid state" msgstr "" +#: shared-module/os/getenv.c +msgid "Invalid unicode escape" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "Key must be 16, 24, or 32 bytes long" msgstr "Keyの長さは、16, 24, 32バイトのいずれかでなければなりません" +#: shared-module/os/getenv.c +msgid "Key not found" +msgstr "" + #: shared-module/is31fl3741/FrameBuffer.c msgid "LED mappings must match display size" msgstr "" @@ -1394,6 +1423,10 @@ msgstr "" msgid "NVS Error" msgstr "" +#: shared-bindings/socketpool/SocketPool.c +msgid "Name or service not known" +msgstr "" + #: py/qstr.c msgid "Name too long" msgstr "名前が長すぎます" @@ -1508,11 +1541,6 @@ msgstr "キーが指定されていません" msgid "No long integer support" msgstr "long integerに対応していません" -#: shared-module/usb_hid/__init__.c -#, c-format -msgid "No more than %d HID devices allowed" -msgstr "" - #: shared-bindings/wifi/Radio.c msgid "No network with that ssid" msgstr "" @@ -1639,11 +1667,14 @@ msgid "" "%d bpp given" msgstr "" -#: ports/espressif/common-hal/alarm/coproc/CoprocAlarm.c #: ports/espressif/common-hal/alarm/touch/TouchAlarm.c msgid "Only one %q can be set in deep sleep." msgstr "" +#: ports/espressif/common-hal/espulp/ULPAlarm.c +msgid "Only one %q can be set." +msgstr "" + #: ports/espressif/common-hal/i2ctarget/I2CTarget.c #: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c msgid "Only one address is allowed" @@ -1676,6 +1707,10 @@ msgstr "" msgid "Operation timed out" msgstr "" +#: ports/raspberrypi/common-hal/mdns/Server.c +msgid "Out of MDNS service slots" +msgstr "" + #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Out of memory" msgstr "" @@ -1781,7 +1816,7 @@ msgstr "Prefixバッファはヒープ上になければなりません" #: main.c msgid "Press any key to enter the REPL. Use CTRL-D to reload.\n" -msgstr "" +msgstr "REPLに入るため、エンターキーを押す。リーロードするため、Ctl-Dを入力する。\n" #: main.c msgid "Pretending to deep sleep until alarm, CTRL-C or file write.\n" @@ -1799,6 +1834,10 @@ msgstr "" msgid "Program size invalid" msgstr "" +#: ports/espressif/common-hal/espulp/ULP.c +msgid "Program too long" +msgstr "" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." msgstr "方向がoutputのときpullは使われません" @@ -1839,7 +1878,7 @@ msgid "Random number generation error" msgstr "乱数生成エラー" #: shared-bindings/memorymonitor/AllocationSize.c -#: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/pulseio/PulseIn.c shared-module/displayio/Bitmap.c msgid "Read-only" msgstr "読み込み専用" @@ -1847,10 +1886,6 @@ msgstr "読み込み専用" msgid "Read-only filesystem" msgstr "読み込み専用のファイルシステム" -#: shared-module/displayio/Bitmap.c -msgid "Read-only object" -msgstr "読み込み専用のオブジェクト" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Received response was invalid" msgstr "" @@ -1943,7 +1978,7 @@ msgstr "サイズは対応していません" msgid "Sleep Memory not available" msgstr "" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Slice and value different lengths." msgstr "スライスと値の長さが一致しません" @@ -1980,6 +2015,10 @@ msgstr "" msgid "Stereo right must be on PWM channel B" msgstr "" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Stopping AP is not supported." +msgstr "" + #: ports/mimxrt10xx/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "Supply at least one UART pin" msgstr "少なくとも1つのUARTピンが必要" @@ -2020,6 +2059,10 @@ msgid "" "exit safe mode." msgstr "" +#: py/obj.c +msgid "The above exception was the direct cause of the following exception:" +msgstr "" + #: ports/espressif/boards/m5stack_atom_lite/mpconfigboard.h msgid "The central button was pressed at start up.\n" msgstr "" @@ -2206,11 +2249,12 @@ msgid "Unable to read color palette data" msgstr "カラーパレットデータを読み込めません" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "Unable to start mDNS query" msgstr "" -#: shared-bindings/coproc/CoprocMemory.c -msgid "Unable to write" +#: shared-bindings/memorymap/AddressRange.c +msgid "Unable to write to address." msgstr "" #: shared-bindings/nvm/ByteArray.c @@ -2281,6 +2325,7 @@ msgid "Unkown error code %d" msgstr "" #: shared-bindings/adafruit_pixelbuf/PixelBuf.c +#: shared-module/_pixelmap/PixelMap.c #, c-format msgid "Unmatched number of items on RHS (expected %d, got %d)." msgstr "右辺の要素数が一致しません (expected %d, got %d)" @@ -2365,6 +2410,18 @@ msgstr "" msgid "Wi-Fi: " msgstr "" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in access point mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in station mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is not enabled" +msgstr "" + #: main.c msgid "Woken up by alarm.\n" msgstr "" @@ -2453,7 +2510,7 @@ msgid "array has too many dimensions" msgstr "" #: py/objarray.c shared-bindings/alarm/SleepMemory.c -#: shared-bindings/coproc/CoprocMemory.c shared-bindings/nvm/ByteArray.c +#: shared-bindings/memorymap/AddressRange.c shared-bindings/nvm/ByteArray.c msgid "array/bytes required on right side" msgstr "右辺にはarray/bytesが必要" @@ -2546,10 +2603,6 @@ msgstr "" msgid "buffer too small for requested bytes" msgstr "" -#: shared-bindings/adafruit_pixelbuf/PixelBuf.c -msgid "byteorder is not a string" -msgstr "byteorderが文字列ではありません" - #: py/objarray.c msgid "bytes length not a multiple of item size" msgstr "" @@ -2591,14 +2644,10 @@ msgstr "式には代入できません" msgid "can't cancel self" msgstr "" -#: py/obj.c py/objint.c shared-module/adafruit_pixelbuf/PixelBuf.c +#: py/obj.c py/objint.c py/runtime.c shared-module/adafruit_pixelbuf/PixelBuf.c msgid "can't convert %q to %q" msgstr "%qを%qに変換できません" -#: py/runtime.c -msgid "can't convert %q to int" -msgstr "" - #: py/obj.c #, c-format msgid "can't convert %s to complex" @@ -2680,6 +2729,10 @@ msgstr "" msgid "can't set attribute" msgstr "" +#: py/runtime.c +msgid "can't set attribute '%q'" +msgstr "" + #: py/emitnative.c msgid "can't store '%q'" msgstr "" @@ -2784,10 +2837,6 @@ msgstr "色は0x000000から0xffffffでなければなりません" msgid "comparison of int and uint" msgstr "" -#: py/objcomplex.c -msgid "complex division by zero" -msgstr "複素数ゼロ除算" - #: py/objfloat.c py/parsenum.c msgid "complex values not supported" msgstr "" @@ -2892,12 +2941,7 @@ msgstr "" msgid "div/mod not implemented for uint" msgstr "" -#: py/objfloat.c py/objint_mpz.c -msgid "divide by zero" -msgstr "" - -#: py/modmath.c py/objint_longlong.c py/runtime.c -#: shared-bindings/math/__init__.c +#: py/runtime.c msgid "division by zero" msgstr "ゼロ除算 (division by zero)" @@ -3054,10 +3098,6 @@ msgstr "fontは2048バイト長でなければなりません" msgid "format requires a dict" msgstr "formatにはdictが必要" -#: shared-bindings/microcontroller/Processor.c -msgid "frequency is read-only for this board" -msgstr "" - #: py/objdeque.c msgid "full" msgstr "" @@ -3170,8 +3210,12 @@ msgstr "" msgid "index is out of bounds" msgstr "" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "index must be tuple or int" +msgstr "" + #: extmod/ulab/code/numpy/numerical.c extmod/ulab/code/ulab_tools.c -#: ports/espressif/common-hal/pulseio/PulseIn.c py/obj.c +#: ports/espressif/common-hal/pulseio/PulseIn.c #: shared-bindings/bitmaptools/__init__.c msgid "index out of range" msgstr "インデクスが範囲外" @@ -3270,10 +3314,6 @@ msgstr "" msgid "inputs are not iterable" msgstr "" -#: py/parsenum.c -msgid "int() arg 2 must be >= 2 and <= 36" -msgstr "int()の第2引数は2以上36以下でなければなりません" - #: extmod/ulab/code/numpy/approx.c msgid "interp is defined for 1D iterables of equal length" msgstr "" @@ -3355,10 +3395,6 @@ msgstr "" msgid "invalid syntax for number" msgstr "数字として不正な構文" -#: py/objexcept.c -msgid "invalid traceback" -msgstr "" - #: py/objtype.c msgid "issubclass() arg 1 must be a class" msgstr "issubclass()の第1引数はクラスでなければなりません" @@ -3415,19 +3451,17 @@ msgstr "" msgid "local variable referenced before assignment" msgstr "" -#: py/objint.c -msgid "long int not supported in this build" -msgstr "このビルドはlong intに非対応" - #: ports/espressif/common-hal/canio/CAN.c msgid "loopback + silent mode not supported by peripheral" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS already initialized" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS only works with built-in WiFi" msgstr "" @@ -3556,6 +3590,10 @@ msgstr "" msgid "negative shift count" msgstr "シフトカウントが負数" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "nested index must be int" +msgstr "" + #: shared-module/sdcardio/SDCard.c msgid "no SD card" msgstr "SDカードがありません" @@ -3735,7 +3773,7 @@ msgid "only sample_rate=16000 is supported" msgstr "" #: py/objarray.c py/objstr.c py/objstrunicode.c py/objtuple.c -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "only slices with step=1 (aka None) are supported" msgstr "" @@ -3953,10 +3991,6 @@ msgstr "sleepの長さは非負数でなければなりません" msgid "slice step can't be zero" msgstr "スライスのステップは0にできません" -#: py/objslice.c -msgid "slice step cannot be zero" -msgstr "" - #: py/nativeglue.c msgid "slice unsupported" msgstr "" @@ -4005,10 +4039,6 @@ msgstr "" msgid "start/end indices" msgstr "" -#: shared-bindings/random/__init__.c -msgid "step must be non-zero" -msgstr "stepは非ゼロ値でなければなりません" - #: shared-bindings/random/__init__.c msgid "stop not reachable from start" msgstr "" @@ -4017,10 +4047,6 @@ msgstr "" msgid "stream operation not supported" msgstr "ストリーム操作は非対応" -#: py/objstrunicode.c -msgid "string indices must be integers, not %q" -msgstr "文字列のインデクスは整数でなければなりません (%qでなく)" - #: py/stream.c msgid "string not supported; use bytes or bytearray" msgstr "文字列ではなくbytesまたはbytesarrayが必要" @@ -4053,10 +4079,6 @@ msgstr "JSONに構文エラーがあります" msgid "syntax error in uctypes descriptor" msgstr "uctypedディスクリプタの構文エラー" -#: shared-bindings/time/__init__.c -msgid "time.struct_time() takes a 9-sequence" -msgstr "time.struct_time()は9要素のシーケンスを受け取ります" - #: ports/atmel-samd/common-hal/watchdog/WatchDogTimer.c #: ports/espressif/common-hal/watchdog/WatchDogTimer.c #: ports/nrf/common-hal/watchdog/WatchDogTimer.c @@ -4338,10 +4360,6 @@ msgstr "" msgid "y value out of bounds" msgstr "yが範囲外" -#: py/objrange.c -msgid "zero step" -msgstr "ステップが0" - #: extmod/ulab/code/scipy/signal/signal.c msgid "zi must be an ndarray" msgstr "ziはndarrayでなければなりません" @@ -4354,6 +4372,39 @@ msgstr "ziはfloat値でなければなりません" msgid "zi must be of shape (n_section, 2)" msgstr "" +#~ msgid "Read-only object" +#~ msgstr "読み込み専用のオブジェクト" + +#~ msgid "At most %d %q may be specified (not %d)" +#~ msgstr "最大で %d個の %q が指定できます(%d個でなく)" + +#~ msgid "Invalid pins" +#~ msgstr "ピンが不正" + +#~ msgid "byteorder is not a string" +#~ msgstr "byteorderが文字列ではありません" + +#~ msgid "complex division by zero" +#~ msgstr "複素数ゼロ除算" + +#~ msgid "int() arg 2 must be >= 2 and <= 36" +#~ msgstr "int()の第2引数は2以上36以下でなければなりません" + +#~ msgid "long int not supported in this build" +#~ msgstr "このビルドはlong intに非対応" + +#~ msgid "step must be non-zero" +#~ msgstr "stepは非ゼロ値でなければなりません" + +#~ msgid "string indices must be integers, not %q" +#~ msgstr "文字列のインデクスは整数でなければなりません (%qでなく)" + +#~ msgid "time.struct_time() takes a 9-sequence" +#~ msgstr "time.struct_time()は9要素のシーケンスを受け取ります" + +#~ msgid "zero step" +#~ msgstr "ステップが0" + #~ msgid "WatchDogTimer.timeout must be greater than 0" #~ msgstr "WatchDogTimer.timeoutは0以上でなければなりません" diff --git a/locale/ko.po b/locale/ko.po index 4ec7ff804f..39ff657aff 100644 --- a/locale/ko.po +++ b/locale/ko.po @@ -66,6 +66,11 @@ msgstr "%%c 전수(int)또는 캐릭터(char)필요합니다" msgid "%02X" msgstr "" +#: shared-module/os/getenv.c +#, c-format +msgid "%S" +msgstr "" + #: shared-bindings/rgbmatrix/RGBMatrix.c #, c-format msgid "" @@ -101,13 +106,14 @@ msgstr "" msgid "%q failure: %d" msgstr "" +#: ports/espressif/common-hal/espulp/ULP.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/microcontroller/Pin.c msgid "%q in use" msgstr "%q 사용 중입니다" -#: py/obj.c py/objstr.c py/objstrunicode.c +#: py/objstr.c py/objstrunicode.c msgid "%q index out of range" msgstr "%q 인덱스 범위를 벗어났습니다" @@ -119,7 +125,11 @@ msgstr "" msgid "%q is %q" msgstr "" -#: py/argcheck.c +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "%q is read-only for this board" +msgstr "" + +#: py/argcheck.c shared-bindings/usb_hid/Device.c msgid "%q length must be %d" msgstr "" @@ -135,10 +145,6 @@ msgstr "" msgid "%q length must be >= %d" msgstr "" -#: shared-bindings/busio/I2C.c -msgid "%q length must be >= 1" -msgstr "" - #: py/argcheck.c msgid "%q must be %d" msgstr "" @@ -160,23 +166,18 @@ msgid "%q must be >= %d" msgstr "" #: shared-bindings/analogbufio/BufferedIn.c +msgid "%q must be a bytearray or array of type 'H' or 'B'" +msgstr "" + #: shared-bindings/audiocore/RawSample.c msgid "%q must be a bytearray or array of type 'h', 'H', 'b', or 'B'" msgstr "" -#: py/argcheck.c -msgid "%q must be a string" -msgstr "" - -#: py/argcheck.c -msgid "%q must be an int" -msgstr "" - -#: py/argcheck.c +#: py/argcheck.c py/obj.c py/objstrunicode.c msgid "%q must be of type %q" msgstr "" -#: shared-bindings/digitalio/Pull.c +#: py/objexcept.c shared-bindings/digitalio/Pull.c msgid "%q must be of type %q or None" msgstr "" @@ -190,7 +191,6 @@ msgstr "" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c #: ports/cxd56/common-hal/pulseio/PulseIn.c -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/nrf/common-hal/pulseio/PulseIn.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c @@ -202,8 +202,8 @@ msgstr "" msgid "%q pin invalid" msgstr "" -#: shared-bindings/usb_hid/Device.c -msgid "%q with a report ID of 0 must be of length 1" +#: py/objrange.c py/objslice.c shared-bindings/random/__init__.c +msgid "%q step cannot be zero" msgstr "" #: py/bc.c py/objnamedtuple.c @@ -303,7 +303,7 @@ msgstr "" msgid "'%s' object doesn't support item deletion" msgstr "" -#: ports/raspberrypi/common-hal/wifi/Radio.c py/runtime.c +#: py/runtime.c msgid "'%s' object has no attribute '%q'" msgstr "" @@ -403,6 +403,10 @@ msgstr "" msgid "Address must be %d bytes long" msgstr "" +#: ports/espressif/common-hal/memorymap/AddressRange.c +msgid "Address range not allowed" +msgstr "" + #: ports/espressif/common-hal/canio/CAN.c msgid "All CAN peripherals are in use" msgstr "" @@ -483,7 +487,7 @@ msgstr "" msgid "Already have all-matches listener" msgstr "" -#: ports/espressif/common-hal/coproc/__init__.c +#: ports/espressif/common-hal/espulp/ULP.c #: shared-module/memorymonitor/AllocationAlarm.c #: shared-module/memorymonitor/AllocationSize.c msgid "Already running" @@ -494,6 +498,11 @@ msgstr "" msgid "Already scanning for wifi networks" msgstr "" +#: shared-module/os/getenv.c +#, c-format +msgid "An error occurred while retrieving '%s':\n" +msgstr "" + #: ports/stm/common-hal/audiopwmio/PWMAudioOut.c msgid "Another PWMAudioOut is already active" msgstr "" @@ -507,15 +516,11 @@ msgstr "" msgid "Array must contain halfwords (type 'H')" msgstr "" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Array values should be single bytes." msgstr "" -#: shared-bindings/microcontroller/Pin.c -msgid "At most %d %q may be specified (not %d)" -msgstr "" - #: shared-module/memorymonitor/AllocationAlarm.c #, c-format msgid "Attempt to allocate %d blocks" @@ -897,6 +902,10 @@ msgstr "" msgid "Drive mode not used when direction is input." msgstr "" +#: py/obj.c +msgid "During handling of the above exception, another exception occurred:" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "ECB only operates on 16 bytes at a time" msgstr "" @@ -926,10 +935,10 @@ msgstr "Regex에 오류가 있습니다." msgid "Error: Failure to bind" msgstr "" -#: py/enum.c shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c -#: shared-bindings/alarm/__init__.c shared-bindings/alarm/coproc/CoprocAlarm.c -#: shared-bindings/busio/SPI.c shared-bindings/coproc/Coproc.c -#: shared-bindings/coproc/__init__.c shared-bindings/microcontroller/Pin.c +#: ports/espressif/bindings/espulp/ULP.c py/enum.c +#: shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c +#: shared-bindings/alarm/__init__.c shared-bindings/busio/SPI.c +#: shared-bindings/microcontroller/Pin.c #: shared-bindings/neopixel_write/__init__.c msgid "Expected a %q" msgstr "%q 이 예상되었습니다." @@ -1014,6 +1023,10 @@ msgstr "" msgid "File exists" msgstr "" +#: shared-module/os/getenv.c +msgid "File not found" +msgstr "" + #: ports/atmel-samd/common-hal/canio/Listener.c #: ports/espressif/common-hal/canio/Listener.c #: ports/stm/common-hal/canio/Listener.c @@ -1028,7 +1041,6 @@ msgstr "" msgid "Firmware is invalid" msgstr "" -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/espressif/common-hal/dualbank/__init__.c msgid "Firmware is too big" msgstr "" @@ -1070,6 +1082,8 @@ msgstr "" #: shared-bindings/displayio/Display.c #: shared-bindings/displayio/EPaperDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c +#: shared-module/displayio/Display.c +#: shared-module/framebufferio/FramebufferDisplay.c msgid "Group already used" msgstr "" @@ -1196,6 +1210,7 @@ msgid "Internal define error" msgstr "" #: ports/espressif/common-hal/paralleldisplay/ParallelBus.c +#: shared-module/os/getenv.c msgid "Internal error" msgstr "" @@ -1242,6 +1257,11 @@ msgstr "" msgid "Invalid bits per value" msgstr "" +#: shared-module/os/getenv.c +#, c-format +msgid "Invalid byte %.*s" +msgstr "" + #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #, c-format msgid "Invalid data_pins[%d]" @@ -1259,10 +1279,6 @@ msgstr "" msgid "Invalid multicast MAC address" msgstr "" -#: shared-bindings/busio/UART.c -msgid "Invalid pins" -msgstr "핀이 유효하지 않습니다" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Invalid size" msgstr "" @@ -1276,10 +1292,18 @@ msgstr "" msgid "Invalid state" msgstr "" +#: shared-module/os/getenv.c +msgid "Invalid unicode escape" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "Key must be 16, 24, or 32 bytes long" msgstr "" +#: shared-module/os/getenv.c +msgid "Key not found" +msgstr "" + #: shared-module/is31fl3741/FrameBuffer.c msgid "LED mappings must match display size" msgstr "" @@ -1386,6 +1410,10 @@ msgstr "" msgid "NVS Error" msgstr "" +#: shared-bindings/socketpool/SocketPool.c +msgid "Name or service not known" +msgstr "" + #: py/qstr.c msgid "Name too long" msgstr "" @@ -1500,11 +1528,6 @@ msgstr "" msgid "No long integer support" msgstr "" -#: shared-module/usb_hid/__init__.c -#, c-format -msgid "No more than %d HID devices allowed" -msgstr "" - #: shared-bindings/wifi/Radio.c msgid "No network with that ssid" msgstr "" @@ -1629,11 +1652,14 @@ msgid "" "%d bpp given" msgstr "" -#: ports/espressif/common-hal/alarm/coproc/CoprocAlarm.c #: ports/espressif/common-hal/alarm/touch/TouchAlarm.c msgid "Only one %q can be set in deep sleep." msgstr "" +#: ports/espressif/common-hal/espulp/ULPAlarm.c +msgid "Only one %q can be set." +msgstr "" + #: ports/espressif/common-hal/i2ctarget/I2CTarget.c #: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c msgid "Only one address is allowed" @@ -1666,6 +1692,10 @@ msgstr "" msgid "Operation timed out" msgstr "" +#: ports/raspberrypi/common-hal/mdns/Server.c +msgid "Out of MDNS service slots" +msgstr "" + #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Out of memory" msgstr "" @@ -1789,6 +1819,10 @@ msgstr "" msgid "Program size invalid" msgstr "" +#: ports/espressif/common-hal/espulp/ULP.c +msgid "Program too long" +msgstr "" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." msgstr "" @@ -1829,7 +1863,7 @@ msgid "Random number generation error" msgstr "" #: shared-bindings/memorymonitor/AllocationSize.c -#: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/pulseio/PulseIn.c shared-module/displayio/Bitmap.c msgid "Read-only" msgstr "" @@ -1837,10 +1871,6 @@ msgstr "" msgid "Read-only filesystem" msgstr "" -#: shared-module/displayio/Bitmap.c -msgid "Read-only object" -msgstr "" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Received response was invalid" msgstr "" @@ -1933,7 +1963,7 @@ msgstr "" msgid "Sleep Memory not available" msgstr "" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Slice and value different lengths." msgstr "" @@ -1970,6 +2000,10 @@ msgstr "" msgid "Stereo right must be on PWM channel B" msgstr "" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Stopping AP is not supported." +msgstr "" + #: ports/mimxrt10xx/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "Supply at least one UART pin" msgstr "" @@ -2010,6 +2044,10 @@ msgid "" "exit safe mode." msgstr "" +#: py/obj.c +msgid "The above exception was the direct cause of the following exception:" +msgstr "" + #: ports/espressif/boards/m5stack_atom_lite/mpconfigboard.h msgid "The central button was pressed at start up.\n" msgstr "" @@ -2196,11 +2234,12 @@ msgid "Unable to read color palette data" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "Unable to start mDNS query" msgstr "" -#: shared-bindings/coproc/CoprocMemory.c -msgid "Unable to write" +#: shared-bindings/memorymap/AddressRange.c +msgid "Unable to write to address." msgstr "" #: shared-bindings/nvm/ByteArray.c @@ -2271,6 +2310,7 @@ msgid "Unkown error code %d" msgstr "" #: shared-bindings/adafruit_pixelbuf/PixelBuf.c +#: shared-module/_pixelmap/PixelMap.c #, c-format msgid "Unmatched number of items on RHS (expected %d, got %d)." msgstr "" @@ -2355,6 +2395,18 @@ msgstr "" msgid "Wi-Fi: " msgstr "" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in access point mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in station mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is not enabled" +msgstr "" + #: main.c msgid "Woken up by alarm.\n" msgstr "" @@ -2443,7 +2495,7 @@ msgid "array has too many dimensions" msgstr "" #: py/objarray.c shared-bindings/alarm/SleepMemory.c -#: shared-bindings/coproc/CoprocMemory.c shared-bindings/nvm/ByteArray.c +#: shared-bindings/memorymap/AddressRange.c shared-bindings/nvm/ByteArray.c msgid "array/bytes required on right side" msgstr "" @@ -2536,10 +2588,6 @@ msgstr "" msgid "buffer too small for requested bytes" msgstr "" -#: shared-bindings/adafruit_pixelbuf/PixelBuf.c -msgid "byteorder is not a string" -msgstr "" - #: py/objarray.c msgid "bytes length not a multiple of item size" msgstr "" @@ -2581,14 +2629,10 @@ msgstr "" msgid "can't cancel self" msgstr "" -#: py/obj.c py/objint.c shared-module/adafruit_pixelbuf/PixelBuf.c +#: py/obj.c py/objint.c py/runtime.c shared-module/adafruit_pixelbuf/PixelBuf.c msgid "can't convert %q to %q" msgstr "" -#: py/runtime.c -msgid "can't convert %q to int" -msgstr "" - #: py/obj.c #, c-format msgid "can't convert %s to complex" @@ -2670,6 +2714,10 @@ msgstr "" msgid "can't set attribute" msgstr "" +#: py/runtime.c +msgid "can't set attribute '%q'" +msgstr "" + #: py/emitnative.c msgid "can't store '%q'" msgstr "" @@ -2772,10 +2820,6 @@ msgstr "" msgid "comparison of int and uint" msgstr "" -#: py/objcomplex.c -msgid "complex division by zero" -msgstr "" - #: py/objfloat.c py/parsenum.c msgid "complex values not supported" msgstr "" @@ -2878,12 +2922,7 @@ msgstr "" msgid "div/mod not implemented for uint" msgstr "" -#: py/objfloat.c py/objint_mpz.c -msgid "divide by zero" -msgstr "" - -#: py/modmath.c py/objint_longlong.c py/runtime.c -#: shared-bindings/math/__init__.c +#: py/runtime.c msgid "division by zero" msgstr "" @@ -3040,10 +3079,6 @@ msgstr "" msgid "format requires a dict" msgstr "" -#: shared-bindings/microcontroller/Processor.c -msgid "frequency is read-only for this board" -msgstr "" - #: py/objdeque.c msgid "full" msgstr "완전한(full)" @@ -3156,8 +3191,12 @@ msgstr "" msgid "index is out of bounds" msgstr "" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "index must be tuple or int" +msgstr "" + #: extmod/ulab/code/numpy/numerical.c extmod/ulab/code/ulab_tools.c -#: ports/espressif/common-hal/pulseio/PulseIn.c py/obj.c +#: ports/espressif/common-hal/pulseio/PulseIn.c #: shared-bindings/bitmaptools/__init__.c msgid "index out of range" msgstr "" @@ -3255,10 +3294,6 @@ msgstr "" msgid "inputs are not iterable" msgstr "" -#: py/parsenum.c -msgid "int() arg 2 must be >= 2 and <= 36" -msgstr "" - #: extmod/ulab/code/numpy/approx.c msgid "interp is defined for 1D iterables of equal length" msgstr "" @@ -3340,10 +3375,6 @@ msgstr "구문(syntax)가 정수가 유효하지 않습니다" msgid "invalid syntax for number" msgstr "숫자에 대한 구문(syntax)가 유효하지 않습니다" -#: py/objexcept.c -msgid "invalid traceback" -msgstr "" - #: py/objtype.c msgid "issubclass() arg 1 must be a class" msgstr "" @@ -3400,19 +3431,17 @@ msgstr "" msgid "local variable referenced before assignment" msgstr "" -#: py/objint.c -msgid "long int not supported in this build" -msgstr "" - #: ports/espressif/common-hal/canio/CAN.c msgid "loopback + silent mode not supported by peripheral" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS already initialized" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS only works with built-in WiFi" msgstr "" @@ -3541,6 +3570,10 @@ msgstr "" msgid "negative shift count" msgstr "" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "nested index must be int" +msgstr "" + #: shared-module/sdcardio/SDCard.c msgid "no SD card" msgstr "" @@ -3720,7 +3753,7 @@ msgid "only sample_rate=16000 is supported" msgstr "" #: py/objarray.c py/objstr.c py/objstrunicode.c py/objtuple.c -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "only slices with step=1 (aka None) are supported" msgstr "" @@ -3936,10 +3969,6 @@ msgstr "" msgid "slice step can't be zero" msgstr "" -#: py/objslice.c -msgid "slice step cannot be zero" -msgstr "" - #: py/nativeglue.c msgid "slice unsupported" msgstr "" @@ -3988,10 +4017,6 @@ msgstr "" msgid "start/end indices" msgstr "" -#: shared-bindings/random/__init__.c -msgid "step must be non-zero" -msgstr "" - #: shared-bindings/random/__init__.c msgid "stop not reachable from start" msgstr "" @@ -4000,10 +4025,6 @@ msgstr "" msgid "stream operation not supported" msgstr "" -#: py/objstrunicode.c -msgid "string indices must be integers, not %q" -msgstr "" - #: py/stream.c msgid "string not supported; use bytes or bytearray" msgstr "" @@ -4036,10 +4057,6 @@ msgstr "" msgid "syntax error in uctypes descriptor" msgstr "" -#: shared-bindings/time/__init__.c -msgid "time.struct_time() takes a 9-sequence" -msgstr "" - #: ports/atmel-samd/common-hal/watchdog/WatchDogTimer.c #: ports/espressif/common-hal/watchdog/WatchDogTimer.c #: ports/nrf/common-hal/watchdog/WatchDogTimer.c @@ -4321,10 +4338,6 @@ msgstr "" msgid "y value out of bounds" msgstr "" -#: py/objrange.c -msgid "zero step" -msgstr "" - #: extmod/ulab/code/scipy/signal/signal.c msgid "zi must be an ndarray" msgstr "" @@ -4337,6 +4350,9 @@ msgstr "" msgid "zi must be of shape (n_section, 2)" msgstr "" +#~ msgid "Invalid pins" +#~ msgstr "핀이 유효하지 않습니다" + #~ msgid "%q indices must be integers, not %s" #~ msgstr "%q 인덱스는 %s 가 아닌 정수 여야합니다" diff --git a/locale/nl.po b/locale/nl.po index fc1e1f77b8..79b6333de4 100644 --- a/locale/nl.po +++ b/locale/nl.po @@ -68,6 +68,11 @@ msgstr "%%c vereist een int of char" msgid "%02X" msgstr "" +#: shared-module/os/getenv.c +#, c-format +msgid "%S" +msgstr "" + #: shared-bindings/rgbmatrix/RGBMatrix.c #, c-format msgid "" @@ -103,13 +108,14 @@ msgstr "" msgid "%q failure: %d" msgstr "%q fout: %d" +#: ports/espressif/common-hal/espulp/ULP.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/microcontroller/Pin.c msgid "%q in use" msgstr "%q in gebruik" -#: py/obj.c py/objstr.c py/objstrunicode.c +#: py/objstr.c py/objstrunicode.c msgid "%q index out of range" msgstr "%q index buiten bereik" @@ -121,7 +127,11 @@ msgstr "" msgid "%q is %q" msgstr "" -#: py/argcheck.c +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "%q is read-only for this board" +msgstr "" + +#: py/argcheck.c shared-bindings/usb_hid/Device.c msgid "%q length must be %d" msgstr "" @@ -137,10 +147,6 @@ msgstr "" msgid "%q length must be >= %d" msgstr "" -#: shared-bindings/busio/I2C.c -msgid "%q length must be >= 1" -msgstr "" - #: py/argcheck.c msgid "%q must be %d" msgstr "" @@ -162,23 +168,18 @@ msgid "%q must be >= %d" msgstr "" #: shared-bindings/analogbufio/BufferedIn.c +msgid "%q must be a bytearray or array of type 'H' or 'B'" +msgstr "" + #: shared-bindings/audiocore/RawSample.c msgid "%q must be a bytearray or array of type 'h', 'H', 'b', or 'B'" msgstr "" -#: py/argcheck.c -msgid "%q must be a string" -msgstr "" - -#: py/argcheck.c -msgid "%q must be an int" -msgstr "" - -#: py/argcheck.c +#: py/argcheck.c py/obj.c py/objstrunicode.c msgid "%q must be of type %q" msgstr "" -#: shared-bindings/digitalio/Pull.c +#: py/objexcept.c shared-bindings/digitalio/Pull.c msgid "%q must be of type %q or None" msgstr "" @@ -192,7 +193,6 @@ msgstr "" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c #: ports/cxd56/common-hal/pulseio/PulseIn.c -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/nrf/common-hal/pulseio/PulseIn.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c @@ -204,8 +204,8 @@ msgstr "%q buiten bereik" msgid "%q pin invalid" msgstr "%q pin onjuist" -#: shared-bindings/usb_hid/Device.c -msgid "%q with a report ID of 0 must be of length 1" +#: py/objrange.c py/objslice.c shared-bindings/random/__init__.c +msgid "%q step cannot be zero" msgstr "" #: py/bc.c py/objnamedtuple.c @@ -283,7 +283,7 @@ msgstr "'%s' verwacht op zijn meest r%d" #: py/emitinlinethumb.c #, c-format msgid "'%s' expects {r0, r1, ...}" -msgstr "'%s' verwacht {r0, r1, …}" +msgstr "'%s' verwacht {r0, r1, ...}" #: py/emitinlinextensa.c #, c-format @@ -305,7 +305,7 @@ msgstr "" msgid "'%s' object doesn't support item deletion" msgstr "" -#: ports/raspberrypi/common-hal/wifi/Radio.c py/runtime.c +#: py/runtime.c msgid "'%s' object has no attribute '%q'" msgstr "'%s' object heeft geen attribuut '%q'" @@ -405,6 +405,10 @@ msgstr "ADC2 wordt gebruikt door WiFi" msgid "Address must be %d bytes long" msgstr "Adres moet %d bytes lang zijn" +#: ports/espressif/common-hal/memorymap/AddressRange.c +msgid "Address range not allowed" +msgstr "" + #: ports/espressif/common-hal/canio/CAN.c msgid "All CAN peripherals are in use" msgstr "Alle CAN-peripherals zijn in gebruik" @@ -485,7 +489,7 @@ msgstr "Advertising is al bezig." msgid "Already have all-matches listener" msgstr "Heeft al een luisteraar voor 'all-matches'" -#: ports/espressif/common-hal/coproc/__init__.c +#: ports/espressif/common-hal/espulp/ULP.c #: shared-module/memorymonitor/AllocationAlarm.c #: shared-module/memorymonitor/AllocationSize.c msgid "Already running" @@ -496,6 +500,11 @@ msgstr "Wordt al uitgevoerd" msgid "Already scanning for wifi networks" msgstr "Zoekt al naar WiFi netwerken" +#: shared-module/os/getenv.c +#, c-format +msgid "An error occurred while retrieving '%s':\n" +msgstr "" + #: ports/stm/common-hal/audiopwmio/PWMAudioOut.c msgid "Another PWMAudioOut is already active" msgstr "" @@ -509,15 +518,11 @@ msgstr "Een andere send is al actief" msgid "Array must contain halfwords (type 'H')" msgstr "Array moet halfwords (type 'H') bevatten" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Array values should be single bytes." msgstr "Array waardes moet enkele bytes zijn." -#: shared-bindings/microcontroller/Pin.c -msgid "At most %d %q may be specified (not %d)" -msgstr "Op zijn meest %d %q mogen worden gespecificeerd (niet %d)" - #: shared-module/memorymonitor/AllocationAlarm.c #, c-format msgid "Attempt to allocate %d blocks" @@ -902,6 +907,10 @@ msgstr "" msgid "Drive mode not used when direction is input." msgstr "Drive modus niet gebruikt als de richting input is." +#: py/obj.c +msgid "During handling of the above exception, another exception occurred:" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "ECB only operates on 16 bytes at a time" msgstr "ECB werkt alleen met 16 bytes tegelijkertijd" @@ -931,10 +940,10 @@ msgstr "Fout in regex" msgid "Error: Failure to bind" msgstr "" -#: py/enum.c shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c -#: shared-bindings/alarm/__init__.c shared-bindings/alarm/coproc/CoprocAlarm.c -#: shared-bindings/busio/SPI.c shared-bindings/coproc/Coproc.c -#: shared-bindings/coproc/__init__.c shared-bindings/microcontroller/Pin.c +#: ports/espressif/bindings/espulp/ULP.c py/enum.c +#: shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c +#: shared-bindings/alarm/__init__.c shared-bindings/busio/SPI.c +#: shared-bindings/microcontroller/Pin.c #: shared-bindings/neopixel_write/__init__.c msgid "Expected a %q" msgstr "Verwacht een %q" @@ -1019,6 +1028,10 @@ msgstr "" msgid "File exists" msgstr "Bestand bestaat" +#: shared-module/os/getenv.c +msgid "File not found" +msgstr "" + #: ports/atmel-samd/common-hal/canio/Listener.c #: ports/espressif/common-hal/canio/Listener.c #: ports/stm/common-hal/canio/Listener.c @@ -1033,7 +1046,6 @@ msgstr "" msgid "Firmware is invalid" msgstr "" -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/espressif/common-hal/dualbank/__init__.c msgid "Firmware is too big" msgstr "" @@ -1076,6 +1088,8 @@ msgstr "" #: shared-bindings/displayio/Display.c #: shared-bindings/displayio/EPaperDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c +#: shared-module/displayio/Display.c +#: shared-module/framebufferio/FramebufferDisplay.c msgid "Group already used" msgstr "Groep al gebruikt" @@ -1204,6 +1218,7 @@ msgid "Internal define error" msgstr "Interne define fout" #: ports/espressif/common-hal/paralleldisplay/ParallelBus.c +#: shared-module/os/getenv.c msgid "Internal error" msgstr "" @@ -1250,6 +1265,11 @@ msgstr "Ongeldig argument" msgid "Invalid bits per value" msgstr "Ongeldige bits per waarde" +#: shared-module/os/getenv.c +#, c-format +msgid "Invalid byte %.*s" +msgstr "" + #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #, c-format msgid "Invalid data_pins[%d]" @@ -1267,10 +1287,6 @@ msgstr "Ongeldig geheugen adres." msgid "Invalid multicast MAC address" msgstr "" -#: shared-bindings/busio/UART.c -msgid "Invalid pins" -msgstr "Ongeldige pinnen" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Invalid size" msgstr "" @@ -1284,10 +1300,18 @@ msgstr "" msgid "Invalid state" msgstr "" +#: shared-module/os/getenv.c +msgid "Invalid unicode escape" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "Key must be 16, 24, or 32 bytes long" msgstr "Sleutel moet 16, 24, of 32 bytes lang zijn" +#: shared-module/os/getenv.c +msgid "Key not found" +msgstr "" + #: shared-module/is31fl3741/FrameBuffer.c msgid "LED mappings must match display size" msgstr "" @@ -1394,6 +1418,10 @@ msgstr "" msgid "NVS Error" msgstr "NVS-fout" +#: shared-bindings/socketpool/SocketPool.c +msgid "Name or service not known" +msgstr "" + #: py/qstr.c msgid "Name too long" msgstr "Naam te lang" @@ -1508,11 +1536,6 @@ msgstr "Een sleutel was niet gespecificeerd" msgid "No long integer support" msgstr "Geen lange integer ondersteuning" -#: shared-module/usb_hid/__init__.c -#, c-format -msgid "No more than %d HID devices allowed" -msgstr "" - #: shared-bindings/wifi/Radio.c msgid "No network with that ssid" msgstr "Geen netwerk met dat SSID gevonden" @@ -1643,11 +1666,14 @@ msgstr "" "Alleen monochrome en 4bpp of 8bpp, en 16bpp of grotere geïndiceerde BMP's " "zijn ondersteund: %d bpp is gegeven" -#: ports/espressif/common-hal/alarm/coproc/CoprocAlarm.c #: ports/espressif/common-hal/alarm/touch/TouchAlarm.c msgid "Only one %q can be set in deep sleep." msgstr "" +#: ports/espressif/common-hal/espulp/ULPAlarm.c +msgid "Only one %q can be set." +msgstr "" + #: ports/espressif/common-hal/i2ctarget/I2CTarget.c #: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c msgid "Only one address is allowed" @@ -1680,6 +1706,10 @@ msgstr "" msgid "Operation timed out" msgstr "" +#: ports/raspberrypi/common-hal/mdns/Server.c +msgid "Out of MDNS service slots" +msgstr "" + #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Out of memory" msgstr "" @@ -1810,6 +1840,10 @@ msgstr "" msgid "Program size invalid" msgstr "" +#: ports/espressif/common-hal/espulp/ULP.c +msgid "Program too long" +msgstr "" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." msgstr "Pull niet gebruikt wanneer de richting output is." @@ -1850,7 +1884,7 @@ msgid "Random number generation error" msgstr "Random number generatie fout" #: shared-bindings/memorymonitor/AllocationSize.c -#: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/pulseio/PulseIn.c shared-module/displayio/Bitmap.c msgid "Read-only" msgstr "Alleen-lezen" @@ -1858,10 +1892,6 @@ msgstr "Alleen-lezen" msgid "Read-only filesystem" msgstr "Alleen-lezen bestandssysteem" -#: shared-module/displayio/Bitmap.c -msgid "Read-only object" -msgstr "Alleen-lezen object" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Received response was invalid" msgstr "" @@ -1954,7 +1984,7 @@ msgstr "Afmeting niet ondersteund" msgid "Sleep Memory not available" msgstr "" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Slice and value different lengths." msgstr "Slice en waarde hebben verschillende lengtes." @@ -1991,6 +2021,10 @@ msgstr "" msgid "Stereo right must be on PWM channel B" msgstr "" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Stopping AP is not supported." +msgstr "" + #: ports/mimxrt10xx/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "Supply at least one UART pin" msgstr "Geef op zijn minst 1 UART pin op" @@ -2031,6 +2065,10 @@ msgid "" "exit safe mode." msgstr "" +#: py/obj.c +msgid "The above exception was the direct cause of the following exception:" +msgstr "" + #: ports/espressif/boards/m5stack_atom_lite/mpconfigboard.h msgid "The central button was pressed at start up.\n" msgstr "" @@ -2216,11 +2254,12 @@ msgid "Unable to read color palette data" msgstr "Niet in staat kleurenpalet data te lezen" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "Unable to start mDNS query" msgstr "" -#: shared-bindings/coproc/CoprocMemory.c -msgid "Unable to write" +#: shared-bindings/memorymap/AddressRange.c +msgid "Unable to write to address." msgstr "" #: shared-bindings/nvm/ByteArray.c @@ -2291,6 +2330,7 @@ msgid "Unkown error code %d" msgstr "" #: shared-bindings/adafruit_pixelbuf/PixelBuf.c +#: shared-module/_pixelmap/PixelMap.c #, c-format msgid "Unmatched number of items on RHS (expected %d, got %d)." msgstr "Niet overeenkomend aantal RHS items (verwachtte %d, kreeg %d)." @@ -2381,6 +2421,18 @@ msgstr "" msgid "Wi-Fi: " msgstr "" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in access point mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in station mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is not enabled" +msgstr "" + #: main.c msgid "Woken up by alarm.\n" msgstr "Gewekt door alarm.\n" @@ -2469,7 +2521,7 @@ msgid "array has too many dimensions" msgstr "" #: py/objarray.c shared-bindings/alarm/SleepMemory.c -#: shared-bindings/coproc/CoprocMemory.c shared-bindings/nvm/ByteArray.c +#: shared-bindings/memorymap/AddressRange.c shared-bindings/nvm/ByteArray.c msgid "array/bytes required on right side" msgstr "array/bytes vereist aan de rechterkant" @@ -2562,10 +2614,6 @@ msgstr "buffer te klein" msgid "buffer too small for requested bytes" msgstr "buffer te klein voor gevraagde bytes" -#: shared-bindings/adafruit_pixelbuf/PixelBuf.c -msgid "byteorder is not a string" -msgstr "byteorder is geen string" - #: py/objarray.c msgid "bytes length not a multiple of item size" msgstr "bytes lengte is geen veelvoud van itemgrootte" @@ -2608,14 +2656,10 @@ msgstr "kan niet toewijzen aan expressie" msgid "can't cancel self" msgstr "" -#: py/obj.c py/objint.c shared-module/adafruit_pixelbuf/PixelBuf.c +#: py/obj.c py/objint.c py/runtime.c shared-module/adafruit_pixelbuf/PixelBuf.c msgid "can't convert %q to %q" msgstr "kan %q niet naar %q converteren" -#: py/runtime.c -msgid "can't convert %q to int" -msgstr "" - #: py/obj.c #, c-format msgid "can't convert %s to complex" @@ -2697,6 +2741,10 @@ msgstr "kan geen 512 blokgrootte instellen" msgid "can't set attribute" msgstr "kan attribute niet instellen" +#: py/runtime.c +msgid "can't set attribute '%q'" +msgstr "" + #: py/emitnative.c msgid "can't store '%q'" msgstr "kan '%q' niet opslaan" @@ -2799,10 +2847,6 @@ msgstr "kleur moet tussen 0x000000 en 0xffffff liggen" msgid "comparison of int and uint" msgstr "" -#: py/objcomplex.c -msgid "complex division by zero" -msgstr "complexe deling door 0" - #: py/objfloat.c py/parsenum.c msgid "complex values not supported" msgstr "complexe waardes niet ondersteund" @@ -2907,12 +2951,7 @@ msgstr "" msgid "div/mod not implemented for uint" msgstr "" -#: py/objfloat.c py/objint_mpz.c -msgid "divide by zero" -msgstr "" - -#: py/modmath.c py/objint_longlong.c py/runtime.c -#: shared-bindings/math/__init__.c +#: py/runtime.c msgid "division by zero" msgstr "deling door nul" @@ -3069,10 +3108,6 @@ msgstr "lettertype moet 2048 bytes lang zijn" msgid "format requires a dict" msgstr "format vereist een dict" -#: shared-bindings/microcontroller/Processor.c -msgid "frequency is read-only for this board" -msgstr "" - #: py/objdeque.c msgid "full" msgstr "vol" @@ -3186,8 +3221,12 @@ msgstr "vulling (padding) is onjuist" msgid "index is out of bounds" msgstr "index is buiten bereik" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "index must be tuple or int" +msgstr "" + #: extmod/ulab/code/numpy/numerical.c extmod/ulab/code/ulab_tools.c -#: ports/espressif/common-hal/pulseio/PulseIn.c py/obj.c +#: ports/espressif/common-hal/pulseio/PulseIn.c #: shared-bindings/bitmaptools/__init__.c msgid "index out of range" msgstr "index is buiten bereik" @@ -3285,10 +3324,6 @@ msgstr "invoervectors moeten van gelijke lengte zijn" msgid "inputs are not iterable" msgstr "invoer is niet itereerbaar" -#: py/parsenum.c -msgid "int() arg 2 must be >= 2 and <= 36" -msgstr "int() argument 2 moet >=2 en <= 36 zijn" - #: extmod/ulab/code/numpy/approx.c msgid "interp is defined for 1D iterables of equal length" msgstr "" @@ -3370,10 +3405,6 @@ msgstr "ongeldige syntax voor integer met grondtal %d" msgid "invalid syntax for number" msgstr "ongeldige syntax voor nummer" -#: py/objexcept.c -msgid "invalid traceback" -msgstr "" - #: py/objtype.c msgid "issubclass() arg 1 must be a class" msgstr "issubclass() argument 1 moet een klasse zijn" @@ -3433,19 +3464,17 @@ msgstr "lokale '%q' gebruikt voordat type bekend is" msgid "local variable referenced before assignment" msgstr "verwijzing naar een (nog) niet toegewezen lokale variabele" -#: py/objint.c -msgid "long int not supported in this build" -msgstr "long int wordt niet ondersteund in deze build" - #: ports/espressif/common-hal/canio/CAN.c msgid "loopback + silent mode not supported by peripheral" msgstr "loopback + silent mode wordt niet ondersteund door randapparaat" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS already initialized" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS only works with built-in WiFi" msgstr "" @@ -3574,6 +3603,10 @@ msgstr "negatieve macht terwijl er geen ondersteuning is voor float" msgid "negative shift count" msgstr "negatieve verschuivingstelling (shift count)" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "nested index must be int" +msgstr "" + #: shared-module/sdcardio/SDCard.c msgid "no SD card" msgstr "geen SD kaart" @@ -3753,7 +3786,7 @@ msgid "only sample_rate=16000 is supported" msgstr "alleen sample_rate=16000 wordt ondersteund" #: py/objarray.c py/objstr.c py/objstrunicode.c py/objtuple.c -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "only slices with step=1 (aka None) are supported" msgstr "alleen segmenten met step=1 (ook wel None) worden ondersteund" @@ -3969,10 +4002,6 @@ msgstr "de slaapduur mag niet negatief zijn" msgid "slice step can't be zero" msgstr "segmentstap mag niet nul zijn" -#: py/objslice.c -msgid "slice step cannot be zero" -msgstr "segmentstap mag niet nul zijn" - #: py/nativeglue.c msgid "slice unsupported" msgstr "" @@ -4021,10 +4050,6 @@ msgstr "" msgid "start/end indices" msgstr "start/stop indices" -#: shared-bindings/random/__init__.c -msgid "step must be non-zero" -msgstr "step mag geen nul zijn" - #: shared-bindings/random/__init__.c msgid "stop not reachable from start" msgstr "stop is niet bereikbaar vanaf start" @@ -4033,10 +4058,6 @@ msgstr "stop is niet bereikbaar vanaf start" msgid "stream operation not supported" msgstr "stream operatie niet ondersteund" -#: py/objstrunicode.c -msgid "string indices must be integers, not %q" -msgstr "string indices moeten integers zijn, geen %q" - #: py/stream.c msgid "string not supported; use bytes or bytearray" msgstr "string niet ondersteund; gebruik bytes of bytearray" @@ -4069,10 +4090,6 @@ msgstr "syntaxisfout in JSON" msgid "syntax error in uctypes descriptor" msgstr "syntaxisfout in uctypes aanduiding" -#: shared-bindings/time/__init__.c -msgid "time.struct_time() takes a 9-sequence" -msgstr "time.struct_time() accepteert een 9-rij" - #: ports/atmel-samd/common-hal/watchdog/WatchDogTimer.c #: ports/espressif/common-hal/watchdog/WatchDogTimer.c #: ports/nrf/common-hal/watchdog/WatchDogTimer.c @@ -4354,10 +4371,6 @@ msgstr "" msgid "y value out of bounds" msgstr "y-waarde buiten bereik" -#: py/objrange.c -msgid "zero step" -msgstr "nul-stap" - #: extmod/ulab/code/scipy/signal/signal.c msgid "zi must be an ndarray" msgstr "zi moet een ndarray zijn" @@ -4370,6 +4383,42 @@ 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 "Read-only object" +#~ msgstr "Alleen-lezen object" + +#~ msgid "At most %d %q may be specified (not %d)" +#~ msgstr "Op zijn meest %d %q mogen worden gespecificeerd (niet %d)" + +#~ msgid "Invalid pins" +#~ msgstr "Ongeldige pinnen" + +#~ msgid "byteorder is not a string" +#~ msgstr "byteorder is geen string" + +#~ msgid "complex division by zero" +#~ msgstr "complexe deling door 0" + +#~ msgid "int() arg 2 must be >= 2 and <= 36" +#~ msgstr "int() argument 2 moet >=2 en <= 36 zijn" + +#~ msgid "long int not supported in this build" +#~ msgstr "long int wordt niet ondersteund in deze build" + +#~ msgid "slice step cannot be zero" +#~ msgstr "segmentstap mag niet nul zijn" + +#~ msgid "step must be non-zero" +#~ msgstr "step mag geen nul zijn" + +#~ msgid "string indices must be integers, not %q" +#~ msgstr "string indices moeten integers zijn, geen %q" + +#~ msgid "time.struct_time() takes a 9-sequence" +#~ msgstr "time.struct_time() accepteert een 9-rij" + +#~ msgid "zero step" +#~ msgstr "nul-stap" + #~ msgid "%q indices must be integers, not %s" #~ msgstr "%q indexen moeten integers zijn, niet %s" diff --git a/locale/pl.po b/locale/pl.po index 22eacea387..814a5d06d4 100644 --- a/locale/pl.po +++ b/locale/pl.po @@ -70,6 +70,11 @@ msgstr "%%c wymaga int lub char" msgid "%02X" msgstr "" +#: shared-module/os/getenv.c +#, c-format +msgid "%S" +msgstr "" + #: shared-bindings/rgbmatrix/RGBMatrix.c #, c-format msgid "" @@ -105,13 +110,14 @@ msgstr "" msgid "%q failure: %d" msgstr "%q niepowodzenie: %d" +#: ports/espressif/common-hal/espulp/ULP.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/microcontroller/Pin.c msgid "%q in use" msgstr "%q w użyciu" -#: py/obj.c py/objstr.c py/objstrunicode.c +#: py/objstr.c py/objstrunicode.c msgid "%q index out of range" msgstr "%q poza zakresem" @@ -123,7 +129,11 @@ msgstr "" msgid "%q is %q" msgstr "" -#: py/argcheck.c +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "%q is read-only for this board" +msgstr "" + +#: py/argcheck.c shared-bindings/usb_hid/Device.c msgid "%q length must be %d" msgstr "" @@ -139,10 +149,6 @@ msgstr "" msgid "%q length must be >= %d" msgstr "" -#: shared-bindings/busio/I2C.c -msgid "%q length must be >= 1" -msgstr "" - #: py/argcheck.c msgid "%q must be %d" msgstr "" @@ -164,23 +170,18 @@ msgid "%q must be >= %d" msgstr "" #: shared-bindings/analogbufio/BufferedIn.c +msgid "%q must be a bytearray or array of type 'H' or 'B'" +msgstr "" + #: shared-bindings/audiocore/RawSample.c msgid "%q must be a bytearray or array of type 'h', 'H', 'b', or 'B'" msgstr "" -#: py/argcheck.c -msgid "%q must be a string" -msgstr "" - -#: py/argcheck.c -msgid "%q must be an int" -msgstr "" - -#: py/argcheck.c +#: py/argcheck.c py/obj.c py/objstrunicode.c msgid "%q must be of type %q" msgstr "" -#: shared-bindings/digitalio/Pull.c +#: py/objexcept.c shared-bindings/digitalio/Pull.c msgid "%q must be of type %q or None" msgstr "" @@ -194,7 +195,6 @@ msgstr "" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c #: ports/cxd56/common-hal/pulseio/PulseIn.c -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/nrf/common-hal/pulseio/PulseIn.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c @@ -206,8 +206,8 @@ msgstr "%q poza zakresem" msgid "%q pin invalid" msgstr "nieprawidłowy pin %q" -#: shared-bindings/usb_hid/Device.c -msgid "%q with a report ID of 0 must be of length 1" +#: py/objrange.c py/objslice.c shared-bindings/random/__init__.c +msgid "%q step cannot be zero" msgstr "" #: py/bc.c py/objnamedtuple.c @@ -307,7 +307,7 @@ msgstr "" msgid "'%s' object doesn't support item deletion" msgstr "" -#: ports/raspberrypi/common-hal/wifi/Radio.c py/runtime.c +#: py/runtime.c msgid "'%s' object has no attribute '%q'" msgstr "'%s' obiekt nie ma atrybutu '%q'" @@ -407,6 +407,10 @@ msgstr "ADC2 jest używany przez WiFi" msgid "Address must be %d bytes long" msgstr "Adres musi mieć %d bajtów" +#: ports/espressif/common-hal/memorymap/AddressRange.c +msgid "Address range not allowed" +msgstr "" + #: ports/espressif/common-hal/canio/CAN.c msgid "All CAN peripherals are in use" msgstr "" @@ -487,7 +491,7 @@ msgstr "" msgid "Already have all-matches listener" msgstr "" -#: ports/espressif/common-hal/coproc/__init__.c +#: ports/espressif/common-hal/espulp/ULP.c #: shared-module/memorymonitor/AllocationAlarm.c #: shared-module/memorymonitor/AllocationSize.c msgid "Already running" @@ -498,6 +502,11 @@ msgstr "" msgid "Already scanning for wifi networks" msgstr "" +#: shared-module/os/getenv.c +#, c-format +msgid "An error occurred while retrieving '%s':\n" +msgstr "" + #: ports/stm/common-hal/audiopwmio/PWMAudioOut.c msgid "Another PWMAudioOut is already active" msgstr "" @@ -511,15 +520,11 @@ msgstr "Wysyłanie jest już w toku" msgid "Array must contain halfwords (type 'H')" msgstr "Tablica musi zawierać pół-słowa (typ 'H')" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Array values should be single bytes." msgstr "Wartości powinny być bajtami." -#: shared-bindings/microcontroller/Pin.c -msgid "At most %d %q may be specified (not %d)" -msgstr "" - #: shared-module/memorymonitor/AllocationAlarm.c #, c-format msgid "Attempt to allocate %d blocks" @@ -903,6 +908,10 @@ msgstr "" msgid "Drive mode not used when direction is input." msgstr "Tryb sterowania nieużywany w trybie wejścia." +#: py/obj.c +msgid "During handling of the above exception, another exception occurred:" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "ECB only operates on 16 bytes at a time" msgstr "ECB działa tylko na 16 bajtach naraz" @@ -932,10 +941,10 @@ msgstr "Błąd w regex" msgid "Error: Failure to bind" msgstr "" -#: py/enum.c shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c -#: shared-bindings/alarm/__init__.c shared-bindings/alarm/coproc/CoprocAlarm.c -#: shared-bindings/busio/SPI.c shared-bindings/coproc/Coproc.c -#: shared-bindings/coproc/__init__.c shared-bindings/microcontroller/Pin.c +#: ports/espressif/bindings/espulp/ULP.c py/enum.c +#: shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c +#: shared-bindings/alarm/__init__.c shared-bindings/busio/SPI.c +#: shared-bindings/microcontroller/Pin.c #: shared-bindings/neopixel_write/__init__.c msgid "Expected a %q" msgstr "Oczekiwano %q" @@ -1020,6 +1029,10 @@ msgstr "" msgid "File exists" msgstr "Plik istnieje" +#: shared-module/os/getenv.c +msgid "File not found" +msgstr "" + #: ports/atmel-samd/common-hal/canio/Listener.c #: ports/espressif/common-hal/canio/Listener.c #: ports/stm/common-hal/canio/Listener.c @@ -1034,7 +1047,6 @@ msgstr "" msgid "Firmware is invalid" msgstr "" -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/espressif/common-hal/dualbank/__init__.c msgid "Firmware is too big" msgstr "" @@ -1076,6 +1088,8 @@ msgstr "" #: shared-bindings/displayio/Display.c #: shared-bindings/displayio/EPaperDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c +#: shared-module/displayio/Display.c +#: shared-module/framebufferio/FramebufferDisplay.c msgid "Group already used" msgstr "Grupa już używana" @@ -1204,6 +1218,7 @@ msgid "Internal define error" msgstr "" #: ports/espressif/common-hal/paralleldisplay/ParallelBus.c +#: shared-module/os/getenv.c msgid "Internal error" msgstr "" @@ -1250,6 +1265,11 @@ msgstr "Zły argument" msgid "Invalid bits per value" msgstr "Zła liczba bitów wartości" +#: shared-module/os/getenv.c +#, c-format +msgid "Invalid byte %.*s" +msgstr "" + #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #, c-format msgid "Invalid data_pins[%d]" @@ -1267,10 +1287,6 @@ msgstr "Nieprawidłowy dostęp do pamięci." msgid "Invalid multicast MAC address" msgstr "" -#: shared-bindings/busio/UART.c -msgid "Invalid pins" -msgstr "Złe nóżki" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Invalid size" msgstr "Nieprawidłowy rozmiar" @@ -1284,10 +1300,18 @@ msgstr "" msgid "Invalid state" msgstr "Nieprawidłowy stan" +#: shared-module/os/getenv.c +msgid "Invalid unicode escape" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "Key must be 16, 24, or 32 bytes long" msgstr "Klucz musi mieć długość 16, 24 lub 32 bajtów" +#: shared-module/os/getenv.c +msgid "Key not found" +msgstr "" + #: shared-module/is31fl3741/FrameBuffer.c msgid "LED mappings must match display size" msgstr "" @@ -1394,6 +1418,10 @@ msgstr "" msgid "NVS Error" msgstr "" +#: shared-bindings/socketpool/SocketPool.c +msgid "Name or service not known" +msgstr "" + #: py/qstr.c msgid "Name too long" msgstr "Za długa nazwa" @@ -1508,11 +1536,6 @@ msgstr "Nie określono klucza" msgid "No long integer support" msgstr "" -#: shared-module/usb_hid/__init__.c -#, c-format -msgid "No more than %d HID devices allowed" -msgstr "" - #: shared-bindings/wifi/Radio.c msgid "No network with that ssid" msgstr "" @@ -1637,11 +1660,14 @@ msgid "" "%d bpp given" msgstr "" -#: ports/espressif/common-hal/alarm/coproc/CoprocAlarm.c #: ports/espressif/common-hal/alarm/touch/TouchAlarm.c msgid "Only one %q can be set in deep sleep." msgstr "" +#: ports/espressif/common-hal/espulp/ULPAlarm.c +msgid "Only one %q can be set." +msgstr "" + #: ports/espressif/common-hal/i2ctarget/I2CTarget.c #: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c msgid "Only one address is allowed" @@ -1674,6 +1700,10 @@ msgstr "" msgid "Operation timed out" msgstr "" +#: ports/raspberrypi/common-hal/mdns/Server.c +msgid "Out of MDNS service slots" +msgstr "" + #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Out of memory" msgstr "Brak pamięci" @@ -1797,6 +1827,10 @@ msgstr "" msgid "Program size invalid" msgstr "" +#: ports/espressif/common-hal/espulp/ULP.c +msgid "Program too long" +msgstr "" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." msgstr "Podciągnięcie nieużywane w trybie wyjścia." @@ -1837,7 +1871,7 @@ msgid "Random number generation error" msgstr "Błąd generowania liczb losowych" #: shared-bindings/memorymonitor/AllocationSize.c -#: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/pulseio/PulseIn.c shared-module/displayio/Bitmap.c msgid "Read-only" msgstr "Tylko do odczytu" @@ -1845,10 +1879,6 @@ msgstr "Tylko do odczytu" msgid "Read-only filesystem" msgstr "System plików tylko do odczytu" -#: shared-module/displayio/Bitmap.c -msgid "Read-only object" -msgstr "Obiekt tylko do odczytu" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Received response was invalid" msgstr "Otrzymana odpowiedź była nieprawidłowa" @@ -1941,7 +1971,7 @@ msgstr "" msgid "Sleep Memory not available" msgstr "" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Slice and value different lengths." msgstr "Fragment i wartość są różnych długości." @@ -1978,6 +2008,10 @@ msgstr "" msgid "Stereo right must be on PWM channel B" msgstr "" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Stopping AP is not supported." +msgstr "" + #: 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" @@ -2018,6 +2052,10 @@ msgid "" "exit safe mode." msgstr "" +#: py/obj.c +msgid "The above exception was the direct cause of the following exception:" +msgstr "" + #: ports/espressif/boards/m5stack_atom_lite/mpconfigboard.h msgid "The central button was pressed at start up.\n" msgstr "" @@ -2203,11 +2241,12 @@ msgid "Unable to read color palette data" msgstr "Nie można odczytać danych palety" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "Unable to start mDNS query" msgstr "" -#: shared-bindings/coproc/CoprocMemory.c -msgid "Unable to write" +#: shared-bindings/memorymap/AddressRange.c +msgid "Unable to write to address." msgstr "" #: shared-bindings/nvm/ByteArray.c @@ -2278,6 +2317,7 @@ msgid "Unkown error code %d" msgstr "" #: shared-bindings/adafruit_pixelbuf/PixelBuf.c +#: shared-module/_pixelmap/PixelMap.c #, c-format msgid "Unmatched number of items on RHS (expected %d, got %d)." msgstr "Zła liczba obiektów po prawej stronie (oczekiwano %d, jest %d)." @@ -2362,6 +2402,18 @@ msgstr "" msgid "Wi-Fi: " msgstr "" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in access point mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in station mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is not enabled" +msgstr "" + #: main.c msgid "Woken up by alarm.\n" msgstr "" @@ -2450,7 +2502,7 @@ msgid "array has too many dimensions" msgstr "" #: py/objarray.c shared-bindings/alarm/SleepMemory.c -#: shared-bindings/coproc/CoprocMemory.c shared-bindings/nvm/ByteArray.c +#: shared-bindings/memorymap/AddressRange.c shared-bindings/nvm/ByteArray.c msgid "array/bytes required on right side" msgstr "tablica/bytes wymagane po prawej stronie" @@ -2543,10 +2595,6 @@ msgstr "zbyt mały bufor" msgid "buffer too small for requested bytes" msgstr "" -#: shared-bindings/adafruit_pixelbuf/PixelBuf.c -msgid "byteorder is not a string" -msgstr "" - #: py/objarray.c msgid "bytes length not a multiple of item size" msgstr "" @@ -2588,14 +2636,10 @@ msgstr "przypisanie do wyrażenia" msgid "can't cancel self" msgstr "" -#: py/obj.c py/objint.c shared-module/adafruit_pixelbuf/PixelBuf.c +#: py/obj.c py/objint.c py/runtime.c shared-module/adafruit_pixelbuf/PixelBuf.c msgid "can't convert %q to %q" msgstr "nie można dokonać konwersji %q na %q" -#: py/runtime.c -msgid "can't convert %q to int" -msgstr "" - #: py/obj.c #, c-format msgid "can't convert %s to complex" @@ -2677,6 +2721,10 @@ msgstr "" msgid "can't set attribute" msgstr "nie można ustawić atrybutu" +#: py/runtime.c +msgid "can't set attribute '%q'" +msgstr "" + #: py/emitnative.c msgid "can't store '%q'" msgstr "nie można zapisać '%q'" @@ -2779,10 +2827,6 @@ msgstr "kolor musi być pomiędzy 0x000000 a 0xffffff" msgid "comparison of int and uint" msgstr "" -#: py/objcomplex.c -msgid "complex division by zero" -msgstr "zespolone dzielenie przez zero" - #: py/objfloat.c py/parsenum.c msgid "complex values not supported" msgstr "wartości zespolone nieobsługiwane" @@ -2886,12 +2930,7 @@ msgstr "" msgid "div/mod not implemented for uint" msgstr "" -#: py/objfloat.c py/objint_mpz.c -msgid "divide by zero" -msgstr "" - -#: py/modmath.c py/objint_longlong.c py/runtime.c -#: shared-bindings/math/__init__.c +#: py/runtime.c msgid "division by zero" msgstr "dzielenie przez zero" @@ -3048,10 +3087,6 @@ msgstr "font musi mieć 2048 bajtów długości" msgid "format requires a dict" msgstr "format wymaga słownika" -#: shared-bindings/microcontroller/Processor.c -msgid "frequency is read-only for this board" -msgstr "" - #: py/objdeque.c msgid "full" msgstr "pełny" @@ -3164,8 +3199,12 @@ msgstr "złe wypełnienie" msgid "index is out of bounds" msgstr "indeks jest poza zakresem" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "index must be tuple or int" +msgstr "" + #: extmod/ulab/code/numpy/numerical.c extmod/ulab/code/ulab_tools.c -#: ports/espressif/common-hal/pulseio/PulseIn.c py/obj.c +#: ports/espressif/common-hal/pulseio/PulseIn.c #: shared-bindings/bitmaptools/__init__.c msgid "index out of range" msgstr "indeks poza zakresem" @@ -3263,10 +3302,6 @@ msgstr "wektory wejściowe muszą być równej długości" 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" - #: extmod/ulab/code/numpy/approx.c msgid "interp is defined for 1D iterables of equal length" msgstr "" @@ -3348,10 +3383,6 @@ msgstr "zła składnia dla liczby całkowitej w bazie %d" msgid "invalid syntax for number" msgstr "zła składnia dla liczby" -#: py/objexcept.c -msgid "invalid traceback" -msgstr "" - #: py/objtype.c msgid "issubclass() arg 1 must be a class" msgstr "argument 1 dla issubclass() musi być klasą" @@ -3408,19 +3439,17 @@ msgstr "local '%q' użyty zanim typ jest znany" msgid "local variable referenced before assignment" msgstr "zmienna lokalna użyta przed przypisaniem" -#: py/objint.c -msgid "long int not supported in this build" -msgstr "long int jest nieobsługiwany" - #: ports/espressif/common-hal/canio/CAN.c msgid "loopback + silent mode not supported by peripheral" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS already initialized" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS only works with built-in WiFi" msgstr "" @@ -3549,6 +3578,10 @@ msgstr "ujemna potęga, ale brak obsługi liczb zmiennoprzecinkowych" msgid "negative shift count" msgstr "ujemne przesunięcie" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "nested index must be int" +msgstr "" + #: shared-module/sdcardio/SDCard.c msgid "no SD card" msgstr "" @@ -3728,7 +3761,7 @@ msgid "only sample_rate=16000 is supported" msgstr "obsługiwane jest tylko sample_rate=16000" #: py/objarray.c py/objstr.c py/objstrunicode.c py/objtuple.c -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "only slices with step=1 (aka None) are supported" msgstr "tylko fragmenty ze step=1 (lub None) są wspierane" @@ -3945,10 +3978,6 @@ msgstr "okres snu musi być nieujemny" msgid "slice step can't be zero" msgstr "" -#: py/objslice.c -msgid "slice step cannot be zero" -msgstr "zerowy krok" - #: py/nativeglue.c msgid "slice unsupported" msgstr "" @@ -3997,10 +4026,6 @@ msgstr "" msgid "start/end indices" msgstr "początkowe/końcowe indeksy" -#: shared-bindings/random/__init__.c -msgid "step must be non-zero" -msgstr "step nie może być zerowe" - #: shared-bindings/random/__init__.c msgid "stop not reachable from start" msgstr "stop nie jest osiągalne ze start" @@ -4009,10 +4034,6 @@ msgstr "stop nie jest osiągalne ze start" msgid "stream operation not supported" msgstr "operacja na strumieniu nieobsługiwana" -#: py/objstrunicode.c -msgid "string indices must be integers, not %q" -msgstr "" - #: py/stream.c msgid "string not supported; use bytes or bytearray" msgstr "łańcuchy nieobsługiwane; użyj bytes lub bytearray" @@ -4045,10 +4066,6 @@ msgstr "błąd składni w JSON" msgid "syntax error in uctypes descriptor" msgstr "błąd składni w deskryptorze uctypes" -#: shared-bindings/time/__init__.c -msgid "time.struct_time() takes a 9-sequence" -msgstr "time.struct_time() wymaga 9-elementowej sekwencji" - #: ports/atmel-samd/common-hal/watchdog/WatchDogTimer.c #: ports/espressif/common-hal/watchdog/WatchDogTimer.c #: ports/nrf/common-hal/watchdog/WatchDogTimer.c @@ -4330,10 +4347,6 @@ msgstr "" msgid "y value out of bounds" msgstr "y poza zakresem" -#: py/objrange.c -msgid "zero step" -msgstr "zerowy krok" - #: extmod/ulab/code/scipy/signal/signal.c msgid "zi must be an ndarray" msgstr "" @@ -4346,6 +4359,33 @@ msgstr "" msgid "zi must be of shape (n_section, 2)" msgstr "" +#~ msgid "Read-only object" +#~ msgstr "Obiekt tylko do odczytu" + +#~ msgid "Invalid pins" +#~ msgstr "Złe nóżki" + +#~ msgid "complex division by zero" +#~ msgstr "zespolone dzielenie przez zero" + +#~ msgid "int() arg 2 must be >= 2 and <= 36" +#~ msgstr "argument 2 do int() busi być pomiędzy 2 a 36" + +#~ msgid "long int not supported in this build" +#~ msgstr "long int jest nieobsługiwany" + +#~ msgid "slice step cannot be zero" +#~ msgstr "zerowy krok" + +#~ msgid "step must be non-zero" +#~ msgstr "step nie może być zerowe" + +#~ msgid "time.struct_time() takes a 9-sequence" +#~ msgstr "time.struct_time() wymaga 9-elementowej sekwencji" + +#~ msgid "zero step" +#~ msgstr "zerowy krok" + #~ msgid "%q indices must be integers, not %s" #~ msgstr "%q indeks musi być liczbą całkowitą, a nie %s" diff --git a/locale/pt_BR.po b/locale/pt_BR.po index c3f7475167..e4569ad596 100644 --- a/locale/pt_BR.po +++ b/locale/pt_BR.po @@ -6,7 +6,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-01-04 12:55-0600\n" -"PO-Revision-Date: 2022-11-11 18:49+0000\n" +"PO-Revision-Date: 2023-01-05 02:52+0000\n" "Last-Translator: Wellington Terumi Uemura \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.15-dev\n" +"X-Generator: Weblate 4.15.1-dev\n" #: main.c msgid "" @@ -72,6 +72,11 @@ msgstr "%%c requer int ou char" msgid "%02X" msgstr "%02X" +#: shared-module/os/getenv.c +#, c-format +msgid "%S" +msgstr "" + #: shared-bindings/rgbmatrix/RGBMatrix.c #, c-format msgid "" @@ -109,13 +114,14 @@ msgstr "%q contém pinos duplicados" msgid "%q failure: %d" msgstr "%q falha: %d" +#: ports/espressif/common-hal/espulp/ULP.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/microcontroller/Pin.c msgid "%q in use" msgstr "%q em uso" -#: py/obj.c py/objstr.c py/objstrunicode.c +#: py/objstr.c py/objstrunicode.c msgid "%q index out of range" msgstr "O índice %q está fora do intervalo" @@ -127,7 +133,11 @@ msgstr "a inicialização do %q falhou" msgid "%q is %q" msgstr "%q é %q" -#: py/argcheck.c +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "%q is read-only for this board" +msgstr "%q é de somente leitura para esta placa" + +#: py/argcheck.c shared-bindings/usb_hid/Device.c msgid "%q length must be %d" msgstr "O comprimento de %q deve ser %d" @@ -143,10 +153,6 @@ msgstr "o comprimento de %q deve ser <= %d" msgid "%q length must be >= %d" msgstr "o comprimento de %q deve ser >= %d" -#: shared-bindings/busio/I2C.c -msgid "%q length must be >= 1" -msgstr "o comprimento %q deve ser >=1" - #: py/argcheck.c msgid "%q must be %d" msgstr "%q deve ser %d" @@ -168,23 +174,18 @@ msgid "%q must be >= %d" msgstr "o %q deve ser >= %d" #: shared-bindings/analogbufio/BufferedIn.c +msgid "%q must be a bytearray or array of type 'H' or 'B'" +msgstr "%q deve ser um bytearray ou uma matriz do tipo 'H' ou 'B'" + #: shared-bindings/audiocore/RawSample.c msgid "%q must be a bytearray or array of type 'h', 'H', 'b', or 'B'" msgstr "%q deve ser um bytearray ou uma matriz do tipo 'h', 'H', 'b', ou 'B'" -#: py/argcheck.c -msgid "%q must be a string" -msgstr "%q deve ser uma string" - -#: py/argcheck.c -msgid "%q must be an int" -msgstr "%q deve ser um inteiro" - -#: py/argcheck.c +#: py/argcheck.c py/obj.c py/objstrunicode.c msgid "%q must be of type %q" msgstr "%q deve ser do tipo %q" -#: shared-bindings/digitalio/Pull.c +#: py/objexcept.c shared-bindings/digitalio/Pull.c msgid "%q must be of type %q or None" msgstr "%q deve ser do tipo %q ou nenhum" @@ -198,7 +199,6 @@ msgstr "%q fora dos limites" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c #: ports/cxd56/common-hal/pulseio/PulseIn.c -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/nrf/common-hal/pulseio/PulseIn.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c @@ -210,9 +210,9 @@ msgstr "%q fora do alcance" msgid "%q pin invalid" msgstr "%q pino inválido" -#: shared-bindings/usb_hid/Device.c -msgid "%q with a report ID of 0 must be of length 1" -msgstr "%q com um relatório com ID de 0 deve ter comprimento 1" +#: py/objrange.c py/objslice.c shared-bindings/random/__init__.c +msgid "%q step cannot be zero" +msgstr "A etapa %q não pode ser zero" #: py/bc.c py/objnamedtuple.c msgid "%q() takes %d positional arguments but %d were given" @@ -311,7 +311,7 @@ msgstr "O objeto '%s' não suporta a atribuição dos itens" msgid "'%s' object doesn't support item deletion" msgstr "O objeto '%s' não é compatível com exclusão do item" -#: ports/raspberrypi/common-hal/wifi/Radio.c py/runtime.c +#: py/runtime.c msgid "'%s' object has no attribute '%q'" msgstr "O objeto '%s' não possui o atributo '%q'" @@ -415,6 +415,10 @@ msgstr "O ADC2 está sendo usado pelo WiFi" msgid "Address must be %d bytes long" msgstr "O endereço deve ter %d bytes de comprimento" +#: ports/espressif/common-hal/memorymap/AddressRange.c +msgid "Address range not allowed" +msgstr "Intervalo de endereços não permitido" + #: ports/espressif/common-hal/canio/CAN.c msgid "All CAN peripherals are in use" msgstr "Todos os periféricos CAN estão em uso" @@ -495,7 +499,7 @@ msgstr "Já está anunciando." msgid "Already have all-matches listener" msgstr "Já há um ouvinte com todas as correspondências" -#: ports/espressif/common-hal/coproc/__init__.c +#: ports/espressif/common-hal/espulp/ULP.c #: shared-module/memorymonitor/AllocationAlarm.c #: shared-module/memorymonitor/AllocationSize.c msgid "Already running" @@ -506,6 +510,11 @@ msgstr "Já está em execução" msgid "Already scanning for wifi networks" msgstr "Já está em busca das redes de wifi" +#: shared-module/os/getenv.c +#, c-format +msgid "An error occurred while retrieving '%s':\n" +msgstr "Ocorreu um erro ao recuperar '%s':\n" + #: ports/stm/common-hal/audiopwmio/PWMAudioOut.c msgid "Another PWMAudioOut is already active" msgstr "Um outro PWMAudioOut já está ativo" @@ -519,15 +528,11 @@ msgstr "Outro envio já está ativo" msgid "Array must contain halfwords (type 'H')" msgstr "Array deve conter meias palavras (tipo 'H')" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Array values should be single bytes." msgstr "Os valores das matrizes devem ser bytes simples." -#: shared-bindings/microcontroller/Pin.c -msgid "At most %d %q may be specified (not %d)" -msgstr "Pelo menos %d %q pode ser definido (não %d)" - #: shared-module/memorymonitor/AllocationAlarm.c #, c-format msgid "Attempt to allocate %d blocks" @@ -921,6 +926,10 @@ msgstr "Feito" msgid "Drive mode not used when direction is input." msgstr "O modo do controlador não é usado quando a direção for inserida." +#: py/obj.c +msgid "During handling of the above exception, another exception occurred:" +msgstr "Outra exceção ocorreu durante o tratamento da exceção acima:" + #: shared-bindings/aesio/aes.c msgid "ECB only operates on 16 bytes at a time" msgstr "O BCE opera apenas com 16 bytes por vez" @@ -950,10 +959,10 @@ msgstr "Erro no regex" msgid "Error: Failure to bind" msgstr "Erro: Falha na vinculação" -#: py/enum.c shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c -#: shared-bindings/alarm/__init__.c shared-bindings/alarm/coproc/CoprocAlarm.c -#: shared-bindings/busio/SPI.c shared-bindings/coproc/Coproc.c -#: shared-bindings/coproc/__init__.c shared-bindings/microcontroller/Pin.c +#: ports/espressif/bindings/espulp/ULP.c py/enum.c +#: shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c +#: shared-bindings/alarm/__init__.c shared-bindings/busio/SPI.c +#: shared-bindings/microcontroller/Pin.c #: shared-bindings/neopixel_write/__init__.c msgid "Expected a %q" msgstr "Esperado um" @@ -1038,6 +1047,10 @@ msgstr "Erro fatal." msgid "File exists" msgstr "Arquivo já existe" +#: shared-module/os/getenv.c +msgid "File not found" +msgstr "Arquivo não encontrado" + #: ports/atmel-samd/common-hal/canio/Listener.c #: ports/espressif/common-hal/canio/Listener.c #: ports/stm/common-hal/canio/Listener.c @@ -1052,7 +1065,6 @@ msgstr "O firmware está duplicado" msgid "Firmware is invalid" msgstr "O firmware é inválido" -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/espressif/common-hal/dualbank/__init__.c msgid "Firmware is too big" msgstr "O firmware é muito grande" @@ -1098,6 +1110,8 @@ msgstr "Falha Genérica" #: shared-bindings/displayio/Display.c #: shared-bindings/displayio/EPaperDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c +#: shared-module/displayio/Display.c +#: shared-module/framebufferio/FramebufferDisplay.c msgid "Group already used" msgstr "O grupo já está em uso" @@ -1232,6 +1246,7 @@ msgid "Internal define error" msgstr "Erro interno de definição" #: ports/espressif/common-hal/paralleldisplay/ParallelBus.c +#: shared-module/os/getenv.c msgid "Internal error" msgstr "Erro interno" @@ -1278,6 +1293,11 @@ msgstr "Argumento inválido" msgid "Invalid bits per value" msgstr "Os valores por bits são inválidos" +#: shared-module/os/getenv.c +#, c-format +msgid "Invalid byte %.*s" +msgstr "Byte %.*s inválido" + #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #, c-format msgid "Invalid data_pins[%d]" @@ -1295,10 +1315,6 @@ msgstr "O acesso da memória é inválido." msgid "Invalid multicast MAC address" msgstr "Endereço MAC multicast inválido" -#: shared-bindings/busio/UART.c -msgid "Invalid pins" -msgstr "Pinos inválidos" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Invalid size" msgstr "Tamanho inválido" @@ -1312,10 +1328,18 @@ msgstr "Soquete inválido para o TLS" msgid "Invalid state" msgstr "Estado inválido" +#: shared-module/os/getenv.c +msgid "Invalid unicode escape" +msgstr "Escape unicode inválido" + #: shared-bindings/aesio/aes.c msgid "Key must be 16, 24, or 32 bytes long" msgstr "A chave deve ter 16, 24 ou 32 bytes de comprimento" +#: shared-module/os/getenv.c +msgid "Key not found" +msgstr "Chave não encontrada" + #: shared-module/is31fl3741/FrameBuffer.c msgid "LED mappings must match display size" msgstr "Os mapeamentos do led devem corresponder ao tamanho do display" @@ -1422,6 +1446,10 @@ msgstr "O salto NLR falhou. Possível corrupção da memória." msgid "NVS Error" msgstr "Erro NVS" +#: shared-bindings/socketpool/SocketPool.c +msgid "Name or service not known" +msgstr "Nome ou serviço desconhecido" + #: py/qstr.c msgid "Name too long" msgstr "Nome muito longo" @@ -1536,11 +1564,6 @@ msgstr "Nenhuma chave foi definida" msgid "No long integer support" msgstr "Não há compatibilidade com inteiro longo" -#: shared-module/usb_hid/__init__.c -#, c-format -msgid "No more than %d HID devices allowed" -msgstr "Não são permitidos mais do que %d dispositivos HID" - #: shared-bindings/wifi/Radio.c msgid "No network with that ssid" msgstr "Não há rede com este ssid" @@ -1672,11 +1695,14 @@ msgstr "" "São compatíveis apenas os BMPs monocromáticos, indexados em 4bpp ou 8bpp e " "16bpp ou superior: determinado %d bpp" -#: ports/espressif/common-hal/alarm/coproc/CoprocAlarm.c #: ports/espressif/common-hal/alarm/touch/TouchAlarm.c msgid "Only one %q can be set in deep sleep." msgstr "Apenas um %q pode ser colocado em hibernação profunda." +#: ports/espressif/common-hal/espulp/ULPAlarm.c +msgid "Only one %q can be set." +msgstr "Apenas um %q pode ser definido." + #: ports/espressif/common-hal/i2ctarget/I2CTarget.c #: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c msgid "Only one address is allowed" @@ -1709,6 +1735,10 @@ msgstr "A operação ou o recurso não é suportado" msgid "Operation timed out" msgstr "A operação expirou" +#: ports/raspberrypi/common-hal/mdns/Server.c +msgid "Out of MDNS service slots" +msgstr "Sem slots do serviço MDNS" + #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Out of memory" msgstr "Sem memória" @@ -1842,6 +1872,10 @@ msgstr "O programa faz OUT sem carregar o OSR" msgid "Program size invalid" msgstr "O tamanho do programa é inválido" +#: ports/espressif/common-hal/espulp/ULP.c +msgid "Program too long" +msgstr "Programa muito longo" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." msgstr "O Pull não foi usado quando a direção for gerada." @@ -1882,7 +1916,7 @@ msgid "Random number generation error" msgstr "Houve um erro na geração do número aleatório" #: shared-bindings/memorymonitor/AllocationSize.c -#: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/pulseio/PulseIn.c shared-module/displayio/Bitmap.c msgid "Read-only" msgstr "Somente leitura" @@ -1890,10 +1924,6 @@ msgstr "Somente leitura" msgid "Read-only filesystem" msgstr "Sistema de arquivos somente leitura" -#: shared-module/displayio/Bitmap.c -msgid "Read-only object" -msgstr "Objeto de leitura apenas" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Received response was invalid" msgstr "A resposta recebida foi inválida" @@ -1986,7 +2016,7 @@ msgstr "O tamanho não é suportado" msgid "Sleep Memory not available" msgstr "Sleep memory não está disponível" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Slice and value different lengths." msgstr "Fatie e avalie os diferentes comprimentos." @@ -2023,6 +2053,10 @@ msgstr "O estéreo à esquerda deve estar no canal PWM A" msgid "Stereo right must be on PWM channel B" msgstr "O estéreo à direita deve estar no canal PWM B" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Stopping AP is not supported." +msgstr "Não há suporte para a interrupção do AP." + #: ports/mimxrt10xx/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "Supply at least one UART pin" msgstr "Forneça pelo menos um pino UART" @@ -2068,6 +2102,10 @@ msgstr "" "O módulo `microcontrolador` foi utilizado para iniciar em modo seguro. " "Pressione reset para encerrar do modo de segurança." +#: py/obj.c +msgid "The above exception was the direct cause of the following exception:" +msgstr "A exceção acima foi a causa direta da seguinte exceção:" + #: ports/espressif/boards/m5stack_atom_lite/mpconfigboard.h msgid "The central button was pressed at start up.\n" msgstr "O botão central foi pressionado na inicialização.\n" @@ -2262,12 +2300,13 @@ msgid "Unable to read color palette data" msgstr "Não foi possível ler os dados da paleta de cores" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "Unable to start mDNS query" msgstr "Não é possível iniciar a consulta mDNS" -#: shared-bindings/coproc/CoprocMemory.c -msgid "Unable to write" -msgstr "Não é possível escrever" +#: shared-bindings/memorymap/AddressRange.c +msgid "Unable to write to address." +msgstr "Não é possível gravar no endereço." #: shared-bindings/nvm/ByteArray.c msgid "Unable to write to nvm." @@ -2337,6 +2376,7 @@ msgid "Unkown error code %d" msgstr "Código de erro desconhecido %d" #: shared-bindings/adafruit_pixelbuf/PixelBuf.c +#: shared-module/_pixelmap/PixelMap.c #, c-format msgid "Unmatched number of items on RHS (expected %d, got %d)." msgstr "Quantidade inigualável de itens no RHS (%d esperado, obteve %d)." @@ -2432,6 +2472,18 @@ msgstr "" msgid "Wi-Fi: " msgstr "Wi-Fi: " +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in access point mode." +msgstr "O Wi-Fi está em modo de ponto de acesso." + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in station mode." +msgstr "O Wi-Fi está em modo estação." + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is not enabled" +msgstr "O Wi-Fi não está ativado" + #: main.c msgid "Woken up by alarm.\n" msgstr "Foi despertado através do alarme.\n" @@ -2522,7 +2574,7 @@ msgid "array has too many dimensions" msgstr "a matriz possui muitas dimensões" #: py/objarray.c shared-bindings/alarm/SleepMemory.c -#: shared-bindings/coproc/CoprocMemory.c shared-bindings/nvm/ByteArray.c +#: shared-bindings/memorymap/AddressRange.c shared-bindings/nvm/ByteArray.c msgid "array/bytes required on right side" msgstr "matriz/bytes são necessários no lado direito" @@ -2615,10 +2667,6 @@ msgstr "o buffer é muito pequeno" msgid "buffer too small for requested bytes" msgstr "o buffer é pequeno demais para os bytes requisitados" -#: shared-bindings/adafruit_pixelbuf/PixelBuf.c -msgid "byteorder is not a string" -msgstr "a ordem dos bytes não é uma cadeia de caracteres" - #: py/objarray.c msgid "bytes length not a multiple of item size" msgstr "o comprimento dos bytes não é um múltiplo do tamanho do item" @@ -2660,14 +2708,10 @@ msgstr "a expressão não pode ser atribuída" msgid "can't cancel self" msgstr "não é possível cancelar a si mesmo" -#: py/obj.c py/objint.c shared-module/adafruit_pixelbuf/PixelBuf.c +#: py/obj.c py/objint.c py/runtime.c shared-module/adafruit_pixelbuf/PixelBuf.c msgid "can't convert %q to %q" msgstr "não é possível converter %q para %q" -#: py/runtime.c -msgid "can't convert %q to int" -msgstr "Não é possível converter %q para int" - #: py/obj.c #, c-format msgid "can't convert %s to complex" @@ -2751,6 +2795,10 @@ msgstr "não é possível definir o tamanho de 512 blocos" msgid "can't set attribute" msgstr "não é possível definir o atributo" +#: py/runtime.c +msgid "can't set attribute '%q'" +msgstr "não é possível definir o atributo '%q'" + #: py/emitnative.c msgid "can't store '%q'" msgstr "não é possível armazenar '%q'" @@ -2857,10 +2905,6 @@ msgstr "cor deve estar entre 0x000000 e 0xffffff" msgid "comparison of int and uint" msgstr "comparação de int e uint" -#: py/objcomplex.c -msgid "complex division by zero" -msgstr "divisão complexa por zero" - #: py/objfloat.c py/parsenum.c msgid "complex values not supported" msgstr "os valores complexos não compatíveis" @@ -2966,12 +3010,7 @@ msgstr "as dimensões não coincidem" msgid "div/mod not implemented for uint" msgstr "div/mod não implementado para uint" -#: py/objfloat.c py/objint_mpz.c -msgid "divide by zero" -msgstr "divido por zero" - -#: py/modmath.c py/objint_longlong.c py/runtime.c -#: shared-bindings/math/__init__.c +#: py/runtime.c msgid "division by zero" msgstr "divisão por zero" @@ -3130,10 +3169,6 @@ msgstr "a fonte deve ter 2048 bytes de comprimento" msgid "format requires a dict" msgstr "formato requer um dict" -#: shared-bindings/microcontroller/Processor.c -msgid "frequency is read-only for this board" -msgstr "nesta placa, a frequência é de apenas leitura" - #: py/objdeque.c msgid "full" msgstr "cheio" @@ -3246,8 +3281,12 @@ msgstr "preenchimento incorreto" msgid "index is out of bounds" msgstr "o índice está fora dos limites" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "index must be tuple or int" +msgstr "o índice deve ser tupla ou int" + #: extmod/ulab/code/numpy/numerical.c extmod/ulab/code/ulab_tools.c -#: ports/espressif/common-hal/pulseio/PulseIn.c py/obj.c +#: ports/espressif/common-hal/pulseio/PulseIn.c #: shared-bindings/bitmaptools/__init__.c msgid "index out of range" msgstr "Índice fora do intervalo" @@ -3346,10 +3385,6 @@ msgstr "os vetores da entrada devem ter o mesmo comprimento" 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" - #: extmod/ulab/code/numpy/approx.c msgid "interp is defined for 1D iterables of equal length" msgstr "o interp é definido para iteráveis 1D com comprimento igual" @@ -3431,10 +3466,6 @@ 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" -#: py/objexcept.c -msgid "invalid traceback" -msgstr "rastreamento inválido" - #: py/objtype.c msgid "issubclass() arg 1 must be a class" msgstr "issubclass() arg 1 deve ser uma classe" @@ -3494,19 +3525,17 @@ msgstr "o local '%q' usado antes do tipo conhecido" msgid "local variable referenced before assignment" msgstr "a variável local referenciada antes da atribuição" -#: py/objint.c -msgid "long int not supported in this build" -msgstr "o long int não é suportado nesta compilação" - #: ports/espressif/common-hal/canio/CAN.c msgid "loopback + silent mode not supported by peripheral" msgstr "o loopback + o modo silencioso não é suportado pelo periférico" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS already initialized" msgstr "O mDNS já foi inicializado" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS only works with built-in WiFi" msgstr "O mDNS só funciona com WiFi integrado" @@ -3637,6 +3666,10 @@ msgstr "potência negativa sem suporte de flutuação" msgid "negative shift count" msgstr "contagem de turnos negativos" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "nested index must be int" +msgstr "o índice aninhado deve ser int" + #: shared-module/sdcardio/SDCard.c msgid "no SD card" msgstr "nenhum cartão SD" @@ -3816,7 +3849,7 @@ msgid "only sample_rate=16000 is supported" msgstr "apenas sample_rate = 16000 é compatível" #: py/objarray.c py/objstr.c py/objstrunicode.c py/objtuple.c -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "only slices with step=1 (aka None) are supported" msgstr "" @@ -4037,10 +4070,6 @@ msgstr "a duração do sleep não deve ser negativo" msgid "slice step can't be zero" msgstr "a etapa da fatia não pode ser zero" -#: py/objslice.c -msgid "slice step cannot be zero" -msgstr "a etapa da fatia não pode ser zero" - #: py/nativeglue.c msgid "slice unsupported" msgstr "fatia não suportada" @@ -4089,10 +4118,6 @@ msgstr "o source_bitmap deve ter o value_count de 8" msgid "start/end indices" msgstr "os índices de início/fim" -#: shared-bindings/random/__init__.c -msgid "step must be non-zero" -msgstr "o passo deve ser diferente de zero" - #: shared-bindings/random/__init__.c msgid "stop not reachable from start" msgstr "stop não está acessível a partir do início" @@ -4101,10 +4126,6 @@ msgstr "stop não está acessível a partir do início" msgid "stream operation not supported" msgstr "a operação do fluxo não é compatível" -#: py/objstrunicode.c -msgid "string indices must be integers, not %q" -msgstr "a sequência dos índices devem ser inteiros, não %q" - #: py/stream.c msgid "string not supported; use bytes or bytearray" msgstr "a string não é compatível; use bytes ou bytearray" @@ -4137,10 +4158,6 @@ msgstr "erro de sintaxe no JSON" msgid "syntax error in uctypes descriptor" msgstr "houve um erro de sintaxe no descritor uctypes" -#: shared-bindings/time/__init__.c -msgid "time.struct_time() takes a 9-sequence" -msgstr "time.struct_time() leva uma sequência com 9" - #: ports/atmel-samd/common-hal/watchdog/WatchDogTimer.c #: ports/espressif/common-hal/watchdog/WatchDogTimer.c #: ports/nrf/common-hal/watchdog/WatchDogTimer.c @@ -4422,10 +4439,6 @@ msgstr "o xTaskCreate falhou" msgid "y value out of bounds" msgstr "o valor y está fora dos limites" -#: py/objrange.c -msgid "zero step" -msgstr "passo zero" - #: extmod/ulab/code/scipy/signal/signal.c msgid "zi must be an ndarray" msgstr "zi deve ser um ndarray" @@ -4438,6 +4451,76 @@ 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 "Read-only object" +#~ msgstr "Objeto de leitura apenas" + +#~ msgid "frequency is read-only for this board" +#~ msgstr "nesta placa, a frequência é de apenas leitura" + +#~ msgid "Pins 21+ not supported from ULP" +#~ msgstr "Os pinos 21+ não são suportados pelo ULP" + +#~ msgid "Unable to write" +#~ msgstr "Não é possível escrever" + +#~ msgid "%q length must be >= 1" +#~ msgstr "o comprimento %q deve ser >=1" + +#~ msgid "%q must be a string" +#~ msgstr "%q deve ser uma string" + +#~ msgid "%q must be an int" +#~ msgstr "%q deve ser um inteiro" + +#~ msgid "%q with a report ID of 0 must be of length 1" +#~ msgstr "%q com um relatório com ID de 0 deve ter comprimento 1" + +#~ msgid "At most %d %q may be specified (not %d)" +#~ msgstr "Pelo menos %d %q pode ser definido (não %d)" + +#~ msgid "Invalid pins" +#~ msgstr "Pinos inválidos" + +#, c-format +#~ msgid "No more than %d HID devices allowed" +#~ msgstr "Não são permitidos mais do que %d dispositivos HID" + +#~ msgid "byteorder is not a string" +#~ msgstr "a ordem dos bytes não é uma cadeia de caracteres" + +#~ msgid "can't convert %q to int" +#~ msgstr "Não é possível converter %q para int" + +#~ msgid "complex division by zero" +#~ msgstr "divisão complexa por zero" + +#~ msgid "divide by zero" +#~ msgstr "divido por zero" + +#~ msgid "int() arg 2 must be >= 2 and <= 36" +#~ msgstr "int() arg 2 deve ser >= 2 e <= 36" + +#~ msgid "long int not supported in this build" +#~ msgstr "o long int não é suportado nesta compilação" + +#~ msgid "slice step cannot be zero" +#~ msgstr "a etapa da fatia não pode ser zero" + +#~ msgid "step must be non-zero" +#~ msgstr "o passo deve ser diferente de zero" + +#~ msgid "string indices must be integers, not %q" +#~ msgstr "a sequência dos índices devem ser inteiros, não %q" + +#~ msgid "time.struct_time() takes a 9-sequence" +#~ msgstr "time.struct_time() leva uma sequência com 9" + +#~ msgid "zero step" +#~ msgstr "passo zero" + +#~ msgid "invalid traceback" +#~ msgstr "rastreamento inválido" + #~ msgid "%q indices must be integers, not %s" #~ msgstr "Os índices %q devem ser inteiros, e não %s" diff --git a/locale/ru.po b/locale/ru.po index a575f05a40..5549e7e3f9 100644 --- a/locale/ru.po +++ b/locale/ru.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2022-04-06 13:37+0000\n" -"Last-Translator: Jeff Epler \n" +"PO-Revision-Date: 2022-12-27 17:42+0000\n" +"Last-Translator: Clay \n" "Language-Team: none\n" "Language: ru\n" "MIME-Version: 1.0\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.12-dev\n" +"X-Generator: Weblate 4.15.1-dev\n" #: main.c msgid "" @@ -31,6 +31,8 @@ msgid "" "\n" "Code stopped by auto-reload. Reloading soon.\n" msgstr "" +"\n" +"Программа остановлена автоматической перезагрузкой. Скоро перезагрузка.\n" #: supervisor/shared/safe_mode.c msgid "" @@ -71,13 +73,19 @@ msgstr "%%c требует int или char" #: main.c #, c-format msgid "%02X" +msgstr "%02X" + +#: shared-module/os/getenv.c +#, c-format +msgid "%S" msgstr "" #: shared-bindings/rgbmatrix/RGBMatrix.c #, c-format msgid "" "%d address pins, %d rgb pins and %d tiles indicate a height of %d, not %d" -msgstr "%d адресные пины, %d rgb пины и %d плитки указывают высоту %d а не %d" +msgstr "" +"%d адресных пинов, %d rgb пинов и %d тайлов указывают высоту %d а не %d" #: ports/atmel-samd/common-hal/alarm/__init__.c #: ports/cxd56/common-hal/analogio/AnalogOut.c ports/cxd56/common-hal/rtc/RTC.c @@ -90,7 +98,7 @@ msgstr "%d адресные пины, %d rgb пины и %d плитки ука #: ports/raspberrypi/common-hal/rtc/RTC.c ports/stm/common-hal/alarm/__init__.c #: ports/stm/common-hal/rtc/RTC.c msgid "%q" -msgstr "" +msgstr "%q" #: shared-bindings/microcontroller/Pin.c msgid "%q and %q contain duplicate pins" @@ -98,7 +106,7 @@ msgstr "%q и %q содержат пины-дупликаты" #: ports/atmel-samd/common-hal/audioio/AudioOut.c msgid "%q and %q must be different" -msgstr "" +msgstr "%q и %q должны быть разными" #: shared-bindings/microcontroller/Pin.c msgid "%q contains duplicate pins" @@ -108,27 +116,32 @@ msgstr "%q содержит пины-дупликаты" msgid "%q failure: %d" msgstr "%q сбой: %d" +#: ports/espressif/common-hal/espulp/ULP.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/microcontroller/Pin.c msgid "%q in use" msgstr "%q используется" -#: py/obj.c py/objstr.c py/objstrunicode.c +#: py/objstr.c py/objstrunicode.c msgid "%q index out of range" msgstr "Индекс %q вне диапазона" #: shared-module/bitbangio/SPI.c msgid "%q init failed" -msgstr "" +msgstr "Инициализация %q не удалась" #: shared-bindings/dualbank/__init__.c msgid "%q is %q" +msgstr "%q является %q" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "%q is read-only for this board" msgstr "" -#: py/argcheck.c +#: py/argcheck.c shared-bindings/usb_hid/Device.c msgid "%q length must be %d" -msgstr "" +msgstr "Длинна %q должна быть %d" #: py/argcheck.c msgid "%q length must be %d-%d" @@ -136,56 +149,47 @@ msgstr "Длинна %q должна быть %d-%d" #: py/argcheck.c msgid "%q length must be <= %d" -msgstr "" +msgstr "Длинна %q должна быть <= %d" #: py/argcheck.c msgid "%q length must be >= %d" -msgstr "" - -#: shared-bindings/busio/I2C.c -msgid "%q length must be >= 1" -msgstr "Длинна %q должна быть >= 1" +msgstr "Длинна %q должна быть >= %d" #: py/argcheck.c msgid "%q must be %d" -msgstr "" +msgstr "%q должно быть %d" #: py/argcheck.c msgid "%q must be %d-%d" -msgstr "%q должен быть %d-%d" +msgstr "%q должно быть %d-%d" #: shared-bindings/displayio/Display.c msgid "%q must be 1 when %q is True" -msgstr "" +msgstr "%q должно быть 1 когда %q is True" #: py/argcheck.c shared-bindings/gifio/GifWriter.c msgid "%q must be <= %d" -msgstr "%q должен быть <= %d" +msgstr "%q должно быть <= %d" #: py/argcheck.c msgid "%q must be >= %d" -msgstr "%q должен быть >= %d" +msgstr "%q должно быть >= %d" #: shared-bindings/analogbufio/BufferedIn.c +msgid "%q must be a bytearray or array of type 'H' or 'B'" +msgstr "%q должно быть bytearray или array типа 'H' или 'B'" + #: shared-bindings/audiocore/RawSample.c msgid "%q must be a bytearray or array of type 'h', 'H', 'b', or 'B'" -msgstr "" +msgstr "%q должно быть bytearray или array типа 'h', 'H', 'b', или 'B'" -#: py/argcheck.c -msgid "%q must be a string" -msgstr "%q должен быть строкой" - -#: py/argcheck.c -msgid "%q must be an int" -msgstr "" - -#: py/argcheck.c +#: py/argcheck.c py/obj.c py/objstrunicode.c msgid "%q must be of type %q" -msgstr "%q должен быть типа %q" +msgstr "%q должно быть типа %q" -#: shared-bindings/digitalio/Pull.c +#: py/objexcept.c shared-bindings/digitalio/Pull.c msgid "%q must be of type %q or None" -msgstr "" +msgstr "%q должно быть типа %q или None" #: ports/atmel-samd/common-hal/busio/UART.c msgid "%q must be power of 2" @@ -197,7 +201,6 @@ msgstr "%q за пределом" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c #: ports/cxd56/common-hal/pulseio/PulseIn.c -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/nrf/common-hal/pulseio/PulseIn.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c @@ -209,9 +212,9 @@ msgstr "%q вне диапазона" msgid "%q pin invalid" msgstr "Пин %q не допустим" -#: shared-bindings/usb_hid/Device.c -msgid "%q with a report ID of 0 must be of length 1" -msgstr "%q с идентификатором отчёта 0 должен иметь длину 1" +#: py/objrange.c py/objslice.c shared-bindings/random/__init__.c +msgid "%q step cannot be zero" +msgstr "Шаг %q не может быть нулём" #: py/bc.c py/objnamedtuple.c msgid "%q() takes %d positional arguments but %d were given" @@ -223,7 +226,7 @@ msgstr "%q, %q, и %q должны быть одной длинны" #: py/objint.c shared-bindings/storage/__init__.c msgid "%q=%q" -msgstr "" +msgstr "%q=%q" #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c #, c-format @@ -310,7 +313,7 @@ msgstr "Объект '%s' не поддерживает присвоение э msgid "'%s' object doesn't support item deletion" msgstr "Объект '%s' не поддерживает удаление элементов" -#: ports/raspberrypi/common-hal/wifi/Radio.c py/runtime.c +#: py/runtime.c msgid "'%s' object has no attribute '%q'" msgstr "Объект '%s' не имеет атрибута '%q'" @@ -357,7 +360,7 @@ msgstr "'data' требует как минимум 2 аргумента" #: py/compile.c msgid "'data' requires integer arguments" -msgstr "'data' требует целочисленных аргументов" +msgstr "'data' требует целочисленные аргументы" #: py/compile.c msgid "'label' requires 1 argument" @@ -410,6 +413,10 @@ msgstr "ADC2 используется WiFi" msgid "Address must be %d bytes long" msgstr "Адрес должен быть длиной %d байт" +#: ports/espressif/common-hal/memorymap/AddressRange.c +msgid "Address range not allowed" +msgstr "Диапазон адресов не разрешен" + #: ports/espressif/common-hal/canio/CAN.c msgid "All CAN peripherals are in use" msgstr "Все периферийные устройства CAN уже используются" @@ -490,7 +497,7 @@ msgstr "Уже объявляемся (advertising)." msgid "Already have all-matches listener" msgstr "Уже есть универсальный слушатель" -#: ports/espressif/common-hal/coproc/__init__.c +#: ports/espressif/common-hal/espulp/ULP.c #: shared-module/memorymonitor/AllocationAlarm.c #: shared-module/memorymonitor/AllocationSize.c msgid "Already running" @@ -501,6 +508,11 @@ msgstr "Уже запущен" msgid "Already scanning for wifi networks" msgstr "Поиск сетей wifi уже происходит" +#: shared-module/os/getenv.c +#, c-format +msgid "An error occurred while retrieving '%s':\n" +msgstr "" + #: ports/stm/common-hal/audiopwmio/PWMAudioOut.c msgid "Another PWMAudioOut is already active" msgstr "Другой PWMAudioOut уже активен" @@ -514,15 +526,11 @@ msgstr "Другая передача уже активна" msgid "Array must contain halfwords (type 'H')" msgstr "Массив должен содержать полуслова (тип 'H')" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Array values should be single bytes." msgstr "Значения массива должны быть однобайтовыми." -#: shared-bindings/microcontroller/Pin.c -msgid "At most %d %q may be specified (not %d)" -msgstr "Может быть указано не более %d %q (не %d)" - #: shared-module/memorymonitor/AllocationAlarm.c #, c-format msgid "Attempt to allocate %d blocks" @@ -598,7 +606,7 @@ msgstr "Для управления потоком требуется как RX, #: ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.h #: ports/atmel-samd/boards/meowmeow/mpconfigboard.h msgid "Both buttons were pressed at start up.\n" -msgstr "" +msgstr "Обе кнопки были нажаты при загрузке.\n" #: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c msgid "Both pins must support hardware interrupts" @@ -668,7 +676,7 @@ msgstr "Пин шины %d уже используется" #: ports/espressif/boards/m5stack_core_basic/mpconfigboard.h #: ports/espressif/boards/m5stack_core_fire/mpconfigboard.h msgid "Button A was pressed at start up.\n" -msgstr "" +msgstr "Кнопка A была нажата при загрузке\n" #: shared-bindings/_bleio/UUID.c msgid "Byte buffer must be 16 bytes." @@ -680,7 +688,7 @@ msgstr "Блоки CBC должны быть кратны 16 байтам" #: supervisor/shared/safe_mode.c msgid "CIRCUITPY drive could not be found or created." -msgstr "" +msgstr "Не удалось найти или создать диск CIRCUITPY." #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "CRC or checksum was invalid" @@ -692,7 +700,7 @@ msgstr "Вызовите super().__init__() перед обращением к #: ports/cxd56/common-hal/camera/Camera.c msgid "Camera init" -msgstr "" +msgstr "Иницализация камеры" #: ports/espressif/common-hal/alarm/pin/PinAlarm.c msgid "Can only alarm on RTC IO from deep sleep." @@ -764,7 +772,7 @@ msgstr "Невозможно перемонтировать '/' пока он в #: ports/cxd56/common-hal/microcontroller/__init__.c #: ports/mimxrt10xx/common-hal/microcontroller/__init__.c msgid "Cannot reset into bootloader because no bootloader is present" -msgstr "" +msgstr "Не удалось перезагрузится в загрузчик так как загрузчик отсутствует" #: ports/espressif/common-hal/socketpool/Socket.c msgid "Cannot set socket options" @@ -785,15 +793,18 @@ msgstr "Срез субкласса невозможен" #: shared-module/bitbangio/SPI.c msgid "Cannot transfer without MOSI and MISO pins" -msgstr "" +msgstr "Невозможно передать данные без пинов MOSI и MISO" #: shared-bindings/pwmio/PWMOut.c msgid "Cannot vary frequency on a timer that is already in use" msgstr "Невозможно изменить частоту на таймере, который уже используется" #: ports/nrf/common-hal/alarm/pin/PinAlarm.c +#, fuzzy msgid "Cannot wake on pin edge, only level" msgstr "" +"Невозможно проснуться по изменению логического уровня (CHANGE), только по " +"уровню (LEVEL)" #: ports/espressif/common-hal/alarm/pin/PinAlarm.c msgid "Cannot wake on pin edge. Only level." @@ -913,12 +924,18 @@ msgstr "Поворот дисплея должен осуществляться #: main.c msgid "Done" -msgstr "" +msgstr "Выполнено" #: shared-bindings/digitalio/DigitalInOut.c msgid "Drive mode not used when direction is input." msgstr "Drive mode не используется, когда направление является входным." +#: py/obj.c +#, fuzzy +msgid "During handling of the above exception, another exception occurred:" +msgstr "" +"Во время обработки вышеупомянутого исключения произошло другое исключение:" + #: shared-bindings/aesio/aes.c msgid "ECB only operates on 16 bytes at a time" msgstr "ECB работает только с 16 байтами за раз" @@ -948,21 +965,22 @@ msgstr "Ошибка в регулярном выражении(regex)" msgid "Error: Failure to bind" msgstr "Ошибка: Сбой привязки" -#: py/enum.c shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c -#: shared-bindings/alarm/__init__.c shared-bindings/alarm/coproc/CoprocAlarm.c -#: shared-bindings/busio/SPI.c shared-bindings/coproc/Coproc.c -#: shared-bindings/coproc/__init__.c shared-bindings/microcontroller/Pin.c +#: ports/espressif/bindings/espulp/ULP.c py/enum.c +#: shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c +#: shared-bindings/alarm/__init__.c shared-bindings/busio/SPI.c +#: shared-bindings/microcontroller/Pin.c #: shared-bindings/neopixel_write/__init__.c msgid "Expected a %q" msgstr "Ожидалось(ся) %q" #: ports/raspberrypi/bindings/cyw43/__init__.c msgid "Expected a %q or %q" -msgstr "" +msgstr "Ожидалось %q или %q" #: shared-bindings/alarm/__init__.c +#, fuzzy msgid "Expected an %q" -msgstr "" +msgstr "Ожидалось %q" #: ports/espressif/common-hal/_bleio/Adapter.c #: ports/nrf/common-hal/_bleio/Adapter.c @@ -992,7 +1010,7 @@ msgstr "Не удалось получить mutex, ошибка 0x%04x" #: shared-module/rgbmatrix/RGBMatrix.c msgid "Failed to allocate %q buffer" -msgstr "" +msgstr "Не удалось выделить буфер %q" #: ports/espressif/common-hal/wifi/__init__.c msgid "Failed to allocate Wifi memory" @@ -1036,6 +1054,10 @@ msgstr "Фатальная ошибка." msgid "File exists" msgstr "Файл существует" +#: shared-module/os/getenv.c +msgid "File not found" +msgstr "Файл не найден" + #: ports/atmel-samd/common-hal/canio/Listener.c #: ports/espressif/common-hal/canio/Listener.c #: ports/stm/common-hal/canio/Listener.c @@ -1043,17 +1065,18 @@ msgid "Filters too complex" msgstr "Фильтры слишком сложные" #: ports/espressif/common-hal/dualbank/__init__.c +#, fuzzy msgid "Firmware is duplicate" -msgstr "" +msgstr "Прошивка является дубликатом" #: ports/espressif/common-hal/dualbank/__init__.c +#, fuzzy msgid "Firmware is invalid" -msgstr "" +msgstr "Прошивка является неправильной" -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/espressif/common-hal/dualbank/__init__.c msgid "Firmware is too big" -msgstr "" +msgstr "Прошивка слишком большая" #: shared-bindings/bitmaptools/__init__.c msgid "For L8 colorspace, input bitmap must have 8 bits per pixel" @@ -1073,6 +1096,8 @@ msgstr "Формат не поддерживается" msgid "" "Frequency must be 24, 150, 396, 450, 528, 600, 720, 816, 912, 960 or 1008 Mhz" msgstr "" +"Частота должна быть 24, 150, 396, 450, 528, 600, 720, 816, 912, 960 или 1008 " +"МГц" #: shared-bindings/pwmio/PWMOut.c msgid "Frequency must match existing PWMOut using this timer" @@ -1087,7 +1112,7 @@ msgstr "Функция требует блокировки" #: ports/cxd56/common-hal/gnss/GNSS.c msgid "GNSS init" -msgstr "" +msgstr "Инициализация GNSS" #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Generic Failure" @@ -1096,6 +1121,8 @@ msgstr "Общий сбой" #: shared-bindings/displayio/Display.c #: shared-bindings/displayio/EPaperDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c +#: shared-module/displayio/Display.c +#: shared-module/framebufferio/FramebufferDisplay.c msgid "Group already used" msgstr "Группа уже используется" @@ -1104,7 +1131,7 @@ msgstr "Группа уже используется" #: ports/mimxrt10xx/common-hal/busio/SPI.c ports/nrf/common-hal/busio/SPI.c #: ports/raspberrypi/common-hal/busio/SPI.c msgid "Half duplex SPI is not implemented" -msgstr "" +msgstr "Полудуплексный SPI не реализован" #: ports/mimxrt10xx/common-hal/busio/SPI.c ports/stm/common-hal/busio/I2C.c #: ports/stm/common-hal/busio/SPI.c ports/stm/common-hal/canio/CAN.c @@ -1122,7 +1149,7 @@ msgstr "Операция ввода-вывода на закрытом файл #: ports/stm/common-hal/busio/I2C.c msgid "I2C init error" -msgstr "" +msgstr "Ошибка инициализации I2C" #: ports/raspberrypi/common-hal/busio/I2C.c #: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c @@ -1229,6 +1256,7 @@ msgid "Internal define error" msgstr "Внутренняя ошибка определения" #: ports/espressif/common-hal/paralleldisplay/ParallelBus.c +#: shared-module/os/getenv.c msgid "Internal error" msgstr "Внутренняя ошибка" @@ -1238,8 +1266,9 @@ msgid "Internal error #%d" msgstr "Внутренняя ошибка #%d" #: supervisor/shared/safe_mode.c +#, fuzzy msgid "Internal watchdog timer expired." -msgstr "" +msgstr "Внутренний сторожевой таймер истек." #: py/argcheck.c shared-bindings/digitalio/DigitalInOut.c msgid "Invalid %q" @@ -1275,6 +1304,11 @@ msgstr "Недопустимый аргумент" msgid "Invalid bits per value" msgstr "Недопустимое бит-на-значение" +#: shared-module/os/getenv.c +#, c-format +msgid "Invalid byte %.*s" +msgstr "Неверный байт %.*s" + #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #, c-format msgid "Invalid data_pins[%d]" @@ -1292,10 +1326,6 @@ msgstr "Неправильный доступ к памяти." msgid "Invalid multicast MAC address" msgstr "Неверный MAC-адрес multicast" -#: shared-bindings/busio/UART.c -msgid "Invalid pins" -msgstr "Недопустимые пины" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Invalid size" msgstr "Неверный размер" @@ -1309,10 +1339,18 @@ msgstr "Неверный сокет для TLS" msgid "Invalid state" msgstr "Неверное состояние" +#: shared-module/os/getenv.c +msgid "Invalid unicode escape" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "Key must be 16, 24, or 32 bytes long" msgstr "Ключ должен быть длинной 16, 24 или 32 байта" +#: shared-module/os/getenv.c +msgid "Key not found" +msgstr "Ключ не найден" + #: shared-module/is31fl3741/FrameBuffer.c msgid "LED mappings must match display size" msgstr "" @@ -1322,12 +1360,14 @@ msgid "LHS of keyword arg must be an id" msgstr "LHS ключевого слова arg должен быть идентификатором(id)" #: shared-module/displayio/Group.c +#, fuzzy msgid "Layer already in a group" -msgstr "" +msgstr "Слой уже в группе (Group)" #: shared-module/displayio/Group.c +#, fuzzy msgid "Layer must be a Group or TileGrid subclass" -msgstr "" +msgstr "Слой должен быть группой (Group) или субклассом TileGrid." #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "MAC address was invalid" @@ -1349,11 +1389,11 @@ msgstr "Задержка включения микрофона должна бы #: ports/raspberrypi/bindings/rp2pio/StateMachine.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "Mismatched data size" -msgstr "" +msgstr "Размер данных различается" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "Mismatched swap flag" -msgstr "" +msgstr "Несоответствие флага swap" #: ports/mimxrt10xx/common-hal/busio/SPI.c msgid "Missing MISO or MOSI Pin" @@ -1361,7 +1401,7 @@ msgstr "Отсутствует пин MISO или MOSI" #: ports/stm/common-hal/busio/SPI.c msgid "Missing MISO or MOSI pin" -msgstr "" +msgstr "Отсутствует пин MISO или MOSI" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #, c-format @@ -1420,13 +1460,17 @@ msgstr "Не удалось выполнить NLR jump. Вероятно, по msgid "NVS Error" msgstr "Ошибка NVS" +#: shared-bindings/socketpool/SocketPool.c +msgid "Name or service not known" +msgstr "" + #: py/qstr.c msgid "Name too long" msgstr "Имя слишком длинное" #: shared-bindings/displayio/TileGrid.c msgid "New bitmap must be same size as old bitmap" -msgstr "" +msgstr "Новый bitmap должен быть того же размера что и старый" #: ports/espressif/common-hal/_bleio/__init__.c msgid "Nimble out of memory" @@ -1454,13 +1498,13 @@ msgid "No DMA pacing timer found" msgstr "" #: shared-module/adafruit_bus_device/i2c_device/I2CDevice.c -#, c-format +#, fuzzy, c-format msgid "No I2C device at address: 0x%x" -msgstr "" +msgstr "Не найдено устройство I2C по адресу: %x" #: supervisor/shared/web_workflow/web_workflow.c msgid "No IP" -msgstr "" +msgstr "Нет IP" #: ports/espressif/common-hal/busio/SPI.c #: ports/mimxrt10xx/common-hal/busio/SPI.c @@ -1469,7 +1513,7 @@ msgstr "Нет пина MISO" #: ports/stm/common-hal/busio/SPI.c shared-module/bitbangio/SPI.c msgid "No MISO pin" -msgstr "" +msgstr "Нет пина MISO" #: ports/espressif/common-hal/busio/SPI.c #: ports/mimxrt10xx/common-hal/busio/SPI.c @@ -1478,7 +1522,7 @@ msgstr "Нет пина MOSI" #: ports/stm/common-hal/busio/SPI.c shared-module/bitbangio/SPI.c msgid "No MOSI pin" -msgstr "" +msgstr "Нет пина MOSI" #: ports/atmel-samd/common-hal/busio/UART.c #: ports/espressif/common-hal/busio/UART.c @@ -1534,11 +1578,6 @@ msgstr "Ключ не был указан" msgid "No long integer support" msgstr "Нет поддержки длинных целых чисел (long integer)" -#: shared-module/usb_hid/__init__.c -#, c-format -msgid "No more than %d HID devices allowed" -msgstr "Допускается не более %d HID устройств" - #: shared-bindings/wifi/Radio.c msgid "No network with that ssid" msgstr "Нет сети с этим ssid" @@ -1564,8 +1603,9 @@ msgid "No space left on device" msgstr "На устройстве не осталось свободного места" #: py/moduerrno.c +#, fuzzy msgid "No such device" -msgstr "" +msgstr "Нет такого устройства" #: py/moduerrno.c msgid "No such file/directory" @@ -1576,8 +1616,9 @@ msgid "No timer available" msgstr "Нет доступного таймера" #: supervisor/shared/safe_mode.c +#, fuzzy msgid "Nordic system firmware failure assertion." -msgstr "" +msgstr "Сбой системной прошивки Nordic (assertion)." #: ports/nrf/common-hal/_bleio/__init__.c msgid "Nordic system firmware out of memory" @@ -1595,12 +1636,14 @@ msgstr "Не подключено" #: shared-bindings/audiobusio/I2SOut.c shared-bindings/audioio/AudioOut.c #: shared-bindings/audiopwmio/PWMAudioOut.c +#, fuzzy msgid "Not playing" -msgstr "Не играет" +msgstr "Не воспроизводится (Not playing)" #: shared-bindings/_bleio/__init__.c +#, fuzzy msgid "Not settable" -msgstr "Не устанавливается" +msgstr "Невозможно установить" #: ports/espressif/common-hal/paralleldisplay/ParallelBus.c #, c-format @@ -1620,11 +1663,12 @@ msgstr "" #: supervisor/shared/bluetooth/bluetooth.c msgid "Off" -msgstr "" +msgstr "Выключено" #: supervisor/shared/bluetooth/bluetooth.c +#, fuzzy msgid "Ok" -msgstr "" +msgstr "Ok" #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c #: ports/raspberrypi/common-hal/audiobusio/PDMIn.c @@ -1668,9 +1712,12 @@ msgid "" "%d bpp given" msgstr "" -#: ports/espressif/common-hal/alarm/coproc/CoprocAlarm.c #: ports/espressif/common-hal/alarm/touch/TouchAlarm.c msgid "Only one %q can be set in deep sleep." +msgstr "Только один %q может быть погружен в глубокий сон." + +#: ports/espressif/common-hal/espulp/ULPAlarm.c +msgid "Only one %q can be set." msgstr "" #: ports/espressif/common-hal/i2ctarget/I2CTarget.c @@ -1705,6 +1752,10 @@ msgstr "" msgid "Operation timed out" msgstr "" +#: ports/raspberrypi/common-hal/mdns/Server.c +msgid "Out of MDNS service slots" +msgstr "" + #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Out of memory" msgstr "" @@ -1833,6 +1884,10 @@ msgstr "" msgid "Program size invalid" msgstr "" +#: ports/espressif/common-hal/espulp/ULP.c +msgid "Program too long" +msgstr "" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." msgstr "" @@ -1873,7 +1928,7 @@ msgid "Random number generation error" msgstr "" #: shared-bindings/memorymonitor/AllocationSize.c -#: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/pulseio/PulseIn.c shared-module/displayio/Bitmap.c msgid "Read-only" msgstr "" @@ -1881,10 +1936,6 @@ msgstr "" msgid "Read-only filesystem" msgstr "" -#: shared-module/displayio/Bitmap.c -msgid "Read-only object" -msgstr "" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Received response was invalid" msgstr "" @@ -1977,7 +2028,7 @@ msgstr "" msgid "Sleep Memory not available" msgstr "" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Slice and value different lengths." msgstr "" @@ -2014,6 +2065,10 @@ msgstr "" msgid "Stereo right must be on PWM channel B" msgstr "" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Stopping AP is not supported." +msgstr "" + #: ports/mimxrt10xx/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "Supply at least one UART pin" msgstr "Предоставьте хотяб один пин UART" @@ -2054,6 +2109,10 @@ msgid "" "exit safe mode." msgstr "" +#: py/obj.c +msgid "The above exception was the direct cause of the following exception:" +msgstr "" + #: ports/espressif/boards/m5stack_atom_lite/mpconfigboard.h msgid "The central button was pressed at start up.\n" msgstr "" @@ -2241,11 +2300,12 @@ msgid "Unable to read color palette data" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "Unable to start mDNS query" msgstr "" -#: shared-bindings/coproc/CoprocMemory.c -msgid "Unable to write" +#: shared-bindings/memorymap/AddressRange.c +msgid "Unable to write to address." msgstr "" #: shared-bindings/nvm/ByteArray.c @@ -2316,6 +2376,7 @@ msgid "Unkown error code %d" msgstr "" #: shared-bindings/adafruit_pixelbuf/PixelBuf.c +#: shared-module/_pixelmap/PixelMap.c #, c-format msgid "Unmatched number of items on RHS (expected %d, got %d)." msgstr "" @@ -2400,6 +2461,18 @@ msgstr "" msgid "Wi-Fi: " msgstr "" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in access point mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in station mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is not enabled" +msgstr "" + #: main.c msgid "Woken up by alarm.\n" msgstr "" @@ -2488,7 +2561,7 @@ msgid "array has too many dimensions" msgstr "" #: py/objarray.c shared-bindings/alarm/SleepMemory.c -#: shared-bindings/coproc/CoprocMemory.c shared-bindings/nvm/ByteArray.c +#: shared-bindings/memorymap/AddressRange.c shared-bindings/nvm/ByteArray.c msgid "array/bytes required on right side" msgstr "" @@ -2581,10 +2654,6 @@ msgstr "" msgid "buffer too small for requested bytes" msgstr "" -#: shared-bindings/adafruit_pixelbuf/PixelBuf.c -msgid "byteorder is not a string" -msgstr "" - #: py/objarray.c msgid "bytes length not a multiple of item size" msgstr "" @@ -2626,14 +2695,10 @@ msgstr "" msgid "can't cancel self" msgstr "" -#: py/obj.c py/objint.c shared-module/adafruit_pixelbuf/PixelBuf.c +#: py/obj.c py/objint.c py/runtime.c shared-module/adafruit_pixelbuf/PixelBuf.c msgid "can't convert %q to %q" msgstr "" -#: py/runtime.c -msgid "can't convert %q to int" -msgstr "" - #: py/obj.c #, c-format msgid "can't convert %s to complex" @@ -2715,6 +2780,10 @@ msgstr "" msgid "can't set attribute" msgstr "" +#: py/runtime.c +msgid "can't set attribute '%q'" +msgstr "" + #: py/emitnative.c msgid "can't store '%q'" msgstr "" @@ -2817,10 +2886,6 @@ msgstr "" msgid "comparison of int and uint" msgstr "" -#: py/objcomplex.c -msgid "complex division by zero" -msgstr "" - #: py/objfloat.c py/parsenum.c msgid "complex values not supported" msgstr "" @@ -2923,12 +2988,7 @@ msgstr "" msgid "div/mod not implemented for uint" msgstr "" -#: py/objfloat.c py/objint_mpz.c -msgid "divide by zero" -msgstr "" - -#: py/modmath.c py/objint_longlong.c py/runtime.c -#: shared-bindings/math/__init__.c +#: py/runtime.c msgid "division by zero" msgstr "" @@ -3085,10 +3145,6 @@ msgstr "" msgid "format requires a dict" msgstr "" -#: shared-bindings/microcontroller/Processor.c -msgid "frequency is read-only for this board" -msgstr "" - #: py/objdeque.c msgid "full" msgstr "" @@ -3201,8 +3257,12 @@ msgstr "" msgid "index is out of bounds" msgstr "" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "index must be tuple or int" +msgstr "" + #: extmod/ulab/code/numpy/numerical.c extmod/ulab/code/ulab_tools.c -#: ports/espressif/common-hal/pulseio/PulseIn.c py/obj.c +#: ports/espressif/common-hal/pulseio/PulseIn.c #: shared-bindings/bitmaptools/__init__.c msgid "index out of range" msgstr "" @@ -3300,10 +3360,6 @@ msgstr "" msgid "inputs are not iterable" msgstr "" -#: py/parsenum.c -msgid "int() arg 2 must be >= 2 and <= 36" -msgstr "" - #: extmod/ulab/code/numpy/approx.c msgid "interp is defined for 1D iterables of equal length" msgstr "" @@ -3385,10 +3441,6 @@ msgstr "" msgid "invalid syntax for number" msgstr "" -#: py/objexcept.c -msgid "invalid traceback" -msgstr "" - #: py/objtype.c msgid "issubclass() arg 1 must be a class" msgstr "" @@ -3445,19 +3497,17 @@ msgstr "" msgid "local variable referenced before assignment" msgstr "" -#: py/objint.c -msgid "long int not supported in this build" -msgstr "" - #: ports/espressif/common-hal/canio/CAN.c msgid "loopback + silent mode not supported by peripheral" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS already initialized" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS only works with built-in WiFi" msgstr "" @@ -3586,6 +3636,10 @@ msgstr "" msgid "negative shift count" msgstr "" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "nested index must be int" +msgstr "" + #: shared-module/sdcardio/SDCard.c msgid "no SD card" msgstr "" @@ -3765,7 +3819,7 @@ msgid "only sample_rate=16000 is supported" msgstr "" #: py/objarray.c py/objstr.c py/objstrunicode.c py/objtuple.c -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "only slices with step=1 (aka None) are supported" msgstr "" @@ -3981,10 +4035,6 @@ msgstr "" msgid "slice step can't be zero" msgstr "" -#: py/objslice.c -msgid "slice step cannot be zero" -msgstr "" - #: py/nativeglue.c msgid "slice unsupported" msgstr "" @@ -4033,10 +4083,6 @@ msgstr "" msgid "start/end indices" msgstr "" -#: shared-bindings/random/__init__.c -msgid "step must be non-zero" -msgstr "" - #: shared-bindings/random/__init__.c msgid "stop not reachable from start" msgstr "" @@ -4045,10 +4091,6 @@ msgstr "" msgid "stream operation not supported" msgstr "" -#: py/objstrunicode.c -msgid "string indices must be integers, not %q" -msgstr "" - #: py/stream.c msgid "string not supported; use bytes or bytearray" msgstr "" @@ -4081,10 +4123,6 @@ msgstr "" msgid "syntax error in uctypes descriptor" msgstr "" -#: shared-bindings/time/__init__.c -msgid "time.struct_time() takes a 9-sequence" -msgstr "" - #: ports/atmel-samd/common-hal/watchdog/WatchDogTimer.c #: ports/espressif/common-hal/watchdog/WatchDogTimer.c #: ports/nrf/common-hal/watchdog/WatchDogTimer.c @@ -4352,7 +4390,7 @@ msgstr "" #: extmod/ulab/code/numpy/vector.c msgid "wrong output type" -msgstr "" +msgstr "неверный тип вывода" #: shared-module/displayio/Shape.c msgid "x value out of bounds" @@ -4360,19 +4398,15 @@ msgstr "" #: ports/espressif/common-hal/audiobusio/__init__.c msgid "xTaskCreate failed" -msgstr "" +msgstr "xTaskCreate провалился" #: shared-module/displayio/Shape.c msgid "y value out of bounds" msgstr "" -#: py/objrange.c -msgid "zero step" -msgstr "" - #: extmod/ulab/code/scipy/signal/signal.c msgid "zi must be an ndarray" -msgstr "" +msgstr "zi должен быть bytearray" #: extmod/ulab/code/scipy/signal/signal.c msgid "zi must be of float type" @@ -4382,6 +4416,28 @@ msgstr "zi должно быть типа float" msgid "zi must be of shape (n_section, 2)" msgstr "zi должен иметь форму (n_section, 2)" +#~ msgid "%q length must be >= 1" +#~ msgstr "Длинна %q должна быть >= 1" + +#~ msgid "%q must be a string" +#~ msgstr "%q должно быть строкой" + +#~ msgid "%q must be an int" +#~ msgstr "%q должно быть int" + +#~ msgid "%q with a report ID of 0 must be of length 1" +#~ msgstr "%q с идентификатором отчёта 0 должен иметь длину 1" + +#~ msgid "At most %d %q may be specified (not %d)" +#~ msgstr "Может быть указано не более %d %q (не %d)" + +#~ msgid "Invalid pins" +#~ msgstr "Недопустимые пины" + +#, c-format +#~ msgid "No more than %d HID devices allowed" +#~ msgstr "Допускается не более %d HID устройств" + #~ msgid "%q indices must be integers, not %s" #~ msgstr "Индексы %q должны быть целыми числами, а не %s" diff --git a/locale/sv.po b/locale/sv.po index 1980477f4f..4f83512286 100644 --- a/locale/sv.po +++ b/locale/sv.po @@ -6,7 +6,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-01-04 12:55-0600\n" -"PO-Revision-Date: 2022-11-11 18:49+0000\n" +"PO-Revision-Date: 2023-01-05 02:52+0000\n" "Last-Translator: Jonny Bergdahl \n" "Language-Team: LANGUAGE \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.15-dev\n" +"X-Generator: Weblate 4.15.1-dev\n" #: main.c msgid "" @@ -72,6 +72,11 @@ msgstr "%%c kräver int eller char" msgid "%02X" msgstr "%02X" +#: shared-module/os/getenv.c +#, c-format +msgid "%S" +msgstr "%S" + #: shared-bindings/rgbmatrix/RGBMatrix.c #, c-format msgid "" @@ -108,13 +113,14 @@ msgstr "%q innehåller dubblettstift" msgid "%q failure: %d" msgstr "%q-fel: %d" +#: ports/espressif/common-hal/espulp/ULP.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/microcontroller/Pin.c msgid "%q in use" msgstr "%q används redan" -#: py/obj.c py/objstr.c py/objstrunicode.c +#: py/objstr.c py/objstrunicode.c msgid "%q index out of range" msgstr "Index %q ligger utanför intervallet" @@ -126,7 +132,11 @@ msgstr "%q init misslyckades" msgid "%q is %q" msgstr "%q är %q" -#: py/argcheck.c +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "%q is read-only for this board" +msgstr "%q är skrivskyddad för det här kortet" + +#: py/argcheck.c shared-bindings/usb_hid/Device.c msgid "%q length must be %d" msgstr "längden på %q måste vara %d" @@ -142,10 +152,6 @@ msgstr "längden på %q måste vara <= %d" msgid "%q length must be >= %d" msgstr "längden på %q måste vara >= %d" -#: shared-bindings/busio/I2C.c -msgid "%q length must be >= 1" -msgstr "längden på %q måste vara >= 1" - #: py/argcheck.c msgid "%q must be %d" msgstr "%q måste vara %d" @@ -167,25 +173,20 @@ msgid "%q must be >= %d" msgstr "%q måste vara >= %d" #: shared-bindings/analogbufio/BufferedIn.c +msgid "%q must be a bytearray or array of type 'H' or 'B'" +msgstr "%q måste vara en bytearray eller array av typen 'H' eller 'B'" + #: shared-bindings/audiocore/RawSample.c msgid "%q must be a bytearray or array of type 'h', 'H', 'b', or 'B'" msgstr "" "%q måste vara en bytearray eller en array av typen \"h\", \"H\", \"b\" eller " "\"B\"" -#: py/argcheck.c -msgid "%q must be a string" -msgstr "%q måste vara en sträng" - -#: py/argcheck.c -msgid "%q must be an int" -msgstr "%q måste vara en int" - -#: py/argcheck.c +#: py/argcheck.c py/obj.c py/objstrunicode.c msgid "%q must be of type %q" msgstr "%q måste vara av typen %q" -#: shared-bindings/digitalio/Pull.c +#: py/objexcept.c shared-bindings/digitalio/Pull.c msgid "%q must be of type %q or None" msgstr "%q måste vara av typen %q eller None" @@ -199,7 +200,6 @@ msgstr "%q är utanför gränserna" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c #: ports/cxd56/common-hal/pulseio/PulseIn.c -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/nrf/common-hal/pulseio/PulseIn.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c @@ -211,9 +211,9 @@ msgstr "%q utanför intervallet" msgid "%q pin invalid" msgstr "Pinne %q ogiltig" -#: shared-bindings/usb_hid/Device.c -msgid "%q with a report ID of 0 must be of length 1" -msgstr "%q med report-ID 0 måste ha längd 1" +#: py/objrange.c py/objslice.c shared-bindings/random/__init__.c +msgid "%q step cannot be zero" +msgstr "%q steg kan inte vara noll" #: py/bc.c py/objnamedtuple.c msgid "%q() takes %d positional arguments but %d were given" @@ -312,7 +312,7 @@ msgstr "Objektet '%s' stöder inte tilldelning" msgid "'%s' object doesn't support item deletion" msgstr "Objektet '%s' stöder inte borttagning" -#: ports/raspberrypi/common-hal/wifi/Radio.c py/runtime.c +#: py/runtime.c msgid "'%s' object has no attribute '%q'" msgstr "Objektet '%s' har inget attribut '%q'" @@ -412,6 +412,10 @@ msgstr "ADC2 används av WiFi" msgid "Address must be %d bytes long" msgstr "Adressen måste vara %d byte lång" +#: ports/espressif/common-hal/memorymap/AddressRange.c +msgid "Address range not allowed" +msgstr "Adressintervallet är inte tillåtet" + #: ports/espressif/common-hal/canio/CAN.c msgid "All CAN peripherals are in use" msgstr "All I2C-kringutrustning används" @@ -492,7 +496,7 @@ msgstr "Annonserar redan." msgid "Already have all-matches listener" msgstr "Har redan lyssnare för all-matchningar" -#: ports/espressif/common-hal/coproc/__init__.c +#: ports/espressif/common-hal/espulp/ULP.c #: shared-module/memorymonitor/AllocationAlarm.c #: shared-module/memorymonitor/AllocationSize.c msgid "Already running" @@ -501,7 +505,12 @@ msgstr "Kör redan" #: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c msgid "Already scanning for wifi networks" -msgstr "Skannar redan efter wifi-nätverk" +msgstr "Skannar redan efter WiFi-nätverk" + +#: shared-module/os/getenv.c +#, c-format +msgid "An error occurred while retrieving '%s':\n" +msgstr "Ett fel uppstod vid hämtning av '%s':\n" #: ports/stm/common-hal/audiopwmio/PWMAudioOut.c msgid "Another PWMAudioOut is already active" @@ -516,15 +525,11 @@ msgstr "En annan send är redan aktiv" msgid "Array must contain halfwords (type 'H')" msgstr "Matrisen måste innehålla halfwords (typ \"H\")" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Array values should be single bytes." msgstr "Matrisvärden ska bestå av enstaka bytes." -#: shared-bindings/microcontroller/Pin.c -msgid "At most %d %q may be specified (not %d)" -msgstr "Högst %d %q kan anges (inte %d)" - #: shared-module/memorymonitor/AllocationAlarm.c #, c-format msgid "Attempt to allocate %d blocks" @@ -910,6 +915,11 @@ msgstr "Klar" msgid "Drive mode not used when direction is input." msgstr "Drivläge används inte när riktning är input." +#: py/obj.c +msgid "During handling of the above exception, another exception occurred:" +msgstr "" +"Under hanteringen av ovanstående undantag inträffade ett annat undantag:" + #: shared-bindings/aesio/aes.c msgid "ECB only operates on 16 bytes at a time" msgstr "ECB arbetar endast på 16 byte åt gången" @@ -939,10 +949,10 @@ msgstr "Fel i regex" msgid "Error: Failure to bind" msgstr "Fel: Bind misslyckades" -#: py/enum.c shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c -#: shared-bindings/alarm/__init__.c shared-bindings/alarm/coproc/CoprocAlarm.c -#: shared-bindings/busio/SPI.c shared-bindings/coproc/Coproc.c -#: shared-bindings/coproc/__init__.c shared-bindings/microcontroller/Pin.c +#: ports/espressif/bindings/espulp/ULP.c py/enum.c +#: shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c +#: shared-bindings/alarm/__init__.c shared-bindings/busio/SPI.c +#: shared-bindings/microcontroller/Pin.c #: shared-bindings/neopixel_write/__init__.c msgid "Expected a %q" msgstr "Förväntade %q" @@ -1027,6 +1037,10 @@ msgstr "Fatalt fel." msgid "File exists" msgstr "Filen finns redan" +#: shared-module/os/getenv.c +msgid "File not found" +msgstr "Filen hittades inte" + #: ports/atmel-samd/common-hal/canio/Listener.c #: ports/espressif/common-hal/canio/Listener.c #: ports/stm/common-hal/canio/Listener.c @@ -1041,7 +1055,6 @@ msgstr "Firmware är en dubblett" msgid "Firmware is invalid" msgstr "Firmware är ogiltig" -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/espressif/common-hal/dualbank/__init__.c msgid "Firmware is too big" msgstr "Firmware är för stor" @@ -1085,6 +1098,8 @@ msgstr "Allmänt fel" #: shared-bindings/displayio/Display.c #: shared-bindings/displayio/EPaperDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c +#: shared-module/displayio/Display.c +#: shared-module/framebufferio/FramebufferDisplay.c msgid "Group already used" msgstr "Grupp används redan" @@ -1215,6 +1230,7 @@ msgid "Internal define error" msgstr "Internt define-fel" #: ports/espressif/common-hal/paralleldisplay/ParallelBus.c +#: shared-module/os/getenv.c msgid "Internal error" msgstr "Internt fel" @@ -1261,6 +1277,11 @@ msgstr "Ogiltigt argument" msgid "Invalid bits per value" msgstr "Ogiltigt värde för bitar per värde" +#: shared-module/os/getenv.c +#, c-format +msgid "Invalid byte %.*s" +msgstr "Ogiltig byte %.*s" + #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #, c-format msgid "Invalid data_pins[%d]" @@ -1278,10 +1299,6 @@ msgstr "Ogiltig minnesåtkomst." msgid "Invalid multicast MAC address" msgstr "Ogiltig MAC-adress för multicast" -#: shared-bindings/busio/UART.c -msgid "Invalid pins" -msgstr "Ogiltiga pinnar" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Invalid size" msgstr "Ogiltig storlek" @@ -1295,10 +1312,18 @@ msgstr "Ogiltig socket för TLS" msgid "Invalid state" msgstr "Ogiltigt tillstånd" +#: shared-module/os/getenv.c +msgid "Invalid unicode escape" +msgstr "Ogiltig unicode escape" + #: shared-bindings/aesio/aes.c msgid "Key must be 16, 24, or 32 bytes long" msgstr "Nyckeln måste vara 16, 24 eller 32 byte lång" +#: shared-module/os/getenv.c +msgid "Key not found" +msgstr "Nyckeln hittades inte" + #: shared-module/is31fl3741/FrameBuffer.c msgid "LED mappings must match display size" msgstr "LED-mappning måste matcha displaystorlek" @@ -1406,6 +1431,10 @@ msgstr "NLR jump misslyckades. Troligen korrupt minne." msgid "NVS Error" msgstr "NVS-fel" +#: shared-bindings/socketpool/SocketPool.c +msgid "Name or service not known" +msgstr "Namn eller tjänst inte känd" + #: py/qstr.c msgid "Name too long" msgstr "Name är för långt" @@ -1520,11 +1549,6 @@ msgstr "Ingen nyckel angavs" msgid "No long integer support" msgstr "Inget stöd för långt heltal" -#: shared-module/usb_hid/__init__.c -#, c-format -msgid "No more than %d HID devices allowed" -msgstr "Högst %d HID-enheter är tillåtna" - #: shared-bindings/wifi/Radio.c msgid "No network with that ssid" msgstr "Inget nätverk med sådant ssid" @@ -1654,11 +1678,14 @@ msgstr "" "Endast monokrom, indexerad 4 bpp eller 8 bpp och 16 bpp eller högre BMP: er " "stöds: %d bpp angiven" -#: ports/espressif/common-hal/alarm/coproc/CoprocAlarm.c #: ports/espressif/common-hal/alarm/touch/TouchAlarm.c msgid "Only one %q can be set in deep sleep." msgstr "Endast en %q kan sättas i djup sömn." +#: ports/espressif/common-hal/espulp/ULPAlarm.c +msgid "Only one %q can be set." +msgstr "Endast en %q kan ställas in." + #: ports/espressif/common-hal/i2ctarget/I2CTarget.c #: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c msgid "Only one address is allowed" @@ -1691,6 +1718,10 @@ msgstr "Operation eller funktion stöds inte" msgid "Operation timed out" msgstr "Åtgärden orsakade timeout" +#: ports/raspberrypi/common-hal/mdns/Server.c +msgid "Out of MDNS service slots" +msgstr "Slut på MDNS-serviceplatser" + #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Out of memory" msgstr "Slut på minne" @@ -1821,6 +1852,10 @@ msgstr "Program gör OUT utan att läsa in OSR" msgid "Program size invalid" msgstr "Programstorlek ogiltig" +#: ports/espressif/common-hal/espulp/ULP.c +msgid "Program too long" +msgstr "Programmet är för långt" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." msgstr "Pull används inte när riktningen är output." @@ -1861,7 +1896,7 @@ msgid "Random number generation error" msgstr "Fel vid generering av slumptal" #: shared-bindings/memorymonitor/AllocationSize.c -#: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/pulseio/PulseIn.c shared-module/displayio/Bitmap.c msgid "Read-only" msgstr "Skrivskyddad" @@ -1869,10 +1904,6 @@ msgstr "Skrivskyddad" msgid "Read-only filesystem" msgstr "Skrivskyddat filsystem" -#: shared-module/displayio/Bitmap.c -msgid "Read-only object" -msgstr "Skrivskyddat objekt" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Received response was invalid" msgstr "Mottaget svar var ogiltigt" @@ -1965,7 +1996,7 @@ msgstr "Storleken stöds inte" msgid "Sleep Memory not available" msgstr "Sömnminne inte tillgängligt" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Slice and value different lengths." msgstr "Slice och värde har olika längd." @@ -2002,6 +2033,10 @@ msgstr "Vänster stereokanal måste använda PWM kanal A" msgid "Stereo right must be on PWM channel B" msgstr "Höger stereokanal måste använda PWM kanal B" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Stopping AP is not supported." +msgstr "Stoppa AP stöds inte." + #: ports/mimxrt10xx/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "Supply at least one UART pin" msgstr "Ange minst en UART-pinne" @@ -2046,6 +2081,10 @@ msgstr "" "Modulen `microcontroller` användes för att starta upp i felsäkert läge. " "Tryck på reset för att avsluta felsäkert läget." +#: py/obj.c +msgid "The above exception was the direct cause of the following exception:" +msgstr "Ovanstående undantag var den direkta orsaken till följande undantag:" + #: ports/espressif/boards/m5stack_atom_lite/mpconfigboard.h msgid "The central button was pressed at start up.\n" msgstr "Mittknappen trycktes in vid start.\n" @@ -2237,12 +2276,13 @@ msgid "Unable to read color palette data" msgstr "Det går inte att läsa färgpalettdata" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "Unable to start mDNS query" msgstr "Det gick inte att starta mDNS-frågan" -#: shared-bindings/coproc/CoprocMemory.c -msgid "Unable to write" -msgstr "Kan inte skriva" +#: shared-bindings/memorymap/AddressRange.c +msgid "Unable to write to address." +msgstr "Det går inte att skriva till adress." #: shared-bindings/nvm/ByteArray.c msgid "Unable to write to nvm." @@ -2312,6 +2352,7 @@ msgid "Unkown error code %d" msgstr "Okänd felkod %d" #: shared-bindings/adafruit_pixelbuf/PixelBuf.c +#: shared-module/_pixelmap/PixelMap.c #, c-format msgid "Unmatched number of items on RHS (expected %d, got %d)." msgstr "Omatchat antal på RHS (förväntat %d, fick %d)." @@ -2404,6 +2445,18 @@ msgstr "" msgid "Wi-Fi: " msgstr "Wi-Fi: " +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in access point mode." +msgstr "WiFi är i accesspunktläge." + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in station mode." +msgstr "WiFi är i stationsläge." + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is not enabled" +msgstr "WiFi är inte aktiverat" + #: main.c msgid "Woken up by alarm.\n" msgstr "Vaknade av larm.\n" @@ -2494,7 +2547,7 @@ msgid "array has too many dimensions" msgstr "array har för många dimensioner" #: py/objarray.c shared-bindings/alarm/SleepMemory.c -#: shared-bindings/coproc/CoprocMemory.c shared-bindings/nvm/ByteArray.c +#: shared-bindings/memorymap/AddressRange.c shared-bindings/nvm/ByteArray.c msgid "array/bytes required on right side" msgstr "array/bytes krävs på höger sida" @@ -2587,10 +2640,6 @@ msgstr "buffert för liten" msgid "buffer too small for requested bytes" msgstr "buffert för liten för begärd längd" -#: shared-bindings/adafruit_pixelbuf/PixelBuf.c -msgid "byteorder is not a string" -msgstr "byteorder är inte en sträng" - #: py/objarray.c msgid "bytes length not a multiple of item size" msgstr "bytelängd inte en multipel av storlek" @@ -2632,14 +2681,10 @@ msgstr "kan inte tilldela uttryck" msgid "can't cancel self" msgstr "kan inte avbryta sig själv" -#: py/obj.c py/objint.c shared-module/adafruit_pixelbuf/PixelBuf.c +#: py/obj.c py/objint.c py/runtime.c shared-module/adafruit_pixelbuf/PixelBuf.c msgid "can't convert %q to %q" msgstr "kan inte konvertera %q till %q" -#: py/runtime.c -msgid "can't convert %q to int" -msgstr "kan inte konvertera %q till int" - #: py/obj.c #, c-format msgid "can't convert %s to complex" @@ -2721,6 +2766,10 @@ msgstr "kan inte sätta blockstorlek 512" msgid "can't set attribute" msgstr "kan inte att ange attribut" +#: py/runtime.c +msgid "can't set attribute '%q'" +msgstr "kan inte sätta attribut '%q'" + #: py/emitnative.c msgid "can't store '%q'" msgstr "kan inte lagra '%q'" @@ -2825,10 +2874,6 @@ msgstr "färg måste vara mellan 0x000000 och 0xffffff" msgid "comparison of int and uint" msgstr "jämförelse av int och uint" -#: py/objcomplex.c -msgid "complex division by zero" -msgstr "komplex division med noll" - #: py/objfloat.c py/parsenum.c msgid "complex values not supported" msgstr "komplexa värden stöds inte" @@ -2934,12 +2979,7 @@ msgstr "dimensioner matchar inte" msgid "div/mod not implemented for uint" msgstr "div/mod inte implementerat för uint" -#: py/objfloat.c py/objint_mpz.c -msgid "divide by zero" -msgstr "division med noll" - -#: py/modmath.c py/objint_longlong.c py/runtime.c -#: shared-bindings/math/__init__.c +#: py/runtime.c msgid "division by zero" msgstr "division med noll" @@ -3098,10 +3138,6 @@ msgstr "typsnitt måste vara 2048 bytes långt" msgid "format requires a dict" msgstr "formatet kräver en dict" -#: shared-bindings/microcontroller/Processor.c -msgid "frequency is read-only for this board" -msgstr "frekvens är skrivskyddad för detta kort" - #: py/objdeque.c msgid "full" msgstr "full" @@ -3214,8 +3250,12 @@ msgstr "felaktig utfyllnad" msgid "index is out of bounds" msgstr "index är utanför gränserna" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "index must be tuple or int" +msgstr "index måste vara tuple eller int" + #: extmod/ulab/code/numpy/numerical.c extmod/ulab/code/ulab_tools.c -#: ports/espressif/common-hal/pulseio/PulseIn.c py/obj.c +#: ports/espressif/common-hal/pulseio/PulseIn.c #: shared-bindings/bitmaptools/__init__.c msgid "index out of range" msgstr "index utanför intervallet" @@ -3313,10 +3353,6 @@ msgstr "indatavektorer måste ha samma längd" 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" - #: extmod/ulab/code/numpy/approx.c msgid "interp is defined for 1D iterables of equal length" msgstr "interp är definierad för 1D-iterabla med samma längd" @@ -3398,10 +3434,6 @@ msgstr "ogiltig syntax för heltal med bas %d" msgid "invalid syntax for number" msgstr "ogiltig syntax för tal" -#: py/objexcept.c -msgid "invalid traceback" -msgstr "Ogilitig källspårning" - #: py/objtype.c msgid "issubclass() arg 1 must be a class" msgstr "issubclass() arg 1 måste vara en klass" @@ -3461,19 +3493,17 @@ msgstr "lokal '%q' används innan typen är känd" msgid "local variable referenced before assignment" msgstr "lokal variabel refererad före tilldelning" -#: py/objint.c -msgid "long int not supported in this build" -msgstr "long int stöds inte i denna build" - #: ports/espressif/common-hal/canio/CAN.c msgid "loopback + silent mode not supported by peripheral" msgstr "loopback + tyst läge stöds inte av kringutrustning" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS already initialized" msgstr "mDNS har redan initierats" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS only works with built-in WiFi" msgstr "mDNS fungerar bara med inbyggt WiFi" @@ -3602,6 +3632,10 @@ msgstr "negativ exponent utan stöd för flyttal" msgid "negative shift count" msgstr "negativt skiftantal" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "nested index must be int" +msgstr "nästlat index måste vara en int" + #: shared-module/sdcardio/SDCard.c msgid "no SD card" msgstr "inget SD-kort" @@ -3781,7 +3815,7 @@ msgid "only sample_rate=16000 is supported" msgstr "enbart sample_rate=16000 stöds" #: py/objarray.c py/objstr.c py/objstrunicode.c py/objtuple.c -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "only slices with step=1 (aka None) are supported" msgstr "endast segment med steg=1 (aka Ingen) stöds" @@ -3998,10 +4032,6 @@ msgstr "värdet för sleep måste vara positivt" msgid "slice step can't be zero" msgstr "segmentsteg kan inte vara noll" -#: py/objslice.c -msgid "slice step cannot be zero" -msgstr "segmentsteg kan inte vara noll" - #: py/nativeglue.c msgid "slice unsupported" msgstr "slice stöds inte" @@ -4050,10 +4080,6 @@ msgstr "source_bitmap måste ha value_count av 8" msgid "start/end indices" msgstr "start-/slutindex" -#: shared-bindings/random/__init__.c -msgid "step must be non-zero" -msgstr "step måste vara icke-noll" - #: shared-bindings/random/__init__.c msgid "stop not reachable from start" msgstr "stop kan inte nås från start" @@ -4062,10 +4088,6 @@ msgstr "stop kan inte nås från start" msgid "stream operation not supported" msgstr "stream-åtgärd stöds inte" -#: py/objstrunicode.c -msgid "string indices must be integers, not %q" -msgstr "strängindex måste vara heltal, inte %q" - #: py/stream.c msgid "string not supported; use bytes or bytearray" msgstr "sträng stöds inte; använd bytes eller bytearray" @@ -4098,10 +4120,6 @@ msgstr "syntaxfel i JSON" msgid "syntax error in uctypes descriptor" msgstr "syntaxfel i uctypes deskriptor" -#: shared-bindings/time/__init__.c -msgid "time.struct_time() takes a 9-sequence" -msgstr "time.struct_time() kräver en 9-sekvens" - #: ports/atmel-samd/common-hal/watchdog/WatchDogTimer.c #: ports/espressif/common-hal/watchdog/WatchDogTimer.c #: ports/nrf/common-hal/watchdog/WatchDogTimer.c @@ -4319,7 +4337,7 @@ msgstr "width måste vara större än noll" #: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c msgid "wifi is not enabled" -msgstr "wifi är inte aktiverat" +msgstr "WiFi är inte aktiverat" #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" @@ -4383,10 +4401,6 @@ msgstr "xTaskCreate misslyckades" msgid "y value out of bounds" msgstr "y-värde utanför intervall" -#: py/objrange.c -msgid "zero step" -msgstr "noll steg" - #: extmod/ulab/code/scipy/signal/signal.c msgid "zi must be an ndarray" msgstr "zi måste vara en ndarray" @@ -4399,6 +4413,76 @@ 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 "Read-only object" +#~ msgstr "Skrivskyddat objekt" + +#~ msgid "frequency is read-only for this board" +#~ msgstr "frekvens är skrivskyddad för detta kort" + +#~ msgid "Pins 21+ not supported from ULP" +#~ msgstr "Pins 21+ stöds inte av ULP" + +#~ msgid "Unable to write" +#~ msgstr "Kan inte skriva" + +#~ msgid "%q length must be >= 1" +#~ msgstr "längden på %q måste vara >= 1" + +#~ msgid "%q must be a string" +#~ msgstr "%q måste vara en sträng" + +#~ msgid "%q must be an int" +#~ msgstr "%q måste vara en int" + +#~ msgid "%q with a report ID of 0 must be of length 1" +#~ msgstr "%q med report-ID 0 måste ha längd 1" + +#~ msgid "At most %d %q may be specified (not %d)" +#~ msgstr "Högst %d %q kan anges (inte %d)" + +#~ msgid "Invalid pins" +#~ msgstr "Ogiltiga pinnar" + +#, c-format +#~ msgid "No more than %d HID devices allowed" +#~ msgstr "Högst %d HID-enheter är tillåtna" + +#~ msgid "byteorder is not a string" +#~ msgstr "byteorder är inte en sträng" + +#~ msgid "can't convert %q to int" +#~ msgstr "kan inte konvertera %q till int" + +#~ msgid "complex division by zero" +#~ msgstr "komplex division med noll" + +#~ msgid "divide by zero" +#~ msgstr "division med noll" + +#~ msgid "int() arg 2 must be >= 2 and <= 36" +#~ msgstr "int() arg 2 måste vara >= 2 och <= 36" + +#~ msgid "long int not supported in this build" +#~ msgstr "long int stöds inte i denna build" + +#~ msgid "slice step cannot be zero" +#~ msgstr "segmentsteg kan inte vara noll" + +#~ msgid "step must be non-zero" +#~ msgstr "step måste vara icke-noll" + +#~ msgid "string indices must be integers, not %q" +#~ msgstr "strängindex måste vara heltal, inte %q" + +#~ msgid "time.struct_time() takes a 9-sequence" +#~ msgstr "time.struct_time() kräver en 9-sekvens" + +#~ msgid "zero step" +#~ msgstr "noll steg" + +#~ msgid "invalid traceback" +#~ msgstr "Ogilitig källspårning" + #~ msgid "%q indices must be integers, not %s" #~ msgstr "Indexet %q måste vara ett heltal, inte %s" diff --git a/locale/tr.po b/locale/tr.po index 1d8eacdae0..e25e81d679 100644 --- a/locale/tr.po +++ b/locale/tr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2022-10-10 18:23+0000\n" +"PO-Revision-Date: 2022-12-05 21:48+0000\n" "Last-Translator: Boran Roni \n" "Language-Team: none\n" "Language: tr\n" @@ -15,7 +15,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.14.1\n" +"X-Generator: Weblate 4.15-dev\n" #: main.c msgid "" @@ -73,6 +73,11 @@ msgstr "%%c int veya char tipine ihtiyaç duyar" #: main.c #, c-format msgid "%02X" +msgstr "%02X" + +#: shared-module/os/getenv.c +#, c-format +msgid "%S" msgstr "" #: shared-bindings/rgbmatrix/RGBMatrix.c @@ -112,13 +117,14 @@ msgstr "%q yinelenen pinler içeriyor" msgid "%q failure: %d" msgstr "%q hata: %d" +#: ports/espressif/common-hal/espulp/ULP.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/microcontroller/Pin.c msgid "%q in use" msgstr "%q kullanımda" -#: py/obj.c py/objstr.c py/objstrunicode.c +#: py/objstr.c py/objstrunicode.c msgid "%q index out of range" msgstr "%q indeksi aralık dışında" @@ -128,9 +134,13 @@ msgstr "%q init başarısız oldu" #: shared-bindings/dualbank/__init__.c msgid "%q is %q" +msgstr "%q %q dir" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "%q is read-only for this board" msgstr "" -#: py/argcheck.c +#: py/argcheck.c shared-bindings/usb_hid/Device.c msgid "%q length must be %d" msgstr "%q boyutu %d olmalıdır" @@ -146,10 +156,6 @@ msgstr "%q boyutu <= %d olmalıdır" msgid "%q length must be >= %d" msgstr "%q boyutu >= %d olmalıdır" -#: shared-bindings/busio/I2C.c -msgid "%q length must be >= 1" -msgstr "%q boyutu >=1 olmalıdır" - #: py/argcheck.c msgid "%q must be %d" msgstr "%q, %d olmalıdır" @@ -171,23 +177,18 @@ msgid "%q must be >= %d" msgstr "%q >= %d olmalıdır" #: shared-bindings/analogbufio/BufferedIn.c +msgid "%q must be a bytearray or array of type 'H' or 'B'" +msgstr "%q 'H' ya da 'B' tipi bir bytearray ya da array olmalıdır" + #: shared-bindings/audiocore/RawSample.c msgid "%q must be a bytearray or array of type 'h', 'H', 'b', or 'B'" -msgstr "%q 'h', 'H', 'b' yada 'B' tipi bir bytearray /array olmalı" +msgstr "%q 'h', 'H', 'b' ya da 'B' tipi bir bytearray ya da array olmalı" -#: py/argcheck.c -msgid "%q must be a string" -msgstr "%q bir string olmalıdır" - -#: py/argcheck.c -msgid "%q must be an int" -msgstr "%q bir tam sayı olmalıdır" - -#: py/argcheck.c +#: py/argcheck.c py/obj.c py/objstrunicode.c msgid "%q must be of type %q" msgstr "%q, %q türünde olmalıdır" -#: shared-bindings/digitalio/Pull.c +#: py/objexcept.c shared-bindings/digitalio/Pull.c msgid "%q must be of type %q or None" msgstr "%q, %q ya da None türünde olmalıdır" @@ -201,7 +202,6 @@ msgstr "%q sınırların dışında" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c #: ports/cxd56/common-hal/pulseio/PulseIn.c -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/nrf/common-hal/pulseio/PulseIn.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c @@ -213,9 +213,9 @@ msgstr "%q aralık dışında" msgid "%q pin invalid" msgstr "%q pini geçersiz" -#: shared-bindings/usb_hid/Device.c -msgid "%q with a report ID of 0 must be of length 1" -msgstr "Rapor kimliği 0 olan %q, 1 uzunluğunda olmalıdır" +#: py/objrange.c py/objslice.c shared-bindings/random/__init__.c +msgid "%q step cannot be zero" +msgstr "%q sıfır olamaz" #: py/bc.c py/objnamedtuple.c msgid "%q() takes %d positional arguments but %d were given" @@ -314,7 +314,7 @@ msgstr "'%s' nesnesi, öğe atamasını desteklemiyor" msgid "'%s' object doesn't support item deletion" msgstr "'%s' nesnesi, öğe silmeyi desteklemiyor" -#: ports/raspberrypi/common-hal/wifi/Radio.c py/runtime.c +#: py/runtime.c msgid "'%s' object has no attribute '%q'" msgstr "'%s' nesnesinin '%q' özelliği yok" @@ -415,6 +415,10 @@ msgstr "ADC2, WiFi tarafından kullanılmaktadır" msgid "Address must be %d bytes long" msgstr "Adres %d byte uzunluğunda olmalıdır" +#: ports/espressif/common-hal/memorymap/AddressRange.c +msgid "Address range not allowed" +msgstr "" + #: ports/espressif/common-hal/canio/CAN.c msgid "All CAN peripherals are in use" msgstr "Tüm CAN çevre birimleri kullanımda" @@ -495,7 +499,7 @@ msgstr "Halihazırda duyuruluyor." msgid "Already have all-matches listener" msgstr "Tüm eşleşmelerle eşleşen dinleyiciniz var" -#: ports/espressif/common-hal/coproc/__init__.c +#: ports/espressif/common-hal/espulp/ULP.c #: shared-module/memorymonitor/AllocationAlarm.c #: shared-module/memorymonitor/AllocationSize.c msgid "Already running" @@ -506,6 +510,11 @@ msgstr "Halihazırda çalışıyor" msgid "Already scanning for wifi networks" msgstr "Halihazırda wifi ağları için tarama yapılıyor" +#: shared-module/os/getenv.c +#, c-format +msgid "An error occurred while retrieving '%s':\n" +msgstr "" + #: ports/stm/common-hal/audiopwmio/PWMAudioOut.c msgid "Another PWMAudioOut is already active" msgstr "Başka bir PWMAudioOut zaten aktif durumda" @@ -519,15 +528,11 @@ msgstr "Başka bir gönderme zaten aktif" msgid "Array must contain halfwords (type 'H')" msgstr "Dizi yarımsözcüklere sahip olmalıdır (tip 'H')" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Array values should be single bytes." msgstr "Dizi değerleri tekil bytelar olmalıdır." -#: shared-bindings/microcontroller/Pin.c -msgid "At most %d %q may be specified (not %d)" -msgstr "En az %d %q belirtilmeli (%d değil)" - #: shared-module/memorymonitor/AllocationAlarm.c #, c-format msgid "Attempt to allocate %d blocks" @@ -572,18 +577,17 @@ msgstr "Minimum kare hızından altında" #: ports/raspberrypi/common-hal/audiobusio/I2SOut.c msgid "Bit clock and word select must be sequential pins" -msgstr "" +msgstr "Bit saati ve kelime seçimi pinleri sıralı olmalıdır" #: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Bit clock and word select must share a clock unit" -msgstr "" +msgstr "Bit saati ve kelime seçimi, bir saat birimini paylaşmalıdır" #: shared-bindings/audiobusio/PDMIn.c msgid "Bit depth must be multiple of 8." msgstr "Bit derinliği 8'in katı olacak şekilde olmalı." #: shared-bindings/bitmaptools/__init__.c -#, fuzzy msgid "Bitmap size and bits per value must match" msgstr "Bitmap boyutu ve bit başına değer uyuşmalı" @@ -600,11 +604,11 @@ msgstr "Hem RX hem de TX akış kontrolü için gerekli" #: ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.h #: ports/atmel-samd/boards/meowmeow/mpconfigboard.h msgid "Both buttons were pressed at start up.\n" -msgstr "" +msgstr "Başlatma sırasında her iki düğmeye de basıldı.\n" #: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c msgid "Both pins must support hardware interrupts" -msgstr "" +msgstr "Her iki pin de donanım kesintilerini desteklemelidir" #: shared-bindings/displayio/Display.c #: shared-bindings/framebufferio/FramebufferDisplay.c @@ -670,7 +674,7 @@ msgstr "Veriyolu pini %d kullanımda" #: ports/espressif/boards/m5stack_core_basic/mpconfigboard.h #: ports/espressif/boards/m5stack_core_fire/mpconfigboard.h msgid "Button A was pressed at start up.\n" -msgstr "" +msgstr "Başlatma sırasında A düğmesine basıldı.\n" #: shared-bindings/_bleio/UUID.c msgid "Byte buffer must be 16 bytes." @@ -690,7 +694,7 @@ msgstr "CRC yada checksum geçersiz" #: py/objtype.c msgid "Call super().__init__() before accessing native object." -msgstr "" +msgstr "Yerel nesneye erişmeden önce super().__init__() fonksiyonunu çağırın." #: ports/cxd56/common-hal/camera/Camera.c msgid "Camera init" @@ -720,7 +724,7 @@ msgstr "USB aygıtları şu an değiştirilemez" #: shared-bindings/_bleio/Adapter.c msgid "Cannot create a new Adapter; use _bleio.adapter;" -msgstr "Yeni Adapter oluşturulamaz, _bleio.adapter; kullanın" +msgstr "yeni Adaptör oluşturulamadı, _bleio.adapter kullanın" #: shared-bindings/displayio/Bitmap.c #: shared-bindings/memorymonitor/AllocationSize.c @@ -750,30 +754,30 @@ msgstr "" #: shared-bindings/audiobusio/PDMIn.c msgid "Cannot record to a file" -msgstr "" +msgstr "Dosyaya kayıt yapılamıyor" #: shared-module/storage/__init__.c msgid "Cannot remount '/' when visible via USB." -msgstr "" +msgstr "'/' USB ile görünür olduğunda, yeniden bağlanamaz." #: ports/atmel-samd/common-hal/microcontroller/__init__.c #: ports/cxd56/common-hal/microcontroller/__init__.c #: ports/mimxrt10xx/common-hal/microcontroller/__init__.c msgid "Cannot reset into bootloader because no bootloader is present" -msgstr "" +msgstr "Hiçbir bootloader bulunmadığından bootloader sıfırlanamıyor" #: ports/espressif/common-hal/socketpool/Socket.c msgid "Cannot set socket options" -msgstr "" +msgstr "Soket seçenekleri ayarlanamıyor" #: shared-bindings/digitalio/DigitalInOut.c msgid "Cannot set value when direction is input." -msgstr "" +msgstr "Yön, giriş olduğunda değer ayarlanamıyor." #: ports/espressif/common-hal/busio/UART.c #: ports/mimxrt10xx/common-hal/busio/UART.c msgid "Cannot specify RTS or CTS in RS485 mode" -msgstr "" +msgstr "RS485 modunda RTS veya CTS belirtilemez" #: py/objslice.c msgid "Cannot subclass slice" @@ -781,11 +785,11 @@ msgstr "" #: shared-module/bitbangio/SPI.c msgid "Cannot transfer without MOSI and MISO pins" -msgstr "" +msgstr "MOSI ve MISO pinleri olmadan transfer edilemiyor" #: shared-bindings/pwmio/PWMOut.c msgid "Cannot vary frequency on a timer that is already in use" -msgstr "" +msgstr "Kullanımda olan bir zamanlayıcının frekansı değiştirilemez" #: ports/nrf/common-hal/alarm/pin/PinAlarm.c msgid "Cannot wake on pin edge, only level" @@ -797,7 +801,7 @@ msgstr "" #: shared-bindings/_bleio/CharacteristicBuffer.c msgid "CharacteristicBuffer writing not provided" -msgstr "" +msgstr "CharacteristicBuffer yazılmı sağlanmadı" #: supervisor/shared/safe_mode.c msgid "CircuitPython core code crashed hard. Whoops!\n" @@ -809,7 +813,7 @@ msgstr "" #: shared-module/bitbangio/I2C.c msgid "Clock stretch too long" -msgstr "" +msgstr "Saat uzatması çok uzun" #: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Clock unit in use" @@ -831,7 +835,7 @@ msgstr "" #: shared-bindings/_bleio/Adapter.c msgid "Could not set address" -msgstr "" +msgstr "Adres ayarlanamadı" #: shared-bindings/pwmio/PWMOut.c msgid "Could not start PWM" @@ -839,7 +843,7 @@ msgstr "PWM başlatılamadı" #: ports/stm/common-hal/busio/UART.c msgid "Could not start interrupt, RX busy" -msgstr "" +msgstr "Kesinti başlatılamadı, RX kullanımda" #: shared-module/audiomp3/MP3Decoder.c msgid "Couldn't allocate decoder" @@ -859,16 +863,16 @@ msgstr "" #: ports/atmel-samd/common-hal/audioio/AudioOut.c msgid "DAC already in use" -msgstr "" +msgstr "DAC zaten kullanımda" #: ports/atmel-samd/common-hal/paralleldisplay/ParallelBus.c #: ports/nrf/common-hal/paralleldisplay/ParallelBus.c msgid "Data 0 pin must be byte aligned" -msgstr "" +msgstr "Data 0 pini bite hizalı olmalı" #: shared-module/audiocore/WaveFile.c msgid "Data chunk must follow fmt chunk" -msgstr "" +msgstr "Veri öbeği, fmt yığınını takip etmelidir" #: ports/espressif/common-hal/_bleio/Adapter.c #: ports/nrf/common-hal/_bleio/Adapter.c @@ -886,34 +890,38 @@ msgstr "" #: shared-bindings/audiobusio/PDMIn.c msgid "Destination capacity is smaller than destination_length." -msgstr "" +msgstr "Hedef kapasitesi, hedef_uzunluğundan daha küçük." #: ports/nrf/common-hal/audiobusio/I2SOut.c msgid "Device in use" -msgstr "" +msgstr "Cihaz kullanımda" #: shared-bindings/displayio/Display.c #: shared-bindings/framebufferio/FramebufferDisplay.c msgid "Display must have a 16 bit colorspace." -msgstr "" +msgstr "Ekran 16 bitlik bir renk uzayına sahip olmalıdır." #: shared-bindings/displayio/Display.c #: shared-bindings/displayio/EPaperDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c msgid "Display rotation must be in 90 degree increments" -msgstr "" +msgstr "Ekran dönüşü 90 derecelik artışlarla olmalıdır" #: main.c msgid "Done" -msgstr "" +msgstr "Tamamlandı" #: shared-bindings/digitalio/DigitalInOut.c msgid "Drive mode not used when direction is input." -msgstr "" +msgstr "Yön, giriş olduğunda sürüş modu kullanılmaz." + +#: py/obj.c +msgid "During handling of the above exception, another exception occurred:" +msgstr "Yukarıdaki hatanın işlenmesi sırasında başka bir hata oluştu:" #: shared-bindings/aesio/aes.c msgid "ECB only operates on 16 bytes at a time" -msgstr "" +msgstr "ECB aynı anda yalnızca 16 baytla çalışır" #: ports/espressif/common-hal/busio/SPI.c #: ports/espressif/common-hal/canio/CAN.c @@ -925,36 +933,36 @@ msgstr "" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c #: ports/cxd56/common-hal/pulseio/PulseIn.c msgid "EXTINT channel already in use" -msgstr "" +msgstr "EXTINT kanalı zaten kullanımda" #: shared-module/synthio/MidiTrack.c #, c-format msgid "Error in MIDI stream at position %d" -msgstr "" +msgstr "%d konumundaki MIDI akışında hata" #: extmod/modure.c msgid "Error in regex" -msgstr "" +msgstr "regex'te hata" #: shared-bindings/socketpool/Socket.c shared-bindings/ssl/SSLSocket.c msgid "Error: Failure to bind" -msgstr "" +msgstr "Hata: Bağlanamadı" -#: py/enum.c shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c -#: shared-bindings/alarm/__init__.c shared-bindings/alarm/coproc/CoprocAlarm.c -#: shared-bindings/busio/SPI.c shared-bindings/coproc/Coproc.c -#: shared-bindings/coproc/__init__.c shared-bindings/microcontroller/Pin.c +#: ports/espressif/bindings/espulp/ULP.c py/enum.c +#: shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c +#: shared-bindings/alarm/__init__.c shared-bindings/busio/SPI.c +#: shared-bindings/microcontroller/Pin.c #: shared-bindings/neopixel_write/__init__.c msgid "Expected a %q" -msgstr "" +msgstr "%q bekleniyor" #: ports/raspberrypi/bindings/cyw43/__init__.c msgid "Expected a %q or %q" -msgstr "" +msgstr "%q yada %q bekleniyor" #: shared-bindings/alarm/__init__.c msgid "Expected an %q" -msgstr "" +msgstr "%q bekleniyor" #: ports/espressif/common-hal/_bleio/Adapter.c #: ports/nrf/common-hal/_bleio/Adapter.c @@ -963,24 +971,24 @@ msgstr "" #: extmod/ulab/code/numpy/fft/fft_tools.c msgid "FFT is defined for ndarrays only" -msgstr "" +msgstr "FFT sadece ndarrays'te tanımlandı" #: extmod/ulab/code/numpy/fft/fft_tools.c msgid "FFT is implemented for linear arrays only" -msgstr "" +msgstr "FFT yalnızca doğrusal diziler için uygulanır" #: ports/espressif/common-hal/ssl/SSLSocket.c msgid "Failed SSL handshake" -msgstr "" +msgstr "SSL el sıkışma hatası" #: shared-bindings/ps2io/Ps2.c msgid "Failed sending command." -msgstr "" +msgstr "Komut gönderilemedi." #: ports/nrf/sd_mutex.c #, c-format msgid "Failed to acquire mutex, err 0x%04x" -msgstr "" +msgstr "Muteks alınamadı, err 0x%04x" #: shared-module/rgbmatrix/RGBMatrix.c msgid "Failed to allocate %q buffer" @@ -1001,24 +1009,24 @@ msgstr "" #: ports/espressif/common-hal/_bleio/Adapter.c #: ports/nrf/common-hal/_bleio/Adapter.c msgid "Failed to connect: internal error" -msgstr "" +msgstr "Bağlantı kurulamadı: internal error" #: ports/nrf/common-hal/_bleio/Adapter.c msgid "Failed to connect: timeout" -msgstr "" +msgstr "Bağlantı kurulamadı: timeout" #: shared-module/audiomp3/MP3Decoder.c msgid "Failed to parse MP3 file" -msgstr "" +msgstr "MP3 dosyası ayrıştırılamadı" #: ports/nrf/sd_mutex.c #, c-format msgid "Failed to release mutex, err 0x%04x" -msgstr "" +msgstr "Muteks serbest bırakılamadı, err 0x%04x" #: supervisor/shared/safe_mode.c msgid "Failed to write internal flash." -msgstr "" +msgstr "Dahili flaş yazılamadı." #: supervisor/shared/safe_mode.c msgid "Fatal error." @@ -1026,13 +1034,17 @@ msgstr "" #: py/moduerrno.c msgid "File exists" +msgstr "Dosya var" + +#: shared-module/os/getenv.c +msgid "File not found" msgstr "" #: ports/atmel-samd/common-hal/canio/Listener.c #: ports/espressif/common-hal/canio/Listener.c #: ports/stm/common-hal/canio/Listener.c msgid "Filters too complex" -msgstr "" +msgstr "Filtreler çok karmaşık" #: ports/espressif/common-hal/dualbank/__init__.c msgid "Firmware is duplicate" @@ -1040,42 +1052,45 @@ msgstr "" #: ports/espressif/common-hal/dualbank/__init__.c msgid "Firmware is invalid" -msgstr "" +msgstr "Yazılım geçersiz" -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/espressif/common-hal/dualbank/__init__.c msgid "Firmware is too big" -msgstr "" +msgstr "Yazılım çok büyük" #: shared-bindings/bitmaptools/__init__.c msgid "For L8 colorspace, input bitmap must have 8 bits per pixel" msgstr "" +"L8 renk uzayı için, giriş bitmap'i piksel başına 8 bayta sahip olmalıdır" #: shared-bindings/bitmaptools/__init__.c msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "" +"RGB renk uzayı için, giriş bitmap'i piksel başına 16 bayta sahip olmalıdır" #: ports/cxd56/common-hal/camera/Camera.c msgid "Format not supported" -msgstr "" +msgstr "Format desteklenmiyor" #: ports/mimxrt10xx/common-hal/microcontroller/Processor.c msgid "" "Frequency must be 24, 150, 396, 450, 528, 600, 720, 816, 912, 960 or 1008 Mhz" msgstr "" +"Frekans 24, 150, 396, 450, 528, 600, 720, 816, 912, 960 ya da 1008 Mhz " +"olmalıdır" #: shared-bindings/pwmio/PWMOut.c msgid "Frequency must match existing PWMOut using this timer" -msgstr "" +msgstr "Frekans, bu zamanlayıcıyı kullanan mevcut PWMOut ile eşleşmelidir" #: shared-bindings/bitbangio/I2C.c shared-bindings/bitbangio/SPI.c #: shared-bindings/busio/I2C.c shared-bindings/busio/SPI.c msgid "Function requires lock" -msgstr "" +msgstr "Fonksiyon kilit gerektirir" #: ports/cxd56/common-hal/gnss/GNSS.c msgid "GNSS init" -msgstr "" +msgstr "GNSS init" #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Generic Failure" @@ -1084,8 +1099,10 @@ msgstr "" #: shared-bindings/displayio/Display.c #: shared-bindings/displayio/EPaperDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c +#: shared-module/displayio/Display.c +#: shared-module/framebufferio/FramebufferDisplay.c msgid "Group already used" -msgstr "" +msgstr "Grup zaten kullanılıyor" #: ports/atmel-samd/common-hal/busio/SPI.c ports/cxd56/common-hal/busio/SPI.c #: ports/espressif/common-hal/busio/SPI.c @@ -1098,205 +1115,218 @@ msgstr "" #: ports/stm/common-hal/busio/SPI.c ports/stm/common-hal/canio/CAN.c #: ports/stm/common-hal/sdioio/SDCard.c msgid "Hardware busy, try alternative pins" -msgstr "" +msgstr "Donanım meşgul, alternatif pinleri deneyin" #: ports/mimxrt10xx/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "Hardware in use, try alternative pins" -msgstr "" +msgstr "Donanım kullanımda, alternatif pinleri deneyin" #: extmod/vfs_posix_file.c py/objstringio.c msgid "I/O operation on closed file" -msgstr "" +msgstr "Kapalı dosyada I/O işlemi" #: ports/stm/common-hal/busio/I2C.c msgid "I2C init error" -msgstr "" +msgstr "I2C init hatası" #: ports/raspberrypi/common-hal/busio/I2C.c #: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c msgid "I2C peripheral in use" -msgstr "" +msgstr "I2C çevre cihazı kullanımda" #: shared-bindings/audiobusio/I2SOut.c msgid "I2SOut not available" -msgstr "" +msgstr "I2SOut uygundeğil" #: shared-bindings/aesio/aes.c #, c-format msgid "IV must be %d bytes long" -msgstr "" +msgstr "IV %d bayt uzunluğunda olmalı" #: ports/raspberrypi/bindings/rp2pio/StateMachine.c msgid "In-buffer elements must be <= 4 bytes long" -msgstr "" +msgstr "Buffer öğeleri <=4 bayt uzunluğunda olmalı" #: py/persistentcode.c msgid "" "Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/" "mpy-update for more info." msgstr "" +"Uyumsuz .mpy dosyası. Lütfen tüm .mpy dosyalarını güncelleyin. Daha fazla " +"bilgi için http://adafru.it/mpy-update ." #: shared-bindings/_pew/PewPew.c msgid "Incorrect buffer size" -msgstr "" +msgstr "Yanlış buffer size" #: ports/raspberrypi/bindings/rp2pio/StateMachine.c msgid "Init program size invalid" -msgstr "" +msgstr "Init program boyutu geçersiz" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "Initial set pin direction conflicts with initial out pin direction" -msgstr "" +msgstr "İlk pin yönü, ilk çıkış pin yönüyle çakışıyor" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c msgid "Initial set pin state conflicts with initial out pin state" -msgstr "" +msgstr "İlk pinin durumu, ilk çıkış pininin durumu ile çakışıyor" #: ports/espressif/common-hal/watchdog/WatchDogTimer.c msgid "Initialization failed due to lack of memory" -msgstr "" +msgstr "Bellek yetersizliği nedeniyle başlatma başarısız oldu" #: shared-bindings/bitops/__init__.c #, c-format msgid "Input buffer length (%d) must be a multiple of the strand count (%d)" -msgstr "" +msgstr "Giriş buffer uzunluğu (%d) strand sayımının (%d) katı olmalıdır" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c msgid "Input taking too long" -msgstr "" +msgstr "Giriş çok uzun sürüyor" #: ports/espressif/common-hal/neopixel_write/__init__.c py/moduerrno.c msgid "Input/output error" -msgstr "" +msgstr "Giriş/çıkış hatası" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #, c-format msgid "Instruction %d shifts in more bits than pin count" -msgstr "" +msgstr "Komut %d pin sayısından daha fazla bit içe kaydırıyor" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #, c-format msgid "Instruction %d shifts out more bits than pin count" -msgstr "" +msgstr "Komut %d pin sayısından daha fazla bit dışa kaydırıyor" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #, c-format msgid "Instruction %d uses extra pin" -msgstr "" +msgstr "Komut %d extra pin kullanıyor" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #, c-format msgid "Instruction %d waits on input outside of count" -msgstr "" +msgstr "Komut %d sayım dışında, girişte bekler" #: ports/nrf/common-hal/_bleio/__init__.c msgid "Insufficient authentication" -msgstr "" +msgstr "Yetersiz kimlik doğrulama" #: ports/nrf/common-hal/_bleio/__init__.c msgid "Insufficient encryption" -msgstr "" +msgstr "Yetersiz şifreleme" #: ports/espressif/common-hal/wifi/Radio.c msgid "Interface must be started" -msgstr "" +msgstr "Arayüz başlatılmalıdır" #: ports/atmel-samd/audio_dma.c ports/raspberrypi/audio_dma.c msgid "Internal audio buffer too small" -msgstr "" +msgstr "Dahili ses arabelleği çok küçük" #: ports/stm/common-hal/busio/UART.c msgid "Internal define error" -msgstr "" +msgstr "Dahili tanımlama hatası" #: ports/espressif/common-hal/paralleldisplay/ParallelBus.c +#: shared-module/os/getenv.c msgid "Internal error" -msgstr "" +msgstr "Dahili hata" #: shared-module/rgbmatrix/RGBMatrix.c #, c-format msgid "Internal error #%d" -msgstr "" +msgstr "Dahili hata #%d" #: supervisor/shared/safe_mode.c msgid "Internal watchdog timer expired." -msgstr "" +msgstr "Dahili bekçi zamanlayıcısının süresi doldu." #: py/argcheck.c shared-bindings/digitalio/DigitalInOut.c msgid "Invalid %q" -msgstr "" +msgstr "Geçersiz %q" #: shared-bindings/microcontroller/Pin.c msgid "Invalid %q pin" -msgstr "" +msgstr "Geersi %q pin" #: ports/stm/common-hal/analogio/AnalogIn.c msgid "Invalid ADC Unit value" -msgstr "" +msgstr "Geçersiz ADC Ünite değeri" #: ports/espressif/common-hal/_bleio/__init__.c #: ports/nrf/common-hal/_bleio/__init__.c msgid "Invalid BLE parameter" -msgstr "" +msgstr "Geçersiz BLE parametresi" #: shared-bindings/wifi/Radio.c msgid "Invalid BSSID" -msgstr "" +msgstr "Geçersiz BSSID" #: shared-bindings/wifi/Radio.c msgid "Invalid MAC address" -msgstr "" +msgstr "Geçersiz MAC adresi" #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c #: py/moduerrno.c msgid "Invalid argument" -msgstr "" +msgstr "Geçersiz argüman" #: shared-module/displayio/Bitmap.c +#, fuzzy msgid "Invalid bits per value" +msgstr "Geçersiz bit başına değer" + +#: shared-module/os/getenv.c +#, c-format +msgid "Invalid byte %.*s" msgstr "" #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #, c-format msgid "Invalid data_pins[%d]" -msgstr "" +msgstr "Geçersiz veri_pini [%d]" #: shared-module/audiocore/WaveFile.c msgid "Invalid format chunk size" -msgstr "" +msgstr "Geçersiz biçim yığın boyutu" #: supervisor/shared/safe_mode.c msgid "Invalid memory access." -msgstr "" +msgstr "Geçersiz bellek erişimi." #: ports/espressif/common-hal/wifi/Radio.c msgid "Invalid multicast MAC address" -msgstr "" - -#: shared-bindings/busio/UART.c -msgid "Invalid pins" -msgstr "" +msgstr "Geçersiz multicast MAC adresi" #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Invalid size" -msgstr "" +msgstr "Geçersiz boyut" #: ports/espressif/common-hal/ssl/SSLContext.c #: ports/raspberrypi/common-hal/ssl/SSLSocket.c msgid "Invalid socket for TLS" -msgstr "" +msgstr "TLS için geçersiz soket" #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Invalid state" +msgstr "Geçersiz durum" + +#: shared-module/os/getenv.c +msgid "Invalid unicode escape" msgstr "" #: shared-bindings/aesio/aes.c msgid "Key must be 16, 24, or 32 bytes long" +msgstr "Anahtar 16, 24 veya 32 bayt uzunluğunda olmalıdır" + +#: shared-module/os/getenv.c +msgid "Key not found" msgstr "" #: shared-module/is31fl3741/FrameBuffer.c msgid "LED mappings must match display size" -msgstr "" +msgstr "LED eşlemeleri ekran boyutuyla eşleşmelidir" #: py/compile.c msgid "LHS of keyword arg must be an id" @@ -1304,24 +1334,24 @@ msgstr "" #: shared-module/displayio/Group.c msgid "Layer already in a group" -msgstr "" +msgstr "Katman zaten bir grupta" #: shared-module/displayio/Group.c msgid "Layer must be a Group or TileGrid subclass" -msgstr "" +msgstr "Katman, bir Grup ya da TileGrid alt sınıfı olmalıdır" #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "MAC address was invalid" -msgstr "" +msgstr "MAC adresi geçersiz" #: shared-bindings/is31fl3741/IS31FL3741.c msgid "Mapping must be a tuple" -msgstr "" +msgstr "Map tuple olmalıdır" #: shared-module/displayio/Shape.c #, c-format msgid "Maximum x value when mirrored is %d" -msgstr "" +msgstr "İkizlendiğinde maksimum x değeri %d'dir" #: shared-bindings/audiobusio/PDMIn.c msgid "Microphone startup delay must be in range 0.0 to 1.0" @@ -1338,11 +1368,11 @@ msgstr "" #: ports/mimxrt10xx/common-hal/busio/SPI.c msgid "Missing MISO or MOSI Pin" -msgstr "" +msgstr "Eksik MISO veya MOSI pini" #: ports/stm/common-hal/busio/SPI.c msgid "Missing MISO or MOSI pin" -msgstr "" +msgstr "Eksik MISO veya MOSI pini" #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #, c-format @@ -1398,11 +1428,15 @@ msgstr "" #: ports/espressif/common-hal/nvm/ByteArray.c msgid "NVS Error" +msgstr "NVS hatası" + +#: shared-bindings/socketpool/SocketPool.c +msgid "Name or service not known" msgstr "" #: py/qstr.c msgid "Name too long" -msgstr "" +msgstr "İsim çok uzun" #: shared-bindings/displayio/TileGrid.c msgid "New bitmap must be same size as old bitmap" @@ -1440,43 +1474,43 @@ msgstr "" #: supervisor/shared/web_workflow/web_workflow.c msgid "No IP" -msgstr "" +msgstr "IP yok" #: ports/espressif/common-hal/busio/SPI.c #: ports/mimxrt10xx/common-hal/busio/SPI.c msgid "No MISO Pin" -msgstr "" +msgstr "MISO pini yok" #: ports/stm/common-hal/busio/SPI.c shared-module/bitbangio/SPI.c msgid "No MISO pin" -msgstr "" +msgstr "MISO pini yok" #: ports/espressif/common-hal/busio/SPI.c #: ports/mimxrt10xx/common-hal/busio/SPI.c msgid "No MOSI Pin" -msgstr "" +msgstr "MOSI pini yok" #: ports/stm/common-hal/busio/SPI.c shared-module/bitbangio/SPI.c msgid "No MOSI pin" -msgstr "" +msgstr "MOSI pini yok" #: ports/atmel-samd/common-hal/busio/UART.c #: ports/espressif/common-hal/busio/UART.c #: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c #: ports/raspberrypi/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "No RX pin" -msgstr "" +msgstr "RX pini yok" #: ports/atmel-samd/common-hal/busio/UART.c #: ports/espressif/common-hal/busio/UART.c #: ports/mimxrt10xx/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c #: ports/raspberrypi/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "No TX pin" -msgstr "" +msgstr "TX pini yok" #: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c msgid "No available clocks" -msgstr "" +msgstr "Kullanılabilir saat yok" #: ports/espressif/common-hal/imagecapture/ParallelImageCapture.c msgid "No capture in progress" @@ -1514,11 +1548,6 @@ msgstr "" msgid "No long integer support" msgstr "" -#: shared-module/usb_hid/__init__.c -#, c-format -msgid "No more than %d HID devices allowed" -msgstr "" - #: shared-bindings/wifi/Radio.c msgid "No network with that ssid" msgstr "" @@ -1643,11 +1672,14 @@ msgid "" "%d bpp given" msgstr "" -#: ports/espressif/common-hal/alarm/coproc/CoprocAlarm.c #: ports/espressif/common-hal/alarm/touch/TouchAlarm.c msgid "Only one %q can be set in deep sleep." msgstr "" +#: ports/espressif/common-hal/espulp/ULPAlarm.c +msgid "Only one %q can be set." +msgstr "" + #: ports/espressif/common-hal/i2ctarget/I2CTarget.c #: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c msgid "Only one address is allowed" @@ -1680,6 +1712,10 @@ msgstr "" msgid "Operation timed out" msgstr "" +#: ports/raspberrypi/common-hal/mdns/Server.c +msgid "Out of MDNS service slots" +msgstr "" + #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Out of memory" msgstr "" @@ -1806,6 +1842,10 @@ msgstr "" msgid "Program size invalid" msgstr "" +#: ports/espressif/common-hal/espulp/ULP.c +msgid "Program too long" +msgstr "" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." msgstr "" @@ -1846,7 +1886,7 @@ msgid "Random number generation error" msgstr "" #: shared-bindings/memorymonitor/AllocationSize.c -#: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/pulseio/PulseIn.c shared-module/displayio/Bitmap.c msgid "Read-only" msgstr "" @@ -1854,10 +1894,6 @@ msgstr "" msgid "Read-only filesystem" msgstr "" -#: shared-module/displayio/Bitmap.c -msgid "Read-only object" -msgstr "" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Received response was invalid" msgstr "" @@ -1950,7 +1986,7 @@ msgstr "" msgid "Sleep Memory not available" msgstr "" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Slice and value different lengths." msgstr "" @@ -1987,6 +2023,10 @@ msgstr "" msgid "Stereo right must be on PWM channel B" msgstr "" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Stopping AP is not supported." +msgstr "" + #: ports/mimxrt10xx/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "Supply at least one UART pin" msgstr "" @@ -2027,6 +2067,10 @@ msgid "" "exit safe mode." msgstr "" +#: py/obj.c +msgid "The above exception was the direct cause of the following exception:" +msgstr "" + #: ports/espressif/boards/m5stack_atom_lite/mpconfigboard.h msgid "The central button was pressed at start up.\n" msgstr "" @@ -2212,11 +2256,12 @@ msgid "Unable to read color palette data" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "Unable to start mDNS query" msgstr "" -#: shared-bindings/coproc/CoprocMemory.c -msgid "Unable to write" +#: shared-bindings/memorymap/AddressRange.c +msgid "Unable to write to address." msgstr "" #: shared-bindings/nvm/ByteArray.c @@ -2287,6 +2332,7 @@ msgid "Unkown error code %d" msgstr "" #: shared-bindings/adafruit_pixelbuf/PixelBuf.c +#: shared-module/_pixelmap/PixelMap.c #, c-format msgid "Unmatched number of items on RHS (expected %d, got %d)." msgstr "" @@ -2371,6 +2417,18 @@ msgstr "" msgid "Wi-Fi: " msgstr "" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in access point mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in station mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is not enabled" +msgstr "" + #: main.c msgid "Woken up by alarm.\n" msgstr "" @@ -2459,7 +2517,7 @@ msgid "array has too many dimensions" msgstr "" #: py/objarray.c shared-bindings/alarm/SleepMemory.c -#: shared-bindings/coproc/CoprocMemory.c shared-bindings/nvm/ByteArray.c +#: shared-bindings/memorymap/AddressRange.c shared-bindings/nvm/ByteArray.c msgid "array/bytes required on right side" msgstr "" @@ -2552,10 +2610,6 @@ msgstr "" msgid "buffer too small for requested bytes" msgstr "" -#: shared-bindings/adafruit_pixelbuf/PixelBuf.c -msgid "byteorder is not a string" -msgstr "" - #: py/objarray.c msgid "bytes length not a multiple of item size" msgstr "" @@ -2597,14 +2651,10 @@ msgstr "" msgid "can't cancel self" msgstr "" -#: py/obj.c py/objint.c shared-module/adafruit_pixelbuf/PixelBuf.c +#: py/obj.c py/objint.c py/runtime.c shared-module/adafruit_pixelbuf/PixelBuf.c msgid "can't convert %q to %q" msgstr "" -#: py/runtime.c -msgid "can't convert %q to int" -msgstr "" - #: py/obj.c #, c-format msgid "can't convert %s to complex" @@ -2686,6 +2736,10 @@ msgstr "" msgid "can't set attribute" msgstr "" +#: py/runtime.c +msgid "can't set attribute '%q'" +msgstr "" + #: py/emitnative.c msgid "can't store '%q'" msgstr "" @@ -2788,10 +2842,6 @@ msgstr "" msgid "comparison of int and uint" msgstr "" -#: py/objcomplex.c -msgid "complex division by zero" -msgstr "" - #: py/objfloat.c py/parsenum.c msgid "complex values not supported" msgstr "" @@ -2894,12 +2944,7 @@ msgstr "" msgid "div/mod not implemented for uint" msgstr "" -#: py/objfloat.c py/objint_mpz.c -msgid "divide by zero" -msgstr "" - -#: py/modmath.c py/objint_longlong.c py/runtime.c -#: shared-bindings/math/__init__.c +#: py/runtime.c msgid "division by zero" msgstr "" @@ -3056,10 +3101,6 @@ msgstr "" msgid "format requires a dict" msgstr "" -#: shared-bindings/microcontroller/Processor.c -msgid "frequency is read-only for this board" -msgstr "" - #: py/objdeque.c msgid "full" msgstr "" @@ -3172,8 +3213,12 @@ msgstr "" msgid "index is out of bounds" msgstr "" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "index must be tuple or int" +msgstr "" + #: extmod/ulab/code/numpy/numerical.c extmod/ulab/code/ulab_tools.c -#: ports/espressif/common-hal/pulseio/PulseIn.c py/obj.c +#: ports/espressif/common-hal/pulseio/PulseIn.c #: shared-bindings/bitmaptools/__init__.c msgid "index out of range" msgstr "" @@ -3271,10 +3316,6 @@ msgstr "" msgid "inputs are not iterable" msgstr "" -#: py/parsenum.c -msgid "int() arg 2 must be >= 2 and <= 36" -msgstr "" - #: extmod/ulab/code/numpy/approx.c msgid "interp is defined for 1D iterables of equal length" msgstr "" @@ -3356,10 +3397,6 @@ msgstr "" msgid "invalid syntax for number" msgstr "" -#: py/objexcept.c -msgid "invalid traceback" -msgstr "" - #: py/objtype.c msgid "issubclass() arg 1 must be a class" msgstr "" @@ -3416,19 +3453,17 @@ msgstr "" msgid "local variable referenced before assignment" msgstr "" -#: py/objint.c -msgid "long int not supported in this build" -msgstr "" - #: ports/espressif/common-hal/canio/CAN.c msgid "loopback + silent mode not supported by peripheral" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS already initialized" msgstr "" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS only works with built-in WiFi" msgstr "" @@ -3557,6 +3592,10 @@ msgstr "" msgid "negative shift count" msgstr "" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "nested index must be int" +msgstr "" + #: shared-module/sdcardio/SDCard.c msgid "no SD card" msgstr "" @@ -3736,7 +3775,7 @@ msgid "only sample_rate=16000 is supported" msgstr "" #: py/objarray.c py/objstr.c py/objstrunicode.c py/objtuple.c -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "only slices with step=1 (aka None) are supported" msgstr "" @@ -3952,10 +3991,6 @@ msgstr "" msgid "slice step can't be zero" msgstr "" -#: py/objslice.c -msgid "slice step cannot be zero" -msgstr "" - #: py/nativeglue.c msgid "slice unsupported" msgstr "" @@ -4004,10 +4039,6 @@ msgstr "" msgid "start/end indices" msgstr "" -#: shared-bindings/random/__init__.c -msgid "step must be non-zero" -msgstr "" - #: shared-bindings/random/__init__.c msgid "stop not reachable from start" msgstr "" @@ -4016,10 +4047,6 @@ msgstr "" msgid "stream operation not supported" msgstr "" -#: py/objstrunicode.c -msgid "string indices must be integers, not %q" -msgstr "" - #: py/stream.c msgid "string not supported; use bytes or bytearray" msgstr "" @@ -4052,10 +4079,6 @@ msgstr "" msgid "syntax error in uctypes descriptor" msgstr "" -#: shared-bindings/time/__init__.c -msgid "time.struct_time() takes a 9-sequence" -msgstr "" - #: ports/atmel-samd/common-hal/watchdog/WatchDogTimer.c #: ports/espressif/common-hal/watchdog/WatchDogTimer.c #: ports/nrf/common-hal/watchdog/WatchDogTimer.c @@ -4337,10 +4360,6 @@ msgstr "" msgid "y value out of bounds" msgstr "" -#: py/objrange.c -msgid "zero step" -msgstr "" - #: extmod/ulab/code/scipy/signal/signal.c msgid "zi must be an ndarray" msgstr "" @@ -4353,6 +4372,21 @@ msgstr "" msgid "zi must be of shape (n_section, 2)" msgstr "" +#~ msgid "%q length must be >= 1" +#~ msgstr "%q boyutu >=1 olmalıdır" + +#~ msgid "%q must be a string" +#~ msgstr "%q bir string olmalıdır" + +#~ msgid "%q must be an int" +#~ msgstr "%q bir tam sayı olmalıdır" + +#~ msgid "%q with a report ID of 0 must be of length 1" +#~ msgstr "Rapor kimliği 0 olan %q, 1 uzunluğunda olmalıdır" + +#~ msgid "At most %d %q may be specified (not %d)" +#~ msgstr "En az %d %q belirtilmeli (%d değil)" + #~ msgid "%q indices must be integers, not %s" #~ msgstr "%q indeksleri integer olmalı, %s değil" diff --git a/locale/zh_Latn_pinyin.po b/locale/zh_Latn_pinyin.po index 9178bd4caa..8599c77f2e 100644 --- a/locale/zh_Latn_pinyin.po +++ b/locale/zh_Latn_pinyin.po @@ -7,8 +7,8 @@ msgstr "" "Project-Id-Version: circuitpython-cn\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-01-04 12:55-0600\n" -"PO-Revision-Date: 2022-11-15 04:35+0000\n" -"Last-Translator: River Wang \n" +"PO-Revision-Date: 2022-11-30 16:14+0000\n" +"Last-Translator: hexthat \n" "Language-Team: Chinese Hanyu Pinyin\n" "Language: zh_Latn_pinyin\n" "MIME-Version: 1.0\n" @@ -72,6 +72,11 @@ msgstr "%%c xūyào zhěngshù huòzhě zìfú" #: main.c #, c-format msgid "%02X" +msgstr "%02X" + +#: shared-module/os/getenv.c +#, c-format +msgid "%S" msgstr "" #: shared-bindings/rgbmatrix/RGBMatrix.c @@ -111,13 +116,14 @@ msgstr "%q bāo hán chóng fù de yǐn jiǎo" msgid "%q failure: %d" msgstr "%q Shībài: %d" +#: ports/espressif/common-hal/espulp/ULP.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/microcontroller/Pin.c msgid "%q in use" msgstr "%q zhèngzài bèi shǐyòng" -#: py/obj.c py/objstr.c py/objstrunicode.c +#: py/objstr.c py/objstrunicode.c msgid "%q index out of range" msgstr "%q suǒyǐn chāochū fànwéi" @@ -129,7 +135,11 @@ msgstr "%q chūshǐhuà shībài" msgid "%q is %q" msgstr "%q shì %q" -#: py/argcheck.c +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "%q is read-only for this board" +msgstr "" + +#: py/argcheck.c shared-bindings/usb_hid/Device.c msgid "%q length must be %d" msgstr "%q de chángdù bìxū shì %d" @@ -145,10 +155,6 @@ msgstr "%q chángdù bìxū <= %d" msgid "%q length must be >= %d" msgstr "%q chángdù bìxū >= %d" -#: shared-bindings/busio/I2C.c -msgid "%q length must be >= 1" -msgstr "%q cháng dù bìxū >= 1" - #: py/argcheck.c msgid "%q must be %d" msgstr "%q bìxū %d" @@ -170,24 +176,19 @@ msgid "%q must be >= %d" msgstr "%q bìxū >= %d" #: shared-bindings/analogbufio/BufferedIn.c +msgid "%q must be a bytearray or array of type 'H' or 'B'" +msgstr "" + #: shared-bindings/audiocore/RawSample.c msgid "%q must be a bytearray or array of type 'h', 'H', 'b', or 'B'" msgstr "" "%q bì xū shì zì jié shù zǔ huò lèi xíng wéi 'h', 'H', 'b', huò 'B' de shù zǔ" -#: py/argcheck.c -msgid "%q must be a string" -msgstr "%q bìxū shì yí gè zì fú chuàn" - -#: py/argcheck.c -msgid "%q must be an int" -msgstr "%q bìxū shì zhěng xíng" - -#: py/argcheck.c +#: py/argcheck.c py/obj.c py/objstrunicode.c msgid "%q must be of type %q" msgstr "%q bì xū shì %q lèi xíng" -#: shared-bindings/digitalio/Pull.c +#: py/objexcept.c shared-bindings/digitalio/Pull.c msgid "%q must be of type %q or None" msgstr "%q lèi xíng bì xū wéi %q huò wú" @@ -201,7 +202,6 @@ msgstr "%q chāo chū jiè xiàn" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c #: ports/cxd56/common-hal/pulseio/PulseIn.c -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/nrf/common-hal/pulseio/PulseIn.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c @@ -213,9 +213,9 @@ msgstr "%q chāochū fànwéi" msgid "%q pin invalid" msgstr "%q yǐn jiǎo wúxiào" -#: shared-bindings/usb_hid/Device.c -msgid "%q with a report ID of 0 must be of length 1" -msgstr "bào gào ID shì 0 de %q bì xū cháng dù wéi 1" +#: py/objrange.c py/objslice.c shared-bindings/random/__init__.c +msgid "%q step cannot be zero" +msgstr "" #: py/bc.c py/objnamedtuple.c msgid "%q() takes %d positional arguments but %d were given" @@ -314,7 +314,7 @@ msgstr "'%s' duìxiàng bù zhīchí yuánsù fùzhí" msgid "'%s' object doesn't support item deletion" msgstr "'%s' duìxiàng bù zhīchí yuánsù shānchú" -#: ports/raspberrypi/common-hal/wifi/Radio.c py/runtime.c +#: py/runtime.c msgid "'%s' object has no attribute '%q'" msgstr "'%s' duìxiàng méiyǒu shǔxìng '%q'" @@ -414,6 +414,10 @@ msgstr "ADC2 zhèngzài bèi WiFi shǐ yòng" msgid "Address must be %d bytes long" msgstr "dìzhǐ chángdù bìxū shì %d zìjié" +#: ports/espressif/common-hal/memorymap/AddressRange.c +msgid "Address range not allowed" +msgstr "" + #: ports/espressif/common-hal/canio/CAN.c msgid "All CAN peripherals are in use" msgstr "suǒyǒu CAN wàishè dōu zài shǐyòng zhōng" @@ -494,7 +498,7 @@ msgstr "Mùqián zhèngzài guǎngbō." msgid "Already have all-matches listener" msgstr "yǐjīng yǒu all-matches jiāntīng qì" -#: ports/espressif/common-hal/coproc/__init__.c +#: ports/espressif/common-hal/espulp/ULP.c #: shared-module/memorymonitor/AllocationAlarm.c #: shared-module/memorymonitor/AllocationSize.c msgid "Already running" @@ -505,6 +509,11 @@ msgstr "yǐjīng zài yùnxíng" msgid "Already scanning for wifi networks" msgstr "yǐjīng zài sǎomiáo WIFI wǎngluò" +#: shared-module/os/getenv.c +#, c-format +msgid "An error occurred while retrieving '%s':\n" +msgstr "" + #: ports/stm/common-hal/audiopwmio/PWMAudioOut.c msgid "Another PWMAudioOut is already active" msgstr "lìng yí gè PWMAudioOut yǐ jīng zài gōngzuò" @@ -518,15 +527,11 @@ msgstr "Lìng yīgè fāsòng (send) yǐjīng zài gōngzuò" msgid "Array must contain halfwords (type 'H')" msgstr "Shùzǔ bìxū bāohán halfwords (type 'H')" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Array values should be single bytes." msgstr "shùzǔ de zhí yīnggāi shì dān'gè zìjié." -#: shared-bindings/microcontroller/Pin.c -msgid "At most %d %q may be specified (not %d)" -msgstr "zuìduō kěyǐ zhǐdìng %d gè %q (érbúshì %d)" - #: shared-module/memorymonitor/AllocationAlarm.c #, c-format msgid "Attempt to allocate %d blocks" @@ -741,9 +746,8 @@ msgid "Cannot get temperature" msgstr "Wúfǎ huòqǔ wēndù" #: shared-bindings/_bleio/Adapter.c -#, fuzzy msgid "Cannot have scan responses for extended, connectable advertisements." -msgstr "Nín wúfǎ sǎomiáo kuòzhǎn de, kě liánjiē de guǎnggào." +msgstr "Quē fá duì tuī guǎng, kě lián jiē guǎng gào de dá fù." #: ports/espressif/common-hal/alarm/pin/PinAlarm.c msgid "Cannot pull on input-only pin." @@ -794,7 +798,7 @@ msgstr "wúfǎ shǐyòng biānyuán huànxǐng, zhǐnéng shǐyòng diànpíng" #: ports/espressif/common-hal/alarm/pin/PinAlarm.c msgid "Cannot wake on pin edge. Only level." -msgstr "wúfǎ shǐyòng biānyuán huànxǐng. zhǐnéng shǐyòng diànpíng" +msgstr "wúfǎ shǐyòng biānyuán huànxǐng. zhǐnéng shǐyòng diànpíng." #: shared-bindings/_bleio/CharacteristicBuffer.c msgid "CharacteristicBuffer writing not provided" @@ -864,9 +868,8 @@ msgstr "DAC zhèngzài bèi shǐyòng" #: ports/atmel-samd/common-hal/paralleldisplay/ParallelBus.c #: ports/nrf/common-hal/paralleldisplay/ParallelBus.c -#, fuzzy msgid "Data 0 pin must be byte aligned" -msgstr "Shùjù 0 de yǐn jiǎo bìxū shì zì jié duìqí" +msgstr "shù jù 0 yǐn jiǎo bì xū shì zì jié duì qí de" #: shared-module/audiocore/WaveFile.c msgid "Data chunk must follow fmt chunk" @@ -874,9 +877,8 @@ msgstr "Shùjù kuài bìxū zūnxún fmt qū kuài" #: ports/espressif/common-hal/_bleio/Adapter.c #: ports/nrf/common-hal/_bleio/Adapter.c -#, fuzzy msgid "Data not supported with directed advertising" -msgstr "bù zhī chí dìng xiàng guǎng gào de shù jù" +msgstr "wèi xiàng guǎng gào tí gòng zhī zhù de shù jù" #: ports/espressif/common-hal/_bleio/Adapter.c #: ports/nrf/common-hal/_bleio/Adapter.c @@ -915,6 +917,10 @@ msgstr "zuò" msgid "Drive mode not used when direction is input." msgstr "Fāngxiàng shūrù shí qūdòng móshì méiyǒu shǐyòng." +#: py/obj.c +msgid "During handling of the above exception, another exception occurred:" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "ECB only operates on 16 bytes at a time" msgstr "ECB yí cì zhǐ shǐ yòng 16 gè zì jié" @@ -944,10 +950,10 @@ msgstr "Zhèngzé biǎodá shì cuòwù" msgid "Error: Failure to bind" msgstr "cuò wù: bǎng dìng shī bài" -#: py/enum.c shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c -#: shared-bindings/alarm/__init__.c shared-bindings/alarm/coproc/CoprocAlarm.c -#: shared-bindings/busio/SPI.c shared-bindings/coproc/Coproc.c -#: shared-bindings/coproc/__init__.c shared-bindings/microcontroller/Pin.c +#: ports/espressif/bindings/espulp/ULP.c py/enum.c +#: shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c +#: shared-bindings/alarm/__init__.c shared-bindings/busio/SPI.c +#: shared-bindings/microcontroller/Pin.c #: shared-bindings/neopixel_write/__init__.c msgid "Expected a %q" msgstr "Yù qí %q" @@ -1032,6 +1038,10 @@ msgstr "zhì mìng cuò wù." msgid "File exists" msgstr "Wénjiàn cúnzài" +#: shared-module/os/getenv.c +msgid "File not found" +msgstr "" + #: ports/atmel-samd/common-hal/canio/Listener.c #: ports/espressif/common-hal/canio/Listener.c #: ports/stm/common-hal/canio/Listener.c @@ -1046,7 +1056,6 @@ msgstr "gù jiàn chóng fù" msgid "Firmware is invalid" msgstr "gù jiàn wú xiào" -#: ports/espressif/common-hal/coproc/Coproc.c #: ports/espressif/common-hal/dualbank/__init__.c msgid "Firmware is too big" msgstr "gù jiàn tài dà" @@ -1092,6 +1101,8 @@ msgstr "tōng yòng gù zhàng" #: shared-bindings/displayio/Display.c #: shared-bindings/displayio/EPaperDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c +#: shared-module/displayio/Display.c +#: shared-module/framebufferio/FramebufferDisplay.c msgid "Group already used" msgstr "Jítuán yǐjīng shǐyòngguò" @@ -1225,6 +1236,7 @@ msgid "Internal define error" msgstr "Nèibù dìngyì cuòwù" #: ports/espressif/common-hal/paralleldisplay/ParallelBus.c +#: shared-module/os/getenv.c msgid "Internal error" msgstr "nèi bù cuò wù" @@ -1271,6 +1283,11 @@ msgstr "Wúxiào de cānshù" msgid "Invalid bits per value" msgstr "Měi gè zhí de wèi wúxiào" +#: shared-module/os/getenv.c +#, c-format +msgid "Invalid byte %.*s" +msgstr "" + #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #, c-format msgid "Invalid data_pins[%d]" @@ -1288,10 +1305,6 @@ msgstr "Wúxiào de nèicún fǎngwèn." msgid "Invalid multicast MAC address" msgstr "wú xiào de duō bō MAC dì zhǐ" -#: shared-bindings/busio/UART.c -msgid "Invalid pins" -msgstr "Wúxiào de yǐn jiǎo" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Invalid size" msgstr "dà xiǎo wú xiào" @@ -1305,10 +1318,18 @@ msgstr "TLS de chā zuò wú xiào" msgid "Invalid state" msgstr "wú xiào zhuàng tài" +#: shared-module/os/getenv.c +msgid "Invalid unicode escape" +msgstr "" + #: shared-bindings/aesio/aes.c msgid "Key must be 16, 24, or 32 bytes long" msgstr "mì yào bì xū wéi 16, 24 huò 32 zì jié cháng" +#: shared-module/os/getenv.c +msgid "Key not found" +msgstr "" + #: shared-module/is31fl3741/FrameBuffer.c msgid "LED mappings must match display size" msgstr "LED yìng shè bì xū yǔ xiǎn shì píng chǐ cùn pǐ pèi" @@ -1416,6 +1437,10 @@ msgstr "NLR tiào zhuǎn shī bài. kě néng shì nèi cún sǔn huài." msgid "NVS Error" msgstr "NVS cuò wù" +#: shared-bindings/socketpool/SocketPool.c +msgid "Name or service not known" +msgstr "" + #: py/qstr.c msgid "Name too long" msgstr "Míngchēng tài zhǎng" @@ -1530,11 +1555,6 @@ msgstr "Wèi zhǐdìng mì yào" msgid "No long integer support" msgstr "Méiyǒu zhǎng zhěngshù zhīchí" -#: shared-module/usb_hid/__init__.c -#, c-format -msgid "No more than %d HID devices allowed" -msgstr "bù yǔn xǔ chāo guò %d HID shè bèi" - #: shared-bindings/wifi/Radio.c msgid "No network with that ssid" msgstr "Méiyǒu wǎngluò yǔ gāi ssid" @@ -1664,11 +1684,14 @@ 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/espressif/common-hal/alarm/coproc/CoprocAlarm.c #: ports/espressif/common-hal/alarm/touch/TouchAlarm.c msgid "Only one %q can be set in deep sleep." msgstr "zài shēn dù shuì mián zhōng zhǐ néng shè zhì yí gè %q." +#: ports/espressif/common-hal/espulp/ULPAlarm.c +msgid "Only one %q can be set." +msgstr "" + #: ports/espressif/common-hal/i2ctarget/I2CTarget.c #: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c msgid "Only one address is allowed" @@ -1701,6 +1724,10 @@ msgstr "bù zhī chí cāo zuò huò gōng néng" msgid "Operation timed out" msgstr "cāo zuò yǐ fēn shí" +#: ports/raspberrypi/common-hal/mdns/Server.c +msgid "Out of MDNS service slots" +msgstr "chāo chū MDNS fú wù chā cáo" + #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Out of memory" msgstr "nèi cún bù zú" @@ -1829,6 +1856,10 @@ msgstr "chéng xù zài bù jiā zǎi Osr de qíng kuàng xià zhí xíng OUT" msgid "Program size invalid" msgstr "chéng xù dà xiǎo wú xiào" +#: ports/espressif/common-hal/espulp/ULP.c +msgid "Program too long" +msgstr "" + #: shared-bindings/digitalio/DigitalInOut.c msgid "Pull not used when direction is output." msgstr "Fāngxiàng shūchū shí Pull méiyǒu shǐyòng." @@ -1869,7 +1900,7 @@ msgid "Random number generation error" msgstr "Suíjī shù shēngchéng cuòwù" #: shared-bindings/memorymonitor/AllocationSize.c -#: shared-bindings/pulseio/PulseIn.c +#: shared-bindings/pulseio/PulseIn.c shared-module/displayio/Bitmap.c msgid "Read-only" msgstr "Zhǐ dú" @@ -1877,10 +1908,6 @@ msgstr "Zhǐ dú" msgid "Read-only filesystem" msgstr "Zhǐ dú wénjiàn xìtǒng" -#: shared-module/displayio/Bitmap.c -msgid "Read-only object" -msgstr "Zhǐ dú duìxiàng" - #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c msgid "Received response was invalid" msgstr "shōu dào de xiǎng yìng wú xiào" @@ -1973,7 +2000,7 @@ msgstr "bù zhī chí dà xiǎo" msgid "Sleep Memory not available" msgstr "shuì mián jì yì bù kě yòng" -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "Slice and value different lengths." msgstr "Qiēpiàn hé zhí bùtóng chángdù." @@ -2010,6 +2037,10 @@ msgstr "lì tǐ shēng zuǒ bì xū shì zài PWM tōng dào A" msgid "Stereo right must be on PWM channel B" msgstr "lì tǐ shēng yòu cè bì xū zài PWM tōng dào B shàng" +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Stopping AP is not supported." +msgstr "" + #: ports/mimxrt10xx/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c msgid "Supply at least one UART pin" msgstr "Dìngyì zhìshǎo yīgè UART yǐn jiǎo" @@ -2054,6 +2085,10 @@ msgstr "" "`wēi kòng zhì qì` mó kuài yòng yú qǐ dòng dào ān quán mó shì. àn chóng zhì " "tuì chū ān quán mó shì." +#: py/obj.c +msgid "The above exception was the direct cause of the following exception:" +msgstr "" + #: ports/espressif/boards/m5stack_atom_lite/mpconfigboard.h msgid "The central button was pressed at start up.\n" msgstr "qǐ dòng shí àn xià zhōng yāng àn niǔ.\n" @@ -2186,7 +2221,7 @@ msgstr "UART xiě rù" #: main.c msgid "UID:" -msgstr "" +msgstr "UID:" #: shared-module/usb_hid/Device.c msgid "USB busy" @@ -2246,12 +2281,13 @@ msgid "Unable to read color palette data" msgstr "Wúfǎ dúqǔ tiáosèbǎn shùjù" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "Unable to start mDNS query" msgstr "wú fǎ qǐ dòng mDNS chá xún" -#: shared-bindings/coproc/CoprocMemory.c -msgid "Unable to write" -msgstr "wú fǎ xiě rù" +#: shared-bindings/memorymap/AddressRange.c +msgid "Unable to write to address." +msgstr "" #: shared-bindings/nvm/ByteArray.c msgid "Unable to write to nvm." @@ -2321,6 +2357,7 @@ msgid "Unkown error code %d" msgstr "wèi zhī cuò wù dài %d" #: shared-bindings/adafruit_pixelbuf/PixelBuf.c +#: shared-module/_pixelmap/PixelMap.c #, c-format msgid "Unmatched number of items on RHS (expected %d, got %d)." msgstr "RHS (yùqí %d, huòdé %d) shàng wèi pǐpèi de xiàngmù." @@ -2413,6 +2450,18 @@ msgstr "" msgid "Wi-Fi: " msgstr "Wi-Fi: " +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in access point mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is in station mode." +msgstr "" + +#: ports/raspberrypi/common-hal/wifi/Radio.c +msgid "Wifi is not enabled" +msgstr "" + #: main.c msgid "Woken up by alarm.\n" msgstr "bèi jǐng bào chǎo xǐng.\n" @@ -2503,7 +2552,7 @@ msgid "array has too many dimensions" msgstr "shùzǔ yǒu tài duō wéidù" #: py/objarray.c shared-bindings/alarm/SleepMemory.c -#: shared-bindings/coproc/CoprocMemory.c shared-bindings/nvm/ByteArray.c +#: shared-bindings/memorymap/AddressRange.c shared-bindings/nvm/ByteArray.c msgid "array/bytes required on right side" msgstr "yòu cè xūyào shùzǔ/zì jié" @@ -2596,10 +2645,6 @@ msgstr "huǎnchōng qū tài xiǎo" msgid "buffer too small for requested bytes" msgstr "huǎn chōng qū tài xiǎo, duì yú qǐng qiú de zì jié" -#: shared-bindings/adafruit_pixelbuf/PixelBuf.c -msgid "byteorder is not a string" -msgstr "byteorder bùshì zìfú chuàn" - #: py/objarray.c msgid "bytes length not a multiple of item size" msgstr "zì jié chángdù, bùshì xiàngmù dàxiǎo de bèishù" @@ -2641,14 +2686,10 @@ msgstr "bùnéng fēnpèi dào biǎodá shì" msgid "can't cancel self" msgstr "bù néng qǔ xiāo zì wǒ" -#: py/obj.c py/objint.c shared-module/adafruit_pixelbuf/PixelBuf.c +#: py/obj.c py/objint.c py/runtime.c shared-module/adafruit_pixelbuf/PixelBuf.c msgid "can't convert %q to %q" msgstr "Wúfǎ jiāng %q zhuǎnhuàn wèi %q" -#: py/runtime.c -msgid "can't convert %q to int" -msgstr "wú fǎ jiāng %q zhuǎn huàn wéi nèi zài" - #: py/obj.c #, c-format msgid "can't convert %s to complex" @@ -2730,6 +2771,10 @@ msgstr "wúfǎ shèzhì 512 kuài dàxiǎo" msgid "can't set attribute" msgstr "wúfǎ shèzhì shǔxìng" +#: py/runtime.c +msgid "can't set attribute '%q'" +msgstr "" + #: py/emitnative.c msgid "can't store '%q'" msgstr "wúfǎ cúnchú '%q'" @@ -2836,10 +2881,6 @@ msgstr "yánsè bìxū jiè yú 0x000000 hé 0xffffff zhī jiān" msgid "comparison of int and uint" msgstr "yīn tè hé wū yīn tè de bǐ jiào" -#: py/objcomplex.c -msgid "complex division by zero" -msgstr "fùzá de fēngé wèi 0" - #: py/objfloat.c py/parsenum.c msgid "complex values not supported" msgstr "bù zhīchí fùzá de zhí" @@ -2944,12 +2985,7 @@ msgstr "chǐ cùn bù pǐ pèi" msgid "div/mod not implemented for uint" msgstr "div/ mó zǔ wèi wéi wèi shí xiàn" -#: py/objfloat.c py/objint_mpz.c -msgid "divide by zero" -msgstr "chú yǐ líng" - -#: py/modmath.c py/objint_longlong.c py/runtime.c -#: shared-bindings/math/__init__.c +#: py/runtime.c msgid "division by zero" msgstr "bèi líng chú" @@ -3108,10 +3144,6 @@ msgstr "zìtǐ bìxū wèi 2048 zì jié" msgid "format requires a dict" msgstr "géshì yāoqiú yīgè yǔjù" -#: shared-bindings/microcontroller/Processor.c -msgid "frequency is read-only for this board" -msgstr "cǐ zhǔ bǎn de pín lǜ wéi zhǐ dú" - #: py/objdeque.c msgid "full" msgstr "chōngfèn" @@ -3224,8 +3256,12 @@ msgstr "bù zhèngquè de tiánchōng" msgid "index is out of bounds" msgstr "suǒyǐn chāochū fànwéi" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "index must be tuple or int" +msgstr "" + #: extmod/ulab/code/numpy/numerical.c extmod/ulab/code/ulab_tools.c -#: ports/espressif/common-hal/pulseio/PulseIn.c py/obj.c +#: ports/espressif/common-hal/pulseio/PulseIn.c #: shared-bindings/bitmaptools/__init__.c msgid "index out of range" msgstr "suǒyǐn chāochū fànwéi" @@ -3323,10 +3359,6 @@ msgstr "shūrù xiàngliàng de chángdù bìxū xiāngděng" msgid "inputs are not iterable" msgstr "shū rù bù kě yí dòng" -#: py/parsenum.c -msgid "int() arg 2 must be >= 2 and <= 36" -msgstr "zhěngshù() cānshù 2 bìxū > = 2 qiě <= 36" - #: extmod/ulab/code/numpy/approx.c msgid "interp is defined for 1D iterables of equal length" msgstr "zhōng jiān wéi cháng dù xiāng děng de 1D kě yì jiāo qì dìng yì" @@ -3408,10 +3440,6 @@ 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ǎ" -#: py/objexcept.c -msgid "invalid traceback" -msgstr "wú xiào zhuī sù" - #: py/objtype.c msgid "issubclass() arg 1 must be a class" msgstr "issubclass() cānshù 1 bìxū shì yīgè lèi" @@ -3469,19 +3497,17 @@ msgstr "běndì '%q' zài zhī lèixíng zhīqián shǐyòng" msgid "local variable referenced before assignment" msgstr "fùzhí qián yǐnyòng de júbù biànliàng" -#: py/objint.c -msgid "long int not supported in this build" -msgstr "cǐ bǎnběn bù zhīchí zhǎng zhěngshù" - #: ports/espressif/common-hal/canio/CAN.c msgid "loopback + silent mode not supported by peripheral" msgstr "Wài shè bù zhī chí huán huí + jìng yīn mó shì" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS already initialized" msgstr "mDNS yǐ chū shǐ huà" #: ports/espressif/common-hal/mdns/Server.c +#: ports/raspberrypi/common-hal/mdns/Server.c msgid "mDNS only works with built-in WiFi" msgstr "mDNS jǐn shì yòng yú nèi zhì wú xiàn wǎng luò" @@ -3610,6 +3636,10 @@ msgstr "méiyǒu fú diǎn zhīchí de xiāojí gōnglǜ" msgid "negative shift count" msgstr "fù zhuǎnyí jìshù" +#: shared-bindings/_pixelmap/PixelMap.c +msgid "nested index must be int" +msgstr "" + #: shared-module/sdcardio/SDCard.c msgid "no SD card" msgstr "méiyǒu SD kǎ" @@ -3789,7 +3819,7 @@ msgid "only sample_rate=16000 is supported" msgstr "Jǐn zhīchí cǎiyàng lǜ = 16000" #: py/objarray.c py/objstr.c py/objstrunicode.c py/objtuple.c -#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c +#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c #: shared-bindings/nvm/ByteArray.c msgid "only slices with step=1 (aka None) are supported" msgstr "jǐn zhīchí bù zhǎng = 1(jí wú) de qiēpiàn" @@ -4005,10 +4035,6 @@ msgstr "shuìmián chángdù bìxū shìfēi fùshù" msgid "slice step can't be zero" msgstr "qiēpiàn bù cháng bùnéng wéi líng" -#: py/objslice.c -msgid "slice step cannot be zero" -msgstr "qiēpiàn bù bùnéng wéi líng" - #: py/nativeglue.c msgid "slice unsupported" msgstr "qiē piàn bù shòu zhī chí" @@ -4060,10 +4086,6 @@ msgstr "yuán wèi tú (source_bitmap) de zhí de shù mù (value_count) bì xū msgid "start/end indices" msgstr "kāishǐ/jiéshù zhǐshù" -#: shared-bindings/random/__init__.c -msgid "step must be non-zero" -msgstr "bùzhòu bìxū shìfēi líng" - #: shared-bindings/random/__init__.c msgid "stop not reachable from start" msgstr "tíngzhǐ wúfǎ cóng kāishǐ zhōng zhǎodào" @@ -4072,10 +4094,6 @@ msgstr "tíngzhǐ wúfǎ cóng kāishǐ zhōng zhǎodào" msgid "stream operation not supported" msgstr "bù zhīchí liú cāozuò" -#: py/objstrunicode.c -msgid "string indices must be integers, not %q" -msgstr "zìfú chuàn suǒyǐn bìxū shì zhěngshù, ér bùshì %q" - #: py/stream.c msgid "string not supported; use bytes or bytearray" msgstr "zìfú chuàn bù zhīchí; shǐyòng zì jié huò zì jié zǔ" @@ -4108,10 +4126,6 @@ msgstr "JSON yǔfǎ cuòwù" msgid "syntax error in uctypes descriptor" msgstr "uctypes miáoshù fú zhōng de yǔfǎ cuòwù" -#: shared-bindings/time/__init__.c -msgid "time.struct_time() takes a 9-sequence" -msgstr "time.struct_time() xūyào 9 xùliè" - #: ports/atmel-samd/common-hal/watchdog/WatchDogTimer.c #: ports/espressif/common-hal/watchdog/WatchDogTimer.c #: ports/nrf/common-hal/watchdog/WatchDogTimer.c @@ -4393,10 +4407,6 @@ msgstr "xTaskCreate shī bài" msgid "y value out of bounds" msgstr "y zhí chāochū biānjiè" -#: py/objrange.c -msgid "zero step" -msgstr "líng bù" - #: extmod/ulab/code/scipy/signal/signal.c msgid "zi must be an ndarray" msgstr "zi bìxū shì ndarray" @@ -4409,6 +4419,73 @@ 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 "Read-only object" +#~ msgstr "Zhǐ dú duìxiàng" + +#~ msgid "frequency is read-only for this board" +#~ msgstr "cǐ zhǔ bǎn de pín lǜ wéi zhǐ dú" + +#~ msgid "Unable to write" +#~ msgstr "wú fǎ xiě rù" + +#~ msgid "%q length must be >= 1" +#~ msgstr "%q cháng dù bìxū >= 1" + +#~ msgid "%q must be a string" +#~ msgstr "%q bìxū shì yí gè zì fú chuàn" + +#~ msgid "%q must be an int" +#~ msgstr "%q bìxū shì zhěng xíng" + +#~ msgid "%q with a report ID of 0 must be of length 1" +#~ msgstr "bào gào ID shì 0 de %q bì xū cháng dù wéi 1" + +#~ msgid "At most %d %q may be specified (not %d)" +#~ msgstr "zuìduō kěyǐ zhǐdìng %d gè %q (érbúshì %d)" + +#~ msgid "Invalid pins" +#~ msgstr "Wúxiào de yǐn jiǎo" + +#, c-format +#~ msgid "No more than %d HID devices allowed" +#~ msgstr "bù yǔn xǔ chāo guò %d HID shè bèi" + +#~ msgid "byteorder is not a string" +#~ msgstr "byteorder bùshì zìfú chuàn" + +#~ msgid "can't convert %q to int" +#~ msgstr "wú fǎ jiāng %q zhuǎn huàn wéi nèi zài" + +#~ msgid "complex division by zero" +#~ msgstr "fùzá de fēngé wèi 0" + +#~ msgid "divide by zero" +#~ msgstr "chú yǐ líng" + +#~ msgid "int() arg 2 must be >= 2 and <= 36" +#~ msgstr "zhěngshù() cānshù 2 bìxū > = 2 qiě <= 36" + +#~ msgid "long int not supported in this build" +#~ msgstr "cǐ bǎnběn bù zhīchí zhǎng zhěngshù" + +#~ msgid "slice step cannot be zero" +#~ msgstr "qiēpiàn bù bùnéng wéi líng" + +#~ msgid "step must be non-zero" +#~ msgstr "bùzhòu bìxū shìfēi líng" + +#~ msgid "string indices must be integers, not %q" +#~ msgstr "zìfú chuàn suǒyǐn bìxū shì zhěngshù, ér bùshì %q" + +#~ msgid "time.struct_time() takes a 9-sequence" +#~ msgstr "time.struct_time() xūyào 9 xùliè" + +#~ msgid "zero step" +#~ msgstr "líng bù" + +#~ msgid "invalid traceback" +#~ msgstr "wú xiào zhuī sù" + #~ msgid "%q indices must be integers, not %s" #~ msgstr "%q suǒyǐn bìxū shì zhěngshù, ér bùshì %s" diff --git a/main.c b/main.c index 10fdc65224..d70e718b6d 100644 --- a/main.c +++ b/main.c @@ -218,12 +218,10 @@ void supervisor_execution_status(void) { } #endif -#define STRING_LIST(...) {__VA_ARGS__, ""} - // 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. -STATIC const char *first_existing_file_in_list(const char *const *filenames) { - for (int i = 0; filenames[i] != (char *)""; i++) { +STATIC const char *first_existing_file_in_list(const char *const *filenames, size_t n_filenames) { + for (size_t i = 0; i < n_filenames; i++) { mp_import_stat_t stat = mp_import_stat(filenames[i]); if (stat == MP_IMPORT_STAT_FILE) { return filenames[i]; @@ -232,11 +230,11 @@ STATIC const char *first_existing_file_in_list(const char *const *filenames) { return NULL; } -STATIC bool maybe_run_list(const char *const *filenames) { +STATIC bool maybe_run_list(const char *const *filenames, size_t n_filenames) { _exec_result.return_code = 0; _exec_result.exception = MP_OBJ_NULL; _exec_result.exception_line = 0; - _current_executing_filename = first_existing_file_in_list(filenames); + _current_executing_filename = first_existing_file_in_list(filenames, n_filenames); if (_current_executing_filename == NULL) { return false; } @@ -391,12 +389,14 @@ STATIC bool run_code_py(safe_mode_t safe_mode, bool *simulate_reset) { filesystem_flush(); } if (safe_mode == NO_SAFE_MODE && !autoreload_pending()) { - static const char *const supported_filenames[] = STRING_LIST( - "code.txt", "code.py", "main.py", "main.txt"); + static const char *const supported_filenames[] = { + "code.txt", "code.py", "main.py", "main.txt" + }; #if CIRCUITPY_FULL_BUILD - static const char *const double_extension_filenames[] = STRING_LIST( + static const char *const double_extension_filenames[] = { "code.txt.py", "code.py.txt", "code.txt.txt","code.py.py", - "main.txt.py", "main.py.txt", "main.txt.txt","main.py.py"); + "main.txt.py", "main.py.txt", "main.txt.txt","main.py.py" + }; #endif supervisor_allocation *heap = allocate_remaining_memory(); @@ -410,14 +410,15 @@ STATIC bool run_code_py(safe_mode_t safe_mode, bool *simulate_reset) { // Check if a different run file has been allocated if (next_code_allocation) { - ((next_code_info_t *)next_code_allocation->ptr)->options &= ~SUPERVISOR_NEXT_CODE_OPT_NEWLY_SET; - next_code_options = ((next_code_info_t *)next_code_allocation->ptr)->options; - if (((next_code_info_t *)next_code_allocation->ptr)->filename[0] != '\0') { - const char *next_list[] = {((next_code_info_t *)next_code_allocation->ptr)->filename, ""}; + next_code_info_t *info = ((next_code_info_t *)next_code_allocation->ptr); + info->options &= ~SUPERVISOR_NEXT_CODE_OPT_NEWLY_SET; + next_code_options = info->options; + if (info->filename[0] != '\0') { // This is where the user's python code is actually executed: - found_main = maybe_run_list(next_list); + const char *const filenames[] = { info->filename }; + found_main = maybe_run_list(filenames, MP_ARRAY_SIZE(filenames)); if (!found_main) { - serial_write(((next_code_info_t *)next_code_allocation->ptr)->filename); + serial_write(info->filename); serial_write_compressed(translate(" not found.\n")); } } @@ -425,11 +426,11 @@ STATIC bool run_code_py(safe_mode_t safe_mode, bool *simulate_reset) { // Otherwise, default to the standard list of filenames if (!found_main) { // This is where the user's python code is actually executed: - found_main = maybe_run_list(supported_filenames); + found_main = maybe_run_list(supported_filenames, MP_ARRAY_SIZE(supported_filenames)); // If that didn't work, double check the extensions #if CIRCUITPY_FULL_BUILD if (!found_main) { - found_main = maybe_run_list(double_extension_filenames); + found_main = maybe_run_list(double_extension_filenames, MP_ARRAY_SIZE(double_extension_filenames)); if (found_main) { serial_write_compressed(translate("WARNING: Your code filename has two extensions\n")); } @@ -741,7 +742,7 @@ STATIC void __attribute__ ((noinline)) run_boot_py(safe_mode_t safe_mode) { && safe_mode == NO_SAFE_MODE && MP_STATE_VM(vfs_mount_table) != NULL; - static const char *const boot_py_filenames[] = STRING_LIST("boot.py", "boot.txt"); + static const char *const boot_py_filenames[] = {"boot.py", "boot.txt"}; // Do USB setup even if boot.py is not run. @@ -778,7 +779,7 @@ STATIC void __attribute__ ((noinline)) run_boot_py(safe_mode_t safe_mode) { port_boot_info(); #endif - bool found_boot = maybe_run_list(boot_py_filenames); + bool found_boot = maybe_run_list(boot_py_filenames, MP_ARRAY_SIZE(boot_py_filenames)); (void)found_boot; diff --git a/ports/atmel-samd/Makefile b/ports/atmel-samd/Makefile index 4405766d00..68beeaf129 100644 --- a/ports/atmel-samd/Makefile +++ b/ports/atmel-samd/Makefile @@ -22,36 +22,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -# Select the board to build for. -ifeq ($(BOARD),) - $(error You must provide a BOARD parameter) -else - ifeq ($(wildcard boards/$(BOARD)/.),) - $(error Invalid BOARD specified) - endif -endif - -# If the build directory is not given, make it reflect the board name. -BUILD ?= build-$(BOARD) - -include ../../py/mkenv.mk -# Board-specific -include boards/$(BOARD)/mpconfigboard.mk -# Port-specific -include mpconfigport.mk -# CircuitPython-specific -include $(TOP)/py/circuitpy_mpconfig.mk - -# qstr definitions (must come before including py.mk) -QSTR_DEFS = qstrdefsport.h - -# include py core make definitions -include $(TOP)/py/py.mk - -include $(TOP)/supervisor/supervisor.mk - -# Include make rules and variables common across CircuitPython builds. -include $(TOP)/py/circuitpy_defns.mk +include ../../py/circuitpy_mkenv.mk CROSS_COMPILE = arm-none-eabi- @@ -108,7 +79,7 @@ endif ifeq ($(CHIP_FAMILY), same54) PERIPHERALS_CHIP_FAMILY=sam_d5x_e5x -OPTIMIZATION_FLAGS ?= -O2 +OPTIMIZATION_FLAGS ?= -Os # TinyUSB defines CFLAGS += -DCFG_TUSB_MCU=OPT_MCU_SAME5X -DCFG_TUD_MIDI_RX_BUFSIZE=128 -DCFG_TUD_CDC_RX_BUFSIZE=256 -DCFG_TUD_MIDI_TX_BUFSIZE=128 -DCFG_TUD_CDC_TX_BUFSIZE=256 -DCFG_TUD_MSC_BUFSIZE=1024 endif @@ -322,7 +293,6 @@ SRC_C += \ boards/$(BOARD)/board.c \ boards/$(BOARD)/pins.c \ eic_handler.c \ - fatfs_port.c \ lib/tinyusb/src/portable/microchip/samd/dcd_samd.c \ mphalport.c \ reset.c \ diff --git a/ports/atmel-samd/common-hal/audioio/AudioOut.c b/ports/atmel-samd/common-hal/audioio/AudioOut.c index a565a77042..7007672b3f 100644 --- a/ports/atmel-samd/common-hal/audioio/AudioOut.c +++ b/ports/atmel-samd/common-hal/audioio/AudioOut.c @@ -405,7 +405,13 @@ void common_hal_audioio_audioout_play(audioio_audioout_obj_t *self, if (self->right_channel == &pin_PA02) { right_channel_reg = (uint32_t)&DAC->DATABUF[0].reg; } - if (right_channel_reg == left_channel_reg + 2 && audiosample_bits_per_sample(sample) == 16) { + + size_t num_channels = audiosample_channel_count(sample); + + if (num_channels == 2 && + // Are DAC channels sequential? + left_channel_reg + 2 == right_channel_reg && + audiosample_bits_per_sample(sample) == 16) { result = audio_dma_setup_playback(&self->left_dma, sample, loop, false, 0, false /* output unsigned */, left_channel_reg, @@ -415,7 +421,11 @@ void common_hal_audioio_audioout_play(audioio_audioout_obj_t *self, false /* output unsigned */, left_channel_reg, left_channel_trigger); - if (right_channel_reg != 0 && result == AUDIO_DMA_OK) { + // Don't play back on right channel unless stereo. + // TODO possibility: Set up non-incrementing DMA on one channel so they use the same samples? + // Right now, playing back mono on both channels causes sample to play twice as fast. + if (num_channels == 2 && + right_channel_reg != 0 && result == AUDIO_DMA_OK) { result = audio_dma_setup_playback(&self->right_dma, sample, loop, true, 1, false /* output unsigned */, right_channel_reg, diff --git a/ports/atmel-samd/common-hal/busio/UART.c b/ports/atmel-samd/common-hal/busio/UART.c index 3a9b628e0b..6027b6a5fa 100644 --- a/ports/atmel-samd/common-hal/busio/UART.c +++ b/ports/atmel-samd/common-hal/busio/UART.c @@ -24,6 +24,7 @@ * THE SOFTWARE. */ +#if CIRCUITPY_BUSIO_UART #include "shared-bindings/microcontroller/__init__.h" #include "shared-bindings/microcontroller/Pin.h" #include "shared-bindings/busio/UART.h" @@ -485,3 +486,4 @@ bool common_hal_busio_uart_ready_to_tx(busio_uart_obj_t *self) { usart_async_get_status(usart_desc_p, &async_status); return !(async_status.flags & USART_ASYNC_STATUS_BUSY); } +#endif diff --git a/ports/atmel-samd/common-hal/sdioio/SDCard.c b/ports/atmel-samd/common-hal/sdioio/SDCard.c index 7ce8a1e1b1..e641db75ac 100644 --- a/ports/atmel-samd/common-hal/sdioio/SDCard.c +++ b/ports/atmel-samd/common-hal/sdioio/SDCard.c @@ -114,8 +114,6 @@ CLK PA21 PCC_D? (D32) BROWN gpio_set_pin_pull_mode(functions[i]->pin, (i == 1 || i == 5) ? GPIO_PULL_OFF : GPIO_PULL_UP); gpio_set_pin_function(functions[i]->pin, GPIO_PIN_FUNCTION_SDIO); - - common_hal_never_reset_pin(functions[i]->obj); } self->num_data = num_data; @@ -145,6 +143,12 @@ CLK PA21 PCC_D? (D32) BROWN } if (result != SD_MMC_OK) { + for (size_t i = 0; i < MP_ARRAY_SIZE(functions); i++) { + if (!functions[i]->obj) { + break; + } + reset_pin_number(functions[i]->obj->number); + } mp_raise_OSError_msg_varg(translate("%q failure: %d"), MP_QSTR_sd_mmc_check, (int)result); } // sd_mmc_get_capacity() is in KiB, but our "capacity" is in 512-byte blocks diff --git a/ports/atmel-samd/mpconfigport.mk b/ports/atmel-samd/mpconfigport.mk index e6f5759f1c..57f7ca339f 100644 --- a/ports/atmel-samd/mpconfigport.mk +++ b/ports/atmel-samd/mpconfigport.mk @@ -24,13 +24,13 @@ ifeq ($(CHIP_FAMILY),samd21) CIRCUITPY_AESIO ?= 0 CIRCUITPY_ATEXIT ?= 0 CIRCUITPY_AUDIOMIXER ?= 0 +CIRCUITPY_AUDIOMP3 ?= 0 CIRCUITPY_BINASCII ?= 0 CIRCUITPY_BITBANGIO ?= 0 CIRCUITPY_BITMAPTOOLS ?= 0 -CIRCUITPY_BUSDEVICE ?= 0 -CIRCUITPY_AUDIOMP3 ?= 0 CIRCUITPY_BLEIO_HCI = 0 CIRCUITPY_BUILTINS_POW3 ?= 0 +CIRCUITPY_BUSDEVICE ?= 0 CIRCUITPY_COMPUTED_GOTO_SAVE_SPACE ?= 1 CIRCUITPY_COUNTIO ?= 0 # Not enough RAM for framebuffers @@ -42,6 +42,8 @@ CIRCUITPY_I2CTARGET ?= 0 CIRCUITPY_JSON ?= 0 CIRCUITPY_KEYPAD ?= 0 CIRCUITPY_MSGPACK ?= 0 +CIRCUITPY_OS_GETENV ?= 0 +CIRCUITPY_PIXELMAP ?= 0 CIRCUITPY_RE ?= 0 CIRCUITPY_SDCARDIO ?= 0 CIRCUITPY_SYNTHIO ?= 0 diff --git a/ports/atmel-samd/peripherals b/ports/atmel-samd/peripherals index 57133eefeb..baca4c0843 160000 --- a/ports/atmel-samd/peripherals +++ b/ports/atmel-samd/peripherals @@ -1 +1 @@ -Subproject commit 57133eefeb077f73b5ac17ee044d9feaf566da8e +Subproject commit baca4c084334aa8625f525a4032d66a397199ea6 diff --git a/ports/atmel-samd/supervisor/port.c b/ports/atmel-samd/supervisor/port.c index 424acece78..2c63e28a17 100644 --- a/ports/atmel-samd/supervisor/port.c +++ b/ports/atmel-samd/supervisor/port.c @@ -644,6 +644,10 @@ void port_disable_tick(void) { RTC->MODE0.INTENCLR.reg = RTC_MODE0_INTENCLR_PER2; #endif #ifdef SAMD21 + if (_tick_event_channel == EVSYS_SYNCH_NUM) { + return; + } + if (_tick_event_channel >= 8) { uint8_t value = 1 << (_tick_event_channel - 8); EVSYS->INTENCLR.reg = EVSYS_INTENSET_EVDp8(value); @@ -651,6 +655,7 @@ void port_disable_tick(void) { uint8_t value = 1 << _tick_event_channel; EVSYS->INTENCLR.reg = EVSYS_INTENSET_EVD(value); } + disable_event_channel(_tick_event_channel); _tick_event_channel = EVSYS_SYNCH_NUM; #endif } diff --git a/ports/broadcom/Makefile b/ports/broadcom/Makefile index 757e7f3450..b6dd62dedf 100644 --- a/ports/broadcom/Makefile +++ b/ports/broadcom/Makefile @@ -1,35 +1,28 @@ -# Select the board to build for. -BOARD?=raspberrypi_pi4b +# This file is part of the MicroPython project, http://micropython.org/ +# +# The MIT License (MIT) +# +# SPDX-FileCopyrightText: 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. -ifeq ($(BOARD),) - $(error You must provide a BOARD parameter) -else - ifeq ($(wildcard boards/$(BOARD)/.),) - $(error Invalid BOARD "$(BOARD)" specified) - endif -endif - -# If the build directory is not given, make it reflect the board name. -BUILD ?= build-$(BOARD) - -include ../../py/mkenv.mk -# Board-specific -include boards/$(BOARD)/mpconfigboard.mk -# Port-specific -include mpconfigport.mk -# CircuitPython-specific -include $(TOP)/py/circuitpy_mpconfig.mk - -# qstr definitions (must come before including py.mk) -QSTR_DEFS = qstrdefsport.h - -# include py core make definitions -include $(TOP)/py/py.mk - -include $(TOP)/supervisor/supervisor.mk - -# Include make rules and variables common across CircuitPython builds. -include $(TOP)/py/circuitpy_defns.mk +include ../../py/circuitpy_mkenv.mk ifeq ($(CHIP_VARIANT), "bcm2711") CFLAGS += -mcpu=cortex-a72 -DBCM_VERSION=2711 @@ -65,7 +58,6 @@ SRC_C += bindings/videocore/__init__.c \ boards/$(BOARD)/pins.c \ background.c \ common-hal/videocore/Framebuffer.c \ - fatfs_port.c \ mphalport.c \ lib/sdmmc/sdmmc_cmd.c \ lib/sdmmc/sdmmc_common.c \ diff --git a/ports/cxd56/Makefile b/ports/cxd56/Makefile index 073d2d59ce..f90b6dd460 100644 --- a/ports/cxd56/Makefile +++ b/ports/cxd56/Makefile @@ -22,39 +22,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -# Select the board to build for. -ifeq ($(BOARD),) - $(error You must provide a BOARD parameter) -else - ifeq ($(wildcard boards/$(BOARD)/.),) - $(error Invalid BOARD specified) - endif -endif - -# If the build directory is not given, make it reflect the board name. -BUILD ?= build-$(BOARD) - -include ../../py/mkenv.mk - -# Board-specific -include boards/$(BOARD)/mpconfigboard.mk - -# Port-specific -include mpconfigport.mk - -# CircuitPython-specific -include $(TOP)/py/circuitpy_mpconfig.mk - -# qstr definitions (must come before including py.mk) -QSTR_DEFS = qstrdefsport.h - -# include py core make definitions -include $(TOP)/py/py.mk - -include $(TOP)/supervisor/supervisor.mk - -# Include make rules and variables common across CircuitPython builds. -include $(TOP)/py/circuitpy_defns.mk +include ../../py/circuitpy_mkenv.mk CROSS_COMPILE = arm-none-eabi- @@ -166,13 +134,13 @@ SRC_COMMON_HAL_EXPANDED = $(addprefix shared-bindings/, $(SRC_COMMON_HAL)) \ $(addprefix common-hal/, $(SRC_COMMON_HAL)) SRC_SHARED_MODULE_EXPANDED = $(addprefix shared-bindings/, $(SRC_SHARED_MODULE)) \ - $(addprefix shared-module/, $(SRC_SHARED_MODULE)) + $(addprefix shared-module/, $(SRC_SHARED_MODULE)) \ + $(addprefix shared-module/, $(SRC_SHARED_MODULE_INTERNAL)) SRC_S = supervisor/cpu.s SRC_C += \ background.c \ - fatfs_port.c \ mphalport.c \ boards/$(BOARD)/board.c \ boards/$(BOARD)/pins.c \ diff --git a/ports/cxd56/fatfs_port.c b/ports/cxd56/fatfs_port.c deleted file mode 100644 index e672b095b7..0000000000 --- a/ports/cxd56/fatfs_port.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - * This file is part of the MicroPython project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright 2019 Sony Semiconductor Solutions Corporation - * - * 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/mphal.h" -#include "py/runtime.h" -#include "lib/oofatfs/ff.h" /* FatFs lower layer API */ -#include "lib/oofatfs/diskio.h" /* FatFs lower layer API */ -#include "shared/timeutils/timeutils.h" - -#if CIRCUITPY_RTC -#include "shared-bindings/rtc/RTC.h" -#endif - -DWORD get_fattime(void) { - #if CIRCUITPY_RTC - timeutils_struct_time_t tm; - common_hal_rtc_get_time(&tm); - return ((tm.tm_year - 1980) << 25) | (tm.tm_mon << 21) | (tm.tm_mday << 16) | - (tm.tm_hour << 11) | (tm.tm_min << 5) | (tm.tm_sec >> 1); - #else - return ((2016 - 1980) << 25) | ((9) << 21) | ((1) << 16) | ((16) << 11) | ((43) << 5) | (35 / 2); - #endif -} diff --git a/ports/espressif/Makefile b/ports/espressif/Makefile index 30c35f9caf..ddfcaeeb6e 100644 --- a/ports/espressif/Makefile +++ b/ports/espressif/Makefile @@ -22,42 +22,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -# Select the board to build for. -ifeq ($(BOARD),) - $(error You must provide a BOARD parameter) -else - ifeq ($(wildcard boards/$(BOARD)/.),) - $(error Invalid BOARD specified) - endif -endif - -# If the flash PORT is not given, use the default /dev/tty.SLAB_USBtoUART. -PORT ?= /dev/tty.SLAB_USBtoUART - -# If the build directory is not given, make it reflect the board name. -BUILD ?= build-$(BOARD) - -include ../../py/mkenv.mk - -# Board-specific -include boards/$(BOARD)/mpconfigboard.mk - -# Port-specific -include mpconfigport.mk - -# CircuitPython-specific -include $(TOP)/py/circuitpy_mpconfig.mk - -# qstr definitions (must come before including py.mk) -QSTR_DEFS = qstrdefsport.h - -# include py core make definitions -include $(TOP)/py/py.mk - -include $(TOP)/supervisor/supervisor.mk - -# Include make rules and variables common across CircuitPython builds. -include $(TOP)/py/circuitpy_defns.mk +include ../../py/circuitpy_mkenv.mk ifeq ($(IDF_TARGET),esp32c3) IDF_TARGET_ARCH = riscv @@ -135,8 +100,6 @@ INC += \ -isystem esp-idf/components/soc/include \ -isystem esp-idf/components/soc/$(IDF_TARGET)/include \ -isystem esp-idf/components/spi_flash/include \ - -isystem esp-idf/components/ulp/include \ - -isystem esp-idf/components/ulp/ulp_riscv/include \ -isystem esp-idf/components/$(IDF_TARGET_ARCH)/include \ -isystem esp-idf/components/$(IDF_TARGET_ARCH)/$(IDF_TARGET)/include @@ -250,7 +213,6 @@ endif SRC_C += \ background.c \ - fatfs_port.c \ mphalport.c \ bindings/espidf/__init__.c \ boards/$(BOARD)/board.c \ @@ -297,6 +259,15 @@ CFLAGS += -isystem esp32-camera/driver/include CFLAGS += -isystem esp32-camera/conversions/include endif +ifneq ($(CIRCUITPY_ESPULP),0) +SRC_ULP := \ + $(wildcard common-hal/espulp/*.c) \ + $(wildcard bindings/espulp/*.c) +SRC_C += $(SRC_ULP) +CFLAGS += -isystem esp-idf/components/ulp/include +CFLAGS += -isystem esp-idf/components/ulp/ulp_riscv/include +endif + SRC_COMMON_HAL_EXPANDED = \ $(addprefix shared-bindings/, $(SRC_COMMON_HAL)) \ $(addprefix shared-bindings/, $(SRC_BINDINGS_ENUMS)) \ @@ -400,7 +371,7 @@ ifneq ($(CIRCUITPY_BLEIO),0) BINARY_BLOBS += esp-idf/components/esp_phy/lib/$(IDF_TARGET)/libbtbb.a \ esp-idf/components/bt/controller/lib_esp32c3_family/$(IDF_TARGET)/libbtdm_app.a endif -ifneq ($(CIRCUITPY_COPROC),0) +ifneq ($(CIRCUITPY_ESPULP),0) ESP_IDF_COMPONENTS_LINK += ulp endif @@ -458,7 +429,7 @@ esp-idf-stamp: $(BUILD)/esp-idf/config/sdkconfig.h $(BUILD)/firmware.elf: $(OBJ) | esp-idf-stamp $(STEPECHO) "LINK $@" - $(Q)$(CC) -o $@ $(LDFLAGS) $^ -Wl,--start-group $(ESP_IDF_COMPONENTS_EXPANDED) $(BINARY_BLOBS) $(MBEDTLS_COMPONENTS_LINK_EXPANDED) $(BUILD)/esp-idf/esp-idf/newlib/libnewlib.a -Wl,--end-group -u newlib_include_pthread_impl -Wl,--start-group $(LIBS) -Wl,--end-group $(BUILD)/esp-idf/esp-idf/pthread/libpthread.a -u __cxx_fatal_exception + $(Q)$(CC) -o $@ $(LDFLAGS) $^ -Wl,--start-group $(ESP_IDF_COMPONENTS_EXPANDED) $(BINARY_BLOBS) $(MBEDTLS_COMPONENTS_LINK_EXPANDED) $(BUILD)/esp-idf/esp-idf/newlib/libnewlib.a -Wl,--end-group -u newlib_include_pthread_impl -u ld_include_highint_hdl -Wl,--start-group $(LIBS) -Wl,--end-group $(BUILD)/esp-idf/esp-idf/pthread/libpthread.a -u __cxx_fatal_exception $(BUILD)/circuitpython-firmware.bin: $(BUILD)/firmware.elf | tools/build_memory_info.py $(STEPECHO) "Create $@" diff --git a/ports/espressif/bindings/esp32_camera/Camera.c b/ports/espressif/bindings/esp32_camera/Camera.c index a770ea8ff7..687a389fc3 100644 --- a/ports/espressif/bindings/esp32_camera/Camera.c +++ b/ports/espressif/bindings/esp32_camera/Camera.c @@ -50,8 +50,8 @@ //| vsync_pin: microcontroller.Pin, //| href_pin: microcontroller.Pin, //| i2c: busio.I2C, -//| external_clock_pin: microcontroller.Pin, -//| external_clock_frequency: int, +//| external_clock_pin: Optional[microcontroller.Pin] = None, +//| external_clock_frequency: int = 20_000_000, //| powerdown_pin: Optional[microcontroller.Pin] = None, //| reset_pin: Optional[microcontroller.Pin] = None, //| pixel_format: PixelFormat = PixelFormat.RGB565, @@ -63,7 +63,7 @@ //| """ //| Configure and initialize a camera with the given properties //| -//| This driver requires that the ``CIRCUITPY_RESERVED_PSRAM`` in ``/.env`` be large enough to hold the camera frambuffer(s). Generally, boards with built-in cameras will have a default setting that is large enough. If the constructor raises a MemoryError or an IDFError, this probably indicates the setting is too small and should be increased. +//| This driver requires that the ``CIRCUITPY_RESERVED_PSRAM`` in ``settings.toml`` be large enough to hold the camera frambuffer(s). Generally, boards with built-in cameras will have a default setting that is large enough. If the constructor raises a MemoryError or an IDFError, this probably indicates the setting is too small and should be increased. //| //| //| .. important:: @@ -101,8 +101,8 @@ STATIC mp_obj_t esp32_camera_camera_make_new(const mp_obj_type_t *type, size_t n { MP_QSTR_vsync_pin, MP_ARG_OBJ | MP_ARG_KW_ONLY | MP_ARG_REQUIRED }, { MP_QSTR_href_pin, MP_ARG_OBJ | MP_ARG_KW_ONLY | MP_ARG_REQUIRED }, { MP_QSTR_i2c, MP_ARG_OBJ | MP_ARG_KW_ONLY | MP_ARG_REQUIRED }, - { MP_QSTR_external_clock_pin, MP_ARG_OBJ | MP_ARG_KW_ONLY }, - { MP_QSTR_external_clock_frequency, MP_ARG_INT | MP_ARG_REQUIRED }, + { MP_QSTR_external_clock_pin, MP_ARG_OBJ | MP_ARG_KW_ONLY, { .u_obj = MP_ROM_NONE } }, + { MP_QSTR_external_clock_frequency, MP_ARG_INT | MP_ARG_KW_ONLY, { .u_int = 20000000L } }, { MP_QSTR_powerdown_pin, MP_ARG_OBJ | MP_ARG_KW_ONLY, { .u_obj = MP_ROM_NONE } }, { MP_QSTR_reset_pin, MP_ARG_OBJ | MP_ARG_KW_ONLY, { .u_obj = MP_ROM_NONE } }, { MP_QSTR_pixel_format, MP_ARG_OBJ | MP_ARG_KW_ONLY, { .u_obj = MP_ROM_PTR((void *)&pixel_format_RGB565_obj) } }, @@ -125,7 +125,7 @@ STATIC mp_obj_t esp32_camera_camera_make_new(const mp_obj_type_t *type, size_t n const mcu_pin_obj_t *vsync_pin = validate_obj_is_free_pin(args[ARG_vsync_pin].u_obj); const mcu_pin_obj_t *href_pin = validate_obj_is_free_pin(args[ARG_href_pin].u_obj); busio_i2c_obj_t *i2c = MP_OBJ_TO_PTR(mp_arg_validate_type(args[ARG_i2c].u_obj, &busio_i2c_type, MP_QSTR_i2c)); - const mcu_pin_obj_t *external_clock_pin = validate_obj_is_free_pin(args[ARG_external_clock_pin].u_obj); + const mcu_pin_obj_t *external_clock_pin = validate_obj_is_free_pin_or_none(args[ARG_external_clock_pin].u_obj); const mcu_pin_obj_t *powerdown_pin = validate_obj_is_free_pin_or_none(args[ARG_powerdown_pin].u_obj); const mcu_pin_obj_t *reset_pin = validate_obj_is_free_pin_or_none(args[ARG_reset_pin].u_obj); const mp_int_t external_clock_frequency = mp_arg_validate_int_range(args[ARG_external_clock_frequency].u_int, 0, 40000000, MP_QSTR_clock_frequency); diff --git a/ports/espressif/bindings/espidf/__init__.c b/ports/espressif/bindings/espidf/__init__.c index c42a9e549d..12781000ae 100644 --- a/ports/espressif/bindings/espidf/__init__.c +++ b/ports/espressif/bindings/espidf/__init__.c @@ -132,7 +132,7 @@ STATIC mp_obj_t espidf_get_total_psram(void) { MP_DEFINE_CONST_FUN_OBJ_0(espidf_get_total_psram_obj, espidf_get_total_psram); //| def get_reserved_psram() -> int: -//| """Returns number of bytes of psram reserved for use by esp-idf, either a board-specific default value or the value defined in ``/.env``.""" +//| """Returns number of bytes of psram reserved for use by esp-idf, either a board-specific default value or the value defined in ``settings.toml``.""" //| STATIC mp_obj_t espidf_get_reserved_psram(void) { return MP_OBJ_NEW_SMALL_INT(common_hal_espidf_get_reserved_psram()); diff --git a/ports/espressif/bindings/espulp/ULP.c b/ports/espressif/bindings/espulp/ULP.c new file mode 100644 index 0000000000..15af22dca8 --- /dev/null +++ b/ports/espressif/bindings/espulp/ULP.c @@ -0,0 +1,151 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2022 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/microcontroller/Pin.h" +#include "shared-bindings/util.h" +#include "bindings/espulp/ULP.h" + +#include "py/runtime.h" + +//| class ULP: +//| def __init__(self): +//| """The ultra-low-power processor. +//| +//| Raises an exception if another ULP has been instantiated. This +//| ensures that is is only used by one piece of code at a time.""" +//| ... +STATIC mp_obj_t espulp_ulp_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { + espulp_ulp_obj_t *self = m_new_obj(espulp_ulp_obj_t); + self->base.type = &espulp_ulp_type; + common_hal_espulp_ulp_construct(self); + return MP_OBJ_FROM_PTR(self); +} + +STATIC espulp_ulp_obj_t *get_ulp_obj(mp_obj_t self_in) { + if (!mp_obj_is_type(self_in, &espulp_ulp_type)) { + mp_raise_TypeError_varg(translate("Expected a %q"), MP_QSTR_ULP); + } + espulp_ulp_obj_t *self = MP_OBJ_TO_PTR(self_in); + if (common_hal_espulp_ulp_deinited(self)) { + raise_deinited_error(); + } + return self; +} + +//| def deinit(self) -> None: +//| """Deinitialises the ULP and releases it for another program.""" +//| ... +STATIC mp_obj_t espulp_ulp_deinit(mp_obj_t self_in) { + espulp_ulp_obj_t *self = get_ulp_obj(self_in); + common_hal_espulp_ulp_deinit(self); + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(espulp_ulp_deinit_obj, espulp_ulp_deinit); + +//| def __enter__(self) -> ULP: +//| """No-op used by Context Managers.""" +//| ... +// Provided by context manager helper. + +//| def __exit__(self) -> None: +//| """Automatically deinitializes the hardware when exiting a context. See +//| :ref:`lifetime-and-contextmanagers` for more info.""" +//| ... +STATIC mp_obj_t espulp_ulp_obj___exit__(size_t n_args, const mp_obj_t *args) { + (void)n_args; + return espulp_ulp_deinit(args[0]); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(espulp_ulp___exit___obj, 4, 4, espulp_ulp_obj___exit__); + +//| def run( +//| self, program: ReadableBuffer, *, pins: Sequence[microcontroller.Pin] = () +//| ) -> None: +//| """Loads the program into ULP memory and then runs the program. The given pins are +//| claimed and not reset until `halt()` is called. +//| +//| The program will continue to run even when the running Python is halted.""" +//| ... +STATIC mp_obj_t espulp_ulp_run(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + enum { ARG_program, ARG_pins }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_program, MP_ARG_REQUIRED | MP_ARG_OBJ}, + { MP_QSTR_pins, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_empty_tuple} }, + }; + + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + espulp_ulp_obj_t *self = get_ulp_obj(pos_args[0]); + mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + mp_buffer_info_t bufinfo; + mp_get_buffer_raise(args[ARG_program].u_obj, &bufinfo, MP_BUFFER_READ); + + mp_obj_t pins_in = args[ARG_pins].u_obj; + const size_t num_pins = (size_t)MP_OBJ_SMALL_INT_VALUE(mp_obj_len(pins_in)); + + // The ULP only supports 21 pins on the ESP32-S2 and S3. So we can store it + // as a bitmask in a 32 bit number. The common-hal code does further checks. + uint32_t pin_mask = 0; + + for (mp_uint_t i = 0; i < num_pins; i++) { + mp_obj_t pin_obj = mp_obj_subscr(pins_in, MP_OBJ_NEW_SMALL_INT(i), MP_OBJ_SENTINEL); + validate_obj_is_free_pin(pin_obj); + const mcu_pin_obj_t *pin = ((const mcu_pin_obj_t *)pin_obj); + if (pin->number >= 32) { + raise_ValueError_invalid_pin(); + } + pin_mask |= 1 << pin->number; + } + + common_hal_espulp_ulp_run(self, bufinfo.buf, bufinfo.len, pin_mask); + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_KW(espulp_ulp_run_obj, 2, espulp_ulp_run); + +//| def halt(self) -> None: +//| """Halts the running program and releases the pins given in `run()`.""" +//| ... +//| +STATIC mp_obj_t espulp_ulp_halt(mp_obj_t self_in) { + common_hal_espulp_ulp_halt(get_ulp_obj(self_in)); + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(espulp_ulp_halt_obj, espulp_ulp_halt); + +STATIC const mp_rom_map_elem_t espulp_ulp_locals_table[] = { + { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&espulp_ulp_deinit_obj) }, + { MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&mp_identity_obj) }, + { MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&espulp_ulp___exit___obj) }, + { MP_ROM_QSTR(MP_QSTR_run), MP_ROM_PTR(&espulp_ulp_run_obj) }, + { MP_ROM_QSTR(MP_QSTR_halt), MP_ROM_PTR(&espulp_ulp_halt_obj) }, +}; +STATIC MP_DEFINE_CONST_DICT(espulp_ulp_locals_dict, espulp_ulp_locals_table); + +const mp_obj_type_t espulp_ulp_type = { + { &mp_type_type }, + .name = MP_QSTR_ULP, + .make_new = espulp_ulp_make_new, + .locals_dict = (mp_obj_t)&espulp_ulp_locals_dict, +}; diff --git a/shared-bindings/coproc/__init__.h b/ports/espressif/bindings/espulp/ULP.h similarity index 73% rename from shared-bindings/coproc/__init__.h rename to ports/espressif/bindings/espulp/ULP.h index 6f2b2a56ae..9f9c3ecf7f 100644 --- a/shared-bindings/coproc/__init__.h +++ b/ports/espressif/bindings/espulp/ULP.h @@ -24,14 +24,17 @@ * THE SOFTWARE. */ -#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_COPROC___INIT___H -#define MICROPY_INCLUDED_SHARED_BINDINGS_COPROC___INIT___H +#pragma once #include "py/obj.h" -#include "common-hal/coproc/Coproc.h" +#include "common-hal/espulp/ULP.h" -extern void common_hal_coproc_run(coproc_coproc_obj_t *self); -extern void common_hal_coproc_halt(coproc_coproc_obj_t *self); -extern mp_obj_t common_hal_coproc_memory(coproc_coproc_obj_t *self); -#endif // MICROPY_INCLUDED_SHARED_BINDINGS_COPROC___INIT___H +extern const mp_obj_type_t espulp_ulp_type; + +void common_hal_espulp_ulp_construct(espulp_ulp_obj_t *self); +bool common_hal_espulp_ulp_deinited(espulp_ulp_obj_t *self); +void common_hal_espulp_ulp_deinit(espulp_ulp_obj_t *self); + +void common_hal_espulp_ulp_run(espulp_ulp_obj_t *self, uint32_t *program, size_t length, uint32_t pin_mask); +void common_hal_espulp_ulp_halt(espulp_ulp_obj_t *self); diff --git a/ports/espressif/bindings/espulp/ULPAlarm.c b/ports/espressif/bindings/espulp/ULPAlarm.c new file mode 100644 index 0000000000..e77fe7f834 --- /dev/null +++ b/ports/espressif/bindings/espulp/ULPAlarm.c @@ -0,0 +1,56 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2022 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 "bindings/espulp/ULPAlarm.h" + +#include "py/runtime.h" + +//| class ULPAlarm: +//| """Trigger an alarm when the ULP requests wake-up.""" +//| +//| def __init__(self) -> None: +//| """Create an alarm that will be triggered when the ULP requests wake-up. +//| +//| 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()`. +//| +//| """ +//| ... +//| +STATIC mp_obj_t espulp_ulpalarm_make_new(const mp_obj_type_t *type, + size_t n_args, size_t n_kw, const mp_obj_t *all_args) { + + espulp_ulpalarm_obj_t *self = m_new_obj(espulp_ulpalarm_obj_t); + self->base.type = &espulp_ulpalarm_type; + common_hal_espulp_ulpalarm_construct(self); + return MP_OBJ_FROM_PTR(self); +} + +const mp_obj_type_t espulp_ulpalarm_type = { + { &mp_type_type }, + .name = MP_QSTR_ULPAlarm, + .make_new = espulp_ulpalarm_make_new, +}; diff --git a/shared-bindings/alarm/coproc/CoprocAlarm.h b/ports/espressif/bindings/espulp/ULPAlarm.h similarity index 79% rename from shared-bindings/alarm/coproc/CoprocAlarm.h rename to ports/espressif/bindings/espulp/ULPAlarm.h index 8f3a85de56..75e96c0a45 100644 --- a/shared-bindings/alarm/coproc/CoprocAlarm.h +++ b/ports/espressif/bindings/espulp/ULPAlarm.h @@ -24,11 +24,10 @@ * THE SOFTWARE. */ -#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_ALARM_COPROC_COPROCALARM_H -#define MICROPY_INCLUDED_SHARED_BINDINGS_ALARM_COPROC_COPROCALARM_H +#pragma once -#include "common-hal/alarm/coproc/CoprocAlarm.h" +#include "common-hal/espulp/ULPAlarm.h" -extern const mp_obj_type_t alarm_coproc_coprocalarm_type; +extern const mp_obj_type_t espulp_ulpalarm_type; -#endif // MICROPY_INCLUDED_SHARED_BINDINGS_ALARM_COPROC_COPROCALARM_H +void common_hal_espulp_ulpalarm_construct(espulp_ulpalarm_obj_t *self); diff --git a/ports/espressif/bindings/espulp/__init__.c b/ports/espressif/bindings/espulp/__init__.c new file mode 100644 index 0000000000..06c62175fa --- /dev/null +++ b/ports/espressif/bindings/espulp/__init__.c @@ -0,0 +1,91 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2022 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/util.h" +#include "bindings/espulp/__init__.h" +#include "bindings/espulp/ULP.h" +#include "bindings/espulp/ULPAlarm.h" + +#include "py/runtime.h" + +//| """ESP Ultra Low Power Processor Module +//| +//| The `espulp` module adds ability to load and run +//| programs on the ESP32-Sx's ultra-low-power RISC-V processor. +//| +//| .. code-block:: python +//| +//| import espulp +//| import memorymap +//| +//| shared_mem = memorymap.AddressRange(start=0x50000000, length=1024) +//| ulp = espulp.ULP() +//| +//| with open("program.bin", "rb") as f: +//| program = f.read() +//| +//| ulp.run(program) +//| print(shared_mem[0]) +//| # ulp.halt() +//| """ +//| ... +//| + +//| def get_rtc_gpio_number(pin: microcontroller.Pin) -> Optional[int]: +//| """Return the RTC GPIO number of the given pin or None if not connected +//| to RTC GPIO.""" +//| ... +//| + +STATIC mp_obj_t espulp_get_rtc_gpio_number(mp_obj_t pin_obj) { + const mcu_pin_obj_t *pin = validate_obj_is_pin(pin_obj); + mp_int_t number = common_hal_espulp_get_rtc_gpio_number(pin); + if (number < 0) { + return mp_const_none; + } + return MP_OBJ_NEW_SMALL_INT(number); +} +MP_DEFINE_CONST_FUN_OBJ_1(espulp_get_rtc_gpio_number_obj, espulp_get_rtc_gpio_number); + +STATIC const mp_rom_map_elem_t espulp_module_globals_table[] = { + // module name + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_espulp) }, + + // module functions + { MP_ROM_QSTR(MP_QSTR_get_rtc_gpio_number), MP_OBJ_FROM_PTR(&espulp_get_rtc_gpio_number_obj) }, + + // module classes + { MP_ROM_QSTR(MP_QSTR_ULP), MP_OBJ_FROM_PTR(&espulp_ulp_type) }, + { MP_ROM_QSTR(MP_QSTR_ULPAlarm), MP_OBJ_FROM_PTR(&espulp_ulpalarm_type) }, +}; +STATIC MP_DEFINE_CONST_DICT(espulp_module_globals, espulp_module_globals_table); + +const mp_obj_module_t espulp_module = { + .base = { &mp_type_module }, + .globals = (mp_obj_dict_t *)&espulp_module_globals, +}; + +MP_REGISTER_MODULE(MP_QSTR_espulp, espulp_module, CIRCUITPY_ESPULP); diff --git a/ports/espressif/common-hal/coproc/Coproc.h b/ports/espressif/bindings/espulp/__init__.h similarity index 75% rename from ports/espressif/common-hal/coproc/Coproc.h rename to ports/espressif/bindings/espulp/__init__.h index 19082871cc..70daf53183 100644 --- a/ports/espressif/common-hal/coproc/Coproc.h +++ b/ports/espressif/bindings/espulp/__init__.h @@ -24,17 +24,10 @@ * THE SOFTWARE. */ -#ifndef MICROPY_INCLUDED_ESPRESSIF_COMMON_HAL_COPROC_COPROC_H -#define MICROPY_INCLUDED_ESPRESSIF_COMMON_HAL_COPROC_COPROC_H +#pragma once -#include "py/obj.h" -#include "common-hal/coproc/CoprocMemory.h" +#include "shared-bindings/microcontroller/Pin.h" -typedef struct { - mp_obj_base_t base; - uint8_t *buf; - size_t buf_len; - coproc_memory_obj_t *coproc_memory; -} coproc_coproc_obj_t; +void espulp_reset(void); -#endif // MICROPY_INCLUDED_ESPRESSIF_COMMON_HAL_COPROC_COPROC_H +mp_int_t common_hal_espulp_get_rtc_gpio_number(const mcu_pin_obj_t *pin); diff --git a/ports/espressif/boards/adafruit_qtpy_esp32c3/sdkconfig b/ports/espressif/boards/adafruit_qtpy_esp32c3/sdkconfig index 5111900c7e..b47420753c 100644 --- a/ports/espressif/boards/adafruit_qtpy_esp32c3/sdkconfig +++ b/ports/espressif/boards/adafruit_qtpy_esp32c3/sdkconfig @@ -1,70 +1,5 @@ -# Automatically generated file. DO NOT EDIT. -# Espressif IoT Development Framework (ESP-IDF) Project Configuration -# -# Bootloader config -# -CONFIG_BOOTLOADER_LOG_LEVEL_NONE=y -# CONFIG_BOOTLOADER_LOG_LEVEL_INFO is not set -CONFIG_BOOTLOADER_LOG_LEVEL=0 -# end of Bootloader config - -# -# Serial flasher config -# -# CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set -# end of Serial flasher config - -# -# Partition Table -# -CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="esp-idf-config/partitions-4MB-no-uf2.csv" -CONFIG_PARTITION_TABLE_FILENAME="esp-idf-config/partitions-4MB-no-uf2.csv" -# end of Partition Table - -# -# Compiler options -# -# CONFIG_COMPILER_SAVE_RESTORE_LIBCALLS is not set -# end of Compiler options - -# -# Component config -# -# - -# -# PHY -# -CONFIG_ESP_PHY_ENABLE_USB=y -# end of PHY - -# -# ESP System Settings -# -# CONFIG_ESP_SYSTEM_USE_EH_FRAME is not set -CONFIG_ESP_CONSOLE_SECONDARY_NONE=y -# CONFIG_ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG is not set -# CONFIG_ESP_DEBUG_STUBS_ENABLE is not set -# end of ESP System Settings - # # LWIP # CONFIG_LWIP_LOCAL_HOSTNAME="Adafruit-QTPy-ESP32C3" # end of LWIP - -# -# SPI Flash driver -# -# CONFIG_SPI_FLASH_AUTO_SUSPEND is not set -# end of SPI Flash driver - -# end of Component config - -# -# Deprecated options for backward compatibility -# -# CONFIG_LOG_BOOTLOADER_LEVEL_INFO is not set -CONFIG_LOG_BOOTLOADER_LEVEL=0 -# CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG is not set -# end of Deprecated options for backward compatibility diff --git a/ports/espressif/boards/ai_thinker_esp32-c3s-2m/mpconfigboard.h b/ports/espressif/boards/ai_thinker_esp32-c3s-2m/mpconfigboard.h index a42f8b0436..a9f0075a41 100644 --- a/ports/espressif/boards/ai_thinker_esp32-c3s-2m/mpconfigboard.h +++ b/ports/espressif/boards/ai_thinker_esp32-c3s-2m/mpconfigboard.h @@ -30,7 +30,9 @@ #define MICROPY_HW_MCU_NAME "ESP32-C3" // Status LED -#define MICROPY_HW_LED_STATUS (&pin_GPIO19) +#define CIRCUITPY_RGB_STATUS_R (&pin_GPIO3) +#define CIRCUITPY_RGB_STATUS_G (&pin_GPIO4) +#define CIRCUITPY_RGB_STATUS_B (&pin_GPIO5) // Default bus pins #define DEFAULT_UART_BUS_RX (&pin_GPIO20) diff --git a/ports/espressif/boards/ai_thinker_esp32-c3s/mpconfigboard.h b/ports/espressif/boards/ai_thinker_esp32-c3s/mpconfigboard.h index 20fb1ff022..f3f89d500b 100644 --- a/ports/espressif/boards/ai_thinker_esp32-c3s/mpconfigboard.h +++ b/ports/espressif/boards/ai_thinker_esp32-c3s/mpconfigboard.h @@ -30,7 +30,9 @@ #define MICROPY_HW_MCU_NAME "ESP32-C3FN4" // Status LED -#define MICROPY_HW_LED_STATUS (&pin_GPIO19) +#define CIRCUITPY_RGB_STATUS_R (&pin_GPIO3) +#define CIRCUITPY_RGB_STATUS_G (&pin_GPIO4) +#define CIRCUITPY_RGB_STATUS_B (&pin_GPIO5) // Default bus pins #define DEFAULT_UART_BUS_RX (&pin_GPIO20) diff --git a/ports/espressif/boards/beetle-esp32-c3/sdkconfig b/ports/espressif/boards/beetle-esp32-c3/sdkconfig index 331a5d14dc..68be40df7a 100644 --- a/ports/espressif/boards/beetle-esp32-c3/sdkconfig +++ b/ports/espressif/boards/beetle-esp32-c3/sdkconfig @@ -1,13 +1,5 @@ -# -# PHY -# -CONFIG_ESP_PHY_ENABLE_USB=y -# end of PHY - # # LWIP # CONFIG_LWIP_LOCAL_HOSTNAME="beetle-esp32-c3 # end of LWIP - - diff --git a/ports/espressif/boards/bpi_picow_s3/mpconfigboard.h b/ports/espressif/boards/bpi_picow_s3/mpconfigboard.h index f7e7fde31b..a261ed17fa 100644 --- a/ports/espressif/boards/bpi_picow_s3/mpconfigboard.h +++ b/ports/espressif/boards/bpi_picow_s3/mpconfigboard.h @@ -31,6 +31,8 @@ #define MICROPY_HW_NEOPIXEL (&pin_GPIO48) +#define MICROPY_HW_LED_STATUS (&pin_GPIO46) + #define DEFAULT_UART_BUS_RX (&pin_GPIO44) #define DEFAULT_UART_BUS_TX (&pin_GPIO43) diff --git a/ports/espressif/boards/crcibernetica-ideaboard/mpconfigboard.mk b/ports/espressif/boards/crcibernetica-ideaboard/mpconfigboard.mk index cbc468b3ec..3921140b5c 100644 --- a/ports/espressif/boards/crcibernetica-ideaboard/mpconfigboard.mk +++ b/ports/espressif/boards/crcibernetica-ideaboard/mpconfigboard.mk @@ -5,5 +5,11 @@ IDF_TARGET = esp32 CIRCUITPY_ESP_FLASH_MODE = dio CIRCUITPY_ESP_FLASH_FREQ = 40m -CIRCUITPY_ESP_FLASH_SIZE = 16MB +CIRCUITPY_ESP_FLASH_SIZE = 8MB CIRCUITPY_ESP32_CAMERA = 0 + +# Include these Python libraries in firmware +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Requests +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_SimpleIO +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_Motor diff --git a/ports/stm/fatfs_port.c b/ports/espressif/boards/doit_esp32_devkit_v1/board.c similarity index 79% rename from ports/stm/fatfs_port.c rename to ports/espressif/boards/doit_esp32_devkit_v1/board.c index 631f7f0982..164430c88c 100644 --- a/ports/stm/fatfs_port.c +++ b/ports/espressif/boards/doit_esp32_devkit_v1/board.c @@ -3,7 +3,7 @@ * * The MIT License (MIT) * - * SPDX-FileCopyrightText: Copyright (c) 2013, 2014 Damien P. George + * 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 @@ -24,10 +24,6 @@ * THE SOFTWARE. */ -#include "py/runtime.h" -#include "lib/oofatfs/ff.h" +#include "supervisor/board.h" -DWORD get_fattime(void) { - // TODO: Implement this function. For now, fake it. - return ((2016 - 1980) << 25) | ((12) << 21) | ((4) << 16) | ((00) << 11) | ((18) << 5) | (23 / 2); -} +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/atmel-samd/fatfs_port.c b/ports/espressif/boards/doit_esp32_devkit_v1/mpconfigboard.h similarity index 61% rename from ports/atmel-samd/fatfs_port.c rename to ports/espressif/boards/doit_esp32_devkit_v1/mpconfigboard.h index 58a0ef0d72..2a0dcd0104 100644 --- a/ports/atmel-samd/fatfs_port.c +++ b/ports/espressif/boards/doit_esp32_devkit_v1/mpconfigboard.h @@ -3,7 +3,7 @@ * * The MIT License (MIT) * - * SPDX-FileCopyrightText: Copyright (c) 2013, 2014 Damien P. George + * Copyright (c) 2022 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,25 +24,22 @@ * THE SOFTWARE. */ -#include "py/mphal.h" -#include "py/runtime.h" -#include "lib/oofatfs/ff.h" /* FatFs lower layer API */ -#include "lib/oofatfs/diskio.h" /* FatFs lower layer API */ -#include "shared/timeutils/timeutils.h" +// Micropython setup -#if CIRCUITPY_RTC -#include "shared-bindings/rtc/RTC.h" -#endif +#define MICROPY_HW_BOARD_NAME "ESP32 Devkit V1" +#define MICROPY_HW_MCU_NAME "ESP32" -DWORD get_fattime(void) { - #if CIRCUITPY_RTC - timeutils_struct_time_t tm; - common_hal_rtc_get_time(&tm); - return ((tm.tm_year - 1980) << 25) | (tm.tm_mon << 21) | (tm.tm_mday << 16) | - (tm.tm_hour << 11) | (tm.tm_min << 5) | (tm.tm_sec >> 1); - #else - return ((2016 - 1980) << 25) | ((9) << 21) | ((1) << 16) | ((16) << 11) | ((43) << 5) | (35 / 2); - #endif +#define MICROPY_HW_LED_STATUS (&pin_GPIO2) +#define CIRCUITPY_BOARD_I2C (1) +#define CIRCUITPY_BOARD_I2C_PIN {{.scl = &pin_GPIO22, .sda = &pin_GPIO21}} -} +#define CIRCUITPY_BOARD_SPI (1) +#define CIRCUITPY_BOARD_SPI_PIN {{.clock = &pin_GPIO18, .mosi = &pin_GPIO23, .miso = &pin_GPIO19}} + +#define CIRCUITPY_BOARD_UART (1) +#define CIRCUITPY_BOARD_UART_PIN {{.tx = &pin_GPIO17, .rx = &pin_GPIO16}} + +// UART pins attached to the USB-serial converter chip +#define CIRCUITPY_CONSOLE_UART_TX (&pin_GPIO1) +#define CIRCUITPY_CONSOLE_UART_RX (&pin_GPIO3) diff --git a/ports/espressif/boards/doit_esp32_devkit_v1/mpconfigboard.mk b/ports/espressif/boards/doit_esp32_devkit_v1/mpconfigboard.mk new file mode 100644 index 0000000000..7aa352e16e --- /dev/null +++ b/ports/espressif/boards/doit_esp32_devkit_v1/mpconfigboard.mk @@ -0,0 +1,9 @@ +CIRCUITPY_CREATOR_ID = 0xB0D00000 +CIRCUITPY_CREATION_ID = 0x00320002 + +IDF_TARGET = esp32 + +CIRCUITPY_ESP_FLASH_MODE = dio +CIRCUITPY_ESP_FLASH_FREQ = 40m +CIRCUITPY_ESP_FLASH_SIZE = 4MB +CIRCUITPY_ESP32_CAMERA = 0 diff --git a/ports/espressif/boards/doit_esp32_devkit_v1/pins.c b/ports/espressif/boards/doit_esp32_devkit_v1/pins.c new file mode 100644 index 0000000000..78c37897ac --- /dev/null +++ b/ports/espressif/boards/doit_esp32_devkit_v1/pins.c @@ -0,0 +1,46 @@ +#include "shared-bindings/board/__init__.h" + +STATIC const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + // External pins are in silkscreen order, from top to bottom, left side, then right side + {MP_ROM_QSTR(MP_QSTR_D15), MP_ROM_PTR(&pin_GPIO15)}, + {MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_GPIO2)}, + {MP_ROM_QSTR(MP_QSTR_RX2), MP_ROM_PTR(&pin_GPIO16)}, + {MP_ROM_QSTR(MP_QSTR_TX2), MP_ROM_PTR(&pin_GPIO17)}, + {MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_GPIO5)}, + {MP_ROM_QSTR(MP_QSTR_D18), MP_ROM_PTR(&pin_GPIO18)}, + {MP_ROM_QSTR(MP_QSTR_D19), MP_ROM_PTR(&pin_GPIO19)}, + {MP_ROM_QSTR(MP_QSTR_D21), MP_ROM_PTR(&pin_GPIO21)}, + {MP_ROM_QSTR(MP_QSTR_RX0), MP_ROM_PTR(&pin_GPIO1)}, + {MP_ROM_QSTR(MP_QSTR_TX0), MP_ROM_PTR(&pin_GPIO3)}, + {MP_ROM_QSTR(MP_QSTR_D22), MP_ROM_PTR(&pin_GPIO22)}, + {MP_ROM_QSTR(MP_QSTR_D23), MP_ROM_PTR(&pin_GPIO23)}, + {MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_GPIO13)}, + {MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_GPIO12)}, + {MP_ROM_QSTR(MP_QSTR_D14), MP_ROM_PTR(&pin_GPIO14)}, + {MP_ROM_QSTR(MP_QSTR_D27), MP_ROM_PTR(&pin_GPIO27)}, + {MP_ROM_QSTR(MP_QSTR_D26), MP_ROM_PTR(&pin_GPIO26)}, + {MP_ROM_QSTR(MP_QSTR_D25), MP_ROM_PTR(&pin_GPIO25)}, + {MP_ROM_QSTR(MP_QSTR_D33), MP_ROM_PTR(&pin_GPIO33)}, + {MP_ROM_QSTR(MP_QSTR_D32), MP_ROM_PTR(&pin_GPIO32)}, + {MP_ROM_QSTR(MP_QSTR_D35), MP_ROM_PTR(&pin_GPIO35)}, + {MP_ROM_QSTR(MP_QSTR_D34), MP_ROM_PTR(&pin_GPIO34)}, + + {MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO2)}, + + {MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO21)}, + {MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO22)}, + + {MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_GPIO18)}, + {MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_GPIO23)}, + {MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO19)}, + + {MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO17)}, + {MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO16)}, + + {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_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/espressif/boards/doit_esp32_devkit_v1/sdkconfig b/ports/espressif/boards/doit_esp32_devkit_v1/sdkconfig new file mode 100644 index 0000000000..6c0168c829 --- /dev/null +++ b/ports/espressif/boards/doit_esp32_devkit_v1/sdkconfig @@ -0,0 +1,20 @@ +CONFIG_ESP32_ECO3_CACHE_LOCK_FIX=y +CONFIG_ESP32_SPIRAM_SUPPORT=n + +# Uncomment (remove ###) to send ESP_LOG output to TX/RX pins +### # +### # ESP System Settings +### # +### CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT=y +### # CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set +### CONFIG_ESP_CONSOLE_UART_CUSTOM=y +### CONFIG_ESP_CONSOLE_NONE is not set +### CONFIG_ESP_CONSOLE_UART=y +### CONFIG_ESP_CONSOLE_UART_CUSTOM_NUM_0=y +### # CONFIG_ESP_CONSOLE_UART_CUSTOM_NUM_1 is not set +### CONFIG_ESP_CONSOLE_UART_NUM=0 +### CONFIG_ESP_CONSOLE_UART_TX_GPIO=17 +### CONFIG_ESP_CONSOLE_UART_RX_GPIO=16 +### CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200 +### # CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5 is not set +### # end of ESP System Settings diff --git a/ports/espressif/boards/espressif_esp32s3_box_lite/mpconfigboard.mk b/ports/espressif/boards/espressif_esp32s3_box_lite/mpconfigboard.mk index 2e63089b9c..f4a746026a 100644 --- a/ports/espressif/boards/espressif_esp32s3_box_lite/mpconfigboard.mk +++ b/ports/espressif/boards/espressif_esp32s3_box_lite/mpconfigboard.mk @@ -5,6 +5,8 @@ USB_MANUFACTURER = "Espressif" IDF_TARGET = esp32s3 -CIRCUITPY_ESP_FLASH_MODE=dio -CIRCUITPY_ESP_FLASH_FREQ=40m -CIRCUITPY_ESP_FLASH_SIZE=16MB +CIRCUITPY_ESP_FLASH_MODE = dio +CIRCUITPY_ESP_FLASH_FREQ = 40m +CIRCUITPY_ESP_FLASH_SIZE = 16MB + +CIRCUITPY_ESP32_CAMERA = 0 diff --git a/ports/espressif/boards/espressif_esp32s3_box_lite/sdkconfig b/ports/espressif/boards/espressif_esp32s3_box_lite/sdkconfig index 7fcf8ef297..ead0088da5 100644 --- a/ports/espressif/boards/espressif_esp32s3_box_lite/sdkconfig +++ b/ports/espressif/boards/espressif_esp32s3_box_lite/sdkconfig @@ -1,35 +1,11 @@ -CONFIG_ESP32S3_SPIRAM_SUPPORT=y -# -# SPI RAM config -# -# CONFIG_SPIRAM_MODE_QUAD is not set -CONFIG_SPIRAM_MODE_OCT=y -CONFIG_SPIRAM_TYPE_AUTO=y -# CONFIG_SPIRAM_TYPE_ESPPSRAM64 is not set -CONFIG_SPIRAM_SIZE=-1 -# end of SPI RAM config - -CONFIG_DEFAULT_PSRAM_CLK_IO=30 -# -# PSRAM Clock and CS IO for ESP32S3 -# -CONFIG_DEFAULT_PSRAM_CS_IO=26 -# end of PSRAM Clock and CS IO for ESP32S3 - -# CONFIG_SPIRAM_FETCH_INSTRUCTIONS is not set -# CONFIG_SPIRAM_RODATA is not set -CONFIG_SPIRAM_SPEED_80M=y -# CONFIG_SPIRAM_SPEED_40M is not set CONFIG_SPIRAM=y +CONFIG_SPIRAM_MODE_OCT=y +CONFIG_SPIRAM_SPEED_80M=y +CONFIG_SPIRAM_TYPE_AUTO=y + CONFIG_SPIRAM_BOOT_INIT=y -# CONFIG_SPIRAM_IGNORE_NOTFOUND is not set -# CONFIG_SPIRAM_USE_MEMMAP is not set -# CONFIG_SPIRAM_USE_CAPS_ALLOC is not set -CONFIG_SPIRAM_USE_MALLOC=y -CONFIG_SPIRAM_MEMTEST=y -CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=16384 -# CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP is not set -CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=32768 +CONFIG_SPIRAM_USE_MEMMAP=y + # # LWIP # diff --git a/ports/espressif/boards/lolin_c3_mini/pins.c b/ports/espressif/boards/lolin_c3_mini/pins.c index ccc70f6043..6b16020205 100644 --- a/ports/espressif/boards/lolin_c3_mini/pins.c +++ b/ports/espressif/boards/lolin_c3_mini/pins.c @@ -46,6 +46,7 @@ STATIC const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_IO7), MP_ROM_PTR(&pin_GPIO7) }, { MP_ROM_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_GPIO7) }, { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO7) }, { MP_ROM_QSTR(MP_QSTR_IO8), MP_ROM_PTR(&pin_GPIO8) }, { MP_ROM_QSTR(MP_QSTR_D8), MP_ROM_PTR(&pin_GPIO8) }, diff --git a/ports/espressif/boards/lolin_c3_mini/sdkconfig b/ports/espressif/boards/lolin_c3_mini/sdkconfig index c548ee3c69..833f8368fa 100644 --- a/ports/espressif/boards/lolin_c3_mini/sdkconfig +++ b/ports/espressif/boards/lolin_c3_mini/sdkconfig @@ -1,13 +1,5 @@ -# -# PHY -# -CONFIG_ESP_PHY_ENABLE_USB=y -# end of PHY - # # LWIP # CONFIG_LWIP_LOCAL_HOSTNAME="lolin-c3-mini" # end of LWIP - - diff --git a/ports/litex/fatfs_port.c b/ports/espressif/boards/luatos_core_esp32c3/board.c similarity index 79% rename from ports/litex/fatfs_port.c rename to ports/espressif/boards/luatos_core_esp32c3/board.c index 631f7f0982..164430c88c 100644 --- a/ports/litex/fatfs_port.c +++ b/ports/espressif/boards/luatos_core_esp32c3/board.c @@ -3,7 +3,7 @@ * * The MIT License (MIT) * - * SPDX-FileCopyrightText: Copyright (c) 2013, 2014 Damien P. George + * 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 @@ -24,10 +24,6 @@ * THE SOFTWARE. */ -#include "py/runtime.h" -#include "lib/oofatfs/ff.h" +#include "supervisor/board.h" -DWORD get_fattime(void) { - // TODO: Implement this function. For now, fake it. - return ((2016 - 1980) << 25) | ((12) << 21) | ((4) << 16) | ((00) << 11) | ((18) << 5) | (23 / 2); -} +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/espressif/boards/luatos_core_esp32c3/mpconfigboard.h b/ports/espressif/boards/luatos_core_esp32c3/mpconfigboard.h new file mode 100644 index 0000000000..23bb5ee9b2 --- /dev/null +++ b/ports/espressif/boards/luatos_core_esp32c3/mpconfigboard.h @@ -0,0 +1,38 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 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. + */ + +// Board setup + +#define MICROPY_HW_BOARD_NAME "Luatos Core-ESP32C3" +#define MICROPY_HW_MCU_NAME "ESP32-C3" + +// Status LED +#define MICROPY_HW_LED_STATUS (&pin_GPIO12) + +#define CIRCUITPY_BOARD_UART (1) +#define CIRCUITPY_BOARD_UART_PIN {{.tx = &pin_GPIO21, .rx = &pin_GPIO20}} + +#define CIRCUITPY_ESP_USB_SERIAL_JTAG (1) diff --git a/ports/espressif/boards/luatos_core_esp32c3/mpconfigboard.mk b/ports/espressif/boards/luatos_core_esp32c3/mpconfigboard.mk new file mode 100644 index 0000000000..e0df58f756 --- /dev/null +++ b/ports/espressif/boards/luatos_core_esp32c3/mpconfigboard.mk @@ -0,0 +1,8 @@ +CIRCUITPY_CREATOR_ID = 0xDEADBEEF +CIRCUITPY_CREATION_ID = 0x00C30001 + +IDF_TARGET = esp32c3 + +CIRCUITPY_ESP_FLASH_MODE=dio +CIRCUITPY_ESP_FLASH_FREQ=80m +CIRCUITPY_ESP_FLASH_SIZE=4MB diff --git a/ports/espressif/boards/luatos_core_esp32c3/pins.c b/ports/espressif/boards/luatos_core_esp32c3/pins.c new file mode 100644 index 0000000000..f45205b5c3 --- /dev/null +++ b/ports/espressif/boards/luatos_core_esp32c3/pins.c @@ -0,0 +1,36 @@ +#include "shared-bindings/board/__init__.h" + +STATIC const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + // Luatos Core ESP32-C3 + // Documentation (Chinese only): + // https://wiki.luatos.com/chips/esp32c3/index.html + // Pinout: + // https://wiki.luatos.com/_images/20221023.png + // C3 Data Sheet + // https://www.espressif.com/sites/default/files/documentation/esp32-c3_datasheet_en.pdf + + { MP_ROM_QSTR(MP_QSTR_IO0), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_IO1), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_IO2), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_IO3), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_IO4), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_IO5), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_IO6), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_IO7), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_IO8), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_IO9), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_BOOT0), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_BUTTON), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_IO10), MP_ROM_PTR(&pin_GPIO10) }, + // IO11 used internally on this board version despite being broken out to a pin + { MP_ROM_QSTR(MP_QSTR_IO12), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_IO13), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_LED2), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_IO18), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_IO19), MP_ROM_PTR(&pin_GPIO19) }, + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/espressif/boards/luatos_core_esp32c3/sdkconfig b/ports/espressif/boards/luatos_core_esp32c3/sdkconfig new file mode 100644 index 0000000000..ccc70917b5 --- /dev/null +++ b/ports/espressif/boards/luatos_core_esp32c3/sdkconfig @@ -0,0 +1,5 @@ +# +# LWIP +# +CONFIG_LWIP_LOCAL_HOSTNAME="luatos-core-esp32c3" +# end of LWIP diff --git a/ports/espressif/boards/m5stack_atom_echo/board.c b/ports/espressif/boards/m5stack_atom_echo/board.c new file mode 100644 index 0000000000..c0d9676d86 --- /dev/null +++ b/ports/espressif/boards/m5stack_atom_echo/board.c @@ -0,0 +1,29 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2022 CDarius + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "supervisor/board.h" + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/espressif/boards/m5stack_atom_echo/mpconfigboard.h b/ports/espressif/boards/m5stack_atom_echo/mpconfigboard.h new file mode 100644 index 0000000000..7d67267897 --- /dev/null +++ b/ports/espressif/boards/m5stack_atom_echo/mpconfigboard.h @@ -0,0 +1,45 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2022 CDarius + * + * 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. + */ + +// Micropython setup + +#define MICROPY_HW_BOARD_NAME "M5Stack Atom Echo" +#define MICROPY_HW_MCU_NAME "ESP32" + +#define MICROPY_HW_NEOPIXEL (&pin_GPIO27) + +#define CIRCUITPY_BOARD_I2C (1) +#define CIRCUITPY_BOARD_I2C_PIN {{.scl = &pin_GPIO32, .sda = &pin_GPIO26}} + +// For entering safe mode +#define CIRCUITPY_BOOT_BUTTON (&pin_GPIO39) + +// Explanation of how a user got into safe mode +#define BOARD_USER_SAFE_MODE_ACTION translate("The central button was pressed at start up.\n") + +// UART pins attached to the USB-serial converter chip +#define CIRCUITPY_CONSOLE_UART_TX (&pin_GPIO1) +#define CIRCUITPY_CONSOLE_UART_RX (&pin_GPIO3) diff --git a/ports/espressif/boards/m5stack_atom_echo/mpconfigboard.mk b/ports/espressif/boards/m5stack_atom_echo/mpconfigboard.mk new file mode 100644 index 0000000000..663ceaad81 --- /dev/null +++ b/ports/espressif/boards/m5stack_atom_echo/mpconfigboard.mk @@ -0,0 +1,10 @@ +CIRCUITPY_CREATOR_ID = 0x10151015 +CIRCUITPY_CREATION_ID = 0x00320005 + +IDF_TARGET = esp32 + +CIRCUITPY_ESP_FLASH_MODE = dio +CIRCUITPY_ESP_FLASH_FREQ = 40m +CIRCUITPY_ESP_FLASH_SIZE = 4MB + +CIRCUITPY_ESP32_CAMERA = 0 diff --git a/ports/espressif/boards/m5stack_atom_echo/pins.c b/ports/espressif/boards/m5stack_atom_echo/pins.c new file mode 100644 index 0000000000..68b6389215 --- /dev/null +++ b/ports/espressif/boards/m5stack_atom_echo/pins.c @@ -0,0 +1,43 @@ +#include "shared-bindings/board/__init__.h" +#include "shared-module/displayio/__init__.h" + +STATIC const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + // External pins are in silkscreen order, from top to bottom, left side, then right side + + { MP_ROM_QSTR(MP_QSTR_SPK_I2S_SDO), MP_ROM_PTR(&pin_GPIO22) }, + { MP_ROM_QSTR(MP_QSTR_SPK_I2S_SCK), MP_ROM_PTR(&pin_GPIO19) }, + + { MP_ROM_QSTR(MP_QSTR_SPK_I2S_LRC), MP_ROM_PTR(&pin_GPIO33) }, + { MP_ROM_QSTR(MP_QSTR_PDM_MIC_CLK), MP_ROM_PTR(&pin_GPIO33) }, + + { MP_ROM_QSTR(MP_QSTR_PDM_MIC_DATA), MP_ROM_PTR(&pin_GPIO23) }, + + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO21) }, + { MP_ROM_QSTR(MP_QSTR_D21), MP_ROM_PTR(&pin_GPIO21) }, + + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO25) }, + { MP_ROM_QSTR(MP_QSTR_A25), MP_ROM_PTR(&pin_GPIO25) }, + { MP_ROM_QSTR(MP_QSTR_D25), MP_ROM_PTR(&pin_GPIO25) }, + { MP_ROM_QSTR(MP_QSTR_DAC1), MP_ROM_PTR(&pin_GPIO25) }, + + { MP_ROM_QSTR(MP_QSTR_PORTA_SDA), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_A26), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_D26), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_DAC2), MP_ROM_PTR(&pin_GPIO25) }, + + { MP_ROM_QSTR(MP_QSTR_PORTA_SCL), MP_ROM_PTR(&pin_GPIO32) }, + { MP_ROM_QSTR(MP_QSTR_A32), MP_ROM_PTR(&pin_GPIO32) }, + { MP_ROM_QSTR(MP_QSTR_D32), MP_ROM_PTR(&pin_GPIO32) }, + + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO27) }, + + { MP_ROM_QSTR(MP_QSTR_BTN), MP_ROM_PTR(&pin_GPIO39) }, + + { MP_ROM_QSTR(MP_QSTR_IR_LED), MP_ROM_PTR(&pin_GPIO12) }, + + { MP_ROM_QSTR(MP_QSTR_PORTA_I2C), MP_ROM_PTR(&board_i2c_obj) }, + +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/espressif/boards/m5stack_atom_echo/sdkconfig b/ports/espressif/boards/m5stack_atom_echo/sdkconfig new file mode 100644 index 0000000000..3879222bab --- /dev/null +++ b/ports/espressif/boards/m5stack_atom_echo/sdkconfig @@ -0,0 +1,26 @@ +CONFIG_ESP32_SPIRAM_SUPPORT=n + +# CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY is not set +# +# LWIP +# +CONFIG_LWIP_LOCAL_HOSTNAME="M5StaskAtomEcho" +# end of LWIP + +# Uncomment (remove ###) to send ESP_LOG output to TX/RX pins +### # +### # ESP System Settings +### # +### CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT=y +### # CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set +### CONFIG_ESP_CONSOLE_UART_CUSTOM=y +### CONFIG_ESP_CONSOLE_NONE is not set +### CONFIG_ESP_CONSOLE_UART=y +### CONFIG_ESP_CONSOLE_UART_CUSTOM_NUM_0=y +### # CONFIG_ESP_CONSOLE_UART_CUSTOM_NUM_1 is not set +### CONFIG_ESP_CONSOLE_UART_NUM=0 +### CONFIG_ESP_CONSOLE_UART_TX_GPIO=17 +### CONFIG_ESP_CONSOLE_UART_RX_GPIO=16 +### CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200 +### # CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5 is not set +### # end of ESP System Settings diff --git a/ports/espressif/boards/m5stack_atom_matrix/board.c b/ports/espressif/boards/m5stack_atom_matrix/board.c new file mode 100644 index 0000000000..c0d9676d86 --- /dev/null +++ b/ports/espressif/boards/m5stack_atom_matrix/board.c @@ -0,0 +1,29 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2022 CDarius + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "supervisor/board.h" + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/espressif/boards/m5stack_atom_matrix/mpconfigboard.h b/ports/espressif/boards/m5stack_atom_matrix/mpconfigboard.h new file mode 100644 index 0000000000..926b7efbc4 --- /dev/null +++ b/ports/espressif/boards/m5stack_atom_matrix/mpconfigboard.h @@ -0,0 +1,49 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2022 CDarius + * + * 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. + */ + +// Micropython setup + +#define MICROPY_HW_BOARD_NAME "M5Stack Atom Matrix" +#define MICROPY_HW_MCU_NAME "ESP32" + +#define MICROPY_HW_NEOPIXEL (&pin_GPIO27) + +#define CIRCUITPY_BOARD_I2C (2) +#define CIRCUITPY_BOARD_I2C_PIN {{.scl = &pin_GPIO21, .sda = &pin_GPIO25}, \ + {.scl = &pin_GPIO32, .sda = &pin_GPIO26}} + +#define CIRCUITPY_BOARD_SPI (1) +#define CIRCUITPY_BOARD_SPI_PIN {{.clock = &pin_GPIO23, .mosi = &pin_GPIO19, .miso = &pin_GPIO33}} + +// For entering safe mode +#define CIRCUITPY_BOOT_BUTTON (&pin_GPIO39) + +// Explanation of how a user got into safe mode +#define BOARD_USER_SAFE_MODE_ACTION translate("The central button was pressed at start up.\n") + +// UART pins attached to the USB-serial converter chip +#define CIRCUITPY_CONSOLE_UART_TX (&pin_GPIO1) +#define CIRCUITPY_CONSOLE_UART_RX (&pin_GPIO3) diff --git a/ports/espressif/boards/m5stack_atom_matrix/mpconfigboard.mk b/ports/espressif/boards/m5stack_atom_matrix/mpconfigboard.mk new file mode 100644 index 0000000000..c34fa9d836 --- /dev/null +++ b/ports/espressif/boards/m5stack_atom_matrix/mpconfigboard.mk @@ -0,0 +1,10 @@ +CIRCUITPY_CREATOR_ID = 0x10151015 +CIRCUITPY_CREATION_ID = 0x00320004 + +IDF_TARGET = esp32 + +CIRCUITPY_ESP_FLASH_MODE = dio +CIRCUITPY_ESP_FLASH_FREQ = 40m +CIRCUITPY_ESP_FLASH_SIZE = 4MB + +CIRCUITPY_ESP32_CAMERA = 0 diff --git a/ports/espressif/boards/m5stack_atom_matrix/pins.c b/ports/espressif/boards/m5stack_atom_matrix/pins.c new file mode 100644 index 0000000000..9b18b954f0 --- /dev/null +++ b/ports/espressif/boards/m5stack_atom_matrix/pins.c @@ -0,0 +1,51 @@ +#include "shared-bindings/board/__init__.h" +#include "shared-module/displayio/__init__.h" + +CIRCUITPY_BOARD_BUS_SINGLETON(porta_i2c, i2c, 1) + +STATIC const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + // External pins are in silkscreen order, from top to bottom, left side, then right side + + { MP_ROM_QSTR(MP_QSTR_D22), MP_ROM_PTR(&pin_GPIO22) }, + + { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_GPIO19) }, + { MP_ROM_QSTR(MP_QSTR_D19), MP_ROM_PTR(&pin_GPIO19) }, + + { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_GPIO23) }, + { MP_ROM_QSTR(MP_QSTR_D23), MP_ROM_PTR(&pin_GPIO23) }, + + { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO33) }, + { MP_ROM_QSTR(MP_QSTR_D33), MP_ROM_PTR(&pin_GPIO33) }, + { MP_ROM_QSTR(MP_QSTR_A33), MP_ROM_PTR(&pin_GPIO33) }, + + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO21) }, + { MP_ROM_QSTR(MP_QSTR_D21), MP_ROM_PTR(&pin_GPIO21) }, + + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO25) }, + { MP_ROM_QSTR(MP_QSTR_A25), MP_ROM_PTR(&pin_GPIO25) }, + { MP_ROM_QSTR(MP_QSTR_D25), MP_ROM_PTR(&pin_GPIO25) }, + { MP_ROM_QSTR(MP_QSTR_DAC1), MP_ROM_PTR(&pin_GPIO25) }, + + { MP_ROM_QSTR(MP_QSTR_PORTA_SDA), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_A26), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_D26), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_DAC2), MP_ROM_PTR(&pin_GPIO25) }, + + { MP_ROM_QSTR(MP_QSTR_PORTA_SCL), MP_ROM_PTR(&pin_GPIO32) }, + { MP_ROM_QSTR(MP_QSTR_A32), MP_ROM_PTR(&pin_GPIO32) }, + { MP_ROM_QSTR(MP_QSTR_D32), MP_ROM_PTR(&pin_GPIO32) }, + + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO27) }, + + { MP_ROM_QSTR(MP_QSTR_BTN), MP_ROM_PTR(&pin_GPIO39) }, + + { MP_ROM_QSTR(MP_QSTR_IR_LED), MP_ROM_PTR(&pin_GPIO12) }, + + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_PORTA_I2C), MP_ROM_PTR(&board_porta_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/espressif/boards/m5stack_atom_matrix/sdkconfig b/ports/espressif/boards/m5stack_atom_matrix/sdkconfig new file mode 100644 index 0000000000..474a760b56 --- /dev/null +++ b/ports/espressif/boards/m5stack_atom_matrix/sdkconfig @@ -0,0 +1,26 @@ +CONFIG_ESP32_SPIRAM_SUPPORT=n + +# CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY is not set +# +# LWIP +# +CONFIG_LWIP_LOCAL_HOSTNAME="M5StaskAtomMatrix" +# end of LWIP + +# Uncomment (remove ###) to send ESP_LOG output to TX/RX pins +### # +### # ESP System Settings +### # +### CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT=y +### # CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set +### CONFIG_ESP_CONSOLE_UART_CUSTOM=y +### CONFIG_ESP_CONSOLE_NONE is not set +### CONFIG_ESP_CONSOLE_UART=y +### CONFIG_ESP_CONSOLE_UART_CUSTOM_NUM_0=y +### # CONFIG_ESP_CONSOLE_UART_CUSTOM_NUM_1 is not set +### CONFIG_ESP_CONSOLE_UART_NUM=0 +### CONFIG_ESP_CONSOLE_UART_TX_GPIO=17 +### CONFIG_ESP_CONSOLE_UART_RX_GPIO=16 +### CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200 +### # CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5 is not set +### # end of ESP System Settings diff --git a/ports/espressif/boards/m5stack_atom_u/board.c b/ports/espressif/boards/m5stack_atom_u/board.c new file mode 100644 index 0000000000..c0d9676d86 --- /dev/null +++ b/ports/espressif/boards/m5stack_atom_u/board.c @@ -0,0 +1,29 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2022 CDarius + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "supervisor/board.h" + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/broadcom/fatfs_port.c b/ports/espressif/boards/m5stack_atom_u/mpconfigboard.h similarity index 58% rename from ports/broadcom/fatfs_port.c rename to ports/espressif/boards/m5stack_atom_u/mpconfigboard.h index 58a0ef0d72..b3b0a650ab 100644 --- a/ports/broadcom/fatfs_port.c +++ b/ports/espressif/boards/m5stack_atom_u/mpconfigboard.h @@ -3,7 +3,7 @@ * * The MIT License (MIT) * - * SPDX-FileCopyrightText: Copyright (c) 2013, 2014 Damien P. George + * Copyright (c) 2022 CDarius * * 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,25 +24,25 @@ * THE SOFTWARE. */ -#include "py/mphal.h" -#include "py/runtime.h" -#include "lib/oofatfs/ff.h" /* FatFs lower layer API */ -#include "lib/oofatfs/diskio.h" /* FatFs lower layer API */ -#include "shared/timeutils/timeutils.h" +// Micropython setup -#if CIRCUITPY_RTC -#include "shared-bindings/rtc/RTC.h" -#endif +#define MICROPY_HW_BOARD_NAME "M5Stack Atom U" +#define MICROPY_HW_MCU_NAME "ESP32" -DWORD get_fattime(void) { - #if CIRCUITPY_RTC - timeutils_struct_time_t tm; - common_hal_rtc_get_time(&tm); - return ((tm.tm_year - 1980) << 25) | (tm.tm_mon << 21) | (tm.tm_mday << 16) | - (tm.tm_hour << 11) | (tm.tm_min << 5) | (tm.tm_sec >> 1); - #else - return ((2016 - 1980) << 25) | ((9) << 21) | ((1) << 16) | ((16) << 11) | ((43) << 5) | (35 / 2); - #endif +#define MICROPY_HW_NEOPIXEL (&pin_GPIO27) +#define CIRCUITPY_BOARD_I2C (1) +#define CIRCUITPY_BOARD_I2C_PIN {{.scl = &pin_GPIO32, .sda = &pin_GPIO26}} -} +#define CIRCUITPY_BOARD_SPI (1) +#define CIRCUITPY_BOARD_SPI_PIN {{.clock = &pin_GPIO23, .mosi = &pin_GPIO19, .miso = &pin_GPIO33}} + +// For entering safe mode +#define CIRCUITPY_BOOT_BUTTON (&pin_GPIO39) + +// Explanation of how a user got into safe mode +#define BOARD_USER_SAFE_MODE_ACTION translate("The central button was pressed at start up.\n") + +// UART pins attached to the USB-serial converter chip +#define CIRCUITPY_CONSOLE_UART_TX (&pin_GPIO1) +#define CIRCUITPY_CONSOLE_UART_RX (&pin_GPIO3) diff --git a/ports/espressif/boards/m5stack_atom_u/mpconfigboard.mk b/ports/espressif/boards/m5stack_atom_u/mpconfigboard.mk new file mode 100644 index 0000000000..18bb6d3dc0 --- /dev/null +++ b/ports/espressif/boards/m5stack_atom_u/mpconfigboard.mk @@ -0,0 +1,10 @@ +CIRCUITPY_CREATOR_ID = 0x10151015 +CIRCUITPY_CREATION_ID = 0x00320006 + +IDF_TARGET = esp32 + +CIRCUITPY_ESP_FLASH_MODE = dio +CIRCUITPY_ESP_FLASH_FREQ = 40m +CIRCUITPY_ESP_FLASH_SIZE = 4MB + +CIRCUITPY_ESP32_CAMERA = 0 diff --git a/ports/espressif/boards/m5stack_atom_u/pins.c b/ports/espressif/boards/m5stack_atom_u/pins.c new file mode 100644 index 0000000000..4ba62ae2b7 --- /dev/null +++ b/ports/espressif/boards/m5stack_atom_u/pins.c @@ -0,0 +1,42 @@ +#include "shared-bindings/board/__init__.h" +#include "shared-module/displayio/__init__.h" + +STATIC const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + // External pins are in silkscreen order, from top to bottom, left side, then right side + + { MP_ROM_QSTR(MP_QSTR_A25), MP_ROM_PTR(&pin_GPIO25) }, + { MP_ROM_QSTR(MP_QSTR_D25), MP_ROM_PTR(&pin_GPIO25) }, + { MP_ROM_QSTR(MP_QSTR_DAC1), MP_ROM_PTR(&pin_GPIO25) }, + + { MP_ROM_QSTR(MP_QSTR_D33), MP_ROM_PTR(&pin_GPIO33) }, + { MP_ROM_QSTR(MP_QSTR_A33), MP_ROM_PTR(&pin_GPIO33) }, + + { MP_ROM_QSTR(MP_QSTR_D22), MP_ROM_PTR(&pin_GPIO22) }, + + { MP_ROM_QSTR(MP_QSTR_D21), MP_ROM_PTR(&pin_GPIO21) }, + + { MP_ROM_QSTR(MP_QSTR_PORTA_SDA), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_A26), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_D26), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_DAC2), MP_ROM_PTR(&pin_GPIO25) }, + + { MP_ROM_QSTR(MP_QSTR_PORTA_SCL), MP_ROM_PTR(&pin_GPIO32) }, + { MP_ROM_QSTR(MP_QSTR_A32), MP_ROM_PTR(&pin_GPIO32) }, + { MP_ROM_QSTR(MP_QSTR_D32), MP_ROM_PTR(&pin_GPIO32) }, + + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO27) }, + + { MP_ROM_QSTR(MP_QSTR_BTN), MP_ROM_PTR(&pin_GPIO39) }, + + { MP_ROM_QSTR(MP_QSTR_IR_LED), MP_ROM_PTR(&pin_GPIO12) }, + + { MP_ROM_QSTR(MP_QSTR_PDM_MIC_CLK), MP_ROM_PTR(&pin_GPIO5) }, + + { MP_ROM_QSTR(MP_QSTR_PDM_MIC_DATA), MP_ROM_PTR(&pin_GPIO19) }, + + { MP_ROM_QSTR(MP_QSTR_PORTA_I2C), MP_ROM_PTR(&board_i2c_obj) }, + +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/espressif/boards/m5stack_atom_u/sdkconfig b/ports/espressif/boards/m5stack_atom_u/sdkconfig new file mode 100644 index 0000000000..90c99459a8 --- /dev/null +++ b/ports/espressif/boards/m5stack_atom_u/sdkconfig @@ -0,0 +1,26 @@ +CONFIG_ESP32_SPIRAM_SUPPORT=n + +# CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY is not set +# +# LWIP +# +CONFIG_LWIP_LOCAL_HOSTNAME="M5StaskAtomU" +# end of LWIP + +# Uncomment (remove ###) to send ESP_LOG output to TX/RX pins +### # +### # ESP System Settings +### # +### CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT=y +### # CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set +### CONFIG_ESP_CONSOLE_UART_CUSTOM=y +### CONFIG_ESP_CONSOLE_NONE is not set +### CONFIG_ESP_CONSOLE_UART=y +### CONFIG_ESP_CONSOLE_UART_CUSTOM_NUM_0=y +### # CONFIG_ESP_CONSOLE_UART_CUSTOM_NUM_1 is not set +### CONFIG_ESP_CONSOLE_UART_NUM=0 +### CONFIG_ESP_CONSOLE_UART_TX_GPIO=17 +### CONFIG_ESP_CONSOLE_UART_RX_GPIO=16 +### CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200 +### # CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5 is not set +### # end of ESP System Settings diff --git a/ports/espressif/boards/microdev_micro_c3/sdkconfig b/ports/espressif/boards/microdev_micro_c3/sdkconfig index 6674dbfb90..f6f038a77c 100644 --- a/ports/espressif/boards/microdev_micro_c3/sdkconfig +++ b/ports/espressif/boards/microdev_micro_c3/sdkconfig @@ -1,70 +1,5 @@ -# Automatically generated file. DO NOT EDIT. -# Espressif IoT Development Framework (ESP-IDF) Project Configuration -# -# Bootloader config -# -CONFIG_BOOTLOADER_LOG_LEVEL_NONE=y -# CONFIG_BOOTLOADER_LOG_LEVEL_INFO is not set -CONFIG_BOOTLOADER_LOG_LEVEL=0 -# end of Bootloader config - -# -# Serial flasher config -# -# CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set -# end of Serial flasher config - -# -# Partition Table -# -CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="esp-idf-config/partitions-4MB-no-uf2.csv" -CONFIG_PARTITION_TABLE_FILENAME="esp-idf-config/partitions-4MB-no-uf2.csv" -# end of Partition Table - -# -# Compiler options -# -# CONFIG_COMPILER_SAVE_RESTORE_LIBCALLS is not set -# end of Compiler options - -# -# Component config -# -# - -# -# PHY -# -CONFIG_ESP_PHY_ENABLE_USB=y -# end of PHY - -# -# ESP System Settings -# -# CONFIG_ESP_SYSTEM_USE_EH_FRAME is not set -CONFIG_ESP_CONSOLE_SECONDARY_NONE=y -# CONFIG_ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG is not set -# CONFIG_ESP_DEBUG_STUBS_ENABLE is not set -# end of ESP System Settings - # # LWIP # CONFIG_LWIP_LOCAL_HOSTNAME="MicroDev-microC3" # end of LWIP - -# -# SPI Flash driver -# -# CONFIG_SPI_FLASH_AUTO_SUSPEND is not set -# end of SPI Flash driver - -# end of Component config - -# -# Deprecated options for backward compatibility -# -# CONFIG_LOG_BOOTLOADER_LEVEL_INFO is not set -CONFIG_LOG_BOOTLOADER_LEVEL=0 -# CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG is not set -# end of Deprecated options for backward compatibility diff --git a/ports/espressif/common-hal/_bleio/Adapter.c b/ports/espressif/common-hal/_bleio/Adapter.c index 5eaf6e9cf4..3239c501cc 100644 --- a/ports/espressif/common-hal/_bleio/Adapter.c +++ b/ports/espressif/common-hal/_bleio/Adapter.c @@ -59,8 +59,8 @@ #include "esp_bt.h" #include "esp_nimble_hci.h" -#if CIRCUITPY_DOTENV -#include "shared-module/dotenv/__init__.h" +#if CIRCUITPY_OS_GETENV +#include "shared-module/os/__init__.h" #endif bleio_connection_internal_t bleio_connections[BLEIO_TOTAL_CONNECTION_COUNT]; @@ -101,22 +101,16 @@ void common_hal_bleio_adapter_set_enabled(bleio_adapter_obj_t *self, bool enable ble_hs_cfg.sync_cb = _on_sync; // ble_hs_cfg.store_status_cb = ble_store_util_status_rr; - #if CIRCUITPY_DOTENV - mp_int_t name_len = 0; - char ble_name[32]; - name_len = dotenv_get_key("/.env", "CIRCUITPY_BLE_NAME", ble_name, sizeof(ble_name) - 1); - if (name_len > 0) { - if (name_len > MYNEWT_VAL_BLE_SVC_GAP_DEVICE_NAME_MAX_LENGTH) { - name_len = MYNEWT_VAL_BLE_SVC_GAP_DEVICE_NAME_MAX_LENGTH; - } - ble_name[name_len] = '\0'; + #if CIRCUITPY_OS_GETENV + char ble_name[1 + MYNEWT_VAL_BLE_SVC_GAP_DEVICE_NAME_MAX_LENGTH]; + os_getenv_err_t result = common_hal_os_getenv_str("CIRCUITPY_BLE_NAME", ble_name, sizeof(ble_name)); + if (result == GETENV_OK) { ble_svc_gap_device_name_set(ble_name); - } else { + } else + #endif + { ble_svc_gap_device_name_set("CIRCUITPY"); } - #else - ble_svc_gap_device_name_set("CIRCUITPY"); - #endif // Clear all of the internal connection objects. for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) { diff --git a/ports/espressif/common-hal/alarm/__init__.c b/ports/espressif/common-hal/alarm/__init__.c index 02ce3e1082..574fab0151 100644 --- a/ports/espressif/common-hal/alarm/__init__.c +++ b/ports/espressif/common-hal/alarm/__init__.c @@ -35,11 +35,14 @@ #include "shared-bindings/alarm/pin/PinAlarm.h" #include "shared-bindings/alarm/time/TimeAlarm.h" #include "shared-bindings/alarm/touch/TouchAlarm.h" -#include "shared-bindings/alarm/coproc/CoprocAlarm.h" #include "shared-bindings/wifi/__init__.h" #include "shared-bindings/microcontroller/__init__.h" +#if CIRCUITPY_ESPULP +#include "bindings/espulp/ULPAlarm.h" +#endif + #include "common-hal/digitalio/DigitalInOut.h" #include "supervisor/port.h" @@ -67,7 +70,9 @@ void alarm_reset(void) { alarm_pin_pinalarm_reset(); alarm_time_timealarm_reset(); alarm_touch_touchalarm_reset(); - alarm_coproc_coprocalarm_reset(); + #if CIRCUITPY_ESPULP + espulp_ulpalarm_reset(); + #endif esp_sleep_disable_wakeup_source(ESP_SLEEP_WAKEUP_ALL); } @@ -82,9 +87,11 @@ STATIC esp_sleep_wakeup_cause_t _get_wakeup_cause(void) { if (alarm_touch_touchalarm_woke_this_cycle()) { return ESP_SLEEP_WAKEUP_TOUCHPAD; } - if (alarm_coproc_coprocalarm_woke_this_cycle()) { + #if CIRCUITPY_ESPULP + if (espulp_ulpalarm_woke_this_cycle()) { return ESP_SLEEP_WAKEUP_ULP; } + #endif // If waking from true deep sleep, modules will have lost their state, // so check the deep wakeup cause manually return esp_sleep_get_wakeup_cause(); @@ -113,9 +120,11 @@ mp_obj_t common_hal_alarm_record_wake_alarm(void) { return alarm_touch_touchalarm_record_wake_alarm(); } + #if CIRCUITPY_ESPULP case ESP_SLEEP_WAKEUP_ULP: { - return alarm_coproc_coprocalarm_record_wake_alarm(); + return espulp_ulpalarm_record_wake_alarm(); } + #endif case ESP_SLEEP_WAKEUP_UNDEFINED: default: @@ -130,7 +139,9 @@ STATIC void _setup_sleep_alarms(bool deep_sleep, size_t n_alarms, const mp_obj_t alarm_pin_pinalarm_set_alarms(deep_sleep, n_alarms, alarms); alarm_time_timealarm_set_alarms(deep_sleep, n_alarms, alarms); alarm_touch_touchalarm_set_alarm(deep_sleep, n_alarms, alarms); - alarm_coproc_coprocalarm_set_alarm(deep_sleep, n_alarms, alarms); + #if CIRCUITPY_ESPULP + espulp_ulpalarm_set_alarm(deep_sleep, n_alarms, alarms); + #endif } mp_obj_t common_hal_alarm_light_sleep_until_alarms(size_t n_alarms, const mp_obj_t *alarms) { @@ -157,10 +168,12 @@ mp_obj_t common_hal_alarm_light_sleep_until_alarms(size_t n_alarms, const mp_obj wake_alarm = alarm_touch_touchalarm_find_triggered_alarm(n_alarms,alarms); break; } + #if CIRCUITPY_ESPULP case ESP_SLEEP_WAKEUP_ULP: { - wake_alarm = alarm_coproc_coprocalarm_find_triggered_alarm(n_alarms,alarms); + wake_alarm = espulp_ulpalarm_find_triggered_alarm(n_alarms,alarms); break; } + #endif default: // Should not reach this, if all light sleep types are covered correctly break; @@ -187,7 +200,9 @@ void common_hal_alarm_set_deep_sleep_alarms(size_t n_alarms, const mp_obj_t *ala void NORETURN common_hal_alarm_enter_deep_sleep(void) { alarm_pin_pinalarm_prepare_for_deep_sleep(); alarm_touch_touchalarm_prepare_for_deep_sleep(); - alarm_coproc_coprocalarm_prepare_for_deep_sleep(); + #if CIRCUITPY_ESPULP + espulp_ulpalarm_prepare_for_deep_sleep(); + #endif // We no longer need to remember the pin preservations, since any pin resets are all done. clear_pin_preservations(); diff --git a/ports/espressif/common-hal/alarm/__init__.h b/ports/espressif/common-hal/alarm/__init__.h index 9f762f9c00..02e27e9806 100644 --- a/ports/espressif/common-hal/alarm/__init__.h +++ b/ports/espressif/common-hal/alarm/__init__.h @@ -27,13 +27,18 @@ #pragma once #include "common-hal/alarm/SleepMemory.h" -#include "common-hal/alarm/coproc/CoprocAlarm.h" #include "common-hal/alarm/pin/PinAlarm.h" #include "common-hal/alarm/time/TimeAlarm.h" #include "common-hal/alarm/touch/TouchAlarm.h" +#if CIRCUITPY_ESPULP +#include "common-hal/espulp/ULPAlarm.h" +#endif + typedef union { - alarm_coproc_coprocalarm_obj_t coproc_alarm; + #if CIRCUITPY_ESPULP + espulp_ulpalarm_obj_t ulp_alarm; + #endif alarm_pin_pinalarm_obj_t pin_alarm; alarm_time_timealarm_obj_t time_alarm; alarm_touch_touchalarm_obj_t touch_alarm; diff --git a/ports/espressif/common-hal/alarm/coproc/CoprocAlarm.c b/ports/espressif/common-hal/alarm/coproc/CoprocAlarm.c deleted file mode 100644 index 9ee187d27c..0000000000 --- a/ports/espressif/common-hal/alarm/coproc/CoprocAlarm.c +++ /dev/null @@ -1,132 +0,0 @@ -/* - * This file is part of the MicroPython project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2022 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/alarm/__init__.h" -#include "shared-bindings/alarm/coproc/CoprocAlarm.h" -#include "shared-bindings/coproc/__init__.h" - -#if CIRCUITPY_COPROC - -#include "supervisor/port.h" - -#include "driver/rtc_cntl.h" -#include "soc/rtc_cntl_reg.h" - -#include "esp_sleep.h" - -static volatile bool woke_up = false; - -mp_obj_t alarm_coproc_coprocalarm_find_triggered_alarm(const size_t n_alarms, const mp_obj_t *alarms) { - for (size_t i = 0; i < n_alarms; i++) { - if (mp_obj_is_type(alarms[i], &alarm_coproc_coprocalarm_type)) { - return alarms[i]; - } - } - return mp_const_none; -} - -mp_obj_t alarm_coproc_coprocalarm_record_wake_alarm(void) { - alarm_coproc_coprocalarm_obj_t *const alarm = &alarm_wake_alarm.coproc_alarm; - - alarm->base.type = &alarm_coproc_coprocalarm_type; - return alarm; -} - -// This is used to wake the main CircuitPython task. -STATIC void coproc_interrupt(void *arg) { - (void)arg; - woke_up = true; - port_wake_main_task_from_isr(); -} - -void alarm_coproc_coprocalarm_set_alarm(const bool deep_sleep, const size_t n_alarms, const mp_obj_t *alarms) { - bool coproc_alarm_set = false; - alarm_coproc_coprocalarm_obj_t *coproc_alarm = MP_OBJ_NULL; - - for (size_t i = 0; i < n_alarms; i++) { - if (mp_obj_is_type(alarms[i], &alarm_coproc_coprocalarm_type)) { - if (deep_sleep && coproc_alarm_set) { - mp_raise_ValueError_varg(translate("Only one %q can be set in deep sleep."), MP_QSTR_CoprocAlarm); - } - coproc_alarm = MP_OBJ_TO_PTR(alarms[i]); - coproc_alarm_set = true; - } - } - - if (!coproc_alarm_set) { - return; - } - - // enable coproc interrupt - rtc_isr_register(&coproc_interrupt, NULL, RTC_CNTL_COCPU_INT_ST); - REG_SET_BIT(RTC_CNTL_INT_ENA_REG, RTC_CNTL_COCPU_INT_ENA); - - // start coproc program - common_hal_coproc_run(coproc_alarm->coproc); -} - -void alarm_coproc_coprocalarm_prepare_for_deep_sleep(void) { - // disbale coproc interrupt - rtc_isr_deregister(&coproc_interrupt, NULL); - REG_CLR_BIT(RTC_CNTL_INT_ENA_REG, RTC_CNTL_COCPU_INT_ENA); - - // enable coproc wakeup - esp_sleep_enable_ulp_wakeup(); - esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_ON); -} - -bool alarm_coproc_coprocalarm_woke_this_cycle(void) { - return woke_up; -} - -void alarm_coproc_coprocalarm_reset(void) { - woke_up = false; -} - -#else // CIRCUITPY_COPROC - -mp_obj_t alarm_coproc_coprocalarm_find_triggered_alarm(const size_t n_alarms, const mp_obj_t *alarms) { - return mp_const_none; -} - -mp_obj_t alarm_coproc_coprocalarm_record_wake_alarm(void) { - return mp_const_none; -} - -void alarm_coproc_coprocalarm_set_alarm(const bool deep_sleep, const size_t n_alarms, const mp_obj_t *alarms) { -} - -void alarm_coproc_coprocalarm_prepare_for_deep_sleep(void) { -} - -bool alarm_coproc_coprocalarm_woke_this_cycle(void) { - return false; -} - -void alarm_coproc_coprocalarm_reset(void) { -} - -#endif // CIRCUITPY_COPROC diff --git a/ports/espressif/common-hal/busio/UART.c b/ports/espressif/common-hal/busio/UART.c index cdaf25250f..f025c15b3e 100644 --- a/ports/espressif/common-hal/busio/UART.c +++ b/ports/espressif/common-hal/busio/UART.c @@ -49,8 +49,9 @@ static void uart_event_task(void *param) { while (true) { if (xQueueReceive(self->event_queue, &event, portMAX_DELAY)) { switch (event.type) { + case UART_BREAK: case UART_PATTERN_DET: - // When the console uart receives CTRL+C, wake the main task and schedule a keyboard interrupt + // When the console uart receives CTRL+C or BREAK, wake the main task and schedule a keyboard interrupt if (self->is_console) { port_wake_main_task(); if (mp_interrupt_char == CHAR_CTRL_C) { diff --git a/ports/espressif/common-hal/coproc/Coproc.c b/ports/espressif/common-hal/coproc/Coproc.c deleted file mode 100644 index c2115c1e94..0000000000 --- a/ports/espressif/common-hal/coproc/Coproc.c +++ /dev/null @@ -1,73 +0,0 @@ -/* - * This file is part of the Micro Python project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2022 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/coproc/Coproc.h" -#include "shared-bindings/coproc/CoprocMemory.h" - -#include "py/runtime.h" - -#if defined(CONFIG_IDF_TARGET_ESP32S2) -#include "esp32s2/ulp.h" -#define ULP_COPROC_RESERVE_MEM (CONFIG_ESP32S2_ULP_COPROC_RESERVE_MEM) -#elif defined(CONFIG_IDF_TARGET_ESP32S3) -#include "esp32s3/ulp.h" -#define ULP_COPROC_RESERVE_MEM (CONFIG_ESP32S3_ULP_COPROC_RESERVE_MEM) -#endif - -#define RTC_SLOW_MEM_END ((uint32_t)RTC_SLOW_MEM + ULP_COPROC_RESERVE_MEM) - -void common_hal_coproc_coproc_construct(coproc_coproc_obj_t *self, - const uint8_t *buf, const size_t buf_len, coproc_memory_obj_t *coproc_memory) { - // set CoprocMemory object - if (coproc_memory != NULL) { - if (coproc_memory->address < ((uint32_t)RTC_SLOW_MEM + buf_len) || - coproc_memory->address > (RTC_SLOW_MEM_END - coproc_memory->len)) { - mp_raise_ValueError_varg(translate("%q out of range"), MP_QSTR_CoprocMemory); - } - } - self->coproc_memory = coproc_memory; - - // load buffer - if (buf_len > ULP_COPROC_RESERVE_MEM) { - mp_raise_RuntimeError(translate("Firmware is too big")); - } - self->buf_len = buf_len; - self->buf = (uint8_t *)m_malloc(self->buf_len, false); - memcpy(self->buf, buf, self->buf_len); -} - -bool common_hal_coproc_coproc_deinited(coproc_coproc_obj_t *self) { - return self->buf == NULL; -} - -void common_hal_coproc_coproc_deinit(coproc_coproc_obj_t *self) { - if (common_hal_coproc_coproc_deinited(self)) { - return; - } - m_free(self->buf); - self->buf = NULL; - self->coproc_memory = NULL; -} diff --git a/ports/espressif/common-hal/coproc/CoprocMemory.c b/ports/espressif/common-hal/coproc/CoprocMemory.c deleted file mode 100644 index ca9a82dbcf..0000000000 --- a/ports/espressif/common-hal/coproc/CoprocMemory.c +++ /dev/null @@ -1,52 +0,0 @@ -/* - * This file is part of the Micro Python project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2022 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/coproc/CoprocMemory.h" - -uint32_t common_hal_coproc_memory_get_length(coproc_memory_obj_t *self) { - return self->len; -} - -bool common_hal_coproc_memory_set_bytes(coproc_memory_obj_t *self, - uint32_t start_index, const uint8_t *values, uint32_t len) { - - if (start_index + len > self->len) { - return false; - } - - memcpy((uint8_t *)(self->address + start_index), values, len); - return true; -} - -void common_hal_coproc_memory_get_bytes(coproc_memory_obj_t *self, - uint32_t start_index, uint8_t *values, uint32_t len) { - - if (start_index + len > self->len) { - return; - } - - memcpy(values, (uint8_t *)(self->address + start_index), len); -} diff --git a/ports/espressif/common-hal/coproc/__init__.c b/ports/espressif/common-hal/coproc/__init__.c deleted file mode 100644 index e372bfa235..0000000000 --- a/ports/espressif/common-hal/coproc/__init__.c +++ /dev/null @@ -1,72 +0,0 @@ -/* - * This file is part of the Micro Python project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2022 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/coproc/__init__.h" - -#include "py/runtime.h" - -#if defined(CONFIG_IDF_TARGET_ESP32S2) -#include "esp32s2/ulp.h" -#include "esp32s2/ulp_riscv.h" -#elif defined(CONFIG_IDF_TARGET_ESP32S3) -#include "esp32s3/ulp.h" -#include "esp32s3/ulp_riscv.h" -#endif - -// To-do idf v5.0: remove following include -#include "soc/rtc_cntl_reg.h" - -void common_hal_coproc_run(coproc_coproc_obj_t *self) { - if (GET_PERI_REG_MASK(RTC_CNTL_ULP_CP_TIMER_REG, RTC_CNTL_ULP_CP_SLP_TIMER_EN)) { - mp_raise_RuntimeError(translate("Already running")); - } - - ulp_riscv_load_binary(self->buf, self->buf_len); - m_free(self->buf); - self->buf = (uint8_t *)RTC_SLOW_MEM; - - ulp_riscv_run(); -} - -void common_hal_coproc_halt(coproc_coproc_obj_t *self) { - self->buf = (uint8_t *)m_malloc(self->buf_len, false); - memcpy(self->buf, (uint8_t *)RTC_SLOW_MEM, self->buf_len); - - // To-do idf v5.0: use following functions - // ulp_riscv_timer_stop(); - // ulp_riscv_halt(); - - // stop the ulp timer - CLEAR_PERI_REG_MASK(RTC_CNTL_ULP_CP_TIMER_REG, RTC_CNTL_ULP_CP_SLP_TIMER_EN); - // suspends the ulp operation - SET_PERI_REG_MASK(RTC_CNTL_COCPU_CTRL_REG, RTC_CNTL_COCPU_DONE); - // resets the processor - SET_PERI_REG_MASK(RTC_CNTL_COCPU_CTRL_REG, RTC_CNTL_COCPU_SHUT_RESET_EN); -} - -mp_obj_t common_hal_coproc_memory(coproc_coproc_obj_t *self) { - return (self->coproc_memory) ? MP_OBJ_FROM_PTR(self->coproc_memory) : mp_const_none; -} diff --git a/ports/espressif/common-hal/esp32_camera/Camera.c b/ports/espressif/common-hal/esp32_camera/Camera.c index 65d2d0fbc6..34ad1fbbb9 100644 --- a/ports/espressif/common-hal/esp32_camera/Camera.c +++ b/ports/espressif/common-hal/esp32_camera/Camera.c @@ -85,14 +85,20 @@ void common_hal_esp32_camera_camera_construct( for (int i = 0; i < 8; i++) { claim_pin_number(data_pins[i]); } - claim_pin(external_clock_pin); + maybe_claim_pin(external_clock_pin); claim_pin(pixel_clock_pin); claim_pin(vsync_pin); claim_pin(href_pin); maybe_claim_pin(powerdown_pin); maybe_claim_pin(reset_pin); - common_hal_pwmio_pwmout_construct(&self->pwm, external_clock_pin, 1, external_clock_frequency, true); + if (external_clock_pin) { + common_hal_pwmio_pwmout_construct(&self->pwm, external_clock_pin, 1, external_clock_frequency, true); + self->camera_config.ledc_timer = self->pwm.tim_handle.timer_num; + self->camera_config.ledc_channel = self->pwm.chan_handle.channel; + } else { + self->camera_config.ledc_channel = 0xff; // NO_CAMERA_LEDC_CHANNEL + } self->i2c = i2c; @@ -119,9 +125,6 @@ void common_hal_esp32_camera_camera_construct( self->camera_config.xclk_freq_hz = external_clock_frequency; - self->camera_config.ledc_timer = self->pwm.tim_handle.timer_num; - self->camera_config.ledc_channel = self->pwm.chan_handle.channel; - self->camera_config.pixel_format = pixel_format; self->camera_config.frame_size = frame_size; self->camera_config.jpeg_quality = jpeg_quality; diff --git a/ports/espressif/common-hal/espulp/ULP.c b/ports/espressif/common-hal/espulp/ULP.c new file mode 100644 index 0000000000..4d30a94dfc --- /dev/null +++ b/ports/espressif/common-hal/espulp/ULP.c @@ -0,0 +1,130 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2022 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 "bindings/espulp/__init__.h" +#include "bindings/espulp/ULP.h" + +#include "py/runtime.h" + +#include "shared-bindings/microcontroller/Pin.h" + +#if defined(CONFIG_IDF_TARGET_ESP32S2) +#include "esp32s2/ulp.h" +#include "esp32s2/ulp_riscv.h" +#define ULP_COPROC_RESERVE_MEM (CONFIG_ESP32S2_ULP_COPROC_RESERVE_MEM) +#elif defined(CONFIG_IDF_TARGET_ESP32S3) +#include "esp32s3/ulp.h" +#include "esp32s3/ulp_riscv.h" +#define ULP_COPROC_RESERVE_MEM (CONFIG_ESP32S3_ULP_COPROC_RESERVE_MEM) +#endif + +// To-do idf v5.0: remove following include +#include "soc/rtc_cntl_reg.h" + +STATIC bool ulp_used = false; +STATIC uint32_t pins_used = 0; + +void espulp_reset(void) { + // NOTE: This *doesn't* disable the ULP. It'll keep running even when CircuitPython isn't. + ulp_used = false; +} + +void common_hal_espulp_ulp_run(espulp_ulp_obj_t *self, uint32_t *program, size_t length, uint32_t pin_mask) { + if (length > ULP_COPROC_RESERVE_MEM) { + mp_raise_ValueError(translate("Program too long")); + } + if (GET_PERI_REG_MASK(RTC_CNTL_ULP_CP_TIMER_REG, RTC_CNTL_ULP_CP_SLP_TIMER_EN)) { + mp_raise_RuntimeError(translate("Already running")); + } + + if (pin_mask >= (1 << 22)) { + raise_ValueError_invalid_pin(); + } + + for (uint8_t i = 0; i < 32; i++) { + if ((pin_mask & (1 << i)) != 0 && !pin_number_is_free(i)) { + mp_raise_ValueError_varg(translate("%q in use"), MP_QSTR_Pin); + } + } + + for (uint8_t i = 0; i < 32; i++) { + if ((pin_mask & (1 << i)) != 0) { + claim_pin_number(i); + never_reset_pin_number(i); + } + } + pins_used = pin_mask; + + + ulp_riscv_load_binary((const uint8_t *)program, length); + ulp_set_wakeup_period(0, 20000); + ulp_riscv_run(); +} + +void common_hal_espulp_ulp_halt(espulp_ulp_obj_t *self) { + // To-do idf v5.0: use following functions + // ulp_riscv_timer_stop(); + // ulp_riscv_halt(); + + // stop the ulp timer so that it doesn't restart the cpu + CLEAR_PERI_REG_MASK(RTC_CNTL_ULP_CP_TIMER_REG, RTC_CNTL_ULP_CP_SLP_TIMER_EN); + + // suspends the ulp operation + SET_PERI_REG_MASK(RTC_CNTL_COCPU_CTRL_REG, RTC_CNTL_COCPU_DONE); + + // resets the processor + SET_PERI_REG_MASK(RTC_CNTL_COCPU_CTRL_REG, RTC_CNTL_COCPU_SHUT_RESET_EN); + + // Release pins we were using. + for (uint8_t i = 0; i < 32; i++) { + if ((pins_used & (1 << i)) != 0) { + reset_pin_number(i); + } + } +} + +void common_hal_espulp_ulp_construct(espulp_ulp_obj_t *self) { + // Use a static variable to track ULP in use so that subsequent code runs can + // use a running ULP. This is only to prevent multiple portions of user code + // from using the ULP concurrently. + if (ulp_used) { + mp_raise_ValueError_varg(translate("%q in use"), MP_QSTR_ULP); + } + self->inited = true; +} + +bool common_hal_espulp_ulp_deinited(espulp_ulp_obj_t *self) { + return !self->inited; +} + +void common_hal_espulp_ulp_deinit(espulp_ulp_obj_t *self) { + if (common_hal_espulp_ulp_deinited(self)) { + return; + } + common_hal_espulp_ulp_halt(self); + self->inited = false; + ulp_used = false; +} diff --git a/ports/espressif/common-hal/coproc/CoprocMemory.h b/ports/espressif/common-hal/espulp/ULP.h similarity index 82% rename from ports/espressif/common-hal/coproc/CoprocMemory.h rename to ports/espressif/common-hal/espulp/ULP.h index c4aa088394..f73b21d123 100644 --- a/ports/espressif/common-hal/coproc/CoprocMemory.h +++ b/ports/espressif/common-hal/espulp/ULP.h @@ -24,15 +24,11 @@ * THE SOFTWARE. */ -#ifndef MICROPY_INCLUDED_ESPRESSIF_COMMON_HAL_COPROC_COPROCMEMORY_H -#define MICROPY_INCLUDED_ESPRESSIF_COMMON_HAL_COPROC_COPROCMEMORY_H +#pragma once #include "py/obj.h" typedef struct { mp_obj_base_t base; - uint32_t address; - uint16_t len; -} coproc_memory_obj_t; - -#endif // MICROPY_INCLUDED_ESPRESSIF_COMMON_HAL_COPROC_COPROCMEMORY_H + bool inited; +} espulp_ulp_obj_t; diff --git a/ports/espressif/common-hal/espulp/ULPAlarm.c b/ports/espressif/common-hal/espulp/ULPAlarm.c new file mode 100644 index 0000000000..ec1fb8bc45 --- /dev/null +++ b/ports/espressif/common-hal/espulp/ULPAlarm.c @@ -0,0 +1,110 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2022 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 "bindings/espulp/ULPAlarm.h" + +#include "common-hal/alarm/__init__.h" +#include "supervisor/port.h" + +#include "driver/rtc_cntl.h" +#include "soc/rtc_cntl_reg.h" + +#include "esp_sleep.h" + +static volatile bool woke_up = false; +static bool alarm_set = false; + +void common_hal_espulp_ulpalarm_construct(espulp_ulpalarm_obj_t *self) { + +} + +mp_obj_t espulp_ulpalarm_find_triggered_alarm(const size_t n_alarms, const mp_obj_t *alarms) { + for (size_t i = 0; i < n_alarms; i++) { + if (mp_obj_is_type(alarms[i], &espulp_ulpalarm_type)) { + return alarms[i]; + } + } + return mp_const_none; +} + +mp_obj_t espulp_ulpalarm_record_wake_alarm(void) { + espulp_ulpalarm_obj_t *const alarm = &alarm_wake_alarm.ulp_alarm; + + alarm->base.type = &espulp_ulpalarm_type; + return alarm; +} + +// This is used to wake the main CircuitPython task. +STATIC void ulp_interrupt(void *arg) { + (void)arg; + woke_up = true; + port_wake_main_task_from_isr(); +} + +void espulp_ulpalarm_set_alarm(const bool deep_sleep, const size_t n_alarms, const mp_obj_t *alarms) { + espulp_ulpalarm_obj_t *alarm = MP_OBJ_NULL; + + for (size_t i = 0; i < n_alarms; i++) { + if (mp_obj_is_type(alarms[i], &espulp_ulpalarm_type)) { + if (alarm != MP_OBJ_NULL) { + mp_raise_ValueError_varg(translate("Only one %q can be set."), MP_QSTR_ULPAlarm); + } + alarm = MP_OBJ_TO_PTR(alarms[i]); + } + } + + if (alarm == MP_OBJ_NULL) { + return; + } + + // enable ulp interrupt + rtc_isr_register(&ulp_interrupt, NULL, RTC_CNTL_COCPU_INT_ST); + REG_SET_BIT(RTC_CNTL_INT_ENA_REG, RTC_CNTL_COCPU_INT_ENA); + + alarm_set = true; +} + +void espulp_ulpalarm_prepare_for_deep_sleep(void) { + if (!alarm_set) { + return; + } + // disable ulp interrupt + rtc_isr_deregister(&ulp_interrupt, NULL); + REG_CLR_BIT(RTC_CNTL_INT_ENA_REG, RTC_CNTL_COCPU_INT_ENA); + + // enable ulp wakeup + esp_sleep_enable_ulp_wakeup(); + esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_ON); +} + +bool espulp_ulpalarm_woke_this_cycle(void) { + return woke_up; +} + +void espulp_ulpalarm_reset(void) { + woke_up = false; + alarm_set = false; +} diff --git a/ports/espressif/common-hal/alarm/coproc/CoprocAlarm.h b/ports/espressif/common-hal/espulp/ULPAlarm.h similarity index 71% rename from ports/espressif/common-hal/alarm/coproc/CoprocAlarm.h rename to ports/espressif/common-hal/espulp/ULPAlarm.h index 57a9bcdbff..5d2610c6a3 100644 --- a/ports/espressif/common-hal/alarm/coproc/CoprocAlarm.h +++ b/ports/espressif/common-hal/espulp/ULPAlarm.h @@ -29,17 +29,14 @@ #include "py/obj.h" #include "py/runtime.h" -#include "common-hal/coproc/Coproc.h" - typedef struct { mp_obj_base_t base; - coproc_coproc_obj_t *coproc; -} alarm_coproc_coprocalarm_obj_t; +} espulp_ulpalarm_obj_t; -mp_obj_t alarm_coproc_coprocalarm_find_triggered_alarm(const size_t n_alarms, const mp_obj_t *alarms); -mp_obj_t alarm_coproc_coprocalarm_record_wake_alarm(void); +mp_obj_t espulp_ulpalarm_find_triggered_alarm(const size_t n_alarms, const mp_obj_t *alarms); +mp_obj_t espulp_ulpalarm_record_wake_alarm(void); -void alarm_coproc_coprocalarm_prepare_for_deep_sleep(void); -void alarm_coproc_coprocalarm_reset(void); -void alarm_coproc_coprocalarm_set_alarm(const bool deep_sleep, const size_t n_alarms, const mp_obj_t *alarms); -bool alarm_coproc_coprocalarm_woke_this_cycle(void); +void espulp_ulpalarm_prepare_for_deep_sleep(void); +void espulp_ulpalarm_reset(void); +void espulp_ulpalarm_set_alarm(const bool deep_sleep, const size_t n_alarms, const mp_obj_t *alarms); +bool espulp_ulpalarm_woke_this_cycle(void); diff --git a/ports/espressif/common-hal/espulp/__init__.c b/ports/espressif/common-hal/espulp/__init__.c new file mode 100644 index 0000000000..5d403129a6 --- /dev/null +++ b/ports/espressif/common-hal/espulp/__init__.c @@ -0,0 +1,34 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2022 Scott Shawcroft for Adafruit Industries LLC + * + * 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 "bindings/espulp/__init__.h" + +mp_int_t common_hal_espulp_get_rtc_gpio_number(const mcu_pin_obj_t *pin) { + if (pin->number <= 21) { + return pin->number; + } + return -1; +} diff --git a/ports/espressif/common-hal/memorymap/AddressRange.c b/ports/espressif/common-hal/memorymap/AddressRange.c new file mode 100644 index 0000000000..ed46c159bb --- /dev/null +++ b/ports/espressif/common-hal/memorymap/AddressRange.c @@ -0,0 +1,107 @@ +/* + * 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 + +#include "shared-bindings/memorymap/AddressRange.h" + +#include "py/runtime.h" + +#include "soc/soc.h" + +size_t allow_ranges[][2] = { + // ULP accessible RAM + {SOC_RTC_DATA_LOW, SOC_RTC_DATA_HIGH}, + // CPU accessible RAM that is preserved during sleep if the RTC power domain is left on. + {SOC_RTC_DRAM_LOW, SOC_RTC_DRAM_HIGH}, + // RTC peripheral registers + {0x60008000, 0x60009000} + +}; + +void common_hal_memorymap_addressrange_construct(memorymap_addressrange_obj_t *self, uint8_t *start_address, size_t length) { + bool allowed = false; + for (size_t i = 0; i < MP_ARRAY_SIZE(allow_ranges); i++) { + uint8_t *allowed_start = (uint8_t *)allow_ranges[i][0]; + uint8_t *allowed_end = (uint8_t *)allow_ranges[i][1]; + if (allowed_start <= start_address && + (start_address + length) <= allowed_end) { + allowed = true; + break; + } + } + + if (!allowed) { + mp_raise_ValueError(translate("Address range not allowed")); + } + + self->start_address = start_address; + self->len = length; +} + +size_t common_hal_memorymap_addressrange_get_length(const memorymap_addressrange_obj_t *self) { + return self->len; +} + +bool common_hal_memorymap_addressrange_set_bytes(const memorymap_addressrange_obj_t *self, + size_t start_index, uint8_t *values, size_t len) { + uint8_t *address = self->start_address + start_index; + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wcast-align" + if (len == 1) { + *((uint8_t *)address) = values[0]; + } else if (len == sizeof(uint16_t) && (((size_t)address) % sizeof(uint16_t)) == 0) { + *((uint16_t *)address) = ((uint16_t *)values)[0]; + } else if (len == sizeof(uint32_t) && (((size_t)address) % sizeof(uint32_t)) == 0) { + *((uint32_t *)address) = ((uint32_t *)values)[0]; + } else if (len == sizeof(uint64_t) && (((size_t)address) % sizeof(uint64_t)) == 0) { + *((uint64_t *)address) = ((uint64_t *)values)[0]; + } else { + memcpy(address, values, len); + } + #pragma GCC diagnostic pop + + return true; +} + +void common_hal_memorymap_addressrange_get_bytes(const memorymap_addressrange_obj_t *self, + size_t start_index, size_t len, uint8_t *values) { + uint8_t *address = self->start_address + start_index; + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wcast-align" + if (len == 1) { + values[0] = *((uint8_t *)address); + } else if (len == sizeof(uint16_t) && (((size_t)address) % sizeof(uint16_t)) == 0) { + ((uint16_t *)values)[0] = *((uint16_t *)address); + } else if (len == sizeof(uint32_t) && (((size_t)address) % sizeof(uint32_t)) == 0) { + ((uint32_t *)values)[0] = *((uint32_t *)address); + } else if (len == sizeof(uint64_t) && (((size_t)address) % sizeof(uint64_t)) == 0) { + ((uint64_t *)values)[0] = *((uint64_t *)address); + } else { + memcpy(values, address, len); + } + #pragma GCC diagnostic pop +} diff --git a/ports/espressif/common-hal/memorymap/AddressRange.h b/ports/espressif/common-hal/memorymap/AddressRange.h new file mode 100644 index 0000000000..e67cf32f5f --- /dev/null +++ b/ports/espressif/common-hal/memorymap/AddressRange.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_ESPRESSIF_COMMON_HAL_MEMORYMAP_ADDRESSRANGE_H +#define MICROPY_INCLUDED_ESPRESSIF_COMMON_HAL_MEMORYMAP_ADDRESSRANGE_H + +#include "py/obj.h" + +typedef struct { + mp_obj_base_t base; + uint8_t *start_address; + size_t len; +} memorymap_addressrange_obj_t; + +#endif // MICROPY_INCLUDED_ESPRESSIF_COMMON_HAL_MEMORYMAP_ADDRESSRANGE_H diff --git a/ports/espressif/common-hal/memorymap/__init__.c b/ports/espressif/common-hal/memorymap/__init__.c new file mode 100644 index 0000000000..c15b17f451 --- /dev/null +++ b/ports/espressif/common-hal/memorymap/__init__.c @@ -0,0 +1 @@ +// No memorymap module functions. diff --git a/ports/espressif/common-hal/microcontroller/Processor.c b/ports/espressif/common-hal/microcontroller/Processor.c index bacc48c07b..1f09742955 100644 --- a/ports/espressif/common-hal/microcontroller/Processor.c +++ b/ports/espressif/common-hal/microcontroller/Processor.c @@ -139,6 +139,7 @@ mcu_reset_reason_t common_hal_mcu_processor_get_reset_reason(void) { case ESP_SLEEP_WAKEUP_EXT0: case ESP_SLEEP_WAKEUP_EXT1: case ESP_SLEEP_WAKEUP_TOUCHPAD: + case ESP_SLEEP_WAKEUP_ULP: return RESET_REASON_DEEP_SLEEP_ALARM; case ESP_SLEEP_WAKEUP_UNDEFINED: diff --git a/ports/espressif/common-hal/pulseio/PulseIn.c b/ports/espressif/common-hal/pulseio/PulseIn.c index 41c1dcb189..bb6ef7f975 100644 --- a/ports/espressif/common-hal/pulseio/PulseIn.c +++ b/ports/espressif/common-hal/pulseio/PulseIn.c @@ -41,7 +41,12 @@ STATIC void update_internal_buffer(pulseio_pulsein_obj_t *self) { length /= 4; for (size_t i = 0; i < length; i++) { uint16_t pos = (self->start + self->len) % self->maxlen; - self->buffer[pos] = items[i].duration0 * 3; + uint32_t val = items[i].duration0 * 3; + // make sure the value returned does not exceed the max uint16 value. + if (val > 65535) { + val = 65535; + } + self->buffer[pos] = (uint16_t)val; if (self->len < self->maxlen) { self->len++; } else { @@ -50,7 +55,11 @@ STATIC void update_internal_buffer(pulseio_pulsein_obj_t *self) { // Check if second item exists if (items[i].duration1) { pos = (self->start + self->len) % self->maxlen; - self->buffer[pos] = items[i].duration1 * 3; + val = items[i].duration1 * 3; + if (val > 65535) { + val = 65535; + } + self->buffer[pos] = (uint16_t)val; if (self->len < self->maxlen) { self->len++; } else { diff --git a/ports/espressif/common-hal/pwmio/PWMOut.c b/ports/espressif/common-hal/pwmio/PWMOut.c index d83ce6590a..68518fbd25 100644 --- a/ports/espressif/common-hal/pwmio/PWMOut.c +++ b/ports/espressif/common-hal/pwmio/PWMOut.c @@ -166,7 +166,20 @@ void common_hal_pwmio_pwmout_never_reset(pwmio_pwmout_obj_t *self) { void common_hal_pwmio_pwmout_reset_ok(pwmio_pwmout_obj_t *self) { never_reset_tim[self->tim_handle.timer_num] = false; - never_reset_chan[self->chan_handle.channel] = false; + // Search if any other channel is using the timer and is never reset. + // Otherwise, we clear never_reset for the timer as well. + bool other_never_reset = false; + for (size_t i = 0; i < LEDC_CHANNEL_MAX; i++) { + if (i != self->chan_handle.channel && + reserved_channels[i] == self->tim_handle.timer_num && + never_reset_chan[i]) { + other_never_reset = true; + break; + } + } + if (!other_never_reset) { + never_reset_chan[self->chan_handle.channel] = false; + } } bool common_hal_pwmio_pwmout_deinited(pwmio_pwmout_obj_t *self) { @@ -182,11 +195,13 @@ void common_hal_pwmio_pwmout_deinit(pwmio_pwmout_obj_t *self) { ledc_stop(LEDC_LOW_SPEED_MODE, self->chan_handle.channel, 0); } reserved_channels[self->chan_handle.channel] = INDEX_EMPTY; + never_reset_chan[self->chan_handle.channel] = false; // Search if any other channel is using the timer bool taken = false; for (size_t i = 0; i < LEDC_CHANNEL_MAX; i++) { if (reserved_channels[i] == self->tim_handle.timer_num) { taken = true; + break; } } // Variable frequency means there's only one channel on the timer @@ -195,6 +210,7 @@ void common_hal_pwmio_pwmout_deinit(pwmio_pwmout_obj_t *self) { reserved_timer_freq[self->tim_handle.timer_num] = 0; // if timer isn't varfreq this will be off aleady varfreq_timers[self->tim_handle.timer_num] = false; + never_reset_tim[self->tim_handle.timer_num] = false; } common_hal_reset_pin(self->pin); self->deinited = true; diff --git a/ports/espressif/common-hal/socketpool/Socket.c b/ports/espressif/common-hal/socketpool/Socket.c index ce177f3821..ccb01116d8 100644 --- a/ports/espressif/common-hal/socketpool/Socket.c +++ b/ports/espressif/common-hal/socketpool/Socket.c @@ -31,6 +31,8 @@ #include "py/mperrno.h" #include "py/runtime.h" #include "shared-bindings/socketpool/SocketPool.h" +#include "shared-bindings/ssl/SSLSocket.h" +#include "common-hal/ssl/SSLSocket.h" #include "supervisor/port.h" #include "supervisor/shared/tick.h" #include "supervisor/workflow.h" @@ -44,7 +46,7 @@ StackType_t socket_select_stack[2 * configMINIMAL_STACK_SIZE]; STATIC int open_socket_fds[CONFIG_LWIP_MAX_SOCKETS]; -STATIC bool user_socket[CONFIG_LWIP_MAX_SOCKETS]; +STATIC socketpool_socket_obj_t *user_socket[CONFIG_LWIP_MAX_SOCKETS]; StaticTask_t socket_select_task_handle; STATIC int socket_change_fd = -1; @@ -117,7 +119,7 @@ void socket_user_reset(void) { for (size_t i = 0; i < MP_ARRAY_SIZE(open_socket_fds); i++) { open_socket_fds[i] = -1; - user_socket[i] = false; + user_socket[i] = NULL; } socket_change_fd = eventfd(0, 0); // Run this at the same priority as CP so that the web workflow background task can be @@ -134,12 +136,13 @@ void socket_user_reset(void) { for (size_t i = 0; i < MP_ARRAY_SIZE(open_socket_fds); i++) { if (open_socket_fds[i] >= 0 && user_socket[i]) { + common_hal_socketpool_socket_close(user_socket[i]); int num = open_socket_fds[i]; // Close automatically clears socket handle lwip_shutdown(num, SHUT_RDWR); lwip_close(num); open_socket_fds[i] = -1; - user_socket[i] = false; + user_socket[i] = NULL; } } } @@ -171,10 +174,10 @@ STATIC void unregister_open_socket(int fd) { } } -STATIC void mark_user_socket(int fd) { +STATIC void mark_user_socket(int fd, socketpool_socket_obj_t *obj) { for (size_t i = 0; i < MP_ARRAY_SIZE(open_socket_fds); i++) { if (open_socket_fds[i] == fd) { - user_socket[i] = true; + user_socket[i] = obj; return; } } @@ -236,11 +239,11 @@ socketpool_socket_obj_t *common_hal_socketpool_socket(socketpool_socketpool_obj_ if (!socketpool_socket(self, family, type, sock)) { mp_raise_RuntimeError(translate("Out of sockets")); } - mark_user_socket(sock->num); + mark_user_socket(sock->num, sock); return sock; } -int socketpool_socket_accept(socketpool_socket_obj_t *self, uint8_t *ip, uint32_t *port) { +int socketpool_socket_accept(socketpool_socket_obj_t *self, uint8_t *ip, uint32_t *port, socketpool_socket_obj_t *accepted) { struct sockaddr_in accept_addr; socklen_t socklen = sizeof(accept_addr); int newsoc = -1; @@ -274,23 +277,36 @@ int socketpool_socket_accept(socketpool_socket_obj_t *self, uint8_t *ip, uint32_ lwip_close(newsoc); return -MP_EBADF; } + + + if (accepted != NULL) { + // Close the active socket because we have another we accepted. + if (!common_hal_socketpool_socket_get_closed(accepted)) { + common_hal_socketpool_socket_close(accepted); + } + // Create the socket + accepted->num = newsoc; + accepted->pool = self->pool; + accepted->connected = true; + lwip_fcntl(newsoc, F_SETFL, O_NONBLOCK); + } + return newsoc; } socketpool_socket_obj_t *common_hal_socketpool_socket_accept(socketpool_socket_obj_t *self, uint8_t *ip, uint32_t *port) { - int newsoc = socketpool_socket_accept(self, ip, port); + socketpool_socket_obj_t *sock = m_new_obj_with_finaliser(socketpool_socket_obj_t); + int newsoc = socketpool_socket_accept(self, ip, port, NULL); if (newsoc > 0) { - mark_user_socket(newsoc); // Create the socket - socketpool_socket_obj_t *sock = m_new_obj_with_finaliser(socketpool_socket_obj_t); + mark_user_socket(newsoc, sock); sock->base.type = &socketpool_socket_type; sock->num = newsoc; sock->pool = self->pool; sock->connected = true; - lwip_fcntl(newsoc, F_SETFL, O_NONBLOCK); return sock; } else { mp_raise_OSError(-newsoc); @@ -325,6 +341,12 @@ bool common_hal_socketpool_socket_bind(socketpool_socket_obj_t *self, } void socketpool_socket_close(socketpool_socket_obj_t *self) { + if (self->ssl_socket) { + ssl_sslsocket_obj_t *ssl_socket = self->ssl_socket; + self->ssl_socket = NULL; + common_hal_ssl_sslsocket_close(ssl_socket); + return; + } self->connected = false; if (self->num >= 0) { lwip_shutdown(self->num, SHUT_RDWR); @@ -347,7 +369,7 @@ void common_hal_socketpool_socket_connect(socketpool_socket_obj_t *self, struct addrinfo *result_i; int error = lwip_getaddrinfo(host, NULL, &hints, &result_i); if (error != 0 || result_i == NULL) { - mp_raise_OSError(EHOSTUNREACH); + common_hal_socketpool_socketpool_raise_gaierror_noname(); } // Set parameters @@ -528,7 +550,7 @@ mp_uint_t common_hal_socketpool_socket_sendto(socketpool_socket_obj_t *self, struct addrinfo *result_i; int error = lwip_getaddrinfo(host, NULL, &hints, &result_i); if (error != 0 || result_i == NULL) { - mp_raise_OSError(EHOSTUNREACH); + common_hal_socketpool_socketpool_raise_gaierror_noname(); } // Set parameters @@ -554,6 +576,15 @@ void common_hal_socketpool_socket_settimeout(socketpool_socket_obj_t *self, uint self->timeout_ms = timeout_ms; } + +int common_hal_socketpool_socket_setsockopt(socketpool_socket_obj_t *self, int level, int optname, const void *value, size_t optlen) { + int err = lwip_setsockopt(self->num, level, optname, value, optlen); + if (err != 0) { + return -errno; + } + return 0; +} + bool common_hal_socketpool_readable(socketpool_socket_obj_t *self) { struct timeval immediate = {0, 0}; @@ -577,3 +608,18 @@ bool common_hal_socketpool_writable(socketpool_socket_obj_t *self) { // including returning true in the error case return num_triggered != 0; } + +void socketpool_socket_move(socketpool_socket_obj_t *self, socketpool_socket_obj_t *sock) { + *sock = *self; + self->connected = false; + self->num = -1; +} + +void socketpool_socket_reset(socketpool_socket_obj_t *self) { + if (self->base.type == &socketpool_socket_type) { + return; + } + self->base.type = &socketpool_socket_type; + self->connected = false; + self->num = -1; +} diff --git a/ports/espressif/common-hal/socketpool/Socket.h b/ports/espressif/common-hal/socketpool/Socket.h index b91419807c..45e36e58ca 100644 --- a/ports/espressif/common-hal/socketpool/Socket.h +++ b/ports/espressif/common-hal/socketpool/Socket.h @@ -24,8 +24,7 @@ * THE SOFTWARE. */ -#ifndef MICROPY_INCLUDED_ESPRESSIF_COMMON_HAL_SOCKETPOOL_SOCKET_H -#define MICROPY_INCLUDED_ESPRESSIF_COMMON_HAL_SOCKETPOOL_SOCKET_H +#pragma once #include "py/obj.h" @@ -34,6 +33,8 @@ #include "components/esp-tls/esp_tls.h" +typedef struct ssl_sslsocket_obj ssl_sslsocket_obj_t; + typedef struct { mp_obj_base_t base; int num; @@ -42,9 +43,8 @@ typedef struct { int ipproto; bool connected; socketpool_socketpool_obj_t *pool; + ssl_sslsocket_obj_t *ssl_socket; mp_uint_t timeout_ms; } socketpool_socket_obj_t; void socket_user_reset(void); - -#endif // MICROPY_INCLUDED_ESPRESSIF_COMMON_HAL_SOCKETPOOL_SOCKET_H diff --git a/ports/espressif/common-hal/socketpool/SocketPool.c b/ports/espressif/common-hal/socketpool/SocketPool.c index 1d1aafa638..780e90c42c 100644 --- a/ports/espressif/common-hal/socketpool/SocketPool.c +++ b/ports/espressif/common-hal/socketpool/SocketPool.c @@ -45,6 +45,16 @@ void common_hal_socketpool_socketpool_construct(socketpool_socketpool_obj_t *sel mp_obj_t common_hal_socketpool_socketpool_gethostbyname(socketpool_socketpool_obj_t *self, const char *host) { + // As of 2022, the version of lwip in esp-idf does not handle the + // trailing-dot syntax of domain names, so emulate it. + // Remove this once https://github.com/espressif/esp-idf/issues/10013 has + // been implemented + size_t strlen_host = strlen(host); + if (strlen_host && host[strlen_host - 1] == '.') { + mp_obj_t nodot = mp_obj_new_str(host, strlen_host - 1); + host = mp_obj_str_get_str(nodot); + } + const struct addrinfo hints = { .ai_family = AF_INET, .ai_socktype = SOCK_STREAM, diff --git a/ports/espressif/common-hal/ssl/SSLContext.c b/ports/espressif/common-hal/ssl/SSLContext.c index 386986e6be..1923a9c2a9 100644 --- a/ports/espressif/common-hal/ssl/SSLContext.c +++ b/ports/espressif/common-hal/ssl/SSLContext.c @@ -48,6 +48,7 @@ ssl_sslsocket_obj_t *common_hal_ssl_sslcontext_wrap_socket(ssl_sslcontext_obj_t sock->base.type = &ssl_sslsocket_type; sock->ssl_context = self; sock->sock = socket; + socket->ssl_socket = sock; // Create a copy of the ESP-TLS config object and store the server hostname // Note that ESP-TLS will use common_name for both SNI and verification diff --git a/ports/espressif/common-hal/ssl/SSLSocket.h b/ports/espressif/common-hal/ssl/SSLSocket.h index 097f19857b..6b65a56223 100644 --- a/ports/espressif/common-hal/ssl/SSLSocket.h +++ b/ports/espressif/common-hal/ssl/SSLSocket.h @@ -34,7 +34,7 @@ #include "components/esp-tls/esp_tls.h" -typedef struct { +typedef struct ssl_sslsocket_obj { mp_obj_base_t base; socketpool_socket_obj_t *sock; esp_tls_t *tls; diff --git a/ports/espressif/common-hal/wifi/Network.c b/ports/espressif/common-hal/wifi/Network.c index 34cb15d603..9a20decd4a 100644 --- a/ports/espressif/common-hal/wifi/Network.c +++ b/ports/espressif/common-hal/wifi/Network.c @@ -55,40 +55,40 @@ mp_obj_t common_hal_wifi_network_get_country(wifi_network_obj_t *self) { } mp_obj_t common_hal_wifi_network_get_authmode(wifi_network_obj_t *self) { - uint8_t authmode_mask = 0; + uint32_t authmode_mask = 0; switch (self->record.authmode) { case WIFI_AUTH_OPEN: - authmode_mask = (1 << AUTHMODE_OPEN); + authmode_mask = AUTHMODE_OPEN; break; case WIFI_AUTH_WEP: - authmode_mask = (1 << AUTHMODE_WEP); + authmode_mask = AUTHMODE_WEP; break; case WIFI_AUTH_WPA_PSK: - authmode_mask = (1 << AUTHMODE_WPA) | (1 << AUTHMODE_PSK); + authmode_mask = AUTHMODE_WPA | AUTHMODE_PSK; break; case WIFI_AUTH_WPA2_PSK: - authmode_mask = (1 << AUTHMODE_WPA2) | (1 << AUTHMODE_PSK); + authmode_mask = AUTHMODE_WPA2 | AUTHMODE_PSK; break; case WIFI_AUTH_WPA_WPA2_PSK: - authmode_mask = (1 << AUTHMODE_WPA) | (1 << AUTHMODE_WPA2) | (1 << AUTHMODE_PSK); + authmode_mask = AUTHMODE_WPA | AUTHMODE_WPA2 | AUTHMODE_PSK; break; case WIFI_AUTH_WPA2_ENTERPRISE: - authmode_mask = (1 << AUTHMODE_WPA2) | (1 << AUTHMODE_ENTERPRISE); + authmode_mask = AUTHMODE_WPA2 | AUTHMODE_ENTERPRISE; break; case WIFI_AUTH_WPA3_PSK: - authmode_mask = (1 << AUTHMODE_WPA3) | (1 << AUTHMODE_PSK); + authmode_mask = AUTHMODE_WPA3 | AUTHMODE_PSK; break; case WIFI_AUTH_WPA2_WPA3_PSK: - authmode_mask = (1 << AUTHMODE_WPA2) | (1 << AUTHMODE_WPA3) | (1 << AUTHMODE_PSK); + authmode_mask = AUTHMODE_WPA2 | AUTHMODE_WPA3 | AUTHMODE_PSK; break; default: break; } mp_obj_t authmode_list = mp_obj_new_list(0, NULL); if (authmode_mask != 0) { - for (uint8_t i = 0; i < 8; i++) { + for (uint8_t i = 0; i < 32; i++) { if ((authmode_mask >> i) & 1) { - mp_obj_list_append(authmode_list, cp_enum_find(&wifi_authmode_type, i)); + mp_obj_list_append(authmode_list, cp_enum_find(&wifi_authmode_type, 1 << i)); } } } diff --git a/ports/espressif/common-hal/wifi/Radio.c b/ports/espressif/common-hal/wifi/Radio.c index 27e2c8c610..acd6ae53bc 100644 --- a/ports/espressif/common-hal/wifi/Radio.c +++ b/ports/espressif/common-hal/wifi/Radio.c @@ -205,20 +205,21 @@ void common_hal_wifi_radio_stop_station(wifi_radio_obj_t *self) { set_mode_station(self, false); } -void common_hal_wifi_radio_start_ap(wifi_radio_obj_t *self, uint8_t *ssid, size_t ssid_len, uint8_t *password, size_t password_len, uint8_t channel, uint8_t authmode, uint8_t max_connections) { +void common_hal_wifi_radio_start_ap(wifi_radio_obj_t *self, uint8_t *ssid, size_t ssid_len, uint8_t *password, size_t password_len, uint8_t channel, uint32_t authmodes, uint8_t max_connections) { set_mode_ap(self, true); - switch (authmode) { - case (1 << AUTHMODE_OPEN): + uint8_t authmode = 0; + switch (authmodes) { + case AUTHMODE_OPEN: authmode = WIFI_AUTH_OPEN; break; - case ((1 << AUTHMODE_WPA) | (1 << AUTHMODE_PSK)): + case AUTHMODE_WPA | AUTHMODE_PSK: authmode = WIFI_AUTH_WPA_PSK; break; - case ((1 << AUTHMODE_WPA2) | (1 << AUTHMODE_PSK)): + case AUTHMODE_WPA2 | AUTHMODE_PSK: authmode = WIFI_AUTH_WPA2_PSK; break; - case ((1 << AUTHMODE_WPA) | (1 << AUTHMODE_WPA2) | (1 << AUTHMODE_PSK)): + case AUTHMODE_WPA | AUTHMODE_WPA2 | AUTHMODE_PSK: authmode = WIFI_AUTH_WPA_WPA2_PSK; break; default: diff --git a/ports/espressif/esp-idf b/ports/espressif/esp-idf index 716d8531d7..8d0f1abce7 160000 --- a/ports/espressif/esp-idf +++ b/ports/espressif/esp-idf @@ -1 +1 @@ -Subproject commit 716d8531d71b122975e2966a24ec7613b87eb7b0 +Subproject commit 8d0f1abce769ad4a212c1bb0337999cacd7ee83d diff --git a/ports/espressif/esp-idf-config/sdkconfig-debug.defaults b/ports/espressif/esp-idf-config/sdkconfig-debug.defaults index e93b3d2825..bef5ee5fe8 100644 --- a/ports/espressif/esp-idf-config/sdkconfig-debug.defaults +++ b/ports/espressif/esp-idf-config/sdkconfig-debug.defaults @@ -8,8 +8,8 @@ CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y # CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set # CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set # CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set -# CONFIG_BOOTLOADER_LOG_LEVEL_INFO is not set -CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG=y +CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y +# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set # CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set # end of Bootloader config @@ -72,8 +72,8 @@ CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=2 # CONFIG_LOG_DEFAULT_LEVEL_NONE is not set # CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set # CONFIG_LOG_DEFAULT_LEVEL_WARN is not set -# CONFIG_LOG_DEFAULT_LEVEL_INFO is not set -CONFIG_LOG_DEFAULT_LEVEL_DEBUG=y +CONFIG_LOG_DEFAULT_LEVEL_INFO=y +# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set # CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set # end of Log output diff --git a/ports/espressif/esp-idf-config/sdkconfig-esp32c3.defaults b/ports/espressif/esp-idf-config/sdkconfig-esp32c3.defaults index 5b5df1837c..5fdb766add 100644 --- a/ports/espressif/esp-idf-config/sdkconfig-esp32c3.defaults +++ b/ports/espressif/esp-idf-config/sdkconfig-esp32c3.defaults @@ -80,6 +80,12 @@ CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND=y # end of Hardware Settings +# +# PHY +# +CONFIG_ESP_PHY_ENABLE_USB=y +# end of PHY + # # ESP System Settings # @@ -97,8 +103,12 @@ CONFIG_ESP_SYSTEM_MEMPROT_MEM_ALIGN_SIZE=512 CONFIG_ESP_MAIN_TASK_AFFINITY_CPU0=y # CONFIG_ESP_MAIN_TASK_AFFINITY_NO_AFFINITY is not set CONFIG_ESP_MAIN_TASK_AFFINITY=0x0 + +CONFIG_ESP_CONSOLE_SECONDARY_NONE=y +# CONFIG_ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG is not set # end of ESP System Settings + # # Wi-Fi # diff --git a/ports/espressif/esp32-camera b/ports/espressif/esp32-camera index 54c3f61c86..4ff7f348d0 160000 --- a/ports/espressif/esp32-camera +++ b/ports/espressif/esp32-camera @@ -1 +1 @@ -Subproject commit 54c3f61c864c3d3ffd779042454554045b9dd9d2 +Subproject commit 4ff7f348d0713ea8eca022f73a059b0fe0934531 diff --git a/ports/espressif/mpconfigport.h b/ports/espressif/mpconfigport.h index 632a7a13cd..c296be2024 100644 --- a/ports/espressif/mpconfigport.h +++ b/ports/espressif/mpconfigport.h @@ -33,6 +33,8 @@ #define MICROPY_USE_INTERNAL_PRINTF (0) #define MICROPY_PY_SYS_PLATFORM "Espressif" +#define CIRCUITPY_DIGITALIO_HAVE_INPUT_ONLY (1) + #include "py/circuitpy_mpconfig.h" #if CIRCUITPY_BLEIO diff --git a/ports/espressif/mpconfigport.mk b/ports/espressif/mpconfigport.mk index f1fa24a59b..c5c73c77bd 100644 --- a/ports/espressif/mpconfigport.mk +++ b/ports/espressif/mpconfigport.mk @@ -22,7 +22,6 @@ CIRCUITPY_AUDIOMP3 ?= 0 CIRCUITPY_BLEIO ?= 1 CIRCUITPY_BLEIO_HCI = 0 CIRCUITPY_CANIO ?= 1 -CIRCUITPY_COPROC ?= 1 CIRCUITPY_COUNTIO ?= 1 CIRCUITPY_DUALBANK ?= 1 CIRCUITPY_ESP32_CAMERA ?= 1 @@ -44,7 +43,6 @@ CIRCUITPY_WIFI ?= 1 ifeq ($(IDF_TARGET),esp32) # Modules CIRCUITPY_BLEIO = 0 -CIRCUITPY_COPROC = 0 CIRCUITPY_PARALLELDISPLAY = 0 CIRCUITPY_RGBMATRIX = 0 # Features @@ -54,7 +52,6 @@ else ifeq ($(IDF_TARGET),esp32c3) # Modules CIRCUITPY_ALARM = 0 CIRCUITPY_AUDIOBUSIO = 0 -CIRCUITPY_COPROC = 0 CIRCUITPY_COUNTIO = 0 CIRCUITPY_ESP32_CAMERA = 0 CIRCUITPY_FREQUENCYIO = 0 @@ -68,10 +65,14 @@ CIRCUITPY_USB = 0 else ifeq ($(IDF_TARGET),esp32s2) # Modules CIRCUITPY_BLEIO = 0 +CIRCUITPY_ESPULP = 1 +CIRCUITPY_MEMORYMAP = 1 else ifeq ($(IDF_TARGET),esp32s3) # Modules CIRCUITPY_PARALLELDISPLAY = 0 +CIRCUITPY_ESPULP = 1 +CIRCUITPY_MEMORYMAP = 1 endif # No room for dualbank on boards with 2MB flash diff --git a/ports/espressif/supervisor/port.c b/ports/espressif/supervisor/port.c index 3106f4b991..6dd09ed238 100644 --- a/ports/espressif/supervisor/port.c +++ b/ports/espressif/supervisor/port.c @@ -30,12 +30,14 @@ #include "supervisor/board.h" #include "supervisor/port.h" #include "supervisor/filesystem.h" +#include "supervisor/shared/reload.h" #include "py/runtime.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "bindings/espidf/__init__.h" +#include "bindings/espulp/__init__.h" #include "common-hal/microcontroller/Pin.h" #include "common-hal/analogio/AnalogOut.h" #include "common-hal/busio/I2C.h" @@ -55,7 +57,7 @@ #include "shared-bindings/microcontroller/RunMode.h" #include "shared-bindings/rtc/__init__.h" #include "shared-bindings/socketpool/__init__.h" -#include "shared-module/dotenv/__init__.h" +#include "shared-module/os/__init__.h" #include "peripherals/rmt.h" #include "peripherals/timer.h" @@ -367,6 +369,10 @@ void reset_port(void) { dualbank_reset(); #endif + #if CIRCUITPY_ESPULP + espulp_reset(); + #endif + #if CIRCUITPY_FREQUENCYIO peripherals_timer_reset(); #endif @@ -511,7 +517,7 @@ void port_interrupt_after_ticks(uint32_t ticks) { // On the ESP we use FreeRTOS notifications instead of interrupts so this is a // bit of a misnomer. void port_idle_until_interrupt(void) { - if (!background_callback_pending()) { + if (!background_callback_pending() && !autoreload_pending()) { xTaskNotifyWait(0x01, 0x01, NULL, portMAX_DELAY); } } @@ -519,7 +525,7 @@ void port_idle_until_interrupt(void) { void port_post_boot_py(bool heap_valid) { if (!heap_valid && filesystem_present()) { mp_int_t reserved; - if (dotenv_get_key_int("/.env", "CIRCUITPY_RESERVED_PSRAM", &reserved)) { + if (common_hal_os_getenv_int("CIRCUITPY_RESERVED_PSRAM", &reserved) == GETENV_OK) { common_hal_espidf_set_reserved_psram(reserved); } common_hal_espidf_reserve_psram(); diff --git a/ports/litex/Makefile b/ports/litex/Makefile index 6b1e33c8d1..efe99dc5b4 100644 --- a/ports/litex/Makefile +++ b/ports/litex/Makefile @@ -22,37 +22,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -# Select the board to build for. -ifeq ($(BOARD),) - $(error You must provide a BOARD parameter) -else - ifeq ($(wildcard boards/$(BOARD)/.),) - $(error Invalid BOARD specified) - endif -endif - -# If the build directory is not given, make it reflect the board name. -BUILD ?= build-$(BOARD) - -include ../../py/mkenv.mk -# Board-specific -include boards/$(BOARD)/mpconfigboard.mk -# Port-specific -include mpconfigport.mk - -# CircuitPython-specific -include $(TOP)/py/circuitpy_mpconfig.mk - -# qstr definitions (must come before including py.mk) -QSTR_DEFS = qstrdefsport.h - -# include py core make definitions -include $(TOP)/py/py.mk - -include $(TOP)/supervisor/supervisor.mk - -# Include make rules and variables common across CircuitPython builds. -include $(TOP)/py/circuitpy_defns.mk +include ../../py/circuitpy_mkenv.mk CROSS_COMPILE = riscv64-unknown-elf- @@ -117,7 +87,6 @@ CFLAGS += -DCFG_TUSB_MCU=OPT_MCU_VALENTYUSB_EPTRI -DCFG_TUD_CDC_RX_BUFSIZE=1024 SRC_C += \ background.c \ - fatfs_port.c \ mphalport.c \ boards/$(BOARD)/board.c \ boards/$(BOARD)/pins.c diff --git a/ports/mimxrt10xx/Makefile b/ports/mimxrt10xx/Makefile index 4b05c91714..080a65e8fe 100644 --- a/ports/mimxrt10xx/Makefile +++ b/ports/mimxrt10xx/Makefile @@ -23,36 +23,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -# Select the board to build for. -ifeq ($(BOARD),) - $(error You must provide a BOARD parameter) -else - ifeq ($(wildcard boards/$(BOARD)/.),) - $(error Invalid BOARD specified) - endif -endif - -# If the build directory is not given, make it reflect the board name. -BUILD ?= build-$(BOARD) - -include ../../py/mkenv.mk -# Board-specific -include boards/$(BOARD)/mpconfigboard.mk -# Port-specific -include mpconfigport.mk -# CircuitPython-specific -include $(TOP)/py/circuitpy_mpconfig.mk - -# qstr definitions (must come before including py.mk) -QSTR_DEFS = qstrdefsport.h - -# include py core make definitions -include $(TOP)/py/py.mk - -include $(TOP)/supervisor/supervisor.mk - -# Include make rules and variables common across CircuitPython builds. -include $(TOP)/py/circuitpy_defns.mk +include ../../py/circuitpy_mkenv.mk CROSS_COMPILE = arm-none-eabi- @@ -150,7 +121,6 @@ SRC_C += \ boards/$(BOARD)/board.c \ boards/$(BOARD)/flash_config.c \ boards/$(BOARD)/pins.c \ - fatfs_port.c \ lib/tinyusb/src/portable/chipidea/ci_hs/dcd_ci_hs.c \ mphalport.c \ peripherals/mimxrt10xx/$(CHIP_FAMILY)/clocks.c \ diff --git a/ports/mimxrt10xx/boards/feather_m7_1011/board.c b/ports/mimxrt10xx/boards/feather_m7_1011/board.c index fa37b8ebfd..9587ea71e8 100644 --- a/ports/mimxrt10xx/boards/feather_m7_1011/board.c +++ b/ports/mimxrt10xx/boards/feather_m7_1011/board.c @@ -26,21 +26,23 @@ */ #include "supervisor/board.h" -#include "boards/flash_config.h" -#include "mpconfigboard.h" #include "shared-bindings/microcontroller/Pin.h" -void board_init(void) { - // SWD Pins - common_hal_never_reset_pin(&pin_GPIO_AD_13);// SWDIO - common_hal_never_reset_pin(&pin_GPIO_AD_12);// SWCLK +// These pins should never ever be reset; doing so could interfere with basic operation. +// Used in common-hal/microcontroller/Pin.c +const mcu_pin_obj_t *mimxrt10xx_reset_forbidden_pins[] = { + &pin_GPIO_AD_13,// SWDIO + &pin_GPIO_AD_12,// SWCLK // FLEX flash - common_hal_never_reset_pin(&pin_GPIO_SD_12); - common_hal_never_reset_pin(&pin_GPIO_SD_11); - common_hal_never_reset_pin(&pin_GPIO_SD_10); - common_hal_never_reset_pin(&pin_GPIO_SD_09); - common_hal_never_reset_pin(&pin_GPIO_SD_08); - common_hal_never_reset_pin(&pin_GPIO_SD_07); - common_hal_never_reset_pin(&pin_GPIO_SD_06); -} + &pin_GPIO_SD_12, + &pin_GPIO_SD_11, + &pin_GPIO_SD_10, + &pin_GPIO_SD_09, + &pin_GPIO_SD_08, + &pin_GPIO_SD_07, + &pin_GPIO_SD_06, + NULL, // Must end in NULL. +}; + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/mimxrt10xx/boards/feather_mimxrt1011/board.c b/ports/mimxrt10xx/boards/feather_mimxrt1011/board.c index 1514503834..9587ea71e8 100644 --- a/ports/mimxrt10xx/boards/feather_mimxrt1011/board.c +++ b/ports/mimxrt10xx/boards/feather_mimxrt1011/board.c @@ -26,23 +26,23 @@ */ #include "supervisor/board.h" -#include "boards/flash_config.h" -#include "mpconfigboard.h" #include "shared-bindings/microcontroller/Pin.h" -void board_init(void) { - // SWD Pins - common_hal_never_reset_pin(&pin_GPIO_AD_13);// SWDIO - common_hal_never_reset_pin(&pin_GPIO_AD_12);// SWCLK +// These pins should never ever be reset; doing so could interfere with basic operation. +// Used in common-hal/microcontroller/Pin.c +const mcu_pin_obj_t *mimxrt10xx_reset_forbidden_pins[] = { + &pin_GPIO_AD_13,// SWDIO + &pin_GPIO_AD_12,// SWCLK // FLEX flash - common_hal_never_reset_pin(&pin_GPIO_SD_12); - common_hal_never_reset_pin(&pin_GPIO_SD_11); - common_hal_never_reset_pin(&pin_GPIO_SD_10); - common_hal_never_reset_pin(&pin_GPIO_SD_09); - common_hal_never_reset_pin(&pin_GPIO_SD_08); - common_hal_never_reset_pin(&pin_GPIO_SD_07); - common_hal_never_reset_pin(&pin_GPIO_SD_06); -} + &pin_GPIO_SD_12, + &pin_GPIO_SD_11, + &pin_GPIO_SD_10, + &pin_GPIO_SD_09, + &pin_GPIO_SD_08, + &pin_GPIO_SD_07, + &pin_GPIO_SD_06, + NULL, // Must end in NULL. +}; // Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/mimxrt10xx/boards/feather_mimxrt1062/board.c b/ports/mimxrt10xx/boards/feather_mimxrt1062/board.c index df3d502d80..5a8de5a522 100644 --- a/ports/mimxrt10xx/boards/feather_mimxrt1062/board.c +++ b/ports/mimxrt10xx/boards/feather_mimxrt1062/board.c @@ -26,22 +26,23 @@ */ #include "supervisor/board.h" -#include "boards/flash_config.h" -#include "mpconfigboard.h" #include "shared-bindings/microcontroller/Pin.h" -void board_init(void) { +// These pins should never ever be reset; doing so could interfere with basic operation. +// Used in common-hal/microcontroller/Pin.c +const mcu_pin_obj_t *mimxrt10xx_reset_forbidden_pins[] = { // SWD Pins - common_hal_never_reset_pin(&pin_GPIO_AD_B0_06);// SWDIO - common_hal_never_reset_pin(&pin_GPIO_AD_B0_07);// SWCLK + &pin_GPIO_AD_B0_06,// SWDIO + &pin_GPIO_AD_B0_07,// SWCLK // FLEX flash - common_hal_never_reset_pin(&pin_GPIO_SD_B1_06); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_07); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_08); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_09); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_10); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_11); -} + &pin_GPIO_SD_B1_06, + &pin_GPIO_SD_B1_07, + &pin_GPIO_SD_B1_08, + &pin_GPIO_SD_B1_09, + &pin_GPIO_SD_B1_10, + &pin_GPIO_SD_B1_11, + NULL, // Must end in NULL. +}; // Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/mimxrt10xx/boards/imxrt1010_evk/board.c b/ports/mimxrt10xx/boards/imxrt1010_evk/board.c index 5a4cbcfc66..b839ffa666 100644 --- a/ports/mimxrt10xx/boards/imxrt1010_evk/board.c +++ b/ports/mimxrt10xx/boards/imxrt1010_evk/board.c @@ -26,25 +26,25 @@ */ #include "supervisor/board.h" -#include "boards/flash_config.h" -#include "mpconfigboard.h" #include "shared-bindings/microcontroller/Pin.h" -void board_init(void) { - // SWD Pins - common_hal_never_reset_pin(&pin_GPIO_AD_13); // SWDIO - common_hal_never_reset_pin(&pin_GPIO_AD_12); // SWCLK +// These pins should never ever be reset; doing so could interfere with basic operation. +// Used in common-hal/microcontroller/Pin.c +const mcu_pin_obj_t *mimxrt10xx_reset_forbidden_pins[] = { + &pin_GPIO_AD_13, // SWDIO + &pin_GPIO_AD_12, // SWCLK // FLEX flash - common_hal_never_reset_pin(&pin_GPIO_SD_12); - common_hal_never_reset_pin(&pin_GPIO_SD_11); - common_hal_never_reset_pin(&pin_GPIO_SD_10); - common_hal_never_reset_pin(&pin_GPIO_SD_09); - common_hal_never_reset_pin(&pin_GPIO_SD_08); - common_hal_never_reset_pin(&pin_GPIO_SD_07); - common_hal_never_reset_pin(&pin_GPIO_SD_06); + &pin_GPIO_SD_12, + &pin_GPIO_SD_11, + &pin_GPIO_SD_10, + &pin_GPIO_SD_09, + &pin_GPIO_SD_08, + &pin_GPIO_SD_07, + &pin_GPIO_SD_06, // USB Pins - common_hal_never_reset_pin(&pin_GPIO_12); - common_hal_never_reset_pin(&pin_GPIO_13); -} + &pin_GPIO_12, + &pin_GPIO_13, + NULL, // Must end in NULL. +}; // Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/mimxrt10xx/boards/imxrt1020_evk/board.c b/ports/mimxrt10xx/boards/imxrt1020_evk/board.c index a9eea2d14e..afbc0c58b5 100644 --- a/ports/mimxrt10xx/boards/imxrt1020_evk/board.c +++ b/ports/mimxrt10xx/boards/imxrt1020_evk/board.c @@ -26,26 +26,27 @@ */ #include "supervisor/board.h" -#include "boards/flash_config.h" -#include "mpconfigboard.h" #include "shared-bindings/microcontroller/Pin.h" -void board_init(void) { +// These pins should never ever be reset; doing so could interfere with basic operation. +// Used in common-hal/microcontroller/Pin.c +const mcu_pin_obj_t *mimxrt10xx_reset_forbidden_pins[] = { // SWD Pins - common_hal_never_reset_pin(&pin_GPIO_AD_B0_00);// SWDIO - common_hal_never_reset_pin(&pin_GPIO_AD_B0_01);// SWCLK + &pin_GPIO_AD_B0_00,// SWDIO + &pin_GPIO_AD_B0_01,// SWCLK // FLEX flash - common_hal_never_reset_pin(&pin_GPIO_SD_B1_06); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_07); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_08); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_09); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_10); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_11); + &pin_GPIO_SD_B1_06, + &pin_GPIO_SD_B1_07, + &pin_GPIO_SD_B1_08, + &pin_GPIO_SD_B1_09, + &pin_GPIO_SD_B1_10, + &pin_GPIO_SD_B1_11, // USB Pins - common_hal_never_reset_pin(&pin_GPIO_AD_B1_11); - common_hal_never_reset_pin(&pin_GPIO_AD_B1_12); -} + &pin_GPIO_AD_B1_11, + &pin_GPIO_AD_B1_12, + NULL, // Must end in NULL. +}; // Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/mimxrt10xx/boards/imxrt1060_evk/board.c b/ports/mimxrt10xx/boards/imxrt1060_evk/board.c index 12e75738f8..f27f549c64 100644 --- a/ports/mimxrt10xx/boards/imxrt1060_evk/board.c +++ b/ports/mimxrt10xx/boards/imxrt1060_evk/board.c @@ -26,30 +26,33 @@ */ #include "supervisor/board.h" -#include "boards/flash_config.h" -#include "mpconfigboard.h" #include "shared-bindings/microcontroller/Pin.h" -void board_init(void) { +// These pins should never ever be reset; doing so could interfere with basic operation. +// Used in common-hal/microcontroller/Pin.c +const mcu_pin_obj_t *mimxrt10xx_reset_forbidden_pins[] = { // SWD Pins - common_hal_never_reset_pin(&pin_GPIO_AD_B0_06);// SWDIO - common_hal_never_reset_pin(&pin_GPIO_AD_B0_07);// SWCLK + &pin_GPIO_AD_B0_06, // SWDIO + &pin_GPIO_AD_B0_07, // SWCLK // FLEX flash - common_hal_never_reset_pin(&pin_GPIO_SD_B1_00); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_01); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_02); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_03); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_04); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_05); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_06); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_07); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_08); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_09); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_10); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_11); + &pin_GPIO_SD_B1_00, + &pin_GPIO_SD_B1_01, + &pin_GPIO_SD_B1_02, + &pin_GPIO_SD_B1_03, + &pin_GPIO_SD_B1_04, + &pin_GPIO_SD_B1_05, + &pin_GPIO_SD_B1_06, + &pin_GPIO_SD_B1_07, + &pin_GPIO_SD_B1_08, + &pin_GPIO_SD_B1_09, + &pin_GPIO_SD_B1_10, + &pin_GPIO_SD_B1_11, // USB Pins - common_hal_never_reset_pin(&pin_GPIO_AD_B0_01); - common_hal_never_reset_pin(&pin_GPIO_AD_B0_03); -} + &pin_GPIO_AD_B0_01, + &pin_GPIO_AD_B0_03, + NULL, // Must end in NULL. +}; + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/mimxrt10xx/boards/metro_m7_1011/board.c b/ports/mimxrt10xx/boards/metro_m7_1011/board.c index 1514503834..27cbd3eb96 100644 --- a/ports/mimxrt10xx/boards/metro_m7_1011/board.c +++ b/ports/mimxrt10xx/boards/metro_m7_1011/board.c @@ -26,23 +26,24 @@ */ #include "supervisor/board.h" -#include "boards/flash_config.h" -#include "mpconfigboard.h" #include "shared-bindings/microcontroller/Pin.h" -void board_init(void) { +// These pins should never ever be reset; doing so could interfere with basic operation. +// Used in common-hal/microcontroller/Pin.c +const mcu_pin_obj_t *mimxrt10xx_reset_forbidden_pins[] = { // SWD Pins - common_hal_never_reset_pin(&pin_GPIO_AD_13);// SWDIO - common_hal_never_reset_pin(&pin_GPIO_AD_12);// SWCLK + &pin_GPIO_AD_13,// SWDIO + &pin_GPIO_AD_12,// SWCLK // FLEX flash - common_hal_never_reset_pin(&pin_GPIO_SD_12); - common_hal_never_reset_pin(&pin_GPIO_SD_11); - common_hal_never_reset_pin(&pin_GPIO_SD_10); - common_hal_never_reset_pin(&pin_GPIO_SD_09); - common_hal_never_reset_pin(&pin_GPIO_SD_08); - common_hal_never_reset_pin(&pin_GPIO_SD_07); - common_hal_never_reset_pin(&pin_GPIO_SD_06); -} + &pin_GPIO_SD_12, + &pin_GPIO_SD_11, + &pin_GPIO_SD_10, + &pin_GPIO_SD_09, + &pin_GPIO_SD_08, + &pin_GPIO_SD_07, + &pin_GPIO_SD_06, + NULL, // Must end in NULL. +}; // Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/mimxrt10xx/boards/sparkfun_teensy_micromod/board.c b/ports/mimxrt10xx/boards/sparkfun_teensy_micromod/board.c index 55cd826de2..fda0b1d202 100644 --- a/ports/mimxrt10xx/boards/sparkfun_teensy_micromod/board.c +++ b/ports/mimxrt10xx/boards/sparkfun_teensy_micromod/board.c @@ -26,31 +26,31 @@ */ #include "supervisor/board.h" -#include "boards/flash_config.h" -#include "mpconfigboard.h" #include "shared-bindings/microcontroller/Pin.h" -void board_init(void) { - // FLEX flash - common_hal_never_reset_pin(&pin_GPIO_SD_B1_06); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_07); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_08); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_09); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_10); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_11); +// These pins should never ever be reset; doing so could interfere with basic operation. +// Used in common-hal/microcontroller/Pin.c +const mcu_pin_obj_t *mimxrt10xx_reset_forbidden_pins[] = { + &pin_GPIO_SD_B1_06, + &pin_GPIO_SD_B1_07, + &pin_GPIO_SD_B1_08, + &pin_GPIO_SD_B1_09, + &pin_GPIO_SD_B1_10, + &pin_GPIO_SD_B1_11, // FLEX flash 2 - common_hal_never_reset_pin(&pin_GPIO_AD_B0_04); - common_hal_never_reset_pin(&pin_GPIO_AD_B0_06); - common_hal_never_reset_pin(&pin_GPIO_AD_B0_07); - common_hal_never_reset_pin(&pin_GPIO_AD_B0_08); - common_hal_never_reset_pin(&pin_GPIO_AD_B0_09); - common_hal_never_reset_pin(&pin_GPIO_AD_B0_10); - common_hal_never_reset_pin(&pin_GPIO_EMC_01); - common_hal_never_reset_pin(&pin_GPIO_B0_13); - common_hal_never_reset_pin(&pin_GPIO_AD_B0_11); + &pin_GPIO_AD_B0_04, + &pin_GPIO_AD_B0_06, + &pin_GPIO_AD_B0_07, + &pin_GPIO_AD_B0_08, + &pin_GPIO_AD_B0_09, + &pin_GPIO_AD_B0_10, + &pin_GPIO_EMC_01, + &pin_GPIO_B0_13, + &pin_GPIO_AD_B0_11, // Data strobe needs protection despite being grounded - common_hal_never_reset_pin(&pin_GPIO_SD_B1_05); -} + &pin_GPIO_SD_B1_05, + NULL, // Must end in NULL. +}; // Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/mimxrt10xx/boards/teensy40/board.c b/ports/mimxrt10xx/boards/teensy40/board.c index 55cd826de2..8ece1546d7 100644 --- a/ports/mimxrt10xx/boards/teensy40/board.c +++ b/ports/mimxrt10xx/boards/teensy40/board.c @@ -26,31 +26,32 @@ */ #include "supervisor/board.h" -#include "boards/flash_config.h" -#include "mpconfigboard.h" #include "shared-bindings/microcontroller/Pin.h" -void board_init(void) { +// These pins should never ever be reset; doing so could interfere with basic operation. +// Used in common-hal/microcontroller/Pin.c +const mcu_pin_obj_t *mimxrt10xx_reset_forbidden_pins[] = { // FLEX flash - common_hal_never_reset_pin(&pin_GPIO_SD_B1_06); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_07); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_08); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_09); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_10); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_11); + &pin_GPIO_SD_B1_06, + &pin_GPIO_SD_B1_07, + &pin_GPIO_SD_B1_08, + &pin_GPIO_SD_B1_09, + &pin_GPIO_SD_B1_10, + &pin_GPIO_SD_B1_11, // FLEX flash 2 - common_hal_never_reset_pin(&pin_GPIO_AD_B0_04); - common_hal_never_reset_pin(&pin_GPIO_AD_B0_06); - common_hal_never_reset_pin(&pin_GPIO_AD_B0_07); - common_hal_never_reset_pin(&pin_GPIO_AD_B0_08); - common_hal_never_reset_pin(&pin_GPIO_AD_B0_09); - common_hal_never_reset_pin(&pin_GPIO_AD_B0_10); - common_hal_never_reset_pin(&pin_GPIO_EMC_01); - common_hal_never_reset_pin(&pin_GPIO_B0_13); - common_hal_never_reset_pin(&pin_GPIO_AD_B0_11); + &pin_GPIO_AD_B0_04, + &pin_GPIO_AD_B0_06, + &pin_GPIO_AD_B0_07, + &pin_GPIO_AD_B0_08, + &pin_GPIO_AD_B0_09, + &pin_GPIO_AD_B0_10, + &pin_GPIO_EMC_01, + &pin_GPIO_B0_13, + &pin_GPIO_AD_B0_11, // Data strobe needs protection despite being grounded - common_hal_never_reset_pin(&pin_GPIO_SD_B1_05); -} + &pin_GPIO_SD_B1_05, + NULL, // Must end in NULL. +}; // Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/mimxrt10xx/boards/teensy41/board.c b/ports/mimxrt10xx/boards/teensy41/board.c index 628befd02b..8ece1546d7 100644 --- a/ports/mimxrt10xx/boards/teensy41/board.c +++ b/ports/mimxrt10xx/boards/teensy41/board.c @@ -26,29 +26,32 @@ */ #include "supervisor/board.h" -#include "boards/flash_config.h" -#include "mpconfigboard.h" #include "shared-bindings/microcontroller/Pin.h" -void board_init(void) { +// These pins should never ever be reset; doing so could interfere with basic operation. +// Used in common-hal/microcontroller/Pin.c +const mcu_pin_obj_t *mimxrt10xx_reset_forbidden_pins[] = { // FLEX flash - common_hal_never_reset_pin(&pin_GPIO_SD_B1_06); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_07); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_08); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_09); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_10); - common_hal_never_reset_pin(&pin_GPIO_SD_B1_11); + &pin_GPIO_SD_B1_06, + &pin_GPIO_SD_B1_07, + &pin_GPIO_SD_B1_08, + &pin_GPIO_SD_B1_09, + &pin_GPIO_SD_B1_10, + &pin_GPIO_SD_B1_11, // FLEX flash 2 - common_hal_never_reset_pin(&pin_GPIO_AD_B0_04); - common_hal_never_reset_pin(&pin_GPIO_AD_B0_06); - common_hal_never_reset_pin(&pin_GPIO_AD_B0_07); - common_hal_never_reset_pin(&pin_GPIO_AD_B0_08); - common_hal_never_reset_pin(&pin_GPIO_AD_B0_09); - common_hal_never_reset_pin(&pin_GPIO_AD_B0_10); - common_hal_never_reset_pin(&pin_GPIO_EMC_01); - common_hal_never_reset_pin(&pin_GPIO_B0_13); - common_hal_never_reset_pin(&pin_GPIO_AD_B0_11); + &pin_GPIO_AD_B0_04, + &pin_GPIO_AD_B0_06, + &pin_GPIO_AD_B0_07, + &pin_GPIO_AD_B0_08, + &pin_GPIO_AD_B0_09, + &pin_GPIO_AD_B0_10, + &pin_GPIO_EMC_01, + &pin_GPIO_B0_13, + &pin_GPIO_AD_B0_11, // Data strobe needs protection despite being grounded - common_hal_never_reset_pin(&pin_GPIO_SD_B1_05); -} + &pin_GPIO_SD_B1_05, + NULL, // Must end in NULL. +}; + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/mimxrt10xx/common-hal/busio/UART.c b/ports/mimxrt10xx/common-hal/busio/UART.c index 20430c91c8..871d57648d 100644 --- a/ports/mimxrt10xx/common-hal/busio/UART.c +++ b/ports/mimxrt10xx/common-hal/busio/UART.c @@ -113,7 +113,7 @@ void common_hal_busio_uart_construct(busio_uart_obj_t *self, bool sigint_enabled) { self->baudrate = baudrate; - self->character_bits = (uint8_t)mp_arg_validate_int_range(self->character_bits, 7, 8, MP_QSTR_bits); + self->character_bits = (uint8_t)mp_arg_validate_int_range(bits, 7, 8, MP_QSTR_bits); self->timeout_ms = timeout * 1000; diff --git a/ports/mimxrt10xx/common-hal/microcontroller/Pin.c b/ports/mimxrt10xx/common-hal/microcontroller/Pin.c index 06a2a34fe1..3c8c7f2b27 100644 --- a/ports/mimxrt10xx/common-hal/microcontroller/Pin.c +++ b/ports/mimxrt10xx/common-hal/microcontroller/Pin.c @@ -31,6 +31,22 @@ STATIC bool claimed_pins[IOMUXC_SW_PAD_CTL_PAD_COUNT]; STATIC bool never_reset_pins[IOMUXC_SW_PAD_CTL_PAD_COUNT]; +// Default is that no pins are forbidden to reset. +MP_WEAK const mcu_pin_obj_t *mimxrt10xx_reset_forbidden_pins[] = { + NULL, +}; + +STATIC bool _reset_forbidden(const mcu_pin_obj_t *pin) { + const mcu_pin_obj_t **forbidden_pin = &mimxrt10xx_reset_forbidden_pins[0]; + while (*forbidden_pin) { + if (pin == *forbidden_pin) { + return true; + } + forbidden_pin++; + } + return false; +} + // There are two numbering systems used here: // IOMUXC index, used for iterating through pins and accessing reset information, // and GPIO port and number, used to store claimed and reset tagging. The two number @@ -44,17 +60,30 @@ void reset_all_pins(void) { if (never_reset_pins[pin->mux_idx]) { continue; } - *(uint32_t *)pin->mux_reg = pin->mux_reset; - *(uint32_t *)pin->cfg_reg = pin->pad_reset; + common_hal_reset_pin(pin); } } +MP_WEAK bool mimxrt10xx_board_reset_pin_number(const mcu_pin_obj_t *pin) { + return false; +} + // Since i.MX pins need extra register and reset information to reset properly, // resetting pins by number alone has been removed. void common_hal_reset_pin(const mcu_pin_obj_t *pin) { if (pin == NULL) { return; } + + if (_reset_forbidden(pin)) { + return; + } + + // Give the board a chance to reset the pin in a particular way, or not reset it at all. + if (mimxrt10xx_board_reset_pin_number(pin)) { + return; + } + never_reset_pins[pin->mux_idx] = false; claimed_pins[pin->mux_idx] = false; *(uint32_t *)pin->mux_reg = pin->mux_reset; diff --git a/ports/mimxrt10xx/common-hal/microcontroller/Pin.h b/ports/mimxrt10xx/common-hal/microcontroller/Pin.h index 2638eb89b8..1bfbe41a18 100644 --- a/ports/mimxrt10xx/common-hal/microcontroller/Pin.h +++ b/ports/mimxrt10xx/common-hal/microcontroller/Pin.h @@ -35,4 +35,14 @@ void reset_all_pins(void); void claim_pin(const mcu_pin_obj_t *pin); +// List of pins that should never be reset. +extern const mcu_pin_obj_t *mimxrt10xx_reset_forbidden_pins[]; + +// Allow the board to reset a pin in a board-specific way. This can be used +// for LEDs or enable pins to put them in a state beside the default pull-up, +// or to simply not reset the pin at all. +// Return true to indicate that the pin was handled in a special way. Returning false will lead to +// the port-default reset behavior. +extern bool mimxrt10xx_board_reset_pin_number(const mcu_pin_obj_t *pin); + #endif // MICROPY_INCLUDED_MIMXRT10XX_COMMON_HAL_MICROCONTROLLER_PIN_H diff --git a/ports/mimxrt10xx/fatfs_port.c b/ports/mimxrt10xx/fatfs_port.c deleted file mode 100644 index 58a0ef0d72..0000000000 --- a/ports/mimxrt10xx/fatfs_port.c +++ /dev/null @@ -1,48 +0,0 @@ -/* - * This file is part of the MicroPython project, http://micropython.org/ - * - * The MIT License (MIT) - * - * SPDX-FileCopyrightText: Copyright (c) 2013, 2014 Damien P. George - * - * 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/mphal.h" -#include "py/runtime.h" -#include "lib/oofatfs/ff.h" /* FatFs lower layer API */ -#include "lib/oofatfs/diskio.h" /* FatFs lower layer API */ -#include "shared/timeutils/timeutils.h" - -#if CIRCUITPY_RTC -#include "shared-bindings/rtc/RTC.h" -#endif - -DWORD get_fattime(void) { - #if CIRCUITPY_RTC - timeutils_struct_time_t tm; - common_hal_rtc_get_time(&tm); - return ((tm.tm_year - 1980) << 25) | (tm.tm_mon << 21) | (tm.tm_mday << 16) | - (tm.tm_hour << 11) | (tm.tm_min << 5) | (tm.tm_sec >> 1); - #else - return ((2016 - 1980) << 25) | ((9) << 21) | ((1) << 16) | ((16) << 11) | ((43) << 5) | (35 / 2); - #endif - - -} diff --git a/ports/nrf/Makefile b/ports/nrf/Makefile index bbe102ffc8..d1b71799bf 100755 --- a/ports/nrf/Makefile +++ b/ports/nrf/Makefile @@ -22,42 +22,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -# Select the board to build for. -ifeq ($(BOARD),) - $(info You must provide a BOARD parameter with 'BOARD=') - $(info Possible values are:) - $(info $(sort $(subst /.,,$(subst boards/,,$(wildcard boards/*/.))))) - $(error BOARD not defined) -else - ifeq ($(wildcard boards/$(BOARD)/.),) - $(error Invalid BOARD specified) - endif -endif - -CLI_SD := $(SD) -SD_LOWER = $(shell echo $(SD) | tr '[:upper:]' '[:lower:]') - -# Build directory with SD if it's different from the default. -BUILD ?= $(if $(CLI_SD),build-$(BOARD)-$(SD_LOWER),build-$(BOARD)) - -include ../../py/mkenv.mk -# Board-specific -include boards/$(BOARD)/mpconfigboard.mk -# Port-specific -include mpconfigport.mk -# CircuitPython-specific -include $(TOP)/py/circuitpy_mpconfig.mk - -# qstr definitions (must come before including py.mk) -QSTR_DEFS = qstrdefsport.h - -# include py core make definitions -include $(TOP)/py/py.mk - -include $(TOP)/supervisor/supervisor.mk - -# Include make rules and variables common across CircuitPython builds. -include $(TOP)/py/circuitpy_defns.mk +include ../../py/circuitpy_mkenv.mk ifneq ($(SD), ) include bluetooth/bluetooth_common.mk @@ -165,7 +130,6 @@ endif SRC_C += \ background.c \ - fatfs_port.c \ boards/$(BOARD)/board.c \ boards/$(BOARD)/pins.c \ device/$(MCU_VARIANT)/startup_$(MCU_SUB_VARIANT).c \ diff --git a/ports/nrf/boards/Seeed_XIAO_nRF52840_Sense/pins.c b/ports/nrf/boards/Seeed_XIAO_nRF52840_Sense/pins.c index 00fa2c1ed5..8714f9bf8c 100644 --- a/ports/nrf/boards/Seeed_XIAO_nRF52840_Sense/pins.c +++ b/ports/nrf/boards/Seeed_XIAO_nRF52840_Sense/pins.c @@ -52,6 +52,7 @@ STATIC const mp_rom_map_elem_t board_module_globals_table[] = { {MP_ROM_QSTR(MP_QSTR_READ_BATT_ENABLE),MP_ROM_PTR(&pin_P0_14)}, {MP_ROM_QSTR(MP_QSTR_VBATT),MP_ROM_PTR(&pin_P0_31)}, {MP_ROM_QSTR(MP_QSTR_CHARGE_STATUS),MP_ROM_PTR(&pin_P0_17)}, + {MP_ROM_QSTR(MP_QSTR_CHARGE_RATE),MP_ROM_PTR(&pin_P0_13)}, { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, diff --git a/ports/nrf/boards/aramcon_badge_2019/mpconfigboard.mk b/ports/nrf/boards/aramcon_badge_2019/mpconfigboard.mk index 06cd9633d1..5bf2eb721b 100644 --- a/ports/nrf/boards/aramcon_badge_2019/mpconfigboard.mk +++ b/ports/nrf/boards/aramcon_badge_2019/mpconfigboard.mk @@ -9,5 +9,6 @@ QSPI_FLASH_FILESYSTEM = 1 EXTERNAL_FLASH_DEVICES = "GD25Q16C" CIRCUITPY_DISPLAYIO = 1 +CIRCUITPY_PIXELMAP = 0 CIRCUITPY_REQUIRE_I2C_PULLUPS = 0 diff --git a/ports/nrf/boards/bluemicro833/mpconfigboard.mk b/ports/nrf/boards/bluemicro833/mpconfigboard.mk index 6108f23102..9b230e9a53 100644 --- a/ports/nrf/boards/bluemicro833/mpconfigboard.mk +++ b/ports/nrf/boards/bluemicro833/mpconfigboard.mk @@ -13,4 +13,5 @@ CIRCUITPY_KEYPAD = 1 CIRCUITPY_NVM = 0 CIRCUITPY_ONEWIREIO = 0 CIRCUITPY_PIXELBUF = 1 +CIRCUITPY_PIXELMAP = 0 CIRCUITPY_TOUCHIO = 0 diff --git a/ports/nrf/boards/challenger_840/board.c b/ports/nrf/boards/challenger_840/board.c index fb1ce4fb83..14a52fc4de 100644 --- a/ports/nrf/boards/challenger_840/board.c +++ b/ports/nrf/boards/challenger_840/board.c @@ -23,7 +23,3 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ - -#include "supervisor/board.h" - -// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/nrf/boards/challenger_840/challenger_840.py b/ports/nrf/boards/challenger_840/challenger_840.py new file mode 100644 index 0000000000..bf3ae77170 --- /dev/null +++ b/ports/nrf/boards/challenger_840/challenger_840.py @@ -0,0 +1,16 @@ +import board +import digitalio + +_LDO_PIN = digitalio.DigitalInOut(board.LDO_CONTROL) +_LDO_PIN.direction = digitalio.Direction.OUTPUT +_LDO_PIN.value = True + + +def ldo_on(): + global _LDO_PIN + _LDO_PIN.value = True + + +def ldo_off(): + global _LDO_PIN + _LDO_PIN.value = False diff --git a/ports/nrf/boards/challenger_840/mpconfigboard.h b/ports/nrf/boards/challenger_840/mpconfigboard.h index e68fbc76fb..5226c818d4 100644 --- a/ports/nrf/boards/challenger_840/mpconfigboard.h +++ b/ports/nrf/boards/challenger_840/mpconfigboard.h @@ -10,6 +10,7 @@ #define SPI_FLASH_MISO_PIN (&pin_P0_11) #define SPI_FLASH_SCK_PIN (&pin_P0_14) #define SPI_FLASH_CS_PIN (&pin_P0_08) +#define SPI_FLASH_MAX_BAUDRATE 20000000 #endif #define CIRCUITPY_AUTORELOAD_DELAY_MS 500 diff --git a/ports/nrf/boards/challenger_840/mpconfigboard.mk b/ports/nrf/boards/challenger_840/mpconfigboard.mk index ddb55ce705..03cbc20b21 100644 --- a/ports/nrf/boards/challenger_840/mpconfigboard.mk +++ b/ports/nrf/boards/challenger_840/mpconfigboard.mk @@ -6,4 +6,8 @@ USB_MANUFACTURER = "Invector Labs AB" MCU_CHIP = nrf52840 SPI_FLASH_FILESYSTEM = 1 -EXTERNAL_FLASH_DEVICES = "W25Q16JVxQ,W25Q32FV,W25Q64FV" +EXTERNAL_FLASH_DEVICES = "W25Q16JVxQ,W25Q32FV,W25Q32JVxQ,W25Q64FV,W25Q64JVxQ" + +FROZEN_MPY_DIRS += $(TOP)/ports/nrf/boards/challenger_840 +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_BLE +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel diff --git a/ports/nrf/boards/challenger_840/pins.c b/ports/nrf/boards/challenger_840/pins.c index 26d780fffe..e059c17a15 100644 --- a/ports/nrf/boards/challenger_840/pins.c +++ b/ports/nrf/boards/challenger_840/pins.c @@ -32,6 +32,7 @@ STATIC const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_P0_06) }, { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_P1_08) }, + { MP_ROM_QSTR(MP_QSTR_LDO_CONTROL), MP_ROM_PTR(&pin_P1_09) }, { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_P0_12) }, { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_P0_11) }, diff --git a/ports/nrf/common-hal/_bleio/Adapter.c b/ports/nrf/common-hal/_bleio/Adapter.c index 49b5d638f3..2c0c343877 100644 --- a/ports/nrf/common-hal/_bleio/Adapter.c +++ b/ports/nrf/common-hal/_bleio/Adapter.c @@ -52,8 +52,9 @@ #include "shared-bindings/_bleio/ScanEntry.h" #include "shared-bindings/time/__init__.h" -#if CIRCUITPY_DOTENV -#include "shared-module/dotenv/__init__.h" +#if CIRCUITPY_OS_GETENV +#include "shared-bindings/os/__init__.h" +#include "shared-module/os/__init__.h" #endif #define BLE_MIN_CONN_INTERVAL MSEC_TO_UNITS(15, UNIT_0_625_MS) @@ -343,20 +344,17 @@ STATIC void bleio_adapter_reset_name(bleio_adapter_obj_t *self) { default_ble_name[len - 1] = nibble_to_hex_lower[addr.addr[0] & 0xf]; default_ble_name[len] = '\0'; // for now we add null for compatibility with C ASCIIZ strings - mp_int_t name_len = 0; - - #if CIRCUITPY_DOTENV + #if CIRCUITPY_OS_GETENV char ble_name[32]; - name_len = dotenv_get_key("/.env", "CIRCUITPY_BLE_NAME", ble_name, sizeof(ble_name) - 1); - if (name_len > 0) { - ble_name[name_len] = '\0'; - common_hal_bleio_adapter_set_name(self, (char *)ble_name); + + os_getenv_err_t result = common_hal_os_getenv_str("CIRCUITPY_BLE_NAME", ble_name, sizeof(ble_name)); + if (result == GETENV_OK) { + common_hal_bleio_adapter_set_name(self, ble_name); + return; } #endif - if (name_len <= 0) { - common_hal_bleio_adapter_set_name(self, (char *)default_ble_name); - } + common_hal_bleio_adapter_set_name(self, (char *)default_ble_name); } static void bluetooth_adapter_background(void *data) { diff --git a/ports/nrf/fatfs_port.c b/ports/nrf/fatfs_port.c deleted file mode 100644 index 38c2d923b8..0000000000 --- a/ports/nrf/fatfs_port.c +++ /dev/null @@ -1,51 +0,0 @@ -/* - * This file is part of the MicroPython project, http://micropython.org/ - * - * The MIT License (MIT) - * - * SPDX-FileCopyrightText: Copyright (c) 2013, 2014 Damien P. George - * - * 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 "lib/oofatfs/ff.h" -#include "shared/timeutils/timeutils.h" -#include "shared-bindings/rtc/RTC.h" -#include "shared-bindings/time/__init__.h" -#include "supervisor/fatfs_port.h" - -DWORD _time_override = 0; -DWORD get_fattime(void) { - if (_time_override > 0) { - return _time_override; - } - #if CIRCUITPY_RTC - timeutils_struct_time_t tm; - common_hal_rtc_get_time(&tm); - return ((tm.tm_year - 1980) << 25) | (tm.tm_mon << 21) | (tm.tm_mday << 16) | - (tm.tm_hour << 11) | (tm.tm_min << 5) | (tm.tm_sec >> 1); - #else - return ((2016 - 1980) << 25) | ((9) << 21) | ((1) << 16) | ((16) << 11) | ((43) << 5) | (35 / 2); - #endif -} - -void override_fattime(DWORD time) { - _time_override = time; -} diff --git a/ports/nrf/peripherals/nrf/cache.c b/ports/nrf/peripherals/nrf/cache.c index 6eb590d770..54bb77980b 100644 --- a/ports/nrf/peripherals/nrf/cache.c +++ b/ports/nrf/peripherals/nrf/cache.c @@ -29,8 +29,18 @@ // Turn off cache and invalidate all data in it. void nrf_peripherals_disable_and_clear_cache(void) { + // Memory fence for hardware and compiler reasons. If this routine is inlined, the compiler + // needs to know that everything written out be stored before this is called. + // -O2 optimization needed this on SAMD51. Assuming nRF may have the same issue. + // __sync_synchronize() includes volatile asm(), which tells the compiler not to assume + // state across this call. + __sync_synchronize(); + // Disabling cache also invalidates all cache entries. NRF_NVMC->ICACHECNF &= ~(1 << NVMC_ICACHECNF_CACHEEN_Pos); + + // Memory fence for hardware and compiler reasons. + __sync_synchronize(); } // Enable cache diff --git a/ports/raspberrypi/Makefile b/ports/raspberrypi/Makefile index cb4c80a23d..d72d59bcf6 100644 --- a/ports/raspberrypi/Makefile +++ b/ports/raspberrypi/Makefile @@ -22,36 +22,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -# Select the board to build for. -ifeq ($(BOARD),) - $(error You must provide a BOARD parameter) -else - ifeq ($(wildcard boards/$(BOARD)/.),) - $(error Invalid BOARD specified) - endif -endif - -# If the build directory is not given, make it reflect the board name. -BUILD ?= build-$(BOARD) - -include ../../py/mkenv.mk -# Board-specific -include boards/$(BOARD)/mpconfigboard.mk -# Port-specific -include mpconfigport.mk -# CircuitPython-specific -include $(TOP)/py/circuitpy_mpconfig.mk - -# qstr definitions (must come before including py.mk) -QSTR_DEFS = qstrdefsport.h - -# include py core make definitions -include $(TOP)/py/py.mk - -include $(TOP)/supervisor/supervisor.mk - -# Include make rules and variables common across CircuitPython builds. -include $(TOP)/py/circuitpy_defns.mk +include ../../py/circuitpy_mkenv.mk CROSS_COMPILE = arm-none-eabi- @@ -65,7 +36,7 @@ INC_CYW43 := \ -isystem sdk/src/rp2_common/pico_cyw43_arch/include/ \ -isystem sdk/src/rp2_common/pico_lwip/include/ \ -CFLAGS_CYW43 := -DCYW43_LWIP=1 -DPICO_CYW43_ARCH_THREADSAFE_BACKGROUND=1 -DCYW43_USE_SPI -DIGNORE_GPIO25 -DIGNORE_GPIO23 -DIGNORE_GPIO24 -DCYW43_LOGIC_DEBUG=0 +CFLAGS_CYW43 := -DCYW43_LWIP=1 -DPICO_CYW43_ARCH_THREADSAFE_BACKGROUND=1 -DCYW43_USE_SPI -DIGNORE_GPIO25 -DIGNORE_GPIO23 -DIGNORE_GPIO24 -DCYW43_LOGIC_DEBUG=0 -DCYW43_NETUTILS=1 SRC_SDK_CYW43 := \ src/common/pico_sync/sem.c \ src/rp2_common/cyw43_driver/cyw43_bus_pio_spi.c \ @@ -76,6 +47,9 @@ SRC_SDK_CYW43 := \ SRC_LWIP := \ shared/netutils/netutils.c \ + shared/netutils/trace.c \ + shared/netutils/dhcpserver.c \ + $(wildcard lib/lwip/src/apps/mdns/*.c) \ $(wildcard lib/lwip/src/core/*.c) \ $(wildcard lib/lwip/src/core/ipv4/*.c) \ lib/lwip/src/netif/ethernet.c \ @@ -211,13 +185,15 @@ CFLAGS += \ -msoft-float \ -mfloat-abi=soft -PICO_LDFLAGS = --specs=nosys.specs -Wl,--wrap=__aeabi_ldiv0 -Wl,--wrap=__aeabi_idiv0 -Wl,--wrap=__aeabi_lmul -Wl,--wrap=__clzsi2 -Wl,--wrap=__clzdi2 -Wl,--wrap=__ctzsi2 -Wl,--wrap=__ctzdi2 -Wl,--wrap=__popcountsi2 -Wl,--wrap=__popcountdi2 -Wl,--wrap=__clz -Wl,--wrap=__clzl -Wl,--wrap=__clzll -Wl,--wrap=__aeabi_idiv -Wl,--wrap=__aeabi_idivmod -Wl,--wrap=__aeabi_ldivmod -Wl,--wrap=__aeabi_uidiv -Wl,--wrap=__aeabi_uidivmod -Wl,--wrap=__aeabi_uldivmod -Wl,--wrap=__aeabi_dadd -Wl,--wrap=__aeabi_ddiv -Wl,--wrap=__aeabi_dmul -Wl,--wrap=__aeabi_drsub -Wl,--wrap=__aeabi_dsub -Wl,--wrap=__aeabi_cdcmpeq -Wl,--wrap=__aeabi_cdrcmple -Wl,--wrap=__aeabi_cdcmple -Wl,--wrap=__aeabi_dcmpeq -Wl,--wrap=__aeabi_dcmplt -Wl,--wrap=__aeabi_dcmple -Wl,--wrap=__aeabi_dcmpge -Wl,--wrap=__aeabi_dcmpgt -Wl,--wrap=__aeabi_dcmpun -Wl,--wrap=__aeabi_i2d -Wl,--wrap=__aeabi_l2d -Wl,--wrap=__aeabi_ui2d -Wl,--wrap=__aeabi_ul2d -Wl,--wrap=__aeabi_d2iz -Wl,--wrap=__aeabi_d2lz -Wl,--wrap=__aeabi_d2uiz -Wl,--wrap=__aeabi_d2ulz -Wl,--wrap=__aeabi_d2f -Wl,--wrap=sqrt -Wl,--wrap=cos -Wl,--wrap=sin -Wl,--wrap=tan -Wl,--wrap=atan2 -Wl,--wrap=exp -Wl,--wrap=log -Wl,--wrap=ldexp -Wl,--wrap=copysign -Wl,--wrap=trunc -Wl,--wrap=floor -Wl,--wrap=ceil -Wl,--wrap=round -Wl,--wrap=sincos -Wl,--wrap=asin -Wl,--wrap=acos -Wl,--wrap=atan -Wl,--wrap=sinh -Wl,--wrap=cosh -Wl,--wrap=tanh -Wl,--wrap=asinh -Wl,--wrap=acosh -Wl,--wrap=atanh -Wl,--wrap=exp2 -Wl,--wrap=log2 -Wl,--wrap=exp10 -Wl,--wrap=log10 -Wl,--wrap=pow -Wl,--wrap=powint -Wl,--wrap=hypot -Wl,--wrap=cbrt -Wl,--wrap=fmod -Wl,--wrap=drem -Wl,--wrap=remainder -Wl,--wrap=remquo -Wl,--wrap=expm1 -Wl,--wrap=log1p -Wl,--wrap=fma -Wl,--wrap=__aeabi_fadd -Wl,--wrap=__aeabi_fdiv -Wl,--wrap=__aeabi_fmul -Wl,--wrap=__aeabi_frsub -Wl,--wrap=__aeabi_fsub -Wl,--wrap=__aeabi_cfcmpeq -Wl,--wrap=__aeabi_cfrcmple -Wl,--wrap=__aeabi_cfcmple -Wl,--wrap=__aeabi_fcmpeq -Wl,--wrap=__aeabi_fcmplt -Wl,--wrap=__aeabi_fcmple -Wl,--wrap=__aeabi_fcmpge -Wl,--wrap=__aeabi_fcmpgt -Wl,--wrap=__aeabi_fcmpun -Wl,--wrap=__aeabi_i2f -Wl,--wrap=__aeabi_l2f -Wl,--wrap=__aeabi_ui2f -Wl,--wrap=__aeabi_ul2f -Wl,--wrap=__aeabi_f2iz -Wl,--wrap=__aeabi_f2lz -Wl,--wrap=__aeabi_f2uiz -Wl,--wrap=__aeabi_f2ulz -Wl,--wrap=__aeabi_f2d -Wl,--wrap=sqrtf -Wl,--wrap=cosf -Wl,--wrap=sinf -Wl,--wrap=tanf -Wl,--wrap=atan2f -Wl,--wrap=expf -Wl,--wrap=logf -Wl,--wrap=ldexpf -Wl,--wrap=copysignf -Wl,--wrap=truncf -Wl,--wrap=floorf -Wl,--wrap=ceilf -Wl,--wrap=roundf -Wl,--wrap=sincosf -Wl,--wrap=asinf -Wl,--wrap=acosf -Wl,--wrap=atanf -Wl,--wrap=sinhf -Wl,--wrap=coshf -Wl,--wrap=tanhf -Wl,--wrap=asinhf -Wl,--wrap=acoshf -Wl,--wrap=atanhf -Wl,--wrap=exp2f -Wl,--wrap=log2f -Wl,--wrap=exp10f -Wl,--wrap=log10f -Wl,--wrap=powf -Wl,--wrap=powintf -Wl,--wrap=hypotf -Wl,--wrap=cbrtf -Wl,--wrap=fmodf -Wl,--wrap=dremf -Wl,--wrap=remainderf -Wl,--wrap=remquof -Wl,--wrap=expm1f -Wl,--wrap=log1pf -Wl,--wrap=fmaf -Wl,--wrap=memcpy -Wl,--wrap=memset -Wl,--wrap=__aeabi_memcpy -Wl,--wrap=__aeabi_memset -Wl,--wrap=__aeabi_memcpy4 -Wl,--wrap=__aeabi_memset4 -Wl,--wrap=__aeabi_memcpy8 -Wl,--wrap=__aeabi_memset8 +PICO_LDFLAGS = --specs=nosys.specs --specs=nano.specs -Wl,--wrap=__aeabi_ldiv0 -Wl,--wrap=__aeabi_idiv0 -Wl,--wrap=__aeabi_lmul -Wl,--wrap=__clzsi2 -Wl,--wrap=__clzdi2 -Wl,--wrap=__ctzsi2 -Wl,--wrap=__ctzdi2 -Wl,--wrap=__popcountsi2 -Wl,--wrap=__popcountdi2 -Wl,--wrap=__clz -Wl,--wrap=__clzl -Wl,--wrap=__clzll -Wl,--wrap=__aeabi_idiv -Wl,--wrap=__aeabi_idivmod -Wl,--wrap=__aeabi_ldivmod -Wl,--wrap=__aeabi_uidiv -Wl,--wrap=__aeabi_uidivmod -Wl,--wrap=__aeabi_uldivmod -Wl,--wrap=__aeabi_dadd -Wl,--wrap=__aeabi_ddiv -Wl,--wrap=__aeabi_dmul -Wl,--wrap=__aeabi_drsub -Wl,--wrap=__aeabi_dsub -Wl,--wrap=__aeabi_cdcmpeq -Wl,--wrap=__aeabi_cdrcmple -Wl,--wrap=__aeabi_cdcmple -Wl,--wrap=__aeabi_dcmpeq -Wl,--wrap=__aeabi_dcmplt -Wl,--wrap=__aeabi_dcmple -Wl,--wrap=__aeabi_dcmpge -Wl,--wrap=__aeabi_dcmpgt -Wl,--wrap=__aeabi_dcmpun -Wl,--wrap=__aeabi_i2d -Wl,--wrap=__aeabi_l2d -Wl,--wrap=__aeabi_ui2d -Wl,--wrap=__aeabi_ul2d -Wl,--wrap=__aeabi_d2iz -Wl,--wrap=__aeabi_d2lz -Wl,--wrap=__aeabi_d2uiz -Wl,--wrap=__aeabi_d2ulz -Wl,--wrap=__aeabi_d2f -Wl,--wrap=sqrt -Wl,--wrap=cos -Wl,--wrap=sin -Wl,--wrap=tan -Wl,--wrap=atan2 -Wl,--wrap=exp -Wl,--wrap=log -Wl,--wrap=ldexp -Wl,--wrap=copysign -Wl,--wrap=trunc -Wl,--wrap=floor -Wl,--wrap=ceil -Wl,--wrap=round -Wl,--wrap=sincos -Wl,--wrap=asin -Wl,--wrap=acos -Wl,--wrap=atan -Wl,--wrap=sinh -Wl,--wrap=cosh -Wl,--wrap=tanh -Wl,--wrap=asinh -Wl,--wrap=acosh -Wl,--wrap=atanh -Wl,--wrap=exp2 -Wl,--wrap=log2 -Wl,--wrap=exp10 -Wl,--wrap=log10 -Wl,--wrap=pow -Wl,--wrap=powint -Wl,--wrap=hypot -Wl,--wrap=cbrt -Wl,--wrap=fmod -Wl,--wrap=drem -Wl,--wrap=remainder -Wl,--wrap=remquo -Wl,--wrap=expm1 -Wl,--wrap=log1p -Wl,--wrap=fma -Wl,--wrap=__aeabi_fadd -Wl,--wrap=__aeabi_fdiv -Wl,--wrap=__aeabi_fmul -Wl,--wrap=__aeabi_frsub -Wl,--wrap=__aeabi_fsub -Wl,--wrap=__aeabi_cfcmpeq -Wl,--wrap=__aeabi_cfrcmple -Wl,--wrap=__aeabi_cfcmple -Wl,--wrap=__aeabi_fcmpeq -Wl,--wrap=__aeabi_fcmplt -Wl,--wrap=__aeabi_fcmple -Wl,--wrap=__aeabi_fcmpge -Wl,--wrap=__aeabi_fcmpgt -Wl,--wrap=__aeabi_fcmpun -Wl,--wrap=__aeabi_i2f -Wl,--wrap=__aeabi_l2f -Wl,--wrap=__aeabi_ui2f -Wl,--wrap=__aeabi_ul2f -Wl,--wrap=__aeabi_f2iz -Wl,--wrap=__aeabi_f2lz -Wl,--wrap=__aeabi_f2uiz -Wl,--wrap=__aeabi_f2ulz -Wl,--wrap=__aeabi_f2d -Wl,--wrap=sqrtf -Wl,--wrap=cosf -Wl,--wrap=sinf -Wl,--wrap=tanf -Wl,--wrap=atan2f -Wl,--wrap=expf -Wl,--wrap=logf -Wl,--wrap=ldexpf -Wl,--wrap=copysignf -Wl,--wrap=truncf -Wl,--wrap=floorf -Wl,--wrap=ceilf -Wl,--wrap=roundf -Wl,--wrap=sincosf -Wl,--wrap=asinf -Wl,--wrap=acosf -Wl,--wrap=atanf -Wl,--wrap=sinhf -Wl,--wrap=coshf -Wl,--wrap=tanhf -Wl,--wrap=asinhf -Wl,--wrap=acoshf -Wl,--wrap=atanhf -Wl,--wrap=exp2f -Wl,--wrap=log2f -Wl,--wrap=exp10f -Wl,--wrap=log10f -Wl,--wrap=powf -Wl,--wrap=powintf -Wl,--wrap=hypotf -Wl,--wrap=cbrtf -Wl,--wrap=fmodf -Wl,--wrap=dremf -Wl,--wrap=remainderf -Wl,--wrap=remquof -Wl,--wrap=expm1f -Wl,--wrap=log1pf -Wl,--wrap=fmaf -Wl,--wrap=memcpy -Wl,--wrap=memset -Wl,--wrap=__aeabi_memcpy -Wl,--wrap=__aeabi_memset -Wl,--wrap=__aeabi_memcpy4 -Wl,--wrap=__aeabi_memset4 -Wl,--wrap=__aeabi_memcpy8 -Wl,--wrap=__aeabi_memset8 # Use toolchain libm if we're not using our own. ifndef INTERNAL_LIBM LIBS += -lm endif +LIBS += -lc + SRC_SDK := \ src/common/pico_sync/critical_section.c \ src/common/pico_sync/lock_core.c \ @@ -270,7 +246,6 @@ SRC_C += \ background.c \ peripherals/pins.c \ lib/crypto-algorithms/sha256.c \ - fatfs_port.c \ lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c \ lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c \ mphalport.c \ @@ -441,7 +416,7 @@ $(BUILD)/firmware.elf: $(OBJ) $(LINK_LD) $(STEPECHO) "LINK $@" $(Q)echo $(OBJ) > $(BUILD)/firmware.objs $(Q)echo $(PICO_LDFLAGS) > $(BUILD)/firmware.ldflags - $(Q)$(CC) -o $@ $(CFLAGS) @$(BUILD)/firmware.ldflags -Wl,-T,$(LINK_LD) -Wl,-Map=$@.map -Wl,-cref -Wl,--gc-sections @$(BUILD)/firmware.objs + $(Q)$(CC) -o $@ $(CFLAGS) @$(BUILD)/firmware.ldflags -Wl,-T,$(LINK_LD) -Wl,-Map=$@.map -Wl,-cref -Wl,--gc-sections @$(BUILD)/firmware.objs -Wl,-lc $(Q)$(SIZE) $@ | $(PYTHON) $(TOP)/tools/build_memory_info.py $(LINK_LD) $(BUILD)/firmware.bin: $(BUILD)/firmware.elf diff --git a/ports/raspberrypi/bindings/rp2pio/StateMachine.c b/ports/raspberrypi/bindings/rp2pio/StateMachine.c index f45dc07357..041d02e5cd 100644 --- a/ports/raspberrypi/bindings/rp2pio/StateMachine.c +++ b/ports/raspberrypi/bindings/rp2pio/StateMachine.c @@ -422,7 +422,7 @@ MP_DEFINE_CONST_FUN_OBJ_KW(rp2pio_statemachine_write_obj, 2, rp2pio_statemachine //| ) -> None: //| """Write data to the TX fifo in the background, with optional looping. //| -//| First, if any previous ``once`` or ``loop`` buffer has not been started, this function blocks until they have. +//| First, if any previous ``once`` or ``loop`` buffer has not been started, this function blocks until they have been started. //| This means that any ``once`` or ``loop`` buffer will be written at least once. //| Then the ``once`` and/or ``loop`` buffers are queued. and the function returns. //| The ``once`` buffer (if specified) will be written just once. diff --git a/ports/raspberrypi/boards/challenger_rp2040_sdrtc/board.c b/ports/raspberrypi/boards/challenger_rp2040_sdrtc/board.c new file mode 100644 index 0000000000..b66ea0e27f --- /dev/null +++ b/ports/raspberrypi/boards/challenger_rp2040_sdrtc/board.c @@ -0,0 +1,29 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2022 Pontus Oldberg, Invector Labs + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "supervisor/board.h" + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/raspberrypi/boards/challenger_rp2040_sdrtc/mpconfigboard.h b/ports/raspberrypi/boards/challenger_rp2040_sdrtc/mpconfigboard.h new file mode 100644 index 0000000000..b8f08b9956 --- /dev/null +++ b/ports/raspberrypi/boards/challenger_rp2040_sdrtc/mpconfigboard.h @@ -0,0 +1,10 @@ +#define MICROPY_HW_BOARD_NAME "Challenger RP2040 SD/RTC" +#define MICROPY_HW_MCU_NAME "rp2040" + +#define DEFAULT_UART_BUS_TX (&pin_GPIO16) +#define DEFAULT_UART_BUS_RX (&pin_GPIO17) +#define DEFAULT_I2C_BUS_SDA (&pin_GPIO0) +#define DEFAULT_I2C_BUS_SCL (&pin_GPIO1) +#define DEFAULT_SPI_BUS_SCK (&pin_GPIO22) +#define DEFAULT_SPI_BUS_MOSI (&pin_GPIO23) +#define DEFAULT_SPI_BUS_MISO (&pin_GPIO20) diff --git a/ports/raspberrypi/boards/challenger_rp2040_sdrtc/mpconfigboard.mk b/ports/raspberrypi/boards/challenger_rp2040_sdrtc/mpconfigboard.mk new file mode 100644 index 0000000000..022dbd143c --- /dev/null +++ b/ports/raspberrypi/boards/challenger_rp2040_sdrtc/mpconfigboard.mk @@ -0,0 +1,13 @@ +USB_VID = 0x2e8a +USB_PID = 0x102d +USB_PRODUCT = "Challenger RP2040 SD/RTC" +USB_MANUFACTURER = "Invector Labs" + +CHIP_VARIANT = RP2040 +CHIP_FAMILY = rp2 + +EXTERNAL_FLASH_DEVICES = "W25Q64JVxQ" + +CIRCUITPY__EVE = 1 + +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_SD diff --git a/ports/raspberrypi/boards/challenger_rp2040_sdrtc/pico-sdk-configboard.h b/ports/raspberrypi/boards/challenger_rp2040_sdrtc/pico-sdk-configboard.h new file mode 100644 index 0000000000..36da55d457 --- /dev/null +++ b/ports/raspberrypi/boards/challenger_rp2040_sdrtc/pico-sdk-configboard.h @@ -0,0 +1 @@ +// Put board-specific pico-sdk definitions here. This file must exist. diff --git a/ports/raspberrypi/boards/challenger_rp2040_sdrtc/pins.c b/ports/raspberrypi/boards/challenger_rp2040_sdrtc/pins.c new file mode 100644 index 0000000000..7f4f620b59 --- /dev/null +++ b/ports/raspberrypi/boards/challenger_rp2040_sdrtc/pins.c @@ -0,0 +1,76 @@ +#include "shared-bindings/board/__init__.h" + +STATIC const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_GP0), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_GP1), MP_ROM_PTR(&pin_GPIO1) }, + + { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_GP2), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_GP3), MP_ROM_PTR(&pin_GPIO3) }, + + { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_GP4), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_GP5), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_GP6), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_GP7), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_GP8), MP_ROM_PTR(&pin_GPIO8) }, + + // RFM95W connections + { MP_ROM_QSTR(MP_QSTR_SD_CS), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_GP9), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_SD_SCK), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_GP10), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_SD_SDO), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_GP11), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_SD_SDI), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_GP12), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_SD_CARD_DETECT), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_GP13), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_D14), MP_ROM_PTR(&pin_GPIO13) }, + + { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO24) }, + { MP_ROM_QSTR(MP_QSTR_GP24), MP_ROM_PTR(&pin_GPIO24) }, + { MP_ROM_QSTR(MP_QSTR_D18), MP_ROM_PTR(&pin_GPIO24) }, + + { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_GP16), MP_ROM_PTR(&pin_GPIO16) }, + + { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_GP17), MP_ROM_PTR(&pin_GPIO17) }, + + { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_GPIO22) }, + { MP_ROM_QSTR(MP_QSTR_GP22), MP_ROM_PTR(&pin_GPIO22) }, + { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_GPIO23) }, + { MP_ROM_QSTR(MP_QSTR_GP23), MP_ROM_PTR(&pin_GPIO23) }, + { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO20) }, + { MP_ROM_QSTR(MP_QSTR_GP20), MP_ROM_PTR(&pin_GPIO20) }, + + { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_GP26), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_GP27), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_GPIO28) }, + { MP_ROM_QSTR(MP_QSTR_GP28), MP_ROM_PTR(&pin_GPIO28) }, + { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_GPIO29) }, + { MP_ROM_QSTR(MP_QSTR_GP29), MP_ROM_PTR(&pin_GPIO29) }, + { MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_GPIO19) }, + { MP_ROM_QSTR(MP_QSTR_GP19), MP_ROM_PTR(&pin_GPIO19) }, + { MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_GPIO21) }, + { MP_ROM_QSTR(MP_QSTR_GP21), MP_ROM_PTR(&pin_GPIO21) }, + + { 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_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/raspberrypi/boards/e_fidget/board.c b/ports/raspberrypi/boards/e_fidget/board.c new file mode 100644 index 0000000000..331653173e --- /dev/null +++ b/ports/raspberrypi/boards/e_fidget/board.c @@ -0,0 +1,29 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2021 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "supervisor/board.h" + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/raspberrypi/boards/e_fidget/mpconfigboard.h b/ports/raspberrypi/boards/e_fidget/mpconfigboard.h new file mode 100644 index 0000000000..5c34c77f94 --- /dev/null +++ b/ports/raspberrypi/boards/e_fidget/mpconfigboard.h @@ -0,0 +1,5 @@ +#define MICROPY_HW_BOARD_NAME "E-Fidget" +#define MICROPY_HW_MCU_NAME "rp2040" + +#define MICROPY_HW_NEOPIXEL (&pin_GPIO18) +#define MICROPY_HW_NEOPIXEL_COUNT (3) diff --git a/ports/raspberrypi/boards/e_fidget/mpconfigboard.mk b/ports/raspberrypi/boards/e_fidget/mpconfigboard.mk new file mode 100644 index 0000000000..62195e46f3 --- /dev/null +++ b/ports/raspberrypi/boards/e_fidget/mpconfigboard.mk @@ -0,0 +1,11 @@ +USB_VID = 0x1209 +USB_PID = 0xEF00 +USB_PRODUCT = "E-Fidget" +USB_MANUFACTURER = "2231puppy" + +CHIP_VARIANT = RP2040 +CHIP_FAMILY = rp2 + +EXTERNAL_FLASH_DEVICES = "W25Q16JVxQ" + +CIRCUITPY__EVE = 1 diff --git a/ports/raspberrypi/boards/e_fidget/pico-sdk-configboard.h b/ports/raspberrypi/boards/e_fidget/pico-sdk-configboard.h new file mode 100644 index 0000000000..5f7eb47ae3 --- /dev/null +++ b/ports/raspberrypi/boards/e_fidget/pico-sdk-configboard.h @@ -0,0 +1,2 @@ +// Put board-specific pico-sdk definitions here. This file must exist. +#define PICO_XOSC_STARTUP_DELAY_MULTIPLIER 64 diff --git a/ports/raspberrypi/boards/e_fidget/pins.c b/ports/raspberrypi/boards/e_fidget/pins.c new file mode 100644 index 0000000000..dbb27b782d --- /dev/null +++ b/ports/raspberrypi/boards/e_fidget/pins.c @@ -0,0 +1,32 @@ +#include "shared-bindings/board/__init__.h" + +STATIC const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + {MP_ROM_QSTR(MP_QSTR_GP0), MP_ROM_PTR(&pin_GPIO0)}, + {MP_ROM_QSTR(MP_QSTR_GP1), MP_ROM_PTR(&pin_GPIO1)}, + {MP_ROM_QSTR(MP_QSTR_GP2), MP_ROM_PTR(&pin_GPIO2)}, + {MP_ROM_QSTR(MP_QSTR_BTN1), MP_ROM_PTR(&pin_GPIO3)}, + {MP_ROM_QSTR(MP_QSTR_BTN3), MP_ROM_PTR(&pin_GPIO4)}, + {MP_ROM_QSTR(MP_QSTR_BTN2), MP_ROM_PTR(&pin_GPIO5)}, + {MP_ROM_QSTR(MP_QSTR_M1), MP_ROM_PTR(&pin_GPIO7)}, + {MP_ROM_QSTR(MP_QSTR_M2), MP_ROM_PTR(&pin_GPIO11)}, + {MP_ROM_QSTR(MP_QSTR_M3), MP_ROM_PTR(&pin_GPIO13)}, + {MP_ROM_QSTR(MP_QSTR_M4), MP_ROM_PTR(&pin_GPIO9)}, + {MP_ROM_QSTR(MP_QSTR_M5), MP_ROM_PTR(&pin_GPIO8)}, + {MP_ROM_QSTR(MP_QSTR_M6), MP_ROM_PTR(&pin_GPIO10)}, + {MP_ROM_QSTR(MP_QSTR_M7), MP_ROM_PTR(&pin_GPIO12)}, + {MP_ROM_QSTR(MP_QSTR_M8), MP_ROM_PTR(&pin_GPIO14)}, + {MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO18)}, + + {MP_ROM_QSTR(MP_QSTR_SMPS_MODE), MP_ROM_PTR(&pin_GPIO23)}, + + {MP_ROM_QSTR(MP_QSTR_VBUS_SENSE), MP_ROM_PTR(&pin_GPIO24)}, + + {MP_ROM_QSTR(MP_QSTR_GP26_A0), MP_ROM_PTR(&pin_GPIO26)}, + {MP_ROM_QSTR(MP_QSTR_GP26), MP_ROM_PTR(&pin_GPIO26)}, + {MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_GPIO26)}, + + {MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_GPIO29)}, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/raspberrypi/boards/nullbits_bit_c_pro/board.c b/ports/raspberrypi/boards/nullbits_bit_c_pro/board.c new file mode 100644 index 0000000000..331653173e --- /dev/null +++ b/ports/raspberrypi/boards/nullbits_bit_c_pro/board.c @@ -0,0 +1,29 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2021 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "supervisor/board.h" + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/raspberrypi/boards/nullbits_bit_c_pro/mpconfigboard.h b/ports/raspberrypi/boards/nullbits_bit_c_pro/mpconfigboard.h new file mode 100644 index 0000000000..d2a514006a --- /dev/null +++ b/ports/raspberrypi/boards/nullbits_bit_c_pro/mpconfigboard.h @@ -0,0 +1,17 @@ +#define MICROPY_HW_BOARD_NAME "nullbits Bit-C PRO" +#define MICROPY_HW_MCU_NAME "rp2040" + +#define DEFAULT_I2C_BUS_SCL (&pin_GPIO3) +#define DEFAULT_I2C_BUS_SDA (&pin_GPIO2) + +#define DEFAULT_SPI_BUS_SCK (&pin_GPIO22) +#define DEFAULT_SPI_BUS_MOSI (&pin_GPIO23) +#define DEFAULT_SPI_BUS_MISO (&pin_GPIO20) + +#define DEFAULT_UART_BUS_RX (&pin_GPIO1) +#define DEFAULT_UART_BUS_TX (&pin_GPIO0) + +#define CIRCUITPY_RGB_STATUS_INVERTED_PWM +#define CIRCUITPY_RGB_STATUS_R (&pin_GPIO16) +#define CIRCUITPY_RGB_STATUS_G (&pin_GPIO17) +#define CIRCUITPY_RGB_STATUS_B (&pin_GPIO18) diff --git a/ports/raspberrypi/boards/nullbits_bit_c_pro/mpconfigboard.mk b/ports/raspberrypi/boards/nullbits_bit_c_pro/mpconfigboard.mk new file mode 100644 index 0000000000..81271d3721 --- /dev/null +++ b/ports/raspberrypi/boards/nullbits_bit_c_pro/mpconfigboard.mk @@ -0,0 +1,9 @@ +USB_VID = 0x2E8A +USB_PID = 0x1048 +USB_PRODUCT = "Bit-C PRO" +USB_MANUFACTURER = "nullbits" + +CHIP_VARIANT = RP2040 +CHIP_FAMILY = rp2 + +EXTERNAL_FLASH_DEVICES = "GD25Q32C" diff --git a/ports/raspberrypi/boards/nullbits_bit_c_pro/pico-sdk-configboard.h b/ports/raspberrypi/boards/nullbits_bit_c_pro/pico-sdk-configboard.h new file mode 100644 index 0000000000..a41131dd22 --- /dev/null +++ b/ports/raspberrypi/boards/nullbits_bit_c_pro/pico-sdk-configboard.h @@ -0,0 +1,4 @@ +// Put board-specific pico-sdk definitions here. This file must exist. + +// Allow extra time for xosc to start. +#define PICO_XOSC_STARTUP_DELAY_MULTIPLIER 64 diff --git a/ports/raspberrypi/boards/nullbits_bit_c_pro/pins.c b/ports/raspberrypi/boards/nullbits_bit_c_pro/pins.c new file mode 100644 index 0000000000..ac1b1a8065 --- /dev/null +++ b/ports/raspberrypi/boards/nullbits_bit_c_pro/pins.c @@ -0,0 +1,49 @@ +#include "shared-bindings/board/__init__.h" + +STATIC const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_D26), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_D27), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_GPIO28) }, + { MP_ROM_QSTR(MP_QSTR_D28), MP_ROM_PTR(&pin_GPIO28) }, + { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_GPIO29) }, + { MP_ROM_QSTR(MP_QSTR_D29), MP_ROM_PTR(&pin_GPIO29) }, + + { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_GPIO22) }, + { MP_ROM_QSTR(MP_QSTR_D22), MP_ROM_PTR(&pin_GPIO22) }, + { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_GPIO23) }, + { MP_ROM_QSTR(MP_QSTR_D23), MP_ROM_PTR(&pin_GPIO23) }, + { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO20) }, + { MP_ROM_QSTR(MP_QSTR_D20), MP_ROM_PTR(&pin_GPIO20) }, + + { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO0) }, + + { MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO3) }, + + { MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_D8), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_D21), MP_ROM_PTR(&pin_GPIO21) }, + + { MP_ROM_QSTR(MP_QSTR_LED_RED), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_LED_GREEN), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_LED_BLUE), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO18) }, + + { 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_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/raspberrypi/boards/raspberry_pi_pico/mpconfigboard.h b/ports/raspberrypi/boards/raspberry_pi_pico/mpconfigboard.h index 4714241999..548af930ba 100644 --- a/ports/raspberrypi/boards/raspberry_pi_pico/mpconfigboard.h +++ b/ports/raspberrypi/boards/raspberry_pi_pico/mpconfigboard.h @@ -1,5 +1,7 @@ #define MICROPY_HW_BOARD_NAME "Raspberry Pi Pico" #define MICROPY_HW_MCU_NAME "rp2040" +#define MICROPY_HW_LED_STATUS (&pin_GPIO25) + #define CIRCUITPY_BOARD_I2C (1) #define CIRCUITPY_BOARD_I2C_PIN {{.scl = &pin_GPIO5, .sda = &pin_GPIO4}} diff --git a/ports/raspberrypi/boards/raspberry_pi_pico_w/mpconfigboard.h b/ports/raspberrypi/boards/raspberry_pi_pico_w/mpconfigboard.h index e5d8660b2b..a31ee7327c 100644 --- a/ports/raspberrypi/boards/raspberry_pi_pico_w/mpconfigboard.h +++ b/ports/raspberrypi/boards/raspberry_pi_pico_w/mpconfigboard.h @@ -4,5 +4,7 @@ #define CIRCUITPY_DIGITALIO_HAVE_INVALID_PULL (1) #define CIRCUITPY_DIGITALIO_HAVE_INVALID_DRIVE_MODE (1) +#define MICROPY_HW_LED_STATUS (&pin_CYW0) + #define CIRCUITPY_BOARD_I2C (1) #define CIRCUITPY_BOARD_I2C_PIN {{.scl = &pin_GPIO5, .sda = &pin_GPIO4}} diff --git a/ports/raspberrypi/boards/raspberry_pi_pico_w/mpconfigboard.mk b/ports/raspberrypi/boards/raspberry_pi_pico_w/mpconfigboard.mk index 9773755649..a050391505 100644 --- a/ports/raspberrypi/boards/raspberry_pi_pico_w/mpconfigboard.mk +++ b/ports/raspberrypi/boards/raspberry_pi_pico_w/mpconfigboard.mk @@ -14,8 +14,8 @@ CIRCUITPY_CYW43 = 1 CIRCUITPY_SSL = 1 CIRCUITPY_SSL_MBEDTLS = 1 CIRCUITPY_HASHLIB = 1 -CIRCUITPY_WEB_WORKFLOW = 0 -CIRCUITPY_MDNS = 0 +CIRCUITPY_WEB_WORKFLOW = 1 +CIRCUITPY_MDNS = 1 CIRCUITPY_SOCKETPOOL = 1 CIRCUITPY_WIFI = 1 diff --git a/ports/raspberrypi/boards/waveshare_rp2040_lcd_1_28/board.c b/ports/raspberrypi/boards/waveshare_rp2040_lcd_1_28/board.c new file mode 100644 index 0000000000..331653173e --- /dev/null +++ b/ports/raspberrypi/boards/waveshare_rp2040_lcd_1_28/board.c @@ -0,0 +1,29 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2021 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "supervisor/board.h" + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/raspberrypi/boards/waveshare_rp2040_lcd_1_28/mpconfigboard.h b/ports/raspberrypi/boards/waveshare_rp2040_lcd_1_28/mpconfigboard.h new file mode 100644 index 0000000000..db90970b7f --- /dev/null +++ b/ports/raspberrypi/boards/waveshare_rp2040_lcd_1_28/mpconfigboard.h @@ -0,0 +1,2 @@ +#define MICROPY_HW_BOARD_NAME "Waveshare RP2040-LCD-1.28" +#define MICROPY_HW_MCU_NAME "rp2040" diff --git a/ports/raspberrypi/boards/waveshare_rp2040_lcd_1_28/mpconfigboard.mk b/ports/raspberrypi/boards/waveshare_rp2040_lcd_1_28/mpconfigboard.mk new file mode 100644 index 0000000000..8c5c9f5f50 --- /dev/null +++ b/ports/raspberrypi/boards/waveshare_rp2040_lcd_1_28/mpconfigboard.mk @@ -0,0 +1,17 @@ +USB_VID = 0x2E8A +USB_PID = 0x1039 +USB_PRODUCT = "Waveshare RP2040-LCD-1.28" +USB_MANUFACTURER = "Waveshare Electronics" + +CHIP_VARIANT = RP2040 +CHIP_FAMILY = rp2 + +EXTERNAL_FLASH_DEVICES = "W25Q32JVxQ" + +CIRCUITPY__EVE = 1 + +# TODO: Add custom QMI8658 driver +# FROZEN_MPY_DIRS += $(TOP)/frozen/circuitpython_qmi8658 + +# TODO: Add custom GC9A01 driver +# FROZEN_MPY_DIRS += $(TOP)/frozen/circuitpython_gc9a01 diff --git a/ports/raspberrypi/boards/waveshare_rp2040_lcd_1_28/pico-sdk-configboard.h b/ports/raspberrypi/boards/waveshare_rp2040_lcd_1_28/pico-sdk-configboard.h new file mode 100644 index 0000000000..36da55d457 --- /dev/null +++ b/ports/raspberrypi/boards/waveshare_rp2040_lcd_1_28/pico-sdk-configboard.h @@ -0,0 +1 @@ +// Put board-specific pico-sdk definitions here. This file must exist. diff --git a/ports/raspberrypi/boards/waveshare_rp2040_lcd_1_28/pins.c b/ports/raspberrypi/boards/waveshare_rp2040_lcd_1_28/pins.c new file mode 100644 index 0000000000..9153e8f78a --- /dev/null +++ b/ports/raspberrypi/boards/waveshare_rp2040_lcd_1_28/pins.c @@ -0,0 +1,70 @@ +#include "shared-bindings/board/__init__.h" + +STATIC const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + { MP_ROM_QSTR(MP_QSTR_GP0), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_GP1), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_GP2), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_GP3), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_GP4), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_GP5), MP_ROM_PTR(&pin_GPIO5) }, + + { MP_ROM_QSTR(MP_QSTR_IMU_SDA), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_GP6), MP_ROM_PTR(&pin_GPIO6) }, + + { MP_ROM_QSTR(MP_QSTR_IMU_SCL), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_GP7), MP_ROM_PTR(&pin_GPIO7) }, + + { MP_ROM_QSTR(MP_QSTR_LCD_DC), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_GP8), MP_ROM_PTR(&pin_GPIO8) }, + + { MP_ROM_QSTR(MP_QSTR_LCD_CS), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_GP9), MP_ROM_PTR(&pin_GPIO9) }, + + { MP_ROM_QSTR(MP_QSTR_LCD_CLK), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_GP10), MP_ROM_PTR(&pin_GPIO10) }, + + { MP_ROM_QSTR(MP_QSTR_LCD_DIN), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_GP11), MP_ROM_PTR(&pin_GPIO11) }, + + { MP_ROM_QSTR(MP_QSTR_LCD_RST), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_GP12), MP_ROM_PTR(&pin_GPIO12) }, + + + { MP_ROM_QSTR(MP_QSTR_GP13), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_GP14), MP_ROM_PTR(&pin_GPIO14) }, + { MP_ROM_QSTR(MP_QSTR_GP15), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_GP16), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_GP17), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_GP18), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_GP19), MP_ROM_PTR(&pin_GPIO19) }, + { MP_ROM_QSTR(MP_QSTR_GP20), MP_ROM_PTR(&pin_GPIO20) }, + { MP_ROM_QSTR(MP_QSTR_GP21), MP_ROM_PTR(&pin_GPIO21) }, + { MP_ROM_QSTR(MP_QSTR_GP22), MP_ROM_PTR(&pin_GPIO22) }, + + { MP_ROM_QSTR(MP_QSTR_IMU_INT1), MP_ROM_PTR(&pin_GPIO23) }, + { MP_ROM_QSTR(MP_QSTR_GP23), MP_ROM_PTR(&pin_GPIO23) }, + + { MP_ROM_QSTR(MP_QSTR_IMU_INT2), MP_ROM_PTR(&pin_GPIO24) }, + { MP_ROM_QSTR(MP_QSTR_GP24), MP_ROM_PTR(&pin_GPIO24) }, + + { MP_ROM_QSTR(MP_QSTR_LCD_BL), MP_ROM_PTR(&pin_GPIO25) }, + { MP_ROM_QSTR(MP_QSTR_GP25), MP_ROM_PTR(&pin_GPIO25) }, + + { MP_ROM_QSTR(MP_QSTR_GP26_A0), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_GP26), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_GPIO26) }, + + { MP_ROM_QSTR(MP_QSTR_GP27_A1), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_GP27), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_GPIO27) }, + + { MP_ROM_QSTR(MP_QSTR_GP28_A2), MP_ROM_PTR(&pin_GPIO28) }, + { MP_ROM_QSTR(MP_QSTR_GP28), MP_ROM_PTR(&pin_GPIO28) }, + { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_GPIO28) }, + + { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_GPIO29) }, + { MP_ROM_QSTR(MP_QSTR_BAT_ADC), MP_ROM_PTR(&pin_GPIO29) }, // Battery voltage readout, 0.50 bias +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/raspberrypi/boards/weact_studio_pico_16mb/board.c b/ports/raspberrypi/boards/weact_studio_pico_16mb/board.c new file mode 100644 index 0000000000..76973aee30 --- /dev/null +++ b/ports/raspberrypi/boards/weact_studio_pico_16mb/board.c @@ -0,0 +1,29 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2022 Fabian Affolter + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "supervisor/board.h" + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/raspberrypi/boards/weact_studio_pico_16mb/mpconfigboard.h b/ports/raspberrypi/boards/weact_studio_pico_16mb/mpconfigboard.h new file mode 100644 index 0000000000..2dabc3eb1b --- /dev/null +++ b/ports/raspberrypi/boards/weact_studio_pico_16mb/mpconfigboard.h @@ -0,0 +1,2 @@ +#define MICROPY_HW_BOARD_NAME "WeAct Studio Pico 16MB" +#define MICROPY_HW_MCU_NAME "rp2040" diff --git a/ports/raspberrypi/boards/weact_studio_pico_16mb/mpconfigboard.mk b/ports/raspberrypi/boards/weact_studio_pico_16mb/mpconfigboard.mk new file mode 100644 index 0000000000..55209e1eb4 --- /dev/null +++ b/ports/raspberrypi/boards/weact_studio_pico_16mb/mpconfigboard.mk @@ -0,0 +1,11 @@ +USB_VID = 0x239A +USB_PID = 0x102E +USB_PRODUCT = "Pico" +USB_MANUFACTURER = "WeAct Studio" + +CHIP_VARIANT = RP2040 +CHIP_FAMILY = rp2 + +EXTERNAL_FLASH_DEVICES = "W25Q128JVxQ" + +CIRCUITPY__EVE = 1 diff --git a/ports/raspberrypi/boards/weact_studio_pico_16mb/pico-sdk-configboard.h b/ports/raspberrypi/boards/weact_studio_pico_16mb/pico-sdk-configboard.h new file mode 100644 index 0000000000..36da55d457 --- /dev/null +++ b/ports/raspberrypi/boards/weact_studio_pico_16mb/pico-sdk-configboard.h @@ -0,0 +1 @@ +// Put board-specific pico-sdk definitions here. This file must exist. diff --git a/ports/raspberrypi/boards/weact_studio_pico_16mb/pins.c b/ports/raspberrypi/boards/weact_studio_pico_16mb/pins.c new file mode 100644 index 0000000000..8632d9c322 --- /dev/null +++ b/ports/raspberrypi/boards/weact_studio_pico_16mb/pins.c @@ -0,0 +1,53 @@ +#include "shared-bindings/board/__init__.h" + +STATIC const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + { MP_ROM_QSTR(MP_QSTR_GP0), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_GP1), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_GP2), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_GP3), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_GP4), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_GP5), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_GP6), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_GP7), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_GP8), MP_ROM_PTR(&pin_GPIO8) }, + { MP_ROM_QSTR(MP_QSTR_GP9), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_GP10), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_GP11), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_GP12), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_GP13), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_GP14), MP_ROM_PTR(&pin_GPIO14) }, + { MP_ROM_QSTR(MP_QSTR_GP15), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_GP16), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_GP17), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_GP18), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_GP19), MP_ROM_PTR(&pin_GPIO19) }, + { MP_ROM_QSTR(MP_QSTR_GP20), MP_ROM_PTR(&pin_GPIO20) }, + { MP_ROM_QSTR(MP_QSTR_GP21), MP_ROM_PTR(&pin_GPIO21) }, + { MP_ROM_QSTR(MP_QSTR_GP22), MP_ROM_PTR(&pin_GPIO22) }, + + { MP_ROM_QSTR(MP_QSTR_BUTTON), MP_ROM_PTR(&pin_GPIO23) }, + { MP_ROM_QSTR(MP_QSTR_GP23), MP_ROM_PTR(&pin_GPIO23) }, + + { MP_ROM_QSTR(MP_QSTR_GP24), MP_ROM_PTR(&pin_GPIO24) }, + + { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO25) }, + { MP_ROM_QSTR(MP_QSTR_GP25), MP_ROM_PTR(&pin_GPIO25) }, + + { MP_ROM_QSTR(MP_QSTR_GP26_A0), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_GP26), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_GPIO26) }, + + { MP_ROM_QSTR(MP_QSTR_GP27_A1), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_GP27), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_GPIO27) }, + + { MP_ROM_QSTR(MP_QSTR_GP28_A2), MP_ROM_PTR(&pin_GPIO28) }, + { MP_ROM_QSTR(MP_QSTR_GP28), MP_ROM_PTR(&pin_GPIO28) }, + { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_GPIO28) }, + + { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_GPIO29) }, + { MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_GPIO29) }, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/raspberrypi/common-hal/analogbufio/BufferedIn.c b/ports/raspberrypi/common-hal/analogbufio/BufferedIn.c index 951c07af03..bc5f9028b7 100644 --- a/ports/raspberrypi/common-hal/analogbufio/BufferedIn.c +++ b/ports/raspberrypi/common-hal/analogbufio/BufferedIn.c @@ -33,6 +33,7 @@ #include "common-hal/analogbufio/BufferedIn.h" #include "shared-bindings/analogbufio/BufferedIn.h" #include "shared-bindings/microcontroller/Pin.h" +#include "shared/runtime/interrupt_char.h" #include "py/runtime.h" #include "supervisor/shared/translate/translate.h" #include "src/rp2_common/hardware_adc/include/hardware/adc.h" @@ -42,13 +43,18 @@ #define ADC_FIRST_PIN_NUMBER 26 #define ADC_PIN_COUNT 4 -void common_hal_analogbufio_bufferedin_construct(analogbufio_bufferedin_obj_t *self, const mcu_pin_obj_t *pin, uint8_t *buffer, uint32_t len, uint8_t bytes_per_sample, bool samples_signed, uint32_t sample_rate) { +#define ADC_CLOCK_INPUT 48000000 +#define ADC_MAX_CLOCK_DIV (1 << (ADC_DIV_INT_MSB - ADC_DIV_INT_LSB + 1)) +void common_hal_analogbufio_bufferedin_construct(analogbufio_bufferedin_obj_t *self, const mcu_pin_obj_t *pin, uint32_t sample_rate) { // Make sure pin number is in range for ADC if (pin->number < ADC_FIRST_PIN_NUMBER || pin->number >= (ADC_FIRST_PIN_NUMBER + ADC_PIN_COUNT)) { raise_ValueError_invalid_pins(); } + // Validate sample rate here + sample_rate = (uint32_t)mp_arg_validate_int_range(sample_rate, ADC_CLOCK_INPUT / ADC_MAX_CLOCK_DIV, ADC_CLOCK_INPUT / 96, MP_QSTR_sample_rate); + // Set pin and channel self->pin = pin; claim_pin(pin); @@ -56,45 +62,13 @@ void common_hal_analogbufio_bufferedin_construct(analogbufio_bufferedin_obj_t *s // TODO: find a way to accept ADC4 for temperature self->chan = pin->number - ADC_FIRST_PIN_NUMBER; - // Set buffer and length - self->buffer = buffer; - self->len = len; - - // Set sample rate - used in read - self->bytes_per_sample = bytes_per_sample; - self->sample_rate = sample_rate; - // Init GPIO for analogue use: hi-Z, no pulls, disable digital input buffer. + // TODO: Make sure we share the ADC well. Right now we just assume it is + // unused. adc_init(); adc_gpio_init(pin->number); adc_select_input(self->chan); // chan = pin - 26 ?? - // RP2040 Implementation Detail - // Fills the supplied buffer with ADC values using DMA transfer. - // If the buffer is 8-bit, then values are 8-bit shifted and error bit is off. - // If buffer is 16-bit, then values are not shifted and error bit is present. - // Number of transfers is always the number of samples which is the array - // byte length divided by the bytes_per_sample. - - // self->bytes_per_sample == 1 - uint dma_size = DMA_SIZE_8; - bool show_error_bit = false; - bool shift_sample_8_bits = true; - if (self->bytes_per_sample == 2) { - dma_size = DMA_SIZE_16; - show_error_bit = true; - shift_sample_8_bits = false; - } - - // adc_select_input(self->pin->number - ADC_FIRST_PIN_NUMBER); - adc_fifo_setup( - true, // Write each completed conversion to the sample FIFO - true, // Enable DMA data request (DREQ) - 1, // DREQ (and IRQ) asserted when at least 1 sample present - show_error_bit, // See the ERR bit - shift_sample_8_bits // Shift each sample to 8 bits when pushing to FIFO - ); - // Divisor of 0 -> full speed. Free-running capture with the divider is // equivalent to pressing the ADC_CS_START_ONCE button once per `div + 1` // cycles (div not necessarily an integer). Each conversion takes 96 @@ -104,7 +78,8 @@ void common_hal_analogbufio_bufferedin_construct(analogbufio_bufferedin_obj_t *s // sample rate determines divisor, not zero. // sample_rate is forced to be >= 1 in shared-bindings - adc_set_clkdiv((float)48000000.0 / (float)self->sample_rate); + float clk_div = (float)ADC_CLOCK_INPUT / (float)sample_rate; + adc_set_clkdiv(clk_div); // Set up the DMA to start transferring data as soon as it appears in FIFO uint dma_chan = dma_claim_unused_channel(true); @@ -114,7 +89,6 @@ void common_hal_analogbufio_bufferedin_construct(analogbufio_bufferedin_obj_t *s self->cfg = dma_channel_get_default_config(dma_chan); // Reading from constant address, writing to incrementing byte addresses - channel_config_set_transfer_data_size(&(self->cfg), dma_size); channel_config_set_read_increment(&(self->cfg), false); channel_config_set_write_increment(&(self->cfg), true); @@ -143,14 +117,38 @@ void common_hal_analogbufio_bufferedin_deinit(analogbufio_bufferedin_obj_t *self dma_channel_unclaim(self->dma_chan); } -void common_hal_analogbufio_bufferedin_read(analogbufio_bufferedin_obj_t *self) { +uint32_t common_hal_analogbufio_bufferedin_readinto(analogbufio_bufferedin_obj_t *self, uint8_t *buffer, uint32_t len, uint8_t bytes_per_sample) { + // RP2040 Implementation Detail + // Fills the supplied buffer with ADC values using DMA transfer. + // If the buffer is 8-bit, then values are 8-bit shifted and error bit is off. + // If buffer is 16-bit, then values are 12-bit and error bit is present. We + // stretch the 12-bit value to 16-bits and truncate the number of valid + // samples at the first sample with the error bit set. + // Number of transfers is always the number of samples which is the array + // byte length divided by the bytes_per_sample. + uint dma_size = DMA_SIZE_8; + bool show_error_bit = false; + if (bytes_per_sample == 2) { + dma_size = DMA_SIZE_16; + show_error_bit = true; + } - uint32_t cdl = self->len / self->bytes_per_sample; + adc_fifo_setup( + true, // Write each completed conversion to the sample FIFO + true, // Enable DMA data request (DREQ) + 1, // DREQ (and IRQ) asserted when at least 1 sample present + show_error_bit, // See the ERR bit + bytes_per_sample == 1 // Shift each sample to 8 bits when pushing to FIFO + ); + + uint32_t sample_count = len / bytes_per_sample; + + channel_config_set_transfer_data_size(&(self->cfg), dma_size); dma_channel_configure(self->dma_chan, &(self->cfg), - self->buffer, // dst + buffer, // dst &adc_hw->fifo, // src - cdl, // transfer count + sample_count, // transfer count true // start immediately ); @@ -159,9 +157,34 @@ void common_hal_analogbufio_bufferedin_read(analogbufio_bufferedin_obj_t *self) // Once DMA finishes, stop any new conversions from starting, and clean up // the FIFO in case the ADC was still mid-conversion. - dma_channel_wait_for_finish_blocking(self->dma_chan); + uint32_t remaining_transfers = sample_count; + while (dma_channel_is_busy(self->dma_chan) && + !mp_hal_is_interrupted()) { + RUN_BACKGROUND_TASKS; + } + remaining_transfers = dma_channel_hw_addr(self->dma_chan)->transfer_count; // Clean up adc_run(false); + // Stopping early so abort. + if (dma_channel_is_busy(self->dma_chan)) { + dma_channel_abort(self->dma_chan); + } adc_fifo_drain(); + + size_t captured_count = sample_count - remaining_transfers; + if (dma_size == DMA_SIZE_16) { + uint16_t *buf16 = (uint16_t *)buffer; + for (size_t i = 0; i < captured_count; i++) { + uint16_t value = buf16[i]; + // Check the error bit and "truncate" the buffer if there is an error. + if ((value & ADC_FIFO_ERR_BITS) != 0) { + captured_count = i; + break; + } + // Scale the values to the standard 16 bit range. + buf16[i] = (value << 4) | (value >> 8); + } + } + return captured_count; } diff --git a/ports/raspberrypi/common-hal/analogbufio/BufferedIn.h b/ports/raspberrypi/common-hal/analogbufio/BufferedIn.h index 8b183a1d70..8ed4cf3a2c 100644 --- a/ports/raspberrypi/common-hal/analogbufio/BufferedIn.h +++ b/ports/raspberrypi/common-hal/analogbufio/BufferedIn.h @@ -41,16 +41,9 @@ typedef struct { mp_obj_base_t base; const mcu_pin_obj_t *pin; - uint8_t *buffer; - uint32_t len; - uint8_t bytes_per_sample; - bool samples_signed; - uint32_t sample_rate; uint8_t chan; uint dma_chan; dma_channel_config cfg; } analogbufio_bufferedin_obj_t; -void bufferedin_init(void); - #endif // MICROPY_INCLUDED_RASPBERRYPI_COMMON_HAL_ANALOGBUFIO_BUFFEREDIN_H diff --git a/ports/raspberrypi/common-hal/busio/SPI.c b/ports/raspberrypi/common-hal/busio/SPI.c index a7b97823f9..67323790bf 100644 --- a/ports/raspberrypi/common-hal/busio/SPI.c +++ b/ports/raspberrypi/common-hal/busio/SPI.c @@ -151,6 +151,15 @@ bool common_hal_busio_spi_configure(busio_spi_obj_t *self, spi_set_format(self->peripheral, bits, polarity, phase, SPI_MSB_FIRST); + // Workaround to start with clock line high if polarity=1. The hw SPI peripheral does not do this + // automatically. See https://github.com/raspberrypi/pico-sdk/issues/868 and + // https://forums.raspberrypi.com/viewtopic.php?t=336142 + // TODO: scheduled to be be fixed in pico-sdk 1.5.0. + if (polarity) { + hw_clear_bits(&spi_get_hw(self->peripheral)->cr1, SPI_SSPCR1_SSE_BITS); // disable the SPI + hw_set_bits(&spi_get_hw(self->peripheral)->cr1, SPI_SSPCR1_SSE_BITS); // re-enable the SPI + } + self->polarity = polarity; self->phase = phase; self->bits = bits; diff --git a/ports/raspberrypi/common-hal/mdns/RemoteService.c b/ports/raspberrypi/common-hal/mdns/RemoteService.c new file mode 100644 index 0000000000..071a9c1648 --- /dev/null +++ b/ports/raspberrypi/common-hal/mdns/RemoteService.c @@ -0,0 +1,64 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2022 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 "shared-bindings/mdns/RemoteService.h" + +#include "shared-bindings/ipaddress/IPv4Address.h" + +const char *common_hal_mdns_remoteservice_get_service_type(mdns_remoteservice_obj_t *self) { + return self->service_name; +} + +const char *common_hal_mdns_remoteservice_get_protocol(mdns_remoteservice_obj_t *self) { + return self->protocol; +} + +const char *common_hal_mdns_remoteservice_get_instance_name(mdns_remoteservice_obj_t *self) { + return self->instance_name; +} + +const char *common_hal_mdns_remoteservice_get_hostname(mdns_remoteservice_obj_t *self) { + return self->hostname; +} + +mp_int_t common_hal_mdns_remoteservice_get_port(mdns_remoteservice_obj_t *self) { + return self->port; +} + +uint32_t mdns_remoteservice_get_ipv4_address(mdns_remoteservice_obj_t *self) { + return self->ipv4_address; +} + +mp_obj_t common_hal_mdns_remoteservice_get_ipv4_address(mdns_remoteservice_obj_t *self) { + uint32_t addr = mdns_remoteservice_get_ipv4_address(self); + if (addr == 0) { + return mp_const_none; + } + return common_hal_ipaddress_new_ipv4address(addr); +} + +void common_hal_mdns_remoteservice_deinit(mdns_remoteservice_obj_t *self) { +} diff --git a/ports/raspberrypi/common-hal/mdns/RemoteService.h b/ports/raspberrypi/common-hal/mdns/RemoteService.h new file mode 100644 index 0000000000..06814f0fbb --- /dev/null +++ b/ports/raspberrypi/common-hal/mdns/RemoteService.h @@ -0,0 +1,40 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2022 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 + +#include "lwip/apps/mdns.h" + +typedef struct { + mp_obj_base_t base; + uint32_t ipv4_address; + uint16_t port; + char protocol[5]; // RFC 6763 Section 7.2 - 4 bytes + 1 for NUL + char service_name[17]; // RFC 6763 Section 7.2 - 16 bytes + 1 for NUL + char instance_name[64]; // RFC 6763 Section 7.2 - 63 bytes + 1 for NUL + char hostname[64]; // RFC 6762 Appendix A - 63 bytes for label + 1 for NUL + mp_obj_t next; +} mdns_remoteservice_obj_t; diff --git a/ports/raspberrypi/common-hal/mdns/Server.c b/ports/raspberrypi/common-hal/mdns/Server.c new file mode 100644 index 0000000000..72aedf3889 --- /dev/null +++ b/ports/raspberrypi/common-hal/mdns/Server.c @@ -0,0 +1,307 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2022 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 "shared-bindings/mdns/Server.h" + +#include "py/gc.h" +#include "py/runtime.h" +#include "shared/runtime/interrupt_char.h" +#include "shared-bindings/mdns/RemoteService.h" +#include "shared-bindings/wifi/__init__.h" +#include "supervisor/shared/tick.h" + +#include "lwip/apps/mdns.h" +#include "lwip/prot/dns.h" + +STATIC bool inited = false; + +#define NETIF_STA (&cyw43_state.netif[CYW43_ITF_STA]) +#define NETIF_AP (&cyw43_state.netif[CYW43_ITF_AP]) + +void mdns_server_construct(mdns_server_obj_t *self, bool workflow) { + if (inited) { + return; + } + + mdns_resp_init(); + inited = true; + + uint8_t mac[6]; + wifi_radio_get_mac_address(&common_hal_wifi_radio_obj, mac); + snprintf(self->default_hostname, sizeof(self->default_hostname), "cpy-%02x%02x%02x", mac[3], mac[4], mac[5]); + common_hal_mdns_server_set_hostname(self, self->default_hostname); + + if (workflow) { + // Add a second host entry to respond to "circuitpython.local" queries as well. + + #if MDNS_MAX_SECONDARY_HOSTNAMES > 0 + mdns_resp_add_secondary_hostname(NETIF_STA, "circuitpython"); + #endif + } +} + +void common_hal_mdns_server_construct(mdns_server_obj_t *self, mp_obj_t network_interface) { + if (network_interface != MP_OBJ_FROM_PTR(&common_hal_wifi_radio_obj)) { + mp_raise_ValueError(translate("mDNS only works with built-in WiFi")); + return; + } + if (inited) { + mp_raise_RuntimeError(translate("mDNS already initialized")); + } + mdns_server_construct(self, false); +} + +void common_hal_mdns_server_deinit(mdns_server_obj_t *self) { + inited = false; + mdns_resp_remove_netif(NETIF_STA); +} + +bool common_hal_mdns_server_deinited(mdns_server_obj_t *self) { + return !mdns_resp_netif_active(NETIF_STA); +} + +const char *common_hal_mdns_server_get_hostname(mdns_server_obj_t *self) { + return self->hostname; +} + +void common_hal_mdns_server_set_hostname(mdns_server_obj_t *self, const char *hostname) { + if (mdns_resp_netif_active(NETIF_STA)) { + mdns_resp_rename_netif(NETIF_STA, hostname); + } else { + mdns_resp_add_netif(NETIF_STA, hostname); + } + + self->hostname = hostname; +} + +const char *common_hal_mdns_server_get_instance_name(mdns_server_obj_t *self) { + return self->instance_name; +} + +void common_hal_mdns_server_set_instance_name(mdns_server_obj_t *self, const char *instance_name) { + self->instance_name = instance_name; +} + +typedef struct { + uint8_t request_id; + size_t i; + mdns_remoteservice_obj_t *out; + size_t out_len; +} nonalloc_search_state_t; + +STATIC void copy_data_into_remote_service(struct mdns_answer *answer, const char *varpart, int varlen, mdns_remoteservice_obj_t *out) { + if (varlen > 0) { + if (answer->info.type == DNS_RRTYPE_A) { + char *hostname = out->hostname; + size_t len = MIN(63, answer->info.domain.name[0]); + memcpy(hostname, answer->info.domain.name + 1, len); + hostname[len] = '\0'; + out->ipv4_address = varpart[0] | varpart[1] << 8 | varpart[2] << 16 | varpart[3] << 24; + } + if (answer->info.type == DNS_RRTYPE_SRV) { + // This isn't a null terminated string. Its length encoded. + uint8_t *domain = answer->info.domain.name; + char *instance_name = out->instance_name; + size_t offset = 0; + uint8_t iname_len = domain[offset++]; + size_t len = MIN(63, iname_len); + memcpy(instance_name, domain + offset, len); + offset += iname_len; + instance_name[len] = '\0'; + + uint8_t sn_len = domain[offset++]; + char *service_name = out->service_name; + len = MIN(16, sn_len); + memcpy(service_name, domain + offset, len); + offset += sn_len; + service_name[len] = '\0'; + + uint8_t proto_len = domain[offset++]; + char *protocol = out->protocol; + len = MIN(4, proto_len); + memcpy(protocol, domain + offset, len); + offset += proto_len; + protocol[len] = '\0'; + + out->port = varpart[4] << 8 | varpart[5]; + } + } +} + +STATIC void search_result_cb(struct mdns_answer *answer, const char *varpart, int varlen, int flags, void *arg) { + nonalloc_search_state_t *state = arg; + state->out[state->i].base.type = &mdns_remoteservice_type; + + copy_data_into_remote_service(answer, varpart, varlen, &state->out[state->i]); + + if ((flags & MDNS_SEARCH_RESULT_LAST) != 0) { + state->i += 1; + } + + if (state->i == state->out_len) { + mdns_search_stop(state->request_id); + state->request_id = MDNS_MAX_REQUESTS; + } +} + +size_t mdns_server_find(mdns_server_obj_t *self, const char *service_type, const char *protocol, + mp_float_t timeout, mdns_remoteservice_obj_t *out, size_t out_len) { + + enum mdns_sd_proto proto = DNSSD_PROTO_UDP; + if (strcmp(protocol, "_tcp") == 0) { + proto = DNSSD_PROTO_TCP; + } + + nonalloc_search_state_t state; + state.i = 0; + state.out = out; + state.out_len = out_len; + + err_t err = mdns_search_service(NULL, service_type, proto, + NETIF_STA, &search_result_cb, &state, + &state.request_id); + if (err != ERR_OK) { + return 0; + } + + uint64_t start_ticks = supervisor_ticks_ms64(); + uint64_t timeout_ms = timeout * 1000; + + while (state.request_id < MDNS_MAX_REQUESTS && + !mp_hal_is_interrupted() && + supervisor_ticks_ms64() - start_ticks < timeout_ms) { + RUN_BACKGROUND_TASKS; + } + if (state.request_id < MDNS_MAX_REQUESTS) { + mdns_search_stop(state.request_id); + state.request_id = MDNS_MAX_REQUESTS; + } + + return state.i; +} + +typedef struct { + uint8_t request_id; + mdns_remoteservice_obj_t *head; + size_t count; +} alloc_search_state_t; + +STATIC void alloc_search_result_cb(struct mdns_answer *answer, const char *varpart, int varlen, int flags, void *arg) { + alloc_search_state_t *state = arg; + + if ((flags & MDNS_SEARCH_RESULT_FIRST) != 0) { + // first + mdns_remoteservice_obj_t *service = gc_alloc(sizeof(mdns_remoteservice_obj_t), 0, false); + mp_printf(&mp_plat_print, "found service %p\n", service); + if (service == NULL) { + // alloc fails + mdns_search_stop(state->request_id); + state->request_id = MDNS_MAX_REQUESTS; + if (state->count == 0) { + m_malloc_fail(sizeof(mdns_remoteservice_obj_t)); + } + return; + } + service->base.type = &mdns_remoteservice_type; + state->count++; + service->next = state->head; + state->head = service; + } + + copy_data_into_remote_service(answer, varpart, varlen, state->head); +} + +mp_obj_t common_hal_mdns_server_find(mdns_server_obj_t *self, const char *service_type, const char *protocol, mp_float_t timeout) { + enum mdns_sd_proto proto = DNSSD_PROTO_UDP; + if (strcmp(protocol, "_tcp") == 0) { + proto = DNSSD_PROTO_TCP; + } + + alloc_search_state_t state; + state.count = 0; + state.head = NULL; + + err_t err = mdns_search_service(NULL, service_type, proto, + NETIF_STA, &alloc_search_result_cb, &state, + &state.request_id); + if (err != ERR_OK) { + mp_raise_RuntimeError(translate("Unable to start mDNS query")); + } + + uint64_t start_ticks = supervisor_ticks_ms64(); + uint64_t timeout_ms = timeout * 1000; + + while (state.request_id < MDNS_MAX_REQUESTS && + !mp_hal_is_interrupted() && + supervisor_ticks_ms64() - start_ticks < timeout_ms) { + RUN_BACKGROUND_TASKS; + } + if (state.request_id < MDNS_MAX_REQUESTS) { + mdns_search_stop(state.request_id); + state.request_id = MDNS_MAX_REQUESTS; + } + + mp_obj_tuple_t *tuple = MP_OBJ_TO_PTR(mp_obj_new_tuple(state.count, NULL)); + mdns_remoteservice_obj_t *next = state.head; + uint8_t added = 0; + while (next != NULL) { + mdns_remoteservice_obj_t *cur = next; + tuple->items[added] = MP_OBJ_FROM_PTR(cur); + next = cur->next; + // Set next back to NULL so that each service object is independently + // tracked for GC. + cur->next = NULL; + added++; + } + + return MP_OBJ_FROM_PTR(tuple); +} + +void common_hal_mdns_server_advertise_service(mdns_server_obj_t *self, const char *service_type, const char *protocol, mp_int_t port) { + enum mdns_sd_proto proto = DNSSD_PROTO_UDP; + if (strcmp(protocol, "_tcp") == 0) { + proto = DNSSD_PROTO_TCP; + } + // Remove the existing service if it was already added. + int8_t existing_slot = MDNS_MAX_SERVICES; + for (int i = 0; i < MDNS_MAX_SERVICES; i++) { + if (self->service_type[i] != NULL && + (service_type == self->service_type[i] || + strcmp(service_type, self->service_type[i]) == 0)) { + existing_slot = i; + break; + } + } + if (existing_slot < MDNS_MAX_SERVICES) { + mdns_resp_del_service(NETIF_STA, existing_slot); + } + int8_t slot = mdns_resp_add_service(NETIF_STA, self->instance_name, service_type, proto, port, NULL, NULL); + if (slot < 0) { + mp_raise_RuntimeError(translate("Out of MDNS service slots")); + return; + } + self->service_type[slot] = service_type; +} diff --git a/shared-bindings/dotenv/__init__.h b/ports/raspberrypi/common-hal/mdns/Server.h similarity index 77% rename from shared-bindings/dotenv/__init__.h rename to ports/raspberrypi/common-hal/mdns/Server.h index 18a6c280dd..8f28d74d3c 100644 --- a/shared-bindings/dotenv/__init__.h +++ b/ports/raspberrypi/common-hal/mdns/Server.h @@ -24,16 +24,17 @@ * THE SOFTWARE. */ -#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_DOTENV___INIT___H -#define MICROPY_INCLUDED_SHARED_BINDINGS_DOTENV___INIT___H +#pragma once -#include -#include +#include "py/obj.h" -#include "py/objtuple.h" +#include "lwip/apps/mdns_opts.h" -#include "shared-module/dotenv/__init__.h" - -mp_obj_t common_hal_dotenv_get_key(const char *path, const char *key); - -#endif // MICROPY_INCLUDED_SHARED_BINDINGS_DOTENV___INIT___H +typedef struct { + mp_obj_base_t base; + const char *hostname; + const char *instance_name; + // "cpy-" "XXXXXX" "\0" + char default_hostname[4 + 6 + 1]; + const char *service_type[MDNS_MAX_SERVICES]; +} mdns_server_obj_t; diff --git a/ports/raspberrypi/common-hal/mdns/__init__.c b/ports/raspberrypi/common-hal/mdns/__init__.c new file mode 100644 index 0000000000..57740777c8 --- /dev/null +++ b/ports/raspberrypi/common-hal/mdns/__init__.c @@ -0,0 +1 @@ +// No mdns module functions. diff --git a/ports/raspberrypi/common-hal/pwmio/PWMOut.c b/ports/raspberrypi/common-hal/pwmio/PWMOut.c index e6f88f8894..f75c4b3451 100644 --- a/ports/raspberrypi/common-hal/pwmio/PWMOut.c +++ b/ports/raspberrypi/common-hal/pwmio/PWMOut.c @@ -236,14 +236,6 @@ extern void common_hal_pwmio_pwmout_set_duty_cycle(pwmio_pwmout_obj_t *self, uin } // compare_count is the CC register value, which should be TOP+1 for 100% duty cycle. pwm_set_chan_level(self->slice, self->ab_channel, compare_count); - // Wait for wrap so that we know our new cc value has been applied. Clear - // the internal interrupt and then wait for it to be set. Worst case, we - // wait a full cycle. - pwm_hw->intr = 1 << self->slice; - while ((pwm_hw->en & (1 << self->slice)) != 0 && - (pwm_hw->intr & (1 << self->slice)) == 0 && - !mp_hal_is_interrupted()) { - } } uint16_t common_hal_pwmio_pwmout_get_duty_cycle(pwmio_pwmout_obj_t *self) { diff --git a/ports/raspberrypi/common-hal/socketpool/Socket.c b/ports/raspberrypi/common-hal/socketpool/Socket.c index 440fe56d42..fe12f461fb 100644 --- a/ports/raspberrypi/common-hal/socketpool/Socket.c +++ b/ports/raspberrypi/common-hal/socketpool/Socket.c @@ -166,6 +166,7 @@ static inline void exec_user_callback(socketpool_socket_obj_t *socket) { mp_sched_schedule(socket->callback, MP_OBJ_FROM_PTR(socket)); } #endif + supervisor_workflow_request_background(); } #if MICROPY_PY_LWIP_SOCK_RAW @@ -745,57 +746,47 @@ socketpool_socket_obj_t *common_hal_socketpool_socket(socketpool_socketpool_obj_ return socket; } -int socketpool_socket_accept(socketpool_socket_obj_t *self, uint8_t *ip, uint32_t *port) { - return -MP_EBADF; -} - -socketpool_socket_obj_t *common_hal_socketpool_socket_accept(socketpool_socket_obj_t *socket, - uint8_t *ip, uint32_t *port) { - if (socket->type != MOD_NETWORK_SOCK_STREAM) { - mp_raise_OSError(MP_EOPNOTSUPP); +int socketpool_socket_accept(socketpool_socket_obj_t *self, uint8_t *ip, uint32_t *port, socketpool_socket_obj_t *accepted) { + if (self->type != MOD_NETWORK_SOCK_STREAM) { + return -MP_EOPNOTSUPP; } - // Create new socket object, do it here because we must not raise an out-of-memory - // exception when the LWIP concurrency lock is held - socketpool_socket_obj_t *socket2 = m_new_ll_obj_with_finaliser(socketpool_socket_obj_t); - socket2->base.type = &socketpool_socket_type; + if (common_hal_socketpool_socket_get_closed(self)) { + return -MP_EBADF; + } MICROPY_PY_LWIP_ENTER - if (socket->pcb.tcp == NULL) { + if (self->pcb.tcp == NULL) { MICROPY_PY_LWIP_EXIT - m_del_obj(socketpool_socket_obj_t, socket2); - mp_raise_OSError(MP_EBADF); + return -MP_EBADF; } // I need to do this because "tcp_accepted", later, is a macro. - struct tcp_pcb *listener = socket->pcb.tcp; + struct tcp_pcb *listener = self->pcb.tcp; if (listener->state != LISTEN) { MICROPY_PY_LWIP_EXIT - m_del_obj(socketpool_socket_obj_t, socket2); - mp_raise_OSError(MP_EINVAL); + return -MP_EINVAL; } // accept incoming connection - struct tcp_pcb *volatile *incoming_connection = &lwip_socket_incoming_array(socket)[socket->incoming.connection.iget]; + struct tcp_pcb *volatile *incoming_connection = &lwip_socket_incoming_array(self)[self->incoming.connection.iget]; if (*incoming_connection == NULL) { - if (socket->timeout == 0) { + if (self->timeout == 0) { MICROPY_PY_LWIP_EXIT - m_del_obj(socketpool_socket_obj_t, socket2); - mp_raise_OSError(MP_EAGAIN); - } else if (socket->timeout != (unsigned)-1) { - mp_uint_t retries = socket->timeout / 100; - while (*incoming_connection == NULL) { + return -MP_EAGAIN; + } else if (self->timeout != (unsigned)-1) { + mp_uint_t retries = self->timeout / 100; + while (*incoming_connection == NULL && !mp_hal_is_interrupted()) { MICROPY_PY_LWIP_EXIT if (retries-- == 0) { - m_del_obj(socketpool_socket_obj_t, socket2); - mp_raise_OSError(MP_ETIMEDOUT); + return -MP_ETIMEDOUT; } mp_hal_delay_ms(100); MICROPY_PY_LWIP_REENTER } } else { - while (*incoming_connection == NULL) { + while (*incoming_connection == NULL && !mp_hal_is_interrupted()) { MICROPY_PY_LWIP_EXIT poll_sockets(); MICROPY_PY_LWIP_REENTER @@ -803,43 +794,75 @@ socketpool_socket_obj_t *common_hal_socketpool_socket_accept(socketpool_socket_o } } + if (*incoming_connection == NULL) { + // We were interrupted. + return 0; + } + + // Close the accepted socket because we have another we accepted. + if (!common_hal_socketpool_socket_get_closed(accepted)) { + common_hal_socketpool_socket_close(accepted); + } + // We get a new pcb handle... - socket2->pcb.tcp = *incoming_connection; - if (++socket->incoming.connection.iget >= socket->incoming.connection.alloc) { - socket->incoming.connection.iget = 0; + accepted->pcb.tcp = *incoming_connection; + if (++self->incoming.connection.iget >= self->incoming.connection.alloc) { + self->incoming.connection.iget = 0; } *incoming_connection = NULL; // ...and set up the new socket for it. - socket2->domain = MOD_NETWORK_AF_INET; - socket2->type = MOD_NETWORK_SOCK_STREAM; - socket2->incoming.pbuf = NULL; - socket2->timeout = socket->timeout; - socket2->state = STATE_CONNECTED; - socket2->recv_offset = 0; - socket2->callback = MP_OBJ_NULL; - tcp_arg(socket2->pcb.tcp, (void *)socket2); - tcp_err(socket2->pcb.tcp, _lwip_tcp_error); - tcp_recv(socket2->pcb.tcp, _lwip_tcp_recv); + accepted->domain = MOD_NETWORK_AF_INET; + accepted->type = MOD_NETWORK_SOCK_STREAM; + accepted->incoming.pbuf = NULL; + accepted->timeout = self->timeout; + accepted->state = STATE_CONNECTED; + accepted->recv_offset = 0; + accepted->callback = MP_OBJ_NULL; + tcp_arg(accepted->pcb.tcp, (void *)accepted); + tcp_err(accepted->pcb.tcp, _lwip_tcp_error); + tcp_recv(accepted->pcb.tcp, _lwip_tcp_recv); tcp_accepted(listener); MICROPY_PY_LWIP_EXIT + // output values + memcpy(ip, &(accepted->pcb.tcp->remote_ip), NETUTILS_IPV4ADDR_BUFSIZE); + *port = (mp_uint_t)accepted->pcb.tcp->remote_port; + + return 1; +} + +socketpool_socket_obj_t *common_hal_socketpool_socket_accept(socketpool_socket_obj_t *socket, + uint8_t *ip, uint32_t *port) { + // Create new socket object, do it here because we must not raise an out-of-memory + // exception when the LWIP concurrency lock is held + socketpool_socket_obj_t *accepted = m_new_ll_obj_with_finaliser(socketpool_socket_obj_t); + socketpool_socket_reset(accepted); + + int ret = socketpool_socket_accept(socket, ip, port, accepted); + + if (ret <= 0) { + m_del_obj(socketpool_socket_obj_t, accepted); + if (ret == 0) { + // Interrupted. + return mp_const_none; + } + mp_raise_OSError(-ret); + } + DEBUG_printf("registering socket in socketpool_socket_accept()\n"); - if (!register_open_socket(socket2)) { + if (!register_open_socket(accepted)) { DEBUG_printf("collecting garbage to open socket\n"); gc_collect(); - if (!register_open_socket(socket2)) { + if (!register_open_socket(accepted)) { mp_raise_RuntimeError(translate("Out of sockets")); } } - mark_user_socket(socket2); + mark_user_socket(accepted); - // output values - memcpy(ip, &(socket2->pcb.tcp->remote_ip), NETUTILS_IPV4ADDR_BUFSIZE); - *port = (mp_uint_t)socket2->pcb.tcp->remote_port; - return MP_OBJ_FROM_PTR(socket2); + return MP_OBJ_FROM_PTR(accepted); } bool common_hal_socketpool_socket_bind(socketpool_socket_obj_t *socket, @@ -847,21 +870,22 @@ bool common_hal_socketpool_socket_bind(socketpool_socket_obj_t *socket, // get address ip_addr_t bind_addr; - int error = socketpool_resolve_host(socket->pool, host, &bind_addr); - if (error != 0) { - mp_raise_OSError(EHOSTUNREACH); + const ip_addr_t *bind_addr_ptr = &bind_addr; + if (hostlen > 0) { + socketpool_resolve_host_raise(socket->pool, host, &bind_addr); + } else { + bind_addr_ptr = IP_ANY_TYPE; } - ip_set_option(socket->pcb.ip, SOF_REUSEADDR); err_t err = ERR_ARG; switch (socket->type) { case MOD_NETWORK_SOCK_STREAM: { - err = tcp_bind(socket->pcb.tcp, &bind_addr, port); + err = tcp_bind(socket->pcb.tcp, bind_addr_ptr, port); break; } case MOD_NETWORK_SOCK_DGRAM: { - err = udp_bind(socket->pcb.udp, &bind_addr, port); + err = udp_bind(socket->pcb.udp, bind_addr_ptr, port); break; } } @@ -937,10 +961,7 @@ void common_hal_socketpool_socket_connect(socketpool_socket_obj_t *socket, // get address ip_addr_t dest; - int error = socketpool_resolve_host(socket->pool, host, &dest); - if (error != 0) { - mp_raise_OSError(EHOSTUNREACH); - } + socketpool_resolve_host_raise(socket->pool, host, &dest); err_t err = ERR_ARG; switch (socket->type) { @@ -1135,10 +1156,7 @@ mp_uint_t common_hal_socketpool_socket_sendto(socketpool_socket_obj_t *socket, const char *host, size_t hostlen, uint32_t port, const uint8_t *buf, uint32_t len) { int _errno; ip_addr_t ip; - int error = socketpool_resolve_host(socket->pool, host, &ip); - if (error != 0) { - mp_raise_OSError(EHOSTUNREACH); - } + socketpool_resolve_host_raise(socket->pool, host, &ip); mp_uint_t ret = 0; switch (socket->type) { @@ -1164,6 +1182,20 @@ void common_hal_socketpool_socket_settimeout(socketpool_socket_obj_t *self, uint self->timeout = timeout_ms; } +int common_hal_socketpool_socket_setsockopt(socketpool_socket_obj_t *self, int level, int optname, const void *value, size_t optlen) { + if (level == SOCKETPOOL_IPPROTO_TCP && optname == SOCKETPOOL_TCP_NODELAY) { + int one = 1; + bool enable = optlen == sizeof(&one) && memcmp(value, &one, optlen); + if (enable) { + tcp_set_flags(self->pcb.tcp, TF_NODELAY); + } else { + tcp_clear_flags(self->pcb.tcp, TF_NODELAY); + } + return 0; + } + return -MP_EOPNOTSUPP; +} + bool common_hal_socketpool_readable(socketpool_socket_obj_t *self) { MICROPY_PY_LWIP_ENTER; @@ -1206,3 +1238,32 @@ bool common_hal_socketpool_writable(socketpool_socket_obj_t *self) { return result; } + +void socketpool_socket_move(socketpool_socket_obj_t *self, socketpool_socket_obj_t *sock) { + *sock = *self; + self->state = _ERR_BADF; + + // Reregister the callbacks with the new socket copy. + MICROPY_PY_LWIP_ENTER; + + tcp_arg(self->pcb.tcp, NULL); + tcp_err(self->pcb.tcp, NULL); + tcp_recv(self->pcb.tcp, NULL); + + self->pcb.tcp = NULL; + + tcp_arg(sock->pcb.tcp, (void *)sock); + tcp_err(sock->pcb.tcp, _lwip_tcp_error); + tcp_recv(sock->pcb.tcp, _lwip_tcp_recv); + + MICROPY_PY_LWIP_EXIT; +} + +void socketpool_socket_reset(socketpool_socket_obj_t *self) { + if (self->base.type == &socketpool_socket_type) { + return; + } + self->base.type = &socketpool_socket_type; + self->pcb.tcp = NULL; + self->state = _ERR_BADF; +} diff --git a/ports/raspberrypi/common-hal/socketpool/SocketPool.c b/ports/raspberrypi/common-hal/socketpool/SocketPool.c index d2f403c852..e562314d69 100644 --- a/ports/raspberrypi/common-hal/socketpool/SocketPool.c +++ b/ports/raspberrypi/common-hal/socketpool/SocketPool.c @@ -57,7 +57,7 @@ STATIC void lwip_getaddrinfo_cb(const char *name, const ip_addr_t *ipaddr, void } } -int socketpool_resolve_host(socketpool_socketpool_obj_t *self, const char *host, ip_addr_t *addr) { +STATIC int socketpool_resolve_host(socketpool_socketpool_obj_t *self, const char *host, ip_addr_t *addr) { getaddrinfo_state_t state; state.status = 0; @@ -94,17 +94,26 @@ int socketpool_resolve_host(socketpool_socketpool_obj_t *self, const char *host, return 0; } -mp_obj_t common_hal_socketpool_socketpool_gethostbyname(socketpool_socketpool_obj_t *self, - const char *host) { - - ip_addr_t addr; - int result = socketpool_resolve_host(self, host, &addr); +void socketpool_resolve_host_raise(socketpool_socketpool_obj_t *self, const char *host, ip_addr_t *addr) { + int result = socketpool_resolve_host(self, host, addr); if (result < 0) { + printf("socket_resolve_host() returned %d\n", result); + common_hal_socketpool_socketpool_raise_gaierror_noname(); mp_raise_OSError(-result); } +} + +mp_obj_t common_hal_socketpool_socketpool_gethostbyname(socketpool_socketpool_obj_t *self, const char *host) { + + ip_addr_t addr; + socketpool_resolve_host_raise(self, host, &addr); char ip_str[IP4ADDR_STRLEN_MAX]; inet_ntoa_r(addr, ip_str, IP4ADDR_STRLEN_MAX); mp_obj_t ip_obj = mp_obj_new_str(ip_str, strlen(ip_str)); return ip_obj; } + +mp_obj_t common_hal_socketpool_socketpool_gethostbyname_raise(socketpool_socketpool_obj_t *self, const char *host) { + return common_hal_socketpool_socketpool_gethostbyname(self, host); +} diff --git a/ports/raspberrypi/common-hal/socketpool/SocketPool.h b/ports/raspberrypi/common-hal/socketpool/SocketPool.h index 3d498d9a49..a7ad36b92f 100644 --- a/ports/raspberrypi/common-hal/socketpool/SocketPool.h +++ b/ports/raspberrypi/common-hal/socketpool/SocketPool.h @@ -32,4 +32,4 @@ typedef struct { mp_obj_base_t base; } socketpool_socketpool_obj_t; -int socketpool_resolve_host(socketpool_socketpool_obj_t *self, const char *host, ip_addr_t *addr); +void socketpool_resolve_host_raise(socketpool_socketpool_obj_t *self, const char *host, ip_addr_t *addr); diff --git a/ports/raspberrypi/common-hal/wifi/Network.c b/ports/raspberrypi/common-hal/wifi/Network.c index 8db42e962c..ef81247712 100644 --- a/ports/raspberrypi/common-hal/wifi/Network.c +++ b/ports/raspberrypi/common-hal/wifi/Network.c @@ -53,27 +53,27 @@ mp_obj_t common_hal_wifi_network_get_country(wifi_network_obj_t *self) { } mp_obj_t common_hal_wifi_network_get_authmode(wifi_network_obj_t *self) { - uint8_t authmode_mask = 0; + uint32_t authmode_mask = 0; if (self->record.auth_mode == 0) { - authmode_mask = (1 << AUTHMODE_OPEN); + authmode_mask = AUTHMODE_OPEN; } if (self->record.auth_mode & 1) { - authmode_mask |= (1 << AUTHMODE_PSK); + authmode_mask |= AUTHMODE_PSK; } ; if (self->record.auth_mode & 2) { - authmode_mask |= (1 << AUTHMODE_WPA); + authmode_mask |= AUTHMODE_WPA; } ; if (self->record.auth_mode & 4) { - authmode_mask |= (1 << AUTHMODE_WPA2); + authmode_mask |= AUTHMODE_WPA2; } ; mp_obj_t authmode_list = mp_obj_new_list(0, NULL); if (authmode_mask != 0) { - for (uint8_t i = 0; i < 8; i++) { + for (uint32_t i = 0; i < 32; i++) { if ((authmode_mask >> i) & 1) { - mp_obj_list_append(authmode_list, cp_enum_find(&wifi_authmode_type, i)); + mp_obj_list_append(authmode_list, cp_enum_find(&wifi_authmode_type, 1 << i)); } } } diff --git a/ports/raspberrypi/common-hal/wifi/Radio.c b/ports/raspberrypi/common-hal/wifi/Radio.c index 2a74c16e0a..db21dd333b 100644 --- a/ports/raspberrypi/common-hal/wifi/Radio.c +++ b/ports/raspberrypi/common-hal/wifi/Radio.c @@ -42,10 +42,6 @@ #include "shared-bindings/time/__init__.h" #include "shared-module/ipaddress/__init__.h" -#if CIRCUITPY_MDNS -#include "components/mdns/include/mdns.h" -#endif - #include "lwip/sys.h" #include "lwip/dns.h" #include "lwip/icmp.h" @@ -68,18 +64,17 @@ static inline void nw_put_le32(uint8_t *buf, uint32_t x) { buf[3] = x >> 24; } -NORETURN static void ro_attribute(int attr) { - mp_raise_msg_varg(&mp_type_AttributeError, MP_ERROR_TEXT("'%s' object has no attribute '%q'"), "Radio", attr); +NORETURN static void ro_attribute(qstr attr) { + mp_raise_NotImplementedError_varg(translate("%q is read-only for this board"), attr); } bool common_hal_wifi_radio_get_enabled(wifi_radio_obj_t *self) { - return true; + return self->enabled; } void common_hal_wifi_radio_set_enabled(wifi_radio_obj_t *self, bool enabled) { - if (!enabled) { - ro_attribute(MP_QSTR_enabled); - } + self->enabled = enabled; + // TODO: Actually enable and disable the WiFi module at this point. } mp_obj_t common_hal_wifi_radio_get_hostname(wifi_radio_obj_t *self) { @@ -96,6 +91,10 @@ void common_hal_wifi_radio_set_hostname(wifi_radio_obj_t *self, const char *host netif_set_hostname(NETIF_AP, self->hostname); } +void wifi_radio_get_mac_address(wifi_radio_obj_t *self, uint8_t *mac) { + memcpy(mac, cyw43_state.mac, MAC_ADDRESS_LENGTH); +} + mp_obj_t common_hal_wifi_radio_get_mac_address(wifi_radio_obj_t *self) { return mp_obj_new_bytes(cyw43_state.mac, MAC_ADDRESS_LENGTH); } @@ -134,7 +133,7 @@ mp_obj_t common_hal_wifi_radio_start_scanning_networks(wifi_radio_obj_t *self, u mp_raise_RuntimeError(translate("Already scanning for wifi networks")); } if (!common_hal_wifi_radio_get_enabled(self)) { - mp_raise_RuntimeError(translate("wifi is not enabled")); + mp_raise_RuntimeError(translate("Wifi is not enabled")); } wifi_scannednetworks_obj_t *scan = m_new_obj(wifi_scannednetworks_obj_t); scan->base.type = &wifi_scannednetworks_type; @@ -155,35 +154,98 @@ void common_hal_wifi_radio_start_station(wifi_radio_obj_t *self) { } void common_hal_wifi_radio_stop_station(wifi_radio_obj_t *self) { + cyw43_wifi_leave(&cyw43_state, CYW43_ITF_STA); // This is wrong, but without this call the state of ITF_STA is still // reported as CYW43_LINK_JOIN (by wifi_link_status) and CYW43_LINK_UP - // (by tcpip_link_status). Until AP support is added, we can ignore the - // problem. + // (by tcpip_link_status). However since ap disconnection isn't working + // either, this is not an issue. cyw43_wifi_leave(&cyw43_state, CYW43_ITF_AP); + bindings_cyw43_wifi_enforce_pm(); } -void common_hal_wifi_radio_start_ap(wifi_radio_obj_t *self, uint8_t *ssid, size_t ssid_len, uint8_t *password, size_t password_len, uint8_t channel, uint8_t authmode, uint8_t max_connections) { - mp_raise_NotImplementedError(NULL); +void common_hal_wifi_radio_start_ap(wifi_radio_obj_t *self, uint8_t *ssid, size_t ssid_len, uint8_t *password, size_t password_len, uint8_t channel, uint32_t authmodes, uint8_t max_connections) { + if (!common_hal_wifi_radio_get_enabled(self)) { + mp_raise_RuntimeError(translate("Wifi is not enabled")); + } + + if (cyw43_tcpip_link_status(&cyw43_state, CYW43_ITF_STA) != CYW43_LINK_DOWN) { + mp_raise_RuntimeError(translate("Wifi is in station mode.")); + } + + common_hal_wifi_radio_stop_ap(self); + + // Channel can only be changed after inital powerup and config of ap. + // Defaults to 1 if not set or invalid (i.e. 13) + cyw43_wifi_ap_set_channel(&cyw43_state, (const uint32_t)channel); + + cyw43_arch_enable_ap_mode((const char *)ssid, (const char *)password, CYW43_AUTH_WPA2_AES_PSK); + + // TODO: Implement authmode check like in espressif bindings_cyw43_wifi_enforce_pm(); } void common_hal_wifi_radio_stop_ap(wifi_radio_obj_t *self) { - mp_raise_NotImplementedError(NULL); + if (!common_hal_wifi_radio_get_enabled(self)) { + mp_raise_RuntimeError(translate("wifi is not enabled")); + } + + if (cyw43_tcpip_link_status(&cyw43_state, CYW43_ITF_AP) != CYW43_LINK_DOWN) { + mp_raise_NotImplementedError(translate("Stopping AP is not supported.")); + } + + /* + * AP cannot be disconnected. cyw43_wifi_leave is broken. + * This code snippet should work, but doesn't. + * + * cyw43_wifi_leave(&cyw43_state, CYW43_ITF_AP); + * cyw43_wifi_leave(&cyw43_state, CYW43_ITF_STA); + * + * bindings_cyw43_wifi_enforce_pm(); + */ +} + +static bool connection_unchanged(wifi_radio_obj_t *self, const uint8_t *ssid, size_t ssid_len) { + if (cyw43_tcpip_link_status(&cyw43_state, CYW43_ITF_STA) != CYW43_LINK_UP) { + return false; + } + if (ssid_len != self->connected_ssid_len) { + return false; + } + if (memcmp(ssid, self->connected_ssid, self->connected_ssid_len)) { + return false; + } + return true; } wifi_radio_error_t common_hal_wifi_radio_connect(wifi_radio_obj_t *self, uint8_t *ssid, size_t ssid_len, uint8_t *password, size_t password_len, uint8_t channel, mp_float_t timeout, uint8_t *bssid, size_t bssid_len) { if (!common_hal_wifi_radio_get_enabled(self)) { - mp_raise_RuntimeError(translate("wifi is not enabled")); + mp_raise_RuntimeError(translate("Wifi is not enabled")); + } + + if (cyw43_tcpip_link_status(&cyw43_state, CYW43_ITF_AP) != CYW43_LINK_DOWN) { + mp_raise_RuntimeError(translate("Wifi is in access point mode.")); + } + + if (ssid_len > 32) { + return WIFI_RADIO_ERROR_CONNECTION_FAIL; } size_t timeout_ms = timeout <= 0 ? 8000 : (size_t)MICROPY_FLOAT_C_FUN(ceil)(timeout * 1000); uint64_t start = port_get_raw_ticks(NULL); uint64_t deadline = start + timeout_ms; + if (connection_unchanged(self, ssid, ssid_len)) { + return WIFI_RADIO_ERROR_NONE; + } + + // disconnect + common_hal_wifi_radio_stop_station(self); + // connect cyw43_arch_wifi_connect_async((const char *)ssid, (const char *)password, CYW43_AUTH_WPA2_AES_PSK); + // TODO: Implement authmode check like in espressif while (port_get_raw_ticks(NULL) < deadline) { RUN_BACKGROUND_TASKS; @@ -195,6 +257,8 @@ wifi_radio_error_t common_hal_wifi_radio_connect(wifi_radio_obj_t *self, uint8_t switch (result) { case CYW43_LINK_UP: + memcpy(self->connected_ssid, ssid, ssid_len); + self->connected_ssid_len = ssid_len; bindings_cyw43_wifi_enforce_pm(); return WIFI_RADIO_ERROR_NONE; case CYW43_LINK_FAIL: @@ -242,6 +306,13 @@ mp_obj_t common_hal_wifi_radio_get_ipv4_subnet_ap(wifi_radio_obj_t *self) { return common_hal_ipaddress_new_ipv4address(NETIF_AP->netmask.addr); } +uint32_t wifi_radio_get_ipv4_address(wifi_radio_obj_t *self) { + if (cyw43_tcpip_link_status(&cyw43_state, CYW43_ITF_STA) != CYW43_LINK_UP) { + return 0; + } + return NETIF_STA->ip_addr.addr; +} + mp_obj_t common_hal_wifi_radio_get_ipv4_address(wifi_radio_obj_t *self) { if (cyw43_tcpip_link_status(&cyw43_state, CYW43_ITF_STA) != CYW43_LINK_UP) { return mp_const_none; diff --git a/ports/raspberrypi/common-hal/wifi/Radio.h b/ports/raspberrypi/common-hal/wifi/Radio.h index 0dc18c8957..a4125fe7ba 100644 --- a/ports/raspberrypi/common-hal/wifi/Radio.h +++ b/ports/raspberrypi/common-hal/wifi/Radio.h @@ -35,6 +35,9 @@ typedef struct { mp_obj_base_t base; char hostname[254]; // hostname max is 253 chars, + 1 for trailing NUL wifi_scannednetworks_obj_t *current_scan; + uint8_t connected_ssid[32]; + uint8_t connected_ssid_len; + bool enabled; } wifi_radio_obj_t; extern void common_hal_wifi_radio_gc_collect(wifi_radio_obj_t *self); diff --git a/ports/raspberrypi/lib/cyw43-driver b/ports/raspberrypi/lib/cyw43-driver index 195dfcc10b..746e063603 160000 --- a/ports/raspberrypi/lib/cyw43-driver +++ b/ports/raspberrypi/lib/cyw43-driver @@ -1 +1 @@ -Subproject commit 195dfcc10bb6f379e3dea45147590db2203d3c7b +Subproject commit 746e0636033d0550b7652688124a77a6a1639cf9 diff --git a/ports/raspberrypi/lib/lwip b/ports/raspberrypi/lib/lwip index 239918ccc1..d26459c32c 160000 --- a/ports/raspberrypi/lib/lwip +++ b/ports/raspberrypi/lib/lwip @@ -1 +1 @@ -Subproject commit 239918ccc173cb2c2a62f41a40fd893f57faf1d6 +Subproject commit d26459c32c83aa14a6d4e30237d91cee36e0adbd diff --git a/ports/raspberrypi/lwip_inc/lwipopts.h b/ports/raspberrypi/lwip_inc/lwipopts.h index 0d4ecd3707..6d116e89b6 100644 --- a/ports/raspberrypi/lwip_inc/lwipopts.h +++ b/ports/raspberrypi/lwip_inc/lwipopts.h @@ -54,6 +54,14 @@ #define LWIP_DHCP_DOES_ACD_CHECK 0 #define SO_REUSE 1 +#if CIRCUITPY_MDNS +#define LWIP_IGMP 1 +#define LWIP_MDNS_RESPONDER 1 +#define LWIP_NUM_NETIF_CLIENT_DATA 1 +#define LWIP_NETIF_EXT_STATUS_CALLBACK 1 +#define MDNS_MAX_SECONDARY_HOSTNAMES 1 +#endif + #ifndef NDEBUG #define LWIP_DEBUG 1 #define LWIP_STATS 1 @@ -88,6 +96,7 @@ #define PPP_DEBUG LWIP_DBG_OFF #define SLIP_DEBUG LWIP_DBG_OFF #define DHCP_DEBUG LWIP_DBG_OFF +#define MDNS_DEBUG LWIP_DBG_OFF #define LWIP_TIMEVAL_PRIVATE 0 diff --git a/ports/raspberrypi/mpconfigport.mk b/ports/raspberrypi/mpconfigport.mk index fa1f0c153d..c5de2a439d 100644 --- a/ports/raspberrypi/mpconfigport.mk +++ b/ports/raspberrypi/mpconfigport.mk @@ -2,6 +2,9 @@ LONGINT_IMPL = MPZ CIRCUITPY_OPTIMIZE_PROPERTY_FLASH_SIZE ?= 1 +# CYW43 support does not provide settable MAC addresses for station or AP. +CIRCUITPY_WIFI_RADIO_SETTABLE_MAC_ADDRESS = 0 + CIRCUITPY_ALARM ?= 1 CIRCUITPY_RP2PIO ?= 1 diff --git a/ports/raspberrypi/supervisor/port.c b/ports/raspberrypi/supervisor/port.c index 89e451a3b0..27012f2298 100644 --- a/ports/raspberrypi/supervisor/port.c +++ b/ports/raspberrypi/supervisor/port.c @@ -62,6 +62,7 @@ #include "src/rp2_common/hardware_sync/include/hardware/sync.h" #include "src/rp2_common/hardware_timer/include/hardware/timer.h" #if CIRCUITPY_CYW43 +#include "py/mphal.h" #include "pico/cyw43_arch.h" #endif #include "src/common/pico_time/include/pico/time.h" @@ -126,6 +127,13 @@ safe_mode_t port_init(void) { (&_ld_dtcm_bss_start)[i] = 0; } + #if CIRCUITPY_CYW43 + never_reset_pin_number(23); + never_reset_pin_number(24); + never_reset_pin_number(25); + never_reset_pin_number(29); + #endif + // Reset everything into a known state before board_init. reset_port(); @@ -139,11 +147,14 @@ safe_mode_t port_init(void) { // Check brownout. #if CIRCUITPY_CYW43 - never_reset_pin_number(23); - never_reset_pin_number(24); - never_reset_pin_number(25); - never_reset_pin_number(29); - if (cyw43_arch_init()) { + // A small number of samples of pico w need an additional delay before + // initializing the cyw43 chip. Delays inside cyw43_arch_init_with_country + // are intended to meet the power on timing requirements, but apparently + // are inadequate. We'll back off this long delay based on future testing. + mp_hal_delay_ms(1000); + // Change this as a placeholder as to how to init with country code. + // Default country code is CYW43_COUNTRY_WORLDWIDE) + if (cyw43_arch_init_with_country(PICO_CYW43_ARCH_DEFAULT_COUNTRY_CODE)) { serial_write("WiFi init failed\n"); } else { cyw_ever_init = true; diff --git a/ports/stm/Makefile b/ports/stm/Makefile index cd37a9bda0..094bee7aef 100755 --- a/ports/stm/Makefile +++ b/ports/stm/Makefile @@ -23,37 +23,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -# Select the board to build for. -ifeq ($(BOARD),) -$(error You must provide a BOARD parameter) -else -ifeq ($(wildcard boards/$(BOARD)/.),) -$(error Invalid BOARD specified) -endif -endif - -# If the build directory is not given, make it reflect the board name. -BUILD ?= build-$(BOARD) - -include ../../py/mkenv.mk -# Board-specific -include boards/$(BOARD)/mpconfigboard.mk -# Port-specific -include mpconfigport.mk - -# CircuitPython-specific -include $(TOP)/py/circuitpy_mpconfig.mk - -# qstr definitions (must come before including py.mk) -QSTR_DEFS = qstrdefsport.h - -# include py core make definitions -include $(TOP)/py/py.mk - -include $(TOP)/supervisor/supervisor.mk - -# Include make rules and variables common across CircuitPython builds. -include $(TOP)/py/circuitpy_defns.mk +include ../../py/circuitpy_mkenv.mk CROSS_COMPILE = arm-none-eabi- @@ -221,7 +191,6 @@ SRC_STM32 += boards/system_stm32$(MCU_SERIES_LOWER)xx.c SRC_C += \ background.c \ - fatfs_port.c \ mphalport.c \ boards/$(BOARD)/board.c \ boards/$(BOARD)/pins.c \ diff --git a/ports/unix/modos.c b/ports/unix/modos.c index 6241dfa6c3..a6365aa6a3 100644 --- a/ports/unix/modos.c +++ b/ports/unix/modos.c @@ -56,6 +56,14 @@ #endif #endif +#if defined(MICROPY_UNIX_COVERAGE) +#include "py/objstr.h" +typedef int os_getenv_err_t; +mp_obj_t common_hal_os_getenv(const char *key, mp_obj_t default_); +os_getenv_err_t common_hal_os_getenv_str(const char *key, char *value, size_t value_len); +os_getenv_err_t common_hal_os_getenv_int(const char *key, mp_int_t *value); +#endif + STATIC mp_obj_t mod_os_urandom(mp_obj_t num) { mp_int_t n = mp_obj_get_int(num); vstr_t vstr; @@ -194,6 +202,12 @@ STATIC mp_obj_t mod_os_system(mp_obj_t cmd_in) { MP_DEFINE_CONST_FUN_OBJ_1(mod_os_system_obj, mod_os_system); STATIC mp_obj_t mod_os_getenv(mp_obj_t var_in) { + #if defined(MICROPY_UNIX_COVERAGE) + mp_obj_t result = common_hal_os_getenv(mp_obj_str_get_str(var_in), mp_const_none); + if (result != mp_const_none) { + return result; + } + #endif const char *s = getenv(mp_obj_str_get_str(var_in)); if (s == NULL) { return mp_const_none; @@ -202,6 +216,28 @@ STATIC mp_obj_t mod_os_getenv(mp_obj_t var_in) { } MP_DEFINE_CONST_FUN_OBJ_1(mod_os_getenv_obj, mod_os_getenv); +#if defined(MICROPY_UNIX_COVERAGE) +STATIC mp_obj_t mod_os_getenv_int(mp_obj_t var_in) { + mp_int_t value; + os_getenv_err_t result = common_hal_os_getenv_int(mp_obj_str_get_str(var_in), &value); + if (result == 0) { + return mp_obj_new_int(value); + } + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_1(mod_os_getenv_int_obj, mod_os_getenv_int); + +STATIC mp_obj_t mod_os_getenv_str(mp_obj_t var_in) { + char buf[4096]; + os_getenv_err_t result = common_hal_os_getenv_str(mp_obj_str_get_str(var_in), buf, sizeof(buf)); + if (result == 0) { + return mp_obj_new_str_copy(&mp_type_str, (byte *)buf, strlen(buf)); + } + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_1(mod_os_getenv_str_obj, mod_os_getenv_str); +#endif + STATIC mp_obj_t mod_os_putenv(mp_obj_t key_in, mp_obj_t value_in) { const char *key = mp_obj_str_get_str(key_in); const char *value = mp_obj_str_get_str(value_in); @@ -341,6 +377,10 @@ STATIC const mp_rom_map_elem_t mp_module_os_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_rename), MP_ROM_PTR(&mod_os_rename_obj) }, { MP_ROM_QSTR(MP_QSTR_rmdir), MP_ROM_PTR(&mod_os_rmdir_obj) }, { MP_ROM_QSTR(MP_QSTR_getenv), MP_ROM_PTR(&mod_os_getenv_obj) }, + #if defined(MICROPY_UNIX_COVERAGE) + { MP_ROM_QSTR(MP_QSTR_getenv_int), MP_ROM_PTR(&mod_os_getenv_int_obj) }, + { MP_ROM_QSTR(MP_QSTR_getenv_str), MP_ROM_PTR(&mod_os_getenv_str_obj) }, + #endif { MP_ROM_QSTR(MP_QSTR_putenv), MP_ROM_PTR(&mod_os_putenv_obj) }, { MP_ROM_QSTR(MP_QSTR_unsetenv), MP_ROM_PTR(&mod_os_unsetenv_obj) }, { MP_ROM_QSTR(MP_QSTR_mkdir), MP_ROM_PTR(&mod_os_mkdir_obj) }, diff --git a/ports/unix/moduos_vfs.c b/ports/unix/moduos_vfs.c index 41273bc7e2..495679290a 100644 --- a/ports/unix/moduos_vfs.c +++ b/ports/unix/moduos_vfs.c @@ -37,6 +37,10 @@ // These are defined in modos.c MP_DECLARE_CONST_FUN_OBJ_VAR_BETWEEN(mod_os_errno_obj); MP_DECLARE_CONST_FUN_OBJ_1(mod_os_getenv_obj); +#if defined(MICROPY_UNIX_COVERAGE) +MP_DECLARE_CONST_FUN_OBJ_1(mod_os_getenv_int_obj); +MP_DECLARE_CONST_FUN_OBJ_1(mod_os_getenv_str_obj); +#endif MP_DECLARE_CONST_FUN_OBJ_1(mod_os_putenv_obj); MP_DECLARE_CONST_FUN_OBJ_1(mod_os_unsetenv_obj); MP_DECLARE_CONST_FUN_OBJ_1(mod_os_system_obj); @@ -47,6 +51,10 @@ STATIC const mp_rom_map_elem_t uos_vfs_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_errno), MP_ROM_PTR(&mod_os_errno_obj) }, { MP_ROM_QSTR(MP_QSTR_getenv), MP_ROM_PTR(&mod_os_getenv_obj) }, + #if defined(MICROPY_UNIX_COVERAGE) + { MP_ROM_QSTR(MP_QSTR_getenv_int), MP_ROM_PTR(&mod_os_getenv_int_obj) }, + { MP_ROM_QSTR(MP_QSTR_getenv_str), MP_ROM_PTR(&mod_os_getenv_str_obj) }, + #endif { MP_ROM_QSTR(MP_QSTR_putenv), MP_ROM_PTR(&mod_os_putenv_obj) }, { MP_ROM_QSTR(MP_QSTR_unsetenv), MP_ROM_PTR(&mod_os_unsetenv_obj) }, { MP_ROM_QSTR(MP_QSTR_system), MP_ROM_PTR(&mod_os_system_obj) }, diff --git a/ports/unix/variants/coverage/mpconfigvariant.h b/ports/unix/variants/coverage/mpconfigvariant.h index f6ebc2087b..ba9e941c28 100644 --- a/ports/unix/variants/coverage/mpconfigvariant.h +++ b/ports/unix/variants/coverage/mpconfigvariant.h @@ -65,6 +65,7 @@ #define MICROPY_PY_UCRYPTOLIB (1) #define MICROPY_PY_UCRYPTOLIB_CTR (1) #define MICROPY_PY_MICROPYTHON_HEAP_LOCKED (1) +#define MICROPY_CPYTHON_EXCEPTION_CHAIN (1) // use vfs's functions for import stat and builtin open #define mp_import_stat mp_vfs_import_stat diff --git a/ports/unix/variants/coverage/mpconfigvariant.mk b/ports/unix/variants/coverage/mpconfigvariant.mk index 1e8e59f9a9..e351fc0836 100644 --- a/ports/unix/variants/coverage/mpconfigvariant.mk +++ b/ports/unix/variants/coverage/mpconfigvariant.mk @@ -33,7 +33,6 @@ SRC_BITMAP := \ shared-bindings/aesio/__init__.c \ shared-bindings/bitmaptools/__init__.c \ shared-bindings/displayio/Bitmap.c \ - shared-bindings/dotenv/__init__.c \ shared-bindings/rainbowio/__init__.c \ shared-bindings/traceback/__init__.c \ shared-bindings/util.c \ @@ -45,7 +44,7 @@ SRC_BITMAP := \ shared-module/displayio/Bitmap.c \ shared-module/displayio/ColorConverter.c \ shared-module/displayio/ColorConverter.c \ - shared-module/dotenv/__init__.c \ + shared-module/os/getenv.c \ shared-module/rainbowio/__init__.c \ shared-module/traceback/__init__.c \ shared-module/zlib/__init__.c \ @@ -56,7 +55,7 @@ CFLAGS += \ -DCIRCUITPY_AESIO=1 \ -DCIRCUITPY_BITMAPTOOLS=1 \ -DCIRCUITPY_DISPLAYIO_UNIX=1 \ - -DCIRCUITPY_DOTENV=1 \ + -DCIRCUITPY_OS_GETENV=1 \ -DCIRCUITPY_GIFIO=1 \ -DCIRCUITPY_RAINBOWIO=1 \ -DCIRCUITPY_TRACEBACK=1 \ diff --git a/py/argcheck.c b/py/argcheck.c index c28c577088..01c712ac36 100644 --- a/py/argcheck.c +++ b/py/argcheck.c @@ -145,9 +145,11 @@ void mp_arg_parse_all_kw_array(size_t n_pos, size_t n_kw, const mp_obj_t *args, mp_arg_parse_all(n_pos, args, &kw_args, n_allowed, allowed, out_vals); } +#if MICROPY_ERROR_REPORTING <= MICROPY_ERROR_REPORTING_TERSE NORETURN void mp_arg_error_terse_mismatch(void) { mp_raise_TypeError(MP_ERROR_TEXT("argument num/types mismatch")); } +#endif #if MICROPY_CPYTHON_COMPAT NORETURN void mp_arg_error_unimpl_kw(void) { @@ -239,7 +241,7 @@ mp_obj_t mp_arg_validate_type(mp_obj_t obj, const mp_obj_type_t *type, qstr arg_ mp_obj_t mp_arg_validate_type_string(mp_obj_t obj, qstr arg_name) { if (!mp_obj_is_str(obj)) { - mp_raise_TypeError_varg(translate("%q must be a string"), arg_name); + mp_raise_TypeError_varg(translate("%q must be of type %q"), arg_name, MP_QSTR_str); } return obj; } @@ -247,7 +249,7 @@ mp_obj_t mp_arg_validate_type_string(mp_obj_t obj, qstr arg_name) { mp_int_t mp_arg_validate_type_int(mp_obj_t obj, qstr arg_name) { mp_int_t an_int; if (!mp_obj_get_int_maybe(obj, &an_int)) { - mp_raise_TypeError_varg(translate("%q must be an int"), arg_name); + mp_raise_TypeError_varg(translate("%q must be of type %q"), arg_name, MP_QSTR_int); } return an_int; } diff --git a/py/circuitpy_defns.mk b/py/circuitpy_defns.mk index ee51a58c58..be33d80a99 100644 --- a/py/circuitpy_defns.mk +++ b/py/circuitpy_defns.mk @@ -167,9 +167,6 @@ endif ifeq ($(CIRCUITPY_CANIO),1) SRC_PATTERNS += canio/% endif -ifeq ($(CIRCUITPY_COPROC),1) -SRC_PATTERNS += coproc/% -endif ifeq ($(CIRCUITPY_COUNTIO),1) SRC_PATTERNS += countio/% endif @@ -182,9 +179,6 @@ endif ifeq ($(CIRCUITPY_DISPLAYIO),1) SRC_PATTERNS += displayio/% endif -ifeq ($(CIRCUITPY_DOTENV),1) -SRC_PATTERNS += dotenv/% -endif ifeq ($(CIRCUITPY__EVE),1) SRC_PATTERNS += _eve/% endif @@ -230,6 +224,9 @@ endif ifeq ($(CIRCUITPY_MATH),1) SRC_PATTERNS += math/% endif +ifeq ($(CIRCUITPY_MEMORYMAP),1) +SRC_PATTERNS += memorymap/% +endif ifeq ($(CIRCUITPY_MEMORYMONITOR),1) SRC_PATTERNS += memorymonitor/% endif @@ -266,6 +263,9 @@ endif ifeq ($(CIRCUITPY_PIXELBUF),1) SRC_PATTERNS += adafruit_pixelbuf/% endif +ifeq ($(CIRCUITPY_PIXELMAP),1) +SRC_PATTERNS += _pixelmap/% +endif ifeq ($(CIRCUITPY_QRIO),1) SRC_PATTERNS += qrio/% endif @@ -400,7 +400,6 @@ SRC_COMMON_HAL_ALL = \ alarm/pin/PinAlarm.c \ alarm/time/TimeAlarm.c \ alarm/touch/TouchAlarm.c \ - alarm/coproc/CoprocAlarm.c \ analogbufio/BufferedIn.c \ analogbufio/__init__.c \ analogio/AnalogIn.c \ @@ -423,9 +422,6 @@ SRC_COMMON_HAL_ALL = \ canio/CAN.c \ canio/Listener.c \ canio/__init__.c \ - coproc/__init__.c \ - coproc/Coproc.c \ - coproc/CoprocMemory.c \ countio/Counter.c \ countio/__init__.c \ digitalio/DigitalInOut.c \ @@ -443,9 +439,11 @@ SRC_COMMON_HAL_ALL = \ hashlib/Hash.c \ i2ctarget/I2CTarget.c \ i2ctarget/__init__.c \ + memorymap/__init__.c \ + memorymap/AddressRange.c \ + microcontroller/__init__.c \ microcontroller/Pin.c \ microcontroller/Processor.c \ - microcontroller/__init__.c \ mdns/__init__.c \ mdns/Server.c \ mdns/RemoteService.c \ @@ -543,6 +541,8 @@ SRC_SHARED_MODULE_ALL = \ _eve/__init__.c \ adafruit_pixelbuf/PixelBuf.c \ adafruit_pixelbuf/__init__.c \ + _pixelmap/PixelMap.c \ + _pixelmap/__init__.c \ _stage/Layer.c \ _stage/Text.c \ _stage/__init__.c \ @@ -584,7 +584,6 @@ SRC_SHARED_MODULE_ALL = \ displayio/TileGrid.c \ displayio/area.c \ displayio/__init__.c \ - dotenv/__init__.c \ floppyio/__init__.c \ fontio/BuiltinFont.c \ fontio/__init__.c \ @@ -713,6 +712,7 @@ endif SRC_SHARED_MODULE_INTERNAL = \ $(filter $(SRC_PATTERNS), \ displayio/display_core.c \ + os/getenv.c \ usb/utf16le.c \ ) diff --git a/py/circuitpy_mkenv.mk b/py/circuitpy_mkenv.mk new file mode 100644 index 0000000000..d776cc2fef --- /dev/null +++ b/py/circuitpy_mkenv.mk @@ -0,0 +1,70 @@ +# This file is part of the MicroPython project, http://micropython.org/ +# +# The MIT License (MIT) +# +# SPDX-FileCopyrightText: Copyright (c) 2022 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. + +# Common Makefile items that can be shared across CircuitPython ports. + +# Select the board to build for. +define show_board_error +$(info Valid boards:) +$(shell printf '%s\n' $(patsubst boards/%/mpconfigboard.mk,%,$(wildcard boards/*/mpconfigboard.mk)) | column -xc $$(tput cols || echo 80) 1>&2) +$(error Rerun with $(MAKE) BOARD=) +endef + +ifeq ($(BOARD),) + $(info No BOARD specified) + $(call show_board_error) +else + ifeq ($(wildcard boards/$(BOARD)/.),) + $(info Invalid BOARD specified) + $(call show_board_error) + endif +endif + +# If the flash PORT is not given, use the default /dev/tty.SLAB_USBtoUART. +PORT ?= /dev/tty.SLAB_USBtoUART + +# If the build directory is not given, make it reflect the board name. +BUILD ?= build-$(BOARD) + +include ../../py/mkenv.mk + +# Board-specific +include boards/$(BOARD)/mpconfigboard.mk + +# Port-specific +include mpconfigport.mk + +# CircuitPython-specific +include $(TOP)/py/circuitpy_mpconfig.mk + +# qstr definitions (must come before including py.mk) +QSTR_DEFS = qstrdefsport.h + +# include py core make definitions +include $(TOP)/py/py.mk + +include $(TOP)/supervisor/supervisor.mk + +# Include make rules and variables common across CircuitPython builds. +include $(TOP)/py/circuitpy_defns.mk diff --git a/py/circuitpy_mpconfig.h b/py/circuitpy_mpconfig.h index 6ae8275058..8bfb69297a 100644 --- a/py/circuitpy_mpconfig.h +++ b/py/circuitpy_mpconfig.h @@ -224,6 +224,9 @@ typedef long mp_off_t; #ifndef MICROPY_CPYTHON_COMPAT #define MICROPY_CPYTHON_COMPAT (CIRCUITPY_FULL_BUILD) #endif +#ifndef MICROPY_CPYTHON_EXCEPTION_CHAIN +#define MICROPY_CPYTHON_EXCEPTION_CHAIN (CIRCUITPY_FULL_BUILD) +#endif #define MICROPY_PY_BUILTINS_POW3 (CIRCUITPY_BUILTINS_POW3) #define MICROPY_PY_FSTRINGS (1) #define MICROPY_MODULE_WEAK_LINKS (0) @@ -579,6 +582,10 @@ void supervisor_run_background_tasks_if_tick(void); #define MICROPY_WRAP_MP_EXECUTE_BYTECODE PLACE_IN_ITCM #endif +#ifndef CIRCUITPY_DIGITALIO_HAVE_INPUT_ONLY +#define CIRCUITPY_DIGITALIO_HAVE_INPUT_ONLY (0) +#endif + #ifndef CIRCUITPY_DIGITALIO_HAVE_INVALID_PULL #define CIRCUITPY_DIGITALIO_HAVE_INVALID_PULL (0) #endif @@ -587,6 +594,7 @@ void supervisor_run_background_tasks_if_tick(void); #define CIRCUITPY_DIGITALIO_HAVE_INVALID_DRIVE_MODE (0) #endif +#define FF_FS_MAKE_VOLID (1) #define MICROPY_PY_OPTIMIZE_PROPERTY_FLASH_SIZE (CIRCUITPY_OPTIMIZE_PROPERTY_FLASH_SIZE) diff --git a/py/circuitpy_mpconfig.mk b/py/circuitpy_mpconfig.mk index fbf0b587b7..3c1c173a51 100644 --- a/py/circuitpy_mpconfig.mk +++ b/py/circuitpy_mpconfig.mk @@ -208,9 +208,6 @@ CFLAGS += -DCIRCUITPY_BITMAPTOOLS=$(CIRCUITPY_BITMAPTOOLS) CFLAGS += -DCIRCUITPY_FRAMEBUFFERIO=$(CIRCUITPY_FRAMEBUFFERIO) CFLAGS += -DCIRCUITPY_VECTORIO=$(CIRCUITPY_VECTORIO) -CIRCUITPY_DOTENV ?= $(CIRCUITPY_FULL_BUILD) -CFLAGS += -DCIRCUITPY_DOTENV=$(CIRCUITPY_DOTENV) - CIRCUITPY_DUALBANK ?= 0 CFLAGS += -DCIRCUITPY_DUALBANK=$(CIRCUITPY_DUALBANK) @@ -218,15 +215,21 @@ CFLAGS += -DCIRCUITPY_DUALBANK=$(CIRCUITPY_DUALBANK) CIRCUITPY_ENABLE_MPY_NATIVE ?= 0 CFLAGS += -DCIRCUITPY_ENABLE_MPY_NATIVE=$(CIRCUITPY_ENABLE_MPY_NATIVE) +CIRCUITPY_OS_GETENV ?= $(CIRCUITPY_FULL_BUILD) +CFLAGS += -DCIRCUITPY_OS_GETENV=$(CIRCUITPY_OS_GETENV) + CIRCUITPY_ERRNO ?= $(CIRCUITPY_FULL_BUILD) CFLAGS += -DCIRCUITPY_ERRNO=$(CIRCUITPY_ERRNO) -# CIRCUITPY_ESPIDF is handled in the espressif tree. +# CIRCUITPY_ESPIDF and CIRCUITPY_ESPULP is handled in the espressif tree. # Only for ESP32S chips. # Assume not a ESP build. CIRCUITPY_ESPIDF ?= 0 CFLAGS += -DCIRCUITPY_ESPIDF=$(CIRCUITPY_ESPIDF) +CIRCUITPY_ESPULP ?= 0 +CFLAGS += -DCIRCUITPY_ESPULP=$(CIRCUITPY_ESPULP) + CIRCUITPY_ESP32_CAMERA ?= 0 CFLAGS += -DCIRCUITPY_ESP32_CAMERA=$(CIRCUITPY_ESP32_CAMERA) @@ -283,6 +286,9 @@ CFLAGS += -DCIRCUITPY_KEYPAD=$(CIRCUITPY_KEYPAD) CIRCUITPY_MATH ?= 1 CFLAGS += -DCIRCUITPY_MATH=$(CIRCUITPY_MATH) +CIRCUITPY_MEMORYMAP ?= 0 +CFLAGS += -DCIRCUITPY_MEMORYMAP=$(CIRCUITPY_MEMORYMAP) + CIRCUITPY_MEMORYMONITOR ?= 0 CFLAGS += -DCIRCUITPY_MEMORYMONITOR=$(CIRCUITPY_MEMORYMONITOR) @@ -319,6 +325,9 @@ CFLAGS += -DCIRCUITPY_PEW=$(CIRCUITPY_PEW) CIRCUITPY_PIXELBUF ?= $(CIRCUITPY_FULL_BUILD) CFLAGS += -DCIRCUITPY_PIXELBUF=$(CIRCUITPY_PIXELBUF) +CIRCUITPY_PIXELMAP ?= $(CIRCUITPY_PIXELBUF) +CFLAGS += -DCIRCUITPY_PIXELMAP=$(CIRCUITPY_PIXELMAP) + # Only for SAMD boards for the moment CIRCUITPY_PS2IO ?= 0 CFLAGS += -DCIRCUITPY_PS2IO=$(CIRCUITPY_PS2IO) @@ -529,6 +538,9 @@ CFLAGS += -DCIRCUITPY_WIFI=$(CIRCUITPY_WIFI) CIRCUITPY_WEB_WORKFLOW ?= $(CIRCUITPY_WIFI) CFLAGS += -DCIRCUITPY_WEB_WORKFLOW=$(CIRCUITPY_WEB_WORKFLOW) +CIRCUITPY_WIFI_RADIO_SETTABLE_MAC_ADDRESS?= 1 +CFLAGS += -DCIRCUITPY_WIFI_RADIO_SETTABLE_MAC_ADDRESS=$(CIRCUITPY_WIFI_RADIO_SETTABLE_MAC_ADDRESS) + # tinyusb port tailored configuration CIRCUITPY_TUSB_MEM_ALIGN ?= 4 CFLAGS += -DCIRCUITPY_TUSB_MEM_ALIGN=$(CIRCUITPY_TUSB_MEM_ALIGN) diff --git a/py/genlast.py b/py/genlast.py index ad44745d97..460271af81 100644 --- a/py/genlast.py +++ b/py/genlast.py @@ -12,7 +12,7 @@ import subprocess from makeqstrdefs import qstr_unescape, QSTRING_BLOCK_LIST re_line = re.compile(r"#[line]*\s(\d+)\s\"([^\"]+)\"", re.DOTALL) -re_qstr = re.compile(r"MP_QSTR_[_a-zA-Z0-9]+", re.DOTALL) +re_qstr = re.compile(r"\bMP_QSTR_[_a-zA-Z0-9]+", re.DOTALL) re_translate = re.compile(r"translate\(\"((?:(?=(\\?))\2.)*?)\"\)", re.DOTALL) diff --git a/py/makeqstrdefs.py b/py/makeqstrdefs.py index f035ed5745..974227f2a5 100644 --- a/py/makeqstrdefs.py +++ b/py/makeqstrdefs.py @@ -65,6 +65,7 @@ name2codepoint["tilde"] = ord("~") # These are just vexing! del name2codepoint["and"] del name2codepoint["or"] +del name2codepoint["not"] def preprocess(): diff --git a/py/maketranslationdata.py b/py/maketranslationdata.py index c0ae85f4e0..fbf396c73f 100644 --- a/py/maketranslationdata.py +++ b/py/maketranslationdata.py @@ -10,6 +10,7 @@ supervisor/shared/translate/translate.h from __future__ import print_function import bisect +from dataclasses import dataclass import re import sys @@ -146,15 +147,69 @@ def iter_substrings(s, minlen, maxlen): yield s[begin : begin + n] -def compute_huffman_coding(translations, f): +translation_requires_uint16 = {"cs", "ja", "ko", "pl", "tr", "zh_Latn_pinyin"} + + +def compute_unicode_offset(texts): + all_ch = set(" ".join(texts)) + ch_160 = sorted(c for c in all_ch if 160 <= ord(c) < 255) + ch_256 = sorted(c for c in all_ch if 255 < ord(c)) + if not ch_256: + return 0, 0 + min_256 = ord(min(ch_256)) + span = ord(max(ch_256)) - ord(min(ch_256)) + 1 + + if ch_160: + max_160 = ord(max(ch_160)) + 1 + else: + max_160 = max(160, 255 - span) + + if max_160 + span > 256: + return 0, 0 + + offstart = max_160 + offset = min_256 - max_160 + return offstart, offset + + +@dataclass +class EncodingTable: + values: object + lengths: object + words: object + canonical: object + extractor: object + apply_offset: object + remove_offset: object + + +def compute_huffman_coding(translation_name, translations, f): texts = [t[1] for t in translations] words = [] start_unused = 0x80 end_unused = 0xFF max_ord = 0 + offstart, offset = compute_unicode_offset(texts) + + def apply_offset(c): + oc = ord(c) + if oc >= offstart: + oc += offset + return chr(oc) + + def remove_offset(c): + oc = ord(c) + if oc >= offstart: + oc = oc - offset + try: + return chr(oc) + except Exception as e: + raise ValueError(f"remove_offset {offstart=} {oc=}") from e + for text in texts: for c in text: + c = remove_offset(c) ord_c = ord(c) max_ord = max(ord_c, max_ord) if 0x80 <= ord_c < 0xFF: @@ -163,6 +218,12 @@ def compute_huffman_coding(translations, f): bits_per_codepoint = 16 if max_ord > 255 else 8 values_type = "uint16_t" if max_ord > 255 else "uint8_t" + translation_name = translation_name.split("/")[-1].split(".")[0] + if max_ord > 255 and translation_name not in translation_requires_uint16: + raise ValueError( + f"Translation {translation_name} expected to fit in 8 bits but required 16 bits" + ) + while len(words) < max_words: # Until the dictionary is filled to capacity, use a heuristic to find # the best "word" (2- to 11-gram) to add to it. @@ -267,15 +328,17 @@ def compute_huffman_coding(translations, f): length_count[length] += 1 if last_length: renumbered <<= length - last_length - canonical[atom] = "{0:0{width}b}".format(renumbered, width=length) # print(f"atom={repr(atom)} code={code}", file=sys.stderr) + canonical[atom] = "{0:0{width}b}".format(renumbered, width=length) if len(atom) > 1: o = words.index(atom) + 0x80 s = "".join(C_ESCAPES.get(ch1, ch1) for ch1 in atom) + f.write(f"// {o} {s} {counter[atom]} {canonical[atom]} {renumbered}\n") else: s = C_ESCAPES.get(atom, atom) + canonical[atom] = "{0:0{width}b}".format(renumbered, width=length) o = ord(atom) - f.write(f"// {o} {s} {counter[atom]} {canonical[atom]} {renumbered}\n") + f.write(f"// {o} {s} {counter[atom]} {canonical[atom]} {renumbered}\n") renumbered += 1 last_length = length lengths = bytearray() @@ -297,7 +360,11 @@ def compute_huffman_coding(translations, f): f.write("typedef {} mchar_t;\n".format(values_type)) f.write("const uint8_t lengths[] = {{ {} }};\n".format(", ".join(map(str, lengths)))) - f.write("const mchar_t values[] = {{ {} }};\n".format(", ".join(str(ord(u)) for u in values))) + f.write( + "const mchar_t values[] = {{ {} }};\n".format( + ", ".join(str(ord(remove_offset(u))) for u in values) + ) + ) f.write( "#define compress_max_length_bits ({})\n".format( max_translation_encoded_length.bit_length() @@ -305,7 +372,7 @@ def compute_huffman_coding(translations, f): ) f.write( "const mchar_t words[] = {{ {} }};\n".format( - ", ".join(str(ord(c)) for w in words for c in w) + ", ".join(str(ord(remove_offset(c))) for w in words for c in w) ) ) f.write("const uint8_t wlencount[] = {{ {} }};\n".format(", ".join(str(p) for p in wlencount))) @@ -313,12 +380,17 @@ def compute_huffman_coding(translations, f): f.write("#define word_end {}\n".format(word_end)) f.write("#define minlen {}\n".format(minlen)) f.write("#define maxlen {}\n".format(maxlen)) + f.write("#define translation_offstart {}\n".format(offstart)) + f.write("#define translation_offset {}\n".format(offset)) - return (values, lengths, words, canonical, extractor) + return EncodingTable(values, lengths, words, canonical, extractor, apply_offset, remove_offset) def decompress(encoding_table, encoded, encoded_length_bits): - (values, lengths, words, _, _) = encoding_table + values = encoding_table.values + lengths = encoding_table.lengths + words = encoding_table.words + dec = [] this_byte = 0 this_bit = 7 @@ -376,7 +448,8 @@ def decompress(encoding_table, encoded, encoded_length_bits): def compress(encoding_table, decompressed, encoded_length_bits, len_translation_encoded): if not isinstance(decompressed, str): raise TypeError() - (_, _, _, canonical, extractor) = encoding_table + canonical = encoding_table.canonical + extractor = encoding_table.extractor enc = bytearray(len(decompressed) * 3) current_bit = 7 @@ -522,5 +595,7 @@ if __name__ == "__main__": i18ns = parse_input_headers(args.infiles) i18ns = sorted(i18ns) translations = translate(args.translation, i18ns) - encoding_table = compute_huffman_coding(translations, args.compression_filename) + encoding_table = compute_huffman_coding( + args.translation, translations, args.compression_filename + ) output_translation_data(encoding_table, translations, args.translation_filename) diff --git a/py/modmath.c b/py/modmath.c index 167d46d02b..bf27e68eaf 100644 --- a/py/modmath.c +++ b/py/modmath.c @@ -254,7 +254,7 @@ STATIC mp_obj_t mp_math_log(size_t n_args, const mp_obj_t *args) { if (base <= (mp_float_t)0.0) { math_error(); } else if (base == (mp_float_t)1.0) { - mp_raise_msg(&mp_type_ZeroDivisionError, MP_ERROR_TEXT("division by zero")); + mp_raise_ZeroDivisionError(); } return mp_obj_new_float(l / MICROPY_FLOAT_C_FUN(log)(base)); } diff --git a/py/mpconfig.h b/py/mpconfig.h index 386a9765eb..9d68f4ce9d 100644 --- a/py/mpconfig.h +++ b/py/mpconfig.h @@ -773,6 +773,16 @@ typedef long long mp_longint_impl_t; #define MICROPY_WARNINGS (0) #endif +// Whether to support chained exceptions +#ifndef MICROPY_CPYTHON_EXCEPTION_CHAIN +#define MICROPY_CPYTHON_EXCEPTION_CHAIN (0) +#endif + +// Whether the statically allocated GeneratorExit exception may be const +#ifndef MICROPY_CONST_GENERATOREXIT_OBJ +#define MICROPY_CONST_GENERATOREXIT_OBJ (!MICROPY_CPYTHON_EXCEPTION_CHAIN) +#endif + // Whether to support warning categories #ifndef MICROPY_WARNINGS_CATEGORY #define MICROPY_WARNINGS_CATEGORY (0) diff --git a/py/nlrthumb.c b/py/nlrthumb.c index 30f9f2c196..4b20d30c6e 100644 --- a/py/nlrthumb.c +++ b/py/nlrthumb.c @@ -36,7 +36,7 @@ // For reference, arm/thumb callee save regs are: // r4-r11, r13=sp -__attribute__((naked)) unsigned int nlr_push(nlr_buf_t *nlr) { +__attribute__((naked, returns_twice)) unsigned int nlr_push(nlr_buf_t *nlr) { __asm volatile ( "str r4, [r0, #12] \n" // store r4 into nlr_buf diff --git a/py/obj.c b/py/obj.c index af2f4c1b68..72a0647176 100644 --- a/py/obj.c +++ b/py/obj.c @@ -142,9 +142,33 @@ void mp_obj_print(mp_obj_t o_in, mp_print_kind_t kind) { mp_obj_print_helper(MP_PYTHON_PRINTER, o_in, kind); } +static void mp_obj_print_inner_exception(const mp_print_t *print, mp_obj_t self_in, mp_int_t limit) { + #if MICROPY_CPYTHON_EXCEPTION_CHAIN + mp_obj_exception_t *self = mp_obj_exception_get_native(self_in); + const compressed_string_t *msg = MP_ERROR_TEXT("During handling of the above exception, another exception occurred:"); + mp_obj_exception_t *inner = NULL; + if (self->cause) { + msg = MP_ERROR_TEXT("The above exception was the direct cause of the following exception:"); + inner = self->cause; + } else if (!self->suppress_context) { + inner = self->context; + } + if (inner && !inner->marked) { + inner->marked = true; + mp_obj_print_exception_with_limit(print, MP_OBJ_FROM_PTR(inner), limit); + inner->marked = false; + mp_printf(print, "\n"); + mp_cprintf(print, msg); + mp_printf(print, "\n\n"); + } + #endif +} + // helper function to print an exception with traceback void mp_obj_print_exception_with_limit(const mp_print_t *print, mp_obj_t exc, mp_int_t limit) { if (mp_obj_is_exception_instance(exc) && stack_ok()) { + mp_obj_print_inner_exception(print, exc, limit); + size_t n, *values; mp_obj_exception_get_traceback(exc, &n, &values); if (n > 0) { diff --git a/py/obj.h b/py/obj.h index 7fa21f5e38..b7e76a1106 100644 --- a/py/obj.h +++ b/py/obj.h @@ -791,7 +791,9 @@ extern const struct _mp_obj_dict_t mp_const_empty_dict_obj; extern const struct _mp_obj_traceback_t mp_const_empty_traceback_obj; extern const struct _mp_obj_singleton_t mp_const_ellipsis_obj; extern const struct _mp_obj_singleton_t mp_const_notimplemented_obj; -extern const struct _mp_obj_exception_t mp_const_GeneratorExit_obj; +#if MICROPY_CONST_GENERATOREXIT_OBJ +extern const struct _mp_obj_exception_t mp_static_GeneratorExit_obj; +#endif // Fixed empty map. Useful when calling keyword-receiving functions // without any keywords from C, etc. diff --git a/py/objcomplex.c b/py/objcomplex.c index f205249bb4..7f4fd621e6 100644 --- a/py/objcomplex.c +++ b/py/objcomplex.c @@ -217,7 +217,7 @@ mp_obj_t mp_obj_complex_binary_op(mp_binary_op_t op, mp_float_t lhs_real, mp_flo case MP_BINARY_OP_INPLACE_TRUE_DIVIDE: if (rhs_imag == 0) { if (rhs_real == 0) { - mp_raise_msg(&mp_type_ZeroDivisionError, MP_ERROR_TEXT("complex division by zero")); + mp_raise_ZeroDivisionError(); } lhs_real /= rhs_real; lhs_imag /= rhs_real; diff --git a/py/objexcept.c b/py/objexcept.c index 32dacbb17a..80da487076 100644 --- a/py/objexcept.c +++ b/py/objexcept.c @@ -218,19 +218,45 @@ void mp_obj_exception_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) { mp_obj_exception_t *self = MP_OBJ_TO_PTR(self_in); if (dest[0] != MP_OBJ_NULL) { // store/delete attribute - if (self == &mp_const_GeneratorExit_obj) { + #if MICROPY_CONST_GENERATOREXIT_OBJ + if (self == &mp_static_GeneratorExit_obj) { mp_raise_AttributeError(MP_ERROR_TEXT("can't set attribute")); } + #endif if (attr == MP_QSTR___traceback__) { if (dest[1] == mp_const_none) { self->traceback = (mp_obj_traceback_t *)&mp_const_empty_traceback_obj; } else { if (!mp_obj_is_type(dest[1], &mp_type_traceback)) { - mp_raise_TypeError(MP_ERROR_TEXT("invalid traceback")); + mp_raise_TypeError_varg(MP_ERROR_TEXT("%q must be of type %q or None"), MP_QSTR___context__, MP_QSTR_traceback); } self->traceback = MP_OBJ_TO_PTR(dest[1]); } dest[0] = MP_OBJ_NULL; // indicate success + #if MICROPY_CPYTHON_EXCEPTION_CHAIN + } else if (attr == MP_QSTR___cause__) { + if (dest[1] == mp_const_none) { + self->cause = NULL; + } else if (!mp_obj_is_type(dest[1], &mp_type_BaseException)) { + self->cause = dest[1]; + } else { + mp_raise_TypeError_varg(MP_ERROR_TEXT("%q must be of type %q or None"), attr, MP_QSTR_BaseException); + } + self->suppress_context = true; + dest[0] = MP_OBJ_NULL; // indicate success + } else if (attr == MP_QSTR___context__) { + if (dest[1] == mp_const_none) { + self->context = NULL; + } else if (!mp_obj_is_type(dest[1], &mp_type_BaseException)) { + self->context = dest[1]; + } else { + mp_raise_TypeError_varg(MP_ERROR_TEXT("%q must be of type %q or None"), attr, MP_QSTR_BaseException); + } + dest[0] = MP_OBJ_NULL; // indicate success + } else if (attr == MP_QSTR___suppress_context__) { + self->suppress_context = mp_obj_is_true(dest[1]); + dest[0] = MP_OBJ_NULL; // indicate success + #endif } return; } @@ -240,6 +266,14 @@ void mp_obj_exception_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) { dest[0] = mp_obj_exception_get_value(self_in); } else if (attr == MP_QSTR___traceback__) { dest[0] = (self->traceback) ? MP_OBJ_FROM_PTR(self->traceback) : mp_const_none; + #if MICROPY_CPYTHON_EXCEPTION_CHAIN + } else if (attr == MP_QSTR___cause__) { + dest[0] = (self->cause) ? MP_OBJ_FROM_PTR(self->cause) : mp_const_none; + } else if (attr == MP_QSTR___context__) { + dest[0] = (self->context) ? MP_OBJ_FROM_PTR(self->context) : mp_const_none; + } else if (attr == MP_QSTR___suppress_context__) { + dest[0] = mp_obj_new_bool(self->suppress_context); + #endif #if MICROPY_CPYTHON_COMPAT } else if (mp_obj_is_subclass_fast(MP_OBJ_FROM_PTR(self->base.type), MP_OBJ_FROM_PTR(&mp_type_OSError))) { if (attr == MP_QSTR_errno) { diff --git a/py/objexcept.h b/py/objexcept.h index f28f50f5dc..77b338e951 100644 --- a/py/objexcept.h +++ b/py/objexcept.h @@ -34,6 +34,11 @@ typedef struct _mp_obj_exception_t { mp_obj_base_t base; mp_obj_tuple_t *args; mp_obj_traceback_t *traceback; + #if MICROPY_CPYTHON_EXCEPTION_CHAIN + struct _mp_obj_exception_t *cause, *context; + bool suppress_context; + bool marked; + #endif } mp_obj_exception_t; void mp_obj_exception_print(const mp_print_t *print, mp_obj_t o_in, mp_print_kind_t kind); diff --git a/py/objfloat.c b/py/objfloat.c index f8261df933..7aebcfdeb2 100644 --- a/py/objfloat.c +++ b/py/objfloat.c @@ -266,7 +266,7 @@ mp_obj_t mp_obj_float_binary_op(mp_binary_op_t op, mp_float_t lhs_val, mp_obj_t case MP_BINARY_OP_INPLACE_FLOOR_DIVIDE: if (rhs_val == 0) { zero_division_error: - mp_raise_msg(&mp_type_ZeroDivisionError, MP_ERROR_TEXT("divide by zero")); + mp_raise_ZeroDivisionError(); } // Python specs require that x == (x//y)*y + (x%y) so we must // call divmod to compute the correct floor division, which diff --git a/py/objgenerator.c b/py/objgenerator.c index c9af11fbb5..2256911e23 100644 --- a/py/objgenerator.c +++ b/py/objgenerator.c @@ -38,7 +38,12 @@ #include "supervisor/shared/translate/translate.h" // Instance of GeneratorExit exception - needed by generator.close() -const mp_obj_exception_t mp_const_GeneratorExit_obj = {{&mp_type_GeneratorExit}, (mp_obj_tuple_t *)&mp_const_empty_tuple_obj, (mp_obj_traceback_t *)&mp_const_empty_traceback_obj}; +#if MICROPY_CONST_GENERATOREXIT_OBJ +const +#else +static +#endif +mp_obj_exception_t mp_static_GeneratorExit_obj = {{&mp_type_GeneratorExit}, (mp_obj_tuple_t *)&mp_const_empty_tuple_obj, (mp_obj_traceback_t *)&mp_const_empty_traceback_obj}; /******************************************************************************/ /* generator wrapper */ @@ -362,9 +367,19 @@ STATIC mp_obj_t gen_instance_throw(size_t n_args, const mp_obj_t *args) { } STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(gen_instance_throw_obj, 2, 4, gen_instance_throw); +static mp_obj_t generatorexit(void) { + #if MICROPY_CPYTHON_EXCEPTION_CHAIN + MP_STATIC_ASSERT(!MICROPY_CONST_GENERATOREXIT_OBJ); + mp_static_GeneratorExit_obj.context = NULL; + mp_static_GeneratorExit_obj.cause = NULL; + mp_static_GeneratorExit_obj.suppress_context = false; + #endif + return MP_OBJ_FROM_PTR(&mp_static_GeneratorExit_obj); +} + STATIC mp_obj_t gen_instance_close(mp_obj_t self_in) { mp_obj_t ret; - switch (mp_obj_gen_resume(self_in, mp_const_none, MP_OBJ_FROM_PTR(&mp_const_GeneratorExit_obj), &ret)) { + switch (mp_obj_gen_resume(self_in, mp_const_none, generatorexit(), &ret)) { case MP_VM_RETURN_YIELD: mp_raise_msg(&mp_type_RuntimeError, MP_ERROR_TEXT("generator ignored GeneratorExit")); diff --git a/py/objint.c b/py/objint.c index b44a2e3b4a..6dc675823f 100644 --- a/py/objint.c +++ b/py/objint.c @@ -396,7 +396,7 @@ mp_obj_t mp_obj_int_binary_op(mp_binary_op_t op, mp_obj_t lhs_in, mp_obj_t rhs_i // This is called only with strings whose value doesn't fit in SMALL_INT mp_obj_t mp_obj_new_int_from_str_len(const char **str, size_t len, bool neg, unsigned int base) { - mp_raise_msg(&mp_type_OverflowError, MP_ERROR_TEXT("long int not supported in this build")); + mp_raise_msg(&mp_type_OverflowError, MP_ERROR_TEXT("small int overflow")); return mp_const_none; } diff --git a/py/objint_longlong.c b/py/objint_longlong.c index 67ec844f47..d318eab38e 100644 --- a/py/objint_longlong.c +++ b/py/objint_longlong.c @@ -236,7 +236,7 @@ mp_obj_t mp_obj_int_binary_op(mp_binary_op_t op, mp_obj_t lhs_in, mp_obj_t rhs_i } zero_division: - mp_raise_msg(&mp_type_ZeroDivisionError, MP_ERROR_TEXT("division by zero")); + mp_raise_ZeroDivisionError(); } mp_obj_t mp_obj_new_int(mp_int_t value) { diff --git a/py/objint_mpz.c b/py/objint_mpz.c index fd74803fe7..e147e5f08a 100644 --- a/py/objint_mpz.c +++ b/py/objint_mpz.c @@ -244,7 +244,7 @@ mp_obj_t mp_obj_int_binary_op(mp_binary_op_t op, mp_obj_t lhs_in, mp_obj_t rhs_i case MP_BINARY_OP_INPLACE_FLOOR_DIVIDE: { if (mpz_is_zero(zrhs)) { zero_division_error: - mp_raise_msg(&mp_type_ZeroDivisionError, MP_ERROR_TEXT("divide by zero")); + mp_raise_ZeroDivisionError(); } mpz_t rem; mpz_init_zero(&rem); diff --git a/py/objrange.c b/py/objrange.c index b0c74815dc..78a5fcd0f8 100644 --- a/py/objrange.c +++ b/py/objrange.c @@ -110,7 +110,7 @@ STATIC mp_obj_t range_make_new(const mp_obj_type_t *type, size_t n_args, size_t if (n_args == 3) { o->step = mp_obj_get_int(args[2]); if (o->step == 0) { - mp_raise_ValueError(MP_ERROR_TEXT("zero step")); + mp_raise_ValueError_varg(MP_ERROR_TEXT("%q step cannot be zero"), MP_QSTR_range); } } } diff --git a/py/objslice.c b/py/objslice.c index 3172f798c0..395af727e8 100644 --- a/py/objslice.c +++ b/py/objslice.c @@ -157,7 +157,7 @@ void mp_obj_slice_indices(mp_obj_t self_in, mp_int_t length, mp_bound_slice_t *r } else { step = mp_obj_get_int(self->step); if (step == 0) { - mp_raise_ValueError(MP_ERROR_TEXT("slice step cannot be zero")); + mp_raise_ValueError_varg(MP_ERROR_TEXT("%q step cannot be zero"), MP_QSTR_slice); } } diff --git a/py/objstrunicode.c b/py/objstrunicode.c index 0f26da62cf..863bbd42d7 100644 --- a/py/objstrunicode.c +++ b/py/objstrunicode.c @@ -159,7 +159,7 @@ const byte *str_index_to_ptr(const mp_obj_type_t *type, const byte *self_data, s if (mp_obj_is_small_int(index)) { i = MP_OBJ_SMALL_INT_VALUE(index); } else if (!mp_obj_get_int_maybe(index, &i)) { - mp_raise_TypeError_varg(MP_ERROR_TEXT("string indices must be integers, not %q"), mp_obj_get_type_qstr(index)); + mp_raise_TypeError_varg(translate("%q must be of type %q"), MP_QSTR_index, MP_QSTR_int); } const byte *s, *top = self_data + self_len; if (i < 0) { diff --git a/py/objtype.c b/py/objtype.c index 0914ad5f2e..76b9551be8 100644 --- a/py/objtype.c +++ b/py/objtype.c @@ -106,7 +106,9 @@ STATIC mp_obj_t native_base_init_wrapper(size_t n_args, const mp_obj_t *pos_args // copy in args memcpy(args2, pos_args, n_args * sizeof(mp_obj_t)); // copy in kwargs - memcpy(args2 + n_args, kw_args->table, 2 * n_kw * sizeof(mp_obj_t)); + if (n_kw) { + memcpy(args2 + n_args, kw_args->table, 2 * n_kw * sizeof(mp_obj_t)); + } self->subobj[0] = native_base->make_new(native_base, n_args, n_kw, args2); m_del(mp_obj_t, args2, n_args + 2 * n_kw); diff --git a/py/parsenum.c b/py/parsenum.c index adf2a4d84d..24d46705a7 100644 --- a/py/parsenum.c +++ b/py/parsenum.c @@ -55,9 +55,9 @@ mp_obj_t mp_parse_num_integer(const char *restrict str_, size_t len, int base, m mp_obj_t ret_val; // check radix base - if ((base != 0 && base < 2) || base > 36) { + if (base != 0) { // this won't be reached if lex!=NULL - mp_raise_ValueError(MP_ERROR_TEXT("int() arg 2 must be >= 2 and <= 36")); + mp_arg_validate_int_range(base, 2, 36, MP_QSTR_base); } // skip leading space diff --git a/py/py.mk b/py/py.mk index 6827fbe786..0cbfd252f2 100644 --- a/py/py.mk +++ b/py/py.mk @@ -262,8 +262,15 @@ $(HEADER_BUILD)/qstrdefs.generated.h: $(PY_SRC)/makeqstrdata.py $(HEADER_BUILD)/ $(STEPECHO) "GEN $@" $(Q)$(PYTHON) $(PY_SRC)/makeqstrdata.py --output_type=data $(HEADER_BUILD)/qstrdefs.preprocessed.h > $@ -$(PY_BUILD)/translations-$(TRANSLATION).c $(HEADER_BUILD)/compression.generated.h: $(PY_SRC)/maketranslationdata.py $(HEADER_BUILD)/$(TRANSLATION).mo $(HEADER_BUILD)/qstrdefs.preprocessed.h +# Is generated as a side-effect of building compression.generated.h +# Specifying both in a single rule actually causes the rule to be run twice! +# This alternative makes it run just once. +$(PY_BUILD)/translations-$(TRANSLATION).c: $(HEADER_BUILD)/compression.generated.h + @true + +$(HEADER_BUILD)/compression.generated.h: $(PY_SRC)/maketranslationdata.py $(HEADER_BUILD)/$(TRANSLATION).mo $(HEADER_BUILD)/qstrdefs.preprocessed.h $(STEPECHO) "GEN $@" + $(Q)mkdir -p $(PY_BUILD) $(Q)$(PYTHON) $(PY_SRC)/maketranslationdata.py --compression_filename $(HEADER_BUILD)/compression.generated.h --translation $(HEADER_BUILD)/$(TRANSLATION).mo --translation_filename $(PY_BUILD)/translations-$(TRANSLATION).c $(HEADER_BUILD)/qstrdefs.preprocessed.h PY_CORE_O += $(PY_BUILD)/translations-$(TRANSLATION).o diff --git a/py/qstrdefs.h b/py/qstrdefs.h index 02b87f4ec3..70753866bd 100644 --- a/py/qstrdefs.h +++ b/py/qstrdefs.h @@ -49,7 +49,6 @@ Q({:#x}) Q({:#b}) Q( ) Q(\n) -Q(maximum recursion depth exceeded) Q() Q() Q() @@ -63,7 +62,3 @@ Q(utf-8) #if MICROPY_MODULE_FROZEN Q(.frozen) #endif - -#if MICROPY_ENABLE_PYSTACK -Q(pystack exhausted) -#endif diff --git a/py/runtime.c b/py/runtime.c index e5b411b0d3..9779456d0c 100644 --- a/py/runtime.c +++ b/py/runtime.c @@ -310,7 +310,7 @@ mp_obj_t mp_unary_op(mp_unary_op_t op, mp_obj_t arg) { } #else if (op == MP_UNARY_OP_INT) { - mp_raise_TypeError_varg(MP_ERROR_TEXT("can't convert %q to int"), mp_obj_get_type_qstr(arg)); + mp_raise_TypeError_varg(MP_ERROR_TEXT("can't convert %q to %q"), mp_obj_get_type_qstr(arg), MP_QSTR_int); } else { mp_raise_TypeError_varg(MP_ERROR_TEXT("unsupported type for %q: '%q'"), mp_unary_op_method_name[op], mp_obj_get_type_qstr(arg)); @@ -631,7 +631,7 @@ unsupported_op: #endif zero_division: - mp_raise_msg(&mp_type_ZeroDivisionError, MP_ERROR_TEXT("division by zero")); + mp_raise_ZeroDivisionError(); } mp_obj_t mp_call_function_0(mp_obj_t fun) { @@ -1247,8 +1247,8 @@ void mp_store_attr(mp_obj_t base, qstr attr, mp_obj_t value) { mp_raise_AttributeError(MP_ERROR_TEXT("no such attribute")); #else mp_raise_msg_varg(&mp_type_AttributeError, - MP_ERROR_TEXT("'%s' object has no attribute '%q'"), - mp_obj_get_type_str(base), attr); + MP_ERROR_TEXT("can't set attribute '%q'"), + attr); #endif } @@ -1765,3 +1765,7 @@ NORETURN void mp_raise_recursion_depth(void) { mp_raise_RuntimeError(MP_ERROR_TEXT("maximum recursion depth exceeded")); } #endif + +NORETURN void mp_raise_ZeroDivisionError(void) { + mp_raise_msg(&mp_type_ZeroDivisionError, MP_ERROR_TEXT("division by zero")); +} diff --git a/py/runtime.h b/py/runtime.h index 923071f7ca..a5f66b1507 100644 --- a/py/runtime.h +++ b/py/runtime.h @@ -91,7 +91,9 @@ static inline void mp_arg_check_num(size_t n_args, size_t n_kw, size_t n_args_mi } void mp_arg_parse_all(size_t n_pos, const mp_obj_t *pos, mp_map_t *kws, size_t n_allowed, const mp_arg_t *allowed, mp_arg_val_t *out_vals); void mp_arg_parse_all_kw_array(size_t n_pos, size_t n_kw, const mp_obj_t *args, size_t n_allowed, const mp_arg_t *allowed, mp_arg_val_t *out_vals); +#if MICROPY_ERROR_REPORTING <= MICROPY_ERROR_REPORTING_TERSE NORETURN void mp_arg_error_terse_mismatch(void); +#endif NORETURN void mp_arg_error_unimpl_kw(void); NORETURN void mp_arg_error_invalid(qstr arg_name); @@ -226,6 +228,7 @@ NORETURN void mp_raise_NotImplementedError(const compressed_string_t *msg); NORETURN void mp_raise_NotImplementedError_varg(const compressed_string_t *fmt, ...); NORETURN void mp_raise_OverflowError_varg(const compressed_string_t *fmt, ...); NORETURN void mp_raise_recursion_depth(void); +NORETURN void mp_raise_ZeroDivisionError(void); #endif #if MICROPY_BUILTIN_METHOD_CHECK_SELF_ARG diff --git a/py/vm.c b/py/vm.c index 12a0f2d445..2663b5fd68 100644 --- a/py/vm.c +++ b/py/vm.c @@ -183,6 +183,15 @@ #define TRACE_TICK(current_ip, current_sp, is_exception) #endif // MICROPY_PY_SYS_SETTRACE +STATIC mp_obj_t get_active_exception(mp_exc_stack_t *exc_sp, mp_exc_stack_t *exc_stack) { + for (mp_exc_stack_t *e = exc_sp; e >= exc_stack; --e) { + if (e->prev_exc != NULL) { + return MP_OBJ_FROM_PTR(e->prev_exc); + } + } + return MP_OBJ_NULL; +} + // fastn has items in reverse order (fastn[0] is local[0], fastn[-1] is local[1], etc) // sp points to bottom of stack which grows up // returns: @@ -1129,13 +1138,7 @@ unwind_return: ENTRY(MP_BC_RAISE_LAST): { MARK_EXC_IP_SELECTIVE(); // search for the inner-most previous exception, to reraise it - mp_obj_t obj = MP_OBJ_NULL; - for (mp_exc_stack_t *e = exc_sp; e >= exc_stack; --e) { - if (e->prev_exc != NULL) { - obj = MP_OBJ_FROM_PTR(e->prev_exc); - break; - } - } + mp_obj_t obj = get_active_exception(exc_sp, exc_stack); if (obj == MP_OBJ_NULL) { obj = mp_obj_new_exception_msg(&mp_type_RuntimeError, MP_ERROR_TEXT("no active exception to reraise")); } @@ -1145,14 +1148,30 @@ unwind_return: ENTRY(MP_BC_RAISE_OBJ): { MARK_EXC_IP_SELECTIVE(); mp_obj_t obj = mp_make_raise_obj(TOP()); + #if MICROPY_CPYTHON_EXCEPTION_CHAIN + mp_obj_t active_exception = get_active_exception(exc_sp, exc_stack); + if (active_exception != MP_OBJ_NULL && active_exception != obj) { + mp_store_attr(obj, MP_QSTR___context__, active_exception); + } + #endif RAISE(obj); } ENTRY(MP_BC_RAISE_FROM): { MARK_EXC_IP_SELECTIVE(); - mp_warning(NULL, "exception chaining not supported"); - sp--; // ignore (pop) "from" argument + mp_obj_t cause = POP(); mp_obj_t obj = mp_make_raise_obj(TOP()); + #if MICROPY_CPYTHON_EXCEPTION_CHAIN + // search for the inner-most previous exception, to chain it + mp_obj_t active_exception = get_active_exception(exc_sp, exc_stack); + if (active_exception != MP_OBJ_NULL && active_exception != obj) { + mp_store_attr(obj, MP_QSTR___context__, active_exception); + } + mp_store_attr(obj, MP_QSTR___cause__, cause); + #else + (void)cause; + mp_warning(NULL, "exception chaining not supported"); + #endif RAISE(obj); } @@ -1391,7 +1410,10 @@ unwind_loop: // - constant GeneratorExit object, because it's const // - exceptions re-raised by END_FINALLY // - exceptions re-raised explicitly by "raise" - if (nlr.ret_val != &mp_const_GeneratorExit_obj + if ( true + #if MICROPY_CONST_GENERATOREXIT_OBJ + && nlr.ret_val != &mp_static_GeneratorExit_obj + #endif && *code_state->ip != MP_BC_END_FINALLY && *code_state->ip != MP_BC_RAISE_LAST) { const byte *ip = code_state->fun_bc->bytecode; @@ -1434,10 +1456,19 @@ unwind_loop: // catch exception and pass to byte code code_state->ip = exc_sp->handler; mp_obj_t *sp = MP_TAGPTR_PTR(exc_sp->val_sp); + #if MICROPY_CPYTHON_EXCEPTION_CHAIN + mp_obj_t active_exception = get_active_exception(exc_sp, exc_stack); + #endif // save this exception in the stack so it can be used in a reraise, if needed exc_sp->prev_exc = nlr.ret_val; + mp_obj_t obj = MP_OBJ_FROM_PTR(nlr.ret_val); + #if MICROPY_CPYTHON_EXCEPTION_CHAIN + if (active_exception != MP_OBJ_NULL && active_exception != obj) { + mp_store_attr(obj, MP_QSTR___context__, active_exception); + } + #endif // push exception object so it can be handled by bytecode - PUSH(MP_OBJ_FROM_PTR(nlr.ret_val)); + PUSH(obj); code_state->sp = sp; #if MICROPY_STACKLESS diff --git a/shared-bindings/_pixelmap/PixelMap.c b/shared-bindings/_pixelmap/PixelMap.c new file mode 100644 index 0000000000..94fa4d5c96 --- /dev/null +++ b/shared-bindings/_pixelmap/PixelMap.c @@ -0,0 +1,269 @@ +/* + * This file is part of the CircuitPython project, https://github.com/adafruit/circuitpython + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Rose Hooper + * Copyright (c) 2022 Jeff Epler 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/objproperty.h" +#include "py/objtype.h" +#include "py/runtime.h" + +#include "shared-bindings/_pixelmap/PixelMap.h" +#include "shared-bindings/adafruit_pixelbuf/PixelBuf.h" +#include "shared-module/_pixelmap/PixelMap.h" + +//| from adafruit_pixelbuf import PixelBuf, PixelReturnType, PixelSequence, PixelType +//| +//| class PixelMap: +//| def __init__(self, pixelbuf: PixelBuf, indices: Tuple[Union[int, Tuple[int]]]) -> None: +//| """Construct a PixelMap object that uses the given indices of the underlying pixelbuf""" + +STATIC mp_obj_t pixelmap_pixelmap_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { + enum { ARG_pixelbuf, ARG_indices }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_pixelbuf, MP_ARG_REQUIRED }, + { MP_QSTR_indices, MP_ARG_REQUIRED }, + }; + + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + mp_obj_t pixelbuf = args[ARG_pixelbuf].u_obj; + + mp_obj_t native_pixelbuf = mp_obj_cast_to_native_base(pixelbuf, &pixelbuf_pixelbuf_type); + if (!native_pixelbuf) { + (void)mp_arg_validate_type(args[ARG_pixelbuf].u_obj, &pixelbuf_pixelbuf_type, MP_QSTR_pixelbuf); + } + mp_obj_assert_native_inited(native_pixelbuf); + + size_t buflen = common_hal_adafruit_pixelbuf_pixelbuf_get_len(pixelbuf); + + mp_obj_t indices = mp_arg_validate_type(args[ARG_indices].u_obj, &mp_type_tuple, MP_QSTR_indices); + + // validate indices + size_t len; + mp_obj_t *items; + mp_obj_tuple_get(indices, &len, &items); + mp_arg_validate_length_min(len, 1, MP_QSTR_items); + + for (size_t i = 0; i < len; i++) { + mp_obj_t item = items[i]; + if (mp_obj_is_small_int(item)) { + mp_arg_validate_index_range(MP_OBJ_SMALL_INT_VALUE(item), 0, buflen - 1, MP_QSTR_index); + } else if (mp_obj_is_tuple_compatible(item)) { + size_t len1; + mp_obj_t *items1; + mp_obj_tuple_get(item, &len1, &items1); + for (size_t j = 0; j < len1; j++) { + mp_obj_t item1 = items1[j]; + if (!mp_obj_is_small_int(item1)) { + mp_raise_TypeError(translate("nested index must be int")); + } + mp_arg_validate_index_range(MP_OBJ_SMALL_INT_VALUE(item1), 0, buflen - 1, MP_QSTR_index); + } + } else { + mp_raise_TypeError(translate("index must be tuple or int")); + } + } + + pixelmap_pixelmap_obj_t *self = m_new_obj(pixelmap_pixelmap_obj_t); + self->base.type = &pixelmap_pixelmap_type; + shared_module_pixelmap_pixelmap_construct(self, pixelbuf, indices); + + return MP_OBJ_FROM_PTR(self); +} + +//| auto_write: bool +//| """True if updates should be automatically written""" +STATIC mp_obj_t pixelmap_pixelmap_auto_write_get(const mp_obj_t self_in) { + pixelmap_pixelmap_obj_t *self = MP_OBJ_TO_PTR(self_in); + return mp_obj_new_bool(shared_module_pixelmap_pixelmap_auto_write_get(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(pixelmap_pixelmap_auto_write_get_obj, pixelmap_pixelmap_auto_write_get); + +STATIC mp_obj_t pixelmap_pixelmap_auto_write_set(const mp_obj_t self_in, const mp_obj_t arg) { + pixelmap_pixelmap_obj_t *self = MP_OBJ_TO_PTR(self_in); + shared_module_pixelmap_pixelmap_auto_write_set(self, mp_obj_is_true(arg)); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(pixelmap_pixelmap_auto_write_set_obj, pixelmap_pixelmap_auto_write_set); + +MP_PROPERTY_GETSET(pixelmap_pixelmap_auto_write_obj, + (mp_obj_t)&pixelmap_pixelmap_auto_write_get_obj, + (mp_obj_t)&pixelmap_pixelmap_auto_write_set_obj); + +//| bpp: int +//| """The number of bytes per pixel in the buffer (read-only)""" +STATIC mp_obj_t pixelmap_pixelmap_obj_get_bpp(mp_obj_t self_in) { + pixelmap_pixelmap_obj_t *self = MP_OBJ_TO_PTR(self_in); + return MP_OBJ_NEW_SMALL_INT(common_hal_adafruit_pixelbuf_pixelbuf_get_bpp(self->pixelbuf)); +} +MP_DEFINE_CONST_FUN_OBJ_1(pixelmap_pixelmap_get_bpp_obj, pixelmap_pixelmap_obj_get_bpp); + +MP_PROPERTY_GETTER(pixelmap_pixelmap_bpp_obj, + (mp_obj_t)&pixelmap_pixelmap_get_bpp_obj); + +//| byteorder: str +//| """byteorder string for the buffer (read-only)""" +STATIC mp_obj_t pixelmap_pixelmap_obj_get_byteorder(mp_obj_t self_in) { + pixelmap_pixelmap_obj_t *self = MP_OBJ_TO_PTR(self_in); + return common_hal_adafruit_pixelbuf_pixelbuf_get_byteorder_string(self->pixelbuf); +} +MP_DEFINE_CONST_FUN_OBJ_1(pixelmap_pixelmap_get_byteorder, pixelmap_pixelmap_obj_get_byteorder); +MP_PROPERTY_GETTER(pixelmap_pixelmap_byteorder_obj, + (mp_obj_t)&pixelmap_pixelmap_get_byteorder); + +//| +//| def fill(self, color: PixelType) -> None: +//| """Fill all the pixels in the map with the given color""" +STATIC mp_obj_t pixelmap_pixelmap_fill(const mp_obj_t self_in, const mp_obj_t color) { + pixelmap_pixelmap_obj_t *self = MP_OBJ_TO_PTR(self_in); + + shared_module_pixelmap_pixelmap_fill(self, color); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(pixelmap_pixelmap_fill_obj, pixelmap_pixelmap_fill); + +//| +//| def indices(self, index: int) -> Tuple[int]: +//| """Return the PixelBuf indices for a PixelMap index""" +STATIC mp_obj_t pixelmap_pixelmap_indices(const mp_obj_t self_in, const mp_obj_t index) { + pixelmap_pixelmap_obj_t *self = MP_OBJ_TO_PTR(self_in); + + return shared_module_pixelmap_pixelmap_indices(self, mp_obj_get_int(index)); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(pixelmap_pixelmap_indices_obj, pixelmap_pixelmap_indices); + + +//| @overload +//| def __getitem__(self, index: slice) -> PixelReturnSequence: +//| """Retrieve the value of the underlying pixels.""" +//| ... +//| @overload +//| def __getitem__(self, index: int) -> PixelReturnType: +//| """Retrieve the value of one of the underlying pixels at 'index'.""" +//| ... +//| @overload +//| def __setitem__(self, index: slice, value: PixelSequence) -> None: ... +//| @overload +//| def __setitem__(self, index: int, value: PixelType) -> None: +//| """Sets the pixel value at the given index. Value can either be a tuple or integer. Tuples are +//| The individual (Red, Green, Blue[, White]) values between 0 and 255. If given an integer, the +//| red, green and blue values are packed into the lower three bytes (0xRRGGBB). +//| For RGBW byteorders, if given only RGB values either as an int or as a tuple, the white value +//| is used instead when the red, green, and blue values are the same.""" +//| ... +STATIC mp_obj_t pixelmap_pixelmap_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_obj_t value) { + pixelmap_pixelmap_obj_t *self = MP_OBJ_TO_PTR(self_in); + if (value == MP_OBJ_NULL) { + // delete + return MP_OBJ_NULL; // op not supported + } + + if (0) { + #if MICROPY_PY_BUILTINS_SLICE + } else if (mp_obj_is_type(index_in, &mp_type_slice)) { + mp_bound_slice_t slice; + mp_seq_get_fast_slice_indexes(self->len, index_in, &slice); + size_t slice_len; + if (slice.step > 0) { + slice_len = slice.stop - slice.start; + } else { + slice_len = 1 + slice.start - slice.stop; + } + if (slice.step > 1 || slice.step < -1) { + size_t step = slice.step > 0 ? slice.step : slice.step * -1; + slice_len = (slice_len / step) + (slice_len % step ? 1 : 0); + } + + if (value == MP_OBJ_SENTINEL) { // Get + return shared_module_pixelmap_pixelmap_getslice(self, slice, slice_len); + } else { // Set + shared_module_pixelmap_pixelmap_setslice(self, value, slice, slice_len); + return mp_const_none; + } + #endif + } else { // single index + int index = mp_obj_get_int(index_in); + + if (value == MP_OBJ_SENTINEL) { // Get + return shared_module_pixelmap_pixelmap_getitem(self, index); + } else { + shared_module_pixelmap_pixelmap_setitem(self, mp_obj_get_int(index_in), value); + return mp_const_none; + } + } +} + +//| def __len__(self) -> int: +//| """Length of the map""" +STATIC mp_obj_t pixelmap_pixelmap_unary_op(mp_unary_op_t op, mp_obj_t self_in) { + pixelmap_pixelmap_obj_t *self = MP_OBJ_TO_PTR(self_in); + switch (op) { + case MP_UNARY_OP_BOOL: + return mp_const_true; + case MP_UNARY_OP_LEN: + return MP_OBJ_NEW_SMALL_INT(self->len); + default: + return MP_OBJ_NULL; // op not supported + } +} + +//| def show(self) -> None: +//| """Transmits the color data to the pixels so that they are shown. This is done automatically +//| when `auto_write` is True.""" +//| ... +//| + +STATIC mp_obj_t pixelmap_pixelmap_show(mp_obj_t self_in) { + pixelmap_pixelmap_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_adafruit_pixelbuf_pixelbuf_show(self->pixelbuf); + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(pixelmap_pixelmap_show_obj, pixelmap_pixelmap_show); + +STATIC const mp_rom_map_elem_t pixelmap_pixelmap_locals_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_auto_write), MP_ROM_PTR(&pixelmap_pixelmap_auto_write_obj) }, + { MP_ROM_QSTR(MP_QSTR_bpp), MP_ROM_PTR(&pixelmap_pixelmap_bpp_obj) }, + { MP_ROM_QSTR(MP_QSTR_byteorder), MP_ROM_PTR(&pixelmap_pixelmap_byteorder_obj) }, + { MP_ROM_QSTR(MP_QSTR_fill), MP_ROM_PTR(&pixelmap_pixelmap_fill_obj) }, + { MP_ROM_QSTR(MP_QSTR_indices), MP_ROM_PTR(&pixelmap_pixelmap_indices_obj) }, + { MP_ROM_QSTR(MP_QSTR_show), MP_ROM_PTR(&pixelmap_pixelmap_show_obj) }, +}; + +STATIC MP_DEFINE_CONST_DICT(pixelmap_pixelmap_locals_dict, pixelmap_pixelmap_locals_dict_table); + + +const mp_obj_type_t pixelmap_pixelmap_type = { + { &mp_type_type }, + .name = MP_QSTR_PixelMap, + .flags = MP_TYPE_FLAG_EXTENDED, + .locals_dict = (mp_obj_t)&pixelmap_pixelmap_locals_dict, + .make_new = pixelmap_pixelmap_make_new, + MP_TYPE_EXTENDED_FIELDS( + .subscr = pixelmap_pixelmap_subscr, + .unary_op = pixelmap_pixelmap_unary_op, + ), +}; diff --git a/shared-bindings/_pixelmap/PixelMap.h b/shared-bindings/_pixelmap/PixelMap.h new file mode 100644 index 0000000000..fef0db44d0 --- /dev/null +++ b/shared-bindings/_pixelmap/PixelMap.h @@ -0,0 +1,43 @@ +/* + * This file is part of the CircuitPython project, https://github.com/adafruit/circuitpython + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Rose Hooper + * Copyright (c) 2022 Jeff Epler 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 +#include "py/obj.h" + +extern const mp_obj_type_t pixelmap_pixelmap_type; + +typedef struct _pixelmap_pixelmap_obj pixelmap_pixelmap_obj_t; + +void shared_module_pixelmap_pixelmap_construct(pixelmap_pixelmap_obj_t *self, mp_obj_t pixelbuf, mp_obj_t indices); +bool shared_module_pixelmap_pixelmap_auto_write_get(pixelmap_pixelmap_obj_t *self); +void shared_module_pixelmap_pixelmap_auto_write_set(pixelmap_pixelmap_obj_t *self, bool auto_write); +void shared_module_pixelmap_pixelmap_fill(pixelmap_pixelmap_obj_t *self, const mp_obj_t color); +mp_obj_t shared_module_pixelmap_pixelmap_indices(pixelmap_pixelmap_obj_t *self, int index); +void shared_module_pixelmap_pixelmap_setslice(pixelmap_pixelmap_obj_t *self, const mp_obj_t value, mp_bound_slice_t slice, size_t slice_len); +mp_obj_t shared_module_pixelmap_pixelmap_getslice(pixelmap_pixelmap_obj_t *self, mp_bound_slice_t slice, size_t slice_len); +mp_obj_t shared_module_pixelmap_pixelmap_getitem(pixelmap_pixelmap_obj_t *self, mp_int_t index); +void shared_module_pixelmap_pixelmap_setitem(pixelmap_pixelmap_obj_t *self, mp_int_t index, const mp_obj_t value); diff --git a/shared-bindings/_pixelmap/__init__.c b/shared-bindings/_pixelmap/__init__.c new file mode 100644 index 0000000000..13a09d69d2 --- /dev/null +++ b/shared-bindings/_pixelmap/__init__.c @@ -0,0 +1,62 @@ +/* + * This file is part of the CircuitPython project, https://github.com/adafruit/circuitpython + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Rose Hooper + * + * 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/mphal.h" +#include "py/runtime.h" +#include "py/objproperty.h" + +#include "shared-bindings/_pixelmap/__init__.h" +#include "shared-bindings/_pixelmap/PixelMap.h" + + +//| """A fast pixel mapping library +//| +//| The `_pixelmap` module provides the :py:class:`PixelMap` class to accelerate +//| RGB(W) strip/matrix manipulation, such as DotStar and Neopixel.""" +//| +//| # The types accepted when getting a pixel value +//| PixelReturnType = Union[ +//| Tuple[int, int, int], Tuple[int, int, int, int], Tuple[int, int, int, float] +//| ] +//| PixelReturnSequence = Tuple[PixelReturnType] +//| # The types returned when getting a pixel value +//| PixelType = Union[int, PixelReturnType] +//| PixelSequence = Union[Tuple[PixelType], List[PixelType]] + +STATIC const mp_rom_map_elem_t pixelmap_module_globals_table[] = { + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR__pixelmap) }, + { MP_ROM_QSTR(MP_QSTR_PixelMap), MP_ROM_PTR(&pixelmap_pixelmap_type) }, +}; + +STATIC MP_DEFINE_CONST_DICT(pixelmap_module_globals, pixelmap_module_globals_table); + +const mp_obj_module_t pixelmap_module = { + .base = { &mp_type_module }, + .globals = (mp_obj_dict_t *)&pixelmap_module_globals, +}; + +MP_REGISTER_MODULE(MP_QSTR__pixelmap, pixelmap_module, CIRCUITPY_PIXELMAP); diff --git a/shared-bindings/_pixelmap/__init__.h b/shared-bindings/_pixelmap/__init__.h new file mode 100644 index 0000000000..9a84bc68a7 --- /dev/null +++ b/shared-bindings/_pixelmap/__init__.h @@ -0,0 +1,30 @@ +/* + * This file is part of the CircuitPython project, https://github.com/adafruit/circuitpython + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Rose Hooper + * + * 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 CP_SHARED_BINDINGS_PIXELBUF_INIT_H +#define CP_SHARED_BINDINGS_PIXELBUF_INIT_H + +#endif // CP_SHARED_BINDINGS_PIXELBUF_INIT_H diff --git a/shared-bindings/adafruit_bus_device/spi_device/SPIDevice.c b/shared-bindings/adafruit_bus_device/spi_device/SPIDevice.c index afb11856e2..6626d27f77 100644 --- a/shared-bindings/adafruit_bus_device/spi_device/SPIDevice.c +++ b/shared-bindings/adafruit_bus_device/spi_device/SPIDevice.c @@ -105,9 +105,13 @@ STATIC mp_obj_t adafruit_bus_device_spidevice_make_new(const mp_obj_type_t *type 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 CIRCUITPY_DIGITALIO_HAVE_INPUT_ONLY if (result == DIGITALINOUT_INPUT_ONLY) { mp_raise_NotImplementedError(translate("Pin is input only")); } + #else + (void)result; + #endif } return (mp_obj_t)self; diff --git a/shared-bindings/adafruit_pixelbuf/PixelBuf.c b/shared-bindings/adafruit_pixelbuf/PixelBuf.c index 6203f672ad..cf18804ec9 100644 --- a/shared-bindings/adafruit_pixelbuf/PixelBuf.c +++ b/shared-bindings/adafruit_pixelbuf/PixelBuf.c @@ -129,9 +129,7 @@ STATIC mp_obj_t pixelbuf_pixelbuf_make_new(const mp_obj_type_t *type, size_t n_a } static void parse_byteorder(mp_obj_t byteorder_obj, pixelbuf_byteorder_details_t *parsed) { - if (!mp_obj_is_str(byteorder_obj)) { - mp_raise_TypeError(translate("byteorder is not a string")); - } + mp_arg_validate_type_string(byteorder_obj, MP_QSTR_byteorder); size_t bo_len; const char *byteorder = mp_obj_str_get_data(byteorder_obj, &bo_len); @@ -253,9 +251,7 @@ STATIC mp_obj_t pixelbuf_pixelbuf_show(mp_obj_t self_in) { } STATIC MP_DEFINE_CONST_FUN_OBJ_1(pixelbuf_pixelbuf_show_obj, pixelbuf_pixelbuf_show); -//| def fill( -//| self, color: Union[int, Tuple[int, int, int], Tuple[int, int, int, float]] -//| ) -> None: +//| def fill(self, color: PixelType) -> None: //| """Fills the given pixelbuf with the given color.""" //| ... @@ -267,29 +263,21 @@ STATIC mp_obj_t pixelbuf_pixelbuf_fill(mp_obj_t self_in, mp_obj_t value) { STATIC MP_DEFINE_CONST_FUN_OBJ_2(pixelbuf_pixelbuf_fill_obj, pixelbuf_pixelbuf_fill); //| @overload -//| def __getitem__( -//| self, index: slice -//| ) -> Union[Tuple[Tuple[int, int, int], ...], Tuple[Tuple[int, int, int, float], ...]]: ... -//| @overload -//| def __getitem__( -//| self, index: int -//| ) -> Union[Tuple[int, int, int], Tuple[int, int, int, float]]: +//| def __getitem__(self, index: slice) -> PixelReturnSequence: //| """Returns the pixel value at the given index as a tuple of (Red, Green, Blue[, White]) values //| between 0 and 255. When in PWM (DotStar) mode, the 4th tuple value is a float of the pixel //| intensity from 0-1.0.""" //| ... //| @overload -//| def __setitem__( -//| self, index: slice, value: Tuple[Union[int, Tuple[float, ...], List[float]], ...] -//| ) -> None: ... +//| def __getitem__(self, index: int) -> PixelReturnType: +//| """Returns the pixel value at the given index as a tuple of (Red, Green, Blue[, White]) values +//| between 0 and 255. When in PWM (DotStar) mode, the 4th tuple value is a float of the pixel +//| intensity from 0-1.0.""" +//| ... //| @overload -//| def __setitem__( -//| self, index: slice, value: List[Union[int, Tuple[float, ...], List[float]]] -//| ) -> None: ... +//| def __setitem__(self, index: slice, value: PixelSequence) -> None: ... //| @overload -//| def __setitem__( -//| self, index: int, value: Union[int, Tuple[float, ...], List[float]] -//| ) -> None: +//| def __setitem__(self, index: int, value: PixelType) -> None: //| """Sets the pixel value at the given index. Value can either be a tuple or integer. Tuples are //| The individual (Red, Green, Blue[, White]) values between 0 and 255. If given an integer, the //| red, green and blue values are packed into the lower three bytes (0xRRGGBB). diff --git a/shared-bindings/adafruit_pixelbuf/PixelBuf.h b/shared-bindings/adafruit_pixelbuf/PixelBuf.h index 7ae3d6acf8..e77153322d 100644 --- a/shared-bindings/adafruit_pixelbuf/PixelBuf.h +++ b/shared-bindings/adafruit_pixelbuf/PixelBuf.h @@ -27,10 +27,18 @@ #ifndef CP_SHARED_BINDINGS_PIXELBUF_PIXELBUF_H #define CP_SHARED_BINDINGS_PIXELBUF_PIXELBUF_H +#include "py/objtuple.h" #include "shared-module/adafruit_pixelbuf/PixelBuf.h" extern const mp_obj_type_t pixelbuf_pixelbuf_type; +typedef union { + struct { + uint8_t r, g, b, w; + }; + uint32_t rgbw; +} color_u; + void common_hal_adafruit_pixelbuf_pixelbuf_construct(pixelbuf_pixelbuf_obj_t *self, size_t n, pixelbuf_byteorder_details_t *byteorder, mp_float_t brightness, bool auto_write, uint8_t *header, size_t header_len, uint8_t *trailer, size_t trailer_len); @@ -48,5 +56,7 @@ void common_hal_adafruit_pixelbuf_pixelbuf_show(mp_obj_t self); mp_obj_t common_hal_adafruit_pixelbuf_pixelbuf_get_pixel(mp_obj_t self, size_t index); void common_hal_adafruit_pixelbuf_pixelbuf_set_pixel(mp_obj_t self, size_t index, mp_obj_t item); void common_hal_adafruit_pixelbuf_pixelbuf_set_pixels(mp_obj_t self_in, size_t start, mp_int_t step, size_t slice_len, mp_obj_t *values, mp_obj_tuple_t *flatten_to); +void common_hal_adafruit_pixelbuf_pixelbuf_parse_color(mp_obj_t self, mp_obj_t color, uint8_t *r, uint8_t *g, uint8_t *b, uint8_t *w); +void common_hal_adafruit_pixelbuf_pixelbuf_set_pixel_color(mp_obj_t self, size_t index, uint8_t r, uint8_t g, uint8_t b, uint8_t w); #endif // CP_SHARED_BINDINGS_PIXELBUF_PIXELBUF_H diff --git a/shared-bindings/adafruit_pixelbuf/__init__.c b/shared-bindings/adafruit_pixelbuf/__init__.c index 40bf80094c..fd2915ee0a 100644 --- a/shared-bindings/adafruit_pixelbuf/__init__.c +++ b/shared-bindings/adafruit_pixelbuf/__init__.c @@ -39,6 +39,15 @@ //| RGB(W) strip/matrix manipulation, such as DotStar and Neopixel. //| //| Byteorders are configured with strings, such as "RGB" or "RGBD".""" +//| +//| # The types accepted when getting a pixel value +//| PixelReturnType = Union[ +//| Tuple[int, int, int], Tuple[int, int, int, int], Tuple[int, int, int, float] +//| ] +//| PixelReturnSequence = Tuple[PixelReturnType] +//| # The types returned when getting a pixel value +//| PixelType = Union[int, PixelReturnType] +//| PixelSequence = Union[Tuple[PixelType], List[PixelType]] // TODO: Pull in docs from adafruit_pixelbuf. STATIC const mp_rom_map_elem_t pixelbuf_module_globals_table[] = { diff --git a/shared-bindings/alarm/__init__.c b/shared-bindings/alarm/__init__.c index bd11b16996..48dccff8df 100644 --- a/shared-bindings/alarm/__init__.c +++ b/shared-bindings/alarm/__init__.c @@ -27,12 +27,15 @@ #include "py/obj.h" #include "py/runtime.h" +#if CIRCUITPY_ESPULP +#include "bindings/espulp/ULPAlarm.h" +#endif + #include "shared-bindings/alarm/__init__.h" #include "shared-bindings/alarm/SleepMemory.h" #include "shared-bindings/alarm/pin/PinAlarm.h" #include "shared-bindings/alarm/time/TimeAlarm.h" #include "shared-bindings/alarm/touch/TouchAlarm.h" -#include "shared-bindings/alarm/coproc/CoprocAlarm.h" #include "shared-bindings/digitalio/DigitalInOut.h" #include "shared-bindings/supervisor/Runtime.h" #include "shared-bindings/time/__init__.h" @@ -77,8 +80,10 @@ STATIC 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_pinalarm_type) || mp_obj_is_type(objs[i], &alarm_time_timealarm_type) || - mp_obj_is_type(objs[i], &alarm_touch_touchalarm_type) || - mp_obj_is_type(objs[i], &alarm_coproc_coprocalarm_type)) { + #if CIRCUITPY_ESPULP + mp_obj_is_type(objs[i], &espulp_ulpalarm_type) || + #endif + mp_obj_is_type(objs[i], &alarm_touch_touchalarm_type)) { continue; } mp_raise_TypeError_varg(translate("Expected an %q"), MP_QSTR_Alarm); @@ -256,18 +261,6 @@ STATIC const mp_obj_module_t alarm_touch_module = { .globals = (mp_obj_dict_t *)&alarm_touch_globals, }; -STATIC const mp_map_elem_t alarm_coproc_globals_table[] = { - { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_coproc) }, - { MP_ROM_QSTR(MP_QSTR_CoprocAlarm), MP_OBJ_FROM_PTR(&alarm_coproc_coprocalarm_type) }, -}; - -STATIC MP_DEFINE_CONST_DICT(alarm_coproc_globals, alarm_coproc_globals_table); - -STATIC const mp_obj_module_t alarm_coproc_module = { - .base = { &mp_type_module }, - .globals = (mp_obj_dict_t *)&alarm_coproc_globals, -}; - // The module table is mutable because .wake_alarm is a mutable attribute. STATIC mp_map_elem_t alarm_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_alarm) }, @@ -282,7 +275,6 @@ STATIC mp_map_elem_t alarm_module_globals_table[] = { { 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) }, { MP_ROM_QSTR(MP_QSTR_touch), MP_OBJ_FROM_PTR(&alarm_touch_module) }, - { MP_ROM_QSTR(MP_QSTR_coproc), MP_OBJ_FROM_PTR(&alarm_coproc_module) }, { MP_ROM_QSTR(MP_QSTR_SleepMemory), MP_OBJ_FROM_PTR(&alarm_sleep_memory_type) }, { MP_ROM_QSTR(MP_QSTR_sleep_memory), MP_OBJ_FROM_PTR(&alarm_sleep_memory_obj) }, diff --git a/shared-bindings/alarm/coproc/CoprocAlarm.c b/shared-bindings/alarm/coproc/CoprocAlarm.c deleted file mode 100644 index 0b60282c2f..0000000000 --- a/shared-bindings/alarm/coproc/CoprocAlarm.c +++ /dev/null @@ -1,87 +0,0 @@ -/* - * This file is part of the MicroPython project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2022 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" - -#if CIRCUITPY_COPROC -#include "shared-bindings/util.h" -#include "shared-bindings/alarm/coproc/CoprocAlarm.h" -#include "shared-bindings/coproc/Coproc.h" - -STATIC coproc_coproc_obj_t *get_coproc_obj(mp_obj_t *self_in) { - if (!mp_obj_is_type(*self_in, &coproc_coproc_type)) { - mp_raise_TypeError_varg(translate("Expected a %q"), MP_QSTR_Coproc); - } - coproc_coproc_obj_t *self = MP_OBJ_TO_PTR(*self_in); - if (common_hal_coproc_coproc_deinited(self)) { - raise_deinited_error(); - } - return self; -} -#endif - -//| class CoprocAlarm: -//| """Trigger an alarm when another core or co-processor requests wake-up.""" -//| -//| def __init__(self, coproc: coproc.Coproc) -> None: -//| """Create an alarm that will be triggered when the co-processor requests wake-up. -//| -//| 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 coproc.Coproc coproc: The coproc program to run. -//| -//| """ -//| ... -//| -STATIC mp_obj_t alarm_coproc_coprocalarm_make_new(const mp_obj_type_t *type, - size_t n_args, size_t n_kw, const mp_obj_t *all_args) { - enum { ARG_coproc }; - static const mp_arg_t allowed_args[] = { - { MP_QSTR_coproc, MP_ARG_REQUIRED | MP_ARG_OBJ }, - }; - - mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); - - #if CIRCUITPY_COPROC - // initialize CoprocAlarm object - alarm_coproc_coprocalarm_obj_t *self = m_new_obj(alarm_coproc_coprocalarm_obj_t); - self->base.type = &alarm_coproc_coprocalarm_type; - self->coproc = get_coproc_obj(&args[ARG_coproc].u_obj); - // return CoprocAlarm object - return MP_OBJ_FROM_PTR(self); - #else - mp_raise_NotImplementedError(NULL); - return mp_const_none; - #endif -} - -const mp_obj_type_t alarm_coproc_coprocalarm_type = { - { &mp_type_type }, - .name = MP_QSTR_CoprocAlarm, - .make_new = alarm_coproc_coprocalarm_make_new, -}; diff --git a/shared-bindings/alarm/time/TimeAlarm.c b/shared-bindings/alarm/time/TimeAlarm.c index 7bd0a309b9..abbb050c64 100644 --- a/shared-bindings/alarm/time/TimeAlarm.c +++ b/shared-bindings/alarm/time/TimeAlarm.c @@ -51,11 +51,12 @@ mp_obj_t MP_WEAK rtc_get_time_source_time(void) { //| ``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`-enabling sleep 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. +//| If the given time is already in the past, then an exception is raised. +//| If the sleep happens after the given time, then it will wake immediately +//| due to this time alarm. //| """ //| ... STATIC mp_obj_t alarm_time_timealarm_make_new(const mp_obj_type_t *type, diff --git a/shared-bindings/analogbufio/BufferedIn.c b/shared-bindings/analogbufio/BufferedIn.c index 8bdc1b0ea8..193552c313 100644 --- a/shared-bindings/analogbufio/BufferedIn.c +++ b/shared-bindings/analogbufio/BufferedIn.c @@ -47,10 +47,10 @@ //| import array //| //| length = 1000 -//| mybuffer = array.array("H", 0x0000 for i in range(length)) +//| mybuffer = array.array("H", [0x0000] * length) //| rate = 500000 -//| adcbuf = analogbufio.BufferedIn(board.GP26, mybuffer, rate) -//| adcbuf.read() +//| adcbuf = analogbufio.BufferedIn(board.GP26, sample_rate=rate) +//| adcbuf.readinto(mybuffer) //| adcbuf.deinit() //| for i in range(length): //| print(i, mybuffer[i]) @@ -60,26 +60,17 @@ //| (TODO) Provide mechanism to read CPU Temperature.""" //| -//| def __init__( -//| self, pin: microcontroller.Pin, buffer: WriteableBuffer, *, sample_rate: int = 500000 -//| ) -> None: -//| """Create a `BufferedIn` on the given pin. ADC values will be read -//| into the given buffer at the supplied sample_rate. Depending on the -//| buffer typecode, 'b', 'B', 'h', 'H', samples are 8-bit byte-arrays or -//| 16-bit half-words and are signed or unsigned. -//| The ADC most significant bits of the ADC are kept. (See -//| https://docs.circuitpython.org/en/latest/docs/library/array.html) +//| def __init__(self, pin: microcontroller.Pin, *, sample_rate: int) -> None: +//| """Create a `BufferedIn` on the given pin and given sample rate. //| //| :param ~microcontroller.Pin pin: the pin to read from -//| :param ~circuitpython_typing.WriteableBuffer buffer: buffer: A buffer for samples //| :param ~int sample_rate: rate: sampling frequency, in samples per second""" //| ... STATIC mp_obj_t analogbufio_bufferedin_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { - enum { ARG_pin, ARG_buffer, ARG_sample_rate }; + enum { ARG_pin, ARG_sample_rate }; static const mp_arg_t allowed_args[] = { { MP_QSTR_pin, MP_ARG_OBJ | MP_ARG_REQUIRED }, - { MP_QSTR_buffer, MP_ARG_OBJ | MP_ARG_REQUIRED }, - { MP_QSTR_sample_rate, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 500000} }, + { MP_QSTR_sample_rate, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_INT }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); @@ -87,37 +78,12 @@ STATIC mp_obj_t analogbufio_bufferedin_make_new(const mp_obj_type_t *type, size_ // Validate Pin const mcu_pin_obj_t *pin = validate_obj_is_free_pin(args[ARG_pin].u_obj); - // Buffer defined and allocated by user - mp_buffer_info_t bufinfo; - mp_get_buffer_raise(args[ARG_buffer].u_obj, &bufinfo, MP_BUFFER_READ); - - // signed or unsigned, byte per sample - bool signed_samples = bufinfo.typecode == 'b' || bufinfo.typecode == 'h'; - uint8_t bytes_per_sample = 1; - - // Bytes Per Sample - if (bufinfo.typecode == 'h' || bufinfo.typecode == 'H') { - bytes_per_sample = 2; - } else if (bufinfo.typecode != 'b' && bufinfo.typecode != 'B' && bufinfo.typecode != BYTEARRAY_TYPECODE) { - mp_raise_ValueError_varg(translate("%q must be a bytearray or array of type 'h', 'H', 'b', or 'B'"), MP_QSTR_buffer); - } - - // Validate sample rate here - uint32_t sample_rate = (uint32_t)mp_arg_validate_int_range(args[ARG_sample_rate].u_int, 1, 500000, MP_QSTR_sample_rate); - // Create local object - analogbufio_bufferedin_obj_t *self = m_new_obj(analogbufio_bufferedin_obj_t); + analogbufio_bufferedin_obj_t *self = m_new_obj_with_finaliser(analogbufio_bufferedin_obj_t); self->base.type = &analogbufio_bufferedin_type; - // Call local intereface in ports/common-hal/analogbufio - common_hal_analogbufio_bufferedin_construct(self, - pin, - ((uint8_t *)bufinfo.buf), - bufinfo.len, - bytes_per_sample, - signed_samples, - sample_rate - ); + // Call local interface in ports/common-hal/analogbufio + common_hal_analogbufio_bufferedin_construct(self, pin, args[ARG_sample_rate].u_int); return MP_OBJ_FROM_PTR(self); } @@ -153,23 +119,46 @@ STATIC mp_obj_t analogbufio_bufferedin___exit__(size_t n_args, const mp_obj_t *a } STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(analogbufio_bufferedin___exit___obj, 4, 4, analogbufio_bufferedin___exit__); -//| def read(self) -> None: -//| """Fills the provided buffer with ADC voltage values.""" +//| def readinto(self, buffer: WriteableBuffer) -> int: +//| """Fills the provided buffer with ADC voltage values. +//| +//| ADC values will be read into the given buffer at the supplied sample_rate. +//| Depending on the buffer typecode, 'B', 'H', samples are 8-bit byte-arrays or +//| 16-bit half-words and are always unsigned. +//| The ADC most significant bits of the ADC are kept. (See +//| https://docs.circuitpython.org/en/latest/docs/library/array.html) +//| +//| :param ~circuitpython_typing.WriteableBuffer buffer: buffer: A buffer for samples""" //| ... //| -STATIC mp_obj_t analogbufio_bufferedin_obj_read(mp_obj_t self_in) { +STATIC mp_obj_t analogbufio_bufferedin_obj_readinto(mp_obj_t self_in, mp_obj_t buffer_obj) { analogbufio_bufferedin_obj_t *self = MP_OBJ_TO_PTR(self_in); check_for_deinit(self); - common_hal_analogbufio_bufferedin_read(self); - return mp_const_none; + + // Buffer defined and allocated by user + mp_buffer_info_t bufinfo; + mp_get_buffer_raise(buffer_obj, &bufinfo, MP_BUFFER_READ); + + uint8_t bytes_per_sample = 1; + + // Bytes Per Sample + if (bufinfo.typecode == 'H') { + bytes_per_sample = 2; + } else if (bufinfo.typecode != 'B' && bufinfo.typecode != BYTEARRAY_TYPECODE) { + mp_raise_ValueError_varg(translate("%q must be a bytearray or array of type 'H' or 'B'"), MP_QSTR_buffer); + } + + mp_uint_t captured = common_hal_analogbufio_bufferedin_readinto(self, bufinfo.buf, bufinfo.len, bytes_per_sample); + return MP_OBJ_NEW_SMALL_INT(captured); } -MP_DEFINE_CONST_FUN_OBJ_1(analogbufio_bufferedin_read_obj, analogbufio_bufferedin_obj_read); +MP_DEFINE_CONST_FUN_OBJ_2(analogbufio_bufferedin_readinto_obj, analogbufio_bufferedin_obj_readinto); STATIC const mp_rom_map_elem_t analogbufio_bufferedin_locals_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&analogbufio_bufferedin_deinit_obj) }, { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&analogbufio_bufferedin_deinit_obj) }, { MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&default___enter___obj) }, { MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&analogbufio_bufferedin___exit___obj) }, - { MP_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&analogbufio_bufferedin_read_obj)}, + { MP_ROM_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&analogbufio_bufferedin_readinto_obj)}, }; diff --git a/shared-bindings/analogbufio/BufferedIn.h b/shared-bindings/analogbufio/BufferedIn.h index 7d59720cb4..cfd8050bc5 100644 --- a/shared-bindings/analogbufio/BufferedIn.h +++ b/shared-bindings/analogbufio/BufferedIn.h @@ -32,9 +32,9 @@ extern const mp_obj_type_t analogbufio_bufferedin_type; -void common_hal_analogbufio_bufferedin_construct(analogbufio_bufferedin_obj_t *self, const mcu_pin_obj_t *pin, uint8_t *buffer, uint32_t len, uint8_t bytes_per_sample, bool samples_signed, uint32_t sample_rate); +void common_hal_analogbufio_bufferedin_construct(analogbufio_bufferedin_obj_t *self, const mcu_pin_obj_t *pin, uint32_t sample_rate); void common_hal_analogbufio_bufferedin_deinit(analogbufio_bufferedin_obj_t *self); bool common_hal_analogbufio_bufferedin_deinited(analogbufio_bufferedin_obj_t *self); -void common_hal_analogbufio_bufferedin_read(analogbufio_bufferedin_obj_t *self); +uint32_t common_hal_analogbufio_bufferedin_readinto(analogbufio_bufferedin_obj_t *self, uint8_t *buffer, uint32_t len, uint8_t bytes_per_sample); #endif // __MICROPY_INCLUDED_SHARED_BINDINGS_ANALOGBUFIO_BUFFEREDIN_H__ diff --git a/shared-bindings/analogbufio/__init__.c b/shared-bindings/analogbufio/__init__.c index 49463d6334..749f1aec09 100644 --- a/shared-bindings/analogbufio/__init__.c +++ b/shared-bindings/analogbufio/__init__.c @@ -40,22 +40,6 @@ //| call :py:meth:`!deinit` or use a context manager. See //| :ref:`lifetime-and-contextmanagers` for more info. //| -//| For example:: -//| -//| import analogbufio -//| import array -//| from board import * -//| -//| length = 5000000 -//| mybuffer = array.array("H", 0x0000 for i in range(length)) -//| adc_in = analogbufio.BufferedIn(GP26, mybuffer, length) -//| analogbufio.read() -//| print(*mybuffer) -//| adc_in.deinit() -//| -//| This example will initialize the the device, read and fill -//| :py:data:`~analogbufio.BufferedIn` to mybuffer -//| //| TODO: For the essentials of `analogbufio`, see the `CircuitPython Essentials //| Learn guide `_ //| diff --git a/shared-bindings/busio/I2C.c b/shared-bindings/busio/I2C.c index 71ac0e3995..e589dea08b 100644 --- a/shared-bindings/busio/I2C.c +++ b/shared-bindings/busio/I2C.c @@ -344,9 +344,7 @@ STATIC mp_obj_t busio_i2c_writeto_then_readfrom(size_t n_args, const mp_obj_t *p int32_t in_start = args[ARG_in_start].u_int; const int32_t in_end = args[ARG_in_end].u_int; normalize_buffer_bounds(&in_start, in_end, &in_length); - if (in_length == 0) { - mp_raise_ValueError_varg(translate("%q length must be >= 1"), MP_QSTR_out_buffer); - } + mp_arg_validate_length_min(in_length, 1, MP_QSTR_out_buffer); uint8_t status = common_hal_busio_i2c_write_read(self, args[ARG_address].u_int, ((uint8_t *)out_bufinfo.buf) + out_start, out_length,((uint8_t *)in_bufinfo.buf) + in_start, in_length); diff --git a/shared-bindings/busio/UART.c b/shared-bindings/busio/UART.c index eb1d1685a5..59e46cafc4 100644 --- a/shared-bindings/busio/UART.c +++ b/shared-bindings/busio/UART.c @@ -155,7 +155,7 @@ STATIC mp_obj_t busio_uart_make_new(const mp_obj_type_t *type, size_t n_args, si args[ARG_receiver_buffer_size].u_int, NULL, false); return (mp_obj_t)self; #else - mp_raise_ValueError(translate("Invalid pins")); + mp_raise_NotImplementedError(NULL); #endif // CIRCUITPY_BUSIO_UART } diff --git a/shared-bindings/coproc/Coproc.c b/shared-bindings/coproc/Coproc.c deleted file mode 100644 index 85595578c8..0000000000 --- a/shared-bindings/coproc/Coproc.c +++ /dev/null @@ -1,110 +0,0 @@ -/* - * This file is part of the Micro Python project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2022 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/runtime/context_manager_helpers.h" -#include "py/objproperty.h" -#include "py/runtime.h" - -#include "shared-bindings/coproc/Coproc.h" -#include "shared-bindings/coproc/CoprocMemory.h" - -STATIC coproc_memory_obj_t *get_coproc_memory_obj(mp_obj_t *self_in) { - if (!mp_obj_is_type(*self_in, &coproc_memory_type)) { - mp_raise_TypeError_varg(translate("Expected a %q"), MP_QSTR_CoprocMemory); - } - return MP_OBJ_TO_PTR(*self_in); -} - -//| class Coproc: -//| def __init__(self, buffer: ReadableBuffer, memory: CoprocMemory) -> None: -//| """Loads the program binary into memory. -//| -//| :param buffer: The program binary to run on the core/co-processor -//| :param memory: The `CoprocMemory` object used to access shared memory""" -STATIC mp_obj_t coproc_coproc_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { - enum { ARG_buffer, ARG_memory }; - static const mp_arg_t allowed_args[] = { - { MP_QSTR_buffer, MP_ARG_REQUIRED | MP_ARG_OBJ }, - { MP_QSTR_memory, MP_ARG_OBJ, { .u_obj = mp_const_none } }, - }; - mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); - - coproc_coproc_obj_t *self = m_new_obj(coproc_coproc_obj_t); - self->base.type = &coproc_coproc_type; - - mp_buffer_info_t bufinfo; - mp_get_buffer_raise(args[ARG_buffer].u_obj, &bufinfo, MP_BUFFER_READ); - - coproc_memory_obj_t *coproc_memory = (args[ARG_memory].u_obj == mp_const_none) ? NULL : get_coproc_memory_obj(&args[ARG_memory].u_obj); - - common_hal_coproc_coproc_construct(self, bufinfo.buf, bufinfo.len, coproc_memory); - - return MP_OBJ_FROM_PTR(self); -} - -//| def deinit(self) -> None: -//| """Releases control of the underlying hardware so other classes can use it.""" -//| ... -STATIC mp_obj_t coproc_coproc_obj_deinit(mp_obj_t self_in) { - coproc_coproc_obj_t *self = MP_OBJ_TO_PTR(self_in); - common_hal_coproc_coproc_deinit(self); - return mp_const_none; -} -MP_DEFINE_CONST_FUN_OBJ_1(coproc_coproc_deinit_obj, coproc_coproc_obj_deinit); - -//| def __enter__(self) -> Coproc: -//| """No-op used in Context Managers.""" -//| ... -// Provided by context manager helper. - -//| def __exit__(self) -> None: -//| """Close the request.""" -//| ... -//| -STATIC mp_obj_t coproc_coproc_obj___exit__(size_t n_args, const mp_obj_t *args) { - (void)n_args; - mp_check_self(mp_obj_is_type(args[0], &coproc_coproc_type)); - return coproc_coproc_obj_deinit(args[0]); -} -STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(coproc_coproc___exit___obj, 4, 4, coproc_coproc_obj___exit__); - -STATIC const mp_rom_map_elem_t coproc_coproc_locals_dict_table[] = { - // context managers - { MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&default___enter___obj) }, - { MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&coproc_coproc___exit___obj) }, - - // functions - { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&coproc_coproc_deinit_obj) }, -}; -STATIC MP_DEFINE_CONST_DICT(coproc_coproc_locals_dict, coproc_coproc_locals_dict_table); - -const mp_obj_type_t coproc_coproc_type = { - { &mp_type_type }, - .name = MP_QSTR_Coproc, - .make_new = coproc_coproc_make_new, - .locals_dict = (mp_obj_dict_t *)&coproc_coproc_locals_dict, -}; diff --git a/shared-bindings/coproc/Coproc.h b/shared-bindings/coproc/Coproc.h deleted file mode 100644 index fbf9bd9ae0..0000000000 --- a/shared-bindings/coproc/Coproc.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * This file is part of the Micro Python project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2022 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_SHARED_BINDINGS_COPROC_COPROC_H -#define MICROPY_INCLUDED_SHARED_BINDINGS_COPROC_COPROC_H - -#include "common-hal/coproc/Coproc.h" - -extern const mp_obj_type_t coproc_coproc_type; - -extern void common_hal_coproc_coproc_construct(coproc_coproc_obj_t *self, - const uint8_t *buf, const size_t buf_len, coproc_memory_obj_t *coproc_memory); - -extern void common_hal_coproc_coproc_deinit(coproc_coproc_obj_t *self); -extern bool common_hal_coproc_coproc_deinited(coproc_coproc_obj_t *self); - -#endif // MICROPY_INCLUDED_SHARED_BINDINGS_COPROC_COPROC_H diff --git a/shared-bindings/coproc/__init__.c b/shared-bindings/coproc/__init__.c deleted file mode 100644 index 06b196d8be..0000000000 --- a/shared-bindings/coproc/__init__.c +++ /dev/null @@ -1,115 +0,0 @@ -/* - * This file is part of the Micro Python project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2022 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/util.h" -#include "shared-bindings/coproc/__init__.h" -#include "shared-bindings/coproc/Coproc.h" -#include "shared-bindings/coproc/CoprocMemory.h" - -#include "py/runtime.h" - -//| """COPROC Module -//| -//| The `coproc` module adds ability to load and run -//| programs on a co-processor or a different cpu core. -//| -//| .. code-block:: python -//| -//| import coproc -//| -//| shared_mem = coproc.CoprocMemory(address=0x500007fc, length=1024) -//| -//| with open("program.bin", "rb") as f: -//| program = coproc.Coproc(buffer=f.read(), memory=shared_mem) -//| -//| coproc.run(program) -//| print(coproc.memory(program)[0]) -//| # coproc.halt(program) -//| """ -//| ... -//| - -STATIC coproc_coproc_obj_t *get_coproc_obj(mp_obj_t *self_in) { - if (!mp_obj_is_type(*self_in, &coproc_coproc_type)) { - mp_raise_TypeError_varg(translate("Expected a %q"), MP_QSTR_Coproc); - } - coproc_coproc_obj_t *self = MP_OBJ_TO_PTR(*self_in); - if (common_hal_coproc_coproc_deinited(self)) { - raise_deinited_error(); - } - return self; -} - -//| def run(*coproc: Coproc) -> None: -//| """Runs the loaded program.""" -//| ... -//| -STATIC mp_obj_t coproc_run(mp_obj_t self_in) { - common_hal_coproc_run(get_coproc_obj(&self_in)); - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_1(coproc_run_obj, coproc_run); - -//| def halt(*coproc: Coproc) -> None: -//| """Halts the loaded program.""" -//| ... -//| -STATIC mp_obj_t coproc_halt(mp_obj_t self_in) { - common_hal_coproc_halt(get_coproc_obj(&self_in)); - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_1(coproc_halt_obj, coproc_halt); - -//| def memory(*coproc: Coproc) -> CoprocMemory: -//| """Returns the shared memory as a bytearray.""" -//| ... -//| -STATIC mp_obj_t coproc_memory(mp_obj_t self_in) { - return common_hal_coproc_memory(get_coproc_obj(&self_in)); -} -STATIC MP_DEFINE_CONST_FUN_OBJ_1(coproc_memory_obj, coproc_memory); - -STATIC const mp_rom_map_elem_t coproc_module_globals_table[] = { - // module name - { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_coproc) }, - - // module functions - { MP_ROM_QSTR(MP_QSTR_run), MP_ROM_PTR(&coproc_run_obj) }, - { MP_ROM_QSTR(MP_QSTR_halt), MP_ROM_PTR(&coproc_halt_obj) }, - { MP_ROM_QSTR(MP_QSTR_memory), MP_ROM_PTR(&coproc_memory_obj) }, - - // module classes - { MP_ROM_QSTR(MP_QSTR_Coproc), MP_OBJ_FROM_PTR(&coproc_coproc_type) }, - { MP_ROM_QSTR(MP_QSTR_CoprocMemory), MP_OBJ_FROM_PTR(&coproc_memory_type) }, -}; -STATIC MP_DEFINE_CONST_DICT(coproc_module_globals, coproc_module_globals_table); - -const mp_obj_module_t coproc_module = { - .base = { &mp_type_module }, - .globals = (mp_obj_dict_t *)&coproc_module_globals, -}; - -MP_REGISTER_MODULE(MP_QSTR_coproc, coproc_module, CIRCUITPY_COPROC); diff --git a/shared-bindings/digitalio/DigitalInOut.c b/shared-bindings/digitalio/DigitalInOut.c index eb3c1ec69d..e6fe592a65 100644 --- a/shared-bindings/digitalio/DigitalInOut.c +++ b/shared-bindings/digitalio/DigitalInOut.c @@ -53,8 +53,10 @@ STATIC void check_result(digitalinout_result_t result) { return; case DIGITALINOUT_PIN_BUSY: mp_raise_ValueError_varg(translate("%q in use"), MP_QSTR_Pin); + #if CIRCUITPY_DIGITALIO_HAVE_INPUT_ONLY case DIGITALINOUT_INPUT_ONLY: mp_raise_ValueError_varg(translate("Invalid %q"), MP_QSTR_direction); + #endif #if CIRCUITPY_DIGITALIO_HAVE_INVALID_PULL case DIGITALINOUT_INVALID_PULL: mp_raise_ValueError_varg(translate("Invalid %q"), MP_QSTR_pull); diff --git a/shared-bindings/digitalio/DigitalInOut.h b/shared-bindings/digitalio/DigitalInOut.h index 80c3970f0e..79a700c905 100644 --- a/shared-bindings/digitalio/DigitalInOut.h +++ b/shared-bindings/digitalio/DigitalInOut.h @@ -38,7 +38,9 @@ extern const mp_obj_type_t digitalio_digitalinout_type; typedef enum { DIGITALINOUT_OK, DIGITALINOUT_PIN_BUSY, + #if CIRCUITPY_DIGITALIO_HAVE_INPUT_ONLY DIGITALINOUT_INPUT_ONLY, + #endif #if CIRCUITPY_DIGITALIO_HAVE_INVALID_PULL DIGITALINOUT_INVALID_PULL, #endif diff --git a/shared-bindings/displayio/Display.c b/shared-bindings/displayio/Display.c index 512969eb20..e5a2836d1a 100644 --- a/shared-bindings/displayio/Display.c +++ b/shared-bindings/displayio/Display.c @@ -423,8 +423,21 @@ STATIC mp_obj_t displayio_display_obj_get_root_group(mp_obj_t self_in) { } MP_DEFINE_CONST_FUN_OBJ_1(displayio_display_get_root_group_obj, displayio_display_obj_get_root_group); -MP_PROPERTY_GETTER(displayio_display_root_group_obj, - (mp_obj_t)&displayio_display_get_root_group_obj); +STATIC mp_obj_t displayio_display_obj_set_root_group(mp_obj_t self_in, mp_obj_t group_in) { + displayio_display_obj_t *self = native_display(self_in); + displayio_group_t *group = NULL; + if (group_in != mp_const_none) { + group = MP_OBJ_TO_PTR(native_group(group_in)); + } + + common_hal_displayio_display_set_root_group(self, group); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(displayio_display_set_root_group_obj, displayio_display_obj_set_root_group); + +MP_PROPERTY_GETSET(displayio_display_root_group_obj, + (mp_obj_t)&displayio_display_get_root_group_obj, + (mp_obj_t)&displayio_display_set_root_group_obj); //| def fill_row(self, y: int, buffer: WriteableBuffer) -> WriteableBuffer: diff --git a/shared-bindings/displayio/Display.h b/shared-bindings/displayio/Display.h index 35ba0d479a..35f23ae40f 100644 --- a/shared-bindings/displayio/Display.h +++ b/shared-bindings/displayio/Display.h @@ -67,5 +67,6 @@ bool common_hal_displayio_display_set_brightness(displayio_display_obj_t *self, mp_obj_t common_hal_displayio_display_get_bus(displayio_display_obj_t *self); mp_obj_t common_hal_displayio_display_get_root_group(displayio_display_obj_t *self); +mp_obj_t common_hal_displayio_display_set_root_group(displayio_display_obj_t *self, displayio_group_t *root_group); #endif // MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYIO_DISPLAY_H diff --git a/shared-bindings/displayio/EPaperDisplay.c b/shared-bindings/displayio/EPaperDisplay.c index 7b77b42fa4..f3831b5084 100644 --- a/shared-bindings/displayio/EPaperDisplay.c +++ b/shared-bindings/displayio/EPaperDisplay.c @@ -349,6 +349,30 @@ MP_DEFINE_CONST_FUN_OBJ_1(displayio_epaperdisplay_get_bus_obj, displayio_epaperd MP_PROPERTY_GETTER(displayio_epaperdisplay_bus_obj, (mp_obj_t)&displayio_epaperdisplay_get_bus_obj); +//| root_group: Group +//| """The root group on the epaper display.""" +//| +STATIC mp_obj_t displayio_epaperdisplay_obj_get_root_group(mp_obj_t self_in) { + displayio_epaperdisplay_obj_t *self = native_display(self_in); + return common_hal_displayio_epaperdisplay_get_root_group(self); +} +MP_DEFINE_CONST_FUN_OBJ_1(displayio_epaperdisplay_get_root_group_obj, displayio_epaperdisplay_obj_get_root_group); + +STATIC mp_obj_t displayio_epaperdisplay_obj_set_root_group(mp_obj_t self_in, mp_obj_t group_in) { + displayio_epaperdisplay_obj_t *self = native_display(self_in); + displayio_group_t *group = NULL; + if (group_in != mp_const_none) { + group = MP_OBJ_TO_PTR(native_group(group_in)); + } + + common_hal_displayio_epaperdisplay_set_root_group(self, group); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(displayio_epaperdisplay_set_root_group_obj, displayio_epaperdisplay_obj_set_root_group); + +MP_PROPERTY_GETSET(displayio_epaperdisplay_root_group_obj, + (mp_obj_t)&displayio_epaperdisplay_get_root_group_obj, + (mp_obj_t)&displayio_epaperdisplay_set_root_group_obj); STATIC const mp_rom_map_elem_t displayio_epaperdisplay_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_show), MP_ROM_PTR(&displayio_epaperdisplay_show_obj) }, @@ -361,6 +385,7 @@ STATIC const mp_rom_map_elem_t displayio_epaperdisplay_locals_dict_table[] = { { 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) }, + { MP_ROM_QSTR(MP_QSTR_root_group), MP_ROM_PTR(&displayio_epaperdisplay_root_group_obj) }, }; STATIC MP_DEFINE_CONST_DICT(displayio_epaperdisplay_locals_dict, displayio_epaperdisplay_locals_dict_table); diff --git a/shared-bindings/displayio/EPaperDisplay.h b/shared-bindings/displayio/EPaperDisplay.h index ba6dffcb4b..13fd51d132 100644 --- a/shared-bindings/displayio/EPaperDisplay.h +++ b/shared-bindings/displayio/EPaperDisplay.h @@ -48,6 +48,9 @@ bool common_hal_displayio_epaperdisplay_refresh(displayio_epaperdisplay_obj_t *s bool common_hal_displayio_epaperdisplay_show(displayio_epaperdisplay_obj_t *self, displayio_group_t *root_group); +mp_obj_t common_hal_displayio_epaperdisplay_get_root_group(displayio_epaperdisplay_obj_t *self); +bool common_hal_displayio_epaperdisplay_set_root_group(displayio_epaperdisplay_obj_t *self, displayio_group_t *root_group); + // Returns time in milliseconds. uint32_t common_hal_displayio_epaperdisplay_get_time_to_refresh(displayio_epaperdisplay_obj_t *self); bool common_hal_displayio_epaperdisplay_get_busy(displayio_epaperdisplay_obj_t *self); diff --git a/shared-bindings/displayio/__init__.c b/shared-bindings/displayio/__init__.c index 80fcde6e49..3fcd1d082b 100644 --- a/shared-bindings/displayio/__init__.c +++ b/shared-bindings/displayio/__init__.c @@ -45,6 +45,7 @@ #endif #include "shared-bindings/displayio/Shape.h" #include "shared-bindings/displayio/TileGrid.h" +#include "shared-module/displayio/__init__.h" //| """Native helpers for driving displays //| @@ -95,6 +96,7 @@ STATIC const mp_rom_map_elem_t displayio_module_globals_table[] = { #endif { MP_ROM_QSTR(MP_QSTR_release_displays), MP_ROM_PTR(&displayio_release_displays_obj) }, + { MP_ROM_QSTR(MP_QSTR_CIRCUITPYTHON_TERMINAL), MP_ROM_PTR(&circuitpython_splash) }, }; STATIC MP_DEFINE_CONST_DICT(displayio_module_globals, displayio_module_globals_table); diff --git a/shared-bindings/dotenv/__init__.c b/shared-bindings/dotenv/__init__.c deleted file mode 100644 index 193338c7c2..0000000000 --- a/shared-bindings/dotenv/__init__.c +++ /dev/null @@ -1,113 +0,0 @@ -/* - * This file is part of the Micro Python project, http://micropython.org/ - * - * The MIT License (MIT) - * - * SPDX-FileCopyrightText: Copyright (c) 2022 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 - -#include "extmod/vfs.h" -#include "lib/oofatfs/ff.h" -#include "lib/oofatfs/diskio.h" -#include "py/mpstate.h" -#include "py/obj.h" -#include "py/objstr.h" -#include "py/runtime.h" -#include "shared-bindings/dotenv/__init__.h" - -//| """Functions to manage environment variables from a .env file. -//| -//| A subset of the CPython `dotenv library `_. It does -//| not support variables or double quotes. -//| -//| Keys and values may be put in single quotes. -//| ``\`` and ``'`` are escaped by ``\`` in single quotes. Newlines can occur in quotes for multiline values. -//| Comments start with ``#`` and apply for the rest of the line. -//| A ``#`` immediately following an ``=`` is part of the value, not the start of a comment, -//| and a ``#`` embedded in a value without whitespace will be part of that value. -//| This corresponds to how assignments and comments work in most Unix shells. -//| -//| -//| File format example: -//| -//| .. code-block:: -//| -//| key=value -//| key2 = value2 -//| 'key3' = 'value with spaces' -//| # comment -//| key4 = value3 # comment 2 -//| 'key5'=value4 -//| key=value5 # overrides the first one -//| multiline = 'hello -//| world -//| how are you?' -//| # The #'s below will be included in the value. They do not start a comment. -//| key6=#value -//| key7=abc#def -//| -//| """ -//| -//| import typing -//| - -//| def get_key(dotenv_path: str, key_to_get: str) -> Optional[str]: -//| """Get the value for the given key from the given .env file. If the key occurs multiple -//| times in the file, then the last value will be returned. -//| -//| Returns None if the key isn't found or doesn't have a value.""" -//| ... -//| -STATIC mp_obj_t _dotenv_get_key(mp_obj_t path_in, mp_obj_t key_to_get_in) { - return common_hal_dotenv_get_key(mp_obj_str_get_str(path_in), - mp_obj_str_get_str(key_to_get_in)); -} -MP_DEFINE_CONST_FUN_OBJ_2(dotenv_get_key_obj, _dotenv_get_key); - -//| def load_dotenv() -> None: -//| """Does nothing in CircuitPython because os.getenv will automatically read .env when -//| available. -//| -//| Present in CircuitPython so CPython-compatible code can use it without error.""" -//| ... -//| -STATIC mp_obj_t dotenv_load_dotenv(void) { - return mp_const_none; -} -MP_DEFINE_CONST_FUN_OBJ_0(dotenv_load_dotenv_obj, dotenv_load_dotenv); - -STATIC const mp_rom_map_elem_t dotenv_module_globals_table[] = { - { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_dotenv) }, - - { MP_ROM_QSTR(MP_QSTR_get_key), MP_ROM_PTR(&dotenv_get_key_obj) }, - { MP_ROM_QSTR(MP_QSTR_load_dotenv), MP_ROM_PTR(&dotenv_load_dotenv_obj) }, -}; - -STATIC MP_DEFINE_CONST_DICT(dotenv_module_globals, dotenv_module_globals_table); - -const mp_obj_module_t dotenv_module = { - .base = { &mp_type_module }, - .globals = (mp_obj_dict_t *)&dotenv_module_globals, -}; - -MP_REGISTER_MODULE(MP_QSTR_dotenv, dotenv_module, CIRCUITPY_DOTENV); diff --git a/shared-bindings/framebufferio/FramebufferDisplay.c b/shared-bindings/framebufferio/FramebufferDisplay.c index 20e555eef9..51124984bf 100644 --- a/shared-bindings/framebufferio/FramebufferDisplay.c +++ b/shared-bindings/framebufferio/FramebufferDisplay.c @@ -328,8 +328,24 @@ STATIC mp_obj_t framebufferio_framebufferdisplay_obj_get_root_group(mp_obj_t sel } MP_DEFINE_CONST_FUN_OBJ_1(framebufferio_framebufferdisplay_get_root_group_obj, framebufferio_framebufferdisplay_obj_get_root_group); -MP_PROPERTY_GETTER(framebufferio_framebufferdisplay_root_group_obj, - (mp_obj_t)&framebufferio_framebufferdisplay_get_root_group_obj); +STATIC mp_obj_t framebufferio_framebufferdisplay_obj_set_root_group(mp_obj_t self_in, mp_obj_t group_in) { + framebufferio_framebufferdisplay_obj_t *self = native_display(self_in); + displayio_group_t *group = NULL; + if (group_in != mp_const_none) { + group = MP_OBJ_TO_PTR(native_group(group_in)); + } + + bool ok = common_hal_framebufferio_framebufferdisplay_set_root_group(self, group); + if (!ok) { + mp_raise_ValueError(translate("Group already used")); + } + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(framebufferio_framebufferdisplay_set_root_group_obj, framebufferio_framebufferdisplay_obj_set_root_group); + +MP_PROPERTY_GETSET(framebufferio_framebufferdisplay_root_group_obj, + (mp_obj_t)&framebufferio_framebufferdisplay_get_root_group_obj, + (mp_obj_t)&framebufferio_framebufferdisplay_set_root_group_obj); STATIC const mp_rom_map_elem_t framebufferio_framebufferdisplay_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_show), MP_ROM_PTR(&framebufferio_framebufferdisplay_show_obj) }, diff --git a/shared-bindings/framebufferio/FramebufferDisplay.h b/shared-bindings/framebufferio/FramebufferDisplay.h index 7c63587df7..6526e25afb 100644 --- a/shared-bindings/framebufferio/FramebufferDisplay.h +++ b/shared-bindings/framebufferio/FramebufferDisplay.h @@ -61,5 +61,6 @@ bool common_hal_framebufferio_framebufferdisplay_set_brightness(framebufferio_fr mp_obj_t common_hal_framebufferio_framebufferdisplay_framebuffer(framebufferio_framebufferdisplay_obj_t *self); mp_obj_t common_hal_framebufferio_framebufferdisplay_get_root_group(framebufferio_framebufferdisplay_obj_t *self); +mp_obj_t common_hal_framebufferio_framebufferdisplay_set_root_group(framebufferio_framebufferdisplay_obj_t *self, displayio_group_t *root_group); #endif // MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYIO_FRAMEBUFFERDISPLAY_H diff --git a/shared-bindings/i2ctarget/I2CTarget.c b/shared-bindings/i2ctarget/I2CTarget.c index 4dc5b775f4..17da952118 100644 --- a/shared-bindings/i2ctarget/I2CTarget.c +++ b/shared-bindings/i2ctarget/I2CTarget.c @@ -159,7 +159,7 @@ STATIC mp_obj_t i2ctarget_i2c_target_request(size_t n_args, const mp_obj_t *pos_ bool forever = false; uint64_t timeout_end = 0; - if (timeout_ms <= 0) { + if (timeout_ms == 0) { forever = true; } else if (timeout_ms > 0) { timeout_end = common_hal_time_monotonic_ms() + timeout_ms; diff --git a/shared-bindings/math/__init__.c b/shared-bindings/math/__init__.c index 58405564db..42a32749da 100644 --- a/shared-bindings/math/__init__.c +++ b/shared-bindings/math/__init__.c @@ -371,7 +371,7 @@ STATIC mp_obj_t mp_math_log(size_t n_args, const mp_obj_t *args) { #pragma GCC diagnostic ignored "-Wfloat-equal" } else if (base == (mp_float_t)1.0) { #pragma GCC diagnostic pop - mp_raise_msg(&mp_type_ZeroDivisionError, translate("division by zero")); + math_error(); } return mp_obj_new_float(l / MICROPY_FLOAT_C_FUN(log)(base)); } diff --git a/shared-bindings/coproc/CoprocMemory.c b/shared-bindings/memorymap/AddressRange.c similarity index 58% rename from shared-bindings/coproc/CoprocMemory.c rename to shared-bindings/memorymap/AddressRange.c index 0d49a2f008..fb55c07efe 100644 --- a/shared-bindings/coproc/CoprocMemory.c +++ b/shared-bindings/memorymap/AddressRange.c @@ -3,7 +3,7 @@ * * The MIT License (MIT) * - * Copyright (c) 2022 microDev + * 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 @@ -28,45 +28,62 @@ #include "py/objproperty.h" #include "py/runtime.h" #include "py/runtime0.h" - -#include "shared-bindings/coproc/CoprocMemory.h" +#include "shared-bindings/memorymap/AddressRange.h" #include "supervisor/shared/translate/translate.h" -//| class CoprocMemory: -//| def __init__(self, address: int, length: int) -> None: -//| """Initialize coproc shared memory. +//| class AddressRange: +//| r"""Presents a range of addresses as a bytearray. //| -//| :param address: address of shared memory -//| :param length: length of shared memory""" -STATIC mp_obj_t coproc_memory_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { - enum { ARG_address, ARG_length }; - static const mp_arg_t allowed_args[] = { - { MP_QSTR_address, MP_ARG_REQUIRED | MP_ARG_INT }, - { MP_QSTR_length, MP_ARG_REQUIRED | MP_ARG_INT }, - }; +//| The addresses may access memory or memory mapped peripherals. +//| +//| Some address ranges may be protected by CircuitPython to prevent errors. +//| An exception will be raised when constructing an AddressRange for an +//| invalid or protected address. +//| +//| Multiple AddressRanges may overlap. There is no "claiming" of addresses. +//| +//| Example usage on ESP32-S2:: +//| +//| import memorymap +//| rtc_slow_mem = memorymap.AddressRange(start=0x50000000, length=0x2000) +//| rtc_slow_mem[0:3] = b"\xcc\x10\x00" +//| """ +//| def __init__(self, *, start, length) -> None: +//| """Constructs an address range starting at ``start`` and ending at +//| ``start + length``. An exception will be raised if any of the +//| addresses are invalid or protected.""" +//| ... +STATIC mp_obj_t memorymap_addressrange_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { + enum { ARG_start, ARG_length }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_start, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_INT }, + { MP_QSTR_length, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_INT }, + }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); - coproc_memory_obj_t *self = m_new_obj(coproc_memory_obj_t); - self->base.type = &coproc_memory_type; - self->address = args[ARG_address].u_int; - self->len = args[ARG_length].u_int; + size_t start = + mp_arg_validate_int_min(args[ARG_start].u_int, 0, MP_QSTR_start); + size_t length = + mp_arg_validate_int_min(args[ARG_length].u_int, 1, MP_QSTR_length); + + + memorymap_addressrange_obj_t *self = m_new_obj(memorymap_addressrange_obj_t); + self->base.type = &memorymap_addressrange_type; + + common_hal_memorymap_addressrange_construct(self, (uint8_t *)start, length); return MP_OBJ_FROM_PTR(self); } -//| def __bool__(self) -> bool: -//| """``coproc_memory`` is ``True`` if its length is greater than zero. -//| This is an easy way to check for its existence. -//| """ -//| ... +//| def __bool__(self) -> bool: ... //| def __len__(self) -> int: //| """Return the length. This is used by (`len`)""" //| ... -STATIC mp_obj_t coproc_memory_unary_op(mp_unary_op_t op, mp_obj_t self_in) { - coproc_memory_obj_t *self = MP_OBJ_TO_PTR(self_in); - uint16_t len = common_hal_coproc_memory_get_length(self); +STATIC mp_obj_t memorymap_addressrange_unary_op(mp_unary_op_t op, mp_obj_t self_in) { + memorymap_addressrange_obj_t *self = MP_OBJ_TO_PTR(self_in); + uint16_t len = common_hal_memorymap_addressrange_get_length(self); switch (op) { case MP_UNARY_OP_BOOL: return mp_obj_new_bool(len != 0); @@ -77,36 +94,42 @@ STATIC mp_obj_t coproc_memory_unary_op(mp_unary_op_t op, mp_obj_t self_in) { } } -STATIC const mp_rom_map_elem_t coproc_memory_locals_dict_table[] = { +STATIC const mp_rom_map_elem_t memorymap_addressrange_locals_dict_table[] = { }; -STATIC MP_DEFINE_CONST_DICT(coproc_memory_locals_dict, coproc_memory_locals_dict_table); +STATIC MP_DEFINE_CONST_DICT(memorymap_addressrange_locals_dict, memorymap_addressrange_locals_dict_table); //| @overload //| def __getitem__(self, index: slice) -> bytearray: ... //| @overload //| def __getitem__(self, index: int) -> int: -//| """Returns the value at the given index.""" +//| """Returns the value(s) at the given index. +//| +//| 1, 2, 4 and 8 byte aligned reads will be done in one transaction. +//| All others may use multiple transactions.""" //| ... //| @overload //| def __setitem__(self, index: slice, value: ReadableBuffer) -> None: ... //| @overload //| def __setitem__(self, index: int, value: int) -> None: -//| """Set the value at the given index.""" +//| """Set the value(s) at the given index. +//| +//| 1, 2, 4 and 8 byte aligned writes will be done in one transaction. +//| All others may use multiple transactions.""" //| ... //| -STATIC mp_obj_t coproc_memory_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_obj_t value) { +STATIC mp_obj_t memorymap_addressrange_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_obj_t value) { if (value == MP_OBJ_NULL) { // delete item // slice deletion return MP_OBJ_NULL; // op not supported } else { - coproc_memory_obj_t *self = MP_OBJ_TO_PTR(self_in); + memorymap_addressrange_obj_t *self = MP_OBJ_TO_PTR(self_in); if (0) { #if MICROPY_PY_BUILTINS_SLICE } else if (mp_obj_is_type(index_in, &mp_type_slice)) { mp_bound_slice_t slice; - if (!mp_seq_get_fast_slice_indexes(common_hal_coproc_memory_get_length(self), index_in, &slice)) { + if (!mp_seq_get_fast_slice_indexes(common_hal_memorymap_addressrange_get_length(self), index_in, &slice)) { mp_raise_NotImplementedError(translate("only slices with step=1 (aka None) are supported")); } if (value != MP_OBJ_SENTINEL) { @@ -132,8 +155,8 @@ STATIC mp_obj_t coproc_memory_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_obj mp_raise_NotImplementedError(translate("array/bytes required on right side")); } - if (!common_hal_coproc_memory_set_bytes(self, slice.start, src_items, src_len)) { - mp_raise_RuntimeError(translate("Unable to write")); + if (!common_hal_memorymap_addressrange_set_bytes(self, slice.start, src_items, src_len)) { + mp_raise_RuntimeError(translate("Unable to write to address.")); } return mp_const_none; #else @@ -143,18 +166,18 @@ STATIC mp_obj_t coproc_memory_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_obj // Read slice. size_t len = slice.stop - slice.start; uint8_t *items = m_new(uint8_t, len); - common_hal_coproc_memory_get_bytes(self, slice.start, items, len); + common_hal_memorymap_addressrange_get_bytes(self, slice.start, len, items); return mp_obj_new_bytearray_by_ref(len, items); } #endif } else { // Single index rather than slice. - size_t index = mp_get_index(self->base.type, common_hal_coproc_memory_get_length(self), + size_t index = mp_get_index(self->base.type, common_hal_memorymap_addressrange_get_length(self), index_in, false); if (value == MP_OBJ_SENTINEL) { // load uint8_t value_out; - common_hal_coproc_memory_get_bytes(self, index, &value_out, 1); + common_hal_memorymap_addressrange_get_bytes(self, index, 1, &value_out); return MP_OBJ_NEW_SMALL_INT(value_out); } else { // store @@ -162,8 +185,8 @@ STATIC mp_obj_t coproc_memory_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_obj mp_arg_validate_int_range(byte_value, 0, 255, MP_QSTR_bytes); uint8_t short_value = byte_value; - if (!common_hal_coproc_memory_set_bytes(self, index, &short_value, 1)) { - mp_raise_RuntimeError(translate("Unable to write")); + if (!common_hal_memorymap_addressrange_set_bytes(self, index, &short_value, 1)) { + mp_raise_RuntimeError(translate("Unable to write to address.")); } return mp_const_none; } @@ -171,14 +194,14 @@ STATIC mp_obj_t coproc_memory_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_obj } } -const mp_obj_type_t coproc_memory_type = { +const mp_obj_type_t memorymap_addressrange_type = { { &mp_type_type }, - .name = MP_QSTR_CoprocMemory, .flags = MP_TYPE_FLAG_EXTENDED, - .make_new = coproc_memory_make_new, - .locals_dict = (mp_obj_t)&coproc_memory_locals_dict, + .name = MP_QSTR_AddressRange, + .make_new = memorymap_addressrange_make_new, + .locals_dict = (mp_obj_t)&memorymap_addressrange_locals_dict, MP_TYPE_EXTENDED_FIELDS( - .subscr = coproc_memory_subscr, - .unary_op = coproc_memory_unary_op, + .subscr = memorymap_addressrange_subscr, + .unary_op = memorymap_addressrange_unary_op, ), }; diff --git a/shared-bindings/coproc/CoprocMemory.h b/shared-bindings/memorymap/AddressRange.h similarity index 53% rename from shared-bindings/coproc/CoprocMemory.h rename to shared-bindings/memorymap/AddressRange.h index fdbb2fa0fa..74a214d949 100644 --- a/shared-bindings/coproc/CoprocMemory.h +++ b/shared-bindings/memorymap/AddressRange.h @@ -3,7 +3,7 @@ * * The MIT License (MIT) * - * Copyright (c) 2022 microDev + * 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 @@ -24,16 +24,23 @@ * THE SOFTWARE. */ -#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_COPROC_COPROCMEMORY_H -#define MICROPY_INCLUDED_SHARED_BINDINGS_COPROC_COPROCMEMORY_H +#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_MEMORYMAP_ADDRESSRANGE_H +#define MICROPY_INCLUDED_SHARED_BINDINGS_MEMORYMAP_ADDRESSRANGE_H -#include "common-hal/coproc/CoprocMemory.h" +#include "common-hal/memorymap/AddressRange.h" -extern const mp_obj_type_t coproc_memory_type; +extern const mp_obj_type_t memorymap_addressrange_type; -uint32_t common_hal_coproc_memory_get_length(coproc_memory_obj_t *self); +void common_hal_memorymap_addressrange_construct(memorymap_addressrange_obj_t *self, uint8_t *start_address, size_t length); -bool common_hal_coproc_memory_set_bytes(coproc_memory_obj_t *self, uint32_t start_index, const uint8_t *values, uint32_t len); -void common_hal_coproc_memory_get_bytes(coproc_memory_obj_t *self, uint32_t start_index, uint8_t *values, uint32_t len); +uint32_t common_hal_memorymap_addressrange_get_length(const memorymap_addressrange_obj_t *self); -#endif // MICROPY_INCLUDED_SHARED_BINDINGS_COPROC_COPROCMEMORY_H +bool common_hal_memorymap_addressrange_set_bytes(const memorymap_addressrange_obj_t *self, + uint32_t start_index, uint8_t *values, uint32_t len); + +// len and values are intentionally swapped to signify values is an output and +// also leverage the compiler to validate uses are expected. +void common_hal_memorymap_addressrange_get_bytes(const memorymap_addressrange_obj_t *self, + uint32_t start_index, uint32_t len, uint8_t *values); + +#endif // MICROPY_INCLUDED_SHARED_BINDINGS_MEMORYMAP_ADDRESSRANGE_H diff --git a/ports/raspberrypi/fatfs_port.c b/shared-bindings/memorymap/__init__.c similarity index 56% rename from ports/raspberrypi/fatfs_port.c rename to shared-bindings/memorymap/__init__.c index 58a0ef0d72..576c7f1e1d 100644 --- a/ports/raspberrypi/fatfs_port.c +++ b/shared-bindings/memorymap/__init__.c @@ -3,7 +3,7 @@ * * The MIT License (MIT) * - * SPDX-FileCopyrightText: Copyright (c) 2013, 2014 Damien P. George + * 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 @@ -24,25 +24,29 @@ * THE SOFTWARE. */ +#include "py/obj.h" #include "py/mphal.h" #include "py/runtime.h" -#include "lib/oofatfs/ff.h" /* FatFs lower layer API */ -#include "lib/oofatfs/diskio.h" /* FatFs lower layer API */ -#include "shared/timeutils/timeutils.h" -#if CIRCUITPY_RTC -#include "shared-bindings/rtc/RTC.h" -#endif +#include "shared-bindings/memorymap/__init__.h" +#include "shared-bindings/memorymap/AddressRange.h" -DWORD get_fattime(void) { - #if CIRCUITPY_RTC - timeutils_struct_time_t tm; - common_hal_rtc_get_time(&tm); - return ((tm.tm_year - 1980) << 25) | (tm.tm_mon << 21) | (tm.tm_mday << 16) | - (tm.tm_hour << 11) | (tm.tm_min << 5) | (tm.tm_sec >> 1); - #else - return ((2016 - 1980) << 25) | ((9) << 21) | ((1) << 16) | ((16) << 11) | ((43) << 5) | (35 / 2); - #endif +//| """Raw memory map access +//| +//| The `memorymap` module allows you to read and write memory addresses in the +//| address space seen from the processor running CircuitPython. It is usually +//| the physical address space. +//| """ +STATIC const mp_rom_map_elem_t memorymap_module_globals_table[] = { + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_memorymap) }, + { MP_ROM_QSTR(MP_QSTR_AddressRange), MP_ROM_PTR(&memorymap_addressrange_type) }, +}; +STATIC MP_DEFINE_CONST_DICT(memorymap_module_globals, memorymap_module_globals_table); -} +const mp_obj_module_t memorymap_module = { + .base = { &mp_type_module }, + .globals = (mp_obj_dict_t *)&memorymap_module_globals, +}; + +MP_REGISTER_MODULE(MP_QSTR_memorymap, memorymap_module, CIRCUITPY_MEMORYMAP); diff --git a/shared-bindings/memorymap/__init__.h b/shared-bindings/memorymap/__init__.h new file mode 100644 index 0000000000..f4e6c51481 --- /dev/null +++ b/shared-bindings/memorymap/__init__.h @@ -0,0 +1,30 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2022 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 SHARED_BINDINGS_MEMORYMAP_H +#define SHARED_BINDINGS_MEMORYMAP_H + +#endif // SHARED_BINDINGS_MEMORYMAP_H diff --git a/shared-bindings/microcontroller/Pin.c b/shared-bindings/microcontroller/Pin.c index 42076aa90e..f1b9a90d45 100644 --- a/shared-bindings/microcontroller/Pin.c +++ b/shared-bindings/microcontroller/Pin.c @@ -156,9 +156,7 @@ void validate_no_duplicate_pins_2(mp_obj_t seq1, mp_obj_t seq2, qstr arg_name1, // Validate every element in the list to be a free pin. void validate_list_is_free_pins(qstr what, const mcu_pin_obj_t **pins_out, mp_int_t max_pins, mp_obj_t seq, uint8_t *count_out) { mp_int_t len = MP_OBJ_SMALL_INT_VALUE(mp_obj_len(seq)); - if (len > max_pins) { - mp_raise_ValueError_varg(translate("At most %d %q may be specified (not %d)"), max_pins, what, len); - } + mp_arg_validate_length_max(len, max_pins, what); *count_out = len; for (mp_int_t i = 0; i < len; i++) { pins_out[i] = validate_obj_is_free_pin(mp_obj_subscr(seq, MP_OBJ_NEW_SMALL_INT(i), MP_OBJ_SENTINEL)); diff --git a/shared-bindings/microcontroller/Processor.c b/shared-bindings/microcontroller/Processor.c index 3b671d0c7b..986f81ea53 100644 --- a/shared-bindings/microcontroller/Processor.c +++ b/shared-bindings/microcontroller/Processor.c @@ -65,19 +65,21 @@ //| ... //| frequency: int -//| """The CPU operating frequency in Hertz. (read-only)""" +//| """The CPU operating frequency in Hertz. +//| +//| **Limitations:** Setting the ``frequency`` is possible only on some i.MX boards. +//| On most boards, ``frequency`` is read-only. +//| """ +#if CIRCUITPY_SETTABLE_PROCESSOR_FREQUENCY STATIC mp_obj_t mcu_processor_set_frequency(mp_obj_t self, mp_obj_t freq) { - #if CIRCUITPY_SETTABLE_PROCESSOR_FREQUENCY uint32_t value_of_freq = (uint32_t)mp_arg_validate_int_min(mp_obj_get_int(freq), 0, MP_QSTR_frequency); common_hal_mcu_processor_set_frequency(self, value_of_freq); - #else - mp_raise_msg(&mp_type_NotImplementedError,translate("frequency is read-only for this board")); - #endif return mp_const_none; } MP_DEFINE_CONST_FUN_OBJ_2(mcu_processor_set_frequency_obj, mcu_processor_set_frequency); +#endif STATIC mp_obj_t mcu_processor_get_frequency(mp_obj_t self) { @@ -86,9 +88,14 @@ STATIC mp_obj_t mcu_processor_get_frequency(mp_obj_t self) { MP_DEFINE_CONST_FUN_OBJ_1(mcu_processor_get_frequency_obj, mcu_processor_get_frequency); +#if CIRCUITPY_SETTABLE_PROCESSOR_FREQUENCY MP_PROPERTY_GETSET(mcu_processor_frequency_obj, (mp_obj_t)&mcu_processor_get_frequency_obj, (mp_obj_t)&mcu_processor_set_frequency_obj); +#else +MP_PROPERTY_GETTER(mcu_processor_frequency_obj, + (mp_obj_t)&mcu_processor_get_frequency_obj); +#endif //| reset_reason: microcontroller.ResetReason //| """The reason the microcontroller started up from reset state.""" diff --git a/shared-bindings/os/__init__.c b/shared-bindings/os/__init__.c index 1260903203..b2fb8ff095 100644 --- a/shared-bindings/os/__init__.c +++ b/shared-bindings/os/__init__.c @@ -92,6 +92,7 @@ MP_DEFINE_CONST_FUN_OBJ_0(os_getcwd_obj, os_getcwd); //| ... //| STATIC mp_obj_t os_getenv(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + #if CIRCUITPY_OS_GETENV enum { ARG_key, ARG_default }; static const mp_arg_t allowed_args[] = { { MP_QSTR_key, MP_ARG_REQUIRED | MP_ARG_OBJ }, @@ -101,6 +102,9 @@ STATIC mp_obj_t os_getenv(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_ mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); return common_hal_os_getenv(mp_obj_str_get_str(args[ARG_key].u_obj), args[ARG_default].u_obj); + #else + return mp_const_none; + #endif } STATIC MP_DEFINE_CONST_FUN_OBJ_KW(os_getenv_obj, 1, os_getenv); diff --git a/shared-bindings/os/__init__.h b/shared-bindings/os/__init__.h index 00d8c28a50..49b12cd52a 100644 --- a/shared-bindings/os/__init__.h +++ b/shared-bindings/os/__init__.h @@ -38,6 +38,8 @@ mp_obj_t common_hal_os_uname(void); void common_hal_os_chdir(const char *path); mp_obj_t common_hal_os_getcwd(void); mp_obj_t common_hal_os_getenv(const char *key, mp_obj_t default_); +mp_obj_t common_hal_os_getenv_path(const char *path, const char *key, mp_obj_t default_); + mp_obj_t common_hal_os_listdir(const char *path); void common_hal_os_mkdir(const char *path); void common_hal_os_remove(const char *path); diff --git a/shared-bindings/random/__init__.c b/shared-bindings/random/__init__.c index 29c6a0e74b..fcf432931e 100644 --- a/shared-bindings/random/__init__.c +++ b/shared-bindings/random/__init__.c @@ -108,7 +108,7 @@ STATIC mp_obj_t random_randrange(size_t n_args, const mp_obj_t *args) { } else if (step < 0) { n = (stop - start + step + 1) / step; } else { - mp_raise_ValueError(translate("step must be non-zero")); + mp_raise_ValueError_varg(MP_ERROR_TEXT("%q step cannot be zero"), MP_QSTR_randrange); } if (n <= 0) { mp_raise_ValueError(translate("invalid step")); diff --git a/shared-bindings/socketpool/Socket.c b/shared-bindings/socketpool/Socket.c index 7a60463c4b..fbf78a4cdc 100644 --- a/shared-bindings/socketpool/Socket.c +++ b/shared-bindings/socketpool/Socket.c @@ -344,38 +344,36 @@ STATIC mp_obj_t socketpool_socket_setblocking(mp_obj_t self_in, mp_obj_t blockin } STATIC MP_DEFINE_CONST_FUN_OBJ_2(socketpool_socket_setblocking_obj, socketpool_socket_setblocking); -// //| def setsockopt(self, level: int, optname: int, value: int) -> None: -// //| """Sets socket options""" -// //| ... -// //| -// STATIC mp_obj_t socketpool_socket_setsockopt(size_t n_args, const mp_obj_t *args) { -// // mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(args[0]); +//| def setsockopt(self, level: int, optname: int, value: int) -> None: +//| """Sets socket options""" +//| ... +STATIC mp_obj_t socketpool_socket_setsockopt(size_t n_args, const mp_obj_t *args) { + socketpool_socket_obj_t *self = MP_OBJ_TO_PTR(args[0]); + mp_int_t level = mp_obj_get_int(args[1]); + mp_int_t opt = mp_obj_get_int(args[2]); -// // mp_int_t level = mp_obj_get_int(args[1]); -// // mp_int_t opt = mp_obj_get_int(args[2]); + const void *optval; + mp_uint_t optlen; + mp_int_t val; + if (mp_obj_is_integer(args[3])) { + val = mp_obj_get_int_truncated(args[3]); + optval = &val; + optlen = sizeof(val); + } else { + mp_buffer_info_t bufinfo; + mp_get_buffer_raise(args[3], &bufinfo, MP_BUFFER_READ); + optval = bufinfo.buf; + optlen = bufinfo.len; + } -// // const void *optval; -// // mp_uint_t optlen; -// // mp_int_t val; -// // if (mp_obj_is_integer(args[3])) { -// // val = mp_obj_get_int_truncated(args[3]); -// // optval = &val; -// // optlen = sizeof(val); -// // } else { -// // mp_buffer_info_t bufinfo; -// // mp_get_buffer_raise(args[3], &bufinfo, MP_BUFFER_READ); -// // optval = bufinfo.buf; -// // optlen = bufinfo.len; -// // } + int _errno = common_hal_socketpool_socket_setsockopt(self, level, opt, optval, optlen); + if (_errno < 0) { + mp_raise_OSError(-_errno); + } -// // int _errno; -// // if (self->nic_type->setsockopt(self, level, opt, optval, optlen, &_errno) != 0) { -// // mp_raise_OSError(_errno); -// // } - -// return mp_const_none; -// } -// STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socketpool_socket_setsockopt_obj, 4, 4, socketpool_socket_setsockopt); + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socketpool_socket_setsockopt_obj, 4, 4, socketpool_socket_setsockopt); //| def settimeout(self, value: int) -> None: @@ -417,7 +415,7 @@ STATIC const mp_rom_map_elem_t socketpool_socket_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_sendall), MP_ROM_PTR(&socketpool_socket_sendall_obj) }, { MP_ROM_QSTR(MP_QSTR_sendto), MP_ROM_PTR(&socketpool_socket_sendto_obj) }, { MP_ROM_QSTR(MP_QSTR_setblocking), MP_ROM_PTR(&socketpool_socket_setblocking_obj) }, - // { MP_ROM_QSTR(MP_QSTR_setsockopt), MP_ROM_PTR(&socketpool_socket_setsockopt_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 cf5a97a428..690c9f8363 100644 --- a/shared-bindings/socketpool/Socket.h +++ b/shared-bindings/socketpool/Socket.h @@ -46,13 +46,22 @@ mp_uint_t common_hal_socketpool_socket_send(socketpool_socket_obj_t *self, const mp_uint_t common_hal_socketpool_socket_sendto(socketpool_socket_obj_t *self, const char *host, size_t hostlen, uint32_t port, const uint8_t *buf, uint32_t len); void common_hal_socketpool_socket_settimeout(socketpool_socket_obj_t *self, uint32_t timeout_ms); +int common_hal_socketpool_socket_setsockopt(socketpool_socket_obj_t *self, int level, int optname, const void *value, size_t optlen); bool common_hal_socketpool_readable(socketpool_socket_obj_t *self); bool common_hal_socketpool_writable(socketpool_socket_obj_t *self); // Non-allocating versions for internal use. -int socketpool_socket_accept(socketpool_socket_obj_t *self, uint8_t *ip, uint32_t *port); +int socketpool_socket_accept(socketpool_socket_obj_t *self, uint8_t *ip, uint32_t *port, socketpool_socket_obj_t *accepted); void socketpool_socket_close(socketpool_socket_obj_t *self); int socketpool_socket_send(socketpool_socket_obj_t *self, const uint8_t *buf, uint32_t len); int socketpool_socket_recv_into(socketpool_socket_obj_t *self, const uint8_t *buf, uint32_t len); + +// Moves self to sock without closing the real socket. self will think its closed afterwards. +void socketpool_socket_move(socketpool_socket_obj_t *self, socketpool_socket_obj_t *sock); + +// Resets the socket object state so it appears closed and disconnected. This only works on +// uninitialized memory. +void socketpool_socket_reset(socketpool_socket_obj_t *self); + #endif // MICROPY_INCLUDED_SHARED_BINDINGS_SOCKETPOOL_SOCKET_H diff --git a/shared-bindings/socketpool/SocketPool.c b/shared-bindings/socketpool/SocketPool.c index e500784f1f..f056c741f3 100644 --- a/shared-bindings/socketpool/SocketPool.c +++ b/shared-bindings/socketpool/SocketPool.c @@ -52,7 +52,6 @@ //| returned by :py:attr:`wifi.radio` //| """ //| ... - STATIC mp_obj_t socketpool_socketpool_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { mp_arg_check_num(n_args, n_kw, 1, 1, false); @@ -65,12 +64,23 @@ STATIC mp_obj_t socketpool_socketpool_make_new(const mp_obj_type_t *type, size_t return MP_OBJ_FROM_PTR(s); } +//| class gaierror(OSError): +//| """Errors raised by getaddrinfo""" +//| +MP_DEFINE_EXCEPTION(gaierror, OSError) + +//| //| AF_INET: int //| AF_INET6: int +//| //| SOCK_STREAM: int //| SOCK_DGRAM: int //| SOCK_RAW: int +//| EAI_NONAME: int //| +//| TCP_NODELAY: int +//| +//| IPPROTO_TCP: int //| def socket(self, family: int = AF_INET, type: int = SOCK_STREAM) -> socketpool.Socket: //| """Create a new socket //| @@ -139,11 +149,7 @@ STATIC mp_obj_t socketpool_socketpool_getaddrinfo(size_t n_args, const mp_obj_t } if (ip_str == mp_const_none) { - ip_str = common_hal_socketpool_socketpool_gethostbyname(self, host); - } - - if (ip_str == mp_const_none) { - mp_raise_OSError(-2); // socket.EAI_NONAME from CPython + ip_str = common_hal_socketpool_socketpool_gethostbyname_raise(self, host); } mp_obj_tuple_t *tuple = MP_OBJ_TO_PTR(mp_obj_new_tuple(5, NULL)); @@ -162,6 +168,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_KW(socketpool_socketpool_getaddrinfo_obj, 1, sock STATIC const mp_rom_map_elem_t socketpool_socketpool_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_socket), MP_ROM_PTR(&socketpool_socketpool_socket_obj) }, { MP_ROM_QSTR(MP_QSTR_getaddrinfo), MP_ROM_PTR(&socketpool_socketpool_getaddrinfo_obj) }, + { MP_ROM_QSTR(MP_QSTR_gaierror), MP_ROM_PTR(&mp_type_gaierror) }, // class constants { MP_ROM_QSTR(MP_QSTR_AF_INET), MP_ROM_INT(SOCKETPOOL_AF_INET) }, @@ -170,6 +177,12 @@ STATIC const mp_rom_map_elem_t socketpool_socketpool_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_SOCK_STREAM), MP_ROM_INT(SOCKETPOOL_SOCK_STREAM) }, { MP_ROM_QSTR(MP_QSTR_SOCK_DGRAM), MP_ROM_INT(SOCKETPOOL_SOCK_DGRAM) }, { MP_ROM_QSTR(MP_QSTR_SOCK_RAW), MP_ROM_INT(SOCKETPOOL_SOCK_RAW) }, + + { MP_ROM_QSTR(MP_QSTR_TCP_NODELAY), MP_ROM_INT(SOCKETPOOL_TCP_NODELAY) }, + + { MP_ROM_QSTR(MP_QSTR_IPPROTO_TCP), MP_ROM_INT(SOCKETPOOL_IPPROTO_TCP) }, + + { MP_ROM_QSTR(MP_QSTR_EAI_NONAME), MP_ROM_INT(SOCKETPOOL_EAI_NONAME) }, }; STATIC MP_DEFINE_CONST_DICT(socketpool_socketpool_locals_dict, socketpool_socketpool_locals_dict_table); @@ -180,3 +193,26 @@ const mp_obj_type_t socketpool_socketpool_type = { .make_new = socketpool_socketpool_make_new, .locals_dict = (mp_obj_dict_t *)&socketpool_socketpool_locals_dict, }; + +MP_WEAK +mp_obj_t common_hal_socketpool_socketpool_gethostbyname_raise(socketpool_socketpool_obj_t *self, const char *host) { + mp_obj_t ip_str = common_hal_socketpool_socketpool_gethostbyname(self, host); + if (ip_str == mp_const_none) { + common_hal_socketpool_socketpool_raise_gaierror_noname(); + } + return ip_str; +} + +MP_WEAK NORETURN +void common_hal_socketpool_socketpool_raise_gaierror_noname(void) { + vstr_t vstr; + mp_print_t print; + vstr_init_print(&vstr, 64, &print); + mp_printf(&print, "%S", translate("Name or service not known")); + + mp_obj_t exc_args[] = { + MP_OBJ_NEW_SMALL_INT(SOCKETPOOL_EAI_NONAME), + mp_obj_new_str_from_vstr(&mp_type_str, &vstr), + }; + nlr_raise(mp_obj_new_exception_args(&mp_type_gaierror, MP_ARRAY_SIZE(exc_args), exc_args)); +} diff --git a/shared-bindings/socketpool/SocketPool.h b/shared-bindings/socketpool/SocketPool.h index 92382078e1..6409f8c763 100644 --- a/shared-bindings/socketpool/SocketPool.h +++ b/shared-bindings/socketpool/SocketPool.h @@ -34,16 +34,28 @@ extern const mp_obj_type_t socketpool_socketpool_type; typedef enum { - SOCKETPOOL_SOCK_STREAM, - SOCKETPOOL_SOCK_DGRAM, - SOCKETPOOL_SOCK_RAW + SOCKETPOOL_SOCK_STREAM = 1, + SOCKETPOOL_SOCK_DGRAM = 2, + SOCKETPOOL_SOCK_RAW = 3 } socketpool_socketpool_sock_t; typedef enum { - SOCKETPOOL_AF_INET, - SOCKETPOOL_AF_INET6 + SOCKETPOOL_AF_INET = 2, + SOCKETPOOL_AF_INET6 = 10 } socketpool_socketpool_addressfamily_t; +typedef enum { + SOCKETPOOL_IPPROTO_TCP = 6, +} socketpool_socketpool_ipproto_t; + +typedef enum { + SOCKETPOOL_TCP_NODELAY = 1, +} socketpool_socketpool_tcpopt_t; + +typedef enum { + SOCKETPOOL_EAI_NONAME = -2, +} socketpool_eai_t; + void common_hal_socketpool_socketpool_construct(socketpool_socketpool_obj_t *self, mp_obj_t radio); socketpool_socket_obj_t *common_hal_socketpool_socket(socketpool_socketpool_obj_t *self, @@ -51,6 +63,9 @@ socketpool_socket_obj_t *common_hal_socketpool_socket(socketpool_socketpool_obj_ mp_obj_t common_hal_socketpool_socketpool_gethostbyname(socketpool_socketpool_obj_t *self, const char *host); +// raises an exception instead of returning mp_const_none in the case of error +mp_obj_t common_hal_socketpool_socketpool_gethostbyname_raise(socketpool_socketpool_obj_t *self, + const char *host); // Non-allocating version for internal use. These sockets are not registered and, therefore, not // closed automatically. @@ -58,4 +73,6 @@ bool socketpool_socket(socketpool_socketpool_obj_t *self, socketpool_socketpool_addressfamily_t family, socketpool_socketpool_sock_t type, socketpool_socket_obj_t *sock); +NORETURN void common_hal_socketpool_socketpool_raise_gaierror_noname(void); + #endif // MICROPY_INCLUDED_SHARED_BINDINGS_SOCKETPOOL_SOCKETPOOL_H diff --git a/shared-bindings/storage/__init__.c b/shared-bindings/storage/__init__.c index 838395efb3..ad8b847fd5 100644 --- a/shared-bindings/storage/__init__.c +++ b/shared-bindings/storage/__init__.c @@ -258,6 +258,10 @@ STATIC const mp_rom_map_elem_t storage_module_globals_table[] = { //| this property can only be set when the device is writable by the //| microcontroller.""" //| ... +//| readonly: bool +//| """``True`` when the device is mounted as readonly by the microcontroller. +//| This property cannot be changed, use `storage.remount` instead.""" +//| ... //| //| def mkfs(self) -> None: //| """Format the block device, deleting any data that may have been there""" diff --git a/shared-bindings/supervisor/__init__.c b/shared-bindings/supervisor/__init__.c index b61d05d636..37f35e2e18 100644 --- a/shared-bindings/supervisor/__init__.c +++ b/shared-bindings/supervisor/__init__.c @@ -197,7 +197,7 @@ MP_DEFINE_CONST_FUN_OBJ_KW(supervisor_set_next_code_file_obj, 0, supervisor_set_ //| //| def ticks_add(ticks, delta): //| "Add a delta to a base number of ticks, performing wraparound at 2**29ms." -//| return (a + b) % _TICKS_PERIOD +//| return (ticks + delta) % _TICKS_PERIOD //| //| def ticks_diff(ticks1, ticks2): //| "Compute the signed difference between two ticks values, assuming that they are within 2**28 ticks" diff --git a/shared-bindings/time/__init__.c b/shared-bindings/time/__init__.c index 096c80d382..d02923f162 100644 --- a/shared-bindings/time/__init__.c +++ b/shared-bindings/time/__init__.c @@ -97,9 +97,7 @@ STATIC mp_obj_t struct_time_make_new(const mp_obj_type_t *type, size_t n_args, s size_t len; mp_obj_t *items; mp_obj_get_array(args[0], &len, &items); - if (len != 9) { - mp_raise_TypeError(translate("time.struct_time() takes a 9-sequence")); - } + mp_arg_validate_length(len, 9, MP_QSTR_value); return namedtuple_make_new(type, len, 0, items); } diff --git a/shared-bindings/traceback/__init__.c b/shared-bindings/traceback/__init__.c index eeb7bc458d..153587e919 100644 --- a/shared-bindings/traceback/__init__.c +++ b/shared-bindings/traceback/__init__.c @@ -58,6 +58,7 @@ STATIC void traceback_exception_common(bool is_print_exception, mp_print_t *prin } mp_obj_t tb_obj = args[ARG_tb].u_obj; mp_obj_t limit_obj = args[ARG_limit].u_obj; + bool chain = args[ARG_chain].u_bool; if (args[ARG_file].u_obj != mp_const_none) { if (!is_print_exception) { @@ -90,6 +91,15 @@ STATIC void traceback_exception_common(bool is_print_exception, mp_print_t *prin mp_obj_exception_t *exc = mp_obj_exception_get_native(value); mp_obj_traceback_t *trace_backup = exc->traceback; + #if MICROPY_CPYTHON_EXCEPTION_CHAIN + mp_obj_exception_t *context_backup = exc->context; + mp_obj_exception_t *cause_backup = exc->cause; + + if (!chain) { + exc->context = NULL; + exc->cause = NULL; + } + #endif if (tb_obj == MP_OBJ_NULL) { /* Print the traceback's exception as is */ @@ -101,6 +111,10 @@ STATIC void traceback_exception_common(bool is_print_exception, mp_print_t *prin shared_module_traceback_print_exception(MP_OBJ_TO_PTR(value), print, limit); exc->traceback = trace_backup; + #if MICROPY_CPYTHON_EXCEPTION_CHAIN + exc->context = context_backup; + exc->cause = cause_backup; + #endif } //| def format_exception( @@ -128,14 +142,12 @@ STATIC void traceback_exception_common(bool is_print_exception, mp_print_t *prin //| these lines are concatenated and printed, exactly the same text is //| printed as does print_exception(). //| -//| .. note:: Setting ``chain`` will have no effect as chained exceptions are not yet implemented. -//| //| :param exc: The exception. Must be an instance of `BaseException`. Unused if value is specified. //| :param value: If specified, is used in place of ``exc``. //| :param TracebackType tb: When value is alsp specified, ``tb`` is used in place of the exception's own traceback. If `None`, the traceback will not be printed. //| :param int limit: Print up to limit stack trace entries (starting from the caller’s frame) if limit is positive. //| Otherwise, print the last ``abs(limit)`` entries. If limit is omitted or None, all entries are printed. -//| :param bool chain: If `True` then chained exceptions will be printed (note: not yet implemented). +//| :param bool chain: If `True` then chained exceptions will be printed. //| """ //| STATIC mp_obj_t traceback_format_exception(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { @@ -169,8 +181,6 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_KW(traceback_format_exception_obj, 0, traceback_f //| no traceback will be shown. This is compatible with CPython 3.5 and //| newer. //| -//| .. note:: Setting ``chain`` will have no effect as chained exceptions are not yet implemented. -//| //| :param exc: The exception. Must be an instance of `BaseException`. Unused if value is specified. //| :param value: If specified, is used in place of ``exc``. //| :param tb: When value is alsp specified, ``tb`` is used in place of the exception's own traceback. If `None`, the traceback will not be printed. @@ -178,7 +188,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_KW(traceback_format_exception_obj, 0, traceback_f //| Otherwise, print the last ``abs(limit)`` entries. If limit is omitted or None, all entries are printed. //| :param io.FileIO file: If file is omitted or `None`, the output goes to `sys.stderr`; otherwise it should be an open //| file or file-like object to receive the output. -//| :param bool chain: If `True` then chained exceptions will be printed (note: not yet implemented). +//| :param bool chain: If `True` then chained exceptions will be printed. //| //| """ //| ... diff --git a/shared-bindings/usb_hid/Device.c b/shared-bindings/usb_hid/Device.c index 97196144be..cb88766b3e 100644 --- a/shared-bindings/usb_hid/Device.c +++ b/shared-bindings/usb_hid/Device.c @@ -155,7 +155,7 @@ STATIC mp_obj_t usb_hid_device_make_new(const mp_obj_type_t *type, size_t n_args } if (report_ids_array[0] == 0 && report_ids_count > 1) { - mp_raise_ValueError_varg(translate("%q with a report ID of 0 must be of length 1"), MP_QSTR_report_ids); + mp_raise_ValueError_varg(translate("%q length must be %d"), MP_QSTR_report_id_space_0, 1); } common_hal_usb_hid_device_construct( diff --git a/shared-bindings/vectorio/Circle.c b/shared-bindings/vectorio/Circle.c index 91b0d3ae34..87cd46ad9a 100644 --- a/shared-bindings/vectorio/Circle.c +++ b/shared-bindings/vectorio/Circle.c @@ -109,6 +109,9 @@ MP_PROPERTY_GETSET(vectorio_circle_color_index_obj, //| y: int //| """Y position of the center point of the circle in the parent.""" //| +//| hidden: bool +//| """Hide the circle or not.""" +//| //| location: Tuple[int, int] //| """(X,Y) position of the center point of the circle in the parent.""" //| @@ -123,6 +126,7 @@ STATIC const mp_rom_map_elem_t vectorio_circle_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_radius), MP_ROM_PTR(&vectorio_circle_radius_obj) }, { MP_ROM_QSTR(MP_QSTR_x), MP_ROM_PTR(&vectorio_vector_shape_x_obj) }, { MP_ROM_QSTR(MP_QSTR_y), MP_ROM_PTR(&vectorio_vector_shape_y_obj) }, + { MP_ROM_QSTR(MP_QSTR_hidden), MP_ROM_PTR(&vectorio_vector_shape_hidden_obj) }, { MP_ROM_QSTR(MP_QSTR_color_index), MP_ROM_PTR(&vectorio_circle_color_index_obj) }, { MP_ROM_QSTR(MP_QSTR_location), MP_ROM_PTR(&vectorio_vector_shape_location_obj) }, { MP_ROM_QSTR(MP_QSTR_pixel_shader), MP_ROM_PTR(&vectorio_vector_shape_pixel_shader_obj) }, diff --git a/shared-bindings/vectorio/Polygon.c b/shared-bindings/vectorio/Polygon.c index f4f07c66a0..6ad102e6e6 100644 --- a/shared-bindings/vectorio/Polygon.c +++ b/shared-bindings/vectorio/Polygon.c @@ -118,6 +118,9 @@ MP_PROPERTY_GETSET(vectorio_polygon_color_index_obj, //| y: int //| """Y position of the 0,0 origin in the points list.""" //| +//| hidden: bool +//| """Hide the polygon or not.""" +//| //| location: Tuple[int, int] //| """(X,Y) position of the 0,0 origin in the points list.""" //| @@ -132,6 +135,7 @@ STATIC const mp_rom_map_elem_t vectorio_polygon_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_points), MP_ROM_PTR(&vectorio_polygon_points_obj) }, { MP_ROM_QSTR(MP_QSTR_x), MP_ROM_PTR(&vectorio_vector_shape_x_obj) }, { MP_ROM_QSTR(MP_QSTR_y), MP_ROM_PTR(&vectorio_vector_shape_y_obj) }, + { MP_ROM_QSTR(MP_QSTR_hidden), MP_ROM_PTR(&vectorio_vector_shape_hidden_obj) }, { MP_ROM_QSTR(MP_QSTR_color_index), MP_ROM_PTR(&vectorio_polygon_color_index_obj) }, { MP_ROM_QSTR(MP_QSTR_location), MP_ROM_PTR(&vectorio_vector_shape_location_obj) }, { MP_ROM_QSTR(MP_QSTR_pixel_shader), MP_ROM_PTR(&vectorio_vector_shape_pixel_shader_obj) }, diff --git a/shared-bindings/vectorio/Rectangle.c b/shared-bindings/vectorio/Rectangle.c index 5c163a7693..a4f3e12e69 100644 --- a/shared-bindings/vectorio/Rectangle.c +++ b/shared-bindings/vectorio/Rectangle.c @@ -139,6 +139,9 @@ const mp_obj_property_t vectorio_rectangle_color_index_obj = { //| y: int //| """Y position of the top left corner of the rectangle in the parent.""" //| +//| hidden: bool +//| """Hide the rectangle or not.""" +//| //| location: Tuple[int, int] //| """(X,Y) position of the top left corner of the rectangle in the parent.""" //| @@ -152,6 +155,7 @@ STATIC const mp_rom_map_elem_t vectorio_rectangle_locals_dict_table[] = { // Properties { MP_ROM_QSTR(MP_QSTR_x), MP_ROM_PTR(&vectorio_vector_shape_x_obj) }, { MP_ROM_QSTR(MP_QSTR_y), MP_ROM_PTR(&vectorio_vector_shape_y_obj) }, + { MP_ROM_QSTR(MP_QSTR_hidden), MP_ROM_PTR(&vectorio_vector_shape_hidden_obj) }, { MP_ROM_QSTR(MP_QSTR_color_index), MP_ROM_PTR(&vectorio_rectangle_color_index_obj) }, { MP_ROM_QSTR(MP_QSTR_width), MP_ROM_PTR(&vectorio_rectangle_width_obj) }, { MP_ROM_QSTR(MP_QSTR_height), MP_ROM_PTR(&vectorio_rectangle_height_obj) }, diff --git a/shared-bindings/vectorio/VectorShape.c b/shared-bindings/vectorio/VectorShape.c index ba55cfb851..e5c806b943 100644 --- a/shared-bindings/vectorio/VectorShape.c +++ b/shared-bindings/vectorio/VectorShape.c @@ -181,6 +181,33 @@ MP_PROPERTY_GETSET(vectorio_vector_shape_location_obj, (mp_obj_t)&vectorio_vector_shape_set_location_obj); +// Stub checker does not approve of these shared properties. +// hidden: bool +// """Hide the shape or not.""" +// +STATIC mp_obj_t vectorio_vector_shape_obj_get_hidden(mp_obj_t wrapper_shape) { + // Relies on the fact that only vector_shape impl gets matched with a VectorShape. + const vectorio_draw_protocol_t *draw_protocol = mp_proto_get(MP_QSTR_protocol_draw, wrapper_shape); + vectorio_vector_shape_t *self = MP_OBJ_TO_PTR(draw_protocol->draw_get_protocol_self(wrapper_shape)); + return mp_obj_new_bool(common_hal_vectorio_vector_shape_get_hidden(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(vectorio_vector_shape_get_hidden_obj, vectorio_vector_shape_obj_get_hidden); + +STATIC mp_obj_t vectorio_vector_shape_obj_set_hidden(mp_obj_t wrapper_shape, mp_obj_t hidden_obj) { + // Relies on the fact that only vector_shape impl gets matched with a VectorShape. + const vectorio_draw_protocol_t *draw_protocol = mp_proto_get(MP_QSTR_protocol_draw, wrapper_shape); + vectorio_vector_shape_t *self = MP_OBJ_TO_PTR(draw_protocol->draw_get_protocol_self(wrapper_shape)); + + common_hal_vectorio_vector_shape_set_hidden(self, mp_obj_is_true(hidden_obj)); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(vectorio_vector_shape_set_hidden_obj, vectorio_vector_shape_obj_set_hidden); + +MP_PROPERTY_GETSET(vectorio_vector_shape_hidden_obj, + (mp_obj_t)&vectorio_vector_shape_get_hidden_obj, + (mp_obj_t)&vectorio_vector_shape_set_hidden_obj); + + // pixel_shader: Union[ColorConverter, Palette] // """The pixel shader of the shape.""" // diff --git a/shared-bindings/vectorio/VectorShape.h b/shared-bindings/vectorio/VectorShape.h index 13f62922f3..c94476c25a 100644 --- a/shared-bindings/vectorio/VectorShape.h +++ b/shared-bindings/vectorio/VectorShape.h @@ -31,6 +31,9 @@ void common_hal_vectorio_vector_shape_set_location(vectorio_vector_shape_t *self mp_int_t common_hal_vectorio_vector_shape_get_y(vectorio_vector_shape_t *self); void common_hal_vectorio_vector_shape_set_y(vectorio_vector_shape_t *self, mp_int_t y); +mp_int_t common_hal_vectorio_vector_shape_get_hidden(vectorio_vector_shape_t *self); +void common_hal_vectorio_vector_shape_set_hidden(vectorio_vector_shape_t *self, bool hidden); + mp_obj_t common_hal_vectorio_vector_shape_get_pixel_shader(vectorio_vector_shape_t *self); void common_hal_vectorio_vector_shape_set_pixel_shader(vectorio_vector_shape_t *self, mp_obj_t pixel_shader); @@ -40,6 +43,7 @@ void vectorio_vector_shape_update_transform(vectorio_vector_shape_t *self, displ extern vectorio_draw_protocol_impl_t vectorio_vector_shape_draw_protocol_impl; extern const mp_obj_property_getset_t vectorio_vector_shape_x_obj; extern const mp_obj_property_getset_t vectorio_vector_shape_y_obj; +extern const mp_obj_property_getset_t vectorio_vector_shape_hidden_obj; extern const mp_obj_property_getset_t vectorio_vector_shape_location_obj; extern const mp_obj_property_getset_t vectorio_vector_shape_pixel_shader_obj; extern const mp_obj_fun_builtin_fixed_t vectorio_vector_shape_contains_obj; diff --git a/shared-bindings/wifi/AuthMode.h b/shared-bindings/wifi/AuthMode.h index a1016d6c8a..c514fb2a32 100644 --- a/shared-bindings/wifi/AuthMode.h +++ b/shared-bindings/wifi/AuthMode.h @@ -30,13 +30,13 @@ #include "py/enum.h" typedef enum { - AUTHMODE_OPEN, - AUTHMODE_WEP, - AUTHMODE_WPA, - AUTHMODE_WPA2, - AUTHMODE_WPA3, - AUTHMODE_PSK, - AUTHMODE_ENTERPRISE + AUTHMODE_OPEN = 1 << 0, + AUTHMODE_WEP = 1 << 1, + AUTHMODE_WPA = 1 << 2, + AUTHMODE_WPA2 = 1 << 3, + AUTHMODE_WPA3 = 1 << 4, + AUTHMODE_PSK = 1 << 5, + AUTHMODE_ENTERPRISE = 1 << 6, } wifi_authmode_t; extern const mp_obj_type_t wifi_authmode_type; diff --git a/shared-bindings/wifi/Monitor.c b/shared-bindings/wifi/Monitor.c index bd688d357d..d087ec587b 100644 --- a/shared-bindings/wifi/Monitor.c +++ b/shared-bindings/wifi/Monitor.c @@ -36,15 +36,14 @@ //| """For monitoring WiFi packets.""" //| -//| def __init__(self, channel: Optional[int] = 1, queue: Optional[int] = 128) -> None: -//| """Initialize `wifi.Monitor` singleton. +//| def __init__(self, channel: Optional[int] = 1, queue: Optional[int] = 128) -> None: +//| """Initialize `wifi.Monitor` singleton. //| -//| :param int channel: The WiFi channel to scan. -//| :param int queue: The queue size for buffering the packet. -//| -//| """ -//| ... +//| :param int channel: The WiFi channel to scan. +//| :param int queue: The queue size for buffering the packet. //| +//| """ +//| ... STATIC mp_obj_t wifi_monitor_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { enum { ARG_channel, ARG_queue }; static const mp_arg_t allowed_args[] = { @@ -69,8 +68,8 @@ STATIC mp_obj_t wifi_monitor_make_new(const mp_obj_type_t *type, size_t n_args, return MP_OBJ_FROM_PTR(self); } -//| channel: int -//| """The WiFi channel to scan.""" +//| channel: int +//| """The WiFi channel to scan.""" STATIC mp_obj_t wifi_monitor_obj_get_channel(mp_obj_t self_in) { return common_hal_wifi_monitor_get_channel(self_in); } @@ -90,8 +89,8 @@ MP_PROPERTY_GETSET(wifi_monitor_channel_obj, (mp_obj_t)&wifi_monitor_get_channel_obj, (mp_obj_t)&wifi_monitor_set_channel_obj); -//| queue: int -//| """The queue size for buffering the packet.""" +//| queue: int +//| """The queue size for buffering the packet.""" STATIC mp_obj_t wifi_monitor_obj_get_queue(mp_obj_t self_in) { return common_hal_wifi_monitor_get_queue(self_in); } @@ -100,29 +99,26 @@ MP_DEFINE_CONST_FUN_OBJ_1(wifi_monitor_get_queue_obj, wifi_monitor_obj_get_queue MP_PROPERTY_GETTER(wifi_monitor_queue_obj, (mp_obj_t)&wifi_monitor_get_queue_obj); -//| def deinit(self) -> None: -//| """De-initialize `wifi.Monitor` singleton.""" -//| ... -//| +//| def deinit(self) -> None: +//| """De-initialize `wifi.Monitor` singleton.""" +//| ... STATIC mp_obj_t wifi_monitor_obj_deinit(mp_obj_t self_in) { common_hal_wifi_monitor_deinit(self_in); return mp_const_none; } STATIC MP_DEFINE_CONST_FUN_OBJ_1(wifi_monitor_deinit_obj, wifi_monitor_obj_deinit); -//| def lost(self) -> int: -//| """Returns the packet loss count. The counter resets after each poll.""" -//| ... -//| +//| def lost(self) -> int: +//| """Returns the packet loss count. The counter resets after each poll.""" +//| ... STATIC mp_obj_t wifi_monitor_obj_get_lost(mp_obj_t self_in) { return common_hal_wifi_monitor_get_lost(self_in); } MP_DEFINE_CONST_FUN_OBJ_1(wifi_monitor_lost_obj, wifi_monitor_obj_get_lost); -//| def queued(self) -> int: -//| """Returns the packet queued count.""" -//| ... -//| +//| def queued(self) -> int: +//| """Returns the packet queued count.""" +//| ... STATIC mp_obj_t wifi_monitor_obj_get_queued(mp_obj_t self_in) { if (common_hal_wifi_monitor_deinited()) { return mp_obj_new_int_from_uint(0); @@ -131,9 +127,9 @@ STATIC mp_obj_t wifi_monitor_obj_get_queued(mp_obj_t self_in) { } MP_DEFINE_CONST_FUN_OBJ_1(wifi_monitor_queued_obj, wifi_monitor_obj_get_queued); -//| def packet(self) -> dict: -//| """Returns the monitor packet.""" -//| ... +//| def packet(self) -> dict: +//| """Returns the monitor packet.""" +//| ... //| STATIC mp_obj_t wifi_monitor_obj_get_packet(mp_obj_t self_in) { if (common_hal_wifi_monitor_deinited()) { diff --git a/shared-bindings/wifi/Radio.c b/shared-bindings/wifi/Radio.c index 57e953ec68..27a5907894 100644 --- a/shared-bindings/wifi/Radio.c +++ b/shared-bindings/wifi/Radio.c @@ -139,13 +139,19 @@ MP_PROPERTY_GETSET(wifi_radio_hostname_obj, //| mac_address: ReadableBuffer //| """MAC address for the station. When the address is altered after interface is connected -//| the changes would only be reflected once the interface reconnects.""" -STATIC mp_obj_t wifi_radio_get_mac_address(mp_obj_t self_in) { +//| the changes would only be reflected once the interface reconnects. +//| +//| **Limitations:** Not settable on RP2040 CYW43 boards, such as Pi Pico W. +//| """ + + +STATIC mp_obj_t _wifi_radio_get_mac_address(mp_obj_t self_in) { wifi_radio_obj_t *self = MP_OBJ_TO_PTR(self_in); return MP_OBJ_FROM_PTR(common_hal_wifi_radio_get_mac_address(self)); } -MP_DEFINE_CONST_FUN_OBJ_1(wifi_radio_get_mac_address_obj, wifi_radio_get_mac_address); +MP_DEFINE_CONST_FUN_OBJ_1(wifi_radio_get_mac_address_obj, _wifi_radio_get_mac_address); +#if CIRCUITPY_WIFI_RADIO_SETTABLE_MAC_ADDRESS STATIC mp_obj_t wifi_radio_set_mac_address(mp_obj_t self_in, mp_obj_t mac_address_in) { mp_buffer_info_t mac_address; mp_get_buffer_raise(mac_address_in, &mac_address, MP_BUFFER_READ); @@ -160,10 +166,16 @@ STATIC mp_obj_t wifi_radio_set_mac_address(mp_obj_t self_in, mp_obj_t mac_addres return mp_const_none; } MP_DEFINE_CONST_FUN_OBJ_2(wifi_radio_set_mac_address_obj, wifi_radio_set_mac_address); +#endif +#if CIRCUITPY_WIFI_RADIO_SETTABLE_MAC_ADDRESS MP_PROPERTY_GETSET(wifi_radio_mac_address_obj, (mp_obj_t)&wifi_radio_get_mac_address_obj, (mp_obj_t)&wifi_radio_set_mac_address_obj); +#else +MP_PROPERTY_GETTER(wifi_radio_mac_address_obj, + (mp_obj_t)&wifi_radio_get_mac_address_obj); +#endif //| tx_power: float //| """Wifi transmission power, in dBm.""" @@ -187,13 +199,17 @@ MP_PROPERTY_GETSET(wifi_radio_tx_power_obj, //| mac_address_ap: ReadableBuffer //| """MAC address for the AP. When the address is altered after interface is started -//| the changes would only be reflected once the interface restarts.""" +//| the changes would only be reflected once the interface restarts. +//| +//| **Limitations:** Not settable on RP2040 CYW43 boards, such as Pi Pico W. +//| """ STATIC mp_obj_t wifi_radio_get_mac_address_ap(mp_obj_t self_in) { wifi_radio_obj_t *self = MP_OBJ_TO_PTR(self_in); return MP_OBJ_FROM_PTR(common_hal_wifi_radio_get_mac_address_ap(self)); } MP_DEFINE_CONST_FUN_OBJ_1(wifi_radio_get_mac_address_ap_obj, wifi_radio_get_mac_address_ap); +#if CIRCUITPY_WIFI_RADIO_SETTABLE_MAC_ADDRESS STATIC mp_obj_t wifi_radio_set_mac_address_ap(mp_obj_t self_in, mp_obj_t mac_address_in) { mp_buffer_info_t mac_address; mp_get_buffer_raise(mac_address_in, &mac_address, MP_BUFFER_READ); @@ -208,10 +224,16 @@ STATIC mp_obj_t wifi_radio_set_mac_address_ap(mp_obj_t self_in, mp_obj_t mac_add return mp_const_none; } MP_DEFINE_CONST_FUN_OBJ_2(wifi_radio_set_mac_address_ap_obj, wifi_radio_set_mac_address_ap); +#endif +#if CIRCUITPY_WIFI_RADIO_SETTABLE_MAC_ADDRESS MP_PROPERTY_GETSET(wifi_radio_mac_address_ap_obj, (mp_obj_t)&wifi_radio_get_mac_address_ap_obj, (mp_obj_t)&wifi_radio_set_mac_address_ap_obj); +#else +MP_PROPERTY_GETTER(wifi_radio_mac_address_ap_obj, + (mp_obj_t)&wifi_radio_get_mac_address_ap_obj); +#endif //| def start_scanning_networks( //| self, *, start_channel: int = 1, stop_channel: int = 11 @@ -282,10 +304,10 @@ MP_DEFINE_CONST_FUN_OBJ_1(wifi_radio_stop_station_obj, wifi_radio_stop_station); //| def start_ap( //| self, //| ssid: Union[str | ReadableBuffer], -//| password: Union[str | ReadableBuffer] = "", +//| password: Union[str | ReadableBuffer] = b"", //| *, -//| channel: Optional[int] = 1, -//| authmode: Optional[AuthMode], +//| channel: int = 1, +//| authmode: Optional[AuthMode] = None, //| max_connections: Optional[int] = 4 //| ) -> None: //| """Starts an Access Point with the specified ssid and password. @@ -293,10 +315,11 @@ MP_DEFINE_CONST_FUN_OBJ_1(wifi_radio_stop_station_obj, wifi_radio_stop_station); //| If ``channel`` is given, the access point will use that channel unless //| a station is already operating on a different channel. //| -//| If ``authmode`` is given, the access point will use that Authentication -//| mode. If a password is given, ``authmode`` must not be ``OPEN``. -//| If ``authmode`` isn't given, ``OPEN`` will be used when password isn't provided, -//| otherwise ``WPA_WPA2_PSK``. +//| If ``authmode`` is not None, the access point will use that Authentication +//| mode. If a non-empty password is given, ``authmode`` must not be ``OPEN``. +//| If ``authmode`` is not given or is None, +//| ``OPEN`` will be used when the password is the empty string, +//| otherwise ``authmode`` will be ``WPA_WPA2_PSK``. //| //| If ``max_connections`` is given, the access point will allow up to //| that number of stations to connect.""" @@ -305,9 +328,9 @@ STATIC mp_obj_t wifi_radio_start_ap(size_t n_args, const mp_obj_t *pos_args, mp_ enum { ARG_ssid, ARG_password, ARG_channel, ARG_authmode, ARG_max_connections }; static const mp_arg_t allowed_args[] = { { MP_QSTR_ssid, MP_ARG_REQUIRED | MP_ARG_OBJ }, - { MP_QSTR_password, MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, + { MP_QSTR_password, MP_ARG_OBJ, {.u_obj = mp_const_empty_bytes} }, { MP_QSTR_channel, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 1} }, - { MP_QSTR_authmode, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, + { MP_QSTR_authmode, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none } }, { MP_QSTR_max_connections, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 4} }, }; @@ -315,12 +338,13 @@ STATIC mp_obj_t wifi_radio_start_ap(size_t n_args, const mp_obj_t *pos_args, mp_ 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); - uint8_t authmode = 0; - if (args[ARG_authmode].u_obj != MP_OBJ_NULL) { + // 0 indicates mode wasn't given. + uint32_t authmodes = 0; + if (args[ARG_authmode].u_obj != mp_const_none) { mp_obj_iter_buf_t iter_buf; mp_obj_t item, iterable = mp_getiter(args[ARG_authmode].u_obj, &iter_buf); while ((item = mp_iternext(iterable)) != MP_OBJ_STOP_ITERATION) { - authmode |= (1 << (wifi_authmode_t)cp_enum_value(&wifi_authmode_type, item)); + authmodes |= cp_enum_value(&wifi_authmode_type, item); } } @@ -329,20 +353,24 @@ STATIC mp_obj_t wifi_radio_start_ap(size_t n_args, const mp_obj_t *pos_args, mp_ mp_arg_validate_length_range(ssid.len, 1, 32, MP_QSTR_ssid); mp_buffer_info_t password; - password.len = 0; - if (args[ARG_password].u_obj != MP_OBJ_NULL) { - if (authmode == 1) { - mp_raise_ValueError(translate("AuthMode.OPEN is not used with password")); - } else if (authmode == 0) { - authmode = (1 << AUTHMODE_WPA) | (1 << AUTHMODE_WPA2) | (1 << AUTHMODE_PSK); + mp_get_buffer_raise(args[ARG_password].u_obj, &password, MP_BUFFER_READ); + if (authmodes == 0) { + if (password.len == 0) { + authmodes = AUTHMODE_OPEN; + } else { + authmodes = AUTHMODE_WPA | AUTHMODE_WPA2 | AUTHMODE_PSK; } - mp_get_buffer_raise(args[ARG_password].u_obj, &password, MP_BUFFER_READ); - mp_arg_validate_length_range(password.len, 8, 63, MP_QSTR_password); - } else { - authmode = 1; } - common_hal_wifi_radio_start_ap(self, ssid.buf, ssid.len, password.buf, password.len, args[ARG_channel].u_int, authmode, args[ARG_max_connections].u_int); + if (authmodes == AUTHMODE_OPEN && password.len > 0) { + mp_raise_ValueError(translate("AuthMode.OPEN is not used with password")); + } + + if (authmodes != AUTHMODE_OPEN) { + mp_arg_validate_length_range(password.len, 8, 63, MP_QSTR_password); + } + + common_hal_wifi_radio_start_ap(self, ssid.buf, ssid.len, password.buf, password.len, args[ARG_channel].u_int, authmodes, args[ARG_max_connections].u_int); return mp_const_none; } STATIC MP_DEFINE_CONST_FUN_OBJ_KW(wifi_radio_start_ap_obj, 1, wifi_radio_start_ap); @@ -359,10 +387,10 @@ MP_DEFINE_CONST_FUN_OBJ_1(wifi_radio_stop_ap_obj, wifi_radio_stop_ap); //| def connect( //| self, //| ssid: Union[str | ReadableBuffer], -//| password: Union[str | ReadableBuffer] = "", +//| password: Union[str | ReadableBuffer] = b"", //| *, -//| channel: Optional[int] = 0, -//| bssid: Optional[Union[str | ReadableBuffer]] = "", +//| channel: int = 0, +//| bssid: Optional[Union[str | ReadableBuffer]] = None, //| timeout: Optional[float] = None //| ) -> None: //| """Connects to the given ssid and waits for an ip address. Reconnections are handled @@ -371,20 +399,20 @@ MP_DEFINE_CONST_FUN_OBJ_1(wifi_radio_stop_ap_obj, wifi_radio_stop_ap); //| 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 +//| If ``channel`` is non-zero, 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 +//| If ``bssid`` is given and not None, 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) { enum { ARG_ssid, ARG_password, ARG_channel, ARG_bssid, ARG_timeout }; static const mp_arg_t allowed_args[] = { { MP_QSTR_ssid, MP_ARG_REQUIRED | MP_ARG_OBJ }, - { MP_QSTR_password, MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, + { MP_QSTR_password, MP_ARG_OBJ, {.u_obj = mp_const_empty_bytes} }, { MP_QSTR_channel, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} }, - { MP_QSTR_bssid, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, + { MP_QSTR_bssid, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} }, { MP_QSTR_timeout, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} }, }; @@ -404,9 +432,11 @@ STATIC mp_obj_t wifi_radio_connect(size_t n_args, const mp_obj_t *pos_args, mp_m mp_buffer_info_t password; password.len = 0; - if (args[ARG_password].u_obj != MP_OBJ_NULL) { + if (args[ARG_password].u_obj != mp_const_none) { mp_get_buffer_raise(args[ARG_password].u_obj, &password, MP_BUFFER_READ); - mp_arg_validate_length_range(password.len, 8, 63, MP_QSTR_password); + if (password.len != 0) { + mp_arg_validate_length_range(password.len, 8, 63, MP_QSTR_password); + } } #define MAC_ADDRESS_LENGTH 6 @@ -414,7 +444,7 @@ STATIC mp_obj_t wifi_radio_connect(size_t n_args, const mp_obj_t *pos_args, mp_m mp_buffer_info_t bssid; bssid.len = 0; // Should probably make sure bssid is just bytes and not something else too - if (args[ARG_bssid].u_obj != MP_OBJ_NULL) { + if (args[ARG_bssid].u_obj != mp_const_none) { mp_get_buffer_raise(args[ARG_bssid].u_obj, &bssid, MP_BUFFER_READ); if (bssid.len != MAC_ADDRESS_LENGTH) { mp_raise_ValueError(translate("Invalid BSSID")); diff --git a/shared-bindings/wifi/Radio.h b/shared-bindings/wifi/Radio.h index 370bdbd917..dbaeb9cce8 100644 --- a/shared-bindings/wifi/Radio.h +++ b/shared-bindings/wifi/Radio.h @@ -77,6 +77,8 @@ extern void common_hal_wifi_radio_set_enabled(wifi_radio_obj_t *self, bool enabl extern mp_obj_t common_hal_wifi_radio_get_hostname(wifi_radio_obj_t *self); extern void common_hal_wifi_radio_set_hostname(wifi_radio_obj_t *self, const char *hostname); + +extern void wifi_radio_get_mac_address(wifi_radio_obj_t *self, uint8_t *mac); extern mp_obj_t common_hal_wifi_radio_get_mac_address(wifi_radio_obj_t *self); extern void common_hal_wifi_radio_set_mac_address(wifi_radio_obj_t *self, const uint8_t *mac); extern mp_obj_t common_hal_wifi_radio_get_mac_address_ap(wifi_radio_obj_t *self); @@ -91,7 +93,7 @@ extern void common_hal_wifi_radio_stop_scanning_networks(wifi_radio_obj_t *self) extern void common_hal_wifi_radio_start_station(wifi_radio_obj_t *self); extern void common_hal_wifi_radio_stop_station(wifi_radio_obj_t *self); -extern void common_hal_wifi_radio_start_ap(wifi_radio_obj_t *self, uint8_t *ssid, size_t ssid_len, uint8_t *password, size_t password_len, uint8_t channel, uint8_t authmode, uint8_t max_connections); +extern void common_hal_wifi_radio_start_ap(wifi_radio_obj_t *self, uint8_t *ssid, size_t ssid_len, uint8_t *password, size_t password_len, uint8_t channel, uint32_t authmodes, uint8_t max_connections); extern void common_hal_wifi_radio_stop_ap(wifi_radio_obj_t *self); extern void common_hal_wifi_radio_start_dhcp_client(wifi_radio_obj_t *self); diff --git a/shared-module/_pixelmap/PixelMap.c b/shared-module/_pixelmap/PixelMap.c new file mode 100644 index 0000000000..5eaad0b2f8 --- /dev/null +++ b/shared-module/_pixelmap/PixelMap.c @@ -0,0 +1,174 @@ +/* + * This file is part of the CircuitPython project, https://github.com/adafruit/circuitpython + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Rose Hooper + * Copyright (c) 2022 Jeff Epler 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/smallint.h" +#include "py/runtime.h" + +#include "shared-bindings/_pixelmap/PixelMap.h" +#include "shared-bindings/adafruit_pixelbuf/PixelBuf.h" +#include "shared-module/_pixelmap/PixelMap.h" + + +static void pixelmap_set_pixel_rgbw(pixelmap_pixelmap_obj_t *self, size_t i, color_u rgbw) { + mp_arg_validate_index_range(i, 0, self->len - 1, MP_QSTR_index); + + mp_obj_t item = self->items[i]; + if (mp_obj_is_small_int(item)) { + common_hal_adafruit_pixelbuf_pixelbuf_set_pixel_color(self->pixelbuf, MP_OBJ_SMALL_INT_VALUE(item), rgbw.r, rgbw.g, rgbw.b, rgbw.w); + } else { + size_t len; + mp_obj_t *items; + mp_obj_tuple_get(item, &len, &items); + + for (size_t j = 0; j < len; j++) { + common_hal_adafruit_pixelbuf_pixelbuf_set_pixel_color(self->pixelbuf, MP_OBJ_SMALL_INT_VALUE(items[j]), rgbw.r, rgbw.g, rgbw.b, rgbw.w); + } + } +} + +static void pixelmap_set_pixel(pixelmap_pixelmap_obj_t *self, size_t i, mp_obj_t color) { + color_u rgbw; + common_hal_adafruit_pixelbuf_pixelbuf_parse_color(self->pixelbuf, color, &rgbw.r, &rgbw.g, &rgbw.b, &rgbw.w); + pixelmap_set_pixel_rgbw(self, i, rgbw); +} + +void shared_module_pixelmap_pixelmap_construct(pixelmap_pixelmap_obj_t *self, mp_obj_t pixelbuf, mp_obj_t indices) { + self->pixelbuf = pixelbuf; + self->indices = indices; + mp_obj_tuple_get(indices, &self->len, &self->items); +} + +static bool auto_write_get_and_clear(pixelmap_pixelmap_obj_t *self) { + bool auto_write = self->auto_write && common_hal_adafruit_pixelbuf_pixelbuf_get_auto_write(self->pixelbuf); + if (auto_write) { + common_hal_adafruit_pixelbuf_pixelbuf_set_auto_write(self->pixelbuf, false); + } + return auto_write; +} + +static void auto_write_reapply(pixelmap_pixelmap_obj_t *self, bool auto_write) { + if (auto_write) { + common_hal_adafruit_pixelbuf_pixelbuf_set_auto_write(self->pixelbuf, true); + common_hal_adafruit_pixelbuf_pixelbuf_show(self->pixelbuf); + } +} + +bool shared_module_pixelmap_pixelmap_auto_write_get(pixelmap_pixelmap_obj_t *self) { + return self->auto_write; +} + +void shared_module_pixelmap_pixelmap_auto_write_set(pixelmap_pixelmap_obj_t *self, bool auto_write) { + self->auto_write = auto_write; +} + +void shared_module_pixelmap_pixelmap_fill(pixelmap_pixelmap_obj_t *self, const mp_obj_t color) { + color_u rgbw; + common_hal_adafruit_pixelbuf_pixelbuf_parse_color(self->pixelbuf, color, &rgbw.r, &rgbw.g, &rgbw.b, &rgbw.w); + bool auto_write = auto_write_get_and_clear(self); + + for (size_t i = 0; i < self->len; i++) { + pixelmap_set_pixel_rgbw(self, i, rgbw); + } + + auto_write_reapply(self, auto_write); +} + +mp_obj_t shared_module_pixelmap_pixelmap_indices(pixelmap_pixelmap_obj_t *self, int index) { + mp_arg_validate_index_range(index, 0, self->len - 1, MP_QSTR_index); + + mp_obj_t item = self->items[index]; + if (mp_obj_is_small_int(item)) { + return mp_obj_new_tuple(1, &item); + } else { + return item; + } +} + +#if MICROPY_PY_BUILTINS_SLICE + +mp_obj_t shared_module_pixelmap_pixelmap_getslice(pixelmap_pixelmap_obj_t *self, mp_bound_slice_t slice, size_t slice_len) { + mp_obj_tuple_t *t = MP_OBJ_TO_PTR(mp_obj_new_tuple(slice_len, NULL)); + for (uint i = 0; i < slice_len; i++) { + t->items[i] = shared_module_pixelmap_pixelmap_getitem(self, i * slice.step + slice.start); + } + return MP_OBJ_FROM_PTR(t); +} + +void shared_module_pixelmap_pixelmap_setslice(pixelmap_pixelmap_obj_t *self, const mp_obj_t values, mp_bound_slice_t slice, size_t slice_len) { + size_t num_items = mp_obj_get_int(mp_obj_len(values)); + if (num_items != slice_len) { + mp_raise_ValueError_varg(translate("Unmatched number of items on RHS (expected %d, got %d)."), slice_len, num_items); + } + + bool auto_write = auto_write_get_and_clear(self); + + // because we didn't preflight the pixel values, an exception could occur. + // In that case we need to do the auto-write of any pixels that were set + // before re-raising the exception + nlr_buf_t nlr; + + size_t start = slice.start; + mp_int_t step = slice.step; + + if (nlr_push(&nlr) == 0) { + mp_obj_iter_buf_t iter_buf; + mp_obj_t iterable = mp_getiter(values, &iter_buf); + mp_obj_t item; + while ((item = mp_iternext(iterable)) != MP_OBJ_STOP_ITERATION) { + pixelmap_set_pixel(self, start, item); + start += step; + } + nlr_pop(); + auto_write_reapply(self, auto_write); + } else { + auto_write_reapply(self, auto_write); + // exception converting color value, re-raise + nlr_raise(MP_OBJ_FROM_PTR(nlr.ret_val)); + } +} +#endif + +void shared_module_pixelmap_pixelmap_setitem(pixelmap_pixelmap_obj_t *self, mp_int_t i, mp_obj_t color) { + color_u rgbw; + common_hal_adafruit_pixelbuf_pixelbuf_parse_color(self->pixelbuf, color, &rgbw.r, &rgbw.g, &rgbw.b, &rgbw.w); + bool auto_write = auto_write_get_and_clear(self); + pixelmap_set_pixel_rgbw(self, i, rgbw); + auto_write_reapply(self, auto_write); +} + +mp_obj_t shared_module_pixelmap_pixelmap_getitem(pixelmap_pixelmap_obj_t *self, mp_int_t i) { + mp_arg_validate_index_range(i, 0, self->len - 1, MP_QSTR_index); + mp_obj_t item = self->items[i]; + if (mp_obj_is_small_int(item)) { + return common_hal_adafruit_pixelbuf_pixelbuf_get_pixel(self->pixelbuf, MP_OBJ_SMALL_INT_VALUE(item)); + } else { + size_t len; + mp_obj_t *items; + mp_obj_tuple_get(item, &len, &items); + return common_hal_adafruit_pixelbuf_pixelbuf_get_pixel(self->pixelbuf, MP_OBJ_SMALL_INT_VALUE(items[0])); + } +} diff --git a/shared-module/_pixelmap/PixelMap.h b/shared-module/_pixelmap/PixelMap.h new file mode 100644 index 0000000000..192d6a4f9c --- /dev/null +++ b/shared-module/_pixelmap/PixelMap.h @@ -0,0 +1,39 @@ +/* + * This file is part of the CircuitPython project, https://github.com/adafruit/circuitpython + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Rose Hooper + * Copyright (c) 2022 Jeff Epler 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 + +#include "shared-module/adafruit_pixelbuf/PixelBuf.h" + +typedef struct _pixelmap_pixelmap_obj { + mp_obj_base_t base; + mp_obj_t pixelbuf; + mp_obj_t indices; + size_t len; + mp_obj_t *items; + bool auto_write; +} pixelmap_pixelmap_obj_t; diff --git a/shared-module/_pixelmap/__init__.c b/shared-module/_pixelmap/__init__.c new file mode 100644 index 0000000000..e69de29bb2 diff --git a/shared-module/adafruit_pixelbuf/PixelBuf.c b/shared-module/adafruit_pixelbuf/PixelBuf.c index cab97feace..ca8f1c05b0 100644 --- a/shared-module/adafruit_pixelbuf/PixelBuf.c +++ b/shared-module/adafruit_pixelbuf/PixelBuf.c @@ -143,8 +143,10 @@ void common_hal_adafruit_pixelbuf_pixelbuf_set_brightness(mp_obj_t self_in, mp_f STATIC uint8_t _pixelbuf_get_as_uint8(mp_obj_t obj) { if (mp_obj_is_small_int(obj)) { return MP_OBJ_SMALL_INT_VALUE(obj); + #if MICROPY_LONGINT_IMPL != MICROPY_LONGINT_IMPL_NONE } else if (mp_obj_is_int(obj)) { return mp_obj_get_int_truncated(obj); + #endif } else if (mp_obj_is_float(obj)) { return (uint8_t)mp_obj_get_float(obj); } @@ -152,7 +154,7 @@ STATIC uint8_t _pixelbuf_get_as_uint8(mp_obj_t obj) { translate("can't convert %q to %q"), mp_obj_get_type_qstr(obj), MP_QSTR_int); } -STATIC void _pixelbuf_parse_color(pixelbuf_pixelbuf_obj_t *self, mp_obj_t color, uint8_t *r, uint8_t *g, uint8_t *b, uint8_t *w) { +static void pixelbuf_parse_color(pixelbuf_pixelbuf_obj_t *self, mp_obj_t color, uint8_t *r, uint8_t *g, uint8_t *b, uint8_t *w) { pixelbuf_byteorder_details_t *byteorder = &self->byteorder; // w is shared between white in NeoPixels and brightness in dotstars (so that DotStars can have // per-pixel brightness). Set the defaults here in case it isn't set below. @@ -195,7 +197,12 @@ STATIC void _pixelbuf_parse_color(pixelbuf_pixelbuf_obj_t *self, mp_obj_t color, } } -STATIC void _pixelbuf_set_pixel_color(pixelbuf_pixelbuf_obj_t *self, size_t index, uint8_t r, uint8_t g, uint8_t b, uint8_t w) { +void common_hal_adafruit_pixelbuf_pixelbuf_parse_color(mp_obj_t self_in, mp_obj_t color, uint8_t *r, uint8_t *g, uint8_t *b, uint8_t *w) { + pixelbuf_pixelbuf_obj_t *self = native_pixelbuf(self_in); + pixelbuf_parse_color(self, color, r, g, b, w); +} + +static void pixelbuf_set_pixel_color(pixelbuf_pixelbuf_obj_t *self, size_t index, uint8_t r, uint8_t g, uint8_t b, uint8_t w) { // DotStars don't have white, instead they have 5 bit brightness so pack it into w. Shift right // by three to leave the top five bits. if (self->bytes_per_pixel == 4 && self->byteorder.is_dotstar) { @@ -232,14 +239,18 @@ STATIC void _pixelbuf_set_pixel_color(pixelbuf_pixelbuf_obj_t *self, size_t inde scaled_buffer[rgbw_order->b] = (b * self->scaled_brightness) / 256; } } +void common_hal_adafruit_pixelbuf_pixelbuf_set_pixel_color(mp_obj_t self_in, size_t index, uint8_t r, uint8_t g, uint8_t b, uint8_t w) { + pixelbuf_pixelbuf_obj_t *self = native_pixelbuf(self_in); + pixelbuf_set_pixel_color(self, index, r, g, b, w); +} STATIC void _pixelbuf_set_pixel(pixelbuf_pixelbuf_obj_t *self, size_t index, mp_obj_t value) { uint8_t r; uint8_t g; uint8_t b; uint8_t w; - _pixelbuf_parse_color(self, value, &r, &g, &b, &w); - _pixelbuf_set_pixel_color(self, index, r, g, b, w); + common_hal_adafruit_pixelbuf_pixelbuf_parse_color(self, value, &r, &g, &b, &w); + common_hal_adafruit_pixelbuf_pixelbuf_set_pixel_color(self, index, r, g, b, w); } void common_hal_adafruit_pixelbuf_pixelbuf_set_pixels(mp_obj_t self_in, size_t start, mp_int_t step, size_t slice_len, mp_obj_t *values, @@ -322,10 +333,10 @@ void common_hal_adafruit_pixelbuf_pixelbuf_fill(mp_obj_t self_in, mp_obj_t fill_ uint8_t g; uint8_t b; uint8_t w; - _pixelbuf_parse_color(self, fill_color, &r, &g, &b, &w); + common_hal_adafruit_pixelbuf_pixelbuf_parse_color(self, fill_color, &r, &g, &b, &w); for (size_t i = 0; i < self->pixel_count; i++) { - _pixelbuf_set_pixel_color(self, i, r, g, b, w); + common_hal_adafruit_pixelbuf_pixelbuf_set_pixel_color(self, i, r, g, b, w); } if (self->auto_write) { common_hal_adafruit_pixelbuf_pixelbuf_show(self_in); diff --git a/shared-module/adafruit_pixelbuf/PixelBuf.h b/shared-module/adafruit_pixelbuf/PixelBuf.h index b526254f29..a4a753baa0 100644 --- a/shared-module/adafruit_pixelbuf/PixelBuf.h +++ b/shared-module/adafruit_pixelbuf/PixelBuf.h @@ -24,13 +24,11 @@ * THE SOFTWARE. */ +#pragma once #include "py/obj.h" #include "py/objarray.h" -#ifndef PIXELBUF_SHARED_MODULE_H -#define PIXELBUF_SHARED_MODULE_H - typedef struct { uint8_t r; uint8_t g; @@ -68,5 +66,3 @@ typedef struct { #define DOTSTAR_LED_START 0b11100000 #define DOTSTAR_LED_START_FULL_BRIGHT 0xFF - -#endif diff --git a/shared-module/bitmaptools/__init__.c b/shared-module/bitmaptools/__init__.c index 4c73d8fb8e..67b5254b32 100644 --- a/shared-module/bitmaptools/__init__.c +++ b/shared-module/bitmaptools/__init__.c @@ -689,7 +689,7 @@ STATIC void fill_row(displayio_bitmap_t *bitmap, int swap, int16_t *luminance_da static void write_pixels(displayio_bitmap_t *bitmap, int y, bool *data) { if (bitmap->bits_per_value == 1) { uint32_t *pixel_data = (uint32_t *)(bitmap->data + bitmap->stride * y); - for (int i = 0; i < bitmap->stride; i++) { + for (int i = 0; i < bitmap->width; i++) { uint32_t p = 0; for (int j = 0; j < 32; j++) { p = (p << 1); diff --git a/shared-module/displayio/Bitmap.c b/shared-module/displayio/Bitmap.c index 676aec2186..6c64830dce 100644 --- a/shared-module/displayio/Bitmap.c +++ b/shared-module/displayio/Bitmap.c @@ -30,12 +30,12 @@ #include "py/runtime.h" -enum { align_bits = 8 * sizeof(uint32_t) }; +enum { ALIGN_BITS = 8 * sizeof(uint32_t) }; static int stride(uint32_t width, uint32_t bits_per_value) { uint32_t row_width = width * bits_per_value; // align to uint32_t - return (row_width + align_bits - 1) / align_bits; + return (row_width + ALIGN_BITS - 1) / ALIGN_BITS; } void common_hal_displayio_bitmap_construct(displayio_bitmap_t *self, uint32_t width, @@ -66,12 +66,12 @@ void common_hal_displayio_bitmap_construct_from_buffer(displayio_bitmap_t *self, self->x_shift = 0; // Used to divide the index by the number of pixels per word. Its used in a // shift which effectively divides by 2 ** x_shift. uint32_t power_of_two = 1; - while (power_of_two < align_bits / bits_per_value) { + while (power_of_two < ALIGN_BITS / bits_per_value) { self->x_shift++; power_of_two <<= 1; } - self->x_mask = (1 << self->x_shift) - 1; // Used as a modulus on the x value - self->bitmask = (1 << bits_per_value) - 1; + self->x_mask = (1u << self->x_shift) - 1u; // Used as a modulus on the x value + self->bitmask = (1u << bits_per_value) - 1u; self->dirty_area.x1 = 0; self->dirty_area.x2 = width; @@ -117,7 +117,7 @@ uint32_t common_hal_displayio_bitmap_get_pixel(displayio_bitmap_t *self, int16_t void displayio_bitmap_set_dirty_area(displayio_bitmap_t *self, const displayio_area_t *dirty_area) { if (self->read_only) { - mp_raise_RuntimeError(translate("Read-only object")); + mp_raise_RuntimeError(translate("Read-only")); } displayio_area_t area = *dirty_area; diff --git a/shared-module/displayio/Display.c b/shared-module/displayio/Display.c index 9fd55fe19d..8367e23b59 100644 --- a/shared-module/displayio/Display.c +++ b/shared-module/displayio/Display.c @@ -136,12 +136,15 @@ void common_hal_displayio_display_construct(displayio_display_obj_t *self, // Set the group after initialization otherwise we may send pixels while we delay in // initialization. - common_hal_displayio_display_show(self, &circuitpython_splash); + common_hal_displayio_display_set_root_group(self, &circuitpython_splash); common_hal_displayio_display_set_auto_refresh(self, auto_refresh); } bool common_hal_displayio_display_show(displayio_display_obj_t *self, displayio_group_t *root_group) { - return displayio_display_core_show(&self->core, root_group); + if (root_group == NULL) { + root_group = &circuitpython_splash; + } + return displayio_display_core_set_root_group(&self->core, root_group); } uint16_t common_hal_displayio_display_get_width(displayio_display_obj_t *self) { @@ -206,6 +209,9 @@ mp_obj_t common_hal_displayio_display_get_bus(displayio_display_obj_t *self) { } mp_obj_t common_hal_displayio_display_get_root_group(displayio_display_obj_t *self) { + if (self->core.current_group == NULL) { + return mp_const_none; + } return self->core.current_group; } @@ -398,6 +404,14 @@ void common_hal_displayio_display_set_auto_refresh(displayio_display_obj_t *self self->auto_refresh = auto_refresh; } +mp_obj_t common_hal_displayio_display_set_root_group(displayio_display_obj_t *self, displayio_group_t *root_group) { + bool ok = displayio_display_core_set_root_group(&self->core, root_group); + if (!ok) { + mp_raise_ValueError(translate("Group already used")); + } + return mp_const_none; +} + void displayio_display_background(displayio_display_obj_t *self) { if (self->auto_refresh && (supervisor_ticks_ms64() - self->core.last_refresh) > self->native_ms_per_frame) { _refresh_display(self); @@ -421,7 +435,10 @@ void release_display(displayio_display_obj_t *self) { void reset_display(displayio_display_obj_t *self) { common_hal_displayio_display_set_auto_refresh(self, true); - common_hal_displayio_display_show(self, NULL); + circuitpython_splash.x = 0; // reset position in case someone moved it. + circuitpython_splash.y = 0; + supervisor_start_terminal(self->core.width, self->core.height); + common_hal_displayio_display_set_root_group(self, &circuitpython_splash); } void displayio_display_collect_ptrs(displayio_display_obj_t *self) { diff --git a/shared-module/displayio/Display.h b/shared-module/displayio/Display.h index f513a9d462..c60adc482f 100644 --- a/shared-module/displayio/Display.h +++ b/shared-module/displayio/Display.h @@ -64,7 +64,6 @@ typedef struct { void displayio_display_background(displayio_display_obj_t *self); void release_display(displayio_display_obj_t *self); void reset_display(displayio_display_obj_t *self); - void displayio_display_collect_ptrs(displayio_display_obj_t *self); #endif // MICROPY_INCLUDED_SHARED_MODULE_DISPLAYIO_DISPLAY_H diff --git a/shared-module/displayio/EPaperDisplay.c b/shared-module/displayio/EPaperDisplay.c index 0010d88d12..d876599650 100644 --- a/shared-module/displayio/EPaperDisplay.c +++ b/shared-module/displayio/EPaperDisplay.c @@ -103,7 +103,14 @@ void common_hal_displayio_epaperdisplay_construct(displayio_epaperdisplay_obj_t } bool common_hal_displayio_epaperdisplay_show(displayio_epaperdisplay_obj_t *self, displayio_group_t *root_group) { - return displayio_display_core_show(&self->core, root_group); + if (root_group == NULL) { + root_group = &circuitpython_splash; + } + return displayio_display_core_set_root_group(&self->core, root_group); +} + +bool common_hal_displayio_epaperdisplay_set_root_group(displayio_epaperdisplay_obj_t *self, displayio_group_t *root_group) { + return displayio_display_core_set_root_group(&self->core, root_group); } STATIC const displayio_area_t *displayio_epaperdisplay_get_refresh_areas(displayio_epaperdisplay_obj_t *self) { @@ -239,6 +246,12 @@ uint16_t common_hal_displayio_epaperdisplay_get_rotation(displayio_epaperdisplay return self->core.rotation; } +mp_obj_t common_hal_displayio_epaperdisplay_get_root_group(displayio_epaperdisplay_obj_t *self) { + if (self->core.current_group == NULL) { + return mp_const_none; + } + return self->core.current_group; +} STATIC 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/Group.c b/shared-module/displayio/Group.c index ad45852379..7eec72404f 100644 --- a/shared-module/displayio/Group.c +++ b/shared-module/displayio/Group.c @@ -310,6 +310,7 @@ static void _remove_layer(displayio_group_t *self, size_t index) { self->members->items[index], &displayio_tilegrid_type); if (layer != MP_OBJ_NULL) { displayio_tilegrid_t *tilegrid = layer; + tilegrid->in_group = false; rendered_last_frame = displayio_tilegrid_get_previous_area(tilegrid, &layer_area); displayio_tilegrid_update_transform(tilegrid, NULL); } @@ -317,6 +318,7 @@ static void _remove_layer(displayio_group_t *self, size_t index) { self->members->items[index], &displayio_group_type); if (layer != MP_OBJ_NULL) { displayio_group_t *group = layer; + group->in_group = false; rendered_last_frame = displayio_group_get_previous_area(group, &layer_area); displayio_group_update_transform(group, NULL); } diff --git a/shared-module/displayio/display_core.c b/shared-module/displayio/display_core.c index 8b2f0bfdf8..c21d87316d 100644 --- a/shared-module/displayio/display_core.c +++ b/shared-module/displayio/display_core.c @@ -162,17 +162,10 @@ void displayio_display_core_set_rotation(displayio_display_core_t *self, } } -bool displayio_display_core_show(displayio_display_core_t *self, displayio_group_t *root_group) { +bool displayio_display_core_set_root_group(displayio_display_core_t *self, displayio_group_t *root_group) { - if (root_group == NULL) { // set the display to the REPL, reset REPL position and size - circuitpython_splash.in_group = false; - // force the circuit_python_splash out of any group (Note: could cause problems with the parent group) - circuitpython_splash.x = 0; // reset position in case someone moved it. - circuitpython_splash.y = 0; - - supervisor_start_terminal(self->width, self->height); - - root_group = &circuitpython_splash; + if (root_group == NULL) { + // Show nothing on the display } if (root_group == self->current_group) { return true; @@ -366,7 +359,10 @@ void displayio_display_core_collect_ptrs(displayio_display_core_t *self) { } bool displayio_display_core_fill_area(displayio_display_core_t *self, displayio_area_t *area, uint32_t *mask, uint32_t *buffer) { - return displayio_group_fill_area(self->current_group, &self->colorspace, area, mask, buffer); + if (self->current_group != NULL) { + return displayio_group_fill_area(self->current_group,&self->colorspace, area, mask, buffer); + } + return false; } bool displayio_display_core_clip_area(displayio_display_core_t *self, const displayio_area_t *area, displayio_area_t *clipped) { diff --git a/shared-module/displayio/display_core.h b/shared-module/displayio/display_core.h index 8c2ba21b5e..2167683a0d 100644 --- a/shared-module/displayio/display_core.h +++ b/shared-module/displayio/display_core.h @@ -61,7 +61,7 @@ void displayio_display_core_construct(displayio_display_core_t *self, mp_obj_t bus, uint16_t width, uint16_t height, uint16_t ram_width, uint16_t ram_height, int16_t colstart, int16_t rowstart, uint16_t rotation, uint16_t color_depth, bool grayscale, bool pixels_in_byte_share_row, uint8_t bytes_per_cell, bool reverse_pixels_in_byte, bool reverse_bytes_in_word); -bool displayio_display_core_show(displayio_display_core_t *self, displayio_group_t *root_group); +bool displayio_display_core_set_root_group(displayio_display_core_t *self, displayio_group_t *root_group); uint16_t displayio_display_core_get_width(displayio_display_core_t *self); uint16_t displayio_display_core_get_height(displayio_display_core_t *self); diff --git a/shared-module/dotenv/__init__.c b/shared-module/dotenv/__init__.c deleted file mode 100644 index ead7c6561b..0000000000 --- a/shared-module/dotenv/__init__.c +++ /dev/null @@ -1,312 +0,0 @@ -/* - * This file is part of the Micro Python project, http://micropython.org/ - * - * The MIT License (MIT) - * - * SPDX-FileCopyrightText: Copyright (c) 2022 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 -#include - -#include "shared-bindings/dotenv/__init__.h" - -#include "py/misc.h" -#include "py/mpstate.h" -#include "py/objstr.h" -#include "supervisor/filesystem.h" - -#if defined(UNIX) -typedef FILE *file_arg; -STATIC bool open_file(const char *name, file_arg *active_file) { - FILE *result = fopen(name, "r"); - if (result) { - *active_file = result; - } - return result != NULL; -} -STATIC void close_file(file_arg *active_file) { - fclose(*active_file); -} -STATIC uint8_t get_next_character(file_arg *active_file) { - int value = fgetc(*active_file); - if (value == EOF) { - return 0; - } - return value; -} -STATIC void seek_minus_one(file_arg *active_file) { - fseek(*active_file, -1, SEEK_CUR); -} -#else -#include "extmod/vfs.h" -#include "extmod/vfs_fat.h" -typedef FIL file_arg; -STATIC bool open_file(const char *name, file_arg *active_file) { - FATFS *fs = filesystem_circuitpy(); - FRESULT result = f_open(fs, active_file, name, FA_READ); - return result == FR_OK; -} -STATIC void close_file(file_arg *active_file) { - // nothing -} - -// Return 0 if there is no next character (EOF). -STATIC uint8_t get_next_character(FIL *active_file) { - uint8_t character = 0; - UINT quantity_read; - // If there's an error or quantity_read is 0, character will remain 0. - f_read(active_file, &character, 1, &quantity_read); - return character; -} -STATIC void seek_minus_one(file_arg *active_file) { - f_lseek(active_file, f_tell(active_file) - 1); -} -#endif - -// Discard whitespace, except for newlines, returning the next character after the whitespace. -// Return 0 if there is no next character (EOF). -STATIC uint8_t consume_whitespace(file_arg *active_file) { - uint8_t character; - do { - character = get_next_character(active_file); - } while (character != '\n' && character != 0 && unichar_isspace(character)); - return character; -} - -// Starting at the start of a new line, determines if the key matches the given -// key. File pointer is set to be just before the = after the key. -STATIC bool key_matches(file_arg *active_file, const char *key) { - uint8_t character; - character = consume_whitespace(active_file); - if (character == 0) { - return false; - } - bool quoted = false; - if (character == '\'') { - // Beginning of single-quoted string. - quoted = true; - character = get_next_character(active_file); - } - size_t key_pos = 0; - bool escaped = false; - bool matches = true; - size_t key_len = strlen(key); - while (character != 0) { - if (character == '\\' && !escaped && quoted) { - escaped = true; - } else if (!escaped && quoted && character == '\'') { - quoted = false; - // End of quoted key. Skip over the ending quote. - character = get_next_character(active_file); - break; - } else if (!quoted && (unichar_isspace(character) || character == '=' || character == '\n' || character == '#' || character == 0)) { - // End of unquoted key. - break; - } else { - // Still on tentative key; see if it matches the next supplied key character, - // but don't run off the end of the supplied key. - if (key_pos < key_len) { - matches = matches && (unsigned char)key[key_pos] == character; - escaped = false; - key_pos++; - } else { - // Key on line is too long. - matches = false; - } - } - character = get_next_character(active_file); - } - if (character == '=' || character == '\n' || character == '#' || character == 0) { - // Rewind one so the value, if any, can be found. - seek_minus_one(active_file); - } else if (!unichar_isspace(character)) { - // We're followed by something else that is invalid syntax. - matches = false; - } - - return matches && key_pos == key_len; -} - -STATIC bool next_line(file_arg *active_file) { - uint8_t character; - bool quoted = false; - bool escaped = false; - // Track comments because they last until the end of the line. - bool comment = false; - // Consume all characters while quoted or others up to \n. - do { - character = get_next_character(active_file); - - if ((!quoted || character == '#') || comment) { - // Comments consume any escaping. - comment = true; - } else if (!escaped) { - if (character == '\'') { - quoted = !quoted; - } else if (character == '\\') { - escaped = true; - } - } else { - escaped = false; - } - } while (character != 0 && (quoted || character != '\n')); - - return character != 0; -} - -STATIC mp_int_t read_value(file_arg *active_file, char *value, size_t value_len) { - uint8_t character; - // Consume spaces before "=", and get first character of interest. - character = consume_whitespace(active_file); - if (character != '=') { - if (character == '#' || character == '\n') { - // Keys without an = after them are valid with the value None. - return -1; - } - // All other characters are invalid. - return -1; - } - // Consume space after = - if (character != '#') { - // a # immediately after = is part of the value! - character = consume_whitespace(active_file); - } - bool quoted = false; - if (character == '\'') { - quoted = true; - character = get_next_character(active_file); - } - if (character == '"') { - // We don't support double quoted values. - return -1; - } - // Copy the value over. - size_t value_pos = 0; - bool escaped = false; - // Count trailing spaces so we can ignore them at the end of unquoted - // values. - size_t trailing_spaces = 0; - bool first_char = true; - while (character != 0) { - // Consume the first \ if the value is quoted. - if (quoted && character == '\\' && !escaped) { - escaped = true; - // Drop this backslash by short circuiting the rest of the loop. - character = get_next_character(active_file); - continue; - } - if (quoted && !escaped && character == '\'') { - // trailing ' means the value is done. - break; - } - // Unquoted values are ended by a newline or comment. - if (!quoted && (character == '\n' || (character == '#' && !first_char))) { - if (character == '\n') { - // Rewind one so the next_line can find the \n. - seek_minus_one(active_file); - } - break; - } - if (!quoted && unichar_isspace(character)) { - trailing_spaces += 1; - } else { - trailing_spaces = 0; - } - escaped = false; - // Only copy the value over if we have space. Otherwise, we'll just - // count the overall length. - if (value_pos < value_len) { - value[value_pos] = character; - } - value_pos++; - character = get_next_character(active_file); - first_char = false; - } - - return value_pos - trailing_spaces; -} - -mp_int_t dotenv_get_key(const char *path, const char *key, char *value, mp_int_t value_len) { - file_arg active_file; - if (!open_file(path, &active_file)) { - return -1; - } - - mp_int_t actual_value_len = -1; - bool read_ok = true; - while (read_ok) { - if (key_matches(&active_file, key)) { - actual_value_len = read_value(&active_file, value, value_len); - } - - read_ok = next_line(&active_file); - } - close_file(&active_file); - return actual_value_len; -} - -mp_obj_t common_hal_dotenv_get_key(const char *path, const char *key) { - // Use the stack for short values. Longer values will require a heap allocation after we know - // the length. - char value[64]; - mp_int_t actual_len = dotenv_get_key(path, key, value, sizeof(value)); - if (actual_len < 0) { - return mp_const_none; - } - if ((size_t)actual_len >= sizeof(value)) { - byte *buf = m_new(byte, actual_len + 1); - dotenv_get_key(path, key, (char *)buf, actual_len); - buf[actual_len] = 0; - - mp_obj_str_t *o = m_new_obj(mp_obj_str_t); - o->base.type = &mp_type_str; - o->len = actual_len; - o->data = buf; - o->hash = qstr_compute_hash(buf, actual_len); - - return MP_OBJ_FROM_PTR(o); - } - return mp_obj_new_str(value, actual_len); -} - -bool dotenv_get_key_terminated(const char *path, const char *key, char *value, mp_int_t value_len) { - mp_int_t actual_len = dotenv_get_key(path, key, value, value_len - 1); - if (actual_len >= value_len) { - return false; - } - value[actual_len] = '\0'; // terminate string - return true; -} - -bool dotenv_get_key_int(const char *path, const char *key, mp_int_t *value) { - char buf[16]; - if (!dotenv_get_key_terminated(path, key, buf, (mp_int_t)sizeof(buf))) { - return false; - } - char *end; - long result = strtol(buf, &end, 0); - if (end == buf || *end) { // If the whole buffer was not consumed it's an error - return false; - } - *value = (mp_int_t)result; - return true; -} diff --git a/shared-module/framebufferio/FramebufferDisplay.c b/shared-module/framebufferio/FramebufferDisplay.c index e2e7d11106..3d66370c04 100644 --- a/shared-module/framebufferio/FramebufferDisplay.c +++ b/shared-module/framebufferio/FramebufferDisplay.c @@ -102,7 +102,10 @@ void common_hal_framebufferio_framebufferdisplay_construct(framebufferio_framebu } bool common_hal_framebufferio_framebufferdisplay_show(framebufferio_framebufferdisplay_obj_t *self, displayio_group_t *root_group) { - return displayio_display_core_show(&self->core, root_group); + if (root_group == NULL) { + root_group = &circuitpython_splash; + } + return displayio_display_core_set_root_group(&self->core, root_group); } uint16_t common_hal_framebufferio_framebufferdisplay_get_width(framebufferio_framebufferdisplay_obj_t *self) { @@ -360,5 +363,16 @@ void framebufferio_framebufferdisplay_reset(framebufferio_framebufferdisplay_obj } mp_obj_t common_hal_framebufferio_framebufferdisplay_get_root_group(framebufferio_framebufferdisplay_obj_t *self) { + if (self->core.current_group == NULL) { + return mp_const_none; + } return self->core.current_group; } + +mp_obj_t common_hal_framebufferio_framebufferdisplay_set_root_group(framebufferio_framebufferdisplay_obj_t *self, displayio_group_t *root_group) { + bool ok = displayio_display_core_set_root_group(&self->core, root_group); + if (!ok) { + mp_raise_ValueError(translate("Group already used")); + } + return mp_const_none; +} diff --git a/shared-module/os/__init__.c b/shared-module/os/__init__.c index 200fcb2f61..4a4c02e636 100644 --- a/shared-module/os/__init__.c +++ b/shared-module/os/__init__.c @@ -36,10 +36,6 @@ #include "py/runtime.h" #include "shared-bindings/os/__init__.h" -#if CIRCUITPY_DOTENV -#include "shared-bindings/dotenv/__init__.h" -#endif - // This provides all VFS related OS functions so that ports can share the code // as needed. It does not provide uname. @@ -111,16 +107,6 @@ mp_obj_t common_hal_os_getcwd(void) { return mp_vfs_getcwd(); } -mp_obj_t common_hal_os_getenv(const char *key, mp_obj_t default_) { - #if CIRCUITPY_DOTENV - mp_obj_t env_obj = common_hal_dotenv_get_key("/.env", key); - if (env_obj != mp_const_none) { - return env_obj; - } - #endif - return default_; -} - mp_obj_t common_hal_os_listdir(const char *path) { mp_obj_t path_out; mp_vfs_mount_t *vfs = lookup_dir_path(path, &path_out); diff --git a/shared-module/dotenv/__init__.h b/shared-module/os/__init__.h similarity index 60% rename from shared-module/dotenv/__init__.h rename to shared-module/os/__init__.h index fb27233692..1b18a1f4b9 100644 --- a/shared-module/dotenv/__init__.h +++ b/shared-module/os/__init__.h @@ -24,13 +24,25 @@ * THE SOFTWARE. */ +#pragma once + +typedef enum { + GETENV_OK = 0, + GETENV_ERR_OPEN, + GETENV_ERR_UNICODE, + GETENV_ERR_LENGTH, + GETENV_ERR_NOT_FOUND, + GETENV_ERR_UNEXPECTED = 0xff00, // logical or'd with the byte value +} os_getenv_err_t; + // Allocation free version that returns the full length of the value. -mp_int_t dotenv_get_key(const char *path, const char *key, char *value, mp_int_t value_len); +// If it fits, the return value is 0-terminated. The passed in buffer +// may be modified even if an error is returned. Allocation free. +// An error that is not 'open' or 'not found' is printed on the repl. +os_getenv_err_t common_hal_os_getenv_str(const char *key, char *value, size_t value_len); -// Returns true and sets value to a '\0'-terminated string if key is present -// and the value (including the terminating '\0') fits strictly within -// value_len bytes. -bool dotenv_get_key_terminated(const char *path, const char *key, char *value, mp_int_t value_len); - -// Returns true and sets value to the read value. Returns false if the value was not numeric. -bool dotenv_get_key_int(const char *path, const char *key, mp_int_t *value); +// Returns GETENV_OK and sets value to the read value. Returns +// GETENV_ERR_... if the value was not numeric. allocation-free. +// If any error code is returned, value is guaranteed not modified +// An error that is not 'open' or 'not found' is printed on the repl. +os_getenv_err_t common_hal_os_getenv_int(const char *key, mp_int_t *value); diff --git a/shared-module/os/getenv.c b/shared-module/os/getenv.c new file mode 100644 index 0000000000..870973c5d2 --- /dev/null +++ b/shared-module/os/getenv.c @@ -0,0 +1,431 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * SPDX-FileCopyrightText: Copyright (c) 2022 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. + */ + +// These functions are separate from __init__.c so that os.getenv() can be +// tested in the unix "coverage" build, without bringing in "our" os module + +#include +#include +#include + +#include "shared-bindings/os/__init__.h" +#include "shared-module/os/__init__.h" + +#include "py/gc.h" +#include "py/misc.h" +#include "py/mpstate.h" +#include "py/mpprint.h" +#include "py/objstr.h" +#include "py/parsenum.h" +#include "py/runtime.h" +#include "supervisor/filesystem.h" +#include "supervisor/memory.h" + +#define GETENV_PATH "/settings.toml" + +#include "extmod/vfs.h" +#include "extmod/vfs_fat.h" +typedef FIL file_arg; +STATIC bool open_file(const char *name, file_arg *active_file) { + #if defined(UNIX) + nlr_buf_t nlr; + if (nlr_push(&nlr) == 0) { + mp_obj_t file_obj = mp_call_function_2(MP_OBJ_FROM_PTR(&mp_builtin_open_obj), mp_obj_new_str(name, strlen(name)), MP_ROM_QSTR(MP_QSTR_rb)); + mp_arg_validate_type(file_obj, &mp_type_vfs_fat_fileio, MP_QSTR_file); + pyb_file_obj_t *file = MP_OBJ_TO_PTR(file_obj); + *active_file = file->fp; + nlr_pop(); + return true; + } else { + return false; + } + #else + FATFS *fs = filesystem_circuitpy(); + FRESULT result = f_open(fs, active_file, name, FA_READ); + return result == FR_OK; + #endif +} +STATIC void close_file(file_arg *active_file) { + // nothing +} +STATIC bool is_eof(file_arg *active_file) { + return f_eof(active_file); +} + +// Return 0 if there is no next character (EOF). +STATIC uint8_t get_next_byte(FIL *active_file) { + uint8_t character = 0; + UINT quantity_read; + // If there's an error or quantity_read is 0, character will remain 0. + f_read(active_file, &character, 1, &quantity_read); + return character; +} +STATIC void seek_eof(file_arg *active_file) { + f_lseek(active_file, f_size(active_file)); +} + +// For a fixed buffer, record the required size rather than throwing +STATIC void vstr_add_byte_nonstd(vstr_t *vstr, byte b) { + if (!vstr->fixed_buf || vstr->alloc > vstr->len) { + vstr_add_byte(vstr, b); + } else { + vstr->len++; + } +} + +// For a fixed buffer, record the required size rather than throwing +STATIC void vstr_add_char_nonstd(vstr_t *vstr, unichar c) { + size_t ulen = + (c < 0x80) ? 1 : + (c < 0x800) ? 2 : + (c < 0x10000) ? 3 : 4; + if (!vstr->fixed_buf || vstr->alloc > vstr->len + ulen) { + vstr_add_char(vstr, c); + } else { + vstr->len += ulen; + } +} + +STATIC void next_line(file_arg *active_file) { + uint8_t character; + do { + character = get_next_byte(active_file); + } while (character != 0 && character != '\n'); +} + +// Discard whitespace, except for newlines, returning the next character after the whitespace. +// Return 0 if there is no next character (EOF). +STATIC uint8_t consume_whitespace(file_arg *active_file) { + uint8_t character; + do { + character = get_next_byte(active_file); + } while (character != '\n' && character != 0 && unichar_isspace(character)); + return character; +} + +// Starting at the start of a new line, determines if the key matches the given +// key. +// +// If result is true, the key matches and file pointer is pointing just after the "=". +// If the result is false, the key does NOT match and the file pointer is +// pointing at the start of the next line, if any +STATIC bool key_matches(file_arg *active_file, const char *key) { + uint8_t character; + character = consume_whitespace(active_file); + if (character == '[' || character == 0) { + seek_eof(active_file); + return false; + } + while (*key) { + if (character != *key++) { + // A character didn't match the key, so it's not a match + // If the non-matching char was not the end of the line, + // then consume the rest of the line + if (character != '\n') { + next_line(active_file); + } + return false; + } + character = get_next_byte(active_file); + } + // the next character could be whitespace; consume if necessary + if (unichar_isspace(character)) { + character = consume_whitespace(active_file); + } + // If we're not looking at the "=" then the key didn't match + if (character != '=') { + // A character didn't match the key, so it's not a match + // If the non-matching char was not the end of the line, + // then consume the rest of the line + if (character != '\n') { + next_line(active_file); + } + return false; + } + return true; +} + +STATIC os_getenv_err_t read_unicode_escape(file_arg *active_file, int sz, vstr_t *buf) { + char hex_buf[sz + 1]; + for (int i = 0; i < sz; i++) { + hex_buf[i] = get_next_byte(active_file); + } + hex_buf[sz] = 0; + char *end; + unsigned long c = strtoul(hex_buf, &end, 16); + if (end != &hex_buf[sz]) { + return GETENV_ERR_UNEXPECTED | *end; + } + if (c >= 0x110000) { + return GETENV_ERR_UNICODE; + } + vstr_add_char_nonstd(buf, c); + return GETENV_OK; +} + +// Read a quoted string +STATIC os_getenv_err_t read_string_value(file_arg *active_file, vstr_t *buf) { + while (true) { + int character = get_next_byte(active_file); + switch (character) { + case 0: + case '\n': + return GETENV_ERR_UNEXPECTED | character; + + case '"': + character = consume_whitespace(active_file); + switch (character) { + case '#': + next_line(active_file); + MP_FALLTHROUGH; + case 0: + case '\n': + return GETENV_OK; + default: + return GETENV_ERR_UNEXPECTED | character; + } + + case '\\': + character = get_next_byte(active_file); + switch (character) { + case 0: + case '\n': + return GETENV_ERR_UNEXPECTED | character; + case 'b': + character = '\b'; + break; + case 'r': + character = '\r'; + break; + case 'n': + character = '\n'; + break; + case 't': + character = '\t'; + break; + case 'v': + character = '\v'; + break; + case 'f': + character = '\f'; + break; + case 'U': + case 'u': { + int sz = (character == 'u') ? 4 : 8; + os_getenv_err_t res; + res = read_unicode_escape(active_file, sz, buf); + if (res != GETENV_OK) { + return res; + } + continue; + } + // default falls through, other escaped characters + // represent themselves + } + MP_FALLTHROUGH; + default: + vstr_add_byte_nonstd(buf, character); + } + } +} + +// Read a numeric value (non-quoted value) as a string +STATIC os_getenv_err_t read_bare_value(file_arg *active_file, vstr_t *buf, int first_character) { + int character = first_character; + while (true) { + switch (character) { + case 0: + case '\n': + return GETENV_OK; + case '#': + next_line(active_file); + return GETENV_OK; + default: + vstr_add_byte_nonstd(buf, character); + } + character = get_next_byte(active_file); + } +} + +STATIC mp_int_t read_value(file_arg *active_file, vstr_t *buf, bool *quoted) { + uint8_t character; + character = consume_whitespace(active_file); + *quoted = (character == '"'); + + if (*quoted) { + return read_string_value(active_file, buf); + } else { + return read_bare_value(active_file, buf, character); + } +} + +STATIC os_getenv_err_t os_getenv_vstr(const char *path, const char *key, vstr_t *buf, bool *quoted) { + file_arg active_file; + if (!open_file(path, &active_file)) { + return GETENV_ERR_OPEN; + } + + os_getenv_err_t result = GETENV_ERR_NOT_FOUND; + while (!is_eof(&active_file)) { + if (key_matches(&active_file, key)) { + result = read_value(&active_file, buf, quoted); + break; + } + } + close_file(&active_file); + return result; +} + +STATIC os_getenv_err_t os_getenv_buf_terminated(const char *key, char *value, size_t value_len, bool *quoted) { + vstr_t buf; + vstr_init_fixed_buf(&buf, value_len, value); + os_getenv_err_t result = os_getenv_vstr(GETENV_PATH, key, &buf, quoted); + + if (result == GETENV_OK) { + vstr_add_byte_nonstd(&buf, 0); + memcpy(value, buf.buf, MIN(buf.len, value_len)); + if (buf.len > value_len) { // this length includes trailing NUL + result = GETENV_ERR_LENGTH; + } + } + return result; +} + +STATIC void print_dont_raise(const mp_obj_type_t *exc_type, const compressed_string_t *fmt, ...) { + va_list argptr; + va_start(argptr,fmt); + mp_vcprintf(&mp_plat_print, fmt, argptr); + mp_printf(&mp_plat_print, "\n"); + va_end(argptr); +} + +STATIC void handle_getenv_error(os_getenv_err_t error, void (*handle)(const mp_obj_type_t *exc_type, const compressed_string_t *fmt, ...)) { + if (error == GETENV_OK) { + return; + } + if (error & GETENV_ERR_UNEXPECTED) { + byte character = (error & 0xff); + char buf[8]; + vstr_t vstr; + vstr_init_fixed_buf(&vstr, sizeof(buf), buf); + mp_print_t print = { .data = &vstr, .print_strn = (mp_print_strn_t)vstr_add_strn }; + + if (character) { + mp_str_print_quoted(&print, &character, 1, true); + } else { + mp_str_print_quoted(&print, (byte *)"EOF", 3, true); + } + handle(&mp_type_ValueError, translate("Invalid byte %.*s"), vstr.len, vstr.buf); + } else { + switch (error) { + case GETENV_ERR_OPEN: + handle(&mp_type_ValueError, translate("%S"), translate("File not found")); + break; + case GETENV_ERR_UNICODE: + handle(&mp_type_ValueError, translate("%S"), translate("Invalid unicode escape")); + break; + case GETENV_ERR_NOT_FOUND: + handle(&mp_type_ValueError, translate("%S"), translate("Key not found")); + break; + default: + handle(&mp_type_RuntimeError, translate("%S"), translate("Internal error")); + break; + } + } +} + +STATIC void common_hal_os_getenv_showerr(const char *key, os_getenv_err_t result) { + if (result != GETENV_OK && result != GETENV_ERR_OPEN && result != GETENV_ERR_NOT_FOUND) { + mp_cprintf(&mp_plat_print, translate("An error occurred while retrieving '%s':\n"), key); + handle_getenv_error(result, print_dont_raise); + } +} + +STATIC +os_getenv_err_t common_hal_os_getenv_str_inner(const char *key, char *value, size_t value_len) { + bool quoted; + os_getenv_err_t result = os_getenv_buf_terminated(key, value, value_len, "ed); + if (result == GETENV_OK && !quoted) { + result = GETENV_ERR_UNEXPECTED | value[0]; + } + return result; +} + +os_getenv_err_t common_hal_os_getenv_str(const char *key, char *value, size_t value_len) { + os_getenv_err_t result = common_hal_os_getenv_str_inner(key, value, value_len); + common_hal_os_getenv_showerr(key, result); + return result; +} + +mp_obj_t common_hal_os_getenv_path(const char *path, const char *key, mp_obj_t default_) { + vstr_t buf; + bool quoted; + + vstr_init(&buf, 64); + os_getenv_err_t result = os_getenv_vstr(path, key, &buf, "ed); + if (result == GETENV_ERR_NOT_FOUND || result == GETENV_ERR_OPEN) { + return default_; + } + handle_getenv_error(result, mp_raise_msg_varg); + + if (quoted) { + return mp_obj_new_str_from_vstr(&mp_type_str, &buf); + } else { + return mp_parse_num_integer(buf.buf, buf.len, 0, NULL); + } +} + +mp_obj_t common_hal_os_getenv(const char *key, mp_obj_t default_) { + return common_hal_os_getenv_path(GETENV_PATH, key, default_); +} + +STATIC os_getenv_err_t common_hal_os_getenv_int_inner(const char *key, mp_int_t *value) { + char buf[16]; + bool quoted; + os_getenv_err_t result = os_getenv_buf_terminated(key, buf, sizeof(buf), "ed); + if (result != GETENV_OK) { + return result; + } + if (quoted) { + return GETENV_ERR_UNEXPECTED | '"'; + } + char *end; + long num = strtol(buf, &end, 0); + while (unichar_isspace(*end)) { + end++; + } + if (end == buf || *end) { // If the whole buffer was not consumed it's an error + return GETENV_ERR_UNEXPECTED | *end; + } + *value = (mp_int_t)num; + return GETENV_OK; +} + +os_getenv_err_t common_hal_os_getenv_int(const char *key, mp_int_t *value) { + os_getenv_err_t result = common_hal_os_getenv_int_inner(key, value); + common_hal_os_getenv_showerr(key, result); + return result; +} diff --git a/shared-module/usb_hid/__init__.c b/shared-module/usb_hid/__init__.c index 99be84542f..11b87a78f1 100644 --- a/shared-module/usb_hid/__init__.c +++ b/shared-module/usb_hid/__init__.c @@ -220,9 +220,7 @@ bool common_hal_usb_hid_enable(const mp_obj_t devices, uint8_t boot_device) { } const mp_int_t num_devices = MP_OBJ_SMALL_INT_VALUE(mp_obj_len(devices)); - if (num_devices > MAX_HID_DEVICES) { - mp_raise_ValueError_varg(translate("No more than %d HID devices allowed"), MAX_HID_DEVICES); - } + mp_arg_validate_length_max(num_devices, MAX_HID_DEVICES, MP_QSTR_devices); num_hid_devices = num_devices; diff --git a/shared-module/vectorio/VectorShape.c b/shared-module/vectorio/VectorShape.c index d9c13f54cc..20e1405d9a 100644 --- a/shared-module/vectorio/VectorShape.c +++ b/shared-module/vectorio/VectorShape.c @@ -293,6 +293,16 @@ void common_hal_vectorio_vector_shape_set_location(vectorio_vector_shape_t *self } } +mp_int_t common_hal_vectorio_vector_shape_get_hidden(vectorio_vector_shape_t *self) { + VECTORIO_SHAPE_DEBUG("%p get_hidden\n", self); + return self->hidden; +} + +void common_hal_vectorio_vector_shape_set_hidden(vectorio_vector_shape_t *self, bool hidden) { + VECTORIO_SHAPE_DEBUG("%p set_hidden %d\n", self, x); + self->hidden = hidden; + common_hal_vectorio_vector_shape_set_dirty(self); +} mp_obj_t common_hal_vectorio_vector_shape_get_pixel_shader(vectorio_vector_shape_t *self) { VECTORIO_SHAPE_DEBUG("%p get_pixel_shader\n", self); @@ -315,6 +325,11 @@ bool vectorio_vector_shape_fill_area(vectorio_vector_shape_t *self, const _displ uint64_t start = common_hal_time_monotonic_ns(); uint64_t pixel_time = 0; #endif + + if (self->hidden) { + return false; + } + VECTORIO_SHAPE_DEBUG("%p fill_area: fill: {(%5d,%5d), (%5d,%5d)}", self, area->x1, area->y1, area->x2, area->y2 diff --git a/shared-module/vectorio/VectorShape.h b/shared-module/vectorio/VectorShape.h index fdbae964a8..6ce09f9308 100644 --- a/shared-module/vectorio/VectorShape.h +++ b/shared-module/vectorio/VectorShape.h @@ -37,6 +37,7 @@ typedef struct { displayio_area_t ephemeral_dirty_area; displayio_area_t current_area; bool current_area_dirty; + bool hidden; } vectorio_vector_shape_t; displayio_area_t *vectorio_vector_shape_get_refresh_areas(vectorio_vector_shape_t *self, displayio_area_t *tail); diff --git a/shared/netutils/dhcpserver.c b/shared/netutils/dhcpserver.c index 9db42b3fd9..d396a2ba56 100644 --- a/shared/netutils/dhcpserver.c +++ b/shared/netutils/dhcpserver.c @@ -33,7 +33,7 @@ #include "py/mperrno.h" #include "py/mphal.h" -#if MICROPY_PY_LWIP +#if LWIP_UDP #include "shared/netutils/dhcpserver.h" #include "lwip/udp.h" @@ -265,9 +265,9 @@ static void dhcp_server_process(void *arg, struct udp_pcb *upcb, struct pbuf *p, d->lease[yi].expiry = (mp_hal_ticks_ms() + DEFAULT_LEASE_TIME_S * 1000) >> 16; dhcp_msg.yiaddr[3] = DHCPS_BASE_IP + yi; opt_write_u8(&opt, DHCP_OPT_MSG_TYPE, DHCPACK); - printf("DHCPS: client connected: MAC=%02x:%02x:%02x:%02x:%02x:%02x IP=%u.%u.%u.%u\n", + LWIP_DEBUGF(DHCP_DEBUG, ("DHCPS: client connected: MAC=%02x:%02x:%02x:%02x:%02x:%02x IP=%u.%u.%u.%u\n", dhcp_msg.chaddr[0], dhcp_msg.chaddr[1], dhcp_msg.chaddr[2], dhcp_msg.chaddr[3], dhcp_msg.chaddr[4], dhcp_msg.chaddr[5], - dhcp_msg.yiaddr[0], dhcp_msg.yiaddr[1], dhcp_msg.yiaddr[2], dhcp_msg.yiaddr[3]); + dhcp_msg.yiaddr[0], dhcp_msg.yiaddr[1], dhcp_msg.yiaddr[2], dhcp_msg.yiaddr[3])); break; } diff --git a/shared/netutils/netutils.h b/shared/netutils/netutils.h index b23a78e5b8..3bb9212800 100644 --- a/shared/netutils/netutils.h +++ b/shared/netutils/netutils.h @@ -33,6 +33,8 @@ #define NETUTILS_TRACE_PAYLOAD (0x0002) #define NETUTILS_TRACE_NEWLINE (0x0004) +#include "py/runtime.h" + typedef enum _netutils_endian_t { NETUTILS_LITTLE, NETUTILS_BIG, diff --git a/supervisor/fatfs_port.h b/supervisor/fatfs.h similarity index 89% rename from supervisor/fatfs_port.h rename to supervisor/fatfs.h index e76ced524d..59226aae1c 100644 --- a/supervisor/fatfs_port.h +++ b/supervisor/fatfs.h @@ -24,11 +24,11 @@ * THE SOFTWARE. */ -#ifndef MICROPY_INCLUDED_SUPERVISOR_FATFS_PORT_H -#define MICROPY_INCLUDED_SUPERVISOR_FATFS_PORT_H +#ifndef MICROPY_INCLUDED_SUPERVISOR_FATFS_H +#define MICROPY_INCLUDED_SUPERVISOR_FATFS_H #include "lib/oofatfs/ff.h" void override_fattime(DWORD time); -#endif // MICROPY_INCLUDED_SUPERVISOR_FATFS_PORT_H +#endif // MICROPY_INCLUDED_SUPERVISOR_FATFS_H diff --git a/supervisor/shared/bluetooth/file_transfer.c b/supervisor/shared/bluetooth/file_transfer.c index 159c639e4d..ae24c29899 100644 --- a/supervisor/shared/bluetooth/file_transfer.c +++ b/supervisor/shared/bluetooth/file_transfer.c @@ -42,7 +42,7 @@ #include "common-hal/_bleio/__init__.h" -#include "supervisor/fatfs_port.h" +#include "supervisor/fatfs.h" #include "supervisor/filesystem.h" #include "supervisor/shared/reload.h" #include "supervisor/shared/bluetooth/file_transfer.h" diff --git a/supervisor/shared/display.c b/supervisor/shared/display.c index 8ed2f5c17e..0a066e8016 100644 --- a/supervisor/shared/display.c +++ b/supervisor/shared/display.c @@ -74,11 +74,8 @@ void supervisor_start_terminal(uint16_t width_px, uint16_t height_px) { scale = 1; } - width_in_tiles = width_px / (scroll_area->tile_width * scale); - if (width_in_tiles < 1) { - width_in_tiles = 1; - } - uint16_t height_in_tiles = height_px / (scroll_area->tile_height * scale); + width_in_tiles = MAX(1, width_px / (scroll_area->tile_width * scale)); + uint16_t height_in_tiles = MAX(2, height_px / (scroll_area->tile_height * scale)); uint16_t total_tiles = width_in_tiles * height_in_tiles; @@ -117,7 +114,6 @@ void supervisor_start_terminal(uint16_t width_px, uint16_t height_px) { status_bar->top_left_y = 0; status_bar->width_in_tiles = width_in_tiles; status_bar->height_in_tiles = 1; - assert(width_in_tiles > 0); status_bar->pixel_width = width_in_tiles * status_bar->tile_width; status_bar->pixel_height = status_bar->tile_height; status_bar->tiles = tiles; @@ -127,8 +123,6 @@ void supervisor_start_terminal(uint16_t width_px, uint16_t height_px) { scroll_area->top_left_y = 0; scroll_area->width_in_tiles = width_in_tiles; scroll_area->height_in_tiles = height_in_tiles - 1; - assert(width_in_tiles > 0); - assert(height_in_tiles > 1); scroll_area->pixel_width = width_in_tiles * scroll_area->tile_width; scroll_area->pixel_height = (height_in_tiles - 1) * scroll_area->tile_height; #if CIRCUITPY_REPL_LOGO diff --git a/supervisor/shared/external_flash/external_flash.c b/supervisor/shared/external_flash/external_flash.c index 7da45fdc99..141ad7e5f8 100644 --- a/supervisor/shared/external_flash/external_flash.c +++ b/supervisor/shared/external_flash/external_flash.c @@ -58,6 +58,9 @@ static supervisor_allocation *supervisor_cache = NULL; // Wait until both the write enable and write in progress bits have cleared. static bool wait_for_flash_ready(void) { + if (flash_device == NULL) { + return false; + } bool ok = true; // Both the write enable and write in progress bits should be low. if (flash_device->no_ready_bit) { @@ -192,6 +195,9 @@ static bool copy_block(uint32_t src_address, uint32_t dest_address) { return true; } +#define READ_JEDEC_ID_RETRY_COUNT (100) + +// If this fails, flash_device will remain NULL. void supervisor_flash_init(void) { if (flash_device != NULL) { return; @@ -220,7 +226,11 @@ void supervisor_flash_init(void) { #else // The response will be 0xff if the flash needs more time to start up. uint8_t jedec_id_response[3] = {0xff, 0xff, 0xff}; - while (jedec_id_response[0] == 0xff) { + // Response can also be 0x00 if reading before ready. When compiled with `-O2`, typically + // takes three tries to read on Grand Central M4. + + size_t count = READ_JEDEC_ID_RETRY_COUNT; + while ((count-- > 0) && (jedec_id_response[0] == 0xff || jedec_id_response[2] == 0x00)) { spi_flash_read_command(CMD_READ_JEDEC_ID, jedec_id_response, 3); } for (uint8_t i = 0; i < EXTERNAL_FLASH_DEVICE_COUNT; i++) { @@ -234,6 +244,7 @@ void supervisor_flash_init(void) { } #endif if (flash_device == NULL) { + // Flash did not respond. Give up. return; } @@ -293,6 +304,9 @@ uint32_t supervisor_flash_get_block_size(void) { // The total number of available blocks. uint32_t supervisor_flash_get_block_count(void) { + if (flash_device == NULL) { + return 0; + } // We subtract one erase sector size because we may use it as a staging area // for writes. return (flash_device->total_size - SPI_FLASH_ERASE_SIZE) / FILESYSTEM_BLOCK_SIZE; diff --git a/supervisor/shared/external_flash/spi_flash.c b/supervisor/shared/external_flash/spi_flash.c index b47508e051..abff343713 100644 --- a/supervisor/shared/external_flash/spi_flash.c +++ b/supervisor/shared/external_flash/spi_flash.c @@ -151,6 +151,7 @@ void spi_flash_init(void) { supervisor_flash_spi_bus.base.type = &busio_spi_type; common_hal_busio_spi_construct(&supervisor_flash_spi_bus, SPI_FLASH_SCK_PIN, SPI_FLASH_MOSI_PIN, SPI_FLASH_MISO_PIN, false); common_hal_busio_spi_never_reset(&supervisor_flash_spi_bus); + common_hal_busio_spi_configure(&supervisor_flash_spi_bus, SPI_FLASH_MAX_BAUDRATE, 0, 0, 8); return; } diff --git a/ports/espressif/fatfs_port.c b/supervisor/shared/fatfs.c similarity index 74% rename from ports/espressif/fatfs_port.c rename to supervisor/shared/fatfs.c index 38c2d923b8..f1452bf567 100644 --- a/ports/espressif/fatfs_port.c +++ b/supervisor/shared/fatfs.c @@ -3,7 +3,7 @@ * * The MIT License (MIT) * - * SPDX-FileCopyrightText: Copyright (c) 2013, 2014 Damien P. George + * Copyright (c) 2022 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 @@ -24,12 +24,15 @@ * THE SOFTWARE. */ +#include "supervisor/fatfs.h" + #include "py/runtime.h" #include "lib/oofatfs/ff.h" -#include "shared/timeutils/timeutils.h" +#include "shared-bindings/microcontroller/Processor.h" +#include "shared-bindings/os/__init__.h" #include "shared-bindings/rtc/RTC.h" #include "shared-bindings/time/__init__.h" -#include "supervisor/fatfs_port.h" +#include "shared/timeutils/timeutils.h" DWORD _time_override = 0; DWORD get_fattime(void) { @@ -49,3 +52,17 @@ DWORD get_fattime(void) { void override_fattime(DWORD time) { _time_override = time; } + +DWORD make_volid(void) { + DWORD result; + if (!common_hal_os_urandom((uint8_t *)&result, sizeof(result))) { + #if CIRCUITPY_MICROCONTROLLER && COMMON_HAL_MCU_PROCESSOR_UID_LENGTH >= 4 + uint8_t raw_id[COMMON_HAL_MCU_PROCESSOR_UID_LENGTH]; + common_hal_mcu_processor_get_uid(raw_id); + memcpy(&result, raw_id, sizeof(result)); + #else + result = (DWORD)common_hal_time_monotonic_ns(); + #endif + } + return result; +} diff --git a/supervisor/shared/filesystem.c b/supervisor/shared/filesystem.c index 01aba0a9ac..1eab59c384 100644 --- a/supervisor/shared/filesystem.c +++ b/supervisor/shared/filesystem.c @@ -129,6 +129,9 @@ bool filesystem_init(bool create_allowed, bool force_create) { make_empty_file(&vfs_fat->fatfs, "/.metadata_never_index"); make_empty_file(&vfs_fat->fatfs, "/.Trashes"); make_empty_file(&vfs_fat->fatfs, "/.fseventsd/no_log"); + #if CIRCUITPY_OS_GETENV + make_empty_file(&vfs_fat->fatfs, "/settings.toml"); + #endif // make a sample code.py file make_sample_code_file(&vfs_fat->fatfs); diff --git a/supervisor/shared/reload.c b/supervisor/shared/reload.c index e1ae2e6764..4e351704f8 100644 --- a/supervisor/shared/reload.c +++ b/supervisor/shared/reload.c @@ -28,6 +28,7 @@ #include "py/mphal.h" #include "py/mpstate.h" +#include "supervisor/port.h" #include "supervisor/shared/reload.h" #include "supervisor/shared/tick.h" @@ -52,6 +53,7 @@ void reload_initiate(supervisor_run_reason_t run_reason) { MP_STATE_VM(sched_state) = MP_SCHED_PENDING; } #endif + port_wake_main_task(); } void autoreload_reset() { diff --git a/supervisor/shared/status_leds.c b/supervisor/shared/status_leds.c index 315e64a9a0..7e6c7983b1 100644 --- a/supervisor/shared/status_leds.c +++ b/supervisor/shared/status_leds.c @@ -179,27 +179,15 @@ void status_led_init() { #elif CIRCUITPY_PWM_RGB_LED if (common_hal_mcu_pin_is_free(CIRCUITPY_RGB_STATUS_R)) { - pwmout_result_t red_result = common_hal_pwmio_pwmout_construct(&rgb_status_r, CIRCUITPY_RGB_STATUS_R, 0, 50000, false); - - if (PWMOUT_OK == red_result) { - common_hal_pwmio_pwmout_never_reset(&rgb_status_r); - } + common_hal_pwmio_pwmout_construct(&rgb_status_r, CIRCUITPY_RGB_STATUS_R, 0, 50000, false); } if (common_hal_mcu_pin_is_free(CIRCUITPY_RGB_STATUS_G)) { - pwmout_result_t green_result = common_hal_pwmio_pwmout_construct(&rgb_status_g, CIRCUITPY_RGB_STATUS_G, 0, 50000, false); - - if (PWMOUT_OK == green_result) { - common_hal_pwmio_pwmout_never_reset(&rgb_status_g); - } + common_hal_pwmio_pwmout_construct(&rgb_status_g, CIRCUITPY_RGB_STATUS_G, 0, 50000, false); } if (common_hal_mcu_pin_is_free(CIRCUITPY_RGB_STATUS_B)) { - pwmout_result_t blue_result = common_hal_pwmio_pwmout_construct(&rgb_status_b, CIRCUITPY_RGB_STATUS_B, 0, 50000, false); - - if (PWMOUT_OK == blue_result) { - common_hal_pwmio_pwmout_never_reset(&rgb_status_b); - } + common_hal_pwmio_pwmout_construct(&rgb_status_b, CIRCUITPY_RGB_STATUS_B, 0, 50000, false); } #elif defined(MICROPY_HW_LED_STATUS) diff --git a/supervisor/shared/translate/translate.c b/supervisor/shared/translate/translate.c index ae6c7524e5..b07aa584ca 100644 --- a/supervisor/shared/translate/translate.c +++ b/supervisor/shared/translate/translate.c @@ -57,6 +57,9 @@ STATIC void get_word(int n, const mchar_t **pos, const mchar_t **end) { } STATIC int put_utf8(char *buf, int u) { + if (u >= translation_offstart) { + u += translation_offset; + } if (u <= 0x7f) { *buf = u; return 1; diff --git a/supervisor/shared/usb/usb.c b/supervisor/shared/usb/usb.c index a51c6c2659..fa85cddb83 100644 --- a/supervisor/shared/usb/usb.c +++ b/supervisor/shared/usb/usb.c @@ -341,7 +341,7 @@ bool tud_vendor_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_requ #endif // CIRCUITPY_USB_VENDOR -#if MICROPY_KBD_EXCEPTION +#if MICROPY_KBD_EXCEPTION && CIRCUITPY_USB_CDC /** * Callback invoked when received an "wanted" char. @@ -359,4 +359,10 @@ void tud_cdc_rx_wanted_cb(uint8_t itf, char wanted_char) { } } +void tud_cdc_send_break_cb(uint8_t itf, uint16_t duration_ms) { + if (usb_cdc_console_enabled() && mp_interrupt_char != -1 && itf == 0 && duration_ms > 0) { + mp_sched_keyboard_interrupt(); + } +} + #endif diff --git a/supervisor/shared/web_workflow/static/directory.js b/supervisor/shared/web_workflow/static/directory.js index c1d934c1a8..a89d5e5602 100644 --- a/supervisor/shared/web_workflow/static/directory.js +++ b/supervisor/shared/web_workflow/static/directory.js @@ -95,7 +95,7 @@ async function refresh_list() { if (f.directory) { icon = "📁"; } else if(f.name.endsWith(".txt") || - f.name.endsWith(".env") || + f.name.endsWith(".toml") || f.name.endsWith(".py") || f.name.endsWith(".js") || f.name.endsWith(".json")) { diff --git a/supervisor/shared/web_workflow/static/welcome.html b/supervisor/shared/web_workflow/static/welcome.html index e773bb6a2e..efbb30e312 100644 --- a/supervisor/shared/web_workflow/static/welcome.html +++ b/supervisor/shared/web_workflow/static/welcome.html @@ -12,7 +12,7 @@

 Welcome!

-

Welcome to CircuitPython's Web API. Go to the file browser to work with files in the CIRCUITPY drive. Go to the full code editor for a more enriching experience which requires an active internet connection. Go to the serial terminal to see code output and interact with the REPL. Make sure you've set CIRCUITPY_WEB_API_PASSWORD='somepassword' in /.env. Provide the password when the browser prompts for it. Leave the username blank.

+

Welcome to CircuitPython's Web API. Go to the file browser to work with files in the CIRCUITPY drive. Go to the full code editor for a more enriching experience which requires an active internet connection. Go to the serial terminal to see code output and interact with the REPL. Make sure you've set CIRCUITPY_WEB_API_PASSWORD='somepassword' in /settings.toml. Provide the password when the browser prompts for it. Leave the username blank.

Device Info:

diff --git a/supervisor/shared/web_workflow/web_workflow.c b/supervisor/shared/web_workflow/web_workflow.c index 3f0b9ad8f7..c34c3b3c9f 100644 --- a/supervisor/shared/web_workflow/web_workflow.c +++ b/supervisor/shared/web_workflow/web_workflow.c @@ -24,18 +24,20 @@ * THE SOFTWARE. */ +#include #include #include "extmod/vfs.h" #include "extmod/vfs_fat.h" #include "genhdr/mpversion.h" +#include "py/mperrno.h" #include "py/mpstate.h" #include "py/stackctrl.h" #include "shared-bindings/wifi/Radio.h" #include "shared-module/storage/__init__.h" #include "shared/timeutils/timeutils.h" -#include "supervisor/fatfs_port.h" +#include "supervisor/fatfs.h" #include "supervisor/filesystem.h" #include "supervisor/port.h" #include "supervisor/shared/reload.h" @@ -47,8 +49,12 @@ #include "shared-bindings/hashlib/__init__.h" #include "shared-bindings/hashlib/Hash.h" + +#if CIRCUITPY_MDNS #include "shared-bindings/mdns/RemoteService.h" #include "shared-bindings/mdns/Server.h" +#endif + #include "shared-bindings/microcontroller/Processor.h" #include "shared-bindings/socketpool/__init__.h" #include "shared-bindings/socketpool/Socket.h" @@ -58,15 +64,10 @@ #include "shared-bindings/wifi/__init__.h" #endif -#if CIRCUITPY_DOTENV -#include "shared-module/dotenv/__init__.h" +#if CIRCUITPY_OS_GETENV +#include "shared-module/os/__init__.h" #endif -// TODO: Remove ESP specific stuff. For now, it is useful as we refine the server. -#include "esp_log.h" - -static const char *TAG = "CP webserver"; - enum request_state { STATE_METHOD, STATE_PATH, @@ -95,6 +96,7 @@ typedef struct { bool expect; bool json; bool websocket; + bool new_socket; uint32_t websocket_version; // RFC6455 for websockets says this header should be 24 base64 characters long. char websocket_key[24 + 1]; @@ -109,8 +111,11 @@ static uint32_t _last_ip = 0; static wifi_radio_error_t _last_wifi_status = WIFI_RADIO_ERROR_NONE; #endif +#if CIRCUITPY_MDNS static mdns_server_obj_t mdns; -static uint32_t web_api_port = 80; +#endif + +static mp_int_t web_api_port = 80; static socketpool_socketpool_obj_t pool; static socketpool_socket_obj_t listening; @@ -239,22 +244,30 @@ void supervisor_web_workflow_status(void) { #endif void supervisor_start_web_workflow(void) { - #if CIRCUITPY_WEB_WORKFLOW && CIRCUITPY_WIFI + #if CIRCUITPY_WEB_WORKFLOW && CIRCUITPY_WIFI && CIRCUITPY_OS_GETENV + // Skip starting the workflow if we're not starting from power on or reset. + 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 && + reset_reason != RESET_REASON_UNKNOWN && + reset_reason != RESET_REASON_SOFTWARE) { + return; + } char ssid[33]; char password[64]; - mp_int_t ssid_len = 0; - mp_int_t password_len = 0; - #if CIRCUITPY_DOTENV - ssid_len = dotenv_get_key("/.env", "CIRCUITPY_WIFI_SSID", ssid, sizeof(ssid) - 1); - password_len = dotenv_get_key("/.env", "CIRCUITPY_WIFI_PASSWORD", password, sizeof(password) - 1); - #endif - if (ssid_len <= 0 || (size_t)ssid_len >= sizeof(ssid) || - password_len <= 0 || (size_t)password_len >= sizeof(password)) { + os_getenv_err_t result = common_hal_os_getenv_str("CIRCUITPY_WIFI_SSID", ssid, sizeof(ssid)); + if (result != GETENV_OK) { return; } + + result = common_hal_os_getenv_str("CIRCUITPY_WIFI_PASSWORD", password, sizeof(password)); + if (result != GETENV_OK) { + return; + } + if (!common_hal_wifi_radio_get_enabled(&common_hal_wifi_radio_obj)) { common_hal_wifi_init(false); common_hal_wifi_radio_set_enabled(&common_hal_wifi_radio_obj, true); @@ -263,47 +276,37 @@ void supervisor_start_web_workflow(void) { // TODO: Do our own scan so that we can find the channel we want before calling connect. // Otherwise, connect will do a full slow scan to pick the best AP. - // NUL terminate the strings because dotenv doesn't. - ssid[ssid_len] = '\0'; - password[password_len] = '\0'; // We can all connect again because it will return early if we're already connected to the // network. If we are connected to a different network, then it will disconnect before // attempting to connect to the given network. _wifi_status = common_hal_wifi_radio_connect( - &common_hal_wifi_radio_obj, (uint8_t *)ssid, ssid_len, (uint8_t *)password, password_len, - 0, 0.1, NULL, 0); + &common_hal_wifi_radio_obj, (uint8_t *)ssid, strlen(ssid), (uint8_t *)password, strlen(password), + 0, 8, NULL, 0); if (_wifi_status != WIFI_RADIO_ERROR_NONE) { common_hal_wifi_radio_set_enabled(&common_hal_wifi_radio_obj, false); return; } - char port_encoded[6]; - size_t port_len = 0; - size_t new_port = web_api_port; - #if CIRCUITPY_DOTENV - port_len = dotenv_get_key("/.env", "CIRCUITPY_WEB_API_PORT", port_encoded, sizeof(port_encoded) - 1); - #endif - if (0 < port_len && port_len < sizeof(port_encoded)) { - port_encoded[port_len] = '\0'; - new_port = strtoul(port_encoded, NULL, 10); - } + mp_int_t new_port = web_api_port; + // (leaves new_port unchanged on any failure) + (void)common_hal_os_getenv_int("CIRCUITPY_WEB_API_PORT", &new_port); - bool first_start = mdns.base.type != &mdns_server_type; + bool first_start = pool.base.type != &socketpool_socketpool_type; bool port_changed = new_port != web_api_port; if (first_start) { - ESP_LOGI(TAG, "Starting web workflow"); + port_changed = false; + #if CIRCUITPY_MDNS mdns_server_construct(&mdns, true); mdns.base.type = &mdns_server_type; common_hal_mdns_server_set_instance_name(&mdns, MICROPY_HW_BOARD_NAME); + #endif pool.base.type = &socketpool_socketpool_type; common_hal_socketpool_socketpool_construct(&pool, &common_hal_wifi_radio_obj); - listening.base.type = &socketpool_socket_type; - active.base.type = &socketpool_socket_type; - active.num = -1; - active.connected = false; + socketpool_socket_reset(&listening); + socketpool_socket_reset(&active); websocket_init(); } @@ -312,7 +315,9 @@ void supervisor_start_web_workflow(void) { } if (first_start || port_changed) { web_api_port = new_port; + #if CIRCUITPY_MDNS common_hal_mdns_server_advertise_service(&mdns, "_circuitpython", "_tcp", web_api_port); + #endif socketpool_socket(&pool, SOCKETPOOL_AF_INET, SOCKETPOOL_SOCK_STREAM, &listening); common_hal_socketpool_socket_settimeout(&listening, 0); // Bind to any ip. @@ -320,23 +325,20 @@ void supervisor_start_web_workflow(void) { common_hal_socketpool_socket_listen(&listening, 1); } - mp_int_t api_password_len = dotenv_get_key("/.env", "CIRCUITPY_WEB_API_PASSWORD", _api_password + 1, sizeof(_api_password) - 2); - if (api_password_len > 0) { - _api_password[0] = ':'; - _api_password[api_password_len + 1] = '\0'; - _base64_in_place(_api_password, api_password_len + 1, sizeof(_api_password)); - } - // TODO: - // GET /edit/ - // - Super basic editor + const size_t api_password_len = sizeof(_api_password) - 1; + result = common_hal_os_getenv_str("CIRCUITPY_WEB_API_PASSWORD", _api_password + 1, api_password_len); + if (result == GETENV_OK) { + _api_password[0] = ':'; + _base64_in_place(_api_password, strlen(_api_password), sizeof(_api_password) - 1); + } #endif } void web_workflow_send_raw(socketpool_socket_obj_t *socket, const uint8_t *buf, int len) { int total_sent = 0; - int sent = -EAGAIN; - while ((sent == -EAGAIN || (sent > 0 && total_sent < len)) && + int sent = -MP_EAGAIN; + while ((sent == -MP_EAGAIN || (sent > 0 && total_sent < len)) && common_hal_socketpool_socket_get_connected(socket)) { sent = socketpool_socket_send(socket, buf + total_sent, len - total_sent); if (sent > 0) { @@ -347,9 +349,6 @@ void web_workflow_send_raw(socketpool_socket_obj_t *socket, const uint8_t *buf, } } } - if (total_sent < len) { - ESP_LOGE(TAG, "short send %d %d", sent, len); - } } STATIC void _print_raw(void *env, const char *str, size_t len) { @@ -361,7 +360,7 @@ static void _send_str(socketpool_socket_obj_t *socket, const char *str) { } // The last argument must be NULL! Otherwise, it won't stop. -static void _send_strs(socketpool_socket_obj_t *socket, ...) { +static __attribute__((sentinel)) void _send_strs(socketpool_socket_obj_t *socket, ...) { va_list ap; va_start(ap, socket); @@ -429,20 +428,21 @@ static bool _endswith(const char *str, const char *suffix) { } const char *ok_hosts[] = { - "code.circuitpython.org", "127.0.0.1", "localhost", }; static bool _origin_ok(const char *origin) { const char *http = "http://"; - const char *local = ".local"; // note: redirected requests send an Origin of "null" and will be caught by this if (strncmp(origin, http, strlen(http)) != 0) { return false; } // These are prefix checks up to : so that any port works. + // TODO: Support DHCP hostname in addition to MDNS. + #if CIRCUITPY_MDNS + const char *local = ".local"; const char *hostname = common_hal_mdns_server_get_hostname(&mdns); const char *end = origin + strlen(http) + strlen(hostname) + strlen(local); if (strncmp(origin + strlen(http), hostname, strlen(hostname)) == 0 && @@ -450,6 +450,9 @@ static bool _origin_ok(const char *origin) { (end[0] == '\0' || end[0] == ':')) { return true; } + #else + const char *end; + #endif _update_encoded_ip(); end = origin + strlen(http) + strlen(_our_ip_encoded); @@ -604,9 +607,10 @@ static void _reply_server_error(socketpool_socket_obj_t *socket, _request *reque _send_str(socket, "\r\n"); } +#if CIRCUITPY_MDNS static void _reply_redirect(socketpool_socket_obj_t *socket, _request *request, const char *path) { int nodelay = 1; - lwip_setsockopt(socket->num, IPPROTO_TCP, TCP_NODELAY, &nodelay, sizeof(nodelay)); + common_hal_socketpool_socket_setsockopt(socket, SOCKETPOOL_IPPROTO_TCP, SOCKETPOOL_TCP_NODELAY, &nodelay, sizeof(nodelay)); const char *hostname = common_hal_mdns_server_get_hostname(&mdns); _send_strs(socket, "HTTP/1.1 307 Temporary Redirect\r\n", @@ -628,6 +632,7 @@ static void _reply_redirect(socketpool_socket_obj_t *socket, _request *request, _cors_header(socket, request); _send_str(socket, "\r\n"); } +#endif static void _reply_directory_json(socketpool_socket_obj_t *socket, _request *request, FF_DIR *dir, const char *request_path, const char *path) { socketpool_socket_send(socket, (const uint8_t *)OK_JSON, strlen(OK_JSON)); @@ -686,16 +691,16 @@ static void _reply_with_file(socketpool_socket_obj_t *socket, _request *request, mp_print_t _socket_print = {socket, _print_raw}; mp_printf(&_socket_print, "Content-Length: %d\r\n", total_length); // TODO: Make this a table to save space. - if (_endswith(filename, ".txt") || _endswith(filename, ".py")) { - _send_strs(socket, "Content-Type: text/plain", ";charset=UTF-8\r\n", NULL); + if (_endswith(filename, ".txt") || _endswith(filename, ".py") || _endswith(filename, ".toml")) { + _send_strs(socket, "Content-Type:", "text/plain", ";charset=UTF-8\r\n", NULL); } else if (_endswith(filename, ".js")) { - _send_strs(socket, "Content-Type: text/javascript", ";charset=UTF-8\r\n", NULL); + _send_strs(socket, "Content-Type:", "text/javascript", ";charset=UTF-8\r\n", NULL); } else if (_endswith(filename, ".html")) { - _send_strs(socket, "Content-Type: text/html", ";charset=UTF-8\r\n", NULL); + _send_strs(socket, "Content-Type:", "text/html", ";charset=UTF-8\r\n", NULL); } else if (_endswith(filename, ".json")) { - _send_strs(socket, "Content-Type: application/json", ";charset=UTF-8\r\n", NULL); + _send_strs(socket, "Content-Type:", "application/json", ";charset=UTF-8\r\n", NULL); } else { - _send_str(socket, "Content-Type: application/octet-stream\r\n"); + _send_strs(socket, "Content-Type:", "application/octet-stream\r\n", NULL); } _cors_header(socket, request); _send_str(socket, "\r\n"); @@ -710,10 +715,9 @@ static void _reply_with_file(socketpool_socket_obj_t *socket, _request *request, while (send_offset < quantity_read) { int sent = socketpool_socket_send(socket, data_buffer + send_offset, quantity_read - send_offset); if (sent < 0) { - if (sent == -EAGAIN) { + if (sent == -MP_EAGAIN) { sent = 0; } else { - ESP_LOGE(TAG, "file send error %d", sent); break; } } @@ -726,15 +730,20 @@ static void _reply_with_file(socketpool_socket_obj_t *socket, _request *request, } static void _reply_with_devices_json(socketpool_socket_obj_t *socket, _request *request) { + #if CIRCUITPY_MDNS mdns_remoteservice_obj_t found_devices[32]; size_t total_results = mdns_server_find(&mdns, "_circuitpython", "_tcp", 1, found_devices, MP_ARRAY_SIZE(found_devices)); size_t count = MIN(total_results, MP_ARRAY_SIZE(found_devices)); + #else + size_t total_results = 0; + #endif socketpool_socket_send(socket, (const uint8_t *)OK_JSON, strlen(OK_JSON)); _cors_header(socket, request); _send_str(socket, "\r\n"); mp_print_t _socket_print = {socket, _print_chunk}; mp_printf(&_socket_print, "{\"total\": %d, \"devices\": [", total_results); + #if CIRCUITPY_MDNS for (size_t i = 0; i < count; i++) { if (i > 0) { _send_chunk(socket, ","); @@ -751,6 +760,7 @@ static void _reply_with_devices_json(socketpool_socket_obj_t *socket, _request * "\"ip\": \"%d.%d.%d.%d\"}", hostname, instance_name, port, octets[0], octets[1], octets[2], octets[3]); common_hal_mdns_remoteservice_deinit(&found_devices[i]); } + #endif _send_chunk(socket, "]}"); // Empty chunk signals the end of the response. _send_chunk(socket, ""); @@ -762,7 +772,11 @@ static void _reply_with_version_json(socketpool_socket_obj_t *socket, _request * _send_str(socket, "\r\n"); mp_print_t _socket_print = {socket, _print_chunk}; + #if CIRCUITPY_MDNS const char *hostname = common_hal_mdns_server_get_hostname(&mdns); + #else + const char *hostname = ""; + #endif _update_encoded_ip(); // Note: this leverages the fact that C concats consecutive string literals together. mp_printf(&_socket_print, @@ -848,7 +862,6 @@ static void _write_file_and_reply(socketpool_socket_obj_t *socket, _request *req return; } if (result != FR_OK) { - ESP_LOGE(TAG, "file write error %d %s", result, path); override_fattime(0); #if CIRCUITPY_USB_MSC usb_msc_unlock(); @@ -888,20 +901,19 @@ static void _write_file_and_reply(socketpool_socket_obj_t *socket, _request *req size_t read_len = MIN(sizeof(bytes), request->content_length - total_read); int len = socketpool_socket_recv_into(socket, bytes, read_len); if (len < 0) { - if (len == -EAGAIN) { + if (len == -MP_EAGAIN) { continue; - } else { - ESP_LOGE(TAG, "other error %d", len); } error = true; break; } + total_read += len; UINT actual; f_write(&active_file, bytes, len, &actual); - if (actual != (UINT)len) { - ESP_LOGE(TAG, "didn't write whole file"); + if (actual < (UINT)len) { + error = true; + break; } - total_read += len; } f_close(&active_file); @@ -910,7 +922,10 @@ static void _write_file_and_reply(socketpool_socket_obj_t *socket, _request *req #endif override_fattime(0); - if (new_file) { + if (error) { + _discard_incoming(socket, request->content_length - total_read); + _reply_server_error(socket, request); + } else if (new_file) { _reply_created(socket, request); } else { _reply_no_content(socket, request); @@ -934,7 +949,7 @@ STATIC_FILE(blinka_16x16_ico); static void _reply_static(socketpool_socket_obj_t *socket, _request *request, const uint8_t *response, size_t response_len, const char *content_type) { uint32_t total_length = response_len; char encoded_len[10]; - snprintf(encoded_len, sizeof(encoded_len), "%d", total_length); + snprintf(encoded_len, sizeof(encoded_len), "%" PRIu32, total_length); _send_strs(socket, "HTTP/1.1 200 OK\r\n", @@ -1004,9 +1019,10 @@ static void _decode_percents(char *str) { static bool _reply(socketpool_socket_obj_t *socket, _request *request) { if (request->redirect) { + #if CIRCUITPY_MDNS _reply_redirect(socket, request, request->path); + #endif } else if (strlen(request->origin) > 0 && !_origin_ok(request->origin)) { - ESP_LOGE(TAG, "bad origin %s", request->origin); _reply_forbidden(socket, request); } else if (strncmp(request->path, "/fs/", 4) == 0) { if (strcasecmp(request->method, "OPTIONS") == 0) { @@ -1061,7 +1077,6 @@ static bool _reply(socketpool_socket_obj_t *socket, _request *request) { if (result == FR_NO_PATH || result == FR_NO_FILE) { _reply_missing(socket, request); } else if (result != FR_OK) { - ESP_LOGE(TAG, "rm error %d %s", result, path); _reply_server_error(socket, request); } else { _reply_no_content(socket, request); @@ -1089,7 +1104,6 @@ static bool _reply(socketpool_socket_obj_t *socket, _request *request) { } else if (result == FR_NO_PATH || result == FR_NO_FILE) { // Missing higher directories or target file. _reply_missing(socket, request); } else if (result != FR_OK) { - ESP_LOGE(TAG, "move error %d %s", result, path); _reply_server_error(socket, request); } else { _reply_created(socket, request); @@ -1137,7 +1151,6 @@ static bool _reply(socketpool_socket_obj_t *socket, _request *request) { } else if (result == FR_NO_PATH) { _reply_missing(socket, request); } else if (result != FR_OK) { - ESP_LOGE(TAG, "mkdir error %d %s", result, path); _reply_server_error(socket, request); } else { _reply_created(socket, request); @@ -1237,6 +1250,7 @@ static void _reset_request(_request *request) { request->redirect = false; request->done = false; request->in_progress = false; + request->new_socket = false; request->authenticated = false; request->expect = false; request->json = false; @@ -1257,6 +1271,7 @@ static void _process_request(socketpool_socket_obj_t *socket, _request *request) if (!request->in_progress) { autoreload_suspend(AUTORELOAD_SUSPEND_WEB); request->in_progress = true; + request->new_socket = false; } switch (request->state) { case STATE_METHOD: { @@ -1276,7 +1291,6 @@ static void _process_request(socketpool_socket_obj_t *socket, _request *request) if (c == ' ') { request->path[request->offset] = '\0'; request->offset = 0; - ESP_LOGI(TAG, "Request %s %s", request->method, request->path); request->state = STATE_VERSION; } else if (request->offset > sizeof(request->path) - 1) { // Skip methods that are too long. @@ -1352,7 +1366,6 @@ static void _process_request(socketpool_socket_obj_t *socket, _request *request) } else if (strcasecmp(request->header_key, "X-Destination") == 0) { strcpy(request->destination, request->header_value); } - ESP_LOGI(TAG, "Header %s %s", request->header_key, request->header_value); } else if (request->offset > sizeof(request->header_value) - 1) { // Skip methods that are too long. } else { @@ -1369,8 +1382,9 @@ static void _process_request(socketpool_socket_obj_t *socket, _request *request) } if (error) { const char *error_response = "HTTP/1.1 501 Not Implemented\r\n\r\n"; + int nodelay = 1; - lwip_setsockopt(socket->num, IPPROTO_TCP, TCP_NODELAY, &nodelay, sizeof(nodelay)); + common_hal_socketpool_socket_setsockopt(socket, SOCKETPOOL_IPPROTO_TCP, SOCKETPOOL_TCP_NODELAY, &nodelay, sizeof(nodelay)); socketpool_socket_send(socket, (const uint8_t *)error_response, strlen(error_response)); } if (!request->done) { @@ -1386,45 +1400,44 @@ static void _process_request(socketpool_socket_obj_t *socket, _request *request) void supervisor_web_workflow_background(void) { - // Otherwise, see if we have another socket to accept. - if ((!common_hal_socketpool_socket_get_connected(&active) || !active_request.in_progress) && - !common_hal_socketpool_socket_get_closed(&listening) && - listening.num > 0) { - uint32_t ip; - uint32_t port; - int newsoc = socketpool_socket_accept(&listening, (uint8_t *)&ip, &port); - if (newsoc == -EBADF) { - common_hal_socketpool_socket_close(&listening); - return; + // Track if we have more to do. For example, we should start processing a + // request immediately after we accept the socket. + bool more_to_do = true; + while (more_to_do) { + more_to_do = false; + // If we have a request in progress, continue working on it. Do this first + // so that we can accept another socket after finishing this request. + if (common_hal_socketpool_socket_get_connected(&active)) { + _process_request(&active, &active_request); + } else { + // Close the active socket if it is no longer connected. + common_hal_socketpool_socket_close(&active); } - if (newsoc > 0) { - // Close the active socket because we have another we accepted. - if (!common_hal_socketpool_socket_get_closed(&active)) { - common_hal_socketpool_socket_close(&active); + + // Otherwise, see if we have another socket to accept. + if ((!common_hal_socketpool_socket_get_connected(&active) || + (!active_request.in_progress && !active_request.new_socket)) && + !common_hal_socketpool_socket_get_closed(&listening)) { + uint32_t ip; + uint32_t port; + int newsoc = socketpool_socket_accept(&listening, (uint8_t *)&ip, &port, &active); + if (newsoc == -EBADF) { + common_hal_socketpool_socket_close(&listening); + return; } - // TODO: Don't do this because it uses the private struct layout. - // Create the socket - active.num = newsoc; - active.pool = &pool; - active.connected = true; + if (newsoc > 0) { + common_hal_socketpool_socket_settimeout(&active, 0); - common_hal_socketpool_socket_settimeout(&active, 0); - - _reset_request(&active_request); - - lwip_fcntl(newsoc, F_SETFL, O_NONBLOCK); + _reset_request(&active_request); + // Mark new sockets, otherwise we may accept another before the first + // could start its request. + active_request.new_socket = true; + more_to_do = true; + } } - } - // If we have a request in progress, continue working on it. - if (common_hal_socketpool_socket_get_connected(&active)) { - _process_request(&active, &active_request); - } else { - // Close the active socket if it is no longer connected. - common_hal_socketpool_socket_close(&active); + websocket_background(); } - - websocket_background(); } void supervisor_stop_web_workflow(void) { diff --git a/supervisor/shared/web_workflow/websocket.c b/supervisor/shared/web_workflow/websocket.c index 3901c4eefe..7612066fa6 100644 --- a/supervisor/shared/web_workflow/websocket.c +++ b/supervisor/shared/web_workflow/websocket.c @@ -29,15 +29,13 @@ #include "py/ringbuf.h" #include "py/runtime.h" #include "shared/runtime/interrupt_char.h" +#include "shared-bindings/socketpool/SocketPool.h" #include "supervisor/shared/web_workflow/web_workflow.h" #if CIRCUITPY_STATUS_BAR #include "supervisor/shared/status_bar.h" #endif -// TODO: Remove ESP specific stuff. For now, it is useful as we refine the server. -#include "esp_log.h" - typedef struct { socketpool_socket_obj_t socket; uint8_t opcode; @@ -57,24 +55,22 @@ STATIC uint8_t _buf[16]; static _websocket cp_serial; -static const char *TAG = "CP websocket"; - void websocket_init(void) { - cp_serial.socket.num = -1; - cp_serial.socket.connected = false; + socketpool_socket_reset(&cp_serial.socket); + cp_serial.closed = true; ringbuf_init(&_incoming_ringbuf, _buf, sizeof(_buf) - 1); } void websocket_handoff(socketpool_socket_obj_t *socket) { - cp_serial.socket = *socket; + if (!cp_serial.closed) { + common_hal_socketpool_socket_close(&cp_serial.socket); + } + socketpool_socket_move(socket, &cp_serial.socket); cp_serial.closed = false; cp_serial.opcode = 0; cp_serial.frame_index = 0; cp_serial.frame_len = 2; - // Mark the original socket object as closed without telling the lower level. - socket->connected = false; - socket->num = -1; #if CIRCUITPY_STATUS_BAR // Send the title bar for the new client. @@ -89,9 +85,6 @@ bool websocket_connected(void) { static bool _read_byte(uint8_t *c) { int len = socketpool_socket_recv_into(&cp_serial.socket, c, 1); if (len != 1) { - if (len != -EAGAIN) { - ESP_LOGE(TAG, "recv error %d", len); - } return false; } return true; @@ -147,13 +140,10 @@ static void _read_next_frame_header(void) { // Set the TCP socket to send immediately so that we send the payload back before // closing the connection. int nodelay = 1; - lwip_setsockopt(cp_serial.socket.num, IPPROTO_TCP, TCP_NODELAY, &nodelay, sizeof(nodelay)); + common_hal_socketpool_socket_setsockopt(&cp_serial.socket, SOCKETPOOL_IPPROTO_TCP, SOCKETPOOL_TCP_NODELAY, &nodelay, sizeof(nodelay)); } uint8_t frame_header[2]; frame_header[0] = 1 << 7 | opcode; - if (cp_serial.payload_remaining > 125) { - ESP_LOGE(TAG, "CLOSE or PING has long payload"); - } frame_header[1] = cp_serial.payload_remaining; web_workflow_send_raw(&cp_serial.socket, (const uint8_t *)frame_header, 2); } diff --git a/supervisor/supervisor.mk b/supervisor/supervisor.mk index a8deb9606d..801025f41a 100644 --- a/supervisor/supervisor.mk +++ b/supervisor/supervisor.mk @@ -4,6 +4,7 @@ SRC_SUPERVISOR = \ supervisor/shared/background_callback.c \ supervisor/shared/board.c \ supervisor/shared/cpu.c \ + supervisor/shared/fatfs.c \ supervisor/shared/flash.c \ supervisor/shared/lock.c \ supervisor/shared/memory.c \ diff --git a/tests/basics/exception_chain.py b/tests/basics/exception_chain.py index c3a7d6b113..b84ff19dd6 100644 --- a/tests/basics/exception_chain.py +++ b/tests/basics/exception_chain.py @@ -1,6 +1,54 @@ -# Exception chaining is not supported, but check that basic -# exception works as expected. try: - raise Exception from None -except Exception: - print("Caught Exception") + Exception().__cause__ +except AttributeError: + print("SKIP") + raise SystemExit + +def print_exc_info(e): + print("exception", type(e), e.args) + print("context", type(e.__context__), e.__suppress_context__) + print("cause", type(e.__cause__)) + +try: + try: + 1/0 + except Exception as inner: + raise RuntimeError() from inner +except Exception as e: + print_exc_info(e) +print() + +try: + try: + 1/0 + except Exception as inner: + raise RuntimeError() from OSError() +except Exception as e: + print_exc_info(e) +print() + + +try: + try: + 1/0 + except Exception as inner: + raise RuntimeError() +except Exception as e: + print_exc_info(e) +print() + +try: + try: + 1/0 + except Exception as inner: + raise RuntimeError() from None +except Exception as e: + print_exc_info(e) + +try: + try: + raise RuntimeError() + except Exception as inner: + 1/0 +except Exception as e: + print_exc_info(e) diff --git a/tests/basics/exception_chain.py.exp b/tests/basics/exception_chain.py.exp deleted file mode 100644 index 13635b3cde..0000000000 --- a/tests/basics/exception_chain.py.exp +++ /dev/null @@ -1,2 +0,0 @@ -Warning: exception chaining not supported -Caught Exception diff --git a/tests/circuitpython/dotenv_test.py b/tests/circuitpython/dotenv_test.py deleted file mode 100644 index 109a3bf221..0000000000 --- a/tests/circuitpython/dotenv_test.py +++ /dev/null @@ -1,31 +0,0 @@ -import dotenv - -FILE = __file__.rsplit(".", 1)[0] + ".env" - -print(f"notpresent={dotenv.get_key(FILE, 'notpresent')}") -print(f"plain_value={dotenv.get_key(FILE, 'plain_value')}") -print(f"value_with_comment={dotenv.get_key(FILE, 'value_with_comment')}") -print(f"quoted_value={dotenv.get_key(FILE, 'quoted_value')}") -print(f"quoted_value_with_comment={dotenv.get_key(FILE, 'quoted_value_with_comment')}") -print(f"should_be_none={dotenv.get_key(FILE, 'should_be_none')}") -print(f"should_be_empty_string={dotenv.get_key(FILE, 'should_be_empty_string')}") -print(f"should_be_hash={dotenv.get_key(FILE, 'should_be_hash')}") -print(f"quoted_should_be_empty_string={dotenv.get_key(FILE, 'quoted_should_be_empty_string')}") -print(f"duplicate_key={dotenv.get_key(FILE, 'duplicate_key')}") -### This is the a difference from CPython dotenv. The trailing #value is taken as a comment. -print(f"value_with_hash={dotenv.get_key(FILE, 'value_with_hash')}") -print(f"quoted_value_with_hash={dotenv.get_key(FILE, 'quoted_value_with_hash')}") -print(f"multi_line_value={dotenv.get_key(FILE, 'multi_line_value')}") -print(f"space_before_key={dotenv.get_key(FILE, 'space_before_key')}") -print(f"space_before_value={dotenv.get_key(FILE, 'space_before_value')}") -print(f"space_before_hash_value={dotenv.get_key(FILE, 'space_before_hash_value')}") -print(f"space_after_key={dotenv.get_key(FILE, 'space_after_key')}") -print(f"space_after_key_before_value={dotenv.get_key(FILE, 'space_after_key_before_value')}") -print(f"quoted_then_comment={dotenv.get_key(FILE, 'quoted_then_comment')}") -print(f"hash_with_spaces={dotenv.get_key(FILE, 'hash_with_spaces')}") -print(f"aa🐍bb={dotenv.get_key(FILE, 'aa🐍bb')}") -print(f"value_with_emoji={dotenv.get_key(FILE, 'value_with_emoji')}") - -for i in range(12): - key = f"sz{i}" - print(f"len({key})={len(dotenv.get_key(FILE, key))}") diff --git a/tests/circuitpython/dotenv_test.py.exp b/tests/circuitpython/dotenv_test.py.exp deleted file mode 100644 index e0ed5f1505..0000000000 --- a/tests/circuitpython/dotenv_test.py.exp +++ /dev/null @@ -1,35 +0,0 @@ -notpresent=None -plain_value=value -value_with_comment=value -quoted_value=value -quoted_value_with_comment=value -should_be_none=None -should_be_empty_string= -should_be_hash=# -quoted_should_be_empty_string= -duplicate_key=right -value_with_hash=value -quoted_value_with_hash=value#value -multi_line_value=multi -line -space_before_key=value -space_before_value=value -space_before_hash_value=#value -space_after_key=value -space_after_key_before_value=value -quoted_then_comment=value -hash_with_spaces=#value value -aa🐍bb=key with emoji -value_with_emoji=aa🐍bb -len(sz0)=1 -len(sz1)=2 -len(sz2)=4 -len(sz3)=8 -len(sz4)=16 -len(sz5)=32 -len(sz6)=64 -len(sz7)=128 -len(sz8)=256 -len(sz9)=512 -len(sz10)=1024 -len(sz11)=2048 diff --git a/tests/circuitpython/getenv.py b/tests/circuitpython/getenv.py new file mode 100644 index 0000000000..68dd328cfb --- /dev/null +++ b/tests/circuitpython/getenv.py @@ -0,0 +1,89 @@ +import uos + +uos.umount("/") + + +class RAMBlockDevice: + ERASE_BLOCK_SIZE = 512 + + def __init__(self, blocks): + self.data = bytearray(blocks * self.ERASE_BLOCK_SIZE) + + def readblocks(self, block, buf, off=0): + addr = block * self.ERASE_BLOCK_SIZE + off + for i in range(len(buf)): + buf[i] = self.data[addr + i] + + def writeblocks(self, block, buf, off=None): + if off is None: + # erase, then write + off = 0 + addr = block * self.ERASE_BLOCK_SIZE + off + for i in range(len(buf)): + self.data[addr + i] = buf[i] + + def ioctl(self, op, arg): + if op == 4: # block count + return len(self.data) // self.ERASE_BLOCK_SIZE + if op == 5: # block size + return self.ERASE_BLOCK_SIZE + if op == 6: # erase block + return 0 + + +bdev = RAMBlockDevice(64) +uos.VfsFat.mkfs(bdev) +uos.mount(uos.VfsFat(bdev), "/") + +content_good = b""" +# comment +key0 = "hello world" +key1 = 7 +key2= "\\n" +key3 ="\\u00c1x" +key4 = "\\U000000c1x" +key5 = "\\f\\"\\\\" +key6 = "\\t\\r\\b" +key7 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" +key8 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + key9 = "hello comment" # comment + key10 = 0x7f # comment +key11 = 0 +[section] +subvalue = "hi" +""" + +content_bad = [ + b'key = "\n', + b'key = """\n', + b"key =\n", + b'key="', +] + + +def run_test(key, content): + with open("/settings.toml", "wb") as f: + f.write(content) + + try: + v = uos.getenv(key) + print(key, repr(v)) + except Exception as e: + print(key, str(e)) + + +for i in range(13): + run_test(f"key{i}", content_good) + +content_good = content_good.replace(b"\n", b"\r\n") +for i in range(13): + run_test(f"key{i}", content_good) + +run_test(f"K", b"K = 7\r\n") +print(uos.getenv_int("K")) + +# Test value without trailing newline +run_test(f"noeol", b"noeol=3") + +for content in content_bad: + run_test("key", content) diff --git a/tests/circuitpython/dotenv_test.env b/tests/circuitpython/getenv.py.exp similarity index 63% rename from tests/circuitpython/dotenv_test.env rename to tests/circuitpython/getenv.py.exp index 63753b0ea4..ba1b1b3f90 100644 --- a/tests/circuitpython/dotenv_test.env +++ b/tests/circuitpython/getenv.py.exp @@ -1,37 +1,33 @@ -# Key "notpresent" is not present - # comment preceded by spaces -plain_value=value -value_with_comment=value # value followed by a comment -quoted_value='value' -quoted_value_with_comment='value' # quoted value followed by a comment -should_be_none -should_be_empty_string= -should_be_hash=# -quoted_should_be_empty_string='' -duplicate_key=wrong -duplicate_key=right -value_with_hash=value#value -quoted_value_with_hash='value#value' -multi_line_value='multi -line' - space_before_key=value -space_before_value= value -space_before_hash_value= #value -space_after_key =value -space_after_key_before_value = value -quoted_then_comment='value'#comment -hash_with_spaces=#value value -aa🐍bb=key with emoji -value_with_emoji=aa🐍bb -sz0=x -sz1=xx -sz2=xxxx -sz3=xxxxxxxx -sz4=xxxxxxxxxxxxxxxx -sz5=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -sz6=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -sz7=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -sz8=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -sz9=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -sz10=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -sz11=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +key0 'hello world' +key1 7 +key2 '\n' +key3 'Áx' +key4 'Áx' +key5 '\x0c"\\' +key6 '\t\r\x08' +key7 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' +key8 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' +key9 'hello comment' +key10 127 +key11 0 +key12 None +key0 'hello world' +key1 7 +key2 '\n' +key3 'Áx' +key4 'Áx' +key5 '\x0c"\\' +key6 '\t\r\x08' +key7 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' +key8 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' +key9 'hello comment' +key10 127 +key11 0 +key12 None +K 7 +7 +noeol 3 +key Invalid byte '\n' +key Invalid byte '"' +key invalid syntax for integer with base 10: '' +key Invalid byte 'EOF' diff --git a/tests/circuitpython/traceback_test_chained.py b/tests/circuitpython/traceback_test_chained.py new file mode 100644 index 0000000000..dac99e00b4 --- /dev/null +++ b/tests/circuitpython/traceback_test_chained.py @@ -0,0 +1,74 @@ +try: + Exception().__cause__ +except AttributeError: + print("SKIP") + raise SystemExit + +try: + import traceback +except: + print("SKIP") + raise SystemExit + + +def print_exc_info(e, chain=True): + print("-" * 72) + traceback.print_exception(None, e, e.__traceback__, chain=chain) + print("-" * 72) + print() + + +try: + try: + 1 / 0 + except Exception as inner: + raise RuntimeError() from inner +except Exception as e: + print_exc_info(e, chain=False) + print_exc_info(e) +print() + +try: + try: + 1 / 0 + except Exception as inner: + raise RuntimeError() from OSError() +except Exception as e: + print_exc_info(e) +print() + + +try: + try: + 1 / 0 + except Exception as inner: + raise RuntimeError() +except Exception as e: + print_exc_info(e) +print() + +try: + try: + 1 / 0 + except Exception as inner: + raise RuntimeError() from None +except Exception as e: + print_exc_info(e) + +try: + try: + raise RuntimeError() + except Exception as inner: + 1 / 0 +except Exception as e: + print_exc_info(e) + +try: + try: + 1 / 0 + except Exception as inner: + raise inner +except Exception as e: + print_exc_info(e, chain=False) + print_exc_info(e) +print() diff --git a/tests/circuitpython/traceback_test_chained.py.exp b/tests/circuitpython/traceback_test_chained.py.exp new file mode 100644 index 0000000000..a979adc24c --- /dev/null +++ b/tests/circuitpython/traceback_test_chained.py.exp @@ -0,0 +1,76 @@ +------------------------------------------------------------------------ +Traceback (most recent call last): + File "circuitpython/traceback_test_chained.py", line 25, in +RuntimeError: +------------------------------------------------------------------------ + +------------------------------------------------------------------------ +Traceback (most recent call last): + File "circuitpython/traceback_test_chained.py", line 23, in +ZeroDivisionError: division by zero + +The above exception was the direct cause of the following exception: + +Traceback (most recent call last): + File "circuitpython/traceback_test_chained.py", line 25, in +RuntimeError: +------------------------------------------------------------------------ + + +------------------------------------------------------------------------ +OSError: + +The above exception was the direct cause of the following exception: + +Traceback (most recent call last): + File "circuitpython/traceback_test_chained.py", line 35, in +RuntimeError: +------------------------------------------------------------------------ + + +------------------------------------------------------------------------ +Traceback (most recent call last): + File "circuitpython/traceback_test_chained.py", line 43, in +ZeroDivisionError: division by zero + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "circuitpython/traceback_test_chained.py", line 45, in +RuntimeError: +------------------------------------------------------------------------ + + +------------------------------------------------------------------------ +Traceback (most recent call last): + File "circuitpython/traceback_test_chained.py", line 54, in +RuntimeError: +------------------------------------------------------------------------ + +------------------------------------------------------------------------ +Traceback (most recent call last): + File "circuitpython/traceback_test_chained.py", line 60, in +RuntimeError: + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "circuitpython/traceback_test_chained.py", line 62, in +ZeroDivisionError: division by zero +------------------------------------------------------------------------ + +------------------------------------------------------------------------ +Traceback (most recent call last): + File "circuitpython/traceback_test_chained.py", line 70, in + File "circuitpython/traceback_test_chained.py", line 68, in +ZeroDivisionError: division by zero +------------------------------------------------------------------------ + +------------------------------------------------------------------------ +Traceback (most recent call last): + File "circuitpython/traceback_test_chained.py", line 70, in + File "circuitpython/traceback_test_chained.py", line 68, in +ZeroDivisionError: division by zero +------------------------------------------------------------------------ + + diff --git a/tests/run-tests.py b/tests/run-tests.py index ed0cf18e45..7a7b3adbcb 100755 --- a/tests/run-tests.py +++ b/tests/run-tests.py @@ -522,8 +522,12 @@ def run_tests(pyb, tests, args, result_dir, num_threads=1): skip_tests.add("basics/scope_implicit.py") # requires checking for unbound local skip_tests.add("basics/try_finally_return2.py") # requires raise_varargs skip_tests.add("basics/unboundlocal.py") # requires checking for unbound local - skip_tests.add( - "circuitpython/traceback_test.py" + skip_tests.update( + ( + "basics/chained_exception.py", + "circuitpython/traceback_test.py", + "circuitpython/traceback_test_chained.py", + ) ) # because native doesn't have proper traceback info skip_tests.add("extmod/uasyncio_event.py") # unknown issue skip_tests.add("extmod/uasyncio_lock.py") # requires async with diff --git a/tests/unix/extra_coverage.py.exp b/tests/unix/extra_coverage.py.exp index 782ab95cc8..582d90e1bc 100644 --- a/tests/unix/extra_coverage.py.exp +++ b/tests/unix/extra_coverage.py.exp @@ -32,19 +32,18 @@ mport builtins micropython _asyncio _thread _uasyncio aesio array binascii bitmaptools btree cexample cmath -collections cppexample displayio dotenv -errno ffi framebuf gc -gifio hashlib json math -qrio rainbowio re sys -termios traceback ubinascii uctypes -uerrno uheapq uio ujson -ulab ulab.numpy ulab.numpy.fft -ulab.numpy.linalg ulab.scipy -ulab.scipy.linalg ulab.scipy.optimize -ulab.scipy.signal ulab.scipy.special -ulab.utils uos urandom ure -uselect ustruct utime utimeq -uzlib zlib +collections cppexample displayio errno +ffi framebuf gc gifio +hashlib json math qrio +rainbowio re sys termios +traceback ubinascii uctypes uerrno +uheapq uio ujson ulab +ulab.numpy ulab.numpy.fft ulab.numpy.linalg +ulab.scipy ulab.scipy.linalg +ulab.scipy.optimize ulab.scipy.signal +ulab.scipy.special ulab.utils uos +urandom ure uselect ustruct +utime utimeq uzlib zlib ime utime utimeq diff --git a/tools/ci_changes_per_commit.py b/tools/ci_changes_per_commit.py new file mode 100644 index 0000000000..e38c98f40e --- /dev/null +++ b/tools/ci_changes_per_commit.py @@ -0,0 +1,233 @@ +#! /usr/bin/env python3 + +# SPDX-FileCopyrightText: 2021 microDev +# +# SPDX-License-Identifier: MIT + +# GraphQL Query + +QUERY_COMMITS = """ +query ($owner: String!, $name: String!, $pullNumber: Int!, $commitsPerPage: Int!, $beforeCommit: String) { + repository(owner: $owner, name: $name) { + pullRequest(number: $pullNumber) { + commits(last: $commitsPerPage, before: $beforeCommit) { + totalCount + pageInfo { + startCursor + hasPreviousPage + } + nodes { + commit { + checkSuites(first: 3) { + nodes { + conclusion + workflowRun { + workflow { + name + } + } + id + } + totalCount + } + oid + } + } + } + } + } +} +""" + +QUERY_CHECKRUNS = """ +query ($checkSuiteID: ID!, + $afterFailedRun: String, $afterIncompleteRun: String, + $includeFailedRuns: Boolean!, $includeIncompleteRuns: Boolean!) { + node(id: $checkSuiteID) { + ... on CheckSuite { + failedRuns: checkRuns( + first: 100 + after: $afterFailedRun + filterBy: {checkType: LATEST, conclusions: [ACTION_REQUIRED, TIMED_OUT, CANCELLED, FAILURE, NEUTRAL, STARTUP_FAILURE]} + ) @include(if: $includeFailedRuns) { + nodes { + name + } + pageInfo { + endCursor + hasNextPage + } + } + incompleteRuns: checkRuns( + first: 100 + after: $afterIncompleteRun + filterBy: {checkType: LATEST, statuses: [QUEUED, IN_PROGRESS, WAITING, PENDING, REQUESTED]} + ) @include(if: $includeIncompleteRuns) { + nodes { + name + } + pageInfo { + endCursor + hasNextPage + } + } + } + } +} +""" + + +import os +import re +import json +import requests + + +query_variables_commits = { + "owner": "", + "name": "", + "pullNumber": int(os.environ["PULL"]), + "commitsPerPage": 20, + "beforeCommit": None, +} + + +query_variables_checkruns = { + "checkSuiteID": "", + "afterFailedRun": None, + "afterIncompleteRun": None, + "includeFailedRuns": True, + "includeIncompleteRuns": True, +} + + +headers = {"Authorization": f"Bearer {os.environ['GITHUB_TOKEN']}"} + + +class Query: + def __init__(self, query, variables={}, headers={}): + self.query = query + self.variables = variables + self.headers = headers + + def paginate(self, page_info, name): + has_page = ( + page_info["hasNextPage"] if name.startswith("after") else page_info["hasPreviousPage"] + ) + if has_page: + self.variables[name] = ( + page_info["endCursor"] if name.startswith("after") else page_info["startCursor"] + ) + return has_page + + def fetch(self): + request = requests.post( + "https://api.github.com/graphql", + json={"query": self.query, "variables": self.variables}, + headers=self.headers, + ) + if request.status_code == 200: + return request.json() + else: + print(request.json()) + raise Exception("Query Failed: {}".format(request.status_code)) + + +def set_output(name, value): + if "GITHUB_OUTPUT" in os.environ: + with open(os.environ["GITHUB_OUTPUT"], "at") as f: + print(f"{name}={value}", file=f) + else: + print(f"Would set GitHub actions output {name} to '{value}'") + + +def get_commit_and_checksuite(query_commits): + commits = query_commits.fetch()["data"]["repository"]["pullRequest"]["commits"] + + if commits["totalCount"] > 0: + for commit in reversed(commits["nodes"]): + commit = commit["commit"] + commit_sha = commit["oid"] + if commit_sha == os.environ["EXCLUDE_COMMIT"]: + continue + checksuites = commit["checkSuites"] + if checksuites["totalCount"] > 0: + for checksuite in checksuites["nodes"]: + if checksuite["workflowRun"]["workflow"]["name"] == "Build CI": + return [ + commit_sha, + checksuite["id"] if checksuite["conclusion"] != "SUCCESS" else None, + ] + else: + if query_commits.paginate(commits["pageInfo"], "beforeCommit"): + return get_commit_and_checksuite(query_commits) + + return [None, None] + + +def append_runs_to_list(runs, bad_runs_by_matrix): + regex_matrix = re.compile("^build-[^ ]+") + regex_board = re.compile("\([^ ]+\)$") + for run in runs["nodes"]: + name = run["name"] + res_matrix = regex_matrix.search(name) + if res_matrix: + matrix = res_matrix.group() + if matrix not in bad_runs_by_matrix: + bad_runs_by_matrix[matrix] = [] + res_board = regex_board.search(name) + if res_board: + bad_runs_by_matrix[matrix].append(res_board.group()[1:-1]) + + +def get_bad_checkruns(query_checkruns): + more_pages = True + bad_runs_by_matrix = {} + while more_pages: + checkruns = query_checkruns.fetch()["data"]["node"] + run_types = ["failed", "incomplete"] + more_pages = False + + for run_type in run_types: + run_type_camel = run_type.capitalize() + "Run" + run_type = run_type + "Runs" + + append_runs_to_list(checkruns[run_type], bad_runs_by_matrix) + + if query_checkruns.paginate(checkruns[run_type]["pageInfo"], "after" + run_type_camel): + query_checkruns.variables["include" + run_type_camel] = True + more_pages = True + + return bad_runs_by_matrix + + +def main(): + query_commits = Query(QUERY_COMMITS, query_variables_commits, headers) + query_commits.variables["owner"], query_commits.variables["name"] = os.environ["REPO"].split( + "/" + ) + + commit, checksuite = get_commit_and_checksuite(query_commits) + + if checksuite is None: + if commit is None: + print("No checkSuites found -> Abort") + else: + set_output("commit", commit) + quit() + + query_checkruns = Query(QUERY_CHECKRUNS, query_variables_checkruns, headers) + query_checkruns.variables["checkSuiteID"] = checksuite + + checkruns = get_bad_checkruns(query_checkruns) + + if len(checkruns) == 0: + print("No checkRuns found -> Abort") + quit() + + set_output("commit", commit) + set_output("checkruns", json.dumps(checkruns)) + + +if __name__ == "__main__": + main() diff --git a/tools/ci_check_duplicate_usb_vid_pid.py b/tools/ci_check_duplicate_usb_vid_pid.py index a75bd2b3f8..4e5c48c90d 100644 --- a/tools/ci_check_duplicate_usb_vid_pid.py +++ b/tools/ci_check_duplicate_usb_vid_pid.py @@ -60,6 +60,7 @@ DEFAULT_CLUSTERLIST = { "espressif_esp32s2_devkitc_1_n4r2", "espressif_esp32s2_devkitc_1_n8r2", ], + "0x239A:0x102E": ["weact_studio_pico", "weact_studio_pico_16mb"], } cli_parser = argparse.ArgumentParser( diff --git a/tools/ci_set_matrix.py b/tools/ci_set_matrix.py index f22840fad7..77f58742cd 100755 --- a/tools/ci_set_matrix.py +++ b/tools/ci_set_matrix.py @@ -25,7 +25,6 @@ import re import os import sys import json -import yaml import pathlib from concurrent.futures import ThreadPoolExecutor @@ -59,9 +58,13 @@ IGNORE = [ "tools/ci_check_duplicate_usb_vid_pid.py", ] +# Files in these directories never influence board builds +IGNORE_DIRS = ["tests", "docs", ".devcontainer"] + if len(sys.argv) > 1: print("Using files list on commandline") changed_files = sys.argv[1:] + last_failed_jobs = {} else: c = os.environ["CHANGED_FILES"] if c == "": @@ -69,7 +72,14 @@ else: changed_files = [] else: print("Using files list in CHANGED_FILES") - changed_files = json.loads(os.environ["CHANGED_FILES"]) + changed_files = json.loads(c.replace("\\", "")) + + j = os.environ["LAST_FAILED_JOBS"] + if j == "": + print("LAST_FAILED_JOBS is in environment, but value is empty") + last_failed_jobs = {} + else: + last_failed_jobs = json.loads(j) def set_output(name, value): @@ -142,8 +152,7 @@ def set_boards_to_build(build_all): if p in IGNORE: continue - # Boards don't run tests or docs so ignore those as well. - if p.startswith("tests") or p.startswith("docs"): + if any([p.startswith(d) for d in IGNORE_DIRS]): continue # As a (nearly) last resort, for some certain files, we compute the settings from the @@ -208,14 +217,25 @@ def set_boards_to_build(build_all): # Set the step outputs for each architecture for arch in arch_to_boards: + # Append previous failed jobs + if f"build-{arch}" in last_failed_jobs: + failed_boards = last_failed_jobs[f"build-{arch}"] + for board in failed_boards: + if not board in arch_to_boards[arch]: + print(" ", board) + arch_to_boards[arch].append(board) + # Set Output set_output(f"boards-{arch}", json.dumps(sorted(arch_to_boards[arch]))) def set_docs_to_build(build_all): + if "build-doc" in last_failed_jobs: + build_all = True + doc_match = build_all if not build_all: doc_pattern = re.compile( - r"^(?:docs|extmod/ulab|(?:(?:ports/\w+/bindings|shared-bindings)\S+\.c|conf\.py|tools/extract_pyi\.py|requirements-doc\.txt)$)|(?:-stubs|\.(?:md|MD|rst|RST))$" + r"^(?:.github/workflows/|docs|extmod/ulab|(?:(?:ports/\w+/bindings|shared-bindings)\S+\.c|conf\.py|tools/extract_pyi\.py|requirements-doc\.txt)$)|(?:-stubs|\.(?:md|MD|rst|RST))$" ) for p in changed_files: if doc_pattern.search(p): @@ -224,7 +244,7 @@ def set_docs_to_build(build_all): # Set the step outputs print("Building docs:", doc_match) - set_output(f"build-doc", doc_match) + set_output("build-doc", doc_match) def check_changed_files(): diff --git a/tools/extract_pyi.py b/tools/extract_pyi.py index 7b87404fbc..5f4f9c9561 100644 --- a/tools/extract_pyi.py +++ b/tools/extract_pyi.py @@ -228,7 +228,8 @@ def convert_folder(top_level, stub_directory): imports, type_imports = extract_imports(tree) import_lines = ["from __future__ import annotations"] for type_module, used_types in type_imports.items(): - import_lines.append(f"from {type_module} import {', '.join(sorted(used_types))}") + if used_types: + import_lines.append(f"from {type_module} import {', '.join(sorted(used_types))}") import_lines.extend(f"import {m}" for m in sorted(imports)) import_body = "\n".join(import_lines) m = re.match(r'(\s*""".*?""")', stub_contents, flags=re.DOTALL)