Merge branch 'main' into picow-ap
This commit is contained in:
commit
362018dcca
31
.devcontainer/Readme.md
Normal file
31
.devcontainer/Readme.md
Normal file
@ -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.
|
23
.devcontainer/cortex-m/devcontainer.json
Normal file
23
.devcontainer/cortex-m/devcontainer.json
Normal file
@ -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-mq/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"
|
||||
}
|
59
.devcontainer/cortex-m/on-create.sh
Executable file
59
.devcontainer/cortex-m/on-create.sh
Executable file
@ -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
|
28
.github/workflows/build.yml
vendored
28
.github/workflows/build.yml
vendored
@ -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
|
||||
|
||||
|
||||
|
6
.gitmodules
vendored
6
.gitmodules
vendored
@ -312,10 +312,12 @@
|
||||
url = https://github.com/adafruit/esp32-camera/
|
||||
[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
|
||||
|
1
conf.py
1
conf.py
@ -171,6 +171,7 @@ exclude_patterns = ["**/build*",
|
||||
".env",
|
||||
".venv",
|
||||
".direnv",
|
||||
".devcontainer/Readme.md",
|
||||
"data",
|
||||
"docs/autoapi",
|
||||
"docs/README.md",
|
||||
|
13
locale/ID.po
13
locale/ID.po
@ -112,7 +112,7 @@ msgstr "%q gagal: %d"
|
||||
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"
|
||||
|
||||
@ -177,7 +177,7 @@ msgstr "%q harus berupa string"
|
||||
msgid "%q must be an int"
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c
|
||||
#: py/argcheck.c py/obj.c
|
||||
msgid "%q must be of type %q"
|
||||
msgstr "%q harus bertipe %q"
|
||||
|
||||
@ -1683,6 +1683,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"
|
||||
@ -2221,6 +2225,7 @@ 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 ""
|
||||
|
||||
@ -3184,7 +3189,7 @@ msgid "index is out of bounds"
|
||||
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"
|
||||
@ -3436,10 +3441,12 @@ 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 ""
|
||||
|
||||
|
@ -175,7 +175,7 @@ msgstr ""
|
||||
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 ""
|
||||
|
||||
@ -894,6 +894,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 ""
|
||||
@ -1663,6 +1667,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 ""
|
||||
@ -2011,6 +2019,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,6 +2208,7 @@ 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 ""
|
||||
|
||||
@ -3352,10 +3365,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 ""
|
||||
@ -3421,10 +3430,12 @@ 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 ""
|
||||
|
||||
|
13
locale/cs.po
13
locale/cs.po
@ -113,7 +113,7 @@ msgstr "%q: selhání %d"
|
||||
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"
|
||||
|
||||
@ -178,7 +178,7 @@ msgstr "%q musí být string"
|
||||
msgid "%q must be an int"
|
||||
msgstr "%q musí být int"
|
||||
|
||||
#: py/argcheck.c
|
||||
#: py/argcheck.c py/obj.c
|
||||
msgid "%q must be of type %q"
|
||||
msgstr "%q musí být typu %q"
|
||||
|
||||
@ -1679,6 +1679,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 ""
|
||||
@ -2210,6 +2214,7 @@ 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 ""
|
||||
|
||||
@ -3171,7 +3176,7 @@ msgid "index is out of bounds"
|
||||
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 ""
|
||||
@ -3423,10 +3428,12 @@ 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 ""
|
||||
|
||||
|
@ -114,7 +114,7 @@ msgstr "%q Fehler: %d"
|
||||
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"
|
||||
|
||||
@ -180,7 +180,7 @@ msgstr "%q muss ein String sein"
|
||||
msgid "%q must be an int"
|
||||
msgstr "%q muss vom Typ Integer sein"
|
||||
|
||||
#: py/argcheck.c
|
||||
#: py/argcheck.c py/obj.c
|
||||
msgid "%q must be of type %q"
|
||||
msgstr "%q muss vom Type %q sein"
|
||||
|
||||
@ -1700,6 +1700,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"
|
||||
@ -2249,6 +2253,7 @@ 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"
|
||||
|
||||
@ -3242,7 +3247,7 @@ msgid "index is out of bounds"
|
||||
msgstr "Index ist außerhalb der Grenzen"
|
||||
|
||||
#: 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"
|
||||
@ -3500,10 +3505,12 @@ 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"
|
||||
|
||||
|
13
locale/el.po
13
locale/el.po
@ -118,7 +118,7 @@ msgstr "%q αποτυχία: %d"
|
||||
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 δείκτης εκτός εμβέλειας"
|
||||
|
||||
@ -183,7 +183,7 @@ msgstr "%q πρέπει να είναι string"
|
||||
msgid "%q must be an int"
|
||||
msgstr "%q πρέπει να είναι int"
|
||||
|
||||
#: py/argcheck.c
|
||||
#: py/argcheck.c py/obj.c
|
||||
msgid "%q must be of type %q"
|
||||
msgstr "%q πρέπει να είναι τύπου %q"
|
||||
|
||||
@ -1688,6 +1688,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 ""
|
||||
@ -2219,6 +2223,7 @@ 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 ""
|
||||
|
||||
@ -3180,7 +3185,7 @@ msgid "index is out of bounds"
|
||||
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 ""
|
||||
@ -3432,10 +3437,12 @@ 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 ""
|
||||
|
||||
|
@ -116,7 +116,7 @@ msgstr "%q failure: %d"
|
||||
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"
|
||||
|
||||
@ -181,7 +181,7 @@ msgstr "%q must be a string"
|
||||
msgid "%q must be an int"
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c
|
||||
#: py/argcheck.c py/obj.c
|
||||
msgid "%q must be of type %q"
|
||||
msgstr ""
|
||||
|
||||
@ -1683,6 +1683,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"
|
||||
@ -2223,6 +2227,7 @@ 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 ""
|
||||
|
||||
@ -3190,7 +3195,7 @@ msgid "index is out of bounds"
|
||||
msgstr "index is out of bounds"
|
||||
|
||||
#: 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"
|
||||
@ -3442,10 +3447,12 @@ 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 ""
|
||||
|
||||
|
13
locale/es.po
13
locale/es.po
@ -118,7 +118,7 @@ msgstr "%q fallo: %d"
|
||||
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"
|
||||
|
||||
@ -183,7 +183,7 @@ msgstr "%q debe ser una cadena"
|
||||
msgid "%q must be an int"
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c
|
||||
#: py/argcheck.c py/obj.c
|
||||
msgid "%q must be of type %q"
|
||||
msgstr ""
|
||||
|
||||
@ -1707,6 +1707,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"
|
||||
@ -2255,6 +2259,7 @@ 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 ""
|
||||
|
||||
@ -3230,7 +3235,7 @@ msgid "index is out of bounds"
|
||||
msgstr "el índice está fuera de límites"
|
||||
|
||||
#: 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"
|
||||
@ -3485,10 +3490,12 @@ 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 ""
|
||||
|
||||
|
@ -107,7 +107,7 @@ msgstr ""
|
||||
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"
|
||||
|
||||
@ -172,7 +172,7 @@ msgstr ""
|
||||
msgid "%q must be an int"
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c
|
||||
#: py/argcheck.c py/obj.c
|
||||
msgid "%q must be of type %q"
|
||||
msgstr ""
|
||||
|
||||
@ -1678,6 +1678,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 ""
|
||||
@ -2209,6 +2213,7 @@ 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 ""
|
||||
|
||||
@ -3184,7 +3189,7 @@ msgid "index is out of bounds"
|
||||
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"
|
||||
@ -3440,10 +3445,12 @@ 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 ""
|
||||
|
||||
|
13
locale/fr.po
13
locale/fr.po
@ -118,7 +118,7 @@ msgstr "Échec de %q : %d"
|
||||
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"
|
||||
|
||||
@ -183,7 +183,7 @@ msgstr "%q doit être une chaîne de caractères"
|
||||
msgid "%q must be an int"
|
||||
msgstr "%q doit être un entier"
|
||||
|
||||
#: py/argcheck.c
|
||||
#: py/argcheck.c py/obj.c
|
||||
msgid "%q must be of type %q"
|
||||
msgstr "%q doit être du type %q"
|
||||
|
||||
@ -1727,6 +1727,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"
|
||||
@ -2280,6 +2284,7 @@ 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"
|
||||
|
||||
@ -3270,7 +3275,7 @@ msgid "index is out of bounds"
|
||||
msgstr "l'index est hors limites"
|
||||
|
||||
#: 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"
|
||||
@ -3529,10 +3534,12 @@ 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é"
|
||||
|
||||
|
13
locale/hi.po
13
locale/hi.po
@ -106,7 +106,7 @@ msgstr ""
|
||||
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 ""
|
||||
|
||||
@ -171,7 +171,7 @@ msgstr ""
|
||||
msgid "%q must be an int"
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c
|
||||
#: py/argcheck.c py/obj.c
|
||||
msgid "%q must be of type %q"
|
||||
msgstr ""
|
||||
|
||||
@ -1663,6 +1663,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 ""
|
||||
@ -2192,6 +2196,7 @@ 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 ""
|
||||
|
||||
@ -3153,7 +3158,7 @@ msgid "index is out of bounds"
|
||||
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 ""
|
||||
@ -3405,10 +3410,12 @@ 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 ""
|
||||
|
||||
|
@ -113,7 +113,7 @@ msgstr "%q fallito: %d"
|
||||
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"
|
||||
|
||||
@ -178,7 +178,7 @@ msgstr ""
|
||||
msgid "%q must be an int"
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c
|
||||
#: py/argcheck.c py/obj.c
|
||||
msgid "%q must be of type %q"
|
||||
msgstr ""
|
||||
|
||||
@ -1685,6 +1685,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 ""
|
||||
@ -2219,6 +2223,7 @@ 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 ""
|
||||
|
||||
@ -3192,7 +3197,7 @@ msgid "index is out of bounds"
|
||||
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"
|
||||
@ -3449,10 +3454,12 @@ 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 ""
|
||||
|
||||
|
13
locale/ja.po
13
locale/ja.po
@ -111,7 +111,7 @@ msgstr "%q 失敗: %d"
|
||||
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 インデックスは範囲外"
|
||||
|
||||
@ -176,7 +176,7 @@ msgstr ""
|
||||
msgid "%q must be an int"
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c
|
||||
#: py/argcheck.c py/obj.c
|
||||
msgid "%q must be of type %q"
|
||||
msgstr ""
|
||||
|
||||
@ -1676,6 +1676,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 ""
|
||||
@ -2206,6 +2210,7 @@ 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 ""
|
||||
|
||||
@ -3171,7 +3176,7 @@ msgid "index is out of bounds"
|
||||
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 "インデクスが範囲外"
|
||||
@ -3424,10 +3429,12 @@ 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 ""
|
||||
|
||||
|
13
locale/ko.po
13
locale/ko.po
@ -107,7 +107,7 @@ msgstr ""
|
||||
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 인덱스 범위를 벗어났습니다"
|
||||
|
||||
@ -172,7 +172,7 @@ msgstr ""
|
||||
msgid "%q must be an int"
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c
|
||||
#: py/argcheck.c py/obj.c
|
||||
msgid "%q must be of type %q"
|
||||
msgstr ""
|
||||
|
||||
@ -1666,6 +1666,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 ""
|
||||
@ -2196,6 +2200,7 @@ 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 ""
|
||||
|
||||
@ -3157,7 +3162,7 @@ msgid "index is out of bounds"
|
||||
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 ""
|
||||
@ -3409,10 +3414,12 @@ 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 ""
|
||||
|
||||
|
13
locale/nl.po
13
locale/nl.po
@ -109,7 +109,7 @@ msgstr "%q fout: %d"
|
||||
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"
|
||||
|
||||
@ -174,7 +174,7 @@ msgstr ""
|
||||
msgid "%q must be an int"
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c
|
||||
#: py/argcheck.c py/obj.c
|
||||
msgid "%q must be of type %q"
|
||||
msgstr ""
|
||||
|
||||
@ -1680,6 +1680,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 ""
|
||||
@ -2216,6 +2220,7 @@ 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 ""
|
||||
|
||||
@ -3187,7 +3192,7 @@ msgid "index is out of bounds"
|
||||
msgstr "index is buiten bereik"
|
||||
|
||||
#: 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"
|
||||
@ -3442,10 +3447,12 @@ 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 ""
|
||||
|
||||
|
13
locale/pl.po
13
locale/pl.po
@ -111,7 +111,7 @@ msgstr "%q niepowodzenie: %d"
|
||||
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"
|
||||
|
||||
@ -176,7 +176,7 @@ msgstr ""
|
||||
msgid "%q must be an int"
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c
|
||||
#: py/argcheck.c py/obj.c
|
||||
msgid "%q must be of type %q"
|
||||
msgstr ""
|
||||
|
||||
@ -1674,6 +1674,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"
|
||||
@ -2203,6 +2207,7 @@ 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 ""
|
||||
|
||||
@ -3165,7 +3170,7 @@ msgid "index is out of bounds"
|
||||
msgstr "indeks jest poza zakresem"
|
||||
|
||||
#: 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"
|
||||
@ -3417,10 +3422,12 @@ 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 ""
|
||||
|
||||
|
@ -115,7 +115,7 @@ msgstr "%q falha: %d"
|
||||
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"
|
||||
|
||||
@ -180,7 +180,7 @@ msgstr "%q deve ser uma string"
|
||||
msgid "%q must be an int"
|
||||
msgstr "%q deve ser um inteiro"
|
||||
|
||||
#: py/argcheck.c
|
||||
#: py/argcheck.c py/obj.c
|
||||
msgid "%q must be of type %q"
|
||||
msgstr "%q deve ser do tipo %q"
|
||||
|
||||
@ -1709,6 +1709,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 ""
|
||||
|
||||
#: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c
|
||||
msgid "Out of memory"
|
||||
msgstr "Sem memória"
|
||||
@ -2262,6 +2266,7 @@ 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"
|
||||
|
||||
@ -3247,7 +3252,7 @@ msgid "index is out of bounds"
|
||||
msgstr "o índice está fora dos limites"
|
||||
|
||||
#: 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"
|
||||
@ -3503,10 +3508,12 @@ 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"
|
||||
|
||||
|
146
locale/ru.po
146
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 <jepler@gmail.com>\n"
|
||||
"PO-Revision-Date: 2022-11-29 01:02+0000\n"
|
||||
"Last-Translator: Clay <code.clayt@gmail.com>\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-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,14 @@ msgstr "%%c требует int или char"
|
||||
#: main.c
|
||||
#, c-format
|
||||
msgid "%02X"
|
||||
msgstr ""
|
||||
msgstr "%02X"
|
||||
|
||||
#: 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 +93,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 +101,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"
|
||||
@ -114,21 +117,21 @@ msgstr "%q сбой: %d"
|
||||
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
|
||||
msgid "%q length must be %d"
|
||||
msgstr ""
|
||||
msgstr "Длинна %q должна быть %d"
|
||||
|
||||
#: py/argcheck.c
|
||||
msgid "%q length must be %d-%d"
|
||||
@ -136,11 +139,11 @@ 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 ""
|
||||
msgstr "Длинна %q должна быть >= %d"
|
||||
|
||||
#: shared-bindings/busio/I2C.c
|
||||
msgid "%q length must be >= 1"
|
||||
@ -148,44 +151,44 @@ msgstr "Длинна %q должна быть >= 1"
|
||||
|
||||
#: 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
|
||||
#: 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 должен быть строкой"
|
||||
msgstr "%q должно быть строкой"
|
||||
|
||||
#: py/argcheck.c
|
||||
msgid "%q must be an int"
|
||||
msgstr ""
|
||||
msgstr "%q должно быть int"
|
||||
|
||||
#: py/argcheck.c
|
||||
#: py/argcheck.c py/obj.c
|
||||
msgid "%q must be of type %q"
|
||||
msgstr "%q должен быть типа %q"
|
||||
msgstr "%q должно быть типа %q"
|
||||
|
||||
#: 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"
|
||||
@ -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
|
||||
@ -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"
|
||||
@ -598,7 +601,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 +671,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 +683,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 +695,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 +767,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 +788,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,7 +919,7 @@ msgstr "Поворот дисплея должен осуществляться
|
||||
|
||||
#: main.c
|
||||
msgid "Done"
|
||||
msgstr ""
|
||||
msgstr "Выполнено"
|
||||
|
||||
#: shared-bindings/digitalio/DigitalInOut.c
|
||||
msgid "Drive mode not used when direction is input."
|
||||
@ -958,11 +964,12 @@ 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 +999,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"
|
||||
@ -1043,17 +1050,19 @@ 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 +1082,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 +1098,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"
|
||||
@ -1104,7 +1115,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 +1133,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
|
||||
@ -1238,8 +1249,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"
|
||||
@ -1322,12 +1334,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,7 +1363,7 @@ 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"
|
||||
@ -1361,7 +1375,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
|
||||
@ -1426,7 +1440,7 @@ 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 +1468,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 +1483,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 +1492,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
|
||||
@ -1564,8 +1578,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 +1591,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 +1611,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 +1638,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
|
||||
@ -1705,6 +1724,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 ""
|
||||
@ -2241,6 +2264,7 @@ 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 ""
|
||||
|
||||
@ -3202,7 +3226,7 @@ msgid "index is out of bounds"
|
||||
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 ""
|
||||
@ -3454,10 +3478,12 @@ 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 ""
|
||||
|
||||
|
13
locale/sv.po
13
locale/sv.po
@ -114,7 +114,7 @@ msgstr "%q-fel: %d"
|
||||
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"
|
||||
|
||||
@ -181,7 +181,7 @@ msgstr "%q måste vara en sträng"
|
||||
msgid "%q must be an int"
|
||||
msgstr "%q måste vara en int"
|
||||
|
||||
#: py/argcheck.c
|
||||
#: py/argcheck.c py/obj.c
|
||||
msgid "%q must be of type %q"
|
||||
msgstr "%q måste vara av typen %q"
|
||||
|
||||
@ -1691,6 +1691,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 ""
|
||||
|
||||
#: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c
|
||||
msgid "Out of memory"
|
||||
msgstr "Slut på minne"
|
||||
@ -2237,6 +2241,7 @@ 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"
|
||||
|
||||
@ -3215,7 +3220,7 @@ msgid "index is out of bounds"
|
||||
msgstr "index är utanför gränserna"
|
||||
|
||||
#: 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"
|
||||
@ -3470,10 +3475,12 @@ 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"
|
||||
|
||||
|
13
locale/tr.po
13
locale/tr.po
@ -118,7 +118,7 @@ msgstr "%q hata: %d"
|
||||
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"
|
||||
|
||||
@ -183,7 +183,7 @@ msgstr "%q bir string olmalıdır"
|
||||
msgid "%q must be an int"
|
||||
msgstr "%q bir tam sayı olmalıdır"
|
||||
|
||||
#: py/argcheck.c
|
||||
#: py/argcheck.c py/obj.c
|
||||
msgid "%q must be of type %q"
|
||||
msgstr "%q, %q türünde olmalıdır"
|
||||
|
||||
@ -1680,6 +1680,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 ""
|
||||
@ -2212,6 +2216,7 @@ 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 ""
|
||||
|
||||
@ -3173,7 +3178,7 @@ msgid "index is out of bounds"
|
||||
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 ""
|
||||
@ -3425,10 +3430,12 @@ 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 ""
|
||||
|
||||
|
@ -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 <urfdvw@gmail.com>\n"
|
||||
"PO-Revision-Date: 2022-11-19 18:48+0000\n"
|
||||
"Last-Translator: hexthat <hexthat@gmail.com>\n"
|
||||
"Language-Team: Chinese Hanyu Pinyin\n"
|
||||
"Language: zh_Latn_pinyin\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@ -72,7 +72,7 @@ msgstr "%%c xūyào zhěngshù huòzhě zìfú"
|
||||
#: main.c
|
||||
#, c-format
|
||||
msgid "%02X"
|
||||
msgstr ""
|
||||
msgstr "%02X"
|
||||
|
||||
#: shared-bindings/rgbmatrix/RGBMatrix.c
|
||||
#, c-format
|
||||
@ -117,7 +117,7 @@ msgstr "%q Shībài: %d"
|
||||
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"
|
||||
|
||||
@ -183,7 +183,7 @@ 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"
|
||||
|
||||
#: py/argcheck.c
|
||||
#: py/argcheck.c py/obj.c
|
||||
msgid "%q must be of type %q"
|
||||
msgstr "%q bì xū shì %q lèi xíng"
|
||||
|
||||
@ -741,9 +741,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 +793,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 +863,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 +872,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
|
||||
@ -1701,6 +1698,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 ""
|
||||
|
||||
#: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c
|
||||
msgid "Out of memory"
|
||||
msgstr "nèi cún bù zú"
|
||||
@ -2186,7 +2187,7 @@ msgstr "UART xiě rù"
|
||||
|
||||
#: main.c
|
||||
msgid "UID:"
|
||||
msgstr ""
|
||||
msgstr "UID:"
|
||||
|
||||
#: shared-module/usb_hid/Device.c
|
||||
msgid "USB busy"
|
||||
@ -2246,6 +2247,7 @@ 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"
|
||||
|
||||
@ -3225,7 +3227,7 @@ msgid "index is out of bounds"
|
||||
msgstr "suǒyǐn chāochū fànwéi"
|
||||
|
||||
#: 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"
|
||||
@ -3478,10 +3480,12 @@ 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ò"
|
||||
|
||||
|
@ -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 \
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
||||
}
|
@ -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 \
|
||||
|
@ -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
|
||||
|
||||
|
||||
}
|
@ -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-
|
||||
|
||||
@ -172,7 +140,6 @@ SRC_S = supervisor/cpu.s
|
||||
|
||||
SRC_C += \
|
||||
background.c \
|
||||
fatfs_port.c \
|
||||
mphalport.c \
|
||||
boards/$(BOARD)/board.c \
|
||||
boards/$(BOARD)/pins.c \
|
||||
|
@ -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
|
||||
}
|
@ -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
|
||||
@ -250,7 +215,6 @@ endif
|
||||
|
||||
SRC_C += \
|
||||
background.c \
|
||||
fatfs_port.c \
|
||||
mphalport.c \
|
||||
bindings/espidf/__init__.c \
|
||||
boards/$(BOARD)/board.c \
|
||||
@ -458,7 +422,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 $@"
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
@ -240,7 +240,7 @@ socketpool_socket_obj_t *common_hal_socketpool_socket(socketpool_socketpool_obj_
|
||||
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,12 +274,25 @@ 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;
|
||||
}
|
||||
|
||||
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);
|
||||
int newsoc = socketpool_socket_accept(self, ip, port, NULL);
|
||||
|
||||
if (newsoc > 0) {
|
||||
mark_user_socket(newsoc);
|
||||
@ -554,6 +567,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 +599,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;
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -55,31 +55,31 @@ 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;
|
||||
|
@ -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:
|
||||
|
@ -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
|
||||
#
|
||||
|
@ -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;
|
||||
}
|
@ -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
|
||||
|
@ -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 \
|
||||
|
@ -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
|
||||
|
||||
|
||||
}
|
@ -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 \
|
||||
|
@ -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-
|
||||
|
||||
@ -78,6 +49,7 @@ 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 \
|
||||
@ -213,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 \
|
||||
@ -272,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 \
|
||||
@ -443,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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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;
|
||||
|
64
ports/raspberrypi/common-hal/mdns/RemoteService.c
Normal file
64
ports/raspberrypi/common-hal/mdns/RemoteService.c
Normal file
@ -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) {
|
||||
}
|
@ -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,10 +24,17 @@
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "py/runtime.h"
|
||||
#include "lib/oofatfs/ff.h"
|
||||
#pragma once
|
||||
|
||||
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);
|
||||
}
|
||||
#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;
|
307
ports/raspberrypi/common-hal/mdns/Server.c
Normal file
307
ports/raspberrypi/common-hal/mdns/Server.c
Normal file
@ -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;
|
||||
}
|
@ -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,10 +24,17 @@
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "py/runtime.h"
|
||||
#include "lib/oofatfs/ff.h"
|
||||
#pragma once
|
||||
|
||||
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);
|
||||
}
|
||||
#include "py/obj.h"
|
||||
|
||||
#include "lwip/apps/mdns_opts.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;
|
1
ports/raspberrypi/common-hal/mdns/__init__.c
Normal file
1
ports/raspberrypi/common-hal/mdns/__init__.c
Normal file
@ -0,0 +1 @@
|
||||
// No mdns module functions.
|
@ -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,26 @@ 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) {
|
||||
int error = socketpool_resolve_host(socket->pool, host, &bind_addr);
|
||||
if (error != 0) {
|
||||
mp_raise_OSError(EHOSTUNREACH);
|
||||
}
|
||||
|
||||
} 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;
|
||||
}
|
||||
}
|
||||
@ -1164,6 +1192,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 +1248,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;
|
||||
}
|
||||
|
@ -55,18 +55,18 @@ 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;
|
||||
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);
|
||||
|
@ -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"
|
||||
@ -73,13 +69,12 @@ NORETURN static void ro_attribute(int 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);
|
||||
}
|
||||
@ -282,6 +281,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;
|
||||
|
@ -35,6 +35,7 @@ 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;
|
||||
bool enabled;
|
||||
} wifi_radio_obj_t;
|
||||
|
||||
extern void common_hal_wifi_radio_gc_collect(wifi_radio_obj_t *self);
|
||||
|
@ -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
|
||||
|
||||
|
||||
}
|
@ -1 +1 @@
|
||||
Subproject commit 195dfcc10bb6f379e3dea45147590db2203d3c7b
|
||||
Subproject commit 746e0636033d0550b7652688124a77a6a1639cf9
|
@ -1 +1 @@
|
||||
Subproject commit 239918ccc173cb2c2a62f41a40fd893f57faf1d6
|
||||
Subproject commit d26459c32c83aa14a6d4e30237d91cee36e0adbd
|
@ -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
|
||||
|
||||
|
@ -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 \
|
||||
|
@ -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
|
||||
|
70
py/circuitpy_mkenv.mk
Normal file
70
py/circuitpy_mkenv.mk
Normal file
@ -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=<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
|
@ -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)
|
||||
|
@ -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)
|
||||
|
24
py/obj.c
24
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) {
|
||||
|
4
py/obj.h
4
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.
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
|
@ -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"));
|
||||
|
||||
|
53
py/vm.c
53
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) {
|
||||
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) {
|
||||
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) {
|
||||
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
|
||||
|
@ -31,6 +31,13 @@
|
||||
|
||||
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);
|
||||
|
@ -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;
|
||||
|
@ -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) },
|
||||
};
|
||||
|
||||
|
@ -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
|
||||
|
@ -36,6 +36,8 @@
|
||||
#include "shared-bindings/socketpool/Socket.h"
|
||||
#include "shared-bindings/socketpool/SocketPool.h"
|
||||
|
||||
#define SOCKETPOOL_EAI_NONAME (-2)
|
||||
|
||||
//| class SocketPool:
|
||||
//| """A pool of socket resources available for the given radio. Only one
|
||||
//| SocketPool can be created for each radio.
|
||||
@ -52,7 +54,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 +66,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
|
||||
//|
|
||||
@ -143,7 +155,11 @@ STATIC mp_obj_t socketpool_socketpool_getaddrinfo(size_t n_args, const mp_obj_t
|
||||
}
|
||||
|
||||
if (ip_str == mp_const_none) {
|
||||
mp_raise_OSError(-2); // socket.EAI_NONAME from CPython
|
||||
mp_obj_t exc_args[2] = {
|
||||
MP_OBJ_NEW_SMALL_INT(SOCKETPOOL_EAI_NONAME),
|
||||
MP_OBJ_NEW_QSTR(MP_QSTR_Name_space_or_space_service_space_not_space_known),
|
||||
};
|
||||
nlr_raise(mp_obj_new_exception_args(&mp_type_gaierror, 2, exc_args));
|
||||
}
|
||||
|
||||
mp_obj_tuple_t *tuple = MP_OBJ_TO_PTR(mp_obj_new_tuple(5, NULL));
|
||||
@ -162,6 +178,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 +187,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);
|
||||
|
@ -34,16 +34,24 @@
|
||||
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;
|
||||
|
||||
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,
|
||||
|
@ -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"
|
||||
|
@ -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) },
|
||||
|
@ -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) },
|
||||
|
@ -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) },
|
||||
|
@ -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."""
|
||||
//
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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()) {
|
||||
|
@ -140,11 +140,11 @@ 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) {
|
||||
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);
|
||||
|
||||
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;
|
||||
@ -282,10 +282,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 +293,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 +306,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 +316,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 +331,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 +365,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 +377,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 +410,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 +422,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"));
|
||||
|
@ -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);
|
||||
|
@ -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,50 +154,56 @@ 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 color_u _pixelbuf_parse_color(pixelbuf_pixelbuf_obj_t *self, mp_obj_t color) {
|
||||
color_u result;
|
||||
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.
|
||||
if (byteorder->is_dotstar) {
|
||||
*w = 255;
|
||||
result.w = 255;
|
||||
} else {
|
||||
*w = 0;
|
||||
result.w = 0;
|
||||
}
|
||||
|
||||
if (mp_obj_is_int(color) || mp_obj_is_float(color)) {
|
||||
mp_int_t value = mp_obj_is_int(color) ? mp_obj_get_int_truncated(color) : (mp_int_t)mp_obj_get_float(color);
|
||||
*r = value >> 16 & 0xff;
|
||||
*g = (value >> 8) & 0xff;
|
||||
*b = value & 0xff;
|
||||
result.r = value >> 16 & 0xff;
|
||||
result.g = (value >> 8) & 0xff;
|
||||
result.b = value & 0xff;
|
||||
} else {
|
||||
mp_obj_t *items;
|
||||
size_t len;
|
||||
mp_obj_get_array(color, &len, &items);
|
||||
mp_arg_validate_length_range(len, 3, 4, MP_QSTR_color);
|
||||
|
||||
*r = _pixelbuf_get_as_uint8(items[PIXEL_R]);
|
||||
*g = _pixelbuf_get_as_uint8(items[PIXEL_G]);
|
||||
*b = _pixelbuf_get_as_uint8(items[PIXEL_B]);
|
||||
result.r = _pixelbuf_get_as_uint8(items[PIXEL_R]);
|
||||
result.g = _pixelbuf_get_as_uint8(items[PIXEL_G]);
|
||||
result.b = _pixelbuf_get_as_uint8(items[PIXEL_B]);
|
||||
if (len > 3) {
|
||||
if (mp_obj_is_float(items[PIXEL_W])) {
|
||||
*w = 255 * mp_obj_get_float(items[PIXEL_W]);
|
||||
result.w = 255 * mp_obj_get_float(items[PIXEL_W]);
|
||||
} else {
|
||||
*w = mp_obj_get_int_truncated(items[PIXEL_W]);
|
||||
result.w = mp_obj_get_int_truncated(items[PIXEL_W]);
|
||||
}
|
||||
return;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
// Int colors can't set white directly so convert to white when all components are equal.
|
||||
// Also handles RGBW values assigned an RGB tuple.
|
||||
if (!byteorder->is_dotstar && byteorder->bpp == 4 && byteorder->has_white && *r == *g && *r == *b) {
|
||||
*w = *r;
|
||||
*r = 0;
|
||||
*g = 0;
|
||||
*b = 0;
|
||||
if (!byteorder->is_dotstar && byteorder->bpp == 4 && byteorder->has_white && result.r == result.g && result.r == result.b) {
|
||||
result.w = result.r;
|
||||
result.r = 0;
|
||||
result.g = 0;
|
||||
result.b = 0;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
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) {
|
||||
STATIC void _pixelbuf_set_pixel_color(pixelbuf_pixelbuf_obj_t *self, size_t index, color_u rgbw) {
|
||||
uint8_t r = rgbw.r;
|
||||
uint8_t g = rgbw.g;
|
||||
uint8_t b = rgbw.b;
|
||||
uint8_t w = rgbw.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) {
|
||||
@ -234,12 +242,8 @@ STATIC void _pixelbuf_set_pixel_color(pixelbuf_pixelbuf_obj_t *self, size_t inde
|
||||
}
|
||||
|
||||
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);
|
||||
color_u rgbw = _pixelbuf_parse_color(self, value);
|
||||
_pixelbuf_set_pixel_color(self, index, rgbw);
|
||||
}
|
||||
|
||||
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,
|
||||
@ -318,14 +322,10 @@ void common_hal_adafruit_pixelbuf_pixelbuf_show(mp_obj_t self_in) {
|
||||
void common_hal_adafruit_pixelbuf_pixelbuf_fill(mp_obj_t self_in, mp_obj_t fill_color) {
|
||||
pixelbuf_pixelbuf_obj_t *self = native_pixelbuf(self_in);
|
||||
|
||||
uint8_t r;
|
||||
uint8_t g;
|
||||
uint8_t b;
|
||||
uint8_t w;
|
||||
_pixelbuf_parse_color(self, fill_color, &r, &g, &b, &w);
|
||||
color_u rgbw = _pixelbuf_parse_color(self, fill_color);
|
||||
|
||||
for (size_t i = 0; i < self->pixel_count; i++) {
|
||||
_pixelbuf_set_pixel_color(self, i, r, g, b, w);
|
||||
_pixelbuf_set_pixel_color(self, i, rgbw);
|
||||
}
|
||||
if (self->auto_write) {
|
||||
common_hal_adafruit_pixelbuf_pixelbuf_show(self_in);
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user