Merge branch 'adafruit:main' into main

This commit is contained in:
flom_84 2023-02-19 10:29:04 +01:00 committed by GitHub
commit 3feaf6adb8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
690 changed files with 18901 additions and 10545 deletions

31
.devcontainer/Readme.md Normal file
View 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.

View 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"
}

View 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

View File

@ -6,7 +6,7 @@ body:
- type: markdown - type: markdown
attributes: attributes:
value: >- 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. bug... you can file a report for it.
- type: textarea - type: textarea
id: firmware id: firmware

View 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

View 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
View 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

View 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
View 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
View 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

View 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
View 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
View 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 }}

View File

@ -17,166 +17,113 @@ concurrency:
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:
test: scheduler:
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
outputs: outputs:
build-doc: ${{ steps.set-matrix.outputs.build-doc }} build-doc: ${{ steps.set-matrix.outputs.build-doc }}
boards-arm: ${{ steps.set-matrix.outputs.boards-arm }} build-boards: ${{ steps.set-matrix.outputs.build-boards }}
boards-riscv: ${{ steps.set-matrix.outputs.boards-riscv }}
boards-espressif: ${{ steps.set-matrix.outputs.boards-espressif }}
boards-aarch: ${{ steps.set-matrix.outputs.boards-aarch }} 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: steps:
- name: Dump GitHub context - name: Dump GitHub context
run: echo "$GITHUB_CONTEXT"
env: env:
GITHUB_CONTEXT: ${{ toJson(github) }} GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT" - name: Set up repository
- uses: actions/checkout@v3 uses: actions/checkout@v3
with: with:
submodules: false submodules: false
fetch-depth: 1 fetch-depth: 1
- name: Set up Python 3 - name: Set up python
uses: actions/setup-python@v4 uses: actions/setup-python@v4
with: with:
python-version: "3.10" python-version: 3.x
- name: Get CP deps - name: Duplicate USB VID/PID check
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
run: python3 -u -m tools.ci_check_duplicate_usb_vid_pid run: python3 -u -m tools.ci_check_duplicate_usb_vid_pid
- name: Build mpy-cross - name: Set up submodules
run: make -C mpy-cross -j2 id: set-up-submodules
- name: Build unix port uses: ./.github/actions/deps/submodules
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
with: with:
name: mpy-cross.static-aarch64 action: cache
path: mpy-cross/mpy-cross.static-aarch64 version: true
- name: Build mpy-cross.static-raspbian - name: Set up external
run: make -C mpy-cross -j2 -f Makefile.static-raspbian uses: ./.github/actions/deps/external
- uses: actions/upload-artifact@v3
with: with:
name: mpy-cross.static-raspbian action: cache
path: mpy-cross/mpy-cross.static-raspbian # Disabled: Needs to be updated
- name: Build mpy-cross.static # - name: Get last commit with checks
run: make -C mpy-cross -j2 -f Makefile.static # id: get-last-commit-with-checks
- uses: actions/upload-artifact@v3 # 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: with:
name: mpy-cross.static-amd64-linux download: false
path: mpy-cross/mpy-cross.static - name: Set head sha
- 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
if: github.event_name == 'pull_request' 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: env:
REPO: ${{ github.repository }} DEPTH: ${{ steps.get-last-commit-with-checks.outputs.commit_depth || github.event.pull_request.commits }}
PULL: ${{ github.event.number }}
GITHUB_TOKEN: ${{ github.token }}
EXCLUDE_COMMIT: ${{ github.event.after }}
run: python3 -u ci_changes_per_commit.py
- name: Get changes - name: Get changes
id: get-changes id: get-changes
if: github.event_name == 'pull_request' if: github.event_name == 'pull_request'
uses: tj-actions/changed-files@v34 run: echo $(git diff $BASE_SHA...$HEAD_SHA --name-only) | echo "changed_files=[\"$(sed "s/ /\", \"/g")\"]" >> $GITHUB_OUTPUT
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 }}
- name: Set matrix - name: Set matrix
id: set-matrix id: set-matrix
working-directory: tools 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 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: mpy-cross-mac:
runs-on: macos-11 runs-on: macos-11
steps: needs: scheduler
- name: Dump GitHub context if: ${{ needs.scheduler.outputs.build-boards == 'True' }}
env: env:
GITHUB_CONTEXT: ${{ toJson(github) }} CP_VERSION: ${{ needs.scheduler.outputs.cp-version }}
run: echo "$GITHUB_CONTEXT" steps:
- uses: actions/checkout@v3 - name: Set up repository
uses: actions/checkout@v3
with: with:
submodules: false submodules: false
fetch-depth: 1 fetch-depth: 1
- name: Set up Python 3 - name: Set up python
uses: actions/setup-python@v4 uses: actions/setup-python@v4
with: with:
python-version: "3.10" python-version: 3.x
- name: Get CP deps - name: Set up submodules
run: python tools/ci_fetch_deps.py mpy-cross-mac ${{ github.sha }} uses: ./.github/actions/deps/submodules
- 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
- name: Versions - name: Versions
run: | run: |
gcc --version gcc --version
@ -196,47 +143,46 @@ jobs:
path: mpy-cross/mpy-cross-arm64 path: mpy-cross/mpy-cross-arm64
- name: Make universal binary - name: Make universal binary
run: lipo -create -output mpy-cross-macos-universal mpy-cross/mpy-cross mpy-cross/mpy-cross-arm64 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: with:
name: mpy-cross-macos-11-universal name: mpy-cross-macos-11-universal
path: mpy-cross-macos-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: | 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-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/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-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/mpy-cross-macos-11-${{ env.CP_VERSION }}-x64 --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: env:
AWS_PAGER: '' AWS_PAGER: ''
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} 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: build-doc:
runs-on: ubuntu-20.04 runs-on: ubuntu-22.04
needs: test needs: scheduler
if: ${{ needs.test.outputs.build-doc == 'True' }} if: ${{ needs.scheduler.outputs.build-doc == 'True' }}
env:
CP_VERSION: ${{ needs.scheduler.outputs.cp-version }}
steps: steps:
- uses: actions/checkout@v3 - name: Set up repository
uses: actions/checkout@v3
with: with:
submodules: false submodules: false
fetch-depth: 1 fetch-depth: 1
- name: Get CP deps - name: Set up python
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
uses: actions/setup-python@v4 uses: actions/setup-python@v4
with: with:
python-version: "3.10" python-version: 3.x
- name: Set up submodules
uses: ./.github/actions/deps/submodules
- name: Install dependencies - name: Install dependencies
run: | run: |
sudo apt-get update sudo apt-get install -y latexmk librsvg2-bin texlive-fonts-recommended texlive-latex-recommended texlive-latex-extra
sudo apt-get install -y eatmydata pip install -r requirements-doc.txt
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
- name: Build and Validate Stubs - name: Build and Validate Stubs
run: make check-stubs -j2 run: make check-stubs -j2
- uses: actions/upload-artifact@v3 - uses: actions/upload-artifact@v3
@ -256,15 +202,13 @@ jobs:
with: with:
name: docs name: docs
path: _build/latex path: _build/latex
- name: Upload stubs 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')) uses: ./.github/actions/upload_aws
env: with:
AWS_PAGER: '' 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_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} 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 - name: Upload stubs to PyPi
if: github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested') if: github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested')
env: env:
@ -275,263 +219,52 @@ jobs:
[ -z "$TWINE_USERNAME" ] || echo "Uploading dev release to PyPi" [ -z "$TWINE_USERNAME" ] || echo "Uploading dev release to PyPi"
[ -z "$TWINE_USERNAME" ] || twine upload circuitpython-stubs/dist/* [ -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: arm:
runs-on: ubuntu-20.04 needs: [scheduler, mpy-cross, tests]
needs: test if: ${{ needs.scheduler.outputs.boards-arm != '[]' }}
strategy: uses: ./.github/workflows/build-boards.yml
fail-fast: false secrets: inherit
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
with: with:
python-version: "3.10" platform: arm
- uses: actions/checkout@v3 boards: ${{ needs.scheduler.outputs.boards-arm }}
with: cp-version: ${{ needs.scheduler.outputs.cp-version }}
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'))
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: riscv:
runs-on: ubuntu-20.04 needs: [scheduler, mpy-cross, tests]
needs: test if: ${{ needs.scheduler.outputs.boards-riscv != '[]' }}
strategy: uses: ./.github/workflows/build-boards.yml
fail-fast: false secrets: inherit
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
with: with:
python-version: "3.10" platform: riscv
- uses: actions/checkout@v3 boards: ${{ needs.scheduler.outputs.boards-riscv }}
with: cp-version: ${{ needs.scheduler.outputs.cp-version }}
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'))
rpi:
build-espressif: needs: [scheduler, mpy-cross, tests]
runs-on: ubuntu-20.04 if: ${{ needs.scheduler.outputs.boards-rpi != '[]' }}
needs: test uses: ./.github/workflows/build-boards.yml
strategy: secrets: inherit
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
with: with:
python-version: "3.10" platform: arm
- uses: actions/checkout@v3 boards: ${{ needs.scheduler.outputs.boards-rpi }}
with: cp-version: ${{ needs.scheduler.outputs.cp-version }}
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'))

View File

@ -6,41 +6,38 @@ name: Update CircuitPython.org
on: on:
release: release:
types: [published] types: [published, rerequested]
jobs: jobs:
website: website:
runs-on: ubuntu-20.04 runs-on: ubuntu-22.04
steps: steps:
- name: Dump GitHub context - name: Dump GitHub context
run: echo "$GITHUB_CONTEXT"
env: env:
GITHUB_CONTEXT: ${{ toJson(github) }} GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT" - name: Set up repository
- uses: actions/checkout@v3 uses: actions/checkout@v3
with: with:
submodules: false submodules: false
fetch-depth: 1 fetch-depth: 1
- name: Set up Python 3 - name: Set up python
uses: actions/setup-python@v4 uses: actions/setup-python@v4
with: with:
python-version: "3.10" python-version: 3.x
- name: Get CP deps - name: Set up submodules
run: python tools/ci_fetch_deps.py website ${{ github.sha }} uses: ./.github/actions/deps/submodules
- name: Install deps with:
run: | version: true
pip install -r requirements-dev.txt - name: Set up external
uses: ./.github/actions/deps/external
- name: Versions - name: Versions
run: | run: |
gcc --version gcc --version
python3 --version python3 --version
- name: CircuitPython version
run: |
tools/describe || git log --parents HEAD~4..
echo >>$GITHUB_ENV CP_VERSION=$(tools/describe)
- name: Website - name: Website
run: python3 build_board_info.py run: python3 build_board_info.py
working-directory: tools working-directory: tools
env: env:
RELEASE_TAG: ${{ github.event.release.tag_name }} RELEASE_TAG: ${{ github.event.release.tag_name }}
ADABOT_GITHUB_ACCESS_TOKEN: ${{ secrets.ADABOT_GITHUB_ACCESS_TOKEN }} ADABOT_GITHUB_ACCESS_TOKEN: ${{ secrets.ADABOT_GITHUB_ACCESS_TOKEN }}
if: github.event_name == 'release' && (github.event.action == 'published' || github.event.action == 'rerequested')

View File

@ -7,8 +7,12 @@ on:
jobs: jobs:
notify: notify:
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions:
issues: write
steps: steps:
- uses: jenschelkopf/issue-label-notification-action@1.3 - uses: tekktrik/issue-labeled-ping@v1
with: with:
recipients: | github-token: ${{ secrets.GITHUB_TOKEN }}
ulab=@v923z user: v923z
label: ulab
message: Heads up {user} - the "{label}" label was applied to this issue.

View File

@ -4,7 +4,7 @@ on:
push: push:
pull_request: pull_request:
paths: paths:
- '.github/workflows/*.yml' - '.github/workflows/ports_windows.yml'
- 'extmod/**' - 'extmod/**'
- 'lib/**' - 'lib/**'
- 'mpy-cross/**' - 'mpy-cross/**'
@ -19,8 +19,8 @@ concurrency:
cancel-in-progress: true cancel-in-progress: true
jobs: jobs:
build: windows:
runs-on: windows-2019 runs-on: windows-2022
defaults: defaults:
run: run:
# We define a custom shell script here, although `msys2.cmd` does neither exist nor is it available in the PATH yet # 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 shell: bash
- name: Check python coding (cmd) - name: Check python coding (cmd)
run: | run: python -c "import sys, locale; print(sys.getdefaultencoding(), locale.getpreferredencoding(False))"
python -c "import sys, locale; print(sys.getdefaultencoding(), locale.getpreferredencoding(False))"
shell: cmd shell: cmd
# We use a JS Action, which calls the system terminal or other custom terminals directly, if required # 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 python; python --version; python -c "import cascadetoml"
which python3; python3 --version; python3 -c "import cascadetoml" which python3; python3 --version; python3 -c "import cascadetoml"
- uses: actions/checkout@v3 - name: Set up repository
uses: actions/checkout@v3
with: with:
submodules: false submodules: false
fetch-depth: 1 fetch-depth: 1
- name: Get CP deps
run: python tools/ci_fetch_deps.py windows ${{ github.sha }} - name: Set up submodules
- name: CircuitPython version uses: ./.github/actions/deps/submodules
run: | with:
tools/describe || git log --parents HEAD~4.. version: true
echo >>$GITHUB_ENV CP_VERSION=$(tools/describe)
- name: build mpy-cross - name: build mpy-cross
run: make -j2 -C mpy-cross run: make -j2 -C mpy-cross

View File

@ -16,24 +16,23 @@ jobs:
pre-commit: pre-commit:
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
steps: steps:
- uses: actions/checkout@v3 - name: Set up repository
- name: Set up Python 3 uses: actions/checkout@v3
with:
submodules: false
fetch-depth: 1
- name: Set up python
uses: actions/setup-python@v4 uses: actions/setup-python@v4
with: with:
python-version: "3.10" python-version: 3.x
- name: Install deps - name: Set up submodules
run: | uses: ./.github/actions/deps/submodules
sudo apt-get install -y gettext uncrustify - name: Set up external
pip3 install black polib pyyaml uses: ./.github/actions/deps/external
- name: Populate selected submodules - name: Install dependencies
run: git submodule update --init extmod/ulab run: sudo apt-get install -y gettext uncrustify
- name: Set PY - name: Run pre-commit
run: echo >>$GITHUB_ENV PY="$(python -c 'import hashlib, sys;print(hashlib.sha256(sys.version.encode()+sys.executable.encode()).hexdigest())')" uses: pre-commit/action@v3.0.0
- 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
- name: Make patch - name: Make patch
if: failure() if: failure()
run: git diff > ~/pre-commit.patch run: git diff > ~/pre-commit.patch

67
.github/workflows/run-tests.yml vendored Normal file
View 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
View File

@ -9,6 +9,7 @@
!atmel-samd/asf/**/*.a !atmel-samd/asf/**/*.a
*.elf *.elf
*.bin *.bin
!*.toml.bin
*.map *.map
*.hex *.hex
*.dis *.dis

9
.gitmodules vendored
View File

@ -146,7 +146,7 @@
[submodule "ports/espressif/esp-idf"] [submodule "ports/espressif/esp-idf"]
path = ports/espressif/esp-idf path = ports/espressif/esp-idf
url = https://github.com/adafruit/esp-idf.git url = https://github.com/adafruit/esp-idf.git
branch = circuitpython8 branch = release/v4.4-circuitpython
[submodule "ports/espressif/certificates/nina-fw"] [submodule "ports/espressif/certificates/nina-fw"]
path = lib/certificates/nina-fw path = lib/certificates/nina-fw
url = https://github.com/adafruit/nina-fw.git url = https://github.com/adafruit/nina-fw.git
@ -310,12 +310,15 @@
[submodule "ports/espressif/esp32-camera"] [submodule "ports/espressif/esp32-camera"]
path = ports/espressif/esp32-camera path = ports/espressif/esp32-camera
url = https://github.com/adafruit/esp32-camera/ url = https://github.com/adafruit/esp32-camera/
branch = circuitpython
[submodule "ports/raspberrypi/lib/cyw43-driver"] [submodule "ports/raspberrypi/lib/cyw43-driver"]
path = 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"] [submodule "ports/raspberrypi/lib/lwip"]
path = 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"] [submodule "lib/mbedtls"]
path = lib/mbedtls path = lib/mbedtls
url = https://github.com/ARMmbed/mbedtls.git url = https://github.com/ARMmbed/mbedtls.git

View File

@ -14,7 +14,7 @@ build:
python: "3" python: "3"
jobs: jobs:
post_install: post_install:
- python tools/ci_fetch_deps.py docs HEAD - python tools/ci_fetch_deps.py build-doc
formats: formats:
- pdf - pdf

View File

@ -90,7 +90,7 @@ clean:
rm -rf autoapi rm -rf autoapi
rm -rf $(STUBDIR) $(DISTDIR) *.egg-info rm -rf $(STUBDIR) $(DISTDIR) *.egg-info
html: stubs html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo @echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html." @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
@ -323,10 +323,11 @@ clean-nrf:
clean-stm: clean-stm:
$(MAKE) -C ports/stm BOARD=feather_stm32f405_express clean $(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 # 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. # branch. We can ignore that though because we fix it with the second command.
# (Only works for git servers that allow sha fetches.) # (Only works for git servers that allow sha fetches.)
.PHONY: fetch-submodules
fetch-submodules:
git submodule update --init -N --depth 1 || true git submodule update --init -N --depth 1 || true
git submodule foreach 'git fetch --tags --depth 1 origin $$sha1 && git checkout -q $$sha1' git submodule foreach 'git fetch --tags --depth 1 origin $$sha1 && git checkout -q $$sha1'

View File

@ -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 - 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 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. 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. - RGB status LED indicating CircuitPython state.
- One green flash - code completed without error. - One green flash - code completed without error.
- Two red flashes - code ended due to an exception. - 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 - Re-runs ``code.py`` or other main file after file system writes by a workflow. (Disable with
``supervisor.disable_autoreload()``) ``supervisor.disable_autoreload()``)
- Autoreload is disabled while the REPL is active. - Autoreload is disabled while the REPL is active.
- Main is one of these: ``code.txt``, ``code.py``, ``main.py``, - ``code.py`` may also be named``code.txt``, ``main.py``, or ``main.txt``.
``main.txt`` - ``boot.py`` may also be named ``boot.txt``.
- Boot is one of these: ``boot.py``, ``boot.txt`` - ``safemode.py`` may also be named ``safemode.txt``.
API API
~~~ ~~~

View File

@ -171,6 +171,7 @@ exclude_patterns = ["**/build*",
".env", ".env",
".venv", ".venv",
".direnv", ".direnv",
".devcontainer/Readme.md",
"data", "data",
"docs/autoapi", "docs/autoapi",
"docs/README.md", "docs/README.md",

View File

@ -49,8 +49,8 @@
#include "shared-bindings/_bleio/ScanEntry.h" #include "shared-bindings/_bleio/ScanEntry.h"
#include "shared-bindings/time/__init__.h" #include "shared-bindings/time/__init__.h"
#if CIRCUITPY_DOTENV #if CIRCUITPY_OS_GETENV
#include "shared-module/dotenv/__init__.h" #include "shared-bindings/os/__init__.h"
#endif #endif
#define MSEC_TO_UNITS(TIME, RESOLUTION) (((TIME) * 1000) / (RESOLUTION)) #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) { STATIC void bleio_adapter_hci_init(bleio_adapter_obj_t *self) {
mp_int_t name_len = 0; mp_int_t name_len = 0;
#if CIRCUITPY_DOTENV #if CIRCUITPY_OS_GETENV
char ble_name[32]; mp_obj_t name = common_hal_os_getenv("CIRCUITPY_BLE_NAME", mp_const_none);
name_len = dotenv_get_key("/.env", "CIRCUITPY_BLE_NAME", ble_name, sizeof(ble_name) - 1); if (name != mp_const_none) {
if (name_len > 0) { mp_arg_validate_type_string(name, MP_QSTR_CIRCUITPY_BLE_NAME);
self->name = mp_obj_new_str(ble_name, (size_t)name_len); self->name = name;
} }
#endif #endif
if (name_len <= 0) { if (!self->name) {
name_len = sizeof(default_ble_name); name_len = sizeof(default_ble_name);
bt_addr_t addr; bt_addr_t addr;
hci_check_error(hci_read_bd_addr(&addr)); hci_check_error(hci_read_bd_addr(&addr));

View File

@ -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 Class description
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View File

@ -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.

View File

@ -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 keys. This method *does not* make them secure. It only separates them from the
code. code.
CircuitPython supports these by mimicking the `dotenv <https://github.com/theskumar/python-dotenv>`_ CircuitPython uses a file called ``settings.toml`` at the drive root (no
CPython library. Other languages such as Javascript, PHP and Ruby also have folder) as the environment. User code can access the values from the file
dotenv libraries. 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 CircuitPython only supports a subset of the full toml specification, see below
example: 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' File format example:
# Comment
KEY2='value2
is multiple lines'
CircuitPython uses the ``.env`` at the drive root (no folder) as the environment. .. code-block::
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()` str_key="Hello world" # with trailing comment
will parse the ``/.env`` on every access. 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 CircuitPython behavior
---------------------- ----------------------

View File

@ -21,7 +21,7 @@ Full Table of Contents
../shared-bindings/index.rst ../shared-bindings/index.rst
supported_ports.rst supported_ports.rst
troubleshooting.rst troubleshooting.rst
drivers.rst libraries.rst
workflows workflows
environment.rst environment.rst

31
docs/libraries.rst Normal file
View 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.

View File

@ -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'``.

View File

@ -35,7 +35,6 @@ These libraries are not currently enabled in any CircuitPython build, but may be
json.rst json.rst
re.rst re.rst
sys.rst sys.rst
asyncio.rst
ctypes.rst ctypes.rst
select.rst select.rst

View File

@ -46,7 +46,7 @@ connection, the central device can discover two default services. One for file t
CircuitPython specifically that includes serial characteristics. CircuitPython specifically that includes serial characteristics.
To change the default BLE advertising name without (or before) running user code, the desired name 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. 30 characters depending on the port's settings and will be truncated if longer.
### File Transfer API ### File Transfer API
@ -69,21 +69,21 @@ Read-only characteristic that returns the UTF-8 encoded version string.
## Web ## 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 `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 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. 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 ```bash
# To auto-connect to Wi-Fi # To auto-connect to Wi-Fi
CIRCUITPY_WIFI_SSID='scottswifi' CIRCUITPY_WIFI_SSID="scottswifi"
CIRCUITPY_WIFI_PASSWORD='secretpassword' CIRCUITPY_WIFI_PASSWORD="secretpassword"
# To enable modifying files from the web. Change this too! # To enable modifying files from the web. Change this too!
# Leave the User field blank in the browser. # Leave the User field blank in the browser.
CIRCUITPY_WEB_API_PASSWORD='passw0rd' CIRCUITPY_WEB_API_PASSWORD="passw0rd"
CIRCUITPY_WEB_API_PORT=80 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 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. 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 server will respond with `403 Forbidden`. When a password is set, but not provided in a request, it
will respond `401 Unauthorized`. will respond `401 Unauthorized`.

@ -1 +1 @@
Subproject commit 25a825e41c26cfcee018b762416741d0d63aeabf Subproject commit f2dd2230c4fdf1aa5c7a160782efdde18e8204bb

View File

@ -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_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 #if MICROPY_FATFS_USE_LABEL
STATIC mp_obj_t vfs_fat_getlabel(mp_obj_t self_in) { STATIC mp_obj_t vfs_fat_getlabel(mp_obj_t self_in) {
fs_user_mount_t *self = MP_OBJ_TO_PTR(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_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_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_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 #if MICROPY_FATFS_USE_LABEL
{ MP_ROM_QSTR(MP_QSTR_label), MP_ROM_PTR(&fat_vfs_label_obj) }, { MP_ROM_QSTR(MP_QSTR_label), MP_ROM_PTR(&fat_vfs_label_obj) },
#endif #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

View File

@ -257,6 +257,11 @@
#define GET_FATTIME() get_fattime() #define GET_FATTIME() get_fattime()
#endif #endif
#if FF_FS_MAKE_VOLID == 1
#define MAKE_VOLID(x) (make_volid())
#else
#define MAKE_VOLID(x) (GET_FATTIME())
#endif
/* File lock controls */ /* File lock controls */
#if FF_FS_LOCK != 0 #if FF_FS_LOCK != 0
@ -5421,6 +5426,7 @@ FRESULT f_mkfs (
DWORD tbl[3]; DWORD tbl[3];
#endif #endif
DWORD volid = MAKE_VOLID();
/* Check mounted drive and clear work area */ /* Check mounted drive and clear work area */
fs->fs_type = 0; /* Clear mounted volume */ 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_DataOfsEx, b_data - b_vol); /* Data offset [sector] */
st_dword(buf + BPB_NumClusEx, n_clst); /* Number of clusters */ 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_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) */ 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_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] */ 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] */ st_dword(buf + BPB_HiddSec, b_vol); /* Volume offset in the physical drive [sector] */
#if FF_MKFS_FAT32 #if FF_MKFS_FAT32
if (fmt == FS_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_FATSz32, sz_fat); /* FAT size [sector] */
st_dword(buf + BPB_RootClus32, 2); /* Root directory cluster # (2) */ st_dword(buf + BPB_RootClus32, 2); /* Root directory cluster # (2) */
st_word(buf + BPB_FSInfo32, 1); /* Offset of FSINFO sector (VBR + 1) */ st_word(buf + BPB_FSInfo32, 1); /* Offset of FSINFO sector (VBR + 1) */
@ -5769,7 +5775,7 @@ FRESULT f_mkfs (
} else } else
#endif #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] */ st_word(buf + BPB_FATSz16, (WORD)sz_fat); /* FAT size [sector] */
buf[BS_DrvNum] = 0x80; /* Drive number (for int13) */ buf[BS_DrvNum] = 0x80; /* Drive number (for int13) */
buf[BS_BootSig] = 0x29; /* Extended boot signature */ buf[BS_BootSig] = 0x29; /* Extended boot signature */

View File

@ -334,6 +334,10 @@ FRESULT f_setcp (WORD cp); /* Set curre
DWORD get_fattime (void); DWORD get_fattime (void);
#endif #endif
#if FF_FS_MAKE_VOLID
DWORD make_volid (void);
#endif
/* LFN support functions */ /* LFN support functions */
#if FF_USE_LFN >= 1 /* Code conversion (defined in unicode.c) */ #if FF_USE_LFN >= 1 /* Code conversion (defined in unicode.c) */
WCHAR ff_oem2uni (WCHAR oem, WORD cp); /* OEM code to Unicode conversion */ WCHAR ff_oem2uni (WCHAR oem, WORD cp); /* OEM code to Unicode conversion */

View File

@ -373,6 +373,10 @@
/ SemaphoreHandle_t and etc. A header file for O/S definitions needs to be / SemaphoreHandle_t and etc. A header file for O/S definitions needs to be
/ included somewhere in the scope of ff.h. */ / 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 ---*/ /*--- End of configuration options ---*/

@ -1 +1 @@
Subproject commit cc93ff18c3a20b25396cb2babaee8ed33bb79528 Subproject commit d0a07e14adcd71a7c22bcceb16c55aadb5e0d104

File diff suppressed because it is too large Load Diff

436
locale/circuitpython.pot Executable file → Normal file
View File

@ -31,8 +31,20 @@ msgstr ""
#: supervisor/shared/safe_mode.c #: supervisor/shared/safe_mode.c
msgid "" msgid ""
"\n" "\n"
"Please file an issue with the contents of your CIRCUITPY drive at \n" "Please file an issue with your program at https://github.com/adafruit/"
"https://github.com/adafruit/circuitpython/issues\n" "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 "" msgstr ""
#: py/obj.c #: py/obj.c
@ -65,6 +77,11 @@ msgstr ""
msgid "%02X" msgid "%02X"
msgstr "" msgstr ""
#: shared-module/os/getenv.c
#, c-format
msgid "%S"
msgstr ""
#: shared-bindings/rgbmatrix/RGBMatrix.c #: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format #, c-format
msgid "" msgid ""
@ -80,7 +97,7 @@ msgstr ""
#: ports/raspberrypi/common-hal/alarm/__init__.c #: ports/raspberrypi/common-hal/alarm/__init__.c
#: ports/raspberrypi/common-hal/analogio/AnalogOut.c #: ports/raspberrypi/common-hal/analogio/AnalogOut.c
#: ports/raspberrypi/common-hal/rtc/RTC.c ports/stm/common-hal/alarm/__init__.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" msgid "%q"
msgstr "" msgstr ""
@ -100,13 +117,18 @@ msgstr ""
msgid "%q failure: %d" msgid "%q failure: %d"
msgstr "" 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 #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
#: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/digitalio/DigitalInOut.c
#: shared-bindings/microcontroller/Pin.c #: shared-bindings/microcontroller/Pin.c
msgid "%q in use" msgid "%q in use"
msgstr "" msgstr ""
#: py/obj.c py/objstr.c py/objstrunicode.c #: py/objstr.c py/objstrunicode.c
msgid "%q index out of range" msgid "%q index out of range"
msgstr "" msgstr ""
@ -118,7 +140,11 @@ msgstr ""
msgid "%q is %q" msgid "%q is %q"
msgstr "" 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" msgid "%q length must be %d"
msgstr "" msgstr ""
@ -134,10 +160,6 @@ msgstr ""
msgid "%q length must be >= %d" msgid "%q length must be >= %d"
msgstr "" msgstr ""
#: shared-bindings/busio/I2C.c
msgid "%q length must be >= 1"
msgstr ""
#: py/argcheck.c #: py/argcheck.c
msgid "%q must be %d" msgid "%q must be %d"
msgstr "" msgstr ""
@ -159,24 +181,20 @@ msgid "%q must be >= %d"
msgstr "" msgstr ""
#: shared-bindings/analogbufio/BufferedIn.c #: shared-bindings/analogbufio/BufferedIn.c
msgid "%q must be a bytearray or array of type 'H' or 'B'"
msgstr ""
#: shared-bindings/audiocore/RawSample.c #: shared-bindings/audiocore/RawSample.c
msgid "%q must be a bytearray or array of type 'h', 'H', 'b', or 'B'" msgid "%q must be a bytearray or array of type 'h', 'H', 'b', or 'B'"
msgstr "" msgstr ""
#: py/argcheck.c #: ports/raspberrypi/bindings/cyw43/__init__.c py/argcheck.c py/objexcept.c
msgid "%q must be a string" #: shared-bindings/canio/CAN.c shared-bindings/digitalio/Pull.c
msgid "%q must be of type %q or %q, not %q"
msgstr "" msgstr ""
#: py/argcheck.c #: py/argcheck.c py/obj.c py/objstrunicode.c
msgid "%q must be an int" msgid "%q must be of type %q, not %q"
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"
msgstr "" msgstr ""
#: ports/atmel-samd/common-hal/busio/UART.c #: ports/atmel-samd/common-hal/busio/UART.c
@ -189,7 +207,6 @@ msgstr ""
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c #: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/cxd56/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/nrf/common-hal/pulseio/PulseIn.c
#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
#: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c #: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c
@ -201,8 +218,8 @@ msgstr ""
msgid "%q pin invalid" msgid "%q pin invalid"
msgstr "" msgstr ""
#: shared-bindings/usb_hid/Device.c #: py/objrange.c py/objslice.c shared-bindings/random/__init__.c
msgid "%q with a report ID of 0 must be of length 1" msgid "%q step cannot be zero"
msgstr "" msgstr ""
#: py/bc.c py/objnamedtuple.c #: py/bc.c py/objnamedtuple.c
@ -302,7 +319,7 @@ msgstr ""
msgid "'%s' object doesn't support item deletion" msgid "'%s' object doesn't support item deletion"
msgstr "" msgstr ""
#: ports/raspberrypi/common-hal/wifi/Radio.c py/runtime.c #: py/runtime.c
msgid "'%s' object has no attribute '%q'" msgid "'%s' object has no attribute '%q'"
msgstr "" msgstr ""
@ -402,6 +419,10 @@ msgstr ""
msgid "Address must be %d bytes long" msgid "Address must be %d bytes long"
msgstr "" msgstr ""
#: ports/espressif/common-hal/memorymap/AddressRange.c
msgid "Address range not allowed"
msgstr ""
#: ports/espressif/common-hal/canio/CAN.c #: ports/espressif/common-hal/canio/CAN.c
msgid "All CAN peripherals are in use" msgid "All CAN peripherals are in use"
msgstr "" msgstr ""
@ -429,7 +450,6 @@ msgid "All SPI peripherals are in use"
msgstr "" msgstr ""
#: ports/espressif/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c #: 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" msgid "All UART peripherals are in use"
msgstr "" msgstr ""
@ -482,7 +502,7 @@ msgstr ""
msgid "Already have all-matches listener" msgid "Already have all-matches listener"
msgstr "" msgstr ""
#: ports/espressif/common-hal/coproc/__init__.c #: ports/espressif/common-hal/espulp/ULP.c
#: shared-module/memorymonitor/AllocationAlarm.c #: shared-module/memorymonitor/AllocationAlarm.c
#: shared-module/memorymonitor/AllocationSize.c #: shared-module/memorymonitor/AllocationSize.c
msgid "Already running" msgid "Already running"
@ -493,6 +513,11 @@ msgstr ""
msgid "Already scanning for wifi networks" msgid "Already scanning for wifi networks"
msgstr "" msgstr ""
#: shared-module/os/getenv.c
#, c-format
msgid "An error occurred while retrieving '%s':\n"
msgstr ""
#: ports/stm/common-hal/audiopwmio/PWMAudioOut.c #: ports/stm/common-hal/audiopwmio/PWMAudioOut.c
msgid "Another PWMAudioOut is already active" msgid "Another PWMAudioOut is already active"
msgstr "" msgstr ""
@ -506,24 +531,16 @@ msgstr ""
msgid "Array must contain halfwords (type 'H')" msgid "Array must contain halfwords (type 'H')"
msgstr "" 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 #: shared-bindings/nvm/ByteArray.c
msgid "Array values should be single bytes." msgid "Array values should be single bytes."
msgstr "" msgstr ""
#: shared-bindings/microcontroller/Pin.c
msgid "At most %d %q may be specified (not %d)"
msgstr ""
#: shared-module/memorymonitor/AllocationAlarm.c #: shared-module/memorymonitor/AllocationAlarm.c
#, c-format #, c-format
msgid "Attempt to allocate %d blocks" msgid "Attempt to allocate %d blocks"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c
msgid "Attempted heap allocation when VM not running."
msgstr ""
#: ports/raspberrypi/audio_dma.c #: ports/raspberrypi/audio_dma.c
msgid "Audio conversion not implemented" msgid "Audio conversion not implemented"
msgstr "" msgstr ""
@ -572,20 +589,13 @@ msgid "Bitmap size and bits per value must match"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c #: supervisor/shared/safe_mode.c
msgid "Boot device must be first device (interface #0)." msgid "Boot device must be first (interface #0)."
msgstr "" msgstr ""
#: ports/mimxrt10xx/common-hal/busio/UART.c #: ports/mimxrt10xx/common-hal/busio/UART.c
msgid "Both RX and TX required for flow control" msgid "Both RX and TX required for flow control"
msgstr "" 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 #: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c
msgid "Both pins must support hardware interrupts" msgid "Both pins must support hardware interrupts"
msgstr "" msgstr ""
@ -651,11 +661,6 @@ msgstr ""
msgid "Bus pin %d is already in use" msgid "Bus pin %d is already in use"
msgstr "" 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 #: shared-bindings/_bleio/UUID.c
msgid "Byte buffer must be 16 bytes." msgid "Byte buffer must be 16 bytes."
msgstr "" msgstr ""
@ -786,10 +791,6 @@ msgstr ""
msgid "CircuitPython core code crashed hard. Whoops!\n" msgid "CircuitPython core code crashed hard. Whoops!\n"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c
msgid "CircuitPython was unable to allocate the heap."
msgstr ""
#: shared-module/bitbangio/I2C.c #: shared-module/bitbangio/I2C.c
msgid "Clock stretch too long" msgid "Clock stretch too long"
msgstr "" msgstr ""
@ -828,10 +829,6 @@ msgstr ""
msgid "Couldn't allocate decoder" msgid "Couldn't allocate decoder"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c
msgid "Crash into the HardFault_Handler."
msgstr ""
#: ports/stm/common-hal/analogio/AnalogOut.c #: ports/stm/common-hal/analogio/AnalogOut.c
msgid "DAC Channel Init Error" msgid "DAC Channel Init Error"
msgstr "" msgstr ""
@ -894,6 +891,10 @@ msgstr ""
msgid "Drive mode not used when direction is input." msgid "Drive mode not used when direction is input."
msgstr "" msgstr ""
#: py/obj.c
msgid "During handling of the above exception, another exception occurred:"
msgstr ""
#: shared-bindings/aesio/aes.c #: shared-bindings/aesio/aes.c
msgid "ECB only operates on 16 bytes at a time" msgid "ECB only operates on 16 bytes at a time"
msgstr "" msgstr ""
@ -919,24 +920,16 @@ msgstr ""
msgid "Error in regex" msgid "Error in regex"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c
msgid "Error in safemode.py."
msgstr ""
#: shared-bindings/socketpool/Socket.c shared-bindings/ssl/SSLSocket.c #: shared-bindings/socketpool/Socket.c shared-bindings/ssl/SSLSocket.c
msgid "Error: Failure to bind" msgid "Error: Failure to bind"
msgstr "" 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 #: shared-bindings/alarm/__init__.c
msgid "Expected an %q" msgid "Expected a kind of %q"
msgstr "" msgstr ""
#: ports/espressif/common-hal/_bleio/Adapter.c #: ports/espressif/common-hal/_bleio/Adapter.c
@ -1004,13 +997,17 @@ msgid "Failed to write internal flash."
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c #: supervisor/shared/safe_mode.c
msgid "Fatal error." msgid "Fault detected by hardware."
msgstr "" msgstr ""
#: py/moduerrno.c #: py/moduerrno.c
msgid "File exists" msgid "File exists"
msgstr "" msgstr ""
#: shared-module/os/getenv.c
msgid "File not found"
msgstr ""
#: ports/atmel-samd/common-hal/canio/Listener.c #: ports/atmel-samd/common-hal/canio/Listener.c
#: ports/espressif/common-hal/canio/Listener.c #: ports/espressif/common-hal/canio/Listener.c
#: ports/stm/common-hal/canio/Listener.c #: ports/stm/common-hal/canio/Listener.c
@ -1025,7 +1022,6 @@ msgstr ""
msgid "Firmware is invalid" msgid "Firmware is invalid"
msgstr "" msgstr ""
#: ports/espressif/common-hal/coproc/Coproc.c
#: ports/espressif/common-hal/dualbank/__init__.c #: ports/espressif/common-hal/dualbank/__init__.c
msgid "Firmware is too big" msgid "Firmware is too big"
msgstr "" msgstr ""
@ -1067,6 +1063,8 @@ msgstr ""
#: shared-bindings/displayio/Display.c #: shared-bindings/displayio/Display.c
#: shared-bindings/displayio/EPaperDisplay.c #: shared-bindings/displayio/EPaperDisplay.c
#: shared-bindings/framebufferio/FramebufferDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c
#: shared-module/displayio/Display.c
#: shared-module/framebufferio/FramebufferDisplay.c
msgid "Group already used" msgid "Group already used"
msgstr "" msgstr ""
@ -1087,6 +1085,15 @@ msgstr ""
msgid "Hardware in use, try alternative pins" msgid "Hardware in use, try alternative pins"
msgstr "" 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 #: extmod/vfs_posix_file.c py/objstringio.c
msgid "I/O operation on closed file" msgid "I/O operation on closed file"
msgstr "" msgstr ""
@ -1104,11 +1111,6 @@ msgstr ""
msgid "I2SOut not available" msgid "I2SOut not available"
msgstr "" msgstr ""
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
msgstr ""
#: ports/raspberrypi/bindings/rp2pio/StateMachine.c #: ports/raspberrypi/bindings/rp2pio/StateMachine.c
msgid "In-buffer elements must be <= 4 bytes long" msgid "In-buffer elements must be <= 4 bytes long"
msgstr "" msgstr ""
@ -1193,6 +1195,7 @@ msgid "Internal define error"
msgstr "" msgstr ""
#: ports/espressif/common-hal/paralleldisplay/ParallelBus.c #: ports/espressif/common-hal/paralleldisplay/ParallelBus.c
#: shared-module/os/getenv.c
msgid "Internal error" msgid "Internal error"
msgstr "" msgstr ""
@ -1205,6 +1208,10 @@ msgstr ""
msgid "Internal watchdog timer expired." msgid "Internal watchdog timer expired."
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c
msgid "Interrupt error."
msgstr ""
#: py/argcheck.c shared-bindings/digitalio/DigitalInOut.c #: py/argcheck.c shared-bindings/digitalio/DigitalInOut.c
msgid "Invalid %q" msgid "Invalid %q"
msgstr "" msgstr ""
@ -1239,6 +1246,11 @@ msgstr ""
msgid "Invalid bits per value" msgid "Invalid bits per value"
msgstr "" msgstr ""
#: shared-module/os/getenv.c
#, c-format
msgid "Invalid byte %.*s"
msgstr ""
#: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c
#, c-format #, c-format
msgid "Invalid data_pins[%d]" msgid "Invalid data_pins[%d]"
@ -1248,18 +1260,10 @@ msgstr ""
msgid "Invalid format chunk size" msgid "Invalid format chunk size"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c
msgid "Invalid memory access."
msgstr ""
#: ports/espressif/common-hal/wifi/Radio.c #: ports/espressif/common-hal/wifi/Radio.c
msgid "Invalid multicast MAC address" msgid "Invalid multicast MAC address"
msgstr "" msgstr ""
#: shared-bindings/busio/UART.c
msgid "Invalid pins"
msgstr ""
#: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c
msgid "Invalid size" msgid "Invalid size"
msgstr "" msgstr ""
@ -1273,10 +1277,18 @@ msgstr ""
msgid "Invalid state" msgid "Invalid state"
msgstr "" msgstr ""
#: shared-module/os/getenv.c
msgid "Invalid unicode escape"
msgstr ""
#: shared-bindings/aesio/aes.c #: shared-bindings/aesio/aes.c
msgid "Key must be 16, 24, or 32 bytes long" msgid "Key must be 16, 24, or 32 bytes long"
msgstr "" msgstr ""
#: shared-module/os/getenv.c
msgid "Key not found"
msgstr ""
#: shared-module/is31fl3741/FrameBuffer.c #: shared-module/is31fl3741/FrameBuffer.c
msgid "LED mappings must match display size" msgid "LED mappings must match display size"
msgstr "" msgstr ""
@ -1383,6 +1395,10 @@ msgstr ""
msgid "NVS Error" msgid "NVS Error"
msgstr "" msgstr ""
#: shared-bindings/socketpool/SocketPool.c
msgid "Name or service not known"
msgstr ""
#: py/qstr.c #: py/qstr.c
msgid "Name too long" msgid "Name too long"
msgstr "" msgstr ""
@ -1497,11 +1513,6 @@ msgstr ""
msgid "No long integer support" msgid "No long integer support"
msgstr "" msgstr ""
#: shared-module/usb_hid/__init__.c
#, c-format
msgid "No more than %d HID devices allowed"
msgstr ""
#: shared-bindings/wifi/Radio.c #: shared-bindings/wifi/Radio.c
msgid "No network with that ssid" msgid "No network with that ssid"
msgstr "" msgstr ""
@ -1537,10 +1548,6 @@ msgstr ""
msgid "No timer available" msgid "No timer available"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c
msgid "Nordic system firmware failure assertion."
msgstr ""
#: ports/nrf/common-hal/_bleio/__init__.c #: ports/nrf/common-hal/_bleio/__init__.c
msgid "Nordic system firmware out of memory" msgid "Nordic system firmware out of memory"
msgstr "" msgstr ""
@ -1560,10 +1567,6 @@ msgstr ""
msgid "Not playing" msgid "Not playing"
msgstr "" msgstr ""
#: shared-bindings/_bleio/__init__.c
msgid "Not settable"
msgstr ""
#: ports/espressif/common-hal/paralleldisplay/ParallelBus.c #: ports/espressif/common-hal/paralleldisplay/ParallelBus.c
#, c-format #, c-format
msgid "Number of data_pins must be 8 or 16, not %d" msgid "Number of data_pins must be 8 or 16, not %d"
@ -1626,11 +1629,14 @@ msgid ""
"%d bpp given" "%d bpp given"
msgstr "" msgstr ""
#: ports/espressif/common-hal/alarm/coproc/CoprocAlarm.c
#: ports/espressif/common-hal/alarm/touch/TouchAlarm.c #: ports/espressif/common-hal/alarm/touch/TouchAlarm.c
msgid "Only one %q can be set in deep sleep." msgid "Only one %q can be set in deep sleep."
msgstr "" msgstr ""
#: ports/espressif/common-hal/espulp/ULPAlarm.c
msgid "Only one %q can be set."
msgstr ""
#: ports/espressif/common-hal/i2ctarget/I2CTarget.c #: ports/espressif/common-hal/i2ctarget/I2CTarget.c
#: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c #: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c
msgid "Only one address is allowed" msgid "Only one address is allowed"
@ -1663,6 +1669,10 @@ msgstr ""
msgid "Operation timed out" msgid "Operation timed out"
msgstr "" 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 #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c
msgid "Out of memory" msgid "Out of memory"
msgstr "" msgstr ""
@ -1786,6 +1796,10 @@ msgstr ""
msgid "Program size invalid" msgid "Program size invalid"
msgstr "" msgstr ""
#: ports/espressif/common-hal/espulp/ULP.c
msgid "Program too long"
msgstr ""
#: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/digitalio/DigitalInOut.c
msgid "Pull not used when direction is output." msgid "Pull not used when direction is output."
msgstr "" msgstr ""
@ -1825,8 +1839,9 @@ msgstr ""
msgid "Random number generation error" msgid "Random number generation error"
msgstr "" msgstr ""
#: shared-bindings/_bleio/__init__.c
#: shared-bindings/memorymonitor/AllocationSize.c #: shared-bindings/memorymonitor/AllocationSize.c
#: shared-bindings/pulseio/PulseIn.c #: shared-bindings/pulseio/PulseIn.c shared-module/displayio/Bitmap.c
msgid "Read-only" msgid "Read-only"
msgstr "" msgstr ""
@ -1834,10 +1849,6 @@ msgstr ""
msgid "Read-only filesystem" msgid "Read-only filesystem"
msgstr "" msgstr ""
#: shared-module/displayio/Bitmap.c
msgid "Read-only object"
msgstr ""
#: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c
msgid "Received response was invalid" msgid "Received response was invalid"
msgstr "" msgstr ""
@ -1930,7 +1941,7 @@ msgstr ""
msgid "Sleep Memory not available" msgid "Sleep Memory not available"
msgstr "" 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 #: shared-bindings/nvm/ByteArray.c
msgid "Slice and value different lengths." msgid "Slice and value different lengths."
msgstr "" msgstr ""
@ -1967,6 +1978,10 @@ msgstr ""
msgid "Stereo right must be on PWM channel B" msgid "Stereo right must be on PWM channel B"
msgstr "" 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 #: ports/mimxrt10xx/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
msgid "Supply at least one UART pin" msgid "Supply at least one UART pin"
msgstr "" msgstr ""
@ -1984,35 +1999,11 @@ msgid "Temperature read timed out"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c #: 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 "" msgstr ""
#: supervisor/shared/safe_mode.c #: py/obj.c
msgid "" msgid "The above exception was the direct cause of the following exception:"
"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"
msgstr "" msgstr ""
#: shared-bindings/rgbmatrix/RGBMatrix.c #: shared-bindings/rgbmatrix/RGBMatrix.c
@ -2020,10 +2011,7 @@ msgid "The length of rgb_pins must be 6, 12, 18, 24, or 30"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c #: supervisor/shared/safe_mode.c
msgid "" msgid "The power dipped. Make sure you are providing enough power."
"The microcontroller's power dipped. Make sure your power supply provides\n"
"enough power for the whole circuit and press reset (after ejecting "
"CIRCUITPY)."
msgstr "" msgstr ""
#: shared-module/audiomixer/MixerVoice.c #: shared-module/audiomixer/MixerVoice.c
@ -2042,6 +2030,10 @@ msgstr ""
msgid "The sample's signedness does not match the mixer's" msgid "The sample's signedness does not match the mixer's"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c
msgid "Third-party firmware fatal error."
msgstr ""
#: shared-module/imagecapture/ParallelImageCapture.c #: shared-module/imagecapture/ParallelImageCapture.c
msgid "This microcontroller does not support continuous capture." msgid "This microcontroller does not support continuous capture."
msgstr "" msgstr ""
@ -2074,10 +2066,6 @@ msgstr ""
msgid "Timeout is too long: Maximum timeout length is %d seconds" msgid "Timeout is too long: Maximum timeout length is %d seconds"
msgstr "" 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 #: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
msgid "Too many channels in sample" msgid "Too many channels in sample"
msgstr "" msgstr ""
@ -2122,6 +2110,10 @@ msgstr ""
msgid "UART init" msgid "UART init"
msgstr "" msgstr ""
#: ports/raspberrypi/common-hal/busio/UART.c
msgid "UART peripheral in use"
msgstr ""
#: ports/stm/common-hal/busio/UART.c #: ports/stm/common-hal/busio/UART.c
msgid "UART re-init" msgid "UART re-init"
msgstr "" msgstr ""
@ -2169,6 +2161,10 @@ msgstr ""
msgid "Unable to allocate buffers for signed conversion" msgid "Unable to allocate buffers for signed conversion"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c
msgid "Unable to allocate the heap."
msgstr ""
#: ports/espressif/common-hal/busio/I2C.c #: ports/espressif/common-hal/busio/I2C.c
msgid "Unable to create lock" msgid "Unable to create lock"
msgstr "" msgstr ""
@ -2192,11 +2188,12 @@ msgid "Unable to read color palette data"
msgstr "" msgstr ""
#: ports/espressif/common-hal/mdns/Server.c #: ports/espressif/common-hal/mdns/Server.c
#: ports/raspberrypi/common-hal/mdns/Server.c
msgid "Unable to start mDNS query" msgid "Unable to start mDNS query"
msgstr "" msgstr ""
#: shared-bindings/coproc/CoprocMemory.c #: shared-bindings/memorymap/AddressRange.c
msgid "Unable to write" msgid "Unable to write to address."
msgstr "" msgstr ""
#: shared-bindings/nvm/ByteArray.c #: shared-bindings/nvm/ByteArray.c
@ -2267,6 +2264,7 @@ msgid "Unkown error code %d"
msgstr "" msgstr ""
#: shared-bindings/adafruit_pixelbuf/PixelBuf.c #: shared-bindings/adafruit_pixelbuf/PixelBuf.c
#: shared-module/_pixelmap/PixelMap.c
#, c-format #, c-format
msgid "Unmatched number of items on RHS (expected %d, got %d)." msgid "Unmatched number of items on RHS (expected %d, got %d)."
msgstr "" msgstr ""
@ -2351,6 +2349,18 @@ msgstr ""
msgid "Wi-Fi: " msgid "Wi-Fi: "
msgstr "" 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 #: main.c
msgid "Woken up by alarm.\n" msgid "Woken up by alarm.\n"
msgstr "" msgstr ""
@ -2360,13 +2370,48 @@ msgstr ""
msgid "Writes not supported on Characteristic" msgid "Writes not supported on Characteristic"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c #: ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.h
msgid "You are in safe mode because:\n" #: 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 "" msgstr ""
#: supervisor/shared/safe_mode.c #: supervisor/shared/safe_mode.c
msgid "" msgid "You pressed the BOOT button at start up"
"You pressed the reset button during boot. Press again to exit safe mode." 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 "" msgstr ""
#: py/objtype.c #: py/objtype.c
@ -2438,8 +2483,12 @@ msgstr ""
msgid "array has too many dimensions" msgid "array has too many dimensions"
msgstr "" msgstr ""
#: extmod/ulab/code/ndarray.c
msgid "array is too big"
msgstr ""
#: py/objarray.c shared-bindings/alarm/SleepMemory.c #: 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" msgid "array/bytes required on right side"
msgstr "" msgstr ""
@ -2532,10 +2581,6 @@ msgstr ""
msgid "buffer too small for requested bytes" msgid "buffer too small for requested bytes"
msgstr "" msgstr ""
#: shared-bindings/adafruit_pixelbuf/PixelBuf.c
msgid "byteorder is not a string"
msgstr ""
#: py/objarray.c #: py/objarray.c
msgid "bytes length not a multiple of item size" msgid "bytes length not a multiple of item size"
msgstr "" msgstr ""
@ -2577,14 +2622,10 @@ msgstr ""
msgid "can't cancel self" msgid "can't cancel self"
msgstr "" 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" msgid "can't convert %q to %q"
msgstr "" msgstr ""
#: py/runtime.c
msgid "can't convert %q to int"
msgstr ""
#: py/obj.c #: py/obj.c
#, c-format #, c-format
msgid "can't convert %s to complex" msgid "can't convert %s to complex"
@ -2666,6 +2707,10 @@ msgstr ""
msgid "can't set attribute" msgid "can't set attribute"
msgstr "" msgstr ""
#: py/runtime.c
msgid "can't set attribute '%q'"
msgstr ""
#: py/emitnative.c #: py/emitnative.c
msgid "can't store '%q'" msgid "can't store '%q'"
msgstr "" msgstr ""
@ -2768,10 +2813,6 @@ msgstr ""
msgid "comparison of int and uint" msgid "comparison of int and uint"
msgstr "" msgstr ""
#: py/objcomplex.c
msgid "complex division by zero"
msgstr ""
#: py/objfloat.c py/parsenum.c #: py/objfloat.c py/parsenum.c
msgid "complex values not supported" msgid "complex values not supported"
msgstr "" msgstr ""
@ -2874,12 +2915,11 @@ msgstr ""
msgid "div/mod not implemented for uint" msgid "div/mod not implemented for uint"
msgstr "" msgstr ""
#: py/objfloat.c py/objint_mpz.c #: extmod/ulab/code/numpy/create.c
msgid "divide by zero" msgid "divide by zero"
msgstr "" msgstr ""
#: py/modmath.c py/objint_longlong.c py/runtime.c #: py/runtime.c
#: shared-bindings/math/__init__.c
msgid "division by zero" msgid "division by zero"
msgstr "" msgstr ""
@ -2920,9 +2960,9 @@ msgstr ""
msgid "error = 0x%08lX" msgid "error = 0x%08lX"
msgstr "" msgstr ""
#: ports/espressif/common-hal/esp32_camera/Camera.c #: ports/espressif/common-hal/espcamera/Camera.c
msgid "" 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." "documentation for instructions."
msgstr "" msgstr ""
@ -2930,14 +2970,6 @@ msgstr ""
msgid "exceptions must derive from BaseException" msgid "exceptions must derive from BaseException"
msgstr "" 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 #: py/objstr.c
msgid "expected ':' after format specifier" msgid "expected ':' after format specifier"
msgstr "" msgstr ""
@ -3036,10 +3068,6 @@ msgstr ""
msgid "format requires a dict" msgid "format requires a dict"
msgstr "" msgstr ""
#: shared-bindings/microcontroller/Processor.c
msgid "frequency is read-only for this board"
msgstr ""
#: py/objdeque.c #: py/objdeque.c
msgid "full" msgid "full"
msgstr "" msgstr ""
@ -3152,8 +3180,12 @@ msgstr ""
msgid "index is out of bounds" msgid "index is out of bounds"
msgstr "" 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 #: 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 #: shared-bindings/bitmaptools/__init__.c
msgid "index out of range" msgid "index out of range"
msgstr "" msgstr ""
@ -3251,10 +3283,6 @@ msgstr ""
msgid "inputs are not iterable" msgid "inputs are not iterable"
msgstr "" msgstr ""
#: py/parsenum.c
msgid "int() arg 2 must be >= 2 and <= 36"
msgstr ""
#: extmod/ulab/code/numpy/approx.c #: extmod/ulab/code/numpy/approx.c
msgid "interp is defined for 1D iterables of equal length" msgid "interp is defined for 1D iterables of equal length"
msgstr "" msgstr ""
@ -3311,7 +3339,7 @@ msgstr ""
msgid "invalid micropython decorator" msgid "invalid micropython decorator"
msgstr "" msgstr ""
#: ports/espressif/common-hal/esp32_camera/Camera.c #: ports/espressif/common-hal/espcamera/Camera.c
msgid "invalid setting" msgid "invalid setting"
msgstr "" msgstr ""
@ -3336,10 +3364,6 @@ msgstr ""
msgid "invalid syntax for number" msgid "invalid syntax for number"
msgstr "" msgstr ""
#: py/objexcept.c
msgid "invalid traceback"
msgstr ""
#: py/objtype.c #: py/objtype.c
msgid "issubclass() arg 1 must be a class" msgid "issubclass() arg 1 must be a class"
msgstr "" msgstr ""
@ -3396,19 +3420,17 @@ msgstr ""
msgid "local variable referenced before assignment" msgid "local variable referenced before assignment"
msgstr "" msgstr ""
#: py/objint.c
msgid "long int not supported in this build"
msgstr ""
#: ports/espressif/common-hal/canio/CAN.c #: ports/espressif/common-hal/canio/CAN.c
msgid "loopback + silent mode not supported by peripheral" msgid "loopback + silent mode not supported by peripheral"
msgstr "" msgstr ""
#: ports/espressif/common-hal/mdns/Server.c #: ports/espressif/common-hal/mdns/Server.c
#: ports/raspberrypi/common-hal/mdns/Server.c
msgid "mDNS already initialized" msgid "mDNS already initialized"
msgstr "" msgstr ""
#: ports/espressif/common-hal/mdns/Server.c #: ports/espressif/common-hal/mdns/Server.c
#: ports/raspberrypi/common-hal/mdns/Server.c
msgid "mDNS only works with built-in WiFi" msgid "mDNS only works with built-in WiFi"
msgstr "" msgstr ""
@ -3537,6 +3559,10 @@ msgstr ""
msgid "negative shift count" msgid "negative shift count"
msgstr "" msgstr ""
#: shared-bindings/_pixelmap/PixelMap.c
msgid "nested index must be int"
msgstr ""
#: shared-module/sdcardio/SDCard.c #: shared-module/sdcardio/SDCard.c
msgid "no SD card" msgid "no SD card"
msgstr "" msgstr ""
@ -3570,7 +3596,7 @@ msgstr ""
msgid "no response from SD card" msgid "no response from SD card"
msgstr "" 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" msgid "no such attribute"
msgstr "" msgstr ""
@ -3706,6 +3732,10 @@ msgstr ""
msgid "only mono is supported" msgid "only mono is supported"
msgstr "" msgstr ""
#: extmod/ulab/code/numpy/create.c
msgid "only ndarrays can be concatenated"
msgstr ""
#: ports/stm/common-hal/audiobusio/PDMIn.c #: ports/stm/common-hal/audiobusio/PDMIn.c
msgid "only oversample=64 is supported" msgid "only oversample=64 is supported"
msgstr "" msgstr ""
@ -3716,7 +3746,7 @@ msgid "only sample_rate=16000 is supported"
msgstr "" msgstr ""
#: py/objarray.c py/objstr.c py/objstrunicode.c py/objtuple.c #: 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 #: shared-bindings/nvm/ByteArray.c
msgid "only slices with step=1 (aka None) are supported" msgid "only slices with step=1 (aka None) are supported"
msgstr "" msgstr ""
@ -3932,10 +3962,6 @@ msgstr ""
msgid "slice step can't be zero" msgid "slice step can't be zero"
msgstr "" msgstr ""
#: py/objslice.c
msgid "slice step cannot be zero"
msgstr ""
#: py/nativeglue.c #: py/nativeglue.c
msgid "slice unsupported" msgid "slice unsupported"
msgstr "" msgstr ""
@ -3984,10 +4010,6 @@ msgstr ""
msgid "start/end indices" msgid "start/end indices"
msgstr "" msgstr ""
#: shared-bindings/random/__init__.c
msgid "step must be non-zero"
msgstr ""
#: shared-bindings/random/__init__.c #: shared-bindings/random/__init__.c
msgid "stop not reachable from start" msgid "stop not reachable from start"
msgstr "" msgstr ""
@ -3996,10 +4018,6 @@ msgstr ""
msgid "stream operation not supported" msgid "stream operation not supported"
msgstr "" msgstr ""
#: py/objstrunicode.c
msgid "string indices must be integers, not %q"
msgstr ""
#: py/stream.c #: py/stream.c
msgid "string not supported; use bytes or bytearray" msgid "string not supported; use bytes or bytearray"
msgstr "" msgstr ""
@ -4032,10 +4050,6 @@ msgstr ""
msgid "syntax error in uctypes descriptor" msgid "syntax error in uctypes descriptor"
msgstr "" msgstr ""
#: shared-bindings/time/__init__.c
msgid "time.struct_time() takes a 9-sequence"
msgstr ""
#: ports/atmel-samd/common-hal/watchdog/WatchDogTimer.c #: ports/atmel-samd/common-hal/watchdog/WatchDogTimer.c
#: ports/espressif/common-hal/watchdog/WatchDogTimer.c #: ports/espressif/common-hal/watchdog/WatchDogTimer.c
#: ports/nrf/common-hal/watchdog/WatchDogTimer.c #: ports/nrf/common-hal/watchdog/WatchDogTimer.c
@ -4317,10 +4331,6 @@ msgstr ""
msgid "y value out of bounds" msgid "y value out of bounds"
msgstr "" msgstr ""
#: py/objrange.c
msgid "zero step"
msgstr ""
#: extmod/ulab/code/scipy/signal/signal.c #: extmod/ulab/code/scipy/signal/signal.c
msgid "zi must be an ndarray" msgid "zi must be an ndarray"
msgstr "" msgstr ""

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -31,8 +31,20 @@ msgstr ""
#: supervisor/shared/safe_mode.c #: supervisor/shared/safe_mode.c
msgid "" msgid ""
"\n" "\n"
"Please file an issue with the contents of your CIRCUITPY drive at \n" "Please file an issue with your program at https://github.com/adafruit/"
"https://github.com/adafruit/circuitpython/issues\n" "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 "" msgstr ""
#: py/obj.c #: py/obj.c
@ -65,6 +77,11 @@ msgstr ""
msgid "%02X" msgid "%02X"
msgstr "" msgstr ""
#: shared-module/os/getenv.c
#, c-format
msgid "%S"
msgstr ""
#: shared-bindings/rgbmatrix/RGBMatrix.c #: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format #, c-format
msgid "" msgid ""
@ -80,7 +97,7 @@ msgstr ""
#: ports/raspberrypi/common-hal/alarm/__init__.c #: ports/raspberrypi/common-hal/alarm/__init__.c
#: ports/raspberrypi/common-hal/analogio/AnalogOut.c #: ports/raspberrypi/common-hal/analogio/AnalogOut.c
#: ports/raspberrypi/common-hal/rtc/RTC.c ports/stm/common-hal/alarm/__init__.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" msgid "%q"
msgstr "" msgstr ""
@ -100,13 +117,18 @@ msgstr ""
msgid "%q failure: %d" msgid "%q failure: %d"
msgstr "" 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 #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
#: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/digitalio/DigitalInOut.c
#: shared-bindings/microcontroller/Pin.c #: shared-bindings/microcontroller/Pin.c
msgid "%q in use" msgid "%q in use"
msgstr "" msgstr ""
#: py/obj.c py/objstr.c py/objstrunicode.c #: py/objstr.c py/objstrunicode.c
msgid "%q index out of range" msgid "%q index out of range"
msgstr "" msgstr ""
@ -118,7 +140,11 @@ msgstr ""
msgid "%q is %q" msgid "%q is %q"
msgstr "" 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" msgid "%q length must be %d"
msgstr "" msgstr ""
@ -134,10 +160,6 @@ msgstr ""
msgid "%q length must be >= %d" msgid "%q length must be >= %d"
msgstr "" msgstr ""
#: shared-bindings/busio/I2C.c
msgid "%q length must be >= 1"
msgstr ""
#: py/argcheck.c #: py/argcheck.c
msgid "%q must be %d" msgid "%q must be %d"
msgstr "" msgstr ""
@ -159,24 +181,20 @@ msgid "%q must be >= %d"
msgstr "" msgstr ""
#: shared-bindings/analogbufio/BufferedIn.c #: shared-bindings/analogbufio/BufferedIn.c
msgid "%q must be a bytearray or array of type 'H' or 'B'"
msgstr ""
#: shared-bindings/audiocore/RawSample.c #: shared-bindings/audiocore/RawSample.c
msgid "%q must be a bytearray or array of type 'h', 'H', 'b', or 'B'" msgid "%q must be a bytearray or array of type 'h', 'H', 'b', or 'B'"
msgstr "" msgstr ""
#: py/argcheck.c #: ports/raspberrypi/bindings/cyw43/__init__.c py/argcheck.c py/objexcept.c
msgid "%q must be a string" #: shared-bindings/canio/CAN.c shared-bindings/digitalio/Pull.c
msgid "%q must be of type %q or %q, not %q"
msgstr "" msgstr ""
#: py/argcheck.c #: py/argcheck.c py/obj.c py/objstrunicode.c
msgid "%q must be an int" msgid "%q must be of type %q, not %q"
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"
msgstr "" msgstr ""
#: ports/atmel-samd/common-hal/busio/UART.c #: ports/atmel-samd/common-hal/busio/UART.c
@ -189,7 +207,6 @@ msgstr ""
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c #: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/cxd56/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/nrf/common-hal/pulseio/PulseIn.c
#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
#: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c #: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c
@ -201,8 +218,8 @@ msgstr ""
msgid "%q pin invalid" msgid "%q pin invalid"
msgstr "" msgstr ""
#: shared-bindings/usb_hid/Device.c #: py/objrange.c py/objslice.c shared-bindings/random/__init__.c
msgid "%q with a report ID of 0 must be of length 1" msgid "%q step cannot be zero"
msgstr "" msgstr ""
#: py/bc.c py/objnamedtuple.c #: py/bc.c py/objnamedtuple.c
@ -302,7 +319,7 @@ msgstr ""
msgid "'%s' object doesn't support item deletion" msgid "'%s' object doesn't support item deletion"
msgstr "" msgstr ""
#: ports/raspberrypi/common-hal/wifi/Radio.c py/runtime.c #: py/runtime.c
msgid "'%s' object has no attribute '%q'" msgid "'%s' object has no attribute '%q'"
msgstr "" msgstr ""
@ -402,6 +419,10 @@ msgstr ""
msgid "Address must be %d bytes long" msgid "Address must be %d bytes long"
msgstr "" msgstr ""
#: ports/espressif/common-hal/memorymap/AddressRange.c
msgid "Address range not allowed"
msgstr ""
#: ports/espressif/common-hal/canio/CAN.c #: ports/espressif/common-hal/canio/CAN.c
msgid "All CAN peripherals are in use" msgid "All CAN peripherals are in use"
msgstr "" msgstr ""
@ -429,7 +450,6 @@ msgid "All SPI peripherals are in use"
msgstr "" msgstr ""
#: ports/espressif/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c #: 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" msgid "All UART peripherals are in use"
msgstr "" msgstr ""
@ -482,7 +502,7 @@ msgstr ""
msgid "Already have all-matches listener" msgid "Already have all-matches listener"
msgstr "" msgstr ""
#: ports/espressif/common-hal/coproc/__init__.c #: ports/espressif/common-hal/espulp/ULP.c
#: shared-module/memorymonitor/AllocationAlarm.c #: shared-module/memorymonitor/AllocationAlarm.c
#: shared-module/memorymonitor/AllocationSize.c #: shared-module/memorymonitor/AllocationSize.c
msgid "Already running" msgid "Already running"
@ -493,6 +513,11 @@ msgstr ""
msgid "Already scanning for wifi networks" msgid "Already scanning for wifi networks"
msgstr "" msgstr ""
#: shared-module/os/getenv.c
#, c-format
msgid "An error occurred while retrieving '%s':\n"
msgstr ""
#: ports/stm/common-hal/audiopwmio/PWMAudioOut.c #: ports/stm/common-hal/audiopwmio/PWMAudioOut.c
msgid "Another PWMAudioOut is already active" msgid "Another PWMAudioOut is already active"
msgstr "" msgstr ""
@ -506,24 +531,16 @@ msgstr ""
msgid "Array must contain halfwords (type 'H')" msgid "Array must contain halfwords (type 'H')"
msgstr "" 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 #: shared-bindings/nvm/ByteArray.c
msgid "Array values should be single bytes." msgid "Array values should be single bytes."
msgstr "" msgstr ""
#: shared-bindings/microcontroller/Pin.c
msgid "At most %d %q may be specified (not %d)"
msgstr ""
#: shared-module/memorymonitor/AllocationAlarm.c #: shared-module/memorymonitor/AllocationAlarm.c
#, c-format #, c-format
msgid "Attempt to allocate %d blocks" msgid "Attempt to allocate %d blocks"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c
msgid "Attempted heap allocation when VM not running."
msgstr ""
#: ports/raspberrypi/audio_dma.c #: ports/raspberrypi/audio_dma.c
msgid "Audio conversion not implemented" msgid "Audio conversion not implemented"
msgstr "" msgstr ""
@ -572,20 +589,13 @@ msgid "Bitmap size and bits per value must match"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c #: supervisor/shared/safe_mode.c
msgid "Boot device must be first device (interface #0)." msgid "Boot device must be first (interface #0)."
msgstr "" msgstr ""
#: ports/mimxrt10xx/common-hal/busio/UART.c #: ports/mimxrt10xx/common-hal/busio/UART.c
msgid "Both RX and TX required for flow control" msgid "Both RX and TX required for flow control"
msgstr "" 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 #: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c
msgid "Both pins must support hardware interrupts" msgid "Both pins must support hardware interrupts"
msgstr "" msgstr ""
@ -651,11 +661,6 @@ msgstr ""
msgid "Bus pin %d is already in use" msgid "Bus pin %d is already in use"
msgstr "" 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 #: shared-bindings/_bleio/UUID.c
msgid "Byte buffer must be 16 bytes." msgid "Byte buffer must be 16 bytes."
msgstr "" msgstr ""
@ -786,10 +791,6 @@ msgstr ""
msgid "CircuitPython core code crashed hard. Whoops!\n" msgid "CircuitPython core code crashed hard. Whoops!\n"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c
msgid "CircuitPython was unable to allocate the heap."
msgstr ""
#: shared-module/bitbangio/I2C.c #: shared-module/bitbangio/I2C.c
msgid "Clock stretch too long" msgid "Clock stretch too long"
msgstr "" msgstr ""
@ -828,10 +829,6 @@ msgstr ""
msgid "Couldn't allocate decoder" msgid "Couldn't allocate decoder"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c
msgid "Crash into the HardFault_Handler."
msgstr ""
#: ports/stm/common-hal/analogio/AnalogOut.c #: ports/stm/common-hal/analogio/AnalogOut.c
msgid "DAC Channel Init Error" msgid "DAC Channel Init Error"
msgstr "" msgstr ""
@ -894,6 +891,10 @@ msgstr ""
msgid "Drive mode not used when direction is input." msgid "Drive mode not used when direction is input."
msgstr "" msgstr ""
#: py/obj.c
msgid "During handling of the above exception, another exception occurred:"
msgstr ""
#: shared-bindings/aesio/aes.c #: shared-bindings/aesio/aes.c
msgid "ECB only operates on 16 bytes at a time" msgid "ECB only operates on 16 bytes at a time"
msgstr "" msgstr ""
@ -919,24 +920,16 @@ msgstr ""
msgid "Error in regex" msgid "Error in regex"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c
msgid "Error in safemode.py."
msgstr ""
#: shared-bindings/socketpool/Socket.c shared-bindings/ssl/SSLSocket.c #: shared-bindings/socketpool/Socket.c shared-bindings/ssl/SSLSocket.c
msgid "Error: Failure to bind" msgid "Error: Failure to bind"
msgstr "" 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 #: shared-bindings/alarm/__init__.c
msgid "Expected an %q" msgid "Expected a kind of %q"
msgstr "" msgstr ""
#: ports/espressif/common-hal/_bleio/Adapter.c #: ports/espressif/common-hal/_bleio/Adapter.c
@ -1004,13 +997,17 @@ msgid "Failed to write internal flash."
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c #: supervisor/shared/safe_mode.c
msgid "Fatal error." msgid "Fault detected by hardware."
msgstr "" msgstr ""
#: py/moduerrno.c #: py/moduerrno.c
msgid "File exists" msgid "File exists"
msgstr "" msgstr ""
#: shared-module/os/getenv.c
msgid "File not found"
msgstr ""
#: ports/atmel-samd/common-hal/canio/Listener.c #: ports/atmel-samd/common-hal/canio/Listener.c
#: ports/espressif/common-hal/canio/Listener.c #: ports/espressif/common-hal/canio/Listener.c
#: ports/stm/common-hal/canio/Listener.c #: ports/stm/common-hal/canio/Listener.c
@ -1025,7 +1022,6 @@ msgstr ""
msgid "Firmware is invalid" msgid "Firmware is invalid"
msgstr "" msgstr ""
#: ports/espressif/common-hal/coproc/Coproc.c
#: ports/espressif/common-hal/dualbank/__init__.c #: ports/espressif/common-hal/dualbank/__init__.c
msgid "Firmware is too big" msgid "Firmware is too big"
msgstr "" msgstr ""
@ -1067,6 +1063,8 @@ msgstr ""
#: shared-bindings/displayio/Display.c #: shared-bindings/displayio/Display.c
#: shared-bindings/displayio/EPaperDisplay.c #: shared-bindings/displayio/EPaperDisplay.c
#: shared-bindings/framebufferio/FramebufferDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c
#: shared-module/displayio/Display.c
#: shared-module/framebufferio/FramebufferDisplay.c
msgid "Group already used" msgid "Group already used"
msgstr "" msgstr ""
@ -1087,6 +1085,15 @@ msgstr ""
msgid "Hardware in use, try alternative pins" msgid "Hardware in use, try alternative pins"
msgstr "" 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 #: extmod/vfs_posix_file.c py/objstringio.c
msgid "I/O operation on closed file" msgid "I/O operation on closed file"
msgstr "" msgstr ""
@ -1104,11 +1111,6 @@ msgstr ""
msgid "I2SOut not available" msgid "I2SOut not available"
msgstr "" msgstr ""
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
msgstr ""
#: ports/raspberrypi/bindings/rp2pio/StateMachine.c #: ports/raspberrypi/bindings/rp2pio/StateMachine.c
msgid "In-buffer elements must be <= 4 bytes long" msgid "In-buffer elements must be <= 4 bytes long"
msgstr "" msgstr ""
@ -1193,6 +1195,7 @@ msgid "Internal define error"
msgstr "" msgstr ""
#: ports/espressif/common-hal/paralleldisplay/ParallelBus.c #: ports/espressif/common-hal/paralleldisplay/ParallelBus.c
#: shared-module/os/getenv.c
msgid "Internal error" msgid "Internal error"
msgstr "" msgstr ""
@ -1205,6 +1208,10 @@ msgstr ""
msgid "Internal watchdog timer expired." msgid "Internal watchdog timer expired."
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c
msgid "Interrupt error."
msgstr ""
#: py/argcheck.c shared-bindings/digitalio/DigitalInOut.c #: py/argcheck.c shared-bindings/digitalio/DigitalInOut.c
msgid "Invalid %q" msgid "Invalid %q"
msgstr "" msgstr ""
@ -1239,6 +1246,11 @@ msgstr ""
msgid "Invalid bits per value" msgid "Invalid bits per value"
msgstr "" msgstr ""
#: shared-module/os/getenv.c
#, c-format
msgid "Invalid byte %.*s"
msgstr ""
#: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c
#, c-format #, c-format
msgid "Invalid data_pins[%d]" msgid "Invalid data_pins[%d]"
@ -1248,18 +1260,10 @@ msgstr ""
msgid "Invalid format chunk size" msgid "Invalid format chunk size"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c
msgid "Invalid memory access."
msgstr ""
#: ports/espressif/common-hal/wifi/Radio.c #: ports/espressif/common-hal/wifi/Radio.c
msgid "Invalid multicast MAC address" msgid "Invalid multicast MAC address"
msgstr "" msgstr ""
#: shared-bindings/busio/UART.c
msgid "Invalid pins"
msgstr ""
#: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c
msgid "Invalid size" msgid "Invalid size"
msgstr "" msgstr ""
@ -1273,10 +1277,18 @@ msgstr ""
msgid "Invalid state" msgid "Invalid state"
msgstr "" msgstr ""
#: shared-module/os/getenv.c
msgid "Invalid unicode escape"
msgstr ""
#: shared-bindings/aesio/aes.c #: shared-bindings/aesio/aes.c
msgid "Key must be 16, 24, or 32 bytes long" msgid "Key must be 16, 24, or 32 bytes long"
msgstr "" msgstr ""
#: shared-module/os/getenv.c
msgid "Key not found"
msgstr ""
#: shared-module/is31fl3741/FrameBuffer.c #: shared-module/is31fl3741/FrameBuffer.c
msgid "LED mappings must match display size" msgid "LED mappings must match display size"
msgstr "" msgstr ""
@ -1383,6 +1395,10 @@ msgstr ""
msgid "NVS Error" msgid "NVS Error"
msgstr "" msgstr ""
#: shared-bindings/socketpool/SocketPool.c
msgid "Name or service not known"
msgstr ""
#: py/qstr.c #: py/qstr.c
msgid "Name too long" msgid "Name too long"
msgstr "" msgstr ""
@ -1497,11 +1513,6 @@ msgstr ""
msgid "No long integer support" msgid "No long integer support"
msgstr "" msgstr ""
#: shared-module/usb_hid/__init__.c
#, c-format
msgid "No more than %d HID devices allowed"
msgstr ""
#: shared-bindings/wifi/Radio.c #: shared-bindings/wifi/Radio.c
msgid "No network with that ssid" msgid "No network with that ssid"
msgstr "" msgstr ""
@ -1537,10 +1548,6 @@ msgstr ""
msgid "No timer available" msgid "No timer available"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c
msgid "Nordic system firmware failure assertion."
msgstr ""
#: ports/nrf/common-hal/_bleio/__init__.c #: ports/nrf/common-hal/_bleio/__init__.c
msgid "Nordic system firmware out of memory" msgid "Nordic system firmware out of memory"
msgstr "" msgstr ""
@ -1560,10 +1567,6 @@ msgstr ""
msgid "Not playing" msgid "Not playing"
msgstr "" msgstr ""
#: shared-bindings/_bleio/__init__.c
msgid "Not settable"
msgstr ""
#: ports/espressif/common-hal/paralleldisplay/ParallelBus.c #: ports/espressif/common-hal/paralleldisplay/ParallelBus.c
#, c-format #, c-format
msgid "Number of data_pins must be 8 or 16, not %d" msgid "Number of data_pins must be 8 or 16, not %d"
@ -1626,11 +1629,14 @@ msgid ""
"%d bpp given" "%d bpp given"
msgstr "" msgstr ""
#: ports/espressif/common-hal/alarm/coproc/CoprocAlarm.c
#: ports/espressif/common-hal/alarm/touch/TouchAlarm.c #: ports/espressif/common-hal/alarm/touch/TouchAlarm.c
msgid "Only one %q can be set in deep sleep." msgid "Only one %q can be set in deep sleep."
msgstr "" msgstr ""
#: ports/espressif/common-hal/espulp/ULPAlarm.c
msgid "Only one %q can be set."
msgstr ""
#: ports/espressif/common-hal/i2ctarget/I2CTarget.c #: ports/espressif/common-hal/i2ctarget/I2CTarget.c
#: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c #: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c
msgid "Only one address is allowed" msgid "Only one address is allowed"
@ -1663,6 +1669,10 @@ msgstr ""
msgid "Operation timed out" msgid "Operation timed out"
msgstr "" 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 #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c
msgid "Out of memory" msgid "Out of memory"
msgstr "" msgstr ""
@ -1786,6 +1796,10 @@ msgstr ""
msgid "Program size invalid" msgid "Program size invalid"
msgstr "" msgstr ""
#: ports/espressif/common-hal/espulp/ULP.c
msgid "Program too long"
msgstr ""
#: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/digitalio/DigitalInOut.c
msgid "Pull not used when direction is output." msgid "Pull not used when direction is output."
msgstr "" msgstr ""
@ -1825,8 +1839,9 @@ msgstr ""
msgid "Random number generation error" msgid "Random number generation error"
msgstr "" msgstr ""
#: shared-bindings/_bleio/__init__.c
#: shared-bindings/memorymonitor/AllocationSize.c #: shared-bindings/memorymonitor/AllocationSize.c
#: shared-bindings/pulseio/PulseIn.c #: shared-bindings/pulseio/PulseIn.c shared-module/displayio/Bitmap.c
msgid "Read-only" msgid "Read-only"
msgstr "" msgstr ""
@ -1834,10 +1849,6 @@ msgstr ""
msgid "Read-only filesystem" msgid "Read-only filesystem"
msgstr "" msgstr ""
#: shared-module/displayio/Bitmap.c
msgid "Read-only object"
msgstr ""
#: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c
msgid "Received response was invalid" msgid "Received response was invalid"
msgstr "" msgstr ""
@ -1930,7 +1941,7 @@ msgstr ""
msgid "Sleep Memory not available" msgid "Sleep Memory not available"
msgstr "" 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 #: shared-bindings/nvm/ByteArray.c
msgid "Slice and value different lengths." msgid "Slice and value different lengths."
msgstr "" msgstr ""
@ -1967,6 +1978,10 @@ msgstr ""
msgid "Stereo right must be on PWM channel B" msgid "Stereo right must be on PWM channel B"
msgstr "" 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 #: ports/mimxrt10xx/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
msgid "Supply at least one UART pin" msgid "Supply at least one UART pin"
msgstr "" msgstr ""
@ -1984,35 +1999,11 @@ msgid "Temperature read timed out"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c #: 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 "" msgstr ""
#: supervisor/shared/safe_mode.c #: py/obj.c
msgid "" msgid "The above exception was the direct cause of the following exception:"
"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"
msgstr "" msgstr ""
#: shared-bindings/rgbmatrix/RGBMatrix.c #: shared-bindings/rgbmatrix/RGBMatrix.c
@ -2020,10 +2011,7 @@ msgid "The length of rgb_pins must be 6, 12, 18, 24, or 30"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c #: supervisor/shared/safe_mode.c
msgid "" msgid "The power dipped. Make sure you are providing enough power."
"The microcontroller's power dipped. Make sure your power supply provides\n"
"enough power for the whole circuit and press reset (after ejecting "
"CIRCUITPY)."
msgstr "" msgstr ""
#: shared-module/audiomixer/MixerVoice.c #: shared-module/audiomixer/MixerVoice.c
@ -2042,6 +2030,10 @@ msgstr ""
msgid "The sample's signedness does not match the mixer's" msgid "The sample's signedness does not match the mixer's"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c
msgid "Third-party firmware fatal error."
msgstr ""
#: shared-module/imagecapture/ParallelImageCapture.c #: shared-module/imagecapture/ParallelImageCapture.c
msgid "This microcontroller does not support continuous capture." msgid "This microcontroller does not support continuous capture."
msgstr "" msgstr ""
@ -2074,10 +2066,6 @@ msgstr ""
msgid "Timeout is too long: Maximum timeout length is %d seconds" msgid "Timeout is too long: Maximum timeout length is %d seconds"
msgstr "" 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 #: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
msgid "Too many channels in sample" msgid "Too many channels in sample"
msgstr "" msgstr ""
@ -2122,6 +2110,10 @@ msgstr ""
msgid "UART init" msgid "UART init"
msgstr "" msgstr ""
#: ports/raspberrypi/common-hal/busio/UART.c
msgid "UART peripheral in use"
msgstr ""
#: ports/stm/common-hal/busio/UART.c #: ports/stm/common-hal/busio/UART.c
msgid "UART re-init" msgid "UART re-init"
msgstr "" msgstr ""
@ -2169,6 +2161,10 @@ msgstr ""
msgid "Unable to allocate buffers for signed conversion" msgid "Unable to allocate buffers for signed conversion"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c
msgid "Unable to allocate the heap."
msgstr ""
#: ports/espressif/common-hal/busio/I2C.c #: ports/espressif/common-hal/busio/I2C.c
msgid "Unable to create lock" msgid "Unable to create lock"
msgstr "" msgstr ""
@ -2192,11 +2188,12 @@ msgid "Unable to read color palette data"
msgstr "" msgstr ""
#: ports/espressif/common-hal/mdns/Server.c #: ports/espressif/common-hal/mdns/Server.c
#: ports/raspberrypi/common-hal/mdns/Server.c
msgid "Unable to start mDNS query" msgid "Unable to start mDNS query"
msgstr "" msgstr ""
#: shared-bindings/coproc/CoprocMemory.c #: shared-bindings/memorymap/AddressRange.c
msgid "Unable to write" msgid "Unable to write to address."
msgstr "" msgstr ""
#: shared-bindings/nvm/ByteArray.c #: shared-bindings/nvm/ByteArray.c
@ -2267,6 +2264,7 @@ msgid "Unkown error code %d"
msgstr "" msgstr ""
#: shared-bindings/adafruit_pixelbuf/PixelBuf.c #: shared-bindings/adafruit_pixelbuf/PixelBuf.c
#: shared-module/_pixelmap/PixelMap.c
#, c-format #, c-format
msgid "Unmatched number of items on RHS (expected %d, got %d)." msgid "Unmatched number of items on RHS (expected %d, got %d)."
msgstr "" msgstr ""
@ -2351,6 +2349,18 @@ msgstr ""
msgid "Wi-Fi: " msgid "Wi-Fi: "
msgstr "" 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 #: main.c
msgid "Woken up by alarm.\n" msgid "Woken up by alarm.\n"
msgstr "" msgstr ""
@ -2360,13 +2370,48 @@ msgstr ""
msgid "Writes not supported on Characteristic" msgid "Writes not supported on Characteristic"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c #: ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.h
msgid "You are in safe mode because:\n" #: 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 "" msgstr ""
#: supervisor/shared/safe_mode.c #: supervisor/shared/safe_mode.c
msgid "" msgid "You pressed the BOOT button at start up"
"You pressed the reset button during boot. Press again to exit safe mode." 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 "" msgstr ""
#: py/objtype.c #: py/objtype.c
@ -2438,8 +2483,12 @@ msgstr ""
msgid "array has too many dimensions" msgid "array has too many dimensions"
msgstr "" msgstr ""
#: extmod/ulab/code/ndarray.c
msgid "array is too big"
msgstr ""
#: py/objarray.c shared-bindings/alarm/SleepMemory.c #: 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" msgid "array/bytes required on right side"
msgstr "" msgstr ""
@ -2532,10 +2581,6 @@ msgstr ""
msgid "buffer too small for requested bytes" msgid "buffer too small for requested bytes"
msgstr "" msgstr ""
#: shared-bindings/adafruit_pixelbuf/PixelBuf.c
msgid "byteorder is not a string"
msgstr ""
#: py/objarray.c #: py/objarray.c
msgid "bytes length not a multiple of item size" msgid "bytes length not a multiple of item size"
msgstr "" msgstr ""
@ -2577,14 +2622,10 @@ msgstr ""
msgid "can't cancel self" msgid "can't cancel self"
msgstr "" 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" msgid "can't convert %q to %q"
msgstr "" msgstr ""
#: py/runtime.c
msgid "can't convert %q to int"
msgstr ""
#: py/obj.c #: py/obj.c
#, c-format #, c-format
msgid "can't convert %s to complex" msgid "can't convert %s to complex"
@ -2666,6 +2707,10 @@ msgstr ""
msgid "can't set attribute" msgid "can't set attribute"
msgstr "" msgstr ""
#: py/runtime.c
msgid "can't set attribute '%q'"
msgstr ""
#: py/emitnative.c #: py/emitnative.c
msgid "can't store '%q'" msgid "can't store '%q'"
msgstr "" msgstr ""
@ -2768,10 +2813,6 @@ msgstr ""
msgid "comparison of int and uint" msgid "comparison of int and uint"
msgstr "" msgstr ""
#: py/objcomplex.c
msgid "complex division by zero"
msgstr ""
#: py/objfloat.c py/parsenum.c #: py/objfloat.c py/parsenum.c
msgid "complex values not supported" msgid "complex values not supported"
msgstr "" msgstr ""
@ -2874,12 +2915,11 @@ msgstr ""
msgid "div/mod not implemented for uint" msgid "div/mod not implemented for uint"
msgstr "" msgstr ""
#: py/objfloat.c py/objint_mpz.c #: extmod/ulab/code/numpy/create.c
msgid "divide by zero" msgid "divide by zero"
msgstr "" msgstr ""
#: py/modmath.c py/objint_longlong.c py/runtime.c #: py/runtime.c
#: shared-bindings/math/__init__.c
msgid "division by zero" msgid "division by zero"
msgstr "" msgstr ""
@ -2920,9 +2960,9 @@ msgstr ""
msgid "error = 0x%08lX" msgid "error = 0x%08lX"
msgstr "" msgstr ""
#: ports/espressif/common-hal/esp32_camera/Camera.c #: ports/espressif/common-hal/espcamera/Camera.c
msgid "" 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." "documentation for instructions."
msgstr "" msgstr ""
@ -2930,14 +2970,6 @@ msgstr ""
msgid "exceptions must derive from BaseException" msgid "exceptions must derive from BaseException"
msgstr "" 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 #: py/objstr.c
msgid "expected ':' after format specifier" msgid "expected ':' after format specifier"
msgstr "" msgstr ""
@ -3036,10 +3068,6 @@ msgstr ""
msgid "format requires a dict" msgid "format requires a dict"
msgstr "" msgstr ""
#: shared-bindings/microcontroller/Processor.c
msgid "frequency is read-only for this board"
msgstr ""
#: py/objdeque.c #: py/objdeque.c
msgid "full" msgid "full"
msgstr "" msgstr ""
@ -3152,8 +3180,12 @@ msgstr ""
msgid "index is out of bounds" msgid "index is out of bounds"
msgstr "" 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 #: 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 #: shared-bindings/bitmaptools/__init__.c
msgid "index out of range" msgid "index out of range"
msgstr "" msgstr ""
@ -3251,10 +3283,6 @@ msgstr ""
msgid "inputs are not iterable" msgid "inputs are not iterable"
msgstr "" msgstr ""
#: py/parsenum.c
msgid "int() arg 2 must be >= 2 and <= 36"
msgstr ""
#: extmod/ulab/code/numpy/approx.c #: extmod/ulab/code/numpy/approx.c
msgid "interp is defined for 1D iterables of equal length" msgid "interp is defined for 1D iterables of equal length"
msgstr "" msgstr ""
@ -3311,7 +3339,7 @@ msgstr ""
msgid "invalid micropython decorator" msgid "invalid micropython decorator"
msgstr "" msgstr ""
#: ports/espressif/common-hal/esp32_camera/Camera.c #: ports/espressif/common-hal/espcamera/Camera.c
msgid "invalid setting" msgid "invalid setting"
msgstr "" msgstr ""
@ -3336,10 +3364,6 @@ msgstr ""
msgid "invalid syntax for number" msgid "invalid syntax for number"
msgstr "" msgstr ""
#: py/objexcept.c
msgid "invalid traceback"
msgstr ""
#: py/objtype.c #: py/objtype.c
msgid "issubclass() arg 1 must be a class" msgid "issubclass() arg 1 must be a class"
msgstr "" msgstr ""
@ -3396,19 +3420,17 @@ msgstr ""
msgid "local variable referenced before assignment" msgid "local variable referenced before assignment"
msgstr "" msgstr ""
#: py/objint.c
msgid "long int not supported in this build"
msgstr ""
#: ports/espressif/common-hal/canio/CAN.c #: ports/espressif/common-hal/canio/CAN.c
msgid "loopback + silent mode not supported by peripheral" msgid "loopback + silent mode not supported by peripheral"
msgstr "" msgstr ""
#: ports/espressif/common-hal/mdns/Server.c #: ports/espressif/common-hal/mdns/Server.c
#: ports/raspberrypi/common-hal/mdns/Server.c
msgid "mDNS already initialized" msgid "mDNS already initialized"
msgstr "" msgstr ""
#: ports/espressif/common-hal/mdns/Server.c #: ports/espressif/common-hal/mdns/Server.c
#: ports/raspberrypi/common-hal/mdns/Server.c
msgid "mDNS only works with built-in WiFi" msgid "mDNS only works with built-in WiFi"
msgstr "" msgstr ""
@ -3537,6 +3559,10 @@ msgstr ""
msgid "negative shift count" msgid "negative shift count"
msgstr "" msgstr ""
#: shared-bindings/_pixelmap/PixelMap.c
msgid "nested index must be int"
msgstr ""
#: shared-module/sdcardio/SDCard.c #: shared-module/sdcardio/SDCard.c
msgid "no SD card" msgid "no SD card"
msgstr "" msgstr ""
@ -3570,7 +3596,7 @@ msgstr ""
msgid "no response from SD card" msgid "no response from SD card"
msgstr "" 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" msgid "no such attribute"
msgstr "" msgstr ""
@ -3706,6 +3732,10 @@ msgstr ""
msgid "only mono is supported" msgid "only mono is supported"
msgstr "" msgstr ""
#: extmod/ulab/code/numpy/create.c
msgid "only ndarrays can be concatenated"
msgstr ""
#: ports/stm/common-hal/audiobusio/PDMIn.c #: ports/stm/common-hal/audiobusio/PDMIn.c
msgid "only oversample=64 is supported" msgid "only oversample=64 is supported"
msgstr "" msgstr ""
@ -3716,7 +3746,7 @@ msgid "only sample_rate=16000 is supported"
msgstr "" msgstr ""
#: py/objarray.c py/objstr.c py/objstrunicode.c py/objtuple.c #: 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 #: shared-bindings/nvm/ByteArray.c
msgid "only slices with step=1 (aka None) are supported" msgid "only slices with step=1 (aka None) are supported"
msgstr "" msgstr ""
@ -3932,10 +3962,6 @@ msgstr ""
msgid "slice step can't be zero" msgid "slice step can't be zero"
msgstr "" msgstr ""
#: py/objslice.c
msgid "slice step cannot be zero"
msgstr ""
#: py/nativeglue.c #: py/nativeglue.c
msgid "slice unsupported" msgid "slice unsupported"
msgstr "" msgstr ""
@ -3984,10 +4010,6 @@ msgstr ""
msgid "start/end indices" msgid "start/end indices"
msgstr "" msgstr ""
#: shared-bindings/random/__init__.c
msgid "step must be non-zero"
msgstr ""
#: shared-bindings/random/__init__.c #: shared-bindings/random/__init__.c
msgid "stop not reachable from start" msgid "stop not reachable from start"
msgstr "" msgstr ""
@ -3996,10 +4018,6 @@ msgstr ""
msgid "stream operation not supported" msgid "stream operation not supported"
msgstr "" msgstr ""
#: py/objstrunicode.c
msgid "string indices must be integers, not %q"
msgstr ""
#: py/stream.c #: py/stream.c
msgid "string not supported; use bytes or bytearray" msgid "string not supported; use bytes or bytearray"
msgstr "" msgstr ""
@ -4032,10 +4050,6 @@ msgstr ""
msgid "syntax error in uctypes descriptor" msgid "syntax error in uctypes descriptor"
msgstr "" msgstr ""
#: shared-bindings/time/__init__.c
msgid "time.struct_time() takes a 9-sequence"
msgstr ""
#: ports/atmel-samd/common-hal/watchdog/WatchDogTimer.c #: ports/atmel-samd/common-hal/watchdog/WatchDogTimer.c
#: ports/espressif/common-hal/watchdog/WatchDogTimer.c #: ports/espressif/common-hal/watchdog/WatchDogTimer.c
#: ports/nrf/common-hal/watchdog/WatchDogTimer.c #: ports/nrf/common-hal/watchdog/WatchDogTimer.c
@ -4317,10 +4331,6 @@ msgstr ""
msgid "y value out of bounds" msgid "y value out of bounds"
msgstr "" msgstr ""
#: py/objrange.c
msgid "zero step"
msgstr ""
#: extmod/ulab/code/scipy/signal/signal.c #: extmod/ulab/code/scipy/signal/signal.c
msgid "zi must be an ndarray" msgid "zi must be an ndarray"
msgstr "" msgstr ""

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -32,8 +32,20 @@ msgstr ""
#: supervisor/shared/safe_mode.c #: supervisor/shared/safe_mode.c
msgid "" msgid ""
"\n" "\n"
"Please file an issue with the contents of your CIRCUITPY drive at \n" "Please file an issue with your program at https://github.com/adafruit/"
"https://github.com/adafruit/circuitpython/issues\n" "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 "" msgstr ""
#: py/obj.c #: py/obj.c
@ -66,6 +78,11 @@ msgstr "%%c 전수(int)또는 캐릭터(char)필요합니다"
msgid "%02X" msgid "%02X"
msgstr "" msgstr ""
#: shared-module/os/getenv.c
#, c-format
msgid "%S"
msgstr ""
#: shared-bindings/rgbmatrix/RGBMatrix.c #: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format #, c-format
msgid "" msgid ""
@ -81,7 +98,7 @@ msgstr ""
#: ports/raspberrypi/common-hal/alarm/__init__.c #: ports/raspberrypi/common-hal/alarm/__init__.c
#: ports/raspberrypi/common-hal/analogio/AnalogOut.c #: ports/raspberrypi/common-hal/analogio/AnalogOut.c
#: ports/raspberrypi/common-hal/rtc/RTC.c ports/stm/common-hal/alarm/__init__.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" msgid "%q"
msgstr "" msgstr ""
@ -101,13 +118,18 @@ msgstr ""
msgid "%q failure: %d" msgid "%q failure: %d"
msgstr "" 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 #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
#: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/digitalio/DigitalInOut.c
#: shared-bindings/microcontroller/Pin.c #: shared-bindings/microcontroller/Pin.c
msgid "%q in use" msgid "%q in use"
msgstr "%q 사용 중입니다" msgstr "%q 사용 중입니다"
#: py/obj.c py/objstr.c py/objstrunicode.c #: py/objstr.c py/objstrunicode.c
msgid "%q index out of range" msgid "%q index out of range"
msgstr "%q 인덱스 범위를 벗어났습니다" msgstr "%q 인덱스 범위를 벗어났습니다"
@ -119,7 +141,11 @@ msgstr ""
msgid "%q is %q" msgid "%q is %q"
msgstr "" 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" msgid "%q length must be %d"
msgstr "" msgstr ""
@ -135,10 +161,6 @@ msgstr ""
msgid "%q length must be >= %d" msgid "%q length must be >= %d"
msgstr "" msgstr ""
#: shared-bindings/busio/I2C.c
msgid "%q length must be >= 1"
msgstr ""
#: py/argcheck.c #: py/argcheck.c
msgid "%q must be %d" msgid "%q must be %d"
msgstr "" msgstr ""
@ -160,24 +182,20 @@ msgid "%q must be >= %d"
msgstr "" msgstr ""
#: shared-bindings/analogbufio/BufferedIn.c #: shared-bindings/analogbufio/BufferedIn.c
msgid "%q must be a bytearray or array of type 'H' or 'B'"
msgstr ""
#: shared-bindings/audiocore/RawSample.c #: shared-bindings/audiocore/RawSample.c
msgid "%q must be a bytearray or array of type 'h', 'H', 'b', or 'B'" msgid "%q must be a bytearray or array of type 'h', 'H', 'b', or 'B'"
msgstr "" msgstr ""
#: py/argcheck.c #: ports/raspberrypi/bindings/cyw43/__init__.c py/argcheck.c py/objexcept.c
msgid "%q must be a string" #: shared-bindings/canio/CAN.c shared-bindings/digitalio/Pull.c
msgid "%q must be of type %q or %q, not %q"
msgstr "" msgstr ""
#: py/argcheck.c #: py/argcheck.c py/obj.c py/objstrunicode.c
msgid "%q must be an int" msgid "%q must be of type %q, not %q"
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"
msgstr "" msgstr ""
#: ports/atmel-samd/common-hal/busio/UART.c #: ports/atmel-samd/common-hal/busio/UART.c
@ -190,7 +208,6 @@ msgstr ""
#: ports/atmel-samd/common-hal/pulseio/PulseIn.c #: ports/atmel-samd/common-hal/pulseio/PulseIn.c
#: ports/cxd56/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/nrf/common-hal/pulseio/PulseIn.c
#: ports/raspberrypi/common-hal/rp2pio/StateMachine.c #: ports/raspberrypi/common-hal/rp2pio/StateMachine.c
#: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c #: ports/stm/common-hal/pulseio/PulseIn.c py/argcheck.c
@ -202,8 +219,8 @@ msgstr ""
msgid "%q pin invalid" msgid "%q pin invalid"
msgstr "" msgstr ""
#: shared-bindings/usb_hid/Device.c #: py/objrange.c py/objslice.c shared-bindings/random/__init__.c
msgid "%q with a report ID of 0 must be of length 1" msgid "%q step cannot be zero"
msgstr "" msgstr ""
#: py/bc.c py/objnamedtuple.c #: py/bc.c py/objnamedtuple.c
@ -303,7 +320,7 @@ msgstr ""
msgid "'%s' object doesn't support item deletion" msgid "'%s' object doesn't support item deletion"
msgstr "" msgstr ""
#: ports/raspberrypi/common-hal/wifi/Radio.c py/runtime.c #: py/runtime.c
msgid "'%s' object has no attribute '%q'" msgid "'%s' object has no attribute '%q'"
msgstr "" msgstr ""
@ -403,6 +420,10 @@ msgstr ""
msgid "Address must be %d bytes long" msgid "Address must be %d bytes long"
msgstr "" msgstr ""
#: ports/espressif/common-hal/memorymap/AddressRange.c
msgid "Address range not allowed"
msgstr ""
#: ports/espressif/common-hal/canio/CAN.c #: ports/espressif/common-hal/canio/CAN.c
msgid "All CAN peripherals are in use" msgid "All CAN peripherals are in use"
msgstr "" msgstr ""
@ -430,7 +451,6 @@ msgid "All SPI peripherals are in use"
msgstr "사용중인 모든 SPI주변 기기" msgstr "사용중인 모든 SPI주변 기기"
#: ports/espressif/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c #: 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" msgid "All UART peripherals are in use"
msgstr "사용중인 모든 UART주변 기기" msgstr "사용중인 모든 UART주변 기기"
@ -483,7 +503,7 @@ msgstr ""
msgid "Already have all-matches listener" msgid "Already have all-matches listener"
msgstr "" msgstr ""
#: ports/espressif/common-hal/coproc/__init__.c #: ports/espressif/common-hal/espulp/ULP.c
#: shared-module/memorymonitor/AllocationAlarm.c #: shared-module/memorymonitor/AllocationAlarm.c
#: shared-module/memorymonitor/AllocationSize.c #: shared-module/memorymonitor/AllocationSize.c
msgid "Already running" msgid "Already running"
@ -494,6 +514,11 @@ msgstr ""
msgid "Already scanning for wifi networks" msgid "Already scanning for wifi networks"
msgstr "" msgstr ""
#: shared-module/os/getenv.c
#, c-format
msgid "An error occurred while retrieving '%s':\n"
msgstr ""
#: ports/stm/common-hal/audiopwmio/PWMAudioOut.c #: ports/stm/common-hal/audiopwmio/PWMAudioOut.c
msgid "Another PWMAudioOut is already active" msgid "Another PWMAudioOut is already active"
msgstr "" msgstr ""
@ -507,24 +532,16 @@ msgstr ""
msgid "Array must contain halfwords (type 'H')" msgid "Array must contain halfwords (type 'H')"
msgstr "" 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 #: shared-bindings/nvm/ByteArray.c
msgid "Array values should be single bytes." msgid "Array values should be single bytes."
msgstr "" msgstr ""
#: shared-bindings/microcontroller/Pin.c
msgid "At most %d %q may be specified (not %d)"
msgstr ""
#: shared-module/memorymonitor/AllocationAlarm.c #: shared-module/memorymonitor/AllocationAlarm.c
#, c-format #, c-format
msgid "Attempt to allocate %d blocks" msgid "Attempt to allocate %d blocks"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c
msgid "Attempted heap allocation when VM not running."
msgstr ""
#: ports/raspberrypi/audio_dma.c #: ports/raspberrypi/audio_dma.c
msgid "Audio conversion not implemented" msgid "Audio conversion not implemented"
msgstr "" msgstr ""
@ -575,20 +592,13 @@ msgid "Bitmap size and bits per value must match"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c #: supervisor/shared/safe_mode.c
msgid "Boot device must be first device (interface #0)." msgid "Boot device must be first (interface #0)."
msgstr "" msgstr ""
#: ports/mimxrt10xx/common-hal/busio/UART.c #: ports/mimxrt10xx/common-hal/busio/UART.c
msgid "Both RX and TX required for flow control" msgid "Both RX and TX required for flow control"
msgstr "" 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 #: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c
msgid "Both pins must support hardware interrupts" msgid "Both pins must support hardware interrupts"
msgstr "" msgstr ""
@ -654,11 +664,6 @@ msgstr ""
msgid "Bus pin %d is already in use" msgid "Bus pin %d is already in use"
msgstr "" 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 #: shared-bindings/_bleio/UUID.c
msgid "Byte buffer must be 16 bytes." msgid "Byte buffer must be 16 bytes."
msgstr "잘못된 크기의 버퍼. 16 바이트 여야합니다." msgstr "잘못된 크기의 버퍼. 16 바이트 여야합니다."
@ -789,10 +794,6 @@ msgstr ""
msgid "CircuitPython core code crashed hard. Whoops!\n" msgid "CircuitPython core code crashed hard. Whoops!\n"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c
msgid "CircuitPython was unable to allocate the heap."
msgstr ""
#: shared-module/bitbangio/I2C.c #: shared-module/bitbangio/I2C.c
msgid "Clock stretch too long" msgid "Clock stretch too long"
msgstr "" msgstr ""
@ -831,10 +832,6 @@ msgstr ""
msgid "Couldn't allocate decoder" msgid "Couldn't allocate decoder"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c
msgid "Crash into the HardFault_Handler."
msgstr ""
#: ports/stm/common-hal/analogio/AnalogOut.c #: ports/stm/common-hal/analogio/AnalogOut.c
msgid "DAC Channel Init Error" msgid "DAC Channel Init Error"
msgstr "" msgstr ""
@ -897,6 +894,10 @@ msgstr ""
msgid "Drive mode not used when direction is input." msgid "Drive mode not used when direction is input."
msgstr "" msgstr ""
#: py/obj.c
msgid "During handling of the above exception, another exception occurred:"
msgstr ""
#: shared-bindings/aesio/aes.c #: shared-bindings/aesio/aes.c
msgid "ECB only operates on 16 bytes at a time" msgid "ECB only operates on 16 bytes at a time"
msgstr "" msgstr ""
@ -922,24 +923,16 @@ msgstr ""
msgid "Error in regex" msgid "Error in regex"
msgstr "Regex에 오류가 있습니다." msgstr "Regex에 오류가 있습니다."
#: supervisor/shared/safe_mode.c
msgid "Error in safemode.py."
msgstr ""
#: shared-bindings/socketpool/Socket.c shared-bindings/ssl/SSLSocket.c #: shared-bindings/socketpool/Socket.c shared-bindings/ssl/SSLSocket.c
msgid "Error: Failure to bind" msgid "Error: Failure to bind"
msgstr "" 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 #: shared-bindings/alarm/__init__.c
msgid "Expected an %q" msgid "Expected a kind of %q"
msgstr "" msgstr ""
#: ports/espressif/common-hal/_bleio/Adapter.c #: ports/espressif/common-hal/_bleio/Adapter.c
@ -1007,13 +1000,17 @@ msgid "Failed to write internal flash."
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c #: supervisor/shared/safe_mode.c
msgid "Fatal error." msgid "Fault detected by hardware."
msgstr "" msgstr ""
#: py/moduerrno.c #: py/moduerrno.c
msgid "File exists" msgid "File exists"
msgstr "" msgstr ""
#: shared-module/os/getenv.c
msgid "File not found"
msgstr ""
#: ports/atmel-samd/common-hal/canio/Listener.c #: ports/atmel-samd/common-hal/canio/Listener.c
#: ports/espressif/common-hal/canio/Listener.c #: ports/espressif/common-hal/canio/Listener.c
#: ports/stm/common-hal/canio/Listener.c #: ports/stm/common-hal/canio/Listener.c
@ -1028,7 +1025,6 @@ msgstr ""
msgid "Firmware is invalid" msgid "Firmware is invalid"
msgstr "" msgstr ""
#: ports/espressif/common-hal/coproc/Coproc.c
#: ports/espressif/common-hal/dualbank/__init__.c #: ports/espressif/common-hal/dualbank/__init__.c
msgid "Firmware is too big" msgid "Firmware is too big"
msgstr "" msgstr ""
@ -1070,6 +1066,8 @@ msgstr ""
#: shared-bindings/displayio/Display.c #: shared-bindings/displayio/Display.c
#: shared-bindings/displayio/EPaperDisplay.c #: shared-bindings/displayio/EPaperDisplay.c
#: shared-bindings/framebufferio/FramebufferDisplay.c #: shared-bindings/framebufferio/FramebufferDisplay.c
#: shared-module/displayio/Display.c
#: shared-module/framebufferio/FramebufferDisplay.c
msgid "Group already used" msgid "Group already used"
msgstr "" msgstr ""
@ -1090,6 +1088,15 @@ msgstr ""
msgid "Hardware in use, try alternative pins" msgid "Hardware in use, try alternative pins"
msgstr "" 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 #: extmod/vfs_posix_file.c py/objstringio.c
msgid "I/O operation on closed file" msgid "I/O operation on closed file"
msgstr "" msgstr ""
@ -1107,11 +1114,6 @@ msgstr ""
msgid "I2SOut not available" msgid "I2SOut not available"
msgstr "" msgstr ""
#: shared-bindings/aesio/aes.c
#, c-format
msgid "IV must be %d bytes long"
msgstr ""
#: ports/raspberrypi/bindings/rp2pio/StateMachine.c #: ports/raspberrypi/bindings/rp2pio/StateMachine.c
msgid "In-buffer elements must be <= 4 bytes long" msgid "In-buffer elements must be <= 4 bytes long"
msgstr "" msgstr ""
@ -1196,6 +1198,7 @@ msgid "Internal define error"
msgstr "" msgstr ""
#: ports/espressif/common-hal/paralleldisplay/ParallelBus.c #: ports/espressif/common-hal/paralleldisplay/ParallelBus.c
#: shared-module/os/getenv.c
msgid "Internal error" msgid "Internal error"
msgstr "" msgstr ""
@ -1208,6 +1211,10 @@ msgstr ""
msgid "Internal watchdog timer expired." msgid "Internal watchdog timer expired."
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c
msgid "Interrupt error."
msgstr ""
#: py/argcheck.c shared-bindings/digitalio/DigitalInOut.c #: py/argcheck.c shared-bindings/digitalio/DigitalInOut.c
msgid "Invalid %q" msgid "Invalid %q"
msgstr "" msgstr ""
@ -1242,6 +1249,11 @@ msgstr ""
msgid "Invalid bits per value" msgid "Invalid bits per value"
msgstr "" msgstr ""
#: shared-module/os/getenv.c
#, c-format
msgid "Invalid byte %.*s"
msgstr ""
#: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c #: ports/atmel-samd/common-hal/imagecapture/ParallelImageCapture.c
#, c-format #, c-format
msgid "Invalid data_pins[%d]" msgid "Invalid data_pins[%d]"
@ -1251,18 +1263,10 @@ msgstr ""
msgid "Invalid format chunk size" msgid "Invalid format chunk size"
msgstr "형식 청크 크기가 잘못되었습니다" msgstr "형식 청크 크기가 잘못되었습니다"
#: supervisor/shared/safe_mode.c
msgid "Invalid memory access."
msgstr ""
#: ports/espressif/common-hal/wifi/Radio.c #: ports/espressif/common-hal/wifi/Radio.c
msgid "Invalid multicast MAC address" msgid "Invalid multicast MAC address"
msgstr "" msgstr ""
#: shared-bindings/busio/UART.c
msgid "Invalid pins"
msgstr "핀이 유효하지 않습니다"
#: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c
msgid "Invalid size" msgid "Invalid size"
msgstr "" msgstr ""
@ -1276,10 +1280,18 @@ msgstr ""
msgid "Invalid state" msgid "Invalid state"
msgstr "" msgstr ""
#: shared-module/os/getenv.c
msgid "Invalid unicode escape"
msgstr ""
#: shared-bindings/aesio/aes.c #: shared-bindings/aesio/aes.c
msgid "Key must be 16, 24, or 32 bytes long" msgid "Key must be 16, 24, or 32 bytes long"
msgstr "" msgstr ""
#: shared-module/os/getenv.c
msgid "Key not found"
msgstr ""
#: shared-module/is31fl3741/FrameBuffer.c #: shared-module/is31fl3741/FrameBuffer.c
msgid "LED mappings must match display size" msgid "LED mappings must match display size"
msgstr "" msgstr ""
@ -1386,6 +1398,10 @@ msgstr ""
msgid "NVS Error" msgid "NVS Error"
msgstr "" msgstr ""
#: shared-bindings/socketpool/SocketPool.c
msgid "Name or service not known"
msgstr ""
#: py/qstr.c #: py/qstr.c
msgid "Name too long" msgid "Name too long"
msgstr "" msgstr ""
@ -1500,11 +1516,6 @@ msgstr ""
msgid "No long integer support" msgid "No long integer support"
msgstr "" msgstr ""
#: shared-module/usb_hid/__init__.c
#, c-format
msgid "No more than %d HID devices allowed"
msgstr ""
#: shared-bindings/wifi/Radio.c #: shared-bindings/wifi/Radio.c
msgid "No network with that ssid" msgid "No network with that ssid"
msgstr "" msgstr ""
@ -1540,10 +1551,6 @@ msgstr ""
msgid "No timer available" msgid "No timer available"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c
msgid "Nordic system firmware failure assertion."
msgstr ""
#: ports/nrf/common-hal/_bleio/__init__.c #: ports/nrf/common-hal/_bleio/__init__.c
msgid "Nordic system firmware out of memory" msgid "Nordic system firmware out of memory"
msgstr "" msgstr ""
@ -1563,10 +1570,6 @@ msgstr ""
msgid "Not playing" msgid "Not playing"
msgstr "" msgstr ""
#: shared-bindings/_bleio/__init__.c
msgid "Not settable"
msgstr ""
#: ports/espressif/common-hal/paralleldisplay/ParallelBus.c #: ports/espressif/common-hal/paralleldisplay/ParallelBus.c
#, c-format #, c-format
msgid "Number of data_pins must be 8 or 16, not %d" msgid "Number of data_pins must be 8 or 16, not %d"
@ -1629,11 +1632,14 @@ msgid ""
"%d bpp given" "%d bpp given"
msgstr "" msgstr ""
#: ports/espressif/common-hal/alarm/coproc/CoprocAlarm.c
#: ports/espressif/common-hal/alarm/touch/TouchAlarm.c #: ports/espressif/common-hal/alarm/touch/TouchAlarm.c
msgid "Only one %q can be set in deep sleep." msgid "Only one %q can be set in deep sleep."
msgstr "" msgstr ""
#: ports/espressif/common-hal/espulp/ULPAlarm.c
msgid "Only one %q can be set."
msgstr ""
#: ports/espressif/common-hal/i2ctarget/I2CTarget.c #: ports/espressif/common-hal/i2ctarget/I2CTarget.c
#: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c #: ports/raspberrypi/common-hal/i2ctarget/I2CTarget.c
msgid "Only one address is allowed" msgid "Only one address is allowed"
@ -1666,6 +1672,10 @@ msgstr ""
msgid "Operation timed out" msgid "Operation timed out"
msgstr "" 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 #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c
msgid "Out of memory" msgid "Out of memory"
msgstr "" msgstr ""
@ -1789,6 +1799,10 @@ msgstr ""
msgid "Program size invalid" msgid "Program size invalid"
msgstr "" msgstr ""
#: ports/espressif/common-hal/espulp/ULP.c
msgid "Program too long"
msgstr ""
#: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/digitalio/DigitalInOut.c
msgid "Pull not used when direction is output." msgid "Pull not used when direction is output."
msgstr "" msgstr ""
@ -1828,8 +1842,9 @@ msgstr ""
msgid "Random number generation error" msgid "Random number generation error"
msgstr "" msgstr ""
#: shared-bindings/_bleio/__init__.c
#: shared-bindings/memorymonitor/AllocationSize.c #: shared-bindings/memorymonitor/AllocationSize.c
#: shared-bindings/pulseio/PulseIn.c #: shared-bindings/pulseio/PulseIn.c shared-module/displayio/Bitmap.c
msgid "Read-only" msgid "Read-only"
msgstr "" msgstr ""
@ -1837,10 +1852,6 @@ msgstr ""
msgid "Read-only filesystem" msgid "Read-only filesystem"
msgstr "" msgstr ""
#: shared-module/displayio/Bitmap.c
msgid "Read-only object"
msgstr ""
#: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c #: ports/espressif/common-hal/espidf/__init__.c ports/espressif/esp_error.c
msgid "Received response was invalid" msgid "Received response was invalid"
msgstr "" msgstr ""
@ -1933,7 +1944,7 @@ msgstr ""
msgid "Sleep Memory not available" msgid "Sleep Memory not available"
msgstr "" 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 #: shared-bindings/nvm/ByteArray.c
msgid "Slice and value different lengths." msgid "Slice and value different lengths."
msgstr "" msgstr ""
@ -1970,6 +1981,10 @@ msgstr ""
msgid "Stereo right must be on PWM channel B" msgid "Stereo right must be on PWM channel B"
msgstr "" 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 #: ports/mimxrt10xx/common-hal/busio/UART.c ports/stm/common-hal/busio/UART.c
msgid "Supply at least one UART pin" msgid "Supply at least one UART pin"
msgstr "" msgstr ""
@ -1987,35 +2002,11 @@ msgid "Temperature read timed out"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c #: 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 "" msgstr ""
#: supervisor/shared/safe_mode.c #: py/obj.c
msgid "" msgid "The above exception was the direct cause of the following exception:"
"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"
msgstr "" msgstr ""
#: shared-bindings/rgbmatrix/RGBMatrix.c #: shared-bindings/rgbmatrix/RGBMatrix.c
@ -2023,10 +2014,7 @@ msgid "The length of rgb_pins must be 6, 12, 18, 24, or 30"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c #: supervisor/shared/safe_mode.c
msgid "" msgid "The power dipped. Make sure you are providing enough power."
"The microcontroller's power dipped. Make sure your power supply provides\n"
"enough power for the whole circuit and press reset (after ejecting "
"CIRCUITPY)."
msgstr "" msgstr ""
#: shared-module/audiomixer/MixerVoice.c #: shared-module/audiomixer/MixerVoice.c
@ -2045,6 +2033,10 @@ msgstr ""
msgid "The sample's signedness does not match the mixer's" msgid "The sample's signedness does not match the mixer's"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c
msgid "Third-party firmware fatal error."
msgstr ""
#: shared-module/imagecapture/ParallelImageCapture.c #: shared-module/imagecapture/ParallelImageCapture.c
msgid "This microcontroller does not support continuous capture." msgid "This microcontroller does not support continuous capture."
msgstr "" msgstr ""
@ -2077,10 +2069,6 @@ msgstr ""
msgid "Timeout is too long: Maximum timeout length is %d seconds" msgid "Timeout is too long: Maximum timeout length is %d seconds"
msgstr "" 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 #: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
msgid "Too many channels in sample" msgid "Too many channels in sample"
msgstr "" msgstr ""
@ -2125,6 +2113,10 @@ msgstr ""
msgid "UART init" msgid "UART init"
msgstr "" msgstr ""
#: ports/raspberrypi/common-hal/busio/UART.c
msgid "UART peripheral in use"
msgstr ""
#: ports/stm/common-hal/busio/UART.c #: ports/stm/common-hal/busio/UART.c
msgid "UART re-init" msgid "UART re-init"
msgstr "" msgstr ""
@ -2173,6 +2165,10 @@ msgstr ""
msgid "Unable to allocate buffers for signed conversion" msgid "Unable to allocate buffers for signed conversion"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c
msgid "Unable to allocate the heap."
msgstr ""
#: ports/espressif/common-hal/busio/I2C.c #: ports/espressif/common-hal/busio/I2C.c
msgid "Unable to create lock" msgid "Unable to create lock"
msgstr "" msgstr ""
@ -2196,11 +2192,12 @@ msgid "Unable to read color palette data"
msgstr "" msgstr ""
#: ports/espressif/common-hal/mdns/Server.c #: ports/espressif/common-hal/mdns/Server.c
#: ports/raspberrypi/common-hal/mdns/Server.c
msgid "Unable to start mDNS query" msgid "Unable to start mDNS query"
msgstr "" msgstr ""
#: shared-bindings/coproc/CoprocMemory.c #: shared-bindings/memorymap/AddressRange.c
msgid "Unable to write" msgid "Unable to write to address."
msgstr "" msgstr ""
#: shared-bindings/nvm/ByteArray.c #: shared-bindings/nvm/ByteArray.c
@ -2271,6 +2268,7 @@ msgid "Unkown error code %d"
msgstr "" msgstr ""
#: shared-bindings/adafruit_pixelbuf/PixelBuf.c #: shared-bindings/adafruit_pixelbuf/PixelBuf.c
#: shared-module/_pixelmap/PixelMap.c
#, c-format #, c-format
msgid "Unmatched number of items on RHS (expected %d, got %d)." msgid "Unmatched number of items on RHS (expected %d, got %d)."
msgstr "" msgstr ""
@ -2355,6 +2353,18 @@ msgstr ""
msgid "Wi-Fi: " msgid "Wi-Fi: "
msgstr "" 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 #: main.c
msgid "Woken up by alarm.\n" msgid "Woken up by alarm.\n"
msgstr "" msgstr ""
@ -2364,13 +2374,48 @@ msgstr ""
msgid "Writes not supported on Characteristic" msgid "Writes not supported on Characteristic"
msgstr "" msgstr ""
#: supervisor/shared/safe_mode.c #: ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.h
msgid "You are in safe mode because:\n" #: 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 "" msgstr ""
#: supervisor/shared/safe_mode.c #: supervisor/shared/safe_mode.c
msgid "" msgid "You pressed the BOOT button at start up"
"You pressed the reset button during boot. Press again to exit safe mode." 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 "" msgstr ""
#: py/objtype.c #: py/objtype.c
@ -2442,8 +2487,12 @@ msgstr ""
msgid "array has too many dimensions" msgid "array has too many dimensions"
msgstr "" msgstr ""
#: extmod/ulab/code/ndarray.c
msgid "array is too big"
msgstr ""
#: py/objarray.c shared-bindings/alarm/SleepMemory.c #: 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" msgid "array/bytes required on right side"
msgstr "" msgstr ""
@ -2536,10 +2585,6 @@ msgstr ""
msgid "buffer too small for requested bytes" msgid "buffer too small for requested bytes"
msgstr "" msgstr ""
#: shared-bindings/adafruit_pixelbuf/PixelBuf.c
msgid "byteorder is not a string"
msgstr ""
#: py/objarray.c #: py/objarray.c
msgid "bytes length not a multiple of item size" msgid "bytes length not a multiple of item size"
msgstr "" msgstr ""
@ -2581,14 +2626,10 @@ msgstr ""
msgid "can't cancel self" msgid "can't cancel self"
msgstr "" 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" msgid "can't convert %q to %q"
msgstr "" msgstr ""
#: py/runtime.c
msgid "can't convert %q to int"
msgstr ""
#: py/obj.c #: py/obj.c
#, c-format #, c-format
msgid "can't convert %s to complex" msgid "can't convert %s to complex"
@ -2670,6 +2711,10 @@ msgstr ""
msgid "can't set attribute" msgid "can't set attribute"
msgstr "" msgstr ""
#: py/runtime.c
msgid "can't set attribute '%q'"
msgstr ""
#: py/emitnative.c #: py/emitnative.c
msgid "can't store '%q'" msgid "can't store '%q'"
msgstr "" msgstr ""
@ -2772,10 +2817,6 @@ msgstr ""
msgid "comparison of int and uint" msgid "comparison of int and uint"
msgstr "" msgstr ""
#: py/objcomplex.c
msgid "complex division by zero"
msgstr ""
#: py/objfloat.c py/parsenum.c #: py/objfloat.c py/parsenum.c
msgid "complex values not supported" msgid "complex values not supported"
msgstr "" msgstr ""
@ -2878,12 +2919,11 @@ msgstr ""
msgid "div/mod not implemented for uint" msgid "div/mod not implemented for uint"
msgstr "" msgstr ""
#: py/objfloat.c py/objint_mpz.c #: extmod/ulab/code/numpy/create.c
msgid "divide by zero" msgid "divide by zero"
msgstr "" msgstr ""
#: py/modmath.c py/objint_longlong.c py/runtime.c #: py/runtime.c
#: shared-bindings/math/__init__.c
msgid "division by zero" msgid "division by zero"
msgstr "" msgstr ""
@ -2924,9 +2964,9 @@ msgstr ""
msgid "error = 0x%08lX" msgid "error = 0x%08lX"
msgstr "" msgstr ""
#: ports/espressif/common-hal/esp32_camera/Camera.c #: ports/espressif/common-hal/espcamera/Camera.c
msgid "" 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." "documentation for instructions."
msgstr "" msgstr ""
@ -2934,14 +2974,6 @@ msgstr ""
msgid "exceptions must derive from BaseException" msgid "exceptions must derive from BaseException"
msgstr "" 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 #: py/objstr.c
msgid "expected ':' after format specifier" msgid "expected ':' after format specifier"
msgstr "':'이 예상되었습니다" msgstr "':'이 예상되었습니다"
@ -3040,10 +3072,6 @@ msgstr ""
msgid "format requires a dict" msgid "format requires a dict"
msgstr "" msgstr ""
#: shared-bindings/microcontroller/Processor.c
msgid "frequency is read-only for this board"
msgstr ""
#: py/objdeque.c #: py/objdeque.c
msgid "full" msgid "full"
msgstr "완전한(full)" msgstr "완전한(full)"
@ -3156,8 +3184,12 @@ msgstr ""
msgid "index is out of bounds" msgid "index is out of bounds"
msgstr "" 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 #: 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 #: shared-bindings/bitmaptools/__init__.c
msgid "index out of range" msgid "index out of range"
msgstr "" msgstr ""
@ -3255,10 +3287,6 @@ msgstr ""
msgid "inputs are not iterable" msgid "inputs are not iterable"
msgstr "" msgstr ""
#: py/parsenum.c
msgid "int() arg 2 must be >= 2 and <= 36"
msgstr ""
#: extmod/ulab/code/numpy/approx.c #: extmod/ulab/code/numpy/approx.c
msgid "interp is defined for 1D iterables of equal length" msgid "interp is defined for 1D iterables of equal length"
msgstr "" msgstr ""
@ -3315,7 +3343,7 @@ msgstr "키가 유효하지 않습니다"
msgid "invalid micropython decorator" msgid "invalid micropython decorator"
msgstr "" msgstr ""
#: ports/espressif/common-hal/esp32_camera/Camera.c #: ports/espressif/common-hal/espcamera/Camera.c
msgid "invalid setting" msgid "invalid setting"
msgstr "" msgstr ""
@ -3340,10 +3368,6 @@ msgstr "구문(syntax)가 정수가 유효하지 않습니다"
msgid "invalid syntax for number" msgid "invalid syntax for number"
msgstr "숫자에 대한 구문(syntax)가 유효하지 않습니다" msgstr "숫자에 대한 구문(syntax)가 유효하지 않습니다"
#: py/objexcept.c
msgid "invalid traceback"
msgstr ""
#: py/objtype.c #: py/objtype.c
msgid "issubclass() arg 1 must be a class" msgid "issubclass() arg 1 must be a class"
msgstr "" msgstr ""
@ -3400,19 +3424,17 @@ msgstr ""
msgid "local variable referenced before assignment" msgid "local variable referenced before assignment"
msgstr "" msgstr ""
#: py/objint.c
msgid "long int not supported in this build"
msgstr ""
#: ports/espressif/common-hal/canio/CAN.c #: ports/espressif/common-hal/canio/CAN.c
msgid "loopback + silent mode not supported by peripheral" msgid "loopback + silent mode not supported by peripheral"
msgstr "" msgstr ""
#: ports/espressif/common-hal/mdns/Server.c #: ports/espressif/common-hal/mdns/Server.c
#: ports/raspberrypi/common-hal/mdns/Server.c
msgid "mDNS already initialized" msgid "mDNS already initialized"
msgstr "" msgstr ""
#: ports/espressif/common-hal/mdns/Server.c #: ports/espressif/common-hal/mdns/Server.c
#: ports/raspberrypi/common-hal/mdns/Server.c
msgid "mDNS only works with built-in WiFi" msgid "mDNS only works with built-in WiFi"
msgstr "" msgstr ""
@ -3541,6 +3563,10 @@ msgstr ""
msgid "negative shift count" msgid "negative shift count"
msgstr "" msgstr ""
#: shared-bindings/_pixelmap/PixelMap.c
msgid "nested index must be int"
msgstr ""
#: shared-module/sdcardio/SDCard.c #: shared-module/sdcardio/SDCard.c
msgid "no SD card" msgid "no SD card"
msgstr "" msgstr ""
@ -3574,7 +3600,7 @@ msgstr ""
msgid "no response from SD card" msgid "no response from SD card"
msgstr "" 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" msgid "no such attribute"
msgstr "" msgstr ""
@ -3710,6 +3736,10 @@ msgstr ""
msgid "only mono is supported" msgid "only mono is supported"
msgstr "" msgstr ""
#: extmod/ulab/code/numpy/create.c
msgid "only ndarrays can be concatenated"
msgstr ""
#: ports/stm/common-hal/audiobusio/PDMIn.c #: ports/stm/common-hal/audiobusio/PDMIn.c
msgid "only oversample=64 is supported" msgid "only oversample=64 is supported"
msgstr "" msgstr ""
@ -3720,7 +3750,7 @@ msgid "only sample_rate=16000 is supported"
msgstr "" msgstr ""
#: py/objarray.c py/objstr.c py/objstrunicode.c py/objtuple.c #: 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 #: shared-bindings/nvm/ByteArray.c
msgid "only slices with step=1 (aka None) are supported" msgid "only slices with step=1 (aka None) are supported"
msgstr "" msgstr ""
@ -3936,10 +3966,6 @@ msgstr ""
msgid "slice step can't be zero" msgid "slice step can't be zero"
msgstr "" msgstr ""
#: py/objslice.c
msgid "slice step cannot be zero"
msgstr ""
#: py/nativeglue.c #: py/nativeglue.c
msgid "slice unsupported" msgid "slice unsupported"
msgstr "" msgstr ""
@ -3988,10 +4014,6 @@ msgstr ""
msgid "start/end indices" msgid "start/end indices"
msgstr "" msgstr ""
#: shared-bindings/random/__init__.c
msgid "step must be non-zero"
msgstr ""
#: shared-bindings/random/__init__.c #: shared-bindings/random/__init__.c
msgid "stop not reachable from start" msgid "stop not reachable from start"
msgstr "" msgstr ""
@ -4000,10 +4022,6 @@ msgstr ""
msgid "stream operation not supported" msgid "stream operation not supported"
msgstr "" msgstr ""
#: py/objstrunicode.c
msgid "string indices must be integers, not %q"
msgstr ""
#: py/stream.c #: py/stream.c
msgid "string not supported; use bytes or bytearray" msgid "string not supported; use bytes or bytearray"
msgstr "" msgstr ""
@ -4036,10 +4054,6 @@ msgstr ""
msgid "syntax error in uctypes descriptor" msgid "syntax error in uctypes descriptor"
msgstr "" msgstr ""
#: shared-bindings/time/__init__.c
msgid "time.struct_time() takes a 9-sequence"
msgstr ""
#: ports/atmel-samd/common-hal/watchdog/WatchDogTimer.c #: ports/atmel-samd/common-hal/watchdog/WatchDogTimer.c
#: ports/espressif/common-hal/watchdog/WatchDogTimer.c #: ports/espressif/common-hal/watchdog/WatchDogTimer.c
#: ports/nrf/common-hal/watchdog/WatchDogTimer.c #: ports/nrf/common-hal/watchdog/WatchDogTimer.c
@ -4321,10 +4335,6 @@ msgstr ""
msgid "y value out of bounds" msgid "y value out of bounds"
msgstr "" msgstr ""
#: py/objrange.c
msgid "zero step"
msgstr ""
#: extmod/ulab/code/scipy/signal/signal.c #: extmod/ulab/code/scipy/signal/signal.c
msgid "zi must be an ndarray" msgid "zi must be an ndarray"
msgstr "" msgstr ""
@ -4337,6 +4347,12 @@ msgstr ""
msgid "zi must be of shape (n_section, 2)" msgid "zi must be of shape (n_section, 2)"
msgstr "" msgstr ""
#~ msgid "Expected a %q"
#~ msgstr "%q 이 예상되었습니다."
#~ msgid "Invalid pins"
#~ msgstr "핀이 유효하지 않습니다"
#~ msgid "%q indices must be integers, not %s" #~ msgid "%q indices must be integers, not %s"
#~ msgstr "%q 인덱스는 %s 가 아닌 정수 여야합니다" #~ msgstr "%q 인덱스는 %s 가 아닌 정수 여야합니다"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

114
main.c
View File

@ -218,12 +218,10 @@ void supervisor_execution_status(void) {
} }
#endif #endif
#define STRING_LIST(...) {__VA_ARGS__, ""}
// Look for the first file that exists in the list of filenames, using mp_import_stat(). // 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. // Return its index. If no file found, return -1.
STATIC const char *first_existing_file_in_list(const char *const *filenames) { STATIC const char *first_existing_file_in_list(const char *const *filenames, size_t n_filenames) {
for (int i = 0; filenames[i] != (char *)""; i++) { for (size_t i = 0; i < n_filenames; i++) {
mp_import_stat_t stat = mp_import_stat(filenames[i]); mp_import_stat_t stat = mp_import_stat(filenames[i]);
if (stat == MP_IMPORT_STAT_FILE) { if (stat == MP_IMPORT_STAT_FILE) {
return filenames[i]; return filenames[i];
@ -232,11 +230,11 @@ STATIC const char *first_existing_file_in_list(const char *const *filenames) {
return NULL; 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.return_code = 0;
_exec_result.exception = MP_OBJ_NULL; _exec_result.exception = MP_OBJ_NULL;
_exec_result.exception_line = 0; _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) { if (_current_executing_filename == NULL) {
return false; return false;
} }
@ -360,7 +358,7 @@ STATIC void print_code_py_status_message(safe_mode_t safe_mode) {
} else { } else {
serial_write_compressed(translate("Auto-reload is off.\n")); 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")); 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 // Do the filesystem flush check before reload in case another write comes
// in while we're doing the flush. // in while we're doing the flush.
if (safe_mode == NO_SAFE_MODE) { if (safe_mode == SAFE_MODE_NONE) {
stack_resize(); stack_resize();
filesystem_flush(); filesystem_flush();
} }
if (safe_mode == NO_SAFE_MODE && !autoreload_pending()) { if (safe_mode == SAFE_MODE_NONE && !autoreload_pending()) {
static const char *const supported_filenames[] = STRING_LIST( static const char *const supported_filenames[] = {
"code.txt", "code.py", "main.py", "main.txt"); "code.txt", "code.py", "main.py", "main.txt"
};
#if CIRCUITPY_FULL_BUILD #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", "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 #endif
supervisor_allocation *heap = allocate_remaining_memory(); 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 // Check if a different run file has been allocated
if (next_code_allocation) { if (next_code_allocation) {
((next_code_info_t *)next_code_allocation->ptr)->options &= ~SUPERVISOR_NEXT_CODE_OPT_NEWLY_SET; next_code_info_t *info = ((next_code_info_t *)next_code_allocation->ptr);
next_code_options = ((next_code_info_t *)next_code_allocation->ptr)->options; info->options &= ~SUPERVISOR_NEXT_CODE_OPT_NEWLY_SET;
if (((next_code_info_t *)next_code_allocation->ptr)->filename[0] != '\0') { next_code_options = info->options;
const char *next_list[] = {((next_code_info_t *)next_code_allocation->ptr)->filename, ""}; if (info->filename[0] != '\0') {
// This is where the user's python code is actually executed: // 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) { 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")); 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 // Otherwise, default to the standard list of filenames
if (!found_main) { if (!found_main) {
// This is where the user's python code is actually executed: // 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 that didn't work, double check the extensions
#if CIRCUITPY_FULL_BUILD #if CIRCUITPY_FULL_BUILD
if (!found_main) { 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) { if (found_main) {
serial_write_compressed(translate("WARNING: Your code filename has two extensions\n")); 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 } else
#endif #endif
if (_exec_result.return_code != PYEXEC_EXCEPTION) { if (_exec_result.return_code != PYEXEC_EXCEPTION) {
if (safe_mode == NO_SAFE_MODE) { if (safe_mode == SAFE_MODE_NONE) {
color = ALL_DONE; color = ALL_DONE;
blink_count = ALL_DONE_BLINKS; blink_count = ALL_DONE_BLINKS;
} else { } else {
@ -729,8 +730,34 @@ STATIC bool run_code_py(safe_mode_t safe_mode, bool *simulate_reset) {
vstr_t *boot_output; 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) { 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; 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. // There is USB setup to do even if boot.py is not actually run.
const bool ok_to_run = filesystem_present() const bool ok_to_run = filesystem_present()
&& safe_mode == NO_SAFE_MODE && safe_mode == SAFE_MODE_NONE
&& MP_STATE_VM(vfs_mount_table) != NULL; && 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. // 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(); port_boot_info();
#endif #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; (void)found_boot;
@ -912,7 +939,7 @@ STATIC int run_repl(void) {
int __attribute__((used)) main(void) { int __attribute__((used)) main(void) {
// initialise the cpu and peripherals // 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. // Turn on RX and TX LEDs if we have them.
init_rxtx_leds(); 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); common_hal_nvm_bytearray_set_bytes(&common_hal_mcu_nvm_obj,0,&value_out,1);
#endif #endif
// Start the debug serial
serial_early_init();
// Wait briefly to give a reset window where we'll enter safe mode after the reset. // Wait briefly to give a reset window where we'll enter safe mode after the reset.
if (safe_mode == NO_SAFE_MODE) { if (get_safe_mode() == SAFE_MODE_NONE) {
safe_mode = wait_for_safe_mode_reset(); set_safe_mode(wait_for_safe_mode_reset());
} }
stack_init(); stack_init();
@ -940,9 +970,6 @@ int __attribute__((used)) main(void) {
supervisor_bluetooth_init(); supervisor_bluetooth_init();
#endif #endif
// Start the debug serial
serial_early_init();
#if !INTERNAL_FLASH_FILESYSTEM #if !INTERNAL_FLASH_FILESYSTEM
// Set up anything that might need to get done before we try to use SPI flash // 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 // 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 // Check whether CIRCUITPY is available. No need to reset to get safe mode
// since we haven't run user code yet. // since we haven't run user code yet.
if (!filesystem_init(safe_mode == NO_SAFE_MODE, false)) { if (!filesystem_init(get_safe_mode() == SAFE_MODE_NONE, false)) {
safe_mode = NO_CIRCUITPY; set_safe_mode(SAFE_MODE_NO_CIRCUITPY);
} }
#if CIRCUITPY_ALARM #if CIRCUITPY_ALARM
@ -981,16 +1008,23 @@ int __attribute__((used)) main(void) {
supervisor_set_run_reason(RUN_REASON_STARTUP); 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 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(); autoreload_enable();
} }
// By default our internal flash is readonly to local python code and // 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_concurrent_write_protection(true);
filesystem_set_internal_writable_by_usb(CIRCUITPY_USB == 1); 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(); supervisor_workflow_start();
@ -1015,7 +1049,7 @@ int __attribute__((used)) main(void) {
// If code.py did a fake deep sleep, pretend that we // If code.py did a fake deep sleep, pretend that we
// are running code.py for the first time after a hard // are running code.py for the first time after a hard
// reset. This will preserve any alarm information. // 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 { } else {
skip_repl = false; skip_repl = false;
} }
@ -1075,14 +1109,14 @@ void gc_collect(void) {
} }
void NORETURN nlr_jump_fail(void *val) { 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) { while (true) {
} }
} }
#ifndef NDEBUG #ifndef NDEBUG
static void NORETURN __fatal_error(const char *msg) { 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) { while (true) {
} }
} }

View File

@ -79,7 +79,7 @@ endif
ifeq ($(CHIP_FAMILY), same54) ifeq ($(CHIP_FAMILY), same54)
PERIPHERALS_CHIP_FAMILY=sam_d5x_e5x PERIPHERALS_CHIP_FAMILY=sam_d5x_e5x
OPTIMIZATION_FLAGS ?= -O2 OPTIMIZATION_FLAGS ?= -Os
# TinyUSB defines # 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 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 endif
@ -293,7 +293,6 @@ SRC_C += \
boards/$(BOARD)/board.c \ boards/$(BOARD)/board.c \
boards/$(BOARD)/pins.c \ boards/$(BOARD)/pins.c \
eic_handler.c \ eic_handler.c \
fatfs_port.c \
lib/tinyusb/src/portable/microchip/samd/dcd_samd.c \ lib/tinyusb/src/portable/microchip/samd/dcd_samd.c \
mphalport.c \ mphalport.c \
reset.c \ reset.c \

View File

@ -23,7 +23,7 @@
#define CALIBRATE_CRYSTALLESS 1 #define CALIBRATE_CRYSTALLESS 1
// Explanation of how a user got into safe mode. // 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 // Increase stack size slightly due to CPX library import nesting
#define CIRCUITPY_DEFAULT_STACK_SIZE (4248) // divisible by 8 #define CIRCUITPY_DEFAULT_STACK_SIZE (4248) // divisible by 8

View File

@ -23,7 +23,7 @@
#define CALIBRATE_CRYSTALLESS 1 #define CALIBRATE_CRYSTALLESS 1
// Explanation of how a user got into safe mode. // 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 // Increase stack size slightly due to CPX library import nesting
#define CIRCUITPY_DEFAULT_STACK_SIZE (4248) // divisible by 8 #define CIRCUITPY_DEFAULT_STACK_SIZE (4248) // divisible by 8

View File

@ -23,7 +23,7 @@
#define CALIBRATE_CRYSTALLESS 1 #define CALIBRATE_CRYSTALLESS 1
// Explanation of how a user got into safe mode. // 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. // Increase stack size slightly due to CPX library import nesting.
#define CIRCUITPY_DEFAULT_STACK_SIZE (4248) // divisible by 8 #define CIRCUITPY_DEFAULT_STACK_SIZE (4248) // divisible by 8

View File

@ -6,7 +6,7 @@
#define CALIBRATE_CRYSTALLESS 1 #define CALIBRATE_CRYSTALLESS 1
// Explanation of how a user got into safe mode. // 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_SCL (&pin_PA01)
#define DEFAULT_I2C_BUS_SDA (&pin_PA00) #define DEFAULT_I2C_BUS_SDA (&pin_PA00)

View File

@ -11,6 +11,7 @@ LONGINT_IMPL = NONE
CIRCUITPY_FULL_BUILD = 0 CIRCUITPY_FULL_BUILD = 0
CIRCUITPY_ANALOGIO = 0
CIRCUITPY_ALARM = 0 CIRCUITPY_ALARM = 0
CIRCUITPY_AUDIOBUSIO = 0 CIRCUITPY_AUDIOBUSIO = 0
CIRCUITPY_AUDIOMP3 = 0 CIRCUITPY_AUDIOMP3 = 0
@ -31,14 +32,13 @@ CIRCUITPY_ROTARYIO = 0
CIRCUITPY_RTC = 0 CIRCUITPY_RTC = 0
CIRCUITPY_SAMD = 0 CIRCUITPY_SAMD = 0
CIRCUITPY_TOUCHIO = 0 CIRCUITPY_TOUCHIO = 0
CIRCUITPY_USB_CDC = 0
CIRCUITPY_USB_HID = 0 CIRCUITPY_USB_HID = 0
CIRCUITPY_USB_MIDI = 0 CIRCUITPY_USB_MIDI = 0
CIRCUITPY_VECTORIO = 0 CIRCUITPY_VECTORIO = 0
CIRCUITPY_BUSDEVICE = 0 CIRCUITPY_BUSDEVICE = 0
CIRCUITPY_BITMAPTOOLS = 0 CIRCUITPY_BITMAPTOOLS = 0
CIRCUITPY_WATCHDOG = 0
CIRCUITPY_ANALOGIO = 1
CIRCUITPY_AUDIOIO = 1 CIRCUITPY_AUDIOIO = 1
CIRCUITPY_AUDIOMIXER = 1 CIRCUITPY_AUDIOMIXER = 1
CIRCUITPY_DISPLAYIO = 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 # Override optimization to keep binary small
OPTIMIZATION_FLAGS = -Os 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

View File

@ -405,7 +405,13 @@ void common_hal_audioio_audioout_play(audioio_audioout_obj_t *self,
if (self->right_channel == &pin_PA02) { if (self->right_channel == &pin_PA02) {
right_channel_reg = (uint32_t)&DAC->DATABUF[0].reg; 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, result = audio_dma_setup_playback(&self->left_dma, sample, loop, false, 0,
false /* output unsigned */, false /* output unsigned */,
left_channel_reg, left_channel_reg,
@ -415,7 +421,11 @@ void common_hal_audioio_audioout_play(audioio_audioout_obj_t *self,
false /* output unsigned */, false /* output unsigned */,
left_channel_reg, left_channel_reg,
left_channel_trigger); 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, result = audio_dma_setup_playback(&self->right_dma, sample, loop, true, 1,
false /* output unsigned */, false /* output unsigned */,
right_channel_reg, right_channel_reg,

View File

@ -24,6 +24,7 @@
* THE SOFTWARE. * THE SOFTWARE.
*/ */
#if CIRCUITPY_BUSIO_UART
#include "shared-bindings/microcontroller/__init__.h" #include "shared-bindings/microcontroller/__init__.h"
#include "shared-bindings/microcontroller/Pin.h" #include "shared-bindings/microcontroller/Pin.h"
#include "shared-bindings/busio/UART.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); usart_async_get_status(usart_desc_p, &async_status);
return !(async_status.flags & USART_ASYNC_STATUS_BUSY); return !(async_status.flags & USART_ASYNC_STATUS_BUSY);
} }
#endif

View File

@ -51,9 +51,8 @@ void common_hal_mcu_disable_interrupts(void) {
void common_hal_mcu_enable_interrupts(void) { void common_hal_mcu_enable_interrupts(void) {
if (nesting_count == 0) { if (nesting_count == 0) {
// This is very very bad because it means there was mismatched disable/enables so we // This is very very bad because it means there was mismatched disable/enables.
// "HardFault". reset_into_safe_mode(SAFE_MODE_INTERRUPT_ERROR);
HardFault_Handler();
} }
nesting_count--; nesting_count--;
if (nesting_count > 0) { 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; _bootloader_dbl_tap = DBL_TAP_MAGIC_QUICK_BOOT;
} }
if (runmode == RUNMODE_SAFE_MODE) { if (runmode == RUNMODE_SAFE_MODE) {
safe_mode_on_next_reset(PROGRAMMATIC_SAFE_MODE); safe_mode_on_next_reset(SAFE_MODE_PROGRAMMATIC);
} }
} }

View File

@ -114,8 +114,6 @@ CLK PA21 PCC_D? (D32) BROWN
gpio_set_pin_pull_mode(functions[i]->pin, gpio_set_pin_pull_mode(functions[i]->pin,
(i == 1 || i == 5) ? GPIO_PULL_OFF : GPIO_PULL_UP); (i == 1 || i == 5) ? GPIO_PULL_OFF : GPIO_PULL_UP);
gpio_set_pin_function(functions[i]->pin, GPIO_PIN_FUNCTION_SDIO); gpio_set_pin_function(functions[i]->pin, GPIO_PIN_FUNCTION_SDIO);
common_hal_never_reset_pin(functions[i]->obj);
} }
self->num_data = num_data; self->num_data = num_data;
@ -145,6 +143,12 @@ CLK PA21 PCC_D? (D32) BROWN
} }
if (result != SD_MMC_OK) { 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); 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 // sd_mmc_get_capacity() is in KiB, but our "capacity" is in 512-byte blocks

View File

@ -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
}

View File

@ -24,13 +24,13 @@ ifeq ($(CHIP_FAMILY),samd21)
CIRCUITPY_AESIO ?= 0 CIRCUITPY_AESIO ?= 0
CIRCUITPY_ATEXIT ?= 0 CIRCUITPY_ATEXIT ?= 0
CIRCUITPY_AUDIOMIXER ?= 0 CIRCUITPY_AUDIOMIXER ?= 0
CIRCUITPY_AUDIOMP3 ?= 0
CIRCUITPY_BINASCII ?= 0 CIRCUITPY_BINASCII ?= 0
CIRCUITPY_BITBANGIO ?= 0 CIRCUITPY_BITBANGIO ?= 0
CIRCUITPY_BITMAPTOOLS ?= 0 CIRCUITPY_BITMAPTOOLS ?= 0
CIRCUITPY_BUSDEVICE ?= 0
CIRCUITPY_AUDIOMP3 ?= 0
CIRCUITPY_BLEIO_HCI = 0 CIRCUITPY_BLEIO_HCI = 0
CIRCUITPY_BUILTINS_POW3 ?= 0 CIRCUITPY_BUILTINS_POW3 ?= 0
CIRCUITPY_BUSDEVICE ?= 0
CIRCUITPY_COMPUTED_GOTO_SAVE_SPACE ?= 1 CIRCUITPY_COMPUTED_GOTO_SAVE_SPACE ?= 1
CIRCUITPY_COUNTIO ?= 0 CIRCUITPY_COUNTIO ?= 0
# Not enough RAM for framebuffers # Not enough RAM for framebuffers
@ -42,6 +42,8 @@ CIRCUITPY_I2CTARGET ?= 0
CIRCUITPY_JSON ?= 0 CIRCUITPY_JSON ?= 0
CIRCUITPY_KEYPAD ?= 0 CIRCUITPY_KEYPAD ?= 0
CIRCUITPY_MSGPACK ?= 0 CIRCUITPY_MSGPACK ?= 0
CIRCUITPY_OS_GETENV ?= 0
CIRCUITPY_PIXELMAP ?= 0
CIRCUITPY_RE ?= 0 CIRCUITPY_RE ?= 0
CIRCUITPY_SDCARDIO ?= 0 CIRCUITPY_SDCARDIO ?= 0
CIRCUITPY_SYNTHIO ?= 0 CIRCUITPY_SYNTHIO ?= 0
@ -55,6 +57,7 @@ CIRCUITPY_ZLIB = 0
ifeq ($(INTERNAL_FLASH_FILESYSTEM),1) ifeq ($(INTERNAL_FLASH_FILESYSTEM),1)
CIRCUITPY_ONEWIREIO ?= 0 CIRCUITPY_ONEWIREIO ?= 0
CIRCUITPY_SAFEMODE_PY ?= 0
CIRCUITPY_USB_IDENTIFICATION ?= 0 CIRCUITPY_USB_IDENTIFICATION ?= 0
endif endif
@ -75,10 +78,8 @@ SUPEROPT_VM = 0
CIRCUITPY_LTO_PARTITION = one CIRCUITPY_LTO_PARTITION = one
ifeq ($(CIRCUITPY_FULL_BUILD),0) # On smaller builds this saves about 180 bytes. On other boards, it may -increase- space used, so use with care.
# On the smallest boards, this saves about 180 bytes. On other boards, it may -increase- space used.
CFLAGS_BOARD = -fweb -frename-registers CFLAGS_BOARD = -fweb -frename-registers
endif
endif # samd21 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