Merge branch 'adafruit:main' into main
This commit is contained in:
commit
3feaf6adb8
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-m/on-create.sh",
|
||||
"remoteEnv": { "PATH": "/workspaces/gcc-arm-none-eabi/bin:${containerEnv:PATH}" }
|
||||
|
||||
// Features to add to the dev container. More info: https://containers.dev/features.
|
||||
// "features": {},
|
||||
|
||||
// Use 'forwardPorts' to make a list of ports inside the container available locally.
|
||||
// "forwardPorts": [],
|
||||
|
||||
// Use 'postCreateCommand' to run commands after the container is created.
|
||||
// "postCreateCommand": "uname -a",
|
||||
|
||||
// Configure tool-specific properties.
|
||||
// "customizations": {},
|
||||
|
||||
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
|
||||
// "remoteUser": "root"
|
||||
}
|
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
|
2
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
2
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@ -6,7 +6,7 @@ body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: >-
|
||||
Thanks! for testing out CircuitPython. Now that you have encountered a
|
||||
Thanks for testing out CircuitPython! Now that you have encountered a
|
||||
bug... you can file a report for it.
|
||||
- type: textarea
|
||||
id: firmware
|
||||
|
92
.github/actions/deps/external/action.yml
vendored
Normal file
92
.github/actions/deps/external/action.yml
vendored
Normal file
@ -0,0 +1,92 @@
|
||||
name: Fetch external deps
|
||||
|
||||
inputs:
|
||||
action:
|
||||
required: false
|
||||
default: restore
|
||||
type: choice
|
||||
options:
|
||||
- cache
|
||||
- restore
|
||||
|
||||
platform:
|
||||
required: false
|
||||
default: none
|
||||
type: choice
|
||||
options:
|
||||
- arm
|
||||
- aarch
|
||||
- esp
|
||||
- riscv
|
||||
- none
|
||||
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
# aarch
|
||||
- name: Get aarch toolchain
|
||||
if: inputs.platform == 'aarch'
|
||||
run: |
|
||||
wget --no-verbose https://adafruit-circuit-python.s3.amazonaws.com/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf.tar.xz
|
||||
sudo tar -C /usr --strip-components=1 -xaf gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf.tar.xz
|
||||
sudo apt-get install -y mtools
|
||||
shell: bash
|
||||
- name: Install mkfs.fat
|
||||
if: inputs.platform == 'aarch'
|
||||
run: |
|
||||
wget https://github.com/dosfstools/dosfstools/releases/download/v4.2/dosfstools-4.2.tar.gz
|
||||
tar -xaf dosfstools-4.2.tar.gz
|
||||
cd dosfstools-4.2
|
||||
./configure
|
||||
make -j 2
|
||||
cd src
|
||||
echo >> $GITHUB_PATH $(pwd)
|
||||
shell: bash
|
||||
|
||||
# arm
|
||||
- name: Get arm toolchain
|
||||
if: inputs.platform == 'aarch' || inputs.platform == 'arm'
|
||||
uses: carlosperate/arm-none-eabi-gcc-action@v1
|
||||
with:
|
||||
release: '10-2020-q4'
|
||||
|
||||
# esp
|
||||
- name: Get esp toolchain
|
||||
if: inputs.platform == 'esp'
|
||||
run: sudo apt-get install -y ninja-build
|
||||
shell: bash
|
||||
- name: Install IDF tools
|
||||
if: inputs.platform == 'esp'
|
||||
run: |
|
||||
echo "Installing ESP-IDF tools"
|
||||
$IDF_PATH/tools/idf_tools.py --non-interactive install required
|
||||
$IDF_PATH/tools/idf_tools.py --non-interactive install cmake
|
||||
echo "Installing Python environment and packages"
|
||||
$IDF_PATH/tools/idf_tools.py --non-interactive install-python-env
|
||||
rm -rf $IDF_TOOLS_PATH/dist
|
||||
shell: bash
|
||||
- name: Set environment
|
||||
if: inputs.platform == 'esp'
|
||||
run: |
|
||||
source $IDF_PATH/export.sh
|
||||
echo >> $GITHUB_ENV "IDF_PYTHON_ENV_PATH=$IDF_PYTHON_ENV_PATH"
|
||||
echo >> $GITHUB_PATH "$PATH"
|
||||
shell: bash
|
||||
|
||||
# riscv
|
||||
- name: Get riscv toolchain
|
||||
if: inputs.platform == 'riscv'
|
||||
run: |
|
||||
wget https://static.dev.sifive.com/dev-tools/riscv64-unknown-elf-gcc-8.3.0-2019.08.0-x86_64-linux-centos6.tar.gz
|
||||
sudo tar -C /usr --strip-components=1 -xaf riscv64-unknown-elf-gcc-8.3.0-2019.08.0-x86_64-linux-centos6.tar.gz
|
||||
shell: bash
|
||||
|
||||
# common
|
||||
- name: Cache python dependencies
|
||||
if: inputs.platform != 'esp'
|
||||
uses: ./.github/actions/deps/python
|
||||
with:
|
||||
action: ${{ inputs.action }}
|
||||
- name: Install python dependencies
|
||||
run: pip install -r requirements-dev.txt
|
||||
shell: bash
|
36
.github/actions/deps/ports/espressif/action.yml
vendored
Normal file
36
.github/actions/deps/ports/espressif/action.yml
vendored
Normal file
@ -0,0 +1,36 @@
|
||||
name: Fetch espressif port deps
|
||||
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
- name: Set IDF env
|
||||
run: |
|
||||
echo >> $GITHUB_ENV "IDF_PATH=$GITHUB_WORKSPACE/ports/espressif/esp-idf"
|
||||
echo >> $GITHUB_ENV "IDF_TOOLS_PATH=$GITHUB_WORKSPACE/.idf_tools"
|
||||
shell: bash
|
||||
|
||||
- name: Get IDF commit
|
||||
id: idf-commit
|
||||
run: |
|
||||
COMMIT=$(git submodule status ports/espressif/esp-idf | grep -o -P '(?<=^-).*(?= )')
|
||||
echo "$COMMIT"
|
||||
echo "commit=$COMMIT" >> $GITHUB_OUTPUT
|
||||
shell: bash
|
||||
|
||||
- name: Cache IDF submodules
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
.git/modules/ports/espressif/esp-idf
|
||||
ports/espressif/esp-idf
|
||||
key: submodules-idf-${{ steps.idf-commit.outputs.commit }}
|
||||
|
||||
- name: Cache IDF tools
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: ${{ env.IDF_TOOLS_PATH }}
|
||||
key: ${{ runner.os }}-${{ env.pythonLocation }}-tools-idf-${{ steps.idf-commit.outputs.commit }}
|
||||
|
||||
- name: Initialize IDF submodules
|
||||
run: git submodule update --init --depth=1 --recursive $IDF_PATH
|
||||
shell: bash
|
42
.github/actions/deps/python/action.yml
vendored
Normal file
42
.github/actions/deps/python/action.yml
vendored
Normal file
@ -0,0 +1,42 @@
|
||||
name: Fetch python deps
|
||||
|
||||
inputs:
|
||||
action:
|
||||
description: The cache action to use
|
||||
required: false
|
||||
default: restore
|
||||
type: choice
|
||||
options:
|
||||
- cache
|
||||
- restore
|
||||
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
- name: Cache python dependencies
|
||||
id: cache-python-deps
|
||||
if: inputs.action == 'cache'
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: .cp_tools
|
||||
key: ${{ runner.os }}-${{ env.pythonLocation }}-tools-cp-${{ hashFiles('requirements-dev.txt') }}
|
||||
|
||||
- name: Restore python dependencies
|
||||
id: restore-python-deps
|
||||
if: inputs.action == 'restore'
|
||||
uses: actions/cache/restore@v3
|
||||
with:
|
||||
path: .cp_tools
|
||||
key: ${{ runner.os }}-${{ env.pythonLocation }}-tools-cp-${{ hashFiles('requirements-dev.txt') }}
|
||||
|
||||
- name: Set up venv
|
||||
if: inputs.action == 'cache' && !steps.cache-python-deps.outputs.cache-hit
|
||||
run: python -m venv .cp_tools
|
||||
shell: bash
|
||||
|
||||
- name: Activate venv
|
||||
if: inputs.action == 'cache' || (inputs.action == 'restore' && steps.restore-python-deps.outputs.cache-hit)
|
||||
run: |
|
||||
source .cp_tools/bin/activate
|
||||
echo >> $GITHUB_PATH "$PATH"
|
||||
shell: bash
|
87
.github/actions/deps/submodules/action.yml
vendored
Normal file
87
.github/actions/deps/submodules/action.yml
vendored
Normal file
@ -0,0 +1,87 @@
|
||||
name: 'Fetch Submodules'
|
||||
|
||||
inputs:
|
||||
target:
|
||||
description: 'The target for ci_fetch_deps'
|
||||
required: false
|
||||
type: string
|
||||
|
||||
submodules:
|
||||
description: 'The submodules to cache'
|
||||
required: false
|
||||
default: '["extmod/ulab", "lib/", "tools/"]'
|
||||
type: string
|
||||
|
||||
action:
|
||||
description: 'The cache action to use'
|
||||
required: false
|
||||
default: 'restore'
|
||||
type: choice
|
||||
options:
|
||||
- cache
|
||||
- restore
|
||||
|
||||
version:
|
||||
description: 'Whether to generate CP version'
|
||||
required: false
|
||||
default: false
|
||||
type: boolean
|
||||
|
||||
outputs:
|
||||
frozen:
|
||||
description: 'Whether frozen submodules were fetched'
|
||||
value: ${{ steps.cp-deps.outputs.frozen_tags }}
|
||||
|
||||
version:
|
||||
description: 'The CP version'
|
||||
value: ${{ steps.cp-version.outputs.cp-version }}
|
||||
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
- name: Create submodule status
|
||||
id: create-submodule-status
|
||||
run: |
|
||||
git submodule status ${{ join(fromJSON(inputs.submodules), ' ') }} >> submodule_status
|
||||
echo $(cut -d ' ' -f 2 submodule_status) | echo "submodules=[\"$(sed "s/ /\", \"/g")\"]" >> $GITHUB_OUTPUT
|
||||
shell: bash
|
||||
|
||||
- name: Cache submodules
|
||||
if: ${{ inputs.action == 'cache' }}
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: ".git/modules/\n${{ join(fromJSON(steps.create-submodule-status.outputs.submodules), '\n') }}"
|
||||
key: submodules-common-${{ hashFiles('submodule_status') }}
|
||||
enableCrossOsArchive: true
|
||||
|
||||
- name: Restore submodules
|
||||
if: ${{ inputs.action == 'restore' }}
|
||||
uses: actions/cache/restore@v3
|
||||
with:
|
||||
path: ".git/modules/\n${{ join(fromJSON(steps.create-submodule-status.outputs.submodules), '\n') }}"
|
||||
key: submodules-common-${{ hashFiles('submodule_status') }}
|
||||
enableCrossOsArchive: true
|
||||
|
||||
- name: Remove submodule status
|
||||
run: rm submodule_status
|
||||
shell: bash
|
||||
|
||||
- name: CircuitPython dependencies
|
||||
id: cp-deps
|
||||
run: python tools/ci_fetch_deps.py ${{ inputs.target || matrix.board || github.job }}
|
||||
shell: bash
|
||||
|
||||
- name: CircuitPython version
|
||||
id: cp-version
|
||||
if: ${{ inputs.version == 'true' }}
|
||||
run: |
|
||||
echo "::group::Fetch history and tags"
|
||||
git fetch --no-recurse-submodules --shallow-since="2021-07-01" --tags https://github.com/adafruit/circuitpython HEAD
|
||||
git fetch --no-recurse-submodules --shallow-since="2021-07-01" origin $GITHUB_SHA
|
||||
git repack -d
|
||||
echo "::endgroup::"
|
||||
CP_VERSION=$(tools/describe)
|
||||
echo "$CP_VERSION"
|
||||
echo "CP_VERSION=$CP_VERSION" >> $GITHUB_ENV
|
||||
echo "cp-version=$CP_VERSION" >> $GITHUB_OUTPUT
|
||||
shell: bash
|
37
.github/actions/mpy_cross/action.yml
vendored
Normal file
37
.github/actions/mpy_cross/action.yml
vendored
Normal file
@ -0,0 +1,37 @@
|
||||
name: Set up mpy-cross
|
||||
|
||||
inputs:
|
||||
download:
|
||||
required: false
|
||||
default: true
|
||||
type: boolean
|
||||
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
- name: Download mpy-cross
|
||||
id: download-mpy-cross
|
||||
if: inputs.download == 'true'
|
||||
continue-on-error: true
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: mpy-cross
|
||||
path: mpy-cross
|
||||
|
||||
- name: Make mpy-cross executable
|
||||
if: inputs.download == 'true' && steps.download-mpy-cross.outcome == 'success'
|
||||
run: sudo chmod +x mpy-cross/mpy-cross
|
||||
shell: bash
|
||||
|
||||
- name: Build mpy-cross
|
||||
if: inputs.download == 'false' || steps.download-mpy-cross.outcome == 'failure'
|
||||
run: make -C mpy-cross -j2
|
||||
shell: bash
|
||||
|
||||
- name: Upload mpy-cross
|
||||
if: inputs.download == 'false' || steps.download-mpy-cross.outcome == 'failure'
|
||||
continue-on-error: true
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: mpy-cross
|
||||
path: mpy-cross/mpy-cross
|
33
.github/actions/upload_aws/action.yml
vendored
Normal file
33
.github/actions/upload_aws/action.yml
vendored
Normal file
@ -0,0 +1,33 @@
|
||||
name: Upload to AWS S3
|
||||
|
||||
inputs:
|
||||
source:
|
||||
required: true
|
||||
type: string
|
||||
|
||||
destination:
|
||||
required: false
|
||||
type: string
|
||||
|
||||
AWS_ACCESS_KEY_ID:
|
||||
required: true
|
||||
|
||||
AWS_SECRET_ACCESS_KEY:
|
||||
required: true
|
||||
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
- name: Upload to S3
|
||||
if: >-
|
||||
(github.event_name == 'push' && github.ref == 'refs/heads/main' && github.repository_owner == 'adafruit') ||
|
||||
(github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested'))
|
||||
run: >-
|
||||
[ -z "$AWS_ACCESS_KEY_ID" ] ||
|
||||
aws s3 cp ${{ inputs.source }} s3://adafruit-circuit-python/bin/${{ inputs.destination }}
|
||||
${{ endsWith(inputs.source, '/') && '--recursive' || '' }} --no-progress --region us-east-1
|
||||
env:
|
||||
AWS_PAGER: ''
|
||||
AWS_ACCESS_KEY_ID: ${{ inputs.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ inputs.AWS_SECRET_ACCESS_KEY }}
|
||||
shell: bash
|
104
.github/workflows/build-boards-custom.yml
vendored
Normal file
104
.github/workflows/build-boards-custom.yml
vendored
Normal file
@ -0,0 +1,104 @@
|
||||
name: Custom board build
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
board:
|
||||
description: 'Board: Found in ports/*/boards/[board_id]'
|
||||
required: true
|
||||
type: string
|
||||
version:
|
||||
description: 'Version: Can be a tag or a commit (>=8.1.0)'
|
||||
required: false
|
||||
default: latest
|
||||
type: string
|
||||
language:
|
||||
description: 'Language: Found in locale/[language].po'
|
||||
required: false
|
||||
default: en_US
|
||||
type: string
|
||||
flags:
|
||||
description: 'Flags: Build flags (e.g. CIRCUITPY_WIFI=1)'
|
||||
required: false
|
||||
type: string
|
||||
debug:
|
||||
description: 'Make a debug build'
|
||||
required: false
|
||||
default: false
|
||||
type: boolean
|
||||
|
||||
run-name: ${{ inputs.board }}-${{ inputs.language }}-${{ inputs.version }}${{ inputs.flags != '' && '-custom' || '' }}${{ inputs.debug && '-debug' || '' }}
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-22.04
|
||||
env:
|
||||
PLATFORM_atmel-samd: arm
|
||||
PLATFORM_broadcom: aarch
|
||||
PLATFORM_cxd56: arm
|
||||
PLATFORM_espressif: esp
|
||||
PLATFORM_litex: riscv
|
||||
PLATFORM_mimxrt10xx: arm
|
||||
PLATFORM_nrf: arm
|
||||
PLATFORM_raspberrypi: arm
|
||||
PLATFORM_stm: arm
|
||||
steps:
|
||||
- name: Set up repository
|
||||
run: |
|
||||
git clone --filter=tree:0 https://github.com/adafruit/circuitpython.git $GITHUB_WORKSPACE
|
||||
git checkout ${{ inputs.version == 'latest' && 'HEAD' || inputs.version }}
|
||||
- name: Set up identifier
|
||||
if: inputs.debug || inputs.flags != ''
|
||||
run: |
|
||||
> custom-build && git add custom-build
|
||||
- name: Get port
|
||||
id: get-port
|
||||
run: |
|
||||
PORT=$(find ports/*/boards/ -type d -name ${{ inputs.board }} | sed 's/^ports\///g;s/\/boards.*//g')
|
||||
if [ -z $PORT ]; then (exit 1); else echo >> $GITHUB_OUTPUT "port=$PORT"; fi
|
||||
- name: Port to platform
|
||||
run: echo >> $GITHUB_ENV "PLATFORM=${{ env[format('PLATFORM_{0}', steps.get-port.outputs.port)] }}"
|
||||
- name: Set up python
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: 3.x
|
||||
- name: Set up port
|
||||
if: env.PLATFORM == 'esp'
|
||||
uses: ./.github/actions/deps/ports/espressif
|
||||
- name: Set up submodules
|
||||
id: set-up-submodules
|
||||
uses: ./.github/actions/deps/submodules
|
||||
with:
|
||||
action: cache
|
||||
target: ${{ inputs.board }}
|
||||
- name: Set up external
|
||||
uses: ./.github/actions/deps/external
|
||||
with:
|
||||
action: cache
|
||||
platform: ${{ env.PLATFORM }}
|
||||
- name: Set up mpy-cross
|
||||
if: steps.set-up-submodules.outputs.frozen == 'True'
|
||||
uses: ./.github/actions/mpy_cross
|
||||
with:
|
||||
download: false
|
||||
- name: Versions
|
||||
run: |
|
||||
tools/describe
|
||||
gcc --version
|
||||
python3 --version
|
||||
cmake --version || true
|
||||
ninja --version || true
|
||||
aarch64-none-elf-gcc --version || true
|
||||
arm-none-eabi-gcc --version || true
|
||||
xtensa-esp32-elf-gcc --version || true
|
||||
riscv32-esp-elf-gcc --version || true
|
||||
riscv64-unknown-elf-gcc --version || true
|
||||
mkfs.fat --version || true
|
||||
- name: Build board
|
||||
run: make -j2 ${{ inputs.flags }} BOARD=${{ inputs.board }} DEBUG=${{ inputs.debug && '1' || '0' }} TRANSLATION=${{ inputs.language }}
|
||||
working-directory: ports/${{ steps.get-port.outputs.port }}
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: ${{ inputs.board }}-${{ inputs.language }}-${{ inputs.version }}${{ inputs.flags != '' && '-custom' || '' }}${{ inputs.debug && '-debug' || '' }}
|
||||
path: ports/${{ steps.get-port.outputs.port }}/build-${{ inputs.board }}/firmware.*
|
85
.github/workflows/build-boards.yml
vendored
Normal file
85
.github/workflows/build-boards.yml
vendored
Normal file
@ -0,0 +1,85 @@
|
||||
name: Build boards
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
platform:
|
||||
required: true
|
||||
type: string
|
||||
boards:
|
||||
required: true
|
||||
type: string
|
||||
cp-version:
|
||||
required: true
|
||||
type: string
|
||||
secrets:
|
||||
AWS_ACCESS_KEY_ID:
|
||||
required: false
|
||||
AWS_SECRET_ACCESS_KEY:
|
||||
required: false
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-22.04
|
||||
env:
|
||||
CP_VERSION: ${{ inputs.cp-version }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
board: ${{ fromJSON(inputs.boards) }}
|
||||
steps:
|
||||
- name: Set up repository
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: false
|
||||
fetch-depth: 1
|
||||
- name: Set up python
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: 3.x
|
||||
- name: Set up port
|
||||
if: inputs.platform == 'esp'
|
||||
uses: ./.github/actions/deps/ports/espressif
|
||||
- name: Set up submodules
|
||||
id: set-up-submodules
|
||||
uses: ./.github/actions/deps/submodules
|
||||
- name: Set up external
|
||||
uses: ./.github/actions/deps/external
|
||||
with:
|
||||
platform: ${{ inputs.platform }}
|
||||
- name: Set up mpy-cross
|
||||
if: steps.set-up-submodules.outputs.frozen == 'True'
|
||||
uses: ./.github/actions/mpy_cross
|
||||
|
||||
- name: Versions
|
||||
run: |
|
||||
gcc --version
|
||||
python3 --version
|
||||
cmake --version || true
|
||||
ninja --version || true
|
||||
aarch64-none-elf-gcc --version || true
|
||||
arm-none-eabi-gcc --version || true
|
||||
xtensa-esp32-elf-gcc --version || true
|
||||
riscv32-esp-elf-gcc --version || true
|
||||
riscv64-unknown-elf-gcc --version || true
|
||||
mkfs.fat --version || true
|
||||
|
||||
- name: Set up build failure matcher
|
||||
run: echo "::add-matcher::$GITHUB_WORKSPACE/.github/workflows/match-build-fail.json"
|
||||
- name: Build board
|
||||
run: python3 -u build_release_files.py
|
||||
working-directory: tools
|
||||
env:
|
||||
BOARDS: ${{ matrix.board }}
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: ${{ matrix.board }}
|
||||
path: bin/${{ matrix.board }}
|
||||
- name: Upload to S3
|
||||
uses: ./.github/actions/upload_aws
|
||||
with:
|
||||
source: bin/
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
70
.github/workflows/build-mpy-cross.yml
vendored
Normal file
70
.github/workflows/build-mpy-cross.yml
vendored
Normal file
@ -0,0 +1,70 @@
|
||||
name: Build mpy-cross
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
cp-version:
|
||||
required: true
|
||||
type: string
|
||||
secrets:
|
||||
AWS_ACCESS_KEY_ID:
|
||||
required: false
|
||||
AWS_SECRET_ACCESS_KEY:
|
||||
required: false
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-22.04
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
mpy-cross: ["static", "static-aarch64", "static-mingw", "static-raspbian"]
|
||||
env:
|
||||
CP_VERSION: ${{ inputs.cp-version }}
|
||||
EX_static-mingw: static.exe
|
||||
OS_static: linux-amd64
|
||||
OS_static-aarch64: linux-aarch64
|
||||
OS_static-mingw: windows
|
||||
OS_static-raspbian: linux-raspbian
|
||||
steps:
|
||||
- name: Set up repository
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: false
|
||||
fetch-depth: 1
|
||||
- name: Set up python
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: 3.x
|
||||
- name: Set up submodules
|
||||
uses: ./.github/actions/deps/submodules
|
||||
with:
|
||||
target: mpy-cross
|
||||
|
||||
- name: Install toolchain (aarch64)
|
||||
if: matrix.mpy-cross == 'static-aarch64'
|
||||
run: sudo apt-get install -y gcc-aarch64-linux-gnu
|
||||
- name: Install toolchain (mingw)
|
||||
if: matrix.mpy-cross == 'static-mingw'
|
||||
run: sudo apt-get install -y mingw-w64
|
||||
|
||||
- name: Build mpy-cross.${{ matrix.mpy-cross }}
|
||||
run: make -C mpy-cross -j2 -f Makefile.${{ matrix.mpy-cross }}
|
||||
|
||||
- name: Set output
|
||||
run: |
|
||||
echo >> $GITHUB_ENV "EX=${{ env[format('EX_{0}', matrix.mpy-cross)] || matrix.mpy-cross }}"
|
||||
echo >> $GITHUB_ENV "OS=${{ env[format('OS_{0}', matrix.mpy-cross)] }}"
|
||||
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: mpy-cross.${{ env.EX }}
|
||||
path: mpy-cross/mpy-cross.${{ env.EX }}
|
||||
- name: Upload to S3
|
||||
uses: ./.github/actions/upload_aws
|
||||
with:
|
||||
source: mpy-cross/mpy-cross.${{ env.EX }}
|
||||
destination: mpy-cross/${{ env.OS }}/mpy-cross-${{ env.OS }}-${{ env.CP_VERSION }}.${{ env.EX }}
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
547
.github/workflows/build.yml
vendored
547
.github/workflows/build.yml
vendored
@ -17,166 +17,113 @@ concurrency:
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
test:
|
||||
scheduler:
|
||||
runs-on: ubuntu-20.04
|
||||
outputs:
|
||||
build-doc: ${{ steps.set-matrix.outputs.build-doc }}
|
||||
boards-arm: ${{ steps.set-matrix.outputs.boards-arm }}
|
||||
boards-riscv: ${{ steps.set-matrix.outputs.boards-riscv }}
|
||||
boards-espressif: ${{ steps.set-matrix.outputs.boards-espressif }}
|
||||
build-boards: ${{ steps.set-matrix.outputs.build-boards }}
|
||||
boards-aarch: ${{ steps.set-matrix.outputs.boards-aarch }}
|
||||
boards-arm: ${{ steps.set-matrix.outputs.boards-arm }}
|
||||
boards-esp: ${{ steps.set-matrix.outputs.boards-esp }}
|
||||
boards-riscv: ${{ steps.set-matrix.outputs.boards-riscv }}
|
||||
boards-rpi: ${{ steps.set-matrix.outputs.boards-rpi }}
|
||||
cp-version: ${{ steps.set-up-submodules.outputs.version }}
|
||||
steps:
|
||||
- name: Dump GitHub context
|
||||
run: echo "$GITHUB_CONTEXT"
|
||||
env:
|
||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||
run: echo "$GITHUB_CONTEXT"
|
||||
- uses: actions/checkout@v3
|
||||
- name: Set up repository
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: false
|
||||
fetch-depth: 1
|
||||
- name: Set up Python 3
|
||||
- name: Set up python
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: "3.10"
|
||||
- name: Get CP deps
|
||||
run: python tools/ci_fetch_deps.py test ${{ github.sha }}
|
||||
- name: CircuitPython version
|
||||
run: |
|
||||
tools/describe || git log --parents HEAD~4..
|
||||
echo >>$GITHUB_ENV CP_VERSION=$(tools/describe)
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y eatmydata
|
||||
sudo eatmydata apt-get install -y gettext gcc-aarch64-linux-gnu mingw-w64
|
||||
pip install -r requirements-ci.txt -r requirements-dev.txt
|
||||
- name: Versions
|
||||
run: |
|
||||
gcc --version
|
||||
python3 --version
|
||||
- name: Duplicate USB VID/PID Check
|
||||
python-version: 3.x
|
||||
- name: Duplicate USB VID/PID check
|
||||
run: python3 -u -m tools.ci_check_duplicate_usb_vid_pid
|
||||
- name: Build mpy-cross
|
||||
run: make -C mpy-cross -j2
|
||||
- name: Build unix port
|
||||
run: |
|
||||
make -C ports/unix VARIANT=coverage -j2
|
||||
- name: Test all
|
||||
run: MICROPY_CPYTHON3=python3.8 MICROPY_MICROPYTHON=../ports/unix/micropython-coverage ./run-tests.py -j1
|
||||
working-directory: tests
|
||||
- name: Print failure info
|
||||
run: MICROPY_CPYTHON3=python3.8 MICROPY_MICROPYTHON=../ports/unix/micropython-coverage ./run-tests.py -j1 --print-failures
|
||||
if: failure()
|
||||
working-directory: tests
|
||||
- name: Native Tests
|
||||
run: MICROPY_CPYTHON3=python3.8 MICROPY_MICROPYTHON=../ports/unix/micropython-coverage ./run-tests.py -j1 --emit native
|
||||
working-directory: tests
|
||||
- name: mpy Tests
|
||||
run: MICROPY_CPYTHON3=python3.8 MICROPY_MICROPYTHON=../ports/unix/micropython-coverage ./run-tests.py -j1 --via-mpy -d basics float micropython
|
||||
working-directory: tests
|
||||
- name: Native mpy Tests
|
||||
run: MICROPY_CPYTHON3=python3.8 MICROPY_MICROPYTHON=../ports/unix/micropython-coverage ./run-tests.py -j1 --via-mpy --emit native -d basics float micropython
|
||||
working-directory: tests
|
||||
- name: Build native modules
|
||||
run: |
|
||||
make -C examples/natmod/features1
|
||||
make -C examples/natmod/features2
|
||||
make -C examples/natmod/btree
|
||||
make -C examples/natmod/framebuf
|
||||
make -C examples/natmod/uheapq
|
||||
make -C examples/natmod/urandom
|
||||
make -C examples/natmod/ure
|
||||
make -C examples/natmod/uzlib
|
||||
- name: Test native modules
|
||||
run: MICROPY_CPYTHON3=python3.8 MICROPY_MICROPYTHON=../ports/unix/micropython-coverage ./run-natmodtests.py extmod/{btree*,framebuf*,uheapq*,ure*,uzlib*}.py
|
||||
working-directory: tests
|
||||
- name: Build mpy-cross.static-aarch64
|
||||
run: make -C mpy-cross -j2 -f Makefile.static-aarch64
|
||||
- uses: actions/upload-artifact@v3
|
||||
- name: Set up submodules
|
||||
id: set-up-submodules
|
||||
uses: ./.github/actions/deps/submodules
|
||||
with:
|
||||
name: mpy-cross.static-aarch64
|
||||
path: mpy-cross/mpy-cross.static-aarch64
|
||||
- name: Build mpy-cross.static-raspbian
|
||||
run: make -C mpy-cross -j2 -f Makefile.static-raspbian
|
||||
- uses: actions/upload-artifact@v3
|
||||
action: cache
|
||||
version: true
|
||||
- name: Set up external
|
||||
uses: ./.github/actions/deps/external
|
||||
with:
|
||||
name: mpy-cross.static-raspbian
|
||||
path: mpy-cross/mpy-cross.static-raspbian
|
||||
- name: Build mpy-cross.static
|
||||
run: make -C mpy-cross -j2 -f Makefile.static
|
||||
- uses: actions/upload-artifact@v3
|
||||
action: cache
|
||||
# Disabled: Needs to be updated
|
||||
# - name: Get last commit with checks
|
||||
# id: get-last-commit-with-checks
|
||||
# if: github.event_name == 'pull_request'
|
||||
# working-directory: tools
|
||||
# run: python3 -u ci_changes_per_commit.py
|
||||
# env:
|
||||
# REPO: ${{ github.repository }}
|
||||
# PULL: ${{ github.event.number }}
|
||||
# GITHUB_TOKEN: ${{ github.token }}
|
||||
# EXCLUDE_COMMIT: ${{ github.event.after }}
|
||||
- name: Set up mpy-cross
|
||||
uses: ./.github/actions/mpy_cross
|
||||
with:
|
||||
name: mpy-cross.static-amd64-linux
|
||||
path: mpy-cross/mpy-cross.static
|
||||
- name: Build mpy-cross.static-mingw
|
||||
run: make -C mpy-cross -j2 -f Makefile.static-mingw
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: mpy-cross.static-x64-windows
|
||||
path: mpy-cross/mpy-cross.static.exe
|
||||
- name: Upload mpy-cross builds to S3
|
||||
if: (github.event_name == 'push' && github.ref == 'refs/heads/main' && github.repository_owner == 'adafruit') || (github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested'))
|
||||
env:
|
||||
AWS_PAGER: ''
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
run: |
|
||||
[ -z "$AWS_ACCESS_KEY_ID" ] || aws s3 cp mpy-cross/mpy-cross.static-aarch64 s3://adafruit-circuit-python/bin/mpy-cross/mpy-cross.static-aarch64-${{ env.CP_VERSION }} --no-progress --region us-east-1
|
||||
[ -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 last commit with checks
|
||||
id: get-last-commit-with-checks
|
||||
download: false
|
||||
- name: Set head sha
|
||||
if: github.event_name == 'pull_request'
|
||||
working-directory: tools
|
||||
run: echo "HEAD_SHA=$(git show -s --format=%s $GITHUB_SHA | grep -o -P "(?<=Merge ).*(?= into)")" >> $GITHUB_ENV
|
||||
- name: Set base sha
|
||||
if: github.event_name == 'pull_request'
|
||||
run: |
|
||||
git fetch --no-tags --no-recurse-submodules --depth=$((DEPTH + 1)) origin $HEAD_SHA
|
||||
echo "BASE_SHA=$(git rev-list $HEAD_SHA --skip=$DEPTH --max-count=1)" >> $GITHUB_ENV
|
||||
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
|
||||
DEPTH: ${{ steps.get-last-commit-with-checks.outputs.commit_depth || github.event.pull_request.commits }}
|
||||
- name: Get changes
|
||||
id: get-changes
|
||||
if: github.event_name == 'pull_request'
|
||||
uses: tj-actions/changed-files@v34
|
||||
with:
|
||||
json: true
|
||||
sha: ${{ steps.get-last-commit-with-checks.outputs.commit && github.event.after }}
|
||||
base_sha: ${{ steps.get-last-commit-with-checks.outputs.commit }}
|
||||
run: echo $(git diff $BASE_SHA...$HEAD_SHA --name-only) | echo "changed_files=[\"$(sed "s/ /\", \"/g")\"]" >> $GITHUB_OUTPUT
|
||||
- name: Set matrix
|
||||
id: set-matrix
|
||||
working-directory: tools
|
||||
env:
|
||||
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
|
||||
env:
|
||||
CHANGED_FILES: ${{ steps.get-changes.outputs.changed_files }}
|
||||
LAST_FAILED_JOBS: ${{ steps.get-last-commit-with-checks.outputs.check_runs }}
|
||||
|
||||
tests:
|
||||
needs: scheduler
|
||||
if: needs.scheduler.outputs.build-boards == 'True'
|
||||
uses: ./.github/workflows/run-tests.yml
|
||||
with:
|
||||
cp-version: ${{ needs.scheduler.outputs.cp-version }}
|
||||
|
||||
mpy-cross:
|
||||
needs: scheduler
|
||||
if: needs.scheduler.outputs.build-boards == 'True'
|
||||
uses: ./.github/workflows/build-mpy-cross.yml
|
||||
secrets: inherit
|
||||
with:
|
||||
cp-version: ${{ needs.scheduler.outputs.cp-version }}
|
||||
|
||||
mpy-cross-mac:
|
||||
runs-on: macos-11
|
||||
steps:
|
||||
- name: Dump GitHub context
|
||||
needs: scheduler
|
||||
if: ${{ needs.scheduler.outputs.build-boards == 'True' }}
|
||||
env:
|
||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||
run: echo "$GITHUB_CONTEXT"
|
||||
- uses: actions/checkout@v3
|
||||
CP_VERSION: ${{ needs.scheduler.outputs.cp-version }}
|
||||
steps:
|
||||
- name: Set up repository
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: false
|
||||
fetch-depth: 1
|
||||
- name: Set up Python 3
|
||||
- name: Set up python
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: "3.10"
|
||||
- name: Get CP deps
|
||||
run: python tools/ci_fetch_deps.py mpy-cross-mac ${{ github.sha }}
|
||||
- name: CircuitPython version
|
||||
run: |
|
||||
tools/describe || git log --parents HEAD~4..
|
||||
echo >>$GITHUB_ENV CP_VERSION=$(tools/describe)
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
brew install gettext
|
||||
echo >>$GITHUB_PATH /usr/local/opt/gettext/bin
|
||||
python-version: 3.x
|
||||
- name: Set up submodules
|
||||
uses: ./.github/actions/deps/submodules
|
||||
- name: Versions
|
||||
run: |
|
||||
gcc --version
|
||||
@ -196,47 +143,46 @@ jobs:
|
||||
path: mpy-cross/mpy-cross-arm64
|
||||
- name: Make universal binary
|
||||
run: lipo -create -output mpy-cross-macos-universal mpy-cross/mpy-cross mpy-cross/mpy-cross-arm64
|
||||
- uses: actions/upload-artifact@v3
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: mpy-cross-macos-11-universal
|
||||
path: mpy-cross-macos-universal
|
||||
- name: Upload mpy-cross build to S3
|
||||
- name: Upload to S3
|
||||
if: >-
|
||||
(github.event_name == 'push' && github.ref == 'refs/heads/main' && github.repository_owner == 'adafruit') ||
|
||||
(github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested'))
|
||||
run: |
|
||||
[ -z "$AWS_ACCESS_KEY_ID" ] || aws s3 cp mpy-cross-macos-universal s3://adafruit-circuit-python/bin/mpy-cross/mpy-cross-macos-11-${{ env.CP_VERSION }}-universal --no-progress --region us-east-1
|
||||
[ -z "$AWS_ACCESS_KEY_ID" ] || aws s3 cp mpy-cross/mpy-cross-arm64 s3://adafruit-circuit-python/bin/mpy-cross/mpy-cross-macos-11-${{ env.CP_VERSION }}-arm64 --no-progress --region us-east-1
|
||||
[ -z "$AWS_ACCESS_KEY_ID" ] || aws s3 cp mpy-cross/mpy-cross s3://adafruit-circuit-python/bin/mpy-cross/mpy-cross-macos-11-${{ env.CP_VERSION }}-x64 --no-progress --region us-east-1
|
||||
[ -z "$AWS_ACCESS_KEY_ID" ] || aws s3 cp mpy-cross-macos-universal s3://adafruit-circuit-python/bin/mpy-cross/macos-11/mpy-cross-macos-11-${{ env.CP_VERSION }}-universal --no-progress --region us-east-1
|
||||
[ -z "$AWS_ACCESS_KEY_ID" ] || aws s3 cp mpy-cross/mpy-cross-arm64 s3://adafruit-circuit-python/bin/mpy-cross/macos-11/mpy-cross-macos-11-${{ env.CP_VERSION }}-arm64 --no-progress --region us-east-1
|
||||
[ -z "$AWS_ACCESS_KEY_ID" ] || aws s3 cp mpy-cross/mpy-cross s3://adafruit-circuit-python/bin/mpy-cross/macos-11/mpy-cross-macos-11-${{ env.CP_VERSION }}-x64 --no-progress --region us-east-1
|
||||
env:
|
||||
AWS_PAGER: ''
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
if: (github.event_name == 'push' && github.ref == 'refs/heads/main' && github.repository_owner == 'adafruit') || (github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested'))
|
||||
|
||||
|
||||
build-doc:
|
||||
runs-on: ubuntu-20.04
|
||||
needs: test
|
||||
if: ${{ needs.test.outputs.build-doc == 'True' }}
|
||||
runs-on: ubuntu-22.04
|
||||
needs: scheduler
|
||||
if: ${{ needs.scheduler.outputs.build-doc == 'True' }}
|
||||
env:
|
||||
CP_VERSION: ${{ needs.scheduler.outputs.cp-version }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Set up repository
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: false
|
||||
fetch-depth: 1
|
||||
- name: Get CP deps
|
||||
run: python tools/ci_fetch_deps.py docs ${{ github.sha }}
|
||||
- name: CircuitPython version
|
||||
run: |
|
||||
tools/describe || git log --parents HEAD~4..
|
||||
echo >>$GITHUB_ENV CP_VERSION=$(tools/describe)
|
||||
- name: Set up Python 3
|
||||
- name: Set up python
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: "3.10"
|
||||
python-version: 3.x
|
||||
- name: Set up submodules
|
||||
uses: ./.github/actions/deps/submodules
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y eatmydata
|
||||
sudo eatmydata apt-get install -y latexmk librsvg2-bin texlive-fonts-recommended texlive-latex-recommended texlive-latex-extra
|
||||
pip install -r requirements-ci.txt -r requirements-doc.txt
|
||||
sudo apt-get install -y latexmk librsvg2-bin texlive-fonts-recommended texlive-latex-recommended texlive-latex-extra
|
||||
pip install -r requirements-doc.txt
|
||||
- name: Build and Validate Stubs
|
||||
run: make check-stubs -j2
|
||||
- uses: actions/upload-artifact@v3
|
||||
@ -256,15 +202,13 @@ jobs:
|
||||
with:
|
||||
name: docs
|
||||
path: _build/latex
|
||||
- name: Upload stubs to S3
|
||||
if: (github.event_name == 'push' && github.ref == 'refs/heads/main' && github.repository_owner == 'adafruit') || (github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested'))
|
||||
env:
|
||||
AWS_PAGER: ''
|
||||
- name: Upload to S3
|
||||
uses: ./.github/actions/upload_aws
|
||||
with:
|
||||
source: circuitpython-stubs/dist/*.tar.gz
|
||||
destination: stubs/circuitpython-stubs-${{ env.CP_VERSION }}.tar.gz
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
run: |
|
||||
zip -9r circuitpython-stubs.zip circuitpython-stubs
|
||||
[ -z "$AWS_ACCESS_KEY_ID" ] || aws s3 cp circuitpython-stubs/dist/*.tar.gz s3://adafruit-circuit-python/bin/stubs/circuitpython-stubs-${{ env.CP_VERSION }}.zip --no-progress --region us-east-1
|
||||
- name: Upload stubs to PyPi
|
||||
if: github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested')
|
||||
env:
|
||||
@ -275,263 +219,52 @@ jobs:
|
||||
[ -z "$TWINE_USERNAME" ] || echo "Uploading dev release to PyPi"
|
||||
[ -z "$TWINE_USERNAME" ] || twine upload circuitpython-stubs/dist/*
|
||||
|
||||
aarch:
|
||||
needs: [scheduler, mpy-cross, tests]
|
||||
if: ${{ needs.scheduler.outputs.boards-aarch != '[]' }}
|
||||
uses: ./.github/workflows/build-boards.yml
|
||||
secrets: inherit
|
||||
with:
|
||||
platform: aarch
|
||||
boards: ${{ needs.scheduler.outputs.boards-aarch }}
|
||||
cp-version: ${{ needs.scheduler.outputs.cp-version }}
|
||||
|
||||
build-arm:
|
||||
runs-on: ubuntu-20.04
|
||||
needs: test
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
board: ${{ fromJSON(needs.test.outputs.boards-arm) }}
|
||||
if: ${{ needs.test.outputs.boards-arm != '[]' }}
|
||||
steps:
|
||||
- name: Set up Python 3
|
||||
uses: actions/setup-python@v4
|
||||
arm:
|
||||
needs: [scheduler, mpy-cross, tests]
|
||||
if: ${{ needs.scheduler.outputs.boards-arm != '[]' }}
|
||||
uses: ./.github/workflows/build-boards.yml
|
||||
secrets: inherit
|
||||
with:
|
||||
python-version: "3.10"
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: false
|
||||
fetch-depth: 1
|
||||
- name: Get CP deps
|
||||
run: python tools/ci_fetch_deps.py ${{ matrix.board }} ${{ github.sha }}
|
||||
- uses: carlosperate/arm-none-eabi-gcc-action@v1
|
||||
with:
|
||||
release: '10-2020-q4'
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get install -y gettext
|
||||
pip install -r requirements-ci.txt -r requirements-dev.txt
|
||||
- name: Versions
|
||||
run: |
|
||||
gcc --version
|
||||
arm-none-eabi-gcc --version
|
||||
python3 --version
|
||||
- name: mpy-cross
|
||||
run: make -C mpy-cross -j2
|
||||
- name: Setup build failure matcher
|
||||
run: echo "::add-matcher::$GITHUB_WORKSPACE/.github/workflows/match-build-fail.json"
|
||||
- name: build
|
||||
run: python3 -u build_release_files.py
|
||||
working-directory: tools
|
||||
env:
|
||||
BOARDS: ${{ matrix.board }}
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: ${{ matrix.board }}
|
||||
path: bin/${{ matrix.board }}
|
||||
- name: Upload to S3
|
||||
run: "[ -z \"$AWS_ACCESS_KEY_ID\" ] || aws s3 cp bin/ s3://adafruit-circuit-python/bin/ --recursive --no-progress --region us-east-1"
|
||||
env:
|
||||
AWS_PAGER: ''
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
if: (github.event_name == 'push' && github.ref == 'refs/heads/main' && github.repository_owner == 'adafruit') || (github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested'))
|
||||
platform: arm
|
||||
boards: ${{ needs.scheduler.outputs.boards-arm }}
|
||||
cp-version: ${{ needs.scheduler.outputs.cp-version }}
|
||||
|
||||
esp:
|
||||
needs: [scheduler, mpy-cross, tests]
|
||||
if: ${{ needs.scheduler.outputs.boards-esp != '[]' }}
|
||||
uses: ./.github/workflows/build-boards.yml
|
||||
secrets: inherit
|
||||
with:
|
||||
platform: esp
|
||||
boards: ${{ needs.scheduler.outputs.boards-esp }}
|
||||
cp-version: ${{ needs.scheduler.outputs.cp-version }}
|
||||
|
||||
build-riscv:
|
||||
runs-on: ubuntu-20.04
|
||||
needs: test
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
board: ${{ fromJSON(needs.test.outputs.boards-riscv) }}
|
||||
if: ${{ needs.test.outputs.boards-riscv != '[]' }}
|
||||
steps:
|
||||
- name: Set up Python 3
|
||||
uses: actions/setup-python@v4
|
||||
riscv:
|
||||
needs: [scheduler, mpy-cross, tests]
|
||||
if: ${{ needs.scheduler.outputs.boards-riscv != '[]' }}
|
||||
uses: ./.github/workflows/build-boards.yml
|
||||
secrets: inherit
|
||||
with:
|
||||
python-version: "3.10"
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: false
|
||||
fetch-depth: 1
|
||||
- name: Get CP deps
|
||||
run: python tools/ci_fetch_deps.py ${{ matrix.board }} ${{ github.sha }}
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get install -y gettext
|
||||
pip install -r requirements-ci.txt -r requirements-dev.txt
|
||||
wget https://static.dev.sifive.com/dev-tools/riscv64-unknown-elf-gcc-8.3.0-2019.08.0-x86_64-linux-centos6.tar.gz
|
||||
sudo tar -C /usr --strip-components=1 -xaf riscv64-unknown-elf-gcc-8.3.0-2019.08.0-x86_64-linux-centos6.tar.gz
|
||||
- name: Versions
|
||||
run: |
|
||||
gcc --version
|
||||
riscv64-unknown-elf-gcc --version
|
||||
python3 --version
|
||||
- name: mpy-cross
|
||||
run: make -C mpy-cross -j2
|
||||
- name: Setup build failure matcher
|
||||
run: echo "::add-matcher::$GITHUB_WORKSPACE/.github/workflows/match-build-fail.json"
|
||||
- name: build
|
||||
run: python3 -u build_release_files.py
|
||||
working-directory: tools
|
||||
env:
|
||||
BOARDS: ${{ matrix.board }}
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: ${{ matrix.board }}
|
||||
path: bin/${{ matrix.board }}
|
||||
- name: Upload to S3
|
||||
run: "[ -z \"$AWS_ACCESS_KEY_ID\" ] || aws s3 cp bin/ s3://adafruit-circuit-python/bin/ --recursive --no-progress --region us-east-1"
|
||||
env:
|
||||
AWS_PAGER: ''
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
if: (github.event_name == 'push' && github.ref == 'refs/heads/main' && github.repository_owner == 'adafruit') || (github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested'))
|
||||
platform: riscv
|
||||
boards: ${{ needs.scheduler.outputs.boards-riscv }}
|
||||
cp-version: ${{ needs.scheduler.outputs.cp-version }}
|
||||
|
||||
|
||||
build-espressif:
|
||||
runs-on: ubuntu-20.04
|
||||
needs: test
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
board: ${{ fromJSON(needs.test.outputs.boards-espressif) }}
|
||||
if: ${{ needs.test.outputs.boards-espressif != '[]' }}
|
||||
steps:
|
||||
- name: Set up Python 3
|
||||
id: py3
|
||||
uses: actions/setup-python@v4
|
||||
rpi:
|
||||
needs: [scheduler, mpy-cross, tests]
|
||||
if: ${{ needs.scheduler.outputs.boards-rpi != '[]' }}
|
||||
uses: ./.github/workflows/build-boards.yml
|
||||
secrets: inherit
|
||||
with:
|
||||
python-version: "3.10"
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: false
|
||||
fetch-depth: 1
|
||||
- name: Get CP deps
|
||||
run: python tools/ci_fetch_deps.py ${{ matrix.board }} ${{ github.sha }}
|
||||
- name: CircuitPython version
|
||||
run: |
|
||||
tools/describe || git log --parents HEAD~4..
|
||||
echo >>$GITHUB_ENV CP_VERSION=$(tools/describe)
|
||||
- uses: actions/cache@v3
|
||||
name: Fetch IDF tool cache
|
||||
id: idf-cache
|
||||
with:
|
||||
path: ${{ github.workspace }}/.idf_tools
|
||||
key: ${{ runner.os }}-idf-tools-${{ hashFiles('.git/modules/ports/espressif/esp-idf/HEAD') }}-${{ steps.py3.outputs.python-path }}-20220404
|
||||
- name: Clone IDF submodules
|
||||
run: |
|
||||
(cd $IDF_PATH && git submodule update --init)
|
||||
env:
|
||||
IDF_PATH: ${{ github.workspace }}/ports/espressif/esp-idf
|
||||
- name: Install IDF tools
|
||||
run: |
|
||||
$IDF_PATH/tools/idf_tools.py --non-interactive install required
|
||||
$IDF_PATH/tools/idf_tools.py --non-interactive install cmake
|
||||
$IDF_PATH/tools/idf_tools.py --non-interactive install-python-env
|
||||
rm -rf $IDF_TOOLS_PATH/dist
|
||||
env:
|
||||
IDF_PATH: ${{ github.workspace }}/ports/espressif/esp-idf
|
||||
IDF_TOOLS_PATH: ${{ github.workspace }}/.idf_tools
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
source $IDF_PATH/export.sh
|
||||
sudo apt-get install -y gettext ninja-build
|
||||
pip install -r requirements-ci.txt -r requirements-dev.txt
|
||||
env:
|
||||
IDF_PATH: ${{ github.workspace }}/ports/espressif/esp-idf
|
||||
IDF_TOOLS_PATH: ${{ github.workspace }}/.idf_tools
|
||||
- name: Versions
|
||||
run: |
|
||||
source $IDF_PATH/export.sh
|
||||
gcc --version
|
||||
xtensa-esp32s2-elf-gcc --version
|
||||
python3 --version
|
||||
ninja --version
|
||||
cmake --version
|
||||
shell: bash
|
||||
env:
|
||||
IDF_PATH: ${{ github.workspace }}/ports/espressif/esp-idf
|
||||
IDF_TOOLS_PATH: ${{ github.workspace }}/.idf_tools
|
||||
- name: mpy-cross
|
||||
run: make -C mpy-cross -j2
|
||||
- name: Setup build failure matcher
|
||||
run: echo "::add-matcher::$GITHUB_WORKSPACE/.github/workflows/match-build-fail.json"
|
||||
- name: build
|
||||
run: |
|
||||
source $IDF_PATH/export.sh
|
||||
python3 -u build_release_files.py
|
||||
working-directory: tools
|
||||
shell: bash
|
||||
env:
|
||||
IDF_PATH: ${{ github.workspace }}/ports/espressif/esp-idf
|
||||
IDF_TOOLS_PATH: ${{ github.workspace }}/.idf_tools
|
||||
BOARDS: ${{ matrix.board }}
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: ${{ matrix.board }}
|
||||
path: bin/${{ matrix.board }}
|
||||
- name: Upload to S3
|
||||
run: "[ -z \"$AWS_ACCESS_KEY_ID\" ] || aws s3 cp bin/ s3://adafruit-circuit-python/bin/ --recursive --no-progress --region us-east-1"
|
||||
env:
|
||||
AWS_PAGER: ''
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
if: (github.event_name == 'push' && github.ref == 'refs/heads/main' && github.repository_owner == 'adafruit') || (github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested'))
|
||||
|
||||
build-aarch:
|
||||
runs-on: ubuntu-20.04
|
||||
needs: test
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
board: ${{ fromJSON(needs.test.outputs.boards-aarch) }}
|
||||
if: ${{ needs.test.outputs.boards-aarch != '[]' }}
|
||||
steps:
|
||||
- name: Set up Python 3
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: "3.10"
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: false
|
||||
fetch-depth: 1
|
||||
- name: Get CP deps
|
||||
run: python tools/ci_fetch_deps.py ${{ matrix.board }} ${{ github.sha }}
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get install -y gettext mtools
|
||||
pip install -r requirements-ci.txt -r requirements-dev.txt
|
||||
wget --no-verbose https://adafruit-circuit-python.s3.amazonaws.com/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf.tar.xz
|
||||
sudo tar -C /usr --strip-components=1 -xaf gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf.tar.xz
|
||||
- uses: carlosperate/arm-none-eabi-gcc-action@v1
|
||||
with:
|
||||
release: '10-2020-q4'
|
||||
- name: Install mkfs.fat
|
||||
run: |
|
||||
wget https://github.com/dosfstools/dosfstools/releases/download/v4.2/dosfstools-4.2.tar.gz
|
||||
tar -xaf dosfstools-4.2.tar.gz
|
||||
cd dosfstools-4.2
|
||||
./configure
|
||||
make -j 2
|
||||
cd src
|
||||
echo >>$GITHUB_PATH $(pwd)
|
||||
- name: Versions
|
||||
run: |
|
||||
gcc --version
|
||||
aarch64-none-elf-gcc --version
|
||||
arm-none-eabi-gcc --version
|
||||
python3 --version
|
||||
mkfs.fat --version || true
|
||||
- name: mpy-cross
|
||||
run: make -C mpy-cross -j2
|
||||
- name: Setup build failure matcher
|
||||
run: echo "::add-matcher::$GITHUB_WORKSPACE/.github/workflows/match-build-fail.json"
|
||||
- name: build
|
||||
run: python3 -u build_release_files.py
|
||||
working-directory: tools
|
||||
env:
|
||||
BOARDS: ${{ matrix.board }}
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: ${{ matrix.board }}
|
||||
path: bin/${{ matrix.board }}
|
||||
- name: Upload to S3
|
||||
run: "[ -z \"$AWS_ACCESS_KEY_ID\" ] || aws s3 cp bin/ s3://adafruit-circuit-python/bin/ --recursive --no-progress --region us-east-1"
|
||||
env:
|
||||
AWS_PAGER: ''
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||
if: (github.event_name == 'push' && github.ref == 'refs/heads/main' && github.repository_owner == 'adafruit') || (github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested'))
|
||||
platform: arm
|
||||
boards: ${{ needs.scheduler.outputs.boards-rpi }}
|
||||
cp-version: ${{ needs.scheduler.outputs.cp-version }}
|
||||
|
29
.github/workflows/create_website_pr.yml
vendored
29
.github/workflows/create_website_pr.yml
vendored
@ -6,41 +6,38 @@ name: Update CircuitPython.org
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
types: [published, rerequested]
|
||||
|
||||
jobs:
|
||||
website:
|
||||
runs-on: ubuntu-20.04
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- name: Dump GitHub context
|
||||
run: echo "$GITHUB_CONTEXT"
|
||||
env:
|
||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||
run: echo "$GITHUB_CONTEXT"
|
||||
- uses: actions/checkout@v3
|
||||
- name: Set up repository
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: false
|
||||
fetch-depth: 1
|
||||
- name: Set up Python 3
|
||||
- name: Set up python
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: "3.10"
|
||||
- name: Get CP deps
|
||||
run: python tools/ci_fetch_deps.py website ${{ github.sha }}
|
||||
- name: Install deps
|
||||
run: |
|
||||
pip install -r requirements-dev.txt
|
||||
python-version: 3.x
|
||||
- name: Set up submodules
|
||||
uses: ./.github/actions/deps/submodules
|
||||
with:
|
||||
version: true
|
||||
- name: Set up external
|
||||
uses: ./.github/actions/deps/external
|
||||
- name: Versions
|
||||
run: |
|
||||
gcc --version
|
||||
python3 --version
|
||||
- name: CircuitPython version
|
||||
run: |
|
||||
tools/describe || git log --parents HEAD~4..
|
||||
echo >>$GITHUB_ENV CP_VERSION=$(tools/describe)
|
||||
- name: Website
|
||||
run: python3 build_board_info.py
|
||||
working-directory: tools
|
||||
env:
|
||||
RELEASE_TAG: ${{ github.event.release.tag_name }}
|
||||
ADABOT_GITHUB_ACCESS_TOKEN: ${{ secrets.ADABOT_GITHUB_ACCESS_TOKEN }}
|
||||
if: github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested')
|
||||
|
10
.github/workflows/notify.yml
vendored
10
.github/workflows/notify.yml
vendored
@ -7,8 +7,12 @@ on:
|
||||
jobs:
|
||||
notify:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
issues: write
|
||||
steps:
|
||||
- uses: jenschelkopf/issue-label-notification-action@1.3
|
||||
- uses: tekktrik/issue-labeled-ping@v1
|
||||
with:
|
||||
recipients: |
|
||||
ulab=@v923z
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
user: v923z
|
||||
label: ulab
|
||||
message: Heads up {user} - the "{label}" label was applied to this issue.
|
||||
|
23
.github/workflows/ports_windows.yml
vendored
23
.github/workflows/ports_windows.yml
vendored
@ -4,7 +4,7 @@ on:
|
||||
push:
|
||||
pull_request:
|
||||
paths:
|
||||
- '.github/workflows/*.yml'
|
||||
- '.github/workflows/ports_windows.yml'
|
||||
- 'extmod/**'
|
||||
- 'lib/**'
|
||||
- 'mpy-cross/**'
|
||||
@ -19,8 +19,8 @@ concurrency:
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: windows-2019
|
||||
windows:
|
||||
runs-on: windows-2022
|
||||
defaults:
|
||||
run:
|
||||
# We define a custom shell script here, although `msys2.cmd` does neither exist nor is it available in the PATH yet
|
||||
@ -32,8 +32,7 @@ jobs:
|
||||
shell: bash
|
||||
|
||||
- name: Check python coding (cmd)
|
||||
run: |
|
||||
python -c "import sys, locale; print(sys.getdefaultencoding(), locale.getpreferredencoding(False))"
|
||||
run: python -c "import sys, locale; print(sys.getdefaultencoding(), locale.getpreferredencoding(False))"
|
||||
shell: cmd
|
||||
|
||||
# We use a JS Action, which calls the system terminal or other custom terminals directly, if required
|
||||
@ -71,16 +70,16 @@ jobs:
|
||||
which python; python --version; python -c "import cascadetoml"
|
||||
which python3; python3 --version; python3 -c "import cascadetoml"
|
||||
|
||||
- uses: actions/checkout@v3
|
||||
- name: Set up repository
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: false
|
||||
fetch-depth: 1
|
||||
- name: Get CP deps
|
||||
run: python tools/ci_fetch_deps.py windows ${{ github.sha }}
|
||||
- name: CircuitPython version
|
||||
run: |
|
||||
tools/describe || git log --parents HEAD~4..
|
||||
echo >>$GITHUB_ENV CP_VERSION=$(tools/describe)
|
||||
|
||||
- name: Set up submodules
|
||||
uses: ./.github/actions/deps/submodules
|
||||
with:
|
||||
version: true
|
||||
|
||||
- name: build mpy-cross
|
||||
run: make -j2 -C mpy-cross
|
||||
|
31
.github/workflows/pre-commit.yml
vendored
31
.github/workflows/pre-commit.yml
vendored
@ -16,24 +16,23 @@ jobs:
|
||||
pre-commit:
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Set up Python 3
|
||||
- name: Set up repository
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: false
|
||||
fetch-depth: 1
|
||||
- name: Set up python
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: "3.10"
|
||||
- name: Install deps
|
||||
run: |
|
||||
sudo apt-get install -y gettext uncrustify
|
||||
pip3 install black polib pyyaml
|
||||
- name: Populate selected submodules
|
||||
run: git submodule update --init extmod/ulab
|
||||
- name: Set PY
|
||||
run: echo >>$GITHUB_ENV PY="$(python -c 'import hashlib, sys;print(hashlib.sha256(sys.version.encode()+sys.executable.encode()).hexdigest())')"
|
||||
- uses: actions/cache@v3
|
||||
with:
|
||||
path: ~/.cache/pre-commit
|
||||
key: pre-commit|${{ env.PY }}|${{ hashFiles('.pre-commit-config.yaml') }}
|
||||
- uses: pre-commit/action@v3.0.0
|
||||
python-version: 3.x
|
||||
- name: Set up submodules
|
||||
uses: ./.github/actions/deps/submodules
|
||||
- name: Set up external
|
||||
uses: ./.github/actions/deps/external
|
||||
- name: Install dependencies
|
||||
run: sudo apt-get install -y gettext uncrustify
|
||||
- name: Run pre-commit
|
||||
uses: pre-commit/action@v3.0.0
|
||||
- name: Make patch
|
||||
if: failure()
|
||||
run: git diff > ~/pre-commit.patch
|
||||
|
67
.github/workflows/run-tests.yml
vendored
Normal file
67
.github/workflows/run-tests.yml
vendored
Normal file
@ -0,0 +1,67 @@
|
||||
name: Run tests
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
cp-version:
|
||||
required: true
|
||||
type: string
|
||||
|
||||
jobs:
|
||||
run:
|
||||
runs-on: ubuntu-20.04
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
test: [all, mpy, native, native_mpy]
|
||||
env:
|
||||
CP_VERSION: ${{ inputs.cp-version }}
|
||||
MICROPY_CPYTHON3: python3.8
|
||||
MICROPY_MICROPYTHON: ../ports/unix/micropython-coverage
|
||||
TEST_all:
|
||||
TEST_mpy: --via-mpy -d basics float micropython
|
||||
TEST_native: --emit native
|
||||
TEST_native_mpy: --via-mpy --emit native -d basics float micropython
|
||||
steps:
|
||||
- name: Set up repository
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: false
|
||||
fetch-depth: 1
|
||||
- name: Set up python
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: 3.x
|
||||
- name: Set up submodules
|
||||
uses: ./.github/actions/deps/submodules
|
||||
with:
|
||||
target: tests
|
||||
- name: Set up external
|
||||
if: matrix.test == 'all'
|
||||
uses: ./.github/actions/deps/external
|
||||
- name: Set up mpy-cross
|
||||
uses: ./.github/actions/mpy_cross
|
||||
- name: Build unix port
|
||||
run: make -C ports/unix VARIANT=coverage -j2
|
||||
- name: Run tests
|
||||
run: ./run-tests.py -j2 ${{ env[format('TEST_{0}', matrix.test)] }}
|
||||
working-directory: tests
|
||||
- name: Print failure info
|
||||
run: ./run-tests.py -j2 --print-failures
|
||||
if: failure()
|
||||
working-directory: tests
|
||||
- name: Build native modules
|
||||
if: matrix.test == 'all'
|
||||
run: |
|
||||
make -C examples/natmod/features1
|
||||
make -C examples/natmod/features2
|
||||
make -C examples/natmod/btree
|
||||
make -C examples/natmod/framebuf
|
||||
make -C examples/natmod/uheapq
|
||||
make -C examples/natmod/urandom
|
||||
make -C examples/natmod/ure
|
||||
make -C examples/natmod/uzlib
|
||||
- name: Test native modules
|
||||
if: matrix.test == 'all'
|
||||
run: ./run-natmodtests.py extmod/{btree*,framebuf*,uheapq*,ure*,uzlib*}.py
|
||||
working-directory: tests
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -9,6 +9,7 @@
|
||||
!atmel-samd/asf/**/*.a
|
||||
*.elf
|
||||
*.bin
|
||||
!*.toml.bin
|
||||
*.map
|
||||
*.hex
|
||||
*.dis
|
||||
|
9
.gitmodules
vendored
9
.gitmodules
vendored
@ -146,7 +146,7 @@
|
||||
[submodule "ports/espressif/esp-idf"]
|
||||
path = ports/espressif/esp-idf
|
||||
url = https://github.com/adafruit/esp-idf.git
|
||||
branch = circuitpython8
|
||||
branch = release/v4.4-circuitpython
|
||||
[submodule "ports/espressif/certificates/nina-fw"]
|
||||
path = lib/certificates/nina-fw
|
||||
url = https://github.com/adafruit/nina-fw.git
|
||||
@ -310,12 +310,15 @@
|
||||
[submodule "ports/espressif/esp32-camera"]
|
||||
path = ports/espressif/esp32-camera
|
||||
url = https://github.com/adafruit/esp32-camera/
|
||||
branch = circuitpython
|
||||
[submodule "ports/raspberrypi/lib/cyw43-driver"]
|
||||
path = ports/raspberrypi/lib/cyw43-driver
|
||||
url = https://github.com/georgerobotics/cyw43-driver.git
|
||||
url = https://github.com/adafruit/cyw43-driver.git
|
||||
branch = circuitpython8
|
||||
[submodule "ports/raspberrypi/lib/lwip"]
|
||||
path = ports/raspberrypi/lib/lwip
|
||||
url = https://github.com/lwip-tcpip/lwip.git
|
||||
url = https://github.com/adafruit/lwip.git
|
||||
branch = circuitpython8
|
||||
[submodule "lib/mbedtls"]
|
||||
path = lib/mbedtls
|
||||
url = https://github.com/ARMmbed/mbedtls.git
|
||||
|
@ -14,7 +14,7 @@ build:
|
||||
python: "3"
|
||||
jobs:
|
||||
post_install:
|
||||
- python tools/ci_fetch_deps.py docs HEAD
|
||||
- python tools/ci_fetch_deps.py build-doc
|
||||
|
||||
formats:
|
||||
- pdf
|
||||
|
7
Makefile
7
Makefile
@ -90,7 +90,7 @@ clean:
|
||||
rm -rf autoapi
|
||||
rm -rf $(STUBDIR) $(DISTDIR) *.egg-info
|
||||
|
||||
html: stubs
|
||||
html:
|
||||
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
|
||||
@ -323,10 +323,11 @@ clean-nrf:
|
||||
clean-stm:
|
||||
$(MAKE) -C ports/stm BOARD=feather_stm32f405_express clean
|
||||
|
||||
.PHONY: fetch-submodules
|
||||
fetch-submodules:
|
||||
|
||||
# This update will fail because the commits we need aren't the latest on the
|
||||
# branch. We can ignore that though because we fix it with the second command.
|
||||
# (Only works for git servers that allow sha fetches.)
|
||||
.PHONY: fetch-submodules
|
||||
fetch-submodules:
|
||||
git submodule update --init -N --depth 1 || true
|
||||
git submodule foreach 'git fetch --tags --depth 1 origin $$sha1 && git checkout -q $$sha1'
|
||||
|
16
README.rst
16
README.rst
@ -138,6 +138,16 @@ Behavior
|
||||
- Adds a safe mode that does not run user code after a hard crash or brown out. This makes it
|
||||
possible to fix code that causes nasty crashes by making it available through mass storage after
|
||||
the crash. A reset (the button) is needed after it's fixed to get back into normal mode.
|
||||
- Safe mode may be handled programmatically by providing a ``safemode.py``.
|
||||
``safemode.py`` is run if the board has reset due to entering safe mode, unless the safe mode
|
||||
initiated by the user by pressing button(s).
|
||||
USB is not available so nothing can be printed.
|
||||
``safemode.py`` can determine why the safe mode occurred
|
||||
using ``supervisor.runtime.safe_mode_reason``, and take appropriate action. For instance,
|
||||
if a hard crash occurred, ``safemode.py`` may do a ``microcontroller.reset()``
|
||||
to automatically restart despite the crash.
|
||||
If the battery is low, but is being charged, ``safemode.py`` may put the board in deep sleep
|
||||
for a while. Or it may simply reset, and have ``code.py`` check the voltage and do the sleep.
|
||||
- RGB status LED indicating CircuitPython state.
|
||||
- One green flash - code completed without error.
|
||||
- Two red flashes - code ended due to an exception.
|
||||
@ -145,9 +155,9 @@ Behavior
|
||||
- Re-runs ``code.py`` or other main file after file system writes by a workflow. (Disable with
|
||||
``supervisor.disable_autoreload()``)
|
||||
- Autoreload is disabled while the REPL is active.
|
||||
- Main is one of these: ``code.txt``, ``code.py``, ``main.py``,
|
||||
``main.txt``
|
||||
- Boot is one of these: ``boot.py``, ``boot.txt``
|
||||
- ``code.py`` may also be named``code.txt``, ``main.py``, or ``main.txt``.
|
||||
- ``boot.py`` may also be named ``boot.txt``.
|
||||
- ``safemode.py`` may also be named ``safemode.txt``.
|
||||
|
||||
API
|
||||
~~~
|
||||
|
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",
|
||||
|
@ -49,8 +49,8 @@
|
||||
#include "shared-bindings/_bleio/ScanEntry.h"
|
||||
#include "shared-bindings/time/__init__.h"
|
||||
|
||||
#if CIRCUITPY_DOTENV
|
||||
#include "shared-module/dotenv/__init__.h"
|
||||
#if CIRCUITPY_OS_GETENV
|
||||
#include "shared-bindings/os/__init__.h"
|
||||
#endif
|
||||
|
||||
#define MSEC_TO_UNITS(TIME, RESOLUTION) (((TIME) * 1000) / (RESOLUTION))
|
||||
@ -284,15 +284,15 @@ char default_ble_name[] = { 'C', 'I', 'R', 'C', 'U', 'I', 'T', 'P', 'Y', 0, 0, 0
|
||||
STATIC void bleio_adapter_hci_init(bleio_adapter_obj_t *self) {
|
||||
mp_int_t name_len = 0;
|
||||
|
||||
#if CIRCUITPY_DOTENV
|
||||
char ble_name[32];
|
||||
name_len = dotenv_get_key("/.env", "CIRCUITPY_BLE_NAME", ble_name, sizeof(ble_name) - 1);
|
||||
if (name_len > 0) {
|
||||
self->name = mp_obj_new_str(ble_name, (size_t)name_len);
|
||||
#if CIRCUITPY_OS_GETENV
|
||||
mp_obj_t name = common_hal_os_getenv("CIRCUITPY_BLE_NAME", mp_const_none);
|
||||
if (name != mp_const_none) {
|
||||
mp_arg_validate_type_string(name, MP_QSTR_CIRCUITPY_BLE_NAME);
|
||||
self->name = name;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (name_len <= 0) {
|
||||
if (!self->name) {
|
||||
name_len = sizeof(default_ble_name);
|
||||
bt_addr_t addr;
|
||||
hci_check_error(hci_read_bd_addr(&addr));
|
||||
|
@ -267,6 +267,14 @@ After the license comment::
|
||||
|
||||
"""
|
||||
|
||||
Version description
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
After the import statements::
|
||||
|
||||
__version__ = "0.0.0+auto.0"
|
||||
__repo__ = "<repo github link>"
|
||||
|
||||
|
||||
Class description
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -1,33 +0,0 @@
|
||||
Additional CircuitPython Libraries and Drivers on GitHub
|
||||
=========================================================
|
||||
|
||||
These are libraries and drivers available in separate GitHub repos. They are
|
||||
designed for use with CircuitPython and may or may not work with
|
||||
`MicroPython <https://micropython.org>`_.
|
||||
|
||||
|
||||
Adafruit CircuitPython Library Bundle
|
||||
--------------------------------------
|
||||
|
||||
We provide a bundle of all our libraries to ease installation of drivers and
|
||||
their dependencies. The bundle is primarily geared to the Adafruit Express line
|
||||
of boards which feature a relatively large external flash. With Express boards,
|
||||
it's easy to copy them all onto the filesystem. However, if you don't have
|
||||
enough space simply copy things over as they are needed.
|
||||
|
||||
- The Adafruit bundles are available on GitHub: <https://github.com/adafruit/Adafruit_CircuitPython_Bundle/releases>.
|
||||
|
||||
- Documentation for the bundle, which includes links to documentation for all
|
||||
libraries, is available here: <https://circuitpython.readthedocs.io/projects/bundle/en/latest/>.
|
||||
|
||||
|
||||
CircuitPython Community Library Bundle
|
||||
---------------------------------------
|
||||
|
||||
This bundle contains non-Adafruit sponsored libraries, that are written and submitted
|
||||
by members of the community.
|
||||
|
||||
- The Community bundles are available on GitHub: <https://github.com/adafruit/CircuitPython_Community_Bundle/releases>.
|
||||
|
||||
- Documentation is not available on ReadTheDocs at this time. See each library for any
|
||||
included documentation.
|
@ -6,24 +6,49 @@ variables are commonly used to store "secrets" such as Wi-Fi passwords and API
|
||||
keys. This method *does not* make them secure. It only separates them from the
|
||||
code.
|
||||
|
||||
CircuitPython supports these by mimicking the `dotenv <https://github.com/theskumar/python-dotenv>`_
|
||||
CPython library. Other languages such as Javascript, PHP and Ruby also have
|
||||
dotenv libraries.
|
||||
CircuitPython uses a file called ``settings.toml`` at the drive root (no
|
||||
folder) as the environment. User code can access the values from the file
|
||||
using `os.getenv()`. It is recommended to save any values used repeatedly in a
|
||||
variable because `os.getenv()` will parse the ``settings.toml`` file contents
|
||||
on every access.
|
||||
|
||||
These libraries store environment variables in a ``.env`` file. Here is a simple
|
||||
example:
|
||||
CircuitPython only supports a subset of the full toml specification, see below
|
||||
for more details. The subset is very "Python-like", which is a key reason we
|
||||
selected the format.
|
||||
|
||||
.. code-block:: bash
|
||||
Due to technical limitations it probably also accepts some files that are
|
||||
not valid TOML files; bugs of this nature are subject to change (i.e., be
|
||||
fixed) without the usual deprecation period for incompatible changes.
|
||||
|
||||
KEY1='value1'
|
||||
# Comment
|
||||
KEY2='value2
|
||||
is multiple lines'
|
||||
File format example:
|
||||
|
||||
CircuitPython uses the ``.env`` at the drive root (no folder) as the environment.
|
||||
User code can access the values from the file using `os.getenv()`. It is
|
||||
recommended to save any values used repeatedly in a variable because `os.getenv()`
|
||||
will parse the ``/.env`` on every access.
|
||||
.. code-block::
|
||||
|
||||
str_key="Hello world" # with trailing comment
|
||||
int_key = 7
|
||||
unicode_key="œuvre"
|
||||
unicode_key2="\\u0153uvre" # same as above
|
||||
unicode_key3="\\U00000153uvre" # same as above
|
||||
escape_codes="supported, including \\r\\n\\"\\\\"
|
||||
# comment
|
||||
[subtable]
|
||||
subvalue="cannot retrieve this using getenv"
|
||||
|
||||
|
||||
Details of the toml language subset
|
||||
-----------------------------------
|
||||
|
||||
* The content is required to be in UTF-8 encoding
|
||||
* The supported data types are string and integer
|
||||
* Only basic strings are supported, not triple-quoted strings
|
||||
* Only integers supported by strtol. (no 0o, no 0b, no underscores 1_000, 011
|
||||
is 9, not 11)
|
||||
* Only bare keys are supported
|
||||
* Duplicate keys are not diagnosed.
|
||||
* Comments are supported
|
||||
* Only values from the "root table" can be retrieved
|
||||
* due to technical limitations, the content of multi-line
|
||||
strings can erroneously be parsed as a value.
|
||||
|
||||
CircuitPython behavior
|
||||
----------------------
|
||||
|
@ -21,7 +21,7 @@ Full Table of Contents
|
||||
../shared-bindings/index.rst
|
||||
supported_ports.rst
|
||||
troubleshooting.rst
|
||||
drivers.rst
|
||||
libraries.rst
|
||||
workflows
|
||||
environment.rst
|
||||
|
||||
|
31
docs/libraries.rst
Normal file
31
docs/libraries.rst
Normal file
@ -0,0 +1,31 @@
|
||||
Adafruit CircuitPython Libraries
|
||||
================================
|
||||
|
||||
Documentation for all Adafruit-sponsored CircuitPython libraries is at:
|
||||
<https://docs.circuitpython.org/projects/bundle/en/latest/drivers.html>.
|
||||
|
||||
|
||||
CircuitPython Library Bundles
|
||||
=============================
|
||||
|
||||
Many Python libraries, including device drivers, have been written for use with CircuitPython.
|
||||
They are maintained in separate GitHub repos, one per library.
|
||||
|
||||
Libraries are packaged in *bundles*, which are ZIP files that are snapshots in time of a group of libraries.
|
||||
|
||||
Adafruit sponsors and maintains several hundred libraries, packaged in the **Adafruit Library Bundle**.
|
||||
Adafruit-sponsored libraries are also available on <https://pypi.org>.
|
||||
|
||||
Yet other libraries are maintained by members of the CircuitPython community,
|
||||
and are packaged in the **CircuitPython Community Library Bundle**.
|
||||
|
||||
The Adafruit bundles are available on GitHub: <https://github.com/adafruit/Adafruit_CircuitPython_Bundle/releases>.
|
||||
The Community bundles are available at: <https://github.com/adafruit/CircuitPython_Community_Bundle/releases>.
|
||||
|
||||
More detailed information about the bundles, and download links for the latest bundles
|
||||
are at <https://circuitpython.org/libraries>.
|
||||
|
||||
Documentation about bundle construction is at: <https://circuitpython.readthedocs.io/projects/bundle/en/latest/>.
|
||||
|
||||
Documentation for Community Libraries is not available on ReadTheDocs at this time. See the GitHub repository
|
||||
for each library for any included documentation.
|
@ -1,323 +0,0 @@
|
||||
:mod:`uasyncio` --- asynchronous I/O scheduler
|
||||
==============================================
|
||||
|
||||
.. module:: uasyncio
|
||||
:synopsis: asynchronous I/O scheduler for writing concurrent code
|
||||
|
||||
|see_cpython_module|
|
||||
`asyncio <https://docs.python.org/3.8/library/asyncio.html>`_
|
||||
|
||||
Example::
|
||||
|
||||
import uasyncio
|
||||
|
||||
async def blink(led, period_ms):
|
||||
while True:
|
||||
led.on()
|
||||
await uasyncio.sleep_ms(5)
|
||||
led.off()
|
||||
await uasyncio.sleep_ms(period_ms)
|
||||
|
||||
async def main(led1, led2):
|
||||
uasyncio.create_task(blink(led1, 700))
|
||||
uasyncio.create_task(blink(led2, 400))
|
||||
await uasyncio.sleep_ms(10_000)
|
||||
|
||||
# Running on a pyboard
|
||||
from pyb import LED
|
||||
uasyncio.run(main(LED(1), LED(2)))
|
||||
|
||||
# Running on a generic board
|
||||
from machine import Pin
|
||||
uasyncio.run(main(Pin(1), Pin(2)))
|
||||
|
||||
Core functions
|
||||
--------------
|
||||
|
||||
.. function:: create_task(coro)
|
||||
|
||||
Create a new task from the given coroutine and schedule it to run.
|
||||
|
||||
Returns the corresponding `Task` object.
|
||||
|
||||
.. function:: current_task()
|
||||
|
||||
Return the `Task` object associated with the currently running task.
|
||||
|
||||
.. function:: run(coro)
|
||||
|
||||
Create a new task from the given coroutine and run it until it completes.
|
||||
|
||||
Returns the value returned by *coro*.
|
||||
|
||||
.. function:: sleep(t)
|
||||
|
||||
Sleep for *t* seconds (can be a float).
|
||||
|
||||
This is a coroutine.
|
||||
|
||||
.. function:: sleep_ms(t)
|
||||
|
||||
Sleep for *t* milliseconds.
|
||||
|
||||
This is a coroutine, and a MicroPython extension.
|
||||
|
||||
Additional functions
|
||||
--------------------
|
||||
|
||||
.. function:: wait_for(awaitable, timeout)
|
||||
|
||||
Wait for the *awaitable* to complete, but cancel it if it takes longer
|
||||
that *timeout* seconds. If *awaitable* is not a task then a task will be
|
||||
created from it.
|
||||
|
||||
If a timeout occurs, it cancels the task and raises ``asyncio.TimeoutError``:
|
||||
this should be trapped by the caller.
|
||||
|
||||
Returns the return value of *awaitable*.
|
||||
|
||||
This is a coroutine.
|
||||
|
||||
.. function:: wait_for_ms(awaitable, timeout)
|
||||
|
||||
Similar to `wait_for` but *timeout* is an integer in milliseconds.
|
||||
|
||||
This is a coroutine, and a MicroPython extension.
|
||||
|
||||
.. function:: gather(*awaitables, return_exceptions=False)
|
||||
|
||||
Run all *awaitables* concurrently. Any *awaitables* that are not tasks are
|
||||
promoted to tasks.
|
||||
|
||||
Returns a list of return values of all *awaitables*.
|
||||
|
||||
This is a coroutine.
|
||||
|
||||
class Task
|
||||
----------
|
||||
|
||||
.. class:: Task()
|
||||
|
||||
This object wraps a coroutine into a running task. Tasks can be waited on
|
||||
using ``await task``, which will wait for the task to complete and return
|
||||
the return value of the task.
|
||||
|
||||
Tasks should not be created directly, rather use `create_task` to create them.
|
||||
|
||||
.. method:: Task.cancel()
|
||||
|
||||
Cancel the task by injecting a ``CancelledError`` into it. The task may
|
||||
or may not ignore this exception.
|
||||
|
||||
class Event
|
||||
-----------
|
||||
|
||||
.. class:: Event()
|
||||
|
||||
Create a new event which can be used to synchronise tasks. Events start
|
||||
in the cleared state.
|
||||
|
||||
.. method:: Event.is_set()
|
||||
|
||||
Returns ``True`` if the event is set, ``False`` otherwise.
|
||||
|
||||
.. method:: Event.set()
|
||||
|
||||
Set the event. Any tasks waiting on the event will be scheduled to run.
|
||||
|
||||
.. method:: Event.clear()
|
||||
|
||||
Clear the event.
|
||||
|
||||
.. method:: Event.wait()
|
||||
|
||||
Wait for the event to be set. If the event is already set then it returns
|
||||
immediately.
|
||||
|
||||
This is a coroutine.
|
||||
|
||||
class Lock
|
||||
----------
|
||||
|
||||
.. class:: Lock()
|
||||
|
||||
Create a new lock which can be used to coordinate tasks. Locks start in
|
||||
the unlocked state.
|
||||
|
||||
In addition to the methods below, locks can be used in an ``async with`` statement.
|
||||
|
||||
.. method:: Lock.locked()
|
||||
|
||||
Returns ``True`` if the lock is locked, otherwise ``False``.
|
||||
|
||||
.. method:: Lock.acquire()
|
||||
|
||||
Wait for the lock to be in the unlocked state and then lock it in an atomic
|
||||
way. Only one task can acquire the lock at any one time.
|
||||
|
||||
This is a coroutine.
|
||||
|
||||
.. method:: Lock.release()
|
||||
|
||||
Release the lock. If any tasks are waiting on the lock then the next one in the
|
||||
queue is scheduled to run and the lock remains locked. Otherwise, no tasks are
|
||||
waiting an the lock becomes unlocked.
|
||||
|
||||
TCP stream connections
|
||||
----------------------
|
||||
|
||||
.. function:: open_connection(host, port)
|
||||
|
||||
Open a TCP connection to the given *host* and *port*. The *host* address will be
|
||||
resolved using `socket.getaddrinfo`, which is currently a blocking call.
|
||||
|
||||
Returns a pair of streams: a reader and a writer stream.
|
||||
Will raise a socket-specific ``OSError`` if the host could not be resolved or if
|
||||
the connection could not be made.
|
||||
|
||||
This is a coroutine.
|
||||
|
||||
.. function:: start_server(callback, host, port, backlog=5)
|
||||
|
||||
Start a TCP server on the given *host* and *port*. The *callback* will be
|
||||
called with incoming, accepted connections, and be passed 2 arguments: reader
|
||||
and writer streams for the connection.
|
||||
|
||||
Returns a `Server` object.
|
||||
|
||||
This is a coroutine.
|
||||
|
||||
.. class:: Stream()
|
||||
|
||||
This represents a TCP stream connection. To minimise code this class implements
|
||||
both a reader and a writer, and both ``StreamReader`` and ``StreamWriter`` alias to
|
||||
this class.
|
||||
|
||||
.. method:: Stream.get_extra_info(v)
|
||||
|
||||
Get extra information about the stream, given by *v*. The valid values for *v* are:
|
||||
``peername``.
|
||||
|
||||
.. method:: Stream.close()
|
||||
|
||||
Close the stream.
|
||||
|
||||
.. method:: Stream.wait_closed()
|
||||
|
||||
Wait for the stream to close.
|
||||
|
||||
This is a coroutine.
|
||||
|
||||
.. method:: Stream.read(n)
|
||||
|
||||
Read up to *n* bytes and return them.
|
||||
|
||||
This is a coroutine.
|
||||
|
||||
.. method:: Stream.readinto(buf)
|
||||
|
||||
Read up to n bytes into *buf* with n being equal to the length of *buf*.
|
||||
|
||||
Return the number of bytes read into *buf*.
|
||||
|
||||
This is a coroutine, and a MicroPython extension.
|
||||
|
||||
.. method:: Stream.readexactly(n)
|
||||
|
||||
Read exactly *n* bytes and return them as a bytes object.
|
||||
|
||||
Raises an ``EOFError`` exception if the stream ends before reading *n* bytes.
|
||||
|
||||
This is a coroutine.
|
||||
|
||||
.. method:: Stream.readline()
|
||||
|
||||
Read a line and return it.
|
||||
|
||||
This is a coroutine.
|
||||
|
||||
.. method:: Stream.write(buf)
|
||||
|
||||
Accumulated *buf* to the output buffer. The data is only flushed when
|
||||
`Stream.drain` is called. It is recommended to call `Stream.drain` immediately
|
||||
after calling this function.
|
||||
|
||||
.. method:: Stream.drain()
|
||||
|
||||
Drain (write) all buffered output data out to the stream.
|
||||
|
||||
This is a coroutine.
|
||||
|
||||
.. class:: Server()
|
||||
|
||||
This represents the server class returned from `start_server`. It can be used
|
||||
in an ``async with`` statement to close the server upon exit.
|
||||
|
||||
.. method:: Server.close()
|
||||
|
||||
Close the server.
|
||||
|
||||
.. method:: Server.wait_closed()
|
||||
|
||||
Wait for the server to close.
|
||||
|
||||
This is a coroutine.
|
||||
|
||||
Event Loop
|
||||
----------
|
||||
|
||||
.. function:: get_event_loop()
|
||||
|
||||
Return the event loop used to schedule and run tasks. See `Loop`.
|
||||
|
||||
.. function:: new_event_loop()
|
||||
|
||||
Reset the event loop and return it.
|
||||
|
||||
Note: since MicroPython only has a single event loop this function just
|
||||
resets the loop's state, it does not create a new one.
|
||||
|
||||
.. class:: Loop()
|
||||
|
||||
This represents the object which schedules and runs tasks. It cannot be
|
||||
created, use `get_event_loop` instead.
|
||||
|
||||
.. method:: Loop.create_task(coro)
|
||||
|
||||
Create a task from the given *coro* and return the new `Task` object.
|
||||
|
||||
.. method:: Loop.run_forever()
|
||||
|
||||
Run the event loop until `stop()` is called.
|
||||
|
||||
.. method:: Loop.run_until_complete(awaitable)
|
||||
|
||||
Run the given *awaitable* until it completes. If *awaitable* is not a task
|
||||
then it will be promoted to one.
|
||||
|
||||
.. method:: Loop.stop()
|
||||
|
||||
Stop the event loop.
|
||||
|
||||
.. method:: Loop.close()
|
||||
|
||||
Close the event loop.
|
||||
|
||||
.. method:: Loop.set_exception_handler(handler)
|
||||
|
||||
Set the exception handler to call when a Task raises an exception that is not
|
||||
caught. The *handler* should accept two arguments: ``(loop, context)``.
|
||||
|
||||
.. method:: Loop.get_exception_handler()
|
||||
|
||||
Get the current exception handler. Returns the handler, or ``None`` if no
|
||||
custom handler is set.
|
||||
|
||||
.. method:: Loop.default_exception_handler(context)
|
||||
|
||||
The default exception handler that is called.
|
||||
|
||||
.. method:: Loop.call_exception_handler(context)
|
||||
|
||||
Call the current exception handler. The argument *context* is passed through and
|
||||
is a dictionary containing keys: ``'message'``, ``'exception'``, ``'future'``.
|
@ -35,7 +35,6 @@ These libraries are not currently enabled in any CircuitPython build, but may be
|
||||
json.rst
|
||||
re.rst
|
||||
sys.rst
|
||||
asyncio.rst
|
||||
ctypes.rst
|
||||
select.rst
|
||||
|
||||
|
@ -46,7 +46,7 @@ connection, the central device can discover two default services. One for file t
|
||||
CircuitPython specifically that includes serial characteristics.
|
||||
|
||||
To change the default BLE advertising name without (or before) running user code, the desired name
|
||||
can be put in the `/.env` file. The key is `CIRCUITPY_BLE_NAME`. It's limited to approximately
|
||||
can be put in the `settings.toml` file. The key is `CIRCUITPY_BLE_NAME`. It's limited to approximately
|
||||
30 characters depending on the port's settings and will be truncated if longer.
|
||||
|
||||
### File Transfer API
|
||||
@ -69,21 +69,21 @@ Read-only characteristic that returns the UTF-8 encoded version string.
|
||||
|
||||
## Web
|
||||
|
||||
The web workflow is depends on adding Wi-Fi credentials into the `/.env` file. The keys are
|
||||
The web workflow is depends on adding Wi-Fi credentials into the `settings.toml` file. The keys are
|
||||
`CIRCUITPY_WIFI_SSID` and `CIRCUITPY_WIFI_PASSWORD`. Once these are defined, CircuitPython will
|
||||
automatically connect to the network and start the webserver used for the workflow. The webserver
|
||||
is on port 80 unless overridden by `CIRCUITPY_WEB_API_PORT`. It also enables MDNS.
|
||||
|
||||
Here is an example `/.env`:
|
||||
Here is an example `/settings.toml`:
|
||||
|
||||
```bash
|
||||
# To auto-connect to Wi-Fi
|
||||
CIRCUITPY_WIFI_SSID='scottswifi'
|
||||
CIRCUITPY_WIFI_PASSWORD='secretpassword'
|
||||
CIRCUITPY_WIFI_SSID="scottswifi"
|
||||
CIRCUITPY_WIFI_PASSWORD="secretpassword"
|
||||
|
||||
# To enable modifying files from the web. Change this too!
|
||||
# Leave the User field blank in the browser.
|
||||
CIRCUITPY_WEB_API_PASSWORD='passw0rd'
|
||||
CIRCUITPY_WEB_API_PASSWORD="passw0rd"
|
||||
|
||||
CIRCUITPY_WEB_API_PORT=80
|
||||
```
|
||||
@ -124,7 +124,7 @@ All file system related APIs are protected by HTTP basic authentication. It is *
|
||||
hopefully prevent some griefing in shared settings. The password is sent unencrypted so do not reuse
|
||||
a password with something important. The user field is left blank.
|
||||
|
||||
The password is taken from `/.env` with the key `CIRCUITPY_WEB_API_PASSWORD`. If this is unset, the
|
||||
The password is taken from `settings.toml` with the key `CIRCUITPY_WEB_API_PASSWORD`. If this is unset, the
|
||||
server will respond with `403 Forbidden`. When a password is set, but not provided in a request, it
|
||||
will respond `401 Unauthorized`.
|
||||
|
||||
|
@ -1 +1 @@
|
||||
Subproject commit 25a825e41c26cfcee018b762416741d0d63aeabf
|
||||
Subproject commit f2dd2230c4fdf1aa5c7a160782efdde18e8204bb
|
@ -429,6 +429,18 @@ STATIC mp_obj_t vfs_fat_utime(mp_obj_t vfs_in, mp_obj_t path_in, mp_obj_t times_
|
||||
}
|
||||
STATIC MP_DEFINE_CONST_FUN_OBJ_3(fat_vfs_utime_obj, vfs_fat_utime);
|
||||
|
||||
STATIC mp_obj_t vfs_fat_getreadonly(mp_obj_t self_in) {
|
||||
fs_user_mount_t *self = MP_OBJ_TO_PTR(self_in);
|
||||
return mp_obj_new_bool(!filesystem_is_writable_by_python(self));
|
||||
}
|
||||
STATIC MP_DEFINE_CONST_FUN_OBJ_1(fat_vfs_getreadonly_obj, vfs_fat_getreadonly);
|
||||
STATIC const mp_obj_property_t fat_vfs_readonly_obj = {
|
||||
.base.type = &mp_type_property,
|
||||
.proxy = {(mp_obj_t)&fat_vfs_getreadonly_obj,
|
||||
MP_ROM_NONE,
|
||||
MP_ROM_NONE},
|
||||
};
|
||||
|
||||
#if MICROPY_FATFS_USE_LABEL
|
||||
STATIC mp_obj_t vfs_fat_getlabel(mp_obj_t self_in) {
|
||||
fs_user_mount_t *self = MP_OBJ_TO_PTR(self_in);
|
||||
@ -481,6 +493,7 @@ STATIC const mp_rom_map_elem_t fat_vfs_locals_dict_table[] = {
|
||||
{ MP_ROM_QSTR(MP_QSTR_mount), MP_ROM_PTR(&vfs_fat_mount_obj) },
|
||||
{ MP_ROM_QSTR(MP_QSTR_umount), MP_ROM_PTR(&fat_vfs_umount_obj) },
|
||||
{ MP_ROM_QSTR(MP_QSTR_utime), MP_ROM_PTR(&fat_vfs_utime_obj) },
|
||||
{ MP_ROM_QSTR(MP_QSTR_readonly), MP_ROM_PTR(&fat_vfs_readonly_obj) },
|
||||
#if MICROPY_FATFS_USE_LABEL
|
||||
{ MP_ROM_QSTR(MP_QSTR_label), MP_ROM_PTR(&fat_vfs_label_obj) },
|
||||
#endif
|
||||
|
@ -1 +1 @@
|
||||
Subproject commit ba05423ed9aae09ce293603b519a4ac644ef0dab
|
||||
Subproject commit 9ddd59650598b7a0641d70aabcc8aab71799cb93
|
@ -1 +1 @@
|
||||
Subproject commit 4fd499e39720f8ce970cceeb97c2a85c485f7335
|
||||
Subproject commit e07e1853d7e995b9797a064c098bccc5c384632e
|
@ -1 +1 @@
|
||||
Subproject commit 4a4619a524918f2705c05ca4959385937afa9a7c
|
||||
Subproject commit ab0ffa938dfa7eb1fd7260353a7a4e28f55e537a
|
@ -1 +1 @@
|
||||
Subproject commit 726270f5103d9d94810eb8b52041b7521afafc5c
|
||||
Subproject commit e6a9a0140ed44ef5f15d8040fce35b5319c1f216
|
@ -1 +1 @@
|
||||
Subproject commit 656be4d79196b5f25ab9ebca731d448c5b3bdc17
|
||||
Subproject commit cf2b173d0fc3ac2cd961754c6adf8f614a1c7c39
|
@ -1 +1 @@
|
||||
Subproject commit 6cf9f3cf32e0c176c861de6356813ea4d08034d6
|
||||
Subproject commit 1590d81f7d1474b25aed6a0cb793c7e6dc7634ec
|
@ -1 +1 @@
|
||||
Subproject commit 992b601e2469f30e95ec35c9859b4aa2cd917504
|
||||
Subproject commit 340c62ef6ce867b3924d166afc3d2a171680f799
|
@ -1 +1 @@
|
||||
Subproject commit 794488d1de3d17d1a08887c4a651cfac2c5a1524
|
||||
Subproject commit 8e0f081a0fcc94053b8ef480a916b10855a3c0d5
|
@ -1 +1 @@
|
||||
Subproject commit 1919916dcf57e0879832b9c274c5fb77712d7775
|
||||
Subproject commit 38bd02f014403954ab52154e3877e502d83862dc
|
@ -1 +1 @@
|
||||
Subproject commit 5b4703428fc299ac268d08350c885122b2af1e75
|
||||
Subproject commit 61ca58788aabd53558e10c32064a1304aa7454f2
|
@ -1 +1 @@
|
||||
Subproject commit c8e82b96c68041a11a52f3053d0d2733ae2d1a49
|
||||
Subproject commit d689ca77c67806484037e00110c669cf55846b6e
|
@ -1 +1 @@
|
||||
Subproject commit b6891e734183f978e7b3d0a363140e98635c0a04
|
||||
Subproject commit e38bf1f9cf1e8faeb7d15a1d10674fb2c0a81e72
|
@ -1 +1 @@
|
||||
Subproject commit 31c819f377cf71f61cfb84eae159f1f948980db7
|
||||
Subproject commit f26bead58d3c4036eced586d275396816e92e80a
|
@ -1 +1 @@
|
||||
Subproject commit 1064fdee5a1421f528af452be5e45ae95ef2b89a
|
||||
Subproject commit 9516aa97e9216eac2b229fbb7dac34fa60c347c4
|
@ -1 +1 @@
|
||||
Subproject commit 7eeea1aaf6bb5fa0deb080a1dc1aa3cd103f9aad
|
||||
Subproject commit 759c5c348878932adc5fcc9e4f3b3f570b43e17f
|
@ -1 +1 @@
|
||||
Subproject commit cad34af5267aca3665fdaf1ea5a0eee921d13f06
|
||||
Subproject commit 74a1c261103cda43172053ff2370777255b9bf8d
|
@ -1 +1 @@
|
||||
Subproject commit df4c73a5e719f17fae0309e811ff17627cd0f268
|
||||
Subproject commit c46c59e3004817c708c78c59d247b02161c6bf06
|
@ -1 +1 @@
|
||||
Subproject commit f611d5e31c9735a3c3ac43185e35dcd5f659e3aa
|
||||
Subproject commit 46a49205f3f14546273dd1267e66cad82f03986c
|
@ -1 +1 @@
|
||||
Subproject commit 317f4bdb799afa59b164def4ea0610f57db9922e
|
||||
Subproject commit 203d0b1489cb90a39f8a780570287f1a5bd610a0
|
@ -1 +1 @@
|
||||
Subproject commit bb2fc8c157ee44869cde4cbc1ab20e6f31ac727f
|
||||
Subproject commit eb17bffa757dc8c0a53fe9e61c45246c06418099
|
@ -1 +1 @@
|
||||
Subproject commit 9ff56ce53f05e23ff678965ba54af89b24b1199a
|
||||
Subproject commit e23c4871456cdf0ef1bfb59d1c2f6e38b7b640ee
|
@ -1 +1 @@
|
||||
Subproject commit 0a8fcbfc92060eb298ea52d5e88587b37347a0be
|
||||
Subproject commit eac33b430b0cbe1f6f583000f6b29f75bfe8507e
|
@ -1 +1 @@
|
||||
Subproject commit 7832bbb5449d55d8c7b731e4ff7490b801e94a9e
|
||||
Subproject commit 2634ca0163020bebec300fcca6e0b5afcdc655b8
|
@ -1 +1 @@
|
||||
Subproject commit 565fed515138f962c4bcce0ee756d32e708a151a
|
||||
Subproject commit b6d9f852f50b489615f3f357f9758d0073335334
|
@ -1 +1 @@
|
||||
Subproject commit fbdb77d7127e7d6a8d3574440b0f790c94a28cf8
|
||||
Subproject commit 596cc896e5c8815caa2a6f405560833193848149
|
@ -1 +1 @@
|
||||
Subproject commit 6234787515e2f0ece40b6408722ff0b42824038e
|
||||
Subproject commit d4ff0388f3e3af2745864f2c3e5926f500673a40
|
@ -257,6 +257,11 @@
|
||||
#define GET_FATTIME() get_fattime()
|
||||
#endif
|
||||
|
||||
#if FF_FS_MAKE_VOLID == 1
|
||||
#define MAKE_VOLID(x) (make_volid())
|
||||
#else
|
||||
#define MAKE_VOLID(x) (GET_FATTIME())
|
||||
#endif
|
||||
|
||||
/* File lock controls */
|
||||
#if FF_FS_LOCK != 0
|
||||
@ -5421,6 +5426,7 @@ FRESULT f_mkfs (
|
||||
DWORD tbl[3];
|
||||
#endif
|
||||
|
||||
DWORD volid = MAKE_VOLID();
|
||||
|
||||
/* Check mounted drive and clear work area */
|
||||
fs->fs_type = 0; /* Clear mounted volume */
|
||||
@ -5622,7 +5628,7 @@ FRESULT f_mkfs (
|
||||
st_dword(buf + BPB_DataOfsEx, b_data - b_vol); /* Data offset [sector] */
|
||||
st_dword(buf + BPB_NumClusEx, n_clst); /* Number of clusters */
|
||||
st_dword(buf + BPB_RootClusEx, 2 + tbl[0] + tbl[1]); /* Root dir cluster # */
|
||||
st_dword(buf + BPB_VolIDEx, GET_FATTIME()); /* VSN */
|
||||
st_dword(buf + BPB_VolIDEx, volid); /* VSN */
|
||||
st_word(buf + BPB_FSVerEx, 0x100); /* Filesystem version (1.00) */
|
||||
for (buf[BPB_BytsPerSecEx] = 0, i = ss; i >>= 1; buf[BPB_BytsPerSecEx]++) ; /* Log2 of sector size [byte] */
|
||||
for (buf[BPB_SecPerClusEx] = 0, i = au; i >>= 1; buf[BPB_SecPerClusEx]++) ; /* Log2 of cluster size [sector] */
|
||||
@ -5758,7 +5764,7 @@ FRESULT f_mkfs (
|
||||
st_dword(buf + BPB_HiddSec, b_vol); /* Volume offset in the physical drive [sector] */
|
||||
#if FF_MKFS_FAT32
|
||||
if (fmt == FS_FAT32) {
|
||||
st_dword(buf + BS_VolID32, GET_FATTIME()); /* VSN */
|
||||
st_dword(buf + BS_VolID32, volid); /* VSN */
|
||||
st_dword(buf + BPB_FATSz32, sz_fat); /* FAT size [sector] */
|
||||
st_dword(buf + BPB_RootClus32, 2); /* Root directory cluster # (2) */
|
||||
st_word(buf + BPB_FSInfo32, 1); /* Offset of FSINFO sector (VBR + 1) */
|
||||
@ -5769,7 +5775,7 @@ FRESULT f_mkfs (
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
st_dword(buf + BS_VolID, GET_FATTIME()); /* VSN */
|
||||
st_dword(buf + BS_VolID, volid); /* VSN */
|
||||
st_word(buf + BPB_FATSz16, (WORD)sz_fat); /* FAT size [sector] */
|
||||
buf[BS_DrvNum] = 0x80; /* Drive number (for int13) */
|
||||
buf[BS_BootSig] = 0x29; /* Extended boot signature */
|
||||
|
@ -334,6 +334,10 @@ FRESULT f_setcp (WORD cp); /* Set curre
|
||||
DWORD get_fattime (void);
|
||||
#endif
|
||||
|
||||
#if FF_FS_MAKE_VOLID
|
||||
DWORD make_volid (void);
|
||||
#endif
|
||||
|
||||
/* LFN support functions */
|
||||
#if FF_USE_LFN >= 1 /* Code conversion (defined in unicode.c) */
|
||||
WCHAR ff_oem2uni (WCHAR oem, WORD cp); /* OEM code to Unicode conversion */
|
||||
|
@ -373,6 +373,10 @@
|
||||
/ SemaphoreHandle_t and etc. A header file for O/S definitions needs to be
|
||||
/ included somewhere in the scope of ff.h. */
|
||||
|
||||
|
||||
#ifndef FF_FS_MAKE_VOLID
|
||||
#define FF_FS_MAKE_VOLID (0)
|
||||
#endif
|
||||
/* The option FF_FS_MAKE_VOLID enables the use of a function to return a 32-bit volume identifier.
|
||||
/ If it is disabled, a Volume ID based on the current time is used. */
|
||||
|
||||
/*--- End of configuration options ---*/
|
||||
|
@ -1 +1 @@
|
||||
Subproject commit cc93ff18c3a20b25396cb2babaee8ed33bb79528
|
||||
Subproject commit d0a07e14adcd71a7c22bcceb16c55aadb5e0d104
|
480
locale/ID.po
480
locale/ID.po
File diff suppressed because it is too large
Load Diff
436
locale/circuitpython.pot
Executable file → Normal file
436
locale/circuitpython.pot
Executable file → Normal file
@ -31,8 +31,20 @@ msgstr ""
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid ""
|
||||
"\n"
|
||||
"Please file an issue with the contents of your CIRCUITPY drive at \n"
|
||||
"https://github.com/adafruit/circuitpython/issues\n"
|
||||
"Please file an issue with your program at https://github.com/adafruit/"
|
||||
"circuitpython/issues."
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid ""
|
||||
"\n"
|
||||
"Press reset to exit safe mode.\n"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid ""
|
||||
"\n"
|
||||
"You are in safe mode because:\n"
|
||||
msgstr ""
|
||||
|
||||
#: py/obj.c
|
||||
@ -65,6 +77,11 @@ msgstr ""
|
||||
msgid "%02X"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/os/getenv.c
|
||||
#, c-format
|
||||
msgid "%S"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/rgbmatrix/RGBMatrix.c
|
||||
#, c-format
|
||||
msgid ""
|
||||
@ -80,7 +97,7 @@ msgstr ""
|
||||
#: ports/raspberrypi/common-hal/alarm/__init__.c
|
||||
#: ports/raspberrypi/common-hal/analogio/AnalogOut.c
|
||||
#: ports/raspberrypi/common-hal/rtc/RTC.c ports/stm/common-hal/alarm/__init__.c
|
||||
#: ports/stm/common-hal/rtc/RTC.c
|
||||
#: ports/stm/common-hal/canio/Listener.c ports/stm/common-hal/rtc/RTC.c
|
||||
msgid "%q"
|
||||
msgstr ""
|
||||
|
||||
@ -100,13 +117,18 @@ msgstr ""
|
||||
msgid "%q failure: %d"
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c
|
||||
msgid "%q in %q must be of type %q, not %q"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/espulp/ULP.c
|
||||
#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
|
||||
#: shared-bindings/digitalio/DigitalInOut.c
|
||||
#: shared-bindings/microcontroller/Pin.c
|
||||
msgid "%q in use"
|
||||
msgstr ""
|
||||
|
||||
#: py/obj.c py/objstr.c py/objstrunicode.c
|
||||
#: py/objstr.c py/objstrunicode.c
|
||||
msgid "%q index out of range"
|
||||
msgstr ""
|
||||
|
||||
@ -118,7 +140,11 @@ msgstr ""
|
||||
msgid "%q is %q"
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c
|
||||
#: ports/raspberrypi/common-hal/wifi/Radio.c
|
||||
msgid "%q is read-only for this board"
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c shared-bindings/usb_hid/Device.c
|
||||
msgid "%q length must be %d"
|
||||
msgstr ""
|
||||
|
||||
@ -134,10 +160,6 @@ msgstr ""
|
||||
msgid "%q length must be >= %d"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/busio/I2C.c
|
||||
msgid "%q length must be >= 1"
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c
|
||||
msgid "%q must be %d"
|
||||
msgstr ""
|
||||
@ -159,24 +181,20 @@ msgid "%q must be >= %d"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/analogbufio/BufferedIn.c
|
||||
msgid "%q must be a bytearray or array of type 'H' or 'B'"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/audiocore/RawSample.c
|
||||
msgid "%q must be a bytearray or array of type 'h', 'H', 'b', or 'B'"
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c
|
||||
msgid "%q must be a string"
|
||||
#: ports/raspberrypi/bindings/cyw43/__init__.c py/argcheck.c py/objexcept.c
|
||||
#: shared-bindings/canio/CAN.c shared-bindings/digitalio/Pull.c
|
||||
msgid "%q must be of type %q or %q, not %q"
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c
|
||||
msgid "%q must be an int"
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c
|
||||
msgid "%q must be of type %q"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/digitalio/Pull.c
|
||||
msgid "%q must be of type %q or None"
|
||||
#: py/argcheck.c py/obj.c py/objstrunicode.c
|
||||
msgid "%q must be of type %q, not %q"
|
||||
msgstr ""
|
||||
|
||||
#: ports/atmel-samd/common-hal/busio/UART.c
|
||||
@ -189,7 +207,6 @@ msgstr ""
|
||||
|
||||
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
|
||||
#: ports/cxd56/common-hal/pulseio/PulseIn.c
|
||||
#: ports/espressif/common-hal/coproc/Coproc.c
|
||||
#: ports/nrf/common-hal/pulseio/PulseIn.c
|
||||
#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
|
||||
#: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c
|
||||
@ -201,8 +218,8 @@ msgstr ""
|
||||
msgid "%q pin invalid"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/usb_hid/Device.c
|
||||
msgid "%q with a report ID of 0 must be of length 1"
|
||||
#: py/objrange.c py/objslice.c shared-bindings/random/__init__.c
|
||||
msgid "%q step cannot be zero"
|
||||
msgstr ""
|
||||
|
||||
#: py/bc.c py/objnamedtuple.c
|
||||
@ -302,7 +319,7 @@ msgstr ""
|
||||
msgid "'%s' object doesn't support item deletion"
|
||||
msgstr ""
|
||||
|
||||
#: ports/raspberrypi/common-hal/wifi/Radio.c py/runtime.c
|
||||
#: py/runtime.c
|
||||
msgid "'%s' object has no attribute '%q'"
|
||||
msgstr ""
|
||||
|
||||
@ -402,6 +419,10 @@ msgstr ""
|
||||
msgid "Address must be %d bytes long"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/memorymap/AddressRange.c
|
||||
msgid "Address range not allowed"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/canio/CAN.c
|
||||
msgid "All CAN peripherals are in use"
|
||||
msgstr ""
|
||||
@ -429,7 +450,6 @@ msgid "All SPI peripherals are in use"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
|
||||
#: ports/raspberrypi/common-hal/busio/UART.c
|
||||
msgid "All UART peripherals are in use"
|
||||
msgstr ""
|
||||
|
||||
@ -482,7 +502,7 @@ msgstr ""
|
||||
msgid "Already have all-matches listener"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/coproc/__init__.c
|
||||
#: ports/espressif/common-hal/espulp/ULP.c
|
||||
#: shared-module/memorymonitor/AllocationAlarm.c
|
||||
#: shared-module/memorymonitor/AllocationSize.c
|
||||
msgid "Already running"
|
||||
@ -493,6 +513,11 @@ msgstr ""
|
||||
msgid "Already scanning for wifi networks"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/os/getenv.c
|
||||
#, c-format
|
||||
msgid "An error occurred while retrieving '%s':\n"
|
||||
msgstr ""
|
||||
|
||||
#: ports/stm/common-hal/audiopwmio/PWMAudioOut.c
|
||||
msgid "Another PWMAudioOut is already active"
|
||||
msgstr ""
|
||||
@ -506,24 +531,16 @@ msgstr ""
|
||||
msgid "Array must contain halfwords (type 'H')"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c
|
||||
#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c
|
||||
#: shared-bindings/nvm/ByteArray.c
|
||||
msgid "Array values should be single bytes."
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/microcontroller/Pin.c
|
||||
msgid "At most %d %q may be specified (not %d)"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/memorymonitor/AllocationAlarm.c
|
||||
#, c-format
|
||||
msgid "Attempt to allocate %d blocks"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Attempted heap allocation when VM not running."
|
||||
msgstr ""
|
||||
|
||||
#: ports/raspberrypi/audio_dma.c
|
||||
msgid "Audio conversion not implemented"
|
||||
msgstr ""
|
||||
@ -572,20 +589,13 @@ msgid "Bitmap size and bits per value must match"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Boot device must be first device (interface #0)."
|
||||
msgid "Boot device must be first (interface #0)."
|
||||
msgstr ""
|
||||
|
||||
#: ports/mimxrt10xx/common-hal/busio/UART.c
|
||||
msgid "Both RX and TX required for flow control"
|
||||
msgstr ""
|
||||
|
||||
#: ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.h
|
||||
#: ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.h
|
||||
#: 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 ""
|
||||
|
||||
#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c
|
||||
msgid "Both pins must support hardware interrupts"
|
||||
msgstr ""
|
||||
@ -651,11 +661,6 @@ msgstr ""
|
||||
msgid "Bus pin %d is already in use"
|
||||
msgstr ""
|
||||
|
||||
#: 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 ""
|
||||
|
||||
#: shared-bindings/_bleio/UUID.c
|
||||
msgid "Byte buffer must be 16 bytes."
|
||||
msgstr ""
|
||||
@ -786,10 +791,6 @@ msgstr ""
|
||||
msgid "CircuitPython core code crashed hard. Whoops!\n"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "CircuitPython was unable to allocate the heap."
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/bitbangio/I2C.c
|
||||
msgid "Clock stretch too long"
|
||||
msgstr ""
|
||||
@ -828,10 +829,6 @@ msgstr ""
|
||||
msgid "Couldn't allocate decoder"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Crash into the HardFault_Handler."
|
||||
msgstr ""
|
||||
|
||||
#: ports/stm/common-hal/analogio/AnalogOut.c
|
||||
msgid "DAC Channel Init Error"
|
||||
msgstr ""
|
||||
@ -894,6 +891,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 ""
|
||||
@ -919,24 +920,16 @@ msgstr ""
|
||||
msgid "Error in regex"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Error in safemode.py."
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/socketpool/Socket.c shared-bindings/ssl/SSLSocket.c
|
||||
msgid "Error: Failure to bind"
|
||||
msgstr ""
|
||||
|
||||
#: py/enum.c shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c
|
||||
#: shared-bindings/alarm/__init__.c shared-bindings/alarm/coproc/CoprocAlarm.c
|
||||
#: shared-bindings/busio/SPI.c shared-bindings/coproc/Coproc.c
|
||||
#: shared-bindings/coproc/__init__.c shared-bindings/microcontroller/Pin.c
|
||||
#: shared-bindings/neopixel_write/__init__.c
|
||||
msgid "Expected a %q"
|
||||
msgstr ""
|
||||
|
||||
#: ports/raspberrypi/bindings/cyw43/__init__.c
|
||||
msgid "Expected a %q or %q"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/alarm/__init__.c
|
||||
msgid "Expected an %q"
|
||||
msgid "Expected a kind of %q"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/_bleio/Adapter.c
|
||||
@ -1004,13 +997,17 @@ msgid "Failed to write internal flash."
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Fatal error."
|
||||
msgid "Fault detected by hardware."
|
||||
msgstr ""
|
||||
|
||||
#: py/moduerrno.c
|
||||
msgid "File exists"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/os/getenv.c
|
||||
msgid "File not found"
|
||||
msgstr ""
|
||||
|
||||
#: ports/atmel-samd/common-hal/canio/Listener.c
|
||||
#: ports/espressif/common-hal/canio/Listener.c
|
||||
#: ports/stm/common-hal/canio/Listener.c
|
||||
@ -1025,7 +1022,6 @@ msgstr ""
|
||||
msgid "Firmware is invalid"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/coproc/Coproc.c
|
||||
#: ports/espressif/common-hal/dualbank/__init__.c
|
||||
msgid "Firmware is too big"
|
||||
msgstr ""
|
||||
@ -1067,6 +1063,8 @@ msgstr ""
|
||||
#: shared-bindings/displayio/Display.c
|
||||
#: shared-bindings/displayio/EPaperDisplay.c
|
||||
#: shared-bindings/framebufferio/FramebufferDisplay.c
|
||||
#: shared-module/displayio/Display.c
|
||||
#: shared-module/framebufferio/FramebufferDisplay.c
|
||||
msgid "Group already used"
|
||||
msgstr ""
|
||||
|
||||
@ -1087,6 +1085,15 @@ msgstr ""
|
||||
msgid "Hardware in use, try alternative pins"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Heap allocation when VM not running."
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid ""
|
||||
"Heap was corrupted because the stack was too small. Increase stack size."
|
||||
msgstr ""
|
||||
|
||||
#: extmod/vfs_posix_file.c py/objstringio.c
|
||||
msgid "I/O operation on closed file"
|
||||
msgstr ""
|
||||
@ -1104,11 +1111,6 @@ msgstr ""
|
||||
msgid "I2SOut not available"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/aesio/aes.c
|
||||
#, c-format
|
||||
msgid "IV must be %d bytes long"
|
||||
msgstr ""
|
||||
|
||||
#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
|
||||
msgid "In-buffer elements must be <= 4 bytes long"
|
||||
msgstr ""
|
||||
@ -1193,6 +1195,7 @@ msgid "Internal define error"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/paralleldisplay/ParallelBus.c
|
||||
#: shared-module/os/getenv.c
|
||||
msgid "Internal error"
|
||||
msgstr ""
|
||||
|
||||
@ -1205,6 +1208,10 @@ msgstr ""
|
||||
msgid "Internal watchdog timer expired."
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Interrupt error."
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c shared-bindings/digitalio/DigitalInOut.c
|
||||
msgid "Invalid %q"
|
||||
msgstr ""
|
||||
@ -1239,6 +1246,11 @@ msgstr ""
|
||||
msgid "Invalid bits per value"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/os/getenv.c
|
||||
#, c-format
|
||||
msgid "Invalid byte %.*s"
|
||||
msgstr ""
|
||||
|
||||
#: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c
|
||||
#, c-format
|
||||
msgid "Invalid data_pins[%d]"
|
||||
@ -1248,18 +1260,10 @@ msgstr ""
|
||||
msgid "Invalid format chunk size"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Invalid memory access."
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/wifi/Radio.c
|
||||
msgid "Invalid multicast MAC address"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/busio/UART.c
|
||||
msgid "Invalid pins"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c
|
||||
msgid "Invalid size"
|
||||
msgstr ""
|
||||
@ -1273,10 +1277,18 @@ msgstr ""
|
||||
msgid "Invalid state"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/os/getenv.c
|
||||
msgid "Invalid unicode escape"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/aesio/aes.c
|
||||
msgid "Key must be 16, 24, or 32 bytes long"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/os/getenv.c
|
||||
msgid "Key not found"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/is31fl3741/FrameBuffer.c
|
||||
msgid "LED mappings must match display size"
|
||||
msgstr ""
|
||||
@ -1383,6 +1395,10 @@ msgstr ""
|
||||
msgid "NVS Error"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/socketpool/SocketPool.c
|
||||
msgid "Name or service not known"
|
||||
msgstr ""
|
||||
|
||||
#: py/qstr.c
|
||||
msgid "Name too long"
|
||||
msgstr ""
|
||||
@ -1497,11 +1513,6 @@ msgstr ""
|
||||
msgid "No long integer support"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/usb_hid/__init__.c
|
||||
#, c-format
|
||||
msgid "No more than %d HID devices allowed"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/wifi/Radio.c
|
||||
msgid "No network with that ssid"
|
||||
msgstr ""
|
||||
@ -1537,10 +1548,6 @@ msgstr ""
|
||||
msgid "No timer available"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Nordic system firmware failure assertion."
|
||||
msgstr ""
|
||||
|
||||
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||
msgid "Nordic system firmware out of memory"
|
||||
msgstr ""
|
||||
@ -1560,10 +1567,6 @@ msgstr ""
|
||||
msgid "Not playing"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/_bleio/__init__.c
|
||||
msgid "Not settable"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/paralleldisplay/ParallelBus.c
|
||||
#, c-format
|
||||
msgid "Number of data_pins must be 8 or 16, not %d"
|
||||
@ -1626,11 +1629,14 @@ msgid ""
|
||||
"%d bpp given"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/alarm/coproc/CoprocAlarm.c
|
||||
#: ports/espressif/common-hal/alarm/touch/TouchAlarm.c
|
||||
msgid "Only one %q can be set in deep sleep."
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/espulp/ULPAlarm.c
|
||||
msgid "Only one %q can be set."
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/i2ctarget/I2CTarget.c
|
||||
#: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c
|
||||
msgid "Only one address is allowed"
|
||||
@ -1663,6 +1669,10 @@ msgstr ""
|
||||
msgid "Operation timed out"
|
||||
msgstr ""
|
||||
|
||||
#: ports/raspberrypi/common-hal/mdns/Server.c
|
||||
msgid "Out of MDNS service slots"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c
|
||||
msgid "Out of memory"
|
||||
msgstr ""
|
||||
@ -1786,6 +1796,10 @@ msgstr ""
|
||||
msgid "Program size invalid"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/espulp/ULP.c
|
||||
msgid "Program too long"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/digitalio/DigitalInOut.c
|
||||
msgid "Pull not used when direction is output."
|
||||
msgstr ""
|
||||
@ -1825,8 +1839,9 @@ msgstr ""
|
||||
msgid "Random number generation error"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/_bleio/__init__.c
|
||||
#: shared-bindings/memorymonitor/AllocationSize.c
|
||||
#: shared-bindings/pulseio/PulseIn.c
|
||||
#: shared-bindings/pulseio/PulseIn.c shared-module/displayio/Bitmap.c
|
||||
msgid "Read-only"
|
||||
msgstr ""
|
||||
|
||||
@ -1834,10 +1849,6 @@ msgstr ""
|
||||
msgid "Read-only filesystem"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/displayio/Bitmap.c
|
||||
msgid "Read-only object"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c
|
||||
msgid "Received response was invalid"
|
||||
msgstr ""
|
||||
@ -1930,7 +1941,7 @@ msgstr ""
|
||||
msgid "Sleep Memory not available"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c
|
||||
#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c
|
||||
#: shared-bindings/nvm/ByteArray.c
|
||||
msgid "Slice and value different lengths."
|
||||
msgstr ""
|
||||
@ -1967,6 +1978,10 @@ msgstr ""
|
||||
msgid "Stereo right must be on PWM channel B"
|
||||
msgstr ""
|
||||
|
||||
#: ports/raspberrypi/common-hal/wifi/Radio.c
|
||||
msgid "Stopping AP is not supported."
|
||||
msgstr ""
|
||||
|
||||
#: ports/mimxrt10xx/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
|
||||
msgid "Supply at least one UART pin"
|
||||
msgstr ""
|
||||
@ -1984,35 +1999,11 @@ msgid "Temperature read timed out"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "The BOOT button was pressed at start up.\n"
|
||||
msgid "The `microcontroller` module was used to boot into safe mode."
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid ""
|
||||
"The CircuitPython heap was corrupted because the stack was too small.\n"
|
||||
"Increase the stack size if you know how. If not:"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/boards/adafruit_feather_esp32_v2/mpconfigboard.h
|
||||
msgid "The SW38 button was pressed at start up.\n"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/boards/hardkernel_odroid_go/mpconfigboard.h
|
||||
msgid "The VOLUME button was pressed at start up.\n"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid ""
|
||||
"The `microcontroller` module was used to boot into safe mode. Press reset to "
|
||||
"exit safe mode."
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/boards/m5stack_atom_lite/mpconfigboard.h
|
||||
msgid "The central button was pressed at start up.\n"
|
||||
msgstr ""
|
||||
|
||||
#: ports/nrf/boards/aramcon2_badge/mpconfigboard.h
|
||||
msgid "The left button was pressed at start up.\n"
|
||||
#: py/obj.c
|
||||
msgid "The above exception was the direct cause of the following exception:"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/rgbmatrix/RGBMatrix.c
|
||||
@ -2020,10 +2011,7 @@ msgid "The length of rgb_pins must be 6, 12, 18, 24, or 30"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid ""
|
||||
"The microcontroller's power dipped. Make sure your power supply provides\n"
|
||||
"enough power for the whole circuit and press reset (after ejecting "
|
||||
"CIRCUITPY)."
|
||||
msgid "The power dipped. Make sure you are providing enough power."
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/audiomixer/MixerVoice.c
|
||||
@ -2042,6 +2030,10 @@ msgstr ""
|
||||
msgid "The sample's signedness does not match the mixer's"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Third-party firmware fatal error."
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/imagecapture/ParallelImageCapture.c
|
||||
msgid "This microcontroller does not support continuous capture."
|
||||
msgstr ""
|
||||
@ -2074,10 +2066,6 @@ msgstr ""
|
||||
msgid "Timeout is too long: Maximum timeout length is %d seconds"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "To exit, please reset the board without requesting safe mode."
|
||||
msgstr ""
|
||||
|
||||
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
|
||||
msgid "Too many channels in sample"
|
||||
msgstr ""
|
||||
@ -2122,6 +2110,10 @@ msgstr ""
|
||||
msgid "UART init"
|
||||
msgstr ""
|
||||
|
||||
#: ports/raspberrypi/common-hal/busio/UART.c
|
||||
msgid "UART peripheral in use"
|
||||
msgstr ""
|
||||
|
||||
#: ports/stm/common-hal/busio/UART.c
|
||||
msgid "UART re-init"
|
||||
msgstr ""
|
||||
@ -2169,6 +2161,10 @@ msgstr ""
|
||||
msgid "Unable to allocate buffers for signed conversion"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Unable to allocate the heap."
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/busio/I2C.c
|
||||
msgid "Unable to create lock"
|
||||
msgstr ""
|
||||
@ -2192,11 +2188,12 @@ msgid "Unable to read color palette data"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/mdns/Server.c
|
||||
#: ports/raspberrypi/common-hal/mdns/Server.c
|
||||
msgid "Unable to start mDNS query"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/coproc/CoprocMemory.c
|
||||
msgid "Unable to write"
|
||||
#: shared-bindings/memorymap/AddressRange.c
|
||||
msgid "Unable to write to address."
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/nvm/ByteArray.c
|
||||
@ -2267,6 +2264,7 @@ msgid "Unkown error code %d"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/adafruit_pixelbuf/PixelBuf.c
|
||||
#: shared-module/_pixelmap/PixelMap.c
|
||||
#, c-format
|
||||
msgid "Unmatched number of items on RHS (expected %d, got %d)."
|
||||
msgstr ""
|
||||
@ -2351,6 +2349,18 @@ msgstr ""
|
||||
msgid "Wi-Fi: "
|
||||
msgstr ""
|
||||
|
||||
#: ports/raspberrypi/common-hal/wifi/Radio.c
|
||||
msgid "Wifi is in access point mode."
|
||||
msgstr ""
|
||||
|
||||
#: ports/raspberrypi/common-hal/wifi/Radio.c
|
||||
msgid "Wifi is in station mode."
|
||||
msgstr ""
|
||||
|
||||
#: ports/raspberrypi/common-hal/wifi/Radio.c
|
||||
msgid "Wifi is not enabled"
|
||||
msgstr ""
|
||||
|
||||
#: main.c
|
||||
msgid "Woken up by alarm.\n"
|
||||
msgstr ""
|
||||
@ -2360,13 +2370,48 @@ msgstr ""
|
||||
msgid "Writes not supported on Characteristic"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "You are in safe mode because:\n"
|
||||
#: ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.h
|
||||
#: ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.h
|
||||
#: ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.h
|
||||
#: ports/atmel-samd/boards/meowmeow/mpconfigboard.h
|
||||
msgid "You pressed both buttons at start up."
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/boards/m5stack_core_basic/mpconfigboard.h
|
||||
#: ports/espressif/boards/m5stack_core_fire/mpconfigboard.h
|
||||
#: ports/espressif/boards/m5stack_stick_c/mpconfigboard.h
|
||||
msgid "You pressed button A at start up."
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid ""
|
||||
"You pressed the reset button during boot. Press again to exit safe mode."
|
||||
msgid "You pressed the BOOT button at start up"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/boards/adafruit_feather_esp32_v2/mpconfigboard.h
|
||||
msgid "You pressed the SW38 button at start up."
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/boards/hardkernel_odroid_go/mpconfigboard.h
|
||||
msgid "You pressed the VOLUME button at start up."
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/boards/m5stack_atom_echo/mpconfigboard.h
|
||||
#: ports/espressif/boards/m5stack_atom_lite/mpconfigboard.h
|
||||
#: ports/espressif/boards/m5stack_atom_matrix/mpconfigboard.h
|
||||
#: ports/espressif/boards/m5stack_atom_u/mpconfigboard.h
|
||||
msgid "You pressed the central button at start up."
|
||||
msgstr ""
|
||||
|
||||
#: ports/nrf/boards/aramcon2_badge/mpconfigboard.h
|
||||
msgid "You pressed the left button at start up."
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "You pressed the reset button during boot."
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/micropython.c
|
||||
msgid "[truncated due to length]"
|
||||
msgstr ""
|
||||
|
||||
#: py/objtype.c
|
||||
@ -2438,8 +2483,12 @@ msgstr ""
|
||||
msgid "array has too many dimensions"
|
||||
msgstr ""
|
||||
|
||||
#: extmod/ulab/code/ndarray.c
|
||||
msgid "array is too big"
|
||||
msgstr ""
|
||||
|
||||
#: py/objarray.c shared-bindings/alarm/SleepMemory.c
|
||||
#: shared-bindings/coproc/CoprocMemory.c shared-bindings/nvm/ByteArray.c
|
||||
#: shared-bindings/memorymap/AddressRange.c shared-bindings/nvm/ByteArray.c
|
||||
msgid "array/bytes required on right side"
|
||||
msgstr ""
|
||||
|
||||
@ -2532,10 +2581,6 @@ msgstr ""
|
||||
msgid "buffer too small for requested bytes"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/adafruit_pixelbuf/PixelBuf.c
|
||||
msgid "byteorder is not a string"
|
||||
msgstr ""
|
||||
|
||||
#: py/objarray.c
|
||||
msgid "bytes length not a multiple of item size"
|
||||
msgstr ""
|
||||
@ -2577,14 +2622,10 @@ msgstr ""
|
||||
msgid "can't cancel self"
|
||||
msgstr ""
|
||||
|
||||
#: py/obj.c py/objint.c shared-module/adafruit_pixelbuf/PixelBuf.c
|
||||
#: py/obj.c py/objint.c py/runtime.c shared-module/adafruit_pixelbuf/PixelBuf.c
|
||||
msgid "can't convert %q to %q"
|
||||
msgstr ""
|
||||
|
||||
#: py/runtime.c
|
||||
msgid "can't convert %q to int"
|
||||
msgstr ""
|
||||
|
||||
#: py/obj.c
|
||||
#, c-format
|
||||
msgid "can't convert %s to complex"
|
||||
@ -2666,6 +2707,10 @@ msgstr ""
|
||||
msgid "can't set attribute"
|
||||
msgstr ""
|
||||
|
||||
#: py/runtime.c
|
||||
msgid "can't set attribute '%q'"
|
||||
msgstr ""
|
||||
|
||||
#: py/emitnative.c
|
||||
msgid "can't store '%q'"
|
||||
msgstr ""
|
||||
@ -2768,10 +2813,6 @@ msgstr ""
|
||||
msgid "comparison of int and uint"
|
||||
msgstr ""
|
||||
|
||||
#: py/objcomplex.c
|
||||
msgid "complex division by zero"
|
||||
msgstr ""
|
||||
|
||||
#: py/objfloat.c py/parsenum.c
|
||||
msgid "complex values not supported"
|
||||
msgstr ""
|
||||
@ -2874,12 +2915,11 @@ msgstr ""
|
||||
msgid "div/mod not implemented for uint"
|
||||
msgstr ""
|
||||
|
||||
#: py/objfloat.c py/objint_mpz.c
|
||||
#: extmod/ulab/code/numpy/create.c
|
||||
msgid "divide by zero"
|
||||
msgstr ""
|
||||
|
||||
#: py/modmath.c py/objint_longlong.c py/runtime.c
|
||||
#: shared-bindings/math/__init__.c
|
||||
#: py/runtime.c
|
||||
msgid "division by zero"
|
||||
msgstr ""
|
||||
|
||||
@ -2920,9 +2960,9 @@ msgstr ""
|
||||
msgid "error = 0x%08lX"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/esp32_camera/Camera.c
|
||||
#: ports/espressif/common-hal/espcamera/Camera.c
|
||||
msgid ""
|
||||
"esp32_camera.Camera requires reserved PSRAM to be configured. See the "
|
||||
"espcamera.Camera requires reserved PSRAM to be configured. See the "
|
||||
"documentation for instructions."
|
||||
msgstr ""
|
||||
|
||||
@ -2930,14 +2970,6 @@ msgstr ""
|
||||
msgid "exceptions must derive from BaseException"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/canio/CAN.c
|
||||
msgid "expected '%q' but got '%q'"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/canio/CAN.c
|
||||
msgid "expected '%q' or '%q' but got '%q'"
|
||||
msgstr ""
|
||||
|
||||
#: py/objstr.c
|
||||
msgid "expected ':' after format specifier"
|
||||
msgstr ""
|
||||
@ -3036,10 +3068,6 @@ msgstr ""
|
||||
msgid "format requires a dict"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/microcontroller/Processor.c
|
||||
msgid "frequency is read-only for this board"
|
||||
msgstr ""
|
||||
|
||||
#: py/objdeque.c
|
||||
msgid "full"
|
||||
msgstr ""
|
||||
@ -3152,8 +3180,12 @@ msgstr ""
|
||||
msgid "index is out of bounds"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/_pixelmap/PixelMap.c
|
||||
msgid "index must be tuple or int"
|
||||
msgstr ""
|
||||
|
||||
#: extmod/ulab/code/numpy/numerical.c extmod/ulab/code/ulab_tools.c
|
||||
#: ports/espressif/common-hal/pulseio/PulseIn.c py/obj.c
|
||||
#: ports/espressif/common-hal/pulseio/PulseIn.c
|
||||
#: shared-bindings/bitmaptools/__init__.c
|
||||
msgid "index out of range"
|
||||
msgstr ""
|
||||
@ -3251,10 +3283,6 @@ msgstr ""
|
||||
msgid "inputs are not iterable"
|
||||
msgstr ""
|
||||
|
||||
#: py/parsenum.c
|
||||
msgid "int() arg 2 must be >= 2 and <= 36"
|
||||
msgstr ""
|
||||
|
||||
#: extmod/ulab/code/numpy/approx.c
|
||||
msgid "interp is defined for 1D iterables of equal length"
|
||||
msgstr ""
|
||||
@ -3311,7 +3339,7 @@ msgstr ""
|
||||
msgid "invalid micropython decorator"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/esp32_camera/Camera.c
|
||||
#: ports/espressif/common-hal/espcamera/Camera.c
|
||||
msgid "invalid setting"
|
||||
msgstr ""
|
||||
|
||||
@ -3336,10 +3364,6 @@ msgstr ""
|
||||
msgid "invalid syntax for number"
|
||||
msgstr ""
|
||||
|
||||
#: py/objexcept.c
|
||||
msgid "invalid traceback"
|
||||
msgstr ""
|
||||
|
||||
#: py/objtype.c
|
||||
msgid "issubclass() arg 1 must be a class"
|
||||
msgstr ""
|
||||
@ -3396,19 +3420,17 @@ msgstr ""
|
||||
msgid "local variable referenced before assignment"
|
||||
msgstr ""
|
||||
|
||||
#: py/objint.c
|
||||
msgid "long int not supported in this build"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/canio/CAN.c
|
||||
msgid "loopback + silent mode not supported by peripheral"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/mdns/Server.c
|
||||
#: ports/raspberrypi/common-hal/mdns/Server.c
|
||||
msgid "mDNS already initialized"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/mdns/Server.c
|
||||
#: ports/raspberrypi/common-hal/mdns/Server.c
|
||||
msgid "mDNS only works with built-in WiFi"
|
||||
msgstr ""
|
||||
|
||||
@ -3537,6 +3559,10 @@ msgstr ""
|
||||
msgid "negative shift count"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/_pixelmap/PixelMap.c
|
||||
msgid "nested index must be int"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/sdcardio/SDCard.c
|
||||
msgid "no SD card"
|
||||
msgstr ""
|
||||
@ -3570,7 +3596,7 @@ msgstr ""
|
||||
msgid "no response from SD card"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/esp32_camera/Camera.c py/objobject.c py/runtime.c
|
||||
#: ports/espressif/common-hal/espcamera/Camera.c py/objobject.c py/runtime.c
|
||||
msgid "no such attribute"
|
||||
msgstr ""
|
||||
|
||||
@ -3706,6 +3732,10 @@ msgstr ""
|
||||
msgid "only mono is supported"
|
||||
msgstr ""
|
||||
|
||||
#: extmod/ulab/code/numpy/create.c
|
||||
msgid "only ndarrays can be concatenated"
|
||||
msgstr ""
|
||||
|
||||
#: ports/stm/common-hal/audiobusio/PDMIn.c
|
||||
msgid "only oversample=64 is supported"
|
||||
msgstr ""
|
||||
@ -3716,7 +3746,7 @@ msgid "only sample_rate=16000 is supported"
|
||||
msgstr ""
|
||||
|
||||
#: py/objarray.c py/objstr.c py/objstrunicode.c py/objtuple.c
|
||||
#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c
|
||||
#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c
|
||||
#: shared-bindings/nvm/ByteArray.c
|
||||
msgid "only slices with step=1 (aka None) are supported"
|
||||
msgstr ""
|
||||
@ -3932,10 +3962,6 @@ msgstr ""
|
||||
msgid "slice step can't be zero"
|
||||
msgstr ""
|
||||
|
||||
#: py/objslice.c
|
||||
msgid "slice step cannot be zero"
|
||||
msgstr ""
|
||||
|
||||
#: py/nativeglue.c
|
||||
msgid "slice unsupported"
|
||||
msgstr ""
|
||||
@ -3984,10 +4010,6 @@ msgstr ""
|
||||
msgid "start/end indices"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/random/__init__.c
|
||||
msgid "step must be non-zero"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/random/__init__.c
|
||||
msgid "stop not reachable from start"
|
||||
msgstr ""
|
||||
@ -3996,10 +4018,6 @@ msgstr ""
|
||||
msgid "stream operation not supported"
|
||||
msgstr ""
|
||||
|
||||
#: py/objstrunicode.c
|
||||
msgid "string indices must be integers, not %q"
|
||||
msgstr ""
|
||||
|
||||
#: py/stream.c
|
||||
msgid "string not supported; use bytes or bytearray"
|
||||
msgstr ""
|
||||
@ -4032,10 +4050,6 @@ msgstr ""
|
||||
msgid "syntax error in uctypes descriptor"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/time/__init__.c
|
||||
msgid "time.struct_time() takes a 9-sequence"
|
||||
msgstr ""
|
||||
|
||||
#: ports/atmel-samd/common-hal/watchdog/WatchDogTimer.c
|
||||
#: ports/espressif/common-hal/watchdog/WatchDogTimer.c
|
||||
#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
|
||||
@ -4317,10 +4331,6 @@ msgstr ""
|
||||
msgid "y value out of bounds"
|
||||
msgstr ""
|
||||
|
||||
#: py/objrange.c
|
||||
msgid "zero step"
|
||||
msgstr ""
|
||||
|
||||
#: extmod/ulab/code/scipy/signal/signal.c
|
||||
msgid "zi must be an ndarray"
|
||||
msgstr ""
|
||||
|
509
locale/cs.po
509
locale/cs.po
File diff suppressed because it is too large
Load Diff
661
locale/de_DE.po
661
locale/de_DE.po
File diff suppressed because it is too large
Load Diff
489
locale/el.po
489
locale/el.po
File diff suppressed because it is too large
Load Diff
575
locale/en_GB.po
575
locale/en_GB.po
File diff suppressed because it is too large
Load Diff
928
locale/es.po
928
locale/es.po
File diff suppressed because it is too large
Load Diff
482
locale/fil.po
482
locale/fil.po
File diff suppressed because it is too large
Load Diff
682
locale/fr.po
682
locale/fr.po
File diff suppressed because it is too large
Load Diff
436
locale/hi.po
436
locale/hi.po
@ -31,8 +31,20 @@ msgstr ""
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid ""
|
||||
"\n"
|
||||
"Please file an issue with the contents of your CIRCUITPY drive at \n"
|
||||
"https://github.com/adafruit/circuitpython/issues\n"
|
||||
"Please file an issue with your program at https://github.com/adafruit/"
|
||||
"circuitpython/issues."
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid ""
|
||||
"\n"
|
||||
"Press reset to exit safe mode.\n"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid ""
|
||||
"\n"
|
||||
"You are in safe mode because:\n"
|
||||
msgstr ""
|
||||
|
||||
#: py/obj.c
|
||||
@ -65,6 +77,11 @@ msgstr ""
|
||||
msgid "%02X"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/os/getenv.c
|
||||
#, c-format
|
||||
msgid "%S"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/rgbmatrix/RGBMatrix.c
|
||||
#, c-format
|
||||
msgid ""
|
||||
@ -80,7 +97,7 @@ msgstr ""
|
||||
#: ports/raspberrypi/common-hal/alarm/__init__.c
|
||||
#: ports/raspberrypi/common-hal/analogio/AnalogOut.c
|
||||
#: ports/raspberrypi/common-hal/rtc/RTC.c ports/stm/common-hal/alarm/__init__.c
|
||||
#: ports/stm/common-hal/rtc/RTC.c
|
||||
#: ports/stm/common-hal/canio/Listener.c ports/stm/common-hal/rtc/RTC.c
|
||||
msgid "%q"
|
||||
msgstr ""
|
||||
|
||||
@ -100,13 +117,18 @@ msgstr ""
|
||||
msgid "%q failure: %d"
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c
|
||||
msgid "%q in %q must be of type %q, not %q"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/espulp/ULP.c
|
||||
#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
|
||||
#: shared-bindings/digitalio/DigitalInOut.c
|
||||
#: shared-bindings/microcontroller/Pin.c
|
||||
msgid "%q in use"
|
||||
msgstr ""
|
||||
|
||||
#: py/obj.c py/objstr.c py/objstrunicode.c
|
||||
#: py/objstr.c py/objstrunicode.c
|
||||
msgid "%q index out of range"
|
||||
msgstr ""
|
||||
|
||||
@ -118,7 +140,11 @@ msgstr ""
|
||||
msgid "%q is %q"
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c
|
||||
#: ports/raspberrypi/common-hal/wifi/Radio.c
|
||||
msgid "%q is read-only for this board"
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c shared-bindings/usb_hid/Device.c
|
||||
msgid "%q length must be %d"
|
||||
msgstr ""
|
||||
|
||||
@ -134,10 +160,6 @@ msgstr ""
|
||||
msgid "%q length must be >= %d"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/busio/I2C.c
|
||||
msgid "%q length must be >= 1"
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c
|
||||
msgid "%q must be %d"
|
||||
msgstr ""
|
||||
@ -159,24 +181,20 @@ msgid "%q must be >= %d"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/analogbufio/BufferedIn.c
|
||||
msgid "%q must be a bytearray or array of type 'H' or 'B'"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/audiocore/RawSample.c
|
||||
msgid "%q must be a bytearray or array of type 'h', 'H', 'b', or 'B'"
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c
|
||||
msgid "%q must be a string"
|
||||
#: ports/raspberrypi/bindings/cyw43/__init__.c py/argcheck.c py/objexcept.c
|
||||
#: shared-bindings/canio/CAN.c shared-bindings/digitalio/Pull.c
|
||||
msgid "%q must be of type %q or %q, not %q"
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c
|
||||
msgid "%q must be an int"
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c
|
||||
msgid "%q must be of type %q"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/digitalio/Pull.c
|
||||
msgid "%q must be of type %q or None"
|
||||
#: py/argcheck.c py/obj.c py/objstrunicode.c
|
||||
msgid "%q must be of type %q, not %q"
|
||||
msgstr ""
|
||||
|
||||
#: ports/atmel-samd/common-hal/busio/UART.c
|
||||
@ -189,7 +207,6 @@ msgstr ""
|
||||
|
||||
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
|
||||
#: ports/cxd56/common-hal/pulseio/PulseIn.c
|
||||
#: ports/espressif/common-hal/coproc/Coproc.c
|
||||
#: ports/nrf/common-hal/pulseio/PulseIn.c
|
||||
#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
|
||||
#: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c
|
||||
@ -201,8 +218,8 @@ msgstr ""
|
||||
msgid "%q pin invalid"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/usb_hid/Device.c
|
||||
msgid "%q with a report ID of 0 must be of length 1"
|
||||
#: py/objrange.c py/objslice.c shared-bindings/random/__init__.c
|
||||
msgid "%q step cannot be zero"
|
||||
msgstr ""
|
||||
|
||||
#: py/bc.c py/objnamedtuple.c
|
||||
@ -302,7 +319,7 @@ msgstr ""
|
||||
msgid "'%s' object doesn't support item deletion"
|
||||
msgstr ""
|
||||
|
||||
#: ports/raspberrypi/common-hal/wifi/Radio.c py/runtime.c
|
||||
#: py/runtime.c
|
||||
msgid "'%s' object has no attribute '%q'"
|
||||
msgstr ""
|
||||
|
||||
@ -402,6 +419,10 @@ msgstr ""
|
||||
msgid "Address must be %d bytes long"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/memorymap/AddressRange.c
|
||||
msgid "Address range not allowed"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/canio/CAN.c
|
||||
msgid "All CAN peripherals are in use"
|
||||
msgstr ""
|
||||
@ -429,7 +450,6 @@ msgid "All SPI peripherals are in use"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
|
||||
#: ports/raspberrypi/common-hal/busio/UART.c
|
||||
msgid "All UART peripherals are in use"
|
||||
msgstr ""
|
||||
|
||||
@ -482,7 +502,7 @@ msgstr ""
|
||||
msgid "Already have all-matches listener"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/coproc/__init__.c
|
||||
#: ports/espressif/common-hal/espulp/ULP.c
|
||||
#: shared-module/memorymonitor/AllocationAlarm.c
|
||||
#: shared-module/memorymonitor/AllocationSize.c
|
||||
msgid "Already running"
|
||||
@ -493,6 +513,11 @@ msgstr ""
|
||||
msgid "Already scanning for wifi networks"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/os/getenv.c
|
||||
#, c-format
|
||||
msgid "An error occurred while retrieving '%s':\n"
|
||||
msgstr ""
|
||||
|
||||
#: ports/stm/common-hal/audiopwmio/PWMAudioOut.c
|
||||
msgid "Another PWMAudioOut is already active"
|
||||
msgstr ""
|
||||
@ -506,24 +531,16 @@ msgstr ""
|
||||
msgid "Array must contain halfwords (type 'H')"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c
|
||||
#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c
|
||||
#: shared-bindings/nvm/ByteArray.c
|
||||
msgid "Array values should be single bytes."
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/microcontroller/Pin.c
|
||||
msgid "At most %d %q may be specified (not %d)"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/memorymonitor/AllocationAlarm.c
|
||||
#, c-format
|
||||
msgid "Attempt to allocate %d blocks"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Attempted heap allocation when VM not running."
|
||||
msgstr ""
|
||||
|
||||
#: ports/raspberrypi/audio_dma.c
|
||||
msgid "Audio conversion not implemented"
|
||||
msgstr ""
|
||||
@ -572,20 +589,13 @@ msgid "Bitmap size and bits per value must match"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Boot device must be first device (interface #0)."
|
||||
msgid "Boot device must be first (interface #0)."
|
||||
msgstr ""
|
||||
|
||||
#: ports/mimxrt10xx/common-hal/busio/UART.c
|
||||
msgid "Both RX and TX required for flow control"
|
||||
msgstr ""
|
||||
|
||||
#: ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.h
|
||||
#: ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.h
|
||||
#: 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 ""
|
||||
|
||||
#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c
|
||||
msgid "Both pins must support hardware interrupts"
|
||||
msgstr ""
|
||||
@ -651,11 +661,6 @@ msgstr ""
|
||||
msgid "Bus pin %d is already in use"
|
||||
msgstr ""
|
||||
|
||||
#: 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 ""
|
||||
|
||||
#: shared-bindings/_bleio/UUID.c
|
||||
msgid "Byte buffer must be 16 bytes."
|
||||
msgstr ""
|
||||
@ -786,10 +791,6 @@ msgstr ""
|
||||
msgid "CircuitPython core code crashed hard. Whoops!\n"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "CircuitPython was unable to allocate the heap."
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/bitbangio/I2C.c
|
||||
msgid "Clock stretch too long"
|
||||
msgstr ""
|
||||
@ -828,10 +829,6 @@ msgstr ""
|
||||
msgid "Couldn't allocate decoder"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Crash into the HardFault_Handler."
|
||||
msgstr ""
|
||||
|
||||
#: ports/stm/common-hal/analogio/AnalogOut.c
|
||||
msgid "DAC Channel Init Error"
|
||||
msgstr ""
|
||||
@ -894,6 +891,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 ""
|
||||
@ -919,24 +920,16 @@ msgstr ""
|
||||
msgid "Error in regex"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Error in safemode.py."
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/socketpool/Socket.c shared-bindings/ssl/SSLSocket.c
|
||||
msgid "Error: Failure to bind"
|
||||
msgstr ""
|
||||
|
||||
#: py/enum.c shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c
|
||||
#: shared-bindings/alarm/__init__.c shared-bindings/alarm/coproc/CoprocAlarm.c
|
||||
#: shared-bindings/busio/SPI.c shared-bindings/coproc/Coproc.c
|
||||
#: shared-bindings/coproc/__init__.c shared-bindings/microcontroller/Pin.c
|
||||
#: shared-bindings/neopixel_write/__init__.c
|
||||
msgid "Expected a %q"
|
||||
msgstr ""
|
||||
|
||||
#: ports/raspberrypi/bindings/cyw43/__init__.c
|
||||
msgid "Expected a %q or %q"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/alarm/__init__.c
|
||||
msgid "Expected an %q"
|
||||
msgid "Expected a kind of %q"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/_bleio/Adapter.c
|
||||
@ -1004,13 +997,17 @@ msgid "Failed to write internal flash."
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Fatal error."
|
||||
msgid "Fault detected by hardware."
|
||||
msgstr ""
|
||||
|
||||
#: py/moduerrno.c
|
||||
msgid "File exists"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/os/getenv.c
|
||||
msgid "File not found"
|
||||
msgstr ""
|
||||
|
||||
#: ports/atmel-samd/common-hal/canio/Listener.c
|
||||
#: ports/espressif/common-hal/canio/Listener.c
|
||||
#: ports/stm/common-hal/canio/Listener.c
|
||||
@ -1025,7 +1022,6 @@ msgstr ""
|
||||
msgid "Firmware is invalid"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/coproc/Coproc.c
|
||||
#: ports/espressif/common-hal/dualbank/__init__.c
|
||||
msgid "Firmware is too big"
|
||||
msgstr ""
|
||||
@ -1067,6 +1063,8 @@ msgstr ""
|
||||
#: shared-bindings/displayio/Display.c
|
||||
#: shared-bindings/displayio/EPaperDisplay.c
|
||||
#: shared-bindings/framebufferio/FramebufferDisplay.c
|
||||
#: shared-module/displayio/Display.c
|
||||
#: shared-module/framebufferio/FramebufferDisplay.c
|
||||
msgid "Group already used"
|
||||
msgstr ""
|
||||
|
||||
@ -1087,6 +1085,15 @@ msgstr ""
|
||||
msgid "Hardware in use, try alternative pins"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Heap allocation when VM not running."
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid ""
|
||||
"Heap was corrupted because the stack was too small. Increase stack size."
|
||||
msgstr ""
|
||||
|
||||
#: extmod/vfs_posix_file.c py/objstringio.c
|
||||
msgid "I/O operation on closed file"
|
||||
msgstr ""
|
||||
@ -1104,11 +1111,6 @@ msgstr ""
|
||||
msgid "I2SOut not available"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/aesio/aes.c
|
||||
#, c-format
|
||||
msgid "IV must be %d bytes long"
|
||||
msgstr ""
|
||||
|
||||
#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
|
||||
msgid "In-buffer elements must be <= 4 bytes long"
|
||||
msgstr ""
|
||||
@ -1193,6 +1195,7 @@ msgid "Internal define error"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/paralleldisplay/ParallelBus.c
|
||||
#: shared-module/os/getenv.c
|
||||
msgid "Internal error"
|
||||
msgstr ""
|
||||
|
||||
@ -1205,6 +1208,10 @@ msgstr ""
|
||||
msgid "Internal watchdog timer expired."
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Interrupt error."
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c shared-bindings/digitalio/DigitalInOut.c
|
||||
msgid "Invalid %q"
|
||||
msgstr ""
|
||||
@ -1239,6 +1246,11 @@ msgstr ""
|
||||
msgid "Invalid bits per value"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/os/getenv.c
|
||||
#, c-format
|
||||
msgid "Invalid byte %.*s"
|
||||
msgstr ""
|
||||
|
||||
#: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c
|
||||
#, c-format
|
||||
msgid "Invalid data_pins[%d]"
|
||||
@ -1248,18 +1260,10 @@ msgstr ""
|
||||
msgid "Invalid format chunk size"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Invalid memory access."
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/wifi/Radio.c
|
||||
msgid "Invalid multicast MAC address"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/busio/UART.c
|
||||
msgid "Invalid pins"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c
|
||||
msgid "Invalid size"
|
||||
msgstr ""
|
||||
@ -1273,10 +1277,18 @@ msgstr ""
|
||||
msgid "Invalid state"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/os/getenv.c
|
||||
msgid "Invalid unicode escape"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/aesio/aes.c
|
||||
msgid "Key must be 16, 24, or 32 bytes long"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/os/getenv.c
|
||||
msgid "Key not found"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/is31fl3741/FrameBuffer.c
|
||||
msgid "LED mappings must match display size"
|
||||
msgstr ""
|
||||
@ -1383,6 +1395,10 @@ msgstr ""
|
||||
msgid "NVS Error"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/socketpool/SocketPool.c
|
||||
msgid "Name or service not known"
|
||||
msgstr ""
|
||||
|
||||
#: py/qstr.c
|
||||
msgid "Name too long"
|
||||
msgstr ""
|
||||
@ -1497,11 +1513,6 @@ msgstr ""
|
||||
msgid "No long integer support"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/usb_hid/__init__.c
|
||||
#, c-format
|
||||
msgid "No more than %d HID devices allowed"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/wifi/Radio.c
|
||||
msgid "No network with that ssid"
|
||||
msgstr ""
|
||||
@ -1537,10 +1548,6 @@ msgstr ""
|
||||
msgid "No timer available"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Nordic system firmware failure assertion."
|
||||
msgstr ""
|
||||
|
||||
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||
msgid "Nordic system firmware out of memory"
|
||||
msgstr ""
|
||||
@ -1560,10 +1567,6 @@ msgstr ""
|
||||
msgid "Not playing"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/_bleio/__init__.c
|
||||
msgid "Not settable"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/paralleldisplay/ParallelBus.c
|
||||
#, c-format
|
||||
msgid "Number of data_pins must be 8 or 16, not %d"
|
||||
@ -1626,11 +1629,14 @@ msgid ""
|
||||
"%d bpp given"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/alarm/coproc/CoprocAlarm.c
|
||||
#: ports/espressif/common-hal/alarm/touch/TouchAlarm.c
|
||||
msgid "Only one %q can be set in deep sleep."
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/espulp/ULPAlarm.c
|
||||
msgid "Only one %q can be set."
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/i2ctarget/I2CTarget.c
|
||||
#: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c
|
||||
msgid "Only one address is allowed"
|
||||
@ -1663,6 +1669,10 @@ msgstr ""
|
||||
msgid "Operation timed out"
|
||||
msgstr ""
|
||||
|
||||
#: ports/raspberrypi/common-hal/mdns/Server.c
|
||||
msgid "Out of MDNS service slots"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c
|
||||
msgid "Out of memory"
|
||||
msgstr ""
|
||||
@ -1786,6 +1796,10 @@ msgstr ""
|
||||
msgid "Program size invalid"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/espulp/ULP.c
|
||||
msgid "Program too long"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/digitalio/DigitalInOut.c
|
||||
msgid "Pull not used when direction is output."
|
||||
msgstr ""
|
||||
@ -1825,8 +1839,9 @@ msgstr ""
|
||||
msgid "Random number generation error"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/_bleio/__init__.c
|
||||
#: shared-bindings/memorymonitor/AllocationSize.c
|
||||
#: shared-bindings/pulseio/PulseIn.c
|
||||
#: shared-bindings/pulseio/PulseIn.c shared-module/displayio/Bitmap.c
|
||||
msgid "Read-only"
|
||||
msgstr ""
|
||||
|
||||
@ -1834,10 +1849,6 @@ msgstr ""
|
||||
msgid "Read-only filesystem"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/displayio/Bitmap.c
|
||||
msgid "Read-only object"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c
|
||||
msgid "Received response was invalid"
|
||||
msgstr ""
|
||||
@ -1930,7 +1941,7 @@ msgstr ""
|
||||
msgid "Sleep Memory not available"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c
|
||||
#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c
|
||||
#: shared-bindings/nvm/ByteArray.c
|
||||
msgid "Slice and value different lengths."
|
||||
msgstr ""
|
||||
@ -1967,6 +1978,10 @@ msgstr ""
|
||||
msgid "Stereo right must be on PWM channel B"
|
||||
msgstr ""
|
||||
|
||||
#: ports/raspberrypi/common-hal/wifi/Radio.c
|
||||
msgid "Stopping AP is not supported."
|
||||
msgstr ""
|
||||
|
||||
#: ports/mimxrt10xx/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
|
||||
msgid "Supply at least one UART pin"
|
||||
msgstr ""
|
||||
@ -1984,35 +1999,11 @@ msgid "Temperature read timed out"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "The BOOT button was pressed at start up.\n"
|
||||
msgid "The `microcontroller` module was used to boot into safe mode."
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid ""
|
||||
"The CircuitPython heap was corrupted because the stack was too small.\n"
|
||||
"Increase the stack size if you know how. If not:"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/boards/adafruit_feather_esp32_v2/mpconfigboard.h
|
||||
msgid "The SW38 button was pressed at start up.\n"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/boards/hardkernel_odroid_go/mpconfigboard.h
|
||||
msgid "The VOLUME button was pressed at start up.\n"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid ""
|
||||
"The `microcontroller` module was used to boot into safe mode. Press reset to "
|
||||
"exit safe mode."
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/boards/m5stack_atom_lite/mpconfigboard.h
|
||||
msgid "The central button was pressed at start up.\n"
|
||||
msgstr ""
|
||||
|
||||
#: ports/nrf/boards/aramcon2_badge/mpconfigboard.h
|
||||
msgid "The left button was pressed at start up.\n"
|
||||
#: py/obj.c
|
||||
msgid "The above exception was the direct cause of the following exception:"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/rgbmatrix/RGBMatrix.c
|
||||
@ -2020,10 +2011,7 @@ msgid "The length of rgb_pins must be 6, 12, 18, 24, or 30"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid ""
|
||||
"The microcontroller's power dipped. Make sure your power supply provides\n"
|
||||
"enough power for the whole circuit and press reset (after ejecting "
|
||||
"CIRCUITPY)."
|
||||
msgid "The power dipped. Make sure you are providing enough power."
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/audiomixer/MixerVoice.c
|
||||
@ -2042,6 +2030,10 @@ msgstr ""
|
||||
msgid "The sample's signedness does not match the mixer's"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Third-party firmware fatal error."
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/imagecapture/ParallelImageCapture.c
|
||||
msgid "This microcontroller does not support continuous capture."
|
||||
msgstr ""
|
||||
@ -2074,10 +2066,6 @@ msgstr ""
|
||||
msgid "Timeout is too long: Maximum timeout length is %d seconds"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "To exit, please reset the board without requesting safe mode."
|
||||
msgstr ""
|
||||
|
||||
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
|
||||
msgid "Too many channels in sample"
|
||||
msgstr ""
|
||||
@ -2122,6 +2110,10 @@ msgstr ""
|
||||
msgid "UART init"
|
||||
msgstr ""
|
||||
|
||||
#: ports/raspberrypi/common-hal/busio/UART.c
|
||||
msgid "UART peripheral in use"
|
||||
msgstr ""
|
||||
|
||||
#: ports/stm/common-hal/busio/UART.c
|
||||
msgid "UART re-init"
|
||||
msgstr ""
|
||||
@ -2169,6 +2161,10 @@ msgstr ""
|
||||
msgid "Unable to allocate buffers for signed conversion"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Unable to allocate the heap."
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/busio/I2C.c
|
||||
msgid "Unable to create lock"
|
||||
msgstr ""
|
||||
@ -2192,11 +2188,12 @@ msgid "Unable to read color palette data"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/mdns/Server.c
|
||||
#: ports/raspberrypi/common-hal/mdns/Server.c
|
||||
msgid "Unable to start mDNS query"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/coproc/CoprocMemory.c
|
||||
msgid "Unable to write"
|
||||
#: shared-bindings/memorymap/AddressRange.c
|
||||
msgid "Unable to write to address."
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/nvm/ByteArray.c
|
||||
@ -2267,6 +2264,7 @@ msgid "Unkown error code %d"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/adafruit_pixelbuf/PixelBuf.c
|
||||
#: shared-module/_pixelmap/PixelMap.c
|
||||
#, c-format
|
||||
msgid "Unmatched number of items on RHS (expected %d, got %d)."
|
||||
msgstr ""
|
||||
@ -2351,6 +2349,18 @@ msgstr ""
|
||||
msgid "Wi-Fi: "
|
||||
msgstr ""
|
||||
|
||||
#: ports/raspberrypi/common-hal/wifi/Radio.c
|
||||
msgid "Wifi is in access point mode."
|
||||
msgstr ""
|
||||
|
||||
#: ports/raspberrypi/common-hal/wifi/Radio.c
|
||||
msgid "Wifi is in station mode."
|
||||
msgstr ""
|
||||
|
||||
#: ports/raspberrypi/common-hal/wifi/Radio.c
|
||||
msgid "Wifi is not enabled"
|
||||
msgstr ""
|
||||
|
||||
#: main.c
|
||||
msgid "Woken up by alarm.\n"
|
||||
msgstr ""
|
||||
@ -2360,13 +2370,48 @@ msgstr ""
|
||||
msgid "Writes not supported on Characteristic"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "You are in safe mode because:\n"
|
||||
#: ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.h
|
||||
#: ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.h
|
||||
#: ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.h
|
||||
#: ports/atmel-samd/boards/meowmeow/mpconfigboard.h
|
||||
msgid "You pressed both buttons at start up."
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/boards/m5stack_core_basic/mpconfigboard.h
|
||||
#: ports/espressif/boards/m5stack_core_fire/mpconfigboard.h
|
||||
#: ports/espressif/boards/m5stack_stick_c/mpconfigboard.h
|
||||
msgid "You pressed button A at start up."
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid ""
|
||||
"You pressed the reset button during boot. Press again to exit safe mode."
|
||||
msgid "You pressed the BOOT button at start up"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/boards/adafruit_feather_esp32_v2/mpconfigboard.h
|
||||
msgid "You pressed the SW38 button at start up."
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/boards/hardkernel_odroid_go/mpconfigboard.h
|
||||
msgid "You pressed the VOLUME button at start up."
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/boards/m5stack_atom_echo/mpconfigboard.h
|
||||
#: ports/espressif/boards/m5stack_atom_lite/mpconfigboard.h
|
||||
#: ports/espressif/boards/m5stack_atom_matrix/mpconfigboard.h
|
||||
#: ports/espressif/boards/m5stack_atom_u/mpconfigboard.h
|
||||
msgid "You pressed the central button at start up."
|
||||
msgstr ""
|
||||
|
||||
#: ports/nrf/boards/aramcon2_badge/mpconfigboard.h
|
||||
msgid "You pressed the left button at start up."
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "You pressed the reset button during boot."
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/micropython.c
|
||||
msgid "[truncated due to length]"
|
||||
msgstr ""
|
||||
|
||||
#: py/objtype.c
|
||||
@ -2438,8 +2483,12 @@ msgstr ""
|
||||
msgid "array has too many dimensions"
|
||||
msgstr ""
|
||||
|
||||
#: extmod/ulab/code/ndarray.c
|
||||
msgid "array is too big"
|
||||
msgstr ""
|
||||
|
||||
#: py/objarray.c shared-bindings/alarm/SleepMemory.c
|
||||
#: shared-bindings/coproc/CoprocMemory.c shared-bindings/nvm/ByteArray.c
|
||||
#: shared-bindings/memorymap/AddressRange.c shared-bindings/nvm/ByteArray.c
|
||||
msgid "array/bytes required on right side"
|
||||
msgstr ""
|
||||
|
||||
@ -2532,10 +2581,6 @@ msgstr ""
|
||||
msgid "buffer too small for requested bytes"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/adafruit_pixelbuf/PixelBuf.c
|
||||
msgid "byteorder is not a string"
|
||||
msgstr ""
|
||||
|
||||
#: py/objarray.c
|
||||
msgid "bytes length not a multiple of item size"
|
||||
msgstr ""
|
||||
@ -2577,14 +2622,10 @@ msgstr ""
|
||||
msgid "can't cancel self"
|
||||
msgstr ""
|
||||
|
||||
#: py/obj.c py/objint.c shared-module/adafruit_pixelbuf/PixelBuf.c
|
||||
#: py/obj.c py/objint.c py/runtime.c shared-module/adafruit_pixelbuf/PixelBuf.c
|
||||
msgid "can't convert %q to %q"
|
||||
msgstr ""
|
||||
|
||||
#: py/runtime.c
|
||||
msgid "can't convert %q to int"
|
||||
msgstr ""
|
||||
|
||||
#: py/obj.c
|
||||
#, c-format
|
||||
msgid "can't convert %s to complex"
|
||||
@ -2666,6 +2707,10 @@ msgstr ""
|
||||
msgid "can't set attribute"
|
||||
msgstr ""
|
||||
|
||||
#: py/runtime.c
|
||||
msgid "can't set attribute '%q'"
|
||||
msgstr ""
|
||||
|
||||
#: py/emitnative.c
|
||||
msgid "can't store '%q'"
|
||||
msgstr ""
|
||||
@ -2768,10 +2813,6 @@ msgstr ""
|
||||
msgid "comparison of int and uint"
|
||||
msgstr ""
|
||||
|
||||
#: py/objcomplex.c
|
||||
msgid "complex division by zero"
|
||||
msgstr ""
|
||||
|
||||
#: py/objfloat.c py/parsenum.c
|
||||
msgid "complex values not supported"
|
||||
msgstr ""
|
||||
@ -2874,12 +2915,11 @@ msgstr ""
|
||||
msgid "div/mod not implemented for uint"
|
||||
msgstr ""
|
||||
|
||||
#: py/objfloat.c py/objint_mpz.c
|
||||
#: extmod/ulab/code/numpy/create.c
|
||||
msgid "divide by zero"
|
||||
msgstr ""
|
||||
|
||||
#: py/modmath.c py/objint_longlong.c py/runtime.c
|
||||
#: shared-bindings/math/__init__.c
|
||||
#: py/runtime.c
|
||||
msgid "division by zero"
|
||||
msgstr ""
|
||||
|
||||
@ -2920,9 +2960,9 @@ msgstr ""
|
||||
msgid "error = 0x%08lX"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/esp32_camera/Camera.c
|
||||
#: ports/espressif/common-hal/espcamera/Camera.c
|
||||
msgid ""
|
||||
"esp32_camera.Camera requires reserved PSRAM to be configured. See the "
|
||||
"espcamera.Camera requires reserved PSRAM to be configured. See the "
|
||||
"documentation for instructions."
|
||||
msgstr ""
|
||||
|
||||
@ -2930,14 +2970,6 @@ msgstr ""
|
||||
msgid "exceptions must derive from BaseException"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/canio/CAN.c
|
||||
msgid "expected '%q' but got '%q'"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/canio/CAN.c
|
||||
msgid "expected '%q' or '%q' but got '%q'"
|
||||
msgstr ""
|
||||
|
||||
#: py/objstr.c
|
||||
msgid "expected ':' after format specifier"
|
||||
msgstr ""
|
||||
@ -3036,10 +3068,6 @@ msgstr ""
|
||||
msgid "format requires a dict"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/microcontroller/Processor.c
|
||||
msgid "frequency is read-only for this board"
|
||||
msgstr ""
|
||||
|
||||
#: py/objdeque.c
|
||||
msgid "full"
|
||||
msgstr ""
|
||||
@ -3152,8 +3180,12 @@ msgstr ""
|
||||
msgid "index is out of bounds"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/_pixelmap/PixelMap.c
|
||||
msgid "index must be tuple or int"
|
||||
msgstr ""
|
||||
|
||||
#: extmod/ulab/code/numpy/numerical.c extmod/ulab/code/ulab_tools.c
|
||||
#: ports/espressif/common-hal/pulseio/PulseIn.c py/obj.c
|
||||
#: ports/espressif/common-hal/pulseio/PulseIn.c
|
||||
#: shared-bindings/bitmaptools/__init__.c
|
||||
msgid "index out of range"
|
||||
msgstr ""
|
||||
@ -3251,10 +3283,6 @@ msgstr ""
|
||||
msgid "inputs are not iterable"
|
||||
msgstr ""
|
||||
|
||||
#: py/parsenum.c
|
||||
msgid "int() arg 2 must be >= 2 and <= 36"
|
||||
msgstr ""
|
||||
|
||||
#: extmod/ulab/code/numpy/approx.c
|
||||
msgid "interp is defined for 1D iterables of equal length"
|
||||
msgstr ""
|
||||
@ -3311,7 +3339,7 @@ msgstr ""
|
||||
msgid "invalid micropython decorator"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/esp32_camera/Camera.c
|
||||
#: ports/espressif/common-hal/espcamera/Camera.c
|
||||
msgid "invalid setting"
|
||||
msgstr ""
|
||||
|
||||
@ -3336,10 +3364,6 @@ msgstr ""
|
||||
msgid "invalid syntax for number"
|
||||
msgstr ""
|
||||
|
||||
#: py/objexcept.c
|
||||
msgid "invalid traceback"
|
||||
msgstr ""
|
||||
|
||||
#: py/objtype.c
|
||||
msgid "issubclass() arg 1 must be a class"
|
||||
msgstr ""
|
||||
@ -3396,19 +3420,17 @@ msgstr ""
|
||||
msgid "local variable referenced before assignment"
|
||||
msgstr ""
|
||||
|
||||
#: py/objint.c
|
||||
msgid "long int not supported in this build"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/canio/CAN.c
|
||||
msgid "loopback + silent mode not supported by peripheral"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/mdns/Server.c
|
||||
#: ports/raspberrypi/common-hal/mdns/Server.c
|
||||
msgid "mDNS already initialized"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/mdns/Server.c
|
||||
#: ports/raspberrypi/common-hal/mdns/Server.c
|
||||
msgid "mDNS only works with built-in WiFi"
|
||||
msgstr ""
|
||||
|
||||
@ -3537,6 +3559,10 @@ msgstr ""
|
||||
msgid "negative shift count"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/_pixelmap/PixelMap.c
|
||||
msgid "nested index must be int"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/sdcardio/SDCard.c
|
||||
msgid "no SD card"
|
||||
msgstr ""
|
||||
@ -3570,7 +3596,7 @@ msgstr ""
|
||||
msgid "no response from SD card"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/esp32_camera/Camera.c py/objobject.c py/runtime.c
|
||||
#: ports/espressif/common-hal/espcamera/Camera.c py/objobject.c py/runtime.c
|
||||
msgid "no such attribute"
|
||||
msgstr ""
|
||||
|
||||
@ -3706,6 +3732,10 @@ msgstr ""
|
||||
msgid "only mono is supported"
|
||||
msgstr ""
|
||||
|
||||
#: extmod/ulab/code/numpy/create.c
|
||||
msgid "only ndarrays can be concatenated"
|
||||
msgstr ""
|
||||
|
||||
#: ports/stm/common-hal/audiobusio/PDMIn.c
|
||||
msgid "only oversample=64 is supported"
|
||||
msgstr ""
|
||||
@ -3716,7 +3746,7 @@ msgid "only sample_rate=16000 is supported"
|
||||
msgstr ""
|
||||
|
||||
#: py/objarray.c py/objstr.c py/objstrunicode.c py/objtuple.c
|
||||
#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c
|
||||
#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c
|
||||
#: shared-bindings/nvm/ByteArray.c
|
||||
msgid "only slices with step=1 (aka None) are supported"
|
||||
msgstr ""
|
||||
@ -3932,10 +3962,6 @@ msgstr ""
|
||||
msgid "slice step can't be zero"
|
||||
msgstr ""
|
||||
|
||||
#: py/objslice.c
|
||||
msgid "slice step cannot be zero"
|
||||
msgstr ""
|
||||
|
||||
#: py/nativeglue.c
|
||||
msgid "slice unsupported"
|
||||
msgstr ""
|
||||
@ -3984,10 +4010,6 @@ msgstr ""
|
||||
msgid "start/end indices"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/random/__init__.c
|
||||
msgid "step must be non-zero"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/random/__init__.c
|
||||
msgid "stop not reachable from start"
|
||||
msgstr ""
|
||||
@ -3996,10 +4018,6 @@ msgstr ""
|
||||
msgid "stream operation not supported"
|
||||
msgstr ""
|
||||
|
||||
#: py/objstrunicode.c
|
||||
msgid "string indices must be integers, not %q"
|
||||
msgstr ""
|
||||
|
||||
#: py/stream.c
|
||||
msgid "string not supported; use bytes or bytearray"
|
||||
msgstr ""
|
||||
@ -4032,10 +4050,6 @@ msgstr ""
|
||||
msgid "syntax error in uctypes descriptor"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/time/__init__.c
|
||||
msgid "time.struct_time() takes a 9-sequence"
|
||||
msgstr ""
|
||||
|
||||
#: ports/atmel-samd/common-hal/watchdog/WatchDogTimer.c
|
||||
#: ports/espressif/common-hal/watchdog/WatchDogTimer.c
|
||||
#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
|
||||
@ -4317,10 +4331,6 @@ msgstr ""
|
||||
msgid "y value out of bounds"
|
||||
msgstr ""
|
||||
|
||||
#: py/objrange.c
|
||||
msgid "zero step"
|
||||
msgstr ""
|
||||
|
||||
#: extmod/ulab/code/scipy/signal/signal.c
|
||||
msgid "zi must be an ndarray"
|
||||
msgstr ""
|
||||
|
478
locale/it_IT.po
478
locale/it_IT.po
File diff suppressed because it is too large
Load Diff
521
locale/ja.po
521
locale/ja.po
File diff suppressed because it is too large
Load Diff
442
locale/ko.po
442
locale/ko.po
@ -32,8 +32,20 @@ msgstr ""
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid ""
|
||||
"\n"
|
||||
"Please file an issue with the contents of your CIRCUITPY drive at \n"
|
||||
"https://github.com/adafruit/circuitpython/issues\n"
|
||||
"Please file an issue with your program at https://github.com/adafruit/"
|
||||
"circuitpython/issues."
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid ""
|
||||
"\n"
|
||||
"Press reset to exit safe mode.\n"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid ""
|
||||
"\n"
|
||||
"You are in safe mode because:\n"
|
||||
msgstr ""
|
||||
|
||||
#: py/obj.c
|
||||
@ -66,6 +78,11 @@ msgstr "%%c 전수(int)또는 캐릭터(char)필요합니다"
|
||||
msgid "%02X"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/os/getenv.c
|
||||
#, c-format
|
||||
msgid "%S"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/rgbmatrix/RGBMatrix.c
|
||||
#, c-format
|
||||
msgid ""
|
||||
@ -81,7 +98,7 @@ msgstr ""
|
||||
#: ports/raspberrypi/common-hal/alarm/__init__.c
|
||||
#: ports/raspberrypi/common-hal/analogio/AnalogOut.c
|
||||
#: ports/raspberrypi/common-hal/rtc/RTC.c ports/stm/common-hal/alarm/__init__.c
|
||||
#: ports/stm/common-hal/rtc/RTC.c
|
||||
#: ports/stm/common-hal/canio/Listener.c ports/stm/common-hal/rtc/RTC.c
|
||||
msgid "%q"
|
||||
msgstr ""
|
||||
|
||||
@ -101,13 +118,18 @@ msgstr ""
|
||||
msgid "%q failure: %d"
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c
|
||||
msgid "%q in %q must be of type %q, not %q"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/espulp/ULP.c
|
||||
#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
|
||||
#: shared-bindings/digitalio/DigitalInOut.c
|
||||
#: shared-bindings/microcontroller/Pin.c
|
||||
msgid "%q in use"
|
||||
msgstr "%q 사용 중입니다"
|
||||
|
||||
#: py/obj.c py/objstr.c py/objstrunicode.c
|
||||
#: py/objstr.c py/objstrunicode.c
|
||||
msgid "%q index out of range"
|
||||
msgstr "%q 인덱스 범위를 벗어났습니다"
|
||||
|
||||
@ -119,7 +141,11 @@ msgstr ""
|
||||
msgid "%q is %q"
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c
|
||||
#: ports/raspberrypi/common-hal/wifi/Radio.c
|
||||
msgid "%q is read-only for this board"
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c shared-bindings/usb_hid/Device.c
|
||||
msgid "%q length must be %d"
|
||||
msgstr ""
|
||||
|
||||
@ -135,10 +161,6 @@ msgstr ""
|
||||
msgid "%q length must be >= %d"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/busio/I2C.c
|
||||
msgid "%q length must be >= 1"
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c
|
||||
msgid "%q must be %d"
|
||||
msgstr ""
|
||||
@ -160,24 +182,20 @@ msgid "%q must be >= %d"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/analogbufio/BufferedIn.c
|
||||
msgid "%q must be a bytearray or array of type 'H' or 'B'"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/audiocore/RawSample.c
|
||||
msgid "%q must be a bytearray or array of type 'h', 'H', 'b', or 'B'"
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c
|
||||
msgid "%q must be a string"
|
||||
#: ports/raspberrypi/bindings/cyw43/__init__.c py/argcheck.c py/objexcept.c
|
||||
#: shared-bindings/canio/CAN.c shared-bindings/digitalio/Pull.c
|
||||
msgid "%q must be of type %q or %q, not %q"
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c
|
||||
msgid "%q must be an int"
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c
|
||||
msgid "%q must be of type %q"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/digitalio/Pull.c
|
||||
msgid "%q must be of type %q or None"
|
||||
#: py/argcheck.c py/obj.c py/objstrunicode.c
|
||||
msgid "%q must be of type %q, not %q"
|
||||
msgstr ""
|
||||
|
||||
#: ports/atmel-samd/common-hal/busio/UART.c
|
||||
@ -190,7 +208,6 @@ msgstr ""
|
||||
|
||||
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c
|
||||
#: ports/cxd56/common-hal/pulseio/PulseIn.c
|
||||
#: ports/espressif/common-hal/coproc/Coproc.c
|
||||
#: ports/nrf/common-hal/pulseio/PulseIn.c
|
||||
#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
|
||||
#: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c
|
||||
@ -202,8 +219,8 @@ msgstr ""
|
||||
msgid "%q pin invalid"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/usb_hid/Device.c
|
||||
msgid "%q with a report ID of 0 must be of length 1"
|
||||
#: py/objrange.c py/objslice.c shared-bindings/random/__init__.c
|
||||
msgid "%q step cannot be zero"
|
||||
msgstr ""
|
||||
|
||||
#: py/bc.c py/objnamedtuple.c
|
||||
@ -303,7 +320,7 @@ msgstr ""
|
||||
msgid "'%s' object doesn't support item deletion"
|
||||
msgstr ""
|
||||
|
||||
#: ports/raspberrypi/common-hal/wifi/Radio.c py/runtime.c
|
||||
#: py/runtime.c
|
||||
msgid "'%s' object has no attribute '%q'"
|
||||
msgstr ""
|
||||
|
||||
@ -403,6 +420,10 @@ msgstr ""
|
||||
msgid "Address must be %d bytes long"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/memorymap/AddressRange.c
|
||||
msgid "Address range not allowed"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/canio/CAN.c
|
||||
msgid "All CAN peripherals are in use"
|
||||
msgstr ""
|
||||
@ -430,7 +451,6 @@ msgid "All SPI peripherals are in use"
|
||||
msgstr "사용중인 모든 SPI주변 기기"
|
||||
|
||||
#: ports/espressif/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c
|
||||
#: ports/raspberrypi/common-hal/busio/UART.c
|
||||
msgid "All UART peripherals are in use"
|
||||
msgstr "사용중인 모든 UART주변 기기"
|
||||
|
||||
@ -483,7 +503,7 @@ msgstr ""
|
||||
msgid "Already have all-matches listener"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/coproc/__init__.c
|
||||
#: ports/espressif/common-hal/espulp/ULP.c
|
||||
#: shared-module/memorymonitor/AllocationAlarm.c
|
||||
#: shared-module/memorymonitor/AllocationSize.c
|
||||
msgid "Already running"
|
||||
@ -494,6 +514,11 @@ msgstr ""
|
||||
msgid "Already scanning for wifi networks"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/os/getenv.c
|
||||
#, c-format
|
||||
msgid "An error occurred while retrieving '%s':\n"
|
||||
msgstr ""
|
||||
|
||||
#: ports/stm/common-hal/audiopwmio/PWMAudioOut.c
|
||||
msgid "Another PWMAudioOut is already active"
|
||||
msgstr ""
|
||||
@ -507,24 +532,16 @@ msgstr ""
|
||||
msgid "Array must contain halfwords (type 'H')"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c
|
||||
#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c
|
||||
#: shared-bindings/nvm/ByteArray.c
|
||||
msgid "Array values should be single bytes."
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/microcontroller/Pin.c
|
||||
msgid "At most %d %q may be specified (not %d)"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/memorymonitor/AllocationAlarm.c
|
||||
#, c-format
|
||||
msgid "Attempt to allocate %d blocks"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Attempted heap allocation when VM not running."
|
||||
msgstr ""
|
||||
|
||||
#: ports/raspberrypi/audio_dma.c
|
||||
msgid "Audio conversion not implemented"
|
||||
msgstr ""
|
||||
@ -575,20 +592,13 @@ msgid "Bitmap size and bits per value must match"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Boot device must be first device (interface #0)."
|
||||
msgid "Boot device must be first (interface #0)."
|
||||
msgstr ""
|
||||
|
||||
#: ports/mimxrt10xx/common-hal/busio/UART.c
|
||||
msgid "Both RX and TX required for flow control"
|
||||
msgstr ""
|
||||
|
||||
#: ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.h
|
||||
#: ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.h
|
||||
#: 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 ""
|
||||
|
||||
#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c
|
||||
msgid "Both pins must support hardware interrupts"
|
||||
msgstr ""
|
||||
@ -654,11 +664,6 @@ msgstr ""
|
||||
msgid "Bus pin %d is already in use"
|
||||
msgstr ""
|
||||
|
||||
#: 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 ""
|
||||
|
||||
#: shared-bindings/_bleio/UUID.c
|
||||
msgid "Byte buffer must be 16 bytes."
|
||||
msgstr "잘못된 크기의 버퍼. 16 바이트 여야합니다."
|
||||
@ -789,10 +794,6 @@ msgstr ""
|
||||
msgid "CircuitPython core code crashed hard. Whoops!\n"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "CircuitPython was unable to allocate the heap."
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/bitbangio/I2C.c
|
||||
msgid "Clock stretch too long"
|
||||
msgstr ""
|
||||
@ -831,10 +832,6 @@ msgstr ""
|
||||
msgid "Couldn't allocate decoder"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Crash into the HardFault_Handler."
|
||||
msgstr ""
|
||||
|
||||
#: ports/stm/common-hal/analogio/AnalogOut.c
|
||||
msgid "DAC Channel Init Error"
|
||||
msgstr ""
|
||||
@ -897,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 ""
|
||||
@ -922,24 +923,16 @@ msgstr ""
|
||||
msgid "Error in regex"
|
||||
msgstr "Regex에 오류가 있습니다."
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Error in safemode.py."
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/socketpool/Socket.c shared-bindings/ssl/SSLSocket.c
|
||||
msgid "Error: Failure to bind"
|
||||
msgstr ""
|
||||
|
||||
#: py/enum.c shared-bindings/_bleio/__init__.c shared-bindings/aesio/aes.c
|
||||
#: shared-bindings/alarm/__init__.c shared-bindings/alarm/coproc/CoprocAlarm.c
|
||||
#: shared-bindings/busio/SPI.c shared-bindings/coproc/Coproc.c
|
||||
#: shared-bindings/coproc/__init__.c shared-bindings/microcontroller/Pin.c
|
||||
#: shared-bindings/neopixel_write/__init__.c
|
||||
msgid "Expected a %q"
|
||||
msgstr "%q 이 예상되었습니다."
|
||||
|
||||
#: ports/raspberrypi/bindings/cyw43/__init__.c
|
||||
msgid "Expected a %q or %q"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/alarm/__init__.c
|
||||
msgid "Expected an %q"
|
||||
msgid "Expected a kind of %q"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/_bleio/Adapter.c
|
||||
@ -1007,13 +1000,17 @@ msgid "Failed to write internal flash."
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Fatal error."
|
||||
msgid "Fault detected by hardware."
|
||||
msgstr ""
|
||||
|
||||
#: py/moduerrno.c
|
||||
msgid "File exists"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/os/getenv.c
|
||||
msgid "File not found"
|
||||
msgstr ""
|
||||
|
||||
#: ports/atmel-samd/common-hal/canio/Listener.c
|
||||
#: ports/espressif/common-hal/canio/Listener.c
|
||||
#: ports/stm/common-hal/canio/Listener.c
|
||||
@ -1028,7 +1025,6 @@ msgstr ""
|
||||
msgid "Firmware is invalid"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/coproc/Coproc.c
|
||||
#: ports/espressif/common-hal/dualbank/__init__.c
|
||||
msgid "Firmware is too big"
|
||||
msgstr ""
|
||||
@ -1070,6 +1066,8 @@ msgstr ""
|
||||
#: shared-bindings/displayio/Display.c
|
||||
#: shared-bindings/displayio/EPaperDisplay.c
|
||||
#: shared-bindings/framebufferio/FramebufferDisplay.c
|
||||
#: shared-module/displayio/Display.c
|
||||
#: shared-module/framebufferio/FramebufferDisplay.c
|
||||
msgid "Group already used"
|
||||
msgstr ""
|
||||
|
||||
@ -1090,6 +1088,15 @@ msgstr ""
|
||||
msgid "Hardware in use, try alternative pins"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Heap allocation when VM not running."
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid ""
|
||||
"Heap was corrupted because the stack was too small. Increase stack size."
|
||||
msgstr ""
|
||||
|
||||
#: extmod/vfs_posix_file.c py/objstringio.c
|
||||
msgid "I/O operation on closed file"
|
||||
msgstr ""
|
||||
@ -1107,11 +1114,6 @@ msgstr ""
|
||||
msgid "I2SOut not available"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/aesio/aes.c
|
||||
#, c-format
|
||||
msgid "IV must be %d bytes long"
|
||||
msgstr ""
|
||||
|
||||
#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
|
||||
msgid "In-buffer elements must be <= 4 bytes long"
|
||||
msgstr ""
|
||||
@ -1196,6 +1198,7 @@ msgid "Internal define error"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/paralleldisplay/ParallelBus.c
|
||||
#: shared-module/os/getenv.c
|
||||
msgid "Internal error"
|
||||
msgstr ""
|
||||
|
||||
@ -1208,6 +1211,10 @@ msgstr ""
|
||||
msgid "Internal watchdog timer expired."
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Interrupt error."
|
||||
msgstr ""
|
||||
|
||||
#: py/argcheck.c shared-bindings/digitalio/DigitalInOut.c
|
||||
msgid "Invalid %q"
|
||||
msgstr ""
|
||||
@ -1242,6 +1249,11 @@ msgstr ""
|
||||
msgid "Invalid bits per value"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/os/getenv.c
|
||||
#, c-format
|
||||
msgid "Invalid byte %.*s"
|
||||
msgstr ""
|
||||
|
||||
#: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c
|
||||
#, c-format
|
||||
msgid "Invalid data_pins[%d]"
|
||||
@ -1251,18 +1263,10 @@ msgstr ""
|
||||
msgid "Invalid format chunk size"
|
||||
msgstr "형식 청크 크기가 잘못되었습니다"
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Invalid memory access."
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/wifi/Radio.c
|
||||
msgid "Invalid multicast MAC address"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/busio/UART.c
|
||||
msgid "Invalid pins"
|
||||
msgstr "핀이 유효하지 않습니다"
|
||||
|
||||
#: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c
|
||||
msgid "Invalid size"
|
||||
msgstr ""
|
||||
@ -1276,10 +1280,18 @@ msgstr ""
|
||||
msgid "Invalid state"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/os/getenv.c
|
||||
msgid "Invalid unicode escape"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/aesio/aes.c
|
||||
msgid "Key must be 16, 24, or 32 bytes long"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/os/getenv.c
|
||||
msgid "Key not found"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/is31fl3741/FrameBuffer.c
|
||||
msgid "LED mappings must match display size"
|
||||
msgstr ""
|
||||
@ -1386,6 +1398,10 @@ msgstr ""
|
||||
msgid "NVS Error"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/socketpool/SocketPool.c
|
||||
msgid "Name or service not known"
|
||||
msgstr ""
|
||||
|
||||
#: py/qstr.c
|
||||
msgid "Name too long"
|
||||
msgstr ""
|
||||
@ -1500,11 +1516,6 @@ msgstr ""
|
||||
msgid "No long integer support"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/usb_hid/__init__.c
|
||||
#, c-format
|
||||
msgid "No more than %d HID devices allowed"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/wifi/Radio.c
|
||||
msgid "No network with that ssid"
|
||||
msgstr ""
|
||||
@ -1540,10 +1551,6 @@ msgstr ""
|
||||
msgid "No timer available"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Nordic system firmware failure assertion."
|
||||
msgstr ""
|
||||
|
||||
#: ports/nrf/common-hal/_bleio/__init__.c
|
||||
msgid "Nordic system firmware out of memory"
|
||||
msgstr ""
|
||||
@ -1563,10 +1570,6 @@ msgstr ""
|
||||
msgid "Not playing"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/_bleio/__init__.c
|
||||
msgid "Not settable"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/paralleldisplay/ParallelBus.c
|
||||
#, c-format
|
||||
msgid "Number of data_pins must be 8 or 16, not %d"
|
||||
@ -1629,11 +1632,14 @@ msgid ""
|
||||
"%d bpp given"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/alarm/coproc/CoprocAlarm.c
|
||||
#: ports/espressif/common-hal/alarm/touch/TouchAlarm.c
|
||||
msgid "Only one %q can be set in deep sleep."
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/espulp/ULPAlarm.c
|
||||
msgid "Only one %q can be set."
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/i2ctarget/I2CTarget.c
|
||||
#: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c
|
||||
msgid "Only one address is allowed"
|
||||
@ -1666,6 +1672,10 @@ msgstr ""
|
||||
msgid "Operation timed out"
|
||||
msgstr ""
|
||||
|
||||
#: ports/raspberrypi/common-hal/mdns/Server.c
|
||||
msgid "Out of MDNS service slots"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c
|
||||
msgid "Out of memory"
|
||||
msgstr ""
|
||||
@ -1789,6 +1799,10 @@ msgstr ""
|
||||
msgid "Program size invalid"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/espulp/ULP.c
|
||||
msgid "Program too long"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/digitalio/DigitalInOut.c
|
||||
msgid "Pull not used when direction is output."
|
||||
msgstr ""
|
||||
@ -1828,8 +1842,9 @@ msgstr ""
|
||||
msgid "Random number generation error"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/_bleio/__init__.c
|
||||
#: shared-bindings/memorymonitor/AllocationSize.c
|
||||
#: shared-bindings/pulseio/PulseIn.c
|
||||
#: shared-bindings/pulseio/PulseIn.c shared-module/displayio/Bitmap.c
|
||||
msgid "Read-only"
|
||||
msgstr ""
|
||||
|
||||
@ -1837,10 +1852,6 @@ msgstr ""
|
||||
msgid "Read-only filesystem"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/displayio/Bitmap.c
|
||||
msgid "Read-only object"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c
|
||||
msgid "Received response was invalid"
|
||||
msgstr ""
|
||||
@ -1933,7 +1944,7 @@ msgstr ""
|
||||
msgid "Sleep Memory not available"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c
|
||||
#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c
|
||||
#: shared-bindings/nvm/ByteArray.c
|
||||
msgid "Slice and value different lengths."
|
||||
msgstr ""
|
||||
@ -1970,6 +1981,10 @@ msgstr ""
|
||||
msgid "Stereo right must be on PWM channel B"
|
||||
msgstr ""
|
||||
|
||||
#: ports/raspberrypi/common-hal/wifi/Radio.c
|
||||
msgid "Stopping AP is not supported."
|
||||
msgstr ""
|
||||
|
||||
#: ports/mimxrt10xx/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
|
||||
msgid "Supply at least one UART pin"
|
||||
msgstr ""
|
||||
@ -1987,35 +2002,11 @@ msgid "Temperature read timed out"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "The BOOT button was pressed at start up.\n"
|
||||
msgid "The `microcontroller` module was used to boot into safe mode."
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid ""
|
||||
"The CircuitPython heap was corrupted because the stack was too small.\n"
|
||||
"Increase the stack size if you know how. If not:"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/boards/adafruit_feather_esp32_v2/mpconfigboard.h
|
||||
msgid "The SW38 button was pressed at start up.\n"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/boards/hardkernel_odroid_go/mpconfigboard.h
|
||||
msgid "The VOLUME button was pressed at start up.\n"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid ""
|
||||
"The `microcontroller` module was used to boot into safe mode. Press reset to "
|
||||
"exit safe mode."
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/boards/m5stack_atom_lite/mpconfigboard.h
|
||||
msgid "The central button was pressed at start up.\n"
|
||||
msgstr ""
|
||||
|
||||
#: ports/nrf/boards/aramcon2_badge/mpconfigboard.h
|
||||
msgid "The left button was pressed at start up.\n"
|
||||
#: py/obj.c
|
||||
msgid "The above exception was the direct cause of the following exception:"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/rgbmatrix/RGBMatrix.c
|
||||
@ -2023,10 +2014,7 @@ msgid "The length of rgb_pins must be 6, 12, 18, 24, or 30"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid ""
|
||||
"The microcontroller's power dipped. Make sure your power supply provides\n"
|
||||
"enough power for the whole circuit and press reset (after ejecting "
|
||||
"CIRCUITPY)."
|
||||
msgid "The power dipped. Make sure you are providing enough power."
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/audiomixer/MixerVoice.c
|
||||
@ -2045,6 +2033,10 @@ msgstr ""
|
||||
msgid "The sample's signedness does not match the mixer's"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Third-party firmware fatal error."
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/imagecapture/ParallelImageCapture.c
|
||||
msgid "This microcontroller does not support continuous capture."
|
||||
msgstr ""
|
||||
@ -2077,10 +2069,6 @@ msgstr ""
|
||||
msgid "Timeout is too long: Maximum timeout length is %d seconds"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "To exit, please reset the board without requesting safe mode."
|
||||
msgstr ""
|
||||
|
||||
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
|
||||
msgid "Too many channels in sample"
|
||||
msgstr ""
|
||||
@ -2125,6 +2113,10 @@ msgstr ""
|
||||
msgid "UART init"
|
||||
msgstr ""
|
||||
|
||||
#: ports/raspberrypi/common-hal/busio/UART.c
|
||||
msgid "UART peripheral in use"
|
||||
msgstr ""
|
||||
|
||||
#: ports/stm/common-hal/busio/UART.c
|
||||
msgid "UART re-init"
|
||||
msgstr ""
|
||||
@ -2173,6 +2165,10 @@ msgstr ""
|
||||
msgid "Unable to allocate buffers for signed conversion"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "Unable to allocate the heap."
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/busio/I2C.c
|
||||
msgid "Unable to create lock"
|
||||
msgstr ""
|
||||
@ -2196,11 +2192,12 @@ msgid "Unable to read color palette data"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/mdns/Server.c
|
||||
#: ports/raspberrypi/common-hal/mdns/Server.c
|
||||
msgid "Unable to start mDNS query"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/coproc/CoprocMemory.c
|
||||
msgid "Unable to write"
|
||||
#: shared-bindings/memorymap/AddressRange.c
|
||||
msgid "Unable to write to address."
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/nvm/ByteArray.c
|
||||
@ -2271,6 +2268,7 @@ msgid "Unkown error code %d"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/adafruit_pixelbuf/PixelBuf.c
|
||||
#: shared-module/_pixelmap/PixelMap.c
|
||||
#, c-format
|
||||
msgid "Unmatched number of items on RHS (expected %d, got %d)."
|
||||
msgstr ""
|
||||
@ -2355,6 +2353,18 @@ msgstr ""
|
||||
msgid "Wi-Fi: "
|
||||
msgstr ""
|
||||
|
||||
#: ports/raspberrypi/common-hal/wifi/Radio.c
|
||||
msgid "Wifi is in access point mode."
|
||||
msgstr ""
|
||||
|
||||
#: ports/raspberrypi/common-hal/wifi/Radio.c
|
||||
msgid "Wifi is in station mode."
|
||||
msgstr ""
|
||||
|
||||
#: ports/raspberrypi/common-hal/wifi/Radio.c
|
||||
msgid "Wifi is not enabled"
|
||||
msgstr ""
|
||||
|
||||
#: main.c
|
||||
msgid "Woken up by alarm.\n"
|
||||
msgstr ""
|
||||
@ -2364,13 +2374,48 @@ msgstr ""
|
||||
msgid "Writes not supported on Characteristic"
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "You are in safe mode because:\n"
|
||||
#: ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.h
|
||||
#: ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.h
|
||||
#: ports/atmel-samd/boards/circuitplayground_express_displayio/mpconfigboard.h
|
||||
#: ports/atmel-samd/boards/meowmeow/mpconfigboard.h
|
||||
msgid "You pressed both buttons at start up."
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/boards/m5stack_core_basic/mpconfigboard.h
|
||||
#: ports/espressif/boards/m5stack_core_fire/mpconfigboard.h
|
||||
#: ports/espressif/boards/m5stack_stick_c/mpconfigboard.h
|
||||
msgid "You pressed button A at start up."
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid ""
|
||||
"You pressed the reset button during boot. Press again to exit safe mode."
|
||||
msgid "You pressed the BOOT button at start up"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/boards/adafruit_feather_esp32_v2/mpconfigboard.h
|
||||
msgid "You pressed the SW38 button at start up."
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/boards/hardkernel_odroid_go/mpconfigboard.h
|
||||
msgid "You pressed the VOLUME button at start up."
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/boards/m5stack_atom_echo/mpconfigboard.h
|
||||
#: ports/espressif/boards/m5stack_atom_lite/mpconfigboard.h
|
||||
#: ports/espressif/boards/m5stack_atom_matrix/mpconfigboard.h
|
||||
#: ports/espressif/boards/m5stack_atom_u/mpconfigboard.h
|
||||
msgid "You pressed the central button at start up."
|
||||
msgstr ""
|
||||
|
||||
#: ports/nrf/boards/aramcon2_badge/mpconfigboard.h
|
||||
msgid "You pressed the left button at start up."
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/safe_mode.c
|
||||
msgid "You pressed the reset button during boot."
|
||||
msgstr ""
|
||||
|
||||
#: supervisor/shared/micropython.c
|
||||
msgid "[truncated due to length]"
|
||||
msgstr ""
|
||||
|
||||
#: py/objtype.c
|
||||
@ -2442,8 +2487,12 @@ msgstr ""
|
||||
msgid "array has too many dimensions"
|
||||
msgstr ""
|
||||
|
||||
#: extmod/ulab/code/ndarray.c
|
||||
msgid "array is too big"
|
||||
msgstr ""
|
||||
|
||||
#: py/objarray.c shared-bindings/alarm/SleepMemory.c
|
||||
#: shared-bindings/coproc/CoprocMemory.c shared-bindings/nvm/ByteArray.c
|
||||
#: shared-bindings/memorymap/AddressRange.c shared-bindings/nvm/ByteArray.c
|
||||
msgid "array/bytes required on right side"
|
||||
msgstr ""
|
||||
|
||||
@ -2536,10 +2585,6 @@ msgstr ""
|
||||
msgid "buffer too small for requested bytes"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/adafruit_pixelbuf/PixelBuf.c
|
||||
msgid "byteorder is not a string"
|
||||
msgstr ""
|
||||
|
||||
#: py/objarray.c
|
||||
msgid "bytes length not a multiple of item size"
|
||||
msgstr ""
|
||||
@ -2581,14 +2626,10 @@ msgstr ""
|
||||
msgid "can't cancel self"
|
||||
msgstr ""
|
||||
|
||||
#: py/obj.c py/objint.c shared-module/adafruit_pixelbuf/PixelBuf.c
|
||||
#: py/obj.c py/objint.c py/runtime.c shared-module/adafruit_pixelbuf/PixelBuf.c
|
||||
msgid "can't convert %q to %q"
|
||||
msgstr ""
|
||||
|
||||
#: py/runtime.c
|
||||
msgid "can't convert %q to int"
|
||||
msgstr ""
|
||||
|
||||
#: py/obj.c
|
||||
#, c-format
|
||||
msgid "can't convert %s to complex"
|
||||
@ -2670,6 +2711,10 @@ msgstr ""
|
||||
msgid "can't set attribute"
|
||||
msgstr ""
|
||||
|
||||
#: py/runtime.c
|
||||
msgid "can't set attribute '%q'"
|
||||
msgstr ""
|
||||
|
||||
#: py/emitnative.c
|
||||
msgid "can't store '%q'"
|
||||
msgstr ""
|
||||
@ -2772,10 +2817,6 @@ msgstr ""
|
||||
msgid "comparison of int and uint"
|
||||
msgstr ""
|
||||
|
||||
#: py/objcomplex.c
|
||||
msgid "complex division by zero"
|
||||
msgstr ""
|
||||
|
||||
#: py/objfloat.c py/parsenum.c
|
||||
msgid "complex values not supported"
|
||||
msgstr ""
|
||||
@ -2878,12 +2919,11 @@ msgstr ""
|
||||
msgid "div/mod not implemented for uint"
|
||||
msgstr ""
|
||||
|
||||
#: py/objfloat.c py/objint_mpz.c
|
||||
#: extmod/ulab/code/numpy/create.c
|
||||
msgid "divide by zero"
|
||||
msgstr ""
|
||||
|
||||
#: py/modmath.c py/objint_longlong.c py/runtime.c
|
||||
#: shared-bindings/math/__init__.c
|
||||
#: py/runtime.c
|
||||
msgid "division by zero"
|
||||
msgstr ""
|
||||
|
||||
@ -2924,9 +2964,9 @@ msgstr ""
|
||||
msgid "error = 0x%08lX"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/esp32_camera/Camera.c
|
||||
#: ports/espressif/common-hal/espcamera/Camera.c
|
||||
msgid ""
|
||||
"esp32_camera.Camera requires reserved PSRAM to be configured. See the "
|
||||
"espcamera.Camera requires reserved PSRAM to be configured. See the "
|
||||
"documentation for instructions."
|
||||
msgstr ""
|
||||
|
||||
@ -2934,14 +2974,6 @@ msgstr ""
|
||||
msgid "exceptions must derive from BaseException"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/canio/CAN.c
|
||||
msgid "expected '%q' but got '%q'"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/canio/CAN.c
|
||||
msgid "expected '%q' or '%q' but got '%q'"
|
||||
msgstr ""
|
||||
|
||||
#: py/objstr.c
|
||||
msgid "expected ':' after format specifier"
|
||||
msgstr "':'이 예상되었습니다"
|
||||
@ -3040,10 +3072,6 @@ msgstr ""
|
||||
msgid "format requires a dict"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/microcontroller/Processor.c
|
||||
msgid "frequency is read-only for this board"
|
||||
msgstr ""
|
||||
|
||||
#: py/objdeque.c
|
||||
msgid "full"
|
||||
msgstr "완전한(full)"
|
||||
@ -3156,8 +3184,12 @@ msgstr ""
|
||||
msgid "index is out of bounds"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/_pixelmap/PixelMap.c
|
||||
msgid "index must be tuple or int"
|
||||
msgstr ""
|
||||
|
||||
#: extmod/ulab/code/numpy/numerical.c extmod/ulab/code/ulab_tools.c
|
||||
#: ports/espressif/common-hal/pulseio/PulseIn.c py/obj.c
|
||||
#: ports/espressif/common-hal/pulseio/PulseIn.c
|
||||
#: shared-bindings/bitmaptools/__init__.c
|
||||
msgid "index out of range"
|
||||
msgstr ""
|
||||
@ -3255,10 +3287,6 @@ msgstr ""
|
||||
msgid "inputs are not iterable"
|
||||
msgstr ""
|
||||
|
||||
#: py/parsenum.c
|
||||
msgid "int() arg 2 must be >= 2 and <= 36"
|
||||
msgstr ""
|
||||
|
||||
#: extmod/ulab/code/numpy/approx.c
|
||||
msgid "interp is defined for 1D iterables of equal length"
|
||||
msgstr ""
|
||||
@ -3315,7 +3343,7 @@ msgstr "키가 유효하지 않습니다"
|
||||
msgid "invalid micropython decorator"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/esp32_camera/Camera.c
|
||||
#: ports/espressif/common-hal/espcamera/Camera.c
|
||||
msgid "invalid setting"
|
||||
msgstr ""
|
||||
|
||||
@ -3340,10 +3368,6 @@ msgstr "구문(syntax)가 정수가 유효하지 않습니다"
|
||||
msgid "invalid syntax for number"
|
||||
msgstr "숫자에 대한 구문(syntax)가 유효하지 않습니다"
|
||||
|
||||
#: py/objexcept.c
|
||||
msgid "invalid traceback"
|
||||
msgstr ""
|
||||
|
||||
#: py/objtype.c
|
||||
msgid "issubclass() arg 1 must be a class"
|
||||
msgstr ""
|
||||
@ -3400,19 +3424,17 @@ msgstr ""
|
||||
msgid "local variable referenced before assignment"
|
||||
msgstr ""
|
||||
|
||||
#: py/objint.c
|
||||
msgid "long int not supported in this build"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/canio/CAN.c
|
||||
msgid "loopback + silent mode not supported by peripheral"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/mdns/Server.c
|
||||
#: ports/raspberrypi/common-hal/mdns/Server.c
|
||||
msgid "mDNS already initialized"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/mdns/Server.c
|
||||
#: ports/raspberrypi/common-hal/mdns/Server.c
|
||||
msgid "mDNS only works with built-in WiFi"
|
||||
msgstr ""
|
||||
|
||||
@ -3541,6 +3563,10 @@ msgstr ""
|
||||
msgid "negative shift count"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/_pixelmap/PixelMap.c
|
||||
msgid "nested index must be int"
|
||||
msgstr ""
|
||||
|
||||
#: shared-module/sdcardio/SDCard.c
|
||||
msgid "no SD card"
|
||||
msgstr ""
|
||||
@ -3574,7 +3600,7 @@ msgstr ""
|
||||
msgid "no response from SD card"
|
||||
msgstr ""
|
||||
|
||||
#: ports/espressif/common-hal/esp32_camera/Camera.c py/objobject.c py/runtime.c
|
||||
#: ports/espressif/common-hal/espcamera/Camera.c py/objobject.c py/runtime.c
|
||||
msgid "no such attribute"
|
||||
msgstr ""
|
||||
|
||||
@ -3710,6 +3736,10 @@ msgstr ""
|
||||
msgid "only mono is supported"
|
||||
msgstr ""
|
||||
|
||||
#: extmod/ulab/code/numpy/create.c
|
||||
msgid "only ndarrays can be concatenated"
|
||||
msgstr ""
|
||||
|
||||
#: ports/stm/common-hal/audiobusio/PDMIn.c
|
||||
msgid "only oversample=64 is supported"
|
||||
msgstr ""
|
||||
@ -3720,7 +3750,7 @@ msgid "only sample_rate=16000 is supported"
|
||||
msgstr ""
|
||||
|
||||
#: py/objarray.c py/objstr.c py/objstrunicode.c py/objtuple.c
|
||||
#: shared-bindings/alarm/SleepMemory.c shared-bindings/coproc/CoprocMemory.c
|
||||
#: shared-bindings/alarm/SleepMemory.c shared-bindings/memorymap/AddressRange.c
|
||||
#: shared-bindings/nvm/ByteArray.c
|
||||
msgid "only slices with step=1 (aka None) are supported"
|
||||
msgstr ""
|
||||
@ -3936,10 +3966,6 @@ msgstr ""
|
||||
msgid "slice step can't be zero"
|
||||
msgstr ""
|
||||
|
||||
#: py/objslice.c
|
||||
msgid "slice step cannot be zero"
|
||||
msgstr ""
|
||||
|
||||
#: py/nativeglue.c
|
||||
msgid "slice unsupported"
|
||||
msgstr ""
|
||||
@ -3988,10 +4014,6 @@ msgstr ""
|
||||
msgid "start/end indices"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/random/__init__.c
|
||||
msgid "step must be non-zero"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/random/__init__.c
|
||||
msgid "stop not reachable from start"
|
||||
msgstr ""
|
||||
@ -4000,10 +4022,6 @@ msgstr ""
|
||||
msgid "stream operation not supported"
|
||||
msgstr ""
|
||||
|
||||
#: py/objstrunicode.c
|
||||
msgid "string indices must be integers, not %q"
|
||||
msgstr ""
|
||||
|
||||
#: py/stream.c
|
||||
msgid "string not supported; use bytes or bytearray"
|
||||
msgstr ""
|
||||
@ -4036,10 +4054,6 @@ msgstr ""
|
||||
msgid "syntax error in uctypes descriptor"
|
||||
msgstr ""
|
||||
|
||||
#: shared-bindings/time/__init__.c
|
||||
msgid "time.struct_time() takes a 9-sequence"
|
||||
msgstr ""
|
||||
|
||||
#: ports/atmel-samd/common-hal/watchdog/WatchDogTimer.c
|
||||
#: ports/espressif/common-hal/watchdog/WatchDogTimer.c
|
||||
#: ports/nrf/common-hal/watchdog/WatchDogTimer.c
|
||||
@ -4321,10 +4335,6 @@ msgstr ""
|
||||
msgid "y value out of bounds"
|
||||
msgstr ""
|
||||
|
||||
#: py/objrange.c
|
||||
msgid "zero step"
|
||||
msgstr ""
|
||||
|
||||
#: extmod/ulab/code/scipy/signal/signal.c
|
||||
msgid "zi must be an ndarray"
|
||||
msgstr ""
|
||||
@ -4337,6 +4347,12 @@ msgstr ""
|
||||
msgid "zi must be of shape (n_section, 2)"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Expected a %q"
|
||||
#~ msgstr "%q 이 예상되었습니다."
|
||||
|
||||
#~ msgid "Invalid pins"
|
||||
#~ msgstr "핀이 유효하지 않습니다"
|
||||
|
||||
#~ msgid "%q indices must be integers, not %s"
|
||||
#~ msgstr "%q 인덱스는 %s 가 아닌 정수 여야합니다"
|
||||
|
||||
|
509
locale/nl.po
509
locale/nl.po
File diff suppressed because it is too large
Load Diff
486
locale/pl.po
486
locale/pl.po
File diff suppressed because it is too large
Load Diff
683
locale/pt_BR.po
683
locale/pt_BR.po
File diff suppressed because it is too large
Load Diff
645
locale/ru.po
645
locale/ru.po
File diff suppressed because it is too large
Load Diff
679
locale/sv.po
679
locale/sv.po
File diff suppressed because it is too large
Load Diff
723
locale/tr.po
723
locale/tr.po
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
114
main.c
114
main.c
@ -218,12 +218,10 @@ void supervisor_execution_status(void) {
|
||||
}
|
||||
#endif
|
||||
|
||||
#define STRING_LIST(...) {__VA_ARGS__, ""}
|
||||
|
||||
// Look for the first file that exists in the list of filenames, using mp_import_stat().
|
||||
// Return its index. If no file found, return -1.
|
||||
STATIC const char *first_existing_file_in_list(const char *const *filenames) {
|
||||
for (int i = 0; filenames[i] != (char *)""; i++) {
|
||||
STATIC const char *first_existing_file_in_list(const char *const *filenames, size_t n_filenames) {
|
||||
for (size_t i = 0; i < n_filenames; i++) {
|
||||
mp_import_stat_t stat = mp_import_stat(filenames[i]);
|
||||
if (stat == MP_IMPORT_STAT_FILE) {
|
||||
return filenames[i];
|
||||
@ -232,11 +230,11 @@ STATIC const char *first_existing_file_in_list(const char *const *filenames) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
STATIC bool maybe_run_list(const char *const *filenames) {
|
||||
STATIC bool maybe_run_list(const char *const *filenames, size_t n_filenames) {
|
||||
_exec_result.return_code = 0;
|
||||
_exec_result.exception = MP_OBJ_NULL;
|
||||
_exec_result.exception_line = 0;
|
||||
_current_executing_filename = first_existing_file_in_list(filenames);
|
||||
_current_executing_filename = first_existing_file_in_list(filenames, n_filenames);
|
||||
if (_current_executing_filename == NULL) {
|
||||
return false;
|
||||
}
|
||||
@ -360,7 +358,7 @@ STATIC void print_code_py_status_message(safe_mode_t safe_mode) {
|
||||
} else {
|
||||
serial_write_compressed(translate("Auto-reload is off.\n"));
|
||||
}
|
||||
if (safe_mode != NO_SAFE_MODE) {
|
||||
if (safe_mode != SAFE_MODE_NONE) {
|
||||
serial_write_compressed(translate("Running in safe mode! Not running saved code.\n"));
|
||||
}
|
||||
}
|
||||
@ -386,17 +384,19 @@ STATIC bool run_code_py(safe_mode_t safe_mode, bool *simulate_reset) {
|
||||
|
||||
// Do the filesystem flush check before reload in case another write comes
|
||||
// in while we're doing the flush.
|
||||
if (safe_mode == NO_SAFE_MODE) {
|
||||
if (safe_mode == SAFE_MODE_NONE) {
|
||||
stack_resize();
|
||||
filesystem_flush();
|
||||
}
|
||||
if (safe_mode == NO_SAFE_MODE && !autoreload_pending()) {
|
||||
static const char *const supported_filenames[] = STRING_LIST(
|
||||
"code.txt", "code.py", "main.py", "main.txt");
|
||||
if (safe_mode == SAFE_MODE_NONE && !autoreload_pending()) {
|
||||
static const char *const supported_filenames[] = {
|
||||
"code.txt", "code.py", "main.py", "main.txt"
|
||||
};
|
||||
#if CIRCUITPY_FULL_BUILD
|
||||
static const char *const double_extension_filenames[] = STRING_LIST(
|
||||
static const char *const double_extension_filenames[] = {
|
||||
"code.txt.py", "code.py.txt", "code.txt.txt","code.py.py",
|
||||
"main.txt.py", "main.py.txt", "main.txt.txt","main.py.py");
|
||||
"main.txt.py", "main.py.txt", "main.txt.txt","main.py.py"
|
||||
};
|
||||
#endif
|
||||
|
||||
supervisor_allocation *heap = allocate_remaining_memory();
|
||||
@ -410,14 +410,15 @@ STATIC bool run_code_py(safe_mode_t safe_mode, bool *simulate_reset) {
|
||||
|
||||
// Check if a different run file has been allocated
|
||||
if (next_code_allocation) {
|
||||
((next_code_info_t *)next_code_allocation->ptr)->options &= ~SUPERVISOR_NEXT_CODE_OPT_NEWLY_SET;
|
||||
next_code_options = ((next_code_info_t *)next_code_allocation->ptr)->options;
|
||||
if (((next_code_info_t *)next_code_allocation->ptr)->filename[0] != '\0') {
|
||||
const char *next_list[] = {((next_code_info_t *)next_code_allocation->ptr)->filename, ""};
|
||||
next_code_info_t *info = ((next_code_info_t *)next_code_allocation->ptr);
|
||||
info->options &= ~SUPERVISOR_NEXT_CODE_OPT_NEWLY_SET;
|
||||
next_code_options = info->options;
|
||||
if (info->filename[0] != '\0') {
|
||||
// This is where the user's python code is actually executed:
|
||||
found_main = maybe_run_list(next_list);
|
||||
const char *const filenames[] = { info->filename };
|
||||
found_main = maybe_run_list(filenames, MP_ARRAY_SIZE(filenames));
|
||||
if (!found_main) {
|
||||
serial_write(((next_code_info_t *)next_code_allocation->ptr)->filename);
|
||||
serial_write(info->filename);
|
||||
serial_write_compressed(translate(" not found.\n"));
|
||||
}
|
||||
}
|
||||
@ -425,11 +426,11 @@ STATIC bool run_code_py(safe_mode_t safe_mode, bool *simulate_reset) {
|
||||
// Otherwise, default to the standard list of filenames
|
||||
if (!found_main) {
|
||||
// This is where the user's python code is actually executed:
|
||||
found_main = maybe_run_list(supported_filenames);
|
||||
found_main = maybe_run_list(supported_filenames, MP_ARRAY_SIZE(supported_filenames));
|
||||
// If that didn't work, double check the extensions
|
||||
#if CIRCUITPY_FULL_BUILD
|
||||
if (!found_main) {
|
||||
found_main = maybe_run_list(double_extension_filenames);
|
||||
found_main = maybe_run_list(double_extension_filenames, MP_ARRAY_SIZE(double_extension_filenames));
|
||||
if (found_main) {
|
||||
serial_write_compressed(translate("WARNING: Your code filename has two extensions\n"));
|
||||
}
|
||||
@ -509,7 +510,7 @@ STATIC bool run_code_py(safe_mode_t safe_mode, bool *simulate_reset) {
|
||||
} else
|
||||
#endif
|
||||
if (_exec_result.return_code != PYEXEC_EXCEPTION) {
|
||||
if (safe_mode == NO_SAFE_MODE) {
|
||||
if (safe_mode == SAFE_MODE_NONE) {
|
||||
color = ALL_DONE;
|
||||
blink_count = ALL_DONE_BLINKS;
|
||||
} else {
|
||||
@ -729,8 +730,34 @@ STATIC bool run_code_py(safe_mode_t safe_mode, bool *simulate_reset) {
|
||||
|
||||
vstr_t *boot_output;
|
||||
|
||||
#if CIRCUITPY_SAFEMODE_PY
|
||||
STATIC void __attribute__ ((noinline)) run_safemode_py(safe_mode_t safe_mode) {
|
||||
// Don't run if we aren't in safe mode or we won't be able to find safemode.py.
|
||||
// Also don't run if it's a user-initiated safemode (pressing button(s) during boot),
|
||||
// since that's deliberate.
|
||||
if (safe_mode == SAFE_MODE_NONE || safe_mode == SAFE_MODE_USER || !filesystem_present()) {
|
||||
return;
|
||||
}
|
||||
|
||||
supervisor_allocation *heap = allocate_remaining_memory();
|
||||
start_mp(heap);
|
||||
|
||||
static const char *const safemode_py_filenames[] = {"safemode.py", "safemode.txt"};
|
||||
maybe_run_list(safemode_py_filenames, MP_ARRAY_SIZE(safemode_py_filenames));
|
||||
|
||||
// If safemode.py itself caused an error, change the safe_mode state to indicate that.
|
||||
if (_exec_result.exception != MP_OBJ_NULL &&
|
||||
_exec_result.exception != MP_OBJ_SENTINEL) {
|
||||
set_safe_mode(SAFE_MODE_SAFEMODE_PY_ERROR);
|
||||
}
|
||||
|
||||
cleanup_after_vm(heap, _exec_result.exception);
|
||||
_exec_result.exception = NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
STATIC void __attribute__ ((noinline)) run_boot_py(safe_mode_t safe_mode) {
|
||||
if (safe_mode == NO_HEAP) {
|
||||
if (safe_mode == SAFE_MODE_NO_HEAP) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -738,10 +765,10 @@ STATIC void __attribute__ ((noinline)) run_boot_py(safe_mode_t safe_mode) {
|
||||
|
||||
// There is USB setup to do even if boot.py is not actually run.
|
||||
const bool ok_to_run = filesystem_present()
|
||||
&& safe_mode == NO_SAFE_MODE
|
||||
&& safe_mode == SAFE_MODE_NONE
|
||||
&& MP_STATE_VM(vfs_mount_table) != NULL;
|
||||
|
||||
static const char *const boot_py_filenames[] = STRING_LIST("boot.py", "boot.txt");
|
||||
static const char *const boot_py_filenames[] = {"boot.py", "boot.txt"};
|
||||
|
||||
// Do USB setup even if boot.py is not run.
|
||||
|
||||
@ -778,7 +805,7 @@ STATIC void __attribute__ ((noinline)) run_boot_py(safe_mode_t safe_mode) {
|
||||
port_boot_info();
|
||||
#endif
|
||||
|
||||
bool found_boot = maybe_run_list(boot_py_filenames);
|
||||
bool found_boot = maybe_run_list(boot_py_filenames, MP_ARRAY_SIZE(boot_py_filenames));
|
||||
(void)found_boot;
|
||||
|
||||
|
||||
@ -912,7 +939,7 @@ STATIC int run_repl(void) {
|
||||
|
||||
int __attribute__((used)) main(void) {
|
||||
// initialise the cpu and peripherals
|
||||
safe_mode_t safe_mode = port_init();
|
||||
set_safe_mode(port_init());
|
||||
|
||||
// Turn on RX and TX LEDs if we have them.
|
||||
init_rxtx_leds();
|
||||
@ -924,9 +951,12 @@ int __attribute__((used)) main(void) {
|
||||
common_hal_nvm_bytearray_set_bytes(&common_hal_mcu_nvm_obj,0,&value_out,1);
|
||||
#endif
|
||||
|
||||
// Start the debug serial
|
||||
serial_early_init();
|
||||
|
||||
// Wait briefly to give a reset window where we'll enter safe mode after the reset.
|
||||
if (safe_mode == NO_SAFE_MODE) {
|
||||
safe_mode = wait_for_safe_mode_reset();
|
||||
if (get_safe_mode() == SAFE_MODE_NONE) {
|
||||
set_safe_mode(wait_for_safe_mode_reset());
|
||||
}
|
||||
|
||||
stack_init();
|
||||
@ -940,9 +970,6 @@ int __attribute__((used)) main(void) {
|
||||
supervisor_bluetooth_init();
|
||||
#endif
|
||||
|
||||
// Start the debug serial
|
||||
serial_early_init();
|
||||
|
||||
#if !INTERNAL_FLASH_FILESYSTEM
|
||||
// Set up anything that might need to get done before we try to use SPI flash
|
||||
// This is needed for some boards where flash relies on GPIO setup to work
|
||||
@ -955,8 +982,8 @@ int __attribute__((used)) main(void) {
|
||||
|
||||
// Check whether CIRCUITPY is available. No need to reset to get safe mode
|
||||
// since we haven't run user code yet.
|
||||
if (!filesystem_init(safe_mode == NO_SAFE_MODE, false)) {
|
||||
safe_mode = NO_CIRCUITPY;
|
||||
if (!filesystem_init(get_safe_mode() == SAFE_MODE_NONE, false)) {
|
||||
set_safe_mode(SAFE_MODE_NO_CIRCUITPY);
|
||||
}
|
||||
|
||||
#if CIRCUITPY_ALARM
|
||||
@ -981,16 +1008,23 @@ int __attribute__((used)) main(void) {
|
||||
supervisor_set_run_reason(RUN_REASON_STARTUP);
|
||||
|
||||
// If not in safe mode turn on autoreload by default but before boot.py in case it wants to change it.
|
||||
if (safe_mode == NO_SAFE_MODE) {
|
||||
if (get_safe_mode() == SAFE_MODE_NONE) {
|
||||
autoreload_enable();
|
||||
}
|
||||
|
||||
// By default our internal flash is readonly to local python code and
|
||||
// writable over USB. Set it here so that boot.py can change it.
|
||||
// writable over USB. Set it here so that safemode.py or boot.py can change it.
|
||||
filesystem_set_internal_concurrent_write_protection(true);
|
||||
filesystem_set_internal_writable_by_usb(CIRCUITPY_USB == 1);
|
||||
|
||||
run_boot_py(safe_mode);
|
||||
#if CIRCUITPY_SAFEMODE_PY
|
||||
// Run safemode.py if we ARE in safe mode.
|
||||
// If safemode.py does not do a hard reset, and exits normally, we will continue on
|
||||
// and report the safe mode as usual.
|
||||
run_safemode_py(get_safe_mode());
|
||||
#endif
|
||||
|
||||
run_boot_py(get_safe_mode());
|
||||
|
||||
supervisor_workflow_start();
|
||||
|
||||
@ -1015,7 +1049,7 @@ int __attribute__((used)) main(void) {
|
||||
// If code.py did a fake deep sleep, pretend that we
|
||||
// are running code.py for the first time after a hard
|
||||
// reset. This will preserve any alarm information.
|
||||
skip_repl = run_code_py(safe_mode, &simulate_reset);
|
||||
skip_repl = run_code_py(get_safe_mode(), &simulate_reset);
|
||||
} else {
|
||||
skip_repl = false;
|
||||
}
|
||||
@ -1075,14 +1109,14 @@ void gc_collect(void) {
|
||||
}
|
||||
|
||||
void NORETURN nlr_jump_fail(void *val) {
|
||||
reset_into_safe_mode(MICROPY_NLR_JUMP_FAIL);
|
||||
reset_into_safe_mode(SAFE_MODE_NLR_JUMP_FAIL);
|
||||
while (true) {
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef NDEBUG
|
||||
static void NORETURN __fatal_error(const char *msg) {
|
||||
reset_into_safe_mode(MICROPY_FATAL_ERROR);
|
||||
reset_into_safe_mode(SAFE_MODE_HARD_FAULT);
|
||||
while (true) {
|
||||
}
|
||||
}
|
||||
|
@ -79,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
|
||||
@ -293,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 \
|
||||
|
@ -23,7 +23,7 @@
|
||||
#define CALIBRATE_CRYSTALLESS 1
|
||||
|
||||
// Explanation of how a user got into safe mode.
|
||||
#define BOARD_USER_SAFE_MODE_ACTION translate("Both buttons were pressed at start up.\n")
|
||||
#define BOARD_USER_SAFE_MODE_ACTION translate("You pressed both buttons at start up.")
|
||||
|
||||
// Increase stack size slightly due to CPX library import nesting
|
||||
#define CIRCUITPY_DEFAULT_STACK_SIZE (4248) // divisible by 8
|
||||
|
@ -23,7 +23,7 @@
|
||||
#define CALIBRATE_CRYSTALLESS 1
|
||||
|
||||
// Explanation of how a user got into safe mode.
|
||||
#define BOARD_USER_SAFE_MODE_ACTION translate("Both buttons were pressed at start up.\n")
|
||||
#define BOARD_USER_SAFE_MODE_ACTION translate("You pressed both buttons at start up.")
|
||||
|
||||
// Increase stack size slightly due to CPX library import nesting
|
||||
#define CIRCUITPY_DEFAULT_STACK_SIZE (4248) // divisible by 8
|
||||
|
@ -23,7 +23,7 @@
|
||||
#define CALIBRATE_CRYSTALLESS 1
|
||||
|
||||
// Explanation of how a user got into safe mode.
|
||||
#define BOARD_USER_SAFE_MODE_ACTION translate("Both buttons were pressed at start up.\n")
|
||||
#define BOARD_USER_SAFE_MODE_ACTION translate("You pressed both buttons at start up.")
|
||||
|
||||
// Increase stack size slightly due to CPX library import nesting.
|
||||
#define CIRCUITPY_DEFAULT_STACK_SIZE (4248) // divisible by 8
|
||||
|
@ -6,7 +6,7 @@
|
||||
#define CALIBRATE_CRYSTALLESS 1
|
||||
|
||||
// Explanation of how a user got into safe mode.
|
||||
#define BOARD_USER_SAFE_MODE_ACTION translate("Both buttons were pressed at start up.\n")
|
||||
#define BOARD_USER_SAFE_MODE_ACTION translate("You pressed both buttons at start up.")
|
||||
|
||||
#define DEFAULT_I2C_BUS_SCL (&pin_PA01)
|
||||
#define DEFAULT_I2C_BUS_SDA (&pin_PA00)
|
||||
|
@ -11,6 +11,7 @@ LONGINT_IMPL = NONE
|
||||
|
||||
CIRCUITPY_FULL_BUILD = 0
|
||||
|
||||
CIRCUITPY_ANALOGIO = 0
|
||||
CIRCUITPY_ALARM = 0
|
||||
CIRCUITPY_AUDIOBUSIO = 0
|
||||
CIRCUITPY_AUDIOMP3 = 0
|
||||
@ -31,14 +32,13 @@ CIRCUITPY_ROTARYIO = 0
|
||||
CIRCUITPY_RTC = 0
|
||||
CIRCUITPY_SAMD = 0
|
||||
CIRCUITPY_TOUCHIO = 0
|
||||
CIRCUITPY_USB_CDC = 0
|
||||
CIRCUITPY_USB_HID = 0
|
||||
CIRCUITPY_USB_MIDI = 0
|
||||
CIRCUITPY_VECTORIO = 0
|
||||
CIRCUITPY_BUSDEVICE = 0
|
||||
CIRCUITPY_BITMAPTOOLS = 0
|
||||
CIRCUITPY_WATCHDOG = 0
|
||||
|
||||
CIRCUITPY_ANALOGIO = 1
|
||||
CIRCUITPY_AUDIOIO = 1
|
||||
CIRCUITPY_AUDIOMIXER = 1
|
||||
CIRCUITPY_DISPLAYIO = 1
|
||||
@ -53,3 +53,13 @@ CIRCUITPY_DISPLAY_FONT = $(TOP)/ports/atmel-samd/boards/ugame10/brutalist-6.bdf
|
||||
|
||||
# Override optimization to keep binary small
|
||||
OPTIMIZATION_FLAGS = -Os
|
||||
|
||||
# We don't have room for the fonts for terminalio for certain languages,
|
||||
# so turn off terminalio, and if it's off and displayio is on,
|
||||
# force a clean build.
|
||||
# Note that we cannot test $(CIRCUITPY_DISPLAYIO) directly with an
|
||||
# ifeq, because it's not set yet.
|
||||
ifneq (,$(filter $(TRANSLATION),ja ko ru))
|
||||
CIRCUITPY_TERMINALIO = 0
|
||||
RELEASE_NEEDS_CLEAN_BUILD = $(CIRCUITPY_DISPLAYIO)
|
||||
endif
|
||||
|
@ -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,
|
||||
|
@ -24,6 +24,7 @@
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#if CIRCUITPY_BUSIO_UART
|
||||
#include "shared-bindings/microcontroller/__init__.h"
|
||||
#include "shared-bindings/microcontroller/Pin.h"
|
||||
#include "shared-bindings/busio/UART.h"
|
||||
@ -485,3 +486,4 @@ bool common_hal_busio_uart_ready_to_tx(busio_uart_obj_t *self) {
|
||||
usart_async_get_status(usart_desc_p, &async_status);
|
||||
return !(async_status.flags & USART_ASYNC_STATUS_BUSY);
|
||||
}
|
||||
#endif
|
||||
|
@ -51,9 +51,8 @@ void common_hal_mcu_disable_interrupts(void) {
|
||||
|
||||
void common_hal_mcu_enable_interrupts(void) {
|
||||
if (nesting_count == 0) {
|
||||
// This is very very bad because it means there was mismatched disable/enables so we
|
||||
// "HardFault".
|
||||
HardFault_Handler();
|
||||
// This is very very bad because it means there was mismatched disable/enables.
|
||||
reset_into_safe_mode(SAFE_MODE_INTERRUPT_ERROR);
|
||||
}
|
||||
nesting_count--;
|
||||
if (nesting_count > 0) {
|
||||
@ -76,7 +75,7 @@ void common_hal_mcu_on_next_reset(mcu_runmode_t runmode) {
|
||||
_bootloader_dbl_tap = DBL_TAP_MAGIC_QUICK_BOOT;
|
||||
}
|
||||
if (runmode == RUNMODE_SAFE_MODE) {
|
||||
safe_mode_on_next_reset(PROGRAMMATIC_SAFE_MODE);
|
||||
safe_mode_on_next_reset(SAFE_MODE_PROGRAMMATIC);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
||||
}
|
@ -24,13 +24,13 @@ ifeq ($(CHIP_FAMILY),samd21)
|
||||
CIRCUITPY_AESIO ?= 0
|
||||
CIRCUITPY_ATEXIT ?= 0
|
||||
CIRCUITPY_AUDIOMIXER ?= 0
|
||||
CIRCUITPY_AUDIOMP3 ?= 0
|
||||
CIRCUITPY_BINASCII ?= 0
|
||||
CIRCUITPY_BITBANGIO ?= 0
|
||||
CIRCUITPY_BITMAPTOOLS ?= 0
|
||||
CIRCUITPY_BUSDEVICE ?= 0
|
||||
CIRCUITPY_AUDIOMP3 ?= 0
|
||||
CIRCUITPY_BLEIO_HCI = 0
|
||||
CIRCUITPY_BUILTINS_POW3 ?= 0
|
||||
CIRCUITPY_BUSDEVICE ?= 0
|
||||
CIRCUITPY_COMPUTED_GOTO_SAVE_SPACE ?= 1
|
||||
CIRCUITPY_COUNTIO ?= 0
|
||||
# Not enough RAM for framebuffers
|
||||
@ -42,6 +42,8 @@ CIRCUITPY_I2CTARGET ?= 0
|
||||
CIRCUITPY_JSON ?= 0
|
||||
CIRCUITPY_KEYPAD ?= 0
|
||||
CIRCUITPY_MSGPACK ?= 0
|
||||
CIRCUITPY_OS_GETENV ?= 0
|
||||
CIRCUITPY_PIXELMAP ?= 0
|
||||
CIRCUITPY_RE ?= 0
|
||||
CIRCUITPY_SDCARDIO ?= 0
|
||||
CIRCUITPY_SYNTHIO ?= 0
|
||||
@ -55,6 +57,7 @@ CIRCUITPY_ZLIB = 0
|
||||
|
||||
ifeq ($(INTERNAL_FLASH_FILESYSTEM),1)
|
||||
CIRCUITPY_ONEWIREIO ?= 0
|
||||
CIRCUITPY_SAFEMODE_PY ?= 0
|
||||
CIRCUITPY_USB_IDENTIFICATION ?= 0
|
||||
endif
|
||||
|
||||
@ -75,10 +78,8 @@ SUPEROPT_VM = 0
|
||||
|
||||
CIRCUITPY_LTO_PARTITION = one
|
||||
|
||||
ifeq ($(CIRCUITPY_FULL_BUILD),0)
|
||||
# On the smallest boards, this saves about 180 bytes. On other boards, it may -increase- space used.
|
||||
# On smaller builds this saves about 180 bytes. On other boards, it may -increase- space used, so use with care.
|
||||
CFLAGS_BOARD = -fweb -frename-registers
|
||||
endif
|
||||
|
||||
endif # samd21
|
||||
######################################################################
|
||||
|
@ -1 +1 @@
|
||||
Subproject commit 57133eefeb077f73b5ac17ee044d9feaf566da8e
|
||||
Subproject commit baca4c084334aa8625f525a4032d66a397199ea6
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user