diff options
| author | Juan Biondi <juanernestobiondi@gmail.com> | 2019-03-27 19:55:23 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-03-27 19:55:23 +0100 |
| commit | f6892ce3ff71b3f142d7a3f50e7137907708e0e7 (patch) | |
| tree | dd9beeb504d2601772b7dc39d4e54c0f1b3c50bd | |
| parent | 948cc03031d6e13f2212758b596f9e152684d3c5 (diff) | |
| parent | 94822ee2088960e6f68c9d4f05606cdb47c9ba5c (diff) | |
Merge pull request #4 from adafruit/master
Get latest changes to translate
578 files changed, 38873 insertions, 40998 deletions
diff --git a/.gitmodules b/.gitmodules index 3a746ccae..5ddbc4494 100644 --- a/.gitmodules +++ b/.gitmodules @@ -86,3 +86,15 @@ [submodule "tools/adabot"] path = tools/adabot url = https://github.com/adafruit/adabot.git +[submodule "tools/bitmap_font"] + path = tools/bitmap_font + url = https://github.com/adafruit/Adafruit_CircuitPython_BitmapFont.git +[submodule "tools/Tecate-bitmap-fonts"] + path = tools/Tecate-bitmap-fonts + url = https://github.com/Tecate/bitmap-fonts.git +[submodule "frozen/pew-pewpew-standalone-10.x"] + path = frozen/pew-pewpew-standalone-10.x + url = https://github.com/pewpew-game/pew-pewpew-standalone-10.x.git +[submodule "frozen/circuitpython-stage"] + path = frozen/circuitpython-stage + url = https://github.com/python-ugame/circuitpython-stage.git diff --git a/.travis.yml b/.travis.yml index 613afa677..31f9a2447 100755 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,7 @@ language: c compiler: - gcc git: - depth: 1 + depth: 6 # Each item under 'env' is a separate Travis job to execute. # They run in separate environments, so each one must take the time @@ -21,16 +21,16 @@ git: # that SDK is shortest and add it there. In the case of major re-organizations, # just try to make the builds "about equal in run time" env: - - TRAVIS_TESTS="unix docs translations website" TRAVIS_BOARDS="feather_huzzah circuitplayground_express mini_sam_m4 grandcentral_m4_express pca10056 pca10059 feather_nrf52832 feather_nrf52840_express makerdiary_nrf52840_mdk particle_boron particle_argon particle_xenon sparkfun_nrf52840_mini" TRAVIS_SDK=arm:nrf:esp8266 - - TRAVIS_BOARDS="metro_m0_express metro_m4_express pirkey_m0 trellis_m4_express trinket_m0" TRAVIS_SDK=arm - - TRAVIS_BOARDS="feather_radiofruit_zigbee gemma_m0 hallowing_m0_express itsybitsy_m0_express itsybitsy_m4_express meowmeow" TRAVIS_SDK=arm - - TRAVIS_BOARDS="feather_m0_express_crickit feather_m0_rfm69 feather_m0_rfm9x feather_m4_express arduino_zero arduino_mkr1300 arduino_mkrzero" TRAVIS_SDK=arm - - TRAVIS_BOARDS="circuitplayground_express_crickit feather_m0_adalogger feather_m0_basic feather_m0_express catwan_usbstick pyportal" TRAVIS_SDK=arm + - TRAVIS_TESTS="unix docs translations website" TRAVIS_BOARDS="circuitplayground_express mini_sam_m4 grandcentral_m4_express pca10056 pca10059 feather_nrf52840_express makerdiary_nrf52840_mdk makerdiary_nrf52840_mdk_usb_dongle particle_boron particle_argon particle_xenon sparkfun_nrf52840_mini" TRAVIS_SDK=arm:nrf + - TRAVIS_BOARDS="metro_m0_express metro_m4_express pirkey_m0 trellis_m4_express trinket_m0 sparkfun_lumidrive sparkfun_redboard_turbo pybadge" TRAVIS_SDK=arm + - TRAVIS_BOARDS="feather_radiofruit_zigbee gemma_m0 hallowing_m0_express itsybitsy_m0_express itsybitsy_m4_express meowmeow sam32 uchip" TRAVIS_SDK=arm + - TRAVIS_BOARDS="feather_m0_express_crickit feather_m0_rfm69 feather_m0_rfm9x feather_m4_express arduino_zero arduino_mkr1300 arduino_mkrzero pewpew10" TRAVIS_SDK=arm + - TRAVIS_BOARDS="circuitplayground_express_crickit feather_m0_adalogger feather_m0_basic feather_m0_express catwan_usbstick pyportal sparkfun_samd21_mini sparkfun_samd21_dev" TRAVIS_SDK=arm addons: artifacts: paths: - - $(ls -d1 bin/*/* | tr "\n" ":") + - $(ls -d1 bin/*/*/* | tr "\n" ":") target_paths: / deploy: @@ -38,9 +38,8 @@ deploy: api_key: secure: "jdqVFw6itRY4qwQF4ReXo0uaymT+Mob6RhYX0lw8KWFNqBgHnLVuKmKKcGMEuRvBVMPkvxF7bMuOQzSBOunqwlHFse3oMzdWvQODv1zwV7pSRXGwTdIvTPbBjKWxnBG9uSNRf2R5AMflJFUxy2CbtBpgvNzr+4VLREZDrrjEu8C1iTtXGpSm5AQ5iIp2fkMAWD85FP7CQPpkqRoxhSIFZmTdurfYRmenq1OZ/4SeD5TESKcyvqJNzVT9z210B3cg3eAkP6ukvelW4qE2zgIANqUkGqvDEnAvEII9M89kuwhCMAekdfwnUSPrry+g77i1dUZHoRN1+MFj+waYtPaqxdYo2G1sysa6enxlu4jHMR5MfMk9eKHgaNgL3PiyANusYSS44amh8QIiVaX5nw82myZDCpQOZW7YqJKE6WX70Lbs4mS+wIs+ig4KIXO1B0p9kMb0OeVjHRl+KcXsWGRu/ECG/ExpqlVIssSPU407LohMXT2cJ37CY/R/EeK2XSDsQ2M3L3EAGUjCJdBGuwsOJ+2lG+HQpAVu9vAB4kq5jy9Ye+MG+8Xlkly3XZZ5+FkXyYxKnXb26/QVv0e5sIG5OmdJCPYFaH2J1QdKo7CdhEcBtrf6DMPWaimGMldShFqzLjOz3b3qLysRxFF0aGb7ipKPa57vawNzYHoPAViOcXQ=" file_glob: true - file: "$TRAVIS_BUILD_DIR/bin/*/*" + file: "$TRAVIS_BUILD_DIR/bin/*/*/*" skip_cleanup: true - draft: true on: tags: true @@ -57,7 +56,6 @@ notifications: before_script: # Expand the git tree back to 4.0.0-alpha.1 and then fetch the latest tag. - LAST_TAG=`git ls-remote --quiet --tags --sort=version:refname | egrep -o "refs/tags/[0-9]+.*\$" | tail -n 1` - - git fetch --shallow-exclude=4.0.0-alpha.1 || git fetch --unshallow - git fetch --depth 1 origin $LAST_TAG:$LAST_TAG - git describe --dirty --always --tags - function var_search () { case "$1" in *$2*) true;; *) false;; esac; } @@ -66,9 +64,6 @@ before_script: - (! var_search "${TRAVIS_SDK-}" arm || (wget https://s3.amazonaws.com/adafruit-circuit-python/gcc-arm-embedded_7-2018q2-1~xenial1_amd64.deb && sudo dpkg -i gcc-arm-embedded*_amd64.deb)) - # For nrf builds - - (! var_search "${TRAVIS_SDK-}" nrf || sudo ports/nrf/bluetooth/download_ble_stack.sh) - # For huzzah builds - (! var_search "${TRAVIS_SDK-}" esp8266 || (wget https://github.com/jepler/esp-open-sdk/releases/download/2018-06-10/xtensa-lx106-elf-standalone.tar.gz && tar -C .. -xaf xtensa-lx106-elf-standalone.tar.gz)) - if var_search "${TRAVIS_SDK-}" esp8266 ; then PATH=$(readlink -f ../xtensa-lx106-elf/bin):$PATH; fi @@ -89,7 +84,7 @@ before_script: script: # Build mpy-cross first because other builds depend on it. - echo 'Building mpy-cross' && echo 'travis_fold:start:mpy-cross' - - make -C mpy-cross -j2 ; echo $? > status + - make -C mpy-cross -j2 ; S=$? ; echo $S > status ; (exit $S) - echo 'travis_fold:end:mpy-cross' && tools/print_status.py status # Use unbuffered output because building all the releases can take a long time. @@ -98,7 +93,7 @@ script: - cd .. - echo 'Building unix' && echo 'travis_fold:start:unix' - - (! var_search "${TRAVIS_TESTS-}" unix || (make -C ports/unix deplibs -j2 && make -C ports/unix -j2 && make -C ports/unix coverage -j2)) ; echo $? > status + - (! var_search "${TRAVIS_TESTS-}" unix || (make -C ports/unix deplibs -j2 && make -C ports/unix -j2 && make -C ports/unix coverage -j2)) ; S=$? ; echo $S > status ; (exit $S) - echo 'travis_fold:end:unix' && tools/print_status.py status # run tests without coverage info @@ -107,27 +102,27 @@ script: # run tests with coverage info - echo 'Test all' && echo 'travis_fold:start:test_all' - - (! var_search "${TRAVIS_TESTS-}" unix || (cd tests && MICROPY_CPYTHON3=python3.5 MICROPY_MICROPYTHON=../ports/unix/micropython_coverage ./run-tests -j1)) ; echo $? > status + - (! var_search "${TRAVIS_TESTS-}" unix || (cd tests && MICROPY_CPYTHON3=python3.5 MICROPY_MICROPYTHON=../ports/unix/micropython_coverage ./run-tests -j1)) ; S=$? ; echo $S > status ; (exit $S) - echo 'travis_fold:end:test_all' && tools/print_status.py status - echo 'Test threads' && echo 'travis_fold:start:test_threads' - - (! var_search "${TRAVIS_TESTS-}" unix || (cd tests && MICROPY_CPYTHON3=python3.5 MICROPY_MICROPYTHON=../ports/unix/micropython_coverage ./run-tests -j1 -d thread)) ; echo $? >status + - (! var_search "${TRAVIS_TESTS-}" unix || (cd tests && MICROPY_CPYTHON3=python3.5 MICROPY_MICROPYTHON=../ports/unix/micropython_coverage ./run-tests -j1 -d thread)) ; S=$? ; echo $S > status ; (exit $S) - echo 'travis_fold:end:test_threads' && tools/print_status.py status - echo 'Testing with native' && echo 'travis_fold:start:test_native' - - (! var_search "${TRAVIS_TESTS-}" unix || (cd tests && MICROPY_CPYTHON3=python3.5 MICROPY_MICROPYTHON=../ports/unix/micropython_coverage ./run-tests -j1 --emit native)) ; echo $? >status + - (! var_search "${TRAVIS_TESTS-}" unix || (cd tests && MICROPY_CPYTHON3=python3.5 MICROPY_MICROPYTHON=../ports/unix/micropython_coverage ./run-tests -j1 --emit native)) ; S=$? ; echo $S > status ; (exit $S) - echo 'travis_fold:end:test_native' && tools/print_status.py status - (echo 'Testing with mpy' && echo 'travis_fold:start:test_mpy') - - (! var_search "${TRAVIS_TESTS-}" unix || (cd tests && MICROPY_CPYTHON3=python3.5 MICROPY_MICROPYTHON=../ports/unix/micropython_coverage ./run-tests -j1 --via-mpy -d basics float)) ; echo $? >status + - (! var_search "${TRAVIS_TESTS-}" unix || (cd tests && MICROPY_CPYTHON3=python3.5 MICROPY_MICROPYTHON=../ports/unix/micropython_coverage ./run-tests -j1 --via-mpy -d basics float)) ; S=$? ; echo $S > status ; (exit $S) - echo 'travis_fold:end:test_mpy' && tools/print_status.py status - (echo 'Building docs' && echo 'travis_fold:start:build_docs') - - (! var_search "${TRAVIS_TESTS-}" docs || sphinx-build -E -W -b html . _build/html) ; echo $? >status + - (! var_search "${TRAVIS_TESTS-}" docs || sphinx-build -E -W -b html . _build/html) ; S=$? ; echo $S > status ; (exit $S) - echo 'travis_fold:end:build_docs' && tools/print_status.py status - (echo 'Building translations' && echo 'travis_fold:start:build_translations') - - (! var_search "${TRAVIS_TESTS-}" translations || make check-translate) ; echo $? >status + - (! var_search "${TRAVIS_TESTS-}" translations || make check-translate) ; S=$? ; echo $S > status ; (exit $S) - echo 'travis_fold:end:build_translations' && tools/print_status.py status # run coveralls coverage analysis (try to, even if some builds/tests failed) @@ -194,10 +194,10 @@ pseudoxml: all-source: locale/circuitpython.pot: all-source - find . -iname "*.c" | xargs xgettext -L C --keyword=translate -F -o circuitpython.pot -p locale + find . -iname "*.c" | xargs xgettext -L C -s --add-location=file --keyword=translate -o circuitpython.pot -p locale translate: locale/circuitpython.pot - for po in $(shell ls locale/*.po); do msgmerge -U -F $$po locale/circuitpython.pot; done + for po in $(shell ls locale/*.po); do msgmerge -U $$po -s --no-fuzzy-matching --add-location=file locale/circuitpython.pot; done check-translate: locale/circuitpython.pot $(wildcard locale/*.po) $(PYTHON) tools/check_translations.py $^ diff --git a/README.rst b/README.rst index 13672b689..cf0964863 100644 --- a/README.rst +++ b/README.rst @@ -157,7 +157,7 @@ Behavior API ~~~ -- Unified hardware APIs: `audioio <https://circuitpython.readthedocs.io/en/latest/shared-bindings/audioio/__init__.html>`_, `analogio <https://circuitpython.readthedocs.io/en/latest/shared-bindings/analogio/__init__.html>`_, `busio <https://circuitpython.readthedocs.io/en/latest/shared-bindings/busio/__init__.html>`_, `digitalio <https://circuitpython.readthedocs.io/en/latest/shared-bindings/digitalio/__init__.html>`_, `pulseio <https://circuitpython.readthedocs.io/en/latest/shared-bindings/pulseio/__init__.html>`_, `touchio <https://circuitpython.readthedocs.io/en/latest/shared-bindings/touchio/__init__.html>`_, `microcontroller <https://circuitpython.readthedocs.io/en/latest/shared-bindings/microcontroller/__init__.html>`_, `board <https://circuitpython.readthedocs.io/en/latest/shared-bindings/board/__init__.html>`_, `bitbangio <https://circuitpython.readthedocs.io/en/latest/shared-bindings/bitbangio/__init__.html>`_ +- Unified hardware APIs: `audioio <https://circuitpython.readthedocs.io/en/latest/shared-bindings/audioio/__init__.html>`_, `analogio <https://circuitpython.readthedocs.io/en/latest/shared-bindings/analogio/__init__.html>`_, `bleio <https://circuitpython.readthedocs.io/en/latest/shared-bindings/bleio/__init__.html>`_, `busio <https://circuitpython.readthedocs.io/en/latest/shared-bindings/busio/__init__.html>`_, `digitalio <https://circuitpython.readthedocs.io/en/latest/shared-bindings/digitalio/__init__.html>`_, `pulseio <https://circuitpython.readthedocs.io/en/latest/shared-bindings/pulseio/__init__.html>`_, `touchio <https://circuitpython.readthedocs.io/en/latest/shared-bindings/touchio/__init__.html>`_, `microcontroller <https://circuitpython.readthedocs.io/en/latest/shared-bindings/microcontroller/__init__.html>`_, `board <https://circuitpython.readthedocs.io/en/latest/shared-bindings/board/__init__.html>`_, `bitbangio <https://circuitpython.readthedocs.io/en/latest/shared-bindings/bitbangio/__init__.html>`_ - No ``machine`` API on Atmel SAMD21 port. Modules @@ -271,6 +271,6 @@ project. .. |Doc Status| image:: https://readthedocs.org/projects/circuitpython/badge/?version=latest :target: http://circuitpython.readthedocs.io/ .. |Discord| image:: https://img.shields.io/discord/327254708534116352.svg - :target: https://discord.gg/nBQh6qu + :target: https://adafru.it/discord .. |License| image:: https://github.com/adafruit/circuitpython/blob/master/logo/license-MIT-brightgreen.svg :target: https://opensource.org/licenses/MIT diff --git a/docs/design_guide.rst b/docs/design_guide.rst index e7b3832bc..2efbdc34c 100644 --- a/docs/design_guide.rst +++ b/docs/design_guide.rst @@ -500,6 +500,8 @@ properties. +-----------------------+-----------------------+-------------------------------------------------------------------------+ | ``value`` | int | 16-bit Analog value, unit-less | +-----------------------+-----------------------+-------------------------------------------------------------------------+ +| ``weight`` | float | grams (g) | ++-----------------------+-----------------------+-------------------------------------------------------------------------+ Adding native modules -------------------------------------------------------------------------------- diff --git a/docs/drivers.rst b/docs/drivers.rst index 119706d33..241415cc1 100644 --- a/docs/drivers.rst +++ b/docs/drivers.rst @@ -1,16 +1,13 @@ -.. _adafruit-libndrivers: - -Additional Adafruit Libraries and Drivers on GitHub -=================================================== +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>`_. -.. _bundle_installation: -Bundle ------- +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 @@ -18,233 +15,19 @@ of boards which feature a relatively large external flash. With Express boards, its easy to copy them all onto the filesystem. However, if you don't have enough space simply copy things over as they are needed. -The bundles are available `on GitHub <https://github.com/adafruit/Adafruit_CircuitPython_Bundle/releases>`_. - -To install them: - -#. `Download <https://github.com/adafruit/Adafruit_CircuitPython_Bundle/releases>`_ - and unzip the latest zip that's not a source zip. -#. Copy the ``lib`` folder to the ``CIRCUITPY`` or ``MICROPYTHON``. - -Foundational ------------- - -These libraries provide critical functionality to many of the drivers below. It -is recommended to always have them installed onto the CircuitPython file system in -the ``lib/`` directory. Some drivers may not work without them. - -.. toctree:: - - Register Library <https://circuitpython.readthedocs.io/projects/register/en/latest/> - BusDevice Library <https://circuitpython.readthedocs.io/projects/busdevice/en/latest/> - -Board-specific Helpers ----------------------- - -These libraries tie lower-level libraries together to provide an easy, out-of-box experience for -specific boards. - -.. toctree:: - - Adafruit CircuitPlayground Express <https://circuitpython.readthedocs.io/projects/circuitplayground/en/latest/> - Adafruit FeatherWings <https://circuitpython.readthedocs.io/projects/featherwing/en/latest/> - -Helper Libraries ------------------ - -These libraries build on top of the low level APIs to simplify common tasks. - -.. toctree:: - - USB Human Interface Device (Keyboard and Mouse) <https://circuitpython.readthedocs.io/projects/hid/en/latest/> - Waveform Generation <https://circuitpython.readthedocs.io/projects/waveform/en/latest/> - OneWire <https://circuitpython.readthedocs.io/projects/onewire/en/latest/> - Ring Tone Text Transfer Language (RTTTL) <https://circuitpython.readthedocs.io/projects/rtttl/en/latest/> - InfraRed Remote <https://circuitpython.readthedocs.io/projects/irremote/en/latest/> - Fancy LED (similar to FastLED) <https://circuitpython.readthedocs.io/projects/fancyled/en/latest/> - SimpleIO <https://circuitpython.readthedocs.io/projects/simpleio/en/latest/> - AVR programming <https://circuitpython.readthedocs.io/projects/avrprog/en/latest/> - DC Motor and Servo <https://circuitpython.readthedocs.io/projects/motor/en/latest/> - SD Card <https://circuitpython.readthedocs.io/projects/sd/en/latest/> - Image Load <https://circuitpython.readthedocs.io/projects/imageload/en/latest/> - miniQR Non-hardware QR code generator <https://circuitpython.readthedocs.io/projects/miniqr/en/latest/> - Slideshow <https://circuitpython.readthedocs.io/projects/slideshow/en/latest/> - LED Animation <https://circuitpython.readthedocs.io/projects/led-animation/en/latest/> - -Blinky --------- - -Multi-color led drivers. - -.. toctree:: - - NeoPixel <https://circuitpython.readthedocs.io/projects/neopixel/en/latest/> - DotStar <https://circuitpython.readthedocs.io/projects/dotstar/en/latest/> - WS2801 <https://circuitpython.readthedocs.io/projects/ws2801/en/latest/> - Pixie <https://circuitpython.readthedocs.io/projects/pixie/en/latest/> - -Displays -------------- - -Drivers used to display information. Either pixel or segment based. - -.. toctree:: - - RGB Displays <https://circuitpython.readthedocs.io/projects/rgb_display/en/latest/> - Character LCD <https://circuitpython.readthedocs.io/projects/charlcd/en/latest/> - HT16K33 LED Matrices and Segment Displays <https://circuitpython.readthedocs.io/projects/ht16k33/en/latest/> - IS31FL3731 Charlieplexed LED Matrix <https://circuitpython.readthedocs.io/projects/is31fl3731/en/latest/> - MAX7219 LED Matrix <https://circuitpython.readthedocs.io/projects/max7219/en/latest/> - SSD1306 OLED Driver <https://circuitpython.readthedocs.io/projects/ssd1306/en/latest/> - E-Paper Display <https://circuitpython.readthedocs.io/projects/epd/en/latest/> - -Real-time clocks ------------------ - -Chips that keep current calendar time with a backup battery. The current date and time is available -through ``datetime``. - -.. toctree:: - - DS1307 Real-time Clock (5V RTC Breakout) <https://circuitpython.readthedocs.io/projects/ds1307/en/latest/> - DS3231 Real-time Clock (Precision RTC) <https://circuitpython.readthedocs.io/projects/ds3231/en/latest/> - PCF8523 Real-time Clock (Adalogger RTC) <https://circuitpython.readthedocs.io/projects/pcf8523/en/latest/> - -Motion Sensors ----------------- - -Motion relating sensing including ``acceleration``, ``magnetic``, ``gyro``, and ``orientation``. - -.. toctree:: - - ADXL34x 3 Axis Accelerometer <https://circuitpython.readthedocs.io/projects/adxl34x/en/latest/> - BNO055 Accelerometer, Magnetometer, Gyroscope and Absolution Orientation <https://circuitpython.readthedocs.io/projects/bno055/en/latest/> - FXAS21002C Gyroscope <https://circuitpython.readthedocs.io/projects/fxas21002c/en/latest/> - FXOS8700 Accelerometer <https://circuitpython.readthedocs.io/projects/fxos8700/en/latest/> - GPS Global Position <https://circuitpython.readthedocs.io/projects/gps/en/latest/> - L3GD20 Gyroscope <https://circuitpython.readthedocs.io/projects/l3gd20/latest/> - LIS3DH Accelerometer <https://circuitpython.readthedocs.io/projects/lis3dh/en/latest/> - LSM303 Accelerometer and Magnetometer <https://circuitpython.readthedocs.io/projects/lsm303/en/latest/> - LSM9DS0 Accelerometer, Magnetometer, Gyroscope and Temperature <https://circuitpython.readthedocs.io/projects/lsm9ds0/en/latest/> - LSM9DS1 Accelerometer, Magnetometer, Gyroscope and Temperature <https://circuitpython.readthedocs.io/projects/lsm9ds1/en/latest/> - MLX90390 3 Axis Mangetometer <https://circuitpython.readthedocs.io/projects/mlx90393/en/latest/> - MMA8451 3 axis accelerometer <https://circuitpython.readthedocs.io/projects/mma8451/en/latest/> - -Environmental Sensors ----------------------- - -Sense attributes of the environment including ``temperature``, ``relative_humidity``, ``pressure``, -equivalent carbon dioxide (``eco2`` / ``eCO2``), and total volatile organic compounds (``tvoc`` / -``TVOC``). - -.. toctree:: - - AM2320 Temperature and Humidity <https://circuitpython.readthedocs.io/projects/am2320/en/latest/> - BME280 Temperature, Humidity and Pressure <https://circuitpython.readthedocs.io/projects/bme280/en/latest/> - BME680 Temperature, Humidity, Pressure and Gas <https://circuitpython.readthedocs.io/projects/bme680/en/latest/> - BMP280 Barometric Pressure and Altitude <https://circuitpython.readthedocs.io/projects/bmp280/en/latest/> - BMP3xx Barometric Pressure and Altimeter <https://circuitpython.readthedocs.io/projects/bmp3xx/en/latest/> - CCS811 Air Quality <https://circuitpython.readthedocs.io/projects/ccs811/en/latest/> - DHT Temperature and Humidity <https://circuitpython.readthedocs.io/projects/dht/en/latest/> - DS18x20 Temperature <https://circuitpython.readthedocs.io/projects/ds18x20/en/latest/> - HTU21D Temperature and Humidity <https://circuitpython.readthedocs.io/projects/htu21d/en/latest/> - MAX31865 Thermocouple Amplifier, Temperature <https://circuitpython.readthedocs.io/projects/max31865/en/latest/> - MAX31855 Thermocouple Amplifier, Temperature <https://circuitpython.readthedocs.io/projects/max31855/en/latest/> - MAX31856 Thermocouple Amplifier, Temperature <https://circuitpython.readthedocs.io/projects/max31856/en/latest/> - MCP9808 Temperature <https://circuitpython.readthedocs.io/projects/mcp9808/en/latest/> - MP115A2 Barometric Pressure, Temperature <https://circuitpython.readthedocs.io/projects/mpl115a2/en/latest/> - MPL3115A2 Barometric Pressure, Altitude and Temperature Sensor <https://circuitpython.readthedocs.io/projects/mpl3115a2/en/latest/> - MPRLS Ported Absolute Pressure <https://circuitpython.readthedocs.io/projects/mprls/en/latest/> - SGP30 Air Quality <https://circuitpython.readthedocs.io/projects/sgp30/en/latest/> - SHT31-D Temperature and Humidity <https://circuitpython.readthedocs.io/projects/sht31d/en/latest/> - Si7021 Temperature and Humidity <https://circuitpython.readthedocs.io/projects/si7021/en/latest/> - Thermistor Temperature <https://circuitpython.readthedocs.io/projects/thermistor/en/latest/> - TMP007 Contactless Temperature <https://circuitpython.readthedocs.io/projects/tmp007/en/latest/> - MLX90614 Contactless Temperature <https://circuitpython.readthedocs.io/projects/mlx90614/en/latest/> - -Light Sensors ---------------- - -These sensors detect light related attributes such as ``color``, ``light`` (unit-less), and -``lux`` (light in SI lux). - -.. toctree:: - - APDS9960 Proximity, Light, RGB, and Gesture <https://circuitpython.readthedocs.io/projects/apds9960/en/latest/> - AS726x Color Spectrum Sensor <https://circuitpython.readthedocs.io/projects/as726x/en/latest/> - TCS34725 Color Sensor <https://circuitpython.readthedocs.io/projects/tcs34725/en/latest/> - TSL2561 Light Sensor <https://circuitpython.readthedocs.io/projects/tsl2561/en/latest/> - TSL2591 High Dynamic Range Light Sensor <https://circuitpython.readthedocs.io/projects/tsl2591/en/latest/> - VCNL4010 Proximity and Light <https://circuitpython.readthedocs.io/projects/vcnl4010/en/latest/> - VEML6070 UV Index <https://circuitpython.readthedocs.io/projects/veml6070/en/latest/> - VEML6075 UV Index <https://circuitpython.readthedocs.io/projects/veml6075/en/latest/> - -Distance Sensors ------------------- - -These sensors measure the ``distance`` to another object and may also measure light level (``light`` and ``lux``). - -.. toctree:: - - Garmin LIDARLite I2C <https://circuitpython.readthedocs.io/projects/lidarlite/en/latest/> - TFmini IR Time of Flight ~30cm - 12m <https://circuitpython.readthedocs.io/projects/tfmini/en/latest/> - VL6180x 5 - 100 mm <https://circuitpython.readthedocs.io/projects/vl6180x/en/latest/> - VL53L0x ~30 - 1000 mm <https://circuitpython.readthedocs.io/projects/vl53l0x/en/latest/> - HC-SR04 Ultrasonic Range Sensors <https://circuitpython.readthedocs.io/projects/hcsr04/en/latest/> - -Radio --------- - -These chips communicate to other's over radio. - -.. toctree:: - - Adafruit Bluefruit LE SPI Friend <https://circuitpython.readthedocs.io/projects/bluefruitspi/en/latest/> - RFM9x LoRa <https://circuitpython.readthedocs.io/projects/rfm9x/en/latest/> - RFM69 Packet Radio <https://circuitpython.readthedocs.io/projects/rfm69/en/latest/> - PN532 NFC/RFID <https://circuitpython.readthedocs.io/projects/pn532/en/latest/> - -IO Expansion --------------- +- The Adafruit bundles are available on GitHub: <https://github.com/adafruit/Adafruit_CircuitPython_Bundle/releases>. -These provide functionality similar to `analogio`, `digitalio`, `pulseio`, and `touchio`. +- Documentation for the bundle, which includes links to documentation for all + libraries, is available here: <https://circuitpython.readthedocs.io/projects/bundle/en/latest/>. -.. toctree:: - Adafruit SeeSaw <https://circuitpython.readthedocs.io/projects/seesaw/en/latest/> - ADS1x15 Analog-to-Digital Converter <https://circuitpython.readthedocs.io/projects/ads1x15/en/latest/> - Crickit Robotics Boards <<https://circuitpython.readthedocs.io/projects/crickit/en/latest/> - DS2413 OneWire GPIO Expander <https://circuitpython.readthedocs.io/projects/ds2413/en/latest/> - FocalTech Capacitive Touch <https://circuitpython.readthedocs.io/projects/focaltouch/en/latest/> - MCP230xx GPIO Expander <https://circuitpython.readthedocs.io/projects/mcp230xx/en/latest/> - MCP4725 Digital-to-Analog Converter <https://circuitpython.readthedocs.io/projects/mcp4725/en/latest/> - PCA9685 16 x 12-bit PWM Driver <https://circuitpython.readthedocs.io/projects/pca9685/en/latest/> - TLC5947 24 x 12-bit PWM Driver <https://circuitpython.readthedocs.io/projects/tlc5947/en/latest/> - TLC59711 12 x 16-bit PWM Driver <https://circuitpython.readthedocs.io/projects/tlc59711/en/latest/> - MPR121 Capacitive Touch Sensor <https://circuitpython.readthedocs.io/projects/mpr121/en/latest/> - TCA9548 I2C Multiplexer <https://circuitpython.readthedocs.io/projects/tca9548a/en/latest/> - MCP3xxx SPI ADC <https://circuitpython.readthedocs.io/projects/mcp3xxx/en/latest/> +CircuitPython Community Library Bundle +--------------------------------------- -Miscellaneous ----------------- +This bundle contains non-Adafruit sponsored libraries, that are written and submitted +by members of the community. -.. toctree:: +- The Community bundles are available on GitHub: <https://github.com/adafruit/CircuitPython_Community_Bundle/releases>. - CAP1188 8-Key Capacitive Touch <https://circuitpython.readthedocs.io/projects/cap1188/en/latest/> - Si4713 Stereo FM Transmitter <https://circuitpython.readthedocs.io/projects/si4713/en/latest/> - AMG88xx Grid-Eye IR Camera <https://circuitpython.readthedocs.io/projects/amg88xx/en/latest/> - Trellis 4x4 Keypad <https://circuitpython.readthedocs.io/projects/trellis/en/latest/> - NeoTrellis 4x4 Keypad <https://circuitpython.readthedocs.io/projects/neotrellis/en/latest/> - NeoTrellis M4 4x8 Keypad <https://circuitpython.readthedocs.io/projects/trellism4/en/latest/> - DRV2605 Haptic Motor Controller <https://circuitpython.readthedocs.io/projects/drv2605/en/latest/> - MAX9744 Audio Amplifier <https://circuitpython.readthedocs.io/projects/max9744/en/latest/> - Si5351 Clock Generator <https://circuitpython.readthedocs.io/projects/si5351/en/latest/> - Thermal Printer <https://circuitpython.readthedocs.io/projects/thermal_printer/en/latest/> - VC0706 TTL Camera <https://circuitpython.readthedocs.io/projects/vc0706/en/latest/> - INA219 High Side Current <https://circuitpython.readthedocs.io/projects/ina219/en/latest/> - Fingerprint <https://circuitpython.readthedocs.io/projects/fingerprint/en/latest/> - STMPE610 Resistive Touchscreen <https://circuitpython.readthedocs.io/projects/stmpe610/en/latest/> - Matrix Keypad <https://circuitpython.readthedocs.io/projects/matrixkeypad/en/latest/> - VS1053 Audio Codec <https://circuitpython.readthedocs.io/projects/vs1053/en/latest/> - FRAM Non-Volatile Memory <https://circuitpython.readthedocs.io/projects/fram/en/latest/> - 74HC595 Shift Register <https://circuitpython.readthedocs.io/projects/74hc595/en/latest/> +- Documentation is not available on ReadTheDocs at this time. See each library for any + included documentation. diff --git a/docs/library/builtins.rst b/docs/library/builtins.rst index 36a84bc0c..0061a8cea 100644 --- a/docs/library/builtins.rst +++ b/docs/library/builtins.rst @@ -78,12 +78,12 @@ Not all of these functions and types are turned on in all CircuitPython ports, f .. classmethod:: from_bytes(bytes, byteorder) - In CircuitPython, `byteorder` parameter must be positional (this is + In CircuitPython, ``byteorder`` parameter must be positional (this is compatible with CPython). .. method:: to_bytes(size, byteorder) - In CircuitPython, `byteorder` parameter must be positional (this is + In CircuitPython, ``byteorder`` parameter must be positional (this is compatible with CPython). .. function:: isinstance() diff --git a/drivers/wiznet5k/internet/dhcp/dhcp.c b/drivers/wiznet5k/internet/dhcp/dhcp.c index c56e64474..00f41c3c7 100644 --- a/drivers/wiznet5k/internet/dhcp/dhcp.c +++ b/drivers/wiznet5k/internet/dhcp/dhcp.c @@ -11,7 +11,7 @@ //! <2012/12/20> V1.1.0 //! 1. Optimize code //! 2. Add reg_dhcp_cbfunc() -//! 3. Add DHCP_stop() +//! 3. Add DHCP_stop() //! 4. Integrate check_DHCP_state() & DHCP_run() to DHCP_run() //! 5. Don't care system endian //! 6. Add comments @@ -22,30 +22,30 @@ //! //! Copyright (c) 2013, WIZnet Co., LTD. //! All rights reserved. -//! -//! Redistribution and use in source and binary forms, with or without -//! modification, are permitted provided that the following conditions -//! are met: -//! -//! * Redistributions of source code must retain the above copyright -//! notice, this list of conditions and the following disclaimer. +//! +//! Redistribution and use in source and binary forms, with or without +//! modification, are permitted provided that the following conditions +//! are met: +//! +//! * Redistributions of source code must retain the above copyright +//! notice, this list of conditions and the following disclaimer. //! * Redistributions in binary form must reproduce the above copyright //! notice, this list of conditions and the following disclaimer in the -//! documentation and/or other materials provided with the distribution. -//! * Neither the name of the <ORGANIZATION> nor the names of its -//! contributors may be used to endorse or promote products derived -//! from this software without specific prior written permission. -//! +//! documentation and/or other materials provided with the distribution. +//! * Neither the name of the <ORGANIZATION> nor the names of its +//! contributors may be used to endorse or promote products derived +//! from this software without specific prior written permission. +//! //! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -//! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +//! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE //! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -//! ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -//! LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -//! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +//! ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +//! LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +//! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF //! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -//! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -//! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -//! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +//! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +//! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +//! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF //! THE POSSIBILITY OF SUCH DAMAGE. // //***************************************************************************** @@ -59,7 +59,7 @@ #ifdef _DHCP_DEBUG_ #include <stdio.h> -#endif +#endif /* DHCP state machine. */ #define STATE_DHCP_INIT 0 ///< Initialize @@ -70,7 +70,7 @@ #define STATE_DHCP_RELEASE 5 ///< No use #define STATE_DHCP_STOP 6 ///< Stop processing DHCP -#define DHCP_FLAGSBROADCAST 0x8000 ///< The broadcast value of flags in @ref RIP_MSG +#define DHCP_FLAGSBROADCAST 0x8000 ///< The broadcast value of flags in @ref RIP_MSG #define DHCP_FLAGSUNICAST 0x0000 ///< The unicast value of flags in @ref RIP_MSG /* DHCP message OP code */ @@ -99,7 +99,7 @@ #define OPT_SIZE 312 /// Max OPT size of @ref RIP_MSG #define RIP_MSG_SIZE (236+OPT_SIZE) /// Max size of @ref RIP_MSG -/* +/* * @brief DHCP option and value (cf. RFC1533) */ enum @@ -171,7 +171,7 @@ enum /* * @brief DHCP message format - */ + */ typedef struct { uint8_t op; ///< @ref DHCP_BOOTREQUEST or @ref DHCP_BOOTREPLY uint8_t htype; ///< @ref DHCP_HTYPE10MB or @ref DHCP_HTYPE100MB @@ -182,7 +182,7 @@ typedef struct { uint16_t flags; ///< @ref DHCP_FLAGSBROADCAST or @ref DHCP_FLAGSUNICAST uint8_t ciaddr[4]; ///< @ref Request IP to DHCP sever uint8_t yiaddr[4]; ///< @ref Offered IP from DHCP server - uint8_t siaddr[4]; ///< No use + uint8_t siaddr[4]; ///< No use uint8_t giaddr[4]; ///< No use uint8_t chaddr[16]; ///< DHCP client 6bytes MAC address. Others is filled to zero uint8_t sname[64]; ///< No use @@ -205,7 +205,7 @@ uint8_t DHCP_allocated_dns[4] = {0, }; // DNS address from DHCP int8_t dhcp_state = STATE_DHCP_INIT; // DHCP state -int8_t dhcp_retry_count = 0; +int8_t dhcp_retry_count = 0; uint32_t dhcp_lease_time = INFINITE_LEASETIME; volatile uint32_t dhcp_tick_1s = 0; // unit 1 second @@ -215,7 +215,7 @@ uint32_t DHCP_XID; // Any number RIP_MSG* pDHCPMSG; // Buffer pointer for DHCP processing -uint8_t HOST_NAME[] = DCHP_HOST_NAME; +uint8_t HOST_NAME[] = DCHP_HOST_NAME; uint8_t DHCP_CHADDR[6]; // DHCP Client MAC address. @@ -306,9 +306,9 @@ void makeDHCPMSG(void) *(ptmp+0) = (uint8_t)((DHCP_XID & 0xFF000000) >> 24); *(ptmp+1) = (uint8_t)((DHCP_XID & 0x00FF0000) >> 16); *(ptmp+2) = (uint8_t)((DHCP_XID & 0x0000FF00) >> 8); - *(ptmp+3) = (uint8_t)((DHCP_XID & 0x000000FF) >> 0); + *(ptmp+3) = (uint8_t)((DHCP_XID & 0x000000FF) >> 0); pDHCPMSG->secs = DHCP_SECS; - ptmp = (uint8_t*)(&pDHCPMSG->flags); + ptmp = (uint8_t*)(&pDHCPMSG->flags); *(ptmp+0) = (uint8_t)((DHCP_FLAGSBROADCAST & 0xFF00) >> 8); *(ptmp+1) = (uint8_t)((DHCP_FLAGSBROADCAST & 0x00FF) >> 0); @@ -356,16 +356,16 @@ void send_DHCP_DISCOVER(void) uint16_t i; uint8_t ip[4]; uint16_t k = 0; - + makeDHCPMSG(); k = 4; // because MAGIC_COOKIE already made by makeDHCPMSG() - + // Option Request Param pDHCPMSG->OPT[k++] = dhcpMessageType; pDHCPMSG->OPT[k++] = 0x01; pDHCPMSG->OPT[k++] = DHCP_DISCOVER; - + // Client identifier pDHCPMSG->OPT[k++] = dhcpClientIdentifier; pDHCPMSG->OPT[k++] = 0x07; @@ -376,10 +376,10 @@ void send_DHCP_DISCOVER(void) pDHCPMSG->OPT[k++] = DHCP_CHADDR[3]; pDHCPMSG->OPT[k++] = DHCP_CHADDR[4]; pDHCPMSG->OPT[k++] = DHCP_CHADDR[5]; - + // host name pDHCPMSG->OPT[k++] = hostName; - pDHCPMSG->OPT[k++] = 0; // fill zero length of hostname + pDHCPMSG->OPT[k++] = 0; // fill zero length of hostname for(i = 0 ; HOST_NAME[i] != 0; i++) pDHCPMSG->OPT[k++] = HOST_NAME[i]; pDHCPMSG->OPT[k++] = DHCP_CHADDR[3]; @@ -432,18 +432,18 @@ void send_DHCP_REQUEST(void) ip[0] = DHCP_SIP[0]; ip[1] = DHCP_SIP[1]; ip[2] = DHCP_SIP[2]; - ip[3] = DHCP_SIP[3]; + ip[3] = DHCP_SIP[3]; } else { ip[0] = 255; ip[1] = 255; ip[2] = 255; - ip[3] = 255; + ip[3] = 255; } - + k = 4; // because MAGIC_COOKIE already made by makeDHCPMSG() - + // Option Request Param. pDHCPMSG->OPT[k++] = dhcpMessageType; pDHCPMSG->OPT[k++] = 0x01; @@ -467,7 +467,7 @@ void send_DHCP_REQUEST(void) pDHCPMSG->OPT[k++] = DHCP_allocated_ip[1]; pDHCPMSG->OPT[k++] = DHCP_allocated_ip[2]; pDHCPMSG->OPT[k++] = DHCP_allocated_ip[3]; - + pDHCPMSG->OPT[k++] = dhcpServerIdentifier; pDHCPMSG->OPT[k++] = 0x04; pDHCPMSG->OPT[k++] = DHCP_SIP[0]; @@ -485,7 +485,7 @@ void send_DHCP_REQUEST(void) pDHCPMSG->OPT[k++] = DHCP_CHADDR[4]; pDHCPMSG->OPT[k++] = DHCP_CHADDR[5]; pDHCPMSG->OPT[k - (i+3+1)] = i+3; // length of hostname - + pDHCPMSG->OPT[k++] = dhcpParamRequest; pDHCPMSG->OPT[k++] = 0x08; pDHCPMSG->OPT[k++] = subnetMask; @@ -503,7 +503,7 @@ void send_DHCP_REQUEST(void) #ifdef _DHCP_DEBUG_ printf("> Send DHCP_REQUEST\r\n"); #endif - + WIZCHIP_EXPORT(sendto)(DHCP_SOCKET, (uint8_t *)pDHCPMSG, RIP_MSG_SIZE, ip, DHCP_SERVER_PORT); } @@ -514,11 +514,11 @@ void send_DHCP_DECLINE(void) int i; uint8_t ip[4]; uint16_t k = 0; - + makeDHCPMSG(); k = 4; // because MAGIC_COOKIE already made by makeDHCPMSG() - + *((uint8_t*)(&pDHCPMSG->flags)) = ((DHCP_FLAGSUNICAST & 0xFF00)>> 8); *((uint8_t*)(&pDHCPMSG->flags)+1) = (DHCP_FLAGSUNICAST & 0x00FF); @@ -577,15 +577,15 @@ int8_t parseDHCPMSG(void) uint8_t * p; uint8_t * e; - uint8_t type; + uint8_t type = 0; uint8_t opt_len; - + if((len = getSn_RX_RSR(DHCP_SOCKET)) > 0) { len = WIZCHIP_EXPORT(recvfrom)(DHCP_SOCKET, (uint8_t *)pDHCPMSG, len, svr_addr, &svr_port); - #ifdef _DHCP_DEBUG_ + #ifdef _DHCP_DEBUG_ printf("DHCP message : %d.%d.%d.%d(%d) %d received. \r\n",svr_addr[0],svr_addr[1],svr_addr[2], svr_addr[3],svr_port, len); - #endif + #endif } else return 0; if (svr_port == DHCP_SERVER_PORT) { @@ -624,7 +624,7 @@ int8_t parseDHCPMSG(void) break; case routersOnSubnet : p++; - opt_len = *p++; + opt_len = *p++; DHCP_allocated_gw[0] = *p++; DHCP_allocated_gw[1] = *p++; DHCP_allocated_gw[2] = *p++; @@ -632,8 +632,8 @@ int8_t parseDHCPMSG(void) p = p + (opt_len - 4); break; case dns : - p++; - opt_len = *p++; + p++; + opt_len = *p++; DHCP_allocated_dns[0] = *p++; DHCP_allocated_dns[1] = *p++; DHCP_allocated_dns[2] = *p++; @@ -647,7 +647,7 @@ int8_t parseDHCPMSG(void) dhcp_lease_time = (dhcp_lease_time << 8) + *p++; dhcp_lease_time = (dhcp_lease_time << 8) + *p++; dhcp_lease_time = (dhcp_lease_time << 8) + *p++; - #ifdef _DHCP_DEBUG_ + #ifdef _DHCP_DEBUG_ dhcp_lease_time = 10; #endif break; @@ -740,7 +740,7 @@ uint8_t DHCP_run(void) case STATE_DHCP_LEASED : ret = DHCP_IP_LEASED; if ((dhcp_lease_time != INFINITE_LEASETIME) && ((dhcp_lease_time/2) < dhcp_tick_1s)) { - + #ifdef _DHCP_DEBUG_ printf("> Maintains the IP address \r\n"); #endif @@ -750,7 +750,7 @@ uint8_t DHCP_run(void) OLD_allocated_ip[1] = DHCP_allocated_ip[1]; OLD_allocated_ip[2] = DHCP_allocated_ip[2]; OLD_allocated_ip[3] = DHCP_allocated_ip[3]; - + DHCP_XID++; send_DHCP_REQUEST(); @@ -765,21 +765,21 @@ uint8_t DHCP_run(void) ret = DHCP_IP_LEASED; if (type == DHCP_ACK) { dhcp_retry_count = 0; - if (OLD_allocated_ip[0] != DHCP_allocated_ip[0] || + if (OLD_allocated_ip[0] != DHCP_allocated_ip[0] || OLD_allocated_ip[1] != DHCP_allocated_ip[1] || OLD_allocated_ip[2] != DHCP_allocated_ip[2] || - OLD_allocated_ip[3] != DHCP_allocated_ip[3]) + OLD_allocated_ip[3] != DHCP_allocated_ip[3]) { ret = DHCP_IP_CHANGED; dhcp_ip_update(); #ifdef _DHCP_DEBUG_ printf(">IP changed.\r\n"); #endif - + } #ifdef _DHCP_DEBUG_ else printf(">IP is continued.\r\n"); - #endif + #endif reset_DHCP_timeout(); dhcp_state = STATE_DHCP_LEASED; } else if (type == DHCP_NAK) { @@ -809,7 +809,7 @@ void DHCP_stop(void) uint8_t check_DHCP_timeout(void) { uint8_t ret = DHCP_RUNNING; - + if (dhcp_retry_count < MAX_DHCP_RETRY) { if (dhcp_tick_next < dhcp_tick_1s) { @@ -818,7 +818,7 @@ uint8_t check_DHCP_timeout(void) // printf("<<timeout>> state : STATE_DHCP_DISCOVER\r\n"); send_DHCP_DISCOVER(); break; - + case STATE_DHCP_REQUEST : // printf("<<timeout>> state : STATE_DHCP_REQUEST\r\n"); @@ -827,10 +827,10 @@ uint8_t check_DHCP_timeout(void) case STATE_DHCP_REREQUEST : // printf("<<timeout>> state : STATE_DHCP_REREQUEST\r\n"); - + send_DHCP_REQUEST(); break; - + default : break; } @@ -892,7 +892,7 @@ int8_t check_DHCP_leasedIP(void) return 0; } -} +} void DHCP_init(uint8_t s, DHCP_INIT_BUFFER_TYPE* buf) { @@ -903,11 +903,11 @@ void DHCP_init(uint8_t s, DHCP_INIT_BUFFER_TYPE* buf) // assign temporary mac address, you should be set SHAR before call this function. DHCP_CHADDR[0] = 0x00; DHCP_CHADDR[1] = 0x08; - DHCP_CHADDR[2] = 0xdc; + DHCP_CHADDR[2] = 0xdc; DHCP_CHADDR[3] = 0x00; DHCP_CHADDR[4] = 0x00; - DHCP_CHADDR[5] = 0x00; - setSHAR(DHCP_CHADDR); + DHCP_CHADDR[5] = 0x00; + setSHAR(DHCP_CHADDR); } DHCP_SOCKET = s; // SOCK_DHCP @@ -941,7 +941,7 @@ void getIPfromDHCP(uint8_t* ip) { ip[0] = DHCP_allocated_ip[0]; ip[1] = DHCP_allocated_ip[1]; - ip[2] = DHCP_allocated_ip[2]; + ip[2] = DHCP_allocated_ip[2]; ip[3] = DHCP_allocated_ip[3]; } @@ -950,7 +950,7 @@ void getGWfromDHCP(uint8_t* ip) ip[0] =DHCP_allocated_gw[0]; ip[1] =DHCP_allocated_gw[1]; ip[2] =DHCP_allocated_gw[2]; - ip[3] =DHCP_allocated_gw[3]; + ip[3] =DHCP_allocated_gw[3]; } void getSNfromDHCP(uint8_t* ip) @@ -958,7 +958,7 @@ void getSNfromDHCP(uint8_t* ip) ip[0] = DHCP_allocated_sn[0]; ip[1] = DHCP_allocated_sn[1]; ip[2] = DHCP_allocated_sn[2]; - ip[3] = DHCP_allocated_sn[3]; + ip[3] = DHCP_allocated_sn[3]; } void getDNSfromDHCP(uint8_t* ip) @@ -966,14 +966,10 @@ void getDNSfromDHCP(uint8_t* ip) ip[0] = DHCP_allocated_dns[0]; ip[1] = DHCP_allocated_dns[1]; ip[2] = DHCP_allocated_dns[2]; - ip[3] = DHCP_allocated_dns[3]; + ip[3] = DHCP_allocated_dns[3]; } uint32_t getDHCPLeasetime(void) { return dhcp_lease_time; } - - - - diff --git a/extmod/machine_i2c.c b/extmod/machine_i2c.c index b91f1a1eb..85b46a9f6 100644 --- a/extmod/machine_i2c.c +++ b/extmod/machine_i2c.c @@ -287,14 +287,14 @@ STATIC void machine_i2c_obj_init_helper(machine_i2c_obj_t *self, size_t n_args, mp_hal_i2c_init(self, args[ARG_freq].u_int); } -STATIC mp_obj_t machine_i2c_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +STATIC mp_obj_t machine_i2c_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { // check the id argument, if given if (n_args > 0) { if (args[0] != MP_OBJ_NEW_SMALL_INT(-1)) { #if defined(MICROPY_PY_MACHINE_I2C_MAKE_NEW) // dispatch to port-specific constructor - extern mp_obj_t MICROPY_PY_MACHINE_I2C_MAKE_NEW(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args); - return MICROPY_PY_MACHINE_I2C_MAKE_NEW(type, n_args, n_kw, args); + extern mp_obj_t MICROPY_PY_MACHINE_I2C_MAKE_NEW(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *all_args, mp_map_t *kw_args); + return MICROPY_PY_MACHINE_I2C_MAKE_NEW(type, n_args, args, kw_args); #else mp_raise_ValueError(translate("invalid I2C peripheral")); #endif @@ -306,9 +306,7 @@ STATIC mp_obj_t machine_i2c_make_new(const mp_obj_type_t *type, size_t n_args, s // create new soft I2C object machine_i2c_obj_t *self = m_new_obj(machine_i2c_obj_t); self->base.type = &machine_i2c_type; - mp_map_t kw_args; - mp_map_init_fixed_table(&kw_args, n_kw, args + n_args); - machine_i2c_obj_init_helper(self, n_args, args, &kw_args); + machine_i2c_obj_init_helper(self, n_args, args, kw_args); return (mp_obj_t)self; } diff --git a/extmod/machine_pinbase.c b/extmod/machine_pinbase.c index 070c5cde9..997a6fd99 100644 --- a/extmod/machine_pinbase.c +++ b/extmod/machine_pinbase.c @@ -45,11 +45,11 @@ STATIC const mp_pinbase_t pinbase_singleton = { .base = { &machine_pinbase_type }, }; -STATIC mp_obj_t pinbase_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +STATIC mp_obj_t pinbase_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { (void)type; (void)n_args; - (void)n_kw; (void)args; + (void)kw_args; return MP_OBJ_FROM_PTR(&pinbase_singleton); } diff --git a/extmod/machine_signal.c b/extmod/machine_signal.c index 3f9f5af94..62658cbb1 100644 --- a/extmod/machine_signal.c +++ b/extmod/machine_signal.c @@ -42,7 +42,7 @@ typedef struct _machine_signal_t { bool invert; } machine_signal_t; -STATIC mp_obj_t signal_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +STATIC mp_obj_t signal_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { mp_obj_t pin = args[0]; bool invert = false; @@ -96,9 +96,9 @@ STATIC mp_obj_t signal_make_new(const mp_obj_type_t *type, size_t n_args, size_t // Otherwise there should be 1 or 2 args { if (n_args == 1) { - if (n_kw == 0) { - } else if (n_kw == 1 && args[1] == MP_OBJ_NEW_QSTR(MP_QSTR_invert)) { - invert = mp_obj_is_true(args[2]); + if (kw_args == NULL || kw_args->used == 0) { + } else if (kw_args->used == 1 && kw_args->table[0].key == MP_OBJ_NEW_QSTR(MP_QSTR_invert)) { + invert = mp_obj_is_true(kw_args->table[0].value); } else { goto error; } @@ -133,7 +133,7 @@ STATIC mp_uint_t signal_ioctl(mp_obj_t self_in, mp_uint_t request, uintptr_t arg // fast method for getting/setting signal value STATIC mp_obj_t signal_call(mp_obj_t self_in, size_t n_args, size_t n_kw, const mp_obj_t *args) { - mp_arg_check_num(n_args, n_kw, 0, 1, false); + mp_arg_check_num_kw_array(n_args, n_kw, 0, 1, false); if (n_args == 0) { // get pin return MP_OBJ_NEW_SMALL_INT(mp_virtual_pin_read(self_in)); diff --git a/extmod/machine_spi.c b/extmod/machine_spi.c index 3bbab2824..c5707a3d0 100644 --- a/extmod/machine_spi.c +++ b/extmod/machine_spi.c @@ -43,16 +43,16 @@ /******************************************************************************/ // MicroPython bindings for generic machine.SPI -STATIC mp_obj_t mp_machine_soft_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args); +STATIC mp_obj_t mp_machine_soft_spi_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args); -mp_obj_t mp_machine_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +mp_obj_t mp_machine_spi_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { // check the id argument, if given if (n_args > 0) { if (args[0] != MP_OBJ_NEW_SMALL_INT(-1)) { #if defined(MICROPY_PY_MACHINE_SPI_MAKE_NEW) // dispatch to port-specific constructor - extern mp_obj_t MICROPY_PY_MACHINE_SPI_MAKE_NEW(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args); - return MICROPY_PY_MACHINE_SPI_MAKE_NEW(type, n_args, n_kw, args); + extern mp_obj_t MICROPY_PY_MACHINE_SPI_MAKE_NEW(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args); + return MICROPY_PY_MACHINE_SPI_MAKE_NEW(type, n_args, args, kw_args); #else mp_raise_ValueError(translate("invalid SPI peripheral")); #endif @@ -62,7 +62,7 @@ mp_obj_t mp_machine_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_ } // software SPI - return mp_machine_soft_spi_make_new(type, n_args, n_kw, args); + return mp_machine_soft_spi_make_new(type, n_args, args, kw_args); } STATIC mp_obj_t machine_spi_init(size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { @@ -180,7 +180,7 @@ STATIC void mp_machine_soft_spi_print(const mp_print_t *print, mp_obj_t self_in, mp_hal_pin_name(self->spi.sck), mp_hal_pin_name(self->spi.mosi), mp_hal_pin_name(self->spi.miso)); } -STATIC mp_obj_t mp_machine_soft_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { +STATIC mp_obj_t mp_machine_soft_spi_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *all_args, mp_map_t *kw_args) { enum { ARG_baudrate, ARG_polarity, ARG_phase, ARG_bits, ARG_firstbit, ARG_sck, ARG_mosi, ARG_miso }; static const mp_arg_t allowed_args[] = { { MP_QSTR_baudrate, MP_ARG_INT, {.u_int = 500000} }, @@ -193,7 +193,7 @@ STATIC mp_obj_t mp_machine_soft_spi_make_new(const mp_obj_type_t *type, size_t n { MP_QSTR_miso, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + mp_arg_parse_all(n_args, all_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); // create new object mp_machine_soft_spi_obj_t *self = m_new_obj(mp_machine_soft_spi_obj_t); diff --git a/extmod/modframebuf.c b/extmod/modframebuf.c index 413540540..f92312a23 100644 --- a/extmod/modframebuf.c +++ b/extmod/modframebuf.c @@ -259,8 +259,8 @@ STATIC void fill_rect(const mp_obj_framebuf_t *fb, int x, int y, int w, int h, u formats[fb->format].fill_rect(fb, x, y, xend - x, yend - y, col); } -STATIC mp_obj_t framebuf_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { - mp_arg_check_num(n_args, n_kw, 4, 5, false); +STATIC mp_obj_t framebuf_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 4, 5, false); mp_obj_framebuf_t *o = m_new_obj(mp_obj_framebuf_t); o->base.type = type; diff --git a/extmod/moductypes.c b/extmod/moductypes.c index e627cd146..9eea30bf3 100644 --- a/extmod/moductypes.c +++ b/extmod/moductypes.c @@ -122,8 +122,8 @@ STATIC NORETURN void syntax_error(void) { mp_raise_TypeError(translate("syntax error in uctypes descriptor")); } -STATIC mp_obj_t uctypes_struct_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { - mp_arg_check_num(n_args, n_kw, 2, 3, false); +STATIC mp_obj_t uctypes_struct_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 2, 3, false); mp_obj_uctypes_struct_t *o = m_new_obj(mp_obj_uctypes_struct_t); o->base.type = type; o->addr = (void*)(uintptr_t)mp_obj_int_get_truncated(args[0]); diff --git a/extmod/moduhashlib.c b/extmod/moduhashlib.c index 1618594e9..970c63da8 100644 --- a/extmod/moduhashlib.c +++ b/extmod/moduhashlib.c @@ -66,8 +66,8 @@ STATIC mp_obj_t uhashlib_sha256_update(mp_obj_t self_in, mp_obj_t arg); #if MICROPY_SSL_MBEDTLS -STATIC mp_obj_t uhashlib_sha256_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { - mp_arg_check_num(n_args, n_kw, 0, 1, false); +STATIC mp_obj_t uhashlib_sha256_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 0, 1, false); mp_obj_hash_t *o = m_new_obj_var(mp_obj_hash_t, char, sizeof(mbedtls_sha256_context)); o->base.type = type; mbedtls_sha256_init((mbedtls_sha256_context*)&o->state); @@ -104,8 +104,8 @@ static void check_not_unicode(const mp_obj_t arg) { #endif } -STATIC mp_obj_t uhashlib_sha256_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { - mp_arg_check_num(n_args, n_kw, 0, 1, false); +STATIC mp_obj_t uhashlib_sha256_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 0, 1, false); mp_obj_hash_t *o = m_new_obj_var(mp_obj_hash_t, char, sizeof(CRYAL_SHA256_CTX)); o->base.type = type; sha256_init((CRYAL_SHA256_CTX*)o->state); @@ -155,8 +155,8 @@ STATIC const mp_obj_type_t uhashlib_sha256_type = { STATIC mp_obj_t uhashlib_sha1_update(mp_obj_t self_in, mp_obj_t arg); #if MICROPY_SSL_AXTLS -STATIC mp_obj_t uhashlib_sha1_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { - mp_arg_check_num(n_args, n_kw, 0, 1, false); +STATIC mp_obj_t uhashlib_sha1_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 0, 1, false); mp_obj_hash_t *o = m_new_obj_var(mp_obj_hash_t, char, sizeof(SHA1_CTX)); o->base.type = type; SHA1_Init((SHA1_CTX*)o->state); diff --git a/extmod/modujson.c b/extmod/modujson.c index ea6c8b40f..6b24bf578 100644 --- a/extmod/modujson.c +++ b/extmod/modujson.c @@ -292,7 +292,11 @@ STATIC mp_obj_t mod_ujson_loads(mp_obj_t obj) { STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_ujson_loads_obj, mod_ujson_loads); STATIC const mp_rom_map_elem_t mp_module_ujson_globals_table[] = { +#if CIRCUITPY + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_json) }, +#else { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_ujson) }, +#endif { MP_ROM_QSTR(MP_QSTR_dump), MP_ROM_PTR(&mod_ujson_dump_obj) }, { MP_ROM_QSTR(MP_QSTR_dumps), MP_ROM_PTR(&mod_ujson_dumps_obj) }, { MP_ROM_QSTR(MP_QSTR_load), MP_ROM_PTR(&mod_ujson_load_obj) }, diff --git a/extmod/modure.c b/extmod/modure.c index 1a7027026..125afef4d 100644 --- a/extmod/modure.c +++ b/extmod/modure.c @@ -77,8 +77,83 @@ STATIC mp_obj_t match_group(mp_obj_t self_in, mp_obj_t no_in) { } MP_DEFINE_CONST_FUN_OBJ_2(match_group_obj, match_group); +#if MICROPY_PY_URE_MATCH_GROUPS + +STATIC mp_obj_t match_groups(mp_obj_t self_in) { + mp_obj_match_t *self = MP_OBJ_TO_PTR(self_in); + if (self->num_matches <= 1) { + return mp_const_empty_tuple; + } + mp_obj_tuple_t *groups = MP_OBJ_TO_PTR(mp_obj_new_tuple(self->num_matches - 1, NULL)); + for (int i = 1; i < self->num_matches; ++i) { + groups->items[i - 1] = match_group(self_in, MP_OBJ_NEW_SMALL_INT(i)); + } + return MP_OBJ_FROM_PTR(groups); +} +MP_DEFINE_CONST_FUN_OBJ_1(match_groups_obj, match_groups); + +#endif + +#if MICROPY_PY_URE_MATCH_SPAN_START_END + +STATIC void match_span_helper(size_t n_args, const mp_obj_t *args, mp_obj_t span[2]) { + mp_obj_match_t *self = MP_OBJ_TO_PTR(args[0]); + + mp_int_t no = 0; + if (n_args == 2) { + no = mp_obj_get_int(args[1]); + if (no < 0 || no >= self->num_matches) { + nlr_raise(mp_obj_new_exception_arg1(&mp_type_IndexError, args[1])); + } + } + + mp_int_t s = -1; + mp_int_t e = -1; + const char *start = self->caps[no * 2]; + if (start != NULL) { + // have a match for this group + const char *begin = mp_obj_str_get_str(self->str); + s = start - begin; + e = self->caps[no * 2 + 1] - begin; + } + + span[0] = mp_obj_new_int(s); + span[1] = mp_obj_new_int(e); +} + +STATIC mp_obj_t match_span(size_t n_args, const mp_obj_t *args) { + mp_obj_t span[2]; + match_span_helper(n_args, args, span); + return mp_obj_new_tuple(2, span); +} +MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(match_span_obj, 1, 2, match_span); + +STATIC mp_obj_t match_start(size_t n_args, const mp_obj_t *args) { + mp_obj_t span[2]; + match_span_helper(n_args, args, span); + return span[0]; +} +MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(match_start_obj, 1, 2, match_start); + +STATIC mp_obj_t match_end(size_t n_args, const mp_obj_t *args) { + mp_obj_t span[2]; + match_span_helper(n_args, args, span); + return span[1]; +} +MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(match_end_obj, 1, 2, match_end); + +#endif + STATIC const mp_rom_map_elem_t match_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_group), MP_ROM_PTR(&match_group_obj) }, + #if MICROPY_PY_URE_MATCH_GROUPS + { MP_ROM_QSTR(MP_QSTR_groups), MP_ROM_PTR(&match_groups_obj) }, + #endif + #if MICROPY_PY_URE_MATCH_SPAN_START_END + { MP_ROM_QSTR(MP_QSTR_span), MP_ROM_PTR(&match_span_obj) }, + { MP_ROM_QSTR(MP_QSTR_start), MP_ROM_PTR(&match_start_obj) }, + { MP_ROM_QSTR(MP_QSTR_end), MP_ROM_PTR(&match_end_obj) }, + #endif }; STATIC MP_DEFINE_CONST_DICT(match_locals_dict, match_locals_dict_table); @@ -103,6 +178,35 @@ STATIC mp_obj_t ure_exec(bool is_anchored, uint n_args, const mp_obj_t *args) { size_t len; subj.begin = mp_obj_str_get_data(args[1], &len); subj.end = subj.begin + len; +#if MICROPY_PY_URE_MATCH_SPAN_START_END + if (n_args > 2) { + const mp_obj_type_t *self_type = mp_obj_get_type(args[1]); + mp_int_t str_len = MP_OBJ_SMALL_INT_VALUE(mp_obj_len_maybe(args[1])); + const byte *begin = (const byte *)subj.begin; + + int pos = mp_obj_get_int(args[2]); + if (pos >= str_len) { + return mp_const_none; + } + if (pos < 0) { + pos = 0; + } + const byte *pos_ptr = str_index_to_ptr(self_type, begin, len, MP_OBJ_NEW_SMALL_INT(pos), true); + + const byte *endpos_ptr = (const byte *)subj.end; + if (n_args > 3) { + int endpos = mp_obj_get_int(args[3]); + if (endpos <= pos) { + return mp_const_none; + } + // Will cap to length + endpos_ptr = str_index_to_ptr(self_type, begin, len, args[3], true); + } + + subj.begin = (const char *)pos_ptr; + subj.end = (const char *)endpos_ptr; + } +#endif int caps_num = (self->re.sub + 1) * 2; mp_obj_match_t *match = m_new_obj_var(mp_obj_match_t, char*, caps_num); // cast is a workaround for a bug in msvc: it treats const char** as a const pointer instead of a pointer to pointer to const char @@ -174,17 +278,138 @@ STATIC mp_obj_t re_split(size_t n_args, const mp_obj_t *args) { } MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(re_split_obj, 2, 3, re_split); +#if MICROPY_PY_URE_SUB + +STATIC mp_obj_t re_sub_helper(mp_obj_t self_in, size_t n_args, const mp_obj_t *args) { + mp_obj_re_t *self = MP_OBJ_TO_PTR(self_in); + mp_obj_t replace = args[1]; + mp_obj_t where = args[2]; + mp_int_t count = 0; + if (n_args > 3) { + count = mp_obj_get_int(args[3]); + // Note: flags are currently ignored + } + + size_t where_len; + const char *where_str = mp_obj_str_get_data(where, &where_len); + Subject subj; + subj.begin = where_str; + subj.end = subj.begin + where_len; + int caps_num = (self->re.sub + 1) * 2; + + vstr_t vstr_return; + vstr_return.buf = NULL; // We'll init the vstr after the first match + mp_obj_match_t *match = mp_local_alloc(sizeof(mp_obj_match_t) + caps_num * sizeof(char*)); + match->base.type = &match_type; + match->num_matches = caps_num / 2; // caps_num counts start and end pointers + match->str = where; + + for (;;) { + // cast is a workaround for a bug in msvc: it treats const char** as a const pointer instead of a pointer to pointer to const char + memset((char*)match->caps, 0, caps_num * sizeof(char*)); + int res = re1_5_recursiveloopprog(&self->re, &subj, match->caps, caps_num, false); + + // If we didn't have a match, or had an empty match, it's time to stop + if (!res || match->caps[0] == match->caps[1]) { + break; + } + + // Initialise the vstr if it's not already + if (vstr_return.buf == NULL) { + vstr_init(&vstr_return, match->caps[0] - subj.begin); + } + + // Add pre-match string + vstr_add_strn(&vstr_return, subj.begin, match->caps[0] - subj.begin); + + // Get replacement string + const char* repl = mp_obj_str_get_str((mp_obj_is_callable(replace) ? mp_call_function_1(replace, MP_OBJ_FROM_PTR(match)) : replace)); + + // Append replacement string to result, substituting any regex groups + while (*repl != '\0') { + if (*repl == '\\') { + ++repl; + bool is_g_format = false; + if (*repl == 'g' && repl[1] == '<') { + // Group specified with syntax "\g<number>" + repl += 2; + is_g_format = true; + } + + if ('0' <= *repl && *repl <= '9') { + // Group specified with syntax "\g<number>" or "\number" + unsigned int match_no = 0; + do { + match_no = match_no * 10 + (*repl++ - '0'); + } while ('0' <= *repl && *repl <= '9'); + if (is_g_format && *repl == '>') { + ++repl; + } + + if (match_no >= (unsigned int)match->num_matches) { + nlr_raise(mp_obj_new_exception_arg1(&mp_type_IndexError, MP_OBJ_NEW_SMALL_INT(match_no))); + } + + const char *start_match = match->caps[match_no * 2]; + if (start_match != NULL) { + // Add the substring matched by group + const char *end_match = match->caps[match_no * 2 + 1]; + vstr_add_strn(&vstr_return, start_match, end_match - start_match); + } + } + } else { + // Just add the current byte from the replacement string + vstr_add_byte(&vstr_return, *repl++); + } + } + + // Move start pointer to end of last match + subj.begin = match->caps[1]; + + // Stop substitutions if count was given and gets to 0 + if (count > 0 && --count == 0) { + break; + } + } + + mp_local_free(match); + + if (vstr_return.buf == NULL) { + // Optimisation for case of no substitutions + return where; + } + + // Add post-match string + vstr_add_strn(&vstr_return, subj.begin, subj.end - subj.begin); + + return mp_obj_new_str_from_vstr(mp_obj_get_type(where), &vstr_return); +} + +STATIC mp_obj_t re_sub(size_t n_args, const mp_obj_t *args) { + return re_sub_helper(args[0], n_args, args); +} +MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(re_sub_obj, 3, 5, re_sub); + +#endif + STATIC const mp_rom_map_elem_t re_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_match), MP_ROM_PTR(&re_match_obj) }, { MP_ROM_QSTR(MP_QSTR_search), MP_ROM_PTR(&re_search_obj) }, { MP_ROM_QSTR(MP_QSTR_split), MP_ROM_PTR(&re_split_obj) }, + #if MICROPY_PY_URE_SUB + { MP_ROM_QSTR(MP_QSTR_sub), MP_ROM_PTR(&re_sub_obj) }, + #endif }; STATIC MP_DEFINE_CONST_DICT(re_locals_dict, re_locals_dict_table); STATIC const mp_obj_type_t re_type = { { &mp_type_type }, +#if CIRCUITPY + .name = MP_QSTR_re, +#else .name = MP_QSTR_ure, +#endif .print = re_print, .locals_dict = (void*)&re_locals_dict, }; @@ -232,11 +457,26 @@ STATIC mp_obj_t mod_re_search(size_t n_args, const mp_obj_t *args) { } MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_re_search_obj, 2, 4, mod_re_search); +#if MICROPY_PY_URE_SUB +STATIC mp_obj_t mod_re_sub(size_t n_args, const mp_obj_t *args) { + mp_obj_t self = mod_re_compile(1, args); + return re_sub_helper(self, n_args, args); +} +MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_re_sub_obj, 3, 5, mod_re_sub); +#endif + STATIC const mp_rom_map_elem_t mp_module_re_globals_table[] = { +#if CIRCUITPY + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_re) }, +#else { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_ure) }, +#endif { MP_ROM_QSTR(MP_QSTR_compile), MP_ROM_PTR(&mod_re_compile_obj) }, { MP_ROM_QSTR(MP_QSTR_match), MP_ROM_PTR(&mod_re_match_obj) }, { MP_ROM_QSTR(MP_QSTR_search), MP_ROM_PTR(&mod_re_search_obj) }, + #if MICROPY_PY_URE_SUB + { MP_ROM_QSTR(MP_QSTR_sub), MP_ROM_PTR(&mod_re_sub_obj) }, + #endif { MP_ROM_QSTR(MP_QSTR_DEBUG), MP_ROM_INT(FLAG_DEBUG) }, }; diff --git a/extmod/modutimeq.c b/extmod/modutimeq.c index 614820443..99b51016d 100644 --- a/extmod/modutimeq.c +++ b/extmod/modutimeq.c @@ -76,8 +76,8 @@ STATIC bool time_less_than(struct qentry *item, struct qentry *parent) { return res && res < (MODULO / 2); } -STATIC mp_obj_t utimeq_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { - mp_arg_check_num(n_args, n_kw, 1, 1, false); +STATIC mp_obj_t utimeq_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 1, 1, false); mp_uint_t alloc = mp_obj_get_int(args[0]); mp_obj_utimeq_t *o = m_new_obj_var(mp_obj_utimeq_t, struct qentry, alloc); o->base.type = type; diff --git a/extmod/moduzlib.c b/extmod/moduzlib.c index 253deac1e..7f15d02a8 100644 --- a/extmod/moduzlib.c +++ b/extmod/moduzlib.c @@ -69,8 +69,8 @@ STATIC int read_src_stream(TINF_DATA *data) { return c; } -STATIC mp_obj_t decompio_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { - mp_arg_check_num(n_args, n_kw, 1, 2, false); +STATIC mp_obj_t decompio_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 1, 2, false); mp_get_stream_raise(args[0], MP_STREAM_OP_READ); mp_obj_decompio_t *o = m_new_obj(mp_obj_decompio_t); o->base.type = type; diff --git a/extmod/modwebsocket.c b/extmod/modwebsocket.c index c556f2b77..997c7e262 100644 --- a/extmod/modwebsocket.c +++ b/extmod/modwebsocket.c @@ -57,8 +57,8 @@ typedef struct _mp_obj_websocket_t { STATIC mp_uint_t websocket_write(mp_obj_t self_in, const void *buf, mp_uint_t size, int *errcode); -STATIC mp_obj_t websocket_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { - mp_arg_check_num(n_args, n_kw, 1, 2, false); +STATIC mp_obj_t websocket_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 1, 2, false); mp_get_stream_raise(args[0], MP_STREAM_OP_READ | MP_STREAM_OP_WRITE | MP_STREAM_OP_IOCTL); mp_obj_websocket_t *o = m_new_obj(mp_obj_websocket_t); o->base.type = type; diff --git a/extmod/re1.5/compilecode.c b/extmod/re1.5/compilecode.c index a685a508a..01d3d1498 100644 --- a/extmod/re1.5/compilecode.c +++ b/extmod/re1.5/compilecode.c @@ -10,6 +10,29 @@ #define EMIT(at, byte) (code ? (code[at] = byte) : (at)) #define PC (prog->bytelen) + +static char unescape(char c) { + switch (c) { + case 'a': + return '\a'; + case 'b': + return '\b'; + case 'f': + return '\f'; + case 'n': + return '\n'; + case 'r': + return '\r'; + case 'v': + return '\v'; + case 'x': + return '\\'; + default: + return c; + } +} + + static const char *_compilecode(const char *re, ByteProg *prog, int sizecode) { char *code = sizecode ? NULL : prog->insts; @@ -22,13 +45,16 @@ static const char *_compilecode(const char *re, ByteProg *prog, int sizecode) case '\\': re++; if (!*re) return NULL; // Trailing backslash + term = PC; if ((*re | 0x20) == 'd' || (*re | 0x20) == 's' || (*re | 0x20) == 'w') { - term = PC; EMIT(PC++, NamedClass); EMIT(PC++, *re); - prog->len++; - break; + } else { + EMIT(PC++, Char); + EMIT(PC++, unescape(*re)); } + prog->len++; + break; default: term = PC; EMIT(PC++, Char); @@ -54,11 +80,21 @@ static const char *_compilecode(const char *re, ByteProg *prog, int sizecode) prog->len++; for (cnt = 0; *re != ']'; re++, cnt++) { if (!*re) return NULL; - EMIT(PC++, *re); + if (*re == '\\') { + re += 1; + EMIT(PC++, unescape(*re)); + } else { + EMIT(PC++, *re); + } if (re[1] == '-' && re[2] != ']') { re += 2; } - EMIT(PC++, *re); + if (*re == '\\') { + re += 1; + EMIT(PC++, unescape(*re)); + } else { + EMIT(PC++, *re); + } } EMIT(term + 1, cnt); break; diff --git a/extmod/vfs.c b/extmod/vfs.c index cc794aad5..7d6e6999b 100644 --- a/extmod/vfs.c +++ b/extmod/vfs.c @@ -176,7 +176,7 @@ mp_obj_t mp_vfs_mount(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args // auto-detect the filesystem and create the corresponding VFS entity. // (At the moment we only support FAT filesystems.) #if MICROPY_VFS_FAT - vfs_obj = mp_fat_vfs_type.make_new(&mp_fat_vfs_type, 1, 0, &vfs_obj); + vfs_obj = mp_fat_vfs_type.make_new(&mp_fat_vfs_type, 1, &vfs_obj, NULL); #endif } diff --git a/extmod/vfs_fat.c b/extmod/vfs_fat.c index 945ba9e80..20d3e3e5c 100644 --- a/extmod/vfs_fat.c +++ b/extmod/vfs_fat.c @@ -39,7 +39,7 @@ #include "lib/oofatfs/ff.h" #include "extmod/vfs_fat.h" #include "lib/timeutils/timeutils.h" - +#include "supervisor/filesystem.h" #include "supervisor/shared/translate.h" #if _MAX_SS == _MIN_SS @@ -65,8 +65,8 @@ mp_import_stat_t fat_vfs_import_stat(void *vfs_in, const char *path) { return MP_IMPORT_STAT_NO_EXIST; } -STATIC mp_obj_t fat_vfs_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { - mp_arg_check_num(n_args, n_kw, 1, 1, false); +STATIC mp_obj_t fat_vfs_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 1, 1, false); // create new object fs_user_mount_t *vfs = m_new_obj(fs_user_mount_t); @@ -99,6 +99,12 @@ STATIC mp_obj_t fat_vfs_make_new(const mp_obj_type_t *type, size_t n_args, size_ return MP_OBJ_FROM_PTR(vfs); } +STATIC void verify_fs_writable(fs_user_mount_t *vfs) { + if (!filesystem_is_writable_by_python(vfs)) { + mp_raise_OSError(MP_EROFS); + } +} + #if _FS_REENTRANT STATIC mp_obj_t fat_vfs_del(mp_obj_t self_in) { mp_obj_fat_vfs_t *self = MP_OBJ_TO_PTR(self_in); @@ -111,7 +117,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(fat_vfs_del_obj, fat_vfs_del); STATIC mp_obj_t fat_vfs_mkfs(mp_obj_t bdev_in) { // create new object - fs_user_mount_t *vfs = MP_OBJ_TO_PTR(fat_vfs_make_new(&mp_fat_vfs_type, 1, 0, &bdev_in)); + fs_user_mount_t *vfs = MP_OBJ_TO_PTR(fat_vfs_make_new(&mp_fat_vfs_type, 1, &bdev_in, NULL)); // make the filesystem uint8_t working_buf[_MAX_SS]; @@ -201,6 +207,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(fat_vfs_ilistdir_obj, 1, 2, fat_vfs_i STATIC mp_obj_t fat_vfs_remove_internal(mp_obj_t vfs_in, mp_obj_t path_in, mp_int_t attr) { mp_obj_fat_vfs_t *self = MP_OBJ_TO_PTR(vfs_in); + verify_fs_writable(self); const char *path = mp_obj_str_get_str(path_in); FILINFO fno; @@ -235,9 +242,26 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(fat_vfs_rmdir_obj, fat_vfs_rmdir); STATIC mp_obj_t fat_vfs_rename(mp_obj_t vfs_in, mp_obj_t path_in, mp_obj_t path_out) { mp_obj_fat_vfs_t *self = MP_OBJ_TO_PTR(vfs_in); + verify_fs_writable(self); const char *old_path = mp_obj_str_get_str(path_in); const char *new_path = mp_obj_str_get_str(path_out); - FRESULT res = f_rename(&self->fatfs, old_path, new_path); + + // Check to see if we're moving a directory into itself. This occurs when we're moving a + // directory where the old path is a prefix of the new and the next character is a "/" and thus + // preserves the original directory name. + FILINFO fno; + FRESULT res = f_stat(&self->fatfs, old_path, &fno); + if (res != FR_OK) { + mp_raise_OSError(fresult_to_errno_table[res]); + } + if ((fno.fattrib & AM_DIR) != 0 && + strlen(new_path) > strlen(old_path) && + new_path[strlen(old_path)] == '/' && + strncmp(old_path, new_path, strlen(old_path)) == 0) { + mp_raise_OSError(MP_EINVAL); + } + + res = f_rename(&self->fatfs, old_path, new_path); if (res == FR_EXIST) { // if new_path exists then try removing it (but only if it's a file) fat_vfs_remove_internal(vfs_in, path_out, 0); // 0 == file attribute @@ -255,6 +279,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_3(fat_vfs_rename_obj, fat_vfs_rename); STATIC mp_obj_t fat_vfs_mkdir(mp_obj_t vfs_in, mp_obj_t path_o) { mp_obj_fat_vfs_t *self = MP_OBJ_TO_PTR(vfs_in); + verify_fs_writable(self); const char *path = mp_obj_str_get_str(path_o); FRESULT res = f_mkdir(&self->fatfs, path); if (res == FR_OK) { @@ -419,6 +444,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(fat_vfs_getlabel_obj, vfs_fat_getlabel); STATIC mp_obj_t vfs_fat_setlabel(mp_obj_t self_in, mp_obj_t label_in) { fs_user_mount_t *self = MP_OBJ_TO_PTR(self_in); + verify_fs_writable(self); const char *label_str = mp_obj_str_get_str(label_in); FRESULT res = f_setlabel(&self->fatfs, label_str); if (res != FR_OK) { diff --git a/extmod/vfs_fat.h b/extmod/vfs_fat.h index dd5e5ffcb..08b03d0d1 100644 --- a/extmod/vfs_fat.h +++ b/extmod/vfs_fat.h @@ -38,6 +38,8 @@ #define FSUSER_NO_FILESYSTEM (0x0008) // the block device has no filesystem on it // Device is writable over USB and read-only to MicroPython. #define FSUSER_USB_WRITABLE (0x0010) +// Bit set when the above flag is checked before opening a file for write. +#define FSUSER_CONCURRENT_WRITE_PROTECTED (0x0020) typedef struct _fs_user_mount_t { mp_obj_base_t base; diff --git a/extmod/vfs_fat_file.c b/extmod/vfs_fat_file.c index e3eebc9c4..6aad1884c 100644 --- a/extmod/vfs_fat_file.c +++ b/extmod/vfs_fat_file.c @@ -34,6 +34,7 @@ #include "py/mperrno.h" #include "lib/oofatfs/ff.h" #include "extmod/vfs_fat.h" +#include "supervisor/filesystem.h" // this table converts from FRESULT to POSIX errno const byte fresult_to_errno_table[20] = { @@ -186,17 +187,37 @@ STATIC mp_obj_t file_open(fs_user_mount_t *vfs, const mp_obj_type_t *type, mp_ar break; } } + assert(vfs != NULL); + if ((mode & FA_WRITE) != 0 && !filesystem_is_writable_by_python(vfs)) { + mp_raise_OSError(MP_EROFS); + } pyb_file_obj_t *o = m_new_obj_with_finaliser(pyb_file_obj_t); o->base.type = type; const char *fname = mp_obj_str_get_str(args[0].u_obj); - assert(vfs != NULL); FRESULT res = f_open(&vfs->fatfs, &o->fp, fname, mode); if (res != FR_OK) { m_del_obj(pyb_file_obj_t, o); mp_raise_OSError(fresult_to_errno_table[res]); } + // If we're reading, turn on fast seek. + if (mode == FA_READ) { + // one call to determine how much space we need. + DWORD temp_table[2]; + temp_table[0] = 2; + o->fp.cltbl = temp_table; + f_lseek(&o->fp, CREATE_LINKMAP); + DWORD size = (temp_table[0] + 1) * 2; + o->fp.cltbl = m_malloc_maybe(size * sizeof(DWORD), false); + if (o->fp.cltbl != NULL) { + o->fp.cltbl[0] = size; + res = f_lseek(&o->fp, CREATE_LINKMAP); + if (res != FR_OK) { + o->fp.cltbl = NULL; + } + } + } // for 'a' mode, we must begin at the end of the file if ((mode & FA_OPEN_ALWAYS) != 0) { @@ -206,9 +227,9 @@ STATIC mp_obj_t file_open(fs_user_mount_t *vfs, const mp_obj_type_t *type, mp_ar return MP_OBJ_FROM_PTR(o); } -STATIC mp_obj_t file_obj_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +STATIC mp_obj_t file_obj_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { mp_arg_val_t arg_vals[FILE_OPEN_NUM_ARGS]; - mp_arg_parse_all_kw_array(n_args, n_kw, args, FILE_OPEN_NUM_ARGS, file_open_args, arg_vals); + mp_arg_parse_all(n_args, args, kw_args, FILE_OPEN_NUM_ARGS, file_open_args, arg_vals); return file_open(NULL, type, arg_vals); } diff --git a/extmod/vfs_posix.c b/extmod/vfs_posix.c index 39e197f29..d28dfe451 100644 --- a/extmod/vfs_posix.c +++ b/extmod/vfs_posix.c @@ -90,8 +90,8 @@ STATIC mp_import_stat_t mp_vfs_posix_import_stat(void *self_in, const char *path return MP_IMPORT_STAT_NO_EXIST; } -STATIC mp_obj_t vfs_posix_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { - mp_arg_check_num(n_args, n_kw, 0, 1, false); +STATIC mp_obj_t vfs_posix_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 0, 1, false); mp_obj_vfs_posix_t *vfs = m_new_obj(mp_obj_vfs_posix_t); vfs->base.type = type; diff --git a/extmod/vfs_posix_file.c b/extmod/vfs_posix_file.c index 3eca47eb4..b760b3847 100644 --- a/extmod/vfs_posix_file.c +++ b/extmod/vfs_posix_file.c @@ -109,14 +109,14 @@ mp_obj_t mp_vfs_posix_file_open(const mp_obj_type_t *type, mp_obj_t file_in, mp_ return MP_OBJ_FROM_PTR(o); } -STATIC mp_obj_t vfs_posix_file_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +STATIC mp_obj_t vfs_posix_file_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { static const mp_arg_t allowed_args[] = { { MP_QSTR_file, MP_ARG_OBJ | MP_ARG_REQUIRED, {.u_rom_obj = MP_ROM_PTR(&mp_const_none_obj)} }, { MP_QSTR_mode, MP_ARG_OBJ, {.u_rom_obj = MP_ROM_QSTR(MP_QSTR_r)} }, }; mp_arg_val_t arg_vals[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all_kw_array(n_args, n_kw, args, MP_ARRAY_SIZE(allowed_args), allowed_args, arg_vals); + mp_arg_parse_all(n_args, args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, arg_vals); return mp_vfs_posix_file_open(type, arg_vals[0].u_obj, arg_vals[1].u_obj); } diff --git a/frozen/Adafruit_CircuitPython_BusDevice b/frozen/Adafruit_CircuitPython_BusDevice -Subproject d86fc7e81d51465ca1eae6f8c1141f81f065f5a +Subproject 6b3402965999d068316882d63fae3ab26006477 diff --git a/frozen/Adafruit_CircuitPython_CircuitPlayground b/frozen/Adafruit_CircuitPython_CircuitPlayground -Subproject f4ee725fb93fd1a31666d3f71d10c94eb96df7c +Subproject 1d38fd81edd30f1bd70c0cfe77819ab610ea89a diff --git a/frozen/Adafruit_CircuitPython_Crickit b/frozen/Adafruit_CircuitPython_Crickit -Subproject 412392c8bdb6b4378e007eb7974c76b92fa9ff1 +Subproject a1686803566793ec2de7e043bf6822e47cfa31d diff --git a/frozen/Adafruit_CircuitPython_DotStar b/frozen/Adafruit_CircuitPython_DotStar -Subproject 03c24157d46672c723021686f7a838cfeb2db2b +Subproject 409e90902ac49720c4add985e8e1a1660bbe63a diff --git a/frozen/Adafruit_CircuitPython_HID b/frozen/Adafruit_CircuitPython_HID -Subproject f5e70e09250f2a25ebb6487a30a763041644c5d +Subproject 836bb9843fd793683061c15150944f8897d806e diff --git a/frozen/Adafruit_CircuitPython_IRRemote b/frozen/Adafruit_CircuitPython_IRRemote -Subproject ec11164ec6682094a48d0f9848d2c4c89c08f3b +Subproject aa4428f304b982aa19a5800822e78c47dc8a3b6 diff --git a/frozen/Adafruit_CircuitPython_LIS3DH b/frozen/Adafruit_CircuitPython_LIS3DH -Subproject 6298cd363811ad6ac10d4325c898be87a70d7bb +Subproject a03f9011279f9e630549432589463912831fcee diff --git a/frozen/Adafruit_CircuitPython_Motor b/frozen/Adafruit_CircuitPython_Motor -Subproject 4421e79661002ff8da6c0c4f22940ec843ee300 +Subproject 98563ab65800aac6464f671c0d005df56ecaa6c diff --git a/frozen/Adafruit_CircuitPython_NeoPixel b/frozen/Adafruit_CircuitPython_NeoPixel -Subproject 72e8f3855ecd136641d536a49311c38ee4f76f3 +Subproject c0ed34813a608b64ed044826553918ddbad12f0 diff --git a/frozen/Adafruit_CircuitPython_Thermistor b/frozen/Adafruit_CircuitPython_Thermistor -Subproject eae584918e72ff5fa323825470f276b31829ef9 +Subproject 893c5ec6a9aeef38284985074c2058e87754ad3 diff --git a/frozen/Adafruit_CircuitPython_seesaw b/frozen/Adafruit_CircuitPython_seesaw -Subproject c92c22ff029ee05bd392299cf25887e9af48903 +Subproject 1d12cfc0b729b4ae0a2f3f4e7c1933a0fbd3b16 diff --git a/frozen/circuitpython-stage b/frozen/circuitpython-stage new file mode 160000 +Subproject d8a9d8c1d73041e4cc5669c5441f531ecba517f diff --git a/frozen/pew-pewpew-standalone-10.x b/frozen/pew-pewpew-standalone-10.x new file mode 160000 +Subproject 87755e088150cc9bce42f4104cbd74d91b923c6 diff --git a/lib/libm_dbl/pow.c b/lib/libm_dbl/pow.c index 3ddc1b6ff..4aef8a5b3 100644 --- a/lib/libm_dbl/pow.c +++ b/lib/libm_dbl/pow.c @@ -125,13 +125,13 @@ double pow(double x, double y) else if (iy >= 0x3ff00000) { k = (iy>>20) - 0x3ff; /* exponent */ if (k > 20) { - uint32_t j = ly>>(52-k); - if ((j<<(52-k)) == ly) - yisint = 2 - (j&1); + uint32_t j2 = ly>>(52-k); + if ((j2<<(52-k)) == ly) + yisint = 2 - (j2&1); } else if (ly == 0) { - uint32_t j = iy>>(20-k); - if ((j<<(20-k)) == iy) - yisint = 2 - (j&1); + uint32_t j2 = iy>>(20-k); + if ((j2<<(20-k)) == (uint32_t)iy) + yisint = 2 - (j2&1); } } } diff --git a/lib/oofatfs/ffconf.h b/lib/oofatfs/ffconf.h index 315101f0e..214311b4c 100644 --- a/lib/oofatfs/ffconf.h +++ b/lib/oofatfs/ffconf.h @@ -74,7 +74,7 @@ /* This option switches f_mkfs() function. (0:Disable or 1:Enable) */ -#define _USE_FASTSEEK 0 +#define _USE_FASTSEEK 1 /* This option switches fast seek function. (0:Disable or 1:Enable) */ diff --git a/lib/tinyusb b/lib/tinyusb -Subproject 3bb53273cd3770328f55ba317af3df0cce4333c +Subproject 547cc045fa1d8862e7e00c1d7b4a0026531d009 diff --git a/lib/utils/pyexec.c b/lib/utils/pyexec.c index e637fe544..e8a1983b0 100755 --- a/lib/utils/pyexec.c +++ b/lib/utils/pyexec.c @@ -89,6 +89,9 @@ STATIC int parse_compile_execute(const void *source, mp_parse_input_kind_t input } // source is a lexer, parse and compile the script qstr source_name = lex->source_name; + if (input_kind == MP_PARSE_FILE_INPUT) { + mp_store_global(MP_QSTR___file__, MP_OBJ_NEW_QSTR(source_name)); + } mp_parse_tree_t parse_tree = mp_parse(lex, input_kind); module_fun = mp_compile(&parse_tree, source_name, MP_EMIT_OPT_NONE, exec_flags & EXEC_FLAG_IS_REPL); // Clear the parse tree because it has a heap pointer we don't need anymore. diff --git a/lib/utils/sys_stdio_mphal.c b/lib/utils/sys_stdio_mphal.c index fc8a74e7d..266783f37 100644 --- a/lib/utils/sys_stdio_mphal.c +++ b/lib/utils/sys_stdio_mphal.c @@ -53,12 +53,12 @@ STATIC const sys_stdio_obj_t stdio_buffer_obj; #endif void stdio_obj_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { - sys_stdio_obj_t *self = self_in; + sys_stdio_obj_t *self = MP_OBJ_TO_PTR(self_in); mp_printf(print, "<io.FileIO %d>", self->fd); } STATIC mp_uint_t stdio_read(mp_obj_t self_in, void *buf, mp_uint_t size, int *errcode) { - sys_stdio_obj_t *self = self_in; + sys_stdio_obj_t *self = MP_OBJ_TO_PTR(self_in); if (self->fd == STDIO_FD_IN) { for (uint i = 0; i < size; i++) { int c = mp_hal_stdin_rx_chr(); @@ -75,7 +75,7 @@ STATIC mp_uint_t stdio_read(mp_obj_t self_in, void *buf, mp_uint_t size, int *er } STATIC mp_uint_t stdio_write(mp_obj_t self_in, const void *buf, mp_uint_t size, int *errcode) { - sys_stdio_obj_t *self = self_in; + sys_stdio_obj_t *self = MP_OBJ_TO_PTR(self_in); if (self->fd == STDIO_FD_OUT || self->fd == STDIO_FD_ERR) { mp_hal_stdout_tx_strn_cooked(buf, size); return size; @@ -85,6 +85,19 @@ STATIC mp_uint_t stdio_write(mp_obj_t self_in, const void *buf, mp_uint_t size, } } +STATIC mp_uint_t stdio_ioctl(mp_obj_t self_in, mp_uint_t request, uintptr_t arg, int *errcode) { + sys_stdio_obj_t *self = MP_OBJ_TO_PTR(self_in); + (void) self; + + // For now, pretend we actually flush the stdio stream. + if (request == MP_STREAM_FLUSH) { + return 0; + } else { + *errcode = MP_EINVAL; + return MP_STREAM_ERROR; + } +} + STATIC mp_obj_t stdio_obj___exit__(size_t n_args, const mp_obj_t *args) { return mp_const_none; } @@ -112,6 +125,7 @@ STATIC MP_DEFINE_CONST_DICT(stdio_locals_dict, stdio_locals_dict_table); STATIC const mp_stream_p_t stdio_obj_stream_p = { .read = stdio_read, .write = stdio_write, + .ioctl = stdio_ioctl, .is_text = true, }; diff --git a/locale/ID.po b/locale/ID.po new file mode 100644 index 000000000..1df86a7d2 --- /dev/null +++ b/locale/ID.po @@ -0,0 +1,2879 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-03-25 19:40+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: main.c +msgid "" +"\n" +"Code done running. Waiting for reload.\n" +msgstr "" + +#: py/obj.c +msgid " File \"%q\"" +msgstr "" + +#: py/obj.c +msgid " File \"%q\", line %d" +msgstr "" + +#: main.c +msgid " output:\n" +msgstr "output:\n" + +#: py/objstr.c +#, c-format +msgid "%%c requires int or char" +msgstr "" + +#: shared-bindings/microcontroller/Pin.c +msgid "%q in use" +msgstr "" + +#: py/obj.c +msgid "%q index out of range" +msgstr "" + +#: py/obj.c +msgid "%q indices must be integers, not %s" +msgstr "" + +#: shared-bindings/displayio/Group.c shared-bindings/displayio/Shape.c +#: shared-bindings/bleio/CharacteristicBuffer.c +#, fuzzy +msgid "%q must be >= 1" +msgstr "buffers harus mempunyai panjang yang sama" + +#: shared-bindings/fontio/BuiltinFont.c +msgid "%q should be an int" +msgstr "" + +#: py/objnamedtuple.c py/bc.c +msgid "%q() takes %d positional arguments but %d were given" +msgstr "%q() mengambil posisi argumen %d tapi %d yang diberikan" + +#: py/argcheck.c +msgid "'%q' argument required" +msgstr "'%q' argumen dibutuhkan" + +#: py/emitinlinextensa.c py/emitinlinethumb.c +#, c-format +msgid "'%s' expects a label" +msgstr "" + +#: py/emitinlinextensa.c py/emitinlinethumb.c +#, c-format +msgid "'%s' expects a register" +msgstr "'%s' mengharapkan sebuah register" + +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects a special register" +msgstr "'%s' mengharapkan sebuah register spesial" + +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects an FPU register" +msgstr "'%s' mengharapkan sebuah FPU register" + +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects an address of the form [a, b]" +msgstr "'%s' mengharapkan sebuah alamat dengan bentuk [a, b]" + +#: py/emitinlinextensa.c py/emitinlinethumb.c +#, c-format +msgid "'%s' expects an integer" +msgstr "'%s' mengharapkan integer" + +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects at most r%d" +msgstr "'%s' mengharapkan setidaknya r%d" + +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects {r0, r1, ...}" +msgstr "'%s' mengharapkan {r0, r1, ...}" + +#: py/emitinlinextensa.c +#, c-format +msgid "'%s' integer %d is not within range %d..%d" +msgstr "" + +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' integer 0x%x does not fit in mask 0x%x" +msgstr "'%s' integer 0x%x tidak cukup didalam mask 0x%x" + +#: py/obj.c +#, c-format +msgid "'%s' object does not support item assignment" +msgstr "" + +#: py/obj.c +#, c-format +msgid "'%s' object does not support item deletion" +msgstr "" + +#: py/runtime.c +msgid "'%s' object has no attribute '%q'" +msgstr "" + +#: py/runtime.c +#, c-format +msgid "'%s' object is not an iterator" +msgstr "" + +#: py/objtype.c py/runtime.c +#, c-format +msgid "'%s' object is not callable" +msgstr "" + +#: py/runtime.c +#, c-format +msgid "'%s' object is not iterable" +msgstr "" + +#: py/obj.c +#, c-format +msgid "'%s' object is not subscriptable" +msgstr "" + +#: py/objstr.c +msgid "'=' alignment not allowed in string format specifier" +msgstr "" + +#: shared-module/struct/__init__.c +msgid "'S' and 'O' are not supported format types" +msgstr "" + +#: py/compile.c +msgid "'align' requires 1 argument" +msgstr "'align' membutuhkan 1 argumen" + +#: py/compile.c +msgid "'await' outside function" +msgstr "'await' diluar fungsi" + +#: py/compile.c +msgid "'break' outside loop" +msgstr "'break' diluar loop" + +#: py/compile.c +msgid "'continue' outside loop" +msgstr "'continue' diluar loop" + +#: py/compile.c +msgid "'data' requires at least 2 arguments" +msgstr "'data' membutuhkan setidaknya 2 argumen" + +#: py/compile.c +msgid "'data' requires integer arguments" +msgstr "'data' membutuhkan argumen integer" + +#: py/compile.c +msgid "'label' requires 1 argument" +msgstr "'label' membutuhkan 1 argumen" + +#: py/compile.c +msgid "'return' outside function" +msgstr "'return' diluar fungsi" + +#: py/compile.c +msgid "'yield' outside function" +msgstr "'yield' diluar fungsi" + +#: py/compile.c +msgid "*x must be assignment target" +msgstr "*x harus menjadi target assignment" + +#: py/obj.c +msgid ", in %q\n" +msgstr "" + +#: py/objcomplex.c +msgid "0.0 to a complex power" +msgstr "" + +#: py/modbuiltins.c +msgid "3-arg pow() not supported" +msgstr "" + +#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c +msgid "A hardware interrupt channel is already in use" +msgstr "Sebuah channel hardware interrupt sedang digunakan" + +#: ports/esp8266/modnetwork.c +msgid "AP required" +msgstr "AP dibutuhkan" + +#: shared-bindings/bleio/Address.c +#, c-format +msgid "Address is not %d bytes long or is in wrong format" +msgstr "" + +#: shared-bindings/bleio/Address.c +#, fuzzy, c-format +msgid "Address must be %d bytes long" +msgstr "buffers harus mempunyai panjang yang sama" + +#: ports/nrf/common-hal/busio/I2C.c +msgid "All I2C peripherals are in use" +msgstr "Semua perangkat I2C sedang digunakan" + +#: ports/nrf/common-hal/busio/SPI.c +msgid "All SPI peripherals are in use" +msgstr "Semua perangkat SPI sedang digunakan" + +#: ports/nrf/common-hal/busio/UART.c +#, fuzzy +msgid "All UART peripherals are in use" +msgstr "Semua perangkat I2C sedang digunakan" + +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "All event channels in use" +msgstr "Semua channel event sedang digunakan" + +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c ports/atmel-samd/audio_dma.c +msgid "All sync event channels in use" +msgstr "Semua channel event yang disinkronisasi sedang digunakan" + +#: shared-bindings/pulseio/PWMOut.c +msgid "All timers for this pin are in use" +msgstr "Semua timer untuk pin ini sedang digunakan" + +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/pulseio/PulseOut.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c +#: shared-module/_pew/PewPew.c +msgid "All timers in use" +msgstr "Semua timer sedang digunakan" + +#: ports/nrf/common-hal/analogio/AnalogOut.c +msgid "AnalogOut functionality not supported" +msgstr "fungsionalitas AnalogOut tidak didukung" + +#: shared-bindings/analogio/AnalogOut.c +msgid "AnalogOut is only 16 bits. Value must be less than 65536." +msgstr "" + +#: ports/atmel-samd/common-hal/analogio/AnalogOut.c +msgid "AnalogOut not supported on given pin" +msgstr "pin yang dipakai tidak mendukung AnalogOut" + +#: ports/atmel-samd/common-hal/pulseio/PulseOut.c +msgid "Another send is already active" +msgstr "Send yang lain sudah aktif" + +#: shared-bindings/pulseio/PulseOut.c +msgid "Array must contain halfwords (type 'H')" +msgstr "" + +#: shared-bindings/nvm/ByteArray.c +msgid "Array values should be single bytes." +msgstr "" + +#: supervisor/shared/safe_mode.c +msgid "Attempted heap allocation when MicroPython VM not running.\n" +msgstr "" + +#: main.c +msgid "Auto-reload is off.\n" +msgstr "Auto-reload tidak aktif.\n" + +#: main.c +msgid "" +"Auto-reload is on. Simply save files over USB to run them or enter REPL to " +"disable.\n" +msgstr "" +"Auto-reload aktif. Silahkan simpan data-data (files) melalui USB untuk " +"menjalankannya atau masuk ke REPL untukmenonaktifkan.\n" + +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Bit clock and word select must share a clock unit" +msgstr "Bit clock dan word harus memiliki kesamaan pada clock unit" + +#: shared-bindings/audiobusio/PDMIn.c +msgid "Bit depth must be multiple of 8." +msgstr "" + +#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c +msgid "Both pins must support hardware interrupts" +msgstr "Kedua pin harus mendukung hardware interrut" + +#: shared-bindings/supervisor/__init__.c +msgid "Brightness must be between 0 and 255" +msgstr "" + +#: shared-bindings/displayio/Display.c +msgid "Brightness not adjustable" +msgstr "" + +#: shared-module/usb_hid/Device.c +#, c-format +msgid "Buffer incorrect size. Should be %d bytes." +msgstr "" + +#: shared-bindings/bitbangio/I2C.c shared-bindings/busio/I2C.c +msgid "Buffer must be at least length 1" +msgstr "" + +#: ports/atmel-samd/common-hal/displayio/ParallelBus.c +#: ports/nrf/common-hal/displayio/ParallelBus.c +#, fuzzy, c-format +msgid "Bus pin %d is already in use" +msgstr "DAC sudah digunakan" + +#: shared-bindings/bleio/UUID.c +#, fuzzy +msgid "Byte buffer must be 16 bytes." +msgstr "buffers harus mempunyai panjang yang sama" + +#: shared-bindings/nvm/ByteArray.c +msgid "Bytes must be between 0 and 255." +msgstr "" + +#: ports/esp8266/esp_mphal.c +msgid "C-level assert" +msgstr "Dukungan C-level" + +#: shared-bindings/_pixelbuf/PixelBuf.c +#, c-format +msgid "Can not use dotstar with %s" +msgstr "" + +#: shared-bindings/bleio/Device.c +msgid "Can't add services in Central mode" +msgstr "" + +#: shared-bindings/bleio/Device.c +msgid "Can't advertise in Central mode" +msgstr "" + +#: shared-bindings/bleio/Device.c +msgid "Can't change the name in Central mode" +msgstr "" + +#: shared-bindings/bleio/Device.c +msgid "Can't connect in Peripheral mode" +msgstr "" + +#: ports/esp8266/modnetwork.c +msgid "Cannot connect to AP" +msgstr "Tidak dapat menyambungkan ke AP" + +#: shared-bindings/displayio/Bitmap.c shared-bindings/pulseio/PulseIn.c +msgid "Cannot delete values" +msgstr "" + +#: ports/esp8266/modnetwork.c +msgid "Cannot disconnect from AP" +msgstr "Tidak dapat memutuskna dari AP" + +#: ports/atmel-samd/common-hal/digitalio/DigitalInOut.c +#: ports/nrf/common-hal/digitalio/DigitalInOut.c +msgid "Cannot get pull while in output mode" +msgstr "Tidak bisa mendapatkan pull pada saat mode output" + +#: ports/nrf/common-hal/microcontroller/Processor.c +#, fuzzy +msgid "Cannot get temperature" +msgstr "Tidak bisa mendapatkan temperatur. status: 0x%02x" + +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Cannot output both channels on the same pin" +msgstr "" +"Tidak dapat menggunakan output di kedua channel dengan menggunakan pin yang " +"sama" + +#: shared-module/bitbangio/SPI.c +msgid "Cannot read without MISO pin." +msgstr "" + +#: shared-bindings/audiobusio/PDMIn.c +msgid "Cannot record to a file" +msgstr "" + +#: shared-module/storage/__init__.c +msgid "Cannot remount '/' when USB is active." +msgstr "" + +#: ports/atmel-samd/common-hal/microcontroller/__init__.c +#: ports/esp8266/common-hal/microcontroller/__init__.c +msgid "Cannot reset into bootloader because no bootloader is present." +msgstr "" +"Tidak dapat melakukan reset ke bootloader karena tidak ada bootloader yang " +"terisi" + +#: ports/esp8266/modnetwork.c +msgid "Cannot set STA config" +msgstr "Tidak dapat mengatur konfigurasi STA" + +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Cannot set value when direction is input." +msgstr "" + +#: py/objslice.c +msgid "Cannot subclass slice" +msgstr "" + +#: shared-module/bitbangio/SPI.c +msgid "Cannot transfer without MOSI and MISO pins." +msgstr "" + +#: extmod/moductypes.c +msgid "Cannot unambiguously get sizeof scalar" +msgstr "tidak dapat mendapatkan ukuran scalar secara tidak ambigu" + +#: ports/esp8266/modnetwork.c +msgid "Cannot update i/f status" +msgstr "Tidak dapat memperbarui status i/f" + +#: shared-module/bitbangio/SPI.c +msgid "Cannot write without MOSI pin." +msgstr "" + +#: shared-bindings/bleio/Service.c +msgid "Characteristic UUID doesn't match Service UUID" +msgstr "" + +#: ports/nrf/common-hal/bleio/Service.c +msgid "Characteristic already in use by another Service." +msgstr "" + +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "CharacteristicBuffer writing not provided" +msgstr "" + +#: shared-module/bitbangio/SPI.c +msgid "Clock pin init failed." +msgstr "" + +#: shared-module/bitbangio/I2C.c +msgid "Clock stretch too long" +msgstr "" + +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Clock unit in use" +msgstr "Clock unit sedang digunakan" + +#: shared-bindings/_pew/PewPew.c +msgid "Column entry must be digitalio.DigitalInOut" +msgstr "" + +#: shared-bindings/displayio/FourWire.c shared-bindings/displayio/ParallelBus.c +msgid "Command must be an int between 0 and 255" +msgstr "" + +#: ports/nrf/common-hal/bleio/UUID.c +#, c-format +msgid "Could not decode ble_uuid, err 0x%04x" +msgstr "" + +#: ports/atmel-samd/common-hal/busio/UART.c +msgid "Could not initialize UART" +msgstr "Tidak dapat menginisialisasi UART" + +#: shared-module/audioio/Mixer.c shared-module/audioio/WaveFile.c +msgid "Couldn't allocate first buffer" +msgstr "" + +#: shared-module/audioio/Mixer.c shared-module/audioio/WaveFile.c +msgid "Couldn't allocate second buffer" +msgstr "" + +#: supervisor/shared/safe_mode.c +msgid "Crash into the HardFault_Handler.\n" +msgstr "" + +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "DAC already in use" +msgstr "DAC sudah digunakan" + +#: ports/atmel-samd/common-hal/displayio/ParallelBus.c +#: ports/nrf/common-hal/displayio/ParallelBus.c +msgid "Data 0 pin must be byte aligned" +msgstr "" + +#: shared-module/audioio/WaveFile.c +msgid "Data chunk must follow fmt chunk" +msgstr "" + +#: ports/nrf/common-hal/bleio/Broadcaster.c +#: ports/nrf/common-hal/bleio/Peripheral.c +#, fuzzy +msgid "Data too large for advertisement packet" +msgstr "Tidak bisa menyesuaikan data ke dalam paket advertisment" + +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Data too large for the advertisement packet" +msgstr "Tidak bisa menyesuaikan data ke dalam paket advertisment" + +#: shared-bindings/audiobusio/PDMIn.c +msgid "Destination capacity is smaller than destination_length." +msgstr "" + +#: shared-bindings/displayio/Display.c +msgid "Display rotation must be in 90 degree increments" +msgstr "" + +#: ports/unix/modffi.c +msgid "Don't know how to pass object to native function" +msgstr "Tidak tahu cara meloloskan objek ke fungsi native" + +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Drive mode not used when direction is input." +msgstr "" + +#: ports/esp8266/common-hal/microcontroller/__init__.c +msgid "ESP8226 does not support safe mode." +msgstr "ESP8266 tidak mendukung safe mode" + +#: ports/esp8266/common-hal/digitalio/DigitalInOut.c +msgid "ESP8266 does not support pull down." +msgstr "ESP866 tidak mendukung pull down" + +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +msgid "EXTINT channel already in use" +msgstr "Channel EXTINT sedang digunakan" + +#: ports/unix/modffi.c +msgid "Error in ffi_prep_cif" +msgstr "Errod pada ffi_prep_cif" + +#: extmod/modure.c +msgid "Error in regex" +msgstr "Error pada regex" + +#: shared-bindings/pulseio/PulseOut.c shared-bindings/neopixel_write/__init__.c +#: shared-bindings/terminalio/Terminal.c shared-bindings/microcontroller/Pin.c +msgid "Expected a %q" +msgstr "" + +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "Expected a Characteristic" +msgstr "" + +#: shared-bindings/bleio/Descriptor.c shared-bindings/bleio/Service.c +#: shared-bindings/bleio/Characteristic.c +msgid "Expected a UUID" +msgstr "" + +#: shared-module/_pixelbuf/PixelBuf.c +#, c-format +msgid "Expected tuple of length %d, got %d" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to acquire mutex" +msgstr "Gagal untuk mendapatkan mutex, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c ports/nrf/sd_mutex.c +#, fuzzy, c-format +msgid "Failed to acquire mutex, err 0x%04x" +msgstr "Gagal untuk mendapatkan mutex, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Service.c +#, fuzzy, c-format +msgid "Failed to add characteristic, err 0x%04x" +msgstr "Gagal untuk menambahkan karakteristik, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to add service" +msgstr "Gagal untuk menambahkan layanan, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Peripheral.c +#, fuzzy, c-format +msgid "Failed to add service, err 0x%04x" +msgstr "Gagal untuk menambahkan layanan, status: 0x%08lX" + +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "Failed to allocate RX buffer" +msgstr "Gagal untuk mengalokasikan buffer RX" + +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +#: ports/nrf/common-hal/pulseio/PulseIn.c +#: ports/esp8266/common-hal/pulseio/PulseIn.c +#, c-format +msgid "Failed to allocate RX buffer of %d bytes" +msgstr "Gagal untuk megalokasikan buffer RX dari %d byte" + +#: ports/nrf/common-hal/bleio/Adapter.c +#, fuzzy +msgid "Failed to change softdevice state" +msgstr "Gagal untuk merubah status softdevice, error: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to connect:" +msgstr "Gagal untuk menyambungkan, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to continue scanning" +msgstr "Gagal untuk melanjutkan scanning, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Scanner.c +#, fuzzy, c-format +msgid "Failed to continue scanning, err 0x%04x" +msgstr "Gagal untuk melanjutkan scanning, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to create mutex" +msgstr "Gagal untuk membuat mutex, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to discover services" +msgstr "Gagal untuk menemukan layanan, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Adapter.c +#, fuzzy +msgid "Failed to get local address" +msgstr "Gagal untuk mendapatkan alamat lokal, error: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Adapter.c +#, fuzzy +msgid "Failed to get softdevice state" +msgstr "Gagal untuk mendapatkan status softdevice, error: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c +#, c-format +msgid "Failed to notify or indicate attribute value, err 0x%04x" +msgstr "" + +#: ports/nrf/common-hal/bleio/Characteristic.c +#, fuzzy, c-format +msgid "Failed to read CCCD value, err 0x%04x" +msgstr "Gagal untuk membaca nilai atribut, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c +#, c-format +msgid "Failed to read attribute value, err 0x%04x" +msgstr "" + +#: ports/nrf/common-hal/bleio/Characteristic.c +#, fuzzy, c-format +msgid "Failed to read gatts value, err 0x%04x" +msgstr "Gagal untuk menulis nilai gatts, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/UUID.c +#, fuzzy, c-format +msgid "Failed to register Vendor-Specific UUID, err 0x%04x" +msgstr "Gagal untuk menambahkan Vendor Spesific UUID, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to release mutex" +msgstr "Gagal untuk melepaskan mutex, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c ports/nrf/sd_mutex.c +#, fuzzy, c-format +msgid "Failed to release mutex, err 0x%04x" +msgstr "Gagal untuk melepaskan mutex, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to start advertising" +msgstr "Gagal untuk memulai advertisement, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Broadcaster.c +#: ports/nrf/common-hal/bleio/Peripheral.c +#, fuzzy, c-format +msgid "Failed to start advertising, err 0x%04x" +msgstr "Gagal untuk memulai advertisement, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to start scanning" +msgstr "Gagal untuk melakukan scanning, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Scanner.c +#, fuzzy, c-format +msgid "Failed to start scanning, err 0x%04x" +msgstr "Gagal untuk melakukan scanning, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to stop advertising" +msgstr "Gagal untuk memberhentikan advertisement, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Broadcaster.c +#: ports/nrf/common-hal/bleio/Peripheral.c +#, fuzzy, c-format +msgid "Failed to stop advertising, err 0x%04x" +msgstr "Gagal untuk memberhentikan advertisement, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c +#, fuzzy, c-format +msgid "Failed to write attribute value, err 0x%04x" +msgstr "Gagal untuk menulis nilai atribut, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c +#, fuzzy, c-format +msgid "Failed to write gatts value, err 0x%04x" +msgstr "Gagal untuk menulis nilai gatts, status: 0x%08lX" + +#: py/moduerrno.c +msgid "File exists" +msgstr "" + +#: ports/nrf/supervisor/internal_flash.c +msgid "Flash erase failed" +msgstr "" + +#: ports/nrf/supervisor/internal_flash.c +#, c-format +msgid "Flash erase failed to start, err 0x%04x" +msgstr "" + +#: ports/nrf/supervisor/internal_flash.c +msgid "Flash write failed" +msgstr "" + +#: ports/nrf/supervisor/internal_flash.c +#, c-format +msgid "Flash write failed to start, err 0x%04x" +msgstr "" + +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +msgid "Frequency captured is above capability. Capture Paused." +msgstr "" + +#: shared-bindings/bitbangio/SPI.c shared-bindings/bitbangio/I2C.c +#: shared-bindings/busio/SPI.c shared-bindings/busio/I2C.c +msgid "Function requires lock" +msgstr "" + +#: ports/esp8266/common-hal/digitalio/DigitalInOut.c +msgid "GPIO16 does not support pull up." +msgstr "GPIO16 tidak mendukung pull up" + +#: shared-module/displayio/Group.c +msgid "Group full" +msgstr "" + +#: ports/unix/file.c extmod/vfs_posix_file.c py/objstringio.c +msgid "I/O operation on closed file" +msgstr "operasi I/O pada file tertutup" + +#: extmod/machine_i2c.c +msgid "I2C operation not supported" +msgstr "operasi I2C tidak didukung" + +#: py/persistentcode.c +msgid "" +"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/" +"mpy-update for more info." +msgstr "" + +#: shared-bindings/_pew/PewPew.c +msgid "Incorrect buffer size" +msgstr "" + +#: py/moduerrno.c +msgid "Input/output error" +msgstr "" + +#: shared-module/displayio/OnDiskBitmap.c +msgid "Invalid BMP file" +msgstr "" + +#: ports/atmel-samd/common-hal/pulseio/PWMOut.c +#: ports/nrf/common-hal/pulseio/PWMOut.c shared-bindings/pulseio/PWMOut.c +msgid "Invalid PWM frequency" +msgstr "Frekuensi PWM tidak valid" + +#: py/moduerrno.c +msgid "Invalid argument" +msgstr "" + +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Invalid bit clock pin" +msgstr "Bit clock pada pin tidak valid" + +#: ports/nrf/common-hal/busio/UART.c +msgid "Invalid buffer size" +msgstr "Ukuran buffer tidak valid" + +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +msgid "Invalid capture period. Valid range: 1 - 500" +msgstr "" + +#: shared-bindings/audioio/Mixer.c +msgid "Invalid channel count" +msgstr "" + +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Invalid clock pin" +msgstr "Clock pada pin tidak valid" + +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Invalid data pin" +msgstr "data pin tidak valid" + +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Invalid direction." +msgstr "" + +#: shared-module/audioio/WaveFile.c +msgid "Invalid file" +msgstr "" + +#: shared-module/audioio/WaveFile.c +msgid "Invalid format chunk size" +msgstr "" + +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "Invalid number of bits" +msgstr "" + +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "Invalid phase" +msgstr "" + +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: ports/atmel-samd/common-hal/touchio/TouchIn.c +#: shared-bindings/pulseio/PWMOut.c +msgid "Invalid pin" +msgstr "Pin tidak valid" + +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Invalid pin for left channel" +msgstr "Pin untuk channel kiri tidak valid" + +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Invalid pin for right channel" +msgstr "Pin untuk channel kanan tidak valid" + +#: ports/atmel-samd/common-hal/i2cslave/I2CSlave.c +#: ports/atmel-samd/common-hal/busio/UART.c +#: ports/atmel-samd/common-hal/busio/SPI.c +#: ports/atmel-samd/common-hal/busio/I2C.c ports/nrf/common-hal/busio/I2C.c +msgid "Invalid pins" +msgstr "Pin-pin tidak valid" + +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "Invalid polarity" +msgstr "" + +#: shared-bindings/microcontroller/__init__.c +msgid "Invalid run mode." +msgstr "" + +#: shared-bindings/audioio/Mixer.c +msgid "Invalid voice count" +msgstr "" + +#: shared-module/audioio/WaveFile.c +msgid "Invalid wave file" +msgstr "" + +#: py/compile.c +msgid "LHS of keyword arg must be an id" +msgstr "LHS dari keyword arg harus menjadi sebuah id" + +#: shared-module/displayio/Group.c +msgid "Layer must be a Group or TileGrid subclass." +msgstr "" + +#: py/objslice.c +msgid "Length must be an int" +msgstr "" + +#: py/objslice.c +msgid "Length must be non-negative" +msgstr "" + +#: supervisor/shared/safe_mode.c +msgid "" +"Looks like our core CircuitPython code crashed hard. Whoops!\n" +"Please file an issue at https://github.com/adafruit/circuitpython/issues\n" +" with the contents of your CIRCUITPY drive and this message:\n" +msgstr "" + +#: shared-module/bitbangio/SPI.c +msgid "MISO pin init failed." +msgstr "" + +#: shared-module/bitbangio/SPI.c +msgid "MOSI pin init failed." +msgstr "" + +#: ports/esp8266/common-hal/pulseio/PWMOut.c +#, c-format +msgid "Maximum PWM frequency is %dhz." +msgstr "Nilai maksimum frekuensi PWM adalah %dhz" + +#: shared-module/displayio/Shape.c +#, c-format +msgid "Maximum x value when mirrored is %d" +msgstr "" + +#: supervisor/shared/safe_mode.c +msgid "MicroPython NLR jump failed. Likely memory corruption.\n" +msgstr "" + +#: supervisor/shared/safe_mode.c +msgid "MicroPython fatal error.\n" +msgstr "" + +#: shared-bindings/audiobusio/PDMIn.c +msgid "Microphone startup delay must be in range 0.0 to 1.0" +msgstr "" + +#: ports/esp8266/common-hal/pulseio/PWMOut.c +msgid "Minimum PWM frequency is 1hz." +msgstr "Nilai minimum frekuensi PWM is 1hz" + +#: ports/esp8266/common-hal/pulseio/PWMOut.c +#, c-format +msgid "Multiple PWM frequencies not supported. PWM already set to %dhz." +msgstr "Nilai Frekuensi PWM ganda tidak didukung. PWM sudah diatur pada %dhz" + +#: shared-bindings/displayio/Display.c +msgid "Must be a Group subclass." +msgstr "" + +#: ports/atmel-samd/common-hal/analogio/AnalogOut.c +msgid "No DAC on chip" +msgstr "Tidak ada DAC (Digital Analog Converter) di dalam chip" + +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "No DMA channel found" +msgstr "tidak ada channel DMA ditemukan" + +#: ports/esp8266/common-hal/pulseio/PulseIn.c +msgid "No PulseIn support for %q" +msgstr "Tidak ada dukungan PulseIn untuk %q" + +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "No RX pin" +msgstr "Tidak pin RX" + +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "No TX pin" +msgstr "Tidak ada pin TX" + +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +msgid "No available clocks" +msgstr "" + +#: supervisor/shared/board_busses.c +msgid "No default I2C bus" +msgstr "Tidak ada standar bus I2C" + +#: supervisor/shared/board_busses.c +msgid "No default SPI bus" +msgstr "Tidak ada standar bus SPI" + +#: supervisor/shared/board_busses.c +msgid "No default UART bus" +msgstr "Tidak ada standar bus UART" + +#: ports/atmel-samd/common-hal/touchio/TouchIn.c +msgid "No free GCLKs" +msgstr "Tidak ada GCLK yang kosong" + +#: shared-bindings/os/__init__.c +msgid "No hardware random available" +msgstr "" + +#: ports/esp8266/common-hal/analogio/AnalogOut.c +msgid "No hardware support for analog out." +msgstr "Tidak dukungan hardware untuk analog out." + +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +msgid "No hardware support on pin" +msgstr "Tidak ada dukungan hardware untuk pin" + +#: py/moduerrno.c +msgid "No space left on device" +msgstr "" + +#: py/moduerrno.c +msgid "No such file/directory" +msgstr "" + +#: shared-bindings/bleio/CharacteristicBuffer.c +#, fuzzy +msgid "Not connected" +msgstr "Tidak dapat menyambungkan ke AP" + +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "Not connected." +msgstr "" + +#: shared-bindings/audiobusio/I2SOut.c shared-bindings/audioio/AudioOut.c +msgid "Not playing" +msgstr "" + +#: shared-bindings/util.c +msgid "" +"Object has been deinitialized and can no longer be used. Create a new object." +msgstr "" + +#: ports/nrf/common-hal/busio/UART.c +msgid "Odd parity is not supported" +msgstr "Parity ganjil tidak didukung" + +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Only 8 or 16 bit mono with " +msgstr "Hanya 8 atau 16 bit mono dengan " + +#: shared-module/displayio/OnDiskBitmap.c +#, c-format +msgid "" +"Only Windows format, uncompressed BMP supported: given header size is %d" +msgstr "" + +#: shared-module/displayio/Bitmap.c +msgid "Only bit maps of 8 bit color or less are supported" +msgstr "" + +#: shared-module/displayio/OnDiskBitmap.c +#, c-format +msgid "" +"Only monochrome, indexed 8bpp, and 16bpp or greater BMPs supported: %d bpp " +"given" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "Only slices with step=1 (aka None) are supported" +msgstr "" + +#: ports/esp8266/common-hal/busio/UART.c +msgid "Only tx supported on UART1 (GPIO2)." +msgstr "Hanya tx yang mendukung pada UART1 (GPIO2)." + +#: shared-bindings/audiobusio/PDMIn.c +msgid "Oversample must be multiple of 8." +msgstr "" + +#: shared-bindings/pulseio/PWMOut.c +msgid "" +"PWM duty_cycle must be between 0 and 65535 inclusive (16 bit resolution)" +msgstr "" + +#: shared-bindings/pulseio/PWMOut.c +msgid "" +"PWM frequency not writable when variable_frequency is False on construction." +msgstr "" + +#: ports/esp8266/common-hal/pulseio/PWMOut.c ports/esp8266/machine_pwm.c +#, c-format +msgid "PWM not supported on pin %d" +msgstr "PWM tidak didukung pada pin %d" + +#: py/moduerrno.c +msgid "Permission denied" +msgstr "" + +#: ports/esp8266/common-hal/analogio/AnalogIn.c +msgid "Pin %q does not have ADC capabilities" +msgstr "Pin %q tidak memiliki kemampuan ADC" + +#: ports/atmel-samd/common-hal/analogio/AnalogIn.c +#: ports/nrf/common-hal/analogio/AnalogIn.c +msgid "Pin does not have ADC capabilities" +msgstr "Pin tidak mempunya kemampuan untuk ADC (Analog Digital Converter)" + +#: ports/esp8266/machine_pin.c +msgid "Pin(16) doesn't support pull" +msgstr "Pin(16) tidak mendukung pull" + +#: ports/esp8266/common-hal/busio/SPI.c +msgid "Pins not valid for SPI" +msgstr "Pin-pin tidak valid untuk SPI" + +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "Pixel beyond bounds of buffer" +msgstr "" + +#: py/builtinhelp.c +msgid "Plus any modules on the filesystem\n" +msgstr "Tambahkan module apapun pada filesystem\n" + +#: main.c +msgid "Press any key to enter the REPL. Use CTRL-D to reload." +msgstr "" +"Tekan tombol apa saja untuk masuk ke dalam REPL. Gunakan CTRL+D untuk reset " +"(Reload)" + +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Pull not used when direction is output." +msgstr "" + +#: shared-bindings/rtc/RTC.c +msgid "RTC calibration is not supported on this board" +msgstr "" + +#: shared-bindings/rtc/RTC.c shared-bindings/time/__init__.c +msgid "RTC is not supported on this board" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "Range out of bounds" +msgstr "" + +#: shared-bindings/pulseio/PulseIn.c +msgid "Read-only" +msgstr "" + +#: extmod/vfs_fat.c py/moduerrno.c +msgid "Read-only filesystem" +msgstr "sistem file (filesystem) bersifat Read-only" + +#: shared-module/displayio/Bitmap.c +#, fuzzy +msgid "Read-only object" +msgstr "sistem file (filesystem) bersifat Read-only" + +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Right channel unsupported" +msgstr "Channel Kanan tidak didukung" + +#: shared-bindings/_pew/PewPew.c +msgid "Row entry must be digitalio.DigitalInOut" +msgstr "" + +#: main.c +msgid "Running in safe mode! Auto-reload is off.\n" +msgstr "Berjalan di mode aman(safe mode)! Auto-reload tidak aktif.\n" + +#: main.c +msgid "Running in safe mode! Not running saved code.\n" +msgstr "" +"Berjalan di mode aman(safe mode)! tidak menjalankan kode yang tersimpan.\n" + +#: ports/atmel-samd/common-hal/busio/I2C.c +msgid "SDA or SCL needs a pull up" +msgstr "SDA atau SCL membutuhkan pull up" + +#: ports/esp8266/modnetwork.c +msgid "STA must be active" +msgstr "STA harus aktif" + +#: ports/esp8266/modnetwork.c +msgid "STA required" +msgstr "STA dibutuhkan" + +#: shared-bindings/audioio/Mixer.c +msgid "Sample rate must be positive" +msgstr "" + +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#, c-format +msgid "Sample rate too high. It must be less than %d" +msgstr "Nilai sampel terlalu tinggi. Nilai harus kurang dari %d" + +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Serializer in use" +msgstr "Serializer sedang digunakan" + +#: shared-bindings/nvm/ByteArray.c +msgid "Slice and value different lengths." +msgstr "" + +#: shared-bindings/displayio/Bitmap.c shared-bindings/displayio/TileGrid.c +#: shared-bindings/displayio/Group.c shared-bindings/pulseio/PulseIn.c +msgid "Slices not supported" +msgstr "" + +#: ports/nrf/common-hal/bleio/Adapter.c +#, c-format +msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX" +msgstr "Dukungan soft device, id: 0x%08lX, pc: 0x%08l" + +#: extmod/modure.c +msgid "Splitting with sub-captures" +msgstr "Memisahkan dengan menggunakan sub-captures" + +#: shared-bindings/supervisor/__init__.c +msgid "Stack size must be at least 256" +msgstr "" + +#: shared-bindings/multiterminal/__init__.c +msgid "Stream missing readinto() or write() method." +msgstr "" + +#: supervisor/shared/safe_mode.c +msgid "" +"The CircuitPython heap was corrupted because the stack was too small.\n" +"Please increase stack size limits and press reset (after ejecting " +"CIRCUITPY).\n" +"If you didn't change the stack, then file an issue here with the contents of " +"your CIRCUITPY drive:\n" +msgstr "" + +#: supervisor/shared/safe_mode.c +#, fuzzy +msgid "" +"The microcontroller's power dipped. Please make sure your power supply " +"provides\n" +"enough power for the whole circuit and press reset (after ejecting " +"CIRCUITPY).\n" +msgstr "" +"Tegangan dari mikrokontroler turun atau mati. Pastikan sumber tegangan " +"memberikan daya\n" + +#: supervisor/shared/safe_mode.c +msgid "" +"The reset button was pressed while booting CircuitPython. Press again to " +"exit safe mode.\n" +msgstr "" + +#: shared-module/audioio/Mixer.c +msgid "The sample's bits_per_sample does not match the mixer's" +msgstr "" + +#: shared-module/audioio/Mixer.c +msgid "The sample's channel count does not match the mixer's" +msgstr "" + +#: shared-module/audioio/Mixer.c +msgid "The sample's sample rate does not match the mixer's" +msgstr "" + +#: shared-module/audioio/Mixer.c +msgid "The sample's signedness does not match the mixer's" +msgstr "" + +#: shared-bindings/displayio/TileGrid.c +msgid "Tile height must exactly divide bitmap height" +msgstr "" + +#: shared-bindings/displayio/TileGrid.c +msgid "Tile indices must be 0 - 255" +msgstr "" + +#: shared-bindings/displayio/TileGrid.c +msgid "Tile width must exactly divide bitmap width" +msgstr "" + +#: supervisor/shared/safe_mode.c +msgid "To exit, please reset the board without " +msgstr "Untuk keluar, silahkan reset board tanpa " + +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Too many channels in sample." +msgstr "Terlalu banyak channel dalam sampel" + +#: shared-bindings/displayio/FourWire.c shared-bindings/displayio/ParallelBus.c +msgid "Too many display busses" +msgstr "" + +#: shared-bindings/displayio/Display.c +msgid "Too many displays" +msgstr "" + +#: py/obj.c +msgid "Traceback (most recent call last):\n" +msgstr "" + +#: shared-bindings/time/__init__.c +msgid "Tuple or struct_time argument required" +msgstr "" + +#: ports/esp8266/machine_uart.c +#, c-format +msgid "UART(%d) does not exist" +msgstr "UART(%d) tidak ada" + +#: ports/esp8266/machine_uart.c +msgid "UART(1) can't read" +msgstr "UART(1) tidak dapat dibaca" + +#: shared-module/usb_hid/Device.c +msgid "USB Busy" +msgstr "" + +#: shared-module/usb_hid/Device.c +msgid "USB Error" +msgstr "" + +#: shared-bindings/bleio/UUID.c +msgid "UUID integer value not in range 0 to 0xffff" +msgstr "" + +#: shared-bindings/bleio/UUID.c +msgid "UUID string not 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'" +msgstr "" + +#: shared-bindings/bleio/UUID.c +msgid "UUID value is not str, int or byte buffer" +msgstr "" + +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Unable to allocate buffers for signed conversion" +msgstr "Tidak dapat mengalokasikan buffer untuk signed conversion" + +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Unable to find free GCLK" +msgstr "Tidak dapat menemukan GCLK yang kosong" + +#: py/parse.c +msgid "Unable to init parser" +msgstr "" + +#: shared-module/displayio/OnDiskBitmap.c +msgid "Unable to read color palette data" +msgstr "" + +#: ports/esp8266/common-hal/storage/__init__.c +msgid "Unable to remount filesystem" +msgstr "Tidak dapat memasang filesystem kembali" + +#: shared-bindings/nvm/ByteArray.c +msgid "Unable to write to nvm." +msgstr "" + +#: ports/nrf/common-hal/bleio/UUID.c +msgid "Unexpected nrfx uuid type" +msgstr "" + +#: ports/unix/modffi.c +msgid "Unknown type" +msgstr "Tipe tidak diketahui" + +#: shared-bindings/_pixelbuf/PixelBuf.c +#, c-format +msgid "Unmatched number of items on RHS (expected %d, got %d)." +msgstr "" + +#: ports/atmel-samd/common-hal/busio/I2C.c +msgid "Unsupported baudrate" +msgstr "Baudrate tidak didukung" + +#: shared-module/displayio/Display.c +#, fuzzy +msgid "Unsupported display bus type" +msgstr "Baudrate tidak didukung" + +#: shared-module/audioio/WaveFile.c +msgid "Unsupported format" +msgstr "" + +#: py/moduerrno.c +msgid "Unsupported operation" +msgstr "" + +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Unsupported pull value." +msgstr "" + +#: ports/esp8266/common-hal/storage/__init__.c +msgid "Use esptool to erase flash and re-upload Python instead" +msgstr "" +"Gunakan esptool untuk menghapus flash dan upload ulang Python sebagai " +"gantinya" + +#: py/emitnative.c +msgid "Viper functions don't currently support more than 4 arguments" +msgstr "" + +#: shared-module/audioio/Mixer.c +msgid "Voice index too high" +msgstr "" + +#: main.c +msgid "WARNING: Your code filename has two extensions\n" +msgstr "PERINGATAN: Nama file kode anda mempunyai dua ekstensi\n" + +#: py/builtinhelp.c +#, c-format +msgid "" +"Welcome to Adafruit CircuitPython %s!\n" +"\n" +"Please visit learn.adafruit.com/category/circuitpython for project guides.\n" +"\n" +"To list built-in modules please do `help(\"modules\")`.\n" +msgstr "" +"Selamat datang ke Adafruit CircuitPython %s!\n" +"\n" +"Silahkan kunjungi learn.adafruit.com/category/circuitpython untuk panduan " +"project.\n" +"\n" +"Untuk menampilkan modul built-in silahkan ketik `help(\"modules\")`.\n" + +#: supervisor/shared/safe_mode.c +#, fuzzy +msgid "" +"You are running in safe mode which means something unanticipated happened.\n" +msgstr "" +"Anda sedang menjalankan mode aman (safe mode) yang berarti sesuatu yang " +"sangat buruk telah terjadi.\n" + +#: supervisor/shared/safe_mode.c +msgid "You requested starting safe mode by " +msgstr "Anda mengajukan untuk memulai mode aman pada (safe mode) pada " + +#: ports/unix/modusocket.c +#, c-format +msgid "[addrinfo error %d]" +msgstr "[addrinfo error %d]" + +#: py/objtype.c +msgid "__init__() should return None" +msgstr "" + +#: py/objtype.c +#, c-format +msgid "__init__() should return None, not '%s'" +msgstr "" + +#: py/objobject.c +msgid "__new__ arg must be a user-type" +msgstr "" + +#: extmod/modubinascii.c extmod/moduhashlib.c +msgid "a bytes-like object is required" +msgstr "sebuah objek menyerupai byte (bytes-like) dibutuhkan" + +#: lib/embed/abort_.c +msgid "abort() called" +msgstr "abort() dipanggil" + +#: ports/unix/modmachine.c extmod/machine_mem.c +#, c-format +msgid "address %08x is not aligned to %d bytes" +msgstr "alamat %08x tidak selaras dengan %d bytes" + +#: shared-bindings/i2cslave/I2CSlave.c +msgid "address out of bounds" +msgstr "" + +#: shared-bindings/i2cslave/I2CSlave.c +msgid "addresses is empty" +msgstr "" + +#: py/modbuiltins.c +msgid "arg is an empty sequence" +msgstr "" + +#: py/runtime.c +msgid "argument has wrong type" +msgstr "" + +#: py/argcheck.c +msgid "argument num/types mismatch" +msgstr "argumen num/types tidak cocok" + +#: py/runtime.c +msgid "argument should be a '%q' not a '%q'" +msgstr "" + +#: shared-bindings/nvm/ByteArray.c py/objarray.c +msgid "array/bytes required on right side" +msgstr "" + +#: py/objstr.c +msgid "attributes not supported yet" +msgstr "" + +#: ports/nrf/common-hal/bleio/Characteristic.c +msgid "bad GATT role" +msgstr "" + +#: py/builtinevex.c +msgid "bad compile mode" +msgstr "mode compile buruk" + +#: py/objstr.c +msgid "bad conversion specifier" +msgstr "" + +#: py/objstr.c +msgid "bad format string" +msgstr "" + +#: py/binary.c +msgid "bad typecode" +msgstr "typecode buruk" + +#: py/emitnative.c +msgid "binary op %q not implemented" +msgstr "" + +#: shared-bindings/busio/UART.c +msgid "bits must be 7, 8 or 9" +msgstr "" + +#: extmod/machine_spi.c +msgid "bits must be 8" +msgstr "bits harus memilki nilai 8" + +#: shared-bindings/audioio/Mixer.c +msgid "bits_per_sample must be 8 or 16" +msgstr "" + +#: py/emitinlinethumb.c +msgid "branch not in range" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c +#, c-format +msgid "buf is too small. need %d bytes" +msgstr "" + +#: shared-bindings/audioio/RawSample.c +msgid "buffer must be a bytes-like object" +msgstr "" + +#: shared-module/struct/__init__.c +#, fuzzy +msgid "buffer size must match format" +msgstr "buffers harus mempunyai panjang yang sama" + +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "buffer slices must be of equal length" +msgstr "" + +#: ports/esp8266/machine_rtc.c +msgid "buffer too long" +msgstr "buffer terlalu panjang" + +#: shared-bindings/struct/__init__.c shared-module/struct/__init__.c +#: py/modstruct.c +msgid "buffer too small" +msgstr "" + +#: extmod/machine_spi.c +msgid "buffers must be the same length" +msgstr "buffers harus mempunyai panjang yang sama" + +#: shared-bindings/_pew/PewPew.c +msgid "buttons must be digitalio.DigitalInOut" +msgstr "" + +#: py/vm.c +msgid "byte code not implemented" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c +#, c-format +msgid "byteorder is not an instance of ByteOrder (got a %s)" +msgstr "" + +#: ports/atmel-samd/common-hal/busio/UART.c +msgid "bytes > 8 bits not supported" +msgstr "byte > 8 bit tidak didukung" + +#: py/objstr.c +msgid "bytes value out of range" +msgstr "" + +#: ports/atmel-samd/bindings/samd/Clock.c +msgid "calibration is out of range" +msgstr "kalibrasi keluar dari jangkauan" + +#: ports/atmel-samd/bindings/samd/Clock.c +msgid "calibration is read only" +msgstr "kalibrasi adalah read only" + +#: ports/atmel-samd/common-hal/rtc/RTC.c +msgid "calibration value out of range +/-127" +msgstr "nilai kalibrasi keluar dari jangkauan +/-127" + +#: py/emitinlinethumb.c +msgid "can only have up to 4 parameters to Thumb assembly" +msgstr "hanya mampu memiliki hingga 4 parameter untuk Thumb assembly" + +#: py/emitinlinextensa.c +msgid "can only have up to 4 parameters to Xtensa assembly" +msgstr "" + +#: py/persistentcode.c +msgid "can only save bytecode" +msgstr "" + +#: ports/esp8266/modnetwork.c +msgid "can query only one param" +msgstr "hanya bisa melakukan query satu param" + +#: py/objtype.c +msgid "can't add special method to already-subclassed class" +msgstr "" + +#: py/compile.c +msgid "can't assign to expression" +msgstr "tidak dapat menetapkan ke ekspresi" + +#: py/obj.c +#, c-format +msgid "can't convert %s to complex" +msgstr "" + +#: py/obj.c +#, c-format +msgid "can't convert %s to float" +msgstr "" + +#: py/obj.c +#, c-format +msgid "can't convert %s to int" +msgstr "" + +#: py/objstr.c +msgid "can't convert '%q' object to %q implicitly" +msgstr "" + +#: py/objint.c +msgid "can't convert NaN to int" +msgstr "" + +#: shared-bindings/i2cslave/I2CSlave.c +msgid "can't convert address to int" +msgstr "" + +#: py/objint.c +msgid "can't convert inf to int" +msgstr "" + +#: py/obj.c +msgid "can't convert to complex" +msgstr "" + +#: py/obj.c +msgid "can't convert to float" +msgstr "" + +#: py/obj.c +msgid "can't convert to int" +msgstr "" + +#: py/objstr.c +msgid "can't convert to str implicitly" +msgstr "" + +#: py/compile.c +msgid "can't declare nonlocal in outer code" +msgstr "tidak dapat mendeklarasikan nonlocal diluar jangkauan kode" + +#: py/compile.c +msgid "can't delete expression" +msgstr "tidak bisa menghapus ekspresi" + +#: py/emitnative.c +msgid "can't do binary op between '%q' and '%q'" +msgstr "" + +#: py/objcomplex.c +msgid "can't do truncated division of a complex number" +msgstr "" + +#: ports/esp8266/modnetwork.c +msgid "can't get AP config" +msgstr "tidak bisa mendapatkan konfigurasi AP" + +#: ports/esp8266/modnetwork.c +msgid "can't get STA config" +msgstr "tidak bisa mendapatkan konfigurasi STA" + +#: py/compile.c +msgid "can't have multiple **x" +msgstr "tidak bisa memiliki **x ganda" + +#: py/compile.c +msgid "can't have multiple *x" +msgstr "tidak bisa memiliki *x ganda" + +#: py/emitnative.c +msgid "can't implicitly convert '%q' to 'bool'" +msgstr "" + +#: py/emitnative.c +msgid "can't load from '%q'" +msgstr "" + +#: py/emitnative.c +msgid "can't load with '%q' index" +msgstr "" + +#: py/objgenerator.c +msgid "can't pend throw to just-started generator" +msgstr "" + +#: py/objgenerator.c +msgid "can't send non-None value to a just-started generator" +msgstr "" + +#: ports/esp8266/modnetwork.c +msgid "can't set AP config" +msgstr "tidak bisa mendapatkan konfigurasi AP" + +#: ports/esp8266/modnetwork.c +msgid "can't set STA config" +msgstr "tidak bisa mendapatkan konfigurasi STA" + +#: py/objnamedtuple.c +msgid "can't set attribute" +msgstr "" + +#: py/emitnative.c +msgid "can't store '%q'" +msgstr "" + +#: py/emitnative.c +msgid "can't store to '%q'" +msgstr "" + +#: py/emitnative.c +msgid "can't store with '%q' index" +msgstr "" + +#: py/objstr.c +msgid "" +"can't switch from automatic field numbering to manual field specification" +msgstr "" + +#: py/objstr.c +msgid "" +"can't switch from manual field specification to automatic field numbering" +msgstr "" + +#: py/objtype.c +msgid "cannot create '%q' instances" +msgstr "" + +#: py/objtype.c +msgid "cannot create instance" +msgstr "" + +#: py/runtime.c +msgid "cannot import name %q" +msgstr "" + +#: py/builtinimport.c +msgid "cannot perform relative import" +msgstr "tidak dapat melakukan relative import" + +#: py/emitnative.c +msgid "casting" +msgstr "" + +#: shared-bindings/bleio/Service.c +msgid "characteristics includes an object that is not a Characteristic" +msgstr "" + +#: shared-bindings/_stage/Text.c +msgid "chars buffer too small" +msgstr "" + +#: py/modbuiltins.c +msgid "chr() arg not in range(0x110000)" +msgstr "" + +#: py/modbuiltins.c +msgid "chr() arg not in range(256)" +msgstr "" + +#: shared-bindings/displayio/Palette.c +msgid "color buffer must be 3 bytes (RGB) or 4 bytes (RGB + pad byte)" +msgstr "" + +#: shared-bindings/displayio/Palette.c +msgid "color buffer must be a buffer or int" +msgstr "" + +#: shared-bindings/displayio/Palette.c +msgid "color buffer must be a bytearray or array of type 'b' or 'B'" +msgstr "" + +#: shared-bindings/displayio/Palette.c +msgid "color must be between 0x000000 and 0xffffff" +msgstr "" + +#: shared-bindings/displayio/ColorConverter.c +msgid "color should be an int" +msgstr "" + +#: py/objcomplex.c +msgid "complex division by zero" +msgstr "" + +#: py/parsenum.c py/objfloat.c +msgid "complex values not supported" +msgstr "" + +#: extmod/moduzlib.c +msgid "compression header" +msgstr "kompresi header" + +#: py/parse.c +msgid "constant must be an integer" +msgstr "" + +#: py/emitnative.c +msgid "conversion to object" +msgstr "" + +#: py/parsenum.c +msgid "decimal numbers not supported" +msgstr "" + +#: py/compile.c +msgid "default 'except' must be last" +msgstr "'except' standar harus terakhir" + +#: shared-bindings/audiobusio/PDMIn.c +msgid "" +"destination buffer must be a bytearray or array of type 'B' for bit_depth = 8" +msgstr "" + +#: shared-bindings/audiobusio/PDMIn.c +msgid "destination buffer must be an array of type 'H' for bit_depth = 16" +msgstr "" + +#: shared-bindings/audiobusio/PDMIn.c +msgid "destination_length must be an int >= 0" +msgstr "" + +#: py/objdict.c +msgid "dict update sequence has wrong length" +msgstr "" + +#: shared-bindings/math/__init__.c py/runtime.c py/modmath.c py/objint_mpz.c +#: py/objint_longlong.c py/objfloat.c +msgid "division by zero" +msgstr "" + +#: ports/esp8266/modnetwork.c +msgid "either pos or kw args are allowed" +msgstr "hanya antar pos atau kw args yang diperbolehkan" + +#: py/objdeque.c +msgid "empty" +msgstr "" + +#: extmod/modutimeq.c extmod/moduheapq.c +msgid "empty heap" +msgstr "heap kosong" + +#: py/objstr.c +msgid "empty separator" +msgstr "" + +#: shared-bindings/random/__init__.c +msgid "empty sequence" +msgstr "" + +#: py/objstr.c +msgid "end of format while looking for conversion specifier" +msgstr "" + +#: shared-bindings/displayio/Shape.c +msgid "end_x should be an int" +msgstr "" + +#: ports/nrf/common-hal/busio/UART.c +#, c-format +msgid "error = 0x%08lX" +msgstr "error = 0x%08lX" + +#: py/runtime.c +msgid "exceptions must derive from BaseException" +msgstr "" + +#: py/objstr.c +msgid "expected ':' after format specifier" +msgstr "" + +#: shared-bindings/gamepad/GamePad.c +msgid "expected a DigitalInOut" +msgstr "" + +#: py/obj.c +msgid "expected tuple/list" +msgstr "" + +#: py/modthread.c +msgid "expecting a dict for keyword args" +msgstr "" + +#: ports/esp8266/machine_pin.c +msgid "expecting a pin" +msgstr "mengharapkan sebuah pin" + +#: py/compile.c +msgid "expecting an assembler instruction" +msgstr "sebuah instruksi assembler diharapkan" + +#: py/compile.c +msgid "expecting just a value for set" +msgstr "hanya mengharapkan sebuah nilai (value) untuk set" + +#: py/compile.c +msgid "expecting key:value for dict" +msgstr "key:value diharapkan untuk dict" + +#: py/argcheck.c +msgid "extra keyword arguments given" +msgstr "argumen keyword ekstra telah diberikan" + +#: py/argcheck.c +msgid "extra positional arguments given" +msgstr "argumen posisi ekstra telah diberikan" + +#: ports/unix/modffi.c +msgid "ffi_prep_closure_loc" +msgstr "ffi_prep_closure_loc" + +#: shared-bindings/displayio/OnDiskBitmap.c shared-bindings/audioio/WaveFile.c +msgid "file must be a file opened in byte mode" +msgstr "" + +#: shared-bindings/storage/__init__.c +msgid "filesystem must provide mount method" +msgstr "" + +#: py/objtype.c +msgid "first argument to super() must be type" +msgstr "" + +#: extmod/machine_spi.c +msgid "firstbit must be MSB" +msgstr "bit pertama(firstbit) harus berupa MSB" + +#: ports/esp8266/modesp.c +msgid "flash location must be below 1MByte" +msgstr "alokasi flash harus dibawah 1MByte" + +#: py/objint.c +msgid "float too big" +msgstr "" + +#: shared-bindings/_stage/Text.c +msgid "font must be 2048 bytes long" +msgstr "" + +#: py/objstr.c +msgid "format requires a dict" +msgstr "" + +#: ports/esp8266/modmachine.c +msgid "frequency can only be either 80Mhz or 160MHz" +msgstr "frekuensi hanya bisa didefinisikan 80Mhz atau 160Mhz" + +#: py/objdeque.c +msgid "full" +msgstr "" + +#: py/argcheck.c +msgid "function does not take keyword arguments" +msgstr "fungsi tidak dapat mengambil argumen keyword" + +#: py/argcheck.c +#, c-format +msgid "function expected at most %d arguments, got %d" +msgstr "fungsi diharapkan setidaknya %d argumen, hanya mendapatkan %d" + +#: py/objnamedtuple.c py/bc.c +msgid "function got multiple values for argument '%q'" +msgstr "fungsi mendapatkan nilai ganda untuk argumen '%q'" + +#: py/argcheck.c +#, c-format +msgid "function missing %d required positional arguments" +msgstr "fungsi kehilangan %d argumen posisi yang dibutuhkan" + +#: py/bc.c +msgid "function missing keyword-only argument" +msgstr "fungsi kehilangan argumen keyword-only" + +#: py/bc.c +msgid "function missing required keyword argument '%q'" +msgstr "fungsi kehilangan argumen keyword '%q' yang dibutuhkan" + +#: py/bc.c +#, c-format +msgid "function missing required positional argument #%d" +msgstr "fungsi kehilangan argumen posisi #%d yang dibutuhkan" + +#: py/argcheck.c py/objnamedtuple.c py/bc.c +#, c-format +msgid "function takes %d positional arguments but %d were given" +msgstr "fungsi mengambil posisi argumen %d tapi %d yang diberikan" + +#: shared-bindings/time/__init__.c +msgid "function takes exactly 9 arguments" +msgstr "" + +#: py/objgenerator.c +msgid "generator already executing" +msgstr "" + +#: py/objgenerator.c +msgid "generator ignored GeneratorExit" +msgstr "" + +#: shared-bindings/_stage/Layer.c +msgid "graphic must be 2048 bytes long" +msgstr "" + +#: extmod/moduheapq.c +msgid "heap must be a list" +msgstr "heap harus berupa sebuah list" + +#: py/compile.c +msgid "identifier redefined as global" +msgstr "identifier didefinisi ulang sebagai global" + +#: py/compile.c +msgid "identifier redefined as nonlocal" +msgstr "identifier didefinisi ulang sebagai nonlocal" + +#: ports/esp8266/machine_hspi.c +msgid "impossible baudrate" +msgstr "baudrate tidak memungkinkan" + +#: py/objstr.c +msgid "incomplete format" +msgstr "" + +#: py/objstr.c +msgid "incomplete format key" +msgstr "" + +#: extmod/modubinascii.c +msgid "incorrect padding" +msgstr "lapisan (padding) tidak benar" + +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +#: ports/nrf/common-hal/pulseio/PulseIn.c +#: ports/esp8266/common-hal/pulseio/PulseIn.c py/obj.c +msgid "index out of range" +msgstr "index keluar dari jangkauan" + +#: py/obj.c +msgid "indices must be integers" +msgstr "" + +#: py/compile.c +msgid "inline assembler must be a function" +msgstr "inline assembler harus sebuah fungsi" + +#: py/parsenum.c +msgid "int() arg 2 must be >= 2 and <= 36" +msgstr "" + +#: py/objstr.c +msgid "integer required" +msgstr "" + +#: ports/nrf/common-hal/bleio/Broadcaster.c +msgid "interval not in range 0.0020 to 10.24" +msgstr "" + +#: extmod/machine_i2c.c +msgid "invalid I2C peripheral" +msgstr "perangkat I2C tidak valid" + +#: extmod/machine_spi.c +msgid "invalid SPI peripheral" +msgstr "perangkat SPI tidak valid" + +#: ports/esp8266/machine_rtc.c +msgid "invalid alarm" +msgstr "alarm tidak valid" + +#: lib/netutils/netutils.c +msgid "invalid arguments" +msgstr "argumen-argumen tidak valid" + +#: ports/esp8266/modnetwork.c +msgid "invalid buffer length" +msgstr "panjang buffer tidak valid" + +#: extmod/modussl_axtls.c +msgid "invalid cert" +msgstr "cert tidak valid" + +#: ports/esp8266/common-hal/busio/UART.c ports/esp8266/machine_uart.c +msgid "invalid data bits" +msgstr "bit data tidak valid" + +#: extmod/uos_dupterm.c +msgid "invalid dupterm index" +msgstr "indeks dupterm tidak valid" + +#: extmod/modframebuf.c +msgid "invalid format" +msgstr "format tidak valid" + +#: py/objstr.c +msgid "invalid format specifier" +msgstr "" + +#: extmod/modussl_axtls.c +msgid "invalid key" +msgstr "key tidak valid" + +#: py/compile.c +msgid "invalid micropython decorator" +msgstr "micropython decorator tidak valid" + +#: ports/esp8266/machine_pin.c +msgid "invalid pin" +msgstr "pin tidak valid" + +#: shared-bindings/random/__init__.c +msgid "invalid step" +msgstr "" + +#: ports/esp8266/common-hal/busio/UART.c ports/esp8266/machine_uart.c +msgid "invalid stop bits" +msgstr "stop bit tidak valid" + +#: py/compile.c py/parse.c +msgid "invalid syntax" +msgstr "syntax tidak valid" + +#: py/parsenum.c +msgid "invalid syntax for integer" +msgstr "" + +#: py/parsenum.c +#, c-format +msgid "invalid syntax for integer with base %d" +msgstr "" + +#: py/parsenum.c +msgid "invalid syntax for number" +msgstr "" + +#: py/objtype.c +msgid "issubclass() arg 1 must be a class" +msgstr "" + +#: py/objtype.c +msgid "issubclass() arg 2 must be a class or a tuple of classes" +msgstr "" + +#: py/objstr.c +msgid "join expects a list of str/bytes objects consistent with self object" +msgstr "" + +#: py/argcheck.c +msgid "keyword argument(s) not yet implemented - use normal args instead" +msgstr "argumen keyword belum diimplementasi - gunakan args normal" + +#: py/bc.c +msgid "keywords must be strings" +msgstr "keyword harus berupa string" + +#: py/emitinlinextensa.c py/emitinlinethumb.c +msgid "label '%q' not defined" +msgstr "" + +#: py/compile.c +msgid "label redefined" +msgstr "label didefinis ulang" + +#: ports/esp8266/modesp.c +msgid "len must be multiple of 4" +msgstr "len harus kelipatan dari 4" + +#: py/stream.c +msgid "length argument not allowed for this type" +msgstr "" + +#: py/objarray.c +msgid "lhs and rhs should be compatible" +msgstr "" + +#: py/emitnative.c +msgid "local '%q' has type '%q' but source is '%q'" +msgstr "" + +#: py/emitnative.c +msgid "local '%q' used before type known" +msgstr "" + +#: py/vm.c +msgid "local variable referenced before assignment" +msgstr "" + +#: py/objint.c +msgid "long int not supported in this build" +msgstr "" + +#: shared-bindings/_stage/Layer.c +msgid "map buffer too small" +msgstr "" + +#: shared-bindings/math/__init__.c py/modmath.c +msgid "math domain error" +msgstr "" + +#: py/runtime.c +msgid "maximum recursion depth exceeded" +msgstr "" + +#: py/runtime.c +#, c-format +msgid "memory allocation failed, allocating %u bytes" +msgstr "" + +#: ports/esp8266/modesp.c +#, c-format +msgid "memory allocation failed, allocating %u bytes for native code" +msgstr "alokasi memori gagal, mengalokasikan %u byte untuk kode native" + +#: py/runtime.c +msgid "memory allocation failed, heap is locked" +msgstr "" + +#: py/builtinimport.c +msgid "module not found" +msgstr "modul tidak ditemukan" + +#: py/compile.c +msgid "multiple *x in assignment" +msgstr "perkalian *x dalam assignment" + +#: py/objtype.c +msgid "multiple bases have instance lay-out conflict" +msgstr "" + +#: py/objtype.c +msgid "multiple inheritance not supported" +msgstr "" + +#: py/emitnative.c +msgid "must raise an object" +msgstr "" + +#: extmod/machine_spi.c +msgid "must specify all of sck/mosi/miso" +msgstr "harus menentukan semua pin sck/mosi/miso" + +#: py/modbuiltins.c +msgid "must use keyword argument for key function" +msgstr "" + +#: py/runtime.c +msgid "name '%q' is not defined" +msgstr "" + +#: shared-bindings/bleio/Peripheral.c +#, fuzzy +msgid "name must be a string" +msgstr "keyword harus berupa string" + +#: py/runtime.c +msgid "name not defined" +msgstr "" + +#: py/compile.c +msgid "name reused for argument" +msgstr "nama digunakan kembali untuk argumen" + +#: py/emitnative.c +msgid "native yield" +msgstr "" + +#: py/runtime.c +#, c-format +msgid "need more than %d values to unpack" +msgstr "" + +#: py/runtime.c py/objint_mpz.c py/objint_longlong.c +msgid "negative power with no float support" +msgstr "" + +#: py/runtime.c py/objint_mpz.c +msgid "negative shift count" +msgstr "" + +#: py/vm.c +msgid "no active exception to reraise" +msgstr "" + +#: shared-bindings/socket/__init__.c shared-module/network/__init__.c +msgid "no available NIC" +msgstr "" + +#: py/compile.c +msgid "no binding for nonlocal found" +msgstr "tidak ada ikatan/bind pada temuan nonlocal" + +#: py/builtinimport.c +msgid "no module named '%q'" +msgstr "tidak ada modul yang bernama '%q'" + +#: shared-bindings/_pixelbuf/__init__.c py/runtime.c +msgid "no such attribute" +msgstr "" + +#: py/compile.c +msgid "non-default argument follows default argument" +msgstr "argumen non-default mengikuti argumen standar(default)" + +#: extmod/modubinascii.c +msgid "non-hex digit found" +msgstr "digit non-hex ditemukan" + +#: py/compile.c +msgid "non-keyword arg after */**" +msgstr "non-keyword arg setelah */**" + +#: py/compile.c +msgid "non-keyword arg after keyword arg" +msgstr "non-keyword arg setelah keyword arg" + +#: shared-bindings/bleio/UUID.c +msgid "not a 128-bit UUID" +msgstr "" + +#: ports/esp8266/machine_adc.c +#, c-format +msgid "not a valid ADC Channel: %d" +msgstr "tidak valid channel ADC: %d" + +#: py/objstr.c +msgid "not all arguments converted during string formatting" +msgstr "" + +#: py/objstr.c +msgid "not enough arguments for format string" +msgstr "" + +#: py/obj.c +#, c-format +msgid "object '%s' is not a tuple or list" +msgstr "" + +#: py/obj.c +msgid "object does not support item assignment" +msgstr "" + +#: py/obj.c +msgid "object does not support item deletion" +msgstr "" + +#: py/obj.c +msgid "object has no len" +msgstr "" + +#: py/obj.c +msgid "object is not subscriptable" +msgstr "" + +#: py/runtime.c +msgid "object not an iterator" +msgstr "" + +#: py/objtype.c py/runtime.c +msgid "object not callable" +msgstr "" + +#: py/sequence.c +msgid "object not in sequence" +msgstr "" + +#: py/runtime.c +msgid "object not iterable" +msgstr "" + +#: py/obj.c +#, c-format +msgid "object of type '%s' has no len()" +msgstr "" + +#: py/obj.c +msgid "object with buffer protocol required" +msgstr "" + +#: extmod/modubinascii.c +msgid "odd-length string" +msgstr "panjang data string memiliki keganjilan (odd-length)" + +#: py/objstrunicode.c py/objstr.c +#, fuzzy +msgid "offset out of bounds" +msgstr "modul tidak ditemukan" + +#: shared-bindings/nvm/ByteArray.c py/objarray.c py/objtuple.c +#: py/objstrunicode.c py/objstr.c +msgid "only slices with step=1 (aka None) are supported" +msgstr "" + +#: py/modbuiltins.c +msgid "ord expects a character" +msgstr "" + +#: py/modbuiltins.c +#, c-format +msgid "ord() expected a character, but string of length %d found" +msgstr "" + +#: py/objint_mpz.c +msgid "overflow converting long int to machine word" +msgstr "" + +#: shared-bindings/_stage/Text.c shared-bindings/_stage/Layer.c +msgid "palette must be 32 bytes long" +msgstr "" + +#: shared-bindings/displayio/Palette.c +msgid "palette_index should be an int" +msgstr "" + +#: py/compile.c +msgid "parameter annotation must be an identifier" +msgstr "anotasi parameter haruse sebuah identifier" + +#: py/emitinlinextensa.c +msgid "parameters must be registers in sequence a2 to a5" +msgstr "" + +#: py/emitinlinethumb.c +msgid "parameters must be registers in sequence r0 to r3" +msgstr "parameter harus menjadi register dalam urutan r0 sampai r3" + +#: ports/esp8266/machine_pin.c +msgid "pin does not have IRQ capabilities" +msgstr "pin tidak memiliki kemampuan IRQ" + +#: shared-bindings/displayio/Bitmap.c +msgid "pixel coordinates out of bounds" +msgstr "" + +#: shared-bindings/displayio/Bitmap.c +msgid "pixel value requires too many bits" +msgstr "" + +#: shared-bindings/displayio/TileGrid.c +msgid "pixel_shader must be displayio.Palette or displayio.ColorConverter" +msgstr "" + +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +#: ports/nrf/common-hal/pulseio/PulseIn.c +#: ports/esp8266/common-hal/pulseio/PulseIn.c +msgid "pop from an empty PulseIn" +msgstr "Muncul dari PulseIn yang kosong" + +#: py/objset.c +msgid "pop from an empty set" +msgstr "" + +#: py/objlist.c +msgid "pop from empty list" +msgstr "" + +#: py/objdict.c +msgid "popitem(): dictionary is empty" +msgstr "" + +#: py/objint_mpz.c +msgid "pow() 3rd argument cannot be 0" +msgstr "" + +#: py/objint_mpz.c +msgid "pow() with 3 arguments requires integers" +msgstr "" + +#: extmod/modutimeq.c +msgid "queue overflow" +msgstr "antrian meluap (overflow)" + +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "rawbuf is not the same size as buf" +msgstr "" + +#: shared-bindings/_pixelbuf/__init__.c +msgid "readonly attribute" +msgstr "" + +#: py/builtinimport.c +msgid "relative import" +msgstr "relative import" + +#: py/obj.c +#, c-format +msgid "requested length %d but object has length %d" +msgstr "" + +#: py/compile.c +msgid "return annotation must be an identifier" +msgstr "anotasi return harus sebuah identifier" + +#: py/emitnative.c +msgid "return expected '%q' but got '%q'" +msgstr "" + +#: shared-module/displayio/Bitmap.c +msgid "row must be packed and word aligned" +msgstr "" + +#: py/objstr.c +msgid "rsplit(None,n)" +msgstr "" + +#: shared-bindings/audioio/RawSample.c +msgid "" +"sample_source buffer must be a bytearray or array of type 'h', 'H', 'b' or " +"'B'" +msgstr "" + +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "sampling rate out of range" +msgstr "nilai sampling keluar dari jangkauan" + +#: ports/esp8266/modnetwork.c +msgid "scan failed" +msgstr "scan gagal" + +#: py/modmicropython.c +msgid "schedule stack full" +msgstr "" + +#: lib/utils/pyexec.c py/builtinimport.c +msgid "script compilation not supported" +msgstr "kompilasi script tidak didukung" + +#: shared-bindings/bleio/Peripheral.c +msgid "services includes an object that is not a Service" +msgstr "" + +#: py/objstr.c +msgid "sign not allowed in string format specifier" +msgstr "" + +#: py/objstr.c +msgid "sign not allowed with integer format specifier 'c'" +msgstr "" + +#: py/objstr.c +msgid "single '}' encountered in format string" +msgstr "" + +#: shared-bindings/time/__init__.c +msgid "sleep length must be non-negative" +msgstr "" + +#: py/objslice.c py/sequence.c +msgid "slice step cannot be zero" +msgstr "" + +#: py/sequence.c py/objint.c +msgid "small int overflow" +msgstr "" + +#: main.c +msgid "soft reboot\n" +msgstr "memulai ulang software(soft reboot)\n" + +#: py/objstr.c +msgid "start/end indices" +msgstr "" + +#: shared-bindings/displayio/Shape.c +msgid "start_x should be an int" +msgstr "" + +#: shared-bindings/random/__init__.c +msgid "step must be non-zero" +msgstr "" + +#: shared-bindings/busio/UART.c +msgid "stop must be 1 or 2" +msgstr "" + +#: shared-bindings/random/__init__.c +msgid "stop not reachable from start" +msgstr "" + +#: py/stream.c +msgid "stream operation not supported" +msgstr "" + +#: py/objstrunicode.c +msgid "string index out of range" +msgstr "" + +#: py/objstrunicode.c +#, c-format +msgid "string indices must be integers, not %s" +msgstr "" + +#: py/stream.c +msgid "string not supported; use bytes or bytearray" +msgstr "" + +#: extmod/moductypes.c +msgid "struct: cannot index" +msgstr "struct: tidak bisa melakukan index" + +#: extmod/moductypes.c +msgid "struct: index out of range" +msgstr "struct: index keluar dari jangkauan" + +#: extmod/moductypes.c +msgid "struct: no fields" +msgstr "struct: tidak ada fields" + +#: py/objstr.c +msgid "substring not found" +msgstr "" + +#: py/compile.c +msgid "super() can't find self" +msgstr "super() tidak dapat menemukan dirinya sendiri" + +#: extmod/modujson.c +msgid "syntax error in JSON" +msgstr "sintaksis error pada JSON" + +#: extmod/moductypes.c +msgid "syntax error in uctypes descriptor" +msgstr "sintaksis error pada pendeskripsi uctypes" + +#: shared-bindings/touchio/TouchIn.c +msgid "threshold must be in the range 0-65536" +msgstr "" + +#: shared-bindings/displayio/TileGrid.c +msgid "tile index out of bounds" +msgstr "" + +#: shared-bindings/time/__init__.c +msgid "time.struct_time() takes a 9-sequence" +msgstr "" + +#: shared-bindings/time/__init__.c +msgid "time.struct_time() takes exactly 1 argument" +msgstr "" + +#: shared-bindings/busio/UART.c +msgid "timeout >100 (units are now seconds, not msecs)" +msgstr "" + +#: shared-bindings/bleio/CharacteristicBuffer.c +#, fuzzy +msgid "timeout must be >= 0.0" +msgstr "bits harus memilki nilai 8" + +#: shared-bindings/time/__init__.c +msgid "timestamp out of range for platform time_t" +msgstr "" + +#: shared-bindings/gamepad/GamePad.c +msgid "too many arguments" +msgstr "" + +#: shared-module/struct/__init__.c +msgid "too many arguments provided with the given format" +msgstr "" + +#: py/runtime.c +#, c-format +msgid "too many values to unpack (expected %d)" +msgstr "" + +#: py/objstr.c +msgid "tuple index out of range" +msgstr "" + +#: py/obj.c +msgid "tuple/list has wrong length" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "tuple/list required on RHS" +msgstr "" + +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "tx and rx cannot both be None" +msgstr "tx dan rx keduanya tidak boleh kosong" + +#: py/objtype.c +msgid "type '%q' is not an acceptable base type" +msgstr "" + +#: py/objtype.c +msgid "type is not an acceptable base type" +msgstr "" + +#: py/runtime.c +msgid "type object '%q' has no attribute '%q'" +msgstr "" + +#: py/objtype.c +msgid "type takes 1 or 3 arguments" +msgstr "" + +#: py/objint_longlong.c +msgid "ulonglong too large" +msgstr "" + +#: py/emitnative.c +msgid "unary op %q not implemented" +msgstr "" + +#: py/parse.c +msgid "unexpected indent" +msgstr "" + +#: py/bc.c +msgid "unexpected keyword argument" +msgstr "argumen keyword tidak diharapkan" + +#: py/objnamedtuple.c py/bc.c +msgid "unexpected keyword argument '%q'" +msgstr "keyword argumen '%q' tidak diharapkan" + +#: py/lexer.c +msgid "unicode name escapes" +msgstr "" + +#: py/parse.c +msgid "unindent does not match any outer indentation level" +msgstr "" + +#: ports/esp8266/modnetwork.c +msgid "unknown config param" +msgstr "konfigurasi param tidak diketahui" + +#: py/objstr.c +#, c-format +msgid "unknown conversion specifier %c" +msgstr "" + +#: py/objstr.c +#, c-format +msgid "unknown format code '%c' for object of type '%s'" +msgstr "" + +#: py/objstr.c +#, c-format +msgid "unknown format code '%c' for object of type 'float'" +msgstr "" + +#: py/objstr.c +#, c-format +msgid "unknown format code '%c' for object of type 'str'" +msgstr "" + +#: ports/esp8266/modnetwork.c +msgid "unknown status param" +msgstr "status param tidak diketahui" + +#: py/compile.c +msgid "unknown type" +msgstr "tipe tidak diketahui" + +#: py/emitnative.c +msgid "unknown type '%q'" +msgstr "" + +#: py/objstr.c +msgid "unmatched '{' in format" +msgstr "" + +#: py/objtype.c py/runtime.c +msgid "unreadable attribute" +msgstr "" + +#: py/emitinlinethumb.c +#, c-format +msgid "unsupported Thumb instruction '%s' with %d arguments" +msgstr "" + +#: py/emitinlinextensa.c +#, c-format +msgid "unsupported Xtensa instruction '%s' with %d arguments" +msgstr "" + +#: shared-bindings/displayio/TileGrid.c +msgid "unsupported bitmap type" +msgstr "" + +#: py/objstr.c +#, c-format +msgid "unsupported format character '%c' (0x%x) at index %d" +msgstr "" + +#: py/runtime.c +msgid "unsupported type for %q: '%s'" +msgstr "" + +#: py/runtime.c +msgid "unsupported type for operator" +msgstr "" + +#: py/runtime.c +msgid "unsupported types for %q: '%s', '%s'" +msgstr "" + +#: shared-bindings/displayio/Bitmap.c +msgid "value_count must be > 0" +msgstr "" + +#: ports/esp8266/modnetwork.c +msgid "wifi_set_ip_info() failed" +msgstr "wifi_set_ip_info() gagal" + +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "write_args must be a list, tuple, or None" +msgstr "" + +#: py/objstr.c +msgid "wrong number of arguments" +msgstr "" + +#: py/runtime.c +msgid "wrong number of values to unpack" +msgstr "" + +#: shared-module/displayio/Shape.c +msgid "x value out of bounds" +msgstr "" + +#: shared-bindings/displayio/Shape.c +msgid "y should be an int" +msgstr "" + +#: shared-module/displayio/Shape.c +msgid "y value out of bounds" +msgstr "" + +#: py/objrange.c +msgid "zero step" +msgstr "" + +#, fuzzy +#~ msgid "Failed to notify or indicate attribute value, err %0x04x" +#~ msgstr "Gagal untuk melaporkan nilai atribut, status: 0x%08lX" + +#, fuzzy +#~ msgid "Failed to read attribute value, err %0x04x" +#~ msgstr "Gagal untuk membaca nilai atribut, status: 0x%08lX" diff --git a/locale/circuitpython.pot b/locale/circuitpython.pot index 92e181302..645b2e4ad 100644 --- a/locale/circuitpython.pot +++ b/locale/circuitpython.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-12-26 20:49+0100\n" +"POT-Creation-Date: 2019-03-25 19:40+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -17,2532 +17,2806 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: extmod/machine_i2c.c:299 -msgid "invalid I2C peripheral" -msgstr "" - -#: extmod/machine_i2c.c:340 extmod/machine_i2c.c:354 extmod/machine_i2c.c:368 -#: extmod/machine_i2c.c:392 -msgid "I2C operation not supported" +#: main.c +msgid "" +"\n" +"Code done running. Waiting for reload.\n" msgstr "" -#: extmod/machine_mem.c:45 ports/unix/modmachine.c:53 -#, c-format -msgid "address %08x is not aligned to %d bytes" +#: py/obj.c +msgid " File \"%q\"" msgstr "" -#: extmod/machine_spi.c:57 -msgid "invalid SPI peripheral" +#: py/obj.c +msgid " File \"%q\", line %d" msgstr "" -#: extmod/machine_spi.c:124 -msgid "buffers must be the same length" +#: main.c +msgid " output:\n" msgstr "" -#: extmod/machine_spi.c:207 -msgid "bits must be 8" +#: py/objstr.c +#, c-format +msgid "%%c requires int or char" msgstr "" -#: extmod/machine_spi.c:210 -msgid "firstbit must be MSB" +#: shared-bindings/microcontroller/Pin.c +msgid "%q in use" msgstr "" -#: extmod/machine_spi.c:215 -msgid "must specify all of sck/mosi/miso" +#: py/obj.c +msgid "%q index out of range" msgstr "" -#: extmod/modframebuf.c:299 -msgid "invalid format" +#: py/obj.c +msgid "%q indices must be integers, not %s" msgstr "" -#: extmod/modubinascii.c:38 extmod/moduhashlib.c:102 -msgid "a bytes-like object is required" +#: shared-bindings/displayio/Group.c shared-bindings/displayio/Shape.c +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "%q must be >= 1" msgstr "" -#: extmod/modubinascii.c:90 -msgid "odd-length string" +#: shared-bindings/fontio/BuiltinFont.c +msgid "%q should be an int" msgstr "" -#: extmod/modubinascii.c:101 -msgid "non-hex digit found" +#: py/objnamedtuple.c py/bc.c +msgid "%q() takes %d positional arguments but %d were given" msgstr "" -#: extmod/modubinascii.c:169 -msgid "incorrect padding" +#: py/argcheck.c +msgid "'%q' argument required" msgstr "" -#: extmod/moductypes.c:122 -msgid "syntax error in uctypes descriptor" +#: py/emitinlinextensa.c py/emitinlinethumb.c +#, c-format +msgid "'%s' expects a label" msgstr "" -#: extmod/moductypes.c:219 -msgid "Cannot unambiguously get sizeof scalar" +#: py/emitinlinextensa.c py/emitinlinethumb.c +#, c-format +msgid "'%s' expects a register" msgstr "" -#: extmod/moductypes.c:397 -msgid "struct: no fields" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects a special register" msgstr "" -#: extmod/moductypes.c:530 -msgid "struct: cannot index" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects an FPU register" msgstr "" -#: extmod/moductypes.c:544 -msgid "struct: index out of range" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects an address of the form [a, b]" msgstr "" -#: extmod/moduheapq.c:38 -msgid "heap must be a list" +#: py/emitinlinextensa.c py/emitinlinethumb.c +#, c-format +msgid "'%s' expects an integer" msgstr "" -#: extmod/moduheapq.c:86 extmod/modutimeq.c:147 extmod/modutimeq.c:172 -msgid "empty heap" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects at most r%d" msgstr "" -#: extmod/modujson.c:281 -msgid "syntax error in JSON" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects {r0, r1, ...}" msgstr "" -#: extmod/modure.c:161 -msgid "Splitting with sub-captures" +#: py/emitinlinextensa.c +#, c-format +msgid "'%s' integer %d is not within range %d..%d" msgstr "" -#: extmod/modure.c:207 -msgid "Error in regex" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' integer 0x%x does not fit in mask 0x%x" msgstr "" -#: extmod/modussl_axtls.c:81 -msgid "invalid key" +#: py/obj.c +#, c-format +msgid "'%s' object does not support item assignment" msgstr "" -#: extmod/modussl_axtls.c:87 -msgid "invalid cert" +#: py/obj.c +#, c-format +msgid "'%s' object does not support item deletion" msgstr "" -#: extmod/modutimeq.c:131 -msgid "queue overflow" +#: py/runtime.c +msgid "'%s' object has no attribute '%q'" msgstr "" -#: extmod/moduzlib.c:98 -msgid "compression header" +#: py/runtime.c +#, c-format +msgid "'%s' object is not an iterator" msgstr "" -#: extmod/uos_dupterm.c:120 -msgid "invalid dupterm index" +#: py/objtype.c py/runtime.c +#, c-format +msgid "'%s' object is not callable" msgstr "" -#: extmod/vfs_fat.c:426 py/moduerrno.c:154 -msgid "Read-only filesystem" +#: py/runtime.c +#, c-format +msgid "'%s' object is not iterable" msgstr "" -#: extmod/vfs_posix_file.c:48 ports/unix/file.c:50 py/objstringio.c:43 -msgid "I/O operation on closed file" +#: py/obj.c +#, c-format +msgid "'%s' object is not subscriptable" msgstr "" -#: lib/embed/abort_.c:8 -msgid "abort() called" +#: py/objstr.c +msgid "'=' alignment not allowed in string format specifier" msgstr "" -#: lib/netutils/netutils.c:83 -msgid "invalid arguments" +#: shared-module/struct/__init__.c +msgid "'S' and 'O' are not supported format types" msgstr "" -#: lib/utils/pyexec.c:97 py/builtinimport.c:251 -msgid "script compilation not supported" +#: py/compile.c +msgid "'align' requires 1 argument" msgstr "" -#: main.c:150 -msgid " output:\n" +#: py/compile.c +msgid "'await' outside function" msgstr "" -#: main.c:164 main.c:237 -msgid "" -"Auto-reload is on. Simply save files over USB to run them or enter REPL to " -"disable.\n" +#: py/compile.c +msgid "'break' outside loop" msgstr "" -#: main.c:166 -msgid "Running in safe mode! Auto-reload is off.\n" +#: py/compile.c +msgid "'continue' outside loop" msgstr "" -#: main.c:168 main.c:239 -msgid "Auto-reload is off.\n" +#: py/compile.c +msgid "'data' requires at least 2 arguments" msgstr "" -#: main.c:182 -msgid "Running in safe mode! Not running saved code.\n" +#: py/compile.c +msgid "'data' requires integer arguments" msgstr "" -#: main.c:198 -msgid "WARNING: Your code filename has two extensions\n" +#: py/compile.c +msgid "'label' requires 1 argument" msgstr "" -#: main.c:244 -msgid "Press any key to enter the REPL. Use CTRL-D to reload." +#: py/compile.c +msgid "'return' outside function" msgstr "" -#: main.c:407 -msgid "soft reboot\n" +#: py/compile.c +msgid "'yield' outside function" msgstr "" -#: ports/atmel-samd/audio_dma.c:209 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:361 -msgid "All sync event channels in use" +#: py/compile.c +msgid "*x must be assignment target" msgstr "" -#: ports/atmel-samd/bindings/samd/Clock.c:135 -msgid "calibration is read only" +#: py/obj.c +msgid ", in %q\n" msgstr "" -#: ports/atmel-samd/bindings/samd/Clock.c:137 -msgid "calibration is out of range" +#: py/objcomplex.c +msgid "0.0 to a complex power" msgstr "" -#: ports/atmel-samd/board_busses.c:59 ports/nrf/board_busses.c:39 -msgid "No default I2C bus" +#: py/modbuiltins.c +msgid "3-arg pow() not supported" msgstr "" -#: ports/atmel-samd/board_busses.c:85 ports/nrf/board_busses.c:64 -msgid "No default SPI bus" +#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c +msgid "A hardware interrupt channel is already in use" msgstr "" -#: ports/atmel-samd/board_busses.c:112 ports/nrf/board_busses.c:91 -msgid "No default UART bus" +#: ports/esp8266/modnetwork.c +msgid "AP required" msgstr "" -#: ports/atmel-samd/common-hal/analogio/AnalogIn.c:63 -#: ports/nrf/common-hal/analogio/AnalogIn.c:39 -msgid "Pin does not have ADC capabilities" +#: shared-bindings/bleio/Address.c +#, c-format +msgid "Address is not %d bytes long or is in wrong format" msgstr "" -#: ports/atmel-samd/common-hal/analogio/AnalogOut.c:49 -msgid "No DAC on chip" +#: shared-bindings/bleio/Address.c +#, c-format +msgid "Address must be %d bytes long" msgstr "" -#: ports/atmel-samd/common-hal/analogio/AnalogOut.c:56 -msgid "AnalogOut not supported on given pin" +#: ports/nrf/common-hal/busio/I2C.c +msgid "All I2C peripherals are in use" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:147 -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:150 -msgid "Invalid bit clock pin" +#: ports/nrf/common-hal/busio/SPI.c +msgid "All SPI peripherals are in use" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:153 -msgid "Bit clock and word select must share a clock unit" +#: ports/nrf/common-hal/busio/UART.c +msgid "All UART peripherals are in use" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:156 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:130 -msgid "Invalid data pin" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "All event channels in use" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:169 -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:174 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:145 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:150 -msgid "Serializer in use" +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c ports/atmel-samd/audio_dma.c +msgid "All sync event channels in use" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:230 -msgid "Clock unit in use" +#: shared-bindings/pulseio/PWMOut.c +msgid "All timers for this pin are in use" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:240 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:172 -msgid "Unable to find free GCLK" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/pulseio/PulseOut.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c +#: shared-module/_pew/PewPew.c +msgid "All timers in use" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:254 -msgid "Too many channels in sample." +#: ports/nrf/common-hal/analogio/AnalogOut.c +msgid "AnalogOut functionality not supported" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:305 -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:417 -msgid "No DMA channel found" +#: shared-bindings/analogio/AnalogOut.c +msgid "AnalogOut is only 16 bits. Value must be less than 65536." msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:308 -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:419 -msgid "Unable to allocate buffers for signed conversion" +#: ports/atmel-samd/common-hal/analogio/AnalogOut.c +msgid "AnalogOut not supported on given pin" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:109 -msgid "Invalid clock pin" +#: ports/atmel-samd/common-hal/pulseio/PulseOut.c +msgid "Another send is already active" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:134 -msgid "Only 8 or 16 bit mono with " +#: shared-bindings/pulseio/PulseOut.c +msgid "Array must contain halfwords (type 'H')" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:167 -msgid "sampling rate out of range" +#: shared-bindings/nvm/ByteArray.c +msgid "Array values should be single bytes." msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:132 -msgid "DAC already in use" +#: supervisor/shared/safe_mode.c +msgid "Attempted heap allocation when MicroPython VM not running.\n" msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:136 -msgid "Right channel unsupported" +#: main.c +msgid "Auto-reload is off.\n" msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:139 -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:116 -#: ports/atmel-samd/common-hal/touchio/TouchIn.c:65 -msgid "Invalid pin" +#: main.c +msgid "" +"Auto-reload is on. Simply save files over USB to run them or enter REPL to " +"disable.\n" msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:147 -msgid "Invalid pin for left channel" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Bit clock and word select must share a clock unit" msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:151 -msgid "Invalid pin for right channel" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Bit depth must be multiple of 8." msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:154 -msgid "Cannot output both channels on the same pin" +#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c +msgid "Both pins must support hardware interrupts" msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:243 -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:189 -#: ports/atmel-samd/common-hal/pulseio/PulseOut.c:110 -#: ports/nrf/common-hal/pulseio/PulseOut.c:107 -msgid "All timers in use" +#: shared-bindings/supervisor/__init__.c +msgid "Brightness must be between 0 and 255" msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:285 -msgid "All event channels in use" +#: shared-bindings/displayio/Display.c +msgid "Brightness not adjustable" msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:375 +#: shared-module/usb_hid/Device.c #, c-format -msgid "Sample rate too high. It must be less than %d" +msgid "Buffer incorrect size. Should be %d bytes." msgstr "" -#: ports/atmel-samd/common-hal/busio/I2C.c:71 -msgid "Not enough pins available" +#: shared-bindings/bitbangio/I2C.c shared-bindings/busio/I2C.c +msgid "Buffer must be at least length 1" msgstr "" -#: ports/atmel-samd/common-hal/busio/I2C.c:78 -#: ports/atmel-samd/common-hal/busio/SPI.c:171 -#: ports/atmel-samd/common-hal/busio/UART.c:120 -#: ports/atmel-samd/common-hal/i2cslave/I2CSlave.c:45 -#: ports/nrf/common-hal/busio/I2C.c:82 -msgid "Invalid pins" +#: ports/atmel-samd/common-hal/displayio/ParallelBus.c +#: ports/nrf/common-hal/displayio/ParallelBus.c +#, c-format +msgid "Bus pin %d is already in use" msgstr "" -#: ports/atmel-samd/common-hal/busio/I2C.c:101 -msgid "SDA or SCL needs a pull up" +#: shared-bindings/bleio/UUID.c +msgid "Byte buffer must be 16 bytes." msgstr "" -#: ports/atmel-samd/common-hal/busio/I2C.c:121 -msgid "Unsupported baudrate" +#: shared-bindings/nvm/ByteArray.c +msgid "Bytes must be between 0 and 255." msgstr "" -#: ports/atmel-samd/common-hal/busio/UART.c:67 -msgid "bytes > 8 bits not supported" +#: ports/esp8266/esp_mphal.c +msgid "C-level assert" msgstr "" -#: ports/atmel-samd/common-hal/busio/UART.c:73 -#: ports/nrf/common-hal/busio/UART.c:106 -msgid "tx and rx cannot both be None" +#: shared-bindings/_pixelbuf/PixelBuf.c +#, c-format +msgid "Can not use dotstar with %s" msgstr "" -#: ports/atmel-samd/common-hal/busio/UART.c:146 -#: ports/nrf/common-hal/busio/UART.c:140 -msgid "Failed to allocate RX buffer" +#: shared-bindings/bleio/Device.c +msgid "Can't add services in Central mode" msgstr "" -#: ports/atmel-samd/common-hal/busio/UART.c:154 -msgid "Could not initialize UART" +#: shared-bindings/bleio/Device.c +msgid "Can't advertise in Central mode" msgstr "" -#: ports/atmel-samd/common-hal/busio/UART.c:241 -#: ports/nrf/common-hal/busio/UART.c:185 -msgid "No RX pin" +#: shared-bindings/bleio/Device.c +msgid "Can't change the name in Central mode" msgstr "" -#: ports/atmel-samd/common-hal/busio/UART.c:300 -#: ports/nrf/common-hal/busio/UART.c:220 -msgid "No TX pin" +#: shared-bindings/bleio/Device.c +msgid "Can't connect in Peripheral mode" msgstr "" -#: ports/atmel-samd/common-hal/digitalio/DigitalInOut.c:170 -#: ports/nrf/common-hal/digitalio/DigitalInOut.c:147 -msgid "Cannot get pull while in output mode" +#: ports/esp8266/modnetwork.c +msgid "Cannot connect to AP" msgstr "" -#: ports/atmel-samd/common-hal/microcontroller/__init__.c:74 -#: ports/esp8266/common-hal/microcontroller/__init__.c:64 -msgid "Cannot reset into bootloader because no bootloader is present." +#: shared-bindings/displayio/Bitmap.c shared-bindings/pulseio/PulseIn.c +msgid "Cannot delete values" msgstr "" -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:120 -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:369 -#: ports/nrf/common-hal/pulseio/PWMOut.c:119 -#: ports/nrf/common-hal/pulseio/PWMOut.c:233 -msgid "Invalid PWM frequency" +#: ports/esp8266/modnetwork.c +msgid "Cannot disconnect from AP" msgstr "" -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:187 -msgid "All timers for this pin are in use" +#: ports/atmel-samd/common-hal/digitalio/DigitalInOut.c +#: ports/nrf/common-hal/digitalio/DigitalInOut.c +msgid "Cannot get pull while in output mode" msgstr "" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:110 -msgid "No hardware support on pin" +#: ports/nrf/common-hal/microcontroller/Processor.c +msgid "Cannot get temperature" msgstr "" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:113 -msgid "EXTINT channel already in use" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Cannot output both channels on the same pin" msgstr "" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:118 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:86 -#, c-format -msgid "Failed to allocate RX buffer of %d bytes" +#: shared-module/bitbangio/SPI.c +msgid "Cannot read without MISO pin." msgstr "" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:205 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:151 -msgid "pop from an empty PulseIn" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Cannot record to a file" msgstr "" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:237 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:422 -msgid "index out of range" +#: shared-module/storage/__init__.c +msgid "Cannot remount '/' when USB is active." msgstr "" -#: ports/atmel-samd/common-hal/pulseio/PulseOut.c:178 -msgid "Another send is already active" +#: ports/atmel-samd/common-hal/microcontroller/__init__.c +#: ports/esp8266/common-hal/microcontroller/__init__.c +msgid "Cannot reset into bootloader because no bootloader is present." msgstr "" -#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c:38 -msgid "Both pins must support hardware interrupts" +#: ports/esp8266/modnetwork.c +msgid "Cannot set STA config" msgstr "" -#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c:46 -msgid "A hardware interrupt channel is already in use" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Cannot set value when direction is input." msgstr "" -#: ports/atmel-samd/common-hal/rtc/RTC.c:101 -msgid "calibration value out of range +/-127" +#: py/objslice.c +msgid "Cannot subclass slice" msgstr "" -#: ports/atmel-samd/common-hal/touchio/TouchIn.c:75 -msgid "No free GCLKs" +#: shared-module/bitbangio/SPI.c +msgid "Cannot transfer without MOSI and MISO pins." msgstr "" -#: ports/esp8266/common-hal/analogio/AnalogIn.c:43 -msgid "Pin %q does not have ADC capabilities" +#: extmod/moductypes.c +msgid "Cannot unambiguously get sizeof scalar" msgstr "" -#: ports/esp8266/common-hal/analogio/AnalogOut.c:39 -msgid "No hardware support for analog out." +#: ports/esp8266/modnetwork.c +msgid "Cannot update i/f status" msgstr "" -#: ports/esp8266/common-hal/busio/SPI.c:72 -msgid "Pins not valid for SPI" +#: shared-module/bitbangio/SPI.c +msgid "Cannot write without MOSI pin." msgstr "" -#: ports/esp8266/common-hal/busio/UART.c:45 -msgid "Only tx supported on UART1 (GPIO2)." +#: shared-bindings/bleio/Service.c +msgid "Characteristic UUID doesn't match Service UUID" msgstr "" -#: ports/esp8266/common-hal/busio/UART.c:67 ports/esp8266/machine_uart.c:108 -msgid "invalid data bits" +#: ports/nrf/common-hal/bleio/Service.c +msgid "Characteristic already in use by another Service." msgstr "" -#: ports/esp8266/common-hal/busio/UART.c:91 ports/esp8266/machine_uart.c:144 -msgid "invalid stop bits" +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "CharacteristicBuffer writing not provided" msgstr "" -#: ports/esp8266/common-hal/digitalio/DigitalInOut.c:200 -msgid "ESP8266 does not support pull down." +#: shared-module/bitbangio/SPI.c +msgid "Clock pin init failed." msgstr "" -#: ports/esp8266/common-hal/digitalio/DigitalInOut.c:210 -msgid "GPIO16 does not support pull up." +#: shared-module/bitbangio/I2C.c +msgid "Clock stretch too long" msgstr "" -#: ports/esp8266/common-hal/microcontroller/__init__.c:66 -msgid "ESP8226 does not support safe mode." +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Clock unit in use" msgstr "" -#: ports/esp8266/common-hal/pulseio/PWMOut.c:54 -#: ports/esp8266/common-hal/pulseio/PWMOut.c:113 -#, c-format -msgid "Maximum PWM frequency is %dhz." +#: shared-bindings/_pew/PewPew.c +msgid "Column entry must be digitalio.DigitalInOut" msgstr "" -#: ports/esp8266/common-hal/pulseio/PWMOut.c:57 -#: ports/esp8266/common-hal/pulseio/PWMOut.c:116 -msgid "Minimum PWM frequency is 1hz." +#: shared-bindings/displayio/FourWire.c shared-bindings/displayio/ParallelBus.c +msgid "Command must be an int between 0 and 255" msgstr "" -#: ports/esp8266/common-hal/pulseio/PWMOut.c:68 +#: ports/nrf/common-hal/bleio/UUID.c #, c-format -msgid "Multiple PWM frequencies not supported. PWM already set to %dhz." +msgid "Could not decode ble_uuid, err 0x%04x" msgstr "" -#: ports/esp8266/common-hal/pulseio/PWMOut.c:77 ports/esp8266/machine_pwm.c:70 -#, c-format -msgid "PWM not supported on pin %d" +#: ports/atmel-samd/common-hal/busio/UART.c +msgid "Could not initialize UART" msgstr "" -#: ports/esp8266/common-hal/pulseio/PulseIn.c:78 -msgid "No PulseIn support for %q" +#: shared-module/audioio/Mixer.c shared-module/audioio/WaveFile.c +msgid "Couldn't allocate first buffer" msgstr "" -#: ports/esp8266/common-hal/storage/__init__.c:34 -msgid "Unable to remount filesystem" +#: shared-module/audioio/Mixer.c shared-module/audioio/WaveFile.c +msgid "Couldn't allocate second buffer" msgstr "" -#: ports/esp8266/common-hal/storage/__init__.c:38 -msgid "Use esptool to erase flash and re-upload Python instead" +#: supervisor/shared/safe_mode.c +msgid "Crash into the HardFault_Handler.\n" msgstr "" -#: ports/esp8266/esp_mphal.c:154 -msgid "C-level assert" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "DAC already in use" msgstr "" -#: ports/esp8266/machine_adc.c:57 -#, c-format -msgid "not a valid ADC Channel: %d" +#: ports/atmel-samd/common-hal/displayio/ParallelBus.c +#: ports/nrf/common-hal/displayio/ParallelBus.c +msgid "Data 0 pin must be byte aligned" msgstr "" -#: ports/esp8266/machine_hspi.c:131 ports/esp8266/machine_hspi.c:137 -msgid "impossible baudrate" +#: shared-module/audioio/WaveFile.c +msgid "Data chunk must follow fmt chunk" msgstr "" -#: ports/esp8266/machine_pin.c:129 -msgid "expecting a pin" +#: ports/nrf/common-hal/bleio/Broadcaster.c +#: ports/nrf/common-hal/bleio/Peripheral.c +msgid "Data too large for advertisement packet" msgstr "" -#: ports/esp8266/machine_pin.c:284 -msgid "Pin(16) doesn't support pull" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Data too large for the advertisement packet" msgstr "" -#: ports/esp8266/machine_pin.c:323 -msgid "invalid pin" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Destination capacity is smaller than destination_length." msgstr "" -#: ports/esp8266/machine_pin.c:389 -msgid "pin does not have IRQ capabilities" +#: shared-bindings/displayio/Display.c +msgid "Display rotation must be in 90 degree increments" msgstr "" -#: ports/esp8266/machine_rtc.c:185 -msgid "buffer too long" +#: ports/unix/modffi.c +msgid "Don't know how to pass object to native function" msgstr "" -#: ports/esp8266/machine_rtc.c:209 ports/esp8266/machine_rtc.c:223 -#: ports/esp8266/machine_rtc.c:246 -msgid "invalid alarm" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Drive mode not used when direction is input." msgstr "" -#: ports/esp8266/machine_uart.c:169 -#, c-format -msgid "UART(%d) does not exist" +#: ports/esp8266/common-hal/microcontroller/__init__.c +msgid "ESP8226 does not support safe mode." msgstr "" -#: ports/esp8266/machine_uart.c:219 -msgid "UART(1) can't read" +#: ports/esp8266/common-hal/digitalio/DigitalInOut.c +msgid "ESP8266 does not support pull down." msgstr "" -#: ports/esp8266/modesp.c:119 -msgid "len must be multiple of 4" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +msgid "EXTINT channel already in use" msgstr "" -#: ports/esp8266/modesp.c:274 -#, c-format -msgid "memory allocation failed, allocating %u bytes for native code" +#: ports/unix/modffi.c +msgid "Error in ffi_prep_cif" msgstr "" -#: ports/esp8266/modesp.c:317 -msgid "flash location must be below 1MByte" +#: extmod/modure.c +msgid "Error in regex" msgstr "" -#: ports/esp8266/modmachine.c:63 -msgid "frequency can only be either 80Mhz or 160MHz" +#: shared-bindings/pulseio/PulseOut.c shared-bindings/neopixel_write/__init__.c +#: shared-bindings/terminalio/Terminal.c shared-bindings/microcontroller/Pin.c +msgid "Expected a %q" msgstr "" -#: ports/esp8266/modnetwork.c:61 -msgid "AP required" +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "Expected a Characteristic" msgstr "" -#: ports/esp8266/modnetwork.c:61 -msgid "STA required" +#: shared-bindings/bleio/Descriptor.c shared-bindings/bleio/Service.c +#: shared-bindings/bleio/Characteristic.c +msgid "Expected a UUID" msgstr "" -#: ports/esp8266/modnetwork.c:87 -msgid "Cannot update i/f status" +#: shared-module/_pixelbuf/PixelBuf.c +#, c-format +msgid "Expected tuple of length %d, got %d" msgstr "" -#: ports/esp8266/modnetwork.c:142 -msgid "Cannot set STA config" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to acquire mutex" msgstr "" -#: ports/esp8266/modnetwork.c:144 -msgid "Cannot connect to AP" +#: ports/nrf/common-hal/bleio/Characteristic.c ports/nrf/sd_mutex.c +#, c-format +msgid "Failed to acquire mutex, err 0x%04x" msgstr "" -#: ports/esp8266/modnetwork.c:152 -msgid "Cannot disconnect from AP" +#: ports/nrf/common-hal/bleio/Service.c +#, c-format +msgid "Failed to add characteristic, err 0x%04x" msgstr "" -#: ports/esp8266/modnetwork.c:173 -msgid "unknown status param" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to add service" msgstr "" -#: ports/esp8266/modnetwork.c:222 -msgid "STA must be active" +#: ports/nrf/common-hal/bleio/Peripheral.c +#, c-format +msgid "Failed to add service, err 0x%04x" msgstr "" -#: ports/esp8266/modnetwork.c:239 -msgid "scan failed" +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "Failed to allocate RX buffer" msgstr "" -#: ports/esp8266/modnetwork.c:306 -msgid "wifi_set_ip_info() failed" +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +#: ports/nrf/common-hal/pulseio/PulseIn.c +#: ports/esp8266/common-hal/pulseio/PulseIn.c +#, c-format +msgid "Failed to allocate RX buffer of %d bytes" msgstr "" -#: ports/esp8266/modnetwork.c:319 -msgid "either pos or kw args are allowed" +#: ports/nrf/common-hal/bleio/Adapter.c +msgid "Failed to change softdevice state" msgstr "" -#: ports/esp8266/modnetwork.c:329 -msgid "can't get STA config" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to connect:" msgstr "" -#: ports/esp8266/modnetwork.c:331 -msgid "can't get AP config" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to continue scanning" msgstr "" -#: ports/esp8266/modnetwork.c:346 -msgid "invalid buffer length" +#: ports/nrf/common-hal/bleio/Scanner.c +#, c-format +msgid "Failed to continue scanning, err 0x%04x" msgstr "" -#: ports/esp8266/modnetwork.c:405 -msgid "can't set STA config" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to create mutex" msgstr "" -#: ports/esp8266/modnetwork.c:407 -msgid "can't set AP config" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to discover services" msgstr "" -#: ports/esp8266/modnetwork.c:416 -msgid "can query only one param" +#: ports/nrf/common-hal/bleio/Adapter.c +msgid "Failed to get local address" msgstr "" -#: ports/esp8266/modnetwork.c:469 -msgid "unknown config param" +#: ports/nrf/common-hal/bleio/Adapter.c +msgid "Failed to get softdevice state" msgstr "" -#: ports/nrf/common-hal/analogio/AnalogOut.c:37 -msgid "AnalogOut functionality not supported" +#: ports/nrf/common-hal/bleio/Characteristic.c +#, c-format +msgid "Failed to notify or indicate attribute value, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Adapter.c:41 +#: ports/nrf/common-hal/bleio/Characteristic.c #, c-format -msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX" +msgid "Failed to read CCCD value, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Adapter.c:125 +#: ports/nrf/common-hal/bleio/Characteristic.c #, c-format -msgid "Failed to change softdevice state, error: 0x%08lX" +msgid "Failed to read attribute value, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Adapter.c:135 +#: ports/nrf/common-hal/bleio/Characteristic.c #, c-format -msgid "Failed to get softdevice state, error: 0x%08lX" +msgid "Failed to read gatts value, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Adapter.c:155 +#: ports/nrf/common-hal/bleio/UUID.c #, c-format -msgid "Failed to get local address, error: 0x%08lX" +msgid "Failed to register Vendor-Specific UUID, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:52 -#, c-format -msgid "Failed to write gatts value, status: 0x%08lX" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to release mutex" msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:76 +#: ports/nrf/common-hal/bleio/Characteristic.c ports/nrf/sd_mutex.c #, c-format -msgid "Failed to notify attribute value, status: 0x%08lX" +msgid "Failed to release mutex, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:91 -#, c-format -msgid "Failed to read attribute value, status: 0x%08lX" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to start advertising" msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:119 -#: ports/nrf/common-hal/bleio/Device.c:272 -#: ports/nrf/common-hal/bleio/Device.c:307 +#: ports/nrf/common-hal/bleio/Broadcaster.c +#: ports/nrf/common-hal/bleio/Peripheral.c #, c-format -msgid "Failed to acquire mutex, status: 0x%08lX" +msgid "Failed to start advertising, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:126 -#, c-format -msgid "Failed to write attribute value, status: 0x%08lX" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to start scanning" msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:138 -#: ports/nrf/common-hal/bleio/Device.c:284 -#: ports/nrf/common-hal/bleio/Device.c:319 -#: ports/nrf/common-hal/bleio/Device.c:354 -#: ports/nrf/common-hal/bleio/Device.c:391 +#: ports/nrf/common-hal/bleio/Scanner.c #, c-format -msgid "Failed to release mutex, status: 0x%08lX" +msgid "Failed to start scanning, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:81 -#: ports/nrf/common-hal/bleio/Device.c:114 -msgid "Can not fit data into the advertisment packet" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to stop advertising" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:266 +#: ports/nrf/common-hal/bleio/Broadcaster.c +#: ports/nrf/common-hal/bleio/Peripheral.c #, c-format -msgid "Failed to discover serivices, status: 0x%08lX" +msgid "Failed to stop advertising, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:403 -#: ports/nrf/common-hal/bleio/Scanner.c:76 +#: ports/nrf/common-hal/bleio/Characteristic.c #, c-format -msgid "Failed to continue scanning, status: 0x%0xlX" +msgid "Failed to write attribute value, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:436 +#: ports/nrf/common-hal/bleio/Characteristic.c #, c-format -msgid "Failed to connect, status: 0x%08lX" +msgid "Failed to write gatts value, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:513 -#, c-format -msgid "Failed to add service, status: 0x%08lX" +#: py/moduerrno.c +msgid "File exists" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:531 -#, c-format -msgid "Failed to start advertisment, status: 0x%08lX" +#: ports/nrf/supervisor/internal_flash.c +msgid "Flash erase failed" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:549 +#: ports/nrf/supervisor/internal_flash.c #, c-format -msgid "Failed to stop advertisment, status: 0x%08lX" +msgid "Flash erase failed to start, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:575 -#: ports/nrf/common-hal/bleio/Scanner.c:103 -#, c-format -msgid "Failed to start scanning, status: 0x%0xlX" +#: ports/nrf/supervisor/internal_flash.c +msgid "Flash write failed" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:592 +#: ports/nrf/supervisor/internal_flash.c #, c-format -msgid "Failed to create mutex, status: 0x%0xlX" +msgid "Flash write failed to start, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Service.c:83 -#, c-format -msgid "Failed to add characteristic, status: 0x%08lX" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +msgid "Frequency captured is above capability. Capture Paused." msgstr "" -#: ports/nrf/common-hal/bleio/UUID.c:97 -#, c-format -msgid "Failed to add Vendor Specific UUID, status: 0x%08lX" +#: shared-bindings/bitbangio/SPI.c shared-bindings/bitbangio/I2C.c +#: shared-bindings/busio/SPI.c shared-bindings/busio/I2C.c +msgid "Function requires lock" msgstr "" -#: ports/nrf/common-hal/bleio/UUID.c:102 -msgid "Invalid UUID string length" +#: ports/esp8266/common-hal/digitalio/DigitalInOut.c +msgid "GPIO16 does not support pull up." msgstr "" -#: ports/nrf/common-hal/bleio/UUID.c:109 -#: shared-bindings/bleio/Characteristic.c:125 -#: shared-bindings/bleio/Service.c:105 -msgid "Invalid UUID parameter" +#: shared-module/displayio/Group.c +msgid "Group full" msgstr "" -#: ports/nrf/common-hal/busio/I2C.c:96 -msgid "All I2C peripherals are in use" +#: ports/unix/file.c extmod/vfs_posix_file.c py/objstringio.c +msgid "I/O operation on closed file" msgstr "" -#: ports/nrf/common-hal/busio/SPI.c:133 -msgid "All SPI peripherals are in use" +#: extmod/machine_i2c.c +msgid "I2C operation not supported" msgstr "" -#: ports/nrf/common-hal/busio/UART.c:49 -#, c-format -msgid "error = 0x%08lX" +#: py/persistentcode.c +msgid "" +"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/" +"mpy-update for more info." +msgstr "" + +#: shared-bindings/_pew/PewPew.c +msgid "Incorrect buffer size" +msgstr "" + +#: py/moduerrno.c +msgid "Input/output error" +msgstr "" + +#: shared-module/displayio/OnDiskBitmap.c +msgid "Invalid BMP file" +msgstr "" + +#: ports/atmel-samd/common-hal/pulseio/PWMOut.c +#: ports/nrf/common-hal/pulseio/PWMOut.c shared-bindings/pulseio/PWMOut.c +msgid "Invalid PWM frequency" +msgstr "" + +#: py/moduerrno.c +msgid "Invalid argument" msgstr "" -#: ports/nrf/common-hal/busio/UART.c:110 +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Invalid bit clock pin" +msgstr "" + +#: ports/nrf/common-hal/busio/UART.c msgid "Invalid buffer size" msgstr "" -#: ports/nrf/common-hal/busio/UART.c:114 -msgid "Odd parity is not supported" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +msgid "Invalid capture period. Valid range: 1 - 500" msgstr "" -#: ports/nrf/common-hal/busio/UART.c:346 ports/nrf/common-hal/busio/UART.c:350 -#: ports/nrf/common-hal/busio/UART.c:355 ports/nrf/common-hal/busio/UART.c:360 -#: ports/nrf/common-hal/busio/UART.c:366 ports/nrf/common-hal/busio/UART.c:371 -#: ports/nrf/common-hal/busio/UART.c:376 ports/nrf/common-hal/busio/UART.c:380 -#: ports/nrf/common-hal/busio/UART.c:388 -msgid "busio.UART not available" +#: shared-bindings/audioio/Mixer.c +msgid "Invalid channel count" msgstr "" -#: ports/nrf/common-hal/microcontroller/Processor.c:49 -#, c-format -msgid "Can not get temperature. status: 0x%02x" +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Invalid clock pin" msgstr "" -#: ports/nrf/common-hal/pulseio/PWMOut.c:161 -msgid "All PWM peripherals are in use" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Invalid data pin" msgstr "" -#: ports/unix/modffi.c:138 -msgid "Unknown type" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Invalid direction." msgstr "" -#: ports/unix/modffi.c:207 ports/unix/modffi.c:265 -msgid "Error in ffi_prep_cif" +#: shared-module/audioio/WaveFile.c +msgid "Invalid file" msgstr "" -#: ports/unix/modffi.c:270 -msgid "ffi_prep_closure_loc" +#: shared-module/audioio/WaveFile.c +msgid "Invalid format chunk size" msgstr "" -#: ports/unix/modffi.c:413 -msgid "Don't know how to pass object to native function" +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "Invalid number of bits" msgstr "" -#: ports/unix/modusocket.c:474 -#, c-format -msgid "[addrinfo error %d]" +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "Invalid phase" msgstr "" -#: py/argcheck.c:44 -msgid "function does not take keyword arguments" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: ports/atmel-samd/common-hal/touchio/TouchIn.c +#: shared-bindings/pulseio/PWMOut.c +msgid "Invalid pin" msgstr "" -#: py/argcheck.c:54 py/bc.c:85 py/objnamedtuple.c:104 -#, c-format -msgid "function takes %d positional arguments but %d were given" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Invalid pin for left channel" msgstr "" -#: py/argcheck.c:64 -#, c-format -msgid "function missing %d required positional arguments" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Invalid pin for right channel" msgstr "" -#: py/argcheck.c:72 -#, c-format -msgid "function expected at most %d arguments, got %d" +#: ports/atmel-samd/common-hal/i2cslave/I2CSlave.c +#: ports/atmel-samd/common-hal/busio/UART.c +#: ports/atmel-samd/common-hal/busio/SPI.c +#: ports/atmel-samd/common-hal/busio/I2C.c ports/nrf/common-hal/busio/I2C.c +msgid "Invalid pins" msgstr "" -#: py/argcheck.c:97 -msgid "'%q' argument required" +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "Invalid polarity" msgstr "" -#: py/argcheck.c:122 -msgid "extra positional arguments given" +#: shared-bindings/microcontroller/__init__.c +msgid "Invalid run mode." msgstr "" -#: py/argcheck.c:130 -msgid "extra keyword arguments given" +#: shared-bindings/audioio/Mixer.c +msgid "Invalid voice count" msgstr "" -#: py/argcheck.c:142 -msgid "argument num/types mismatch" +#: shared-module/audioio/WaveFile.c +msgid "Invalid wave file" msgstr "" -#: py/argcheck.c:147 -msgid "keyword argument(s) not yet implemented - use normal args instead" +#: py/compile.c +msgid "LHS of keyword arg must be an id" msgstr "" -#: py/bc.c:88 py/objnamedtuple.c:108 -msgid "%q() takes %d positional arguments but %d were given" +#: shared-module/displayio/Group.c +msgid "Layer must be a Group or TileGrid subclass." msgstr "" -#: py/bc.c:197 py/bc.c:215 -msgid "unexpected keyword argument" +#: py/objslice.c +msgid "Length must be an int" msgstr "" -#: py/bc.c:199 -msgid "keywords must be strings" +#: py/objslice.c +msgid "Length must be non-negative" msgstr "" -#: py/bc.c:206 py/objnamedtuple.c:138 -msgid "function got multiple values for argument '%q'" +#: supervisor/shared/safe_mode.c +msgid "" +"Looks like our core CircuitPython code crashed hard. Whoops!\n" +"Please file an issue at https://github.com/adafruit/circuitpython/issues\n" +" with the contents of your CIRCUITPY drive and this message:\n" msgstr "" -#: py/bc.c:218 py/objnamedtuple.c:130 -msgid "unexpected keyword argument '%q'" +#: shared-module/bitbangio/SPI.c +msgid "MISO pin init failed." +msgstr "" + +#: shared-module/bitbangio/SPI.c +msgid "MOSI pin init failed." msgstr "" -#: py/bc.c:244 +#: ports/esp8266/common-hal/pulseio/PWMOut.c #, c-format -msgid "function missing required positional argument #%d" +msgid "Maximum PWM frequency is %dhz." msgstr "" -#: py/bc.c:260 -msgid "function missing required keyword argument '%q'" +#: shared-module/displayio/Shape.c +#, c-format +msgid "Maximum x value when mirrored is %d" msgstr "" -#: py/bc.c:269 -msgid "function missing keyword-only argument" +#: supervisor/shared/safe_mode.c +msgid "MicroPython NLR jump failed. Likely memory corruption.\n" msgstr "" -#: py/binary.c:112 -msgid "bad typecode" +#: supervisor/shared/safe_mode.c +msgid "MicroPython fatal error.\n" msgstr "" -#: py/builtinevex.c:99 -msgid "bad compile mode" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Microphone startup delay must be in range 0.0 to 1.0" msgstr "" -#: py/builtinhelp.c:137 -msgid "Plus any modules on the filesystem\n" +#: ports/esp8266/common-hal/pulseio/PWMOut.c +msgid "Minimum PWM frequency is 1hz." msgstr "" -#: py/builtinhelp.c:183 +#: ports/esp8266/common-hal/pulseio/PWMOut.c #, c-format -msgid "" -"Welcome to Adafruit CircuitPython %s!\n" -"\n" -"Please visit learn.adafruit.com/category/circuitpython for project guides.\n" -"\n" -"To list built-in modules please do `help(\"modules\")`.\n" +msgid "Multiple PWM frequencies not supported. PWM already set to %dhz." msgstr "" -#: py/builtinimport.c:336 -msgid "cannot perform relative import" +#: shared-bindings/displayio/Display.c +msgid "Must be a Group subclass." msgstr "" -#: py/builtinimport.c:420 py/builtinimport.c:532 -msgid "module not found" +#: ports/atmel-samd/common-hal/analogio/AnalogOut.c +msgid "No DAC on chip" msgstr "" -#: py/builtinimport.c:423 py/builtinimport.c:535 -msgid "no module named '%q'" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "No DMA channel found" msgstr "" -#: py/builtinimport.c:510 -msgid "relative import" +#: ports/esp8266/common-hal/pulseio/PulseIn.c +msgid "No PulseIn support for %q" msgstr "" -#: py/compile.c:397 py/compile.c:542 -msgid "can't assign to expression" +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "No RX pin" msgstr "" -#: py/compile.c:416 -msgid "multiple *x in assignment" +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "No TX pin" msgstr "" -#: py/compile.c:642 -msgid "non-default argument follows default argument" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +msgid "No available clocks" msgstr "" -#: py/compile.c:771 py/compile.c:789 -msgid "invalid micropython decorator" +#: supervisor/shared/board_busses.c +msgid "No default I2C bus" msgstr "" -#: py/compile.c:943 -msgid "can't delete expression" +#: supervisor/shared/board_busses.c +msgid "No default SPI bus" msgstr "" -#: py/compile.c:955 -msgid "'break' outside loop" +#: supervisor/shared/board_busses.c +msgid "No default UART bus" msgstr "" -#: py/compile.c:958 -msgid "'continue' outside loop" +#: ports/atmel-samd/common-hal/touchio/TouchIn.c +msgid "No free GCLKs" msgstr "" -#: py/compile.c:969 -msgid "'return' outside function" +#: shared-bindings/os/__init__.c +msgid "No hardware random available" msgstr "" -#: py/compile.c:1169 -msgid "identifier redefined as global" +#: ports/esp8266/common-hal/analogio/AnalogOut.c +msgid "No hardware support for analog out." msgstr "" -#: py/compile.c:1185 -msgid "no binding for nonlocal found" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +msgid "No hardware support on pin" msgstr "" -#: py/compile.c:1188 -msgid "identifier redefined as nonlocal" +#: py/moduerrno.c +msgid "No space left on device" msgstr "" -#: py/compile.c:1197 -msgid "can't declare nonlocal in outer code" +#: py/moduerrno.c +msgid "No such file/directory" msgstr "" -#: py/compile.c:1542 -msgid "default 'except' must be last" +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "Not connected" msgstr "" -#: py/compile.c:2095 -msgid "*x must be assignment target" +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "Not connected." msgstr "" -#: py/compile.c:2193 -msgid "super() can't find self" +#: shared-bindings/audiobusio/I2SOut.c shared-bindings/audioio/AudioOut.c +msgid "Not playing" msgstr "" -#: py/compile.c:2256 -msgid "can't have multiple *x" +#: shared-bindings/util.c +msgid "" +"Object has been deinitialized and can no longer be used. Create a new object." msgstr "" -#: py/compile.c:2263 -msgid "can't have multiple **x" +#: ports/nrf/common-hal/busio/UART.c +msgid "Odd parity is not supported" msgstr "" -#: py/compile.c:2271 -msgid "LHS of keyword arg must be an id" +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Only 8 or 16 bit mono with " msgstr "" -#: py/compile.c:2287 -msgid "non-keyword arg after */**" +#: shared-module/displayio/OnDiskBitmap.c +#, c-format +msgid "" +"Only Windows format, uncompressed BMP supported: given header size is %d" msgstr "" -#: py/compile.c:2291 -msgid "non-keyword arg after keyword arg" +#: shared-module/displayio/Bitmap.c +msgid "Only bit maps of 8 bit color or less are supported" msgstr "" -#: py/compile.c:2463 py/compile.c:2473 py/compile.c:2712 py/compile.c:2742 -#: py/parse.c:1176 -msgid "invalid syntax" +#: shared-module/displayio/OnDiskBitmap.c +#, c-format +msgid "" +"Only monochrome, indexed 8bpp, and 16bpp or greater BMPs supported: %d bpp " +"given" msgstr "" -#: py/compile.c:2465 -msgid "expecting key:value for dict" +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "Only slices with step=1 (aka None) are supported" msgstr "" -#: py/compile.c:2475 -msgid "expecting just a value for set" +#: ports/esp8266/common-hal/busio/UART.c +msgid "Only tx supported on UART1 (GPIO2)." msgstr "" -#: py/compile.c:2600 -msgid "'yield' outside function" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Oversample must be multiple of 8." msgstr "" -#: py/compile.c:2619 -msgid "'await' outside function" +#: shared-bindings/pulseio/PWMOut.c +msgid "" +"PWM duty_cycle must be between 0 and 65535 inclusive (16 bit resolution)" msgstr "" -#: py/compile.c:2774 -msgid "name reused for argument" +#: shared-bindings/pulseio/PWMOut.c +msgid "" +"PWM frequency not writable when variable_frequency is False on construction." msgstr "" -#: py/compile.c:2827 -msgid "parameter annotation must be an identifier" +#: ports/esp8266/common-hal/pulseio/PWMOut.c ports/esp8266/machine_pwm.c +#, c-format +msgid "PWM not supported on pin %d" msgstr "" -#: py/compile.c:2969 py/compile.c:3137 -msgid "return annotation must be an identifier" +#: py/moduerrno.c +msgid "Permission denied" msgstr "" -#: py/compile.c:3097 -msgid "inline assembler must be a function" +#: ports/esp8266/common-hal/analogio/AnalogIn.c +msgid "Pin %q does not have ADC capabilities" msgstr "" -#: py/compile.c:3134 -msgid "unknown type" +#: ports/atmel-samd/common-hal/analogio/AnalogIn.c +#: ports/nrf/common-hal/analogio/AnalogIn.c +msgid "Pin does not have ADC capabilities" msgstr "" -#: py/compile.c:3154 -msgid "expecting an assembler instruction" +#: ports/esp8266/machine_pin.c +msgid "Pin(16) doesn't support pull" msgstr "" -#: py/compile.c:3184 -msgid "'label' requires 1 argument" +#: ports/esp8266/common-hal/busio/SPI.c +msgid "Pins not valid for SPI" msgstr "" -#: py/compile.c:3190 -msgid "label redefined" +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "Pixel beyond bounds of buffer" msgstr "" -#: py/compile.c:3196 -msgid "'align' requires 1 argument" +#: py/builtinhelp.c +msgid "Plus any modules on the filesystem\n" msgstr "" -#: py/compile.c:3205 -msgid "'data' requires at least 2 arguments" +#: main.c +msgid "Press any key to enter the REPL. Use CTRL-D to reload." msgstr "" -#: py/compile.c:3212 -msgid "'data' requires integer arguments" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Pull not used when direction is output." msgstr "" -#: py/emitinlinethumb.c:102 -msgid "can only have up to 4 parameters to Thumb assembly" +#: shared-bindings/rtc/RTC.c +msgid "RTC calibration is not supported on this board" msgstr "" -#: py/emitinlinethumb.c:107 py/emitinlinethumb.c:112 -msgid "parameters must be registers in sequence r0 to r3" +#: shared-bindings/rtc/RTC.c shared-bindings/time/__init__.c +msgid "RTC is not supported on this board" msgstr "" -#: py/emitinlinethumb.c:188 py/emitinlinethumb.c:230 -#, c-format -msgid "'%s' expects at most r%d" +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "Range out of bounds" msgstr "" -#: py/emitinlinethumb.c:197 py/emitinlinextensa.c:162 -#, c-format -msgid "'%s' expects a register" +#: shared-bindings/pulseio/PulseIn.c +msgid "Read-only" msgstr "" -#: py/emitinlinethumb.c:211 -#, c-format -msgid "'%s' expects a special register" +#: extmod/vfs_fat.c py/moduerrno.c +msgid "Read-only filesystem" msgstr "" -#: py/emitinlinethumb.c:239 -#, c-format -msgid "'%s' expects an FPU register" +#: shared-module/displayio/Bitmap.c +msgid "Read-only object" msgstr "" -#: py/emitinlinethumb.c:292 -#, c-format -msgid "'%s' expects {r0, r1, ...}" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Right channel unsupported" msgstr "" -#: py/emitinlinethumb.c:299 py/emitinlinextensa.c:169 -#, c-format -msgid "'%s' expects an integer" +#: shared-bindings/_pew/PewPew.c +msgid "Row entry must be digitalio.DigitalInOut" msgstr "" -#: py/emitinlinethumb.c:304 -#, c-format -msgid "'%s' integer 0x%x does not fit in mask 0x%x" +#: main.c +msgid "Running in safe mode! Auto-reload is off.\n" msgstr "" -#: py/emitinlinethumb.c:328 -#, c-format -msgid "'%s' expects an address of the form [a, b]" +#: main.c +msgid "Running in safe mode! Not running saved code.\n" msgstr "" -#: py/emitinlinethumb.c:334 py/emitinlinextensa.c:182 -#, c-format -msgid "'%s' expects a label" +#: ports/atmel-samd/common-hal/busio/I2C.c +msgid "SDA or SCL needs a pull up" msgstr "" -#: py/emitinlinethumb.c:345 py/emitinlinextensa.c:193 -msgid "label '%q' not defined" +#: ports/esp8266/modnetwork.c +msgid "STA must be active" msgstr "" -#: py/emitinlinethumb.c:806 +#: ports/esp8266/modnetwork.c +msgid "STA required" +msgstr "" + +#: shared-bindings/audioio/Mixer.c +msgid "Sample rate must be positive" +msgstr "" + +#: ports/atmel-samd/common-hal/audioio/AudioOut.c #, c-format -msgid "unsupported Thumb instruction '%s' with %d arguments" +msgid "Sample rate too high. It must be less than %d" msgstr "" -#: py/emitinlinethumb.c:810 -msgid "branch not in range" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Serializer in use" msgstr "" -#: py/emitinlinextensa.c:86 -msgid "can only have up to 4 parameters to Xtensa assembly" +#: shared-bindings/nvm/ByteArray.c +msgid "Slice and value different lengths." msgstr "" -#: py/emitinlinextensa.c:91 py/emitinlinextensa.c:96 -msgid "parameters must be registers in sequence a2 to a5" +#: shared-bindings/displayio/Bitmap.c shared-bindings/displayio/TileGrid.c +#: shared-bindings/displayio/Group.c shared-bindings/pulseio/PulseIn.c +msgid "Slices not supported" msgstr "" -#: py/emitinlinextensa.c:174 +#: ports/nrf/common-hal/bleio/Adapter.c #, c-format -msgid "'%s' integer %d is not within range %d..%d" +msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX" msgstr "" -#: py/emitinlinextensa.c:327 -#, c-format -msgid "unsupported Xtensa instruction '%s' with %d arguments" +#: extmod/modure.c +msgid "Splitting with sub-captures" msgstr "" -#: py/emitnative.c:183 -msgid "unknown type '%q'" +#: shared-bindings/supervisor/__init__.c +msgid "Stack size must be at least 256" msgstr "" -#: py/emitnative.c:260 -msgid "Viper functions don't currently support more than 4 arguments" +#: shared-bindings/multiterminal/__init__.c +msgid "Stream missing readinto() or write() method." msgstr "" -#: py/emitnative.c:742 -msgid "conversion to object" +#: supervisor/shared/safe_mode.c +msgid "" +"The CircuitPython heap was corrupted because the stack was too small.\n" +"Please increase stack size limits and press reset (after ejecting " +"CIRCUITPY).\n" +"If you didn't change the stack, then file an issue here with the contents of " +"your CIRCUITPY drive:\n" msgstr "" -#: py/emitnative.c:921 -msgid "local '%q' used before type known" +#: supervisor/shared/safe_mode.c +msgid "" +"The microcontroller's power dipped. Please make sure your power supply " +"provides\n" +"enough power for the whole circuit and press reset (after ejecting " +"CIRCUITPY).\n" msgstr "" -#: py/emitnative.c:1118 py/emitnative.c:1156 -msgid "can't load from '%q'" +#: supervisor/shared/safe_mode.c +msgid "" +"The reset button was pressed while booting CircuitPython. Press again to " +"exit safe mode.\n" msgstr "" -#: py/emitnative.c:1128 -msgid "can't load with '%q' index" +#: shared-module/audioio/Mixer.c +msgid "The sample's bits_per_sample does not match the mixer's" msgstr "" -#: py/emitnative.c:1188 -msgid "local '%q' has type '%q' but source is '%q'" +#: shared-module/audioio/Mixer.c +msgid "The sample's channel count does not match the mixer's" msgstr "" -#: py/emitnative.c:1289 py/emitnative.c:1379 -msgid "can't store '%q'" +#: shared-module/audioio/Mixer.c +msgid "The sample's sample rate does not match the mixer's" msgstr "" -#: py/emitnative.c:1358 py/emitnative.c:1419 -msgid "can't store to '%q'" +#: shared-module/audioio/Mixer.c +msgid "The sample's signedness does not match the mixer's" msgstr "" -#: py/emitnative.c:1369 -msgid "can't store with '%q' index" +#: shared-bindings/displayio/TileGrid.c +msgid "Tile height must exactly divide bitmap height" msgstr "" -#: py/emitnative.c:1540 -msgid "can't implicitly convert '%q' to 'bool'" +#: shared-bindings/displayio/TileGrid.c +msgid "Tile indices must be 0 - 255" msgstr "" -#: py/emitnative.c:1774 -msgid "unary op %q not implemented" +#: shared-bindings/displayio/TileGrid.c +msgid "Tile width must exactly divide bitmap width" msgstr "" -#: py/emitnative.c:1930 -msgid "binary op %q not implemented" +#: supervisor/shared/safe_mode.c +msgid "To exit, please reset the board without " msgstr "" -#: py/emitnative.c:1951 -msgid "can't do binary op between '%q' and '%q'" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Too many channels in sample." msgstr "" -#: py/emitnative.c:2126 -msgid "casting" +#: shared-bindings/displayio/FourWire.c shared-bindings/displayio/ParallelBus.c +msgid "Too many display busses" msgstr "" -#: py/emitnative.c:2173 -msgid "return expected '%q' but got '%q'" +#: shared-bindings/displayio/Display.c +msgid "Too many displays" msgstr "" -#: py/emitnative.c:2191 -msgid "must raise an object" +#: py/obj.c +msgid "Traceback (most recent call last):\n" msgstr "" -#: py/emitnative.c:2201 -msgid "native yield" +#: shared-bindings/time/__init__.c +msgid "Tuple or struct_time argument required" msgstr "" -#: py/lexer.c:345 -msgid "unicode name escapes" +#: ports/esp8266/machine_uart.c +#, c-format +msgid "UART(%d) does not exist" msgstr "" -#: py/modbuiltins.c:162 -msgid "chr() arg not in range(0x110000)" +#: ports/esp8266/machine_uart.c +msgid "UART(1) can't read" msgstr "" -#: py/modbuiltins.c:171 -msgid "chr() arg not in range(256)" +#: shared-module/usb_hid/Device.c +msgid "USB Busy" msgstr "" -#: py/modbuiltins.c:285 -msgid "arg is an empty sequence" +#: shared-module/usb_hid/Device.c +msgid "USB Error" msgstr "" -#: py/modbuiltins.c:350 -msgid "ord expects a character" +#: shared-bindings/bleio/UUID.c +msgid "UUID integer value not in range 0 to 0xffff" msgstr "" -#: py/modbuiltins.c:353 -#, c-format -msgid "ord() expected a character, but string of length %d found" +#: shared-bindings/bleio/UUID.c +msgid "UUID string not 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'" msgstr "" -#: py/modbuiltins.c:363 -msgid "3-arg pow() not supported" +#: shared-bindings/bleio/UUID.c +msgid "UUID value is not str, int or byte buffer" msgstr "" -#: py/modbuiltins.c:517 -msgid "must use keyword argument for key function" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Unable to allocate buffers for signed conversion" msgstr "" -#: py/modmath.c:41 shared-bindings/math/__init__.c:53 -msgid "math domain error" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Unable to find free GCLK" msgstr "" -#: py/modmath.c:196 py/objfloat.c:270 py/objint_longlong.c:222 -#: py/objint_mpz.c:230 py/runtime.c:619 shared-bindings/math/__init__.c:346 -msgid "division by zero" +#: py/parse.c +msgid "Unable to init parser" msgstr "" -#: py/modmicropython.c:155 -msgid "schedule stack full" +#: shared-module/displayio/OnDiskBitmap.c +msgid "Unable to read color palette data" msgstr "" -#: py/modstruct.c:145 py/modstruct.c:153 py/modstruct.c:234 py/modstruct.c:244 -#: shared-bindings/struct/__init__.c:103 shared-bindings/struct/__init__.c:145 -#: shared-module/struct/__init__.c:91 shared-module/struct/__init__.c:175 -msgid "buffer too small" +#: ports/esp8266/common-hal/storage/__init__.c +msgid "Unable to remount filesystem" msgstr "" -#: py/modthread.c:240 -msgid "expecting a dict for keyword args" +#: shared-bindings/nvm/ByteArray.c +msgid "Unable to write to nvm." msgstr "" -#: py/moduerrno.c:147 py/moduerrno.c:150 -msgid "Permission denied" +#: ports/nrf/common-hal/bleio/UUID.c +msgid "Unexpected nrfx uuid type" msgstr "" -#: py/moduerrno.c:148 -msgid "No such file/directory" +#: ports/unix/modffi.c +msgid "Unknown type" msgstr "" -#: py/moduerrno.c:149 -msgid "Input/output error" +#: shared-bindings/_pixelbuf/PixelBuf.c +#, c-format +msgid "Unmatched number of items on RHS (expected %d, got %d)." msgstr "" -#: py/moduerrno.c:151 -msgid "File exists" +#: ports/atmel-samd/common-hal/busio/I2C.c +msgid "Unsupported baudrate" msgstr "" -#: py/moduerrno.c:152 -msgid "Unsupported operation" +#: shared-module/displayio/Display.c +msgid "Unsupported display bus type" msgstr "" -#: py/moduerrno.c:153 -msgid "Invalid argument" +#: shared-module/audioio/WaveFile.c +msgid "Unsupported format" msgstr "" -#: py/obj.c:92 -msgid "Traceback (most recent call last):\n" +#: py/moduerrno.c +msgid "Unsupported operation" msgstr "" -#: py/obj.c:96 -msgid " File \"%q\", line %d" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Unsupported pull value." msgstr "" -#: py/obj.c:98 -msgid " File \"%q\"" +#: ports/esp8266/common-hal/storage/__init__.c +msgid "Use esptool to erase flash and re-upload Python instead" msgstr "" -#: py/obj.c:102 -msgid ", in %q\n" +#: py/emitnative.c +msgid "Viper functions don't currently support more than 4 arguments" msgstr "" -#: py/obj.c:259 -msgid "can't convert to int" +#: shared-module/audioio/Mixer.c +msgid "Voice index too high" msgstr "" -#: py/obj.c:262 +#: main.c +msgid "WARNING: Your code filename has two extensions\n" +msgstr "" + +#: py/builtinhelp.c #, c-format -msgid "can't convert %s to int" +msgid "" +"Welcome to Adafruit CircuitPython %s!\n" +"\n" +"Please visit learn.adafruit.com/category/circuitpython for project guides.\n" +"\n" +"To list built-in modules please do `help(\"modules\")`.\n" msgstr "" -#: py/obj.c:322 -msgid "can't convert to float" +#: supervisor/shared/safe_mode.c +msgid "" +"You are running in safe mode which means something unanticipated happened.\n" +msgstr "" + +#: supervisor/shared/safe_mode.c +msgid "You requested starting safe mode by " msgstr "" -#: py/obj.c:325 +#: ports/unix/modusocket.c #, c-format -msgid "can't convert %s to float" +msgid "[addrinfo error %d]" msgstr "" -#: py/obj.c:355 -msgid "can't convert to complex" +#: py/objtype.c +msgid "__init__() should return None" msgstr "" -#: py/obj.c:358 +#: py/objtype.c #, c-format -msgid "can't convert %s to complex" +msgid "__init__() should return None, not '%s'" msgstr "" -#: py/obj.c:373 -msgid "expected tuple/list" +#: py/objobject.c +msgid "__new__ arg must be a user-type" msgstr "" -#: py/obj.c:376 -#, c-format -msgid "object '%s' is not a tuple or list" +#: extmod/modubinascii.c extmod/moduhashlib.c +msgid "a bytes-like object is required" msgstr "" -#: py/obj.c:387 -msgid "tuple/list has wrong length" +#: lib/embed/abort_.c +msgid "abort() called" msgstr "" -#: py/obj.c:389 +#: ports/unix/modmachine.c extmod/machine_mem.c #, c-format -msgid "requested length %d but object has length %d" +msgid "address %08x is not aligned to %d bytes" msgstr "" -#: py/obj.c:402 -msgid "indices must be integers" +#: shared-bindings/i2cslave/I2CSlave.c +msgid "address out of bounds" msgstr "" -#: py/obj.c:405 -msgid "%q indices must be integers, not %s" +#: shared-bindings/i2cslave/I2CSlave.c +msgid "addresses is empty" msgstr "" -#: py/obj.c:425 -msgid "%q index out of range" +#: py/modbuiltins.c +msgid "arg is an empty sequence" msgstr "" -#: py/obj.c:457 -msgid "object has no len" +#: py/runtime.c +msgid "argument has wrong type" +msgstr "" + +#: py/argcheck.c +msgid "argument num/types mismatch" +msgstr "" + +#: py/runtime.c +msgid "argument should be a '%q' not a '%q'" +msgstr "" + +#: shared-bindings/nvm/ByteArray.c py/objarray.c +msgid "array/bytes required on right side" +msgstr "" + +#: py/objstr.c +msgid "attributes not supported yet" +msgstr "" + +#: ports/nrf/common-hal/bleio/Characteristic.c +msgid "bad GATT role" msgstr "" -#: py/obj.c:460 +#: py/builtinevex.c +msgid "bad compile mode" +msgstr "" + +#: py/objstr.c +msgid "bad conversion specifier" +msgstr "" + +#: py/objstr.c +msgid "bad format string" +msgstr "" + +#: py/binary.c +msgid "bad typecode" +msgstr "" + +#: py/emitnative.c +msgid "binary op %q not implemented" +msgstr "" + +#: shared-bindings/busio/UART.c +msgid "bits must be 7, 8 or 9" +msgstr "" + +#: extmod/machine_spi.c +msgid "bits must be 8" +msgstr "" + +#: shared-bindings/audioio/Mixer.c +msgid "bits_per_sample must be 8 or 16" +msgstr "" + +#: py/emitinlinethumb.c +msgid "branch not in range" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c #, c-format -msgid "object of type '%s' has no len()" +msgid "buf is too small. need %d bytes" msgstr "" -#: py/obj.c:500 -msgid "object does not support item deletion" +#: shared-bindings/audioio/RawSample.c +msgid "buffer must be a bytes-like object" +msgstr "" + +#: shared-module/struct/__init__.c +msgid "buffer size must match format" +msgstr "" + +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "buffer slices must be of equal length" +msgstr "" + +#: ports/esp8266/machine_rtc.c +msgid "buffer too long" +msgstr "" + +#: shared-bindings/struct/__init__.c shared-module/struct/__init__.c +#: py/modstruct.c +msgid "buffer too small" +msgstr "" + +#: extmod/machine_spi.c +msgid "buffers must be the same length" msgstr "" -#: py/obj.c:503 +#: shared-bindings/_pew/PewPew.c +msgid "buttons must be digitalio.DigitalInOut" +msgstr "" + +#: py/vm.c +msgid "byte code not implemented" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c #, c-format -msgid "'%s' object does not support item deletion" +msgid "byteorder is not an instance of ByteOrder (got a %s)" msgstr "" -#: py/obj.c:507 -msgid "object is not subscriptable" +#: ports/atmel-samd/common-hal/busio/UART.c +msgid "bytes > 8 bits not supported" +msgstr "" + +#: py/objstr.c +msgid "bytes value out of range" +msgstr "" + +#: ports/atmel-samd/bindings/samd/Clock.c +msgid "calibration is out of range" +msgstr "" + +#: ports/atmel-samd/bindings/samd/Clock.c +msgid "calibration is read only" msgstr "" -#: py/obj.c:510 +#: ports/atmel-samd/common-hal/rtc/RTC.c +msgid "calibration value out of range +/-127" +msgstr "" + +#: py/emitinlinethumb.c +msgid "can only have up to 4 parameters to Thumb assembly" +msgstr "" + +#: py/emitinlinextensa.c +msgid "can only have up to 4 parameters to Xtensa assembly" +msgstr "" + +#: py/persistentcode.c +msgid "can only save bytecode" +msgstr "" + +#: ports/esp8266/modnetwork.c +msgid "can query only one param" +msgstr "" + +#: py/objtype.c +msgid "can't add special method to already-subclassed class" +msgstr "" + +#: py/compile.c +msgid "can't assign to expression" +msgstr "" + +#: py/obj.c #, c-format -msgid "'%s' object is not subscriptable" +msgid "can't convert %s to complex" msgstr "" -#: py/obj.c:514 -msgid "object does not support item assignment" +#: py/obj.c +#, c-format +msgid "can't convert %s to float" msgstr "" -#: py/obj.c:517 +#: py/obj.c #, c-format -msgid "'%s' object does not support item assignment" +msgid "can't convert %s to int" msgstr "" -#: py/obj.c:548 -msgid "object with buffer protocol required" +#: py/objstr.c +msgid "can't convert '%q' object to %q implicitly" msgstr "" -#: py/objarray.c:413 py/objstr.c:427 py/objstrunicode.c:191 py/objtuple.c:187 -#: shared-bindings/nvm/ByteArray.c:85 -msgid "only slices with step=1 (aka None) are supported" +#: py/objint.c +msgid "can't convert NaN to int" msgstr "" -#: py/objarray.c:426 -msgid "lhs and rhs should be compatible" +#: shared-bindings/i2cslave/I2CSlave.c +msgid "can't convert address to int" msgstr "" -#: py/objarray.c:444 shared-bindings/nvm/ByteArray.c:107 -msgid "array/bytes required on right side" +#: py/objint.c +msgid "can't convert inf to int" +msgstr "" + +#: py/obj.c +msgid "can't convert to complex" +msgstr "" + +#: py/obj.c +msgid "can't convert to float" +msgstr "" + +#: py/obj.c +msgid "can't convert to int" +msgstr "" + +#: py/objstr.c +msgid "can't convert to str implicitly" +msgstr "" + +#: py/compile.c +msgid "can't declare nonlocal in outer code" +msgstr "" + +#: py/compile.c +msgid "can't delete expression" msgstr "" -#: py/objcomplex.c:203 +#: py/emitnative.c +msgid "can't do binary op between '%q' and '%q'" +msgstr "" + +#: py/objcomplex.c msgid "can't do truncated division of a complex number" msgstr "" -#: py/objcomplex.c:209 -msgid "complex division by zero" +#: ports/esp8266/modnetwork.c +msgid "can't get AP config" msgstr "" -#: py/objcomplex.c:237 -msgid "0.0 to a complex power" +#: ports/esp8266/modnetwork.c +msgid "can't get STA config" msgstr "" -#: py/objdeque.c:107 -msgid "full" +#: py/compile.c +msgid "can't have multiple **x" msgstr "" -#: py/objdeque.c:127 -msgid "empty" +#: py/compile.c +msgid "can't have multiple *x" msgstr "" -#: py/objdict.c:314 -msgid "popitem(): dictionary is empty" +#: py/emitnative.c +msgid "can't implicitly convert '%q' to 'bool'" msgstr "" -#: py/objdict.c:357 -msgid "dict update sequence has wrong length" +#: py/emitnative.c +msgid "can't load from '%q'" msgstr "" -#: py/objfloat.c:308 py/parsenum.c:331 -msgid "complex values not supported" +#: py/emitnative.c +msgid "can't load with '%q' index" msgstr "" -#: py/objgenerator.c:108 +#: py/objgenerator.c +msgid "can't pend throw to just-started generator" +msgstr "" + +#: py/objgenerator.c msgid "can't send non-None value to a just-started generator" msgstr "" -#: py/objgenerator.c:126 -msgid "generator already executing" +#: ports/esp8266/modnetwork.c +msgid "can't set AP config" msgstr "" -#: py/objgenerator.c:229 -msgid "generator ignored GeneratorExit" +#: ports/esp8266/modnetwork.c +msgid "can't set STA config" msgstr "" -#: py/objgenerator.c:251 -msgid "can't pend throw to just-started generator" +#: py/objnamedtuple.c +msgid "can't set attribute" msgstr "" -#: py/objint.c:144 -msgid "can't convert inf to int" +#: py/emitnative.c +msgid "can't store '%q'" msgstr "" -#: py/objint.c:146 -msgid "can't convert NaN to int" +#: py/emitnative.c +msgid "can't store to '%q'" msgstr "" -#: py/objint.c:163 -msgid "float too big" +#: py/emitnative.c +msgid "can't store with '%q' index" msgstr "" -#: py/objint.c:328 -msgid "long int not supported in this build" +#: py/objstr.c +msgid "" +"can't switch from automatic field numbering to manual field specification" msgstr "" -#: py/objint.c:334 py/objint.c:340 py/objint.c:350 py/objint.c:358 -msgid "small int overflow" +#: py/objstr.c +msgid "" +"can't switch from manual field specification to automatic field numbering" msgstr "" -#: py/objint_longlong.c:189 py/objint_mpz.c:283 py/runtime.c:486 -msgid "negative power with no float support" +#: py/objtype.c +msgid "cannot create '%q' instances" msgstr "" -#: py/objint_longlong.c:251 -msgid "ulonglong too large" +#: py/objtype.c +msgid "cannot create instance" msgstr "" -#: py/objint_mpz.c:267 py/runtime.c:396 py/runtime.c:411 -msgid "negative shift count" +#: py/runtime.c +msgid "cannot import name %q" msgstr "" -#: py/objint_mpz.c:336 -msgid "pow() with 3 arguments requires integers" +#: py/builtinimport.c +msgid "cannot perform relative import" msgstr "" -#: py/objint_mpz.c:347 -msgid "pow() 3rd argument cannot be 0" +#: py/emitnative.c +msgid "casting" msgstr "" -#: py/objint_mpz.c:415 -msgid "overflow converting long int to machine word" +#: shared-bindings/bleio/Service.c +msgid "characteristics includes an object that is not a Characteristic" msgstr "" -#: py/objlist.c:273 -msgid "pop from empty list" +#: shared-bindings/_stage/Text.c +msgid "chars buffer too small" msgstr "" -#: py/objnamedtuple.c:92 -msgid "can't set attribute" +#: py/modbuiltins.c +msgid "chr() arg not in range(0x110000)" msgstr "" -#: py/objobject.c:55 -msgid "__new__ arg must be a user-type" +#: py/modbuiltins.c +msgid "chr() arg not in range(256)" msgstr "" -#: py/objrange.c:110 -msgid "zero step" +#: shared-bindings/displayio/Palette.c +msgid "color buffer must be 3 bytes (RGB) or 4 bytes (RGB + pad byte)" msgstr "" -#: py/objset.c:371 -msgid "pop from an empty set" +#: shared-bindings/displayio/Palette.c +msgid "color buffer must be a buffer or int" msgstr "" -#: py/objslice.c:66 -msgid "Length must be an int" +#: shared-bindings/displayio/Palette.c +msgid "color buffer must be a bytearray or array of type 'b' or 'B'" msgstr "" -#: py/objslice.c:71 -msgid "Length must be non-negative" +#: shared-bindings/displayio/Palette.c +msgid "color must be between 0x000000 and 0xffffff" msgstr "" -#: py/objslice.c:86 py/sequence.c:57 -msgid "slice step cannot be zero" +#: shared-bindings/displayio/ColorConverter.c +msgid "color should be an int" msgstr "" -#: py/objslice.c:159 -msgid "Cannot subclass slice" +#: py/objcomplex.c +msgid "complex division by zero" msgstr "" -#: py/objstr.c:261 -msgid "bytes value out of range" +#: py/parsenum.c py/objfloat.c +msgid "complex values not supported" msgstr "" -#: py/objstr.c:270 -msgid "wrong number of arguments" +#: extmod/moduzlib.c +msgid "compression header" msgstr "" -#: py/objstr.c:467 -msgid "join expects a list of str/bytes objects consistent with self object" +#: py/parse.c +msgid "constant must be an integer" msgstr "" -#: py/objstr.c:542 py/objstr.c:647 py/objstr.c:1744 -msgid "empty separator" +#: py/emitnative.c +msgid "conversion to object" msgstr "" -#: py/objstr.c:641 -msgid "rsplit(None,n)" +#: py/parsenum.c +msgid "decimal numbers not supported" msgstr "" -#: py/objstr.c:713 -msgid "substring not found" +#: py/compile.c +msgid "default 'except' must be last" msgstr "" -#: py/objstr.c:770 -msgid "start/end indices" +#: shared-bindings/audiobusio/PDMIn.c +msgid "" +"destination buffer must be a bytearray or array of type 'B' for bit_depth = 8" msgstr "" -#: py/objstr.c:931 -msgid "bad format string" +#: shared-bindings/audiobusio/PDMIn.c +msgid "destination buffer must be an array of type 'H' for bit_depth = 16" msgstr "" -#: py/objstr.c:953 -msgid "single '}' encountered in format string" +#: shared-bindings/audiobusio/PDMIn.c +msgid "destination_length must be an int >= 0" msgstr "" -#: py/objstr.c:992 -msgid "bad conversion specifier" +#: py/objdict.c +msgid "dict update sequence has wrong length" +msgstr "" + +#: shared-bindings/math/__init__.c py/runtime.c py/modmath.c py/objint_mpz.c +#: py/objint_longlong.c py/objfloat.c +msgid "division by zero" +msgstr "" + +#: ports/esp8266/modnetwork.c +msgid "either pos or kw args are allowed" +msgstr "" + +#: py/objdeque.c +msgid "empty" +msgstr "" + +#: extmod/modutimeq.c extmod/moduheapq.c +msgid "empty heap" +msgstr "" + +#: py/objstr.c +msgid "empty separator" msgstr "" -#: py/objstr.c:996 +#: shared-bindings/random/__init__.c +msgid "empty sequence" +msgstr "" + +#: py/objstr.c msgid "end of format while looking for conversion specifier" msgstr "" -#: py/objstr.c:998 +#: shared-bindings/displayio/Shape.c +msgid "end_x should be an int" +msgstr "" + +#: ports/nrf/common-hal/busio/UART.c #, c-format -msgid "unknown conversion specifier %c" +msgid "error = 0x%08lX" msgstr "" -#: py/objstr.c:1029 -msgid "unmatched '{' in format" +#: py/runtime.c +msgid "exceptions must derive from BaseException" msgstr "" -#: py/objstr.c:1036 +#: py/objstr.c msgid "expected ':' after format specifier" msgstr "" -#: py/objstr.c:1050 -msgid "" -"can't switch from automatic field numbering to manual field specification" +#: shared-bindings/gamepad/GamePad.c +msgid "expected a DigitalInOut" msgstr "" -#: py/objstr.c:1055 py/objstr.c:1083 -msgid "tuple index out of range" +#: py/obj.c +msgid "expected tuple/list" msgstr "" -#: py/objstr.c:1071 -msgid "attributes not supported yet" +#: py/modthread.c +msgid "expecting a dict for keyword args" msgstr "" -#: py/objstr.c:1079 -msgid "" -"can't switch from manual field specification to automatic field numbering" +#: ports/esp8266/machine_pin.c +msgid "expecting a pin" msgstr "" -#: py/objstr.c:1171 -msgid "invalid format specifier" +#: py/compile.c +msgid "expecting an assembler instruction" msgstr "" -#: py/objstr.c:1192 -msgid "sign not allowed in string format specifier" +#: py/compile.c +msgid "expecting just a value for set" msgstr "" -#: py/objstr.c:1200 -msgid "sign not allowed with integer format specifier 'c'" +#: py/compile.c +msgid "expecting key:value for dict" msgstr "" -#: py/objstr.c:1259 -#, c-format -msgid "unknown format code '%c' for object of type '%s'" +#: py/argcheck.c +msgid "extra keyword arguments given" msgstr "" -#: py/objstr.c:1331 -#, c-format -msgid "unknown format code '%c' for object of type 'float'" +#: py/argcheck.c +msgid "extra positional arguments given" msgstr "" -#: py/objstr.c:1343 -msgid "'=' alignment not allowed in string format specifier" +#: ports/unix/modffi.c +msgid "ffi_prep_closure_loc" msgstr "" -#: py/objstr.c:1367 -#, c-format -msgid "unknown format code '%c' for object of type 'str'" +#: shared-bindings/displayio/OnDiskBitmap.c shared-bindings/audioio/WaveFile.c +msgid "file must be a file opened in byte mode" +msgstr "" + +#: shared-bindings/storage/__init__.c +msgid "filesystem must provide mount method" msgstr "" -#: py/objstr.c:1415 +#: py/objtype.c +msgid "first argument to super() must be type" +msgstr "" + +#: extmod/machine_spi.c +msgid "firstbit must be MSB" +msgstr "" + +#: ports/esp8266/modesp.c +msgid "flash location must be below 1MByte" +msgstr "" + +#: py/objint.c +msgid "float too big" +msgstr "" + +#: shared-bindings/_stage/Text.c +msgid "font must be 2048 bytes long" +msgstr "" + +#: py/objstr.c msgid "format requires a dict" msgstr "" -#: py/objstr.c:1424 -msgid "incomplete format key" +#: ports/esp8266/modmachine.c +msgid "frequency can only be either 80Mhz or 160MHz" msgstr "" -#: py/objstr.c:1482 -msgid "incomplete format" +#: py/objdeque.c +msgid "full" msgstr "" -#: py/objstr.c:1490 -msgid "not enough arguments for format string" +#: py/argcheck.c +msgid "function does not take keyword arguments" msgstr "" -#: py/objstr.c:1500 +#: py/argcheck.c #, c-format -msgid "%%c requires int or char" +msgid "function expected at most %d arguments, got %d" msgstr "" -#: py/objstr.c:1507 -msgid "integer required" +#: py/objnamedtuple.c py/bc.c +msgid "function got multiple values for argument '%q'" msgstr "" -#: py/objstr.c:1570 +#: py/argcheck.c #, c-format -msgid "unsupported format character '%c' (0x%x) at index %d" +msgid "function missing %d required positional arguments" msgstr "" -#: py/objstr.c:1577 -msgid "not all arguments converted during string formatting" +#: py/bc.c +msgid "function missing keyword-only argument" msgstr "" -#: py/objstr.c:2102 -msgid "can't convert to str implicitly" +#: py/bc.c +msgid "function missing required keyword argument '%q'" msgstr "" -#: py/objstr.c:2106 -msgid "can't convert '%q' object to %q implicitly" +#: py/bc.c +#, c-format +msgid "function missing required positional argument #%d" msgstr "" -#: py/objstrunicode.c:134 +#: py/argcheck.c py/objnamedtuple.c py/bc.c #, c-format -msgid "string indices must be integers, not %s" +msgid "function takes %d positional arguments but %d were given" msgstr "" -#: py/objstrunicode.c:145 py/objstrunicode.c:164 -msgid "string index out of range" +#: shared-bindings/time/__init__.c +msgid "function takes exactly 9 arguments" msgstr "" -#: py/objtype.c:358 -msgid "__init__() should return None" +#: py/objgenerator.c +msgid "generator already executing" msgstr "" -#: py/objtype.c:360 -#, c-format -msgid "__init__() should return None, not '%s'" +#: py/objgenerator.c +msgid "generator ignored GeneratorExit" msgstr "" -#: py/objtype.c:623 py/objtype.c:1275 py/runtime.c:1065 -msgid "unreadable attribute" +#: shared-bindings/_stage/Layer.c +msgid "graphic must be 2048 bytes long" msgstr "" -#: py/objtype.c:868 py/runtime.c:653 -msgid "object not callable" +#: extmod/moduheapq.c +msgid "heap must be a list" msgstr "" -#: py/objtype.c:870 py/runtime.c:655 -#, c-format -msgid "'%s' object is not callable" +#: py/compile.c +msgid "identifier redefined as global" msgstr "" -#: py/objtype.c:978 -msgid "type takes 1 or 3 arguments" +#: py/compile.c +msgid "identifier redefined as nonlocal" msgstr "" -#: py/objtype.c:989 -msgid "cannot create instance" +#: ports/esp8266/machine_hspi.c +msgid "impossible baudrate" msgstr "" -#: py/objtype.c:991 -msgid "cannot create '%q' instances" +#: py/objstr.c +msgid "incomplete format" msgstr "" -#: py/objtype.c:1047 -msgid "can't add special method to already-subclassed class" +#: py/objstr.c +msgid "incomplete format key" msgstr "" -#: py/objtype.c:1091 py/objtype.c:1097 -msgid "type is not an acceptable base type" +#: extmod/modubinascii.c +msgid "incorrect padding" msgstr "" -#: py/objtype.c:1100 -msgid "type '%q' is not an acceptable base type" +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +#: ports/nrf/common-hal/pulseio/PulseIn.c +#: ports/esp8266/common-hal/pulseio/PulseIn.c py/obj.c +msgid "index out of range" msgstr "" -#: py/objtype.c:1137 -msgid "multiple inheritance not supported" +#: py/obj.c +msgid "indices must be integers" msgstr "" -#: py/objtype.c:1164 -msgid "multiple bases have instance lay-out conflict" +#: py/compile.c +msgid "inline assembler must be a function" msgstr "" -#: py/objtype.c:1205 -msgid "first argument to super() must be type" +#: py/parsenum.c +msgid "int() arg 2 must be >= 2 and <= 36" msgstr "" -#: py/objtype.c:1370 -msgid "issubclass() arg 2 must be a class or a tuple of classes" +#: py/objstr.c +msgid "integer required" msgstr "" -#: py/objtype.c:1384 -msgid "issubclass() arg 1 must be a class" +#: ports/nrf/common-hal/bleio/Broadcaster.c +msgid "interval not in range 0.0020 to 10.24" msgstr "" -#: py/parse.c:726 -msgid "constant must be an integer" +#: extmod/machine_i2c.c +msgid "invalid I2C peripheral" msgstr "" -#: py/parse.c:868 -msgid "Unable to init parser" +#: extmod/machine_spi.c +msgid "invalid SPI peripheral" msgstr "" -#: py/parse.c:1170 -msgid "unexpected indent" +#: ports/esp8266/machine_rtc.c +msgid "invalid alarm" msgstr "" -#: py/parse.c:1173 -msgid "unindent does not match any outer indentation level" +#: lib/netutils/netutils.c +msgid "invalid arguments" msgstr "" -#: py/parsenum.c:60 -msgid "int() arg 2 must be >= 2 and <= 36" +#: ports/esp8266/modnetwork.c +msgid "invalid buffer length" msgstr "" -#: py/parsenum.c:151 -msgid "invalid syntax for integer" +#: extmod/modussl_axtls.c +msgid "invalid cert" msgstr "" -#: py/parsenum.c:155 -#, c-format -msgid "invalid syntax for integer with base %d" +#: ports/esp8266/common-hal/busio/UART.c ports/esp8266/machine_uart.c +msgid "invalid data bits" msgstr "" -#: py/parsenum.c:339 -msgid "invalid syntax for number" +#: extmod/uos_dupterm.c +msgid "invalid dupterm index" msgstr "" -#: py/parsenum.c:342 -msgid "decimal numbers not supported" +#: extmod/modframebuf.c +msgid "invalid format" msgstr "" -#: py/persistentcode.c:223 -msgid "" -"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/" -"mpy-update for more info." +#: py/objstr.c +msgid "invalid format specifier" msgstr "" -#: py/persistentcode.c:326 -msgid "can only save bytecode" +#: extmod/modussl_axtls.c +msgid "invalid key" msgstr "" -#: py/runtime.c:206 -msgid "name not defined" +#: py/compile.c +msgid "invalid micropython decorator" msgstr "" -#: py/runtime.c:209 -msgid "name '%q' is not defined" +#: ports/esp8266/machine_pin.c +msgid "invalid pin" msgstr "" -#: py/runtime.c:304 py/runtime.c:611 -msgid "unsupported type for operator" +#: shared-bindings/random/__init__.c +msgid "invalid step" msgstr "" -#: py/runtime.c:307 -msgid "unsupported type for %q: '%s'" +#: ports/esp8266/common-hal/busio/UART.c ports/esp8266/machine_uart.c +msgid "invalid stop bits" msgstr "" -#: py/runtime.c:614 -msgid "unsupported types for %q: '%s', '%s'" +#: py/compile.c py/parse.c +msgid "invalid syntax" msgstr "" -#: py/runtime.c:881 py/runtime.c:888 py/runtime.c:945 -msgid "wrong number of values to unpack" +#: py/parsenum.c +msgid "invalid syntax for integer" msgstr "" -#: py/runtime.c:883 py/runtime.c:947 +#: py/parsenum.c #, c-format -msgid "need more than %d values to unpack" +msgid "invalid syntax for integer with base %d" msgstr "" -#: py/runtime.c:890 -#, c-format -msgid "too many values to unpack (expected %d)" +#: py/parsenum.c +msgid "invalid syntax for number" msgstr "" -#: py/runtime.c:984 -msgid "argument has wrong type" +#: py/objtype.c +msgid "issubclass() arg 1 must be a class" msgstr "" -#: py/runtime.c:986 -msgid "argument should be a '%q' not a '%q'" +#: py/objtype.c +msgid "issubclass() arg 2 must be a class or a tuple of classes" msgstr "" -#: py/runtime.c:1123 py/runtime.c:1197 -msgid "no such attribute" +#: py/objstr.c +msgid "join expects a list of str/bytes objects consistent with self object" msgstr "" -#: py/runtime.c:1128 -msgid "type object '%q' has no attribute '%q'" +#: py/argcheck.c +msgid "keyword argument(s) not yet implemented - use normal args instead" msgstr "" -#: py/runtime.c:1132 py/runtime.c:1200 -msgid "'%s' object has no attribute '%q'" +#: py/bc.c +msgid "keywords must be strings" msgstr "" -#: py/runtime.c:1238 -msgid "object not iterable" +#: py/emitinlinextensa.c py/emitinlinethumb.c +msgid "label '%q' not defined" msgstr "" -#: py/runtime.c:1241 -#, c-format -msgid "'%s' object is not iterable" +#: py/compile.c +msgid "label redefined" msgstr "" -#: py/runtime.c:1260 py/runtime.c:1296 -msgid "object not an iterator" +#: ports/esp8266/modesp.c +msgid "len must be multiple of 4" msgstr "" -#: py/runtime.c:1262 py/runtime.c:1298 -#, c-format -msgid "'%s' object is not an iterator" +#: py/stream.c +msgid "length argument not allowed for this type" msgstr "" -#: py/runtime.c:1401 -msgid "exceptions must derive from BaseException" +#: py/objarray.c +msgid "lhs and rhs should be compatible" msgstr "" -#: py/runtime.c:1430 -msgid "cannot import name %q" +#: py/emitnative.c +msgid "local '%q' has type '%q' but source is '%q'" msgstr "" -#: py/runtime.c:1535 -msgid "memory allocation failed, heap is locked" +#: py/emitnative.c +msgid "local '%q' used before type known" +msgstr "" + +#: py/vm.c +msgid "local variable referenced before assignment" +msgstr "" + +#: py/objint.c +msgid "long int not supported in this build" +msgstr "" + +#: shared-bindings/_stage/Layer.c +msgid "map buffer too small" +msgstr "" + +#: shared-bindings/math/__init__.c py/modmath.c +msgid "math domain error" +msgstr "" + +#: py/runtime.c +msgid "maximum recursion depth exceeded" msgstr "" -#: py/runtime.c:1539 +#: py/runtime.c #, c-format msgid "memory allocation failed, allocating %u bytes" msgstr "" -#: py/runtime.c:1609 -msgid "maximum recursion depth exceeded" +#: ports/esp8266/modesp.c +#, c-format +msgid "memory allocation failed, allocating %u bytes for native code" msgstr "" -#: py/sequence.c:264 -msgid "object not in sequence" +#: py/runtime.c +msgid "memory allocation failed, heap is locked" msgstr "" -#: py/stream.c:96 -msgid "stream operation not supported" +#: py/builtinimport.c +msgid "module not found" msgstr "" -#: py/stream.c:254 -msgid "string not supported; use bytes or bytearray" +#: py/compile.c +msgid "multiple *x in assignment" msgstr "" -#: py/stream.c:289 -msgid "length argument not allowed for this type" +#: py/objtype.c +msgid "multiple bases have instance lay-out conflict" msgstr "" -#: py/vm.c:255 -msgid "local variable referenced before assignment" +#: py/objtype.c +msgid "multiple inheritance not supported" msgstr "" -#: py/vm.c:1142 -msgid "no active exception to reraise" +#: py/emitnative.c +msgid "must raise an object" msgstr "" -#: py/vm.c:1284 -msgid "byte code not implemented" +#: extmod/machine_spi.c +msgid "must specify all of sck/mosi/miso" msgstr "" -#: shared-bindings/_stage/Layer.c:71 -msgid "graphic must be 2048 bytes long" +#: py/modbuiltins.c +msgid "must use keyword argument for key function" msgstr "" -#: shared-bindings/_stage/Layer.c:77 shared-bindings/_stage/Text.c:75 -msgid "palette must be 32 bytes long" +#: py/runtime.c +msgid "name '%q' is not defined" msgstr "" -#: shared-bindings/_stage/Layer.c:84 -msgid "map buffer too small" +#: shared-bindings/bleio/Peripheral.c +msgid "name must be a string" msgstr "" -#: shared-bindings/_stage/Text.c:69 -msgid "font must be 2048 bytes long" +#: py/runtime.c +msgid "name not defined" msgstr "" -#: shared-bindings/_stage/Text.c:81 -msgid "chars buffer too small" +#: py/compile.c +msgid "name reused for argument" msgstr "" -#: shared-bindings/analogio/AnalogOut.c:118 -msgid "AnalogOut is only 16 bits. Value must be less than 65536." +#: py/emitnative.c +msgid "native yield" msgstr "" -#: shared-bindings/audiobusio/I2SOut.c:225 -#: shared-bindings/audioio/AudioOut.c:226 -msgid "Not playing" +#: py/runtime.c +#, c-format +msgid "need more than %d values to unpack" msgstr "" -#: shared-bindings/audiobusio/PDMIn.c:124 -msgid "Bit depth must be multiple of 8." +#: py/runtime.c py/objint_mpz.c py/objint_longlong.c +msgid "negative power with no float support" msgstr "" -#: shared-bindings/audiobusio/PDMIn.c:128 -msgid "Oversample must be multiple of 8." +#: py/runtime.c py/objint_mpz.c +msgid "negative shift count" msgstr "" -#: shared-bindings/audiobusio/PDMIn.c:136 -msgid "Microphone startup delay must be in range 0.0 to 1.0" +#: py/vm.c +msgid "no active exception to reraise" msgstr "" -#: shared-bindings/audiobusio/PDMIn.c:193 -msgid "destination_length must be an int >= 0" +#: shared-bindings/socket/__init__.c shared-module/network/__init__.c +msgid "no available NIC" msgstr "" -#: shared-bindings/audiobusio/PDMIn.c:199 -msgid "Cannot record to a file" +#: py/compile.c +msgid "no binding for nonlocal found" msgstr "" -#: shared-bindings/audiobusio/PDMIn.c:202 -msgid "Destination capacity is smaller than destination_length." +#: py/builtinimport.c +msgid "no module named '%q'" msgstr "" -#: shared-bindings/audiobusio/PDMIn.c:206 -msgid "destination buffer must be an array of type 'H' for bit_depth = 16" +#: shared-bindings/_pixelbuf/__init__.c py/runtime.c +msgid "no such attribute" msgstr "" -#: shared-bindings/audiobusio/PDMIn.c:208 -msgid "" -"destination buffer must be a bytearray or array of type 'B' for bit_depth = 8" +#: py/compile.c +msgid "non-default argument follows default argument" msgstr "" -#: shared-bindings/audioio/Mixer.c:94 -msgid "Invalid voice count" +#: extmod/modubinascii.c +msgid "non-hex digit found" msgstr "" -#: shared-bindings/audioio/Mixer.c:99 -msgid "Invalid channel count" +#: py/compile.c +msgid "non-keyword arg after */**" msgstr "" -#: shared-bindings/audioio/Mixer.c:103 -msgid "Sample rate must be positive" +#: py/compile.c +msgid "non-keyword arg after keyword arg" msgstr "" -#: shared-bindings/audioio/Mixer.c:107 -msgid "bits_per_sample must be 8 or 16" +#: shared-bindings/bleio/UUID.c +msgid "not a 128-bit UUID" msgstr "" -#: shared-bindings/audioio/RawSample.c:98 -msgid "" -"sample_source buffer must be a bytearray or array of type 'h', 'H', 'b' or " -"'B'" +#: ports/esp8266/machine_adc.c +#, c-format +msgid "not a valid ADC Channel: %d" msgstr "" -#: shared-bindings/audioio/RawSample.c:104 -msgid "buffer must be a bytes-like object" +#: py/objstr.c +msgid "not all arguments converted during string formatting" msgstr "" -#: shared-bindings/audioio/WaveFile.c:78 -#: shared-bindings/displayio/OnDiskBitmap.c:85 -msgid "file must be a file opened in byte mode" +#: py/objstr.c +msgid "not enough arguments for format string" msgstr "" -#: shared-bindings/bitbangio/I2C.c:111 shared-bindings/bitbangio/SPI.c:121 -#: shared-bindings/busio/SPI.c:133 -msgid "Function requires lock" +#: py/obj.c +#, c-format +msgid "object '%s' is not a tuple or list" msgstr "" -#: shared-bindings/bitbangio/I2C.c:195 shared-bindings/busio/I2C.c:210 -msgid "Buffer must be at least length 1" +#: py/obj.c +msgid "object does not support item assignment" msgstr "" -#: shared-bindings/bitbangio/SPI.c:151 shared-bindings/busio/SPI.c:175 -msgid "Invalid polarity" +#: py/obj.c +msgid "object does not support item deletion" msgstr "" -#: shared-bindings/bitbangio/SPI.c:155 shared-bindings/busio/SPI.c:179 -msgid "Invalid phase" +#: py/obj.c +msgid "object has no len" msgstr "" -#: shared-bindings/bitbangio/SPI.c:159 shared-bindings/busio/SPI.c:183 -msgid "Invalid number of bits" +#: py/obj.c +msgid "object is not subscriptable" msgstr "" -#: shared-bindings/bitbangio/SPI.c:284 shared-bindings/busio/SPI.c:348 -msgid "buffer slices must be of equal length" +#: py/runtime.c +msgid "object not an iterator" msgstr "" -#: shared-bindings/bleio/Address.c:101 -msgid "Wrong address length" +#: py/objtype.c py/runtime.c +msgid "object not callable" msgstr "" -#: shared-bindings/bleio/Address.c:107 -msgid "Wrong number of bytes provided" +#: py/sequence.c +msgid "object not in sequence" msgstr "" -#: shared-bindings/bleio/Device.c:210 -msgid "Can't add services in Central mode" +#: py/runtime.c +msgid "object not iterable" msgstr "" -#: shared-bindings/bleio/Device.c:226 -msgid "Can't connect in Peripheral mode" +#: py/obj.c +#, c-format +msgid "object of type '%s' has no len()" msgstr "" -#: shared-bindings/bleio/Device.c:256 -msgid "Can't change the name in Central mode" +#: py/obj.c +msgid "object with buffer protocol required" msgstr "" -#: shared-bindings/bleio/Device.c:277 shared-bindings/bleio/Device.c:313 -msgid "Can't advertise in Central mode" +#: extmod/modubinascii.c +msgid "odd-length string" msgstr "" -#: shared-bindings/busio/I2C.c:120 -msgid "Function requires lock." +#: py/objstrunicode.c py/objstr.c +msgid "offset out of bounds" msgstr "" -#: shared-bindings/busio/UART.c:106 -msgid "bits must be 7, 8 or 9" +#: shared-bindings/nvm/ByteArray.c py/objarray.c py/objtuple.c +#: py/objstrunicode.c py/objstr.c +msgid "only slices with step=1 (aka None) are supported" msgstr "" -#: shared-bindings/busio/UART.c:118 -msgid "stop must be 1 or 2" +#: py/modbuiltins.c +msgid "ord expects a character" msgstr "" -#: shared-bindings/busio/UART.c:123 -msgid "timeout >100 (units are now seconds, not msecs)" +#: py/modbuiltins.c +#, c-format +msgid "ord() expected a character, but string of length %d found" msgstr "" -#: shared-bindings/digitalio/DigitalInOut.c:211 -msgid "Invalid direction." +#: py/objint_mpz.c +msgid "overflow converting long int to machine word" msgstr "" -#: shared-bindings/digitalio/DigitalInOut.c:240 -msgid "Cannot set value when direction is input." +#: shared-bindings/_stage/Text.c shared-bindings/_stage/Layer.c +msgid "palette must be 32 bytes long" msgstr "" -#: shared-bindings/digitalio/DigitalInOut.c:266 -#: shared-bindings/digitalio/DigitalInOut.c:281 -msgid "Drive mode not used when direction is input." +#: shared-bindings/displayio/Palette.c +msgid "palette_index should be an int" msgstr "" -#: shared-bindings/digitalio/DigitalInOut.c:314 -#: shared-bindings/digitalio/DigitalInOut.c:331 -msgid "Pull not used when direction is output." +#: py/compile.c +msgid "parameter annotation must be an identifier" msgstr "" -#: shared-bindings/digitalio/DigitalInOut.c:340 -msgid "Unsupported pull value." +#: py/emitinlinextensa.c +msgid "parameters must be registers in sequence a2 to a5" msgstr "" -#: shared-bindings/displayio/Bitmap.c:84 -msgid "y should be an int" +#: py/emitinlinethumb.c +msgid "parameters must be registers in sequence r0 to r3" msgstr "" -#: shared-bindings/displayio/Bitmap.c:89 -msgid "row buffer must be a bytearray or array of type 'b' or 'B'" +#: ports/esp8266/machine_pin.c +msgid "pin does not have IRQ capabilities" msgstr "" -#: shared-bindings/displayio/Bitmap.c:94 -msgid "row data must be a buffer" +#: shared-bindings/displayio/Bitmap.c +msgid "pixel coordinates out of bounds" msgstr "" -#: shared-bindings/displayio/ColorConverter.c:72 -msgid "color should be an int" +#: shared-bindings/displayio/Bitmap.c +msgid "pixel value requires too many bits" msgstr "" -#: shared-bindings/displayio/FourWire.c:55 -#: shared-bindings/displayio/FourWire.c:64 -msgid "displayio is a work in progress" +#: shared-bindings/displayio/TileGrid.c +msgid "pixel_shader must be displayio.Palette or displayio.ColorConverter" msgstr "" -#: shared-bindings/displayio/Group.c:65 -msgid "Group must have size at least 1" +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +#: ports/nrf/common-hal/pulseio/PulseIn.c +#: ports/esp8266/common-hal/pulseio/PulseIn.c +msgid "pop from an empty PulseIn" msgstr "" -#: shared-bindings/displayio/Palette.c:96 -msgid "color buffer must be a bytearray or array of type 'b' or 'B'" +#: py/objset.c +msgid "pop from an empty set" msgstr "" -#: shared-bindings/displayio/Palette.c:102 -msgid "color buffer must be 3 bytes (RGB) or 4 bytes (RGB + pad byte)" +#: py/objlist.c +msgid "pop from empty list" msgstr "" -#: shared-bindings/displayio/Palette.c:106 -msgid "color must be between 0x000000 and 0xffffff" +#: py/objdict.c +msgid "popitem(): dictionary is empty" msgstr "" -#: shared-bindings/displayio/Palette.c:110 -msgid "color buffer must be a buffer or int" +#: py/objint_mpz.c +msgid "pow() 3rd argument cannot be 0" msgstr "" -#: shared-bindings/displayio/Palette.c:123 -#: shared-bindings/displayio/Palette.c:137 -msgid "palette_index should be an int" +#: py/objint_mpz.c +msgid "pow() with 3 arguments requires integers" msgstr "" -#: shared-bindings/displayio/Sprite.c:48 -msgid "position must be 2-tuple" +#: extmod/modutimeq.c +msgid "queue overflow" msgstr "" -#: shared-bindings/displayio/Sprite.c:97 -msgid "unsupported bitmap type" +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "rawbuf is not the same size as buf" msgstr "" -#: shared-bindings/displayio/Sprite.c:162 -msgid "pixel_shader must be displayio.Palette or displayio.ColorConverter" +#: shared-bindings/_pixelbuf/__init__.c +msgid "readonly attribute" msgstr "" -#: shared-bindings/gamepad/GamePad.c:100 -msgid "too many arguments" +#: py/builtinimport.c +msgid "relative import" msgstr "" -#: shared-bindings/gamepad/GamePad.c:104 -msgid "expected a DigitalInOut" +#: py/obj.c +#, c-format +msgid "requested length %d but object has length %d" msgstr "" -#: shared-bindings/i2cslave/I2CSlave.c:98 -msgid "can't convert address to int" +#: py/compile.c +msgid "return annotation must be an identifier" msgstr "" -#: shared-bindings/i2cslave/I2CSlave.c:101 -msgid "address out of bounds" +#: py/emitnative.c +msgid "return expected '%q' but got '%q'" msgstr "" -#: shared-bindings/i2cslave/I2CSlave.c:107 -msgid "addresses is empty" +#: shared-module/displayio/Bitmap.c +msgid "row must be packed and word aligned" msgstr "" -#: shared-bindings/microcontroller/Pin.c:89 -#: shared-bindings/neopixel_write/__init__.c:67 -#: shared-bindings/pulseio/PulseOut.c:76 -msgid "Expected a %q" +#: py/objstr.c +msgid "rsplit(None,n)" msgstr "" -#: shared-bindings/microcontroller/Pin.c:100 -msgid "%q in use" +#: shared-bindings/audioio/RawSample.c +msgid "" +"sample_source buffer must be a bytearray or array of type 'h', 'H', 'b' or " +"'B'" msgstr "" -#: shared-bindings/microcontroller/__init__.c:126 -msgid "Invalid run mode." +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "sampling rate out of range" msgstr "" -#: shared-bindings/multiterminal/__init__.c:68 -msgid "Stream missing readinto() or write() method." +#: ports/esp8266/modnetwork.c +msgid "scan failed" msgstr "" -#: shared-bindings/nvm/ByteArray.c:99 -msgid "Slice and value different lengths." +#: py/modmicropython.c +msgid "schedule stack full" msgstr "" -#: shared-bindings/nvm/ByteArray.c:104 -msgid "Array values should be single bytes." +#: lib/utils/pyexec.c py/builtinimport.c +msgid "script compilation not supported" msgstr "" -#: shared-bindings/nvm/ByteArray.c:111 shared-bindings/nvm/ByteArray.c:141 -msgid "Unable to write to nvm." +#: shared-bindings/bleio/Peripheral.c +msgid "services includes an object that is not a Service" msgstr "" -#: shared-bindings/nvm/ByteArray.c:137 -msgid "Bytes must be between 0 and 255." +#: py/objstr.c +msgid "sign not allowed in string format specifier" msgstr "" -#: shared-bindings/os/__init__.c:200 -msgid "No hardware random available" +#: py/objstr.c +msgid "sign not allowed with integer format specifier 'c'" msgstr "" -#: shared-bindings/pulseio/PWMOut.c:164 -msgid "" -"PWM duty_cycle must be between 0 and 65535 inclusive (16 bit resolution)" +#: py/objstr.c +msgid "single '}' encountered in format string" msgstr "" -#: shared-bindings/pulseio/PWMOut.c:195 -msgid "" -"PWM frequency not writable when variable_frequency is False on construction." +#: shared-bindings/time/__init__.c +msgid "sleep length must be non-negative" msgstr "" -#: shared-bindings/pulseio/PulseIn.c:275 -msgid "Cannot delete values" +#: py/objslice.c py/sequence.c +msgid "slice step cannot be zero" msgstr "" -#: shared-bindings/pulseio/PulseIn.c:281 -msgid "Slices not supported" +#: py/sequence.c py/objint.c +msgid "small int overflow" msgstr "" -#: shared-bindings/pulseio/PulseIn.c:287 -msgid "index must be int" +#: main.c +msgid "soft reboot\n" msgstr "" -#: shared-bindings/pulseio/PulseIn.c:293 -msgid "Read-only" +#: py/objstr.c +msgid "start/end indices" msgstr "" -#: shared-bindings/pulseio/PulseOut.c:135 -msgid "Array must contain halfwords (type 'H')" +#: shared-bindings/displayio/Shape.c +msgid "start_x should be an int" +msgstr "" + +#: shared-bindings/random/__init__.c +msgid "step must be non-zero" +msgstr "" + +#: shared-bindings/busio/UART.c +msgid "stop must be 1 or 2" msgstr "" -#: shared-bindings/random/__init__.c:92 shared-bindings/random/__init__.c:100 +#: shared-bindings/random/__init__.c msgid "stop not reachable from start" msgstr "" -#: shared-bindings/random/__init__.c:111 -msgid "step must be non-zero" +#: py/stream.c +msgid "stream operation not supported" msgstr "" -#: shared-bindings/random/__init__.c:114 -msgid "invalid step" +#: py/objstrunicode.c +msgid "string index out of range" msgstr "" -#: shared-bindings/random/__init__.c:146 -msgid "empty sequence" +#: py/objstrunicode.c +#, c-format +msgid "string indices must be integers, not %s" msgstr "" -#: shared-bindings/rtc/RTC.c:40 shared-bindings/rtc/RTC.c:44 -#: shared-bindings/time/__init__.c:190 -msgid "RTC is not supported on this board" +#: py/stream.c +msgid "string not supported; use bytes or bytearray" msgstr "" -#: shared-bindings/rtc/RTC.c:52 -msgid "RTC calibration is not supported on this board" +#: extmod/moductypes.c +msgid "struct: cannot index" msgstr "" -#: shared-bindings/socket/__init__.c:516 shared-module/network/__init__.c:81 -msgid "no available NIC" +#: extmod/moductypes.c +msgid "struct: index out of range" msgstr "" -#: shared-bindings/storage/__init__.c:77 -msgid "filesystem must provide mount method" +#: extmod/moductypes.c +msgid "struct: no fields" msgstr "" -#: shared-bindings/supervisor/__init__.c:93 -msgid "Brightness must be between 0 and 255" +#: py/objstr.c +msgid "substring not found" msgstr "" -#: shared-bindings/supervisor/__init__.c:119 -msgid "Stack size must be at least 256" +#: py/compile.c +msgid "super() can't find self" msgstr "" -#: shared-bindings/time/__init__.c:78 -msgid "sleep length must be non-negative" +#: extmod/modujson.c +msgid "syntax error in JSON" msgstr "" -#: shared-bindings/time/__init__.c:88 -msgid "time.struct_time() takes exactly 1 argument" +#: extmod/moductypes.c +msgid "syntax error in uctypes descriptor" +msgstr "" + +#: shared-bindings/touchio/TouchIn.c +msgid "threshold must be in the range 0-65536" msgstr "" -#: shared-bindings/time/__init__.c:91 +#: shared-bindings/displayio/TileGrid.c +msgid "tile index out of bounds" +msgstr "" + +#: shared-bindings/time/__init__.c msgid "time.struct_time() takes a 9-sequence" msgstr "" -#: shared-bindings/time/__init__.c:169 shared-bindings/time/__init__.c:263 -msgid "Tuple or struct_time argument required" +#: shared-bindings/time/__init__.c +msgid "time.struct_time() takes exactly 1 argument" msgstr "" -#: shared-bindings/time/__init__.c:174 shared-bindings/time/__init__.c:268 -msgid "function takes exactly 9 arguments" +#: shared-bindings/busio/UART.c +msgid "timeout >100 (units are now seconds, not msecs)" +msgstr "" + +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "timeout must be >= 0.0" msgstr "" -#: shared-bindings/time/__init__.c:239 shared-bindings/time/__init__.c:272 +#: shared-bindings/time/__init__.c msgid "timestamp out of range for platform time_t" msgstr "" -#: shared-bindings/touchio/TouchIn.c:173 -msgid "threshold must be in the range 0-65536" +#: shared-bindings/gamepad/GamePad.c +msgid "too many arguments" msgstr "" -#: shared-bindings/util.c:38 -msgid "" -"Object has been deinitialized and can no longer be used. Create a new object." +#: shared-module/struct/__init__.c +msgid "too many arguments provided with the given format" msgstr "" -#: shared-module/audioio/Mixer.c:47 shared-module/audioio/WaveFile.c:117 -msgid "Couldn't allocate first buffer" +#: py/runtime.c +#, c-format +msgid "too many values to unpack (expected %d)" msgstr "" -#: shared-module/audioio/Mixer.c:53 shared-module/audioio/WaveFile.c:123 -msgid "Couldn't allocate second buffer" +#: py/objstr.c +msgid "tuple index out of range" msgstr "" -#: shared-module/audioio/Mixer.c:82 -msgid "Voice index too high" +#: py/obj.c +msgid "tuple/list has wrong length" msgstr "" -#: shared-module/audioio/Mixer.c:85 -msgid "The sample's sample rate does not match the mixer's" +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "tuple/list required on RHS" msgstr "" -#: shared-module/audioio/Mixer.c:88 -msgid "The sample's channel count does not match the mixer's" +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "tx and rx cannot both be None" msgstr "" -#: shared-module/audioio/Mixer.c:91 -msgid "The sample's bits_per_sample does not match the mixer's" +#: py/objtype.c +msgid "type '%q' is not an acceptable base type" msgstr "" -#: shared-module/audioio/Mixer.c:100 -msgid "The sample's signedness does not match the mixer's" +#: py/objtype.c +msgid "type is not an acceptable base type" msgstr "" -#: shared-module/audioio/WaveFile.c:61 -msgid "Invalid wave file" +#: py/runtime.c +msgid "type object '%q' has no attribute '%q'" msgstr "" -#: shared-module/audioio/WaveFile.c:69 -msgid "Invalid format chunk size" +#: py/objtype.c +msgid "type takes 1 or 3 arguments" msgstr "" -#: shared-module/audioio/WaveFile.c:83 -msgid "Unsupported format" +#: py/objint_longlong.c +msgid "ulonglong too large" msgstr "" -#: shared-module/audioio/WaveFile.c:99 -msgid "Data chunk must follow fmt chunk" +#: py/emitnative.c +msgid "unary op %q not implemented" msgstr "" -#: shared-module/audioio/WaveFile.c:107 -msgid "Invalid file" +#: py/parse.c +msgid "unexpected indent" msgstr "" -#: shared-module/bitbangio/I2C.c:58 -msgid "Clock stretch too long" +#: py/bc.c +msgid "unexpected keyword argument" msgstr "" -#: shared-module/bitbangio/SPI.c:44 -msgid "Clock pin init failed." +#: py/objnamedtuple.c py/bc.c +msgid "unexpected keyword argument '%q'" msgstr "" -#: shared-module/bitbangio/SPI.c:50 -msgid "MOSI pin init failed." +#: py/lexer.c +msgid "unicode name escapes" msgstr "" -#: shared-module/bitbangio/SPI.c:61 -msgid "MISO pin init failed." +#: py/parse.c +msgid "unindent does not match any outer indentation level" msgstr "" -#: shared-module/bitbangio/SPI.c:121 -msgid "Cannot write without MOSI pin." +#: ports/esp8266/modnetwork.c +msgid "unknown config param" msgstr "" -#: shared-module/bitbangio/SPI.c:176 -msgid "Cannot read without MISO pin." +#: py/objstr.c +#, c-format +msgid "unknown conversion specifier %c" msgstr "" -#: shared-module/bitbangio/SPI.c:240 -msgid "Cannot transfer without MOSI and MISO pins." +#: py/objstr.c +#, c-format +msgid "unknown format code '%c' for object of type '%s'" msgstr "" -#: shared-module/displayio/Bitmap.c:49 -msgid "Only bit maps of 8 bit color or less are supported" +#: py/objstr.c +#, c-format +msgid "unknown format code '%c' for object of type 'float'" msgstr "" -#: shared-module/displayio/Bitmap.c:69 -msgid "row must be packed and word aligned" +#: py/objstr.c +#, c-format +msgid "unknown format code '%c' for object of type 'str'" msgstr "" -#: shared-module/displayio/Group.c:39 -msgid "Group full" +#: ports/esp8266/modnetwork.c +msgid "unknown status param" msgstr "" -#: shared-module/displayio/Group.c:48 -msgid "Group empty" +#: py/compile.c +msgid "unknown type" msgstr "" -#: shared-module/displayio/OnDiskBitmap.c:49 -msgid "Invalid BMP file" +#: py/emitnative.c +msgid "unknown type '%q'" msgstr "" -#: shared-module/displayio/OnDiskBitmap.c:59 -#, c-format -msgid "Only Windows format, uncompressed BMP supported %d" +#: py/objstr.c +msgid "unmatched '{' in format" msgstr "" -#: shared-module/displayio/OnDiskBitmap.c:64 -#, c-format -msgid "Only true color (24 bpp or higher) BMP supported %x" +#: py/objtype.c py/runtime.c +msgid "unreadable attribute" msgstr "" -#: shared-module/storage/__init__.c:155 -msgid "Cannot remount '/' when USB is active." +#: py/emitinlinethumb.c +#, c-format +msgid "unsupported Thumb instruction '%s' with %d arguments" msgstr "" -#: shared-module/struct/__init__.c:39 -msgid "'S' and 'O' are not supported format types" +#: py/emitinlinextensa.c +#, c-format +msgid "unsupported Xtensa instruction '%s' with %d arguments" msgstr "" -#: shared-module/struct/__init__.c:83 -msgid "too many arguments provided with the given format" +#: shared-bindings/displayio/TileGrid.c +msgid "unsupported bitmap type" msgstr "" -#: shared-module/usb_hid/Device.c:45 +#: py/objstr.c #, c-format -msgid "Buffer incorrect size. Should be %d bytes." +msgid "unsupported format character '%c' (0x%x) at index %d" msgstr "" -#: shared-module/usb_hid/Device.c:53 -msgid "USB Busy" +#: py/runtime.c +msgid "unsupported type for %q: '%s'" msgstr "" -#: shared-module/usb_hid/Device.c:59 -msgid "USB Error" +#: py/runtime.c +msgid "unsupported type for operator" msgstr "" -#: supervisor/shared/safe_mode.c:97 -msgid "You requested starting safe mode by " +#: py/runtime.c +msgid "unsupported types for %q: '%s', '%s'" msgstr "" -#: supervisor/shared/safe_mode.c:100 -msgid "To exit, please reset the board without " +#: shared-bindings/displayio/Bitmap.c +msgid "value_count must be > 0" msgstr "" -#: supervisor/shared/safe_mode.c:107 -msgid "" -"You are running in safe mode which means something unanticipated happened.\n" +#: ports/esp8266/modnetwork.c +msgid "wifi_set_ip_info() failed" msgstr "" -#: supervisor/shared/safe_mode.c:109 -msgid "" -"Looks like our core CircuitPython code crashed hard. Whoops!\n" -"Please file an issue at https://github.com/adafruit/circuitpython/issues\n" -" with the contents of your CIRCUITPY drive and this message:\n" +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "write_args must be a list, tuple, or None" msgstr "" -#: supervisor/shared/safe_mode.c:111 -msgid "Crash into the HardFault_Handler.\n" +#: py/objstr.c +msgid "wrong number of arguments" msgstr "" -#: supervisor/shared/safe_mode.c:113 -msgid "MicroPython NLR jump failed. Likely memory corruption.\n" +#: py/runtime.c +msgid "wrong number of values to unpack" msgstr "" -#: supervisor/shared/safe_mode.c:115 -msgid "MicroPython fatal error.\n" +#: shared-module/displayio/Shape.c +msgid "x value out of bounds" msgstr "" -#: supervisor/shared/safe_mode.c:118 -msgid "" -"The microcontroller's power dipped. Please make sure your power supply " -"provides\n" -"enough power for the whole circuit and press reset (after ejecting " -"CIRCUITPY).\n" +#: shared-bindings/displayio/Shape.c +msgid "y should be an int" msgstr "" -#: supervisor/shared/safe_mode.c:120 -msgid "" -"The CircuitPython heap was corrupted because the stack was too small.\n" -"Please increase stack size limits and press reset (after ejecting " -"CIRCUITPY).\n" -"If you didn't change the stack, then file an issue here with the contents of " -"your CIRCUITPY drive:\n" +#: shared-module/displayio/Shape.c +msgid "y value out of bounds" msgstr "" -#: supervisor/shared/safe_mode.c:123 -msgid "" -"The reset button was pressed while booting CircuitPython. Press again to " -"exit safe mode.\n" +#: py/objrange.c +msgid "zero step" msgstr "" diff --git a/locale/de_DE.po b/locale/de_DE.po index e9f81e0b1..87e965914 100644 --- a/locale/de_DE.po +++ b/locale/de_DE.po @@ -7,2611 +7,2891 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-12-26 20:49+0100\n" +"POT-Creation-Date: 2019-03-25 19:40+0100\n" "PO-Revision-Date: 2018-07-27 11:55-0700\n" -"Last-Translator: Sebastian Plamauer\n" -"Language-Team: \n" +"Last-Translator: Pascal Deneaux\n" +"Language-Team: Sebastian Plamauer, Pascal Deneaux\n" "Language: en_US\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.1.1\n" -#: extmod/machine_i2c.c:299 -msgid "invalid I2C peripheral" -msgstr "ungültige I2C Schnittstelle" +#: main.c +msgid "" +"\n" +"Code done running. Waiting for reload.\n" +msgstr "" +"\n" +"Der Code wurde ausgeführt. Warte auf reload.\n" -#: extmod/machine_i2c.c:340 extmod/machine_i2c.c:354 extmod/machine_i2c.c:368 -#: extmod/machine_i2c.c:392 -msgid "I2C operation not supported" -msgstr "I2C-operation nicht unterstützt" +#: py/obj.c +msgid " File \"%q\"" +msgstr " Datei \"%q\"" + +#: py/obj.c +msgid " File \"%q\", line %d" +msgstr " Datei \"%q\", Zeile %d" -#: extmod/machine_mem.c:45 ports/unix/modmachine.c:53 +#: main.c +msgid " output:\n" +msgstr " Ausgabe:\n" + +#: py/objstr.c #, c-format -msgid "address %08x is not aligned to %d bytes" -msgstr "Addresse %08x ist nicht an %d bytes ausgerichtet" +msgid "%%c requires int or char" +msgstr "%%c erwartet int oder char" -#: extmod/machine_spi.c:57 -msgid "invalid SPI peripheral" -msgstr "ungültige SPI Schnittstelle" +#: shared-bindings/microcontroller/Pin.c +msgid "%q in use" +msgstr "%q in Benutzung" -#: extmod/machine_spi.c:124 -msgid "buffers must be the same length" -msgstr "Buffer müssen gleich lang sein" +#: py/obj.c +msgid "%q index out of range" +msgstr "Der Index %q befindet sich außerhalb der Reihung" -#: extmod/machine_spi.c:207 -msgid "bits must be 8" -msgstr "bits müssen 8 sein" +#: py/obj.c +msgid "%q indices must be integers, not %s" +msgstr "%q Indizes müssen ganze Zahlen sein, nicht %s" -#: extmod/machine_spi.c:210 -msgid "firstbit must be MSB" -msgstr "das erste Bit muss MSB sein" +#: shared-bindings/displayio/Group.c shared-bindings/displayio/Shape.c +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "%q must be >= 1" +msgstr "%q muss >= 1 sein" -#: extmod/machine_spi.c:215 -msgid "must specify all of sck/mosi/miso" -msgstr "sck/mosi/miso müssen alle spezifiziert sein" +#: shared-bindings/fontio/BuiltinFont.c +msgid "%q should be an int" +msgstr "%q sollte ein int sein" -#: extmod/modframebuf.c:299 -msgid "invalid format" -msgstr "ungültiges Format" +#: py/objnamedtuple.c py/bc.c +msgid "%q() takes %d positional arguments but %d were given" +msgstr "%q() nimmt %d Argumente ohne Keyword an, aber es wurden %d angegeben" -#: extmod/modubinascii.c:38 extmod/moduhashlib.c:102 -msgid "a bytes-like object is required" -msgstr "ein Byte-ähnliches Objekt ist erforderlich" +#: py/argcheck.c +msgid "'%q' argument required" +msgstr "'%q' Argument erforderlich" -#: extmod/modubinascii.c:90 -msgid "odd-length string" -msgstr "String mit ungerader Länge" +#: py/emitinlinextensa.c py/emitinlinethumb.c +#, c-format +msgid "'%s' expects a label" +msgstr "'%s' erwartet ein Label" -#: extmod/modubinascii.c:101 -msgid "non-hex digit found" -msgstr "eine nicht-hex zahl wurde gefunden" +#: py/emitinlinextensa.c py/emitinlinethumb.c +#, c-format +msgid "'%s' expects a register" +msgstr "'%s' erwartet ein Register" -#: extmod/modubinascii.c:169 -msgid "incorrect padding" -msgstr "falsches padding" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects a special register" +msgstr "'%s' erwartet ein Spezialregister" -#: extmod/moductypes.c:122 -msgid "syntax error in uctypes descriptor" -msgstr "Syntaxfehler in uctypes Definition" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects an FPU register" +msgstr "'%s' erwartet ein FPU-Register" -#: extmod/moductypes.c:219 -msgid "Cannot unambiguously get sizeof scalar" -msgstr "sizeof scalar kann nicht eindeutig bestimmt werden" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects an address of the form [a, b]" +msgstr "'%s' erwartet eine Adresse in der Form [a, b]" -#: extmod/moductypes.c:397 -msgid "struct: no fields" -msgstr "struct: keine Felder" +#: py/emitinlinextensa.c py/emitinlinethumb.c +#, c-format +msgid "'%s' expects an integer" +msgstr "'%s' erwartet ein Integer" -#: extmod/moductypes.c:530 -msgid "struct: cannot index" -msgstr "struct: kann nicht indexieren" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects at most r%d" +msgstr "'%s' erwartet höchstens r%d" -#: extmod/moductypes.c:544 -msgid "struct: index out of range" -msgstr "struct: index außerhalb gültigen Bereichs" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects {r0, r1, ...}" +msgstr "'%s' erwartet {r0, r1, ...}" -#: extmod/moduheapq.c:38 -msgid "heap must be a list" -msgstr "heap muss eine Liste sein" +#: py/emitinlinextensa.c +#, c-format +msgid "'%s' integer %d is not within range %d..%d" +msgstr "'%s' integer %d ist nicht im Bereich %d..%d" -#: extmod/moduheapq.c:86 extmod/modutimeq.c:147 extmod/modutimeq.c:172 -msgid "empty heap" -msgstr "leerer heap" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' integer 0x%x does not fit in mask 0x%x" +msgstr "'%s' Integer 0x%x passt nicht in Maske 0x%x" -#: extmod/modujson.c:281 -msgid "syntax error in JSON" -msgstr "Syntaxfehler in JSON" +#: py/obj.c +#, c-format +msgid "'%s' object does not support item assignment" +msgstr "'%s' Objekt unterstützt keine item assignment" -#: extmod/modure.c:161 -msgid "Splitting with sub-captures" -msgstr "Teilen mit unter-captures" +#: py/obj.c +#, c-format +msgid "'%s' object does not support item deletion" +msgstr "'%s' Objekt unterstützt das Löschen von Elementen nicht" -#: extmod/modure.c:207 -msgid "Error in regex" -msgstr "Fehler in regex" +#: py/runtime.c +msgid "'%s' object has no attribute '%q'" +msgstr "'%s' Objekt hat kein Attribut '%q'" -#: extmod/modussl_axtls.c:81 -msgid "invalid key" -msgstr "ungültiger Schlüssel" +#: py/runtime.c +#, c-format +msgid "'%s' object is not an iterator" +msgstr "'%s' Objekt ist kein Iterator" -#: extmod/modussl_axtls.c:87 -msgid "invalid cert" -msgstr "ungültiges cert" +#: py/objtype.c py/runtime.c +#, c-format +msgid "'%s' object is not callable" +msgstr "'%s' object ist nicht callable" -#: extmod/modutimeq.c:131 -msgid "queue overflow" -msgstr "Warteschlangenüberlauf" +#: py/runtime.c +#, c-format +msgid "'%s' object is not iterable" +msgstr "'%s' Objekt nicht iterierbar" -#: extmod/moduzlib.c:98 -msgid "compression header" -msgstr "kompression header" +#: py/obj.c +#, c-format +msgid "'%s' object is not subscriptable" +msgstr "'%s' Objekt hat keine '__getitem__'-Methode (not subscriptable)" -#: extmod/uos_dupterm.c:120 -msgid "invalid dupterm index" -msgstr "ungültiger dupterm index" +#: py/objstr.c +msgid "'=' alignment not allowed in string format specifier" +msgstr "'='-Ausrichtung ist im String-Formatbezeichner nicht zulässig" -#: extmod/vfs_fat.c:426 py/moduerrno.c:154 -msgid "Read-only filesystem" -msgstr "Schreibgeschützte Dateisystem" +#: shared-module/struct/__init__.c +msgid "'S' and 'O' are not supported format types" +msgstr "'S' und 'O' sind keine unterstützten Formattypen" -#: extmod/vfs_posix_file.c:48 ports/unix/file.c:50 py/objstringio.c:43 -msgid "I/O operation on closed file" -msgstr "Lese/Schreibe-operation an geschlossener Datei" +#: py/compile.c +msgid "'align' requires 1 argument" +msgstr "'align' erfordert genau ein Argument" -#: lib/embed/abort_.c:8 -msgid "abort() called" -msgstr "abort() wurde aufgerufen" +#: py/compile.c +msgid "'await' outside function" +msgstr "'await' außerhalb einer Funktion" -#: lib/netutils/netutils.c:83 -msgid "invalid arguments" -msgstr "ungültige argumente" +#: py/compile.c +msgid "'break' outside loop" +msgstr "'break' außerhalb einer Schleife" -#: lib/utils/pyexec.c:97 py/builtinimport.c:251 -msgid "script compilation not supported" -msgstr "kompilieren von Skripten ist nicht unterstützt" +#: py/compile.c +msgid "'continue' outside loop" +msgstr "'continue' außerhalb einer Schleife" -#: main.c:150 -msgid " output:\n" -msgstr " Ausgabe:\n" +#: py/compile.c +msgid "'data' requires at least 2 arguments" +msgstr "'data' erfordert mindestens zwei Argumente" -#: main.c:164 main.c:237 -msgid "" -"Auto-reload is on. Simply save files over USB to run them or enter REPL to " -"disable.\n" -msgstr "" -"Automatisches Neuladen ist aktiv. Speichere Dateien über USB um sie " -"auszuführen oder verbinde dich mit der REPL um zu deaktivieren.\n" +#: py/compile.c +msgid "'data' requires integer arguments" +msgstr "'data' erfordert Integer-Argumente" -#: main.c:166 -msgid "Running in safe mode! Auto-reload is off.\n" -msgstr "Sicherheitsmodus aktiv! Automatisches Neuladen ist deaktiviert.\n" +#: py/compile.c +msgid "'label' requires 1 argument" +msgstr "'label' erfordert genau ein Argument" -#: main.c:168 main.c:239 -msgid "Auto-reload is off.\n" -msgstr "Automatisches Neuladen ist deaktiviert.\n" +#: py/compile.c +msgid "'return' outside function" +msgstr "'return' außerhalb einer Funktion" -#: main.c:182 -msgid "Running in safe mode! Not running saved code.\n" -msgstr "Sicherheitsmodus aktiv! Gespeicherter Code wird nicht ausgeführt\n" +#: py/compile.c +msgid "'yield' outside function" +msgstr "'yield' außerhalb einer Funktion" -#: main.c:198 -msgid "WARNING: Your code filename has two extensions\n" -msgstr "WARNUNG: Der Dateiname deines codes hat zwei Dateityperweiterungen\n" +#: py/compile.c +msgid "*x must be assignment target" +msgstr "*x muss Zuordnungsziel sein" -#: main.c:244 -msgid "Press any key to enter the REPL. Use CTRL-D to reload." +#: py/obj.c +msgid ", in %q\n" msgstr "" -"Drücke eine Taste um dich mit der REPL zu verbinden. Drücke Strg-D zum neu " -"laden" -#: main.c:407 -msgid "soft reboot\n" -msgstr "soft reboot\n" +#: py/objcomplex.c +msgid "0.0 to a complex power" +msgstr "" -#: ports/atmel-samd/audio_dma.c:209 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:361 -msgid "All sync event channels in use" -msgstr "Alle sync event Kanäle werden benutzt" +#: py/modbuiltins.c +msgid "3-arg pow() not supported" +msgstr "3-arg pow() wird nicht unterstützt" -#: ports/atmel-samd/bindings/samd/Clock.c:135 -msgid "calibration is read only" -msgstr "Kalibrierung ist Schreibgeschützt" +#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c +msgid "A hardware interrupt channel is already in use" +msgstr "Ein Hardware Interrupt Kanal wird schon benutzt" -#: ports/atmel-samd/bindings/samd/Clock.c:137 -msgid "calibration is out of range" -msgstr "Kalibrierung ist außerhalb der Reichweite" +#: ports/esp8266/modnetwork.c +msgid "AP required" +msgstr "AP erforderlich" -#: ports/atmel-samd/board_busses.c:59 ports/nrf/board_busses.c:39 -msgid "No default I2C bus" -msgstr "Kein Standard I2C Bus" +#: shared-bindings/bleio/Address.c +#, c-format +msgid "Address is not %d bytes long or is in wrong format" +msgstr "Die Adresse ist nicht %d Bytes lang oder das Format ist falsch" -#: ports/atmel-samd/board_busses.c:85 ports/nrf/board_busses.c:64 -msgid "No default SPI bus" -msgstr "Kein Standard SPI Bus" +#: shared-bindings/bleio/Address.c +#, c-format +msgid "Address must be %d bytes long" +msgstr "Die Adresse muss %d Bytes lang sein" -#: ports/atmel-samd/board_busses.c:112 ports/nrf/board_busses.c:91 -msgid "No default UART bus" -msgstr "Kein Standard UART Bus" +#: ports/nrf/common-hal/busio/I2C.c +msgid "All I2C peripherals are in use" +msgstr "Alle I2C-Peripheriegeräte sind in Benutzung" -#: ports/atmel-samd/common-hal/analogio/AnalogIn.c:63 -#: ports/nrf/common-hal/analogio/AnalogIn.c:39 -msgid "Pin does not have ADC capabilities" -msgstr "Pin hat keine ADC Funktionalität" +#: ports/nrf/common-hal/busio/SPI.c +msgid "All SPI peripherals are in use" +msgstr "Alle SPI-Peripheriegeräte sind in Benutzung" -#: ports/atmel-samd/common-hal/analogio/AnalogOut.c:49 -msgid "No DAC on chip" -msgstr "Kein DAC vorhanden" +#: ports/nrf/common-hal/busio/UART.c +msgid "All UART peripherals are in use" +msgstr "Alle UART-Peripheriegeräte sind in Benutzung" + +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "All event channels in use" +msgstr "Alle event Kanäle werden benutzt" + +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c ports/atmel-samd/audio_dma.c +msgid "All sync event channels in use" +msgstr "Alle sync event Kanäle werden benutzt" -#: ports/atmel-samd/common-hal/analogio/AnalogOut.c:56 +#: shared-bindings/pulseio/PWMOut.c +msgid "All timers for this pin are in use" +msgstr "Alle timer für diesen Pin werden bereits benutzt" + +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/pulseio/PulseOut.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c +#: shared-module/_pew/PewPew.c +msgid "All timers in use" +msgstr "Alle timer werden benutzt" + +#: ports/nrf/common-hal/analogio/AnalogOut.c +msgid "AnalogOut functionality not supported" +msgstr "AnalogOut-Funktion wird nicht unterstützt" + +#: shared-bindings/analogio/AnalogOut.c +msgid "AnalogOut is only 16 bits. Value must be less than 65536." +msgstr "AnalogOut kann nur 16 Bit. Der Wert muss unter 65536 liegen." + +#: ports/atmel-samd/common-hal/analogio/AnalogOut.c msgid "AnalogOut not supported on given pin" msgstr "AnalogOut ist an diesem Pin nicht unterstützt" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:147 -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:150 -msgid "Invalid bit clock pin" -msgstr "Ungültiges bit clock pin" +#: ports/atmel-samd/common-hal/pulseio/PulseOut.c +msgid "Another send is already active" +msgstr "Ein anderer Sendevorgang ist schon aktiv" + +#: shared-bindings/pulseio/PulseOut.c +msgid "Array must contain halfwords (type 'H')" +msgstr "Array muss Halbwörter enthalten (type 'H')" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:153 +#: shared-bindings/nvm/ByteArray.c +msgid "Array values should be single bytes." +msgstr "Array-Werte sollten aus Einzelbytes bestehen." + +#: supervisor/shared/safe_mode.c +msgid "Attempted heap allocation when MicroPython VM not running.\n" +msgstr "" + +#: main.c +msgid "Auto-reload is off.\n" +msgstr "Automatisches Neuladen ist deaktiviert.\n" + +#: main.c +msgid "" +"Auto-reload is on. Simply save files over USB to run them or enter REPL to " +"disable.\n" +msgstr "" +"Automatisches Neuladen ist aktiv. Speichere Dateien über USB um sie " +"auszuführen oder verbinde dich mit der REPL zum Deaktivieren.\n" + +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Bit clock and word select must share a clock unit" msgstr "Bit clock und word select müssen eine clock unit teilen" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:156 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:130 -msgid "Invalid data pin" -msgstr "Ungültiger data pin" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Bit depth must be multiple of 8." +msgstr "Bit depth muss ein Vielfaches von 8 sein." -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:169 -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:174 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:145 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:150 -msgid "Serializer in use" -msgstr "Serializer wird benutzt" +#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c +msgid "Both pins must support hardware interrupts" +msgstr "Beide pins müssen Hardware Interrupts unterstützen" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:230 -msgid "Clock unit in use" -msgstr "Clock unit wird benutzt" +#: shared-bindings/supervisor/__init__.c +msgid "Brightness must be between 0 and 255" +msgstr "Die Helligkeit muss zwischen 0 und 255 liegen" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:240 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:172 -msgid "Unable to find free GCLK" -msgstr "Konnte keinen freien GCLK finden" +#: shared-bindings/displayio/Display.c +msgid "Brightness not adjustable" +msgstr "Die Helligkeit ist nicht einstellbar" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:254 -msgid "Too many channels in sample." -msgstr "Zu viele Kanäle im sample" +#: shared-module/usb_hid/Device.c +#, c-format +msgid "Buffer incorrect size. Should be %d bytes." +msgstr "Der Puffergröße ist inkorrekt. Sie sollte %d bytes haben." -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:305 -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:417 -msgid "No DMA channel found" -msgstr "Kein DMA Kanal gefunden" +#: shared-bindings/bitbangio/I2C.c shared-bindings/busio/I2C.c +msgid "Buffer must be at least length 1" +msgstr "Der Puffer muss eine Mindestenslänge von 1 haben" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:308 -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:419 -msgid "Unable to allocate buffers for signed conversion" -msgstr "Konnte keine Buffer für Vorzeichenumwandlung allozieren" +#: ports/atmel-samd/common-hal/displayio/ParallelBus.c +#: ports/nrf/common-hal/displayio/ParallelBus.c +#, c-format +msgid "Bus pin %d is already in use" +msgstr "Bus pin %d wird schon benutzt" -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:109 -msgid "Invalid clock pin" -msgstr "Ungültiger clock pin" +#: shared-bindings/bleio/UUID.c +msgid "Byte buffer must be 16 bytes." +msgstr "Der Puffer muss 16 Bytes lang sein" -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:134 -msgid "Only 8 or 16 bit mono with " -msgstr "Nur 8 oder 16 bit mono mit " +#: shared-bindings/nvm/ByteArray.c +msgid "Bytes must be between 0 and 255." +msgstr "Ein Bytes kann nur Werte zwischen 0 und 255 annehmen." -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:167 -msgid "sampling rate out of range" -msgstr "Abtastrate außerhalb der Reichweite" +#: ports/esp8266/esp_mphal.c +msgid "C-level assert" +msgstr "C-Level Assert" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:132 -msgid "DAC already in use" -msgstr "DAC wird schon benutzt" +#: shared-bindings/_pixelbuf/PixelBuf.c +#, c-format +msgid "Can not use dotstar with %s" +msgstr "Kann dotstar nicht mit %s verwenden" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:136 -msgid "Right channel unsupported" -msgstr "Rechter Kanal wird nicht unterstützt" +#: shared-bindings/bleio/Device.c +msgid "Can't add services in Central mode" +msgstr "Im Central mode können Dienste nicht hinzugefügt werden" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:139 -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:116 -#: ports/atmel-samd/common-hal/touchio/TouchIn.c:65 -msgid "Invalid pin" -msgstr "Ungültiger Pin" +#: shared-bindings/bleio/Device.c +msgid "Can't advertise in Central mode" +msgstr "Im Central mode kann advertise nicht gemacht werden" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:147 -msgid "Invalid pin for left channel" -msgstr "Ungültiger Pin für linken Kanal" +#: shared-bindings/bleio/Device.c +msgid "Can't change the name in Central mode" +msgstr "Im Central mode kann name nicht geändert werden" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:151 -msgid "Invalid pin for right channel" -msgstr "Ungültiger Pin für rechten Kanal" +#: shared-bindings/bleio/Device.c +msgid "Can't connect in Peripheral mode" +msgstr "Im Peripheral mode kann keine Verbindung hergestellt werden" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:154 +#: ports/esp8266/modnetwork.c +msgid "Cannot connect to AP" +msgstr "Kann nicht zu AP verbinden" + +#: shared-bindings/displayio/Bitmap.c shared-bindings/pulseio/PulseIn.c +msgid "Cannot delete values" +msgstr "Kann Werte nicht löschen" + +#: ports/esp8266/modnetwork.c +msgid "Cannot disconnect from AP" +msgstr "Kann nicht trennen von AP" + +#: ports/atmel-samd/common-hal/digitalio/DigitalInOut.c +#: ports/nrf/common-hal/digitalio/DigitalInOut.c +msgid "Cannot get pull while in output mode" +msgstr "Pull up im Ausgabemodus nicht möglich" + +#: ports/nrf/common-hal/microcontroller/Processor.c +msgid "Cannot get temperature" +msgstr "Kann Temperatur nicht holen" + +#: ports/atmel-samd/common-hal/audioio/AudioOut.c msgid "Cannot output both channels on the same pin" msgstr "Kann nicht beite Kanäle auf dem gleichen Pin ausgeben" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:243 -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:189 -#: ports/atmel-samd/common-hal/pulseio/PulseOut.c:110 -#: ports/nrf/common-hal/pulseio/PulseOut.c:107 -msgid "All timers in use" -msgstr "Alle timer werden benutzt" +#: shared-module/bitbangio/SPI.c +msgid "Cannot read without MISO pin." +msgstr "Kann ohne MISO-Pin nicht lesen." -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:285 -msgid "All event channels in use" -msgstr "Alle event Kanäle werden benutzt" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Cannot record to a file" +msgstr "Aufnahme in eine Datei nicht möglich" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:375 -#, c-format -msgid "Sample rate too high. It must be less than %d" -msgstr "" +#: shared-module/storage/__init__.c +msgid "Cannot remount '/' when USB is active." +msgstr "Kann '/' nicht remounten when USB aktiv ist" -#: ports/atmel-samd/common-hal/busio/I2C.c:71 -msgid "Not enough pins available" -msgstr "Nicht genug Pins vorhanden" +#: ports/atmel-samd/common-hal/microcontroller/__init__.c +#: ports/esp8266/common-hal/microcontroller/__init__.c +msgid "Cannot reset into bootloader because no bootloader is present." +msgstr "Reset zum bootloader nicht möglich da bootloader nicht vorhanden" -#: ports/atmel-samd/common-hal/busio/I2C.c:78 -#: ports/atmel-samd/common-hal/busio/SPI.c:171 -#: ports/atmel-samd/common-hal/busio/UART.c:120 -#: ports/atmel-samd/common-hal/i2cslave/I2CSlave.c:45 -#: ports/nrf/common-hal/busio/I2C.c:82 -msgid "Invalid pins" -msgstr "Ungültige Pins" +#: ports/esp8266/modnetwork.c +msgid "Cannot set STA config" +msgstr "Kann STA Konfiguration nicht setzen" -#: ports/atmel-samd/common-hal/busio/I2C.c:101 -msgid "SDA or SCL needs a pull up" -msgstr "SDA oder SCL brauchen pull up" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Cannot set value when direction is input." +msgstr "Der Wert kann nicht gesetzt werden, wenn die Richtung input ist." -#: ports/atmel-samd/common-hal/busio/I2C.c:121 -msgid "Unsupported baudrate" -msgstr "Baudrate wird nicht unterstützt" +#: py/objslice.c +msgid "Cannot subclass slice" +msgstr "" -#: ports/atmel-samd/common-hal/busio/UART.c:67 -msgid "bytes > 8 bits not supported" -msgstr "bytes mit merh als 8 bits werden nicht unterstützt" +#: shared-module/bitbangio/SPI.c +msgid "Cannot transfer without MOSI and MISO pins." +msgstr "Übertragung ohne MOSI- und MISO-Pins nicht möglich." -#: ports/atmel-samd/common-hal/busio/UART.c:73 -#: ports/nrf/common-hal/busio/UART.c:106 -msgid "tx and rx cannot both be None" -msgstr "tx und rx können nicht beide None sein" +#: extmod/moductypes.c +msgid "Cannot unambiguously get sizeof scalar" +msgstr "sizeof scalar kann nicht eindeutig bestimmt werden" -#: ports/atmel-samd/common-hal/busio/UART.c:146 -#: ports/nrf/common-hal/busio/UART.c:140 -msgid "Failed to allocate RX buffer" -msgstr "Konnte keinen RX Buffer allozieren" +#: ports/esp8266/modnetwork.c +msgid "Cannot update i/f status" +msgstr "Kann i/f Status nicht updaten" -#: ports/atmel-samd/common-hal/busio/UART.c:154 -msgid "Could not initialize UART" -msgstr "Konnte UART nicht initialisieren" +#: shared-module/bitbangio/SPI.c +msgid "Cannot write without MOSI pin." +msgstr "Kann nicht ohne MOSI-Pin schreiben." -#: ports/atmel-samd/common-hal/busio/UART.c:241 -#: ports/nrf/common-hal/busio/UART.c:185 -msgid "No RX pin" -msgstr "Kein RX Pin" +#: shared-bindings/bleio/Service.c +msgid "Characteristic UUID doesn't match Service UUID" +msgstr "Characteristic UUID stimmt nicht mit der Service-UUID überein" -#: ports/atmel-samd/common-hal/busio/UART.c:300 -#: ports/nrf/common-hal/busio/UART.c:220 -msgid "No TX pin" -msgstr "Kein TX Pin" +#: ports/nrf/common-hal/bleio/Service.c +msgid "Characteristic already in use by another Service." +msgstr "Characteristic wird bereits von einem anderen Dienst verwendet." -#: ports/atmel-samd/common-hal/digitalio/DigitalInOut.c:170 -#: ports/nrf/common-hal/digitalio/DigitalInOut.c:147 -msgid "Cannot get pull while in output mode" -msgstr "Pull up im Ausgabemodus nicht möglich" +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "CharacteristicBuffer writing not provided" +msgstr "Schreiben von CharacteristicBuffer ist nicht vorgesehen" -#: ports/atmel-samd/common-hal/microcontroller/__init__.c:74 -#: ports/esp8266/common-hal/microcontroller/__init__.c:64 -msgid "Cannot reset into bootloader because no bootloader is present." -msgstr "Reset zum bootloader nicht möglich da bootloader nicht vorhanden" +#: shared-module/bitbangio/SPI.c +msgid "Clock pin init failed." +msgstr "Clock pin init fehlgeschlagen." -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:120 -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:369 -#: ports/nrf/common-hal/pulseio/PWMOut.c:119 -#: ports/nrf/common-hal/pulseio/PWMOut.c:233 -msgid "Invalid PWM frequency" -msgstr "Ungültige PWM Frequenz" +#: shared-module/bitbangio/I2C.c +msgid "Clock stretch too long" +msgstr "Clock stretch zu lang" -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:187 -msgid "All timers for this pin are in use" -msgstr "Alle timer für diesen Pin werden benutzt" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Clock unit in use" +msgstr "Clock unit wird benutzt" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:110 -msgid "No hardware support on pin" -msgstr "Keine Hardwareunterstützung an diesem Pin" +#: shared-bindings/_pew/PewPew.c +msgid "Column entry must be digitalio.DigitalInOut" +msgstr "" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:113 -msgid "EXTINT channel already in use" -msgstr "EXTINT Kanal wird benutzt" +#: shared-bindings/displayio/FourWire.c shared-bindings/displayio/ParallelBus.c +msgid "Command must be an int between 0 and 255" +msgstr "Der Befehl muss ein int zwischen 0 und 255 sein" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:118 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:86 +#: ports/nrf/common-hal/bleio/UUID.c #, c-format -msgid "Failed to allocate RX buffer of %d bytes" -msgstr "Konnte keine RX Buffer mit %d allozieren" +msgid "Could not decode ble_uuid, err 0x%04x" +msgstr "Konnte ble_uuid nicht decodieren. Status: 0x%04x" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:205 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:151 -msgid "pop from an empty PulseIn" -msgstr "pop von einem leeren PulseIn" +#: ports/atmel-samd/common-hal/busio/UART.c +msgid "Could not initialize UART" +msgstr "Konnte UART nicht initialisieren" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:237 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:422 -msgid "index out of range" -msgstr "index außerhalb der Reichweite" +#: shared-module/audioio/Mixer.c shared-module/audioio/WaveFile.c +msgid "Couldn't allocate first buffer" +msgstr "Konnte first buffer nicht zuteilen" -#: ports/atmel-samd/common-hal/pulseio/PulseOut.c:178 -msgid "Another send is already active" -msgstr "Ein anderer Sendevorgang ist schon aktiv" +#: shared-module/audioio/Mixer.c shared-module/audioio/WaveFile.c +msgid "Couldn't allocate second buffer" +msgstr "Konnte second buffer nicht zuteilen" -#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c:38 -msgid "Both pins must support hardware interrupts" -msgstr "Beide pins müssen Hardware Interrupts unterstützen" +#: supervisor/shared/safe_mode.c +msgid "Crash into the HardFault_Handler.\n" +msgstr "Absturz in HardFault_Handler.\n" -#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c:46 -msgid "A hardware interrupt channel is already in use" -msgstr "Ein Hardware Interrupt Kanal wird schon benutzt" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "DAC already in use" +msgstr "DAC wird schon benutzt" -#: ports/atmel-samd/common-hal/rtc/RTC.c:101 -msgid "calibration value out of range +/-127" -msgstr "Kalibrierwert nicht im Bereich von +/-127" +#: ports/atmel-samd/common-hal/displayio/ParallelBus.c +#: ports/nrf/common-hal/displayio/ParallelBus.c +msgid "Data 0 pin must be byte aligned" +msgstr "Data 0 pin muss am Byte ausgerichtet sein" -#: ports/atmel-samd/common-hal/touchio/TouchIn.c:75 -msgid "No free GCLKs" -msgstr "Keine freien GCLKs" +#: shared-module/audioio/WaveFile.c +msgid "Data chunk must follow fmt chunk" +msgstr "" -#: ports/esp8266/common-hal/analogio/AnalogIn.c:43 -msgid "Pin %q does not have ADC capabilities" -msgstr "Pin %q hat keine ADC Funktion" +#: ports/nrf/common-hal/bleio/Broadcaster.c +#: ports/nrf/common-hal/bleio/Peripheral.c +msgid "Data too large for advertisement packet" +msgstr "Zu vielen Daten für das advertisement packet" -#: ports/esp8266/common-hal/analogio/AnalogOut.c:39 -msgid "No hardware support for analog out." -msgstr "Keine Hardwareunterstützung für analog out" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Data too large for the advertisement packet" +msgstr "Daten sind zu groß für das advertisement packet" -#: ports/esp8266/common-hal/busio/SPI.c:72 -msgid "Pins not valid for SPI" -msgstr "Pins nicht gültig für SPI" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Destination capacity is smaller than destination_length." +msgstr "Die Zielkapazität ist kleiner als destination_length." -#: ports/esp8266/common-hal/busio/UART.c:45 -msgid "Only tx supported on UART1 (GPIO2)." -msgstr "UART1 (GPIO2) unterstützt nur tx" +#: shared-bindings/displayio/Display.c +msgid "Display rotation must be in 90 degree increments" +msgstr "Die Rotation der Anzeige muss in 90-Grad-Schritten erfolgen" -#: ports/esp8266/common-hal/busio/UART.c:67 ports/esp8266/machine_uart.c:108 -msgid "invalid data bits" -msgstr "Ungültige Datenbits" +#: ports/unix/modffi.c +msgid "Don't know how to pass object to native function" +msgstr "" +"Ich weiß nicht, wie man das Objekt an die native Funktion übergeben kann" -#: ports/esp8266/common-hal/busio/UART.c:91 ports/esp8266/machine_uart.c:144 -msgid "invalid stop bits" -msgstr "Ungültige Stopbits" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Drive mode not used when direction is input." +msgstr "Drive mode wird nicht verwendet, wenn die Richtung input ist." -#: ports/esp8266/common-hal/digitalio/DigitalInOut.c:200 +#: ports/esp8266/common-hal/microcontroller/__init__.c +msgid "ESP8226 does not support safe mode." +msgstr "ESP8226 hat keinen Sicherheitsmodus" + +#: ports/esp8266/common-hal/digitalio/DigitalInOut.c msgid "ESP8266 does not support pull down." msgstr "ESP8266 unterstützt pull down nicht" -#: ports/esp8266/common-hal/digitalio/DigitalInOut.c:210 -msgid "GPIO16 does not support pull up." -msgstr "GPIO16 unterstützt pull up nicht" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +msgid "EXTINT channel already in use" +msgstr "EXTINT Kanal ist schon in Benutzung" -#: ports/esp8266/common-hal/microcontroller/__init__.c:66 -msgid "ESP8226 does not support safe mode." -msgstr "ESP8226 hat keinen Sicherheitsmodus" +#: ports/unix/modffi.c +msgid "Error in ffi_prep_cif" +msgstr "Fehler in ffi_prep_cif" -#: ports/esp8266/common-hal/pulseio/PWMOut.c:54 -#: ports/esp8266/common-hal/pulseio/PWMOut.c:113 -#, c-format -msgid "Maximum PWM frequency is %dhz." -msgstr "Maximale PWM Frequenz ist %dHz" +#: extmod/modure.c +msgid "Error in regex" +msgstr "Fehler in regex" -#: ports/esp8266/common-hal/pulseio/PWMOut.c:57 -#: ports/esp8266/common-hal/pulseio/PWMOut.c:116 -msgid "Minimum PWM frequency is 1hz." -msgstr "Minimale PWM Frequenz ist %dHz" +#: shared-bindings/pulseio/PulseOut.c shared-bindings/neopixel_write/__init__.c +#: shared-bindings/terminalio/Terminal.c shared-bindings/microcontroller/Pin.c +msgid "Expected a %q" +msgstr "Erwartet ein(e) %q" + +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "Expected a Characteristic" +msgstr "Characteristic wird erwartet" + +#: shared-bindings/bleio/Descriptor.c shared-bindings/bleio/Service.c +#: shared-bindings/bleio/Characteristic.c +msgid "Expected a UUID" +msgstr "Eine UUID wird erwartet" -#: ports/esp8266/common-hal/pulseio/PWMOut.c:68 +#: shared-module/_pixelbuf/PixelBuf.c #, c-format -msgid "Multiple PWM frequencies not supported. PWM already set to %dhz." -msgstr "" -"Mehrere PWM Frequenzen nicht unterstützt. PWM bereits auf %dHz gesetzt." +msgid "Expected tuple of length %d, got %d" +msgstr "Habe ein Tupel der Länge %d erwartet aber %d erhalten" + +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to acquire mutex" +msgstr "Akquirieren des Mutex gescheitert" -#: ports/esp8266/common-hal/pulseio/PWMOut.c:77 ports/esp8266/machine_pwm.c:70 +#: ports/nrf/common-hal/bleio/Characteristic.c ports/nrf/sd_mutex.c #, c-format -msgid "PWM not supported on pin %d" -msgstr "PWM nicht unterstützt an Pin %d" +msgid "Failed to acquire mutex, err 0x%04x" +msgstr "Mutex konnte nicht akquiriert werden. Status: 0x%04x" -#: ports/esp8266/common-hal/pulseio/PulseIn.c:78 -msgid "No PulseIn support for %q" -msgstr "Keine PulseIn Unterstützung für %q" +#: ports/nrf/common-hal/bleio/Service.c +#, c-format +msgid "Failed to add characteristic, err 0x%04x" +msgstr "Hinzufügen des Characteristic ist gescheitert. Status: 0x%04x" -#: ports/esp8266/common-hal/storage/__init__.c:34 -msgid "Unable to remount filesystem" -msgstr "Dateisystem kann nicht wieder gemounted werden." +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to add service" +msgstr "Dienst konnte nicht hinzugefügt werden" -#: ports/esp8266/common-hal/storage/__init__.c:38 -msgid "Use esptool to erase flash and re-upload Python instead" -msgstr "" -"Benutze esptool um den flash zu löschen und stattdessen Python hochzuladen" +#: ports/nrf/common-hal/bleio/Peripheral.c +#, c-format +msgid "Failed to add service, err 0x%04x" +msgstr "Dienst konnte nicht hinzugefügt werden. Status: 0x%04x" -#: ports/esp8266/esp_mphal.c:154 -msgid "C-level assert" -msgstr "" +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "Failed to allocate RX buffer" +msgstr "Konnte keinen RX Buffer allozieren" -#: ports/esp8266/machine_adc.c:57 +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +#: ports/nrf/common-hal/pulseio/PulseIn.c +#: ports/esp8266/common-hal/pulseio/PulseIn.c #, c-format -msgid "not a valid ADC Channel: %d" -msgstr "Kein gültiger ADC Kanal: %d" +msgid "Failed to allocate RX buffer of %d bytes" +msgstr "Konnte keine RX Buffer mit %d allozieren" -#: ports/esp8266/machine_hspi.c:131 ports/esp8266/machine_hspi.c:137 -msgid "impossible baudrate" -msgstr "Unmögliche Baudrate" +#: ports/nrf/common-hal/bleio/Adapter.c +msgid "Failed to change softdevice state" +msgstr "Fehler beim Ändern des Softdevice-Status" -#: ports/esp8266/machine_pin.c:129 -msgid "expecting a pin" -msgstr "Ein Pin wird erwartet" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to connect:" +msgstr "Verbindung fehlgeschlagen:" -#: ports/esp8266/machine_pin.c:284 -msgid "Pin(16) doesn't support pull" -msgstr "Pin(16) unterstützt kein pull" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to continue scanning" +msgstr "Der Scanvorgang kann nicht fortgesetzt werden" -#: ports/esp8266/machine_pin.c:323 -msgid "invalid pin" -msgstr "Ungültiger Pin" +#: ports/nrf/common-hal/bleio/Scanner.c +#, c-format +msgid "Failed to continue scanning, err 0x%04x" +msgstr "Der Scanvorgang kann nicht fortgesetzt werden. Status: 0x%04x" -#: ports/esp8266/machine_pin.c:389 -msgid "pin does not have IRQ capabilities" -msgstr "Pin hat keine IRQ Fähigkeiten" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to create mutex" +msgstr "Erstellen des Mutex ist fehlgeschlagen" -#: ports/esp8266/machine_rtc.c:185 -msgid "buffer too long" -msgstr "Buffer zu lang" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to discover services" +msgstr "Es konnten keine Dienste gefunden werden" -#: ports/esp8266/machine_rtc.c:209 ports/esp8266/machine_rtc.c:223 -#: ports/esp8266/machine_rtc.c:246 -msgid "invalid alarm" -msgstr "Ungültiger Alarm" +#: ports/nrf/common-hal/bleio/Adapter.c +msgid "Failed to get local address" +msgstr "Lokale Adresse konnte nicht abgerufen werden" -#: ports/esp8266/machine_uart.c:169 -#, c-format -msgid "UART(%d) does not exist" -msgstr "UART(%d) existiert nicht" +#: ports/nrf/common-hal/bleio/Adapter.c +msgid "Failed to get softdevice state" +msgstr "Fehler beim Abrufen des Softdevice-Status" -#: ports/esp8266/machine_uart.c:219 -msgid "UART(1) can't read" -msgstr "UART(1) kann nicht lesen" +#: ports/nrf/common-hal/bleio/Characteristic.c +#, c-format +msgid "Failed to notify or indicate attribute value, err 0x%04x" +msgstr "" -#: ports/esp8266/modesp.c:119 -msgid "len must be multiple of 4" -msgstr "len muss ein vielfaches von 4 sein" +#: ports/nrf/common-hal/bleio/Characteristic.c +#, c-format +msgid "Failed to read CCCD value, err 0x%04x" +msgstr "Kann CCCD value nicht lesen. Status: 0x%04x" -#: ports/esp8266/modesp.c:274 +#: ports/nrf/common-hal/bleio/Characteristic.c #, c-format -msgid "memory allocation failed, allocating %u bytes for native code" +msgid "Failed to read attribute value, err 0x%04x" msgstr "" -"Speicherallozierung fehlgeschlagen, alloziere %u Bytes für nativen Code" -#: ports/esp8266/modesp.c:317 -msgid "flash location must be below 1MByte" -msgstr "flash location muss unter 1MByte sein" +#: ports/nrf/common-hal/bleio/Characteristic.c +#, c-format +msgid "Failed to read gatts value, err 0x%04x" +msgstr "gatts value konnte nicht gelesen werden. Status: 0x%04x" -#: ports/esp8266/modmachine.c:63 -msgid "frequency can only be either 80Mhz or 160MHz" -msgstr "Die Frequenz kann nur 80Mhz oder 160Mhz sein" +#: ports/nrf/common-hal/bleio/UUID.c +#, c-format +msgid "Failed to register Vendor-Specific UUID, err 0x%04x" +msgstr "Kann keine herstellerspezifische UUID hinzufügen. Status: 0x%04x" -#: ports/esp8266/modnetwork.c:61 -msgid "AP required" -msgstr "AP erforderlich" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to release mutex" +msgstr "Loslassen des Mutex gescheitert" -#: ports/esp8266/modnetwork.c:61 -msgid "STA required" -msgstr "STA erforderlich" +#: ports/nrf/common-hal/bleio/Characteristic.c ports/nrf/sd_mutex.c +#, c-format +msgid "Failed to release mutex, err 0x%04x" +msgstr "Mutex konnte nicht freigegeben werden. Status: 0x%04x" -#: ports/esp8266/modnetwork.c:87 -msgid "Cannot update i/f status" -msgstr "Kann i/f Status nicht updaten" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to start advertising" +msgstr "Kann advertisement nicht starten" -#: ports/esp8266/modnetwork.c:142 -msgid "Cannot set STA config" -msgstr "Kann STA Konfiguration nicht setzen" +#: ports/nrf/common-hal/bleio/Broadcaster.c +#: ports/nrf/common-hal/bleio/Peripheral.c +#, c-format +msgid "Failed to start advertising, err 0x%04x" +msgstr "Kann advertisement nicht starten. Status: 0x%04x" -#: ports/esp8266/modnetwork.c:144 -msgid "Cannot connect to AP" -msgstr "Kann nicht zu AP verbinden" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to start scanning" +msgstr "Der Scanvorgang kann nicht gestartet werden" -#: ports/esp8266/modnetwork.c:152 -msgid "Cannot disconnect from AP" -msgstr "Kann nicht trennen von AP" +#: ports/nrf/common-hal/bleio/Scanner.c +#, c-format +msgid "Failed to start scanning, err 0x%04x" +msgstr "Der Scanvorgang kann nicht gestartet werden. Status: 0x%04x" -#: ports/esp8266/modnetwork.c:173 -msgid "unknown status param" -msgstr "Unbekannter Statusparameter" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to stop advertising" +msgstr "Kann advertisement nicht stoppen" -#: ports/esp8266/modnetwork.c:222 -msgid "STA must be active" -msgstr "STA muss aktiv sein" +#: ports/nrf/common-hal/bleio/Broadcaster.c +#: ports/nrf/common-hal/bleio/Peripheral.c +#, c-format +msgid "Failed to stop advertising, err 0x%04x" +msgstr "Kann advertisement nicht stoppen. Status: 0x%04x" -#: ports/esp8266/modnetwork.c:239 -msgid "scan failed" -msgstr "Scan fehlgeschlagen" +#: ports/nrf/common-hal/bleio/Characteristic.c +#, c-format +msgid "Failed to write attribute value, err 0x%04x" +msgstr "Kann den Attributwert nicht schreiben. Status: 0x%04x" -#: ports/esp8266/modnetwork.c:306 -msgid "wifi_set_ip_info() failed" -msgstr "wifi_set_ip_info() fehlgeschlagen" +#: ports/nrf/common-hal/bleio/Characteristic.c +#, c-format +msgid "Failed to write gatts value, err 0x%04x" +msgstr "gatts value konnte nicht geschrieben werden. Status: 0x%04x" -#: ports/esp8266/modnetwork.c:319 -msgid "either pos or kw args are allowed" -msgstr "" +#: py/moduerrno.c +msgid "File exists" +msgstr "Datei existiert" -#: ports/esp8266/modnetwork.c:329 -msgid "can't get STA config" +#: ports/nrf/supervisor/internal_flash.c +msgid "Flash erase failed" msgstr "" -#: ports/esp8266/modnetwork.c:331 -msgid "can't get AP config" +#: ports/nrf/supervisor/internal_flash.c +#, c-format +msgid "Flash erase failed to start, err 0x%04x" msgstr "" -#: ports/esp8266/modnetwork.c:346 -msgid "invalid buffer length" +#: ports/nrf/supervisor/internal_flash.c +msgid "Flash write failed" msgstr "" -#: ports/esp8266/modnetwork.c:405 -msgid "can't set STA config" +#: ports/nrf/supervisor/internal_flash.c +#, c-format +msgid "Flash write failed to start, err 0x%04x" msgstr "" -#: ports/esp8266/modnetwork.c:407 -msgid "can't set AP config" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +msgid "Frequency captured is above capability. Capture Paused." msgstr "" -#: ports/esp8266/modnetwork.c:416 -msgid "can query only one param" -msgstr "" +#: shared-bindings/bitbangio/SPI.c shared-bindings/bitbangio/I2C.c +#: shared-bindings/busio/SPI.c shared-bindings/busio/I2C.c +msgid "Function requires lock" +msgstr "Die Funktion erwartet, dass der 'lock'-Befehl zuvor ausgeführt wurde" -#: ports/esp8266/modnetwork.c:469 -msgid "unknown config param" -msgstr "" +#: ports/esp8266/common-hal/digitalio/DigitalInOut.c +msgid "GPIO16 does not support pull up." +msgstr "GPIO16 unterstützt pull up nicht" -#: ports/nrf/common-hal/analogio/AnalogOut.c:37 -msgid "AnalogOut functionality not supported" -msgstr "" +#: shared-module/displayio/Group.c +msgid "Group full" +msgstr "Gruppe voll" -#: ports/nrf/common-hal/bleio/Adapter.c:41 -#, c-format -msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX" -msgstr "" +#: ports/unix/file.c extmod/vfs_posix_file.c py/objstringio.c +msgid "I/O operation on closed file" +msgstr "Lese/Schreibe-operation an geschlossener Datei" -#: ports/nrf/common-hal/bleio/Adapter.c:125 -#, c-format -msgid "Failed to change softdevice state, error: 0x%08lX" -msgstr "" +#: extmod/machine_i2c.c +msgid "I2C operation not supported" +msgstr "I2C-operation nicht unterstützt" -#: ports/nrf/common-hal/bleio/Adapter.c:135 -#, c-format -msgid "Failed to get softdevice state, error: 0x%08lX" +#: py/persistentcode.c +msgid "" +"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/" +"mpy-update for more info." msgstr "" +"Inkompatible mpy-Datei. Bitte aktualisieren Sie alle mpy-Dateien. Siehe " +"http://adafru.it/mpy-update für weitere Informationen." -#: ports/nrf/common-hal/bleio/Adapter.c:155 -#, c-format -msgid "Failed to get local address, error: 0x%08lX" +#: shared-bindings/_pew/PewPew.c +msgid "Incorrect buffer size" msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:52 -#, fuzzy, c-format -msgid "Failed to write gatts value, status: 0x%08lX" -msgstr "Kann den Attributwert nicht schreiben. Status: 0x%02x" +#: py/moduerrno.c +msgid "Input/output error" +msgstr "Eingabe-/Ausgabefehler" -#: ports/nrf/common-hal/bleio/Characteristic.c:76 -#, fuzzy, c-format -msgid "Failed to notify attribute value, status: 0x%08lX" -msgstr "Kann den Attributwert nicht mitteilen. Status: 0x%02x" +#: shared-module/displayio/OnDiskBitmap.c +msgid "Invalid BMP file" +msgstr "Ungültige BMP-Datei" -#: ports/nrf/common-hal/bleio/Characteristic.c:91 -#, fuzzy, c-format -msgid "Failed to read attribute value, status: 0x%08lX" -msgstr "Kann den Attributwert nicht lesen. Status: 0x%02x" +#: ports/atmel-samd/common-hal/pulseio/PWMOut.c +#: ports/nrf/common-hal/pulseio/PWMOut.c shared-bindings/pulseio/PWMOut.c +msgid "Invalid PWM frequency" +msgstr "Ungültige PWM Frequenz" -#: ports/nrf/common-hal/bleio/Characteristic.c:119 -#: ports/nrf/common-hal/bleio/Device.c:272 -#: ports/nrf/common-hal/bleio/Device.c:307 -#, c-format -msgid "Failed to acquire mutex, status: 0x%08lX" -msgstr "" +#: py/moduerrno.c +msgid "Invalid argument" +msgstr "Ungültiges Argument" -#: ports/nrf/common-hal/bleio/Characteristic.c:126 -#, fuzzy, c-format -msgid "Failed to write attribute value, status: 0x%08lX" -msgstr "Kann den Attributwert nicht schreiben. Status: 0x%02x" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Invalid bit clock pin" +msgstr "Ungültiges bit clock pin" -#: ports/nrf/common-hal/bleio/Characteristic.c:138 -#: ports/nrf/common-hal/bleio/Device.c:284 -#: ports/nrf/common-hal/bleio/Device.c:319 -#: ports/nrf/common-hal/bleio/Device.c:354 -#: ports/nrf/common-hal/bleio/Device.c:391 -#, c-format -msgid "Failed to release mutex, status: 0x%08lX" +#: ports/nrf/common-hal/busio/UART.c +msgid "Invalid buffer size" +msgstr "Ungültige Puffergröße" + +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +msgid "Invalid capture period. Valid range: 1 - 500" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:81 -#: ports/nrf/common-hal/bleio/Device.c:114 -#, fuzzy -msgid "Can not fit data into the advertisment packet" -msgstr "Daten können nicht in das advertisement packet eingefügt werden." +#: shared-bindings/audioio/Mixer.c +msgid "Invalid channel count" +msgstr "Ungültige Anzahl von Kanälen" -#: ports/nrf/common-hal/bleio/Device.c:266 -#, c-format -msgid "Failed to discover serivices, status: 0x%08lX" -msgstr "" +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Invalid clock pin" +msgstr "Ungültiger clock pin" -#: ports/nrf/common-hal/bleio/Device.c:403 -#: ports/nrf/common-hal/bleio/Scanner.c:76 -#, fuzzy, c-format -msgid "Failed to continue scanning, status: 0x%0xlX" -msgstr "Der Scanvorgang kann nicht gestartet werden. Status: 0x%02x" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Invalid data pin" +msgstr "Ungültiger data pin" -#: ports/nrf/common-hal/bleio/Device.c:436 -#, fuzzy, c-format -msgid "Failed to connect, status: 0x%08lX" -msgstr "Kann nicht verbinden. Status: 0x%02x" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Invalid direction." +msgstr "Ungültige Richtung" -#: ports/nrf/common-hal/bleio/Device.c:513 -#, fuzzy, c-format -msgid "Failed to add service, status: 0x%08lX" -msgstr "Kann advertisement nicht stoppen. Status: 0x%02x" +#: shared-module/audioio/WaveFile.c +msgid "Invalid file" +msgstr "Ungültige Datei" -#: ports/nrf/common-hal/bleio/Device.c:531 -#, fuzzy, c-format -msgid "Failed to start advertisment, status: 0x%08lX" -msgstr "Kann advertisement nicht starten. Status: 0x%02x" +#: shared-module/audioio/WaveFile.c +msgid "Invalid format chunk size" +msgstr "Ungültige format chunk size" -#: ports/nrf/common-hal/bleio/Device.c:549 -#, fuzzy, c-format -msgid "Failed to stop advertisment, status: 0x%08lX" -msgstr "Kann advertisement nicht stoppen. Status: 0x%02x" +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "Invalid number of bits" +msgstr "Ungültige Anzahl von Bits" -#: ports/nrf/common-hal/bleio/Device.c:575 -#: ports/nrf/common-hal/bleio/Scanner.c:103 -#, fuzzy, c-format -msgid "Failed to start scanning, status: 0x%0xlX" -msgstr "Der Scanvorgang kann nicht gestartet werden. Status: 0x%02x" +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "Invalid phase" +msgstr "Ungültige Phase" -#: ports/nrf/common-hal/bleio/Device.c:592 -#, fuzzy, c-format -msgid "Failed to create mutex, status: 0x%0xlX" -msgstr "Kann den Attributwert nicht lesen. Status: 0x%02x" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: ports/atmel-samd/common-hal/touchio/TouchIn.c +#: shared-bindings/pulseio/PWMOut.c +msgid "Invalid pin" +msgstr "Ungültiger Pin" -#: ports/nrf/common-hal/bleio/Service.c:83 -#, c-format -msgid "Failed to add characteristic, status: 0x%08lX" -msgstr "" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Invalid pin for left channel" +msgstr "Ungültiger Pin für linken Kanal" -#: ports/nrf/common-hal/bleio/UUID.c:97 -#, fuzzy, c-format -msgid "Failed to add Vendor Specific UUID, status: 0x%08lX" -msgstr "Kann keine herstellerspezifische 128-Bit-UUID hinzufügen." +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Invalid pin for right channel" +msgstr "Ungültiger Pin für rechten Kanal" + +#: ports/atmel-samd/common-hal/i2cslave/I2CSlave.c +#: ports/atmel-samd/common-hal/busio/UART.c +#: ports/atmel-samd/common-hal/busio/SPI.c +#: ports/atmel-samd/common-hal/busio/I2C.c ports/nrf/common-hal/busio/I2C.c +msgid "Invalid pins" +msgstr "Ungültige Pins" -#: ports/nrf/common-hal/bleio/UUID.c:102 -msgid "Invalid UUID string length" -msgstr "Ungültige UUID-Stringlänge" +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "Invalid polarity" +msgstr "Ungültige Polarität" -#: ports/nrf/common-hal/bleio/UUID.c:109 -#: shared-bindings/bleio/Characteristic.c:125 -#: shared-bindings/bleio/Service.c:105 -msgid "Invalid UUID parameter" -msgstr "Ungültiger UUID-Parameter" +#: shared-bindings/microcontroller/__init__.c +msgid "Invalid run mode." +msgstr "Ungültiger Ausführungsmodus" -#: ports/nrf/common-hal/busio/I2C.c:96 -#, fuzzy -msgid "All I2C peripherals are in use" -msgstr "Alle timer werden benutzt" +#: shared-bindings/audioio/Mixer.c +msgid "Invalid voice count" +msgstr "Ungültige Anzahl von Stimmen" -#: ports/nrf/common-hal/busio/SPI.c:133 -#, fuzzy -msgid "All SPI peripherals are in use" -msgstr "Alle timer werden benutzt" +#: shared-module/audioio/WaveFile.c +msgid "Invalid wave file" +msgstr "Ungültige wave Datei" -#: ports/nrf/common-hal/busio/UART.c:49 -#, c-format -msgid "error = 0x%08lX" -msgstr "" +#: py/compile.c +msgid "LHS of keyword arg must be an id" +msgstr "LHS des Schlüsselwortarguments muss eine id sein" -#: ports/nrf/common-hal/busio/UART.c:110 -#, fuzzy -msgid "Invalid buffer size" -msgstr "ungültiger dupterm index" +#: shared-module/displayio/Group.c +msgid "Layer must be a Group or TileGrid subclass." +msgstr "Layer muss eine Group- oder TileGrid-Unterklasse sein." -#: ports/nrf/common-hal/busio/UART.c:114 -#, fuzzy -msgid "Odd parity is not supported" -msgstr "bytes mit merh als 8 bits werden nicht unterstützt" +#: py/objslice.c +msgid "Length must be an int" +msgstr "Länge muss ein int sein" -#: ports/nrf/common-hal/busio/UART.c:346 ports/nrf/common-hal/busio/UART.c:350 -#: ports/nrf/common-hal/busio/UART.c:355 ports/nrf/common-hal/busio/UART.c:360 -#: ports/nrf/common-hal/busio/UART.c:366 ports/nrf/common-hal/busio/UART.c:371 -#: ports/nrf/common-hal/busio/UART.c:376 ports/nrf/common-hal/busio/UART.c:380 -#: ports/nrf/common-hal/busio/UART.c:388 -msgid "busio.UART not available" -msgstr "" +#: py/objslice.c +msgid "Length must be non-negative" +msgstr "Länge darf nicht negativ sein" -#: ports/nrf/common-hal/microcontroller/Processor.c:49 -#, c-format -msgid "Can not get temperature. status: 0x%02x" +#: supervisor/shared/safe_mode.c +msgid "" +"Looks like our core CircuitPython code crashed hard. Whoops!\n" +"Please file an issue at https://github.com/adafruit/circuitpython/issues\n" +" with the contents of your CIRCUITPY drive and this message:\n" msgstr "" +"Sieht aus, als wäre der CircuitPython-Kernel-Code abgestürzt. Uups!\n" +"Bitte melde das Problem unter https://github.com/adafruit/circuitpython/" +"issues\n" +"mit dem Inhalt deines CIRCUITPY-Laufwerks und dieser Nachricht:\n" -#: ports/nrf/common-hal/pulseio/PWMOut.c:161 -#, fuzzy -msgid "All PWM peripherals are in use" -msgstr "Alle timer werden benutzt" +#: shared-module/bitbangio/SPI.c +msgid "MISO pin init failed." +msgstr "MISO pin Initialisierung fehlgeschlagen" -#: ports/unix/modffi.c:138 -msgid "Unknown type" -msgstr "Unbekannter Typ" +#: shared-module/bitbangio/SPI.c +msgid "MOSI pin init failed." +msgstr "MOSI pin Initialisierung fehlgeschlagen" -#: ports/unix/modffi.c:207 ports/unix/modffi.c:265 -msgid "Error in ffi_prep_cif" -msgstr "Fehler in ffi_prep_cif" +#: ports/esp8266/common-hal/pulseio/PWMOut.c +#, c-format +msgid "Maximum PWM frequency is %dhz." +msgstr "Maximale PWM Frequenz ist %dHz" -#: ports/unix/modffi.c:270 -msgid "ffi_prep_closure_loc" -msgstr "" +#: shared-module/displayio/Shape.c +#, c-format +msgid "Maximum x value when mirrored is %d" +msgstr "Maximaler x-Wert beim Spiegeln ist %d" -#: ports/unix/modffi.c:413 -msgid "Don't know how to pass object to native function" +#: supervisor/shared/safe_mode.c +msgid "MicroPython NLR jump failed. Likely memory corruption.\n" msgstr "" +"MicroPython-NLR-Sprung ist fehlgeschlagen. Wahrscheinlich " +"Speicherbeschädigung.\n" -#: ports/unix/modusocket.c:474 -#, c-format -msgid "[addrinfo error %d]" -msgstr "" +#: supervisor/shared/safe_mode.c +msgid "MicroPython fatal error.\n" +msgstr "Schwerwiegender MicroPython-Fehler\n" -#: py/argcheck.c:44 -msgid "function does not take keyword arguments" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Microphone startup delay must be in range 0.0 to 1.0" msgstr "" +"Die Startverzögerung des Mikrofons muss im Bereich von 0,0 bis 1,0 liegen" -#: py/argcheck.c:54 py/bc.c:85 py/objnamedtuple.c:104 -#, c-format -msgid "function takes %d positional arguments but %d were given" -msgstr "" +#: ports/esp8266/common-hal/pulseio/PWMOut.c +msgid "Minimum PWM frequency is 1hz." +msgstr "Minimale PWM Frequenz ist %dHz" -#: py/argcheck.c:64 +#: ports/esp8266/common-hal/pulseio/PWMOut.c #, c-format -msgid "function missing %d required positional arguments" +msgid "Multiple PWM frequencies not supported. PWM already set to %dhz." msgstr "" +"Mehrere PWM Frequenzen werden nicht unterstützt. PWM wurde bereits auf %dHz " +"gesetzt." -#: py/argcheck.c:72 -#, c-format -msgid "function expected at most %d arguments, got %d" +#: shared-bindings/displayio/Display.c +msgid "Must be a Group subclass." msgstr "" -#: py/argcheck.c:97 -msgid "'%q' argument required" -msgstr "" +#: ports/atmel-samd/common-hal/analogio/AnalogOut.c +msgid "No DAC on chip" +msgstr "Kein DAC im Chip vorhanden" -#: py/argcheck.c:122 -msgid "extra positional arguments given" -msgstr "" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "No DMA channel found" +msgstr "Kein DMA Kanal gefunden" -#: py/argcheck.c:130 -msgid "extra keyword arguments given" -msgstr "" +#: ports/esp8266/common-hal/pulseio/PulseIn.c +msgid "No PulseIn support for %q" +msgstr "Keine PulseIn Unterstützung für %q" -#: py/argcheck.c:142 -msgid "argument num/types mismatch" -msgstr "" +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "No RX pin" +msgstr "Kein RX Pin" -#: py/argcheck.c:147 -msgid "keyword argument(s) not yet implemented - use normal args instead" -msgstr "" +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "No TX pin" +msgstr "Kein TX Pin" -#: py/bc.c:88 py/objnamedtuple.c:108 -msgid "%q() takes %d positional arguments but %d were given" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +msgid "No available clocks" msgstr "" -#: py/bc.c:197 py/bc.c:215 -msgid "unexpected keyword argument" -msgstr "" +#: supervisor/shared/board_busses.c +msgid "No default I2C bus" +msgstr "Kein Standard I2C Bus" -#: py/bc.c:199 -msgid "keywords must be strings" -msgstr "" +#: supervisor/shared/board_busses.c +msgid "No default SPI bus" +msgstr "Kein Standard SPI Bus" -#: py/bc.c:206 py/objnamedtuple.c:138 -msgid "function got multiple values for argument '%q'" -msgstr "" +#: supervisor/shared/board_busses.c +msgid "No default UART bus" +msgstr "Kein Standard UART Bus" -#: py/bc.c:218 py/objnamedtuple.c:130 -msgid "unexpected keyword argument '%q'" -msgstr "" +#: ports/atmel-samd/common-hal/touchio/TouchIn.c +msgid "No free GCLKs" +msgstr "Keine freien GCLKs" -#: py/bc.c:244 -#, c-format -msgid "function missing required positional argument #%d" -msgstr "" +#: shared-bindings/os/__init__.c +msgid "No hardware random available" +msgstr "Kein hardware random verfügbar" -#: py/bc.c:260 -msgid "function missing required keyword argument '%q'" -msgstr "" +#: ports/esp8266/common-hal/analogio/AnalogOut.c +msgid "No hardware support for analog out." +msgstr "Keine Hardwareunterstützung für analog out" -#: py/bc.c:269 -msgid "function missing keyword-only argument" -msgstr "" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +msgid "No hardware support on pin" +msgstr "Keine Hardwareunterstützung an diesem Pin" -#: py/binary.c:112 -msgid "bad typecode" -msgstr "" +#: py/moduerrno.c +msgid "No space left on device" +msgstr "Kein Speicherplatz auf Gerät" -#: py/builtinevex.c:99 -msgid "bad compile mode" +#: py/moduerrno.c +msgid "No such file/directory" +msgstr "Keine solche Datei/Verzeichnis" + +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "Not connected" +msgstr "Nicht verbunden" + +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "Not connected." +msgstr "Nicht verbunden." + +#: shared-bindings/audiobusio/I2SOut.c shared-bindings/audioio/AudioOut.c +msgid "Not playing" +msgstr "Spielt nicht" + +#: shared-bindings/util.c +msgid "" +"Object has been deinitialized and can no longer be used. Create a new object." msgstr "" +"Objekt wurde deinitialisiert und kann nicht mehr verwendet werden. Erstelle " +"ein neues Objekt." -#: py/builtinhelp.c:137 -#, fuzzy -msgid "Plus any modules on the filesystem\n" -msgstr "Dateisystem kann nicht wieder gemounted werden." +#: ports/nrf/common-hal/busio/UART.c +msgid "Odd parity is not supported" +msgstr "Eine ungerade Parität wird nicht unterstützt" + +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Only 8 or 16 bit mono with " +msgstr "Nur 8 oder 16 bit mono mit " -#: py/builtinhelp.c:183 +#: shared-module/displayio/OnDiskBitmap.c #, c-format msgid "" -"Welcome to Adafruit CircuitPython %s!\n" -"\n" -"Please visit learn.adafruit.com/category/circuitpython for project guides.\n" -"\n" -"To list built-in modules please do `help(\"modules\")`.\n" +"Only Windows format, uncompressed BMP supported: given header size is %d" msgstr "" -#: py/builtinimport.c:336 -msgid "cannot perform relative import" +#: shared-module/displayio/Bitmap.c +msgid "Only bit maps of 8 bit color or less are supported" msgstr "" +"Es werden nur Bitmaps mit einer Farbtiefe von 8 Bit oder weniger unterstützt" -#: py/builtinimport.c:420 py/builtinimport.c:532 -msgid "module not found" +#: shared-module/displayio/OnDiskBitmap.c +#, c-format +msgid "" +"Only monochrome, indexed 8bpp, and 16bpp or greater BMPs supported: %d bpp " +"given" msgstr "" -#: py/builtinimport.c:423 py/builtinimport.c:535 -msgid "no module named '%q'" +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "Only slices with step=1 (aka None) are supported" msgstr "" -#: py/builtinimport.c:510 -msgid "relative import" -msgstr "" +#: ports/esp8266/common-hal/busio/UART.c +msgid "Only tx supported on UART1 (GPIO2)." +msgstr "UART1 (GPIO2) unterstützt nur tx" -#: py/compile.c:397 py/compile.c:542 -msgid "can't assign to expression" -msgstr "" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Oversample must be multiple of 8." +msgstr "Oversample muss ein Vielfaches von 8 sein." -#: py/compile.c:416 -msgid "multiple *x in assignment" -msgstr "" +#: shared-bindings/pulseio/PWMOut.c +msgid "" +"PWM duty_cycle must be between 0 and 65535 inclusive (16 bit resolution)" +msgstr "PWM duty_cycle muss zwischen 0 und 65535 (16 Bit Auflösung) liegen" -#: py/compile.c:642 -msgid "non-default argument follows default argument" -msgstr "" +#: shared-bindings/pulseio/PWMOut.c +msgid "" +"PWM frequency not writable when variable_frequency is False on construction." +msgstr "Die PWM-Frequenz ist nicht schreibbar wenn variable_Frequenz = False." -#: py/compile.c:771 py/compile.c:789 -msgid "invalid micropython decorator" -msgstr "" +#: ports/esp8266/common-hal/pulseio/PWMOut.c ports/esp8266/machine_pwm.c +#, c-format +msgid "PWM not supported on pin %d" +msgstr "PWM nicht unterstützt an Pin %d" -#: py/compile.c:943 -msgid "can't delete expression" -msgstr "" +#: py/moduerrno.c +msgid "Permission denied" +msgstr "Zugang verweigert" -#: py/compile.c:955 -msgid "'break' outside loop" -msgstr "" +#: ports/esp8266/common-hal/analogio/AnalogIn.c +msgid "Pin %q does not have ADC capabilities" +msgstr "Pin %q hat keine ADC Funktion" -#: py/compile.c:958 -msgid "'continue' outside loop" -msgstr "" +#: ports/atmel-samd/common-hal/analogio/AnalogIn.c +#: ports/nrf/common-hal/analogio/AnalogIn.c +msgid "Pin does not have ADC capabilities" +msgstr "Pin hat keine ADC Funktionalität" -#: py/compile.c:969 -msgid "'return' outside function" -msgstr "" +#: ports/esp8266/machine_pin.c +msgid "Pin(16) doesn't support pull" +msgstr "Pin(16) unterstützt kein pull" -#: py/compile.c:1169 -msgid "identifier redefined as global" -msgstr "" +#: ports/esp8266/common-hal/busio/SPI.c +msgid "Pins not valid for SPI" +msgstr "Pins nicht gültig für SPI" -#: py/compile.c:1185 -msgid "no binding for nonlocal found" -msgstr "" +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "Pixel beyond bounds of buffer" +msgstr "Pixel außerhalb der Puffergrenzen" -#: py/compile.c:1188 -msgid "identifier redefined as nonlocal" -msgstr "" +#: py/builtinhelp.c +msgid "Plus any modules on the filesystem\n" +msgstr "und alle Module im Dateisystem \n" -#: py/compile.c:1197 -msgid "can't declare nonlocal in outer code" +#: main.c +msgid "Press any key to enter the REPL. Use CTRL-D to reload." msgstr "" +"Drücke eine Taste um dich mit der REPL zu verbinden. Drücke Strg-D zum neu " +"laden" -#: py/compile.c:1542 -msgid "default 'except' must be last" -msgstr "" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Pull not used when direction is output." +msgstr "Pull wird nicht verwendet, wenn die Richtung output ist." -#: py/compile.c:2095 -msgid "*x must be assignment target" -msgstr "" +#: shared-bindings/rtc/RTC.c +msgid "RTC calibration is not supported on this board" +msgstr "Die RTC-Kalibrierung wird auf diesem Board nicht unterstützt" -#: py/compile.c:2193 -msgid "super() can't find self" -msgstr "" +#: shared-bindings/rtc/RTC.c shared-bindings/time/__init__.c +msgid "RTC is not supported on this board" +msgstr "Eine RTC wird auf diesem Board nicht unterstützt" -#: py/compile.c:2256 -msgid "can't have multiple *x" +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "Range out of bounds" msgstr "" -#: py/compile.c:2263 -msgid "can't have multiple **x" -msgstr "" +#: shared-bindings/pulseio/PulseIn.c +msgid "Read-only" +msgstr "Nur lesen möglich, da Schreibgeschützt" -#: py/compile.c:2271 -msgid "LHS of keyword arg must be an id" -msgstr "" +#: extmod/vfs_fat.c py/moduerrno.c +msgid "Read-only filesystem" +msgstr "Schreibgeschützte Dateisystem" -#: py/compile.c:2287 -msgid "non-keyword arg after */**" -msgstr "" +#: shared-module/displayio/Bitmap.c +msgid "Read-only object" +msgstr "Schreibgeschützte Objekt" -#: py/compile.c:2291 -msgid "non-keyword arg after keyword arg" -msgstr "" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Right channel unsupported" +msgstr "Rechter Kanal wird nicht unterstützt" -#: py/compile.c:2463 py/compile.c:2473 py/compile.c:2712 py/compile.c:2742 -#: py/parse.c:1176 -msgid "invalid syntax" +#: shared-bindings/_pew/PewPew.c +msgid "Row entry must be digitalio.DigitalInOut" msgstr "" -#: py/compile.c:2465 -msgid "expecting key:value for dict" -msgstr "" +#: main.c +msgid "Running in safe mode! Auto-reload is off.\n" +msgstr "Sicherheitsmodus aktiv! Automatisches Neuladen ist deaktiviert.\n" -#: py/compile.c:2475 -msgid "expecting just a value for set" -msgstr "" +#: main.c +msgid "Running in safe mode! Not running saved code.\n" +msgstr "Sicherheitsmodus aktiv! Gespeicherter Code wird nicht ausgeführt\n" -#: py/compile.c:2600 -msgid "'yield' outside function" -msgstr "" +#: ports/atmel-samd/common-hal/busio/I2C.c +msgid "SDA or SCL needs a pull up" +msgstr "SDA oder SCL brauchen pull up" -#: py/compile.c:2619 -msgid "'await' outside function" -msgstr "" +#: ports/esp8266/modnetwork.c +msgid "STA must be active" +msgstr "STA muss aktiv sein" -#: py/compile.c:2774 -msgid "name reused for argument" -msgstr "" +#: ports/esp8266/modnetwork.c +msgid "STA required" +msgstr "STA erforderlich" -#: py/compile.c:2827 -msgid "parameter annotation must be an identifier" -msgstr "" +#: shared-bindings/audioio/Mixer.c +msgid "Sample rate must be positive" +msgstr "Abtastrate muss positiv sein" -#: py/compile.c:2969 py/compile.c:3137 -msgid "return annotation must be an identifier" -msgstr "" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#, c-format +msgid "Sample rate too high. It must be less than %d" +msgstr "Abtastrate zu hoch. Wert muss unter %d liegen" -#: py/compile.c:3097 -msgid "inline assembler must be a function" -msgstr "" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Serializer in use" +msgstr "Serializer wird benutzt" -#: py/compile.c:3134 -msgid "unknown type" -msgstr "" +#: shared-bindings/nvm/ByteArray.c +msgid "Slice and value different lengths." +msgstr "Slice und Wert (value) haben unterschiedliche Längen." -#: py/compile.c:3154 -msgid "expecting an assembler instruction" -msgstr "" +#: shared-bindings/displayio/Bitmap.c shared-bindings/displayio/TileGrid.c +#: shared-bindings/displayio/Group.c shared-bindings/pulseio/PulseIn.c +msgid "Slices not supported" +msgstr "Slices werden nicht unterstützt" -#: py/compile.c:3184 -msgid "'label' requires 1 argument" +#: ports/nrf/common-hal/bleio/Adapter.c +#, c-format +msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX" msgstr "" -#: py/compile.c:3190 -msgid "label redefined" -msgstr "" +#: extmod/modure.c +msgid "Splitting with sub-captures" +msgstr "Splitting mit sub-captures" -#: py/compile.c:3196 -msgid "'align' requires 1 argument" -msgstr "" +#: shared-bindings/supervisor/__init__.c +msgid "Stack size must be at least 256" +msgstr "Die Stackgröße sollte mindestens 256 sein" -#: py/compile.c:3205 -msgid "'data' requires at least 2 arguments" -msgstr "" +#: shared-bindings/multiterminal/__init__.c +msgid "Stream missing readinto() or write() method." +msgstr "Stream fehlt readinto() oder write() Methode." -#: py/compile.c:3212 -msgid "'data' requires integer arguments" +#: supervisor/shared/safe_mode.c +msgid "" +"The CircuitPython heap was corrupted because the stack was too small.\n" +"Please increase stack size limits and press reset (after ejecting " +"CIRCUITPY).\n" +"If you didn't change the stack, then file an issue here with the contents of " +"your CIRCUITPY drive:\n" msgstr "" +"Der CircuitPython-Heap war beschädigt, weil der Stack zu klein war.\n" +"Bitte erhöhe die stack size limits und drücke die Reset-Taste (nach Auswurf " +"des CIRCUITPY-Laufwerks)\n" +"Wenn du den Stack nicht geändert hast, melde bitte das Problem unter https://" +"github.com/adafruit/circuitpython/issues\n" +"mit dem Inhalt deines CIRCUITPY-Laufwerks.\n" -#: py/emitinlinethumb.c:102 -msgid "can only have up to 4 parameters to Thumb assembly" +#: supervisor/shared/safe_mode.c +msgid "" +"The microcontroller's power dipped. Please make sure your power supply " +"provides\n" +"enough power for the whole circuit and press reset (after ejecting " +"CIRCUITPY).\n" msgstr "" +"Die Stromversorgung des Mikrocontrollers ist eingebrochen. Stelle sicher, " +"dass deine Stromversorgung genug Leistung für die gesamte Schaltung zur " +"Verfügung stellt und drücke die Reset-Taste (nach Auswurf des CIRCUITPY-" +"Laufwerks)\n" -#: py/emitinlinethumb.c:107 py/emitinlinethumb.c:112 -msgid "parameters must be registers in sequence r0 to r3" +#: supervisor/shared/safe_mode.c +msgid "" +"The reset button was pressed while booting CircuitPython. Press again to " +"exit safe mode.\n" msgstr "" +"Die Reset-Taste wurde beim Booten von CircuitPython gedrückt. Drücke sie " +"erneut um den abgesicherten Modus zu verlassen. \n" -#: py/emitinlinethumb.c:188 py/emitinlinethumb.c:230 -#, c-format -msgid "'%s' expects at most r%d" +#: shared-module/audioio/Mixer.c +msgid "The sample's bits_per_sample does not match the mixer's" msgstr "" -#: py/emitinlinethumb.c:197 py/emitinlinextensa.c:162 -#, c-format -msgid "'%s' expects a register" +#: shared-module/audioio/Mixer.c +msgid "The sample's channel count does not match the mixer's" msgstr "" -#: py/emitinlinethumb.c:211 -#, c-format -msgid "'%s' expects a special register" +#: shared-module/audioio/Mixer.c +msgid "The sample's sample rate does not match the mixer's" msgstr "" -#: py/emitinlinethumb.c:239 -#, c-format -msgid "'%s' expects an FPU register" +#: shared-module/audioio/Mixer.c +msgid "The sample's signedness does not match the mixer's" msgstr "" -#: py/emitinlinethumb.c:292 -#, c-format -msgid "'%s' expects {r0, r1, ...}" +#: shared-bindings/displayio/TileGrid.c +msgid "Tile height must exactly divide bitmap height" msgstr "" -#: py/emitinlinethumb.c:299 py/emitinlinextensa.c:169 -#, c-format -msgid "'%s' expects an integer" +#: shared-bindings/displayio/TileGrid.c +msgid "Tile indices must be 0 - 255" msgstr "" -#: py/emitinlinethumb.c:304 -#, c-format -msgid "'%s' integer 0x%x does not fit in mask 0x%x" +#: shared-bindings/displayio/TileGrid.c +msgid "Tile width must exactly divide bitmap width" msgstr "" -#: py/emitinlinethumb.c:328 -#, c-format -msgid "'%s' expects an address of the form [a, b]" -msgstr "" +#: supervisor/shared/safe_mode.c +msgid "To exit, please reset the board without " +msgstr "Zum beenden, resette bitte das board ohne " -#: py/emitinlinethumb.c:334 py/emitinlinextensa.c:182 -#, c-format -msgid "'%s' expects a label" -msgstr "" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Too many channels in sample." +msgstr "Zu viele Kanäle im sample" -#: py/emitinlinethumb.c:345 py/emitinlinextensa.c:193 -msgid "label '%q' not defined" +#: shared-bindings/displayio/FourWire.c shared-bindings/displayio/ParallelBus.c +msgid "Too many display busses" msgstr "" -#: py/emitinlinethumb.c:806 +#: shared-bindings/displayio/Display.c +msgid "Too many displays" +msgstr "Zu viele displays" + +#: py/obj.c +msgid "Traceback (most recent call last):\n" +msgstr "Zurückverfolgung (jüngste Aufforderung zuletzt):\n" + +#: shared-bindings/time/__init__.c +msgid "Tuple or struct_time argument required" +msgstr "Tuple- oder struct_time-Argument erforderlich" + +#: ports/esp8266/machine_uart.c #, c-format -msgid "unsupported Thumb instruction '%s' with %d arguments" -msgstr "" +msgid "UART(%d) does not exist" +msgstr "UART(%d) existiert nicht" -#: py/emitinlinethumb.c:810 -#, fuzzy -msgid "branch not in range" -msgstr "Kalibrierung ist außerhalb der Reichweite" +#: ports/esp8266/machine_uart.c +msgid "UART(1) can't read" +msgstr "UART(1) kann nicht lesen" -#: py/emitinlinextensa.c:86 -msgid "can only have up to 4 parameters to Xtensa assembly" -msgstr "" +#: shared-module/usb_hid/Device.c +msgid "USB Busy" +msgstr "USB beschäftigt" -#: py/emitinlinextensa.c:91 py/emitinlinextensa.c:96 -msgid "parameters must be registers in sequence a2 to a5" -msgstr "" +#: shared-module/usb_hid/Device.c +msgid "USB Error" +msgstr "USB Fehler" -#: py/emitinlinextensa.c:174 -#, c-format -msgid "'%s' integer %d is not within range %d..%d" -msgstr "" +#: shared-bindings/bleio/UUID.c +msgid "UUID integer value not in range 0 to 0xffff" +msgstr "UUID-Integer nicht im Bereich 0 bis 0xffff" -#: py/emitinlinextensa.c:327 -#, c-format -msgid "unsupported Xtensa instruction '%s' with %d arguments" -msgstr "" +#: shared-bindings/bleio/UUID.c +msgid "UUID string not 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'" +msgstr "UUID Zeichenfolge ist nicht 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'" -#: py/emitnative.c:183 -msgid "unknown type '%q'" -msgstr "" +#: shared-bindings/bleio/UUID.c +msgid "UUID value is not str, int or byte buffer" +msgstr "Der UUID-Wert ist kein str-, int- oder Byte-Puffer" -#: py/emitnative.c:260 -msgid "Viper functions don't currently support more than 4 arguments" -msgstr "" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Unable to allocate buffers for signed conversion" +msgstr "Konnte keine Buffer für Vorzeichenumwandlung allozieren" -#: py/emitnative.c:742 -msgid "conversion to object" -msgstr "" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Unable to find free GCLK" +msgstr "Konnte keinen freien GCLK finden" -#: py/emitnative.c:921 -msgid "local '%q' used before type known" -msgstr "" +#: py/parse.c +msgid "Unable to init parser" +msgstr "Parser konnte nicht gestartet werden" -#: py/emitnative.c:1118 py/emitnative.c:1156 -msgid "can't load from '%q'" +#: shared-module/displayio/OnDiskBitmap.c +msgid "Unable to read color palette data" msgstr "" -#: py/emitnative.c:1128 -msgid "can't load with '%q' index" -msgstr "" +#: ports/esp8266/common-hal/storage/__init__.c +msgid "Unable to remount filesystem" +msgstr "Dateisystem konnte nicht wieder eingebunden werden." -#: py/emitnative.c:1188 -msgid "local '%q' has type '%q' but source is '%q'" -msgstr "" +#: shared-bindings/nvm/ByteArray.c +msgid "Unable to write to nvm." +msgstr "Schreiben in nvm nicht möglich." -#: py/emitnative.c:1289 py/emitnative.c:1379 -msgid "can't store '%q'" -msgstr "" +#: ports/nrf/common-hal/bleio/UUID.c +msgid "Unexpected nrfx uuid type" +msgstr "Unerwarteter nrfx uuid-Typ" -#: py/emitnative.c:1358 py/emitnative.c:1419 -msgid "can't store to '%q'" -msgstr "" +#: ports/unix/modffi.c +msgid "Unknown type" +msgstr "Unbekannter Typ" -#: py/emitnative.c:1369 -msgid "can't store with '%q' index" +#: shared-bindings/_pixelbuf/PixelBuf.c +#, c-format +msgid "Unmatched number of items on RHS (expected %d, got %d)." msgstr "" +"Nicht übereinstimmende Anzahl von Elementen auf der rechten Seite (erwartet " +"%d, %d erhalten)." -#: py/emitnative.c:1540 -msgid "can't implicitly convert '%q' to 'bool'" -msgstr "" +#: ports/atmel-samd/common-hal/busio/I2C.c +msgid "Unsupported baudrate" +msgstr "Baudrate wird nicht unterstützt" -#: py/emitnative.c:1774 -msgid "unary op %q not implemented" -msgstr "" +#: shared-module/displayio/Display.c +msgid "Unsupported display bus type" +msgstr "Nicht unterstützter display bus type" -#: py/emitnative.c:1930 -msgid "binary op %q not implemented" -msgstr "" +#: shared-module/audioio/WaveFile.c +msgid "Unsupported format" +msgstr "Nicht unterstütztes Format" -#: py/emitnative.c:1951 -msgid "can't do binary op between '%q' and '%q'" -msgstr "" +#: py/moduerrno.c +msgid "Unsupported operation" +msgstr "Nicht unterstützte Operation" -#: py/emitnative.c:2126 -msgid "casting" -msgstr "" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Unsupported pull value." +msgstr "Nicht unterstützter Pull-Wert" -#: py/emitnative.c:2173 -msgid "return expected '%q' but got '%q'" +#: ports/esp8266/common-hal/storage/__init__.c +msgid "Use esptool to erase flash and re-upload Python instead" msgstr "" +"Benutze das esptool um den flash zu löschen und Python erneut hochzuladen" -#: py/emitnative.c:2191 -msgid "must raise an object" -msgstr "" +#: py/emitnative.c +msgid "Viper functions don't currently support more than 4 arguments" +msgstr "Viper-Funktionen unterstützen derzeit nicht mehr als 4 Argumente" -#: py/emitnative.c:2201 -msgid "native yield" -msgstr "" +#: shared-module/audioio/Mixer.c +msgid "Voice index too high" +msgstr "Voice index zu hoch" -#: py/lexer.c:345 -msgid "unicode name escapes" +#: main.c +msgid "WARNING: Your code filename has two extensions\n" msgstr "" +"WARNUNG: Der Dateiname deines Programms hat zwei Dateityperweiterungen\n" -#: py/modbuiltins.c:162 -msgid "chr() arg not in range(0x110000)" +#: py/builtinhelp.c +#, c-format +msgid "" +"Welcome to Adafruit CircuitPython %s!\n" +"\n" +"Please visit learn.adafruit.com/category/circuitpython for project guides.\n" +"\n" +"To list built-in modules please do `help(\"modules\")`.\n" msgstr "" +"Willkommen bei Adafruit CircuitPython %s!\n" +"\n" +"Projektleitfäden findest du auf learn.adafruit.com/category/circuitpython \n" +"\n" +"Um die integrierten Module aufzulisten, führe bitte `help(\"modules\")` " +"aus.\n" -#: py/modbuiltins.c:171 -msgid "chr() arg not in range(256)" +#: supervisor/shared/safe_mode.c +msgid "" +"You are running in safe mode which means something unanticipated happened.\n" msgstr "" +"Sie laufen im abgesicherten Modus, was bedeutet, dass etwas Unerwartetes " +"passiert ist.\n" -#: py/modbuiltins.c:285 -msgid "arg is an empty sequence" -msgstr "" +#: supervisor/shared/safe_mode.c +msgid "You requested starting safe mode by " +msgstr "Du hast das Starten im Sicherheitsmodus ausgelöst durch " -#: py/modbuiltins.c:350 -msgid "ord expects a character" +#: ports/unix/modusocket.c +#, c-format +msgid "[addrinfo error %d]" msgstr "" -#: py/modbuiltins.c:353 +#: py/objtype.c +msgid "__init__() should return None" +msgstr "__init__() sollte None zurückgeben" + +#: py/objtype.c #, c-format -msgid "ord() expected a character, but string of length %d found" -msgstr "" +msgid "__init__() should return None, not '%s'" +msgstr "__init__() sollte None zurückgeben, nicht '%s'" -#: py/modbuiltins.c:363 -msgid "3-arg pow() not supported" -msgstr "" +#: py/objobject.c +msgid "__new__ arg must be a user-type" +msgstr "__new__ arg muss user-type sein" -#: py/modbuiltins.c:517 -msgid "must use keyword argument for key function" -msgstr "" +#: extmod/modubinascii.c extmod/moduhashlib.c +msgid "a bytes-like object is required" +msgstr "ein Byte-ähnliches Objekt ist erforderlich" -#: py/modmath.c:41 shared-bindings/math/__init__.c:53 -msgid "math domain error" -msgstr "" +#: lib/embed/abort_.c +msgid "abort() called" +msgstr "abort() wurde aufgerufen" -#: py/modmath.c:196 py/objfloat.c:270 py/objint_longlong.c:222 -#: py/objint_mpz.c:230 py/runtime.c:619 shared-bindings/math/__init__.c:346 -msgid "division by zero" -msgstr "" +#: ports/unix/modmachine.c extmod/machine_mem.c +#, c-format +msgid "address %08x is not aligned to %d bytes" +msgstr "Addresse %08x ist nicht an %d bytes ausgerichtet" -#: py/modmicropython.c:155 -msgid "schedule stack full" -msgstr "" +#: shared-bindings/i2cslave/I2CSlave.c +msgid "address out of bounds" +msgstr "Adresse außerhalb der Grenzen" -#: py/modstruct.c:145 py/modstruct.c:153 py/modstruct.c:234 py/modstruct.c:244 -#: shared-bindings/struct/__init__.c:103 shared-bindings/struct/__init__.c:145 -#: shared-module/struct/__init__.c:91 shared-module/struct/__init__.c:175 -msgid "buffer too small" -msgstr "" +#: shared-bindings/i2cslave/I2CSlave.c +msgid "addresses is empty" +msgstr "adresses ist leer" -#: py/modthread.c:240 -msgid "expecting a dict for keyword args" -msgstr "" +#: py/modbuiltins.c +msgid "arg is an empty sequence" +msgstr "arg ist eine leere Sequenz" -#: py/moduerrno.c:147 py/moduerrno.c:150 -msgid "Permission denied" -msgstr "" +#: py/runtime.c +msgid "argument has wrong type" +msgstr "Argument hat falschen Typ" -#: py/moduerrno.c:148 -msgid "No such file/directory" -msgstr "" +#: py/argcheck.c +msgid "argument num/types mismatch" +msgstr "Anzahl/Type der Argumente passen nicht" -#: py/moduerrno.c:149 -msgid "Input/output error" -msgstr "" +#: py/runtime.c +msgid "argument should be a '%q' not a '%q'" +msgstr "Argument sollte '%q' sein, nicht '%q'" -#: py/moduerrno.c:151 -msgid "File exists" -msgstr "" +#: shared-bindings/nvm/ByteArray.c py/objarray.c +msgid "array/bytes required on right side" +msgstr "Array/Bytes auf der rechten Seite erforderlich" -#: py/moduerrno.c:152 -msgid "Unsupported operation" -msgstr "" +#: py/objstr.c +msgid "attributes not supported yet" +msgstr "Attribute werden noch nicht unterstützt" -#: py/moduerrno.c:153 -msgid "Invalid argument" +#: ports/nrf/common-hal/bleio/Characteristic.c +msgid "bad GATT role" msgstr "" -#: py/obj.c:92 -msgid "Traceback (most recent call last):\n" +#: py/builtinevex.c +msgid "bad compile mode" msgstr "" -#: py/obj.c:96 -msgid " File \"%q\", line %d" +#: py/objstr.c +msgid "bad conversion specifier" msgstr "" -#: py/obj.c:98 -msgid " File \"%q\"" +#: py/objstr.c +msgid "bad format string" msgstr "" -#: py/obj.c:102 -msgid ", in %q\n" +#: py/binary.c +msgid "bad typecode" msgstr "" -#: py/obj.c:259 -msgid "can't convert to int" -msgstr "" +#: py/emitnative.c +msgid "binary op %q not implemented" +msgstr "Der binäre Operator %q ist nicht implementiert" -#: py/obj.c:262 -#, c-format -msgid "can't convert %s to int" -msgstr "" +#: shared-bindings/busio/UART.c +msgid "bits must be 7, 8 or 9" +msgstr "bits muss 7, 8 oder 9 sein" -#: py/obj.c:322 -msgid "can't convert to float" -msgstr "" +#: extmod/machine_spi.c +msgid "bits must be 8" +msgstr "bits müssen 8 sein" -#: py/obj.c:325 -#, c-format -msgid "can't convert %s to float" -msgstr "" +#: shared-bindings/audioio/Mixer.c +msgid "bits_per_sample must be 8 or 16" +msgstr "Es müssen 8 oder 16 bits_per_sample sein" -#: py/obj.c:355 -msgid "can't convert to complex" -msgstr "" +#: py/emitinlinethumb.c +msgid "branch not in range" +msgstr "Zweig ist außerhalb der Reichweite" -#: py/obj.c:358 +#: shared-bindings/_pixelbuf/PixelBuf.c #, c-format -msgid "can't convert %s to complex" -msgstr "" +msgid "buf is too small. need %d bytes" +msgstr "buf ist zu klein. brauche %d Bytes" -#: py/obj.c:373 -msgid "expected tuple/list" -msgstr "" +#: shared-bindings/audioio/RawSample.c +msgid "buffer must be a bytes-like object" +msgstr "Puffer muss ein bytes-artiges Objekt sein" -#: py/obj.c:376 -#, c-format -msgid "object '%s' is not a tuple or list" +#: shared-module/struct/__init__.c +msgid "buffer size must match format" +msgstr "Die Puffergröße muss zum Format passen" + +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "buffer slices must be of equal length" +msgstr "Puffersegmente müssen gleich lang sein" + +#: ports/esp8266/machine_rtc.c +msgid "buffer too long" +msgstr "Buffer zu lang" + +#: shared-bindings/struct/__init__.c shared-module/struct/__init__.c +#: py/modstruct.c +msgid "buffer too small" +msgstr "Der Puffer ist zu klein" + +#: extmod/machine_spi.c +msgid "buffers must be the same length" +msgstr "Buffer müssen gleich lang sein" + +#: shared-bindings/_pew/PewPew.c +msgid "buttons must be digitalio.DigitalInOut" msgstr "" -#: py/obj.c:387 -msgid "tuple/list has wrong length" +#: py/vm.c +msgid "byte code not implemented" msgstr "" -#: py/obj.c:389 +#: shared-bindings/_pixelbuf/PixelBuf.c #, c-format -msgid "requested length %d but object has length %d" +msgid "byteorder is not an instance of ByteOrder (got a %s)" msgstr "" -#: py/obj.c:402 -msgid "indices must be integers" -msgstr "" +#: ports/atmel-samd/common-hal/busio/UART.c +msgid "bytes > 8 bits not supported" +msgstr "bytes mit mehr als 8 bits werden nicht unterstützt" -#: py/obj.c:405 -msgid "%q indices must be integers, not %s" +#: py/objstr.c +msgid "bytes value out of range" msgstr "" -#: py/obj.c:425 -msgid "%q index out of range" -msgstr "" +#: ports/atmel-samd/bindings/samd/Clock.c +msgid "calibration is out of range" +msgstr "Kalibrierung ist außerhalb der Reichweite" -#: py/obj.c:457 -msgid "object has no len" -msgstr "" +#: ports/atmel-samd/bindings/samd/Clock.c +msgid "calibration is read only" +msgstr "Kalibrierung ist Schreibgeschützt" -#: py/obj.c:460 -#, c-format -msgid "object of type '%s' has no len()" -msgstr "" +#: ports/atmel-samd/common-hal/rtc/RTC.c +msgid "calibration value out of range +/-127" +msgstr "Kalibrierwert nicht im Bereich von +/-127" -#: py/obj.c:500 -msgid "object does not support item deletion" +#: py/emitinlinethumb.c +msgid "can only have up to 4 parameters to Thumb assembly" msgstr "" -#: py/obj.c:503 -#, c-format -msgid "'%s' object does not support item deletion" +#: py/emitinlinextensa.c +msgid "can only have up to 4 parameters to Xtensa assembly" +msgstr "kann nur bis zu 4 Parameter für die Xtensa assembly haben" + +#: py/persistentcode.c +msgid "can only save bytecode" +msgstr "kann nur Bytecode speichern" + +#: ports/esp8266/modnetwork.c +msgid "can query only one param" msgstr "" -#: py/obj.c:507 -msgid "object is not subscriptable" +#: py/objtype.c +msgid "can't add special method to already-subclassed class" msgstr "" -#: py/obj.c:510 +#: py/compile.c +msgid "can't assign to expression" +msgstr "kann keinem Ausdruck zuweisen" + +#: py/obj.c #, c-format -msgid "'%s' object is not subscriptable" -msgstr "" +msgid "can't convert %s to complex" +msgstr "kann %s nicht nach complex konvertieren" -#: py/obj.c:514 -msgid "object does not support item assignment" -msgstr "" +#: py/obj.c +#, c-format +msgid "can't convert %s to float" +msgstr "kann %s nicht nach float konvertieren" -#: py/obj.c:517 +#: py/obj.c #, c-format -msgid "'%s' object does not support item assignment" -msgstr "" +msgid "can't convert %s to int" +msgstr "kann %s nicht nach int konvertieren" -#: py/obj.c:548 -msgid "object with buffer protocol required" -msgstr "" +#: py/objstr.c +msgid "can't convert '%q' object to %q implicitly" +msgstr "Kann '%q' Objekt nicht implizit nach %q konvertieren" -#: py/objarray.c:413 py/objstr.c:427 py/objstrunicode.c:191 py/objtuple.c:187 -#: shared-bindings/nvm/ByteArray.c:85 -msgid "only slices with step=1 (aka None) are supported" -msgstr "" +#: py/objint.c +msgid "can't convert NaN to int" +msgstr "kann NaN nicht nach int konvertieren" -#: py/objarray.c:426 -msgid "lhs and rhs should be compatible" -msgstr "" +#: shared-bindings/i2cslave/I2CSlave.c +msgid "can't convert address to int" +msgstr "kann Adresse nicht in int konvertieren" -#: py/objarray.c:444 shared-bindings/nvm/ByteArray.c:107 -msgid "array/bytes required on right side" -msgstr "" +#: py/objint.c +msgid "can't convert inf to int" +msgstr "kann inf nicht nach int konvertieren" + +#: py/obj.c +msgid "can't convert to complex" +msgstr "kann nicht nach complex konvertieren" + +#: py/obj.c +msgid "can't convert to float" +msgstr "kann nicht nach float konvertieren" + +#: py/obj.c +msgid "can't convert to int" +msgstr "kann nicht nach int konvertieren" + +#: py/objstr.c +msgid "can't convert to str implicitly" +msgstr "Kann nicht implizit nach str konvertieren" + +#: py/compile.c +msgid "can't declare nonlocal in outer code" +msgstr "kann im äußeren Code nicht als nonlocal deklarieren" -#: py/objcomplex.c:203 +#: py/compile.c +msgid "can't delete expression" +msgstr "Ausdruck kann nicht gelöscht werden" + +#: py/emitnative.c +msgid "can't do binary op between '%q' and '%q'" +msgstr "Eine binäre Operation zwischen '%q' und '%q' ist nicht möglich" + +#: py/objcomplex.c msgid "can't do truncated division of a complex number" -msgstr "" +msgstr "kann mit einer komplexen Zahl keine abgeschnittene Division ausführen" -#: py/objcomplex.c:209 -msgid "complex division by zero" +#: ports/esp8266/modnetwork.c +msgid "can't get AP config" msgstr "" -#: py/objcomplex.c:237 -msgid "0.0 to a complex power" +#: ports/esp8266/modnetwork.c +msgid "can't get STA config" msgstr "" -#: py/objdeque.c:107 -msgid "full" -msgstr "" +#: py/compile.c +msgid "can't have multiple **x" +msgstr "mehrere **x sind nicht gestattet" -#: py/objdeque.c:127 -msgid "empty" -msgstr "" +#: py/compile.c +msgid "can't have multiple *x" +msgstr "mehrere *x sind nicht gestattet" -#: py/objdict.c:314 -msgid "popitem(): dictionary is empty" -msgstr "" +#: py/emitnative.c +msgid "can't implicitly convert '%q' to 'bool'" +msgstr "Kann '%q' nicht implizit nach 'bool' konvertieren" -#: py/objdict.c:357 -msgid "dict update sequence has wrong length" +#: py/emitnative.c +msgid "can't load from '%q'" +msgstr "Laden von '%q' nicht möglich" + +#: py/emitnative.c +msgid "can't load with '%q' index" msgstr "" -#: py/objfloat.c:308 py/parsenum.c:331 -msgid "complex values not supported" +#: py/objgenerator.c +msgid "can't pend throw to just-started generator" msgstr "" -#: py/objgenerator.c:108 +#: py/objgenerator.c msgid "can't send non-None value to a just-started generator" msgstr "" -#: py/objgenerator.c:126 -msgid "generator already executing" +#: ports/esp8266/modnetwork.c +msgid "can't set AP config" msgstr "" -#: py/objgenerator.c:229 -msgid "generator ignored GeneratorExit" +#: ports/esp8266/modnetwork.c +msgid "can't set STA config" msgstr "" -#: py/objgenerator.c:251 -msgid "can't pend throw to just-started generator" +#: py/objnamedtuple.c +msgid "can't set attribute" msgstr "" -#: py/objint.c:144 -msgid "can't convert inf to int" -msgstr "" +#: py/emitnative.c +msgid "can't store '%q'" +msgstr "Speichern von '%q' nicht möglich" -#: py/objint.c:146 -msgid "can't convert NaN to int" -msgstr "" +#: py/emitnative.c +msgid "can't store to '%q'" +msgstr "Speichern in/nach '%q' nicht möglich" -#: py/objint.c:163 -msgid "float too big" -msgstr "" +#: py/emitnative.c +msgid "can't store with '%q' index" +msgstr "Speichern mit '%q' Index nicht möglich" -#: py/objint.c:328 -msgid "long int not supported in this build" +#: py/objstr.c +msgid "" +"can't switch from automatic field numbering to manual field specification" msgstr "" -#: py/objint.c:334 py/objint.c:340 py/objint.c:350 py/objint.c:358 -msgid "small int overflow" +#: py/objstr.c +msgid "" +"can't switch from manual field specification to automatic field numbering" msgstr "" -#: py/objint_longlong.c:189 py/objint_mpz.c:283 py/runtime.c:486 -msgid "negative power with no float support" +#: py/objtype.c +msgid "cannot create '%q' instances" msgstr "" -#: py/objint_longlong.c:251 -msgid "ulonglong too large" +#: py/objtype.c +msgid "cannot create instance" msgstr "" -#: py/objint_mpz.c:267 py/runtime.c:396 py/runtime.c:411 -msgid "negative shift count" -msgstr "" +#: py/runtime.c +msgid "cannot import name %q" +msgstr "Name %q kann nicht importiert werden" -#: py/objint_mpz.c:336 -msgid "pow() with 3 arguments requires integers" -msgstr "" +#: py/builtinimport.c +msgid "cannot perform relative import" +msgstr "kann keinen relativen Import durchführen" -#: py/objint_mpz.c:347 -msgid "pow() 3rd argument cannot be 0" +#: py/emitnative.c +msgid "casting" msgstr "" -#: py/objint_mpz.c:415 -msgid "overflow converting long int to machine word" +#: shared-bindings/bleio/Service.c +msgid "characteristics includes an object that is not a Characteristic" msgstr "" -#: py/objlist.c:273 -msgid "pop from empty list" +#: shared-bindings/_stage/Text.c +msgid "chars buffer too small" msgstr "" -#: py/objnamedtuple.c:92 -msgid "can't set attribute" -msgstr "" +#: py/modbuiltins.c +msgid "chr() arg not in range(0x110000)" +msgstr "chr() arg ist nicht in range(0x110000)" -#: py/objobject.c:55 -msgid "__new__ arg must be a user-type" -msgstr "" +#: py/modbuiltins.c +msgid "chr() arg not in range(256)" +msgstr "chr() arg ist nicht in range(256)" -#: py/objrange.c:110 -msgid "zero step" +#: shared-bindings/displayio/Palette.c +msgid "color buffer must be 3 bytes (RGB) or 4 bytes (RGB + pad byte)" msgstr "" -#: py/objset.c:371 -msgid "pop from an empty set" +#: shared-bindings/displayio/Palette.c +msgid "color buffer must be a buffer or int" msgstr "" -#: py/objslice.c:66 -msgid "Length must be an int" +#: shared-bindings/displayio/Palette.c +msgid "color buffer must be a bytearray or array of type 'b' or 'B'" msgstr "" -#: py/objslice.c:71 -msgid "Length must be non-negative" +#: shared-bindings/displayio/Palette.c +msgid "color must be between 0x000000 and 0xffffff" msgstr "" -#: py/objslice.c:86 py/sequence.c:57 -msgid "slice step cannot be zero" +#: shared-bindings/displayio/ColorConverter.c +msgid "color should be an int" msgstr "" -#: py/objslice.c:159 -msgid "Cannot subclass slice" +#: py/objcomplex.c +msgid "complex division by zero" msgstr "" -#: py/objstr.c:261 -msgid "bytes value out of range" +#: py/parsenum.c py/objfloat.c +msgid "complex values not supported" msgstr "" -#: py/objstr.c:270 -msgid "wrong number of arguments" -msgstr "" +#: extmod/moduzlib.c +msgid "compression header" +msgstr "kompression header" -#: py/objstr.c:467 -msgid "join expects a list of str/bytes objects consistent with self object" +#: py/parse.c +msgid "constant must be an integer" msgstr "" -#: py/objstr.c:542 py/objstr.c:647 py/objstr.c:1744 -msgid "empty separator" +#: py/emitnative.c +msgid "conversion to object" msgstr "" -#: py/objstr.c:641 -msgid "rsplit(None,n)" +#: py/parsenum.c +msgid "decimal numbers not supported" msgstr "" -#: py/objstr.c:713 -msgid "substring not found" +#: py/compile.c +msgid "default 'except' must be last" +msgstr "Die Standart-Ausnahmebehandlung muss als letztes sein" + +#: shared-bindings/audiobusio/PDMIn.c +msgid "" +"destination buffer must be a bytearray or array of type 'B' for bit_depth = 8" msgstr "" -#: py/objstr.c:770 -msgid "start/end indices" +#: shared-bindings/audiobusio/PDMIn.c +msgid "destination buffer must be an array of type 'H' for bit_depth = 16" msgstr "" -#: py/objstr.c:931 -msgid "bad format string" +#: shared-bindings/audiobusio/PDMIn.c +msgid "destination_length must be an int >= 0" msgstr "" -#: py/objstr.c:953 -msgid "single '}' encountered in format string" +#: py/objdict.c +msgid "dict update sequence has wrong length" msgstr "" -#: py/objstr.c:992 -msgid "bad conversion specifier" +#: shared-bindings/math/__init__.c py/runtime.c py/modmath.c py/objint_mpz.c +#: py/objint_longlong.c py/objfloat.c +msgid "division by zero" +msgstr "Division durch Null" + +#: ports/esp8266/modnetwork.c +msgid "either pos or kw args are allowed" msgstr "" -#: py/objstr.c:996 +#: py/objdeque.c +msgid "empty" +msgstr "leer" + +#: extmod/modutimeq.c extmod/moduheapq.c +msgid "empty heap" +msgstr "leerer heap" + +#: py/objstr.c +msgid "empty separator" +msgstr "leeres Trennzeichen" + +#: shared-bindings/random/__init__.c +msgid "empty sequence" +msgstr "leere Sequenz" + +#: py/objstr.c msgid "end of format while looking for conversion specifier" msgstr "" -#: py/objstr.c:998 -#, c-format -msgid "unknown conversion specifier %c" +#: shared-bindings/displayio/Shape.c +msgid "end_x should be an int" msgstr "" -#: py/objstr.c:1029 -msgid "unmatched '{' in format" +#: ports/nrf/common-hal/busio/UART.c +#, c-format +msgid "error = 0x%08lX" msgstr "" -#: py/objstr.c:1036 +#: py/runtime.c +msgid "exceptions must derive from BaseException" +msgstr "Exceptions müssen von BaseException abgeleitet sein" + +#: py/objstr.c msgid "expected ':' after format specifier" -msgstr "" +msgstr "erwarte ':' nach format specifier" -#: py/objstr.c:1050 -msgid "" -"can't switch from automatic field numbering to manual field specification" -msgstr "" +#: shared-bindings/gamepad/GamePad.c +msgid "expected a DigitalInOut" +msgstr "erwarte DigitalInOut" -#: py/objstr.c:1055 py/objstr.c:1083 -msgid "tuple index out of range" -msgstr "" +#: py/obj.c +msgid "expected tuple/list" +msgstr "erwarte tuple/list" -#: py/objstr.c:1071 -msgid "attributes not supported yet" -msgstr "" +#: py/modthread.c +msgid "expecting a dict for keyword args" +msgstr "erwarte ein dict als Keyword-Argumente" -#: py/objstr.c:1079 -msgid "" -"can't switch from manual field specification to automatic field numbering" -msgstr "" +#: ports/esp8266/machine_pin.c +msgid "expecting a pin" +msgstr "Ein Pin wird erwartet" -#: py/objstr.c:1171 -msgid "invalid format specifier" -msgstr "" +#: py/compile.c +msgid "expecting an assembler instruction" +msgstr "erwartet eine Assembler-Anweisung" -#: py/objstr.c:1192 -msgid "sign not allowed in string format specifier" -msgstr "" +#: py/compile.c +msgid "expecting just a value for set" +msgstr "Erwarte nur einen Wert für set" -#: py/objstr.c:1200 -msgid "sign not allowed with integer format specifier 'c'" -msgstr "" +#: py/compile.c +msgid "expecting key:value for dict" +msgstr "Erwarte key:value für dict" -#: py/objstr.c:1259 -#, c-format -msgid "unknown format code '%c' for object of type '%s'" -msgstr "" +#: py/argcheck.c +msgid "extra keyword arguments given" +msgstr "Es wurden zusätzliche Keyword-Argumente angegeben" -#: py/objstr.c:1331 -#, c-format -msgid "unknown format code '%c' for object of type 'float'" -msgstr "" +#: py/argcheck.c +msgid "extra positional arguments given" +msgstr "Es wurden zusätzliche Argumente ohne Keyword angegeben" -#: py/objstr.c:1343 -msgid "'=' alignment not allowed in string format specifier" -msgstr "" +#: ports/unix/modffi.c +msgid "ffi_prep_closure_loc" +msgstr "ffi_prep_closure_loc" -#: py/objstr.c:1367 -#, c-format -msgid "unknown format code '%c' for object of type 'str'" -msgstr "" +#: shared-bindings/displayio/OnDiskBitmap.c shared-bindings/audioio/WaveFile.c +msgid "file must be a file opened in byte mode" +msgstr "Die Datei muss eine im Byte-Modus geöffnete Datei sein" -#: py/objstr.c:1415 -msgid "format requires a dict" -msgstr "" +#: shared-bindings/storage/__init__.c +msgid "filesystem must provide mount method" +msgstr "Das Dateisystem muss eine Mount-Methode bereitstellen" -#: py/objstr.c:1424 -msgid "incomplete format key" -msgstr "" +#: py/objtype.c +msgid "first argument to super() must be type" +msgstr "Das erste Argument für super() muss type sein" -#: py/objstr.c:1482 -msgid "incomplete format" -msgstr "" +#: extmod/machine_spi.c +msgid "firstbit must be MSB" +msgstr "Erstes Bit muss das höchstwertigste Bit (MSB) sein" -#: py/objstr.c:1490 -msgid "not enough arguments for format string" -msgstr "" +#: ports/esp8266/modesp.c +msgid "flash location must be below 1MByte" +msgstr "flash location muss unter 1MByte sein" -#: py/objstr.c:1500 -#, c-format -msgid "%%c requires int or char" -msgstr "" +#: py/objint.c +msgid "float too big" +msgstr "float zu groß" -#: py/objstr.c:1507 -msgid "integer required" -msgstr "" +#: shared-bindings/_stage/Text.c +msgid "font must be 2048 bytes long" +msgstr "Die Schriftart (font) muss 2048 Byte lang sein" -#: py/objstr.c:1570 -#, c-format -msgid "unsupported format character '%c' (0x%x) at index %d" +#: py/objstr.c +msgid "format requires a dict" msgstr "" -#: py/objstr.c:1577 -msgid "not all arguments converted during string formatting" -msgstr "" +#: ports/esp8266/modmachine.c +msgid "frequency can only be either 80Mhz or 160MHz" +msgstr "Die Frequenz kann nur 80Mhz oder 160Mhz sein" -#: py/objstr.c:2102 -msgid "can't convert to str implicitly" -msgstr "" +#: py/objdeque.c +msgid "full" +msgstr "voll" -#: py/objstr.c:2106 -msgid "can't convert '%q' object to %q implicitly" -msgstr "" +#: py/argcheck.c +msgid "function does not take keyword arguments" +msgstr "Funktion akzeptiert keine Keyword-Argumente" -#: py/objstrunicode.c:134 +#: py/argcheck.c #, c-format -msgid "string indices must be integers, not %s" -msgstr "" - -#: py/objstrunicode.c:145 py/objstrunicode.c:164 -msgid "string index out of range" -msgstr "" +msgid "function expected at most %d arguments, got %d" +msgstr "Funktion erwartet maximal %d Argumente, aber hat %d erhalten" -#: py/objtype.c:358 -msgid "__init__() should return None" -msgstr "" +#: py/objnamedtuple.c py/bc.c +msgid "function got multiple values for argument '%q'" +msgstr "Funktion hat mehrere Werte für Argument '%q'" -#: py/objtype.c:360 +#: py/argcheck.c #, c-format -msgid "__init__() should return None, not '%s'" -msgstr "" +msgid "function missing %d required positional arguments" +msgstr "Funktion vermisst %d benötigte Argumente ohne Keyword" -#: py/objtype.c:623 py/objtype.c:1275 py/runtime.c:1065 -msgid "unreadable attribute" -msgstr "" +#: py/bc.c +msgid "function missing keyword-only argument" +msgstr "Funktion vermisst Keyword-only-Argument" -#: py/objtype.c:868 py/runtime.c:653 -msgid "object not callable" -msgstr "" +#: py/bc.c +msgid "function missing required keyword argument '%q'" +msgstr "Funktion vermisst benötigtes Keyword-Argumente '%q'" -#: py/objtype.c:870 py/runtime.c:655 +#: py/bc.c #, c-format -msgid "'%s' object is not callable" -msgstr "" +msgid "function missing required positional argument #%d" +msgstr "Funktion vermisst benötigtes Argumente ohne Keyword #%d" -#: py/objtype.c:978 -msgid "type takes 1 or 3 arguments" +#: py/argcheck.c py/objnamedtuple.c py/bc.c +#, c-format +msgid "function takes %d positional arguments but %d were given" msgstr "" +"Funktion nimmt %d Argumente ohne Keyword an, aber es wurden %d angegeben" -#: py/objtype.c:989 -msgid "cannot create instance" -msgstr "" +#: shared-bindings/time/__init__.c +msgid "function takes exactly 9 arguments" +msgstr "Funktion benötigt genau 9 Argumente" -#: py/objtype.c:991 -msgid "cannot create '%q' instances" -msgstr "" +#: py/objgenerator.c +msgid "generator already executing" +msgstr "Generator läuft bereits" -#: py/objtype.c:1047 -msgid "can't add special method to already-subclassed class" -msgstr "" +#: py/objgenerator.c +msgid "generator ignored GeneratorExit" +msgstr "Generator ignoriert GeneratorExit" -#: py/objtype.c:1091 py/objtype.c:1097 -msgid "type is not an acceptable base type" -msgstr "" +#: shared-bindings/_stage/Layer.c +msgid "graphic must be 2048 bytes long" +msgstr "graphic muss 2048 Byte lang sein" -#: py/objtype.c:1100 -msgid "type '%q' is not an acceptable base type" -msgstr "" +#: extmod/moduheapq.c +msgid "heap must be a list" +msgstr "heap muss eine Liste sein" -#: py/objtype.c:1137 -msgid "multiple inheritance not supported" -msgstr "" +#: py/compile.c +msgid "identifier redefined as global" +msgstr "Bezeichner als global neu definiert" -#: py/objtype.c:1164 -msgid "multiple bases have instance lay-out conflict" -msgstr "" +#: py/compile.c +msgid "identifier redefined as nonlocal" +msgstr "Bezeichner als nonlocal definiert" -#: py/objtype.c:1205 -msgid "first argument to super() must be type" -msgstr "" +#: ports/esp8266/machine_hspi.c +msgid "impossible baudrate" +msgstr "Unmögliche Baudrate" -#: py/objtype.c:1370 -msgid "issubclass() arg 2 must be a class or a tuple of classes" -msgstr "" +#: py/objstr.c +msgid "incomplete format" +msgstr "unvollständiges Format" -#: py/objtype.c:1384 -msgid "issubclass() arg 1 must be a class" -msgstr "" +#: py/objstr.c +msgid "incomplete format key" +msgstr "unvollständiger Formatschlüssel" -#: py/parse.c:726 -msgid "constant must be an integer" -msgstr "" +#: extmod/modubinascii.c +msgid "incorrect padding" +msgstr "padding ist inkorrekt" -#: py/parse.c:868 -msgid "Unable to init parser" -msgstr "" +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +#: ports/nrf/common-hal/pulseio/PulseIn.c +#: ports/esp8266/common-hal/pulseio/PulseIn.c py/obj.c +msgid "index out of range" +msgstr "index außerhalb der Reichweite" -#: py/parse.c:1170 -msgid "unexpected indent" -msgstr "" +#: py/obj.c +msgid "indices must be integers" +msgstr "Indizes müssen ganze Zahlen sein" -#: py/parse.c:1173 -msgid "unindent does not match any outer indentation level" -msgstr "" +#: py/compile.c +msgid "inline assembler must be a function" +msgstr "inline assembler muss eine function sein" -#: py/parsenum.c:60 +#: py/parsenum.c msgid "int() arg 2 must be >= 2 and <= 36" -msgstr "" - -#: py/parsenum.c:151 -msgid "invalid syntax for integer" -msgstr "" +msgstr "int() arg 2 muss >= 2 und <= 36 sein" -#: py/parsenum.c:155 -#, c-format -msgid "invalid syntax for integer with base %d" -msgstr "" +#: py/objstr.c +msgid "integer required" +msgstr "integer erforderlich" -#: py/parsenum.c:339 -msgid "invalid syntax for number" -msgstr "" +#: ports/nrf/common-hal/bleio/Broadcaster.c +msgid "interval not in range 0.0020 to 10.24" +msgstr "Das Interval ist nicht im Bereich 0.0020 bis 10.24" -#: py/parsenum.c:342 -msgid "decimal numbers not supported" -msgstr "" +#: extmod/machine_i2c.c +msgid "invalid I2C peripheral" +msgstr "ungültige I2C Schnittstelle" -#: py/persistentcode.c:223 -msgid "" -"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/" -"mpy-update for more info." -msgstr "" +#: extmod/machine_spi.c +msgid "invalid SPI peripheral" +msgstr "ungültige SPI Schnittstelle" -#: py/persistentcode.c:326 -msgid "can only save bytecode" -msgstr "" +#: ports/esp8266/machine_rtc.c +msgid "invalid alarm" +msgstr "ungültiger Alarm" -#: py/runtime.c:206 -msgid "name not defined" -msgstr "" +#: lib/netutils/netutils.c +msgid "invalid arguments" +msgstr "ungültige argumente" -#: py/runtime.c:209 -msgid "name '%q' is not defined" -msgstr "" +#: ports/esp8266/modnetwork.c +msgid "invalid buffer length" +msgstr "ungültige Pufferlänge" -#: py/runtime.c:304 py/runtime.c:611 -msgid "unsupported type for operator" -msgstr "" +#: extmod/modussl_axtls.c +msgid "invalid cert" +msgstr "ungültiges cert" -#: py/runtime.c:307 -msgid "unsupported type for %q: '%s'" -msgstr "" +#: ports/esp8266/common-hal/busio/UART.c ports/esp8266/machine_uart.c +msgid "invalid data bits" +msgstr "ungültige Datenbits" -#: py/runtime.c:614 -msgid "unsupported types for %q: '%s', '%s'" -msgstr "" +#: extmod/uos_dupterm.c +msgid "invalid dupterm index" +msgstr "ungültiger dupterm index" -#: py/runtime.c:881 py/runtime.c:888 py/runtime.c:945 -msgid "wrong number of values to unpack" -msgstr "" +#: extmod/modframebuf.c +msgid "invalid format" +msgstr "ungültiges Format" -#: py/runtime.c:883 py/runtime.c:947 -#, c-format -msgid "need more than %d values to unpack" -msgstr "" +#: py/objstr.c +msgid "invalid format specifier" +msgstr "ungültiger Formatbezeichner" -#: py/runtime.c:890 -#, c-format -msgid "too many values to unpack (expected %d)" -msgstr "" +#: extmod/modussl_axtls.c +msgid "invalid key" +msgstr "ungültiger Schlüssel" -#: py/runtime.c:984 -msgid "argument has wrong type" -msgstr "" +#: py/compile.c +msgid "invalid micropython decorator" +msgstr "ungültiger micropython decorator" -#: py/runtime.c:986 -msgid "argument should be a '%q' not a '%q'" -msgstr "" +#: ports/esp8266/machine_pin.c +msgid "invalid pin" +msgstr "ungültiger Pin" -#: py/runtime.c:1123 py/runtime.c:1197 -msgid "no such attribute" -msgstr "" +#: shared-bindings/random/__init__.c +msgid "invalid step" +msgstr "ungültiger Schritt (step)" -#: py/runtime.c:1128 -msgid "type object '%q' has no attribute '%q'" -msgstr "" +#: ports/esp8266/common-hal/busio/UART.c ports/esp8266/machine_uart.c +msgid "invalid stop bits" +msgstr "ungültige Stopbits" -#: py/runtime.c:1132 py/runtime.c:1200 -msgid "'%s' object has no attribute '%q'" -msgstr "" +#: py/compile.c py/parse.c +msgid "invalid syntax" +msgstr "ungültige Syntax" -#: py/runtime.c:1238 -msgid "object not iterable" -msgstr "" +#: py/parsenum.c +msgid "invalid syntax for integer" +msgstr "ungültige Syntax für integer" -#: py/runtime.c:1241 +#: py/parsenum.c #, c-format -msgid "'%s' object is not iterable" -msgstr "" - -#: py/runtime.c:1260 py/runtime.c:1296 -msgid "object not an iterator" -msgstr "" +msgid "invalid syntax for integer with base %d" +msgstr "ungültige Syntax für integer mit Basis %d" -#: py/runtime.c:1262 py/runtime.c:1298 -#, c-format -msgid "'%s' object is not an iterator" -msgstr "" +#: py/parsenum.c +msgid "invalid syntax for number" +msgstr "ungültige Syntax für number" -#: py/runtime.c:1401 -msgid "exceptions must derive from BaseException" -msgstr "" +#: py/objtype.c +msgid "issubclass() arg 1 must be a class" +msgstr "issubclass() arg 1 muss eine Klasse sein" -#: py/runtime.c:1430 -msgid "cannot import name %q" -msgstr "" +#: py/objtype.c +msgid "issubclass() arg 2 must be a class or a tuple of classes" +msgstr "issubclass() arg 2 muss eine Klasse oder ein Tupel von Klassen sein" -#: py/runtime.c:1535 -msgid "memory allocation failed, heap is locked" +#: py/objstr.c +msgid "join expects a list of str/bytes objects consistent with self object" msgstr "" +"join erwartet eine Liste von str/bytes-Objekten, die mit dem self-Objekt " +"übereinstimmen" -#: py/runtime.c:1539 -#, c-format -msgid "memory allocation failed, allocating %u bytes" +#: py/argcheck.c +msgid "keyword argument(s) not yet implemented - use normal args instead" msgstr "" +"Keyword-Argument(e) noch nicht implementiert - verwenden Sie stattdessen " +"normale Argumente" -#: py/runtime.c:1609 -msgid "maximum recursion depth exceeded" -msgstr "" +#: py/bc.c +msgid "keywords must be strings" +msgstr "Schlüsselwörter müssen Zeichenfolgen sein" -#: py/sequence.c:264 -msgid "object not in sequence" -msgstr "" +#: py/emitinlinextensa.c py/emitinlinethumb.c +msgid "label '%q' not defined" +msgstr "Label '%q' nicht definiert" -#: py/stream.c:96 -msgid "stream operation not supported" -msgstr "" +#: py/compile.c +msgid "label redefined" +msgstr "Label neu definiert" -#: py/stream.c:254 -msgid "string not supported; use bytes or bytearray" -msgstr "" +#: ports/esp8266/modesp.c +msgid "len must be multiple of 4" +msgstr "len muss ein vielfaches von 4 sein" -#: py/stream.c:289 +#: py/stream.c msgid "length argument not allowed for this type" -msgstr "" +msgstr "Für diesen Typ ist length nicht zulässig" -#: py/vm.c:255 -msgid "local variable referenced before assignment" -msgstr "" +#: py/objarray.c +msgid "lhs and rhs should be compatible" +msgstr "lhs und rhs sollten kompatibel sein" -#: py/vm.c:1142 -msgid "no active exception to reraise" -msgstr "" +#: py/emitnative.c +msgid "local '%q' has type '%q' but source is '%q'" +msgstr "Lokales '%q' hat den Typ '%q', aber die Quelle ist '%q'" -#: py/vm.c:1284 -msgid "byte code not implemented" -msgstr "" +#: py/emitnative.c +msgid "local '%q' used before type known" +msgstr "Lokales '%q' verwendet bevor Typ bekannt" -#: shared-bindings/_stage/Layer.c:71 -msgid "graphic must be 2048 bytes long" +#: py/vm.c +msgid "local variable referenced before assignment" msgstr "" +"Es wurde versucht auf eine Variable zuzugreifen, die es (noch) nicht gibt. " +"Variablen immer zuerst Zuweisen!" -#: shared-bindings/_stage/Layer.c:77 shared-bindings/_stage/Text.c:75 -msgid "palette must be 32 bytes long" -msgstr "" +#: py/objint.c +msgid "long int not supported in this build" +msgstr "long int wird in diesem Build nicht unterstützt" -#: shared-bindings/_stage/Layer.c:84 +#: shared-bindings/_stage/Layer.c msgid "map buffer too small" -msgstr "" +msgstr "map buffer zu klein" -#: shared-bindings/_stage/Text.c:69 -msgid "font must be 2048 bytes long" +#: shared-bindings/math/__init__.c py/modmath.c +msgid "math domain error" msgstr "" -#: shared-bindings/_stage/Text.c:81 -msgid "chars buffer too small" -msgstr "" +#: py/runtime.c +msgid "maximum recursion depth exceeded" +msgstr "maximale Rekursionstiefe überschritten" -#: shared-bindings/analogio/AnalogOut.c:118 -msgid "AnalogOut is only 16 bits. Value must be less than 65536." -msgstr "" +#: py/runtime.c +#, c-format +msgid "memory allocation failed, allocating %u bytes" +msgstr "Speicherzuordnung fehlgeschlagen, Zuweisung von %u Bytes" -#: shared-bindings/audiobusio/I2SOut.c:225 -#: shared-bindings/audioio/AudioOut.c:226 -msgid "Not playing" +#: ports/esp8266/modesp.c +#, c-format +msgid "memory allocation failed, allocating %u bytes for native code" msgstr "" +"Speicherallozierung fehlgeschlagen, alloziere %u Bytes für nativen Code" -#: shared-bindings/audiobusio/PDMIn.c:124 -msgid "Bit depth must be multiple of 8." -msgstr "" +#: py/runtime.c +msgid "memory allocation failed, heap is locked" +msgstr "Speicherzuweisung fehlgeschlagen, der Heap ist gesperrt" -#: shared-bindings/audiobusio/PDMIn.c:128 -msgid "Oversample must be multiple of 8." -msgstr "" +#: py/builtinimport.c +msgid "module not found" +msgstr "Modul nicht gefunden" -#: shared-bindings/audiobusio/PDMIn.c:136 -msgid "Microphone startup delay must be in range 0.0 to 1.0" -msgstr "" +#: py/compile.c +msgid "multiple *x in assignment" +msgstr "mehrere *x in Zuordnung" -#: shared-bindings/audiobusio/PDMIn.c:193 -msgid "destination_length must be an int >= 0" +#: py/objtype.c +msgid "multiple bases have instance lay-out conflict" msgstr "" -#: shared-bindings/audiobusio/PDMIn.c:199 -msgid "Cannot record to a file" +#: py/objtype.c +msgid "multiple inheritance not supported" msgstr "" -#: shared-bindings/audiobusio/PDMIn.c:202 -msgid "Destination capacity is smaller than destination_length." +#: py/emitnative.c +msgid "must raise an object" msgstr "" -#: shared-bindings/audiobusio/PDMIn.c:206 -msgid "destination buffer must be an array of type 'H' for bit_depth = 16" -msgstr "" +#: extmod/machine_spi.c +msgid "must specify all of sck/mosi/miso" +msgstr "sck/mosi/miso müssen alle spezifiziert sein" -#: shared-bindings/audiobusio/PDMIn.c:208 -msgid "" -"destination buffer must be a bytearray or array of type 'B' for bit_depth = 8" -msgstr "" +#: py/modbuiltins.c +msgid "must use keyword argument for key function" +msgstr "muss Schlüsselwortargument für key function verwenden" -#: shared-bindings/audioio/Mixer.c:94 -#, fuzzy -msgid "Invalid voice count" -msgstr "Ungültiger clock pin" +#: py/runtime.c +msgid "name '%q' is not defined" +msgstr "Name '%q' ist nirgends definiert worden (Schreibweise kontrollieren)" -#: shared-bindings/audioio/Mixer.c:99 -#, fuzzy -msgid "Invalid channel count" -msgstr "Ungültiger clock pin" +#: shared-bindings/bleio/Peripheral.c +msgid "name must be a string" +msgstr "name muss ein String sein" -#: shared-bindings/audioio/Mixer.c:103 -msgid "Sample rate must be positive" -msgstr "" +#: py/runtime.c +msgid "name not defined" +msgstr "Dieser Name ist nirgends definiert worden (Schreibweise kontrollieren)" -#: shared-bindings/audioio/Mixer.c:107 -#, fuzzy -msgid "bits_per_sample must be 8 or 16" -msgstr "bits müssen 8 sein" +#: py/compile.c +msgid "name reused for argument" +msgstr "Name für Argumente wiederverwendet" -#: shared-bindings/audioio/RawSample.c:98 -msgid "" -"sample_source buffer must be a bytearray or array of type 'h', 'H', 'b' or " -"'B'" +#: py/emitnative.c +msgid "native yield" msgstr "" -#: shared-bindings/audioio/RawSample.c:104 -msgid "buffer must be a bytes-like object" +#: py/runtime.c +#, c-format +msgid "need more than %d values to unpack" msgstr "" -#: shared-bindings/audioio/WaveFile.c:78 -#: shared-bindings/displayio/OnDiskBitmap.c:85 -msgid "file must be a file opened in byte mode" +#: py/runtime.c py/objint_mpz.c py/objint_longlong.c +msgid "negative power with no float support" msgstr "" -#: shared-bindings/bitbangio/I2C.c:111 shared-bindings/bitbangio/SPI.c:121 -#: shared-bindings/busio/SPI.c:133 -msgid "Function requires lock" +#: py/runtime.c py/objint_mpz.c +msgid "negative shift count" msgstr "" -#: shared-bindings/bitbangio/I2C.c:195 shared-bindings/busio/I2C.c:210 -msgid "Buffer must be at least length 1" +#: py/vm.c +msgid "no active exception to reraise" msgstr "" -#: shared-bindings/bitbangio/SPI.c:151 shared-bindings/busio/SPI.c:175 -msgid "Invalid polarity" +#: shared-bindings/socket/__init__.c shared-module/network/__init__.c +msgid "no available NIC" msgstr "" -#: shared-bindings/bitbangio/SPI.c:155 shared-bindings/busio/SPI.c:179 -msgid "Invalid phase" +#: py/compile.c +msgid "no binding for nonlocal found" msgstr "" -#: shared-bindings/bitbangio/SPI.c:159 shared-bindings/busio/SPI.c:183 -msgid "Invalid number of bits" -msgstr "" +#: py/builtinimport.c +msgid "no module named '%q'" +msgstr "Kein Modul mit dem Namen '%q'" -#: shared-bindings/bitbangio/SPI.c:284 shared-bindings/busio/SPI.c:348 -msgid "buffer slices must be of equal length" +#: shared-bindings/_pixelbuf/__init__.c py/runtime.c +msgid "no such attribute" msgstr "" -#: shared-bindings/bleio/Address.c:101 -msgid "Wrong address length" -msgstr "" +#: py/compile.c +msgid "non-default argument follows default argument" +msgstr "ein non-default argument folgt auf ein default argument" -#: shared-bindings/bleio/Address.c:107 -msgid "Wrong number of bytes provided" -msgstr "" +#: extmod/modubinascii.c +msgid "non-hex digit found" +msgstr "eine nicht-hex zahl wurde gefunden" -#: shared-bindings/bleio/Device.c:210 -msgid "Can't add services in Central mode" +#: py/compile.c +msgid "non-keyword arg after */**" msgstr "" -#: shared-bindings/bleio/Device.c:226 -msgid "Can't connect in Peripheral mode" +#: py/compile.c +msgid "non-keyword arg after keyword arg" msgstr "" -#: shared-bindings/bleio/Device.c:256 -msgid "Can't change the name in Central mode" -msgstr "" +#: shared-bindings/bleio/UUID.c +msgid "not a 128-bit UUID" +msgstr "keine 128-bit UUID" -#: shared-bindings/bleio/Device.c:277 shared-bindings/bleio/Device.c:313 -msgid "Can't advertise in Central mode" -msgstr "" +#: ports/esp8266/machine_adc.c +#, c-format +msgid "not a valid ADC Channel: %d" +msgstr "Kein gültiger ADC Kanal: %d" -#: shared-bindings/busio/I2C.c:120 -msgid "Function requires lock." +#: py/objstr.c +msgid "not all arguments converted during string formatting" msgstr "" -#: shared-bindings/busio/UART.c:106 -msgid "bits must be 7, 8 or 9" +#: py/objstr.c +msgid "not enough arguments for format string" msgstr "" -#: shared-bindings/busio/UART.c:118 -msgid "stop must be 1 or 2" -msgstr "" +#: py/obj.c +#, c-format +msgid "object '%s' is not a tuple or list" +msgstr "Objekt '%s' ist weder tupel noch list" -#: shared-bindings/busio/UART.c:123 -msgid "timeout >100 (units are now seconds, not msecs)" -msgstr "" +#: py/obj.c +msgid "object does not support item assignment" +msgstr "Objekt unterstützt keine item assignment" -#: shared-bindings/digitalio/DigitalInOut.c:211 -msgid "Invalid direction." -msgstr "" +#: py/obj.c +msgid "object does not support item deletion" +msgstr "Objekt unterstützt das Löschen von Elementen nicht" -#: shared-bindings/digitalio/DigitalInOut.c:240 -msgid "Cannot set value when direction is input." -msgstr "" +#: py/obj.c +msgid "object has no len" +msgstr "Objekt hat keine len" -#: shared-bindings/digitalio/DigitalInOut.c:266 -#: shared-bindings/digitalio/DigitalInOut.c:281 -msgid "Drive mode not used when direction is input." -msgstr "" +#: py/obj.c +msgid "object is not subscriptable" +msgstr "Objekt hat keine '__getitem__'-Methode (not subscriptable)" -#: shared-bindings/digitalio/DigitalInOut.c:314 -#: shared-bindings/digitalio/DigitalInOut.c:331 -msgid "Pull not used when direction is output." -msgstr "" +#: py/runtime.c +msgid "object not an iterator" +msgstr "Objekt ist kein Iterator" -#: shared-bindings/digitalio/DigitalInOut.c:340 -msgid "Unsupported pull value." +#: py/objtype.c py/runtime.c +msgid "object not callable" msgstr "" -#: shared-bindings/displayio/Bitmap.c:84 -msgid "y should be an int" -msgstr "" +#: py/sequence.c +msgid "object not in sequence" +msgstr "Objekt ist nicht in sequence" -#: shared-bindings/displayio/Bitmap.c:89 -msgid "row buffer must be a bytearray or array of type 'b' or 'B'" -msgstr "" +#: py/runtime.c +msgid "object not iterable" +msgstr "Objekt nicht iterierbar" -#: shared-bindings/displayio/Bitmap.c:94 -msgid "row data must be a buffer" -msgstr "" +#: py/obj.c +#, c-format +msgid "object of type '%s' has no len()" +msgstr "Objekt vom Typ '%s' hat keine len()" -#: shared-bindings/displayio/ColorConverter.c:72 -msgid "color should be an int" -msgstr "" +#: py/obj.c +msgid "object with buffer protocol required" +msgstr "Objekt mit Pufferprotokoll (buffer protocol) erforderlich" -#: shared-bindings/displayio/FourWire.c:55 -#: shared-bindings/displayio/FourWire.c:64 -msgid "displayio is a work in progress" -msgstr "" +#: extmod/modubinascii.c +msgid "odd-length string" +msgstr "String mit ungerader Länge" -#: shared-bindings/displayio/Group.c:65 -msgid "Group must have size at least 1" -msgstr "" +#: py/objstrunicode.c py/objstr.c +msgid "offset out of bounds" +msgstr "offset außerhalb der Grenzen" -#: shared-bindings/displayio/Palette.c:96 -msgid "color buffer must be a bytearray or array of type 'b' or 'B'" +#: shared-bindings/nvm/ByteArray.c py/objarray.c py/objtuple.c +#: py/objstrunicode.c py/objstr.c +msgid "only slices with step=1 (aka None) are supported" msgstr "" -#: shared-bindings/displayio/Palette.c:102 -msgid "color buffer must be 3 bytes (RGB) or 4 bytes (RGB + pad byte)" +#: py/modbuiltins.c +msgid "ord expects a character" +msgstr "ord erwartet ein Zeichen" + +#: py/modbuiltins.c +#, c-format +msgid "ord() expected a character, but string of length %d found" msgstr "" +"ord() erwartet ein Zeichen aber es wurde eine Zeichenfolge mit Länge %d " +"gefunden" -#: shared-bindings/displayio/Palette.c:106 -msgid "color must be between 0x000000 and 0xffffff" +#: py/objint_mpz.c +msgid "overflow converting long int to machine word" msgstr "" -#: shared-bindings/displayio/Palette.c:110 -msgid "color buffer must be a buffer or int" +#: shared-bindings/_stage/Text.c shared-bindings/_stage/Layer.c +msgid "palette must be 32 bytes long" msgstr "" -#: shared-bindings/displayio/Palette.c:123 -#: shared-bindings/displayio/Palette.c:137 +#: shared-bindings/displayio/Palette.c msgid "palette_index should be an int" msgstr "" -#: shared-bindings/displayio/Sprite.c:48 -msgid "position must be 2-tuple" -msgstr "" +#: py/compile.c +msgid "parameter annotation must be an identifier" +msgstr "parameter annotation muss ein identifier sein" -#: shared-bindings/displayio/Sprite.c:97 -#, fuzzy -msgid "unsupported bitmap type" -msgstr "Baudrate wird nicht unterstütz" +#: py/emitinlinextensa.c +msgid "parameters must be registers in sequence a2 to a5" +msgstr "Die Parameter müssen Register der Reihenfolge a2 bis a5 sein" -#: shared-bindings/displayio/Sprite.c:162 -msgid "pixel_shader must be displayio.Palette or displayio.ColorConverter" +#: py/emitinlinethumb.c +msgid "parameters must be registers in sequence r0 to r3" msgstr "" -#: shared-bindings/gamepad/GamePad.c:100 -msgid "too many arguments" -msgstr "" +#: ports/esp8266/machine_pin.c +msgid "pin does not have IRQ capabilities" +msgstr "Pin hat keine IRQ Fähigkeiten" -#: shared-bindings/gamepad/GamePad.c:104 -msgid "expected a DigitalInOut" -msgstr "" +#: shared-bindings/displayio/Bitmap.c +msgid "pixel coordinates out of bounds" +msgstr "Pixelkoordinaten außerhalb der Grenzen" -#: shared-bindings/i2cslave/I2CSlave.c:98 -msgid "can't convert address to int" +#: shared-bindings/displayio/Bitmap.c +msgid "pixel value requires too many bits" msgstr "" -#: shared-bindings/i2cslave/I2CSlave.c:101 -msgid "address out of bounds" -msgstr "" +#: shared-bindings/displayio/TileGrid.c +msgid "pixel_shader must be displayio.Palette or displayio.ColorConverter" +msgstr "pixel_shader muss displayio.Palette oder displayio.ColorConverter sein" -#: shared-bindings/i2cslave/I2CSlave.c:107 -msgid "addresses is empty" -msgstr "" +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +#: ports/nrf/common-hal/pulseio/PulseIn.c +#: ports/esp8266/common-hal/pulseio/PulseIn.c +msgid "pop from an empty PulseIn" +msgstr "pop von einem leeren PulseIn" -#: shared-bindings/microcontroller/Pin.c:89 -#: shared-bindings/neopixel_write/__init__.c:67 -#: shared-bindings/pulseio/PulseOut.c:76 -msgid "Expected a %q" -msgstr "" +#: py/objset.c +msgid "pop from an empty set" +msgstr "pop von einer leeren Menge (set)" -#: shared-bindings/microcontroller/Pin.c:100 -msgid "%q in use" -msgstr "" +#: py/objlist.c +msgid "pop from empty list" +msgstr "pop von einer leeren Liste" -#: shared-bindings/microcontroller/__init__.c:126 -msgid "Invalid run mode." -msgstr "" +#: py/objdict.c +msgid "popitem(): dictionary is empty" +msgstr "popitem(): dictionary ist leer" -#: shared-bindings/multiterminal/__init__.c:68 -msgid "Stream missing readinto() or write() method." -msgstr "" +#: py/objint_mpz.c +msgid "pow() 3rd argument cannot be 0" +msgstr "pow() drittes Argument darf nicht 0 sein" -#: shared-bindings/nvm/ByteArray.c:99 -msgid "Slice and value different lengths." +#: py/objint_mpz.c +msgid "pow() with 3 arguments requires integers" msgstr "" -#: shared-bindings/nvm/ByteArray.c:104 -msgid "Array values should be single bytes." -msgstr "" +#: extmod/modutimeq.c +msgid "queue overflow" +msgstr "Warteschlangenüberlauf" -#: shared-bindings/nvm/ByteArray.c:111 shared-bindings/nvm/ByteArray.c:141 -msgid "Unable to write to nvm." -msgstr "" +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "rawbuf is not the same size as buf" +msgstr "rawbuf hat nicht die gleiche Größe wie buf" -#: shared-bindings/nvm/ByteArray.c:137 -msgid "Bytes must be between 0 and 255." +#: shared-bindings/_pixelbuf/__init__.c +msgid "readonly attribute" +msgstr "Readonly-Attribut" + +#: py/builtinimport.c +msgid "relative import" +msgstr "relativer Import" + +#: py/obj.c +#, c-format +msgid "requested length %d but object has length %d" +msgstr "die ersuchte Länge ist %d, aber das Objekt hat eine Länge von %d" + +#: py/compile.c +msgid "return annotation must be an identifier" +msgstr "return annotation muss ein identifier sein" + +#: py/emitnative.c +msgid "return expected '%q' but got '%q'" msgstr "" -#: shared-bindings/os/__init__.c:200 -msgid "No hardware random available" +#: shared-module/displayio/Bitmap.c +msgid "row must be packed and word aligned" msgstr "" -#: shared-bindings/pulseio/PWMOut.c:164 -msgid "" -"PWM duty_cycle must be between 0 and 65535 inclusive (16 bit resolution)" +#: py/objstr.c +msgid "rsplit(None,n)" msgstr "" -#: shared-bindings/pulseio/PWMOut.c:195 +#: shared-bindings/audioio/RawSample.c msgid "" -"PWM frequency not writable when variable_frequency is False on construction." +"sample_source buffer must be a bytearray or array of type 'h', 'H', 'b' or " +"'B'" msgstr "" +"sample_source buffer muss ein Bytearray oder ein Array vom Typ 'h', 'H', 'b' " +"oder 'B' sein" -#: shared-bindings/pulseio/PulseIn.c:275 -msgid "Cannot delete values" -msgstr "" +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "sampling rate out of range" +msgstr "Abtastrate außerhalb der Reichweite" -#: shared-bindings/pulseio/PulseIn.c:281 -msgid "Slices not supported" -msgstr "" +#: ports/esp8266/modnetwork.c +msgid "scan failed" +msgstr "Scan fehlgeschlagen" -#: shared-bindings/pulseio/PulseIn.c:287 -msgid "index must be int" -msgstr "" +#: py/modmicropython.c +msgid "schedule stack full" +msgstr "Der schedule stack ist voll" -#: shared-bindings/pulseio/PulseIn.c:293 -msgid "Read-only" -msgstr "" +#: lib/utils/pyexec.c py/builtinimport.c +msgid "script compilation not supported" +msgstr "kompilieren von Skripten ist nicht unterstützt" -#: shared-bindings/pulseio/PulseOut.c:135 -msgid "Array must contain halfwords (type 'H')" +#: shared-bindings/bleio/Peripheral.c +msgid "services includes an object that is not a Service" msgstr "" -#: shared-bindings/random/__init__.c:92 shared-bindings/random/__init__.c:100 -msgid "stop not reachable from start" +#: py/objstr.c +msgid "sign not allowed in string format specifier" msgstr "" -#: shared-bindings/random/__init__.c:111 -msgid "step must be non-zero" +#: py/objstr.c +msgid "sign not allowed with integer format specifier 'c'" msgstr "" -#: shared-bindings/random/__init__.c:114 -msgid "invalid step" +#: py/objstr.c +msgid "single '}' encountered in format string" msgstr "" -#: shared-bindings/random/__init__.c:146 -msgid "empty sequence" +#: shared-bindings/time/__init__.c +msgid "sleep length must be non-negative" msgstr "" -#: shared-bindings/rtc/RTC.c:40 shared-bindings/rtc/RTC.c:44 -#: shared-bindings/time/__init__.c:190 -msgid "RTC is not supported on this board" +#: py/objslice.c py/sequence.c +msgid "slice step cannot be zero" msgstr "" -#: shared-bindings/rtc/RTC.c:52 -msgid "RTC calibration is not supported on this board" -msgstr "" +#: py/sequence.c py/objint.c +msgid "small int overflow" +msgstr "small int Überlauf" -#: shared-bindings/socket/__init__.c:516 shared-module/network/__init__.c:81 -msgid "no available NIC" -msgstr "" +#: main.c +msgid "soft reboot\n" +msgstr "weicher reboot\n" -#: shared-bindings/storage/__init__.c:77 -msgid "filesystem must provide mount method" +#: py/objstr.c +msgid "start/end indices" msgstr "" -#: shared-bindings/supervisor/__init__.c:93 -msgid "Brightness must be between 0 and 255" +#: shared-bindings/displayio/Shape.c +msgid "start_x should be an int" msgstr "" -#: shared-bindings/supervisor/__init__.c:119 -msgid "Stack size must be at least 256" -msgstr "" +#: shared-bindings/random/__init__.c +msgid "step must be non-zero" +msgstr "Schritt (step) darf nicht Null sein" -#: shared-bindings/time/__init__.c:78 -msgid "sleep length must be non-negative" -msgstr "" +#: shared-bindings/busio/UART.c +msgid "stop must be 1 or 2" +msgstr "stop muss 1 oder 2 sein" -#: shared-bindings/time/__init__.c:88 -msgid "time.struct_time() takes exactly 1 argument" -msgstr "" +#: shared-bindings/random/__init__.c +msgid "stop not reachable from start" +msgstr "stop ist von start aus nicht erreichbar" -#: shared-bindings/time/__init__.c:91 -msgid "time.struct_time() takes a 9-sequence" -msgstr "" +#: py/stream.c +msgid "stream operation not supported" +msgstr "stream operation ist nicht unterstützt" -#: shared-bindings/time/__init__.c:169 shared-bindings/time/__init__.c:263 -msgid "Tuple or struct_time argument required" +#: py/objstrunicode.c +msgid "string index out of range" msgstr "" -#: shared-bindings/time/__init__.c:174 shared-bindings/time/__init__.c:268 -msgid "function takes exactly 9 arguments" +#: py/objstrunicode.c +#, c-format +msgid "string indices must be integers, not %s" msgstr "" -#: shared-bindings/time/__init__.c:239 shared-bindings/time/__init__.c:272 -msgid "timestamp out of range for platform time_t" +#: py/stream.c +msgid "string not supported; use bytes or bytearray" msgstr "" +"Zeichenfolgen werden nicht unterstützt; Verwenden Sie bytes oder bytearray" + +#: extmod/moductypes.c +msgid "struct: cannot index" +msgstr "struct: kann nicht indexieren" + +#: extmod/moductypes.c +msgid "struct: index out of range" +msgstr "struct: index außerhalb gültigen Bereichs" -#: shared-bindings/touchio/TouchIn.c:173 +#: extmod/moductypes.c +msgid "struct: no fields" +msgstr "struct: keine Felder" + +#: py/objstr.c +msgid "substring not found" +msgstr "substring nicht gefunden" + +#: py/compile.c +msgid "super() can't find self" +msgstr "super() kann self nicht finden" + +#: extmod/modujson.c +msgid "syntax error in JSON" +msgstr "Syntaxfehler in JSON" + +#: extmod/moductypes.c +msgid "syntax error in uctypes descriptor" +msgstr "Syntaxfehler in uctypes Deskriptor" + +#: shared-bindings/touchio/TouchIn.c msgid "threshold must be in the range 0-65536" -msgstr "" +msgstr "threshold muss im Intervall 0-65536 liegen" -#: shared-bindings/util.c:38 -msgid "" -"Object has been deinitialized and can no longer be used. Create a new object." +#: shared-bindings/displayio/TileGrid.c +msgid "tile index out of bounds" msgstr "" -#: shared-module/audioio/Mixer.c:47 shared-module/audioio/WaveFile.c:117 -msgid "Couldn't allocate first buffer" +#: shared-bindings/time/__init__.c +msgid "time.struct_time() takes a 9-sequence" msgstr "" -#: shared-module/audioio/Mixer.c:53 shared-module/audioio/WaveFile.c:123 -msgid "Couldn't allocate second buffer" +#: shared-bindings/time/__init__.c +msgid "time.struct_time() takes exactly 1 argument" msgstr "" -#: shared-module/audioio/Mixer.c:82 -msgid "Voice index too high" +#: shared-bindings/busio/UART.c +msgid "timeout >100 (units are now seconds, not msecs)" msgstr "" -#: shared-module/audioio/Mixer.c:85 -msgid "The sample's sample rate does not match the mixer's" -msgstr "" +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "timeout must be >= 0.0" +msgstr "timeout muss >= 0.0 sein" -#: shared-module/audioio/Mixer.c:88 -msgid "The sample's channel count does not match the mixer's" +#: shared-bindings/time/__init__.c +msgid "timestamp out of range for platform time_t" msgstr "" -#: shared-module/audioio/Mixer.c:91 -msgid "The sample's bits_per_sample does not match the mixer's" -msgstr "" +#: shared-bindings/gamepad/GamePad.c +msgid "too many arguments" +msgstr "zu viele Argumente" -#: shared-module/audioio/Mixer.c:100 -msgid "The sample's signedness does not match the mixer's" +#: shared-module/struct/__init__.c +msgid "too many arguments provided with the given format" msgstr "" -#: shared-module/audioio/WaveFile.c:61 -msgid "Invalid wave file" +#: py/runtime.c +#, c-format +msgid "too many values to unpack (expected %d)" msgstr "" -#: shared-module/audioio/WaveFile.c:69 -msgid "Invalid format chunk size" +#: py/objstr.c +msgid "tuple index out of range" msgstr "" -#: shared-module/audioio/WaveFile.c:83 -msgid "Unsupported format" -msgstr "" +#: py/obj.c +msgid "tuple/list has wrong length" +msgstr "tupel/list hat falsche Länge" -#: shared-module/audioio/WaveFile.c:99 -msgid "Data chunk must follow fmt chunk" +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "tuple/list required on RHS" msgstr "" -#: shared-module/audioio/WaveFile.c:107 -msgid "Invalid file" -msgstr "" +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "tx and rx cannot both be None" +msgstr "tx und rx können nicht beide None sein" -#: shared-module/bitbangio/I2C.c:58 -msgid "Clock stretch too long" +#: py/objtype.c +msgid "type '%q' is not an acceptable base type" msgstr "" -#: shared-module/bitbangio/SPI.c:44 -msgid "Clock pin init failed." +#: py/objtype.c +msgid "type is not an acceptable base type" msgstr "" -#: shared-module/bitbangio/SPI.c:50 -msgid "MOSI pin init failed." +#: py/runtime.c +msgid "type object '%q' has no attribute '%q'" msgstr "" -#: shared-module/bitbangio/SPI.c:61 -msgid "MISO pin init failed." +#: py/objtype.c +msgid "type takes 1 or 3 arguments" msgstr "" -#: shared-module/bitbangio/SPI.c:121 -msgid "Cannot write without MOSI pin." +#: py/objint_longlong.c +msgid "ulonglong too large" msgstr "" -#: shared-module/bitbangio/SPI.c:176 -msgid "Cannot read without MISO pin." -msgstr "" +#: py/emitnative.c +msgid "unary op %q not implemented" +msgstr "Der unäre Operator %q ist nicht implementiert" -#: shared-module/bitbangio/SPI.c:240 -msgid "Cannot transfer without MOSI and MISO pins." +#: py/parse.c +msgid "unexpected indent" msgstr "" +"unerwarteter Einzug (Einrückung) Bitte Leerzeichen am Zeilenanfang " +"kontrollieren!" -#: shared-module/displayio/Bitmap.c:49 -msgid "Only bit maps of 8 bit color or less are supported" -msgstr "" +#: py/bc.c +msgid "unexpected keyword argument" +msgstr "unerwartetes Keyword-Argument" -#: shared-module/displayio/Bitmap.c:69 -msgid "row must be packed and word aligned" -msgstr "" +#: py/objnamedtuple.c py/bc.c +msgid "unexpected keyword argument '%q'" +msgstr "unerwartetes Keyword-Argument '%q'" -#: shared-module/displayio/Group.c:39 -msgid "Group full" +#: py/lexer.c +msgid "unicode name escapes" msgstr "" -#: shared-module/displayio/Group.c:48 -msgid "Group empty" +#: py/parse.c +msgid "unindent does not match any outer indentation level" msgstr "" +"Einrückung entspricht keiner äußeren Einrückungsebene. Bitte Leerzeichen am " +"Zeilenanfang kontrollieren!" -#: shared-module/displayio/OnDiskBitmap.c:49 -#, fuzzy -msgid "Invalid BMP file" -msgstr "Ungültiger Pin" +#: ports/esp8266/modnetwork.c +msgid "unknown config param" +msgstr "" -#: shared-module/displayio/OnDiskBitmap.c:59 +#: py/objstr.c #, c-format -msgid "Only Windows format, uncompressed BMP supported %d" +msgid "unknown conversion specifier %c" msgstr "" -#: shared-module/displayio/OnDiskBitmap.c:64 +#: py/objstr.c #, c-format -msgid "Only true color (24 bpp or higher) BMP supported %x" +msgid "unknown format code '%c' for object of type '%s'" msgstr "" -#: shared-module/storage/__init__.c:155 -msgid "Cannot remount '/' when USB is active." -msgstr "Kann '/' nicht remounten when USB aktiv ist" - -#: shared-module/struct/__init__.c:39 -msgid "'S' and 'O' are not supported format types" +#: py/objstr.c +#, c-format +msgid "unknown format code '%c' for object of type 'float'" msgstr "" -#: shared-module/struct/__init__.c:83 -msgid "too many arguments provided with the given format" +#: py/objstr.c +#, c-format +msgid "unknown format code '%c' for object of type 'str'" msgstr "" -#: shared-module/usb_hid/Device.c:45 -#, c-format -msgid "Buffer incorrect size. Should be %d bytes." -msgstr "Buffergröße falsch, sollte %d bytes sein." +#: ports/esp8266/modnetwork.c +msgid "unknown status param" +msgstr "Unbekannter Statusparameter" -#: shared-module/usb_hid/Device.c:53 -msgid "USB Busy" -msgstr "USB beschäftigt" +#: py/compile.c +msgid "unknown type" +msgstr "unbekannter Typ" -#: shared-module/usb_hid/Device.c:59 -msgid "USB Error" -msgstr "USB Fehler" +#: py/emitnative.c +msgid "unknown type '%q'" +msgstr "unbekannter Typ '%q'" -#: supervisor/shared/safe_mode.c:97 -msgid "You requested starting safe mode by " -msgstr "Du hast das Starten im Sicherheitsmodus ausgelöst durch " +#: py/objstr.c +msgid "unmatched '{' in format" +msgstr "" -#: supervisor/shared/safe_mode.c:100 -msgid "To exit, please reset the board without " -msgstr "Zum beenden bitte resette das board ohne " +#: py/objtype.c py/runtime.c +msgid "unreadable attribute" +msgstr "nicht lesbares Attribut" -#: supervisor/shared/safe_mode.c:107 -#, fuzzy -msgid "" -"You are running in safe mode which means something unanticipated happened.\n" -msgstr "Sicherheitsmodus aktiv, etwas wirklich schlechtes ist passiert.\n" +#: py/emitinlinethumb.c +#, c-format +msgid "unsupported Thumb instruction '%s' with %d arguments" +msgstr "nicht unterstützter Thumb-Befehl '%s' mit %d Argumenten" -#: supervisor/shared/safe_mode.c:109 -msgid "" -"Looks like our core CircuitPython code crashed hard. Whoops!\n" -"Please file an issue at https://github.com/adafruit/circuitpython/issues\n" -" with the contents of your CIRCUITPY drive and this message:\n" +#: py/emitinlinextensa.c +#, c-format +msgid "unsupported Xtensa instruction '%s' with %d arguments" msgstr "" -#: supervisor/shared/safe_mode.c:111 -msgid "Crash into the HardFault_Handler.\n" -msgstr "" +#: shared-bindings/displayio/TileGrid.c +msgid "unsupported bitmap type" +msgstr "Nicht unterstützter Bitmap-Typ" -#: supervisor/shared/safe_mode.c:113 -msgid "MicroPython NLR jump failed. Likely memory corruption.\n" +#: py/objstr.c +#, c-format +msgid "unsupported format character '%c' (0x%x) at index %d" msgstr "" -#: supervisor/shared/safe_mode.c:115 -msgid "MicroPython fatal error.\n" -msgstr "" +#: py/runtime.c +msgid "unsupported type for %q: '%s'" +msgstr "nicht unterstützter Type für %q: '%s'" -#: supervisor/shared/safe_mode.c:118 -#, fuzzy -msgid "" -"The microcontroller's power dipped. Please make sure your power supply " -"provides\n" -"enough power for the whole circuit and press reset (after ejecting " -"CIRCUITPY).\n" -msgstr "" -"Die Stromversorgung des Mikrocontrollers ist eingebrochen. Stelle sicher," -"dass deine Stromversorgung\n" +#: py/runtime.c +msgid "unsupported type for operator" +msgstr "nicht unterstützter Typ für Operator" -#: supervisor/shared/safe_mode.c:120 -msgid "" -"The CircuitPython heap was corrupted because the stack was too small.\n" -"Please increase stack size limits and press reset (after ejecting " -"CIRCUITPY).\n" -"If you didn't change the stack, then file an issue here with the contents of " -"your CIRCUITPY drive:\n" -msgstr "" +#: py/runtime.c +msgid "unsupported types for %q: '%s', '%s'" +msgstr "nicht unterstützte Typen für %q: '%s', '%s'" -#: supervisor/shared/safe_mode.c:123 -msgid "" -"The reset button was pressed while booting CircuitPython. Press again to " -"exit safe mode.\n" +#: shared-bindings/displayio/Bitmap.c +msgid "value_count must be > 0" msgstr "" -#~ msgid "Invalid Service type" -#~ msgstr "Ungültiger Diensttyp" - -#~ msgid "Can not apply advertisement data. status: 0x%02x" -#~ msgstr "Kann advertisement data nicht anwenden. Status: 0x%02x" +#: ports/esp8266/modnetwork.c +msgid "wifi_set_ip_info() failed" +msgstr "wifi_set_ip_info() fehlgeschlagen" -#~ msgid "Cannot apply GAP parameters." -#~ msgstr "Kann GAP Parameter nicht anwenden." +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "write_args must be a list, tuple, or None" +msgstr "write_args muss eine Liste, ein Tupel oder None sein" -#~ msgid "Can not apply device name in the stack." -#~ msgstr "Der Gerätename kann nicht im Stack verwendet werden." +#: py/objstr.c +msgid "wrong number of arguments" +msgstr "falsche Anzahl an Argumenten" -#~ msgid "Cannot set PPCP parameters." -#~ msgstr "Kann PPCP Parameter nicht setzen." +#: py/runtime.c +msgid "wrong number of values to unpack" +msgstr "falsche Anzahl zu entpackender Werte" -#~ msgid "" -#~ "enough power for the whole circuit and press reset (after ejecting " -#~ "CIRCUITPY).\n" -#~ msgstr "" -#~ "genug Strom für den ganzen Schaltkreis liefert und drücke reset (nach dem " -#~ "sicheren Auswerfen von CIRCUITPY.)\n" +#: shared-module/displayio/Shape.c +msgid "x value out of bounds" +msgstr "x Wert außerhalb der Grenzen" -#~ msgid "Can not query for the device address." -#~ msgstr "Kann nicht nach der Geräteadresse suchen." +#: shared-bindings/displayio/Shape.c +msgid "y should be an int" +msgstr "y sollte ein int sein" -#~ msgid "Can not add Characteristic." -#~ msgstr "Kann das Merkmal nicht hinzufügen." +#: shared-module/displayio/Shape.c +msgid "y value out of bounds" +msgstr "y Wert außerhalb der Grenzen" -#~ msgid "Can not encode UUID, to check length." -#~ msgstr "Kann UUID nicht kodieren, um die Länge zu überprüfen." +#: py/objrange.c +msgid "zero step" +msgstr "" -#~ msgid "Can encode UUID into the advertisement packet." -#~ msgstr "Kann UUID in das advertisement packet kodieren." +#~ msgid "Failed to notify or indicate attribute value, err %0x04x" +#~ msgstr "Kann den Attributwert nicht mitteilen. Status: 0x%04x" -#~ msgid "Can not add Service." -#~ msgstr "Kann den Dienst nicht hinzufügen." +#~ msgid "Failed to read attribute value, err %0x04x" +#~ msgstr "Kann den Attributwert nicht lesen. Status: 0x%04x" -#~ msgid "" -#~ "Please file an issue here with the contents of your CIRCUITPY drive:\n" +#~ msgid "Function requires lock." #~ msgstr "" -#~ "Bitte erstelle ein issue hier mit dem Inhalt deines CIRCUITPY-speichers:\n" +#~ "Die Funktion erwartet, dass der 'lock'-Befehl zuvor ausgeführt wurde" -#~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n" -#~ msgstr "CircuitPython ist abgestürzt. Ups!\n" +#~ msgid "Only Windows format, uncompressed BMP supported %d" +#~ msgstr "Nur unkomprimiertes Windows-Format (BMP) unterstützt %d" diff --git a/locale/en_US.po b/locale/en_US.po index 119dde3d6..da189c661 100644 --- a/locale/en_US.po +++ b/locale/en_US.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-12-26 20:49+0100\n" +"POT-Creation-Date: 2019-03-25 19:40+0100\n" "PO-Revision-Date: 2018-07-27 11:55-0700\n" "Last-Translator: \n" "Language-Team: \n" @@ -17,2532 +17,2806 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.1.1\n" -#: extmod/machine_i2c.c:299 -msgid "invalid I2C peripheral" -msgstr "" - -#: extmod/machine_i2c.c:340 extmod/machine_i2c.c:354 extmod/machine_i2c.c:368 -#: extmod/machine_i2c.c:392 -msgid "I2C operation not supported" +#: main.c +msgid "" +"\n" +"Code done running. Waiting for reload.\n" msgstr "" -#: extmod/machine_mem.c:45 ports/unix/modmachine.c:53 -#, c-format -msgid "address %08x is not aligned to %d bytes" +#: py/obj.c +msgid " File \"%q\"" msgstr "" -#: extmod/machine_spi.c:57 -msgid "invalid SPI peripheral" +#: py/obj.c +msgid " File \"%q\", line %d" msgstr "" -#: extmod/machine_spi.c:124 -msgid "buffers must be the same length" +#: main.c +msgid " output:\n" msgstr "" -#: extmod/machine_spi.c:207 -msgid "bits must be 8" +#: py/objstr.c +#, c-format +msgid "%%c requires int or char" msgstr "" -#: extmod/machine_spi.c:210 -msgid "firstbit must be MSB" +#: shared-bindings/microcontroller/Pin.c +msgid "%q in use" msgstr "" -#: extmod/machine_spi.c:215 -msgid "must specify all of sck/mosi/miso" +#: py/obj.c +msgid "%q index out of range" msgstr "" -#: extmod/modframebuf.c:299 -msgid "invalid format" +#: py/obj.c +msgid "%q indices must be integers, not %s" msgstr "" -#: extmod/modubinascii.c:38 extmod/moduhashlib.c:102 -msgid "a bytes-like object is required" +#: shared-bindings/displayio/Group.c shared-bindings/displayio/Shape.c +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "%q must be >= 1" msgstr "" -#: extmod/modubinascii.c:90 -msgid "odd-length string" +#: shared-bindings/fontio/BuiltinFont.c +msgid "%q should be an int" msgstr "" -#: extmod/modubinascii.c:101 -msgid "non-hex digit found" +#: py/objnamedtuple.c py/bc.c +msgid "%q() takes %d positional arguments but %d were given" msgstr "" -#: extmod/modubinascii.c:169 -msgid "incorrect padding" +#: py/argcheck.c +msgid "'%q' argument required" msgstr "" -#: extmod/moductypes.c:122 -msgid "syntax error in uctypes descriptor" +#: py/emitinlinextensa.c py/emitinlinethumb.c +#, c-format +msgid "'%s' expects a label" msgstr "" -#: extmod/moductypes.c:219 -msgid "Cannot unambiguously get sizeof scalar" +#: py/emitinlinextensa.c py/emitinlinethumb.c +#, c-format +msgid "'%s' expects a register" msgstr "" -#: extmod/moductypes.c:397 -msgid "struct: no fields" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects a special register" msgstr "" -#: extmod/moductypes.c:530 -msgid "struct: cannot index" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects an FPU register" msgstr "" -#: extmod/moductypes.c:544 -msgid "struct: index out of range" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects an address of the form [a, b]" msgstr "" -#: extmod/moduheapq.c:38 -msgid "heap must be a list" +#: py/emitinlinextensa.c py/emitinlinethumb.c +#, c-format +msgid "'%s' expects an integer" msgstr "" -#: extmod/moduheapq.c:86 extmod/modutimeq.c:147 extmod/modutimeq.c:172 -msgid "empty heap" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects at most r%d" msgstr "" -#: extmod/modujson.c:281 -msgid "syntax error in JSON" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects {r0, r1, ...}" msgstr "" -#: extmod/modure.c:161 -msgid "Splitting with sub-captures" +#: py/emitinlinextensa.c +#, c-format +msgid "'%s' integer %d is not within range %d..%d" msgstr "" -#: extmod/modure.c:207 -msgid "Error in regex" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' integer 0x%x does not fit in mask 0x%x" msgstr "" -#: extmod/modussl_axtls.c:81 -msgid "invalid key" +#: py/obj.c +#, c-format +msgid "'%s' object does not support item assignment" msgstr "" -#: extmod/modussl_axtls.c:87 -msgid "invalid cert" +#: py/obj.c +#, c-format +msgid "'%s' object does not support item deletion" msgstr "" -#: extmod/modutimeq.c:131 -msgid "queue overflow" +#: py/runtime.c +msgid "'%s' object has no attribute '%q'" msgstr "" -#: extmod/moduzlib.c:98 -msgid "compression header" +#: py/runtime.c +#, c-format +msgid "'%s' object is not an iterator" msgstr "" -#: extmod/uos_dupterm.c:120 -msgid "invalid dupterm index" +#: py/objtype.c py/runtime.c +#, c-format +msgid "'%s' object is not callable" msgstr "" -#: extmod/vfs_fat.c:426 py/moduerrno.c:154 -msgid "Read-only filesystem" +#: py/runtime.c +#, c-format +msgid "'%s' object is not iterable" msgstr "" -#: extmod/vfs_posix_file.c:48 ports/unix/file.c:50 py/objstringio.c:43 -msgid "I/O operation on closed file" +#: py/obj.c +#, c-format +msgid "'%s' object is not subscriptable" msgstr "" -#: lib/embed/abort_.c:8 -msgid "abort() called" +#: py/objstr.c +msgid "'=' alignment not allowed in string format specifier" msgstr "" -#: lib/netutils/netutils.c:83 -msgid "invalid arguments" +#: shared-module/struct/__init__.c +msgid "'S' and 'O' are not supported format types" msgstr "" -#: lib/utils/pyexec.c:97 py/builtinimport.c:251 -msgid "script compilation not supported" +#: py/compile.c +msgid "'align' requires 1 argument" msgstr "" -#: main.c:150 -msgid " output:\n" +#: py/compile.c +msgid "'await' outside function" msgstr "" -#: main.c:164 main.c:237 -msgid "" -"Auto-reload is on. Simply save files over USB to run them or enter REPL to " -"disable.\n" +#: py/compile.c +msgid "'break' outside loop" msgstr "" -#: main.c:166 -msgid "Running in safe mode! Auto-reload is off.\n" +#: py/compile.c +msgid "'continue' outside loop" msgstr "" -#: main.c:168 main.c:239 -msgid "Auto-reload is off.\n" +#: py/compile.c +msgid "'data' requires at least 2 arguments" msgstr "" -#: main.c:182 -msgid "Running in safe mode! Not running saved code.\n" +#: py/compile.c +msgid "'data' requires integer arguments" msgstr "" -#: main.c:198 -msgid "WARNING: Your code filename has two extensions\n" +#: py/compile.c +msgid "'label' requires 1 argument" msgstr "" -#: main.c:244 -msgid "Press any key to enter the REPL. Use CTRL-D to reload." +#: py/compile.c +msgid "'return' outside function" msgstr "" -#: main.c:407 -msgid "soft reboot\n" +#: py/compile.c +msgid "'yield' outside function" msgstr "" -#: ports/atmel-samd/audio_dma.c:209 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:361 -msgid "All sync event channels in use" +#: py/compile.c +msgid "*x must be assignment target" msgstr "" -#: ports/atmel-samd/bindings/samd/Clock.c:135 -msgid "calibration is read only" +#: py/obj.c +msgid ", in %q\n" msgstr "" -#: ports/atmel-samd/bindings/samd/Clock.c:137 -msgid "calibration is out of range" +#: py/objcomplex.c +msgid "0.0 to a complex power" msgstr "" -#: ports/atmel-samd/board_busses.c:59 ports/nrf/board_busses.c:39 -msgid "No default I2C bus" +#: py/modbuiltins.c +msgid "3-arg pow() not supported" msgstr "" -#: ports/atmel-samd/board_busses.c:85 ports/nrf/board_busses.c:64 -msgid "No default SPI bus" +#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c +msgid "A hardware interrupt channel is already in use" msgstr "" -#: ports/atmel-samd/board_busses.c:112 ports/nrf/board_busses.c:91 -msgid "No default UART bus" +#: ports/esp8266/modnetwork.c +msgid "AP required" msgstr "" -#: ports/atmel-samd/common-hal/analogio/AnalogIn.c:63 -#: ports/nrf/common-hal/analogio/AnalogIn.c:39 -msgid "Pin does not have ADC capabilities" +#: shared-bindings/bleio/Address.c +#, c-format +msgid "Address is not %d bytes long or is in wrong format" msgstr "" -#: ports/atmel-samd/common-hal/analogio/AnalogOut.c:49 -msgid "No DAC on chip" +#: shared-bindings/bleio/Address.c +#, c-format +msgid "Address must be %d bytes long" msgstr "" -#: ports/atmel-samd/common-hal/analogio/AnalogOut.c:56 -msgid "AnalogOut not supported on given pin" +#: ports/nrf/common-hal/busio/I2C.c +msgid "All I2C peripherals are in use" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:147 -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:150 -msgid "Invalid bit clock pin" +#: ports/nrf/common-hal/busio/SPI.c +msgid "All SPI peripherals are in use" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:153 -msgid "Bit clock and word select must share a clock unit" +#: ports/nrf/common-hal/busio/UART.c +msgid "All UART peripherals are in use" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:156 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:130 -msgid "Invalid data pin" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "All event channels in use" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:169 -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:174 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:145 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:150 -msgid "Serializer in use" +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c ports/atmel-samd/audio_dma.c +msgid "All sync event channels in use" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:230 -msgid "Clock unit in use" +#: shared-bindings/pulseio/PWMOut.c +msgid "All timers for this pin are in use" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:240 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:172 -msgid "Unable to find free GCLK" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/pulseio/PulseOut.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c +#: shared-module/_pew/PewPew.c +msgid "All timers in use" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:254 -msgid "Too many channels in sample." +#: ports/nrf/common-hal/analogio/AnalogOut.c +msgid "AnalogOut functionality not supported" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:305 -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:417 -msgid "No DMA channel found" +#: shared-bindings/analogio/AnalogOut.c +msgid "AnalogOut is only 16 bits. Value must be less than 65536." msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:308 -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:419 -msgid "Unable to allocate buffers for signed conversion" +#: ports/atmel-samd/common-hal/analogio/AnalogOut.c +msgid "AnalogOut not supported on given pin" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:109 -msgid "Invalid clock pin" +#: ports/atmel-samd/common-hal/pulseio/PulseOut.c +msgid "Another send is already active" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:134 -msgid "Only 8 or 16 bit mono with " +#: shared-bindings/pulseio/PulseOut.c +msgid "Array must contain halfwords (type 'H')" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:167 -msgid "sampling rate out of range" +#: shared-bindings/nvm/ByteArray.c +msgid "Array values should be single bytes." msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:132 -msgid "DAC already in use" +#: supervisor/shared/safe_mode.c +msgid "Attempted heap allocation when MicroPython VM not running.\n" msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:136 -msgid "Right channel unsupported" +#: main.c +msgid "Auto-reload is off.\n" msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:139 -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:116 -#: ports/atmel-samd/common-hal/touchio/TouchIn.c:65 -msgid "Invalid pin" +#: main.c +msgid "" +"Auto-reload is on. Simply save files over USB to run them or enter REPL to " +"disable.\n" msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:147 -msgid "Invalid pin for left channel" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Bit clock and word select must share a clock unit" msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:151 -msgid "Invalid pin for right channel" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Bit depth must be multiple of 8." msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:154 -msgid "Cannot output both channels on the same pin" +#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c +msgid "Both pins must support hardware interrupts" msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:243 -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:189 -#: ports/atmel-samd/common-hal/pulseio/PulseOut.c:110 -#: ports/nrf/common-hal/pulseio/PulseOut.c:107 -msgid "All timers in use" +#: shared-bindings/supervisor/__init__.c +msgid "Brightness must be between 0 and 255" msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:285 -msgid "All event channels in use" +#: shared-bindings/displayio/Display.c +msgid "Brightness not adjustable" msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:375 +#: shared-module/usb_hid/Device.c #, c-format -msgid "Sample rate too high. It must be less than %d" +msgid "Buffer incorrect size. Should be %d bytes." msgstr "" -#: ports/atmel-samd/common-hal/busio/I2C.c:71 -msgid "Not enough pins available" +#: shared-bindings/bitbangio/I2C.c shared-bindings/busio/I2C.c +msgid "Buffer must be at least length 1" msgstr "" -#: ports/atmel-samd/common-hal/busio/I2C.c:78 -#: ports/atmel-samd/common-hal/busio/SPI.c:171 -#: ports/atmel-samd/common-hal/busio/UART.c:120 -#: ports/atmel-samd/common-hal/i2cslave/I2CSlave.c:45 -#: ports/nrf/common-hal/busio/I2C.c:82 -msgid "Invalid pins" +#: ports/atmel-samd/common-hal/displayio/ParallelBus.c +#: ports/nrf/common-hal/displayio/ParallelBus.c +#, c-format +msgid "Bus pin %d is already in use" msgstr "" -#: ports/atmel-samd/common-hal/busio/I2C.c:101 -msgid "SDA or SCL needs a pull up" +#: shared-bindings/bleio/UUID.c +msgid "Byte buffer must be 16 bytes." msgstr "" -#: ports/atmel-samd/common-hal/busio/I2C.c:121 -msgid "Unsupported baudrate" +#: shared-bindings/nvm/ByteArray.c +msgid "Bytes must be between 0 and 255." msgstr "" -#: ports/atmel-samd/common-hal/busio/UART.c:67 -msgid "bytes > 8 bits not supported" +#: ports/esp8266/esp_mphal.c +msgid "C-level assert" msgstr "" -#: ports/atmel-samd/common-hal/busio/UART.c:73 -#: ports/nrf/common-hal/busio/UART.c:106 -msgid "tx and rx cannot both be None" +#: shared-bindings/_pixelbuf/PixelBuf.c +#, c-format +msgid "Can not use dotstar with %s" msgstr "" -#: ports/atmel-samd/common-hal/busio/UART.c:146 -#: ports/nrf/common-hal/busio/UART.c:140 -msgid "Failed to allocate RX buffer" +#: shared-bindings/bleio/Device.c +msgid "Can't add services in Central mode" msgstr "" -#: ports/atmel-samd/common-hal/busio/UART.c:154 -msgid "Could not initialize UART" +#: shared-bindings/bleio/Device.c +msgid "Can't advertise in Central mode" msgstr "" -#: ports/atmel-samd/common-hal/busio/UART.c:241 -#: ports/nrf/common-hal/busio/UART.c:185 -msgid "No RX pin" +#: shared-bindings/bleio/Device.c +msgid "Can't change the name in Central mode" msgstr "" -#: ports/atmel-samd/common-hal/busio/UART.c:300 -#: ports/nrf/common-hal/busio/UART.c:220 -msgid "No TX pin" +#: shared-bindings/bleio/Device.c +msgid "Can't connect in Peripheral mode" msgstr "" -#: ports/atmel-samd/common-hal/digitalio/DigitalInOut.c:170 -#: ports/nrf/common-hal/digitalio/DigitalInOut.c:147 -msgid "Cannot get pull while in output mode" +#: ports/esp8266/modnetwork.c +msgid "Cannot connect to AP" msgstr "" -#: ports/atmel-samd/common-hal/microcontroller/__init__.c:74 -#: ports/esp8266/common-hal/microcontroller/__init__.c:64 -msgid "Cannot reset into bootloader because no bootloader is present." +#: shared-bindings/displayio/Bitmap.c shared-bindings/pulseio/PulseIn.c +msgid "Cannot delete values" msgstr "" -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:120 -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:369 -#: ports/nrf/common-hal/pulseio/PWMOut.c:119 -#: ports/nrf/common-hal/pulseio/PWMOut.c:233 -msgid "Invalid PWM frequency" +#: ports/esp8266/modnetwork.c +msgid "Cannot disconnect from AP" msgstr "" -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:187 -msgid "All timers for this pin are in use" +#: ports/atmel-samd/common-hal/digitalio/DigitalInOut.c +#: ports/nrf/common-hal/digitalio/DigitalInOut.c +msgid "Cannot get pull while in output mode" msgstr "" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:110 -msgid "No hardware support on pin" +#: ports/nrf/common-hal/microcontroller/Processor.c +msgid "Cannot get temperature" msgstr "" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:113 -msgid "EXTINT channel already in use" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Cannot output both channels on the same pin" msgstr "" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:118 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:86 -#, c-format -msgid "Failed to allocate RX buffer of %d bytes" +#: shared-module/bitbangio/SPI.c +msgid "Cannot read without MISO pin." msgstr "" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:205 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:151 -msgid "pop from an empty PulseIn" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Cannot record to a file" msgstr "" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:237 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:422 -msgid "index out of range" +#: shared-module/storage/__init__.c +msgid "Cannot remount '/' when USB is active." msgstr "" -#: ports/atmel-samd/common-hal/pulseio/PulseOut.c:178 -msgid "Another send is already active" +#: ports/atmel-samd/common-hal/microcontroller/__init__.c +#: ports/esp8266/common-hal/microcontroller/__init__.c +msgid "Cannot reset into bootloader because no bootloader is present." msgstr "" -#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c:38 -msgid "Both pins must support hardware interrupts" +#: ports/esp8266/modnetwork.c +msgid "Cannot set STA config" msgstr "" -#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c:46 -msgid "A hardware interrupt channel is already in use" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Cannot set value when direction is input." msgstr "" -#: ports/atmel-samd/common-hal/rtc/RTC.c:101 -msgid "calibration value out of range +/-127" +#: py/objslice.c +msgid "Cannot subclass slice" msgstr "" -#: ports/atmel-samd/common-hal/touchio/TouchIn.c:75 -msgid "No free GCLKs" +#: shared-module/bitbangio/SPI.c +msgid "Cannot transfer without MOSI and MISO pins." msgstr "" -#: ports/esp8266/common-hal/analogio/AnalogIn.c:43 -msgid "Pin %q does not have ADC capabilities" +#: extmod/moductypes.c +msgid "Cannot unambiguously get sizeof scalar" msgstr "" -#: ports/esp8266/common-hal/analogio/AnalogOut.c:39 -msgid "No hardware support for analog out." +#: ports/esp8266/modnetwork.c +msgid "Cannot update i/f status" msgstr "" -#: ports/esp8266/common-hal/busio/SPI.c:72 -msgid "Pins not valid for SPI" +#: shared-module/bitbangio/SPI.c +msgid "Cannot write without MOSI pin." msgstr "" -#: ports/esp8266/common-hal/busio/UART.c:45 -msgid "Only tx supported on UART1 (GPIO2)." +#: shared-bindings/bleio/Service.c +msgid "Characteristic UUID doesn't match Service UUID" msgstr "" -#: ports/esp8266/common-hal/busio/UART.c:67 ports/esp8266/machine_uart.c:108 -msgid "invalid data bits" +#: ports/nrf/common-hal/bleio/Service.c +msgid "Characteristic already in use by another Service." msgstr "" -#: ports/esp8266/common-hal/busio/UART.c:91 ports/esp8266/machine_uart.c:144 -msgid "invalid stop bits" +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "CharacteristicBuffer writing not provided" msgstr "" -#: ports/esp8266/common-hal/digitalio/DigitalInOut.c:200 -msgid "ESP8266 does not support pull down." +#: shared-module/bitbangio/SPI.c +msgid "Clock pin init failed." msgstr "" -#: ports/esp8266/common-hal/digitalio/DigitalInOut.c:210 -msgid "GPIO16 does not support pull up." +#: shared-module/bitbangio/I2C.c +msgid "Clock stretch too long" msgstr "" -#: ports/esp8266/common-hal/microcontroller/__init__.c:66 -msgid "ESP8226 does not support safe mode." +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Clock unit in use" msgstr "" -#: ports/esp8266/common-hal/pulseio/PWMOut.c:54 -#: ports/esp8266/common-hal/pulseio/PWMOut.c:113 -#, c-format -msgid "Maximum PWM frequency is %dhz." +#: shared-bindings/_pew/PewPew.c +msgid "Column entry must be digitalio.DigitalInOut" msgstr "" -#: ports/esp8266/common-hal/pulseio/PWMOut.c:57 -#: ports/esp8266/common-hal/pulseio/PWMOut.c:116 -msgid "Minimum PWM frequency is 1hz." +#: shared-bindings/displayio/FourWire.c shared-bindings/displayio/ParallelBus.c +msgid "Command must be an int between 0 and 255" msgstr "" -#: ports/esp8266/common-hal/pulseio/PWMOut.c:68 +#: ports/nrf/common-hal/bleio/UUID.c #, c-format -msgid "Multiple PWM frequencies not supported. PWM already set to %dhz." +msgid "Could not decode ble_uuid, err 0x%04x" msgstr "" -#: ports/esp8266/common-hal/pulseio/PWMOut.c:77 ports/esp8266/machine_pwm.c:70 -#, c-format -msgid "PWM not supported on pin %d" +#: ports/atmel-samd/common-hal/busio/UART.c +msgid "Could not initialize UART" msgstr "" -#: ports/esp8266/common-hal/pulseio/PulseIn.c:78 -msgid "No PulseIn support for %q" +#: shared-module/audioio/Mixer.c shared-module/audioio/WaveFile.c +msgid "Couldn't allocate first buffer" msgstr "" -#: ports/esp8266/common-hal/storage/__init__.c:34 -msgid "Unable to remount filesystem" +#: shared-module/audioio/Mixer.c shared-module/audioio/WaveFile.c +msgid "Couldn't allocate second buffer" msgstr "" -#: ports/esp8266/common-hal/storage/__init__.c:38 -msgid "Use esptool to erase flash and re-upload Python instead" +#: supervisor/shared/safe_mode.c +msgid "Crash into the HardFault_Handler.\n" msgstr "" -#: ports/esp8266/esp_mphal.c:154 -msgid "C-level assert" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "DAC already in use" msgstr "" -#: ports/esp8266/machine_adc.c:57 -#, c-format -msgid "not a valid ADC Channel: %d" +#: ports/atmel-samd/common-hal/displayio/ParallelBus.c +#: ports/nrf/common-hal/displayio/ParallelBus.c +msgid "Data 0 pin must be byte aligned" msgstr "" -#: ports/esp8266/machine_hspi.c:131 ports/esp8266/machine_hspi.c:137 -msgid "impossible baudrate" +#: shared-module/audioio/WaveFile.c +msgid "Data chunk must follow fmt chunk" msgstr "" -#: ports/esp8266/machine_pin.c:129 -msgid "expecting a pin" +#: ports/nrf/common-hal/bleio/Broadcaster.c +#: ports/nrf/common-hal/bleio/Peripheral.c +msgid "Data too large for advertisement packet" msgstr "" -#: ports/esp8266/machine_pin.c:284 -msgid "Pin(16) doesn't support pull" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Data too large for the advertisement packet" msgstr "" -#: ports/esp8266/machine_pin.c:323 -msgid "invalid pin" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Destination capacity is smaller than destination_length." msgstr "" -#: ports/esp8266/machine_pin.c:389 -msgid "pin does not have IRQ capabilities" +#: shared-bindings/displayio/Display.c +msgid "Display rotation must be in 90 degree increments" msgstr "" -#: ports/esp8266/machine_rtc.c:185 -msgid "buffer too long" +#: ports/unix/modffi.c +msgid "Don't know how to pass object to native function" msgstr "" -#: ports/esp8266/machine_rtc.c:209 ports/esp8266/machine_rtc.c:223 -#: ports/esp8266/machine_rtc.c:246 -msgid "invalid alarm" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Drive mode not used when direction is input." msgstr "" -#: ports/esp8266/machine_uart.c:169 -#, c-format -msgid "UART(%d) does not exist" +#: ports/esp8266/common-hal/microcontroller/__init__.c +msgid "ESP8226 does not support safe mode." msgstr "" -#: ports/esp8266/machine_uart.c:219 -msgid "UART(1) can't read" +#: ports/esp8266/common-hal/digitalio/DigitalInOut.c +msgid "ESP8266 does not support pull down." msgstr "" -#: ports/esp8266/modesp.c:119 -msgid "len must be multiple of 4" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +msgid "EXTINT channel already in use" msgstr "" -#: ports/esp8266/modesp.c:274 -#, c-format -msgid "memory allocation failed, allocating %u bytes for native code" +#: ports/unix/modffi.c +msgid "Error in ffi_prep_cif" msgstr "" -#: ports/esp8266/modesp.c:317 -msgid "flash location must be below 1MByte" +#: extmod/modure.c +msgid "Error in regex" msgstr "" -#: ports/esp8266/modmachine.c:63 -msgid "frequency can only be either 80Mhz or 160MHz" +#: shared-bindings/pulseio/PulseOut.c shared-bindings/neopixel_write/__init__.c +#: shared-bindings/terminalio/Terminal.c shared-bindings/microcontroller/Pin.c +msgid "Expected a %q" msgstr "" -#: ports/esp8266/modnetwork.c:61 -msgid "AP required" +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "Expected a Characteristic" msgstr "" -#: ports/esp8266/modnetwork.c:61 -msgid "STA required" +#: shared-bindings/bleio/Descriptor.c shared-bindings/bleio/Service.c +#: shared-bindings/bleio/Characteristic.c +msgid "Expected a UUID" msgstr "" -#: ports/esp8266/modnetwork.c:87 -msgid "Cannot update i/f status" +#: shared-module/_pixelbuf/PixelBuf.c +#, c-format +msgid "Expected tuple of length %d, got %d" msgstr "" -#: ports/esp8266/modnetwork.c:142 -msgid "Cannot set STA config" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to acquire mutex" msgstr "" -#: ports/esp8266/modnetwork.c:144 -msgid "Cannot connect to AP" +#: ports/nrf/common-hal/bleio/Characteristic.c ports/nrf/sd_mutex.c +#, c-format +msgid "Failed to acquire mutex, err 0x%04x" msgstr "" -#: ports/esp8266/modnetwork.c:152 -msgid "Cannot disconnect from AP" +#: ports/nrf/common-hal/bleio/Service.c +#, c-format +msgid "Failed to add characteristic, err 0x%04x" msgstr "" -#: ports/esp8266/modnetwork.c:173 -msgid "unknown status param" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to add service" msgstr "" -#: ports/esp8266/modnetwork.c:222 -msgid "STA must be active" +#: ports/nrf/common-hal/bleio/Peripheral.c +#, c-format +msgid "Failed to add service, err 0x%04x" msgstr "" -#: ports/esp8266/modnetwork.c:239 -msgid "scan failed" +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "Failed to allocate RX buffer" msgstr "" -#: ports/esp8266/modnetwork.c:306 -msgid "wifi_set_ip_info() failed" +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +#: ports/nrf/common-hal/pulseio/PulseIn.c +#: ports/esp8266/common-hal/pulseio/PulseIn.c +#, c-format +msgid "Failed to allocate RX buffer of %d bytes" msgstr "" -#: ports/esp8266/modnetwork.c:319 -msgid "either pos or kw args are allowed" +#: ports/nrf/common-hal/bleio/Adapter.c +msgid "Failed to change softdevice state" msgstr "" -#: ports/esp8266/modnetwork.c:329 -msgid "can't get STA config" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to connect:" msgstr "" -#: ports/esp8266/modnetwork.c:331 -msgid "can't get AP config" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to continue scanning" msgstr "" -#: ports/esp8266/modnetwork.c:346 -msgid "invalid buffer length" +#: ports/nrf/common-hal/bleio/Scanner.c +#, c-format +msgid "Failed to continue scanning, err 0x%04x" msgstr "" -#: ports/esp8266/modnetwork.c:405 -msgid "can't set STA config" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to create mutex" msgstr "" -#: ports/esp8266/modnetwork.c:407 -msgid "can't set AP config" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to discover services" msgstr "" -#: ports/esp8266/modnetwork.c:416 -msgid "can query only one param" +#: ports/nrf/common-hal/bleio/Adapter.c +msgid "Failed to get local address" msgstr "" -#: ports/esp8266/modnetwork.c:469 -msgid "unknown config param" +#: ports/nrf/common-hal/bleio/Adapter.c +msgid "Failed to get softdevice state" msgstr "" -#: ports/nrf/common-hal/analogio/AnalogOut.c:37 -msgid "AnalogOut functionality not supported" +#: ports/nrf/common-hal/bleio/Characteristic.c +#, c-format +msgid "Failed to notify or indicate attribute value, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Adapter.c:41 +#: ports/nrf/common-hal/bleio/Characteristic.c #, c-format -msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX" +msgid "Failed to read CCCD value, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Adapter.c:125 +#: ports/nrf/common-hal/bleio/Characteristic.c #, c-format -msgid "Failed to change softdevice state, error: 0x%08lX" +msgid "Failed to read attribute value, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Adapter.c:135 +#: ports/nrf/common-hal/bleio/Characteristic.c #, c-format -msgid "Failed to get softdevice state, error: 0x%08lX" +msgid "Failed to read gatts value, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Adapter.c:155 +#: ports/nrf/common-hal/bleio/UUID.c #, c-format -msgid "Failed to get local address, error: 0x%08lX" +msgid "Failed to register Vendor-Specific UUID, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:52 -#, c-format -msgid "Failed to write gatts value, status: 0x%08lX" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to release mutex" msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:76 +#: ports/nrf/common-hal/bleio/Characteristic.c ports/nrf/sd_mutex.c #, c-format -msgid "Failed to notify attribute value, status: 0x%08lX" +msgid "Failed to release mutex, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:91 -#, c-format -msgid "Failed to read attribute value, status: 0x%08lX" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to start advertising" msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:119 -#: ports/nrf/common-hal/bleio/Device.c:272 -#: ports/nrf/common-hal/bleio/Device.c:307 +#: ports/nrf/common-hal/bleio/Broadcaster.c +#: ports/nrf/common-hal/bleio/Peripheral.c #, c-format -msgid "Failed to acquire mutex, status: 0x%08lX" +msgid "Failed to start advertising, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:126 -#, c-format -msgid "Failed to write attribute value, status: 0x%08lX" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to start scanning" msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:138 -#: ports/nrf/common-hal/bleio/Device.c:284 -#: ports/nrf/common-hal/bleio/Device.c:319 -#: ports/nrf/common-hal/bleio/Device.c:354 -#: ports/nrf/common-hal/bleio/Device.c:391 +#: ports/nrf/common-hal/bleio/Scanner.c #, c-format -msgid "Failed to release mutex, status: 0x%08lX" +msgid "Failed to start scanning, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:81 -#: ports/nrf/common-hal/bleio/Device.c:114 -msgid "Can not fit data into the advertisment packet" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to stop advertising" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:266 +#: ports/nrf/common-hal/bleio/Broadcaster.c +#: ports/nrf/common-hal/bleio/Peripheral.c #, c-format -msgid "Failed to discover serivices, status: 0x%08lX" +msgid "Failed to stop advertising, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:403 -#: ports/nrf/common-hal/bleio/Scanner.c:76 +#: ports/nrf/common-hal/bleio/Characteristic.c #, c-format -msgid "Failed to continue scanning, status: 0x%0xlX" +msgid "Failed to write attribute value, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:436 +#: ports/nrf/common-hal/bleio/Characteristic.c #, c-format -msgid "Failed to connect, status: 0x%08lX" +msgid "Failed to write gatts value, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:513 -#, c-format -msgid "Failed to add service, status: 0x%08lX" +#: py/moduerrno.c +msgid "File exists" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:531 -#, c-format -msgid "Failed to start advertisment, status: 0x%08lX" +#: ports/nrf/supervisor/internal_flash.c +msgid "Flash erase failed" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:549 +#: ports/nrf/supervisor/internal_flash.c #, c-format -msgid "Failed to stop advertisment, status: 0x%08lX" +msgid "Flash erase failed to start, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:575 -#: ports/nrf/common-hal/bleio/Scanner.c:103 -#, c-format -msgid "Failed to start scanning, status: 0x%0xlX" +#: ports/nrf/supervisor/internal_flash.c +msgid "Flash write failed" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:592 +#: ports/nrf/supervisor/internal_flash.c #, c-format -msgid "Failed to create mutex, status: 0x%0xlX" +msgid "Flash write failed to start, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Service.c:83 -#, c-format -msgid "Failed to add characteristic, status: 0x%08lX" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +msgid "Frequency captured is above capability. Capture Paused." msgstr "" -#: ports/nrf/common-hal/bleio/UUID.c:97 -#, c-format -msgid "Failed to add Vendor Specific UUID, status: 0x%08lX" +#: shared-bindings/bitbangio/SPI.c shared-bindings/bitbangio/I2C.c +#: shared-bindings/busio/SPI.c shared-bindings/busio/I2C.c +msgid "Function requires lock" msgstr "" -#: ports/nrf/common-hal/bleio/UUID.c:102 -msgid "Invalid UUID string length" +#: ports/esp8266/common-hal/digitalio/DigitalInOut.c +msgid "GPIO16 does not support pull up." msgstr "" -#: ports/nrf/common-hal/bleio/UUID.c:109 -#: shared-bindings/bleio/Characteristic.c:125 -#: shared-bindings/bleio/Service.c:105 -msgid "Invalid UUID parameter" +#: shared-module/displayio/Group.c +msgid "Group full" msgstr "" -#: ports/nrf/common-hal/busio/I2C.c:96 -msgid "All I2C peripherals are in use" +#: ports/unix/file.c extmod/vfs_posix_file.c py/objstringio.c +msgid "I/O operation on closed file" msgstr "" -#: ports/nrf/common-hal/busio/SPI.c:133 -msgid "All SPI peripherals are in use" +#: extmod/machine_i2c.c +msgid "I2C operation not supported" msgstr "" -#: ports/nrf/common-hal/busio/UART.c:49 -#, c-format -msgid "error = 0x%08lX" +#: py/persistentcode.c +msgid "" +"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/" +"mpy-update for more info." +msgstr "" + +#: shared-bindings/_pew/PewPew.c +msgid "Incorrect buffer size" +msgstr "" + +#: py/moduerrno.c +msgid "Input/output error" +msgstr "" + +#: shared-module/displayio/OnDiskBitmap.c +msgid "Invalid BMP file" +msgstr "" + +#: ports/atmel-samd/common-hal/pulseio/PWMOut.c +#: ports/nrf/common-hal/pulseio/PWMOut.c shared-bindings/pulseio/PWMOut.c +msgid "Invalid PWM frequency" +msgstr "" + +#: py/moduerrno.c +msgid "Invalid argument" msgstr "" -#: ports/nrf/common-hal/busio/UART.c:110 +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Invalid bit clock pin" +msgstr "" + +#: ports/nrf/common-hal/busio/UART.c msgid "Invalid buffer size" msgstr "" -#: ports/nrf/common-hal/busio/UART.c:114 -msgid "Odd parity is not supported" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +msgid "Invalid capture period. Valid range: 1 - 500" msgstr "" -#: ports/nrf/common-hal/busio/UART.c:346 ports/nrf/common-hal/busio/UART.c:350 -#: ports/nrf/common-hal/busio/UART.c:355 ports/nrf/common-hal/busio/UART.c:360 -#: ports/nrf/common-hal/busio/UART.c:366 ports/nrf/common-hal/busio/UART.c:371 -#: ports/nrf/common-hal/busio/UART.c:376 ports/nrf/common-hal/busio/UART.c:380 -#: ports/nrf/common-hal/busio/UART.c:388 -msgid "busio.UART not available" +#: shared-bindings/audioio/Mixer.c +msgid "Invalid channel count" msgstr "" -#: ports/nrf/common-hal/microcontroller/Processor.c:49 -#, c-format -msgid "Can not get temperature. status: 0x%02x" +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Invalid clock pin" msgstr "" -#: ports/nrf/common-hal/pulseio/PWMOut.c:161 -msgid "All PWM peripherals are in use" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Invalid data pin" msgstr "" -#: ports/unix/modffi.c:138 -msgid "Unknown type" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Invalid direction." msgstr "" -#: ports/unix/modffi.c:207 ports/unix/modffi.c:265 -msgid "Error in ffi_prep_cif" +#: shared-module/audioio/WaveFile.c +msgid "Invalid file" msgstr "" -#: ports/unix/modffi.c:270 -msgid "ffi_prep_closure_loc" +#: shared-module/audioio/WaveFile.c +msgid "Invalid format chunk size" msgstr "" -#: ports/unix/modffi.c:413 -msgid "Don't know how to pass object to native function" +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "Invalid number of bits" msgstr "" -#: ports/unix/modusocket.c:474 -#, c-format -msgid "[addrinfo error %d]" +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "Invalid phase" msgstr "" -#: py/argcheck.c:44 -msgid "function does not take keyword arguments" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: ports/atmel-samd/common-hal/touchio/TouchIn.c +#: shared-bindings/pulseio/PWMOut.c +msgid "Invalid pin" msgstr "" -#: py/argcheck.c:54 py/bc.c:85 py/objnamedtuple.c:104 -#, c-format -msgid "function takes %d positional arguments but %d were given" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Invalid pin for left channel" msgstr "" -#: py/argcheck.c:64 -#, c-format -msgid "function missing %d required positional arguments" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Invalid pin for right channel" msgstr "" -#: py/argcheck.c:72 -#, c-format -msgid "function expected at most %d arguments, got %d" +#: ports/atmel-samd/common-hal/i2cslave/I2CSlave.c +#: ports/atmel-samd/common-hal/busio/UART.c +#: ports/atmel-samd/common-hal/busio/SPI.c +#: ports/atmel-samd/common-hal/busio/I2C.c ports/nrf/common-hal/busio/I2C.c +msgid "Invalid pins" msgstr "" -#: py/argcheck.c:97 -msgid "'%q' argument required" +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "Invalid polarity" msgstr "" -#: py/argcheck.c:122 -msgid "extra positional arguments given" +#: shared-bindings/microcontroller/__init__.c +msgid "Invalid run mode." msgstr "" -#: py/argcheck.c:130 -msgid "extra keyword arguments given" +#: shared-bindings/audioio/Mixer.c +msgid "Invalid voice count" msgstr "" -#: py/argcheck.c:142 -msgid "argument num/types mismatch" +#: shared-module/audioio/WaveFile.c +msgid "Invalid wave file" msgstr "" -#: py/argcheck.c:147 -msgid "keyword argument(s) not yet implemented - use normal args instead" +#: py/compile.c +msgid "LHS of keyword arg must be an id" msgstr "" -#: py/bc.c:88 py/objnamedtuple.c:108 -msgid "%q() takes %d positional arguments but %d were given" +#: shared-module/displayio/Group.c +msgid "Layer must be a Group or TileGrid subclass." msgstr "" -#: py/bc.c:197 py/bc.c:215 -msgid "unexpected keyword argument" +#: py/objslice.c +msgid "Length must be an int" msgstr "" -#: py/bc.c:199 -msgid "keywords must be strings" +#: py/objslice.c +msgid "Length must be non-negative" msgstr "" -#: py/bc.c:206 py/objnamedtuple.c:138 -msgid "function got multiple values for argument '%q'" +#: supervisor/shared/safe_mode.c +msgid "" +"Looks like our core CircuitPython code crashed hard. Whoops!\n" +"Please file an issue at https://github.com/adafruit/circuitpython/issues\n" +" with the contents of your CIRCUITPY drive and this message:\n" msgstr "" -#: py/bc.c:218 py/objnamedtuple.c:130 -msgid "unexpected keyword argument '%q'" +#: shared-module/bitbangio/SPI.c +msgid "MISO pin init failed." +msgstr "" + +#: shared-module/bitbangio/SPI.c +msgid "MOSI pin init failed." msgstr "" -#: py/bc.c:244 +#: ports/esp8266/common-hal/pulseio/PWMOut.c #, c-format -msgid "function missing required positional argument #%d" +msgid "Maximum PWM frequency is %dhz." msgstr "" -#: py/bc.c:260 -msgid "function missing required keyword argument '%q'" +#: shared-module/displayio/Shape.c +#, c-format +msgid "Maximum x value when mirrored is %d" msgstr "" -#: py/bc.c:269 -msgid "function missing keyword-only argument" +#: supervisor/shared/safe_mode.c +msgid "MicroPython NLR jump failed. Likely memory corruption.\n" msgstr "" -#: py/binary.c:112 -msgid "bad typecode" +#: supervisor/shared/safe_mode.c +msgid "MicroPython fatal error.\n" msgstr "" -#: py/builtinevex.c:99 -msgid "bad compile mode" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Microphone startup delay must be in range 0.0 to 1.0" msgstr "" -#: py/builtinhelp.c:137 -msgid "Plus any modules on the filesystem\n" +#: ports/esp8266/common-hal/pulseio/PWMOut.c +msgid "Minimum PWM frequency is 1hz." msgstr "" -#: py/builtinhelp.c:183 +#: ports/esp8266/common-hal/pulseio/PWMOut.c #, c-format -msgid "" -"Welcome to Adafruit CircuitPython %s!\n" -"\n" -"Please visit learn.adafruit.com/category/circuitpython for project guides.\n" -"\n" -"To list built-in modules please do `help(\"modules\")`.\n" +msgid "Multiple PWM frequencies not supported. PWM already set to %dhz." msgstr "" -#: py/builtinimport.c:336 -msgid "cannot perform relative import" +#: shared-bindings/displayio/Display.c +msgid "Must be a Group subclass." msgstr "" -#: py/builtinimport.c:420 py/builtinimport.c:532 -msgid "module not found" +#: ports/atmel-samd/common-hal/analogio/AnalogOut.c +msgid "No DAC on chip" msgstr "" -#: py/builtinimport.c:423 py/builtinimport.c:535 -msgid "no module named '%q'" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "No DMA channel found" msgstr "" -#: py/builtinimport.c:510 -msgid "relative import" +#: ports/esp8266/common-hal/pulseio/PulseIn.c +msgid "No PulseIn support for %q" msgstr "" -#: py/compile.c:397 py/compile.c:542 -msgid "can't assign to expression" +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "No RX pin" msgstr "" -#: py/compile.c:416 -msgid "multiple *x in assignment" +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "No TX pin" msgstr "" -#: py/compile.c:642 -msgid "non-default argument follows default argument" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +msgid "No available clocks" msgstr "" -#: py/compile.c:771 py/compile.c:789 -msgid "invalid micropython decorator" +#: supervisor/shared/board_busses.c +msgid "No default I2C bus" msgstr "" -#: py/compile.c:943 -msgid "can't delete expression" +#: supervisor/shared/board_busses.c +msgid "No default SPI bus" msgstr "" -#: py/compile.c:955 -msgid "'break' outside loop" +#: supervisor/shared/board_busses.c +msgid "No default UART bus" msgstr "" -#: py/compile.c:958 -msgid "'continue' outside loop" +#: ports/atmel-samd/common-hal/touchio/TouchIn.c +msgid "No free GCLKs" msgstr "" -#: py/compile.c:969 -msgid "'return' outside function" +#: shared-bindings/os/__init__.c +msgid "No hardware random available" msgstr "" -#: py/compile.c:1169 -msgid "identifier redefined as global" +#: ports/esp8266/common-hal/analogio/AnalogOut.c +msgid "No hardware support for analog out." msgstr "" -#: py/compile.c:1185 -msgid "no binding for nonlocal found" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +msgid "No hardware support on pin" msgstr "" -#: py/compile.c:1188 -msgid "identifier redefined as nonlocal" +#: py/moduerrno.c +msgid "No space left on device" msgstr "" -#: py/compile.c:1197 -msgid "can't declare nonlocal in outer code" +#: py/moduerrno.c +msgid "No such file/directory" msgstr "" -#: py/compile.c:1542 -msgid "default 'except' must be last" +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "Not connected" msgstr "" -#: py/compile.c:2095 -msgid "*x must be assignment target" +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "Not connected." msgstr "" -#: py/compile.c:2193 -msgid "super() can't find self" +#: shared-bindings/audiobusio/I2SOut.c shared-bindings/audioio/AudioOut.c +msgid "Not playing" msgstr "" -#: py/compile.c:2256 -msgid "can't have multiple *x" +#: shared-bindings/util.c +msgid "" +"Object has been deinitialized and can no longer be used. Create a new object." msgstr "" -#: py/compile.c:2263 -msgid "can't have multiple **x" +#: ports/nrf/common-hal/busio/UART.c +msgid "Odd parity is not supported" msgstr "" -#: py/compile.c:2271 -msgid "LHS of keyword arg must be an id" +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Only 8 or 16 bit mono with " msgstr "" -#: py/compile.c:2287 -msgid "non-keyword arg after */**" +#: shared-module/displayio/OnDiskBitmap.c +#, c-format +msgid "" +"Only Windows format, uncompressed BMP supported: given header size is %d" msgstr "" -#: py/compile.c:2291 -msgid "non-keyword arg after keyword arg" +#: shared-module/displayio/Bitmap.c +msgid "Only bit maps of 8 bit color or less are supported" msgstr "" -#: py/compile.c:2463 py/compile.c:2473 py/compile.c:2712 py/compile.c:2742 -#: py/parse.c:1176 -msgid "invalid syntax" +#: shared-module/displayio/OnDiskBitmap.c +#, c-format +msgid "" +"Only monochrome, indexed 8bpp, and 16bpp or greater BMPs supported: %d bpp " +"given" msgstr "" -#: py/compile.c:2465 -msgid "expecting key:value for dict" +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "Only slices with step=1 (aka None) are supported" msgstr "" -#: py/compile.c:2475 -msgid "expecting just a value for set" +#: ports/esp8266/common-hal/busio/UART.c +msgid "Only tx supported on UART1 (GPIO2)." msgstr "" -#: py/compile.c:2600 -msgid "'yield' outside function" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Oversample must be multiple of 8." msgstr "" -#: py/compile.c:2619 -msgid "'await' outside function" +#: shared-bindings/pulseio/PWMOut.c +msgid "" +"PWM duty_cycle must be between 0 and 65535 inclusive (16 bit resolution)" msgstr "" -#: py/compile.c:2774 -msgid "name reused for argument" +#: shared-bindings/pulseio/PWMOut.c +msgid "" +"PWM frequency not writable when variable_frequency is False on construction." msgstr "" -#: py/compile.c:2827 -msgid "parameter annotation must be an identifier" +#: ports/esp8266/common-hal/pulseio/PWMOut.c ports/esp8266/machine_pwm.c +#, c-format +msgid "PWM not supported on pin %d" msgstr "" -#: py/compile.c:2969 py/compile.c:3137 -msgid "return annotation must be an identifier" +#: py/moduerrno.c +msgid "Permission denied" msgstr "" -#: py/compile.c:3097 -msgid "inline assembler must be a function" +#: ports/esp8266/common-hal/analogio/AnalogIn.c +msgid "Pin %q does not have ADC capabilities" msgstr "" -#: py/compile.c:3134 -msgid "unknown type" +#: ports/atmel-samd/common-hal/analogio/AnalogIn.c +#: ports/nrf/common-hal/analogio/AnalogIn.c +msgid "Pin does not have ADC capabilities" msgstr "" -#: py/compile.c:3154 -msgid "expecting an assembler instruction" +#: ports/esp8266/machine_pin.c +msgid "Pin(16) doesn't support pull" msgstr "" -#: py/compile.c:3184 -msgid "'label' requires 1 argument" +#: ports/esp8266/common-hal/busio/SPI.c +msgid "Pins not valid for SPI" msgstr "" -#: py/compile.c:3190 -msgid "label redefined" +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "Pixel beyond bounds of buffer" msgstr "" -#: py/compile.c:3196 -msgid "'align' requires 1 argument" +#: py/builtinhelp.c +msgid "Plus any modules on the filesystem\n" msgstr "" -#: py/compile.c:3205 -msgid "'data' requires at least 2 arguments" +#: main.c +msgid "Press any key to enter the REPL. Use CTRL-D to reload." msgstr "" -#: py/compile.c:3212 -msgid "'data' requires integer arguments" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Pull not used when direction is output." msgstr "" -#: py/emitinlinethumb.c:102 -msgid "can only have up to 4 parameters to Thumb assembly" +#: shared-bindings/rtc/RTC.c +msgid "RTC calibration is not supported on this board" msgstr "" -#: py/emitinlinethumb.c:107 py/emitinlinethumb.c:112 -msgid "parameters must be registers in sequence r0 to r3" +#: shared-bindings/rtc/RTC.c shared-bindings/time/__init__.c +msgid "RTC is not supported on this board" msgstr "" -#: py/emitinlinethumb.c:188 py/emitinlinethumb.c:230 -#, c-format -msgid "'%s' expects at most r%d" +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "Range out of bounds" msgstr "" -#: py/emitinlinethumb.c:197 py/emitinlinextensa.c:162 -#, c-format -msgid "'%s' expects a register" +#: shared-bindings/pulseio/PulseIn.c +msgid "Read-only" msgstr "" -#: py/emitinlinethumb.c:211 -#, c-format -msgid "'%s' expects a special register" +#: extmod/vfs_fat.c py/moduerrno.c +msgid "Read-only filesystem" msgstr "" -#: py/emitinlinethumb.c:239 -#, c-format -msgid "'%s' expects an FPU register" +#: shared-module/displayio/Bitmap.c +msgid "Read-only object" msgstr "" -#: py/emitinlinethumb.c:292 -#, c-format -msgid "'%s' expects {r0, r1, ...}" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Right channel unsupported" msgstr "" -#: py/emitinlinethumb.c:299 py/emitinlinextensa.c:169 -#, c-format -msgid "'%s' expects an integer" +#: shared-bindings/_pew/PewPew.c +msgid "Row entry must be digitalio.DigitalInOut" msgstr "" -#: py/emitinlinethumb.c:304 -#, c-format -msgid "'%s' integer 0x%x does not fit in mask 0x%x" +#: main.c +msgid "Running in safe mode! Auto-reload is off.\n" msgstr "" -#: py/emitinlinethumb.c:328 -#, c-format -msgid "'%s' expects an address of the form [a, b]" +#: main.c +msgid "Running in safe mode! Not running saved code.\n" msgstr "" -#: py/emitinlinethumb.c:334 py/emitinlinextensa.c:182 -#, c-format -msgid "'%s' expects a label" +#: ports/atmel-samd/common-hal/busio/I2C.c +msgid "SDA or SCL needs a pull up" msgstr "" -#: py/emitinlinethumb.c:345 py/emitinlinextensa.c:193 -msgid "label '%q' not defined" +#: ports/esp8266/modnetwork.c +msgid "STA must be active" msgstr "" -#: py/emitinlinethumb.c:806 +#: ports/esp8266/modnetwork.c +msgid "STA required" +msgstr "" + +#: shared-bindings/audioio/Mixer.c +msgid "Sample rate must be positive" +msgstr "" + +#: ports/atmel-samd/common-hal/audioio/AudioOut.c #, c-format -msgid "unsupported Thumb instruction '%s' with %d arguments" +msgid "Sample rate too high. It must be less than %d" msgstr "" -#: py/emitinlinethumb.c:810 -msgid "branch not in range" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Serializer in use" msgstr "" -#: py/emitinlinextensa.c:86 -msgid "can only have up to 4 parameters to Xtensa assembly" +#: shared-bindings/nvm/ByteArray.c +msgid "Slice and value different lengths." msgstr "" -#: py/emitinlinextensa.c:91 py/emitinlinextensa.c:96 -msgid "parameters must be registers in sequence a2 to a5" +#: shared-bindings/displayio/Bitmap.c shared-bindings/displayio/TileGrid.c +#: shared-bindings/displayio/Group.c shared-bindings/pulseio/PulseIn.c +msgid "Slices not supported" msgstr "" -#: py/emitinlinextensa.c:174 +#: ports/nrf/common-hal/bleio/Adapter.c #, c-format -msgid "'%s' integer %d is not within range %d..%d" +msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX" msgstr "" -#: py/emitinlinextensa.c:327 -#, c-format -msgid "unsupported Xtensa instruction '%s' with %d arguments" +#: extmod/modure.c +msgid "Splitting with sub-captures" msgstr "" -#: py/emitnative.c:183 -msgid "unknown type '%q'" +#: shared-bindings/supervisor/__init__.c +msgid "Stack size must be at least 256" msgstr "" -#: py/emitnative.c:260 -msgid "Viper functions don't currently support more than 4 arguments" +#: shared-bindings/multiterminal/__init__.c +msgid "Stream missing readinto() or write() method." msgstr "" -#: py/emitnative.c:742 -msgid "conversion to object" +#: supervisor/shared/safe_mode.c +msgid "" +"The CircuitPython heap was corrupted because the stack was too small.\n" +"Please increase stack size limits and press reset (after ejecting " +"CIRCUITPY).\n" +"If you didn't change the stack, then file an issue here with the contents of " +"your CIRCUITPY drive:\n" msgstr "" -#: py/emitnative.c:921 -msgid "local '%q' used before type known" +#: supervisor/shared/safe_mode.c +msgid "" +"The microcontroller's power dipped. Please make sure your power supply " +"provides\n" +"enough power for the whole circuit and press reset (after ejecting " +"CIRCUITPY).\n" msgstr "" -#: py/emitnative.c:1118 py/emitnative.c:1156 -msgid "can't load from '%q'" +#: supervisor/shared/safe_mode.c +msgid "" +"The reset button was pressed while booting CircuitPython. Press again to " +"exit safe mode.\n" msgstr "" -#: py/emitnative.c:1128 -msgid "can't load with '%q' index" +#: shared-module/audioio/Mixer.c +msgid "The sample's bits_per_sample does not match the mixer's" msgstr "" -#: py/emitnative.c:1188 -msgid "local '%q' has type '%q' but source is '%q'" +#: shared-module/audioio/Mixer.c +msgid "The sample's channel count does not match the mixer's" msgstr "" -#: py/emitnative.c:1289 py/emitnative.c:1379 -msgid "can't store '%q'" +#: shared-module/audioio/Mixer.c +msgid "The sample's sample rate does not match the mixer's" msgstr "" -#: py/emitnative.c:1358 py/emitnative.c:1419 -msgid "can't store to '%q'" +#: shared-module/audioio/Mixer.c +msgid "The sample's signedness does not match the mixer's" msgstr "" -#: py/emitnative.c:1369 -msgid "can't store with '%q' index" +#: shared-bindings/displayio/TileGrid.c +msgid "Tile height must exactly divide bitmap height" msgstr "" -#: py/emitnative.c:1540 -msgid "can't implicitly convert '%q' to 'bool'" +#: shared-bindings/displayio/TileGrid.c +msgid "Tile indices must be 0 - 255" msgstr "" -#: py/emitnative.c:1774 -msgid "unary op %q not implemented" +#: shared-bindings/displayio/TileGrid.c +msgid "Tile width must exactly divide bitmap width" msgstr "" -#: py/emitnative.c:1930 -msgid "binary op %q not implemented" +#: supervisor/shared/safe_mode.c +msgid "To exit, please reset the board without " msgstr "" -#: py/emitnative.c:1951 -msgid "can't do binary op between '%q' and '%q'" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Too many channels in sample." msgstr "" -#: py/emitnative.c:2126 -msgid "casting" +#: shared-bindings/displayio/FourWire.c shared-bindings/displayio/ParallelBus.c +msgid "Too many display busses" msgstr "" -#: py/emitnative.c:2173 -msgid "return expected '%q' but got '%q'" +#: shared-bindings/displayio/Display.c +msgid "Too many displays" msgstr "" -#: py/emitnative.c:2191 -msgid "must raise an object" +#: py/obj.c +msgid "Traceback (most recent call last):\n" msgstr "" -#: py/emitnative.c:2201 -msgid "native yield" +#: shared-bindings/time/__init__.c +msgid "Tuple or struct_time argument required" msgstr "" -#: py/lexer.c:345 -msgid "unicode name escapes" +#: ports/esp8266/machine_uart.c +#, c-format +msgid "UART(%d) does not exist" msgstr "" -#: py/modbuiltins.c:162 -msgid "chr() arg not in range(0x110000)" +#: ports/esp8266/machine_uart.c +msgid "UART(1) can't read" msgstr "" -#: py/modbuiltins.c:171 -msgid "chr() arg not in range(256)" +#: shared-module/usb_hid/Device.c +msgid "USB Busy" msgstr "" -#: py/modbuiltins.c:285 -msgid "arg is an empty sequence" +#: shared-module/usb_hid/Device.c +msgid "USB Error" msgstr "" -#: py/modbuiltins.c:350 -msgid "ord expects a character" +#: shared-bindings/bleio/UUID.c +msgid "UUID integer value not in range 0 to 0xffff" msgstr "" -#: py/modbuiltins.c:353 -#, c-format -msgid "ord() expected a character, but string of length %d found" +#: shared-bindings/bleio/UUID.c +msgid "UUID string not 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'" msgstr "" -#: py/modbuiltins.c:363 -msgid "3-arg pow() not supported" +#: shared-bindings/bleio/UUID.c +msgid "UUID value is not str, int or byte buffer" msgstr "" -#: py/modbuiltins.c:517 -msgid "must use keyword argument for key function" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Unable to allocate buffers for signed conversion" msgstr "" -#: py/modmath.c:41 shared-bindings/math/__init__.c:53 -msgid "math domain error" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Unable to find free GCLK" msgstr "" -#: py/modmath.c:196 py/objfloat.c:270 py/objint_longlong.c:222 -#: py/objint_mpz.c:230 py/runtime.c:619 shared-bindings/math/__init__.c:346 -msgid "division by zero" +#: py/parse.c +msgid "Unable to init parser" msgstr "" -#: py/modmicropython.c:155 -msgid "schedule stack full" +#: shared-module/displayio/OnDiskBitmap.c +msgid "Unable to read color palette data" msgstr "" -#: py/modstruct.c:145 py/modstruct.c:153 py/modstruct.c:234 py/modstruct.c:244 -#: shared-bindings/struct/__init__.c:103 shared-bindings/struct/__init__.c:145 -#: shared-module/struct/__init__.c:91 shared-module/struct/__init__.c:175 -msgid "buffer too small" +#: ports/esp8266/common-hal/storage/__init__.c +msgid "Unable to remount filesystem" msgstr "" -#: py/modthread.c:240 -msgid "expecting a dict for keyword args" +#: shared-bindings/nvm/ByteArray.c +msgid "Unable to write to nvm." msgstr "" -#: py/moduerrno.c:147 py/moduerrno.c:150 -msgid "Permission denied" +#: ports/nrf/common-hal/bleio/UUID.c +msgid "Unexpected nrfx uuid type" msgstr "" -#: py/moduerrno.c:148 -msgid "No such file/directory" +#: ports/unix/modffi.c +msgid "Unknown type" msgstr "" -#: py/moduerrno.c:149 -msgid "Input/output error" +#: shared-bindings/_pixelbuf/PixelBuf.c +#, c-format +msgid "Unmatched number of items on RHS (expected %d, got %d)." msgstr "" -#: py/moduerrno.c:151 -msgid "File exists" +#: ports/atmel-samd/common-hal/busio/I2C.c +msgid "Unsupported baudrate" msgstr "" -#: py/moduerrno.c:152 -msgid "Unsupported operation" +#: shared-module/displayio/Display.c +msgid "Unsupported display bus type" msgstr "" -#: py/moduerrno.c:153 -msgid "Invalid argument" +#: shared-module/audioio/WaveFile.c +msgid "Unsupported format" msgstr "" -#: py/obj.c:92 -msgid "Traceback (most recent call last):\n" +#: py/moduerrno.c +msgid "Unsupported operation" msgstr "" -#: py/obj.c:96 -msgid " File \"%q\", line %d" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Unsupported pull value." msgstr "" -#: py/obj.c:98 -msgid " File \"%q\"" +#: ports/esp8266/common-hal/storage/__init__.c +msgid "Use esptool to erase flash and re-upload Python instead" msgstr "" -#: py/obj.c:102 -msgid ", in %q\n" +#: py/emitnative.c +msgid "Viper functions don't currently support more than 4 arguments" msgstr "" -#: py/obj.c:259 -msgid "can't convert to int" +#: shared-module/audioio/Mixer.c +msgid "Voice index too high" msgstr "" -#: py/obj.c:262 +#: main.c +msgid "WARNING: Your code filename has two extensions\n" +msgstr "" + +#: py/builtinhelp.c #, c-format -msgid "can't convert %s to int" +msgid "" +"Welcome to Adafruit CircuitPython %s!\n" +"\n" +"Please visit learn.adafruit.com/category/circuitpython for project guides.\n" +"\n" +"To list built-in modules please do `help(\"modules\")`.\n" msgstr "" -#: py/obj.c:322 -msgid "can't convert to float" +#: supervisor/shared/safe_mode.c +msgid "" +"You are running in safe mode which means something unanticipated happened.\n" +msgstr "" + +#: supervisor/shared/safe_mode.c +msgid "You requested starting safe mode by " msgstr "" -#: py/obj.c:325 +#: ports/unix/modusocket.c #, c-format -msgid "can't convert %s to float" +msgid "[addrinfo error %d]" msgstr "" -#: py/obj.c:355 -msgid "can't convert to complex" +#: py/objtype.c +msgid "__init__() should return None" msgstr "" -#: py/obj.c:358 +#: py/objtype.c #, c-format -msgid "can't convert %s to complex" +msgid "__init__() should return None, not '%s'" msgstr "" -#: py/obj.c:373 -msgid "expected tuple/list" +#: py/objobject.c +msgid "__new__ arg must be a user-type" msgstr "" -#: py/obj.c:376 -#, c-format -msgid "object '%s' is not a tuple or list" +#: extmod/modubinascii.c extmod/moduhashlib.c +msgid "a bytes-like object is required" msgstr "" -#: py/obj.c:387 -msgid "tuple/list has wrong length" +#: lib/embed/abort_.c +msgid "abort() called" msgstr "" -#: py/obj.c:389 +#: ports/unix/modmachine.c extmod/machine_mem.c #, c-format -msgid "requested length %d but object has length %d" +msgid "address %08x is not aligned to %d bytes" msgstr "" -#: py/obj.c:402 -msgid "indices must be integers" +#: shared-bindings/i2cslave/I2CSlave.c +msgid "address out of bounds" msgstr "" -#: py/obj.c:405 -msgid "%q indices must be integers, not %s" +#: shared-bindings/i2cslave/I2CSlave.c +msgid "addresses is empty" msgstr "" -#: py/obj.c:425 -msgid "%q index out of range" +#: py/modbuiltins.c +msgid "arg is an empty sequence" msgstr "" -#: py/obj.c:457 -msgid "object has no len" +#: py/runtime.c +msgid "argument has wrong type" +msgstr "" + +#: py/argcheck.c +msgid "argument num/types mismatch" +msgstr "" + +#: py/runtime.c +msgid "argument should be a '%q' not a '%q'" +msgstr "" + +#: shared-bindings/nvm/ByteArray.c py/objarray.c +msgid "array/bytes required on right side" +msgstr "" + +#: py/objstr.c +msgid "attributes not supported yet" +msgstr "" + +#: ports/nrf/common-hal/bleio/Characteristic.c +msgid "bad GATT role" msgstr "" -#: py/obj.c:460 +#: py/builtinevex.c +msgid "bad compile mode" +msgstr "" + +#: py/objstr.c +msgid "bad conversion specifier" +msgstr "" + +#: py/objstr.c +msgid "bad format string" +msgstr "" + +#: py/binary.c +msgid "bad typecode" +msgstr "" + +#: py/emitnative.c +msgid "binary op %q not implemented" +msgstr "" + +#: shared-bindings/busio/UART.c +msgid "bits must be 7, 8 or 9" +msgstr "" + +#: extmod/machine_spi.c +msgid "bits must be 8" +msgstr "" + +#: shared-bindings/audioio/Mixer.c +msgid "bits_per_sample must be 8 or 16" +msgstr "" + +#: py/emitinlinethumb.c +msgid "branch not in range" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c #, c-format -msgid "object of type '%s' has no len()" +msgid "buf is too small. need %d bytes" msgstr "" -#: py/obj.c:500 -msgid "object does not support item deletion" +#: shared-bindings/audioio/RawSample.c +msgid "buffer must be a bytes-like object" +msgstr "" + +#: shared-module/struct/__init__.c +msgid "buffer size must match format" +msgstr "" + +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "buffer slices must be of equal length" +msgstr "" + +#: ports/esp8266/machine_rtc.c +msgid "buffer too long" +msgstr "" + +#: shared-bindings/struct/__init__.c shared-module/struct/__init__.c +#: py/modstruct.c +msgid "buffer too small" +msgstr "" + +#: extmod/machine_spi.c +msgid "buffers must be the same length" msgstr "" -#: py/obj.c:503 +#: shared-bindings/_pew/PewPew.c +msgid "buttons must be digitalio.DigitalInOut" +msgstr "" + +#: py/vm.c +msgid "byte code not implemented" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c #, c-format -msgid "'%s' object does not support item deletion" +msgid "byteorder is not an instance of ByteOrder (got a %s)" msgstr "" -#: py/obj.c:507 -msgid "object is not subscriptable" +#: ports/atmel-samd/common-hal/busio/UART.c +msgid "bytes > 8 bits not supported" +msgstr "" + +#: py/objstr.c +msgid "bytes value out of range" +msgstr "" + +#: ports/atmel-samd/bindings/samd/Clock.c +msgid "calibration is out of range" +msgstr "" + +#: ports/atmel-samd/bindings/samd/Clock.c +msgid "calibration is read only" msgstr "" -#: py/obj.c:510 +#: ports/atmel-samd/common-hal/rtc/RTC.c +msgid "calibration value out of range +/-127" +msgstr "" + +#: py/emitinlinethumb.c +msgid "can only have up to 4 parameters to Thumb assembly" +msgstr "" + +#: py/emitinlinextensa.c +msgid "can only have up to 4 parameters to Xtensa assembly" +msgstr "" + +#: py/persistentcode.c +msgid "can only save bytecode" +msgstr "" + +#: ports/esp8266/modnetwork.c +msgid "can query only one param" +msgstr "" + +#: py/objtype.c +msgid "can't add special method to already-subclassed class" +msgstr "" + +#: py/compile.c +msgid "can't assign to expression" +msgstr "" + +#: py/obj.c #, c-format -msgid "'%s' object is not subscriptable" +msgid "can't convert %s to complex" msgstr "" -#: py/obj.c:514 -msgid "object does not support item assignment" +#: py/obj.c +#, c-format +msgid "can't convert %s to float" msgstr "" -#: py/obj.c:517 +#: py/obj.c #, c-format -msgid "'%s' object does not support item assignment" +msgid "can't convert %s to int" msgstr "" -#: py/obj.c:548 -msgid "object with buffer protocol required" +#: py/objstr.c +msgid "can't convert '%q' object to %q implicitly" msgstr "" -#: py/objarray.c:413 py/objstr.c:427 py/objstrunicode.c:191 py/objtuple.c:187 -#: shared-bindings/nvm/ByteArray.c:85 -msgid "only slices with step=1 (aka None) are supported" +#: py/objint.c +msgid "can't convert NaN to int" msgstr "" -#: py/objarray.c:426 -msgid "lhs and rhs should be compatible" +#: shared-bindings/i2cslave/I2CSlave.c +msgid "can't convert address to int" msgstr "" -#: py/objarray.c:444 shared-bindings/nvm/ByteArray.c:107 -msgid "array/bytes required on right side" +#: py/objint.c +msgid "can't convert inf to int" +msgstr "" + +#: py/obj.c +msgid "can't convert to complex" +msgstr "" + +#: py/obj.c +msgid "can't convert to float" +msgstr "" + +#: py/obj.c +msgid "can't convert to int" +msgstr "" + +#: py/objstr.c +msgid "can't convert to str implicitly" +msgstr "" + +#: py/compile.c +msgid "can't declare nonlocal in outer code" +msgstr "" + +#: py/compile.c +msgid "can't delete expression" msgstr "" -#: py/objcomplex.c:203 +#: py/emitnative.c +msgid "can't do binary op between '%q' and '%q'" +msgstr "" + +#: py/objcomplex.c msgid "can't do truncated division of a complex number" msgstr "" -#: py/objcomplex.c:209 -msgid "complex division by zero" +#: ports/esp8266/modnetwork.c +msgid "can't get AP config" msgstr "" -#: py/objcomplex.c:237 -msgid "0.0 to a complex power" +#: ports/esp8266/modnetwork.c +msgid "can't get STA config" msgstr "" -#: py/objdeque.c:107 -msgid "full" +#: py/compile.c +msgid "can't have multiple **x" msgstr "" -#: py/objdeque.c:127 -msgid "empty" +#: py/compile.c +msgid "can't have multiple *x" msgstr "" -#: py/objdict.c:314 -msgid "popitem(): dictionary is empty" +#: py/emitnative.c +msgid "can't implicitly convert '%q' to 'bool'" msgstr "" -#: py/objdict.c:357 -msgid "dict update sequence has wrong length" +#: py/emitnative.c +msgid "can't load from '%q'" msgstr "" -#: py/objfloat.c:308 py/parsenum.c:331 -msgid "complex values not supported" +#: py/emitnative.c +msgid "can't load with '%q' index" msgstr "" -#: py/objgenerator.c:108 +#: py/objgenerator.c +msgid "can't pend throw to just-started generator" +msgstr "" + +#: py/objgenerator.c msgid "can't send non-None value to a just-started generator" msgstr "" -#: py/objgenerator.c:126 -msgid "generator already executing" +#: ports/esp8266/modnetwork.c +msgid "can't set AP config" msgstr "" -#: py/objgenerator.c:229 -msgid "generator ignored GeneratorExit" +#: ports/esp8266/modnetwork.c +msgid "can't set STA config" msgstr "" -#: py/objgenerator.c:251 -msgid "can't pend throw to just-started generator" +#: py/objnamedtuple.c +msgid "can't set attribute" msgstr "" -#: py/objint.c:144 -msgid "can't convert inf to int" +#: py/emitnative.c +msgid "can't store '%q'" msgstr "" -#: py/objint.c:146 -msgid "can't convert NaN to int" +#: py/emitnative.c +msgid "can't store to '%q'" msgstr "" -#: py/objint.c:163 -msgid "float too big" +#: py/emitnative.c +msgid "can't store with '%q' index" msgstr "" -#: py/objint.c:328 -msgid "long int not supported in this build" +#: py/objstr.c +msgid "" +"can't switch from automatic field numbering to manual field specification" msgstr "" -#: py/objint.c:334 py/objint.c:340 py/objint.c:350 py/objint.c:358 -msgid "small int overflow" +#: py/objstr.c +msgid "" +"can't switch from manual field specification to automatic field numbering" msgstr "" -#: py/objint_longlong.c:189 py/objint_mpz.c:283 py/runtime.c:486 -msgid "negative power with no float support" +#: py/objtype.c +msgid "cannot create '%q' instances" msgstr "" -#: py/objint_longlong.c:251 -msgid "ulonglong too large" +#: py/objtype.c +msgid "cannot create instance" msgstr "" -#: py/objint_mpz.c:267 py/runtime.c:396 py/runtime.c:411 -msgid "negative shift count" +#: py/runtime.c +msgid "cannot import name %q" msgstr "" -#: py/objint_mpz.c:336 -msgid "pow() with 3 arguments requires integers" +#: py/builtinimport.c +msgid "cannot perform relative import" msgstr "" -#: py/objint_mpz.c:347 -msgid "pow() 3rd argument cannot be 0" +#: py/emitnative.c +msgid "casting" msgstr "" -#: py/objint_mpz.c:415 -msgid "overflow converting long int to machine word" +#: shared-bindings/bleio/Service.c +msgid "characteristics includes an object that is not a Characteristic" msgstr "" -#: py/objlist.c:273 -msgid "pop from empty list" +#: shared-bindings/_stage/Text.c +msgid "chars buffer too small" msgstr "" -#: py/objnamedtuple.c:92 -msgid "can't set attribute" +#: py/modbuiltins.c +msgid "chr() arg not in range(0x110000)" msgstr "" -#: py/objobject.c:55 -msgid "__new__ arg must be a user-type" +#: py/modbuiltins.c +msgid "chr() arg not in range(256)" msgstr "" -#: py/objrange.c:110 -msgid "zero step" +#: shared-bindings/displayio/Palette.c +msgid "color buffer must be 3 bytes (RGB) or 4 bytes (RGB + pad byte)" msgstr "" -#: py/objset.c:371 -msgid "pop from an empty set" +#: shared-bindings/displayio/Palette.c +msgid "color buffer must be a buffer or int" msgstr "" -#: py/objslice.c:66 -msgid "Length must be an int" +#: shared-bindings/displayio/Palette.c +msgid "color buffer must be a bytearray or array of type 'b' or 'B'" msgstr "" -#: py/objslice.c:71 -msgid "Length must be non-negative" +#: shared-bindings/displayio/Palette.c +msgid "color must be between 0x000000 and 0xffffff" msgstr "" -#: py/objslice.c:86 py/sequence.c:57 -msgid "slice step cannot be zero" +#: shared-bindings/displayio/ColorConverter.c +msgid "color should be an int" msgstr "" -#: py/objslice.c:159 -msgid "Cannot subclass slice" +#: py/objcomplex.c +msgid "complex division by zero" msgstr "" -#: py/objstr.c:261 -msgid "bytes value out of range" +#: py/parsenum.c py/objfloat.c +msgid "complex values not supported" msgstr "" -#: py/objstr.c:270 -msgid "wrong number of arguments" +#: extmod/moduzlib.c +msgid "compression header" msgstr "" -#: py/objstr.c:467 -msgid "join expects a list of str/bytes objects consistent with self object" +#: py/parse.c +msgid "constant must be an integer" msgstr "" -#: py/objstr.c:542 py/objstr.c:647 py/objstr.c:1744 -msgid "empty separator" +#: py/emitnative.c +msgid "conversion to object" msgstr "" -#: py/objstr.c:641 -msgid "rsplit(None,n)" +#: py/parsenum.c +msgid "decimal numbers not supported" msgstr "" -#: py/objstr.c:713 -msgid "substring not found" +#: py/compile.c +msgid "default 'except' must be last" msgstr "" -#: py/objstr.c:770 -msgid "start/end indices" +#: shared-bindings/audiobusio/PDMIn.c +msgid "" +"destination buffer must be a bytearray or array of type 'B' for bit_depth = 8" msgstr "" -#: py/objstr.c:931 -msgid "bad format string" +#: shared-bindings/audiobusio/PDMIn.c +msgid "destination buffer must be an array of type 'H' for bit_depth = 16" msgstr "" -#: py/objstr.c:953 -msgid "single '}' encountered in format string" +#: shared-bindings/audiobusio/PDMIn.c +msgid "destination_length must be an int >= 0" msgstr "" -#: py/objstr.c:992 -msgid "bad conversion specifier" +#: py/objdict.c +msgid "dict update sequence has wrong length" +msgstr "" + +#: shared-bindings/math/__init__.c py/runtime.c py/modmath.c py/objint_mpz.c +#: py/objint_longlong.c py/objfloat.c +msgid "division by zero" +msgstr "" + +#: ports/esp8266/modnetwork.c +msgid "either pos or kw args are allowed" +msgstr "" + +#: py/objdeque.c +msgid "empty" +msgstr "" + +#: extmod/modutimeq.c extmod/moduheapq.c +msgid "empty heap" +msgstr "" + +#: py/objstr.c +msgid "empty separator" msgstr "" -#: py/objstr.c:996 +#: shared-bindings/random/__init__.c +msgid "empty sequence" +msgstr "" + +#: py/objstr.c msgid "end of format while looking for conversion specifier" msgstr "" -#: py/objstr.c:998 +#: shared-bindings/displayio/Shape.c +msgid "end_x should be an int" +msgstr "" + +#: ports/nrf/common-hal/busio/UART.c #, c-format -msgid "unknown conversion specifier %c" +msgid "error = 0x%08lX" msgstr "" -#: py/objstr.c:1029 -msgid "unmatched '{' in format" +#: py/runtime.c +msgid "exceptions must derive from BaseException" msgstr "" -#: py/objstr.c:1036 +#: py/objstr.c msgid "expected ':' after format specifier" msgstr "" -#: py/objstr.c:1050 -msgid "" -"can't switch from automatic field numbering to manual field specification" +#: shared-bindings/gamepad/GamePad.c +msgid "expected a DigitalInOut" msgstr "" -#: py/objstr.c:1055 py/objstr.c:1083 -msgid "tuple index out of range" +#: py/obj.c +msgid "expected tuple/list" msgstr "" -#: py/objstr.c:1071 -msgid "attributes not supported yet" +#: py/modthread.c +msgid "expecting a dict for keyword args" msgstr "" -#: py/objstr.c:1079 -msgid "" -"can't switch from manual field specification to automatic field numbering" +#: ports/esp8266/machine_pin.c +msgid "expecting a pin" msgstr "" -#: py/objstr.c:1171 -msgid "invalid format specifier" +#: py/compile.c +msgid "expecting an assembler instruction" msgstr "" -#: py/objstr.c:1192 -msgid "sign not allowed in string format specifier" +#: py/compile.c +msgid "expecting just a value for set" msgstr "" -#: py/objstr.c:1200 -msgid "sign not allowed with integer format specifier 'c'" +#: py/compile.c +msgid "expecting key:value for dict" msgstr "" -#: py/objstr.c:1259 -#, c-format -msgid "unknown format code '%c' for object of type '%s'" +#: py/argcheck.c +msgid "extra keyword arguments given" msgstr "" -#: py/objstr.c:1331 -#, c-format -msgid "unknown format code '%c' for object of type 'float'" +#: py/argcheck.c +msgid "extra positional arguments given" msgstr "" -#: py/objstr.c:1343 -msgid "'=' alignment not allowed in string format specifier" +#: ports/unix/modffi.c +msgid "ffi_prep_closure_loc" msgstr "" -#: py/objstr.c:1367 -#, c-format -msgid "unknown format code '%c' for object of type 'str'" +#: shared-bindings/displayio/OnDiskBitmap.c shared-bindings/audioio/WaveFile.c +msgid "file must be a file opened in byte mode" +msgstr "" + +#: shared-bindings/storage/__init__.c +msgid "filesystem must provide mount method" msgstr "" -#: py/objstr.c:1415 +#: py/objtype.c +msgid "first argument to super() must be type" +msgstr "" + +#: extmod/machine_spi.c +msgid "firstbit must be MSB" +msgstr "" + +#: ports/esp8266/modesp.c +msgid "flash location must be below 1MByte" +msgstr "" + +#: py/objint.c +msgid "float too big" +msgstr "" + +#: shared-bindings/_stage/Text.c +msgid "font must be 2048 bytes long" +msgstr "" + +#: py/objstr.c msgid "format requires a dict" msgstr "" -#: py/objstr.c:1424 -msgid "incomplete format key" +#: ports/esp8266/modmachine.c +msgid "frequency can only be either 80Mhz or 160MHz" msgstr "" -#: py/objstr.c:1482 -msgid "incomplete format" +#: py/objdeque.c +msgid "full" msgstr "" -#: py/objstr.c:1490 -msgid "not enough arguments for format string" +#: py/argcheck.c +msgid "function does not take keyword arguments" msgstr "" -#: py/objstr.c:1500 +#: py/argcheck.c #, c-format -msgid "%%c requires int or char" +msgid "function expected at most %d arguments, got %d" msgstr "" -#: py/objstr.c:1507 -msgid "integer required" +#: py/objnamedtuple.c py/bc.c +msgid "function got multiple values for argument '%q'" msgstr "" -#: py/objstr.c:1570 +#: py/argcheck.c #, c-format -msgid "unsupported format character '%c' (0x%x) at index %d" +msgid "function missing %d required positional arguments" msgstr "" -#: py/objstr.c:1577 -msgid "not all arguments converted during string formatting" +#: py/bc.c +msgid "function missing keyword-only argument" msgstr "" -#: py/objstr.c:2102 -msgid "can't convert to str implicitly" +#: py/bc.c +msgid "function missing required keyword argument '%q'" msgstr "" -#: py/objstr.c:2106 -msgid "can't convert '%q' object to %q implicitly" +#: py/bc.c +#, c-format +msgid "function missing required positional argument #%d" msgstr "" -#: py/objstrunicode.c:134 +#: py/argcheck.c py/objnamedtuple.c py/bc.c #, c-format -msgid "string indices must be integers, not %s" +msgid "function takes %d positional arguments but %d were given" msgstr "" -#: py/objstrunicode.c:145 py/objstrunicode.c:164 -msgid "string index out of range" +#: shared-bindings/time/__init__.c +msgid "function takes exactly 9 arguments" msgstr "" -#: py/objtype.c:358 -msgid "__init__() should return None" +#: py/objgenerator.c +msgid "generator already executing" msgstr "" -#: py/objtype.c:360 -#, c-format -msgid "__init__() should return None, not '%s'" +#: py/objgenerator.c +msgid "generator ignored GeneratorExit" msgstr "" -#: py/objtype.c:623 py/objtype.c:1275 py/runtime.c:1065 -msgid "unreadable attribute" +#: shared-bindings/_stage/Layer.c +msgid "graphic must be 2048 bytes long" msgstr "" -#: py/objtype.c:868 py/runtime.c:653 -msgid "object not callable" +#: extmod/moduheapq.c +msgid "heap must be a list" msgstr "" -#: py/objtype.c:870 py/runtime.c:655 -#, c-format -msgid "'%s' object is not callable" +#: py/compile.c +msgid "identifier redefined as global" msgstr "" -#: py/objtype.c:978 -msgid "type takes 1 or 3 arguments" +#: py/compile.c +msgid "identifier redefined as nonlocal" msgstr "" -#: py/objtype.c:989 -msgid "cannot create instance" +#: ports/esp8266/machine_hspi.c +msgid "impossible baudrate" msgstr "" -#: py/objtype.c:991 -msgid "cannot create '%q' instances" +#: py/objstr.c +msgid "incomplete format" msgstr "" -#: py/objtype.c:1047 -msgid "can't add special method to already-subclassed class" +#: py/objstr.c +msgid "incomplete format key" msgstr "" -#: py/objtype.c:1091 py/objtype.c:1097 -msgid "type is not an acceptable base type" +#: extmod/modubinascii.c +msgid "incorrect padding" msgstr "" -#: py/objtype.c:1100 -msgid "type '%q' is not an acceptable base type" +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +#: ports/nrf/common-hal/pulseio/PulseIn.c +#: ports/esp8266/common-hal/pulseio/PulseIn.c py/obj.c +msgid "index out of range" msgstr "" -#: py/objtype.c:1137 -msgid "multiple inheritance not supported" +#: py/obj.c +msgid "indices must be integers" msgstr "" -#: py/objtype.c:1164 -msgid "multiple bases have instance lay-out conflict" +#: py/compile.c +msgid "inline assembler must be a function" msgstr "" -#: py/objtype.c:1205 -msgid "first argument to super() must be type" +#: py/parsenum.c +msgid "int() arg 2 must be >= 2 and <= 36" msgstr "" -#: py/objtype.c:1370 -msgid "issubclass() arg 2 must be a class or a tuple of classes" +#: py/objstr.c +msgid "integer required" msgstr "" -#: py/objtype.c:1384 -msgid "issubclass() arg 1 must be a class" +#: ports/nrf/common-hal/bleio/Broadcaster.c +msgid "interval not in range 0.0020 to 10.24" msgstr "" -#: py/parse.c:726 -msgid "constant must be an integer" +#: extmod/machine_i2c.c +msgid "invalid I2C peripheral" msgstr "" -#: py/parse.c:868 -msgid "Unable to init parser" +#: extmod/machine_spi.c +msgid "invalid SPI peripheral" msgstr "" -#: py/parse.c:1170 -msgid "unexpected indent" +#: ports/esp8266/machine_rtc.c +msgid "invalid alarm" msgstr "" -#: py/parse.c:1173 -msgid "unindent does not match any outer indentation level" +#: lib/netutils/netutils.c +msgid "invalid arguments" msgstr "" -#: py/parsenum.c:60 -msgid "int() arg 2 must be >= 2 and <= 36" +#: ports/esp8266/modnetwork.c +msgid "invalid buffer length" msgstr "" -#: py/parsenum.c:151 -msgid "invalid syntax for integer" +#: extmod/modussl_axtls.c +msgid "invalid cert" msgstr "" -#: py/parsenum.c:155 -#, c-format -msgid "invalid syntax for integer with base %d" +#: ports/esp8266/common-hal/busio/UART.c ports/esp8266/machine_uart.c +msgid "invalid data bits" msgstr "" -#: py/parsenum.c:339 -msgid "invalid syntax for number" +#: extmod/uos_dupterm.c +msgid "invalid dupterm index" msgstr "" -#: py/parsenum.c:342 -msgid "decimal numbers not supported" +#: extmod/modframebuf.c +msgid "invalid format" msgstr "" -#: py/persistentcode.c:223 -msgid "" -"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/" -"mpy-update for more info." +#: py/objstr.c +msgid "invalid format specifier" msgstr "" -#: py/persistentcode.c:326 -msgid "can only save bytecode" +#: extmod/modussl_axtls.c +msgid "invalid key" msgstr "" -#: py/runtime.c:206 -msgid "name not defined" +#: py/compile.c +msgid "invalid micropython decorator" msgstr "" -#: py/runtime.c:209 -msgid "name '%q' is not defined" +#: ports/esp8266/machine_pin.c +msgid "invalid pin" msgstr "" -#: py/runtime.c:304 py/runtime.c:611 -msgid "unsupported type for operator" +#: shared-bindings/random/__init__.c +msgid "invalid step" msgstr "" -#: py/runtime.c:307 -msgid "unsupported type for %q: '%s'" +#: ports/esp8266/common-hal/busio/UART.c ports/esp8266/machine_uart.c +msgid "invalid stop bits" msgstr "" -#: py/runtime.c:614 -msgid "unsupported types for %q: '%s', '%s'" +#: py/compile.c py/parse.c +msgid "invalid syntax" msgstr "" -#: py/runtime.c:881 py/runtime.c:888 py/runtime.c:945 -msgid "wrong number of values to unpack" +#: py/parsenum.c +msgid "invalid syntax for integer" msgstr "" -#: py/runtime.c:883 py/runtime.c:947 +#: py/parsenum.c #, c-format -msgid "need more than %d values to unpack" +msgid "invalid syntax for integer with base %d" msgstr "" -#: py/runtime.c:890 -#, c-format -msgid "too many values to unpack (expected %d)" +#: py/parsenum.c +msgid "invalid syntax for number" msgstr "" -#: py/runtime.c:984 -msgid "argument has wrong type" +#: py/objtype.c +msgid "issubclass() arg 1 must be a class" msgstr "" -#: py/runtime.c:986 -msgid "argument should be a '%q' not a '%q'" +#: py/objtype.c +msgid "issubclass() arg 2 must be a class or a tuple of classes" msgstr "" -#: py/runtime.c:1123 py/runtime.c:1197 -msgid "no such attribute" +#: py/objstr.c +msgid "join expects a list of str/bytes objects consistent with self object" msgstr "" -#: py/runtime.c:1128 -msgid "type object '%q' has no attribute '%q'" +#: py/argcheck.c +msgid "keyword argument(s) not yet implemented - use normal args instead" msgstr "" -#: py/runtime.c:1132 py/runtime.c:1200 -msgid "'%s' object has no attribute '%q'" +#: py/bc.c +msgid "keywords must be strings" msgstr "" -#: py/runtime.c:1238 -msgid "object not iterable" +#: py/emitinlinextensa.c py/emitinlinethumb.c +msgid "label '%q' not defined" msgstr "" -#: py/runtime.c:1241 -#, c-format -msgid "'%s' object is not iterable" +#: py/compile.c +msgid "label redefined" msgstr "" -#: py/runtime.c:1260 py/runtime.c:1296 -msgid "object not an iterator" +#: ports/esp8266/modesp.c +msgid "len must be multiple of 4" msgstr "" -#: py/runtime.c:1262 py/runtime.c:1298 -#, c-format -msgid "'%s' object is not an iterator" +#: py/stream.c +msgid "length argument not allowed for this type" msgstr "" -#: py/runtime.c:1401 -msgid "exceptions must derive from BaseException" +#: py/objarray.c +msgid "lhs and rhs should be compatible" msgstr "" -#: py/runtime.c:1430 -msgid "cannot import name %q" +#: py/emitnative.c +msgid "local '%q' has type '%q' but source is '%q'" msgstr "" -#: py/runtime.c:1535 -msgid "memory allocation failed, heap is locked" +#: py/emitnative.c +msgid "local '%q' used before type known" +msgstr "" + +#: py/vm.c +msgid "local variable referenced before assignment" +msgstr "" + +#: py/objint.c +msgid "long int not supported in this build" +msgstr "" + +#: shared-bindings/_stage/Layer.c +msgid "map buffer too small" +msgstr "" + +#: shared-bindings/math/__init__.c py/modmath.c +msgid "math domain error" +msgstr "" + +#: py/runtime.c +msgid "maximum recursion depth exceeded" msgstr "" -#: py/runtime.c:1539 +#: py/runtime.c #, c-format msgid "memory allocation failed, allocating %u bytes" msgstr "" -#: py/runtime.c:1609 -msgid "maximum recursion depth exceeded" +#: ports/esp8266/modesp.c +#, c-format +msgid "memory allocation failed, allocating %u bytes for native code" msgstr "" -#: py/sequence.c:264 -msgid "object not in sequence" +#: py/runtime.c +msgid "memory allocation failed, heap is locked" msgstr "" -#: py/stream.c:96 -msgid "stream operation not supported" +#: py/builtinimport.c +msgid "module not found" msgstr "" -#: py/stream.c:254 -msgid "string not supported; use bytes or bytearray" +#: py/compile.c +msgid "multiple *x in assignment" msgstr "" -#: py/stream.c:289 -msgid "length argument not allowed for this type" +#: py/objtype.c +msgid "multiple bases have instance lay-out conflict" msgstr "" -#: py/vm.c:255 -msgid "local variable referenced before assignment" +#: py/objtype.c +msgid "multiple inheritance not supported" msgstr "" -#: py/vm.c:1142 -msgid "no active exception to reraise" +#: py/emitnative.c +msgid "must raise an object" msgstr "" -#: py/vm.c:1284 -msgid "byte code not implemented" +#: extmod/machine_spi.c +msgid "must specify all of sck/mosi/miso" msgstr "" -#: shared-bindings/_stage/Layer.c:71 -msgid "graphic must be 2048 bytes long" +#: py/modbuiltins.c +msgid "must use keyword argument for key function" msgstr "" -#: shared-bindings/_stage/Layer.c:77 shared-bindings/_stage/Text.c:75 -msgid "palette must be 32 bytes long" +#: py/runtime.c +msgid "name '%q' is not defined" msgstr "" -#: shared-bindings/_stage/Layer.c:84 -msgid "map buffer too small" +#: shared-bindings/bleio/Peripheral.c +msgid "name must be a string" msgstr "" -#: shared-bindings/_stage/Text.c:69 -msgid "font must be 2048 bytes long" +#: py/runtime.c +msgid "name not defined" msgstr "" -#: shared-bindings/_stage/Text.c:81 -msgid "chars buffer too small" +#: py/compile.c +msgid "name reused for argument" msgstr "" -#: shared-bindings/analogio/AnalogOut.c:118 -msgid "AnalogOut is only 16 bits. Value must be less than 65536." +#: py/emitnative.c +msgid "native yield" msgstr "" -#: shared-bindings/audiobusio/I2SOut.c:225 -#: shared-bindings/audioio/AudioOut.c:226 -msgid "Not playing" +#: py/runtime.c +#, c-format +msgid "need more than %d values to unpack" msgstr "" -#: shared-bindings/audiobusio/PDMIn.c:124 -msgid "Bit depth must be multiple of 8." +#: py/runtime.c py/objint_mpz.c py/objint_longlong.c +msgid "negative power with no float support" msgstr "" -#: shared-bindings/audiobusio/PDMIn.c:128 -msgid "Oversample must be multiple of 8." +#: py/runtime.c py/objint_mpz.c +msgid "negative shift count" msgstr "" -#: shared-bindings/audiobusio/PDMIn.c:136 -msgid "Microphone startup delay must be in range 0.0 to 1.0" +#: py/vm.c +msgid "no active exception to reraise" msgstr "" -#: shared-bindings/audiobusio/PDMIn.c:193 -msgid "destination_length must be an int >= 0" +#: shared-bindings/socket/__init__.c shared-module/network/__init__.c +msgid "no available NIC" msgstr "" -#: shared-bindings/audiobusio/PDMIn.c:199 -msgid "Cannot record to a file" +#: py/compile.c +msgid "no binding for nonlocal found" msgstr "" -#: shared-bindings/audiobusio/PDMIn.c:202 -msgid "Destination capacity is smaller than destination_length." +#: py/builtinimport.c +msgid "no module named '%q'" msgstr "" -#: shared-bindings/audiobusio/PDMIn.c:206 -msgid "destination buffer must be an array of type 'H' for bit_depth = 16" +#: shared-bindings/_pixelbuf/__init__.c py/runtime.c +msgid "no such attribute" msgstr "" -#: shared-bindings/audiobusio/PDMIn.c:208 -msgid "" -"destination buffer must be a bytearray or array of type 'B' for bit_depth = 8" +#: py/compile.c +msgid "non-default argument follows default argument" msgstr "" -#: shared-bindings/audioio/Mixer.c:94 -msgid "Invalid voice count" +#: extmod/modubinascii.c +msgid "non-hex digit found" msgstr "" -#: shared-bindings/audioio/Mixer.c:99 -msgid "Invalid channel count" +#: py/compile.c +msgid "non-keyword arg after */**" msgstr "" -#: shared-bindings/audioio/Mixer.c:103 -msgid "Sample rate must be positive" +#: py/compile.c +msgid "non-keyword arg after keyword arg" msgstr "" -#: shared-bindings/audioio/Mixer.c:107 -msgid "bits_per_sample must be 8 or 16" +#: shared-bindings/bleio/UUID.c +msgid "not a 128-bit UUID" msgstr "" -#: shared-bindings/audioio/RawSample.c:98 -msgid "" -"sample_source buffer must be a bytearray or array of type 'h', 'H', 'b' or " -"'B'" +#: ports/esp8266/machine_adc.c +#, c-format +msgid "not a valid ADC Channel: %d" msgstr "" -#: shared-bindings/audioio/RawSample.c:104 -msgid "buffer must be a bytes-like object" +#: py/objstr.c +msgid "not all arguments converted during string formatting" msgstr "" -#: shared-bindings/audioio/WaveFile.c:78 -#: shared-bindings/displayio/OnDiskBitmap.c:85 -msgid "file must be a file opened in byte mode" +#: py/objstr.c +msgid "not enough arguments for format string" msgstr "" -#: shared-bindings/bitbangio/I2C.c:111 shared-bindings/bitbangio/SPI.c:121 -#: shared-bindings/busio/SPI.c:133 -msgid "Function requires lock" +#: py/obj.c +#, c-format +msgid "object '%s' is not a tuple or list" msgstr "" -#: shared-bindings/bitbangio/I2C.c:195 shared-bindings/busio/I2C.c:210 -msgid "Buffer must be at least length 1" +#: py/obj.c +msgid "object does not support item assignment" msgstr "" -#: shared-bindings/bitbangio/SPI.c:151 shared-bindings/busio/SPI.c:175 -msgid "Invalid polarity" +#: py/obj.c +msgid "object does not support item deletion" msgstr "" -#: shared-bindings/bitbangio/SPI.c:155 shared-bindings/busio/SPI.c:179 -msgid "Invalid phase" +#: py/obj.c +msgid "object has no len" msgstr "" -#: shared-bindings/bitbangio/SPI.c:159 shared-bindings/busio/SPI.c:183 -msgid "Invalid number of bits" +#: py/obj.c +msgid "object is not subscriptable" msgstr "" -#: shared-bindings/bitbangio/SPI.c:284 shared-bindings/busio/SPI.c:348 -msgid "buffer slices must be of equal length" +#: py/runtime.c +msgid "object not an iterator" msgstr "" -#: shared-bindings/bleio/Address.c:101 -msgid "Wrong address length" +#: py/objtype.c py/runtime.c +msgid "object not callable" msgstr "" -#: shared-bindings/bleio/Address.c:107 -msgid "Wrong number of bytes provided" +#: py/sequence.c +msgid "object not in sequence" msgstr "" -#: shared-bindings/bleio/Device.c:210 -msgid "Can't add services in Central mode" +#: py/runtime.c +msgid "object not iterable" msgstr "" -#: shared-bindings/bleio/Device.c:226 -msgid "Can't connect in Peripheral mode" +#: py/obj.c +#, c-format +msgid "object of type '%s' has no len()" msgstr "" -#: shared-bindings/bleio/Device.c:256 -msgid "Can't change the name in Central mode" +#: py/obj.c +msgid "object with buffer protocol required" msgstr "" -#: shared-bindings/bleio/Device.c:277 shared-bindings/bleio/Device.c:313 -msgid "Can't advertise in Central mode" +#: extmod/modubinascii.c +msgid "odd-length string" msgstr "" -#: shared-bindings/busio/I2C.c:120 -msgid "Function requires lock." +#: py/objstrunicode.c py/objstr.c +msgid "offset out of bounds" msgstr "" -#: shared-bindings/busio/UART.c:106 -msgid "bits must be 7, 8 or 9" +#: shared-bindings/nvm/ByteArray.c py/objarray.c py/objtuple.c +#: py/objstrunicode.c py/objstr.c +msgid "only slices with step=1 (aka None) are supported" msgstr "" -#: shared-bindings/busio/UART.c:118 -msgid "stop must be 1 or 2" +#: py/modbuiltins.c +msgid "ord expects a character" msgstr "" -#: shared-bindings/busio/UART.c:123 -msgid "timeout >100 (units are now seconds, not msecs)" +#: py/modbuiltins.c +#, c-format +msgid "ord() expected a character, but string of length %d found" msgstr "" -#: shared-bindings/digitalio/DigitalInOut.c:211 -msgid "Invalid direction." +#: py/objint_mpz.c +msgid "overflow converting long int to machine word" msgstr "" -#: shared-bindings/digitalio/DigitalInOut.c:240 -msgid "Cannot set value when direction is input." +#: shared-bindings/_stage/Text.c shared-bindings/_stage/Layer.c +msgid "palette must be 32 bytes long" msgstr "" -#: shared-bindings/digitalio/DigitalInOut.c:266 -#: shared-bindings/digitalio/DigitalInOut.c:281 -msgid "Drive mode not used when direction is input." +#: shared-bindings/displayio/Palette.c +msgid "palette_index should be an int" msgstr "" -#: shared-bindings/digitalio/DigitalInOut.c:314 -#: shared-bindings/digitalio/DigitalInOut.c:331 -msgid "Pull not used when direction is output." +#: py/compile.c +msgid "parameter annotation must be an identifier" msgstr "" -#: shared-bindings/digitalio/DigitalInOut.c:340 -msgid "Unsupported pull value." +#: py/emitinlinextensa.c +msgid "parameters must be registers in sequence a2 to a5" msgstr "" -#: shared-bindings/displayio/Bitmap.c:84 -msgid "y should be an int" +#: py/emitinlinethumb.c +msgid "parameters must be registers in sequence r0 to r3" msgstr "" -#: shared-bindings/displayio/Bitmap.c:89 -msgid "row buffer must be a bytearray or array of type 'b' or 'B'" +#: ports/esp8266/machine_pin.c +msgid "pin does not have IRQ capabilities" msgstr "" -#: shared-bindings/displayio/Bitmap.c:94 -msgid "row data must be a buffer" +#: shared-bindings/displayio/Bitmap.c +msgid "pixel coordinates out of bounds" msgstr "" -#: shared-bindings/displayio/ColorConverter.c:72 -msgid "color should be an int" +#: shared-bindings/displayio/Bitmap.c +msgid "pixel value requires too many bits" msgstr "" -#: shared-bindings/displayio/FourWire.c:55 -#: shared-bindings/displayio/FourWire.c:64 -msgid "displayio is a work in progress" +#: shared-bindings/displayio/TileGrid.c +msgid "pixel_shader must be displayio.Palette or displayio.ColorConverter" msgstr "" -#: shared-bindings/displayio/Group.c:65 -msgid "Group must have size at least 1" +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +#: ports/nrf/common-hal/pulseio/PulseIn.c +#: ports/esp8266/common-hal/pulseio/PulseIn.c +msgid "pop from an empty PulseIn" msgstr "" -#: shared-bindings/displayio/Palette.c:96 -msgid "color buffer must be a bytearray or array of type 'b' or 'B'" +#: py/objset.c +msgid "pop from an empty set" msgstr "" -#: shared-bindings/displayio/Palette.c:102 -msgid "color buffer must be 3 bytes (RGB) or 4 bytes (RGB + pad byte)" +#: py/objlist.c +msgid "pop from empty list" msgstr "" -#: shared-bindings/displayio/Palette.c:106 -msgid "color must be between 0x000000 and 0xffffff" +#: py/objdict.c +msgid "popitem(): dictionary is empty" msgstr "" -#: shared-bindings/displayio/Palette.c:110 -msgid "color buffer must be a buffer or int" +#: py/objint_mpz.c +msgid "pow() 3rd argument cannot be 0" msgstr "" -#: shared-bindings/displayio/Palette.c:123 -#: shared-bindings/displayio/Palette.c:137 -msgid "palette_index should be an int" +#: py/objint_mpz.c +msgid "pow() with 3 arguments requires integers" msgstr "" -#: shared-bindings/displayio/Sprite.c:48 -msgid "position must be 2-tuple" +#: extmod/modutimeq.c +msgid "queue overflow" msgstr "" -#: shared-bindings/displayio/Sprite.c:97 -msgid "unsupported bitmap type" +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "rawbuf is not the same size as buf" msgstr "" -#: shared-bindings/displayio/Sprite.c:162 -msgid "pixel_shader must be displayio.Palette or displayio.ColorConverter" +#: shared-bindings/_pixelbuf/__init__.c +msgid "readonly attribute" msgstr "" -#: shared-bindings/gamepad/GamePad.c:100 -msgid "too many arguments" +#: py/builtinimport.c +msgid "relative import" msgstr "" -#: shared-bindings/gamepad/GamePad.c:104 -msgid "expected a DigitalInOut" +#: py/obj.c +#, c-format +msgid "requested length %d but object has length %d" msgstr "" -#: shared-bindings/i2cslave/I2CSlave.c:98 -msgid "can't convert address to int" +#: py/compile.c +msgid "return annotation must be an identifier" msgstr "" -#: shared-bindings/i2cslave/I2CSlave.c:101 -msgid "address out of bounds" +#: py/emitnative.c +msgid "return expected '%q' but got '%q'" msgstr "" -#: shared-bindings/i2cslave/I2CSlave.c:107 -msgid "addresses is empty" +#: shared-module/displayio/Bitmap.c +msgid "row must be packed and word aligned" msgstr "" -#: shared-bindings/microcontroller/Pin.c:89 -#: shared-bindings/neopixel_write/__init__.c:67 -#: shared-bindings/pulseio/PulseOut.c:76 -msgid "Expected a %q" +#: py/objstr.c +msgid "rsplit(None,n)" msgstr "" -#: shared-bindings/microcontroller/Pin.c:100 -msgid "%q in use" +#: shared-bindings/audioio/RawSample.c +msgid "" +"sample_source buffer must be a bytearray or array of type 'h', 'H', 'b' or " +"'B'" msgstr "" -#: shared-bindings/microcontroller/__init__.c:126 -msgid "Invalid run mode." +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "sampling rate out of range" msgstr "" -#: shared-bindings/multiterminal/__init__.c:68 -msgid "Stream missing readinto() or write() method." +#: ports/esp8266/modnetwork.c +msgid "scan failed" msgstr "" -#: shared-bindings/nvm/ByteArray.c:99 -msgid "Slice and value different lengths." +#: py/modmicropython.c +msgid "schedule stack full" msgstr "" -#: shared-bindings/nvm/ByteArray.c:104 -msgid "Array values should be single bytes." +#: lib/utils/pyexec.c py/builtinimport.c +msgid "script compilation not supported" msgstr "" -#: shared-bindings/nvm/ByteArray.c:111 shared-bindings/nvm/ByteArray.c:141 -msgid "Unable to write to nvm." +#: shared-bindings/bleio/Peripheral.c +msgid "services includes an object that is not a Service" msgstr "" -#: shared-bindings/nvm/ByteArray.c:137 -msgid "Bytes must be between 0 and 255." +#: py/objstr.c +msgid "sign not allowed in string format specifier" msgstr "" -#: shared-bindings/os/__init__.c:200 -msgid "No hardware random available" +#: py/objstr.c +msgid "sign not allowed with integer format specifier 'c'" msgstr "" -#: shared-bindings/pulseio/PWMOut.c:164 -msgid "" -"PWM duty_cycle must be between 0 and 65535 inclusive (16 bit resolution)" +#: py/objstr.c +msgid "single '}' encountered in format string" msgstr "" -#: shared-bindings/pulseio/PWMOut.c:195 -msgid "" -"PWM frequency not writable when variable_frequency is False on construction." +#: shared-bindings/time/__init__.c +msgid "sleep length must be non-negative" msgstr "" -#: shared-bindings/pulseio/PulseIn.c:275 -msgid "Cannot delete values" +#: py/objslice.c py/sequence.c +msgid "slice step cannot be zero" msgstr "" -#: shared-bindings/pulseio/PulseIn.c:281 -msgid "Slices not supported" +#: py/sequence.c py/objint.c +msgid "small int overflow" msgstr "" -#: shared-bindings/pulseio/PulseIn.c:287 -msgid "index must be int" +#: main.c +msgid "soft reboot\n" msgstr "" -#: shared-bindings/pulseio/PulseIn.c:293 -msgid "Read-only" +#: py/objstr.c +msgid "start/end indices" msgstr "" -#: shared-bindings/pulseio/PulseOut.c:135 -msgid "Array must contain halfwords (type 'H')" +#: shared-bindings/displayio/Shape.c +msgid "start_x should be an int" +msgstr "" + +#: shared-bindings/random/__init__.c +msgid "step must be non-zero" +msgstr "" + +#: shared-bindings/busio/UART.c +msgid "stop must be 1 or 2" msgstr "" -#: shared-bindings/random/__init__.c:92 shared-bindings/random/__init__.c:100 +#: shared-bindings/random/__init__.c msgid "stop not reachable from start" msgstr "" -#: shared-bindings/random/__init__.c:111 -msgid "step must be non-zero" +#: py/stream.c +msgid "stream operation not supported" msgstr "" -#: shared-bindings/random/__init__.c:114 -msgid "invalid step" +#: py/objstrunicode.c +msgid "string index out of range" msgstr "" -#: shared-bindings/random/__init__.c:146 -msgid "empty sequence" +#: py/objstrunicode.c +#, c-format +msgid "string indices must be integers, not %s" msgstr "" -#: shared-bindings/rtc/RTC.c:40 shared-bindings/rtc/RTC.c:44 -#: shared-bindings/time/__init__.c:190 -msgid "RTC is not supported on this board" +#: py/stream.c +msgid "string not supported; use bytes or bytearray" msgstr "" -#: shared-bindings/rtc/RTC.c:52 -msgid "RTC calibration is not supported on this board" +#: extmod/moductypes.c +msgid "struct: cannot index" msgstr "" -#: shared-bindings/socket/__init__.c:516 shared-module/network/__init__.c:81 -msgid "no available NIC" +#: extmod/moductypes.c +msgid "struct: index out of range" msgstr "" -#: shared-bindings/storage/__init__.c:77 -msgid "filesystem must provide mount method" +#: extmod/moductypes.c +msgid "struct: no fields" msgstr "" -#: shared-bindings/supervisor/__init__.c:93 -msgid "Brightness must be between 0 and 255" +#: py/objstr.c +msgid "substring not found" msgstr "" -#: shared-bindings/supervisor/__init__.c:119 -msgid "Stack size must be at least 256" +#: py/compile.c +msgid "super() can't find self" msgstr "" -#: shared-bindings/time/__init__.c:78 -msgid "sleep length must be non-negative" +#: extmod/modujson.c +msgid "syntax error in JSON" msgstr "" -#: shared-bindings/time/__init__.c:88 -msgid "time.struct_time() takes exactly 1 argument" +#: extmod/moductypes.c +msgid "syntax error in uctypes descriptor" +msgstr "" + +#: shared-bindings/touchio/TouchIn.c +msgid "threshold must be in the range 0-65536" msgstr "" -#: shared-bindings/time/__init__.c:91 +#: shared-bindings/displayio/TileGrid.c +msgid "tile index out of bounds" +msgstr "" + +#: shared-bindings/time/__init__.c msgid "time.struct_time() takes a 9-sequence" msgstr "" -#: shared-bindings/time/__init__.c:169 shared-bindings/time/__init__.c:263 -msgid "Tuple or struct_time argument required" +#: shared-bindings/time/__init__.c +msgid "time.struct_time() takes exactly 1 argument" msgstr "" -#: shared-bindings/time/__init__.c:174 shared-bindings/time/__init__.c:268 -msgid "function takes exactly 9 arguments" +#: shared-bindings/busio/UART.c +msgid "timeout >100 (units are now seconds, not msecs)" +msgstr "" + +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "timeout must be >= 0.0" msgstr "" -#: shared-bindings/time/__init__.c:239 shared-bindings/time/__init__.c:272 +#: shared-bindings/time/__init__.c msgid "timestamp out of range for platform time_t" msgstr "" -#: shared-bindings/touchio/TouchIn.c:173 -msgid "threshold must be in the range 0-65536" +#: shared-bindings/gamepad/GamePad.c +msgid "too many arguments" msgstr "" -#: shared-bindings/util.c:38 -msgid "" -"Object has been deinitialized and can no longer be used. Create a new object." +#: shared-module/struct/__init__.c +msgid "too many arguments provided with the given format" msgstr "" -#: shared-module/audioio/Mixer.c:47 shared-module/audioio/WaveFile.c:117 -msgid "Couldn't allocate first buffer" +#: py/runtime.c +#, c-format +msgid "too many values to unpack (expected %d)" msgstr "" -#: shared-module/audioio/Mixer.c:53 shared-module/audioio/WaveFile.c:123 -msgid "Couldn't allocate second buffer" +#: py/objstr.c +msgid "tuple index out of range" msgstr "" -#: shared-module/audioio/Mixer.c:82 -msgid "Voice index too high" +#: py/obj.c +msgid "tuple/list has wrong length" msgstr "" -#: shared-module/audioio/Mixer.c:85 -msgid "The sample's sample rate does not match the mixer's" +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "tuple/list required on RHS" msgstr "" -#: shared-module/audioio/Mixer.c:88 -msgid "The sample's channel count does not match the mixer's" +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "tx and rx cannot both be None" msgstr "" -#: shared-module/audioio/Mixer.c:91 -msgid "The sample's bits_per_sample does not match the mixer's" +#: py/objtype.c +msgid "type '%q' is not an acceptable base type" msgstr "" -#: shared-module/audioio/Mixer.c:100 -msgid "The sample's signedness does not match the mixer's" +#: py/objtype.c +msgid "type is not an acceptable base type" msgstr "" -#: shared-module/audioio/WaveFile.c:61 -msgid "Invalid wave file" +#: py/runtime.c +msgid "type object '%q' has no attribute '%q'" msgstr "" -#: shared-module/audioio/WaveFile.c:69 -msgid "Invalid format chunk size" +#: py/objtype.c +msgid "type takes 1 or 3 arguments" msgstr "" -#: shared-module/audioio/WaveFile.c:83 -msgid "Unsupported format" +#: py/objint_longlong.c +msgid "ulonglong too large" msgstr "" -#: shared-module/audioio/WaveFile.c:99 -msgid "Data chunk must follow fmt chunk" +#: py/emitnative.c +msgid "unary op %q not implemented" msgstr "" -#: shared-module/audioio/WaveFile.c:107 -msgid "Invalid file" +#: py/parse.c +msgid "unexpected indent" msgstr "" -#: shared-module/bitbangio/I2C.c:58 -msgid "Clock stretch too long" +#: py/bc.c +msgid "unexpected keyword argument" msgstr "" -#: shared-module/bitbangio/SPI.c:44 -msgid "Clock pin init failed." +#: py/objnamedtuple.c py/bc.c +msgid "unexpected keyword argument '%q'" msgstr "" -#: shared-module/bitbangio/SPI.c:50 -msgid "MOSI pin init failed." +#: py/lexer.c +msgid "unicode name escapes" msgstr "" -#: shared-module/bitbangio/SPI.c:61 -msgid "MISO pin init failed." +#: py/parse.c +msgid "unindent does not match any outer indentation level" msgstr "" -#: shared-module/bitbangio/SPI.c:121 -msgid "Cannot write without MOSI pin." +#: ports/esp8266/modnetwork.c +msgid "unknown config param" msgstr "" -#: shared-module/bitbangio/SPI.c:176 -msgid "Cannot read without MISO pin." +#: py/objstr.c +#, c-format +msgid "unknown conversion specifier %c" msgstr "" -#: shared-module/bitbangio/SPI.c:240 -msgid "Cannot transfer without MOSI and MISO pins." +#: py/objstr.c +#, c-format +msgid "unknown format code '%c' for object of type '%s'" msgstr "" -#: shared-module/displayio/Bitmap.c:49 -msgid "Only bit maps of 8 bit color or less are supported" +#: py/objstr.c +#, c-format +msgid "unknown format code '%c' for object of type 'float'" msgstr "" -#: shared-module/displayio/Bitmap.c:69 -msgid "row must be packed and word aligned" +#: py/objstr.c +#, c-format +msgid "unknown format code '%c' for object of type 'str'" msgstr "" -#: shared-module/displayio/Group.c:39 -msgid "Group full" +#: ports/esp8266/modnetwork.c +msgid "unknown status param" msgstr "" -#: shared-module/displayio/Group.c:48 -msgid "Group empty" +#: py/compile.c +msgid "unknown type" msgstr "" -#: shared-module/displayio/OnDiskBitmap.c:49 -msgid "Invalid BMP file" +#: py/emitnative.c +msgid "unknown type '%q'" msgstr "" -#: shared-module/displayio/OnDiskBitmap.c:59 -#, c-format -msgid "Only Windows format, uncompressed BMP supported %d" +#: py/objstr.c +msgid "unmatched '{' in format" msgstr "" -#: shared-module/displayio/OnDiskBitmap.c:64 -#, c-format -msgid "Only true color (24 bpp or higher) BMP supported %x" +#: py/objtype.c py/runtime.c +msgid "unreadable attribute" msgstr "" -#: shared-module/storage/__init__.c:155 -msgid "Cannot remount '/' when USB is active." +#: py/emitinlinethumb.c +#, c-format +msgid "unsupported Thumb instruction '%s' with %d arguments" msgstr "" -#: shared-module/struct/__init__.c:39 -msgid "'S' and 'O' are not supported format types" +#: py/emitinlinextensa.c +#, c-format +msgid "unsupported Xtensa instruction '%s' with %d arguments" msgstr "" -#: shared-module/struct/__init__.c:83 -msgid "too many arguments provided with the given format" +#: shared-bindings/displayio/TileGrid.c +msgid "unsupported bitmap type" msgstr "" -#: shared-module/usb_hid/Device.c:45 +#: py/objstr.c #, c-format -msgid "Buffer incorrect size. Should be %d bytes." +msgid "unsupported format character '%c' (0x%x) at index %d" msgstr "" -#: shared-module/usb_hid/Device.c:53 -msgid "USB Busy" +#: py/runtime.c +msgid "unsupported type for %q: '%s'" msgstr "" -#: shared-module/usb_hid/Device.c:59 -msgid "USB Error" +#: py/runtime.c +msgid "unsupported type for operator" msgstr "" -#: supervisor/shared/safe_mode.c:97 -msgid "You requested starting safe mode by " +#: py/runtime.c +msgid "unsupported types for %q: '%s', '%s'" msgstr "" -#: supervisor/shared/safe_mode.c:100 -msgid "To exit, please reset the board without " +#: shared-bindings/displayio/Bitmap.c +msgid "value_count must be > 0" msgstr "" -#: supervisor/shared/safe_mode.c:107 -msgid "" -"You are running in safe mode which means something unanticipated happened.\n" +#: ports/esp8266/modnetwork.c +msgid "wifi_set_ip_info() failed" msgstr "" -#: supervisor/shared/safe_mode.c:109 -msgid "" -"Looks like our core CircuitPython code crashed hard. Whoops!\n" -"Please file an issue at https://github.com/adafruit/circuitpython/issues\n" -" with the contents of your CIRCUITPY drive and this message:\n" +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "write_args must be a list, tuple, or None" msgstr "" -#: supervisor/shared/safe_mode.c:111 -msgid "Crash into the HardFault_Handler.\n" +#: py/objstr.c +msgid "wrong number of arguments" msgstr "" -#: supervisor/shared/safe_mode.c:113 -msgid "MicroPython NLR jump failed. Likely memory corruption.\n" +#: py/runtime.c +msgid "wrong number of values to unpack" msgstr "" -#: supervisor/shared/safe_mode.c:115 -msgid "MicroPython fatal error.\n" +#: shared-module/displayio/Shape.c +msgid "x value out of bounds" msgstr "" -#: supervisor/shared/safe_mode.c:118 -msgid "" -"The microcontroller's power dipped. Please make sure your power supply " -"provides\n" -"enough power for the whole circuit and press reset (after ejecting " -"CIRCUITPY).\n" +#: shared-bindings/displayio/Shape.c +msgid "y should be an int" msgstr "" -#: supervisor/shared/safe_mode.c:120 -msgid "" -"The CircuitPython heap was corrupted because the stack was too small.\n" -"Please increase stack size limits and press reset (after ejecting " -"CIRCUITPY).\n" -"If you didn't change the stack, then file an issue here with the contents of " -"your CIRCUITPY drive:\n" +#: shared-module/displayio/Shape.c +msgid "y value out of bounds" msgstr "" -#: supervisor/shared/safe_mode.c:123 -msgid "" -"The reset button was pressed while booting CircuitPython. Press again to " -"exit safe mode.\n" +#: py/objrange.c +msgid "zero step" msgstr "" diff --git a/locale/en_x_pirate.po b/locale/en_x_pirate.po new file mode 100644 index 000000000..f9bb0f0ff --- /dev/null +++ b/locale/en_x_pirate.po @@ -0,0 +1,2838 @@ +# Pirate (English) Translation +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-03-25 19:40+0100\n" +"PO-Revision-Date: 2018-07-27 11:55-0700\n" +"Last-Translator: \n" +"Language-Team: @sommersoft, @MrCertainly\n" +"Language: en_x_pirate\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.1.1\n" + +#: main.c +msgid "" +"\n" +"Code done running. Waiting for reload.\n" +msgstr "" +"\n" +"Captin's orders are complete. Holdin' fast fer reload.\n" + +#: py/obj.c +msgid " File \"%q\"" +msgstr "" + +#: py/obj.c +msgid " File \"%q\", line %d" +msgstr "" + +#: main.c +msgid " output:\n" +msgstr "" + +#: py/objstr.c +#, c-format +msgid "%%c requires int or char" +msgstr "" + +#: shared-bindings/microcontroller/Pin.c +msgid "%q in use" +msgstr "" + +#: py/obj.c +msgid "%q index out of range" +msgstr "" + +#: py/obj.c +msgid "%q indices must be integers, not %s" +msgstr "" + +#: shared-bindings/displayio/Group.c shared-bindings/displayio/Shape.c +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "%q must be >= 1" +msgstr "" + +#: shared-bindings/fontio/BuiltinFont.c +msgid "%q should be an int" +msgstr "" + +#: py/objnamedtuple.c py/bc.c +msgid "%q() takes %d positional arguments but %d were given" +msgstr "" + +#: py/argcheck.c +msgid "'%q' argument required" +msgstr "" + +#: py/emitinlinextensa.c py/emitinlinethumb.c +#, c-format +msgid "'%s' expects a label" +msgstr "" + +#: py/emitinlinextensa.c py/emitinlinethumb.c +#, c-format +msgid "'%s' expects a register" +msgstr "" + +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects a special register" +msgstr "" + +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects an FPU register" +msgstr "" + +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects an address of the form [a, b]" +msgstr "" + +#: py/emitinlinextensa.c py/emitinlinethumb.c +#, c-format +msgid "'%s' expects an integer" +msgstr "" + +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects at most r%d" +msgstr "" + +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects {r0, r1, ...}" +msgstr "" + +#: py/emitinlinextensa.c +#, c-format +msgid "'%s' integer %d is not within range %d..%d" +msgstr "" + +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' integer 0x%x does not fit in mask 0x%x" +msgstr "" + +#: py/obj.c +#, c-format +msgid "'%s' object does not support item assignment" +msgstr "" + +#: py/obj.c +#, c-format +msgid "'%s' object does not support item deletion" +msgstr "" + +#: py/runtime.c +msgid "'%s' object has no attribute '%q'" +msgstr "" + +#: py/runtime.c +#, c-format +msgid "'%s' object is not an iterator" +msgstr "" + +#: py/objtype.c py/runtime.c +#, c-format +msgid "'%s' object is not callable" +msgstr "" + +#: py/runtime.c +#, c-format +msgid "'%s' object is not iterable" +msgstr "" + +#: py/obj.c +#, c-format +msgid "'%s' object is not subscriptable" +msgstr "" + +#: py/objstr.c +msgid "'=' alignment not allowed in string format specifier" +msgstr "" + +#: shared-module/struct/__init__.c +msgid "'S' and 'O' are not supported format types" +msgstr "" + +#: py/compile.c +msgid "'align' requires 1 argument" +msgstr "" + +#: py/compile.c +msgid "'await' outside function" +msgstr "" + +#: py/compile.c +msgid "'break' outside loop" +msgstr "" + +#: py/compile.c +msgid "'continue' outside loop" +msgstr "" + +#: py/compile.c +msgid "'data' requires at least 2 arguments" +msgstr "" + +#: py/compile.c +msgid "'data' requires integer arguments" +msgstr "" + +#: py/compile.c +msgid "'label' requires 1 argument" +msgstr "" + +#: py/compile.c +msgid "'return' outside function" +msgstr "" + +#: py/compile.c +msgid "'yield' outside function" +msgstr "" + +#: py/compile.c +msgid "*x must be assignment target" +msgstr "" + +#: py/obj.c +msgid ", in %q\n" +msgstr "" + +#: py/objcomplex.c +msgid "0.0 to a complex power" +msgstr "" + +#: py/modbuiltins.c +msgid "3-arg pow() not supported" +msgstr "" + +#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c +msgid "A hardware interrupt channel is already in use" +msgstr "Avast! A hardware interrupt channel be used already" + +#: ports/esp8266/modnetwork.c +msgid "AP required" +msgstr "" + +#: shared-bindings/bleio/Address.c +#, c-format +msgid "Address is not %d bytes long or is in wrong format" +msgstr "" + +#: shared-bindings/bleio/Address.c +#, c-format +msgid "Address must be %d bytes long" +msgstr "" + +#: ports/nrf/common-hal/busio/I2C.c +msgid "All I2C peripherals are in use" +msgstr "" + +#: ports/nrf/common-hal/busio/SPI.c +msgid "All SPI peripherals are in use" +msgstr "" + +#: ports/nrf/common-hal/busio/UART.c +msgid "All UART peripherals are in use" +msgstr "" + +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "All event channels in use" +msgstr "" + +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c ports/atmel-samd/audio_dma.c +msgid "All sync event channels in use" +msgstr "" + +#: shared-bindings/pulseio/PWMOut.c +msgid "All timers for this pin are in use" +msgstr "" + +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/pulseio/PulseOut.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c +#: shared-module/_pew/PewPew.c +msgid "All timers in use" +msgstr "" + +#: ports/nrf/common-hal/analogio/AnalogOut.c +msgid "AnalogOut functionality not supported" +msgstr "" + +#: shared-bindings/analogio/AnalogOut.c +msgid "AnalogOut is only 16 bits. Value must be less than 65536." +msgstr "" + +#: ports/atmel-samd/common-hal/analogio/AnalogOut.c +msgid "AnalogOut not supported on given pin" +msgstr "" + +#: ports/atmel-samd/common-hal/pulseio/PulseOut.c +msgid "Another send is already active" +msgstr "Belay that! thar be another active send" + +#: shared-bindings/pulseio/PulseOut.c +msgid "Array must contain halfwords (type 'H')" +msgstr "" + +#: shared-bindings/nvm/ByteArray.c +msgid "Array values should be single bytes." +msgstr "" + +#: supervisor/shared/safe_mode.c +msgid "Attempted heap allocation when MicroPython VM not running.\n" +msgstr "" + +#: main.c +msgid "Auto-reload is off.\n" +msgstr "Auto-reload be off.\n" + +#: main.c +msgid "" +"Auto-reload is on. Simply save files over USB to run them or enter REPL to " +"disable.\n" +msgstr "" +"Auto-reload be on. Put yer files on USB to weigh anchor, er' bring'er about " +"t' the REPL t' scuttle.\n" + +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Bit clock and word select must share a clock unit" +msgstr "" + +#: shared-bindings/audiobusio/PDMIn.c +msgid "Bit depth must be multiple of 8." +msgstr "" + +#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c +msgid "Both pins must support hardware interrupts" +msgstr "" + +#: shared-bindings/supervisor/__init__.c +msgid "Brightness must be between 0 and 255" +msgstr "" + +#: shared-bindings/displayio/Display.c +msgid "Brightness not adjustable" +msgstr "" + +#: shared-module/usb_hid/Device.c +#, c-format +msgid "Buffer incorrect size. Should be %d bytes." +msgstr "" + +#: shared-bindings/bitbangio/I2C.c shared-bindings/busio/I2C.c +msgid "Buffer must be at least length 1" +msgstr "" + +#: ports/atmel-samd/common-hal/displayio/ParallelBus.c +#: ports/nrf/common-hal/displayio/ParallelBus.c +#, c-format +msgid "Bus pin %d is already in use" +msgstr "Belay that! Bus pin %d already be in use" + +#: shared-bindings/bleio/UUID.c +msgid "Byte buffer must be 16 bytes." +msgstr "" + +#: shared-bindings/nvm/ByteArray.c +msgid "Bytes must be between 0 and 255." +msgstr "" + +#: ports/esp8266/esp_mphal.c +msgid "C-level assert" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c +#, c-format +msgid "Can not use dotstar with %s" +msgstr "" + +#: shared-bindings/bleio/Device.c +msgid "Can't add services in Central mode" +msgstr "" + +#: shared-bindings/bleio/Device.c +msgid "Can't advertise in Central mode" +msgstr "" + +#: shared-bindings/bleio/Device.c +msgid "Can't change the name in Central mode" +msgstr "" + +#: shared-bindings/bleio/Device.c +msgid "Can't connect in Peripheral mode" +msgstr "" + +#: ports/esp8266/modnetwork.c +msgid "Cannot connect to AP" +msgstr "" + +#: shared-bindings/displayio/Bitmap.c shared-bindings/pulseio/PulseIn.c +msgid "Cannot delete values" +msgstr "" + +#: ports/esp8266/modnetwork.c +msgid "Cannot disconnect from AP" +msgstr "" + +#: ports/atmel-samd/common-hal/digitalio/DigitalInOut.c +#: ports/nrf/common-hal/digitalio/DigitalInOut.c +msgid "Cannot get pull while in output mode" +msgstr "" + +#: ports/nrf/common-hal/microcontroller/Processor.c +msgid "Cannot get temperature" +msgstr "" + +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Cannot output both channels on the same pin" +msgstr "" + +#: shared-module/bitbangio/SPI.c +msgid "Cannot read without MISO pin." +msgstr "" + +#: shared-bindings/audiobusio/PDMIn.c +msgid "Cannot record to a file" +msgstr "" + +#: shared-module/storage/__init__.c +msgid "Cannot remount '/' when USB is active." +msgstr "" + +#: ports/atmel-samd/common-hal/microcontroller/__init__.c +#: ports/esp8266/common-hal/microcontroller/__init__.c +msgid "Cannot reset into bootloader because no bootloader is present." +msgstr "" + +#: ports/esp8266/modnetwork.c +msgid "Cannot set STA config" +msgstr "" + +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Cannot set value when direction is input." +msgstr "" + +#: py/objslice.c +msgid "Cannot subclass slice" +msgstr "" + +#: shared-module/bitbangio/SPI.c +msgid "Cannot transfer without MOSI and MISO pins." +msgstr "" + +#: extmod/moductypes.c +msgid "Cannot unambiguously get sizeof scalar" +msgstr "" + +#: ports/esp8266/modnetwork.c +msgid "Cannot update i/f status" +msgstr "" + +#: shared-module/bitbangio/SPI.c +msgid "Cannot write without MOSI pin." +msgstr "" + +#: shared-bindings/bleio/Service.c +msgid "Characteristic UUID doesn't match Service UUID" +msgstr "" + +#: ports/nrf/common-hal/bleio/Service.c +msgid "Characteristic already in use by another Service." +msgstr "" + +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "CharacteristicBuffer writing not provided" +msgstr "" + +#: shared-module/bitbangio/SPI.c +msgid "Clock pin init failed." +msgstr "" + +#: shared-module/bitbangio/I2C.c +msgid "Clock stretch too long" +msgstr "" + +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Clock unit in use" +msgstr "" + +#: shared-bindings/_pew/PewPew.c +msgid "Column entry must be digitalio.DigitalInOut" +msgstr "" + +#: shared-bindings/displayio/FourWire.c shared-bindings/displayio/ParallelBus.c +msgid "Command must be an int between 0 and 255" +msgstr "" + +#: ports/nrf/common-hal/bleio/UUID.c +#, c-format +msgid "Could not decode ble_uuid, err 0x%04x" +msgstr "" + +#: ports/atmel-samd/common-hal/busio/UART.c +msgid "Could not initialize UART" +msgstr "" + +#: shared-module/audioio/Mixer.c shared-module/audioio/WaveFile.c +msgid "Couldn't allocate first buffer" +msgstr "" + +#: shared-module/audioio/Mixer.c shared-module/audioio/WaveFile.c +msgid "Couldn't allocate second buffer" +msgstr "" + +#: supervisor/shared/safe_mode.c +msgid "Crash into the HardFault_Handler.\n" +msgstr "" + +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "DAC already in use" +msgstr "" + +#: ports/atmel-samd/common-hal/displayio/ParallelBus.c +#: ports/nrf/common-hal/displayio/ParallelBus.c +msgid "Data 0 pin must be byte aligned" +msgstr "" + +#: shared-module/audioio/WaveFile.c +msgid "Data chunk must follow fmt chunk" +msgstr "" + +#: ports/nrf/common-hal/bleio/Broadcaster.c +#: ports/nrf/common-hal/bleio/Peripheral.c +msgid "Data too large for advertisement packet" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c +msgid "Data too large for the advertisement packet" +msgstr "" + +#: shared-bindings/audiobusio/PDMIn.c +msgid "Destination capacity is smaller than destination_length." +msgstr "" + +#: shared-bindings/displayio/Display.c +msgid "Display rotation must be in 90 degree increments" +msgstr "" + +#: ports/unix/modffi.c +msgid "Don't know how to pass object to native function" +msgstr "" + +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Drive mode not used when direction is input." +msgstr "" + +#: ports/esp8266/common-hal/microcontroller/__init__.c +msgid "ESP8226 does not support safe mode." +msgstr "" + +#: ports/esp8266/common-hal/digitalio/DigitalInOut.c +msgid "ESP8266 does not support pull down." +msgstr "" + +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +msgid "EXTINT channel already in use" +msgstr "Avast! EXTINT channel already in use" + +#: ports/unix/modffi.c +msgid "Error in ffi_prep_cif" +msgstr "" + +#: extmod/modure.c +msgid "Error in regex" +msgstr "" + +#: shared-bindings/pulseio/PulseOut.c shared-bindings/neopixel_write/__init__.c +#: shared-bindings/terminalio/Terminal.c shared-bindings/microcontroller/Pin.c +msgid "Expected a %q" +msgstr "" + +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "Expected a Characteristic" +msgstr "" + +#: shared-bindings/bleio/Descriptor.c shared-bindings/bleio/Service.c +#: shared-bindings/bleio/Characteristic.c +msgid "Expected a UUID" +msgstr "" + +#: shared-module/_pixelbuf/PixelBuf.c +#, c-format +msgid "Expected tuple of length %d, got %d" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to acquire mutex" +msgstr "" + +#: ports/nrf/common-hal/bleio/Characteristic.c ports/nrf/sd_mutex.c +#, c-format +msgid "Failed to acquire mutex, err 0x%04x" +msgstr "" + +#: ports/nrf/common-hal/bleio/Service.c +#, c-format +msgid "Failed to add characteristic, err 0x%04x" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to add service" +msgstr "" + +#: ports/nrf/common-hal/bleio/Peripheral.c +#, c-format +msgid "Failed to add service, err 0x%04x" +msgstr "" + +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "Failed to allocate RX buffer" +msgstr "" + +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +#: ports/nrf/common-hal/pulseio/PulseIn.c +#: ports/esp8266/common-hal/pulseio/PulseIn.c +#, c-format +msgid "Failed to allocate RX buffer of %d bytes" +msgstr "" + +#: ports/nrf/common-hal/bleio/Adapter.c +msgid "Failed to change softdevice state" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to connect:" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to continue scanning" +msgstr "" + +#: ports/nrf/common-hal/bleio/Scanner.c +#, c-format +msgid "Failed to continue scanning, err 0x%04x" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to create mutex" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to discover services" +msgstr "" + +#: ports/nrf/common-hal/bleio/Adapter.c +msgid "Failed to get local address" +msgstr "" + +#: ports/nrf/common-hal/bleio/Adapter.c +msgid "Failed to get softdevice state" +msgstr "" + +#: ports/nrf/common-hal/bleio/Characteristic.c +#, c-format +msgid "Failed to notify or indicate attribute value, err 0x%04x" +msgstr "" + +#: ports/nrf/common-hal/bleio/Characteristic.c +#, c-format +msgid "Failed to read CCCD value, err 0x%04x" +msgstr "" + +#: ports/nrf/common-hal/bleio/Characteristic.c +#, c-format +msgid "Failed to read attribute value, err 0x%04x" +msgstr "" + +#: ports/nrf/common-hal/bleio/Characteristic.c +#, c-format +msgid "Failed to read gatts value, err 0x%04x" +msgstr "" + +#: ports/nrf/common-hal/bleio/UUID.c +#, c-format +msgid "Failed to register Vendor-Specific UUID, err 0x%04x" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to release mutex" +msgstr "" + +#: ports/nrf/common-hal/bleio/Characteristic.c ports/nrf/sd_mutex.c +#, c-format +msgid "Failed to release mutex, err 0x%04x" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to start advertising" +msgstr "" + +#: ports/nrf/common-hal/bleio/Broadcaster.c +#: ports/nrf/common-hal/bleio/Peripheral.c +#, c-format +msgid "Failed to start advertising, err 0x%04x" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to start scanning" +msgstr "" + +#: ports/nrf/common-hal/bleio/Scanner.c +#, c-format +msgid "Failed to start scanning, err 0x%04x" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to stop advertising" +msgstr "" + +#: ports/nrf/common-hal/bleio/Broadcaster.c +#: ports/nrf/common-hal/bleio/Peripheral.c +#, c-format +msgid "Failed to stop advertising, err 0x%04x" +msgstr "" + +#: ports/nrf/common-hal/bleio/Characteristic.c +#, c-format +msgid "Failed to write attribute value, err 0x%04x" +msgstr "" + +#: ports/nrf/common-hal/bleio/Characteristic.c +#, c-format +msgid "Failed to write gatts value, err 0x%04x" +msgstr "" + +#: py/moduerrno.c +msgid "File exists" +msgstr "" + +#: ports/nrf/supervisor/internal_flash.c +msgid "Flash erase failed" +msgstr "" + +#: ports/nrf/supervisor/internal_flash.c +#, c-format +msgid "Flash erase failed to start, err 0x%04x" +msgstr "" + +#: ports/nrf/supervisor/internal_flash.c +msgid "Flash write failed" +msgstr "" + +#: ports/nrf/supervisor/internal_flash.c +#, c-format +msgid "Flash write failed to start, err 0x%04x" +msgstr "" + +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +msgid "Frequency captured is above capability. Capture Paused." +msgstr "" + +#: shared-bindings/bitbangio/SPI.c shared-bindings/bitbangio/I2C.c +#: shared-bindings/busio/SPI.c shared-bindings/busio/I2C.c +msgid "Function requires lock" +msgstr "" + +#: ports/esp8266/common-hal/digitalio/DigitalInOut.c +msgid "GPIO16 does not support pull up." +msgstr "" + +#: shared-module/displayio/Group.c +msgid "Group full" +msgstr "" + +#: ports/unix/file.c extmod/vfs_posix_file.c py/objstringio.c +msgid "I/O operation on closed file" +msgstr "" + +#: extmod/machine_i2c.c +msgid "I2C operation not supported" +msgstr "" + +#: py/persistentcode.c +msgid "" +"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/" +"mpy-update for more info." +msgstr "" + +#: shared-bindings/_pew/PewPew.c +msgid "Incorrect buffer size" +msgstr "" + +#: py/moduerrno.c +msgid "Input/output error" +msgstr "" + +#: shared-module/displayio/OnDiskBitmap.c +msgid "Invalid BMP file" +msgstr "" + +#: ports/atmel-samd/common-hal/pulseio/PWMOut.c +#: ports/nrf/common-hal/pulseio/PWMOut.c shared-bindings/pulseio/PWMOut.c +msgid "Invalid PWM frequency" +msgstr "" + +#: py/moduerrno.c +msgid "Invalid argument" +msgstr "" + +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Invalid bit clock pin" +msgstr "" + +#: ports/nrf/common-hal/busio/UART.c +msgid "Invalid buffer size" +msgstr "" + +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +msgid "Invalid capture period. Valid range: 1 - 500" +msgstr "" + +#: shared-bindings/audioio/Mixer.c +msgid "Invalid channel count" +msgstr "" + +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Invalid clock pin" +msgstr "Avast! Clock pin be invalid" + +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Invalid data pin" +msgstr "" + +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Invalid direction." +msgstr "" + +#: shared-module/audioio/WaveFile.c +msgid "Invalid file" +msgstr "" + +#: shared-module/audioio/WaveFile.c +msgid "Invalid format chunk size" +msgstr "" + +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "Invalid number of bits" +msgstr "" + +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "Invalid phase" +msgstr "" + +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: ports/atmel-samd/common-hal/touchio/TouchIn.c +#: shared-bindings/pulseio/PWMOut.c +msgid "Invalid pin" +msgstr "" + +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Invalid pin for left channel" +msgstr "Belay that! Invalid pin for port-side channel" + +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Invalid pin for right channel" +msgstr "Belay that! Invalid pin for starboard-side channel" + +#: ports/atmel-samd/common-hal/i2cslave/I2CSlave.c +#: ports/atmel-samd/common-hal/busio/UART.c +#: ports/atmel-samd/common-hal/busio/SPI.c +#: ports/atmel-samd/common-hal/busio/I2C.c ports/nrf/common-hal/busio/I2C.c +msgid "Invalid pins" +msgstr "" + +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "Invalid polarity" +msgstr "" + +#: shared-bindings/microcontroller/__init__.c +msgid "Invalid run mode." +msgstr "" + +#: shared-bindings/audioio/Mixer.c +msgid "Invalid voice count" +msgstr "" + +#: shared-module/audioio/WaveFile.c +msgid "Invalid wave file" +msgstr "" + +#: py/compile.c +msgid "LHS of keyword arg must be an id" +msgstr "" + +#: shared-module/displayio/Group.c +msgid "Layer must be a Group or TileGrid subclass." +msgstr "" + +#: py/objslice.c +msgid "Length must be an int" +msgstr "" + +#: py/objslice.c +msgid "Length must be non-negative" +msgstr "" + +#: supervisor/shared/safe_mode.c +msgid "" +"Looks like our core CircuitPython code crashed hard. Whoops!\n" +"Please file an issue at https://github.com/adafruit/circuitpython/issues\n" +" with the contents of your CIRCUITPY drive and this message:\n" +msgstr "" + +#: shared-module/bitbangio/SPI.c +msgid "MISO pin init failed." +msgstr "" + +#: shared-module/bitbangio/SPI.c +msgid "MOSI pin init failed." +msgstr "" + +#: ports/esp8266/common-hal/pulseio/PWMOut.c +#, c-format +msgid "Maximum PWM frequency is %dhz." +msgstr "" + +#: shared-module/displayio/Shape.c +#, c-format +msgid "Maximum x value when mirrored is %d" +msgstr "" + +#: supervisor/shared/safe_mode.c +msgid "MicroPython NLR jump failed. Likely memory corruption.\n" +msgstr "" + +#: supervisor/shared/safe_mode.c +msgid "MicroPython fatal error.\n" +msgstr "" + +#: shared-bindings/audiobusio/PDMIn.c +msgid "Microphone startup delay must be in range 0.0 to 1.0" +msgstr "" + +#: ports/esp8266/common-hal/pulseio/PWMOut.c +msgid "Minimum PWM frequency is 1hz." +msgstr "" + +#: ports/esp8266/common-hal/pulseio/PWMOut.c +#, c-format +msgid "Multiple PWM frequencies not supported. PWM already set to %dhz." +msgstr "" + +#: shared-bindings/displayio/Display.c +msgid "Must be a Group subclass." +msgstr "" + +#: ports/atmel-samd/common-hal/analogio/AnalogOut.c +msgid "No DAC on chip" +msgstr "Shiver me timbers! There be no DAC on this chip" + +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "No DMA channel found" +msgstr "" + +#: ports/esp8266/common-hal/pulseio/PulseIn.c +msgid "No PulseIn support for %q" +msgstr "" + +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "No RX pin" +msgstr "" + +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "No TX pin" +msgstr "" + +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +msgid "No available clocks" +msgstr "" + +#: supervisor/shared/board_busses.c +msgid "No default I2C bus" +msgstr "" + +#: supervisor/shared/board_busses.c +msgid "No default SPI bus" +msgstr "" + +#: supervisor/shared/board_busses.c +msgid "No default UART bus" +msgstr "" + +#: ports/atmel-samd/common-hal/touchio/TouchIn.c +msgid "No free GCLKs" +msgstr "" + +#: shared-bindings/os/__init__.c +msgid "No hardware random available" +msgstr "" + +#: ports/esp8266/common-hal/analogio/AnalogOut.c +msgid "No hardware support for analog out." +msgstr "" + +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +msgid "No hardware support on pin" +msgstr "" + +#: py/moduerrno.c +msgid "No space left on device" +msgstr "" + +#: py/moduerrno.c +msgid "No such file/directory" +msgstr "" + +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "Not connected" +msgstr "" + +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "Not connected." +msgstr "" + +#: shared-bindings/audiobusio/I2SOut.c shared-bindings/audioio/AudioOut.c +msgid "Not playing" +msgstr "" + +#: shared-bindings/util.c +msgid "" +"Object has been deinitialized and can no longer be used. Create a new object." +msgstr "" + +#: ports/nrf/common-hal/busio/UART.c +msgid "Odd parity is not supported" +msgstr "" + +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Only 8 or 16 bit mono with " +msgstr "" + +#: shared-module/displayio/OnDiskBitmap.c +#, c-format +msgid "" +"Only Windows format, uncompressed BMP supported: given header size is %d" +msgstr "" + +#: shared-module/displayio/Bitmap.c +msgid "Only bit maps of 8 bit color or less are supported" +msgstr "" + +#: shared-module/displayio/OnDiskBitmap.c +#, c-format +msgid "" +"Only monochrome, indexed 8bpp, and 16bpp or greater BMPs supported: %d bpp " +"given" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "Only slices with step=1 (aka None) are supported" +msgstr "" + +#: ports/esp8266/common-hal/busio/UART.c +msgid "Only tx supported on UART1 (GPIO2)." +msgstr "" + +#: shared-bindings/audiobusio/PDMIn.c +msgid "Oversample must be multiple of 8." +msgstr "" + +#: shared-bindings/pulseio/PWMOut.c +msgid "" +"PWM duty_cycle must be between 0 and 65535 inclusive (16 bit resolution)" +msgstr "" + +#: shared-bindings/pulseio/PWMOut.c +msgid "" +"PWM frequency not writable when variable_frequency is False on construction." +msgstr "" + +#: ports/esp8266/common-hal/pulseio/PWMOut.c ports/esp8266/machine_pwm.c +#, c-format +msgid "PWM not supported on pin %d" +msgstr "" + +#: py/moduerrno.c +msgid "Permission denied" +msgstr "" + +#: ports/esp8266/common-hal/analogio/AnalogIn.c +msgid "Pin %q does not have ADC capabilities" +msgstr "" + +#: ports/atmel-samd/common-hal/analogio/AnalogIn.c +#: ports/nrf/common-hal/analogio/AnalogIn.c +msgid "Pin does not have ADC capabilities" +msgstr "Belay that! Th' Pin be not ADC capable" + +#: ports/esp8266/machine_pin.c +msgid "Pin(16) doesn't support pull" +msgstr "" + +#: ports/esp8266/common-hal/busio/SPI.c +msgid "Pins not valid for SPI" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "Pixel beyond bounds of buffer" +msgstr "" + +#: py/builtinhelp.c +msgid "Plus any modules on the filesystem\n" +msgstr "" + +#: main.c +msgid "Press any key to enter the REPL. Use CTRL-D to reload." +msgstr "" + +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Pull not used when direction is output." +msgstr "" + +#: shared-bindings/rtc/RTC.c +msgid "RTC calibration is not supported on this board" +msgstr "" + +#: shared-bindings/rtc/RTC.c shared-bindings/time/__init__.c +msgid "RTC is not supported on this board" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "Range out of bounds" +msgstr "" + +#: shared-bindings/pulseio/PulseIn.c +msgid "Read-only" +msgstr "" + +#: extmod/vfs_fat.c py/moduerrno.c +msgid "Read-only filesystem" +msgstr "" + +#: shared-module/displayio/Bitmap.c +msgid "Read-only object" +msgstr "" + +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Right channel unsupported" +msgstr "" + +#: shared-bindings/_pew/PewPew.c +msgid "Row entry must be digitalio.DigitalInOut" +msgstr "" + +#: main.c +msgid "Running in safe mode! Auto-reload is off.\n" +msgstr "Runnin' in safe mode! Auto-reload be off.\n" + +#: main.c +msgid "Running in safe mode! Not running saved code.\n" +msgstr "Runnin' in safe mode! Nay runnin' saved code.\n" + +#: ports/atmel-samd/common-hal/busio/I2C.c +msgid "SDA or SCL needs a pull up" +msgstr "" + +#: ports/esp8266/modnetwork.c +msgid "STA must be active" +msgstr "" + +#: ports/esp8266/modnetwork.c +msgid "STA required" +msgstr "" + +#: shared-bindings/audioio/Mixer.c +msgid "Sample rate must be positive" +msgstr "" + +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#, c-format +msgid "Sample rate too high. It must be less than %d" +msgstr "" + +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Serializer in use" +msgstr "" + +#: shared-bindings/nvm/ByteArray.c +msgid "Slice and value different lengths." +msgstr "" + +#: shared-bindings/displayio/Bitmap.c shared-bindings/displayio/TileGrid.c +#: shared-bindings/displayio/Group.c shared-bindings/pulseio/PulseIn.c +msgid "Slices not supported" +msgstr "" + +#: ports/nrf/common-hal/bleio/Adapter.c +#, c-format +msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX" +msgstr "" + +#: extmod/modure.c +msgid "Splitting with sub-captures" +msgstr "" + +#: shared-bindings/supervisor/__init__.c +msgid "Stack size must be at least 256" +msgstr "" + +#: shared-bindings/multiterminal/__init__.c +msgid "Stream missing readinto() or write() method." +msgstr "" + +#: supervisor/shared/safe_mode.c +msgid "" +"The CircuitPython heap was corrupted because the stack was too small.\n" +"Please increase stack size limits and press reset (after ejecting " +"CIRCUITPY).\n" +"If you didn't change the stack, then file an issue here with the contents of " +"your CIRCUITPY drive:\n" +msgstr "" + +#: supervisor/shared/safe_mode.c +msgid "" +"The microcontroller's power dipped. Please make sure your power supply " +"provides\n" +"enough power for the whole circuit and press reset (after ejecting " +"CIRCUITPY).\n" +msgstr "" + +#: supervisor/shared/safe_mode.c +msgid "" +"The reset button was pressed while booting CircuitPython. Press again to " +"exit safe mode.\n" +msgstr "" + +#: shared-module/audioio/Mixer.c +msgid "The sample's bits_per_sample does not match the mixer's" +msgstr "" + +#: shared-module/audioio/Mixer.c +msgid "The sample's channel count does not match the mixer's" +msgstr "" + +#: shared-module/audioio/Mixer.c +msgid "The sample's sample rate does not match the mixer's" +msgstr "" + +#: shared-module/audioio/Mixer.c +msgid "The sample's signedness does not match the mixer's" +msgstr "" + +#: shared-bindings/displayio/TileGrid.c +msgid "Tile height must exactly divide bitmap height" +msgstr "" + +#: shared-bindings/displayio/TileGrid.c +msgid "Tile indices must be 0 - 255" +msgstr "" + +#: shared-bindings/displayio/TileGrid.c +msgid "Tile width must exactly divide bitmap width" +msgstr "" + +#: supervisor/shared/safe_mode.c +msgid "To exit, please reset the board without " +msgstr "" + +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Too many channels in sample." +msgstr "" + +#: shared-bindings/displayio/FourWire.c shared-bindings/displayio/ParallelBus.c +msgid "Too many display busses" +msgstr "" + +#: shared-bindings/displayio/Display.c +msgid "Too many displays" +msgstr "" + +#: py/obj.c +msgid "Traceback (most recent call last):\n" +msgstr "" + +#: shared-bindings/time/__init__.c +msgid "Tuple or struct_time argument required" +msgstr "" + +#: ports/esp8266/machine_uart.c +#, c-format +msgid "UART(%d) does not exist" +msgstr "" + +#: ports/esp8266/machine_uart.c +msgid "UART(1) can't read" +msgstr "" + +#: shared-module/usb_hid/Device.c +msgid "USB Busy" +msgstr "" + +#: shared-module/usb_hid/Device.c +msgid "USB Error" +msgstr "" + +#: shared-bindings/bleio/UUID.c +msgid "UUID integer value not in range 0 to 0xffff" +msgstr "" + +#: shared-bindings/bleio/UUID.c +msgid "UUID string not 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'" +msgstr "" + +#: shared-bindings/bleio/UUID.c +msgid "UUID value is not str, int or byte buffer" +msgstr "" + +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Unable to allocate buffers for signed conversion" +msgstr "" + +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Unable to find free GCLK" +msgstr "Arr! No free GCLK be in sight" + +#: py/parse.c +msgid "Unable to init parser" +msgstr "" + +#: shared-module/displayio/OnDiskBitmap.c +msgid "Unable to read color palette data" +msgstr "" + +#: ports/esp8266/common-hal/storage/__init__.c +msgid "Unable to remount filesystem" +msgstr "" + +#: shared-bindings/nvm/ByteArray.c +msgid "Unable to write to nvm." +msgstr "" + +#: ports/nrf/common-hal/bleio/UUID.c +msgid "Unexpected nrfx uuid type" +msgstr "" + +#: ports/unix/modffi.c +msgid "Unknown type" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c +#, c-format +msgid "Unmatched number of items on RHS (expected %d, got %d)." +msgstr "" + +#: ports/atmel-samd/common-hal/busio/I2C.c +msgid "Unsupported baudrate" +msgstr "" + +#: shared-module/displayio/Display.c +msgid "Unsupported display bus type" +msgstr "" + +#: shared-module/audioio/WaveFile.c +msgid "Unsupported format" +msgstr "" + +#: py/moduerrno.c +msgid "Unsupported operation" +msgstr "" + +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Unsupported pull value." +msgstr "" + +#: ports/esp8266/common-hal/storage/__init__.c +msgid "Use esptool to erase flash and re-upload Python instead" +msgstr "" + +#: py/emitnative.c +msgid "Viper functions don't currently support more than 4 arguments" +msgstr "" + +#: shared-module/audioio/Mixer.c +msgid "Voice index too high" +msgstr "" + +#: main.c +msgid "WARNING: Your code filename has two extensions\n" +msgstr "Blimey! Yer code filename has two extensions\n" + +#: py/builtinhelp.c +#, c-format +msgid "" +"Welcome to Adafruit CircuitPython %s!\n" +"\n" +"Please visit learn.adafruit.com/category/circuitpython for project guides.\n" +"\n" +"To list built-in modules please do `help(\"modules\")`.\n" +msgstr "" + +#: supervisor/shared/safe_mode.c +msgid "" +"You are running in safe mode which means something unanticipated happened.\n" +msgstr "" + +#: supervisor/shared/safe_mode.c +msgid "You requested starting safe mode by " +msgstr "" + +#: ports/unix/modusocket.c +#, c-format +msgid "[addrinfo error %d]" +msgstr "" + +#: py/objtype.c +msgid "__init__() should return None" +msgstr "" + +#: py/objtype.c +#, c-format +msgid "__init__() should return None, not '%s'" +msgstr "" + +#: py/objobject.c +msgid "__new__ arg must be a user-type" +msgstr "" + +#: extmod/modubinascii.c extmod/moduhashlib.c +msgid "a bytes-like object is required" +msgstr "" + +#: lib/embed/abort_.c +msgid "abort() called" +msgstr "" + +#: ports/unix/modmachine.c extmod/machine_mem.c +#, c-format +msgid "address %08x is not aligned to %d bytes" +msgstr "" + +#: shared-bindings/i2cslave/I2CSlave.c +msgid "address out of bounds" +msgstr "" + +#: shared-bindings/i2cslave/I2CSlave.c +msgid "addresses is empty" +msgstr "" + +#: py/modbuiltins.c +msgid "arg is an empty sequence" +msgstr "" + +#: py/runtime.c +msgid "argument has wrong type" +msgstr "" + +#: py/argcheck.c +msgid "argument num/types mismatch" +msgstr "" + +#: py/runtime.c +msgid "argument should be a '%q' not a '%q'" +msgstr "" + +#: shared-bindings/nvm/ByteArray.c py/objarray.c +msgid "array/bytes required on right side" +msgstr "" + +#: py/objstr.c +msgid "attributes not supported yet" +msgstr "" + +#: ports/nrf/common-hal/bleio/Characteristic.c +msgid "bad GATT role" +msgstr "" + +#: py/builtinevex.c +msgid "bad compile mode" +msgstr "" + +#: py/objstr.c +msgid "bad conversion specifier" +msgstr "" + +#: py/objstr.c +msgid "bad format string" +msgstr "" + +#: py/binary.c +msgid "bad typecode" +msgstr "" + +#: py/emitnative.c +msgid "binary op %q not implemented" +msgstr "" + +#: shared-bindings/busio/UART.c +msgid "bits must be 7, 8 or 9" +msgstr "" + +#: extmod/machine_spi.c +msgid "bits must be 8" +msgstr "pieces must be of 8" + +#: shared-bindings/audioio/Mixer.c +msgid "bits_per_sample must be 8 or 16" +msgstr "" + +#: py/emitinlinethumb.c +msgid "branch not in range" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c +#, c-format +msgid "buf is too small. need %d bytes" +msgstr "" + +#: shared-bindings/audioio/RawSample.c +msgid "buffer must be a bytes-like object" +msgstr "" + +#: shared-module/struct/__init__.c +msgid "buffer size must match format" +msgstr "" + +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "buffer slices must be of equal length" +msgstr "" + +#: ports/esp8266/machine_rtc.c +msgid "buffer too long" +msgstr "" + +#: shared-bindings/struct/__init__.c shared-module/struct/__init__.c +#: py/modstruct.c +msgid "buffer too small" +msgstr "" + +#: extmod/machine_spi.c +msgid "buffers must be the same length" +msgstr "yer buffers must be of the same length" + +#: shared-bindings/_pew/PewPew.c +msgid "buttons must be digitalio.DigitalInOut" +msgstr "" + +#: py/vm.c +msgid "byte code not implemented" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c +#, c-format +msgid "byteorder is not an instance of ByteOrder (got a %s)" +msgstr "" + +#: ports/atmel-samd/common-hal/busio/UART.c +msgid "bytes > 8 bits not supported" +msgstr "" + +#: py/objstr.c +msgid "bytes value out of range" +msgstr "" + +#: ports/atmel-samd/bindings/samd/Clock.c +msgid "calibration is out of range" +msgstr "" + +#: ports/atmel-samd/bindings/samd/Clock.c +msgid "calibration is read only" +msgstr "" + +#: ports/atmel-samd/common-hal/rtc/RTC.c +msgid "calibration value out of range +/-127" +msgstr "" + +#: py/emitinlinethumb.c +msgid "can only have up to 4 parameters to Thumb assembly" +msgstr "" + +#: py/emitinlinextensa.c +msgid "can only have up to 4 parameters to Xtensa assembly" +msgstr "" + +#: py/persistentcode.c +msgid "can only save bytecode" +msgstr "" + +#: ports/esp8266/modnetwork.c +msgid "can query only one param" +msgstr "" + +#: py/objtype.c +msgid "can't add special method to already-subclassed class" +msgstr "" + +#: py/compile.c +msgid "can't assign to expression" +msgstr "" + +#: py/obj.c +#, c-format +msgid "can't convert %s to complex" +msgstr "" + +#: py/obj.c +#, c-format +msgid "can't convert %s to float" +msgstr "" + +#: py/obj.c +#, c-format +msgid "can't convert %s to int" +msgstr "" + +#: py/objstr.c +msgid "can't convert '%q' object to %q implicitly" +msgstr "" + +#: py/objint.c +msgid "can't convert NaN to int" +msgstr "" + +#: shared-bindings/i2cslave/I2CSlave.c +msgid "can't convert address to int" +msgstr "" + +#: py/objint.c +msgid "can't convert inf to int" +msgstr "" + +#: py/obj.c +msgid "can't convert to complex" +msgstr "" + +#: py/obj.c +msgid "can't convert to float" +msgstr "" + +#: py/obj.c +msgid "can't convert to int" +msgstr "" + +#: py/objstr.c +msgid "can't convert to str implicitly" +msgstr "" + +#: py/compile.c +msgid "can't declare nonlocal in outer code" +msgstr "" + +#: py/compile.c +msgid "can't delete expression" +msgstr "" + +#: py/emitnative.c +msgid "can't do binary op between '%q' and '%q'" +msgstr "" + +#: py/objcomplex.c +msgid "can't do truncated division of a complex number" +msgstr "" + +#: ports/esp8266/modnetwork.c +msgid "can't get AP config" +msgstr "" + +#: ports/esp8266/modnetwork.c +msgid "can't get STA config" +msgstr "" + +#: py/compile.c +msgid "can't have multiple **x" +msgstr "" + +#: py/compile.c +msgid "can't have multiple *x" +msgstr "" + +#: py/emitnative.c +msgid "can't implicitly convert '%q' to 'bool'" +msgstr "" + +#: py/emitnative.c +msgid "can't load from '%q'" +msgstr "" + +#: py/emitnative.c +msgid "can't load with '%q' index" +msgstr "" + +#: py/objgenerator.c +msgid "can't pend throw to just-started generator" +msgstr "" + +#: py/objgenerator.c +msgid "can't send non-None value to a just-started generator" +msgstr "" + +#: ports/esp8266/modnetwork.c +msgid "can't set AP config" +msgstr "" + +#: ports/esp8266/modnetwork.c +msgid "can't set STA config" +msgstr "" + +#: py/objnamedtuple.c +msgid "can't set attribute" +msgstr "" + +#: py/emitnative.c +msgid "can't store '%q'" +msgstr "" + +#: py/emitnative.c +msgid "can't store to '%q'" +msgstr "" + +#: py/emitnative.c +msgid "can't store with '%q' index" +msgstr "" + +#: py/objstr.c +msgid "" +"can't switch from automatic field numbering to manual field specification" +msgstr "" + +#: py/objstr.c +msgid "" +"can't switch from manual field specification to automatic field numbering" +msgstr "" + +#: py/objtype.c +msgid "cannot create '%q' instances" +msgstr "" + +#: py/objtype.c +msgid "cannot create instance" +msgstr "" + +#: py/runtime.c +msgid "cannot import name %q" +msgstr "" + +#: py/builtinimport.c +msgid "cannot perform relative import" +msgstr "" + +#: py/emitnative.c +msgid "casting" +msgstr "" + +#: shared-bindings/bleio/Service.c +msgid "characteristics includes an object that is not a Characteristic" +msgstr "" + +#: shared-bindings/_stage/Text.c +msgid "chars buffer too small" +msgstr "" + +#: py/modbuiltins.c +msgid "chr() arg not in range(0x110000)" +msgstr "" + +#: py/modbuiltins.c +msgid "chr() arg not in range(256)" +msgstr "" + +#: shared-bindings/displayio/Palette.c +msgid "color buffer must be 3 bytes (RGB) or 4 bytes (RGB + pad byte)" +msgstr "" + +#: shared-bindings/displayio/Palette.c +msgid "color buffer must be a buffer or int" +msgstr "" + +#: shared-bindings/displayio/Palette.c +msgid "color buffer must be a bytearray or array of type 'b' or 'B'" +msgstr "" + +#: shared-bindings/displayio/Palette.c +msgid "color must be between 0x000000 and 0xffffff" +msgstr "" + +#: shared-bindings/displayio/ColorConverter.c +msgid "color should be an int" +msgstr "" + +#: py/objcomplex.c +msgid "complex division by zero" +msgstr "" + +#: py/parsenum.c py/objfloat.c +msgid "complex values not supported" +msgstr "" + +#: extmod/moduzlib.c +msgid "compression header" +msgstr "" + +#: py/parse.c +msgid "constant must be an integer" +msgstr "" + +#: py/emitnative.c +msgid "conversion to object" +msgstr "" + +#: py/parsenum.c +msgid "decimal numbers not supported" +msgstr "" + +#: py/compile.c +msgid "default 'except' must be last" +msgstr "" + +#: shared-bindings/audiobusio/PDMIn.c +msgid "" +"destination buffer must be a bytearray or array of type 'B' for bit_depth = 8" +msgstr "" + +#: shared-bindings/audiobusio/PDMIn.c +msgid "destination buffer must be an array of type 'H' for bit_depth = 16" +msgstr "" + +#: shared-bindings/audiobusio/PDMIn.c +msgid "destination_length must be an int >= 0" +msgstr "" + +#: py/objdict.c +msgid "dict update sequence has wrong length" +msgstr "" + +#: shared-bindings/math/__init__.c py/runtime.c py/modmath.c py/objint_mpz.c +#: py/objint_longlong.c py/objfloat.c +msgid "division by zero" +msgstr "" + +#: ports/esp8266/modnetwork.c +msgid "either pos or kw args are allowed" +msgstr "" + +#: py/objdeque.c +msgid "empty" +msgstr "" + +#: extmod/modutimeq.c extmod/moduheapq.c +msgid "empty heap" +msgstr "" + +#: py/objstr.c +msgid "empty separator" +msgstr "" + +#: shared-bindings/random/__init__.c +msgid "empty sequence" +msgstr "" + +#: py/objstr.c +msgid "end of format while looking for conversion specifier" +msgstr "" + +#: shared-bindings/displayio/Shape.c +msgid "end_x should be an int" +msgstr "" + +#: ports/nrf/common-hal/busio/UART.c +#, c-format +msgid "error = 0x%08lX" +msgstr "" + +#: py/runtime.c +msgid "exceptions must derive from BaseException" +msgstr "" + +#: py/objstr.c +msgid "expected ':' after format specifier" +msgstr "" + +#: shared-bindings/gamepad/GamePad.c +msgid "expected a DigitalInOut" +msgstr "" + +#: py/obj.c +msgid "expected tuple/list" +msgstr "" + +#: py/modthread.c +msgid "expecting a dict for keyword args" +msgstr "" + +#: ports/esp8266/machine_pin.c +msgid "expecting a pin" +msgstr "" + +#: py/compile.c +msgid "expecting an assembler instruction" +msgstr "" + +#: py/compile.c +msgid "expecting just a value for set" +msgstr "" + +#: py/compile.c +msgid "expecting key:value for dict" +msgstr "" + +#: py/argcheck.c +msgid "extra keyword arguments given" +msgstr "" + +#: py/argcheck.c +msgid "extra positional arguments given" +msgstr "" + +#: ports/unix/modffi.c +msgid "ffi_prep_closure_loc" +msgstr "" + +#: shared-bindings/displayio/OnDiskBitmap.c shared-bindings/audioio/WaveFile.c +msgid "file must be a file opened in byte mode" +msgstr "" + +#: shared-bindings/storage/__init__.c +msgid "filesystem must provide mount method" +msgstr "" + +#: py/objtype.c +msgid "first argument to super() must be type" +msgstr "" + +#: extmod/machine_spi.c +msgid "firstbit must be MSB" +msgstr "" + +#: ports/esp8266/modesp.c +msgid "flash location must be below 1MByte" +msgstr "" + +#: py/objint.c +msgid "float too big" +msgstr "" + +#: shared-bindings/_stage/Text.c +msgid "font must be 2048 bytes long" +msgstr "" + +#: py/objstr.c +msgid "format requires a dict" +msgstr "" + +#: ports/esp8266/modmachine.c +msgid "frequency can only be either 80Mhz or 160MHz" +msgstr "" + +#: py/objdeque.c +msgid "full" +msgstr "" + +#: py/argcheck.c +msgid "function does not take keyword arguments" +msgstr "" + +#: py/argcheck.c +#, c-format +msgid "function expected at most %d arguments, got %d" +msgstr "" + +#: py/objnamedtuple.c py/bc.c +msgid "function got multiple values for argument '%q'" +msgstr "" + +#: py/argcheck.c +#, c-format +msgid "function missing %d required positional arguments" +msgstr "" + +#: py/bc.c +msgid "function missing keyword-only argument" +msgstr "" + +#: py/bc.c +msgid "function missing required keyword argument '%q'" +msgstr "" + +#: py/bc.c +#, c-format +msgid "function missing required positional argument #%d" +msgstr "" + +#: py/argcheck.c py/objnamedtuple.c py/bc.c +#, c-format +msgid "function takes %d positional arguments but %d were given" +msgstr "" + +#: shared-bindings/time/__init__.c +msgid "function takes exactly 9 arguments" +msgstr "" + +#: py/objgenerator.c +msgid "generator already executing" +msgstr "" + +#: py/objgenerator.c +msgid "generator ignored GeneratorExit" +msgstr "" + +#: shared-bindings/_stage/Layer.c +msgid "graphic must be 2048 bytes long" +msgstr "" + +#: extmod/moduheapq.c +msgid "heap must be a list" +msgstr "" + +#: py/compile.c +msgid "identifier redefined as global" +msgstr "" + +#: py/compile.c +msgid "identifier redefined as nonlocal" +msgstr "" + +#: ports/esp8266/machine_hspi.c +msgid "impossible baudrate" +msgstr "" + +#: py/objstr.c +msgid "incomplete format" +msgstr "" + +#: py/objstr.c +msgid "incomplete format key" +msgstr "" + +#: extmod/modubinascii.c +msgid "incorrect padding" +msgstr "" + +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +#: ports/nrf/common-hal/pulseio/PulseIn.c +#: ports/esp8266/common-hal/pulseio/PulseIn.c py/obj.c +msgid "index out of range" +msgstr "" + +#: py/obj.c +msgid "indices must be integers" +msgstr "" + +#: py/compile.c +msgid "inline assembler must be a function" +msgstr "" + +#: py/parsenum.c +msgid "int() arg 2 must be >= 2 and <= 36" +msgstr "" + +#: py/objstr.c +msgid "integer required" +msgstr "" + +#: ports/nrf/common-hal/bleio/Broadcaster.c +msgid "interval not in range 0.0020 to 10.24" +msgstr "" + +#: extmod/machine_i2c.c +msgid "invalid I2C peripheral" +msgstr "Belay that! I2C peripheral be invalid" + +#: extmod/machine_spi.c +msgid "invalid SPI peripheral" +msgstr "Arr! SPI peripheral be invalid" + +#: ports/esp8266/machine_rtc.c +msgid "invalid alarm" +msgstr "" + +#: lib/netutils/netutils.c +msgid "invalid arguments" +msgstr "" + +#: ports/esp8266/modnetwork.c +msgid "invalid buffer length" +msgstr "" + +#: extmod/modussl_axtls.c +msgid "invalid cert" +msgstr "" + +#: ports/esp8266/common-hal/busio/UART.c ports/esp8266/machine_uart.c +msgid "invalid data bits" +msgstr "" + +#: extmod/uos_dupterm.c +msgid "invalid dupterm index" +msgstr "" + +#: extmod/modframebuf.c +msgid "invalid format" +msgstr "" + +#: py/objstr.c +msgid "invalid format specifier" +msgstr "" + +#: extmod/modussl_axtls.c +msgid "invalid key" +msgstr "" + +#: py/compile.c +msgid "invalid micropython decorator" +msgstr "" + +#: ports/esp8266/machine_pin.c +msgid "invalid pin" +msgstr "" + +#: shared-bindings/random/__init__.c +msgid "invalid step" +msgstr "" + +#: ports/esp8266/common-hal/busio/UART.c ports/esp8266/machine_uart.c +msgid "invalid stop bits" +msgstr "" + +#: py/compile.c py/parse.c +msgid "invalid syntax" +msgstr "" + +#: py/parsenum.c +msgid "invalid syntax for integer" +msgstr "" + +#: py/parsenum.c +#, c-format +msgid "invalid syntax for integer with base %d" +msgstr "" + +#: py/parsenum.c +msgid "invalid syntax for number" +msgstr "" + +#: py/objtype.c +msgid "issubclass() arg 1 must be a class" +msgstr "" + +#: py/objtype.c +msgid "issubclass() arg 2 must be a class or a tuple of classes" +msgstr "" + +#: py/objstr.c +msgid "join expects a list of str/bytes objects consistent with self object" +msgstr "" + +#: py/argcheck.c +msgid "keyword argument(s) not yet implemented - use normal args instead" +msgstr "" + +#: py/bc.c +msgid "keywords must be strings" +msgstr "" + +#: py/emitinlinextensa.c py/emitinlinethumb.c +msgid "label '%q' not defined" +msgstr "" + +#: py/compile.c +msgid "label redefined" +msgstr "" + +#: ports/esp8266/modesp.c +msgid "len must be multiple of 4" +msgstr "" + +#: py/stream.c +msgid "length argument not allowed for this type" +msgstr "" + +#: py/objarray.c +msgid "lhs and rhs should be compatible" +msgstr "" + +#: py/emitnative.c +msgid "local '%q' has type '%q' but source is '%q'" +msgstr "" + +#: py/emitnative.c +msgid "local '%q' used before type known" +msgstr "" + +#: py/vm.c +msgid "local variable referenced before assignment" +msgstr "" + +#: py/objint.c +msgid "long int not supported in this build" +msgstr "" + +#: shared-bindings/_stage/Layer.c +msgid "map buffer too small" +msgstr "" + +#: shared-bindings/math/__init__.c py/modmath.c +msgid "math domain error" +msgstr "" + +#: py/runtime.c +msgid "maximum recursion depth exceeded" +msgstr "" + +#: py/runtime.c +#, c-format +msgid "memory allocation failed, allocating %u bytes" +msgstr "" + +#: ports/esp8266/modesp.c +#, c-format +msgid "memory allocation failed, allocating %u bytes for native code" +msgstr "" + +#: py/runtime.c +msgid "memory allocation failed, heap is locked" +msgstr "" + +#: py/builtinimport.c +msgid "module not found" +msgstr "" + +#: py/compile.c +msgid "multiple *x in assignment" +msgstr "" + +#: py/objtype.c +msgid "multiple bases have instance lay-out conflict" +msgstr "" + +#: py/objtype.c +msgid "multiple inheritance not supported" +msgstr "" + +#: py/emitnative.c +msgid "must raise an object" +msgstr "" + +#: extmod/machine_spi.c +msgid "must specify all of sck/mosi/miso" +msgstr "" + +#: py/modbuiltins.c +msgid "must use keyword argument for key function" +msgstr "" + +#: py/runtime.c +msgid "name '%q' is not defined" +msgstr "" + +#: shared-bindings/bleio/Peripheral.c +msgid "name must be a string" +msgstr "" + +#: py/runtime.c +msgid "name not defined" +msgstr "" + +#: py/compile.c +msgid "name reused for argument" +msgstr "" + +#: py/emitnative.c +msgid "native yield" +msgstr "" + +#: py/runtime.c +#, c-format +msgid "need more than %d values to unpack" +msgstr "" + +#: py/runtime.c py/objint_mpz.c py/objint_longlong.c +msgid "negative power with no float support" +msgstr "" + +#: py/runtime.c py/objint_mpz.c +msgid "negative shift count" +msgstr "" + +#: py/vm.c +msgid "no active exception to reraise" +msgstr "" + +#: shared-bindings/socket/__init__.c shared-module/network/__init__.c +msgid "no available NIC" +msgstr "" + +#: py/compile.c +msgid "no binding for nonlocal found" +msgstr "" + +#: py/builtinimport.c +msgid "no module named '%q'" +msgstr "" + +#: shared-bindings/_pixelbuf/__init__.c py/runtime.c +msgid "no such attribute" +msgstr "" + +#: py/compile.c +msgid "non-default argument follows default argument" +msgstr "" + +#: extmod/modubinascii.c +msgid "non-hex digit found" +msgstr "" + +#: py/compile.c +msgid "non-keyword arg after */**" +msgstr "" + +#: py/compile.c +msgid "non-keyword arg after keyword arg" +msgstr "" + +#: shared-bindings/bleio/UUID.c +msgid "not a 128-bit UUID" +msgstr "" + +#: ports/esp8266/machine_adc.c +#, c-format +msgid "not a valid ADC Channel: %d" +msgstr "" + +#: py/objstr.c +msgid "not all arguments converted during string formatting" +msgstr "" + +#: py/objstr.c +msgid "not enough arguments for format string" +msgstr "" + +#: py/obj.c +#, c-format +msgid "object '%s' is not a tuple or list" +msgstr "" + +#: py/obj.c +msgid "object does not support item assignment" +msgstr "" + +#: py/obj.c +msgid "object does not support item deletion" +msgstr "" + +#: py/obj.c +msgid "object has no len" +msgstr "" + +#: py/obj.c +msgid "object is not subscriptable" +msgstr "" + +#: py/runtime.c +msgid "object not an iterator" +msgstr "" + +#: py/objtype.c py/runtime.c +msgid "object not callable" +msgstr "" + +#: py/sequence.c +msgid "object not in sequence" +msgstr "" + +#: py/runtime.c +msgid "object not iterable" +msgstr "" + +#: py/obj.c +#, c-format +msgid "object of type '%s' has no len()" +msgstr "" + +#: py/obj.c +msgid "object with buffer protocol required" +msgstr "" + +#: extmod/modubinascii.c +msgid "odd-length string" +msgstr "" + +#: py/objstrunicode.c py/objstr.c +msgid "offset out of bounds" +msgstr "" + +#: shared-bindings/nvm/ByteArray.c py/objarray.c py/objtuple.c +#: py/objstrunicode.c py/objstr.c +msgid "only slices with step=1 (aka None) are supported" +msgstr "" + +#: py/modbuiltins.c +msgid "ord expects a character" +msgstr "" + +#: py/modbuiltins.c +#, c-format +msgid "ord() expected a character, but string of length %d found" +msgstr "" + +#: py/objint_mpz.c +msgid "overflow converting long int to machine word" +msgstr "" + +#: shared-bindings/_stage/Text.c shared-bindings/_stage/Layer.c +msgid "palette must be 32 bytes long" +msgstr "" + +#: shared-bindings/displayio/Palette.c +msgid "palette_index should be an int" +msgstr "" + +#: py/compile.c +msgid "parameter annotation must be an identifier" +msgstr "" + +#: py/emitinlinextensa.c +msgid "parameters must be registers in sequence a2 to a5" +msgstr "" + +#: py/emitinlinethumb.c +msgid "parameters must be registers in sequence r0 to r3" +msgstr "" + +#: ports/esp8266/machine_pin.c +msgid "pin does not have IRQ capabilities" +msgstr "" + +#: shared-bindings/displayio/Bitmap.c +msgid "pixel coordinates out of bounds" +msgstr "" + +#: shared-bindings/displayio/Bitmap.c +msgid "pixel value requires too many bits" +msgstr "" + +#: shared-bindings/displayio/TileGrid.c +msgid "pixel_shader must be displayio.Palette or displayio.ColorConverter" +msgstr "" + +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +#: ports/nrf/common-hal/pulseio/PulseIn.c +#: ports/esp8266/common-hal/pulseio/PulseIn.c +msgid "pop from an empty PulseIn" +msgstr "" + +#: py/objset.c +msgid "pop from an empty set" +msgstr "" + +#: py/objlist.c +msgid "pop from empty list" +msgstr "" + +#: py/objdict.c +msgid "popitem(): dictionary is empty" +msgstr "" + +#: py/objint_mpz.c +msgid "pow() 3rd argument cannot be 0" +msgstr "" + +#: py/objint_mpz.c +msgid "pow() with 3 arguments requires integers" +msgstr "" + +#: extmod/modutimeq.c +msgid "queue overflow" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "rawbuf is not the same size as buf" +msgstr "" + +#: shared-bindings/_pixelbuf/__init__.c +msgid "readonly attribute" +msgstr "" + +#: py/builtinimport.c +msgid "relative import" +msgstr "" + +#: py/obj.c +#, c-format +msgid "requested length %d but object has length %d" +msgstr "" + +#: py/compile.c +msgid "return annotation must be an identifier" +msgstr "" + +#: py/emitnative.c +msgid "return expected '%q' but got '%q'" +msgstr "" + +#: shared-module/displayio/Bitmap.c +msgid "row must be packed and word aligned" +msgstr "" + +#: py/objstr.c +msgid "rsplit(None,n)" +msgstr "" + +#: shared-bindings/audioio/RawSample.c +msgid "" +"sample_source buffer must be a bytearray or array of type 'h', 'H', 'b' or " +"'B'" +msgstr "" + +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "sampling rate out of range" +msgstr "" + +#: ports/esp8266/modnetwork.c +msgid "scan failed" +msgstr "" + +#: py/modmicropython.c +msgid "schedule stack full" +msgstr "" + +#: lib/utils/pyexec.c py/builtinimport.c +msgid "script compilation not supported" +msgstr "" + +#: shared-bindings/bleio/Peripheral.c +msgid "services includes an object that is not a Service" +msgstr "" + +#: py/objstr.c +msgid "sign not allowed in string format specifier" +msgstr "" + +#: py/objstr.c +msgid "sign not allowed with integer format specifier 'c'" +msgstr "" + +#: py/objstr.c +msgid "single '}' encountered in format string" +msgstr "" + +#: shared-bindings/time/__init__.c +msgid "sleep length must be non-negative" +msgstr "" + +#: py/objslice.c py/sequence.c +msgid "slice step cannot be zero" +msgstr "" + +#: py/sequence.c py/objint.c +msgid "small int overflow" +msgstr "" + +#: main.c +msgid "soft reboot\n" +msgstr "" + +#: py/objstr.c +msgid "start/end indices" +msgstr "" + +#: shared-bindings/displayio/Shape.c +msgid "start_x should be an int" +msgstr "" + +#: shared-bindings/random/__init__.c +msgid "step must be non-zero" +msgstr "" + +#: shared-bindings/busio/UART.c +msgid "stop must be 1 or 2" +msgstr "" + +#: shared-bindings/random/__init__.c +msgid "stop not reachable from start" +msgstr "" + +#: py/stream.c +msgid "stream operation not supported" +msgstr "" + +#: py/objstrunicode.c +msgid "string index out of range" +msgstr "" + +#: py/objstrunicode.c +#, c-format +msgid "string indices must be integers, not %s" +msgstr "" + +#: py/stream.c +msgid "string not supported; use bytes or bytearray" +msgstr "" + +#: extmod/moductypes.c +msgid "struct: cannot index" +msgstr "" + +#: extmod/moductypes.c +msgid "struct: index out of range" +msgstr "" + +#: extmod/moductypes.c +msgid "struct: no fields" +msgstr "" + +#: py/objstr.c +msgid "substring not found" +msgstr "" + +#: py/compile.c +msgid "super() can't find self" +msgstr "" + +#: extmod/modujson.c +msgid "syntax error in JSON" +msgstr "" + +#: extmod/moductypes.c +msgid "syntax error in uctypes descriptor" +msgstr "" + +#: shared-bindings/touchio/TouchIn.c +msgid "threshold must be in the range 0-65536" +msgstr "" + +#: shared-bindings/displayio/TileGrid.c +msgid "tile index out of bounds" +msgstr "" + +#: shared-bindings/time/__init__.c +msgid "time.struct_time() takes a 9-sequence" +msgstr "" + +#: shared-bindings/time/__init__.c +msgid "time.struct_time() takes exactly 1 argument" +msgstr "" + +#: shared-bindings/busio/UART.c +msgid "timeout >100 (units are now seconds, not msecs)" +msgstr "" + +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "timeout must be >= 0.0" +msgstr "" + +#: shared-bindings/time/__init__.c +msgid "timestamp out of range for platform time_t" +msgstr "" + +#: shared-bindings/gamepad/GamePad.c +msgid "too many arguments" +msgstr "" + +#: shared-module/struct/__init__.c +msgid "too many arguments provided with the given format" +msgstr "" + +#: py/runtime.c +#, c-format +msgid "too many values to unpack (expected %d)" +msgstr "" + +#: py/objstr.c +msgid "tuple index out of range" +msgstr "" + +#: py/obj.c +msgid "tuple/list has wrong length" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "tuple/list required on RHS" +msgstr "" + +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "tx and rx cannot both be None" +msgstr "" + +#: py/objtype.c +msgid "type '%q' is not an acceptable base type" +msgstr "" + +#: py/objtype.c +msgid "type is not an acceptable base type" +msgstr "" + +#: py/runtime.c +msgid "type object '%q' has no attribute '%q'" +msgstr "" + +#: py/objtype.c +msgid "type takes 1 or 3 arguments" +msgstr "" + +#: py/objint_longlong.c +msgid "ulonglong too large" +msgstr "" + +#: py/emitnative.c +msgid "unary op %q not implemented" +msgstr "" + +#: py/parse.c +msgid "unexpected indent" +msgstr "" + +#: py/bc.c +msgid "unexpected keyword argument" +msgstr "" + +#: py/objnamedtuple.c py/bc.c +msgid "unexpected keyword argument '%q'" +msgstr "" + +#: py/lexer.c +msgid "unicode name escapes" +msgstr "" + +#: py/parse.c +msgid "unindent does not match any outer indentation level" +msgstr "" + +#: ports/esp8266/modnetwork.c +msgid "unknown config param" +msgstr "" + +#: py/objstr.c +#, c-format +msgid "unknown conversion specifier %c" +msgstr "" + +#: py/objstr.c +#, c-format +msgid "unknown format code '%c' for object of type '%s'" +msgstr "" + +#: py/objstr.c +#, c-format +msgid "unknown format code '%c' for object of type 'float'" +msgstr "" + +#: py/objstr.c +#, c-format +msgid "unknown format code '%c' for object of type 'str'" +msgstr "" + +#: ports/esp8266/modnetwork.c +msgid "unknown status param" +msgstr "" + +#: py/compile.c +msgid "unknown type" +msgstr "" + +#: py/emitnative.c +msgid "unknown type '%q'" +msgstr "" + +#: py/objstr.c +msgid "unmatched '{' in format" +msgstr "" + +#: py/objtype.c py/runtime.c +msgid "unreadable attribute" +msgstr "" + +#: py/emitinlinethumb.c +#, c-format +msgid "unsupported Thumb instruction '%s' with %d arguments" +msgstr "" + +#: py/emitinlinextensa.c +#, c-format +msgid "unsupported Xtensa instruction '%s' with %d arguments" +msgstr "" + +#: shared-bindings/displayio/TileGrid.c +msgid "unsupported bitmap type" +msgstr "" + +#: py/objstr.c +#, c-format +msgid "unsupported format character '%c' (0x%x) at index %d" +msgstr "" + +#: py/runtime.c +msgid "unsupported type for %q: '%s'" +msgstr "" + +#: py/runtime.c +msgid "unsupported type for operator" +msgstr "" + +#: py/runtime.c +msgid "unsupported types for %q: '%s', '%s'" +msgstr "" + +#: shared-bindings/displayio/Bitmap.c +msgid "value_count must be > 0" +msgstr "" + +#: ports/esp8266/modnetwork.c +msgid "wifi_set_ip_info() failed" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "write_args must be a list, tuple, or None" +msgstr "" + +#: py/objstr.c +msgid "wrong number of arguments" +msgstr "" + +#: py/runtime.c +msgid "wrong number of values to unpack" +msgstr "" + +#: shared-module/displayio/Shape.c +msgid "x value out of bounds" +msgstr "" + +#: shared-bindings/displayio/Shape.c +msgid "y should be an int" +msgstr "" + +#: shared-module/displayio/Shape.c +msgid "y value out of bounds" +msgstr "" + +#: py/objrange.c +msgid "zero step" +msgstr "" + +#~ msgid "All event channels " +#~ msgstr "Avast! All th' event channels " + +#~ msgid "All timers " +#~ msgstr "Heave-to! All th' timers be used" + +#~ msgid "Clock unit " +#~ msgstr "Blimey! Clock unit " + +#~ msgid "DAC already " +#~ msgstr "Blimey! DAC already under sail" diff --git a/locale/es.po b/locale/es.po index afca3f6fe..9f71ac160 100644 --- a/locale/es.po +++ b/locale/es.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-12-26 20:49+0100\n" +"POT-Creation-Date: 2019-03-25 19:40+0100\n" "PO-Revision-Date: 2018-08-24 22:56-0500\n" "Last-Translator: \n" "Language-Team: \n" @@ -18,2627 +18,2912 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.1.1\n" -#: extmod/machine_i2c.c:299 -msgid "invalid I2C peripheral" -msgstr "periférico I2C inválido" +#: main.c +msgid "" +"\n" +"Code done running. Waiting for reload.\n" +msgstr "" -#: extmod/machine_i2c.c:340 extmod/machine_i2c.c:354 extmod/machine_i2c.c:368 -#: extmod/machine_i2c.c:392 -msgid "I2C operation not supported" -msgstr "operación I2C no soportada" +#: py/obj.c +msgid " File \"%q\"" +msgstr " Archivo \"%q\"" -#: extmod/machine_mem.c:45 ports/unix/modmachine.c:53 -#, c-format -msgid "address %08x is not aligned to %d bytes" -msgstr "la dirección %08x no esta alineada a %d bytes" +#: py/obj.c +msgid " File \"%q\", line %d" +msgstr " Archivo \"%q\", línea %d" -#: extmod/machine_spi.c:57 -msgid "invalid SPI peripheral" -msgstr "periférico SPI inválido" +#: main.c +msgid " output:\n" +msgstr " salida:\n" -#: extmod/machine_spi.c:124 -msgid "buffers must be the same length" -msgstr "los buffers deben de tener la misma longitud" +#: py/objstr.c +#, c-format +msgid "%%c requires int or char" +msgstr "%%c requiere int o char" -#: extmod/machine_spi.c:207 -msgid "bits must be 8" -msgstr "bits debe ser 8" +#: shared-bindings/microcontroller/Pin.c +msgid "%q in use" +msgstr "%q está siendo utilizado" -#: extmod/machine_spi.c:210 -msgid "firstbit must be MSB" -msgstr "firstbit debe ser MSB" +#: py/obj.c +msgid "%q index out of range" +msgstr "%w indice fuera de rango" -#: extmod/machine_spi.c:215 -msgid "must specify all of sck/mosi/miso" -msgstr "se deben de especificar sck/mosi/miso" +#: py/obj.c +msgid "%q indices must be integers, not %s" +msgstr "%q indices deben ser enteros, no %s" -#: extmod/modframebuf.c:299 -msgid "invalid format" -msgstr "formato inválido" +#: shared-bindings/displayio/Group.c shared-bindings/displayio/Shape.c +#: shared-bindings/bleio/CharacteristicBuffer.c +#, fuzzy +msgid "%q must be >= 1" +msgstr "los buffers deben de tener la misma longitud" -#: extmod/modubinascii.c:38 extmod/moduhashlib.c:102 -msgid "a bytes-like object is required" -msgstr "se requiere un objeto bytes-like" +#: shared-bindings/fontio/BuiltinFont.c +#, fuzzy +msgid "%q should be an int" +msgstr "y deberia ser un int" -#: extmod/modubinascii.c:90 -msgid "odd-length string" -msgstr "string de longitud impar" +#: py/objnamedtuple.c py/bc.c +msgid "%q() takes %d positional arguments but %d were given" +msgstr "%q() toma %d argumentos posicionales pero %d fueron dados" -#: extmod/modubinascii.c:101 -msgid "non-hex digit found" -msgstr "digito non-hex encontrado" +#: py/argcheck.c +msgid "'%q' argument required" +msgstr "argumento '%q' requerido" -#: extmod/modubinascii.c:169 -msgid "incorrect padding" -msgstr "relleno (padding) incorrecto" +#: py/emitinlinextensa.c py/emitinlinethumb.c +#, c-format +msgid "'%s' expects a label" +msgstr "'%s' espera una etiqueta" -#: extmod/moductypes.c:122 -msgid "syntax error in uctypes descriptor" -msgstr "error de sintaxis en el descriptor uctypes" +#: py/emitinlinextensa.c py/emitinlinethumb.c +#, c-format +msgid "'%s' expects a register" +msgstr "'%s' espera un registro" -#: extmod/moductypes.c:219 -msgid "Cannot unambiguously get sizeof scalar" -msgstr "No se puede obtener inequívocamente sizeof escalar" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects a special register" +msgstr "ord espera un carácter" -#: extmod/moductypes.c:397 -msgid "struct: no fields" -msgstr "struct: sin campos" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects an FPU register" +msgstr "'%s' espera un registro de FPU" -#: extmod/moductypes.c:530 -msgid "struct: cannot index" -msgstr "struct: no se puede indexar" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects an address of the form [a, b]" +msgstr "'%s' espera una dirección de forma [a, b]" -#: extmod/moductypes.c:544 -msgid "struct: index out of range" -msgstr "struct: index fuera de rango" +#: py/emitinlinextensa.c py/emitinlinethumb.c +#, c-format +msgid "'%s' expects an integer" +msgstr "'%s' espera un entero" -#: extmod/moduheapq.c:38 -msgid "heap must be a list" -msgstr "heap debe ser una lista" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects at most r%d" +msgstr "'%s' espera a lo sumo r%d" -#: extmod/moduheapq.c:86 extmod/modutimeq.c:147 extmod/modutimeq.c:172 -msgid "empty heap" -msgstr "heap vacío" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects {r0, r1, ...}" +msgstr "'%s' espera {r0, r1, ...}" -#: extmod/modujson.c:281 -msgid "syntax error in JSON" -msgstr "error de sintaxis en JSON" +#: py/emitinlinextensa.c +#, c-format +msgid "'%s' integer %d is not within range %d..%d" +msgstr "'%s' entero %d no esta dentro del rango %d..%d" -#: extmod/modure.c:161 -msgid "Splitting with sub-captures" -msgstr "Dividiendo con sub-capturas" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' integer 0x%x does not fit in mask 0x%x" +msgstr "'%s' entero 0x%x no cabe en la máscara 0x%x" -#: extmod/modure.c:207 -msgid "Error in regex" -msgstr "Error en regex" +#: py/obj.c +#, c-format +msgid "'%s' object does not support item assignment" +msgstr "el objeto '%s' no soporta la asignación de elementos" -#: extmod/modussl_axtls.c:81 -msgid "invalid key" -msgstr "llave inválida" +#: py/obj.c +#, c-format +msgid "'%s' object does not support item deletion" +msgstr "objeto '%s' no soporta la eliminación de elementos" -#: extmod/modussl_axtls.c:87 -msgid "invalid cert" -msgstr "certificado inválido" +#: py/runtime.c +msgid "'%s' object has no attribute '%q'" +msgstr "objeto '%s' no tiene atributo '%q'" -#: extmod/modutimeq.c:131 -msgid "queue overflow" -msgstr "desbordamiento de cola(queue)" +#: py/runtime.c +#, c-format +msgid "'%s' object is not an iterator" +msgstr "objeto '%s' no es un iterator" -#: extmod/moduzlib.c:98 -msgid "compression header" -msgstr "encabezado de compresión" +#: py/objtype.c py/runtime.c +#, c-format +msgid "'%s' object is not callable" +msgstr "objeto '%s' no puede ser llamado" -#: extmod/uos_dupterm.c:120 -msgid "invalid dupterm index" -msgstr "index dupterm inválido" +#: py/runtime.c +#, c-format +msgid "'%s' object is not iterable" +msgstr "objeto '%s' no es iterable" -#: extmod/vfs_fat.c:426 py/moduerrno.c:154 -msgid "Read-only filesystem" -msgstr "Sistema de archivos de solo-Lectura" +#: py/obj.c +#, c-format +msgid "'%s' object is not subscriptable" +msgstr "el objeto '%s' no es suscriptable" -#: extmod/vfs_posix_file.c:48 ports/unix/file.c:50 py/objstringio.c:43 -msgid "I/O operation on closed file" -msgstr "Operación I/O en archivo cerrado" +#: py/objstr.c +msgid "'=' alignment not allowed in string format specifier" +msgstr "'=' alineación no permitida en el especificador string format" -#: lib/embed/abort_.c:8 -msgid "abort() called" -msgstr "se llamó abort()" +#: shared-module/struct/__init__.c +msgid "'S' and 'O' are not supported format types" +msgstr "'S' y 'O' no son compatibles con los tipos de formato" -#: lib/netutils/netutils.c:83 -msgid "invalid arguments" -msgstr "argumentos inválidos" +#: py/compile.c +msgid "'align' requires 1 argument" +msgstr "'align' requiere 1 argumento" -#: lib/utils/pyexec.c:97 py/builtinimport.c:251 -msgid "script compilation not supported" -msgstr "script de compilación no soportado" +#: py/compile.c +msgid "'await' outside function" +msgstr "'await' fuera de la función" -#: main.c:150 -msgid " output:\n" -msgstr " salida:\n" +#: py/compile.c +msgid "'break' outside loop" +msgstr "'break' fuera de un bucle" -#: main.c:164 main.c:237 -msgid "" -"Auto-reload is on. Simply save files over USB to run them or enter REPL to " -"disable.\n" -msgstr "" -"Auto-reload habilitado. Simplemente guarda los archivos via USB para " -"ejecutarlos o entra al REPL para desabilitarlos.\n" +#: py/compile.c +msgid "'continue' outside loop" +msgstr "'continue' fuera de un bucle" -#: main.c:166 -msgid "Running in safe mode! Auto-reload is off.\n" -msgstr "Ejecutando en modo seguro! La auto-recarga esta deshabilitada.\n" +#: py/compile.c +msgid "'data' requires at least 2 arguments" +msgstr "'data' requiere como minomo 2 argumentos" -#: main.c:168 main.c:239 -msgid "Auto-reload is off.\n" -msgstr "Auto-recarga deshabilitada.\n" +#: py/compile.c +msgid "'data' requires integer arguments" +msgstr "'data' requiere argumentos de tipo entero" -#: main.c:182 -msgid "Running in safe mode! Not running saved code.\n" -msgstr "Ejecutando en modo seguro! No se esta ejecutando el código guardado.\n" +#: py/compile.c +msgid "'label' requires 1 argument" +msgstr "'label' requiere 1 argumento" -#: main.c:198 -msgid "WARNING: Your code filename has two extensions\n" -msgstr "ADVERTENCIA: El nombre de archivo de tu código tiene dos extensiones\n" +#: py/compile.c +msgid "'return' outside function" +msgstr "'return' fuera de una función" -#: main.c:244 -msgid "Press any key to enter the REPL. Use CTRL-D to reload." +#: py/compile.c +msgid "'yield' outside function" msgstr "" -"Presiona cualquier tecla para entrar al REPL. Usa CTRL-D para recargar." - -#: main.c:407 -msgid "soft reboot\n" -msgstr "reinicio suave\n" +"No es posible reiniciar en modo bootloader porque no hay bootloader presente." -#: ports/atmel-samd/audio_dma.c:209 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:361 -msgid "All sync event channels in use" -msgstr "" -"Todos los canales de eventos de sincronización(sync event channels) están " -"siendo utilizados" +#: py/compile.c +msgid "*x must be assignment target" +msgstr "*x debe ser objetivo de la tarea" -#: ports/atmel-samd/bindings/samd/Clock.c:135 -msgid "calibration is read only" -msgstr "calibration es de solo lectura" +#: py/obj.c +msgid ", in %q\n" +msgstr ", en %q\n" -#: ports/atmel-samd/bindings/samd/Clock.c:137 -msgid "calibration is out of range" -msgstr "calibration esta fuera de rango" +#: py/objcomplex.c +msgid "0.0 to a complex power" +msgstr "0.0 a una potencia compleja" -#: ports/atmel-samd/board_busses.c:59 ports/nrf/board_busses.c:39 -msgid "No default I2C bus" -msgstr "Sin bus I2C por defecto" +#: py/modbuiltins.c +msgid "3-arg pow() not supported" +msgstr "pow() con 3 argumentos no soportado" -#: ports/atmel-samd/board_busses.c:85 ports/nrf/board_busses.c:64 -msgid "No default SPI bus" -msgstr "Sin bus SPI por defecto" +#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c +msgid "A hardware interrupt channel is already in use" +msgstr "El canal EXTINT ya está siendo utilizado" -#: ports/atmel-samd/board_busses.c:112 ports/nrf/board_busses.c:91 -msgid "No default UART bus" -msgstr "Sin bus UART por defecto" +#: ports/esp8266/modnetwork.c +msgid "AP required" +msgstr "AP requerido" -#: ports/atmel-samd/common-hal/analogio/AnalogIn.c:63 -#: ports/nrf/common-hal/analogio/AnalogIn.c:39 -msgid "Pin does not have ADC capabilities" -msgstr "Pin no tiene capacidad ADC" +#: shared-bindings/bleio/Address.c +#, c-format +msgid "Address is not %d bytes long or is in wrong format" +msgstr "" -#: ports/atmel-samd/common-hal/analogio/AnalogOut.c:49 -msgid "No DAC on chip" -msgstr "El chip no tiene DAC" +#: shared-bindings/bleio/Address.c +#, fuzzy, c-format +msgid "Address must be %d bytes long" +msgstr "palette debe ser 32 bytes de largo" -#: ports/atmel-samd/common-hal/analogio/AnalogOut.c:56 -msgid "AnalogOut not supported on given pin" -msgstr "El pin proporcionado no soporta AnalogOut" +#: ports/nrf/common-hal/busio/I2C.c +msgid "All I2C peripherals are in use" +msgstr "Todos los timers están siendo usados" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:147 -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:150 -msgid "Invalid bit clock pin" -msgstr "Pin bit clock inválido" +#: ports/nrf/common-hal/busio/SPI.c +msgid "All SPI peripherals are in use" +msgstr "Todos los timers están siendo usados" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:153 -msgid "Bit clock and word select must share a clock unit" -msgstr "Bit clock y word select deben compartir una unidad de reloj" +#: ports/nrf/common-hal/busio/UART.c +#, fuzzy +msgid "All UART peripherals are in use" +msgstr "Todos los timers están siendo usados" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:156 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:130 -msgid "Invalid data pin" -msgstr "Pin de datos inválido" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "All event channels in use" +msgstr "Todos los canales de eventos en uso" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:169 -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:174 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:145 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:150 -msgid "Serializer in use" -msgstr "Serializer está siendo utilizado" +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c ports/atmel-samd/audio_dma.c +msgid "All sync event channels in use" +msgstr "" +"Todos los canales de eventos de sincronización(sync event channels) están " +"siendo utilizados" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:230 -msgid "Clock unit in use" -msgstr "Clock unit está siendo utilizado" +#: shared-bindings/pulseio/PWMOut.c +msgid "All timers for this pin are in use" +msgstr "Todos los timers para este pin están siendo utilizados" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:240 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:172 -msgid "Unable to find free GCLK" -msgstr "No se pudo encontrar un GCLK libre" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/pulseio/PulseOut.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c +#: shared-module/_pew/PewPew.c +msgid "All timers in use" +msgstr "Todos los timers en uso" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:254 -msgid "Too many channels in sample." -msgstr "Demasiados canales en sample." +#: ports/nrf/common-hal/analogio/AnalogOut.c +msgid "AnalogOut functionality not supported" +msgstr "Funcionalidad AnalogOut no soportada" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:305 -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:417 -msgid "No DMA channel found" -msgstr "No se encontró el canal DMA" +#: shared-bindings/analogio/AnalogOut.c +msgid "AnalogOut is only 16 bits. Value must be less than 65536." +msgstr "AnalogOut es solo de 16 bits. Value debe ser menos a 65536." -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:308 -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:419 -msgid "Unable to allocate buffers for signed conversion" -msgstr "No se pudieron asignar buffers para la conversión con signo" +#: ports/atmel-samd/common-hal/analogio/AnalogOut.c +msgid "AnalogOut not supported on given pin" +msgstr "El pin proporcionado no soporta AnalogOut" -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:109 -msgid "Invalid clock pin" -msgstr "Pin clock inválido" +#: ports/atmel-samd/common-hal/pulseio/PulseOut.c +msgid "Another send is already active" +msgstr "Otro envío ya está activo" -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:134 -msgid "Only 8 or 16 bit mono with " -msgstr "Solo mono de 8 o 16 bit con " +#: shared-bindings/pulseio/PulseOut.c +msgid "Array must contain halfwords (type 'H')" +msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:167 -msgid "sampling rate out of range" -msgstr "frecuencia de muestreo fuera de rango" +#: shared-bindings/nvm/ByteArray.c +msgid "Array values should be single bytes." +msgstr "Valores del array deben ser bytes individuales." -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:132 -msgid "DAC already in use" -msgstr "DAC ya está siendo utilizado" +#: supervisor/shared/safe_mode.c +msgid "Attempted heap allocation when MicroPython VM not running.\n" +msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:136 -msgid "Right channel unsupported" -msgstr "Canal derecho no soportado" +#: main.c +msgid "Auto-reload is off.\n" +msgstr "Auto-recarga deshabilitada.\n" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:139 -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:116 -#: ports/atmel-samd/common-hal/touchio/TouchIn.c:65 -msgid "Invalid pin" -msgstr "Pin inválido" +#: main.c +msgid "" +"Auto-reload is on. Simply save files over USB to run them or enter REPL to " +"disable.\n" +msgstr "" +"Auto-reload habilitado. Simplemente guarda los archivos via USB para " +"ejecutarlos o entra al REPL para desabilitarlos.\n" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:147 -msgid "Invalid pin for left channel" -msgstr "Pin inválido para canal izquierdo" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Bit clock and word select must share a clock unit" +msgstr "Bit clock y word select deben compartir una unidad de reloj" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:151 -msgid "Invalid pin for right channel" -msgstr "Pin inválido para canal derecho" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Bit depth must be multiple of 8." +msgstr "La profundidad de bits debe ser múltiplo de 8." -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:154 -msgid "Cannot output both channels on the same pin" -msgstr "No se puede tener ambos canales en el mismo pin" +#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c +msgid "Both pins must support hardware interrupts" +msgstr "Ambos pines deben soportar interrupciones por hardware" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:243 -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:189 -#: ports/atmel-samd/common-hal/pulseio/PulseOut.c:110 -#: ports/nrf/common-hal/pulseio/PulseOut.c:107 -msgid "All timers in use" -msgstr "Todos los timers en uso" +#: shared-bindings/supervisor/__init__.c +msgid "Brightness must be between 0 and 255" +msgstr "Brightness debe estar entro 0 y 255" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:285 -msgid "All event channels in use" -msgstr "Todos los canales de eventos en uso" +#: shared-bindings/displayio/Display.c +msgid "Brightness not adjustable" +msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:375 +#: shared-module/usb_hid/Device.c #, c-format -msgid "Sample rate too high. It must be less than %d" -msgstr "Frecuencia de muestreo demasiado alta. Debe ser menor a %d" +msgid "Buffer incorrect size. Should be %d bytes." +msgstr "Tamaño de buffer incorrecto. Debe ser de %d bytes." -#: ports/atmel-samd/common-hal/busio/I2C.c:71 -msgid "Not enough pins available" -msgstr "No hay suficientes pines disponibles" +#: shared-bindings/bitbangio/I2C.c shared-bindings/busio/I2C.c +msgid "Buffer must be at least length 1" +msgstr "Buffer debe ser de longitud 1 como minimo" -#: ports/atmel-samd/common-hal/busio/I2C.c:78 -#: ports/atmel-samd/common-hal/busio/SPI.c:171 -#: ports/atmel-samd/common-hal/busio/UART.c:120 -#: ports/atmel-samd/common-hal/i2cslave/I2CSlave.c:45 -#: ports/nrf/common-hal/busio/I2C.c:82 -msgid "Invalid pins" -msgstr "pines inválidos" +#: ports/atmel-samd/common-hal/displayio/ParallelBus.c +#: ports/nrf/common-hal/displayio/ParallelBus.c +#, fuzzy, c-format +msgid "Bus pin %d is already in use" +msgstr "DAC ya está siendo utilizado" -#: ports/atmel-samd/common-hal/busio/I2C.c:101 -msgid "SDA or SCL needs a pull up" -msgstr "SDA o SCL necesitan una pull up" +#: shared-bindings/bleio/UUID.c +#, fuzzy +msgid "Byte buffer must be 16 bytes." +msgstr "buffer debe de ser un objeto bytes-like" -#: ports/atmel-samd/common-hal/busio/I2C.c:121 -msgid "Unsupported baudrate" -msgstr "Baudrate no soportado" +#: shared-bindings/nvm/ByteArray.c +msgid "Bytes must be between 0 and 255." +msgstr "Bytes debe estar entre 0 y 255." -#: ports/atmel-samd/common-hal/busio/UART.c:67 -msgid "bytes > 8 bits not supported" -msgstr "bytes > 8 bits no soportados" +#: ports/esp8266/esp_mphal.c +msgid "C-level assert" +msgstr "" -#: ports/atmel-samd/common-hal/busio/UART.c:73 -#: ports/nrf/common-hal/busio/UART.c:106 -msgid "tx and rx cannot both be None" -msgstr "Ambos tx y rx no pueden ser None" +#: shared-bindings/_pixelbuf/PixelBuf.c +#, c-format +msgid "Can not use dotstar with %s" +msgstr "" -#: ports/atmel-samd/common-hal/busio/UART.c:146 -#: ports/nrf/common-hal/busio/UART.c:140 -msgid "Failed to allocate RX buffer" -msgstr "Ha fallado la asignación del buffer RX" +#: shared-bindings/bleio/Device.c +msgid "Can't add services in Central mode" +msgstr "No se pueden agregar servicio en modo Central" -#: ports/atmel-samd/common-hal/busio/UART.c:154 -msgid "Could not initialize UART" -msgstr "No se puede inicializar la UART" +#: shared-bindings/bleio/Device.c +msgid "Can't advertise in Central mode" +msgstr "" -#: ports/atmel-samd/common-hal/busio/UART.c:241 -#: ports/nrf/common-hal/busio/UART.c:185 -msgid "No RX pin" -msgstr "Sin pin RX" +#: shared-bindings/bleio/Device.c +msgid "Can't change the name in Central mode" +msgstr "No se puede cambiar el nombre en modo Central" -#: ports/atmel-samd/common-hal/busio/UART.c:300 -#: ports/nrf/common-hal/busio/UART.c:220 -msgid "No TX pin" -msgstr "Sin pin TX" +#: shared-bindings/bleio/Device.c +msgid "Can't connect in Peripheral mode" +msgstr "No se puede conectar en modo Peripheral" -#: ports/atmel-samd/common-hal/digitalio/DigitalInOut.c:170 -#: ports/nrf/common-hal/digitalio/DigitalInOut.c:147 -msgid "Cannot get pull while in output mode" -msgstr "No puede ser pull mientras este en modo de salida" +#: ports/esp8266/modnetwork.c +msgid "Cannot connect to AP" +msgstr "No se puede conectar a AP" -#: ports/atmel-samd/common-hal/microcontroller/__init__.c:74 -#: ports/esp8266/common-hal/microcontroller/__init__.c:64 -msgid "Cannot reset into bootloader because no bootloader is present." -msgstr "No se puede reiniciar a bootloader porque no hay bootloader presente." +#: shared-bindings/displayio/Bitmap.c shared-bindings/pulseio/PulseIn.c +msgid "Cannot delete values" +msgstr "No se puede eliminar valores" -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:120 -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:369 -#: ports/nrf/common-hal/pulseio/PWMOut.c:119 -#: ports/nrf/common-hal/pulseio/PWMOut.c:233 -msgid "Invalid PWM frequency" -msgstr "Frecuencia PWM inválida" +#: ports/esp8266/modnetwork.c +msgid "Cannot disconnect from AP" +msgstr "No se puede desconectar de AP" -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:187 -msgid "All timers for this pin are in use" -msgstr "Todos los timers para este pin están siendo utilizados" +#: ports/atmel-samd/common-hal/digitalio/DigitalInOut.c +#: ports/nrf/common-hal/digitalio/DigitalInOut.c +msgid "Cannot get pull while in output mode" +msgstr "No puede ser pull mientras este en modo de salida" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:110 -msgid "No hardware support on pin" -msgstr "Sin soporte de hardware en pin" +#: ports/nrf/common-hal/microcontroller/Processor.c +#, fuzzy +msgid "Cannot get temperature" +msgstr "No se puede obtener la temperatura. status: 0x%02x" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:113 -msgid "EXTINT channel already in use" -msgstr "El canal EXTINT ya está siendo utilizado" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Cannot output both channels on the same pin" +msgstr "No se puede tener ambos canales en el mismo pin" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:118 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:86 -#, c-format -msgid "Failed to allocate RX buffer of %d bytes" -msgstr "Falló la asignación del buffer RX de %d bytes" +#: shared-module/bitbangio/SPI.c +msgid "Cannot read without MISO pin." +msgstr "No se puede leer sin pin MISO." -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:205 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:151 -msgid "pop from an empty PulseIn" -msgstr "pop de un PulseIn vacío" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Cannot record to a file" +msgstr "No se puede grabar en un archivo" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:237 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:422 -msgid "index out of range" -msgstr "index fuera de rango" +#: shared-module/storage/__init__.c +msgid "Cannot remount '/' when USB is active." +msgstr "No se puede volver a montar '/' cuando el USB esta activo." -#: ports/atmel-samd/common-hal/pulseio/PulseOut.c:178 -msgid "Another send is already active" -msgstr "Otro envío ya está activo" +#: ports/atmel-samd/common-hal/microcontroller/__init__.c +#: ports/esp8266/common-hal/microcontroller/__init__.c +msgid "Cannot reset into bootloader because no bootloader is present." +msgstr "No se puede reiniciar a bootloader porque no hay bootloader presente." -#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c:38 -msgid "Both pins must support hardware interrupts" -msgstr "Ambos pines deben soportar interrupciones por hardware" +#: ports/esp8266/modnetwork.c +msgid "Cannot set STA config" +msgstr "No se puede establecer STA config" -#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c:46 -msgid "A hardware interrupt channel is already in use" -msgstr "El canal EXTINT ya está siendo utilizado" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Cannot set value when direction is input." +msgstr "No se puede asignar un valor cuando la dirección es input." -#: ports/atmel-samd/common-hal/rtc/RTC.c:101 -msgid "calibration value out of range +/-127" -msgstr "Valor de calibración fuera del rango +/-127" +#: py/objslice.c +msgid "Cannot subclass slice" +msgstr "" -#: ports/atmel-samd/common-hal/touchio/TouchIn.c:75 -msgid "No free GCLKs" -msgstr "Sin GCLKs libres" +#: shared-module/bitbangio/SPI.c +msgid "Cannot transfer without MOSI and MISO pins." +msgstr "No se puede transferir sin pines MOSI y MISO." -#: ports/esp8266/common-hal/analogio/AnalogIn.c:43 -msgid "Pin %q does not have ADC capabilities" -msgstr "Pin %q no tiene capacidades de ADC" +#: extmod/moductypes.c +msgid "Cannot unambiguously get sizeof scalar" +msgstr "No se puede obtener inequívocamente sizeof escalar" -#: ports/esp8266/common-hal/analogio/AnalogOut.c:39 -msgid "No hardware support for analog out." -msgstr "Sin soporte de hardware para analog out" +#: ports/esp8266/modnetwork.c +msgid "Cannot update i/f status" +msgstr "No se puede actualizar i/f status" -#: ports/esp8266/common-hal/busio/SPI.c:72 -msgid "Pins not valid for SPI" -msgstr "Pines no válidos para SPI" +#: shared-module/bitbangio/SPI.c +msgid "Cannot write without MOSI pin." +msgstr "No se puede escribir sin pin MOSI." -#: ports/esp8266/common-hal/busio/UART.c:45 -msgid "Only tx supported on UART1 (GPIO2)." -msgstr "Solo tx soportada en UART1 (GPIO2)" +#: shared-bindings/bleio/Service.c +msgid "Characteristic UUID doesn't match Service UUID" +msgstr "" -#: ports/esp8266/common-hal/busio/UART.c:67 ports/esp8266/machine_uart.c:108 -msgid "invalid data bits" -msgstr "data bits inválidos" +#: ports/nrf/common-hal/bleio/Service.c +msgid "Characteristic already in use by another Service." +msgstr "" -#: ports/esp8266/common-hal/busio/UART.c:91 ports/esp8266/machine_uart.c:144 -msgid "invalid stop bits" -msgstr "stop bits inválidos" +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "CharacteristicBuffer writing not provided" +msgstr "" -#: ports/esp8266/common-hal/digitalio/DigitalInOut.c:200 -msgid "ESP8266 does not support pull down." -msgstr "ESP8266 no soporta pull down." +#: shared-module/bitbangio/SPI.c +msgid "Clock pin init failed." +msgstr "Clock pin init fallido" -#: ports/esp8266/common-hal/digitalio/DigitalInOut.c:210 -msgid "GPIO16 does not support pull up." -msgstr "GPIO16 no soporta pull up." +#: shared-module/bitbangio/I2C.c +msgid "Clock stretch too long" +msgstr "" -#: ports/esp8266/common-hal/microcontroller/__init__.c:66 -msgid "ESP8226 does not support safe mode." -msgstr "ESP8226 no soporta modo seguro." +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Clock unit in use" +msgstr "Clock unit está siendo utilizado" -#: ports/esp8266/common-hal/pulseio/PWMOut.c:54 -#: ports/esp8266/common-hal/pulseio/PWMOut.c:113 -#, c-format -msgid "Maximum PWM frequency is %dhz." -msgstr "La frecuencia máxima del PWM es %dhz." +#: shared-bindings/_pew/PewPew.c +msgid "Column entry must be digitalio.DigitalInOut" +msgstr "" -#: ports/esp8266/common-hal/pulseio/PWMOut.c:57 -#: ports/esp8266/common-hal/pulseio/PWMOut.c:116 -msgid "Minimum PWM frequency is 1hz." -msgstr "La frecuencia mínima del PWM es 1hz" +#: shared-bindings/displayio/FourWire.c shared-bindings/displayio/ParallelBus.c +#, fuzzy +msgid "Command must be an int between 0 and 255" +msgstr "Bytes debe estar entre 0 y 255." -#: ports/esp8266/common-hal/pulseio/PWMOut.c:68 +#: ports/nrf/common-hal/bleio/UUID.c #, c-format -msgid "Multiple PWM frequencies not supported. PWM already set to %dhz." +msgid "Could not decode ble_uuid, err 0x%04x" msgstr "" -"PWM de múltiples frecuencias no soportado. El PWM ya se estableció a %dhz" - -#: ports/esp8266/common-hal/pulseio/PWMOut.c:77 ports/esp8266/machine_pwm.c:70 -#, c-format -msgid "PWM not supported on pin %d" -msgstr "El pin %d no soporta PWM" -#: ports/esp8266/common-hal/pulseio/PulseIn.c:78 -msgid "No PulseIn support for %q" -msgstr "Sin soporte PulseIn para %q" +#: ports/atmel-samd/common-hal/busio/UART.c +msgid "Could not initialize UART" +msgstr "No se puede inicializar la UART" -#: ports/esp8266/common-hal/storage/__init__.c:34 -msgid "Unable to remount filesystem" -msgstr "Incapaz de montar de nuevo el sistema de archivos" +#: shared-module/audioio/Mixer.c shared-module/audioio/WaveFile.c +msgid "Couldn't allocate first buffer" +msgstr "No se pudo asignar el primer buffer" -#: ports/esp8266/common-hal/storage/__init__.c:38 -msgid "Use esptool to erase flash and re-upload Python instead" -msgstr "Usa esptool para borrar la flash y vuelve a cargar Python en su lugar" +#: shared-module/audioio/Mixer.c shared-module/audioio/WaveFile.c +msgid "Couldn't allocate second buffer" +msgstr "No se pudo asignar el segundo buffer" -#: ports/esp8266/esp_mphal.c:154 -msgid "C-level assert" -msgstr "C-level assert" +#: supervisor/shared/safe_mode.c +msgid "Crash into the HardFault_Handler.\n" +msgstr "" -#: ports/esp8266/machine_adc.c:57 -#, c-format -msgid "not a valid ADC Channel: %d" -msgstr "no es un canal ADC válido: %d" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "DAC already in use" +msgstr "DAC ya está siendo utilizado" -#: ports/esp8266/machine_hspi.c:131 ports/esp8266/machine_hspi.c:137 -msgid "impossible baudrate" -msgstr "baudrate imposible" +#: ports/atmel-samd/common-hal/displayio/ParallelBus.c +#: ports/nrf/common-hal/displayio/ParallelBus.c +#, fuzzy +msgid "Data 0 pin must be byte aligned" +msgstr "graphic debe ser 2048 bytes de largo" -#: ports/esp8266/machine_pin.c:129 -msgid "expecting a pin" -msgstr "esperando un pin" +#: shared-module/audioio/WaveFile.c +msgid "Data chunk must follow fmt chunk" +msgstr "" -#: ports/esp8266/machine_pin.c:284 -msgid "Pin(16) doesn't support pull" -msgstr "Pin(16) no soporta para pull" +#: ports/nrf/common-hal/bleio/Broadcaster.c +#: ports/nrf/common-hal/bleio/Peripheral.c +#, fuzzy +msgid "Data too large for advertisement packet" +msgstr "Los datos no caben en el paquete de anuncio." -#: ports/esp8266/machine_pin.c:323 -msgid "invalid pin" -msgstr "pin inválido" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Data too large for the advertisement packet" +msgstr "Los datos no caben en el paquete de anuncio." -#: ports/esp8266/machine_pin.c:389 -msgid "pin does not have IRQ capabilities" -msgstr "pin sin capacidades IRQ" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Destination capacity is smaller than destination_length." +msgstr "Capacidad de destino es mas pequeña que destination_length." -#: ports/esp8266/machine_rtc.c:185 -msgid "buffer too long" -msgstr "buffer demasiado largo" +#: shared-bindings/displayio/Display.c +msgid "Display rotation must be in 90 degree increments" +msgstr "" -#: ports/esp8266/machine_rtc.c:209 ports/esp8266/machine_rtc.c:223 -#: ports/esp8266/machine_rtc.c:246 -msgid "invalid alarm" -msgstr "alarma inválida" +#: ports/unix/modffi.c +msgid "Don't know how to pass object to native function" +msgstr "No se sabe cómo pasar objeto a función nativa" -#: ports/esp8266/machine_uart.c:169 -#, c-format -msgid "UART(%d) does not exist" -msgstr "UART(%d) no existe" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Drive mode not used when direction is input." +msgstr "Modo Drive no se usa cuando la dirección es input." -#: ports/esp8266/machine_uart.c:219 -msgid "UART(1) can't read" -msgstr "UART(1) no puede leer" +#: ports/esp8266/common-hal/microcontroller/__init__.c +msgid "ESP8226 does not support safe mode." +msgstr "ESP8226 no soporta modo seguro." -#: ports/esp8266/modesp.c:119 -msgid "len must be multiple of 4" -msgstr "len debe de ser múltiple de 4" +#: ports/esp8266/common-hal/digitalio/DigitalInOut.c +msgid "ESP8266 does not support pull down." +msgstr "ESP8266 no soporta pull down." -#: ports/esp8266/modesp.c:274 -#, c-format -msgid "memory allocation failed, allocating %u bytes for native code" -msgstr "falló la asignación de memoria, asignando %u bytes para código nativo" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +msgid "EXTINT channel already in use" +msgstr "El canal EXTINT ya está siendo utilizado" -#: ports/esp8266/modesp.c:317 -msgid "flash location must be below 1MByte" -msgstr "la ubicación de la flash debe estar debajo de 1MByte" +#: ports/unix/modffi.c +msgid "Error in ffi_prep_cif" +msgstr "Error en ffi_prep_cif" -#: ports/esp8266/modmachine.c:63 -msgid "frequency can only be either 80Mhz or 160MHz" -msgstr "la frecuencia solo puede ser 80MHz o 160MHz" +#: extmod/modure.c +msgid "Error in regex" +msgstr "Error en regex" -#: ports/esp8266/modnetwork.c:61 -msgid "AP required" -msgstr "AP requerido" +#: shared-bindings/pulseio/PulseOut.c shared-bindings/neopixel_write/__init__.c +#: shared-bindings/terminalio/Terminal.c shared-bindings/microcontroller/Pin.c +msgid "Expected a %q" +msgstr "Se espera un %q" -#: ports/esp8266/modnetwork.c:61 -msgid "STA required" -msgstr "STA requerido" +#: shared-bindings/bleio/CharacteristicBuffer.c +#, fuzzy +msgid "Expected a Characteristic" +msgstr "No se puede agregar la Característica." -#: ports/esp8266/modnetwork.c:87 -msgid "Cannot update i/f status" -msgstr "No se puede actualizar i/f status" +#: shared-bindings/bleio/Descriptor.c shared-bindings/bleio/Service.c +#: shared-bindings/bleio/Characteristic.c +#, fuzzy +msgid "Expected a UUID" +msgstr "Se espera un %q" -#: ports/esp8266/modnetwork.c:142 -msgid "Cannot set STA config" -msgstr "No se puede establecer STA config" +#: shared-module/_pixelbuf/PixelBuf.c +#, c-format +msgid "Expected tuple of length %d, got %d" +msgstr "" -#: ports/esp8266/modnetwork.c:144 -msgid "Cannot connect to AP" -msgstr "No se puede conectar a AP" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to acquire mutex" +msgstr "No se puede adquirir el mutex, status: 0x%08lX" -#: ports/esp8266/modnetwork.c:152 -msgid "Cannot disconnect from AP" -msgstr "No se puede desconectar de AP" +#: ports/nrf/common-hal/bleio/Characteristic.c ports/nrf/sd_mutex.c +#, fuzzy, c-format +msgid "Failed to acquire mutex, err 0x%04x" +msgstr "No se puede adquirir el mutex, status: 0x%08lX" -#: ports/esp8266/modnetwork.c:173 -msgid "unknown status param" -msgstr "status param desconocido" +#: ports/nrf/common-hal/bleio/Service.c +#, fuzzy, c-format +msgid "Failed to add characteristic, err 0x%04x" +msgstr "No se puede añadir caracteristica, status: 0x%08lX" -#: ports/esp8266/modnetwork.c:222 -msgid "STA must be active" -msgstr "STA debe estar activo" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to add service" +msgstr "No se puede detener el anuncio. status: 0x%02x" -#: ports/esp8266/modnetwork.c:239 -msgid "scan failed" -msgstr "scan ha fallado" +#: ports/nrf/common-hal/bleio/Peripheral.c +#, fuzzy, c-format +msgid "Failed to add service, err 0x%04x" +msgstr "No se puede detener el anuncio. status: 0x%02x" -#: ports/esp8266/modnetwork.c:306 -msgid "wifi_set_ip_info() failed" -msgstr "wifi_set_ip_info() ha fallado" +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "Failed to allocate RX buffer" +msgstr "Ha fallado la asignación del buffer RX" -#: ports/esp8266/modnetwork.c:319 -msgid "either pos or kw args are allowed" -msgstr "ya sea pos o kw args son permitidos" +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +#: ports/nrf/common-hal/pulseio/PulseIn.c +#: ports/esp8266/common-hal/pulseio/PulseIn.c +#, c-format +msgid "Failed to allocate RX buffer of %d bytes" +msgstr "Falló la asignación del buffer RX de %d bytes" -#: ports/esp8266/modnetwork.c:329 -msgid "can't get STA config" -msgstr "no se puede obtener STA config" +#: ports/nrf/common-hal/bleio/Adapter.c +#, fuzzy +msgid "Failed to change softdevice state" +msgstr "No se puede cambiar el estado del softdevice, error: 0x%08lX" -#: ports/esp8266/modnetwork.c:331 -msgid "can't get AP config" -msgstr "no se puede obtener AP config" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to connect:" +msgstr "No se puede conectar. status: 0x%02x" -#: ports/esp8266/modnetwork.c:346 -msgid "invalid buffer length" -msgstr "longitud de buffer inválida" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to continue scanning" +msgstr "No se puede iniciar el escaneo. status: 0x%02x" -#: ports/esp8266/modnetwork.c:405 -msgid "can't set STA config" -msgstr "no se puede establecer STA config" +#: ports/nrf/common-hal/bleio/Scanner.c +#, fuzzy, c-format +msgid "Failed to continue scanning, err 0x%04x" +msgstr "No se puede iniciar el escaneo. status: 0x%02x" -#: ports/esp8266/modnetwork.c:407 -msgid "can't set AP config" -msgstr "no se puede establecer AP config" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to create mutex" +msgstr "No se puede leer el valor del atributo. status 0x%02x" -#: ports/esp8266/modnetwork.c:416 -msgid "can query only one param" -msgstr "puede consultar solo un param" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to discover services" +msgstr "No se puede descubrir servicios, status: 0x%08lX" -#: ports/esp8266/modnetwork.c:469 -msgid "unknown config param" -msgstr "parámetro config desconocido" +#: ports/nrf/common-hal/bleio/Adapter.c +#, fuzzy +msgid "Failed to get local address" +msgstr "No se puede obtener la dirección local, error: 0x%08lX" -#: ports/nrf/common-hal/analogio/AnalogOut.c:37 -msgid "AnalogOut functionality not supported" -msgstr "Funcionalidad AnalogOut no soportada" +#: ports/nrf/common-hal/bleio/Adapter.c +#, fuzzy +msgid "Failed to get softdevice state" +msgstr "No se puede obtener el estado del softdevice, error: 0x%08lX" -#: ports/nrf/common-hal/bleio/Adapter.c:41 +#: ports/nrf/common-hal/bleio/Characteristic.c #, c-format -msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX" +msgid "Failed to notify or indicate attribute value, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Adapter.c:125 -#, c-format -msgid "Failed to change softdevice state, error: 0x%08lX" -msgstr "No se puede cambiar el estado del softdevice, error: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Adapter.c:135 -#, c-format -msgid "Failed to get softdevice state, error: 0x%08lX" -msgstr "No se puede obtener el estado del softdevice, error: 0x%08lX" +#: ports/nrf/common-hal/bleio/Characteristic.c +#, fuzzy, c-format +msgid "Failed to read CCCD value, err 0x%04x" +msgstr "No se puede leer el valor del atributo. status 0x%02x" -#: ports/nrf/common-hal/bleio/Adapter.c:155 +#: ports/nrf/common-hal/bleio/Characteristic.c #, c-format -msgid "Failed to get local address, error: 0x%08lX" -msgstr "No se puede obtener la dirección local, error: 0x%08lX" +msgid "Failed to read attribute value, err 0x%04x" +msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:52 +#: ports/nrf/common-hal/bleio/Characteristic.c #, fuzzy, c-format -msgid "Failed to write gatts value, status: 0x%08lX" +msgid "Failed to read gatts value, err 0x%04x" msgstr "No se puede escribir el valor del atributo. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Characteristic.c:76 -#, fuzzy, c-format -msgid "Failed to notify attribute value, status: 0x%08lX" -msgstr "No se puede notificar el valor del anuncio. status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Characteristic.c:91 +#: ports/nrf/common-hal/bleio/UUID.c #, fuzzy, c-format -msgid "Failed to read attribute value, status: 0x%08lX" -msgstr "No se puede leer el valor del atributo. status 0x%02x" +msgid "Failed to register Vendor-Specific UUID, err 0x%04x" +msgstr "No se puede agregar el Vendor Specific 128-bit UUID." -#: ports/nrf/common-hal/bleio/Characteristic.c:119 -#: ports/nrf/common-hal/bleio/Device.c:272 -#: ports/nrf/common-hal/bleio/Device.c:307 -#, c-format -msgid "Failed to acquire mutex, status: 0x%08lX" -msgstr "No se puede adquirir el mutex, status: 0x%08lX" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to release mutex" +msgstr "No se puede liberar el mutex, status: 0x%08lX" -#: ports/nrf/common-hal/bleio/Characteristic.c:126 +#: ports/nrf/common-hal/bleio/Characteristic.c ports/nrf/sd_mutex.c #, fuzzy, c-format -msgid "Failed to write attribute value, status: 0x%08lX" -msgstr "No se puede escribir el valor del atributo. status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Characteristic.c:138 -#: ports/nrf/common-hal/bleio/Device.c:284 -#: ports/nrf/common-hal/bleio/Device.c:319 -#: ports/nrf/common-hal/bleio/Device.c:354 -#: ports/nrf/common-hal/bleio/Device.c:391 -#, c-format -msgid "Failed to release mutex, status: 0x%08lX" +msgid "Failed to release mutex, err 0x%04x" msgstr "No se puede liberar el mutex, status: 0x%08lX" -#: ports/nrf/common-hal/bleio/Device.c:81 -#: ports/nrf/common-hal/bleio/Device.c:114 +#: ports/nrf/common-hal/bleio/Device.c #, fuzzy -msgid "Can not fit data into the advertisment packet" -msgstr "Los datos no caben en el paquete de anuncio." - -#: ports/nrf/common-hal/bleio/Device.c:266 -#, c-format -msgid "Failed to discover serivices, status: 0x%08lX" -msgstr "No se puede descubrir servicios, status: 0x%08lX" +msgid "Failed to start advertising" +msgstr "No se puede inicar el anuncio. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Device.c:403 -#: ports/nrf/common-hal/bleio/Scanner.c:76 +#: ports/nrf/common-hal/bleio/Broadcaster.c +#: ports/nrf/common-hal/bleio/Peripheral.c #, fuzzy, c-format -msgid "Failed to continue scanning, status: 0x%0xlX" +msgid "Failed to start advertising, err 0x%04x" +msgstr "No se puede inicar el anuncio. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to start scanning" msgstr "No se puede iniciar el escaneo. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Device.c:436 +#: ports/nrf/common-hal/bleio/Scanner.c #, fuzzy, c-format -msgid "Failed to connect, status: 0x%08lX" -msgstr "No se puede conectar. status: 0x%02x" +msgid "Failed to start scanning, err 0x%04x" +msgstr "No se puede iniciar el escaneo. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Device.c:513 -#, fuzzy, c-format -msgid "Failed to add service, status: 0x%08lX" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to stop advertising" msgstr "No se puede detener el anuncio. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Device.c:531 -#, fuzzy, c-format -msgid "Failed to start advertisment, status: 0x%08lX" -msgstr "No se puede inicar el anuncio. status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Device.c:549 +#: ports/nrf/common-hal/bleio/Broadcaster.c +#: ports/nrf/common-hal/bleio/Peripheral.c #, fuzzy, c-format -msgid "Failed to stop advertisment, status: 0x%08lX" +msgid "Failed to stop advertising, err 0x%04x" msgstr "No se puede detener el anuncio. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Device.c:575 -#: ports/nrf/common-hal/bleio/Scanner.c:103 +#: ports/nrf/common-hal/bleio/Characteristic.c #, fuzzy, c-format -msgid "Failed to start scanning, status: 0x%0xlX" -msgstr "No se puede iniciar el escaneo. status: 0x%02x" +msgid "Failed to write attribute value, err 0x%04x" +msgstr "No se puede escribir el valor del atributo. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Device.c:592 +#: ports/nrf/common-hal/bleio/Characteristic.c #, fuzzy, c-format -msgid "Failed to create mutex, status: 0x%0xlX" -msgstr "No se puede leer el valor del atributo. status 0x%02x" +msgid "Failed to write gatts value, err 0x%04x" +msgstr "No se puede escribir el valor del atributo. status: 0x%02x" + +#: py/moduerrno.c +msgid "File exists" +msgstr "El archivo ya existe" -#: ports/nrf/common-hal/bleio/Service.c:83 +#: ports/nrf/supervisor/internal_flash.c +msgid "Flash erase failed" +msgstr "" + +#: ports/nrf/supervisor/internal_flash.c #, c-format -msgid "Failed to add characteristic, status: 0x%08lX" -msgstr "No se puede añadir caracteristica, status: 0x%08lX" +msgid "Flash erase failed to start, err 0x%04x" +msgstr "" -#: ports/nrf/common-hal/bleio/UUID.c:97 -#, fuzzy, c-format -msgid "Failed to add Vendor Specific UUID, status: 0x%08lX" -msgstr "No se puede agregar el Vendor Specific 128-bit UUID." +#: ports/nrf/supervisor/internal_flash.c +msgid "Flash write failed" +msgstr "" -#: ports/nrf/common-hal/bleio/UUID.c:102 -msgid "Invalid UUID string length" -msgstr "Longitud de string UUID inválida" +#: ports/nrf/supervisor/internal_flash.c +#, c-format +msgid "Flash write failed to start, err 0x%04x" +msgstr "" -#: ports/nrf/common-hal/bleio/UUID.c:109 -#: shared-bindings/bleio/Characteristic.c:125 -#: shared-bindings/bleio/Service.c:105 -msgid "Invalid UUID parameter" -msgstr "Parámetro UUID inválido" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +msgid "Frequency captured is above capability. Capture Paused." +msgstr "" -#: ports/nrf/common-hal/busio/I2C.c:96 -msgid "All I2C peripherals are in use" -msgstr "Todos los timers están siendo usados" +#: shared-bindings/bitbangio/SPI.c shared-bindings/bitbangio/I2C.c +#: shared-bindings/busio/SPI.c shared-bindings/busio/I2C.c +msgid "Function requires lock" +msgstr "La función requiere lock" -#: ports/nrf/common-hal/busio/SPI.c:133 -msgid "All SPI peripherals are in use" -msgstr "Todos los timers están siendo usados" +#: ports/esp8266/common-hal/digitalio/DigitalInOut.c +msgid "GPIO16 does not support pull up." +msgstr "GPIO16 no soporta pull up." -#: ports/nrf/common-hal/busio/UART.c:49 -#, c-format -msgid "error = 0x%08lX" -msgstr "error = 0x%08lx" +#: shared-module/displayio/Group.c +msgid "Group full" +msgstr "Group lleno" + +#: ports/unix/file.c extmod/vfs_posix_file.c py/objstringio.c +msgid "I/O operation on closed file" +msgstr "Operación I/O en archivo cerrado" + +#: extmod/machine_i2c.c +msgid "I2C operation not supported" +msgstr "operación I2C no soportada" + +#: py/persistentcode.c +msgid "" +"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/" +"mpy-update for more info." +msgstr "" +"Archivo .mpy incompatible. Actualice todos los archivos .mpy. Consulte " +"http://adafru.it/mpy-update para más información" + +#: shared-bindings/_pew/PewPew.c +msgid "Incorrect buffer size" +msgstr "" + +#: py/moduerrno.c +msgid "Input/output error" +msgstr "error Input/output" + +#: shared-module/displayio/OnDiskBitmap.c +msgid "Invalid BMP file" +msgstr "Archivo BMP inválido" -#: ports/nrf/common-hal/busio/UART.c:110 +#: ports/atmel-samd/common-hal/pulseio/PWMOut.c +#: ports/nrf/common-hal/pulseio/PWMOut.c shared-bindings/pulseio/PWMOut.c +msgid "Invalid PWM frequency" +msgstr "Frecuencia PWM inválida" + +#: py/moduerrno.c +msgid "Invalid argument" +msgstr "Argumento inválido" + +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Invalid bit clock pin" +msgstr "Pin bit clock inválido" + +#: ports/nrf/common-hal/busio/UART.c msgid "Invalid buffer size" msgstr "Tamaño de buffer inválido" -#: ports/nrf/common-hal/busio/UART.c:114 -msgid "Odd parity is not supported" -msgstr "Paridad impar no soportada" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +msgid "Invalid capture period. Valid range: 1 - 500" +msgstr "" -#: ports/nrf/common-hal/busio/UART.c:346 ports/nrf/common-hal/busio/UART.c:350 -#: ports/nrf/common-hal/busio/UART.c:355 ports/nrf/common-hal/busio/UART.c:360 -#: ports/nrf/common-hal/busio/UART.c:366 ports/nrf/common-hal/busio/UART.c:371 -#: ports/nrf/common-hal/busio/UART.c:376 ports/nrf/common-hal/busio/UART.c:380 -#: ports/nrf/common-hal/busio/UART.c:388 -msgid "busio.UART not available" -msgstr "busio.UART no disponible" +#: shared-bindings/audioio/Mixer.c +msgid "Invalid channel count" +msgstr "Cuenta de canales inválida" -#: ports/nrf/common-hal/microcontroller/Processor.c:49 -#, c-format -msgid "Can not get temperature. status: 0x%02x" -msgstr "No se puede obtener la temperatura. status: 0x%02x" +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Invalid clock pin" +msgstr "Pin clock inválido" -#: ports/nrf/common-hal/pulseio/PWMOut.c:161 -msgid "All PWM peripherals are in use" -msgstr "Todos los periféricos PWM en uso" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Invalid data pin" +msgstr "Pin de datos inválido" -#: ports/unix/modffi.c:138 -msgid "Unknown type" -msgstr "Tipo desconocido" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Invalid direction." +msgstr "Dirección inválida." -#: ports/unix/modffi.c:207 ports/unix/modffi.c:265 -msgid "Error in ffi_prep_cif" -msgstr "Error en ffi_prep_cif" +#: shared-module/audioio/WaveFile.c +msgid "Invalid file" +msgstr "Archivo inválido" -#: ports/unix/modffi.c:270 -msgid "ffi_prep_closure_loc" -msgstr "ffi_prep_closure_loc" +#: shared-module/audioio/WaveFile.c +msgid "Invalid format chunk size" +msgstr "" -#: ports/unix/modffi.c:413 -msgid "Don't know how to pass object to native function" -msgstr "No se sabe cómo pasar objeto a función nativa" +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "Invalid number of bits" +msgstr "Numero inválido de bits" -#: ports/unix/modusocket.c:474 -#, c-format -msgid "[addrinfo error %d]" -msgstr "[addrinfo error %d]" +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "Invalid phase" +msgstr "Fase inválida" -#: py/argcheck.c:44 -msgid "function does not take keyword arguments" -msgstr "la función no tiene argumentos por palabra clave" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: ports/atmel-samd/common-hal/touchio/TouchIn.c +#: shared-bindings/pulseio/PWMOut.c +msgid "Invalid pin" +msgstr "Pin inválido" -#: py/argcheck.c:54 py/bc.c:85 py/objnamedtuple.c:104 -#, c-format -msgid "function takes %d positional arguments but %d were given" -msgstr "la función toma %d argumentos posicionales pero le fueron dados %d" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Invalid pin for left channel" +msgstr "Pin inválido para canal izquierdo" -#: py/argcheck.c:64 -#, c-format -msgid "function missing %d required positional arguments" -msgstr "a la función le hacen falta %d argumentos posicionales requeridos" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Invalid pin for right channel" +msgstr "Pin inválido para canal derecho" -#: py/argcheck.c:72 -#, c-format -msgid "function expected at most %d arguments, got %d" -msgstr "la función esperaba minimo %d argumentos, tiene %d" +#: ports/atmel-samd/common-hal/i2cslave/I2CSlave.c +#: ports/atmel-samd/common-hal/busio/UART.c +#: ports/atmel-samd/common-hal/busio/SPI.c +#: ports/atmel-samd/common-hal/busio/I2C.c ports/nrf/common-hal/busio/I2C.c +msgid "Invalid pins" +msgstr "pines inválidos" -#: py/argcheck.c:97 -msgid "'%q' argument required" -msgstr "argumento '%q' requerido" +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "Invalid polarity" +msgstr "Polaridad inválida" -#: py/argcheck.c:122 -msgid "extra positional arguments given" -msgstr "argumento posicional adicional dado" +#: shared-bindings/microcontroller/__init__.c +msgid "Invalid run mode." +msgstr "Modo de ejecución inválido." -#: py/argcheck.c:130 -msgid "extra keyword arguments given" -msgstr "argumento(s) por palabra clave adicionales fueron dados" +#: shared-bindings/audioio/Mixer.c +msgid "Invalid voice count" +msgstr "Cuenta de voces inválida" -#: py/argcheck.c:142 -msgid "argument num/types mismatch" -msgstr "argumento número/tipos no coinciden" +#: shared-module/audioio/WaveFile.c +msgid "Invalid wave file" +msgstr "Archivo wave inválido" -#: py/argcheck.c:147 -msgid "keyword argument(s) not yet implemented - use normal args instead" +#: py/compile.c +msgid "LHS of keyword arg must be an id" +msgstr "LHS del agumento por palabra clave deberia ser un identificador" + +#: shared-module/displayio/Group.c +msgid "Layer must be a Group or TileGrid subclass." msgstr "" -"argumento(s) por palabra clave aún no implementados - usa argumentos " -"normales en su lugar" -#: py/bc.c:88 py/objnamedtuple.c:108 -msgid "%q() takes %d positional arguments but %d were given" -msgstr "%q() toma %d argumentos posicionales pero %d fueron dados" +#: py/objslice.c +msgid "Length must be an int" +msgstr "Length debe ser un int" -#: py/bc.c:197 py/bc.c:215 -msgid "unexpected keyword argument" -msgstr "argumento por palabra clave inesperado" +#: py/objslice.c +msgid "Length must be non-negative" +msgstr "Longitud no deberia ser negativa" -#: py/bc.c:199 -msgid "keywords must be strings" -msgstr "palabras clave deben ser strings" +#: supervisor/shared/safe_mode.c +msgid "" +"Looks like our core CircuitPython code crashed hard. Whoops!\n" +"Please file an issue at https://github.com/adafruit/circuitpython/issues\n" +" with the contents of your CIRCUITPY drive and this message:\n" +msgstr "" +"Parece que nuestro código de CircuitPython ha fallado con fuerza. Whoops!\n" +"Por favor, crea un issue en https://github.com/adafruit/circuitpython/" +"issues\n" +" con el contenido de su unidad CIRCUITPY y este mensaje:\n" -#: py/bc.c:206 py/objnamedtuple.c:138 -msgid "function got multiple values for argument '%q'" -msgstr "la función tiene múltiples valores para el argumento '%q'" +#: shared-module/bitbangio/SPI.c +msgid "MISO pin init failed." +msgstr "MISO pin init fallido." -#: py/bc.c:218 py/objnamedtuple.c:130 -msgid "unexpected keyword argument '%q'" -msgstr "argumento por palabra clave inesperado '%q'" +#: shared-module/bitbangio/SPI.c +msgid "MOSI pin init failed." +msgstr "MOSI pin init fallido." -#: py/bc.c:244 +#: ports/esp8266/common-hal/pulseio/PWMOut.c #, c-format -msgid "function missing required positional argument #%d" -msgstr "la función requiere del argumento posicional #%d" +msgid "Maximum PWM frequency is %dhz." +msgstr "La frecuencia máxima del PWM es %dhz." -#: py/bc.c:260 -msgid "function missing required keyword argument '%q'" -msgstr "la función requiere del argumento por palabra clave '%q'" +#: shared-module/displayio/Shape.c +#, c-format +msgid "Maximum x value when mirrored is %d" +msgstr "" -#: py/bc.c:269 -msgid "function missing keyword-only argument" -msgstr "falta palabra clave para función" +#: supervisor/shared/safe_mode.c +msgid "MicroPython NLR jump failed. Likely memory corruption.\n" +msgstr "" -#: py/binary.c:112 -msgid "bad typecode" -msgstr "typecode erroneo" +#: supervisor/shared/safe_mode.c +msgid "MicroPython fatal error.\n" +msgstr "" -#: py/builtinevex.c:99 -msgid "bad compile mode" -msgstr "modo de compilación erroneo" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Microphone startup delay must be in range 0.0 to 1.0" +msgstr "" -#: py/builtinhelp.c:137 -#, fuzzy -msgid "Plus any modules on the filesystem\n" -msgstr "Incapaz de montar de nuevo el sistema de archivos" +#: ports/esp8266/common-hal/pulseio/PWMOut.c +msgid "Minimum PWM frequency is 1hz." +msgstr "La frecuencia mínima del PWM es 1hz" -#: py/builtinhelp.c:183 +#: ports/esp8266/common-hal/pulseio/PWMOut.c #, c-format -msgid "" -"Welcome to Adafruit CircuitPython %s!\n" -"\n" -"Please visit learn.adafruit.com/category/circuitpython for project guides.\n" -"\n" -"To list built-in modules please do `help(\"modules\")`.\n" +msgid "Multiple PWM frequencies not supported. PWM already set to %dhz." msgstr "" -"Bienvenido a Adafruit CircuitPython %s!\n" -"\n" -"Visita learn.adafruit.com/category/circuitpython para obtener guías de " -"proyectos.\n" -"\n" -"Para listar los módulos incorporados por favor haga `help(\"modules\")`.\n" +"PWM de múltiples frecuencias no soportado. El PWM ya se estableció a %dhz" -#: py/builtinimport.c:336 -msgid "cannot perform relative import" -msgstr "no se puedo realizar importación relativa" +#: shared-bindings/displayio/Display.c +msgid "Must be a Group subclass." +msgstr "" -#: py/builtinimport.c:420 py/builtinimport.c:532 -msgid "module not found" -msgstr "módulo no encontrado" +#: ports/atmel-samd/common-hal/analogio/AnalogOut.c +msgid "No DAC on chip" +msgstr "El chip no tiene DAC" -#: py/builtinimport.c:423 py/builtinimport.c:535 -msgid "no module named '%q'" -msgstr "ningún módulo se llama '%q'" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "No DMA channel found" +msgstr "No se encontró el canal DMA" -#: py/builtinimport.c:510 -msgid "relative import" -msgstr "import relativo" +#: ports/esp8266/common-hal/pulseio/PulseIn.c +msgid "No PulseIn support for %q" +msgstr "Sin soporte PulseIn para %q" -#: py/compile.c:397 py/compile.c:542 -msgid "can't assign to expression" -msgstr "no se puede asignar a la expresión" +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "No RX pin" +msgstr "Sin pin RX" -#: py/compile.c:416 -msgid "multiple *x in assignment" -msgstr "múltiples *x en la asignación" +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "No TX pin" +msgstr "Sin pin TX" -#: py/compile.c:642 -msgid "non-default argument follows default argument" -msgstr "argumento no predeterminado sigue argumento predeterminado" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +msgid "No available clocks" +msgstr "" -#: py/compile.c:771 py/compile.c:789 -msgid "invalid micropython decorator" -msgstr "decorador de micropython inválido" +#: supervisor/shared/board_busses.c +msgid "No default I2C bus" +msgstr "Sin bus I2C por defecto" -#: py/compile.c:943 -msgid "can't delete expression" -msgstr "no se puede borrar la expresión" +#: supervisor/shared/board_busses.c +msgid "No default SPI bus" +msgstr "Sin bus SPI por defecto" -#: py/compile.c:955 -msgid "'break' outside loop" -msgstr "'break' fuera de un bucle" +#: supervisor/shared/board_busses.c +msgid "No default UART bus" +msgstr "Sin bus UART por defecto" -#: py/compile.c:958 -msgid "'continue' outside loop" -msgstr "'continue' fuera de un bucle" +#: ports/atmel-samd/common-hal/touchio/TouchIn.c +msgid "No free GCLKs" +msgstr "Sin GCLKs libres" -#: py/compile.c:969 -msgid "'return' outside function" -msgstr "'return' fuera de una función" +#: shared-bindings/os/__init__.c +msgid "No hardware random available" +msgstr "No hay hardware random disponible" -#: py/compile.c:1169 -msgid "identifier redefined as global" -msgstr "identificador redefinido como global" +#: ports/esp8266/common-hal/analogio/AnalogOut.c +msgid "No hardware support for analog out." +msgstr "Sin soporte de hardware para analog out" -#: py/compile.c:1185 -msgid "no binding for nonlocal found" -msgstr "no se ha encontrado ningún enlace para nonlocal" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +msgid "No hardware support on pin" +msgstr "Sin soporte de hardware en pin" -#: py/compile.c:1188 -msgid "identifier redefined as nonlocal" -msgstr "identificador redefinido como nonlocal" +#: py/moduerrno.c +msgid "No space left on device" +msgstr "" -#: py/compile.c:1197 -msgid "can't declare nonlocal in outer code" -msgstr "no se puede declarar nonlocal" +#: py/moduerrno.c +msgid "No such file/directory" +msgstr "No existe el archivo/directorio" -#: py/compile.c:1542 -msgid "default 'except' must be last" -msgstr "'except' por defecto deberia estar de último" +#: shared-bindings/bleio/CharacteristicBuffer.c +#, fuzzy +msgid "Not connected" +msgstr "No se puede conectar a AP" -#: py/compile.c:2095 -msgid "*x must be assignment target" -msgstr "*x debe ser objetivo de la tarea" +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "Not connected." +msgstr "" -#: py/compile.c:2193 -msgid "super() can't find self" -msgstr "super() no puede encontrar self" +#: shared-bindings/audiobusio/I2SOut.c shared-bindings/audioio/AudioOut.c +msgid "Not playing" +msgstr "" -#: py/compile.c:2256 -msgid "can't have multiple *x" -msgstr "no puede tener multiples *x" +#: shared-bindings/util.c +msgid "" +"Object has been deinitialized and can no longer be used. Create a new object." +msgstr "" +"El objeto se ha desinicializado y ya no se puede utilizar. Crea un nuevo " +"objeto" -#: py/compile.c:2263 -msgid "can't have multiple **x" -msgstr "no puede tener multiples *x" +#: ports/nrf/common-hal/busio/UART.c +msgid "Odd parity is not supported" +msgstr "Paridad impar no soportada" -#: py/compile.c:2271 -msgid "LHS of keyword arg must be an id" -msgstr "LHS del agumento por palabra clave deberia ser un identificador" +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Only 8 or 16 bit mono with " +msgstr "Solo mono de 8 o 16 bit con " -#: py/compile.c:2287 -msgid "non-keyword arg after */**" -msgstr "no deberia estar/tener agumento por palabra clave despues de */**" +#: shared-module/displayio/OnDiskBitmap.c +#, c-format +msgid "" +"Only Windows format, uncompressed BMP supported: given header size is %d" +msgstr "" -#: py/compile.c:2291 -msgid "non-keyword arg after keyword arg" +#: shared-module/displayio/Bitmap.c +msgid "Only bit maps of 8 bit color or less are supported" +msgstr "Solo se admiten bit maps de color de 8 bits o menos" + +#: shared-module/displayio/OnDiskBitmap.c +#, c-format +msgid "" +"Only monochrome, indexed 8bpp, and 16bpp or greater BMPs supported: %d bpp " +"given" msgstr "" -"no deberia estar/tener agumento por palabra clave despues de argumento por " -"palabra clave" -#: py/compile.c:2463 py/compile.c:2473 py/compile.c:2712 py/compile.c:2742 -#: py/parse.c:1176 -msgid "invalid syntax" -msgstr "sintaxis inválida" +#: shared-bindings/_pixelbuf/PixelBuf.c +#, fuzzy +msgid "Only slices with step=1 (aka None) are supported" +msgstr "solo se admiten segmentos con step=1 (alias None)" -#: py/compile.c:2465 -msgid "expecting key:value for dict" -msgstr "esperando la clave:valor para dict" +#: ports/esp8266/common-hal/busio/UART.c +msgid "Only tx supported on UART1 (GPIO2)." +msgstr "Solo tx soportada en UART1 (GPIO2)" -#: py/compile.c:2475 -msgid "expecting just a value for set" -msgstr "esperando solo un valor para set" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Oversample must be multiple of 8." +msgstr "" -#: py/compile.c:2600 -msgid "'yield' outside function" +#: shared-bindings/pulseio/PWMOut.c +msgid "" +"PWM duty_cycle must be between 0 and 65535 inclusive (16 bit resolution)" msgstr "" -"No es posible reiniciar en modo bootloader porque no hay bootloader presente." -#: py/compile.c:2619 -msgid "'await' outside function" -msgstr "'await' fuera de la función" +#: shared-bindings/pulseio/PWMOut.c +msgid "" +"PWM frequency not writable when variable_frequency is False on construction." +msgstr "" -#: py/compile.c:2774 -msgid "name reused for argument" -msgstr "nombre reusado para argumento" +#: ports/esp8266/common-hal/pulseio/PWMOut.c ports/esp8266/machine_pwm.c +#, c-format +msgid "PWM not supported on pin %d" +msgstr "El pin %d no soporta PWM" -#: py/compile.c:2827 -msgid "parameter annotation must be an identifier" -msgstr "parámetro de anotación debe ser un identificador" +#: py/moduerrno.c +msgid "Permission denied" +msgstr "Permiso denegado" -#: py/compile.c:2969 py/compile.c:3137 -msgid "return annotation must be an identifier" -msgstr "la anotación de retorno debe ser un identificador" +#: ports/esp8266/common-hal/analogio/AnalogIn.c +msgid "Pin %q does not have ADC capabilities" +msgstr "Pin %q no tiene capacidades de ADC" -#: py/compile.c:3097 -msgid "inline assembler must be a function" -msgstr "ensamblador en línea debe ser una función" +#: ports/atmel-samd/common-hal/analogio/AnalogIn.c +#: ports/nrf/common-hal/analogio/AnalogIn.c +msgid "Pin does not have ADC capabilities" +msgstr "Pin no tiene capacidad ADC" -#: py/compile.c:3134 -msgid "unknown type" -msgstr "tipo desconocido" +#: ports/esp8266/machine_pin.c +msgid "Pin(16) doesn't support pull" +msgstr "Pin(16) no soporta para pull" -#: py/compile.c:3154 -msgid "expecting an assembler instruction" -msgstr "esperando una instrucción de ensamblador" +#: ports/esp8266/common-hal/busio/SPI.c +msgid "Pins not valid for SPI" +msgstr "Pines no válidos para SPI" -#: py/compile.c:3184 -msgid "'label' requires 1 argument" -msgstr "'label' requiere 1 argumento" +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "Pixel beyond bounds of buffer" +msgstr "" -#: py/compile.c:3190 -msgid "label redefined" -msgstr "etiqueta redefinida" +#: py/builtinhelp.c +#, fuzzy +msgid "Plus any modules on the filesystem\n" +msgstr "Incapaz de montar de nuevo el sistema de archivos" -#: py/compile.c:3196 -msgid "'align' requires 1 argument" -msgstr "'align' requiere 1 argumento" +#: main.c +msgid "Press any key to enter the REPL. Use CTRL-D to reload." +msgstr "" +"Presiona cualquier tecla para entrar al REPL. Usa CTRL-D para recargar." -#: py/compile.c:3205 -msgid "'data' requires at least 2 arguments" -msgstr "'data' requiere como minomo 2 argumentos" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Pull not used when direction is output." +msgstr "Pull no se usa cuando la dirección es output." -#: py/compile.c:3212 -msgid "'data' requires integer arguments" -msgstr "'data' requiere argumentos de tipo entero" +#: shared-bindings/rtc/RTC.c +msgid "RTC calibration is not supported on this board" +msgstr "Calibración de RTC no es soportada en esta placa" -#: py/emitinlinethumb.c:102 -msgid "can only have up to 4 parameters to Thumb assembly" -msgstr "solo puede tener hasta 4 parámetros para ensamblar Thumb" +#: shared-bindings/rtc/RTC.c shared-bindings/time/__init__.c +msgid "RTC is not supported on this board" +msgstr "RTC no soportado en esta placa" -#: py/emitinlinethumb.c:107 py/emitinlinethumb.c:112 -msgid "parameters must be registers in sequence r0 to r3" -msgstr "los parametros deben ser registros en secuencia del r0 al r3" +#: shared-bindings/_pixelbuf/PixelBuf.c +#, fuzzy +msgid "Range out of bounds" +msgstr "address fuera de límites" -#: py/emitinlinethumb.c:188 py/emitinlinethumb.c:230 -#, c-format -msgid "'%s' expects at most r%d" -msgstr "'%s' espera a lo sumo r%d" +#: shared-bindings/pulseio/PulseIn.c +msgid "Read-only" +msgstr "Solo-lectura" -#: py/emitinlinethumb.c:197 py/emitinlinextensa.c:162 -#, c-format -msgid "'%s' expects a register" -msgstr "'%s' espera un registro" +#: extmod/vfs_fat.c py/moduerrno.c +msgid "Read-only filesystem" +msgstr "Sistema de archivos de solo-Lectura" -#: py/emitinlinethumb.c:211 -#, c-format -msgid "'%s' expects a special register" -msgstr "ord espera un carácter" +#: shared-module/displayio/Bitmap.c +#, fuzzy +msgid "Read-only object" +msgstr "Solo-lectura" -#: py/emitinlinethumb.c:239 -#, c-format -msgid "'%s' expects an FPU register" -msgstr "'%s' espera un registro de FPU" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Right channel unsupported" +msgstr "Canal derecho no soportado" -#: py/emitinlinethumb.c:292 -#, c-format -msgid "'%s' expects {r0, r1, ...}" -msgstr "'%s' espera {r0, r1, ...}" +#: shared-bindings/_pew/PewPew.c +msgid "Row entry must be digitalio.DigitalInOut" +msgstr "" -#: py/emitinlinethumb.c:299 py/emitinlinextensa.c:169 -#, c-format -msgid "'%s' expects an integer" -msgstr "'%s' espera un entero" +#: main.c +msgid "Running in safe mode! Auto-reload is off.\n" +msgstr "Ejecutando en modo seguro! La auto-recarga esta deshabilitada.\n" -#: py/emitinlinethumb.c:304 -#, c-format -msgid "'%s' integer 0x%x does not fit in mask 0x%x" -msgstr "'%s' entero 0x%x no cabe en la máscara 0x%x" +#: main.c +msgid "Running in safe mode! Not running saved code.\n" +msgstr "Ejecutando en modo seguro! No se esta ejecutando el código guardado.\n" -#: py/emitinlinethumb.c:328 -#, c-format -msgid "'%s' expects an address of the form [a, b]" -msgstr "'%s' espera una dirección de forma [a, b]" +#: ports/atmel-samd/common-hal/busio/I2C.c +msgid "SDA or SCL needs a pull up" +msgstr "SDA o SCL necesitan una pull up" -#: py/emitinlinethumb.c:334 py/emitinlinextensa.c:182 -#, c-format -msgid "'%s' expects a label" -msgstr "'%s' espera una etiqueta" +#: ports/esp8266/modnetwork.c +msgid "STA must be active" +msgstr "STA debe estar activo" -#: py/emitinlinethumb.c:345 py/emitinlinextensa.c:193 -msgid "label '%q' not defined" -msgstr "etiqueta '%q' no definida" +#: ports/esp8266/modnetwork.c +msgid "STA required" +msgstr "STA requerido" + +#: shared-bindings/audioio/Mixer.c +msgid "Sample rate must be positive" +msgstr "Sample rate debe ser positivo" -#: py/emitinlinethumb.c:806 +#: ports/atmel-samd/common-hal/audioio/AudioOut.c #, c-format -msgid "unsupported Thumb instruction '%s' with %d arguments" -msgstr "instrucción de tipo Thumb no admitida '%s' con %d argumentos" +msgid "Sample rate too high. It must be less than %d" +msgstr "Frecuencia de muestreo demasiado alta. Debe ser menor a %d" -#: py/emitinlinethumb.c:810 -msgid "branch not in range" -msgstr "El argumento de chr() no esta en el rango(256)" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Serializer in use" +msgstr "Serializer está siendo utilizado" -#: py/emitinlinextensa.c:86 -msgid "can only have up to 4 parameters to Xtensa assembly" -msgstr "solo puede tener hasta 4 parámetros para ensamblador Xtensa" +#: shared-bindings/nvm/ByteArray.c +msgid "Slice and value different lengths." +msgstr "" -#: py/emitinlinextensa.c:91 py/emitinlinextensa.c:96 -msgid "parameters must be registers in sequence a2 to a5" -msgstr "los parámetros deben ser registros en secuencia de a2 a a5" +#: shared-bindings/displayio/Bitmap.c shared-bindings/displayio/TileGrid.c +#: shared-bindings/displayio/Group.c shared-bindings/pulseio/PulseIn.c +msgid "Slices not supported" +msgstr "" -#: py/emitinlinextensa.c:174 +#: ports/nrf/common-hal/bleio/Adapter.c #, c-format -msgid "'%s' integer %d is not within range %d..%d" -msgstr "'%s' entero %d no esta dentro del rango %d..%d" +msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX" +msgstr "" -#: py/emitinlinextensa.c:327 -#, c-format -msgid "unsupported Xtensa instruction '%s' with %d arguments" -msgstr "instrucción Xtensa '%s' con %d argumentos no soportada" +#: extmod/modure.c +msgid "Splitting with sub-captures" +msgstr "Dividiendo con sub-capturas" -#: py/emitnative.c:183 -msgid "unknown type '%q'" -msgstr "tipo desconocido '%q'" +#: shared-bindings/supervisor/__init__.c +msgid "Stack size must be at least 256" +msgstr "" -#: py/emitnative.c:260 -msgid "Viper functions don't currently support more than 4 arguments" -msgstr "funciones Viper actualmente no soportan más de 4 argumentos." +#: shared-bindings/multiterminal/__init__.c +msgid "Stream missing readinto() or write() method." +msgstr "A Stream le falta el método readinto() o write()." -#: py/emitnative.c:742 -msgid "conversion to object" -msgstr "conversión a objeto" +#: supervisor/shared/safe_mode.c +msgid "" +"The CircuitPython heap was corrupted because the stack was too small.\n" +"Please increase stack size limits and press reset (after ejecting " +"CIRCUITPY).\n" +"If you didn't change the stack, then file an issue here with the contents of " +"your CIRCUITPY drive:\n" +msgstr "" -#: py/emitnative.c:921 -msgid "local '%q' used before type known" -msgstr "variable local '%q' usada antes del tipo conocido" +#: supervisor/shared/safe_mode.c +#, fuzzy +msgid "" +"The microcontroller's power dipped. Please make sure your power supply " +"provides\n" +"enough power for the whole circuit and press reset (after ejecting " +"CIRCUITPY).\n" +msgstr "" +"La alimentación del microcontrolador cayó. Por favor asegurate de que tu " +"fuente de alimentación provee\n" +"suficiente energia para todo el circuito y presiona el botón de reset " +"(despuesde expulsar CIRCUITPY).\n" -#: py/emitnative.c:1118 py/emitnative.c:1156 -msgid "can't load from '%q'" -msgstr "no se puede cargar desde '%q'" +#: supervisor/shared/safe_mode.c +msgid "" +"The reset button was pressed while booting CircuitPython. Press again to " +"exit safe mode.\n" +msgstr "" +"El botón reset fue presionado mientras arrancaba CircuitPython. Presiona " +"otra vez para salir del modo seguro.\n" -#: py/emitnative.c:1128 -msgid "can't load with '%q' index" -msgstr "no se puede cargar con el índice '%q'" +#: shared-module/audioio/Mixer.c +msgid "The sample's bits_per_sample does not match the mixer's" +msgstr "Los bits_per_sample del sample no igualan a los del mixer" -#: py/emitnative.c:1188 -msgid "local '%q' has type '%q' but source is '%q'" -msgstr "la variable local '%q' tiene el tipo '%q' pero la fuente es '%q'" +#: shared-module/audioio/Mixer.c +msgid "The sample's channel count does not match the mixer's" +msgstr "La cuenta de canales del sample no iguala a las del mixer" -#: py/emitnative.c:1289 py/emitnative.c:1379 -msgid "can't store '%q'" -msgstr "no se puede almacenar '%q'" +#: shared-module/audioio/Mixer.c +msgid "The sample's sample rate does not match the mixer's" +msgstr "El sample rate del sample no iguala al del mixer" -#: py/emitnative.c:1358 py/emitnative.c:1419 -msgid "can't store to '%q'" -msgstr "no se puede almacenar para '%q'" +#: shared-module/audioio/Mixer.c +msgid "The sample's signedness does not match the mixer's" +msgstr "El signo del sample no iguala al del mixer" -#: py/emitnative.c:1369 -msgid "can't store with '%q' index" -msgstr "no se puede almacenar con el indice '%q'" +#: shared-bindings/displayio/TileGrid.c +msgid "Tile height must exactly divide bitmap height" +msgstr "" -#: py/emitnative.c:1540 -msgid "can't implicitly convert '%q' to 'bool'" -msgstr "no se puede convertir implícitamente '%q' a 'bool'" +#: shared-bindings/displayio/TileGrid.c +msgid "Tile indices must be 0 - 255" +msgstr "" -#: py/emitnative.c:1774 -msgid "unary op %q not implemented" -msgstr "Operación unica %q no implementada" +#: shared-bindings/displayio/TileGrid.c +msgid "Tile width must exactly divide bitmap width" +msgstr "" -#: py/emitnative.c:1930 -msgid "binary op %q not implemented" -msgstr "operacion binaria %q no implementada" +#: supervisor/shared/safe_mode.c +msgid "To exit, please reset the board without " +msgstr "Para salir, por favor reinicia la tarjeta sin " -#: py/emitnative.c:1951 -msgid "can't do binary op between '%q' and '%q'" -msgstr "no se puede hacer una operacion binaria entre '%q' y '%q'" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Too many channels in sample." +msgstr "Demasiados canales en sample." -#: py/emitnative.c:2126 -msgid "casting" +#: shared-bindings/displayio/FourWire.c shared-bindings/displayio/ParallelBus.c +msgid "Too many display busses" msgstr "" -#: py/emitnative.c:2173 -msgid "return expected '%q' but got '%q'" -msgstr "retorno esperado '%q' pero se obtuvo '%q'" +#: shared-bindings/displayio/Display.c +msgid "Too many displays" +msgstr "" -#: py/emitnative.c:2191 -msgid "must raise an object" -msgstr "debe hacer un raise de un objeto" +#: py/obj.c +msgid "Traceback (most recent call last):\n" +msgstr "Traceback (ultima llamada reciente):\n" -#: py/emitnative.c:2201 -msgid "native yield" -msgstr "" +#: shared-bindings/time/__init__.c +msgid "Tuple or struct_time argument required" +msgstr "Argumento tuple o struct_time requerido" -#: py/lexer.c:345 -msgid "unicode name escapes" -msgstr "" +#: ports/esp8266/machine_uart.c +#, c-format +msgid "UART(%d) does not exist" +msgstr "UART(%d) no existe" -#: py/modbuiltins.c:162 -msgid "chr() arg not in range(0x110000)" -msgstr "El argumento de chr() esta fuera de rango(0x110000)" +#: ports/esp8266/machine_uart.c +msgid "UART(1) can't read" +msgstr "UART(1) no puede leer" -#: py/modbuiltins.c:171 -msgid "chr() arg not in range(256)" -msgstr "El argumento de chr() no esta en el rango(256)" +#: shared-module/usb_hid/Device.c +msgid "USB Busy" +msgstr "USB ocupado" -#: py/modbuiltins.c:285 -msgid "arg is an empty sequence" -msgstr "argumento es una secuencia vacía" +#: shared-module/usb_hid/Device.c +msgid "USB Error" +msgstr "Error USB" -#: py/modbuiltins.c:350 -msgid "ord expects a character" -msgstr "ord espera un carácter" +#: shared-bindings/bleio/UUID.c +msgid "UUID integer value not in range 0 to 0xffff" +msgstr "" -#: py/modbuiltins.c:353 -#, c-format -msgid "ord() expected a character, but string of length %d found" -msgstr "ord() espera un carácter, pero encontró un string de longitud %d" +#: shared-bindings/bleio/UUID.c +msgid "UUID string not 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'" +msgstr "" -#: py/modbuiltins.c:363 -msgid "3-arg pow() not supported" -msgstr "pow() con 3 argumentos no soportado" +#: shared-bindings/bleio/UUID.c +msgid "UUID value is not str, int or byte buffer" +msgstr "" -#: py/modbuiltins.c:517 -msgid "must use keyword argument for key function" -msgstr "debe utilizar argumento de palabra clave para la función clave" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Unable to allocate buffers for signed conversion" +msgstr "No se pudieron asignar buffers para la conversión con signo" -#: py/modmath.c:41 shared-bindings/math/__init__.c:53 -msgid "math domain error" -msgstr "error de dominio matemático" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Unable to find free GCLK" +msgstr "No se pudo encontrar un GCLK libre" -#: py/modmath.c:196 py/objfloat.c:270 py/objint_longlong.c:222 -#: py/objint_mpz.c:230 py/runtime.c:619 shared-bindings/math/__init__.c:346 -msgid "division by zero" -msgstr "división por cero" +#: py/parse.c +msgid "Unable to init parser" +msgstr "Incapaz de inicializar el parser" -#: py/modmicropython.c:155 -msgid "schedule stack full" +#: shared-module/displayio/OnDiskBitmap.c +msgid "Unable to read color palette data" msgstr "" -#: py/modstruct.c:145 py/modstruct.c:153 py/modstruct.c:234 py/modstruct.c:244 -#: shared-bindings/struct/__init__.c:103 shared-bindings/struct/__init__.c:145 -#: shared-module/struct/__init__.c:91 shared-module/struct/__init__.c:175 -msgid "buffer too small" -msgstr "buffer demasiado pequeño" +#: ports/esp8266/common-hal/storage/__init__.c +msgid "Unable to remount filesystem" +msgstr "Incapaz de montar de nuevo el sistema de archivos" -#: py/modthread.c:240 -msgid "expecting a dict for keyword args" -msgstr "esperando un diccionario para argumentos por palabra clave" +#: shared-bindings/nvm/ByteArray.c +msgid "Unable to write to nvm." +msgstr "Imposible escribir en nvm" -#: py/moduerrno.c:147 py/moduerrno.c:150 -msgid "Permission denied" -msgstr "Permiso denegado" +#: ports/nrf/common-hal/bleio/UUID.c +msgid "Unexpected nrfx uuid type" +msgstr "" -#: py/moduerrno.c:148 -msgid "No such file/directory" -msgstr "No existe el archivo/directorio" +#: ports/unix/modffi.c +msgid "Unknown type" +msgstr "Tipo desconocido" -#: py/moduerrno.c:149 -msgid "Input/output error" -msgstr "error Input/output" +#: shared-bindings/_pixelbuf/PixelBuf.c +#, c-format +msgid "Unmatched number of items on RHS (expected %d, got %d)." +msgstr "" -#: py/moduerrno.c:151 -msgid "File exists" -msgstr "El archivo ya existe" +#: ports/atmel-samd/common-hal/busio/I2C.c +msgid "Unsupported baudrate" +msgstr "Baudrate no soportado" -#: py/moduerrno.c:152 +#: shared-module/displayio/Display.c +#, fuzzy +msgid "Unsupported display bus type" +msgstr "tipo de bitmap no soportado" + +#: shared-module/audioio/WaveFile.c +msgid "Unsupported format" +msgstr "Formato no soportado" + +#: py/moduerrno.c msgid "Unsupported operation" msgstr "Operación no soportada" -#: py/moduerrno.c:153 -msgid "Invalid argument" -msgstr "Argumento inválido" - -#: py/obj.c:92 -msgid "Traceback (most recent call last):\n" -msgstr "Traceback (ultima llamada reciente):\n" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Unsupported pull value." +msgstr "valor pull no soportado." -#: py/obj.c:96 -msgid " File \"%q\", line %d" -msgstr " Archivo \"%q\", línea %d" +#: ports/esp8266/common-hal/storage/__init__.c +msgid "Use esptool to erase flash and re-upload Python instead" +msgstr "Usa esptool para borrar la flash y vuelve a cargar Python en su lugar" -#: py/obj.c:98 -msgid " File \"%q\"" -msgstr " Archivo \"%q\"" +#: py/emitnative.c +msgid "Viper functions don't currently support more than 4 arguments" +msgstr "funciones Viper actualmente no soportan más de 4 argumentos." -#: py/obj.c:102 -msgid ", in %q\n" -msgstr ", en %q\n" +#: shared-module/audioio/Mixer.c +msgid "Voice index too high" +msgstr "Index de voz demasiado alto" -#: py/obj.c:259 -msgid "can't convert to int" -msgstr "no se puede convertir a int" +#: main.c +msgid "WARNING: Your code filename has two extensions\n" +msgstr "ADVERTENCIA: El nombre de archivo de tu código tiene dos extensiones\n" -#: py/obj.c:262 +#: py/builtinhelp.c #, c-format -msgid "can't convert %s to int" -msgstr "no se puede convertir %s a int" +msgid "" +"Welcome to Adafruit CircuitPython %s!\n" +"\n" +"Please visit learn.adafruit.com/category/circuitpython for project guides.\n" +"\n" +"To list built-in modules please do `help(\"modules\")`.\n" +msgstr "" +"Bienvenido a Adafruit CircuitPython %s!\n" +"\n" +"Visita learn.adafruit.com/category/circuitpython para obtener guías de " +"proyectos.\n" +"\n" +"Para listar los módulos incorporados por favor haga `help(\"modules\")`.\n" -#: py/obj.c:322 -msgid "can't convert to float" -msgstr "no se puede convertir a float" +#: supervisor/shared/safe_mode.c +#, fuzzy +msgid "" +"You are running in safe mode which means something unanticipated happened.\n" +msgstr "" +"Estás ejecutando en modo seguro, lo cual significa que algo realmente malo " +"ha sucedido.\n" + +#: supervisor/shared/safe_mode.c +msgid "You requested starting safe mode by " +msgstr "Solicitaste iniciar en modo seguro por " -#: py/obj.c:325 +#: ports/unix/modusocket.c #, c-format -msgid "can't convert %s to float" -msgstr "no se puede convertir %s a float" +msgid "[addrinfo error %d]" +msgstr "" -#: py/obj.c:355 -msgid "can't convert to complex" -msgstr "no se puede convertir a complejo" +#: py/objtype.c +msgid "__init__() should return None" +msgstr "__init__() deberia devolver None" -#: py/obj.c:358 +#: py/objtype.c #, c-format -msgid "can't convert %s to complex" -msgstr "no se puede convertir %s a complejo" +msgid "__init__() should return None, not '%s'" +msgstr "__init__() deberia devolver None, no '%s'" -#: py/obj.c:373 -msgid "expected tuple/list" -msgstr "tupla/lista esperada" +#: py/objobject.c +msgid "__new__ arg must be a user-type" +msgstr "__new__ arg debe ser un user-type" -#: py/obj.c:376 -#, c-format -msgid "object '%s' is not a tuple or list" -msgstr "el objeto '%s' no es una tupla o lista" +#: extmod/modubinascii.c extmod/moduhashlib.c +msgid "a bytes-like object is required" +msgstr "se requiere un objeto bytes-like" -#: py/obj.c:387 -msgid "tuple/list has wrong length" -msgstr "tupla/lista tiene una longitud incorrecta" +#: lib/embed/abort_.c +msgid "abort() called" +msgstr "se llamó abort()" -#: py/obj.c:389 +#: ports/unix/modmachine.c extmod/machine_mem.c #, c-format -msgid "requested length %d but object has length %d" -msgstr "longitud solicitada %d pero el objeto tiene longitud %d" +msgid "address %08x is not aligned to %d bytes" +msgstr "la dirección %08x no esta alineada a %d bytes" -#: py/obj.c:402 -msgid "indices must be integers" -msgstr "indices deben ser enteros" +#: shared-bindings/i2cslave/I2CSlave.c +msgid "address out of bounds" +msgstr "address fuera de límites" -#: py/obj.c:405 -msgid "%q indices must be integers, not %s" -msgstr "%q indices deben ser enteros, no %s" +#: shared-bindings/i2cslave/I2CSlave.c +msgid "addresses is empty" +msgstr "addresses esta vacío" -#: py/obj.c:425 -msgid "%q index out of range" -msgstr "%w indice fuera de rango" +#: py/modbuiltins.c +msgid "arg is an empty sequence" +msgstr "argumento es una secuencia vacía" -#: py/obj.c:457 -msgid "object has no len" -msgstr "el objeto no tiene longitud" +#: py/runtime.c +msgid "argument has wrong type" +msgstr "el argumento tiene un tipo erroneo" + +#: py/argcheck.c +msgid "argument num/types mismatch" +msgstr "argumento número/tipos no coinciden" + +#: py/runtime.c +msgid "argument should be a '%q' not a '%q'" +msgstr "argumento deberia ser un '%q' no un '%q'" + +#: shared-bindings/nvm/ByteArray.c py/objarray.c +msgid "array/bytes required on right side" +msgstr "array/bytes requeridos en el lado derecho" + +#: py/objstr.c +msgid "attributes not supported yet" +msgstr "atributos aún no soportados" + +#: ports/nrf/common-hal/bleio/Characteristic.c +msgid "bad GATT role" +msgstr "" + +#: py/builtinevex.c +msgid "bad compile mode" +msgstr "modo de compilación erroneo" + +#: py/objstr.c +msgid "bad conversion specifier" +msgstr "especificador de conversion erroneo" + +#: py/objstr.c +msgid "bad format string" +msgstr "formato de string erroneo" + +#: py/binary.c +msgid "bad typecode" +msgstr "typecode erroneo" + +#: py/emitnative.c +msgid "binary op %q not implemented" +msgstr "operacion binaria %q no implementada" + +#: shared-bindings/busio/UART.c +msgid "bits must be 7, 8 or 9" +msgstr "bits deben ser 7, 8 o 9" -#: py/obj.c:460 +#: extmod/machine_spi.c +msgid "bits must be 8" +msgstr "bits debe ser 8" + +#: shared-bindings/audioio/Mixer.c +msgid "bits_per_sample must be 8 or 16" +msgstr "bits_per_sample debe ser 8 o 16" + +#: py/emitinlinethumb.c +msgid "branch not in range" +msgstr "El argumento de chr() no esta en el rango(256)" + +#: shared-bindings/_pixelbuf/PixelBuf.c #, c-format -msgid "object of type '%s' has no len()" -msgstr "el objeto de tipo '%s' no tiene len()" +msgid "buf is too small. need %d bytes" +msgstr "" -#: py/obj.c:500 -msgid "object does not support item deletion" -msgstr "object no soporta la eliminación de elementos" +#: shared-bindings/audioio/RawSample.c +msgid "buffer must be a bytes-like object" +msgstr "buffer debe de ser un objeto bytes-like" -#: py/obj.c:503 +#: shared-module/struct/__init__.c +#, fuzzy +msgid "buffer size must match format" +msgstr "los buffers deben de tener la misma longitud" + +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "buffer slices must be of equal length" +msgstr "" + +#: ports/esp8266/machine_rtc.c +msgid "buffer too long" +msgstr "buffer demasiado largo" + +#: shared-bindings/struct/__init__.c shared-module/struct/__init__.c +#: py/modstruct.c +msgid "buffer too small" +msgstr "buffer demasiado pequeño" + +#: extmod/machine_spi.c +msgid "buffers must be the same length" +msgstr "los buffers deben de tener la misma longitud" + +#: shared-bindings/_pew/PewPew.c +msgid "buttons must be digitalio.DigitalInOut" +msgstr "" + +#: py/vm.c +msgid "byte code not implemented" +msgstr "codigo byte no implementado" + +#: shared-bindings/_pixelbuf/PixelBuf.c #, c-format -msgid "'%s' object does not support item deletion" -msgstr "objeto '%s' no soporta la eliminación de elementos" +msgid "byteorder is not an instance of ByteOrder (got a %s)" +msgstr "" -#: py/obj.c:507 -msgid "object is not subscriptable" -msgstr "el objeto no es suscriptable" +#: ports/atmel-samd/common-hal/busio/UART.c +msgid "bytes > 8 bits not supported" +msgstr "bytes > 8 bits no soportados" + +#: py/objstr.c +msgid "bytes value out of range" +msgstr "valor de bytes fuera de rango" + +#: ports/atmel-samd/bindings/samd/Clock.c +msgid "calibration is out of range" +msgstr "calibration esta fuera de rango" + +#: ports/atmel-samd/bindings/samd/Clock.c +msgid "calibration is read only" +msgstr "calibration es de solo lectura" + +#: ports/atmel-samd/common-hal/rtc/RTC.c +msgid "calibration value out of range +/-127" +msgstr "Valor de calibración fuera del rango +/-127" + +#: py/emitinlinethumb.c +msgid "can only have up to 4 parameters to Thumb assembly" +msgstr "solo puede tener hasta 4 parámetros para ensamblar Thumb" + +#: py/emitinlinextensa.c +msgid "can only have up to 4 parameters to Xtensa assembly" +msgstr "solo puede tener hasta 4 parámetros para ensamblador Xtensa" -#: py/obj.c:510 +#: py/persistentcode.c +msgid "can only save bytecode" +msgstr "solo puede almacenar bytecode" + +#: ports/esp8266/modnetwork.c +msgid "can query only one param" +msgstr "puede consultar solo un param" + +#: py/objtype.c +msgid "can't add special method to already-subclassed class" +msgstr "no se puede agregar un método a una clase ya subclasificada" + +#: py/compile.c +msgid "can't assign to expression" +msgstr "no se puede asignar a la expresión" + +#: py/obj.c #, c-format -msgid "'%s' object is not subscriptable" -msgstr "el objeto '%s' no es suscriptable" +msgid "can't convert %s to complex" +msgstr "no se puede convertir %s a complejo" -#: py/obj.c:514 -msgid "object does not support item assignment" -msgstr "el objeto no soporta la asignación de elementos" +#: py/obj.c +#, c-format +msgid "can't convert %s to float" +msgstr "no se puede convertir %s a float" -#: py/obj.c:517 +#: py/obj.c #, c-format -msgid "'%s' object does not support item assignment" -msgstr "el objeto '%s' no soporta la asignación de elementos" +msgid "can't convert %s to int" +msgstr "no se puede convertir %s a int" -#: py/obj.c:548 -msgid "object with buffer protocol required" -msgstr "objeto con protocolo de buffer requerido" +#: py/objstr.c +msgid "can't convert '%q' object to %q implicitly" +msgstr "no se puede convertir el objeto '%q' a %q implícitamente" -#: py/objarray.c:413 py/objstr.c:427 py/objstrunicode.c:191 py/objtuple.c:187 -#: shared-bindings/nvm/ByteArray.c:85 -msgid "only slices with step=1 (aka None) are supported" -msgstr "solo se admiten segmentos con step=1 (alias None)" +#: py/objint.c +msgid "can't convert NaN to int" +msgstr "no se puede convertir Nan a int" -#: py/objarray.c:426 -msgid "lhs and rhs should be compatible" -msgstr "lhs y rhs deben ser compatibles" +#: shared-bindings/i2cslave/I2CSlave.c +msgid "can't convert address to int" +msgstr "no se puede convertir address a int" -#: py/objarray.c:444 shared-bindings/nvm/ByteArray.c:107 -msgid "array/bytes required on right side" -msgstr "array/bytes requeridos en el lado derecho" +#: py/objint.c +msgid "can't convert inf to int" +msgstr "no se puede convertir inf en int" + +#: py/obj.c +msgid "can't convert to complex" +msgstr "no se puede convertir a complejo" -#: py/objcomplex.c:203 +#: py/obj.c +msgid "can't convert to float" +msgstr "no se puede convertir a float" + +#: py/obj.c +msgid "can't convert to int" +msgstr "no se puede convertir a int" + +#: py/objstr.c +msgid "can't convert to str implicitly" +msgstr "no se puede convertir a str implícitamente" + +#: py/compile.c +msgid "can't declare nonlocal in outer code" +msgstr "no se puede declarar nonlocal" + +#: py/compile.c +msgid "can't delete expression" +msgstr "no se puede borrar la expresión" + +#: py/emitnative.c +msgid "can't do binary op between '%q' and '%q'" +msgstr "no se puede hacer una operacion binaria entre '%q' y '%q'" + +#: py/objcomplex.c msgid "can't do truncated division of a complex number" msgstr "no se puede hacer la división truncada de un número complejo" -#: py/objcomplex.c:209 -msgid "complex division by zero" -msgstr "división compleja por cero" +#: ports/esp8266/modnetwork.c +msgid "can't get AP config" +msgstr "no se puede obtener AP config" -#: py/objcomplex.c:237 -msgid "0.0 to a complex power" -msgstr "0.0 a una potencia compleja" +#: ports/esp8266/modnetwork.c +msgid "can't get STA config" +msgstr "no se puede obtener STA config" -#: py/objdeque.c:107 -msgid "full" -msgstr "lleno" +#: py/compile.c +msgid "can't have multiple **x" +msgstr "no puede tener multiples *x" -#: py/objdeque.c:127 -msgid "empty" -msgstr "vacío" +#: py/compile.c +msgid "can't have multiple *x" +msgstr "no puede tener multiples *x" -#: py/objdict.c:314 -msgid "popitem(): dictionary is empty" -msgstr "popitem(): diccionario vacío" +#: py/emitnative.c +msgid "can't implicitly convert '%q' to 'bool'" +msgstr "no se puede convertir implícitamente '%q' a 'bool'" -#: py/objdict.c:357 -msgid "dict update sequence has wrong length" -msgstr "la secuencia de actualizacion del dict tiene una longitud incorrecta" +#: py/emitnative.c +msgid "can't load from '%q'" +msgstr "no se puede cargar desde '%q'" -#: py/objfloat.c:308 py/parsenum.c:331 -msgid "complex values not supported" -msgstr "valores complejos no soportados" +#: py/emitnative.c +msgid "can't load with '%q' index" +msgstr "no se puede cargar con el índice '%q'" + +#: py/objgenerator.c +msgid "can't pend throw to just-started generator" +msgstr "no se puede colgar al generador recién iniciado" -#: py/objgenerator.c:108 +#: py/objgenerator.c msgid "can't send non-None value to a just-started generator" msgstr "" "no se puede enviar un valor que no sea None a un generador recién iniciado" -#: py/objgenerator.c:126 -msgid "generator already executing" -msgstr "generador ya se esta ejecutando" +#: ports/esp8266/modnetwork.c +msgid "can't set AP config" +msgstr "no se puede establecer AP config" -#: py/objgenerator.c:229 -msgid "generator ignored GeneratorExit" -msgstr "generador ignorado GeneratorExit" +#: ports/esp8266/modnetwork.c +msgid "can't set STA config" +msgstr "no se puede establecer STA config" -#: py/objgenerator.c:251 -msgid "can't pend throw to just-started generator" -msgstr "no se puede colgar al generador recién iniciado" +#: py/objnamedtuple.c +msgid "can't set attribute" +msgstr "no se puede asignar el atributo" -#: py/objint.c:144 -msgid "can't convert inf to int" -msgstr "no se puede convertir inf en int" +#: py/emitnative.c +msgid "can't store '%q'" +msgstr "no se puede almacenar '%q'" -#: py/objint.c:146 -msgid "can't convert NaN to int" -msgstr "no se puede convertir Nan a int" +#: py/emitnative.c +msgid "can't store to '%q'" +msgstr "no se puede almacenar para '%q'" -#: py/objint.c:163 -msgid "float too big" +#: py/emitnative.c +msgid "can't store with '%q' index" +msgstr "no se puede almacenar con el indice '%q'" + +#: py/objstr.c +msgid "" +"can't switch from automatic field numbering to manual field specification" +msgstr "" +"no se puede cambiar de la numeración automática de campos a la " +"especificación de campo manual" + +#: py/objstr.c +msgid "" +"can't switch from manual field specification to automatic field numbering" msgstr "" +"no se puede cambiar de especificación de campo manual a numeración " +"automática de campos" -#: py/objint.c:328 -msgid "long int not supported in this build" -msgstr "long int no soportado en esta compilación" +#: py/objtype.c +msgid "cannot create '%q' instances" +msgstr "no se pueden crear '%q' instancias" -#: py/objint.c:334 py/objint.c:340 py/objint.c:350 py/objint.c:358 -msgid "small int overflow" -msgstr "pequeño int desbordamiento" +#: py/objtype.c +msgid "cannot create instance" +msgstr "no se puede crear instancia" -#: py/objint_longlong.c:189 py/objint_mpz.c:283 py/runtime.c:486 -msgid "negative power with no float support" -msgstr "potencia negativa sin float support" +#: py/runtime.c +msgid "cannot import name %q" +msgstr "no se puede importar name '%q'" -#: py/objint_longlong.c:251 -msgid "ulonglong too large" -msgstr "ulonglong muy largo" +#: py/builtinimport.c +msgid "cannot perform relative import" +msgstr "no se puedo realizar importación relativa" -#: py/objint_mpz.c:267 py/runtime.c:396 py/runtime.c:411 -msgid "negative shift count" -msgstr "cuenta negativa de turnos" +#: py/emitnative.c +msgid "casting" +msgstr "" -#: py/objint_mpz.c:336 -msgid "pow() with 3 arguments requires integers" -msgstr "pow() con 3 argumentos requiere enteros" +#: shared-bindings/bleio/Service.c +msgid "characteristics includes an object that is not a Characteristic" +msgstr "" -#: py/objint_mpz.c:347 -msgid "pow() 3rd argument cannot be 0" -msgstr "el 3er argumento de pow() no puede ser 0" +#: shared-bindings/_stage/Text.c +msgid "chars buffer too small" +msgstr "chars buffer muy pequeño" -#: py/objint_mpz.c:415 -msgid "overflow converting long int to machine word" -msgstr "desbordamiento convirtiendo long int a palabra de máquina" +#: py/modbuiltins.c +msgid "chr() arg not in range(0x110000)" +msgstr "El argumento de chr() esta fuera de rango(0x110000)" -#: py/objlist.c:273 -msgid "pop from empty list" -msgstr "pop desde una lista vacía" +#: py/modbuiltins.c +msgid "chr() arg not in range(256)" +msgstr "El argumento de chr() no esta en el rango(256)" -#: py/objnamedtuple.c:92 -msgid "can't set attribute" -msgstr "no se puede asignar el atributo" +#: shared-bindings/displayio/Palette.c +msgid "color buffer must be 3 bytes (RGB) or 4 bytes (RGB + pad byte)" +msgstr "" -#: py/objobject.c:55 -msgid "__new__ arg must be a user-type" -msgstr "__new__ arg debe ser un user-type" +#: shared-bindings/displayio/Palette.c +msgid "color buffer must be a buffer or int" +msgstr "color buffer deber ser un buffer o un int" -#: py/objrange.c:110 -msgid "zero step" -msgstr "paso cero" +#: shared-bindings/displayio/Palette.c +msgid "color buffer must be a bytearray or array of type 'b' or 'B'" +msgstr "color buffer deberia ser un bytearray o array de tipo 'b' o 'B'" -#: py/objset.c:371 -msgid "pop from an empty set" -msgstr "pop desde un set vacío" +#: shared-bindings/displayio/Palette.c +msgid "color must be between 0x000000 and 0xffffff" +msgstr "color debe estar entre 0x000000 y 0xffffff" -#: py/objslice.c:66 -msgid "Length must be an int" -msgstr "Length debe ser un int" +#: shared-bindings/displayio/ColorConverter.c +msgid "color should be an int" +msgstr "color deberia ser un int" -#: py/objslice.c:71 -msgid "Length must be non-negative" -msgstr "Longitud no deberia ser negativa" +#: py/objcomplex.c +msgid "complex division by zero" +msgstr "división compleja por cero" -#: py/objslice.c:86 py/sequence.c:57 -msgid "slice step cannot be zero" -msgstr "slice step no puede ser cero" +#: py/parsenum.c py/objfloat.c +msgid "complex values not supported" +msgstr "valores complejos no soportados" -#: py/objslice.c:159 -msgid "Cannot subclass slice" -msgstr "" +#: extmod/moduzlib.c +msgid "compression header" +msgstr "encabezado de compresión" -#: py/objstr.c:261 -msgid "bytes value out of range" -msgstr "valor de bytes fuera de rango" +#: py/parse.c +msgid "constant must be an integer" +msgstr "constant debe ser un entero" -#: py/objstr.c:270 -msgid "wrong number of arguments" -msgstr "numero erroneo de argumentos" +#: py/emitnative.c +msgid "conversion to object" +msgstr "conversión a objeto" -#: py/objstr.c:467 -msgid "join expects a list of str/bytes objects consistent with self object" +#: py/parsenum.c +msgid "decimal numbers not supported" +msgstr "números decimales no soportados" + +#: py/compile.c +msgid "default 'except' must be last" +msgstr "'except' por defecto deberia estar de último" + +#: shared-bindings/audiobusio/PDMIn.c +msgid "" +"destination buffer must be a bytearray or array of type 'B' for bit_depth = 8" msgstr "" -"join espera una lista de objetos str/bytes consistentes con el mismo objeto" +"el buffer de destino debe ser un bytearray o array de tipo 'B' para " +"bit_depth = 8" -#: py/objstr.c:542 py/objstr.c:647 py/objstr.c:1744 -msgid "empty separator" -msgstr "separator vacío" +#: shared-bindings/audiobusio/PDMIn.c +msgid "destination buffer must be an array of type 'H' for bit_depth = 16" +msgstr "el buffer de destino debe ser un array de tipo 'H' para bit_depth = 16" -#: py/objstr.c:641 -msgid "rsplit(None,n)" -msgstr "rsplit(None,n)" +#: shared-bindings/audiobusio/PDMIn.c +msgid "destination_length must be an int >= 0" +msgstr "destination_length debe ser un int >= 0" -#: py/objstr.c:713 -msgid "substring not found" -msgstr "substring no encontrado" +#: py/objdict.c +msgid "dict update sequence has wrong length" +msgstr "la secuencia de actualizacion del dict tiene una longitud incorrecta" -#: py/objstr.c:770 -msgid "start/end indices" -msgstr "índices inicio/final" +#: shared-bindings/math/__init__.c py/runtime.c py/modmath.c py/objint_mpz.c +#: py/objint_longlong.c py/objfloat.c +msgid "division by zero" +msgstr "división por cero" -#: py/objstr.c:931 -msgid "bad format string" -msgstr "formato de string erroneo" +#: ports/esp8266/modnetwork.c +msgid "either pos or kw args are allowed" +msgstr "ya sea pos o kw args son permitidos" -#: py/objstr.c:953 -msgid "single '}' encountered in format string" -msgstr "un solo '}' encontrado en format string" +#: py/objdeque.c +msgid "empty" +msgstr "vacío" -#: py/objstr.c:992 -msgid "bad conversion specifier" -msgstr "especificador de conversion erroneo" +#: extmod/modutimeq.c extmod/moduheapq.c +msgid "empty heap" +msgstr "heap vacío" -#: py/objstr.c:996 +#: py/objstr.c +msgid "empty separator" +msgstr "separator vacío" + +#: shared-bindings/random/__init__.c +msgid "empty sequence" +msgstr "secuencia vacía" + +#: py/objstr.c msgid "end of format while looking for conversion specifier" msgstr "el final del formato mientras se busca el especificador de conversión" -#: py/objstr.c:998 +#: shared-bindings/displayio/Shape.c +#, fuzzy +msgid "end_x should be an int" +msgstr "y deberia ser un int" + +#: ports/nrf/common-hal/busio/UART.c #, c-format -msgid "unknown conversion specifier %c" -msgstr "especificador de conversión %c desconocido" +msgid "error = 0x%08lX" +msgstr "error = 0x%08lx" -#: py/objstr.c:1029 -msgid "unmatched '{' in format" -msgstr "No coinciden '{' en format" +#: py/runtime.c +msgid "exceptions must derive from BaseException" +msgstr "las excepciones deben derivar de BaseException" -#: py/objstr.c:1036 +#: py/objstr.c msgid "expected ':' after format specifier" msgstr "se espera ':' despues de un especificaro de tipo format" -#: py/objstr.c:1050 -msgid "" -"can't switch from automatic field numbering to manual field specification" -msgstr "" -"no se puede cambiar de la numeración automática de campos a la " -"especificación de campo manual" +#: shared-bindings/gamepad/GamePad.c +msgid "expected a DigitalInOut" +msgstr "se espera un DigitalInOut" -#: py/objstr.c:1055 py/objstr.c:1083 -msgid "tuple index out of range" -msgstr "tuple index fuera de rango" +#: py/obj.c +msgid "expected tuple/list" +msgstr "tupla/lista esperada" -#: py/objstr.c:1071 -msgid "attributes not supported yet" -msgstr "atributos aún no soportados" +#: py/modthread.c +msgid "expecting a dict for keyword args" +msgstr "esperando un diccionario para argumentos por palabra clave" -#: py/objstr.c:1079 -msgid "" -"can't switch from manual field specification to automatic field numbering" -msgstr "no se puede cambiar de especificación de campo manual a numeración automática de campos" +#: ports/esp8266/machine_pin.c +msgid "expecting a pin" +msgstr "esperando un pin" -#: py/objstr.c:1171 -msgid "invalid format specifier" -msgstr "especificador de formato inválido" +#: py/compile.c +msgid "expecting an assembler instruction" +msgstr "esperando una instrucción de ensamblador" -#: py/objstr.c:1192 -msgid "sign not allowed in string format specifier" -msgstr "signo no permitido en el espeficador de string format" +#: py/compile.c +msgid "expecting just a value for set" +msgstr "esperando solo un valor para set" -#: py/objstr.c:1200 -msgid "sign not allowed with integer format specifier 'c'" -msgstr "signo no permitido con el especificador integer format 'c'" +#: py/compile.c +msgid "expecting key:value for dict" +msgstr "esperando la clave:valor para dict" -#: py/objstr.c:1259 -#, c-format -msgid "unknown format code '%c' for object of type '%s'" -msgstr "codigo format desconocido '%c' para el typo de objeto '%s'" +#: py/argcheck.c +msgid "extra keyword arguments given" +msgstr "argumento(s) por palabra clave adicionales fueron dados" -#: py/objstr.c:1331 -#, c-format -msgid "unknown format code '%c' for object of type 'float'" -msgstr "codigo format desconocido '%c' para el typo de objeto 'float'" +#: py/argcheck.c +msgid "extra positional arguments given" +msgstr "argumento posicional adicional dado" -#: py/objstr.c:1343 -msgid "'=' alignment not allowed in string format specifier" -msgstr "'=' alineación no permitida en el especificador string format" +#: ports/unix/modffi.c +msgid "ffi_prep_closure_loc" +msgstr "ffi_prep_closure_loc" -#: py/objstr.c:1367 -#, c-format -msgid "unknown format code '%c' for object of type 'str'" -msgstr "codigo format desconocido '%c' para objeto de tipo 'str'" +#: shared-bindings/displayio/OnDiskBitmap.c shared-bindings/audioio/WaveFile.c +msgid "file must be a file opened in byte mode" +msgstr "el archivo deberia ser una archivo abierto en modo byte" -#: py/objstr.c:1415 -msgid "format requires a dict" -msgstr "format requiere un dict" +#: shared-bindings/storage/__init__.c +msgid "filesystem must provide mount method" +msgstr "sistema de archivos debe proporcionar método de montaje" -#: py/objstr.c:1424 -msgid "incomplete format key" -msgstr "" +#: py/objtype.c +msgid "first argument to super() must be type" +msgstr "primer argumento para super() debe ser de tipo" -#: py/objstr.c:1482 -msgid "incomplete format" -msgstr "formato incompleto" +#: extmod/machine_spi.c +msgid "firstbit must be MSB" +msgstr "firstbit debe ser MSB" -#: py/objstr.c:1490 -msgid "not enough arguments for format string" -msgstr "no suficientes argumentos para format string" +#: ports/esp8266/modesp.c +msgid "flash location must be below 1MByte" +msgstr "la ubicación de la flash debe estar debajo de 1MByte" -#: py/objstr.c:1500 -#, c-format -msgid "%%c requires int or char" -msgstr "%%c requiere int o char" +#: py/objint.c +msgid "float too big" +msgstr "" -#: py/objstr.c:1507 -msgid "integer required" -msgstr "Entero requerido" +#: shared-bindings/_stage/Text.c +msgid "font must be 2048 bytes long" +msgstr "font debe ser 2048 bytes de largo" -#: py/objstr.c:1570 -#, c-format -msgid "unsupported format character '%c' (0x%x) at index %d" -msgstr "carácter no soportado '%c' (0x%x) en índice %d" +#: py/objstr.c +msgid "format requires a dict" +msgstr "format requiere un dict" -#: py/objstr.c:1577 -msgid "not all arguments converted during string formatting" -msgstr "no todos los argumentos fueron convertidos durante el formato de string" +#: ports/esp8266/modmachine.c +msgid "frequency can only be either 80Mhz or 160MHz" +msgstr "la frecuencia solo puede ser 80MHz o 160MHz" -#: py/objstr.c:2102 -msgid "can't convert to str implicitly" -msgstr "no se puede convertir a str implícitamente" +#: py/objdeque.c +msgid "full" +msgstr "lleno" -#: py/objstr.c:2106 -msgid "can't convert '%q' object to %q implicitly" -msgstr "no se puede convertir el objeto '%q' a %q implícitamente" +#: py/argcheck.c +msgid "function does not take keyword arguments" +msgstr "la función no tiene argumentos por palabra clave" -#: py/objstrunicode.c:134 +#: py/argcheck.c #, c-format -msgid "string indices must be integers, not %s" -msgstr "índices de string deben ser enteros, no %s" - -#: py/objstrunicode.c:145 py/objstrunicode.c:164 -msgid "string index out of range" -msgstr "string index fuera de rango" +msgid "function expected at most %d arguments, got %d" +msgstr "la función esperaba minimo %d argumentos, tiene %d" -#: py/objtype.c:358 -msgid "__init__() should return None" -msgstr "__init__() deberia devolver None" +#: py/objnamedtuple.c py/bc.c +msgid "function got multiple values for argument '%q'" +msgstr "la función tiene múltiples valores para el argumento '%q'" -#: py/objtype.c:360 +#: py/argcheck.c #, c-format -msgid "__init__() should return None, not '%s'" -msgstr "__init__() deberia devolver None, no '%s'" +msgid "function missing %d required positional arguments" +msgstr "a la función le hacen falta %d argumentos posicionales requeridos" -#: py/objtype.c:623 py/objtype.c:1275 py/runtime.c:1065 -msgid "unreadable attribute" -msgstr "atributo no legible" +#: py/bc.c +msgid "function missing keyword-only argument" +msgstr "falta palabra clave para función" -#: py/objtype.c:868 py/runtime.c:653 -msgid "object not callable" -msgstr "objeto no puede ser llamado" +#: py/bc.c +msgid "function missing required keyword argument '%q'" +msgstr "la función requiere del argumento por palabra clave '%q'" -#: py/objtype.c:870 py/runtime.c:655 +#: py/bc.c #, c-format -msgid "'%s' object is not callable" -msgstr "objeto '%s' no puede ser llamado" +msgid "function missing required positional argument #%d" +msgstr "la función requiere del argumento posicional #%d" -#: py/objtype.c:978 -msgid "type takes 1 or 3 arguments" -msgstr "type acepta 1 o 3 argumentos" +#: py/argcheck.c py/objnamedtuple.c py/bc.c +#, c-format +msgid "function takes %d positional arguments but %d were given" +msgstr "la función toma %d argumentos posicionales pero le fueron dados %d" -#: py/objtype.c:989 -msgid "cannot create instance" -msgstr "no se puede crear instancia" +#: shared-bindings/time/__init__.c +msgid "function takes exactly 9 arguments" +msgstr "la función toma exactamente 9 argumentos." -#: py/objtype.c:991 -msgid "cannot create '%q' instances" -msgstr "no se pueden crear '%q' instancias" +#: py/objgenerator.c +msgid "generator already executing" +msgstr "generador ya se esta ejecutando" -#: py/objtype.c:1047 -msgid "can't add special method to already-subclassed class" -msgstr "no se puede agregar un método a una clase ya subclasificada" +#: py/objgenerator.c +msgid "generator ignored GeneratorExit" +msgstr "generador ignorado GeneratorExit" -#: py/objtype.c:1091 py/objtype.c:1097 -msgid "type is not an acceptable base type" -msgstr "type no es un tipo de base aceptable" +#: shared-bindings/_stage/Layer.c +msgid "graphic must be 2048 bytes long" +msgstr "graphic debe ser 2048 bytes de largo" -#: py/objtype.c:1100 -msgid "type '%q' is not an acceptable base type" -msgstr "type '%q' no es un tipo de base aceptable" +#: extmod/moduheapq.c +msgid "heap must be a list" +msgstr "heap debe ser una lista" -#: py/objtype.c:1137 -msgid "multiple inheritance not supported" -msgstr "herencia multiple no soportada" +#: py/compile.c +msgid "identifier redefined as global" +msgstr "identificador redefinido como global" -#: py/objtype.c:1164 -msgid "multiple bases have instance lay-out conflict" -msgstr "" +#: py/compile.c +msgid "identifier redefined as nonlocal" +msgstr "identificador redefinido como nonlocal" -#: py/objtype.c:1205 -msgid "first argument to super() must be type" -msgstr "primer argumento para super() debe ser de tipo" +#: ports/esp8266/machine_hspi.c +msgid "impossible baudrate" +msgstr "baudrate imposible" -#: py/objtype.c:1370 -msgid "issubclass() arg 2 must be a class or a tuple of classes" -msgstr "issubclass() arg 2 debe ser una clase o tuple de clases" +#: py/objstr.c +msgid "incomplete format" +msgstr "formato incompleto" -#: py/objtype.c:1384 -msgid "issubclass() arg 1 must be a class" -msgstr "issubclass() arg 1 debe ser una clase" +#: py/objstr.c +msgid "incomplete format key" +msgstr "" -#: py/parse.c:726 -msgid "constant must be an integer" -msgstr "constant debe ser un entero" +#: extmod/modubinascii.c +msgid "incorrect padding" +msgstr "relleno (padding) incorrecto" -#: py/parse.c:868 -msgid "Unable to init parser" -msgstr "Incapaz de inicializar el parser" +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +#: ports/nrf/common-hal/pulseio/PulseIn.c +#: ports/esp8266/common-hal/pulseio/PulseIn.c py/obj.c +msgid "index out of range" +msgstr "index fuera de rango" -#: py/parse.c:1170 -msgid "unexpected indent" -msgstr "sangría inesperada" +#: py/obj.c +msgid "indices must be integers" +msgstr "indices deben ser enteros" -#: py/parse.c:1173 -msgid "unindent does not match any outer indentation level" -msgstr "sangría no coincide con ningún nivel exterior" +#: py/compile.c +msgid "inline assembler must be a function" +msgstr "ensamblador en línea debe ser una función" -#: py/parsenum.c:60 +#: py/parsenum.c msgid "int() arg 2 must be >= 2 and <= 36" msgstr "int() arg 2 debe ser >= 2 y <= 36" -#: py/parsenum.c:151 -msgid "invalid syntax for integer" -msgstr "sintaxis inválida para entero" - -#: py/parsenum.c:155 -#, c-format -msgid "invalid syntax for integer with base %d" -msgstr "sintaxis inválida para entero con base %d" - -#: py/parsenum.c:339 -msgid "invalid syntax for number" -msgstr "sintaxis inválida para número" - -#: py/parsenum.c:342 -msgid "decimal numbers not supported" -msgstr "números decimales no soportados" +#: py/objstr.c +msgid "integer required" +msgstr "Entero requerido" -#: py/persistentcode.c:223 -msgid "" -"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/" -"mpy-update for more info." +#: ports/nrf/common-hal/bleio/Broadcaster.c +msgid "interval not in range 0.0020 to 10.24" msgstr "" -"Archivo .mpy incompatible. Actualice todos los archivos .mpy. Consulte " -"http://adafru.it/mpy-update para más información" -#: py/persistentcode.c:326 -msgid "can only save bytecode" -msgstr "solo puede almacenar bytecode" +#: extmod/machine_i2c.c +msgid "invalid I2C peripheral" +msgstr "periférico I2C inválido" -#: py/runtime.c:206 -msgid "name not defined" -msgstr "name no definido" +#: extmod/machine_spi.c +msgid "invalid SPI peripheral" +msgstr "periférico SPI inválido" -#: py/runtime.c:209 -msgid "name '%q' is not defined" -msgstr "name '%q' no esta definido" +#: ports/esp8266/machine_rtc.c +msgid "invalid alarm" +msgstr "alarma inválida" -#: py/runtime.c:304 py/runtime.c:611 -msgid "unsupported type for operator" -msgstr "tipo de operador no soportado" +#: lib/netutils/netutils.c +msgid "invalid arguments" +msgstr "argumentos inválidos" -#: py/runtime.c:307 -msgid "unsupported type for %q: '%s'" -msgstr "tipo no soportado para %q: '%s'" +#: ports/esp8266/modnetwork.c +msgid "invalid buffer length" +msgstr "longitud de buffer inválida" -#: py/runtime.c:614 -msgid "unsupported types for %q: '%s', '%s'" -msgstr "tipos no soportados para %q: '%s', '%s'" +#: extmod/modussl_axtls.c +msgid "invalid cert" +msgstr "certificado inválido" -#: py/runtime.c:881 py/runtime.c:888 py/runtime.c:945 -msgid "wrong number of values to unpack" -msgstr "numero erroneo de valores a descomprimir" +#: ports/esp8266/common-hal/busio/UART.c ports/esp8266/machine_uart.c +msgid "invalid data bits" +msgstr "data bits inválidos" -#: py/runtime.c:883 py/runtime.c:947 -#, c-format -msgid "need more than %d values to unpack" -msgstr "necesita más de %d valores para descomprimir" +#: extmod/uos_dupterm.c +msgid "invalid dupterm index" +msgstr "index dupterm inválido" -#: py/runtime.c:890 -#, c-format -msgid "too many values to unpack (expected %d)" -msgstr "demasiados valores para descomprimir (%d esperado)" +#: extmod/modframebuf.c +msgid "invalid format" +msgstr "formato inválido" -#: py/runtime.c:984 -msgid "argument has wrong type" -msgstr "el argumento tiene un tipo erroneo" +#: py/objstr.c +msgid "invalid format specifier" +msgstr "especificador de formato inválido" -#: py/runtime.c:986 -msgid "argument should be a '%q' not a '%q'" -msgstr "argumento deberia ser un '%q' no un '%q'" +#: extmod/modussl_axtls.c +msgid "invalid key" +msgstr "llave inválida" -#: py/runtime.c:1123 py/runtime.c:1197 -msgid "no such attribute" -msgstr "no hay tal atributo" +#: py/compile.c +msgid "invalid micropython decorator" +msgstr "decorador de micropython inválido" -#: py/runtime.c:1128 -msgid "type object '%q' has no attribute '%q'" -msgstr "objeto de tipo '%q' no tiene atributo '%q'" +#: ports/esp8266/machine_pin.c +msgid "invalid pin" +msgstr "pin inválido" -#: py/runtime.c:1132 py/runtime.c:1200 -msgid "'%s' object has no attribute '%q'" -msgstr "objeto '%s' no tiene atributo '%q'" +#: shared-bindings/random/__init__.c +msgid "invalid step" +msgstr "" -#: py/runtime.c:1238 -msgid "object not iterable" -msgstr "objeto no iterable" +#: ports/esp8266/common-hal/busio/UART.c ports/esp8266/machine_uart.c +msgid "invalid stop bits" +msgstr "stop bits inválidos" -#: py/runtime.c:1241 -#, c-format -msgid "'%s' object is not iterable" -msgstr "objeto '%s' no es iterable" +#: py/compile.c py/parse.c +msgid "invalid syntax" +msgstr "sintaxis inválida" -#: py/runtime.c:1260 py/runtime.c:1296 -msgid "object not an iterator" -msgstr "objeto no es un iterator" +#: py/parsenum.c +msgid "invalid syntax for integer" +msgstr "sintaxis inválida para entero" -#: py/runtime.c:1262 py/runtime.c:1298 +#: py/parsenum.c #, c-format -msgid "'%s' object is not an iterator" -msgstr "objeto '%s' no es un iterator" +msgid "invalid syntax for integer with base %d" +msgstr "sintaxis inválida para entero con base %d" -#: py/runtime.c:1401 -msgid "exceptions must derive from BaseException" -msgstr "las excepciones deben derivar de BaseException" +#: py/parsenum.c +msgid "invalid syntax for number" +msgstr "sintaxis inválida para número" -#: py/runtime.c:1430 -msgid "cannot import name %q" -msgstr "no se puede importar name '%q'" +#: py/objtype.c +msgid "issubclass() arg 1 must be a class" +msgstr "issubclass() arg 1 debe ser una clase" -#: py/runtime.c:1535 -msgid "memory allocation failed, heap is locked" -msgstr "la asignación de memoria falló, el heap está bloqueado" +#: py/objtype.c +msgid "issubclass() arg 2 must be a class or a tuple of classes" +msgstr "issubclass() arg 2 debe ser una clase o tuple de clases" -#: py/runtime.c:1539 -#, c-format -msgid "memory allocation failed, allocating %u bytes" -msgstr "la asignación de memoria falló, asignando %u bytes" +#: py/objstr.c +msgid "join expects a list of str/bytes objects consistent with self object" +msgstr "" +"join espera una lista de objetos str/bytes consistentes con el mismo objeto" -#: py/runtime.c:1609 -msgid "maximum recursion depth exceeded" -msgstr "profundidad máxima de recursión excedida" +#: py/argcheck.c +msgid "keyword argument(s) not yet implemented - use normal args instead" +msgstr "" +"argumento(s) por palabra clave aún no implementados - usa argumentos " +"normales en su lugar" -#: py/sequence.c:264 -msgid "object not in sequence" -msgstr "objeto no en secuencia" +#: py/bc.c +msgid "keywords must be strings" +msgstr "palabras clave deben ser strings" -#: py/stream.c:96 -msgid "stream operation not supported" -msgstr "operación stream no soportada" +#: py/emitinlinextensa.c py/emitinlinethumb.c +msgid "label '%q' not defined" +msgstr "etiqueta '%q' no definida" -#: py/stream.c:254 -msgid "string not supported; use bytes or bytearray" -msgstr "string no soportado; usa bytes o bytearray" +#: py/compile.c +msgid "label redefined" +msgstr "etiqueta redefinida" + +#: ports/esp8266/modesp.c +msgid "len must be multiple of 4" +msgstr "len debe de ser múltiple de 4" -#: py/stream.c:289 +#: py/stream.c msgid "length argument not allowed for this type" msgstr "argumento length no permitido para este tipo" -#: py/vm.c:255 -msgid "local variable referenced before assignment" -msgstr "variable local referenciada antes de la asignación" +#: py/objarray.c +msgid "lhs and rhs should be compatible" +msgstr "lhs y rhs deben ser compatibles" -#: py/vm.c:1142 -msgid "no active exception to reraise" -msgstr "exception no activa para reraise" +#: py/emitnative.c +msgid "local '%q' has type '%q' but source is '%q'" +msgstr "la variable local '%q' tiene el tipo '%q' pero la fuente es '%q'" -#: py/vm.c:1284 -msgid "byte code not implemented" -msgstr "codigo byte no implementado" +#: py/emitnative.c +msgid "local '%q' used before type known" +msgstr "variable local '%q' usada antes del tipo conocido" -#: shared-bindings/_stage/Layer.c:71 -msgid "graphic must be 2048 bytes long" -msgstr "graphic debe ser 2048 bytes de largo" +#: py/vm.c +msgid "local variable referenced before assignment" +msgstr "variable local referenciada antes de la asignación" -#: shared-bindings/_stage/Layer.c:77 shared-bindings/_stage/Text.c:75 -msgid "palette must be 32 bytes long" -msgstr "palette debe ser 32 bytes de largo" +#: py/objint.c +msgid "long int not supported in this build" +msgstr "long int no soportado en esta compilación" -#: shared-bindings/_stage/Layer.c:84 +#: shared-bindings/_stage/Layer.c msgid "map buffer too small" msgstr "map buffer muy pequeño" -#: shared-bindings/_stage/Text.c:69 -msgid "font must be 2048 bytes long" -msgstr "font debe ser 2048 bytes de largo" +#: shared-bindings/math/__init__.c py/modmath.c +msgid "math domain error" +msgstr "error de dominio matemático" -#: shared-bindings/_stage/Text.c:81 -msgid "chars buffer too small" -msgstr "chars buffer muy pequeño" +#: py/runtime.c +msgid "maximum recursion depth exceeded" +msgstr "profundidad máxima de recursión excedida" -#: shared-bindings/analogio/AnalogOut.c:118 -msgid "AnalogOut is only 16 bits. Value must be less than 65536." -msgstr "AnalogOut es solo de 16 bits. Value debe ser menos a 65536." +#: py/runtime.c +#, c-format +msgid "memory allocation failed, allocating %u bytes" +msgstr "la asignación de memoria falló, asignando %u bytes" -#: shared-bindings/audiobusio/I2SOut.c:225 -#: shared-bindings/audioio/AudioOut.c:226 -msgid "Not playing" -msgstr "" +#: ports/esp8266/modesp.c +#, c-format +msgid "memory allocation failed, allocating %u bytes for native code" +msgstr "falló la asignación de memoria, asignando %u bytes para código nativo" -#: shared-bindings/audiobusio/PDMIn.c:124 -msgid "Bit depth must be multiple of 8." -msgstr "La profundidad de bits debe ser múltiplo de 8." +#: py/runtime.c +msgid "memory allocation failed, heap is locked" +msgstr "la asignación de memoria falló, el heap está bloqueado" -#: shared-bindings/audiobusio/PDMIn.c:128 -msgid "Oversample must be multiple of 8." -msgstr "" +#: py/builtinimport.c +msgid "module not found" +msgstr "módulo no encontrado" -#: shared-bindings/audiobusio/PDMIn.c:136 -msgid "Microphone startup delay must be in range 0.0 to 1.0" -msgstr "" +#: py/compile.c +msgid "multiple *x in assignment" +msgstr "múltiples *x en la asignación" -#: shared-bindings/audiobusio/PDMIn.c:193 -msgid "destination_length must be an int >= 0" -msgstr "destination_length debe ser un int >= 0" +#: py/objtype.c +msgid "multiple bases have instance lay-out conflict" +msgstr "" -#: shared-bindings/audiobusio/PDMIn.c:199 -msgid "Cannot record to a file" -msgstr "No se puede grabar en un archivo" +#: py/objtype.c +msgid "multiple inheritance not supported" +msgstr "herencia multiple no soportada" -#: shared-bindings/audiobusio/PDMIn.c:202 -msgid "Destination capacity is smaller than destination_length." -msgstr "Capacidad de destino es mas pequeña que destination_length." +#: py/emitnative.c +msgid "must raise an object" +msgstr "debe hacer un raise de un objeto" -#: shared-bindings/audiobusio/PDMIn.c:206 -msgid "destination buffer must be an array of type 'H' for bit_depth = 16" -msgstr "el buffer de destino debe ser un array de tipo 'H' para bit_depth = 16" +#: extmod/machine_spi.c +msgid "must specify all of sck/mosi/miso" +msgstr "se deben de especificar sck/mosi/miso" -#: shared-bindings/audiobusio/PDMIn.c:208 -msgid "" -"destination buffer must be a bytearray or array of type 'B' for bit_depth = 8" -msgstr "" -"el buffer de destino debe ser un bytearray o array de tipo 'B' para " -"bit_depth = 8" +#: py/modbuiltins.c +msgid "must use keyword argument for key function" +msgstr "debe utilizar argumento de palabra clave para la función clave" -#: shared-bindings/audioio/Mixer.c:94 -msgid "Invalid voice count" -msgstr "Cuenta de voces inválida" +#: py/runtime.c +msgid "name '%q' is not defined" +msgstr "name '%q' no esta definido" -#: shared-bindings/audioio/Mixer.c:99 -msgid "Invalid channel count" -msgstr "Cuenta de canales inválida" +#: shared-bindings/bleio/Peripheral.c +#, fuzzy +msgid "name must be a string" +msgstr "palabras clave deben ser strings" -#: shared-bindings/audioio/Mixer.c:103 -msgid "Sample rate must be positive" -msgstr "Sample rate debe ser positivo" +#: py/runtime.c +msgid "name not defined" +msgstr "name no definido" -#: shared-bindings/audioio/Mixer.c:107 -msgid "bits_per_sample must be 8 or 16" -msgstr "bits_per_sample debe ser 8 o 16" +#: py/compile.c +msgid "name reused for argument" +msgstr "nombre reusado para argumento" -#: shared-bindings/audioio/RawSample.c:98 -msgid "" -"sample_source buffer must be a bytearray or array of type 'h', 'H', 'b' or " -"'B'" +#: py/emitnative.c +msgid "native yield" msgstr "" -"sample_source buffer debe ser un bytearray o un array de tipo 'h', 'H', 'b' " -"o'B'" -#: shared-bindings/audioio/RawSample.c:104 -msgid "buffer must be a bytes-like object" -msgstr "buffer debe de ser un objeto bytes-like" +#: py/runtime.c +#, c-format +msgid "need more than %d values to unpack" +msgstr "necesita más de %d valores para descomprimir" -#: shared-bindings/audioio/WaveFile.c:78 -#: shared-bindings/displayio/OnDiskBitmap.c:85 -msgid "file must be a file opened in byte mode" -msgstr "el archivo deberia ser una archivo abierto en modo byte" +#: py/runtime.c py/objint_mpz.c py/objint_longlong.c +msgid "negative power with no float support" +msgstr "potencia negativa sin float support" -#: shared-bindings/bitbangio/I2C.c:111 shared-bindings/bitbangio/SPI.c:121 -#: shared-bindings/busio/SPI.c:133 -msgid "Function requires lock" -msgstr "La función requiere lock" +#: py/runtime.c py/objint_mpz.c +msgid "negative shift count" +msgstr "cuenta negativa de turnos" -#: shared-bindings/bitbangio/I2C.c:195 shared-bindings/busio/I2C.c:210 -msgid "Buffer must be at least length 1" -msgstr "Buffer debe ser de longitud 1 como minimo" +#: py/vm.c +msgid "no active exception to reraise" +msgstr "exception no activa para reraise" -#: shared-bindings/bitbangio/SPI.c:151 shared-bindings/busio/SPI.c:175 -msgid "Invalid polarity" -msgstr "Polaridad inválida" +#: shared-bindings/socket/__init__.c shared-module/network/__init__.c +msgid "no available NIC" +msgstr "NIC no disponible" -#: shared-bindings/bitbangio/SPI.c:155 shared-bindings/busio/SPI.c:179 -msgid "Invalid phase" -msgstr "Fase inválida" +#: py/compile.c +msgid "no binding for nonlocal found" +msgstr "no se ha encontrado ningún enlace para nonlocal" -#: shared-bindings/bitbangio/SPI.c:159 shared-bindings/busio/SPI.c:183 -msgid "Invalid number of bits" -msgstr "Numero inválido de bits" +#: py/builtinimport.c +msgid "no module named '%q'" +msgstr "ningún módulo se llama '%q'" -#: shared-bindings/bitbangio/SPI.c:284 shared-bindings/busio/SPI.c:348 -msgid "buffer slices must be of equal length" -msgstr "" +#: shared-bindings/_pixelbuf/__init__.c py/runtime.c +msgid "no such attribute" +msgstr "no hay tal atributo" -#: shared-bindings/bleio/Address.c:101 -msgid "Wrong address length" -msgstr "Longitud de address erronea" +#: py/compile.c +msgid "non-default argument follows default argument" +msgstr "argumento no predeterminado sigue argumento predeterminado" -#: shared-bindings/bleio/Address.c:107 -msgid "Wrong number of bytes provided" -msgstr "Numero erroneo de bytes dados" +#: extmod/modubinascii.c +msgid "non-hex digit found" +msgstr "digito non-hex encontrado" -#: shared-bindings/bleio/Device.c:210 -msgid "Can't add services in Central mode" -msgstr "No se pueden agregar servicio en modo Central" +#: py/compile.c +msgid "non-keyword arg after */**" +msgstr "no deberia estar/tener agumento por palabra clave despues de */**" -#: shared-bindings/bleio/Device.c:226 -msgid "Can't connect in Peripheral mode" -msgstr "No se puede conectar en modo Peripheral" +#: py/compile.c +msgid "non-keyword arg after keyword arg" +msgstr "" +"no deberia estar/tener agumento por palabra clave despues de argumento por " +"palabra clave" -#: shared-bindings/bleio/Device.c:256 -msgid "Can't change the name in Central mode" -msgstr "No se puede cambiar el nombre en modo Central" +#: shared-bindings/bleio/UUID.c +msgid "not a 128-bit UUID" +msgstr "" -#: shared-bindings/bleio/Device.c:277 shared-bindings/bleio/Device.c:313 -msgid "Can't advertise in Central mode" +#: ports/esp8266/machine_adc.c +#, c-format +msgid "not a valid ADC Channel: %d" +msgstr "no es un canal ADC válido: %d" + +#: py/objstr.c +msgid "not all arguments converted during string formatting" msgstr "" +"no todos los argumentos fueron convertidos durante el formato de string" -#: shared-bindings/busio/I2C.c:120 -msgid "Function requires lock." -msgstr "La función requiere lock" +#: py/objstr.c +msgid "not enough arguments for format string" +msgstr "no suficientes argumentos para format string" -#: shared-bindings/busio/UART.c:106 -msgid "bits must be 7, 8 or 9" -msgstr "bits deben ser 7, 8 o 9" +#: py/obj.c +#, c-format +msgid "object '%s' is not a tuple or list" +msgstr "el objeto '%s' no es una tupla o lista" -#: shared-bindings/busio/UART.c:118 -msgid "stop must be 1 or 2" -msgstr "stop debe ser 1 o 2" +#: py/obj.c +msgid "object does not support item assignment" +msgstr "el objeto no soporta la asignación de elementos" -#: shared-bindings/busio/UART.c:123 -msgid "timeout >100 (units are now seconds, not msecs)" -msgstr "" +#: py/obj.c +msgid "object does not support item deletion" +msgstr "object no soporta la eliminación de elementos" -#: shared-bindings/digitalio/DigitalInOut.c:211 -msgid "Invalid direction." -msgstr "Dirección inválida." +#: py/obj.c +msgid "object has no len" +msgstr "el objeto no tiene longitud" -#: shared-bindings/digitalio/DigitalInOut.c:240 -msgid "Cannot set value when direction is input." -msgstr "No se puede asignar un valor cuando la dirección es input." +#: py/obj.c +msgid "object is not subscriptable" +msgstr "el objeto no es suscriptable" -#: shared-bindings/digitalio/DigitalInOut.c:266 -#: shared-bindings/digitalio/DigitalInOut.c:281 -msgid "Drive mode not used when direction is input." -msgstr "Modo Drive no se usa cuando la dirección es input." +#: py/runtime.c +msgid "object not an iterator" +msgstr "objeto no es un iterator" -#: shared-bindings/digitalio/DigitalInOut.c:314 -#: shared-bindings/digitalio/DigitalInOut.c:331 -msgid "Pull not used when direction is output." -msgstr "Pull no se usa cuando la dirección es output." +#: py/objtype.c py/runtime.c +msgid "object not callable" +msgstr "objeto no puede ser llamado" -#: shared-bindings/digitalio/DigitalInOut.c:340 -msgid "Unsupported pull value." -msgstr "valor pull no soportado." +#: py/sequence.c +msgid "object not in sequence" +msgstr "objeto no en secuencia" -#: shared-bindings/displayio/Bitmap.c:84 -msgid "y should be an int" -msgstr "y deberia ser un int" +#: py/runtime.c +msgid "object not iterable" +msgstr "objeto no iterable" -#: shared-bindings/displayio/Bitmap.c:89 -msgid "row buffer must be a bytearray or array of type 'b' or 'B'" -msgstr "row buffer deberia ser un bytearray o array de tipo 'b' o 'B'" +#: py/obj.c +#, c-format +msgid "object of type '%s' has no len()" +msgstr "el objeto de tipo '%s' no tiene len()" -#: shared-bindings/displayio/Bitmap.c:94 -msgid "row data must be a buffer" -msgstr "row data debe ser un buffer" +#: py/obj.c +msgid "object with buffer protocol required" +msgstr "objeto con protocolo de buffer requerido" -#: shared-bindings/displayio/ColorConverter.c:72 -msgid "color should be an int" -msgstr "color deberia ser un int" +#: extmod/modubinascii.c +msgid "odd-length string" +msgstr "string de longitud impar" -#: shared-bindings/displayio/FourWire.c:55 -#: shared-bindings/displayio/FourWire.c:64 -msgid "displayio is a work in progress" -msgstr "displayio todavia esta en desarrollo" +#: py/objstrunicode.c py/objstr.c +#, fuzzy +msgid "offset out of bounds" +msgstr "address fuera de límites" -#: shared-bindings/displayio/Group.c:65 -msgid "Group must have size at least 1" -msgstr "Group debe tener size de minimo 1" +#: shared-bindings/nvm/ByteArray.c py/objarray.c py/objtuple.c +#: py/objstrunicode.c py/objstr.c +msgid "only slices with step=1 (aka None) are supported" +msgstr "solo se admiten segmentos con step=1 (alias None)" -#: shared-bindings/displayio/Palette.c:96 -msgid "color buffer must be a bytearray or array of type 'b' or 'B'" -msgstr "color buffer deberia ser un bytearray o array de tipo 'b' o 'B'" +#: py/modbuiltins.c +msgid "ord expects a character" +msgstr "ord espera un carácter" -#: shared-bindings/displayio/Palette.c:102 -msgid "color buffer must be 3 bytes (RGB) or 4 bytes (RGB + pad byte)" -msgstr "" +#: py/modbuiltins.c +#, c-format +msgid "ord() expected a character, but string of length %d found" +msgstr "ord() espera un carácter, pero encontró un string de longitud %d" -#: shared-bindings/displayio/Palette.c:106 -msgid "color must be between 0x000000 and 0xffffff" -msgstr "color debe estar entre 0x000000 y 0xffffff" +#: py/objint_mpz.c +msgid "overflow converting long int to machine word" +msgstr "desbordamiento convirtiendo long int a palabra de máquina" -#: shared-bindings/displayio/Palette.c:110 -msgid "color buffer must be a buffer or int" -msgstr "color buffer deber ser un buffer o un int" +#: shared-bindings/_stage/Text.c shared-bindings/_stage/Layer.c +msgid "palette must be 32 bytes long" +msgstr "palette debe ser 32 bytes de largo" -#: shared-bindings/displayio/Palette.c:123 -#: shared-bindings/displayio/Palette.c:137 +#: shared-bindings/displayio/Palette.c msgid "palette_index should be an int" msgstr "palette_index deberia ser un int" -#: shared-bindings/displayio/Sprite.c:48 -msgid "position must be 2-tuple" -msgstr "posición debe ser 2-tuple" +#: py/compile.c +msgid "parameter annotation must be an identifier" +msgstr "parámetro de anotación debe ser un identificador" -#: shared-bindings/displayio/Sprite.c:97 -msgid "unsupported bitmap type" -msgstr "tipo de bitmap no soportado" +#: py/emitinlinextensa.c +msgid "parameters must be registers in sequence a2 to a5" +msgstr "los parámetros deben ser registros en secuencia de a2 a a5" + +#: py/emitinlinethumb.c +msgid "parameters must be registers in sequence r0 to r3" +msgstr "los parametros deben ser registros en secuencia del r0 al r3" + +#: ports/esp8266/machine_pin.c +msgid "pin does not have IRQ capabilities" +msgstr "pin sin capacidades IRQ" -#: shared-bindings/displayio/Sprite.c:162 +#: shared-bindings/displayio/Bitmap.c +#, fuzzy +msgid "pixel coordinates out of bounds" +msgstr "address fuera de límites" + +#: shared-bindings/displayio/Bitmap.c +msgid "pixel value requires too many bits" +msgstr "" + +#: shared-bindings/displayio/TileGrid.c msgid "pixel_shader must be displayio.Palette or displayio.ColorConverter" msgstr "pixel_shader debe ser displayio.Palette o displayio.ColorConverter" -#: shared-bindings/gamepad/GamePad.c:100 -msgid "too many arguments" -msgstr "muchos argumentos" +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +#: ports/nrf/common-hal/pulseio/PulseIn.c +#: ports/esp8266/common-hal/pulseio/PulseIn.c +msgid "pop from an empty PulseIn" +msgstr "pop de un PulseIn vacío" -#: shared-bindings/gamepad/GamePad.c:104 -msgid "expected a DigitalInOut" -msgstr "se espera un DigitalInOut" +#: py/objset.c +msgid "pop from an empty set" +msgstr "pop desde un set vacío" -#: shared-bindings/i2cslave/I2CSlave.c:98 -msgid "can't convert address to int" -msgstr "no se puede convertir address a int" +#: py/objlist.c +msgid "pop from empty list" +msgstr "pop desde una lista vacía" -#: shared-bindings/i2cslave/I2CSlave.c:101 -msgid "address out of bounds" -msgstr "address fuera de límites" +#: py/objdict.c +msgid "popitem(): dictionary is empty" +msgstr "popitem(): diccionario vacío" -#: shared-bindings/i2cslave/I2CSlave.c:107 -msgid "addresses is empty" -msgstr "addresses esta vacío" +#: py/objint_mpz.c +msgid "pow() 3rd argument cannot be 0" +msgstr "el 3er argumento de pow() no puede ser 0" -#: shared-bindings/microcontroller/Pin.c:89 -#: shared-bindings/neopixel_write/__init__.c:67 -#: shared-bindings/pulseio/PulseOut.c:76 -msgid "Expected a %q" -msgstr "Se espera un %q" +#: py/objint_mpz.c +msgid "pow() with 3 arguments requires integers" +msgstr "pow() con 3 argumentos requiere enteros" -#: shared-bindings/microcontroller/Pin.c:100 -msgid "%q in use" -msgstr "%q está siendo utilizado" +#: extmod/modutimeq.c +msgid "queue overflow" +msgstr "desbordamiento de cola(queue)" -#: shared-bindings/microcontroller/__init__.c:126 -msgid "Invalid run mode." -msgstr "Modo de ejecución inválido." +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "rawbuf is not the same size as buf" +msgstr "" -#: shared-bindings/multiterminal/__init__.c:68 -msgid "Stream missing readinto() or write() method." -msgstr "A Stream le falta el método readinto() o write()." +#: shared-bindings/_pixelbuf/__init__.c +#, fuzzy +msgid "readonly attribute" +msgstr "atributo no legible" -#: shared-bindings/nvm/ByteArray.c:99 -msgid "Slice and value different lengths." -msgstr "" +#: py/builtinimport.c +msgid "relative import" +msgstr "import relativo" -#: shared-bindings/nvm/ByteArray.c:104 -msgid "Array values should be single bytes." -msgstr "Valores del array deben ser bytes individuales." +#: py/obj.c +#, c-format +msgid "requested length %d but object has length %d" +msgstr "longitud solicitada %d pero el objeto tiene longitud %d" -#: shared-bindings/nvm/ByteArray.c:111 shared-bindings/nvm/ByteArray.c:141 -msgid "Unable to write to nvm." -msgstr "Imposible escribir en nvm" +#: py/compile.c +msgid "return annotation must be an identifier" +msgstr "la anotación de retorno debe ser un identificador" -#: shared-bindings/nvm/ByteArray.c:137 -msgid "Bytes must be between 0 and 255." -msgstr "Bytes debe estar entre 0 y 255." +#: py/emitnative.c +msgid "return expected '%q' but got '%q'" +msgstr "retorno esperado '%q' pero se obtuvo '%q'" -#: shared-bindings/os/__init__.c:200 -msgid "No hardware random available" -msgstr "No hay hardware random disponible" +#: shared-module/displayio/Bitmap.c +msgid "row must be packed and word aligned" +msgstr "la fila debe estar empacada y la palabra alineada" -#: shared-bindings/pulseio/PWMOut.c:164 -msgid "" -"PWM duty_cycle must be between 0 and 65535 inclusive (16 bit resolution)" +#: py/objstr.c +msgid "rsplit(None,n)" msgstr "" -#: shared-bindings/pulseio/PWMOut.c:195 +#: shared-bindings/audioio/RawSample.c msgid "" -"PWM frequency not writable when variable_frequency is False on construction." +"sample_source buffer must be a bytearray or array of type 'h', 'H', 'b' or " +"'B'" msgstr "" +"sample_source buffer debe ser un bytearray o un array de tipo 'h', 'H', 'b' " +"o'B'" -#: shared-bindings/pulseio/PulseIn.c:275 -msgid "Cannot delete values" -msgstr "No se puede eliminar valores" +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "sampling rate out of range" +msgstr "frecuencia de muestreo fuera de rango" -#: shared-bindings/pulseio/PulseIn.c:281 -msgid "Slices not supported" -msgstr "" +#: ports/esp8266/modnetwork.c +msgid "scan failed" +msgstr "scan ha fallado" -#: shared-bindings/pulseio/PulseIn.c:287 -msgid "index must be int" -msgstr "indice debe ser int" +#: py/modmicropython.c +msgid "schedule stack full" +msgstr "" -#: shared-bindings/pulseio/PulseIn.c:293 -msgid "Read-only" -msgstr "Solo-lectura" +#: lib/utils/pyexec.c py/builtinimport.c +msgid "script compilation not supported" +msgstr "script de compilación no soportado" -#: shared-bindings/pulseio/PulseOut.c:135 -msgid "Array must contain halfwords (type 'H')" +#: shared-bindings/bleio/Peripheral.c +msgid "services includes an object that is not a Service" msgstr "" -#: shared-bindings/random/__init__.c:92 shared-bindings/random/__init__.c:100 -msgid "stop not reachable from start" -msgstr "" +#: py/objstr.c +msgid "sign not allowed in string format specifier" +msgstr "signo no permitido en el espeficador de string format" -#: shared-bindings/random/__init__.c:111 -msgid "step must be non-zero" -msgstr "" +#: py/objstr.c +msgid "sign not allowed with integer format specifier 'c'" +msgstr "signo no permitido con el especificador integer format 'c'" -#: shared-bindings/random/__init__.c:114 -msgid "invalid step" -msgstr "" +#: py/objstr.c +msgid "single '}' encountered in format string" +msgstr "un solo '}' encontrado en format string" -#: shared-bindings/random/__init__.c:146 -msgid "empty sequence" -msgstr "secuencia vacía" +#: shared-bindings/time/__init__.c +msgid "sleep length must be non-negative" +msgstr "la longitud de sleep no puede ser negativa" -#: shared-bindings/rtc/RTC.c:40 shared-bindings/rtc/RTC.c:44 -#: shared-bindings/time/__init__.c:190 -msgid "RTC is not supported on this board" -msgstr "RTC no soportado en esta placa" +#: py/objslice.c py/sequence.c +msgid "slice step cannot be zero" +msgstr "slice step no puede ser cero" -#: shared-bindings/rtc/RTC.c:52 -msgid "RTC calibration is not supported on this board" -msgstr "Calibración de RTC no es soportada en esta placa" +#: py/sequence.c py/objint.c +msgid "small int overflow" +msgstr "pequeño int desbordamiento" -#: shared-bindings/socket/__init__.c:516 shared-module/network/__init__.c:81 -msgid "no available NIC" -msgstr "NIC no disponible" +#: main.c +msgid "soft reboot\n" +msgstr "reinicio suave\n" -#: shared-bindings/storage/__init__.c:77 -msgid "filesystem must provide mount method" -msgstr "sistema de archivos debe proporcionar método de montaje" +#: py/objstr.c +msgid "start/end indices" +msgstr "índices inicio/final" -#: shared-bindings/supervisor/__init__.c:93 -msgid "Brightness must be between 0 and 255" -msgstr "Brightness debe estar entro 0 y 255" +#: shared-bindings/displayio/Shape.c +#, fuzzy +msgid "start_x should be an int" +msgstr "y deberia ser un int" -#: shared-bindings/supervisor/__init__.c:119 -msgid "Stack size must be at least 256" +#: shared-bindings/random/__init__.c +msgid "step must be non-zero" msgstr "" -#: shared-bindings/time/__init__.c:78 -msgid "sleep length must be non-negative" -msgstr "la longitud de sleep no puede ser negativa" - -#: shared-bindings/time/__init__.c:88 -msgid "time.struct_time() takes exactly 1 argument" -msgstr "time.struct_time() acepta exactamente 1 argumento" +#: shared-bindings/busio/UART.c +msgid "stop must be 1 or 2" +msgstr "stop debe ser 1 o 2" -#: shared-bindings/time/__init__.c:91 -msgid "time.struct_time() takes a 9-sequence" +#: shared-bindings/random/__init__.c +msgid "stop not reachable from start" msgstr "" -#: shared-bindings/time/__init__.c:169 shared-bindings/time/__init__.c:263 -msgid "Tuple or struct_time argument required" -msgstr "Argumento tuple o struct_time requerido" +#: py/stream.c +msgid "stream operation not supported" +msgstr "operación stream no soportada" -#: shared-bindings/time/__init__.c:174 shared-bindings/time/__init__.c:268 -msgid "function takes exactly 9 arguments" -msgstr "la función toma exactamente 9 argumentos." +#: py/objstrunicode.c +msgid "string index out of range" +msgstr "string index fuera de rango" -#: shared-bindings/time/__init__.c:239 shared-bindings/time/__init__.c:272 -msgid "timestamp out of range for platform time_t" -msgstr "" +#: py/objstrunicode.c +#, c-format +msgid "string indices must be integers, not %s" +msgstr "índices de string deben ser enteros, no %s" + +#: py/stream.c +msgid "string not supported; use bytes or bytearray" +msgstr "string no soportado; usa bytes o bytearray" -#: shared-bindings/touchio/TouchIn.c:173 +#: extmod/moductypes.c +msgid "struct: cannot index" +msgstr "struct: no se puede indexar" + +#: extmod/moductypes.c +msgid "struct: index out of range" +msgstr "struct: index fuera de rango" + +#: extmod/moductypes.c +msgid "struct: no fields" +msgstr "struct: sin campos" + +#: py/objstr.c +msgid "substring not found" +msgstr "substring no encontrado" + +#: py/compile.c +msgid "super() can't find self" +msgstr "super() no puede encontrar self" + +#: extmod/modujson.c +msgid "syntax error in JSON" +msgstr "error de sintaxis en JSON" + +#: extmod/moductypes.c +msgid "syntax error in uctypes descriptor" +msgstr "error de sintaxis en el descriptor uctypes" + +#: shared-bindings/touchio/TouchIn.c msgid "threshold must be in the range 0-65536" msgstr "" -#: shared-bindings/util.c:38 -msgid "" -"Object has been deinitialized and can no longer be used. Create a new object." +#: shared-bindings/displayio/TileGrid.c +msgid "tile index out of bounds" msgstr "" -"El objeto se ha desinicializado y ya no se puede utilizar. Crea un nuevo " -"objeto" -#: shared-module/audioio/Mixer.c:47 shared-module/audioio/WaveFile.c:117 -msgid "Couldn't allocate first buffer" -msgstr "No se pudo asignar el primer buffer" +#: shared-bindings/time/__init__.c +msgid "time.struct_time() takes a 9-sequence" +msgstr "" -#: shared-module/audioio/Mixer.c:53 shared-module/audioio/WaveFile.c:123 -msgid "Couldn't allocate second buffer" -msgstr "No se pudo asignar el segundo buffer" +#: shared-bindings/time/__init__.c +msgid "time.struct_time() takes exactly 1 argument" +msgstr "time.struct_time() acepta exactamente 1 argumento" -#: shared-module/audioio/Mixer.c:82 -msgid "Voice index too high" -msgstr "Index de voz demasiado alto" +#: shared-bindings/busio/UART.c +msgid "timeout >100 (units are now seconds, not msecs)" +msgstr "" -#: shared-module/audioio/Mixer.c:85 -msgid "The sample's sample rate does not match the mixer's" -msgstr "El sample rate del sample no iguala al del mixer" +#: shared-bindings/bleio/CharacteristicBuffer.c +#, fuzzy +msgid "timeout must be >= 0.0" +msgstr "bits debe ser 8" -#: shared-module/audioio/Mixer.c:88 -msgid "The sample's channel count does not match the mixer's" -msgstr "La cuenta de canales del sample no iguala a las del mixer" +#: shared-bindings/time/__init__.c +msgid "timestamp out of range for platform time_t" +msgstr "" -#: shared-module/audioio/Mixer.c:91 -msgid "The sample's bits_per_sample does not match the mixer's" -msgstr "Los bits_per_sample del sample no igualan a los del mixer" +#: shared-bindings/gamepad/GamePad.c +msgid "too many arguments" +msgstr "muchos argumentos" -#: shared-module/audioio/Mixer.c:100 -msgid "The sample's signedness does not match the mixer's" -msgstr "El signo del sample no iguala al del mixer" +#: shared-module/struct/__init__.c +msgid "too many arguments provided with the given format" +msgstr "demasiados argumentos provistos con el formato dado" -#: shared-module/audioio/WaveFile.c:61 -msgid "Invalid wave file" -msgstr "Archivo wave inválido" +#: py/runtime.c +#, c-format +msgid "too many values to unpack (expected %d)" +msgstr "demasiados valores para descomprimir (%d esperado)" -#: shared-module/audioio/WaveFile.c:69 -msgid "Invalid format chunk size" -msgstr "" +#: py/objstr.c +msgid "tuple index out of range" +msgstr "tuple index fuera de rango" -#: shared-module/audioio/WaveFile.c:83 -msgid "Unsupported format" -msgstr "Formato no soportado" +#: py/obj.c +msgid "tuple/list has wrong length" +msgstr "tupla/lista tiene una longitud incorrecta" -#: shared-module/audioio/WaveFile.c:99 -msgid "Data chunk must follow fmt chunk" +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "tuple/list required on RHS" msgstr "" -#: shared-module/audioio/WaveFile.c:107 -msgid "Invalid file" -msgstr "Archivo inválido" +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "tx and rx cannot both be None" +msgstr "Ambos tx y rx no pueden ser None" -#: shared-module/bitbangio/I2C.c:58 -msgid "Clock stretch too long" -msgstr "" +#: py/objtype.c +msgid "type '%q' is not an acceptable base type" +msgstr "type '%q' no es un tipo de base aceptable" -#: shared-module/bitbangio/SPI.c:44 -msgid "Clock pin init failed." -msgstr "Clock pin init fallido" +#: py/objtype.c +msgid "type is not an acceptable base type" +msgstr "type no es un tipo de base aceptable" -#: shared-module/bitbangio/SPI.c:50 -msgid "MOSI pin init failed." -msgstr "MOSI pin init fallido." +#: py/runtime.c +msgid "type object '%q' has no attribute '%q'" +msgstr "objeto de tipo '%q' no tiene atributo '%q'" -#: shared-module/bitbangio/SPI.c:61 -msgid "MISO pin init failed." -msgstr "MISO pin init fallido." +#: py/objtype.c +msgid "type takes 1 or 3 arguments" +msgstr "type acepta 1 o 3 argumentos" -#: shared-module/bitbangio/SPI.c:121 -msgid "Cannot write without MOSI pin." -msgstr "No se puede escribir sin pin MOSI." +#: py/objint_longlong.c +msgid "ulonglong too large" +msgstr "ulonglong muy largo" -#: shared-module/bitbangio/SPI.c:176 -msgid "Cannot read without MISO pin." -msgstr "No se puede leer sin pin MISO." +#: py/emitnative.c +msgid "unary op %q not implemented" +msgstr "Operación unica %q no implementada" -#: shared-module/bitbangio/SPI.c:240 -msgid "Cannot transfer without MOSI and MISO pins." -msgstr "No se puede transferir sin pines MOSI y MISO." +#: py/parse.c +msgid "unexpected indent" +msgstr "sangría inesperada" -#: shared-module/displayio/Bitmap.c:49 -msgid "Only bit maps of 8 bit color or less are supported" -msgstr "Solo se admiten bit maps de color de 8 bits o menos" +#: py/bc.c +msgid "unexpected keyword argument" +msgstr "argumento por palabra clave inesperado" -#: shared-module/displayio/Bitmap.c:69 -msgid "row must be packed and word aligned" -msgstr "la fila debe estar empacada y la palabra alineada" +#: py/objnamedtuple.c py/bc.c +msgid "unexpected keyword argument '%q'" +msgstr "argumento por palabra clave inesperado '%q'" -#: shared-module/displayio/Group.c:39 -msgid "Group full" -msgstr "Group lleno" +#: py/lexer.c +msgid "unicode name escapes" +msgstr "" -#: shared-module/displayio/Group.c:48 -msgid "Group empty" -msgstr "Group vacío" +#: py/parse.c +msgid "unindent does not match any outer indentation level" +msgstr "sangría no coincide con ningún nivel exterior" -#: shared-module/displayio/OnDiskBitmap.c:49 -msgid "Invalid BMP file" -msgstr "Archivo BMP inválido" +#: ports/esp8266/modnetwork.c +msgid "unknown config param" +msgstr "parámetro config desconocido" -#: shared-module/displayio/OnDiskBitmap.c:59 +#: py/objstr.c #, c-format -msgid "Only Windows format, uncompressed BMP supported %d" -msgstr "Solo formato Windows, BMP sin comprimir soportado %d" +msgid "unknown conversion specifier %c" +msgstr "especificador de conversión %c desconocido" -#: shared-module/displayio/OnDiskBitmap.c:64 +#: py/objstr.c #, c-format -msgid "Only true color (24 bpp or higher) BMP supported %x" -msgstr "Solo color verdadero (24 bpp o superior) BMP admitido %x" - -#: shared-module/storage/__init__.c:155 -msgid "Cannot remount '/' when USB is active." -msgstr "No se puede volver a montar '/' cuando el USB esta activo." - -#: shared-module/struct/__init__.c:39 -msgid "'S' and 'O' are not supported format types" -msgstr "'S' y 'O' no son compatibles con los tipos de formato" +msgid "unknown format code '%c' for object of type '%s'" +msgstr "codigo format desconocido '%c' para el typo de objeto '%s'" -#: shared-module/struct/__init__.c:83 -msgid "too many arguments provided with the given format" -msgstr "demasiados argumentos provistos con el formato dado" +#: py/objstr.c +#, c-format +msgid "unknown format code '%c' for object of type 'float'" +msgstr "codigo format desconocido '%c' para el typo de objeto 'float'" -#: shared-module/usb_hid/Device.c:45 +#: py/objstr.c #, c-format -msgid "Buffer incorrect size. Should be %d bytes." -msgstr "Tamaño de buffer incorrecto. Debe ser de %d bytes." +msgid "unknown format code '%c' for object of type 'str'" +msgstr "codigo format desconocido '%c' para objeto de tipo 'str'" -#: shared-module/usb_hid/Device.c:53 -msgid "USB Busy" -msgstr "USB ocupado" +#: ports/esp8266/modnetwork.c +msgid "unknown status param" +msgstr "status param desconocido" -#: shared-module/usb_hid/Device.c:59 -msgid "USB Error" -msgstr "Error USB" +#: py/compile.c +msgid "unknown type" +msgstr "tipo desconocido" -#: supervisor/shared/safe_mode.c:97 -msgid "You requested starting safe mode by " -msgstr "Solicitaste iniciar en modo seguro por " +#: py/emitnative.c +msgid "unknown type '%q'" +msgstr "tipo desconocido '%q'" -#: supervisor/shared/safe_mode.c:100 -msgid "To exit, please reset the board without " -msgstr "Para salir, por favor reinicia la tarjeta sin " +#: py/objstr.c +msgid "unmatched '{' in format" +msgstr "No coinciden '{' en format" -#: supervisor/shared/safe_mode.c:107 -#, fuzzy -msgid "" -"You are running in safe mode which means something unanticipated happened.\n" -msgstr "" -"Estás ejecutando en modo seguro, lo cual significa que algo realmente malo " -"ha sucedido.\n" +#: py/objtype.c py/runtime.c +msgid "unreadable attribute" +msgstr "atributo no legible" -#: supervisor/shared/safe_mode.c:109 -msgid "" -"Looks like our core CircuitPython code crashed hard. Whoops!\n" -"Please file an issue at https://github.com/adafruit/circuitpython/issues\n" -" with the contents of your CIRCUITPY drive and this message:\n" -msgstr "" -"Parece que nuestro código de CircuitPython ha fallado con fuerza. Whoops!\n" -"Por favor, crea un issue en https://github.com/adafruit/circuitpython/issues\n" -" con el contenido de su unidad CIRCUITPY y este mensaje:\n" +#: py/emitinlinethumb.c +#, c-format +msgid "unsupported Thumb instruction '%s' with %d arguments" +msgstr "instrucción de tipo Thumb no admitida '%s' con %d argumentos" -#: supervisor/shared/safe_mode.c:111 -msgid "Crash into the HardFault_Handler.\n" -msgstr "" +#: py/emitinlinextensa.c +#, c-format +msgid "unsupported Xtensa instruction '%s' with %d arguments" +msgstr "instrucción Xtensa '%s' con %d argumentos no soportada" -#: supervisor/shared/safe_mode.c:113 -msgid "MicroPython NLR jump failed. Likely memory corruption.\n" -msgstr "" +#: shared-bindings/displayio/TileGrid.c +msgid "unsupported bitmap type" +msgstr "tipo de bitmap no soportado" -#: supervisor/shared/safe_mode.c:115 -msgid "MicroPython fatal error.\n" -msgstr "MicroPython fatal error.\n" +#: py/objstr.c +#, c-format +msgid "unsupported format character '%c' (0x%x) at index %d" +msgstr "carácter no soportado '%c' (0x%x) en índice %d" -#: supervisor/shared/safe_mode.c:118 -#, fuzzy -msgid "" -"The microcontroller's power dipped. Please make sure your power supply " -"provides\n" -"enough power for the whole circuit and press reset (after ejecting " -"CIRCUITPY).\n" -msgstr "" -"La alimentación del microcontrolador cayó. Por favor asegurate de que tu " -"fuente de alimentación provee\n" -"suficiente energia para todo el circuito y presiona el botón de reset (despues" -"de expulsar CIRCUITPY).\n" +#: py/runtime.c +msgid "unsupported type for %q: '%s'" +msgstr "tipo no soportado para %q: '%s'" -#: supervisor/shared/safe_mode.c:120 -msgid "" -"The CircuitPython heap was corrupted because the stack was too small.\n" -"Please increase stack size limits and press reset (after ejecting " -"CIRCUITPY).\n" -"If you didn't change the stack, then file an issue here with the contents of " -"your CIRCUITPY drive:\n" -msgstr "" +#: py/runtime.c +msgid "unsupported type for operator" +msgstr "tipo de operador no soportado" -#: supervisor/shared/safe_mode.c:123 -msgid "" -"The reset button was pressed while booting CircuitPython. Press again to " -"exit safe mode.\n" +#: py/runtime.c +msgid "unsupported types for %q: '%s', '%s'" +msgstr "tipos no soportados para %q: '%s', '%s'" + +#: shared-bindings/displayio/Bitmap.c +msgid "value_count must be > 0" msgstr "" -"El botón reset fue presionado mientras arrancaba CircuitPython. Presiona otra" -" vez para salir del modo seguro.\n" -#~ msgid "Cannot apply GAP parameters." -#~ msgstr "No se pueden aplicar los parámetros GAP." +#: ports/esp8266/modnetwork.c +msgid "wifi_set_ip_info() failed" +msgstr "wifi_set_ip_info() ha fallado" -#~ msgid "Can not add Characteristic." -#~ msgstr "No se puede agregar la Característica." +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "write_args must be a list, tuple, or None" +msgstr "" -#~ msgid "Can not apply device name in the stack." -#~ msgstr "No se puede aplicar el nombre del dispositivo en el stack." +#: py/objstr.c +msgid "wrong number of arguments" +msgstr "numero erroneo de argumentos" -#~ msgid "Can not encode UUID, to check length." -#~ msgstr "No se puede codificar el UUID, para revisar la longitud." +#: py/runtime.c +msgid "wrong number of values to unpack" +msgstr "numero erroneo de valores a descomprimir" -#~ msgid "Can encode UUID into the advertisement packet." -#~ msgstr "Se puede codificar el UUID en el paquete de anuncio." +#: shared-module/displayio/Shape.c +#, fuzzy +msgid "x value out of bounds" +msgstr "address fuera de límites" -#~ msgid "Invalid Service type" -#~ msgstr "Tipo de Servicio inválido" +#: shared-bindings/displayio/Shape.c +msgid "y should be an int" +msgstr "y deberia ser un int" -#~ msgid "Can not add Service." -#~ msgstr "No se puede agregar el Servicio." +#: shared-module/displayio/Shape.c +#, fuzzy +msgid "y value out of bounds" +msgstr "address fuera de límites" -#~ msgid "Can not query for the device address." -#~ msgstr "No se puede consultar la dirección del dispositivo." +#: py/objrange.c +msgid "zero step" +msgstr "paso cero" -#~ msgid "Baud rate too high for this SPI peripheral" -#~ msgstr "Baud rate demasiado alto para este periférico SPI" +#, fuzzy +#~ msgid "Failed to notify or indicate attribute value, err %0x04x" +#~ msgstr "No se puede notificar el valor del anuncio. status: 0x%02x" -#~ msgid "Can not apply advertisement data. status: 0x%02x" -#~ msgstr "No se puede aplicar los datos de anuncio. status: 0x%02x" +#, fuzzy +#~ msgid "Failed to read attribute value, err %0x04x" +#~ msgstr "No se puede leer el valor del atributo. status 0x%02x" -#~ msgid "Cannot set PPCP parameters." -#~ msgstr "No se pueden establecer los parámetros PPCP." +#~ msgid "Function requires lock." +#~ msgstr "La función requiere lock" -#~ msgid "" -#~ "enough power for the whole circuit and press reset (after ejecting " -#~ "CIRCUITPY).\n" -#~ msgstr "" -#~ "suficiente poder para todo el circuito y presiona reset (después de " -#~ "expulsar CIRCUITPY).\n" +#~ msgid "Only Windows format, uncompressed BMP supported %d" +#~ msgstr "Solo formato Windows, BMP sin comprimir soportado %d" -#~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n" -#~ msgstr "" -#~ "Parece que nuestro código CircuitPython dejó de funcionar. Whoops!\n" +#~ msgid "Only true color (24 bpp or higher) BMP supported %x" +#~ msgstr "Solo color verdadero (24 bpp o superior) BMP admitido %x" -#, fuzzy -#~ msgid "" -#~ "Please file an issue here with the contents of your CIRCUITPY drive:\n" -#~ msgstr "" -#~ "Por favor registra un issue en la siguiente URL con el contenidos de tu " -#~ "unidad de almacenamiento CIRCUITPY:\n" +#~ msgid "position must be 2-tuple" +#~ msgstr "posición debe ser 2-tuple" diff --git a/locale/fil.po b/locale/fil.po index 53ca5d22a..230a09597 100644 --- a/locale/fil.po +++ b/locale/fil.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-12-26 20:49+0100\n" +"POT-Creation-Date: 2019-03-25 19:40+0100\n" "PO-Revision-Date: 2018-12-20 22:15-0800\n" "Last-Translator: Timothy <me@timothygarcia.ca>\n" "Language-Team: fil\n" @@ -17,2636 +17,2919 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.1.1\n" -#: extmod/machine_i2c.c:299 -msgid "invalid I2C peripheral" -msgstr "maling I2C peripheral" +#: main.c +msgid "" +"\n" +"Code done running. Waiting for reload.\n" +msgstr "" -#: extmod/machine_i2c.c:340 extmod/machine_i2c.c:354 extmod/machine_i2c.c:368 -#: extmod/machine_i2c.c:392 -msgid "I2C operation not supported" -msgstr "Hindi supportado ang operasyong I2C" +#: py/obj.c +msgid " File \"%q\"" +msgstr " File \"%q\"" -#: extmod/machine_mem.c:45 ports/unix/modmachine.c:53 +#: py/obj.c +msgid " File \"%q\", line %d" +msgstr " File \"%q\", line %d" + +#: main.c +msgid " output:\n" +msgstr " output:\n" + +#: py/objstr.c #, c-format -msgid "address %08x is not aligned to %d bytes" -msgstr "address %08x ay hindi pantay sa %d bytes" +msgid "%%c requires int or char" +msgstr "%%c nangangailangan ng int o char" -#: extmod/machine_spi.c:57 -msgid "invalid SPI peripheral" -msgstr "hindi wastong SPI peripheral" +#: shared-bindings/microcontroller/Pin.c +msgid "%q in use" +msgstr "%q ay ginagamit" -#: extmod/machine_spi.c:124 -msgid "buffers must be the same length" -msgstr "ang buffers ay dapat parehas sa haba" +#: py/obj.c +msgid "%q index out of range" +msgstr "%q indeks wala sa sakop" -#: extmod/machine_spi.c:207 -msgid "bits must be 8" -msgstr "bits ay dapat walo (8)" +#: py/obj.c +msgid "%q indices must be integers, not %s" +msgstr "%q indeks ay dapat integers, hindi %s" -#: extmod/machine_spi.c:210 -msgid "firstbit must be MSB" -msgstr "firstbit ay dapat MSB" +#: shared-bindings/displayio/Group.c shared-bindings/displayio/Shape.c +#: shared-bindings/bleio/CharacteristicBuffer.c +#, fuzzy +msgid "%q must be >= 1" +msgstr "aarehas na haba dapat ang buffer slices" -#: extmod/machine_spi.c:215 -msgid "must specify all of sck/mosi/miso" -msgstr "dapat tukuyin lahat ng SCK/MOSI/MISO" +#: shared-bindings/fontio/BuiltinFont.c +#, fuzzy +msgid "%q should be an int" +msgstr "y ay dapat int" -#: extmod/modframebuf.c:299 -msgid "invalid format" -msgstr "hindi wastong pag-format" +#: py/objnamedtuple.c py/bc.c +msgid "%q() takes %d positional arguments but %d were given" +msgstr "" +"Ang %q() ay kumukuha ng %d positional arguments pero %d lang ang binigay" -#: extmod/modubinascii.c:38 extmod/moduhashlib.c:102 -msgid "a bytes-like object is required" -msgstr "a bytes-like object ay kailangan" +#: py/argcheck.c +msgid "'%q' argument required" +msgstr "'%q' argument kailangan" -#: extmod/modubinascii.c:90 -msgid "odd-length string" -msgstr "odd-length string" +#: py/emitinlinextensa.c py/emitinlinethumb.c +#, c-format +msgid "'%s' expects a label" +msgstr "'%s' umaasa ng label" -#: extmod/modubinascii.c:101 -msgid "non-hex digit found" -msgstr "non-hex digit nahanap" +#: py/emitinlinextensa.c py/emitinlinethumb.c +#, c-format +msgid "'%s' expects a register" +msgstr "Inaasahan ng '%s' ang isang rehistro" -#: extmod/modubinascii.c:169 -msgid "incorrect padding" -msgstr "mali ang padding" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects a special register" +msgstr "Inaasahan ng '%s' ang isang espesyal na register" -#: extmod/moductypes.c:122 -msgid "syntax error in uctypes descriptor" -msgstr "may pagkakamali sa sintaks sa uctypes descriptor" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects an FPU register" +msgstr "Inaasahan ng '%s' ang isang FPU register" -#: extmod/moductypes.c:219 -msgid "Cannot unambiguously get sizeof scalar" -msgstr "Hindi puedeng hindi sigurado ang get sizeof scalar" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects an address of the form [a, b]" +msgstr "Inaasahan ng '%s' ang isang address sa [a, b]" -#: extmod/moductypes.c:397 -msgid "struct: no fields" -msgstr "struct: walang fields" +#: py/emitinlinextensa.c py/emitinlinethumb.c +#, c-format +msgid "'%s' expects an integer" +msgstr "Inaasahan ng '%s' ang isang integer" -#: extmod/moductypes.c:530 -msgid "struct: cannot index" -msgstr "struct: hindi ma-index" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects at most r%d" +msgstr "Inaasahan ng '%s' ang hangang r%d" -#: extmod/moductypes.c:544 -msgid "struct: index out of range" -msgstr "struct: index hindi maabot" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects {r0, r1, ...}" +msgstr "Inaasahan ng '%s' ay {r0, r1, …}" -#: extmod/moduheapq.c:38 -msgid "heap must be a list" -msgstr "list dapat ang heap" +#: py/emitinlinextensa.c +#, c-format +msgid "'%s' integer %d is not within range %d..%d" +msgstr "'%s' integer %d ay wala sa sakop ng %d..%d" -#: extmod/moduheapq.c:86 extmod/modutimeq.c:147 extmod/modutimeq.c:172 -msgid "empty heap" -msgstr "walang laman ang heap" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' integer 0x%x does not fit in mask 0x%x" +msgstr "'%s' integer 0x%x ay wala sa mask na sakop ng 0x%x" -#: extmod/modujson.c:281 -msgid "syntax error in JSON" -msgstr "sintaks error sa JSON" +#: py/obj.c +#, c-format +msgid "'%s' object does not support item assignment" +msgstr "'%s' object hindi sumusuporta ng item assignment" -#: extmod/modure.c:161 -msgid "Splitting with sub-captures" -msgstr "Binibiyak gamit ang sub-captures" +#: py/obj.c +#, c-format +msgid "'%s' object does not support item deletion" +msgstr "'%s' object ay hindi sumusuporta sa pagtanggal ng item" -#: extmod/modure.c:207 -msgid "Error in regex" -msgstr "May pagkakamali sa REGEX" +#: py/runtime.c +msgid "'%s' object has no attribute '%q'" +msgstr "'%s' object ay walang attribute '%q'" -#: extmod/modussl_axtls.c:81 -msgid "invalid key" -msgstr "mali ang key" +#: py/runtime.c +#, c-format +msgid "'%s' object is not an iterator" +msgstr "'%s' object ay hindi iterator" -#: extmod/modussl_axtls.c:87 -msgid "invalid cert" -msgstr "mali ang cert" +#: py/objtype.c py/runtime.c +#, c-format +msgid "'%s' object is not callable" +msgstr "'%s' object hindi matatawag" -#: extmod/modutimeq.c:131 -msgid "queue overflow" -msgstr "puno na ang pila (overflow)" +#: py/runtime.c +#, c-format +msgid "'%s' object is not iterable" +msgstr "'%s' object ay hindi ma i-iterable" -#: extmod/moduzlib.c:98 -msgid "compression header" -msgstr "compression header" +#: py/obj.c +#, c-format +msgid "'%s' object is not subscriptable" +msgstr "'%s' object ay hindi maaaring i-subscript" -#: extmod/uos_dupterm.c:120 -msgid "invalid dupterm index" -msgstr "mali ang dupterm index" +#: py/objstr.c +msgid "'=' alignment not allowed in string format specifier" +msgstr "'=' Gindi pinapayagan ang alignment sa pag specify ng string format" -#: extmod/vfs_fat.c:426 py/moduerrno.c:154 -msgid "Read-only filesystem" -msgstr "Basahin-lamang mode" +#: shared-module/struct/__init__.c +msgid "'S' and 'O' are not supported format types" +msgstr "Ang 'S' at 'O' ay hindi suportadong uri ng format" -#: extmod/vfs_posix_file.c:48 ports/unix/file.c:50 py/objstringio.c:43 -msgid "I/O operation on closed file" -msgstr "I/O operasyon sa saradong file" +#: py/compile.c +msgid "'align' requires 1 argument" +msgstr "'align' kailangan ng 1 argument" -#: lib/embed/abort_.c:8 -msgid "abort() called" -msgstr "abort() tinawag" +#: py/compile.c +msgid "'await' outside function" +msgstr "'await' sa labas ng function" -#: lib/netutils/netutils.c:83 -msgid "invalid arguments" -msgstr "mali ang mga argumento" +#: py/compile.c +msgid "'break' outside loop" +msgstr "'break' sa labas ng loop" -#: lib/utils/pyexec.c:97 py/builtinimport.c:251 -msgid "script compilation not supported" -msgstr "script kompilasyon hindi supportado" +#: py/compile.c +msgid "'continue' outside loop" +msgstr "'continue' sa labas ng loop" -#: main.c:150 -msgid " output:\n" -msgstr " output:\n" +#: py/compile.c +msgid "'data' requires at least 2 arguments" +msgstr "'data' kailangan ng hindi bababa sa 2 argument" -#: main.c:164 main.c:237 -msgid "" -"Auto-reload is on. Simply save files over USB to run them or enter REPL to " -"disable.\n" -msgstr "" -"Ang awtomatikong pag re-reload ay ON. i-save lamang ang mga files sa USB " -"para patakbuhin sila o pasukin ang REPL para i-disable ito.\n" +#: py/compile.c +msgid "'data' requires integer arguments" +msgstr "'data' kailangan ng integer arguments" -#: main.c:166 -msgid "Running in safe mode! Auto-reload is off.\n" -msgstr "Tumatakbo sa safe mode! Awtomatikong pag re-reload ay OFF.\n" +#: py/compile.c +msgid "'label' requires 1 argument" +msgstr "'label' kailangan ng 1 argument" -#: main.c:168 main.c:239 -msgid "Auto-reload is off.\n" -msgstr "Awtomatikong pag re-reload ay OFF.\n" +#: py/compile.c +msgid "'return' outside function" +msgstr "'return' sa labas ng function" -#: main.c:182 -msgid "Running in safe mode! Not running saved code.\n" -msgstr "Tumatakbo sa safe mode! Hindi tumatakbo ang nai-save na code.\n" +#: py/compile.c +msgid "'yield' outside function" +msgstr "'yield' sa labas ng function" -#: main.c:198 -msgid "WARNING: Your code filename has two extensions\n" -msgstr "BABALA: Ang pangalan ng file ay may dalawang extension\n" +#: py/compile.c +msgid "*x must be assignment target" +msgstr "*x ay dapat na assignment target" -#: main.c:244 -msgid "Press any key to enter the REPL. Use CTRL-D to reload." +#: py/obj.c +msgid ", in %q\n" +msgstr ", sa %q\n" + +#: py/objcomplex.c +msgid "0.0 to a complex power" +msgstr "0.0 para sa complex power" + +#: py/modbuiltins.c +msgid "3-arg pow() not supported" +msgstr "3-arg pow() hindi suportado" + +#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c +msgid "A hardware interrupt channel is already in use" +msgstr "Isang channel ng hardware interrupt ay ginagamit na" + +#: ports/esp8266/modnetwork.c +msgid "AP required" +msgstr "AP kailangan" + +#: shared-bindings/bleio/Address.c +#, c-format +msgid "Address is not %d bytes long or is in wrong format" msgstr "" -"Pindutin ang anumang key upang pumasok sa REPL. Gamitin ang CTRL-D upang i-" -"reload." -#: main.c:407 -msgid "soft reboot\n" -msgstr "malambot na reboot\n" +#: shared-bindings/bleio/Address.c +#, fuzzy, c-format +msgid "Address must be %d bytes long" +msgstr "ang palette ay dapat 32 bytes ang haba" -#: ports/atmel-samd/audio_dma.c:209 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:361 -msgid "All sync event channels in use" -msgstr "Lahat ng sync event channels ay ginagamit" +#: ports/nrf/common-hal/busio/I2C.c +msgid "All I2C peripherals are in use" +msgstr "Lahat ng I2C peripherals ginagamit" -#: ports/atmel-samd/bindings/samd/Clock.c:135 -msgid "calibration is read only" -msgstr "pagkakalibrate ay basahin lamang" +#: ports/nrf/common-hal/busio/SPI.c +msgid "All SPI peripherals are in use" +msgstr "Lahat ng SPI peripherals ay ginagamit" -#: ports/atmel-samd/bindings/samd/Clock.c:137 -msgid "calibration is out of range" -msgstr "kalibrasion ay wala sa sakop" +#: ports/nrf/common-hal/busio/UART.c +#, fuzzy +msgid "All UART peripherals are in use" +msgstr "Lahat ng I2C peripherals ginagamit" -#: ports/atmel-samd/board_busses.c:59 ports/nrf/board_busses.c:39 -msgid "No default I2C bus" -msgstr "Walang default na I2C bus" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "All event channels in use" +msgstr "Lahat ng event channels ginagamit" -#: ports/atmel-samd/board_busses.c:85 ports/nrf/board_busses.c:64 -msgid "No default SPI bus" -msgstr "Walang default SPI bus" +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c ports/atmel-samd/audio_dma.c +msgid "All sync event channels in use" +msgstr "Lahat ng sync event channels ay ginagamit" -#: ports/atmel-samd/board_busses.c:112 ports/nrf/board_busses.c:91 -msgid "No default UART bus" -msgstr "Walang default UART bus" +#: shared-bindings/pulseio/PWMOut.c +msgid "All timers for this pin are in use" +msgstr "Lahat ng timers para sa pin na ito ay ginagamit" -#: ports/atmel-samd/common-hal/analogio/AnalogIn.c:63 -#: ports/nrf/common-hal/analogio/AnalogIn.c:39 -msgid "Pin does not have ADC capabilities" -msgstr "Ang pin ay walang kakayahan sa ADC" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/pulseio/PulseOut.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c +#: shared-module/_pew/PewPew.c +msgid "All timers in use" +msgstr "Lahat ng timer ginagamit" -#: ports/atmel-samd/common-hal/analogio/AnalogOut.c:49 -msgid "No DAC on chip" -msgstr "Walang DAC sa chip" +#: ports/nrf/common-hal/analogio/AnalogOut.c +msgid "AnalogOut functionality not supported" +msgstr "Hindi supportado ang AnalogOut" -#: ports/atmel-samd/common-hal/analogio/AnalogOut.c:56 +#: shared-bindings/analogio/AnalogOut.c +msgid "AnalogOut is only 16 bits. Value must be less than 65536." +msgstr "AnalogOut ay 16 bits. Value ay dapat hindi hihigit pa sa 65536." + +#: ports/atmel-samd/common-hal/analogio/AnalogOut.c msgid "AnalogOut not supported on given pin" msgstr "Hindi supportado ang AnalogOut sa ibinigay na pin" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:147 -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:150 -msgid "Invalid bit clock pin" -msgstr "Mali ang bit clock pin" +#: ports/atmel-samd/common-hal/pulseio/PulseOut.c +msgid "Another send is already active" +msgstr "Isa pang send ay aktibo na" + +#: shared-bindings/pulseio/PulseOut.c +msgid "Array must contain halfwords (type 'H')" +msgstr "May halfwords (type 'H') dapat ang array" + +#: shared-bindings/nvm/ByteArray.c +msgid "Array values should be single bytes." +msgstr "Array values ay dapat single bytes." + +#: supervisor/shared/safe_mode.c +msgid "Attempted heap allocation when MicroPython VM not running.\n" +msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:153 +#: main.c +msgid "Auto-reload is off.\n" +msgstr "Awtomatikong pag re-reload ay OFF.\n" + +#: main.c +msgid "" +"Auto-reload is on. Simply save files over USB to run them or enter REPL to " +"disable.\n" +msgstr "" +"Ang awtomatikong pag re-reload ay ON. i-save lamang ang mga files sa USB " +"para patakbuhin sila o pasukin ang REPL para i-disable ito.\n" + +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c msgid "Bit clock and word select must share a clock unit" msgstr "Ang bit clock at word select dapat makibahagi sa isang clock unit" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:156 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:130 -msgid "Invalid data pin" -msgstr "Mali ang data pin" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Bit depth must be multiple of 8." +msgstr "Bit depth ay dapat multiple ng 8." -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:169 -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:174 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:145 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:150 -msgid "Serializer in use" -msgstr "Serializer ginagamit" +#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c +msgid "Both pins must support hardware interrupts" +msgstr "Ang parehong mga pin ay dapat na sumusuporta sa hardware interrupts" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:230 -msgid "Clock unit in use" -msgstr "Clock unit ginagamit" +#: shared-bindings/supervisor/__init__.c +msgid "Brightness must be between 0 and 255" +msgstr "Ang liwanag ay dapat sa gitna ng 0 o 255" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:240 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:172 -msgid "Unable to find free GCLK" -msgstr "Hindi mahanap ang libreng GCLK" +#: shared-bindings/displayio/Display.c +msgid "Brightness not adjustable" +msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:254 -msgid "Too many channels in sample." -msgstr "Sobra ang channels sa sample." +#: shared-module/usb_hid/Device.c +#, c-format +msgid "Buffer incorrect size. Should be %d bytes." +msgstr "Mali ang size ng buffer. Dapat %d bytes." -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:305 -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:417 -msgid "No DMA channel found" -msgstr "Walang DMA channel na mahanap" +#: shared-bindings/bitbangio/I2C.c shared-bindings/busio/I2C.c +msgid "Buffer must be at least length 1" +msgstr "Buffer dapat ay hindi baba sa 1 na haba" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:308 -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:419 -msgid "Unable to allocate buffers for signed conversion" -msgstr "Hindi ma-allocate ang buffers para sa naka-sign na conversion" +#: ports/atmel-samd/common-hal/displayio/ParallelBus.c +#: ports/nrf/common-hal/displayio/ParallelBus.c +#, fuzzy, c-format +msgid "Bus pin %d is already in use" +msgstr "Ginagamit na ang DAC" -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:109 -msgid "Invalid clock pin" -msgstr "Mali ang clock pin" +#: shared-bindings/bleio/UUID.c +#, fuzzy +msgid "Byte buffer must be 16 bytes." +msgstr "buffer ay dapat bytes-like object" -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:134 -msgid "Only 8 or 16 bit mono with " -msgstr "Tanging 8 o 16 na bit mono na may " +#: shared-bindings/nvm/ByteArray.c +msgid "Bytes must be between 0 and 255." +msgstr "Sa gitna ng 0 o 255 dapat ang bytes." -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:167 -msgid "sampling rate out of range" -msgstr "pagpili ng rate wala sa sakop" +#: ports/esp8266/esp_mphal.c +msgid "C-level assert" +msgstr "C-level assert" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:132 -msgid "DAC already in use" -msgstr "Ginagamit na ang DAC" +#: shared-bindings/_pixelbuf/PixelBuf.c +#, c-format +msgid "Can not use dotstar with %s" +msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:136 -msgid "Right channel unsupported" -msgstr "Hindi supportado ang kanang channel" +#: shared-bindings/bleio/Device.c +msgid "Can't add services in Central mode" +msgstr "Hindi maarang maglagay ng service sa Central mode" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:139 -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:116 -#: ports/atmel-samd/common-hal/touchio/TouchIn.c:65 -msgid "Invalid pin" -msgstr "Mali ang pin" +#: shared-bindings/bleio/Device.c +msgid "Can't advertise in Central mode" +msgstr "Hindi ma advertise habang nasa Central mode" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:147 -msgid "Invalid pin for left channel" -msgstr "Mali ang pin para sa kaliwang channel" +#: shared-bindings/bleio/Device.c +msgid "Can't change the name in Central mode" +msgstr "Hindi mapalitan ang pangalan sa Central mode" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:151 -msgid "Invalid pin for right channel" -msgstr "Mali ang pin para sa kanang channel" +#: shared-bindings/bleio/Device.c +msgid "Can't connect in Peripheral mode" +msgstr "Hindi maconnect sa Peripheral mode" + +#: ports/esp8266/modnetwork.c +msgid "Cannot connect to AP" +msgstr "Hindi maka connect sa AP" + +#: shared-bindings/displayio/Bitmap.c shared-bindings/pulseio/PulseIn.c +msgid "Cannot delete values" +msgstr "Hindi mabura ang values" + +#: ports/esp8266/modnetwork.c +msgid "Cannot disconnect from AP" +msgstr "Hindi ma disconnect sa AP" + +#: ports/atmel-samd/common-hal/digitalio/DigitalInOut.c +#: ports/nrf/common-hal/digitalio/DigitalInOut.c +msgid "Cannot get pull while in output mode" +msgstr "Hindi makakakuha ng pull habang nasa output mode" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:154 +#: ports/nrf/common-hal/microcontroller/Processor.c +#, fuzzy +msgid "Cannot get temperature" +msgstr "Hindi makuha ang temperatura. status 0x%02x" + +#: ports/atmel-samd/common-hal/audioio/AudioOut.c msgid "Cannot output both channels on the same pin" msgstr "Hindi maaaring output ang mga parehong channel sa parehong pin" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:243 -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:189 -#: ports/atmel-samd/common-hal/pulseio/PulseOut.c:110 -#: ports/nrf/common-hal/pulseio/PulseOut.c:107 -msgid "All timers in use" -msgstr "Lahat ng timer ginagamit" +#: shared-module/bitbangio/SPI.c +msgid "Cannot read without MISO pin." +msgstr "Hindi maaring mabasa kapag walang MISO pin." -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:285 -msgid "All event channels in use" -msgstr "Lahat ng event channels ginagamit" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Cannot record to a file" +msgstr "Hindi ma-record sa isang file" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:375 -#, c-format -msgid "Sample rate too high. It must be less than %d" -msgstr "Sample rate ay masyadong mataas. Ito ay dapat hindi hiigit sa %d" +#: shared-module/storage/__init__.c +msgid "Cannot remount '/' when USB is active." +msgstr "Hindi ma-remount '/' kapag aktibo ang USB." -#: ports/atmel-samd/common-hal/busio/I2C.c:71 -msgid "Not enough pins available" -msgstr "Hindi sapat ang magagamit na pins" +#: ports/atmel-samd/common-hal/microcontroller/__init__.c +#: ports/esp8266/common-hal/microcontroller/__init__.c +msgid "Cannot reset into bootloader because no bootloader is present." +msgstr "Hindi ma-reset sa bootloader dahil walang bootloader." -#: ports/atmel-samd/common-hal/busio/I2C.c:78 -#: ports/atmel-samd/common-hal/busio/SPI.c:171 -#: ports/atmel-samd/common-hal/busio/UART.c:120 -#: ports/atmel-samd/common-hal/i2cslave/I2CSlave.c:45 -#: ports/nrf/common-hal/busio/I2C.c:82 -msgid "Invalid pins" -msgstr "Mali ang pins" +#: ports/esp8266/modnetwork.c +msgid "Cannot set STA config" +msgstr "Hindi ma-set ang STA Config" -#: ports/atmel-samd/common-hal/busio/I2C.c:101 -msgid "SDA or SCL needs a pull up" -msgstr "Kailangan ng pull up resistors ang SDA o SCL" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Cannot set value when direction is input." +msgstr "Hindi ma i-set ang value kapag ang direksyon ay input." -#: ports/atmel-samd/common-hal/busio/I2C.c:121 -msgid "Unsupported baudrate" -msgstr "Hindi supportadong baudrate" +#: py/objslice.c +msgid "Cannot subclass slice" +msgstr "Hindi magawa ang sublcass slice" -#: ports/atmel-samd/common-hal/busio/UART.c:67 -msgid "bytes > 8 bits not supported" -msgstr "hindi sinusuportahan ang bytes > 8 bits" +#: shared-module/bitbangio/SPI.c +msgid "Cannot transfer without MOSI and MISO pins." +msgstr "Hindi maaaring ilipat kapag walang MOSI at MISO pin." -#: ports/atmel-samd/common-hal/busio/UART.c:73 -#: ports/nrf/common-hal/busio/UART.c:106 -msgid "tx and rx cannot both be None" -msgstr "tx at rx hindi pwedeng parehas na None" +#: extmod/moductypes.c +msgid "Cannot unambiguously get sizeof scalar" +msgstr "Hindi puedeng hindi sigurado ang get sizeof scalar" -#: ports/atmel-samd/common-hal/busio/UART.c:146 -#: ports/nrf/common-hal/busio/UART.c:140 -msgid "Failed to allocate RX buffer" -msgstr "Nabigong ilaan ang RX buffer" +#: ports/esp8266/modnetwork.c +msgid "Cannot update i/f status" +msgstr "Hindi ma-update i/f status" -#: ports/atmel-samd/common-hal/busio/UART.c:154 -msgid "Could not initialize UART" -msgstr "Hindi ma-initialize ang UART" +#: shared-module/bitbangio/SPI.c +msgid "Cannot write without MOSI pin." +msgstr "Hindi maaring isulat kapag walang MOSI pin." -#: ports/atmel-samd/common-hal/busio/UART.c:241 -#: ports/nrf/common-hal/busio/UART.c:185 -msgid "No RX pin" -msgstr "Walang RX pin" +#: shared-bindings/bleio/Service.c +msgid "Characteristic UUID doesn't match Service UUID" +msgstr "" -#: ports/atmel-samd/common-hal/busio/UART.c:300 -#: ports/nrf/common-hal/busio/UART.c:220 -msgid "No TX pin" -msgstr "Walang TX pin" +#: ports/nrf/common-hal/bleio/Service.c +msgid "Characteristic already in use by another Service." +msgstr "" -#: ports/atmel-samd/common-hal/digitalio/DigitalInOut.c:170 -#: ports/nrf/common-hal/digitalio/DigitalInOut.c:147 -msgid "Cannot get pull while in output mode" -msgstr "Hindi makakakuha ng pull habang nasa output mode" +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "CharacteristicBuffer writing not provided" +msgstr "" -#: ports/atmel-samd/common-hal/microcontroller/__init__.c:74 -#: ports/esp8266/common-hal/microcontroller/__init__.c:64 -msgid "Cannot reset into bootloader because no bootloader is present." -msgstr "Hindi ma-reset sa bootloader dahil walang bootloader." +#: shared-module/bitbangio/SPI.c +msgid "Clock pin init failed." +msgstr "Nabigo sa pag init ng Clock pin." -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:120 -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:369 -#: ports/nrf/common-hal/pulseio/PWMOut.c:119 -#: ports/nrf/common-hal/pulseio/PWMOut.c:233 -msgid "Invalid PWM frequency" -msgstr "Mali ang PWM frequency" +#: shared-module/bitbangio/I2C.c +msgid "Clock stretch too long" +msgstr "Masyadong mahaba ang Clock stretch" -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:187 -msgid "All timers for this pin are in use" -msgstr "Lahat ng timers para sa pin na ito ay ginagamit" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Clock unit in use" +msgstr "Clock unit ginagamit" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:110 -msgid "No hardware support on pin" -msgstr "Walang support sa hardware ang pin" +#: shared-bindings/_pew/PewPew.c +msgid "Column entry must be digitalio.DigitalInOut" +msgstr "" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:113 -msgid "EXTINT channel already in use" -msgstr "Ginagamit na ang EXTINT channel" +#: shared-bindings/displayio/FourWire.c shared-bindings/displayio/ParallelBus.c +#, fuzzy +msgid "Command must be an int between 0 and 255" +msgstr "Sa gitna ng 0 o 255 dapat ang bytes." -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:118 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:86 +#: ports/nrf/common-hal/bleio/UUID.c #, c-format -msgid "Failed to allocate RX buffer of %d bytes" -msgstr "Nabigong ilaan ang RX buffer ng %d bytes" +msgid "Could not decode ble_uuid, err 0x%04x" +msgstr "" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:205 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:151 -msgid "pop from an empty PulseIn" -msgstr "pop mula sa walang laman na PulseIn" +#: ports/atmel-samd/common-hal/busio/UART.c +msgid "Could not initialize UART" +msgstr "Hindi ma-initialize ang UART" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:237 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:422 -msgid "index out of range" -msgstr "index wala sa sakop" +#: shared-module/audioio/Mixer.c shared-module/audioio/WaveFile.c +msgid "Couldn't allocate first buffer" +msgstr "Hindi ma-iallocate ang first buffer" -#: ports/atmel-samd/common-hal/pulseio/PulseOut.c:178 -msgid "Another send is already active" -msgstr "Isa pang send ay aktibo na" +#: shared-module/audioio/Mixer.c shared-module/audioio/WaveFile.c +msgid "Couldn't allocate second buffer" +msgstr "Hindi ma-iallocate ang second buffer" -#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c:38 -msgid "Both pins must support hardware interrupts" -msgstr "Ang parehong mga pin ay dapat na sumusuporta sa hardware interrupts" +#: supervisor/shared/safe_mode.c +msgid "Crash into the HardFault_Handler.\n" +msgstr "Nagcrash sa HardFault_Handler.\n" -#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c:46 -msgid "A hardware interrupt channel is already in use" -msgstr "Isang channel ng hardware interrupt ay ginagamit na" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "DAC already in use" +msgstr "Ginagamit na ang DAC" -#: ports/atmel-samd/common-hal/rtc/RTC.c:101 -msgid "calibration value out of range +/-127" -msgstr "ang halaga ng pagkakalibrate ay wala sa sakop +/-127" +#: ports/atmel-samd/common-hal/displayio/ParallelBus.c +#: ports/nrf/common-hal/displayio/ParallelBus.c +#, fuzzy +msgid "Data 0 pin must be byte aligned" +msgstr "graphic ay dapat 2048 bytes ang haba" -#: ports/atmel-samd/common-hal/touchio/TouchIn.c:75 -msgid "No free GCLKs" -msgstr "Walang libreng GCLKs" +#: shared-module/audioio/WaveFile.c +msgid "Data chunk must follow fmt chunk" +msgstr "Dapat sunurin ng Data chunk ang fmt chunk" -#: ports/esp8266/common-hal/analogio/AnalogIn.c:43 -msgid "Pin %q does not have ADC capabilities" -msgstr "Walang kakayahang ADC ang pin %q" +#: ports/nrf/common-hal/bleio/Broadcaster.c +#: ports/nrf/common-hal/bleio/Peripheral.c +#, fuzzy +msgid "Data too large for advertisement packet" +msgstr "Hindi makasya ang data sa loob ng advertisement packet" -#: ports/esp8266/common-hal/analogio/AnalogOut.c:39 -msgid "No hardware support for analog out." -msgstr "Hindi supportado ng hardware ang analog out." +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Data too large for the advertisement packet" +msgstr "Hindi makasya ang data sa loob ng advertisement packet" -#: ports/esp8266/common-hal/busio/SPI.c:72 -msgid "Pins not valid for SPI" -msgstr "Mali ang pins para sa SPI" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Destination capacity is smaller than destination_length." +msgstr "" +"Ang kapasidad ng destinasyon ay mas maliit kaysa sa destination_length." -#: ports/esp8266/common-hal/busio/UART.c:45 -msgid "Only tx supported on UART1 (GPIO2)." -msgstr "Tanging suportado ang TX sa UART1 (GPIO2)." +#: shared-bindings/displayio/Display.c +msgid "Display rotation must be in 90 degree increments" +msgstr "" -#: ports/esp8266/common-hal/busio/UART.c:67 ports/esp8266/machine_uart.c:108 -msgid "invalid data bits" -msgstr "mali ang data bits" +#: ports/unix/modffi.c +msgid "Don't know how to pass object to native function" +msgstr "Hindi alam ipasa ang object sa native function" -#: ports/esp8266/common-hal/busio/UART.c:91 ports/esp8266/machine_uart.c:144 -msgid "invalid stop bits" -msgstr "mali ang stop bits" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Drive mode not used when direction is input." +msgstr "Drive mode ay hindi ginagamit kapag ang direksyon ay input." -#: ports/esp8266/common-hal/digitalio/DigitalInOut.c:200 +#: ports/esp8266/common-hal/microcontroller/__init__.c +msgid "ESP8226 does not support safe mode." +msgstr "Walang safemode support ang ESP8266." + +#: ports/esp8266/common-hal/digitalio/DigitalInOut.c msgid "ESP8266 does not support pull down." msgstr "Walang pull down support ang ESP8266." -#: ports/esp8266/common-hal/digitalio/DigitalInOut.c:210 -msgid "GPIO16 does not support pull up." -msgstr "Walang pull down support ang GPI016." +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +msgid "EXTINT channel already in use" +msgstr "Ginagamit na ang EXTINT channel" -#: ports/esp8266/common-hal/microcontroller/__init__.c:66 -msgid "ESP8226 does not support safe mode." -msgstr "Walang safemode support ang ESP8266." +#: ports/unix/modffi.c +msgid "Error in ffi_prep_cif" +msgstr "Pagkakamali sa ffi_prep_cif" -#: ports/esp8266/common-hal/pulseio/PWMOut.c:54 -#: ports/esp8266/common-hal/pulseio/PWMOut.c:113 -#, c-format -msgid "Maximum PWM frequency is %dhz." -msgstr "Pinakamataas na PWM frequency ay %dhz." +#: extmod/modure.c +msgid "Error in regex" +msgstr "May pagkakamali sa REGEX" -#: ports/esp8266/common-hal/pulseio/PWMOut.c:57 -#: ports/esp8266/common-hal/pulseio/PWMOut.c:116 -msgid "Minimum PWM frequency is 1hz." -msgstr "Pinakamababang PWM frequency ay 1hz." +#: shared-bindings/pulseio/PulseOut.c shared-bindings/neopixel_write/__init__.c +#: shared-bindings/terminalio/Terminal.c shared-bindings/microcontroller/Pin.c +msgid "Expected a %q" +msgstr "Umasa ng %q" + +#: shared-bindings/bleio/CharacteristicBuffer.c +#, fuzzy +msgid "Expected a Characteristic" +msgstr "Hindi mabasa and Characteristic." -#: ports/esp8266/common-hal/pulseio/PWMOut.c:68 +#: shared-bindings/bleio/Descriptor.c shared-bindings/bleio/Service.c +#: shared-bindings/bleio/Characteristic.c +#, fuzzy +msgid "Expected a UUID" +msgstr "Umasa ng %q" + +#: shared-module/_pixelbuf/PixelBuf.c #, c-format -msgid "Multiple PWM frequencies not supported. PWM already set to %dhz." +msgid "Expected tuple of length %d, got %d" msgstr "" -"Hindi sinusuportahan ang maraming mga PWM frequency. PWM na naka-set sa %dhz." -#: ports/esp8266/common-hal/pulseio/PWMOut.c:77 ports/esp8266/machine_pwm.c:70 +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to acquire mutex" +msgstr "Nabigo sa pag kuha ng mutex, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c ports/nrf/sd_mutex.c +#, fuzzy, c-format +msgid "Failed to acquire mutex, err 0x%04x" +msgstr "Nabigo sa pag kuha ng mutex, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Service.c +#, fuzzy, c-format +msgid "Failed to add characteristic, err 0x%04x" +msgstr "Nabigo sa paglagay ng characteristic, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to add service" +msgstr "Hindi matagumpay ang paglagay ng service, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Peripheral.c +#, fuzzy, c-format +msgid "Failed to add service, err 0x%04x" +msgstr "Hindi matagumpay ang paglagay ng service, status: 0x%08lX" + +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "Failed to allocate RX buffer" +msgstr "Nabigong ilaan ang RX buffer" + +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +#: ports/nrf/common-hal/pulseio/PulseIn.c +#: ports/esp8266/common-hal/pulseio/PulseIn.c #, c-format -msgid "PWM not supported on pin %d" -msgstr "Walang PWM support sa pin %d" +msgid "Failed to allocate RX buffer of %d bytes" +msgstr "Nabigong ilaan ang RX buffer ng %d bytes" -#: ports/esp8266/common-hal/pulseio/PulseIn.c:78 -msgid "No PulseIn support for %q" -msgstr "Walang PulseIn support sa %q" +#: ports/nrf/common-hal/bleio/Adapter.c +#, fuzzy +msgid "Failed to change softdevice state" +msgstr "Nabigo sa pagbago ng softdevice state, error: 0x%08lX" -#: ports/esp8266/common-hal/storage/__init__.c:34 -msgid "Unable to remount filesystem" -msgstr "Hindi ma-remount ang filesystem" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to connect:" +msgstr "Hindi makaconnect, status: 0x%08lX" -#: ports/esp8266/common-hal/storage/__init__.c:38 -msgid "Use esptool to erase flash and re-upload Python instead" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to continue scanning" +msgstr "Hindi maituloy ang pag scan, status: 0x%0xlX" + +#: ports/nrf/common-hal/bleio/Scanner.c +#, fuzzy, c-format +msgid "Failed to continue scanning, err 0x%04x" +msgstr "Hindi maituloy ang pag scan, status: 0x%0xlX" + +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to create mutex" +msgstr "Hindi matagumpay ang pagbuo ng mutex, status: 0x%0xlX" + +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to discover services" +msgstr "Nabigo sa pagdiscover ng services, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Adapter.c +#, fuzzy +msgid "Failed to get local address" +msgstr "Nabigo sa pagkuha ng local na address, , error: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Adapter.c +#, fuzzy +msgid "Failed to get softdevice state" +msgstr "Nabigo sa pagkuha ng softdevice state, error: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c +#, c-format +msgid "Failed to notify or indicate attribute value, err 0x%04x" msgstr "" -"Gamitin ang esptool upang burahin ang flash at muling i-upload ang Python" -#: ports/esp8266/esp_mphal.c:154 -msgid "C-level assert" -msgstr "C-level assert" +#: ports/nrf/common-hal/bleio/Characteristic.c +#, fuzzy, c-format +msgid "Failed to read CCCD value, err 0x%04x" +msgstr "Hindi mabasa ang value ng attribute, status: 0x%08lX" -#: ports/esp8266/machine_adc.c:57 +#: ports/nrf/common-hal/bleio/Characteristic.c #, c-format -msgid "not a valid ADC Channel: %d" -msgstr "hindi tamang ADC Channel: %d" +msgid "Failed to read attribute value, err 0x%04x" +msgstr "" -#: ports/esp8266/machine_hspi.c:131 ports/esp8266/machine_hspi.c:137 -msgid "impossible baudrate" -msgstr "impossibleng baudrate" +#: ports/nrf/common-hal/bleio/Characteristic.c +#, fuzzy, c-format +msgid "Failed to read gatts value, err 0x%04x" +msgstr "Hindi maisulat ang gatts value, status: 0x%08lX" -#: ports/esp8266/machine_pin.c:129 -msgid "expecting a pin" -msgstr "umaasa ng isang pin" +#: ports/nrf/common-hal/bleio/UUID.c +#, fuzzy, c-format +msgid "Failed to register Vendor-Specific UUID, err 0x%04x" +msgstr "Hindi matagumpay ang paglagay ng Vender Specific UUID, status: 0x%08lX" -#: ports/esp8266/machine_pin.c:284 -msgid "Pin(16) doesn't support pull" -msgstr "Walang pull support ang Pin(16)" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to release mutex" +msgstr "Nabigo sa pagrelease ng mutex, status: 0x%08lX" -#: ports/esp8266/machine_pin.c:323 -msgid "invalid pin" -msgstr "mali ang pin" +#: ports/nrf/common-hal/bleio/Characteristic.c ports/nrf/sd_mutex.c +#, fuzzy, c-format +msgid "Failed to release mutex, err 0x%04x" +msgstr "Nabigo sa pagrelease ng mutex, status: 0x%08lX" -#: ports/esp8266/machine_pin.c:389 -msgid "pin does not have IRQ capabilities" -msgstr "walang IRQ capabilities ang pin" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to start advertising" +msgstr "Hindi masimulaan ang advertisement, status: 0x%08lX" -#: ports/esp8266/machine_rtc.c:185 -msgid "buffer too long" -msgstr "masyadong mahaba ng buffer" +#: ports/nrf/common-hal/bleio/Broadcaster.c +#: ports/nrf/common-hal/bleio/Peripheral.c +#, fuzzy, c-format +msgid "Failed to start advertising, err 0x%04x" +msgstr "Hindi masimulaan ang advertisement, status: 0x%08lX" -#: ports/esp8266/machine_rtc.c:209 ports/esp8266/machine_rtc.c:223 -#: ports/esp8266/machine_rtc.c:246 -msgid "invalid alarm" -msgstr "mali ang alarm" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to start scanning" +msgstr "Hindi masimulaan mag i-scan, status: 0x%0xlX" -#: ports/esp8266/machine_uart.c:169 -#, c-format -msgid "UART(%d) does not exist" -msgstr "Walang UART(%d)" +#: ports/nrf/common-hal/bleio/Scanner.c +#, fuzzy, c-format +msgid "Failed to start scanning, err 0x%04x" +msgstr "Hindi masimulaan mag i-scan, status: 0x%0xlX" -#: ports/esp8266/machine_uart.c:219 -msgid "UART(1) can't read" -msgstr "Hindi mabasa ang UART(1)" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to stop advertising" +msgstr "Hindi mahinto ang advertisement, status: 0x%08lX" -#: ports/esp8266/modesp.c:119 -msgid "len must be multiple of 4" -msgstr "len ay dapat multiple ng 4" +#: ports/nrf/common-hal/bleio/Broadcaster.c +#: ports/nrf/common-hal/bleio/Peripheral.c +#, fuzzy, c-format +msgid "Failed to stop advertising, err 0x%04x" +msgstr "Hindi mahinto ang advertisement, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c +#, fuzzy, c-format +msgid "Failed to write attribute value, err 0x%04x" +msgstr "Hindi maisulat ang attribute value, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c +#, fuzzy, c-format +msgid "Failed to write gatts value, err 0x%04x" +msgstr "Hindi maisulat ang gatts value, status: 0x%08lX" + +#: py/moduerrno.c +msgid "File exists" +msgstr "Mayroong file" + +#: ports/nrf/supervisor/internal_flash.c +msgid "Flash erase failed" +msgstr "" -#: ports/esp8266/modesp.c:274 +#: ports/nrf/supervisor/internal_flash.c #, c-format -msgid "memory allocation failed, allocating %u bytes for native code" +msgid "Flash erase failed to start, err 0x%04x" msgstr "" -"nabigo ang paglalaan ng memorya, naglalaan ng %u bytes para sa native code" -#: ports/esp8266/modesp.c:317 -msgid "flash location must be below 1MByte" -msgstr "dapat na mas mababa sa 1MB ang lokasyon ng flash" +#: ports/nrf/supervisor/internal_flash.c +msgid "Flash write failed" +msgstr "" -#: ports/esp8266/modmachine.c:63 -msgid "frequency can only be either 80Mhz or 160MHz" -msgstr "ang frequency ay dapat 80Mhz or 160MHz lamang" +#: ports/nrf/supervisor/internal_flash.c +#, c-format +msgid "Flash write failed to start, err 0x%04x" +msgstr "" -#: ports/esp8266/modnetwork.c:61 -msgid "AP required" -msgstr "AP kailangan" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +msgid "Frequency captured is above capability. Capture Paused." +msgstr "" -#: ports/esp8266/modnetwork.c:61 -msgid "STA required" -msgstr "STA kailangan" +#: shared-bindings/bitbangio/SPI.c shared-bindings/bitbangio/I2C.c +#: shared-bindings/busio/SPI.c shared-bindings/busio/I2C.c +msgid "Function requires lock" +msgstr "Function nangangailangan ng lock" -#: ports/esp8266/modnetwork.c:87 -msgid "Cannot update i/f status" -msgstr "Hindi ma-update i/f status" +#: ports/esp8266/common-hal/digitalio/DigitalInOut.c +msgid "GPIO16 does not support pull up." +msgstr "Walang pull down support ang GPI016." -#: ports/esp8266/modnetwork.c:142 -msgid "Cannot set STA config" -msgstr "Hindi ma-set ang STA Config" +#: shared-module/displayio/Group.c +msgid "Group full" +msgstr "Puno ang group" -#: ports/esp8266/modnetwork.c:144 -msgid "Cannot connect to AP" -msgstr "Hindi maka connect sa AP" +#: ports/unix/file.c extmod/vfs_posix_file.c py/objstringio.c +msgid "I/O operation on closed file" +msgstr "I/O operasyon sa saradong file" -#: ports/esp8266/modnetwork.c:152 -msgid "Cannot disconnect from AP" -msgstr "Hindi ma disconnect sa AP" +#: extmod/machine_i2c.c +msgid "I2C operation not supported" +msgstr "Hindi supportado ang operasyong I2C" -#: ports/esp8266/modnetwork.c:173 -msgid "unknown status param" -msgstr "hindi alam na status param" +#: py/persistentcode.c +msgid "" +"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/" +"mpy-update for more info." +msgstr "" +".mpy file hindi compatible. Maaring i-update lahat ng .mpy files. See http://" +"adafru.it/mpy-update for more info." -#: ports/esp8266/modnetwork.c:222 -msgid "STA must be active" -msgstr "Dapat aktibo ang STA" +#: shared-bindings/_pew/PewPew.c +msgid "Incorrect buffer size" +msgstr "" -#: ports/esp8266/modnetwork.c:239 -msgid "scan failed" -msgstr "nabigo ang pag-scan" +#: py/moduerrno.c +msgid "Input/output error" +msgstr "May mali sa Input/Output" -#: ports/esp8266/modnetwork.c:306 -msgid "wifi_set_ip_info() failed" -msgstr "nabigo ang wifi_set_ip_info()" +#: shared-module/displayio/OnDiskBitmap.c +msgid "Invalid BMP file" +msgstr "Mali ang BMP file" -#: ports/esp8266/modnetwork.c:319 -msgid "either pos or kw args are allowed" -msgstr "pos o kw args ang pinahihintulutan" +#: ports/atmel-samd/common-hal/pulseio/PWMOut.c +#: ports/nrf/common-hal/pulseio/PWMOut.c shared-bindings/pulseio/PWMOut.c +msgid "Invalid PWM frequency" +msgstr "Mali ang PWM frequency" -#: ports/esp8266/modnetwork.c:329 -msgid "can't get STA config" -msgstr "hindi makuha ang STA config" +#: py/moduerrno.c +msgid "Invalid argument" +msgstr "Maling argumento" -#: ports/esp8266/modnetwork.c:331 -msgid "can't get AP config" -msgstr "hindi makuha ang AP config" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Invalid bit clock pin" +msgstr "Mali ang bit clock pin" -#: ports/esp8266/modnetwork.c:346 -msgid "invalid buffer length" -msgstr "mali ang buffer length" +#: ports/nrf/common-hal/busio/UART.c +msgid "Invalid buffer size" +msgstr "Mali ang buffer size" -#: ports/esp8266/modnetwork.c:405 -msgid "can't set STA config" -msgstr "hindi makuha ang STA config" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +msgid "Invalid capture period. Valid range: 1 - 500" +msgstr "" -#: ports/esp8266/modnetwork.c:407 -msgid "can't set AP config" -msgstr "hindi makuha ang AP config" +#: shared-bindings/audioio/Mixer.c +msgid "Invalid channel count" +msgstr "Maling bilang ng channel" -#: ports/esp8266/modnetwork.c:416 -msgid "can query only one param" -msgstr "maaaring i-query lamang ang isang param" +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Invalid clock pin" +msgstr "Mali ang clock pin" -#: ports/esp8266/modnetwork.c:469 -msgid "unknown config param" -msgstr "hindi alam na config param" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Invalid data pin" +msgstr "Mali ang data pin" -#: ports/nrf/common-hal/analogio/AnalogOut.c:37 -msgid "AnalogOut functionality not supported" -msgstr "Hindi supportado ang AnalogOut" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Invalid direction." +msgstr "Mali ang direksyon." -#: ports/nrf/common-hal/bleio/Adapter.c:41 -#, c-format -msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX" -msgstr "Soft device assert, id: 0x%08lX, pc: 0x%08lX" +#: shared-module/audioio/WaveFile.c +msgid "Invalid file" +msgstr "Mali ang file" -#: ports/nrf/common-hal/bleio/Adapter.c:125 -#, c-format -msgid "Failed to change softdevice state, error: 0x%08lX" -msgstr "Nabigo sa pagbago ng softdevice state, error: 0x%08lX" +#: shared-module/audioio/WaveFile.c +msgid "Invalid format chunk size" +msgstr "Mali ang format ng chunk size" -#: ports/nrf/common-hal/bleio/Adapter.c:135 -#, c-format -msgid "Failed to get softdevice state, error: 0x%08lX" -msgstr "Nabigo sa pagkuha ng softdevice state, error: 0x%08lX" +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "Invalid number of bits" +msgstr "Mali ang bilang ng bits" -#: ports/nrf/common-hal/bleio/Adapter.c:155 -#, c-format -msgid "Failed to get local address, error: 0x%08lX" -msgstr "Nabigo sa pagkuha ng local na address, , error: 0x%08lX" +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "Invalid phase" +msgstr "Mali ang phase" -#: ports/nrf/common-hal/bleio/Characteristic.c:52 -#, c-format -msgid "Failed to write gatts value, status: 0x%08lX" -msgstr "Hindi maisulat ang gatts value, status: 0x%08lX" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: ports/atmel-samd/common-hal/touchio/TouchIn.c +#: shared-bindings/pulseio/PWMOut.c +msgid "Invalid pin" +msgstr "Mali ang pin" -#: ports/nrf/common-hal/bleio/Characteristic.c:76 -#, c-format -msgid "Failed to notify attribute value, status: 0x%08lX" -msgstr "Hindi mabalitaan ang attribute value, status: 0x%08lX" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Invalid pin for left channel" +msgstr "Mali ang pin para sa kaliwang channel" -#: ports/nrf/common-hal/bleio/Characteristic.c:91 -#, c-format -msgid "Failed to read attribute value, status: 0x%08lX" -msgstr "Hindi mabasa ang value ng attribute, status: 0x%08lX" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Invalid pin for right channel" +msgstr "Mali ang pin para sa kanang channel" -#: ports/nrf/common-hal/bleio/Characteristic.c:119 -#: ports/nrf/common-hal/bleio/Device.c:272 -#: ports/nrf/common-hal/bleio/Device.c:307 -#, c-format -msgid "Failed to acquire mutex, status: 0x%08lX" -msgstr "Nabigo sa pag kuha ng mutex, status: 0x%08lX" +#: ports/atmel-samd/common-hal/i2cslave/I2CSlave.c +#: ports/atmel-samd/common-hal/busio/UART.c +#: ports/atmel-samd/common-hal/busio/SPI.c +#: ports/atmel-samd/common-hal/busio/I2C.c ports/nrf/common-hal/busio/I2C.c +msgid "Invalid pins" +msgstr "Mali ang pins" -#: ports/nrf/common-hal/bleio/Characteristic.c:126 -#, c-format -msgid "Failed to write attribute value, status: 0x%08lX" -msgstr "Hindi maisulat ang attribute value, status: 0x%08lX" +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "Invalid polarity" +msgstr "Mali ang polarity" -#: ports/nrf/common-hal/bleio/Characteristic.c:138 -#: ports/nrf/common-hal/bleio/Device.c:284 -#: ports/nrf/common-hal/bleio/Device.c:319 -#: ports/nrf/common-hal/bleio/Device.c:354 -#: ports/nrf/common-hal/bleio/Device.c:391 -#, c-format -msgid "Failed to release mutex, status: 0x%08lX" -msgstr "Nabigo sa pagrelease ng mutex, status: 0x%08lX" +#: shared-bindings/microcontroller/__init__.c +msgid "Invalid run mode." +msgstr "Mali ang run mode." -#: ports/nrf/common-hal/bleio/Device.c:81 -#: ports/nrf/common-hal/bleio/Device.c:114 -msgid "Can not fit data into the advertisment packet" -msgstr "Hindi makasya ang data sa loob ng advertisement packet" +#: shared-bindings/audioio/Mixer.c +msgid "Invalid voice count" +msgstr "Maling bilang ng voice" -#: ports/nrf/common-hal/bleio/Device.c:266 -#, c-format -msgid "Failed to discover serivices, status: 0x%08lX" -msgstr "Nabigo sa pagdiscover ng services, status: 0x%08lX" +#: shared-module/audioio/WaveFile.c +msgid "Invalid wave file" +msgstr "May hindi tama sa wave file" -#: ports/nrf/common-hal/bleio/Device.c:403 -#: ports/nrf/common-hal/bleio/Scanner.c:76 -#, c-format -msgid "Failed to continue scanning, status: 0x%0xlX" -msgstr "Hindi maituloy ang pag scan, status: 0x%0xlX" +#: py/compile.c +msgid "LHS of keyword arg must be an id" +msgstr "LHS ng keyword arg ay dapat na id" -#: ports/nrf/common-hal/bleio/Device.c:436 -#, c-format -msgid "Failed to connect, status: 0x%08lX" -msgstr "Hindi makaconnect, status: 0x%08lX" +#: shared-module/displayio/Group.c +msgid "Layer must be a Group or TileGrid subclass." +msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:513 -#, c-format -msgid "Failed to add service, status: 0x%08lX" -msgstr "Hindi matagumpay ang paglagay ng service, status: 0x%08lX" +#: py/objslice.c +msgid "Length must be an int" +msgstr "Haba ay dapat int" -#: ports/nrf/common-hal/bleio/Device.c:531 -#, c-format -msgid "Failed to start advertisment, status: 0x%08lX" -msgstr "Hindi masimulaan ang advertisement, status: 0x%08lX" +#: py/objslice.c +msgid "Length must be non-negative" +msgstr "Haba ay dapat hindi negatibo" -#: ports/nrf/common-hal/bleio/Device.c:549 -#, c-format -msgid "Failed to stop advertisment, status: 0x%08lX" -msgstr "Hindi mahinto ang advertisement, status: 0x%08lX" +#: supervisor/shared/safe_mode.c +msgid "" +"Looks like our core CircuitPython code crashed hard. Whoops!\n" +"Please file an issue at https://github.com/adafruit/circuitpython/issues\n" +" with the contents of your CIRCUITPY drive and this message:\n" +msgstr "" +"Mukhang ang core CircuitPython code nag crash. Ay!\n" +"Maaring mag file ng issue sa https://github.com/adafruit/circuitpython/" +"issues\n" +"kasama ng laman ng iyong CIRCUITPY drive at ang message na ito:\n" -#: ports/nrf/common-hal/bleio/Device.c:575 -#: ports/nrf/common-hal/bleio/Scanner.c:103 -#, c-format -msgid "Failed to start scanning, status: 0x%0xlX" -msgstr "Hindi masimulaan mag i-scan, status: 0x%0xlX" +#: shared-module/bitbangio/SPI.c +msgid "MISO pin init failed." +msgstr "Hindi ma-initialize ang MISO pin." -#: ports/nrf/common-hal/bleio/Device.c:592 -#, c-format -msgid "Failed to create mutex, status: 0x%0xlX" -msgstr "Hindi matagumpay ang pagbuo ng mutex, status: 0x%0xlX" +#: shared-module/bitbangio/SPI.c +msgid "MOSI pin init failed." +msgstr "Hindi ma-initialize ang MOSI pin." -#: ports/nrf/common-hal/bleio/Service.c:83 +#: ports/esp8266/common-hal/pulseio/PWMOut.c #, c-format -msgid "Failed to add characteristic, status: 0x%08lX" -msgstr "Nabigo sa paglagay ng characteristic, status: 0x%08lX" +msgid "Maximum PWM frequency is %dhz." +msgstr "Pinakamataas na PWM frequency ay %dhz." -#: ports/nrf/common-hal/bleio/UUID.c:97 +#: shared-module/displayio/Shape.c #, c-format -msgid "Failed to add Vendor Specific UUID, status: 0x%08lX" -msgstr "Hindi matagumpay ang paglagay ng Vender Specific UUID, status: 0x%08lX" +msgid "Maximum x value when mirrored is %d" +msgstr "" -#: ports/nrf/common-hal/bleio/UUID.c:102 -msgid "Invalid UUID string length" -msgstr "Mali ang UUID string length" +#: supervisor/shared/safe_mode.c +msgid "MicroPython NLR jump failed. Likely memory corruption.\n" +msgstr "CircuitPython NLR jump nabigo. Maaring memory corruption.\n" -#: ports/nrf/common-hal/bleio/UUID.c:109 -#: shared-bindings/bleio/Characteristic.c:125 -#: shared-bindings/bleio/Service.c:105 -msgid "Invalid UUID parameter" -msgstr "Mali ang UUID parameter" +#: supervisor/shared/safe_mode.c +msgid "MicroPython fatal error.\n" +msgstr "CircuitPython fatal na pagkakamali.\n" -#: ports/nrf/common-hal/busio/I2C.c:96 -msgid "All I2C peripherals are in use" -msgstr "Lahat ng I2C peripherals ginagamit" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Microphone startup delay must be in range 0.0 to 1.0" +msgstr "Ang delay ng startup ng mikropono ay dapat na nasa 0.0 hanggang 1.0" -#: ports/nrf/common-hal/busio/SPI.c:133 -msgid "All SPI peripherals are in use" -msgstr "Lahat ng SPI peripherals ay ginagamit" +#: ports/esp8266/common-hal/pulseio/PWMOut.c +msgid "Minimum PWM frequency is 1hz." +msgstr "Pinakamababang PWM frequency ay 1hz." -#: ports/nrf/common-hal/busio/UART.c:49 +#: ports/esp8266/common-hal/pulseio/PWMOut.c #, c-format -msgid "error = 0x%08lX" -msgstr "error = 0x%08lX" +msgid "Multiple PWM frequencies not supported. PWM already set to %dhz." +msgstr "" +"Hindi sinusuportahan ang maraming mga PWM frequency. PWM na naka-set sa %dhz." -#: ports/nrf/common-hal/busio/UART.c:110 -msgid "Invalid buffer size" -msgstr "Mali ang buffer size" +#: shared-bindings/displayio/Display.c +msgid "Must be a Group subclass." +msgstr "" -#: ports/nrf/common-hal/busio/UART.c:114 -msgid "Odd parity is not supported" -msgstr "Odd na parity ay hindi supportado" +#: ports/atmel-samd/common-hal/analogio/AnalogOut.c +msgid "No DAC on chip" +msgstr "Walang DAC sa chip" + +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "No DMA channel found" +msgstr "Walang DMA channel na mahanap" -#: ports/nrf/common-hal/busio/UART.c:346 ports/nrf/common-hal/busio/UART.c:350 -#: ports/nrf/common-hal/busio/UART.c:355 ports/nrf/common-hal/busio/UART.c:360 -#: ports/nrf/common-hal/busio/UART.c:366 ports/nrf/common-hal/busio/UART.c:371 -#: ports/nrf/common-hal/busio/UART.c:376 ports/nrf/common-hal/busio/UART.c:380 -#: ports/nrf/common-hal/busio/UART.c:388 -msgid "busio.UART not available" -msgstr "busio.UART hindi available" +#: ports/esp8266/common-hal/pulseio/PulseIn.c +msgid "No PulseIn support for %q" +msgstr "Walang PulseIn support sa %q" -#: ports/nrf/common-hal/microcontroller/Processor.c:49 -#, c-format -msgid "Can not get temperature. status: 0x%02x" -msgstr "Hindi makuha ang temperatura. status 0x%02x" +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "No RX pin" +msgstr "Walang RX pin" -#: ports/nrf/common-hal/pulseio/PWMOut.c:161 -msgid "All PWM peripherals are in use" -msgstr "Lahat ng PWM peripherals ay ginagamit" +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "No TX pin" +msgstr "Walang TX pin" -#: ports/unix/modffi.c:138 -msgid "Unknown type" -msgstr "Hindi alam ang type" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +msgid "No available clocks" +msgstr "" -#: ports/unix/modffi.c:207 ports/unix/modffi.c:265 -msgid "Error in ffi_prep_cif" -msgstr "Pagkakamali sa ffi_prep_cif" +#: supervisor/shared/board_busses.c +msgid "No default I2C bus" +msgstr "Walang default na I2C bus" -#: ports/unix/modffi.c:270 -msgid "ffi_prep_closure_loc" -msgstr "ffi_prep_closure_loc" +#: supervisor/shared/board_busses.c +msgid "No default SPI bus" +msgstr "Walang default SPI bus" -#: ports/unix/modffi.c:413 -msgid "Don't know how to pass object to native function" -msgstr "Hindi alam ipasa ang object sa native function" +#: supervisor/shared/board_busses.c +msgid "No default UART bus" +msgstr "Walang default UART bus" -#: ports/unix/modusocket.c:474 -#, c-format -msgid "[addrinfo error %d]" -msgstr "[addrinfo error %d]" +#: ports/atmel-samd/common-hal/touchio/TouchIn.c +msgid "No free GCLKs" +msgstr "Walang libreng GCLKs" -#: py/argcheck.c:44 -msgid "function does not take keyword arguments" -msgstr "ang function ay hindi kumukuha ng mga argumento ng keyword" +#: shared-bindings/os/__init__.c +msgid "No hardware random available" +msgstr "Walang magagamit na hardware random" -#: py/argcheck.c:54 py/bc.c:85 py/objnamedtuple.c:104 -#, c-format -msgid "function takes %d positional arguments but %d were given" +#: ports/esp8266/common-hal/analogio/AnalogOut.c +msgid "No hardware support for analog out." +msgstr "Hindi supportado ng hardware ang analog out." + +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +msgid "No hardware support on pin" +msgstr "Walang support sa hardware ang pin" + +#: py/moduerrno.c +msgid "No space left on device" msgstr "" -"ang function ay kumuhuha ng %d positional arguments ngunit %d ang ibinigay" -#: py/argcheck.c:64 -#, c-format -msgid "function missing %d required positional arguments" -msgstr "function kulang ng %d required na positional arguments" +#: py/moduerrno.c +msgid "No such file/directory" +msgstr "Walang file/directory" -#: py/argcheck.c:72 -#, c-format -msgid "function expected at most %d arguments, got %d" -msgstr "function na inaasahang %d ang argumento, ngunit %d ang nakuha" +#: shared-bindings/bleio/CharacteristicBuffer.c +#, fuzzy +msgid "Not connected" +msgstr "Hindi maka connect sa AP" -#: py/argcheck.c:97 -msgid "'%q' argument required" -msgstr "'%q' argument kailangan" +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "Not connected." +msgstr "" -#: py/argcheck.c:122 -msgid "extra positional arguments given" -msgstr "dagdag na positional argument na ibinigay" +#: shared-bindings/audiobusio/I2SOut.c shared-bindings/audioio/AudioOut.c +msgid "Not playing" +msgstr "Hindi playing" -#: py/argcheck.c:130 -msgid "extra keyword arguments given" -msgstr "dagdag na keyword argument na ibinigay" +#: shared-bindings/util.c +msgid "" +"Object has been deinitialized and can no longer be used. Create a new object." +msgstr "" +"Object ay deinitialized at hindi na magagamit. Lumikha ng isang bagong " +"Object." -#: py/argcheck.c:142 -msgid "argument num/types mismatch" -msgstr "hindi tugma ang argument num/types" +#: ports/nrf/common-hal/busio/UART.c +msgid "Odd parity is not supported" +msgstr "Odd na parity ay hindi supportado" -#: py/argcheck.c:147 -msgid "keyword argument(s) not yet implemented - use normal args instead" +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Only 8 or 16 bit mono with " +msgstr "Tanging 8 o 16 na bit mono na may " + +#: shared-module/displayio/OnDiskBitmap.c +#, c-format +msgid "" +"Only Windows format, uncompressed BMP supported: given header size is %d" msgstr "" -"kindi pa ipinapatupad ang (mga) argument(s) ng keyword - gumamit ng normal " -"args" -#: py/bc.c:88 py/objnamedtuple.c:108 -msgid "%q() takes %d positional arguments but %d were given" +#: shared-module/displayio/Bitmap.c +msgid "Only bit maps of 8 bit color or less are supported" +msgstr "Tanging bit maps na may 8 bit color o mas mababa ang supportado" + +#: shared-module/displayio/OnDiskBitmap.c +#, c-format +msgid "" +"Only monochrome, indexed 8bpp, and 16bpp or greater BMPs supported: %d bpp " +"given" msgstr "" -"Ang %q() ay kumukuha ng %d positional arguments pero %d lang ang binigay" -#: py/bc.c:197 py/bc.c:215 -msgid "unexpected keyword argument" -msgstr "hindi inaasahang argumento ng keyword" +#: shared-bindings/_pixelbuf/PixelBuf.c +#, fuzzy +msgid "Only slices with step=1 (aka None) are supported" +msgstr "ang mga slices lamang na may hakbang = 1 (aka None) ang sinusuportahan" -#: py/bc.c:199 -msgid "keywords must be strings" -msgstr "ang keywords dapat strings" +#: ports/esp8266/common-hal/busio/UART.c +msgid "Only tx supported on UART1 (GPIO2)." +msgstr "Tanging suportado ang TX sa UART1 (GPIO2)." -#: py/bc.c:206 py/objnamedtuple.c:138 -msgid "function got multiple values for argument '%q'" -msgstr "ang function ay nakakuha ng maraming values para sa argument '%q'" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Oversample must be multiple of 8." +msgstr "Oversample ay dapat multiple ng 8." -#: py/bc.c:218 py/objnamedtuple.c:130 -msgid "unexpected keyword argument '%q'" -msgstr "hindi inaasahang argumento ng keyword na '%q'" +#: shared-bindings/pulseio/PWMOut.c +msgid "" +"PWM duty_cycle must be between 0 and 65535 inclusive (16 bit resolution)" +msgstr "PWM duty_cycle ay dapat sa loob ng 0 at 65535 (16 bit resolution)" -#: py/bc.c:244 +#: shared-bindings/pulseio/PWMOut.c +msgid "" +"PWM frequency not writable when variable_frequency is False on construction." +msgstr "" +"PWM frequency hindi writable kapag variable_frequency ay False sa pag buo." + +#: ports/esp8266/common-hal/pulseio/PWMOut.c ports/esp8266/machine_pwm.c #, c-format -msgid "function missing required positional argument #%d" -msgstr "function nangangailangan ng positional argument #%d" +msgid "PWM not supported on pin %d" +msgstr "Walang PWM support sa pin %d" -#: py/bc.c:260 -msgid "function missing required keyword argument '%q'" -msgstr "function nangangailangan ng keyword argument '%q'" +#: py/moduerrno.c +msgid "Permission denied" +msgstr "Walang pahintulot" -#: py/bc.c:269 -msgid "function missing keyword-only argument" -msgstr "function nangangailangan ng keyword-only argument" +#: ports/esp8266/common-hal/analogio/AnalogIn.c +msgid "Pin %q does not have ADC capabilities" +msgstr "Walang kakayahang ADC ang pin %q" -#: py/binary.c:112 -msgid "bad typecode" -msgstr "masamang typecode" +#: ports/atmel-samd/common-hal/analogio/AnalogIn.c +#: ports/nrf/common-hal/analogio/AnalogIn.c +msgid "Pin does not have ADC capabilities" +msgstr "Ang pin ay walang kakayahan sa ADC" -#: py/builtinevex.c:99 -msgid "bad compile mode" -msgstr "masamang mode ng compile" +#: ports/esp8266/machine_pin.c +msgid "Pin(16) doesn't support pull" +msgstr "Walang pull support ang Pin(16)" -#: py/builtinhelp.c:137 +#: ports/esp8266/common-hal/busio/SPI.c +msgid "Pins not valid for SPI" +msgstr "Mali ang pins para sa SPI" + +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "Pixel beyond bounds of buffer" +msgstr "" + +#: py/builtinhelp.c msgid "Plus any modules on the filesystem\n" msgstr "Kasama ang kung ano pang modules na sa filesystem\n" -#: py/builtinhelp.c:183 -#, c-format -msgid "" -"Welcome to Adafruit CircuitPython %s!\n" -"\n" -"Please visit learn.adafruit.com/category/circuitpython for project guides.\n" -"\n" -"To list built-in modules please do `help(\"modules\")`.\n" +#: main.c +msgid "Press any key to enter the REPL. Use CTRL-D to reload." msgstr "" -"Mabuhay sa Adafruit CircuitPython %s!\n" -"\n" -"Mangyaring bisitahin ang learn.adafruit.com/category/circuitpython para sa " -"project guides.\n" -"\n" -"Para makita ang listahan ng modules, `help(“modules”)`.\n" +"Pindutin ang anumang key upang pumasok sa REPL. Gamitin ang CTRL-D upang i-" +"reload." -#: py/builtinimport.c:336 -msgid "cannot perform relative import" -msgstr "hindi maaring isagawa ang relative import" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Pull not used when direction is output." +msgstr "Pull hindi ginagamit kapag ang direksyon ay output." -#: py/builtinimport.c:420 py/builtinimport.c:532 -msgid "module not found" -msgstr "module hindi nakita" +#: shared-bindings/rtc/RTC.c +msgid "RTC calibration is not supported on this board" +msgstr "RTC calibration ay hindi supportado ng board na ito" -#: py/builtinimport.c:423 py/builtinimport.c:535 -msgid "no module named '%q'" -msgstr "walang module na '%q'" +#: shared-bindings/rtc/RTC.c shared-bindings/time/__init__.c +msgid "RTC is not supported on this board" +msgstr "Hindi supportado ang RTC sa board na ito" -#: py/builtinimport.c:510 -msgid "relative import" -msgstr "relative import" +#: shared-bindings/_pixelbuf/PixelBuf.c +#, fuzzy +msgid "Range out of bounds" +msgstr "wala sa sakop ang address" -#: py/compile.c:397 py/compile.c:542 -msgid "can't assign to expression" -msgstr "hindi ma i-assign sa expression" +#: shared-bindings/pulseio/PulseIn.c +msgid "Read-only" +msgstr "Basahin-lamang" -#: py/compile.c:416 -msgid "multiple *x in assignment" -msgstr "maramihang *x sa assignment" +#: extmod/vfs_fat.c py/moduerrno.c +msgid "Read-only filesystem" +msgstr "Basahin-lamang mode" -#: py/compile.c:642 -msgid "non-default argument follows default argument" -msgstr "non-default argument sumusunod sa default argument" +#: shared-module/displayio/Bitmap.c +#, fuzzy +msgid "Read-only object" +msgstr "Basahin-lamang" -#: py/compile.c:771 py/compile.c:789 -msgid "invalid micropython decorator" -msgstr "mali ang micropython decorator" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Right channel unsupported" +msgstr "Hindi supportado ang kanang channel" -#: py/compile.c:943 -msgid "can't delete expression" -msgstr "hindi mabura ang expression" +#: shared-bindings/_pew/PewPew.c +msgid "Row entry must be digitalio.DigitalInOut" +msgstr "" -#: py/compile.c:955 -msgid "'break' outside loop" -msgstr "'break' sa labas ng loop" +#: main.c +msgid "Running in safe mode! Auto-reload is off.\n" +msgstr "Tumatakbo sa safe mode! Awtomatikong pag re-reload ay OFF.\n" -#: py/compile.c:958 -msgid "'continue' outside loop" -msgstr "'continue' sa labas ng loop" +#: main.c +msgid "Running in safe mode! Not running saved code.\n" +msgstr "Tumatakbo sa safe mode! Hindi tumatakbo ang nai-save na code.\n" -#: py/compile.c:969 -msgid "'return' outside function" -msgstr "'return' sa labas ng function" +#: ports/atmel-samd/common-hal/busio/I2C.c +msgid "SDA or SCL needs a pull up" +msgstr "Kailangan ng pull up resistors ang SDA o SCL" -#: py/compile.c:1169 -msgid "identifier redefined as global" -msgstr "identifier ginawang global" +#: ports/esp8266/modnetwork.c +msgid "STA must be active" +msgstr "Dapat aktibo ang STA" -#: py/compile.c:1185 -msgid "no binding for nonlocal found" -msgstr "no binding para sa nonlocal, nahanap" +#: ports/esp8266/modnetwork.c +msgid "STA required" +msgstr "STA kailangan" -#: py/compile.c:1188 -msgid "identifier redefined as nonlocal" -msgstr "identifier ginawang nonlocal" +#: shared-bindings/audioio/Mixer.c +msgid "Sample rate must be positive" +msgstr "Sample rate ay dapat positibo" -#: py/compile.c:1197 -msgid "can't declare nonlocal in outer code" -msgstr "hindi madeclare nonlocal sa outer code" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#, c-format +msgid "Sample rate too high. It must be less than %d" +msgstr "Sample rate ay masyadong mataas. Ito ay dapat hindi hiigit sa %d" -#: py/compile.c:1542 -msgid "default 'except' must be last" -msgstr "default 'except' ay dapat sa huli" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Serializer in use" +msgstr "Serializer ginagamit" -#: py/compile.c:2095 -msgid "*x must be assignment target" -msgstr "*x ay dapat na assignment target" +#: shared-bindings/nvm/ByteArray.c +msgid "Slice and value different lengths." +msgstr "Slice at value iba't ibang haba." -#: py/compile.c:2193 -msgid "super() can't find self" -msgstr "super() hindi mahanap ang sarili" +#: shared-bindings/displayio/Bitmap.c shared-bindings/displayio/TileGrid.c +#: shared-bindings/displayio/Group.c shared-bindings/pulseio/PulseIn.c +msgid "Slices not supported" +msgstr "Hindi suportado ang Slices" -#: py/compile.c:2256 -msgid "can't have multiple *x" -msgstr "hindi puede ang maraming *x" +#: ports/nrf/common-hal/bleio/Adapter.c +#, c-format +msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX" +msgstr "" -#: py/compile.c:2263 -msgid "can't have multiple **x" -msgstr "hindi puede ang maraming **x" +#: extmod/modure.c +msgid "Splitting with sub-captures" +msgstr "Binibiyak gamit ang sub-captures" -#: py/compile.c:2271 -msgid "LHS of keyword arg must be an id" -msgstr "LHS ng keyword arg ay dapat na id" +#: shared-bindings/supervisor/__init__.c +msgid "Stack size must be at least 256" +msgstr "Ang laki ng stack ay dapat na hindi bababa sa 256" -#: py/compile.c:2287 -msgid "non-keyword arg after */**" -msgstr "non-keyword arg sa huli ng */**" +#: shared-bindings/multiterminal/__init__.c +msgid "Stream missing readinto() or write() method." +msgstr "Stream kulang ng readinto() o write() method." -#: py/compile.c:2291 -msgid "non-keyword arg after keyword arg" -msgstr "non-keyword arg sa huli ng keyword arg" +#: supervisor/shared/safe_mode.c +msgid "" +"The CircuitPython heap was corrupted because the stack was too small.\n" +"Please increase stack size limits and press reset (after ejecting " +"CIRCUITPY).\n" +"If you didn't change the stack, then file an issue here with the contents of " +"your CIRCUITPY drive:\n" +msgstr "" +"Ang CircuitPython heap ay na corrupt dahil ang stack ay maliit.\n" +"Maaring i-increase ang stack size limit at i-press ang reset (pagkatapos i-" +"eject ang CIRCUITPY.\n" +"Kung hindi mo pinalitan ang stack, mag file ng issue dito kasama ng laman ng " +"CIRCUITPY drive:\n" -#: py/compile.c:2463 py/compile.c:2473 py/compile.c:2712 py/compile.c:2742 -#: py/parse.c:1176 -msgid "invalid syntax" -msgstr "mali ang sintaks" +#: supervisor/shared/safe_mode.c +msgid "" +"The microcontroller's power dipped. Please make sure your power supply " +"provides\n" +"enough power for the whole circuit and press reset (after ejecting " +"CIRCUITPY).\n" +msgstr "" +"Ang kapangyarihan ng mikrokontroller ay bumaba. Mangyaring suriin ang power " +"supply \n" +"pindutin ang reset (pagkatapos i-eject ang CIRCUITPY).\n" -#: py/compile.c:2465 -msgid "expecting key:value for dict" -msgstr "umaasang key: halaga para sa dict" +#: supervisor/shared/safe_mode.c +msgid "" +"The reset button was pressed while booting CircuitPython. Press again to " +"exit safe mode.\n" +msgstr "" +"Ang reset button ay pinindot habang nag boot ang CircuitPython. Pindutin " +"ulit para lumabas sa safe mode.\n" -#: py/compile.c:2475 -msgid "expecting just a value for set" -msgstr "umaasa sa value para sa set" +#: shared-module/audioio/Mixer.c +msgid "The sample's bits_per_sample does not match the mixer's" +msgstr "Ang bits_per_sample ng sample ay hindi tugma sa mixer" -#: py/compile.c:2600 -msgid "'yield' outside function" -msgstr "'yield' sa labas ng function" +#: shared-module/audioio/Mixer.c +msgid "The sample's channel count does not match the mixer's" +msgstr "Ang channel count ng sample ay hindi tugma sa mixer" -#: py/compile.c:2619 -msgid "'await' outside function" -msgstr "'await' sa labas ng function" +#: shared-module/audioio/Mixer.c +msgid "The sample's sample rate does not match the mixer's" +msgstr "Ang sample rate ng sample ay hindi tugma sa mixer" -#: py/compile.c:2774 -msgid "name reused for argument" -msgstr "name muling ginamit para sa argument" +#: shared-module/audioio/Mixer.c +msgid "The sample's signedness does not match the mixer's" +msgstr "Ang signedness ng sample hindi tugma sa mixer" -#: py/compile.c:2827 -msgid "parameter annotation must be an identifier" -msgstr "parameter annotation ay dapat na identifier" +#: shared-bindings/displayio/TileGrid.c +msgid "Tile height must exactly divide bitmap height" +msgstr "" -#: py/compile.c:2969 py/compile.c:3137 -msgid "return annotation must be an identifier" -msgstr "return annotation ay dapat na identifier" +#: shared-bindings/displayio/TileGrid.c +msgid "Tile indices must be 0 - 255" +msgstr "" -#: py/compile.c:3097 -msgid "inline assembler must be a function" -msgstr "inline assembler ay dapat na function" +#: shared-bindings/displayio/TileGrid.c +msgid "Tile width must exactly divide bitmap width" +msgstr "" -#: py/compile.c:3134 -msgid "unknown type" -msgstr "hindi malaman ang type (unknown type)" +#: supervisor/shared/safe_mode.c +msgid "To exit, please reset the board without " +msgstr "Para lumabas, paki-reset ang board na wala ang " -#: py/compile.c:3154 -msgid "expecting an assembler instruction" -msgstr "umaasa ng assembler instruction" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Too many channels in sample." +msgstr "Sobra ang channels sa sample." -#: py/compile.c:3184 -msgid "'label' requires 1 argument" -msgstr "'label' kailangan ng 1 argument" +#: shared-bindings/displayio/FourWire.c shared-bindings/displayio/ParallelBus.c +msgid "Too many display busses" +msgstr "" -#: py/compile.c:3190 -msgid "label redefined" -msgstr "ang label ay na-define ulit" +#: shared-bindings/displayio/Display.c +msgid "Too many displays" +msgstr "" -#: py/compile.c:3196 -msgid "'align' requires 1 argument" -msgstr "'align' kailangan ng 1 argument" +#: py/obj.c +msgid "Traceback (most recent call last):\n" +msgstr "Traceback (pinakahuling huling tawag): \n" -#: py/compile.c:3205 -msgid "'data' requires at least 2 arguments" -msgstr "'data' kailangan ng hindi bababa sa 2 argument" +#: shared-bindings/time/__init__.c +msgid "Tuple or struct_time argument required" +msgstr "Tuple o struct_time argument kailangan" -#: py/compile.c:3212 -msgid "'data' requires integer arguments" -msgstr "'data' kailangan ng integer arguments" +#: ports/esp8266/machine_uart.c +#, c-format +msgid "UART(%d) does not exist" +msgstr "Walang UART(%d)" -#: py/emitinlinethumb.c:102 -msgid "can only have up to 4 parameters to Thumb assembly" -msgstr "maaari lamang magkaroon ng hanggang 4 na parameter sa Thumb assembly" +#: ports/esp8266/machine_uart.c +msgid "UART(1) can't read" +msgstr "Hindi mabasa ang UART(1)" -#: py/emitinlinethumb.c:107 py/emitinlinethumb.c:112 -msgid "parameters must be registers in sequence r0 to r3" -msgstr "ang mga parameter ay dapat na nagrerehistro sa sequence r0 hanggang r3" +#: shared-module/usb_hid/Device.c +msgid "USB Busy" +msgstr "Busy ang USB" -#: py/emitinlinethumb.c:188 py/emitinlinethumb.c:230 -#, c-format -msgid "'%s' expects at most r%d" -msgstr "Inaasahan ng '%s' ang hangang r%d" +#: shared-module/usb_hid/Device.c +msgid "USB Error" +msgstr "May pagkakamali ang USB" -#: py/emitinlinethumb.c:197 py/emitinlinextensa.c:162 -#, c-format -msgid "'%s' expects a register" -msgstr "Inaasahan ng '%s' ang isang rehistro" +#: shared-bindings/bleio/UUID.c +msgid "UUID integer value not in range 0 to 0xffff" +msgstr "" -#: py/emitinlinethumb.c:211 -#, c-format -msgid "'%s' expects a special register" -msgstr "Inaasahan ng '%s' ang isang espesyal na register" +#: shared-bindings/bleio/UUID.c +msgid "UUID string not 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'" +msgstr "" -#: py/emitinlinethumb.c:239 -#, c-format -msgid "'%s' expects an FPU register" -msgstr "Inaasahan ng '%s' ang isang FPU register" +#: shared-bindings/bleio/UUID.c +msgid "UUID value is not str, int or byte buffer" +msgstr "" -#: py/emitinlinethumb.c:292 -#, c-format -msgid "'%s' expects {r0, r1, ...}" -msgstr "Inaasahan ng '%s' ay {r0, r1, …}" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Unable to allocate buffers for signed conversion" +msgstr "Hindi ma-allocate ang buffers para sa naka-sign na conversion" -#: py/emitinlinethumb.c:299 py/emitinlinextensa.c:169 -#, c-format -msgid "'%s' expects an integer" -msgstr "Inaasahan ng '%s' ang isang integer" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Unable to find free GCLK" +msgstr "Hindi mahanap ang libreng GCLK" -#: py/emitinlinethumb.c:304 -#, c-format -msgid "'%s' integer 0x%x does not fit in mask 0x%x" -msgstr "'%s' integer 0x%x ay wala sa mask na sakop ng 0x%x" +#: py/parse.c +msgid "Unable to init parser" +msgstr "Hindi ma-init ang parser" -#: py/emitinlinethumb.c:328 -#, c-format -msgid "'%s' expects an address of the form [a, b]" -msgstr "Inaasahan ng '%s' ang isang address sa [a, b]" +#: shared-module/displayio/OnDiskBitmap.c +msgid "Unable to read color palette data" +msgstr "" -#: py/emitinlinethumb.c:334 py/emitinlinextensa.c:182 -#, c-format -msgid "'%s' expects a label" -msgstr "'%s' umaasa ng label" +#: ports/esp8266/common-hal/storage/__init__.c +msgid "Unable to remount filesystem" +msgstr "Hindi ma-remount ang filesystem" -#: py/emitinlinethumb.c:345 py/emitinlinextensa.c:193 -msgid "label '%q' not defined" -msgstr "label '%d' kailangan na i-define" +#: shared-bindings/nvm/ByteArray.c +msgid "Unable to write to nvm." +msgstr "Hindi ma i-sulat sa NVM." -#: py/emitinlinethumb.c:806 +#: ports/nrf/common-hal/bleio/UUID.c +#, fuzzy +msgid "Unexpected nrfx uuid type" +msgstr "hindi inaasahang indent" + +#: ports/unix/modffi.c +msgid "Unknown type" +msgstr "Hindi alam ang type" + +#: shared-bindings/_pixelbuf/PixelBuf.c #, c-format -msgid "unsupported Thumb instruction '%s' with %d arguments" -msgstr "hindi sinusuportahan ang thumb instruktion '%s' sa %d argumento" +msgid "Unmatched number of items on RHS (expected %d, got %d)." +msgstr "" -#: py/emitinlinethumb.c:810 -msgid "branch not in range" -msgstr "branch wala sa range" +#: ports/atmel-samd/common-hal/busio/I2C.c +msgid "Unsupported baudrate" +msgstr "Hindi supportadong baudrate" -#: py/emitinlinextensa.c:86 -msgid "can only have up to 4 parameters to Xtensa assembly" -msgstr "maaari lamang magkaroon ng hanggang 4 na parameter sa Xtensa assembly" +#: shared-module/displayio/Display.c +#, fuzzy +msgid "Unsupported display bus type" +msgstr "Hindi supportadong tipo ng bitmap" -#: py/emitinlinextensa.c:91 py/emitinlinextensa.c:96 -msgid "parameters must be registers in sequence a2 to a5" -msgstr "ang mga parameter ay dapat na nagrerehistro sa sequence a2 hanggang a5" +#: shared-module/audioio/WaveFile.c +msgid "Unsupported format" +msgstr "Hindi supportadong format" -#: py/emitinlinextensa.c:174 -#, c-format -msgid "'%s' integer %d is not within range %d..%d" -msgstr "'%s' integer %d ay wala sa sakop ng %d..%d" +#: py/moduerrno.c +msgid "Unsupported operation" +msgstr "Hindi sinusuportahang operasyon" -#: py/emitinlinextensa.c:327 -#, c-format -msgid "unsupported Xtensa instruction '%s' with %d arguments" -msgstr "hindi sinusuportahan ang instruction ng Xtensa '%s' sa %d argumento" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Unsupported pull value." +msgstr "Hindi suportado ang pull value." -#: py/emitnative.c:183 -msgid "unknown type '%q'" -msgstr "hindi malaman ang type '%q'" +#: ports/esp8266/common-hal/storage/__init__.c +msgid "Use esptool to erase flash and re-upload Python instead" +msgstr "" +"Gamitin ang esptool upang burahin ang flash at muling i-upload ang Python" -#: py/emitnative.c:260 +#: py/emitnative.c msgid "Viper functions don't currently support more than 4 arguments" msgstr "" "Ang mga function ng Viper ay kasalukuyang hindi sumusuporta sa higit sa 4 na " "argumento" -#: py/emitnative.c:742 -msgid "conversion to object" -msgstr "kombersyon to object" - -#: py/emitnative.c:921 -msgid "local '%q' used before type known" -msgstr "local '%q' ginamit bago alam ang type" +#: shared-module/audioio/Mixer.c +msgid "Voice index too high" +msgstr "Index ng Voice ay masyadong mataas" -#: py/emitnative.c:1118 py/emitnative.c:1156 -msgid "can't load from '%q'" -msgstr "hidi ma i-load galing sa '%q'" +#: main.c +msgid "WARNING: Your code filename has two extensions\n" +msgstr "BABALA: Ang pangalan ng file ay may dalawang extension\n" -#: py/emitnative.c:1128 -msgid "can't load with '%q' index" -msgstr "hindi ma i-load gamit ng '%q' na index" +#: py/builtinhelp.c +#, c-format +msgid "" +"Welcome to Adafruit CircuitPython %s!\n" +"\n" +"Please visit learn.adafruit.com/category/circuitpython for project guides.\n" +"\n" +"To list built-in modules please do `help(\"modules\")`.\n" +msgstr "" +"Mabuhay sa Adafruit CircuitPython %s!\n" +"\n" +"Mangyaring bisitahin ang learn.adafruit.com/category/circuitpython para sa " +"project guides.\n" +"\n" +"Para makita ang listahan ng modules, `help(“modules”)`.\n" -#: py/emitnative.c:1188 -msgid "local '%q' has type '%q' but source is '%q'" -msgstr "local '%q' ay may type '%q' pero ang source ay '%q'" +#: supervisor/shared/safe_mode.c +msgid "" +"You are running in safe mode which means something unanticipated happened.\n" +msgstr "Ikaw ay tumatakbo sa safe mode dahil may masamang nangyari.\n" -#: py/emitnative.c:1289 py/emitnative.c:1379 -msgid "can't store '%q'" -msgstr "hindi ma i-store ang '%q'" +#: supervisor/shared/safe_mode.c +msgid "You requested starting safe mode by " +msgstr "Ikaw ang humiling sa safe mode sa pamamagitan ng " -#: py/emitnative.c:1358 py/emitnative.c:1419 -msgid "can't store to '%q'" -msgstr "hindi ma i-store sa '%q'" +#: ports/unix/modusocket.c +#, c-format +msgid "[addrinfo error %d]" +msgstr "[addrinfo error %d]" -#: py/emitnative.c:1369 -msgid "can't store with '%q' index" -msgstr "hindi ma i-store gamit ng '%q' na index" +#: py/objtype.c +msgid "__init__() should return None" +msgstr "__init __ () dapat magbalik na None" -#: py/emitnative.c:1540 -msgid "can't implicitly convert '%q' to 'bool'" -msgstr "hindi maaaring ma-convert ang '% qt' sa 'bool'" +#: py/objtype.c +#, c-format +msgid "__init__() should return None, not '%s'" +msgstr "__init__() dapat magbalink na None, hindi '%s'" -#: py/emitnative.c:1774 -msgid "unary op %q not implemented" -msgstr "unary op %q hindi implemented" +#: py/objobject.c +msgid "__new__ arg must be a user-type" +msgstr "__new__ arg ay dapat na user-type" -#: py/emitnative.c:1930 -msgid "binary op %q not implemented" -msgstr "binary op %q hindi implemented" +#: extmod/modubinascii.c extmod/moduhashlib.c +msgid "a bytes-like object is required" +msgstr "a bytes-like object ay kailangan" -#: py/emitnative.c:1951 -msgid "can't do binary op between '%q' and '%q'" -msgstr "hindi magawa ang binary op sa gitna ng '%q' at '%q'" +#: lib/embed/abort_.c +msgid "abort() called" +msgstr "abort() tinawag" -#: py/emitnative.c:2126 -msgid "casting" -msgstr "casting" +#: ports/unix/modmachine.c extmod/machine_mem.c +#, c-format +msgid "address %08x is not aligned to %d bytes" +msgstr "address %08x ay hindi pantay sa %d bytes" -#: py/emitnative.c:2173 -msgid "return expected '%q' but got '%q'" -msgstr "return umasa ng '%q' pero ang nakuha ay ‘%q’" +#: shared-bindings/i2cslave/I2CSlave.c +msgid "address out of bounds" +msgstr "wala sa sakop ang address" -#: py/emitnative.c:2191 -msgid "must raise an object" -msgstr "dapat itaas ang isang object" +#: shared-bindings/i2cslave/I2CSlave.c +msgid "addresses is empty" +msgstr "walang laman ang address" -#: py/emitnative.c:2201 -msgid "native yield" -msgstr "native yield" +#: py/modbuiltins.c +msgid "arg is an empty sequence" +msgstr "arg ay walang laman na sequence" -#: py/lexer.c:345 -msgid "unicode name escapes" -msgstr "unicode name escapes" +#: py/runtime.c +msgid "argument has wrong type" +msgstr "may maling type ang argument" -#: py/modbuiltins.c:162 -msgid "chr() arg not in range(0x110000)" -msgstr "chr() arg wala sa sakop ng range(0x110000)" +#: py/argcheck.c +msgid "argument num/types mismatch" +msgstr "hindi tugma ang argument num/types" -#: py/modbuiltins.c:171 -msgid "chr() arg not in range(256)" -msgstr "chr() arg wala sa sakop ng range(256)" +#: py/runtime.c +msgid "argument should be a '%q' not a '%q'" +msgstr "argument ay dapat na '%q' hindi '%q'" -#: py/modbuiltins.c:285 -msgid "arg is an empty sequence" -msgstr "arg ay walang laman na sequence" +#: shared-bindings/nvm/ByteArray.c py/objarray.c +msgid "array/bytes required on right side" +msgstr "array/bytes kinakailangan sa kanang bahagi" -#: py/modbuiltins.c:350 -msgid "ord expects a character" -msgstr "ord umaasa ng character" +#: py/objstr.c +msgid "attributes not supported yet" +msgstr "attributes hindi sinusuportahan" -#: py/modbuiltins.c:353 -#, c-format -msgid "ord() expected a character, but string of length %d found" -msgstr "ord() umaasa ng character pero string ng %d haba ang nakita" +#: ports/nrf/common-hal/bleio/Characteristic.c +msgid "bad GATT role" +msgstr "" -#: py/modbuiltins.c:363 -msgid "3-arg pow() not supported" -msgstr "3-arg pow() hindi suportado" +#: py/builtinevex.c +msgid "bad compile mode" +msgstr "masamang mode ng compile" -#: py/modbuiltins.c:517 -msgid "must use keyword argument for key function" -msgstr "dapat gumamit ng keyword argument para sa key function" +#: py/objstr.c +msgid "bad conversion specifier" +msgstr "masamang pag convert na specifier" -#: py/modmath.c:41 shared-bindings/math/__init__.c:53 -msgid "math domain error" -msgstr "may pagkakamali sa math domain" +#: py/objstr.c +msgid "bad format string" +msgstr "maling format ang string" -#: py/modmath.c:196 py/objfloat.c:270 py/objint_longlong.c:222 -#: py/objint_mpz.c:230 py/runtime.c:619 shared-bindings/math/__init__.c:346 -msgid "division by zero" -msgstr "dibisyon ng zero" +#: py/binary.c +msgid "bad typecode" +msgstr "masamang typecode" -#: py/modmicropython.c:155 -msgid "schedule stack full" -msgstr "puno na ang schedule stack" +#: py/emitnative.c +msgid "binary op %q not implemented" +msgstr "binary op %q hindi implemented" -#: py/modstruct.c:145 py/modstruct.c:153 py/modstruct.c:234 py/modstruct.c:244 -#: shared-bindings/struct/__init__.c:103 shared-bindings/struct/__init__.c:145 -#: shared-module/struct/__init__.c:91 shared-module/struct/__init__.c:175 -msgid "buffer too small" -msgstr "masyadong maliit ang buffer" +#: shared-bindings/busio/UART.c +msgid "bits must be 7, 8 or 9" +msgstr "bits ay dapat 7, 8 o 9" -#: py/modthread.c:240 -msgid "expecting a dict for keyword args" -msgstr "umaasa ng dict para sa keyword args" +#: extmod/machine_spi.c +msgid "bits must be 8" +msgstr "bits ay dapat walo (8)" -#: py/moduerrno.c:147 py/moduerrno.c:150 -msgid "Permission denied" -msgstr "Walang pahintulot" +#: shared-bindings/audioio/Mixer.c +msgid "bits_per_sample must be 8 or 16" +msgstr "bits_per_sample ay dapat 8 o 16" -#: py/moduerrno.c:148 -msgid "No such file/directory" -msgstr "Walang file/directory" +#: py/emitinlinethumb.c +msgid "branch not in range" +msgstr "branch wala sa range" -#: py/moduerrno.c:149 -msgid "Input/output error" -msgstr "May mali sa Input/Output" +#: shared-bindings/_pixelbuf/PixelBuf.c +#, c-format +msgid "buf is too small. need %d bytes" +msgstr "" -#: py/moduerrno.c:151 -msgid "File exists" -msgstr "Mayroong file" +#: shared-bindings/audioio/RawSample.c +msgid "buffer must be a bytes-like object" +msgstr "buffer ay dapat bytes-like object" -#: py/moduerrno.c:152 -msgid "Unsupported operation" -msgstr "Hindi sinusuportahang operasyon" +#: shared-module/struct/__init__.c +#, fuzzy +msgid "buffer size must match format" +msgstr "aarehas na haba dapat ang buffer slices" -#: py/moduerrno.c:153 -msgid "Invalid argument" -msgstr "Maling argumento" +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "buffer slices must be of equal length" +msgstr "aarehas na haba dapat ang buffer slices" -#: py/obj.c:92 -msgid "Traceback (most recent call last):\n" -msgstr "Traceback (pinakahuling huling tawag): \n" +#: ports/esp8266/machine_rtc.c +msgid "buffer too long" +msgstr "masyadong mahaba ng buffer" -#: py/obj.c:96 -msgid " File \"%q\", line %d" -msgstr " File \"%q\", line %d" +#: shared-bindings/struct/__init__.c shared-module/struct/__init__.c +#: py/modstruct.c +msgid "buffer too small" +msgstr "masyadong maliit ang buffer" -#: py/obj.c:98 -msgid " File \"%q\"" -msgstr " File \"%q\"" +#: extmod/machine_spi.c +msgid "buffers must be the same length" +msgstr "ang buffers ay dapat parehas sa haba" -#: py/obj.c:102 -msgid ", in %q\n" -msgstr ", sa %q\n" +#: shared-bindings/_pew/PewPew.c +msgid "buttons must be digitalio.DigitalInOut" +msgstr "" -#: py/obj.c:259 -msgid "can't convert to int" -msgstr "hindi ma-convert sa int" +#: py/vm.c +msgid "byte code not implemented" +msgstr "byte code hindi pa implemented" -#: py/obj.c:262 +#: shared-bindings/_pixelbuf/PixelBuf.c #, c-format -msgid "can't convert %s to int" -msgstr "hindi ma-convert %s sa int" - -#: py/obj.c:322 -msgid "can't convert to float" -msgstr "hindi ma-convert sa float" +msgid "byteorder is not an instance of ByteOrder (got a %s)" +msgstr "" -#: py/obj.c:325 -#, c-format -msgid "can't convert %s to float" -msgstr "hindi ma-convert %s sa int" +#: ports/atmel-samd/common-hal/busio/UART.c +msgid "bytes > 8 bits not supported" +msgstr "hindi sinusuportahan ang bytes > 8 bits" -#: py/obj.c:355 -msgid "can't convert to complex" -msgstr "hindi ma-convert sa complex" +#: py/objstr.c +msgid "bytes value out of range" +msgstr "bytes value wala sa sakop" -#: py/obj.c:358 -#, c-format -msgid "can't convert %s to complex" -msgstr "hindi ma-convert %s sa complex" +#: ports/atmel-samd/bindings/samd/Clock.c +msgid "calibration is out of range" +msgstr "kalibrasion ay wala sa sakop" -#: py/obj.c:373 -msgid "expected tuple/list" -msgstr "umaasa ng tuple/list" +#: ports/atmel-samd/bindings/samd/Clock.c +msgid "calibration is read only" +msgstr "pagkakalibrate ay basahin lamang" -#: py/obj.c:376 -#, c-format -msgid "object '%s' is not a tuple or list" -msgstr "object '%s' ay hindi tuple o list" +#: ports/atmel-samd/common-hal/rtc/RTC.c +msgid "calibration value out of range +/-127" +msgstr "ang halaga ng pagkakalibrate ay wala sa sakop +/-127" -#: py/obj.c:387 -msgid "tuple/list has wrong length" -msgstr "mali ang haba ng tuple/list" +#: py/emitinlinethumb.c +msgid "can only have up to 4 parameters to Thumb assembly" +msgstr "maaari lamang magkaroon ng hanggang 4 na parameter sa Thumb assembly" -#: py/obj.c:389 -#, c-format -msgid "requested length %d but object has length %d" -msgstr "hiniling ang haba %d ngunit may haba ang object na %d" +#: py/emitinlinextensa.c +msgid "can only have up to 4 parameters to Xtensa assembly" +msgstr "maaari lamang magkaroon ng hanggang 4 na parameter sa Xtensa assembly" -#: py/obj.c:402 -msgid "indices must be integers" -msgstr "ang mga indeks ay dapat na integer" +#: py/persistentcode.c +msgid "can only save bytecode" +msgstr "maaring i-save lamang ang bytecode" -#: py/obj.c:405 -msgid "%q indices must be integers, not %s" -msgstr "%q indeks ay dapat integers, hindi %s" +#: ports/esp8266/modnetwork.c +msgid "can query only one param" +msgstr "maaaring i-query lamang ang isang param" -#: py/obj.c:425 -msgid "%q index out of range" -msgstr "%q indeks wala sa sakop" +#: py/objtype.c +msgid "can't add special method to already-subclassed class" +msgstr "" +"hindi madagdag ang isang espesyal na method sa isang na i-subclass na class" -#: py/obj.c:457 -msgid "object has no len" -msgstr "object walang len" +#: py/compile.c +msgid "can't assign to expression" +msgstr "hindi ma i-assign sa expression" -#: py/obj.c:460 +#: py/obj.c #, c-format -msgid "object of type '%s' has no len()" -msgstr "object na type '%s' walang len()" +msgid "can't convert %s to complex" +msgstr "hindi ma-convert %s sa complex" -#: py/obj.c:500 -msgid "object does not support item deletion" -msgstr "ang object ay hindi sumusuporta sa pagbura ng item" +#: py/obj.c +#, c-format +msgid "can't convert %s to float" +msgstr "hindi ma-convert %s sa int" -#: py/obj.c:503 +#: py/obj.c #, c-format -msgid "'%s' object does not support item deletion" -msgstr "'%s' object ay hindi sumusuporta sa pagtanggal ng item" +msgid "can't convert %s to int" +msgstr "hindi ma-convert %s sa int" -#: py/obj.c:507 -msgid "object is not subscriptable" -msgstr "ang bagay ay hindi maaaring ma-subscript" +#: py/objstr.c +msgid "can't convert '%q' object to %q implicitly" +msgstr "hindi maaaring i-convert ang '%q' na bagay sa %q nang walang pahiwatig" -#: py/obj.c:510 -#, c-format -msgid "'%s' object is not subscriptable" -msgstr "'%s' object ay hindi maaaring i-subscript" +#: py/objint.c +msgid "can't convert NaN to int" +msgstr "hindi ma i-convert NaN sa int" -#: py/obj.c:514 -msgid "object does not support item assignment" -msgstr "ang object na '%s' ay hindi maaaring i-subscript" +#: shared-bindings/i2cslave/I2CSlave.c +msgid "can't convert address to int" +msgstr "hindi ma i-convert ang address sa INT" -#: py/obj.c:517 -#, c-format -msgid "'%s' object does not support item assignment" -msgstr "'%s' object hindi sumusuporta ng item assignment" +#: py/objint.c +msgid "can't convert inf to int" +msgstr "hindi ma i-convert inf sa int" -#: py/obj.c:548 -msgid "object with buffer protocol required" -msgstr "object na may buffer protocol kinakailangan" +#: py/obj.c +msgid "can't convert to complex" +msgstr "hindi ma-convert sa complex" -#: py/objarray.c:413 py/objstr.c:427 py/objstrunicode.c:191 py/objtuple.c:187 -#: shared-bindings/nvm/ByteArray.c:85 -msgid "only slices with step=1 (aka None) are supported" -msgstr "ang mga slices lamang na may hakbang = 1 (aka None) ang sinusuportahan" +#: py/obj.c +msgid "can't convert to float" +msgstr "hindi ma-convert sa float" -#: py/objarray.c:426 -msgid "lhs and rhs should be compatible" -msgstr "lhs at rhs ay dapat magkasundo" +#: py/obj.c +msgid "can't convert to int" +msgstr "hindi ma-convert sa int" -#: py/objarray.c:444 shared-bindings/nvm/ByteArray.c:107 -msgid "array/bytes required on right side" -msgstr "array/bytes kinakailangan sa kanang bahagi" +#: py/objstr.c +msgid "can't convert to str implicitly" +msgstr "hindi ma i-convert sa string ng walang pahiwatig" + +#: py/compile.c +msgid "can't declare nonlocal in outer code" +msgstr "hindi madeclare nonlocal sa outer code" -#: py/objcomplex.c:203 +#: py/compile.c +msgid "can't delete expression" +msgstr "hindi mabura ang expression" + +#: py/emitnative.c +msgid "can't do binary op between '%q' and '%q'" +msgstr "hindi magawa ang binary op sa gitna ng '%q' at '%q'" + +#: py/objcomplex.c msgid "can't do truncated division of a complex number" msgstr "" "hindi maaaring gawin ang truncated division ng isang kumplikadong numero" -#: py/objcomplex.c:209 -msgid "complex division by zero" -msgstr "kumplikadong dibisyon sa pamamagitan ng zero" +#: ports/esp8266/modnetwork.c +msgid "can't get AP config" +msgstr "hindi makuha ang AP config" -#: py/objcomplex.c:237 -msgid "0.0 to a complex power" -msgstr "0.0 para sa complex power" +#: ports/esp8266/modnetwork.c +msgid "can't get STA config" +msgstr "hindi makuha ang STA config" -#: py/objdeque.c:107 -msgid "full" -msgstr "puno" +#: py/compile.c +msgid "can't have multiple **x" +msgstr "hindi puede ang maraming **x" -#: py/objdeque.c:127 -msgid "empty" -msgstr "walang laman" +#: py/compile.c +msgid "can't have multiple *x" +msgstr "hindi puede ang maraming *x" -#: py/objdict.c:314 -msgid "popitem(): dictionary is empty" -msgstr "popitem(): dictionary ay walang laman" +#: py/emitnative.c +msgid "can't implicitly convert '%q' to 'bool'" +msgstr "hindi maaaring ma-convert ang '% qt' sa 'bool'" -#: py/objdict.c:357 -msgid "dict update sequence has wrong length" -msgstr "may mali sa haba ng dict update sequence" +#: py/emitnative.c +msgid "can't load from '%q'" +msgstr "hidi ma i-load galing sa '%q'" -#: py/objfloat.c:308 py/parsenum.c:331 -msgid "complex values not supported" -msgstr "kumplikadong values hindi sinusuportahan" +#: py/emitnative.c +msgid "can't load with '%q' index" +msgstr "hindi ma i-load gamit ng '%q' na index" + +#: py/objgenerator.c +msgid "can't pend throw to just-started generator" +msgstr "hindi mapadala ang send throw sa isang kaka umpisang generator" -#: py/objgenerator.c:108 +#: py/objgenerator.c msgid "can't send non-None value to a just-started generator" msgstr "hindi mapadala ang non-None value sa isang kaka umpisang generator" -#: py/objgenerator.c:126 -msgid "generator already executing" -msgstr "insinasagawa na ng generator" +#: ports/esp8266/modnetwork.c +msgid "can't set AP config" +msgstr "hindi makuha ang AP config" -#: py/objgenerator.c:229 -msgid "generator ignored GeneratorExit" -msgstr "hindi pinansin ng generator ang GeneratorExit" +#: ports/esp8266/modnetwork.c +msgid "can't set STA config" +msgstr "hindi makuha ang STA config" -#: py/objgenerator.c:251 -msgid "can't pend throw to just-started generator" -msgstr "hindi mapadala ang send throw sa isang kaka umpisang generator" +#: py/objnamedtuple.c +msgid "can't set attribute" +msgstr "hindi ma i-set ang attribute" -#: py/objint.c:144 -msgid "can't convert inf to int" -msgstr "hindi ma i-convert inf sa int" +#: py/emitnative.c +msgid "can't store '%q'" +msgstr "hindi ma i-store ang '%q'" -#: py/objint.c:146 -msgid "can't convert NaN to int" -msgstr "hindi ma i-convert NaN sa int" +#: py/emitnative.c +msgid "can't store to '%q'" +msgstr "hindi ma i-store sa '%q'" -#: py/objint.c:163 -msgid "float too big" -msgstr "masyadong malaki ang float" +#: py/emitnative.c +msgid "can't store with '%q' index" +msgstr "hindi ma i-store gamit ng '%q' na index" -#: py/objint.c:328 -msgid "long int not supported in this build" -msgstr "long int hindi sinusuportahan sa build na ito" +#: py/objstr.c +msgid "" +"can't switch from automatic field numbering to manual field specification" +msgstr "" +"hindi mapalitan ang awtomatikong field numbering sa manual field " +"specification" -#: py/objint.c:334 py/objint.c:340 py/objint.c:350 py/objint.c:358 -msgid "small int overflow" -msgstr "small int overflow" +#: py/objstr.c +msgid "" +"can't switch from manual field specification to automatic field numbering" +msgstr "" +"hindi mapalitan ang manual field specification sa awtomatikong field " +"numbering" -#: py/objint_longlong.c:189 py/objint_mpz.c:283 py/runtime.c:486 -msgid "negative power with no float support" -msgstr "negatibong power na walang float support" +#: py/objtype.c +msgid "cannot create '%q' instances" +msgstr "hindi magawa '%q' instances" -#: py/objint_longlong.c:251 -msgid "ulonglong too large" -msgstr "ulonglong masyadong malaki" +#: py/objtype.c +msgid "cannot create instance" +msgstr "hindi magawa ang instance" -#: py/objint_mpz.c:267 py/runtime.c:396 py/runtime.c:411 -msgid "negative shift count" -msgstr "negative shift count" +#: py/runtime.c +msgid "cannot import name %q" +msgstr "hindi ma-import ang name %q" -#: py/objint_mpz.c:336 -msgid "pow() with 3 arguments requires integers" -msgstr "pow() na may 3 argumento kailangan ng integers" +#: py/builtinimport.c +msgid "cannot perform relative import" +msgstr "hindi maaring isagawa ang relative import" -#: py/objint_mpz.c:347 -msgid "pow() 3rd argument cannot be 0" -msgstr "pow() 3rd argument ay hindi maaring 0" +#: py/emitnative.c +msgid "casting" +msgstr "casting" -#: py/objint_mpz.c:415 -msgid "overflow converting long int to machine word" -msgstr "overflow nagcoconvert ng long int sa machine word" +#: shared-bindings/bleio/Service.c +msgid "characteristics includes an object that is not a Characteristic" +msgstr "" -#: py/objlist.c:273 -msgid "pop from empty list" -msgstr "pop galing sa walang laman na list" +#: shared-bindings/_stage/Text.c +msgid "chars buffer too small" +msgstr "masyadong maliit ang buffer" -#: py/objnamedtuple.c:92 -msgid "can't set attribute" -msgstr "hindi ma i-set ang attribute" +#: py/modbuiltins.c +msgid "chr() arg not in range(0x110000)" +msgstr "chr() arg wala sa sakop ng range(0x110000)" -#: py/objobject.c:55 -msgid "__new__ arg must be a user-type" -msgstr "__new__ arg ay dapat na user-type" +#: py/modbuiltins.c +msgid "chr() arg not in range(256)" +msgstr "chr() arg wala sa sakop ng range(256)" -#: py/objrange.c:110 -msgid "zero step" -msgstr "zero step" +#: shared-bindings/displayio/Palette.c +msgid "color buffer must be 3 bytes (RGB) or 4 bytes (RGB + pad byte)" +msgstr "color buffer ay dapat na 3 bytes (RGB) o 4 bytes (RGB + pad byte)" -#: py/objset.c:371 -msgid "pop from an empty set" -msgstr "pop sa walang laman na set" +#: shared-bindings/displayio/Palette.c +msgid "color buffer must be a buffer or int" +msgstr "color buffer ay dapat buffer or int" -#: py/objslice.c:66 -msgid "Length must be an int" -msgstr "Haba ay dapat int" +#: shared-bindings/displayio/Palette.c +msgid "color buffer must be a bytearray or array of type 'b' or 'B'" +msgstr "ang color buffer ay dapat bytearray o array na type ‘b’ or ‘B’" -#: py/objslice.c:71 -msgid "Length must be non-negative" -msgstr "Haba ay dapat hindi negatibo" +#: shared-bindings/displayio/Palette.c +msgid "color must be between 0x000000 and 0xffffff" +msgstr "color ay dapat mula sa 0x000000 hangang 0xffffff" -#: py/objslice.c:86 py/sequence.c:57 -msgid "slice step cannot be zero" -msgstr "slice step ay hindi puedeng 0" +#: shared-bindings/displayio/ColorConverter.c +msgid "color should be an int" +msgstr "color ay dapat na int" -#: py/objslice.c:159 -msgid "Cannot subclass slice" -msgstr "Hindi magawa ang sublcass slice" +#: py/objcomplex.c +msgid "complex division by zero" +msgstr "kumplikadong dibisyon sa pamamagitan ng zero" -#: py/objstr.c:261 -msgid "bytes value out of range" -msgstr "bytes value wala sa sakop" +#: py/parsenum.c py/objfloat.c +msgid "complex values not supported" +msgstr "kumplikadong values hindi sinusuportahan" -#: py/objstr.c:270 -msgid "wrong number of arguments" -msgstr "mali ang bilang ng argumento" +#: extmod/moduzlib.c +msgid "compression header" +msgstr "compression header" -#: py/objstr.c:467 -msgid "join expects a list of str/bytes objects consistent with self object" +#: py/parse.c +msgid "constant must be an integer" +msgstr "constant ay dapat na integer" + +#: py/emitnative.c +msgid "conversion to object" +msgstr "kombersyon to object" + +#: py/parsenum.c +msgid "decimal numbers not supported" +msgstr "decimal numbers hindi sinusuportahan" + +#: py/compile.c +msgid "default 'except' must be last" +msgstr "default 'except' ay dapat sa huli" + +#: shared-bindings/audiobusio/PDMIn.c +msgid "" +"destination buffer must be a bytearray or array of type 'B' for bit_depth = 8" msgstr "" -"join umaaasang may listahan ng str/bytes objects na naalinsunod sa self " -"object" +"ang destination buffer ay dapat na isang bytearray o array ng uri na 'B' " +"para sa bit_depth = 8" -#: py/objstr.c:542 py/objstr.c:647 py/objstr.c:1744 -msgid "empty separator" -msgstr "walang laman na separator" +#: shared-bindings/audiobusio/PDMIn.c +msgid "destination buffer must be an array of type 'H' for bit_depth = 16" +msgstr "" +"ang destination buffer ay dapat na isang array ng uri 'H' para sa bit_depth " +"= 16" -#: py/objstr.c:641 -msgid "rsplit(None,n)" -msgstr "rsplit(None,n)" +#: shared-bindings/audiobusio/PDMIn.c +msgid "destination_length must be an int >= 0" +msgstr "ang destination_length ay dapat na isang int >= 0" -#: py/objstr.c:713 -msgid "substring not found" -msgstr "substring hindi nahanap" +#: py/objdict.c +msgid "dict update sequence has wrong length" +msgstr "may mali sa haba ng dict update sequence" -#: py/objstr.c:770 -msgid "start/end indices" -msgstr "start/end indeks" +#: shared-bindings/math/__init__.c py/runtime.c py/modmath.c py/objint_mpz.c +#: py/objint_longlong.c py/objfloat.c +msgid "division by zero" +msgstr "dibisyon ng zero" -#: py/objstr.c:931 -msgid "bad format string" -msgstr "maling format ang string" +#: ports/esp8266/modnetwork.c +msgid "either pos or kw args are allowed" +msgstr "pos o kw args ang pinahihintulutan" -#: py/objstr.c:953 -msgid "single '}' encountered in format string" -msgstr "isang '}' nasalubong sa format string" +#: py/objdeque.c +msgid "empty" +msgstr "walang laman" -#: py/objstr.c:992 -msgid "bad conversion specifier" -msgstr "masamang pag convert na specifier" +#: extmod/modutimeq.c extmod/moduheapq.c +msgid "empty heap" +msgstr "walang laman ang heap" + +#: py/objstr.c +msgid "empty separator" +msgstr "walang laman na separator" -#: py/objstr.c:996 +#: shared-bindings/random/__init__.c +msgid "empty sequence" +msgstr "walang laman ang sequence" + +#: py/objstr.c msgid "end of format while looking for conversion specifier" msgstr "sa huli ng format habang naghahanap sa conversion specifier" -#: py/objstr.c:998 +#: shared-bindings/displayio/Shape.c +#, fuzzy +msgid "end_x should be an int" +msgstr "y ay dapat int" + +#: ports/nrf/common-hal/busio/UART.c #, c-format -msgid "unknown conversion specifier %c" -msgstr "hindi alam ang conversion specifier na %c" +msgid "error = 0x%08lX" +msgstr "" -#: py/objstr.c:1029 -msgid "unmatched '{' in format" -msgstr "hindi tugma ang '{' sa format" +#: py/runtime.c +msgid "exceptions must derive from BaseException" +msgstr "ang mga exceptions ay dapat makuha mula sa BaseException" -#: py/objstr.c:1036 +#: py/objstr.c msgid "expected ':' after format specifier" msgstr "umaasa ng ':' pagkatapos ng format specifier" -#: py/objstr.c:1050 -msgid "" -"can't switch from automatic field numbering to manual field specification" -msgstr "" -"hindi mapalitan ang awtomatikong field numbering sa manual field " -"specification" +#: shared-bindings/gamepad/GamePad.c +msgid "expected a DigitalInOut" +msgstr "umasa ng DigitalInOut" -#: py/objstr.c:1055 py/objstr.c:1083 -msgid "tuple index out of range" -msgstr "indeks ng tuple wala sa sakop" +#: py/obj.c +msgid "expected tuple/list" +msgstr "umaasa ng tuple/list" -#: py/objstr.c:1071 -msgid "attributes not supported yet" -msgstr "attributes hindi sinusuportahan" +#: py/modthread.c +msgid "expecting a dict for keyword args" +msgstr "umaasa ng dict para sa keyword args" -#: py/objstr.c:1079 -msgid "" -"can't switch from manual field specification to automatic field numbering" -msgstr "" -"hindi mapalitan ang manual field specification sa awtomatikong field " -"numbering" +#: ports/esp8266/machine_pin.c +msgid "expecting a pin" +msgstr "umaasa ng isang pin" -#: py/objstr.c:1171 -msgid "invalid format specifier" -msgstr "mali ang format specifier" +#: py/compile.c +msgid "expecting an assembler instruction" +msgstr "umaasa ng assembler instruction" -#: py/objstr.c:1192 -msgid "sign not allowed in string format specifier" -msgstr "sign hindi maaring string format specifier" +#: py/compile.c +msgid "expecting just a value for set" +msgstr "umaasa sa value para sa set" -#: py/objstr.c:1200 -msgid "sign not allowed with integer format specifier 'c'" -msgstr "sign hindi maari sa integer format specifier 'c'" +#: py/compile.c +msgid "expecting key:value for dict" +msgstr "umaasang key: halaga para sa dict" -#: py/objstr.c:1259 -#, c-format -msgid "unknown format code '%c' for object of type '%s'" -msgstr "hindi alam ang format code '%c' para sa object na ang type ay '%s'" +#: py/argcheck.c +msgid "extra keyword arguments given" +msgstr "dagdag na keyword argument na ibinigay" -#: py/objstr.c:1331 -#, c-format -msgid "unknown format code '%c' for object of type 'float'" -msgstr "hindi alam ang format code '%c' sa object na ang type ay 'float'" +#: py/argcheck.c +msgid "extra positional arguments given" +msgstr "dagdag na positional argument na ibinigay" -#: py/objstr.c:1343 -msgid "'=' alignment not allowed in string format specifier" -msgstr "'=' Gindi pinapayagan ang alignment sa pag specify ng string format" +#: ports/unix/modffi.c +msgid "ffi_prep_closure_loc" +msgstr "ffi_prep_closure_loc" -#: py/objstr.c:1367 -#, c-format -msgid "unknown format code '%c' for object of type 'str'" -msgstr "hindi alam ang format ng code na '%c' para sa object ng type ay 'str'" +#: shared-bindings/displayio/OnDiskBitmap.c shared-bindings/audioio/WaveFile.c +msgid "file must be a file opened in byte mode" +msgstr "file ay dapat buksan sa byte mode" -#: py/objstr.c:1415 -msgid "format requires a dict" -msgstr "kailangan ng format ng dict" +#: shared-bindings/storage/__init__.c +msgid "filesystem must provide mount method" +msgstr "ang filesystem dapat mag bigay ng mount method" -#: py/objstr.c:1424 -msgid "incomplete format key" -msgstr "hindi kumpleto ang format key" +#: py/objtype.c +msgid "first argument to super() must be type" +msgstr "unang argument ng super() ay dapat type" -#: py/objstr.c:1482 -msgid "incomplete format" -msgstr "hindi kumpleto ang format" +#: extmod/machine_spi.c +msgid "firstbit must be MSB" +msgstr "firstbit ay dapat MSB" -#: py/objstr.c:1490 -msgid "not enough arguments for format string" -msgstr "kulang sa arguments para sa format string" +#: ports/esp8266/modesp.c +msgid "flash location must be below 1MByte" +msgstr "dapat na mas mababa sa 1MB ang lokasyon ng flash" -#: py/objstr.c:1500 -#, c-format -msgid "%%c requires int or char" -msgstr "%%c nangangailangan ng int o char" +#: py/objint.c +msgid "float too big" +msgstr "masyadong malaki ang float" -#: py/objstr.c:1507 -msgid "integer required" -msgstr "kailangan ng int" +#: shared-bindings/_stage/Text.c +msgid "font must be 2048 bytes long" +msgstr "font ay dapat 2048 bytes ang haba" -#: py/objstr.c:1570 -#, c-format -msgid "unsupported format character '%c' (0x%x) at index %d" -msgstr "hindi sinusuportahan ang format character na '%c' (0x%x) sa index %d" +#: py/objstr.c +msgid "format requires a dict" +msgstr "kailangan ng format ng dict" -#: py/objstr.c:1577 -msgid "not all arguments converted during string formatting" -msgstr "hindi lahat ng arguments na i-convert habang string formatting" +#: ports/esp8266/modmachine.c +msgid "frequency can only be either 80Mhz or 160MHz" +msgstr "ang frequency ay dapat 80Mhz or 160MHz lamang" -#: py/objstr.c:2102 -msgid "can't convert to str implicitly" -msgstr "hindi ma i-convert sa string ng walang pahiwatig" +#: py/objdeque.c +msgid "full" +msgstr "puno" -#: py/objstr.c:2106 -msgid "can't convert '%q' object to %q implicitly" -msgstr "hindi maaaring i-convert ang '%q' na bagay sa %q nang walang pahiwatig" +#: py/argcheck.c +msgid "function does not take keyword arguments" +msgstr "ang function ay hindi kumukuha ng mga argumento ng keyword" -#: py/objstrunicode.c:134 +#: py/argcheck.c #, c-format -msgid "string indices must be integers, not %s" -msgstr "ang indeks ng string ay dapat na integer, hindi %s" - -#: py/objstrunicode.c:145 py/objstrunicode.c:164 -msgid "string index out of range" -msgstr "indeks ng string wala sa sakop" +msgid "function expected at most %d arguments, got %d" +msgstr "function na inaasahang %d ang argumento, ngunit %d ang nakuha" -#: py/objtype.c:358 -msgid "__init__() should return None" -msgstr "__init __ () dapat magbalik na None" +#: py/objnamedtuple.c py/bc.c +msgid "function got multiple values for argument '%q'" +msgstr "ang function ay nakakuha ng maraming values para sa argument '%q'" -#: py/objtype.c:360 +#: py/argcheck.c #, c-format -msgid "__init__() should return None, not '%s'" -msgstr "__init__() dapat magbalink na None, hindi '%s'" +msgid "function missing %d required positional arguments" +msgstr "function kulang ng %d required na positional arguments" -#: py/objtype.c:623 py/objtype.c:1275 py/runtime.c:1065 -msgid "unreadable attribute" -msgstr "hindi mabasa ang attribute" +#: py/bc.c +msgid "function missing keyword-only argument" +msgstr "function nangangailangan ng keyword-only argument" -#: py/objtype.c:868 py/runtime.c:653 -msgid "object not callable" -msgstr "hindi matatawag ang object" +#: py/bc.c +msgid "function missing required keyword argument '%q'" +msgstr "function nangangailangan ng keyword argument '%q'" -#: py/objtype.c:870 py/runtime.c:655 +#: py/bc.c #, c-format -msgid "'%s' object is not callable" -msgstr "'%s' object hindi matatawag" +msgid "function missing required positional argument #%d" +msgstr "function nangangailangan ng positional argument #%d" -#: py/objtype.c:978 -msgid "type takes 1 or 3 arguments" -msgstr "type kumuhuha ng 1 o 3 arguments" +#: py/argcheck.c py/objnamedtuple.c py/bc.c +#, c-format +msgid "function takes %d positional arguments but %d were given" +msgstr "" +"ang function ay kumuhuha ng %d positional arguments ngunit %d ang ibinigay" -#: py/objtype.c:989 -msgid "cannot create instance" -msgstr "hindi magawa ang instance" +#: shared-bindings/time/__init__.c +msgid "function takes exactly 9 arguments" +msgstr "function kumukuha ng 9 arguments" -#: py/objtype.c:991 -msgid "cannot create '%q' instances" -msgstr "hindi magawa '%q' instances" +#: py/objgenerator.c +msgid "generator already executing" +msgstr "insinasagawa na ng generator" -#: py/objtype.c:1047 -msgid "can't add special method to already-subclassed class" -msgstr "" -"hindi madagdag ang isang espesyal na method sa isang na i-subclass na class" +#: py/objgenerator.c +msgid "generator ignored GeneratorExit" +msgstr "hindi pinansin ng generator ang GeneratorExit" -#: py/objtype.c:1091 py/objtype.c:1097 -msgid "type is not an acceptable base type" -msgstr "hindi puede ang type para sa base type" +#: shared-bindings/_stage/Layer.c +msgid "graphic must be 2048 bytes long" +msgstr "graphic ay dapat 2048 bytes ang haba" -#: py/objtype.c:1100 -msgid "type '%q' is not an acceptable base type" -msgstr "hindi maari ang type na '%q' para sa base type" +#: extmod/moduheapq.c +msgid "heap must be a list" +msgstr "list dapat ang heap" -#: py/objtype.c:1137 -msgid "multiple inheritance not supported" -msgstr "maraming inhertance hindi sinusuportahan" +#: py/compile.c +msgid "identifier redefined as global" +msgstr "identifier ginawang global" -#: py/objtype.c:1164 -msgid "multiple bases have instance lay-out conflict" -msgstr "maraming bases ay may instance lay-out conflict" +#: py/compile.c +msgid "identifier redefined as nonlocal" +msgstr "identifier ginawang nonlocal" -#: py/objtype.c:1205 -msgid "first argument to super() must be type" -msgstr "unang argument ng super() ay dapat type" +#: ports/esp8266/machine_hspi.c +msgid "impossible baudrate" +msgstr "impossibleng baudrate" -#: py/objtype.c:1370 -msgid "issubclass() arg 2 must be a class or a tuple of classes" -msgstr "issubclass() arg 2 ay dapat na class o tuple ng classes" +#: py/objstr.c +msgid "incomplete format" +msgstr "hindi kumpleto ang format" -#: py/objtype.c:1384 -msgid "issubclass() arg 1 must be a class" -msgstr "issubclass() arg 1 ay dapat na class" +#: py/objstr.c +msgid "incomplete format key" +msgstr "hindi kumpleto ang format key" -#: py/parse.c:726 -msgid "constant must be an integer" -msgstr "constant ay dapat na integer" +#: extmod/modubinascii.c +msgid "incorrect padding" +msgstr "mali ang padding" -#: py/parse.c:868 -msgid "Unable to init parser" -msgstr "Hindi ma-init ang parser" +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +#: ports/nrf/common-hal/pulseio/PulseIn.c +#: ports/esp8266/common-hal/pulseio/PulseIn.c py/obj.c +msgid "index out of range" +msgstr "index wala sa sakop" -#: py/parse.c:1170 -msgid "unexpected indent" -msgstr "hindi inaasahang indent" +#: py/obj.c +msgid "indices must be integers" +msgstr "ang mga indeks ay dapat na integer" -#: py/parse.c:1173 -msgid "unindent does not match any outer indentation level" -msgstr "unindent hindi tugma sa indentation level sa labas" +#: py/compile.c +msgid "inline assembler must be a function" +msgstr "inline assembler ay dapat na function" -#: py/parsenum.c:60 +#: py/parsenum.c msgid "int() arg 2 must be >= 2 and <= 36" msgstr "int() arg 2 ay dapat >=2 at <= 36" -#: py/parsenum.c:151 -msgid "invalid syntax for integer" -msgstr "maling sintaks sa integer" - -#: py/parsenum.c:155 -#, c-format -msgid "invalid syntax for integer with base %d" -msgstr "maling sintaks sa integer na may base %d" - -#: py/parsenum.c:339 -msgid "invalid syntax for number" -msgstr "maling sintaks sa number" - -#: py/parsenum.c:342 -msgid "decimal numbers not supported" -msgstr "decimal numbers hindi sinusuportahan" +#: py/objstr.c +msgid "integer required" +msgstr "kailangan ng int" -#: py/persistentcode.c:223 -msgid "" -"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/" -"mpy-update for more info." +#: ports/nrf/common-hal/bleio/Broadcaster.c +msgid "interval not in range 0.0020 to 10.24" msgstr "" -".mpy file hindi compatible. Maaring i-update lahat ng .mpy files. See http://" -"adafru.it/mpy-update for more info." -#: py/persistentcode.c:326 -msgid "can only save bytecode" -msgstr "maaring i-save lamang ang bytecode" +#: extmod/machine_i2c.c +msgid "invalid I2C peripheral" +msgstr "maling I2C peripheral" -#: py/runtime.c:206 -msgid "name not defined" -msgstr "name hindi na define" +#: extmod/machine_spi.c +msgid "invalid SPI peripheral" +msgstr "hindi wastong SPI peripheral" -#: py/runtime.c:209 -msgid "name '%q' is not defined" -msgstr "name '%q' ay hindi defined" +#: ports/esp8266/machine_rtc.c +msgid "invalid alarm" +msgstr "mali ang alarm" -#: py/runtime.c:304 py/runtime.c:611 -msgid "unsupported type for operator" -msgstr "hindi sinusuportahang type para sa operator" +#: lib/netutils/netutils.c +msgid "invalid arguments" +msgstr "mali ang mga argumento" -#: py/runtime.c:307 -msgid "unsupported type for %q: '%s'" -msgstr "hindi sinusuportahang type para sa %q: '%s'" +#: ports/esp8266/modnetwork.c +msgid "invalid buffer length" +msgstr "mali ang buffer length" -#: py/runtime.c:614 -msgid "unsupported types for %q: '%s', '%s'" -msgstr "hindi sinusuportahang type para sa %q: '%s', '%s'" +#: extmod/modussl_axtls.c +msgid "invalid cert" +msgstr "mali ang cert" -#: py/runtime.c:881 py/runtime.c:888 py/runtime.c:945 -msgid "wrong number of values to unpack" -msgstr "maling number ng value na i-unpack" +#: ports/esp8266/common-hal/busio/UART.c ports/esp8266/machine_uart.c +msgid "invalid data bits" +msgstr "mali ang data bits" -#: py/runtime.c:883 py/runtime.c:947 -#, c-format -msgid "need more than %d values to unpack" -msgstr "kailangan ng higit sa %d na halaga upang i-unpack" +#: extmod/uos_dupterm.c +msgid "invalid dupterm index" +msgstr "mali ang dupterm index" -#: py/runtime.c:890 -#, c-format -msgid "too many values to unpack (expected %d)" -msgstr "masyadong maraming values para i-unpact (umaasa ng %d)" +#: extmod/modframebuf.c +msgid "invalid format" +msgstr "hindi wastong pag-format" -#: py/runtime.c:984 -msgid "argument has wrong type" -msgstr "may maling type ang argument" +#: py/objstr.c +msgid "invalid format specifier" +msgstr "mali ang format specifier" -#: py/runtime.c:986 -msgid "argument should be a '%q' not a '%q'" -msgstr "argument ay dapat na '%q' hindi '%q'" +#: extmod/modussl_axtls.c +msgid "invalid key" +msgstr "mali ang key" -#: py/runtime.c:1123 py/runtime.c:1197 -msgid "no such attribute" -msgstr "walang ganoon na attribute" +#: py/compile.c +msgid "invalid micropython decorator" +msgstr "mali ang micropython decorator" -#: py/runtime.c:1128 -msgid "type object '%q' has no attribute '%q'" -msgstr "type object '%q' ay walang attribute '%q'" +#: ports/esp8266/machine_pin.c +msgid "invalid pin" +msgstr "mali ang pin" -#: py/runtime.c:1132 py/runtime.c:1200 -msgid "'%s' object has no attribute '%q'" -msgstr "'%s' object ay walang attribute '%q'" +#: shared-bindings/random/__init__.c +msgid "invalid step" +msgstr "mali ang step" -#: py/runtime.c:1238 -msgid "object not iterable" -msgstr "object hindi ma i-iterable" +#: ports/esp8266/common-hal/busio/UART.c ports/esp8266/machine_uart.c +msgid "invalid stop bits" +msgstr "mali ang stop bits" -#: py/runtime.c:1241 -#, c-format -msgid "'%s' object is not iterable" -msgstr "'%s' object ay hindi ma i-iterable" +#: py/compile.c py/parse.c +msgid "invalid syntax" +msgstr "mali ang sintaks" -#: py/runtime.c:1260 py/runtime.c:1296 -msgid "object not an iterator" -msgstr "object ay hindi iterator" +#: py/parsenum.c +msgid "invalid syntax for integer" +msgstr "maling sintaks sa integer" -#: py/runtime.c:1262 py/runtime.c:1298 +#: py/parsenum.c #, c-format -msgid "'%s' object is not an iterator" -msgstr "'%s' object ay hindi iterator" +msgid "invalid syntax for integer with base %d" +msgstr "maling sintaks sa integer na may base %d" -#: py/runtime.c:1401 -msgid "exceptions must derive from BaseException" -msgstr "ang mga exceptions ay dapat makuha mula sa BaseException" +#: py/parsenum.c +msgid "invalid syntax for number" +msgstr "maling sintaks sa number" -#: py/runtime.c:1430 -msgid "cannot import name %q" -msgstr "hindi ma-import ang name %q" +#: py/objtype.c +msgid "issubclass() arg 1 must be a class" +msgstr "issubclass() arg 1 ay dapat na class" -#: py/runtime.c:1535 -msgid "memory allocation failed, heap is locked" -msgstr "abigo ang paglalaan ng memorya, ang heap ay naka-lock" +#: py/objtype.c +msgid "issubclass() arg 2 must be a class or a tuple of classes" +msgstr "issubclass() arg 2 ay dapat na class o tuple ng classes" -#: py/runtime.c:1539 -#, c-format -msgid "memory allocation failed, allocating %u bytes" -msgstr "nabigo ang paglalaan ng memorya, paglalaan ng %u bytes" +#: py/objstr.c +msgid "join expects a list of str/bytes objects consistent with self object" +msgstr "" +"join umaaasang may listahan ng str/bytes objects na naalinsunod sa self " +"object" -#: py/runtime.c:1609 -msgid "maximum recursion depth exceeded" -msgstr "lumagpas ang maximum recursion depth" +#: py/argcheck.c +msgid "keyword argument(s) not yet implemented - use normal args instead" +msgstr "" +"kindi pa ipinapatupad ang (mga) argument(s) ng keyword - gumamit ng normal " +"args" -#: py/sequence.c:264 -msgid "object not in sequence" -msgstr "object wala sa sequence" +#: py/bc.c +msgid "keywords must be strings" +msgstr "ang keywords dapat strings" -#: py/stream.c:96 -msgid "stream operation not supported" -msgstr "stream operation hindi sinusuportahan" +#: py/emitinlinextensa.c py/emitinlinethumb.c +msgid "label '%q' not defined" +msgstr "label '%d' kailangan na i-define" -#: py/stream.c:254 -msgid "string not supported; use bytes or bytearray" -msgstr "string hindi supportado; gumamit ng bytes o kaya bytearray" +#: py/compile.c +msgid "label redefined" +msgstr "ang label ay na-define ulit" -#: py/stream.c:289 +#: ports/esp8266/modesp.c +msgid "len must be multiple of 4" +msgstr "len ay dapat multiple ng 4" + +#: py/stream.c msgid "length argument not allowed for this type" msgstr "length argument ay walang pahintulot sa ganitong type" -#: py/vm.c:255 -msgid "local variable referenced before assignment" -msgstr "local variable na reference bago na i-assign" +#: py/objarray.c +msgid "lhs and rhs should be compatible" +msgstr "lhs at rhs ay dapat magkasundo" -#: py/vm.c:1142 -msgid "no active exception to reraise" -msgstr "walang aktibong exception para i-reraise" +#: py/emitnative.c +msgid "local '%q' has type '%q' but source is '%q'" +msgstr "local '%q' ay may type '%q' pero ang source ay '%q'" -#: py/vm.c:1284 -msgid "byte code not implemented" -msgstr "byte code hindi pa implemented" +#: py/emitnative.c +msgid "local '%q' used before type known" +msgstr "local '%q' ginamit bago alam ang type" -#: shared-bindings/_stage/Layer.c:71 -msgid "graphic must be 2048 bytes long" -msgstr "graphic ay dapat 2048 bytes ang haba" +#: py/vm.c +msgid "local variable referenced before assignment" +msgstr "local variable na reference bago na i-assign" -#: shared-bindings/_stage/Layer.c:77 shared-bindings/_stage/Text.c:75 -msgid "palette must be 32 bytes long" -msgstr "ang palette ay dapat 32 bytes ang haba" +#: py/objint.c +msgid "long int not supported in this build" +msgstr "long int hindi sinusuportahan sa build na ito" -#: shared-bindings/_stage/Layer.c:84 +#: shared-bindings/_stage/Layer.c msgid "map buffer too small" msgstr "masyadong maliit ang buffer map" -#: shared-bindings/_stage/Text.c:69 -msgid "font must be 2048 bytes long" -msgstr "font ay dapat 2048 bytes ang haba" +#: shared-bindings/math/__init__.c py/modmath.c +msgid "math domain error" +msgstr "may pagkakamali sa math domain" -#: shared-bindings/_stage/Text.c:81 -msgid "chars buffer too small" -msgstr "masyadong maliit ang buffer" +#: py/runtime.c +msgid "maximum recursion depth exceeded" +msgstr "lumagpas ang maximum recursion depth" -#: shared-bindings/analogio/AnalogOut.c:118 -msgid "AnalogOut is only 16 bits. Value must be less than 65536." -msgstr "AnalogOut ay 16 bits. Value ay dapat hindi hihigit pa sa 65536." +#: py/runtime.c +#, c-format +msgid "memory allocation failed, allocating %u bytes" +msgstr "nabigo ang paglalaan ng memorya, paglalaan ng %u bytes" -#: shared-bindings/audiobusio/I2SOut.c:225 -#: shared-bindings/audioio/AudioOut.c:226 -msgid "Not playing" -msgstr "Hindi playing" +#: ports/esp8266/modesp.c +#, c-format +msgid "memory allocation failed, allocating %u bytes for native code" +msgstr "" +"nabigo ang paglalaan ng memorya, naglalaan ng %u bytes para sa native code" -#: shared-bindings/audiobusio/PDMIn.c:124 -msgid "Bit depth must be multiple of 8." -msgstr "Bit depth ay dapat multiple ng 8." +#: py/runtime.c +msgid "memory allocation failed, heap is locked" +msgstr "abigo ang paglalaan ng memorya, ang heap ay naka-lock" -#: shared-bindings/audiobusio/PDMIn.c:128 -msgid "Oversample must be multiple of 8." -msgstr "Oversample ay dapat multiple ng 8." +#: py/builtinimport.c +msgid "module not found" +msgstr "module hindi nakita" -#: shared-bindings/audiobusio/PDMIn.c:136 -msgid "Microphone startup delay must be in range 0.0 to 1.0" -msgstr "Ang delay ng startup ng mikropono ay dapat na nasa 0.0 hanggang 1.0" +#: py/compile.c +msgid "multiple *x in assignment" +msgstr "maramihang *x sa assignment" -#: shared-bindings/audiobusio/PDMIn.c:193 -msgid "destination_length must be an int >= 0" -msgstr "ang destination_length ay dapat na isang int >= 0" +#: py/objtype.c +msgid "multiple bases have instance lay-out conflict" +msgstr "maraming bases ay may instance lay-out conflict" -#: shared-bindings/audiobusio/PDMIn.c:199 -msgid "Cannot record to a file" -msgstr "Hindi ma-record sa isang file" +#: py/objtype.c +msgid "multiple inheritance not supported" +msgstr "maraming inhertance hindi sinusuportahan" -#: shared-bindings/audiobusio/PDMIn.c:202 -msgid "Destination capacity is smaller than destination_length." -msgstr "" -"Ang kapasidad ng destinasyon ay mas maliit kaysa sa destination_length." +#: py/emitnative.c +msgid "must raise an object" +msgstr "dapat itaas ang isang object" -#: shared-bindings/audiobusio/PDMIn.c:206 -msgid "destination buffer must be an array of type 'H' for bit_depth = 16" -msgstr "" -"ang destination buffer ay dapat na isang array ng uri 'H' para sa bit_depth " -"= 16" +#: extmod/machine_spi.c +msgid "must specify all of sck/mosi/miso" +msgstr "dapat tukuyin lahat ng SCK/MOSI/MISO" -#: shared-bindings/audiobusio/PDMIn.c:208 -msgid "" -"destination buffer must be a bytearray or array of type 'B' for bit_depth = 8" -msgstr "" -"ang destination buffer ay dapat na isang bytearray o array ng uri na 'B' " -"para sa bit_depth = 8" +#: py/modbuiltins.c +msgid "must use keyword argument for key function" +msgstr "dapat gumamit ng keyword argument para sa key function" -#: shared-bindings/audioio/Mixer.c:94 -msgid "Invalid voice count" -msgstr "Maling bilang ng voice" +#: py/runtime.c +msgid "name '%q' is not defined" +msgstr "name '%q' ay hindi defined" -#: shared-bindings/audioio/Mixer.c:99 -msgid "Invalid channel count" -msgstr "Maling bilang ng channel" +#: shared-bindings/bleio/Peripheral.c +#, fuzzy +msgid "name must be a string" +msgstr "ang keywords dapat strings" -#: shared-bindings/audioio/Mixer.c:103 -msgid "Sample rate must be positive" -msgstr "Sample rate ay dapat positibo" +#: py/runtime.c +msgid "name not defined" +msgstr "name hindi na define" -#: shared-bindings/audioio/Mixer.c:107 -msgid "bits_per_sample must be 8 or 16" -msgstr "bits_per_sample ay dapat 8 o 16" +#: py/compile.c +msgid "name reused for argument" +msgstr "name muling ginamit para sa argument" -#: shared-bindings/audioio/RawSample.c:98 -msgid "" -"sample_source buffer must be a bytearray or array of type 'h', 'H', 'b' or " -"'B'" -msgstr "" -"ang sample_source buffer ay dapat na isang bytearray o array ng uri na 'h', " -"'H', 'b' o'B'" +#: py/emitnative.c +msgid "native yield" +msgstr "native yield" -#: shared-bindings/audioio/RawSample.c:104 -msgid "buffer must be a bytes-like object" -msgstr "buffer ay dapat bytes-like object" +#: py/runtime.c +#, c-format +msgid "need more than %d values to unpack" +msgstr "kailangan ng higit sa %d na halaga upang i-unpack" -#: shared-bindings/audioio/WaveFile.c:78 -#: shared-bindings/displayio/OnDiskBitmap.c:85 -msgid "file must be a file opened in byte mode" -msgstr "file ay dapat buksan sa byte mode" +#: py/runtime.c py/objint_mpz.c py/objint_longlong.c +msgid "negative power with no float support" +msgstr "negatibong power na walang float support" -#: shared-bindings/bitbangio/I2C.c:111 shared-bindings/bitbangio/SPI.c:121 -#: shared-bindings/busio/SPI.c:133 -msgid "Function requires lock" -msgstr "Function nangangailangan ng lock" +#: py/runtime.c py/objint_mpz.c +msgid "negative shift count" +msgstr "negative shift count" -#: shared-bindings/bitbangio/I2C.c:195 shared-bindings/busio/I2C.c:210 -msgid "Buffer must be at least length 1" -msgstr "Buffer dapat ay hindi baba sa 1 na haba" +#: py/vm.c +msgid "no active exception to reraise" +msgstr "walang aktibong exception para i-reraise" -#: shared-bindings/bitbangio/SPI.c:151 shared-bindings/busio/SPI.c:175 -msgid "Invalid polarity" -msgstr "Mali ang polarity" +#: shared-bindings/socket/__init__.c shared-module/network/__init__.c +msgid "no available NIC" +msgstr "walang magagamit na NIC" -#: shared-bindings/bitbangio/SPI.c:155 shared-bindings/busio/SPI.c:179 -msgid "Invalid phase" -msgstr "Mali ang phase" +#: py/compile.c +msgid "no binding for nonlocal found" +msgstr "no binding para sa nonlocal, nahanap" -#: shared-bindings/bitbangio/SPI.c:159 shared-bindings/busio/SPI.c:183 -msgid "Invalid number of bits" -msgstr "Mali ang bilang ng bits" +#: py/builtinimport.c +msgid "no module named '%q'" +msgstr "walang module na '%q'" -#: shared-bindings/bitbangio/SPI.c:284 shared-bindings/busio/SPI.c:348 -msgid "buffer slices must be of equal length" -msgstr "aarehas na haba dapat ang buffer slices" +#: shared-bindings/_pixelbuf/__init__.c py/runtime.c +msgid "no such attribute" +msgstr "walang ganoon na attribute" -#: shared-bindings/bleio/Address.c:101 -msgid "Wrong address length" -msgstr "Mali ang address length" +#: py/compile.c +msgid "non-default argument follows default argument" +msgstr "non-default argument sumusunod sa default argument" -#: shared-bindings/bleio/Address.c:107 -msgid "Wrong number of bytes provided" -msgstr "Mali ang bilang ng bytes" +#: extmod/modubinascii.c +msgid "non-hex digit found" +msgstr "non-hex digit nahanap" -#: shared-bindings/bleio/Device.c:210 -msgid "Can't add services in Central mode" -msgstr "Hindi maarang maglagay ng service sa Central mode" +#: py/compile.c +msgid "non-keyword arg after */**" +msgstr "non-keyword arg sa huli ng */**" -#: shared-bindings/bleio/Device.c:226 -msgid "Can't connect in Peripheral mode" -msgstr "Hindi maconnect sa Peripheral mode" +#: py/compile.c +msgid "non-keyword arg after keyword arg" +msgstr "non-keyword arg sa huli ng keyword arg" -#: shared-bindings/bleio/Device.c:256 -msgid "Can't change the name in Central mode" -msgstr "Hindi mapalitan ang pangalan sa Central mode" +#: shared-bindings/bleio/UUID.c +msgid "not a 128-bit UUID" +msgstr "" -#: shared-bindings/bleio/Device.c:277 shared-bindings/bleio/Device.c:313 -msgid "Can't advertise in Central mode" -msgstr "Hindi ma advertise habang nasa Central mode" +#: ports/esp8266/machine_adc.c +#, c-format +msgid "not a valid ADC Channel: %d" +msgstr "hindi tamang ADC Channel: %d" -#: shared-bindings/busio/I2C.c:120 -msgid "Function requires lock." -msgstr "Kailangan ng lock ang function." +#: py/objstr.c +msgid "not all arguments converted during string formatting" +msgstr "hindi lahat ng arguments na i-convert habang string formatting" -#: shared-bindings/busio/UART.c:106 -msgid "bits must be 7, 8 or 9" -msgstr "bits ay dapat 7, 8 o 9" +#: py/objstr.c +msgid "not enough arguments for format string" +msgstr "kulang sa arguments para sa format string" -#: shared-bindings/busio/UART.c:118 -msgid "stop must be 1 or 2" -msgstr "stop dapat 1 o 2" +#: py/obj.c +#, c-format +msgid "object '%s' is not a tuple or list" +msgstr "object '%s' ay hindi tuple o list" -#: shared-bindings/busio/UART.c:123 -msgid "timeout >100 (units are now seconds, not msecs)" -msgstr "timeout >100 (units ay seconds, hindi na msecs)" +#: py/obj.c +msgid "object does not support item assignment" +msgstr "ang object na '%s' ay hindi maaaring i-subscript" -#: shared-bindings/digitalio/DigitalInOut.c:211 -msgid "Invalid direction." -msgstr "Mali ang direksyon." +#: py/obj.c +msgid "object does not support item deletion" +msgstr "ang object ay hindi sumusuporta sa pagbura ng item" -#: shared-bindings/digitalio/DigitalInOut.c:240 -msgid "Cannot set value when direction is input." -msgstr "Hindi ma i-set ang value kapag ang direksyon ay input." +#: py/obj.c +msgid "object has no len" +msgstr "object walang len" -#: shared-bindings/digitalio/DigitalInOut.c:266 -#: shared-bindings/digitalio/DigitalInOut.c:281 -msgid "Drive mode not used when direction is input." -msgstr "Drive mode ay hindi ginagamit kapag ang direksyon ay input." +#: py/obj.c +msgid "object is not subscriptable" +msgstr "ang bagay ay hindi maaaring ma-subscript" -#: shared-bindings/digitalio/DigitalInOut.c:314 -#: shared-bindings/digitalio/DigitalInOut.c:331 -msgid "Pull not used when direction is output." -msgstr "Pull hindi ginagamit kapag ang direksyon ay output." +#: py/runtime.c +msgid "object not an iterator" +msgstr "object ay hindi iterator" -#: shared-bindings/digitalio/DigitalInOut.c:340 -msgid "Unsupported pull value." -msgstr "Hindi suportado ang pull value." +#: py/objtype.c py/runtime.c +msgid "object not callable" +msgstr "hindi matatawag ang object" -#: shared-bindings/displayio/Bitmap.c:84 -msgid "y should be an int" -msgstr "y ay dapat int" +#: py/sequence.c +msgid "object not in sequence" +msgstr "object wala sa sequence" -#: shared-bindings/displayio/Bitmap.c:89 -msgid "row buffer must be a bytearray or array of type 'b' or 'B'" -msgstr "ang row buffer ay dapat bytearray o array na type ‘b’ or ‘B’" +#: py/runtime.c +msgid "object not iterable" +msgstr "object hindi ma i-iterable" -#: shared-bindings/displayio/Bitmap.c:94 -msgid "row data must be a buffer" -msgstr "row data ay dapat na buffer" +#: py/obj.c +#, c-format +msgid "object of type '%s' has no len()" +msgstr "object na type '%s' walang len()" -#: shared-bindings/displayio/ColorConverter.c:72 -msgid "color should be an int" -msgstr "color ay dapat na int" +#: py/obj.c +msgid "object with buffer protocol required" +msgstr "object na may buffer protocol kinakailangan" -#: shared-bindings/displayio/FourWire.c:55 -#: shared-bindings/displayio/FourWire.c:64 -msgid "displayio is a work in progress" -msgstr "displayio ay nasa gitna ng konstruksiyon" +#: extmod/modubinascii.c +msgid "odd-length string" +msgstr "odd-length string" -#: shared-bindings/displayio/Group.c:65 -msgid "Group must have size at least 1" -msgstr "Group dapat ay hindi baba sa 1 na haba" +#: py/objstrunicode.c py/objstr.c +#, fuzzy +msgid "offset out of bounds" +msgstr "wala sa sakop ang address" -#: shared-bindings/displayio/Palette.c:96 -msgid "color buffer must be a bytearray or array of type 'b' or 'B'" -msgstr "ang color buffer ay dapat bytearray o array na type ‘b’ or ‘B’" +#: shared-bindings/nvm/ByteArray.c py/objarray.c py/objtuple.c +#: py/objstrunicode.c py/objstr.c +msgid "only slices with step=1 (aka None) are supported" +msgstr "ang mga slices lamang na may hakbang = 1 (aka None) ang sinusuportahan" -#: shared-bindings/displayio/Palette.c:102 -msgid "color buffer must be 3 bytes (RGB) or 4 bytes (RGB + pad byte)" -msgstr "color buffer ay dapat na 3 bytes (RGB) o 4 bytes (RGB + pad byte)" +#: py/modbuiltins.c +msgid "ord expects a character" +msgstr "ord umaasa ng character" -#: shared-bindings/displayio/Palette.c:106 -msgid "color must be between 0x000000 and 0xffffff" -msgstr "color ay dapat mula sa 0x000000 hangang 0xffffff" +#: py/modbuiltins.c +#, c-format +msgid "ord() expected a character, but string of length %d found" +msgstr "ord() umaasa ng character pero string ng %d haba ang nakita" -#: shared-bindings/displayio/Palette.c:110 -msgid "color buffer must be a buffer or int" -msgstr "color buffer ay dapat buffer or int" +#: py/objint_mpz.c +msgid "overflow converting long int to machine word" +msgstr "overflow nagcoconvert ng long int sa machine word" -#: shared-bindings/displayio/Palette.c:123 -#: shared-bindings/displayio/Palette.c:137 +#: shared-bindings/_stage/Text.c shared-bindings/_stage/Layer.c +msgid "palette must be 32 bytes long" +msgstr "ang palette ay dapat 32 bytes ang haba" + +#: shared-bindings/displayio/Palette.c msgid "palette_index should be an int" msgstr "palette_index ay dapat na int" -#: shared-bindings/displayio/Sprite.c:48 -msgid "position must be 2-tuple" -msgstr "position ay dapat 2-tuple" +#: py/compile.c +msgid "parameter annotation must be an identifier" +msgstr "parameter annotation ay dapat na identifier" -#: shared-bindings/displayio/Sprite.c:97 -msgid "unsupported bitmap type" -msgstr "Hindi supportadong tipo ng bitmap" +#: py/emitinlinextensa.c +msgid "parameters must be registers in sequence a2 to a5" +msgstr "ang mga parameter ay dapat na nagrerehistro sa sequence a2 hanggang a5" + +#: py/emitinlinethumb.c +msgid "parameters must be registers in sequence r0 to r3" +msgstr "ang mga parameter ay dapat na nagrerehistro sa sequence r0 hanggang r3" + +#: ports/esp8266/machine_pin.c +msgid "pin does not have IRQ capabilities" +msgstr "walang IRQ capabilities ang pin" -#: shared-bindings/displayio/Sprite.c:162 +#: shared-bindings/displayio/Bitmap.c +#, fuzzy +msgid "pixel coordinates out of bounds" +msgstr "wala sa sakop ang address" + +#: shared-bindings/displayio/Bitmap.c +msgid "pixel value requires too many bits" +msgstr "" + +#: shared-bindings/displayio/TileGrid.c msgid "pixel_shader must be displayio.Palette or displayio.ColorConverter" msgstr "pixel_shader ay dapat displayio.Palette o displayio.ColorConverter" -#: shared-bindings/gamepad/GamePad.c:100 -msgid "too many arguments" -msgstr "masyadong maraming argumento" +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +#: ports/nrf/common-hal/pulseio/PulseIn.c +#: ports/esp8266/common-hal/pulseio/PulseIn.c +msgid "pop from an empty PulseIn" +msgstr "pop mula sa walang laman na PulseIn" -#: shared-bindings/gamepad/GamePad.c:104 -msgid "expected a DigitalInOut" -msgstr "umasa ng DigitalInOut" +#: py/objset.c +msgid "pop from an empty set" +msgstr "pop sa walang laman na set" -#: shared-bindings/i2cslave/I2CSlave.c:98 -msgid "can't convert address to int" -msgstr "hindi ma i-convert ang address sa INT" +#: py/objlist.c +msgid "pop from empty list" +msgstr "pop galing sa walang laman na list" -#: shared-bindings/i2cslave/I2CSlave.c:101 -msgid "address out of bounds" -msgstr "wala sa sakop ang address" +#: py/objdict.c +msgid "popitem(): dictionary is empty" +msgstr "popitem(): dictionary ay walang laman" -#: shared-bindings/i2cslave/I2CSlave.c:107 -msgid "addresses is empty" -msgstr "walang laman ang address" +#: py/objint_mpz.c +msgid "pow() 3rd argument cannot be 0" +msgstr "pow() 3rd argument ay hindi maaring 0" -#: shared-bindings/microcontroller/Pin.c:89 -#: shared-bindings/neopixel_write/__init__.c:67 -#: shared-bindings/pulseio/PulseOut.c:76 -msgid "Expected a %q" -msgstr "Umasa ng %q" +#: py/objint_mpz.c +msgid "pow() with 3 arguments requires integers" +msgstr "pow() na may 3 argumento kailangan ng integers" -#: shared-bindings/microcontroller/Pin.c:100 -msgid "%q in use" -msgstr "%q ay ginagamit" +#: extmod/modutimeq.c +msgid "queue overflow" +msgstr "puno na ang pila (overflow)" -#: shared-bindings/microcontroller/__init__.c:126 -msgid "Invalid run mode." -msgstr "Mali ang run mode." +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "rawbuf is not the same size as buf" +msgstr "" -#: shared-bindings/multiterminal/__init__.c:68 -msgid "Stream missing readinto() or write() method." -msgstr "Stream kulang ng readinto() o write() method." +#: shared-bindings/_pixelbuf/__init__.c +#, fuzzy +msgid "readonly attribute" +msgstr "hindi mabasa ang attribute" -#: shared-bindings/nvm/ByteArray.c:99 -msgid "Slice and value different lengths." -msgstr "Slice at value iba't ibang haba." +#: py/builtinimport.c +msgid "relative import" +msgstr "relative import" -#: shared-bindings/nvm/ByteArray.c:104 -msgid "Array values should be single bytes." -msgstr "Array values ay dapat single bytes." +#: py/obj.c +#, c-format +msgid "requested length %d but object has length %d" +msgstr "hiniling ang haba %d ngunit may haba ang object na %d" -#: shared-bindings/nvm/ByteArray.c:111 shared-bindings/nvm/ByteArray.c:141 -msgid "Unable to write to nvm." -msgstr "Hindi ma i-sulat sa NVM." +#: py/compile.c +msgid "return annotation must be an identifier" +msgstr "return annotation ay dapat na identifier" -#: shared-bindings/nvm/ByteArray.c:137 -msgid "Bytes must be between 0 and 255." -msgstr "Sa gitna ng 0 o 255 dapat ang bytes." +#: py/emitnative.c +msgid "return expected '%q' but got '%q'" +msgstr "return umasa ng '%q' pero ang nakuha ay ‘%q’" -#: shared-bindings/os/__init__.c:200 -msgid "No hardware random available" -msgstr "Walang magagamit na hardware random" +#: shared-module/displayio/Bitmap.c +msgid "row must be packed and word aligned" +msgstr "row ay dapat packed at ang word nakahanay" -#: shared-bindings/pulseio/PWMOut.c:164 -msgid "" -"PWM duty_cycle must be between 0 and 65535 inclusive (16 bit resolution)" -msgstr "PWM duty_cycle ay dapat sa loob ng 0 at 65535 (16 bit resolution)" +#: py/objstr.c +msgid "rsplit(None,n)" +msgstr "rsplit(None,n)" -#: shared-bindings/pulseio/PWMOut.c:195 +#: shared-bindings/audioio/RawSample.c msgid "" -"PWM frequency not writable when variable_frequency is False on construction." +"sample_source buffer must be a bytearray or array of type 'h', 'H', 'b' or " +"'B'" msgstr "" -"PWM frequency hindi writable kapag variable_frequency ay False sa pag buo." +"ang sample_source buffer ay dapat na isang bytearray o array ng uri na 'h', " +"'H', 'b' o'B'" -#: shared-bindings/pulseio/PulseIn.c:275 -msgid "Cannot delete values" -msgstr "Hindi mabura ang values" +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "sampling rate out of range" +msgstr "pagpili ng rate wala sa sakop" -#: shared-bindings/pulseio/PulseIn.c:281 -msgid "Slices not supported" -msgstr "Hindi suportado ang Slices" +#: ports/esp8266/modnetwork.c +msgid "scan failed" +msgstr "nabigo ang pag-scan" -#: shared-bindings/pulseio/PulseIn.c:287 -msgid "index must be int" -msgstr "index ay dapat int" +#: py/modmicropython.c +msgid "schedule stack full" +msgstr "puno na ang schedule stack" -#: shared-bindings/pulseio/PulseIn.c:293 -msgid "Read-only" -msgstr "Basahin-lamang" +#: lib/utils/pyexec.c py/builtinimport.c +msgid "script compilation not supported" +msgstr "script kompilasyon hindi supportado" -#: shared-bindings/pulseio/PulseOut.c:135 -msgid "Array must contain halfwords (type 'H')" -msgstr "May halfwords (type 'H') dapat ang array" +#: shared-bindings/bleio/Peripheral.c +msgid "services includes an object that is not a Service" +msgstr "" -#: shared-bindings/random/__init__.c:92 shared-bindings/random/__init__.c:100 -msgid "stop not reachable from start" -msgstr "stop hindi maabot sa simula" +#: py/objstr.c +msgid "sign not allowed in string format specifier" +msgstr "sign hindi maaring string format specifier" + +#: py/objstr.c +msgid "sign not allowed with integer format specifier 'c'" +msgstr "sign hindi maari sa integer format specifier 'c'" + +#: py/objstr.c +msgid "single '}' encountered in format string" +msgstr "isang '}' nasalubong sa format string" + +#: shared-bindings/time/__init__.c +msgid "sleep length must be non-negative" +msgstr "sleep length ay dapat hindi negatibo" -#: shared-bindings/random/__init__.c:111 +#: py/objslice.c py/sequence.c +msgid "slice step cannot be zero" +msgstr "slice step ay hindi puedeng 0" + +#: py/sequence.c py/objint.c +msgid "small int overflow" +msgstr "small int overflow" + +#: main.c +msgid "soft reboot\n" +msgstr "malambot na reboot\n" + +#: py/objstr.c +msgid "start/end indices" +msgstr "start/end indeks" + +#: shared-bindings/displayio/Shape.c +#, fuzzy +msgid "start_x should be an int" +msgstr "y ay dapat int" + +#: shared-bindings/random/__init__.c msgid "step must be non-zero" msgstr "step ay dapat hindi zero" -#: shared-bindings/random/__init__.c:114 -msgid "invalid step" -msgstr "mali ang step" - -#: shared-bindings/random/__init__.c:146 -msgid "empty sequence" -msgstr "walang laman ang sequence" +#: shared-bindings/busio/UART.c +msgid "stop must be 1 or 2" +msgstr "stop dapat 1 o 2" -#: shared-bindings/rtc/RTC.c:40 shared-bindings/rtc/RTC.c:44 -#: shared-bindings/time/__init__.c:190 -msgid "RTC is not supported on this board" -msgstr "Hindi supportado ang RTC sa board na ito" +#: shared-bindings/random/__init__.c +msgid "stop not reachable from start" +msgstr "stop hindi maabot sa simula" -#: shared-bindings/rtc/RTC.c:52 -msgid "RTC calibration is not supported on this board" -msgstr "RTC calibration ay hindi supportado ng board na ito" +#: py/stream.c +msgid "stream operation not supported" +msgstr "stream operation hindi sinusuportahan" -#: shared-bindings/socket/__init__.c:516 shared-module/network/__init__.c:81 -msgid "no available NIC" -msgstr "walang magagamit na NIC" +#: py/objstrunicode.c +msgid "string index out of range" +msgstr "indeks ng string wala sa sakop" -#: shared-bindings/storage/__init__.c:77 -msgid "filesystem must provide mount method" -msgstr "ang filesystem dapat mag bigay ng mount method" +#: py/objstrunicode.c +#, c-format +msgid "string indices must be integers, not %s" +msgstr "ang indeks ng string ay dapat na integer, hindi %s" -#: shared-bindings/supervisor/__init__.c:93 -msgid "Brightness must be between 0 and 255" -msgstr "Ang liwanag ay dapat sa gitna ng 0 o 255" +#: py/stream.c +msgid "string not supported; use bytes or bytearray" +msgstr "string hindi supportado; gumamit ng bytes o kaya bytearray" -#: shared-bindings/supervisor/__init__.c:119 -msgid "Stack size must be at least 256" -msgstr "Ang laki ng stack ay dapat na hindi bababa sa 256" +#: extmod/moductypes.c +msgid "struct: cannot index" +msgstr "struct: hindi ma-index" -#: shared-bindings/time/__init__.c:78 -msgid "sleep length must be non-negative" -msgstr "sleep length ay dapat hindi negatibo" +#: extmod/moductypes.c +msgid "struct: index out of range" +msgstr "struct: index hindi maabot" -#: shared-bindings/time/__init__.c:88 -msgid "time.struct_time() takes exactly 1 argument" -msgstr "time.struct_time() kumukuha ng 1 argument" +#: extmod/moductypes.c +msgid "struct: no fields" +msgstr "struct: walang fields" -#: shared-bindings/time/__init__.c:91 -msgid "time.struct_time() takes a 9-sequence" -msgstr "time.struct_time() kumukuha ng 9-sequence" +#: py/objstr.c +msgid "substring not found" +msgstr "substring hindi nahanap" -#: shared-bindings/time/__init__.c:169 shared-bindings/time/__init__.c:263 -msgid "Tuple or struct_time argument required" -msgstr "Tuple o struct_time argument kailangan" +#: py/compile.c +msgid "super() can't find self" +msgstr "super() hindi mahanap ang sarili" -#: shared-bindings/time/__init__.c:174 shared-bindings/time/__init__.c:268 -msgid "function takes exactly 9 arguments" -msgstr "function kumukuha ng 9 arguments" +#: extmod/modujson.c +msgid "syntax error in JSON" +msgstr "sintaks error sa JSON" -#: shared-bindings/time/__init__.c:239 shared-bindings/time/__init__.c:272 -msgid "timestamp out of range for platform time_t" -msgstr "wala sa sakop ng timestamp ang platform time_t" +#: extmod/moductypes.c +msgid "syntax error in uctypes descriptor" +msgstr "may pagkakamali sa sintaks sa uctypes descriptor" -#: shared-bindings/touchio/TouchIn.c:173 +#: shared-bindings/touchio/TouchIn.c msgid "threshold must be in the range 0-65536" msgstr "ang threshold ay dapat sa range 0-65536" -#: shared-bindings/util.c:38 -msgid "" -"Object has been deinitialized and can no longer be used. Create a new object." +#: shared-bindings/displayio/TileGrid.c +msgid "tile index out of bounds" msgstr "" -"Object ay deinitialized at hindi na magagamit. Lumikha ng isang bagong " -"Object." -#: shared-module/audioio/Mixer.c:47 shared-module/audioio/WaveFile.c:117 -msgid "Couldn't allocate first buffer" -msgstr "Hindi ma-iallocate ang first buffer" +#: shared-bindings/time/__init__.c +msgid "time.struct_time() takes a 9-sequence" +msgstr "time.struct_time() kumukuha ng 9-sequence" -#: shared-module/audioio/Mixer.c:53 shared-module/audioio/WaveFile.c:123 -msgid "Couldn't allocate second buffer" -msgstr "Hindi ma-iallocate ang second buffer" +#: shared-bindings/time/__init__.c +msgid "time.struct_time() takes exactly 1 argument" +msgstr "time.struct_time() kumukuha ng 1 argument" -#: shared-module/audioio/Mixer.c:82 -msgid "Voice index too high" -msgstr "Index ng Voice ay masyadong mataas" +#: shared-bindings/busio/UART.c +msgid "timeout >100 (units are now seconds, not msecs)" +msgstr "timeout >100 (units ay seconds, hindi na msecs)" -#: shared-module/audioio/Mixer.c:85 -msgid "The sample's sample rate does not match the mixer's" -msgstr "Ang sample rate ng sample ay hindi tugma sa mixer" +#: shared-bindings/bleio/CharacteristicBuffer.c +#, fuzzy +msgid "timeout must be >= 0.0" +msgstr "bits ay dapat walo (8)" -#: shared-module/audioio/Mixer.c:88 -msgid "The sample's channel count does not match the mixer's" -msgstr "Ang channel count ng sample ay hindi tugma sa mixer" +#: shared-bindings/time/__init__.c +msgid "timestamp out of range for platform time_t" +msgstr "wala sa sakop ng timestamp ang platform time_t" -#: shared-module/audioio/Mixer.c:91 -msgid "The sample's bits_per_sample does not match the mixer's" -msgstr "Ang bits_per_sample ng sample ay hindi tugma sa mixer" +#: shared-bindings/gamepad/GamePad.c +msgid "too many arguments" +msgstr "masyadong maraming argumento" -#: shared-module/audioio/Mixer.c:100 -msgid "The sample's signedness does not match the mixer's" -msgstr "Ang signedness ng sample hindi tugma sa mixer" +#: shared-module/struct/__init__.c +msgid "too many arguments provided with the given format" +msgstr "masyadong maraming mga argumento na ibinigay sa ibinigay na format" -#: shared-module/audioio/WaveFile.c:61 -msgid "Invalid wave file" -msgstr "May hindi tama sa wave file" +#: py/runtime.c +#, c-format +msgid "too many values to unpack (expected %d)" +msgstr "masyadong maraming values para i-unpact (umaasa ng %d)" -#: shared-module/audioio/WaveFile.c:69 -msgid "Invalid format chunk size" -msgstr "Mali ang format ng chunk size" +#: py/objstr.c +msgid "tuple index out of range" +msgstr "indeks ng tuple wala sa sakop" -#: shared-module/audioio/WaveFile.c:83 -msgid "Unsupported format" -msgstr "Hindi supportadong format" +#: py/obj.c +msgid "tuple/list has wrong length" +msgstr "mali ang haba ng tuple/list" -#: shared-module/audioio/WaveFile.c:99 -msgid "Data chunk must follow fmt chunk" -msgstr "Dapat sunurin ng Data chunk ang fmt chunk" +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "tuple/list required on RHS" +msgstr "" -#: shared-module/audioio/WaveFile.c:107 -msgid "Invalid file" -msgstr "Mali ang file" +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "tx and rx cannot both be None" +msgstr "tx at rx hindi pwedeng parehas na None" -#: shared-module/bitbangio/I2C.c:58 -msgid "Clock stretch too long" -msgstr "Masyadong mahaba ang Clock stretch" +#: py/objtype.c +msgid "type '%q' is not an acceptable base type" +msgstr "hindi maari ang type na '%q' para sa base type" -#: shared-module/bitbangio/SPI.c:44 -msgid "Clock pin init failed." -msgstr "Nabigo sa pag init ng Clock pin." +#: py/objtype.c +msgid "type is not an acceptable base type" +msgstr "hindi puede ang type para sa base type" -#: shared-module/bitbangio/SPI.c:50 -msgid "MOSI pin init failed." -msgstr "Hindi ma-initialize ang MOSI pin." +#: py/runtime.c +msgid "type object '%q' has no attribute '%q'" +msgstr "type object '%q' ay walang attribute '%q'" -#: shared-module/bitbangio/SPI.c:61 -msgid "MISO pin init failed." -msgstr "Hindi ma-initialize ang MISO pin." +#: py/objtype.c +msgid "type takes 1 or 3 arguments" +msgstr "type kumuhuha ng 1 o 3 arguments" -#: shared-module/bitbangio/SPI.c:121 -msgid "Cannot write without MOSI pin." -msgstr "Hindi maaring isulat kapag walang MOSI pin." +#: py/objint_longlong.c +msgid "ulonglong too large" +msgstr "ulonglong masyadong malaki" -#: shared-module/bitbangio/SPI.c:176 -msgid "Cannot read without MISO pin." -msgstr "Hindi maaring mabasa kapag walang MISO pin." +#: py/emitnative.c +msgid "unary op %q not implemented" +msgstr "unary op %q hindi implemented" -#: shared-module/bitbangio/SPI.c:240 -msgid "Cannot transfer without MOSI and MISO pins." -msgstr "Hindi maaaring ilipat kapag walang MOSI at MISO pin." +#: py/parse.c +msgid "unexpected indent" +msgstr "hindi inaasahang indent" -#: shared-module/displayio/Bitmap.c:49 -msgid "Only bit maps of 8 bit color or less are supported" -msgstr "Tanging bit maps na may 8 bit color o mas mababa ang supportado" +#: py/bc.c +msgid "unexpected keyword argument" +msgstr "hindi inaasahang argumento ng keyword" -#: shared-module/displayio/Bitmap.c:69 -msgid "row must be packed and word aligned" -msgstr "row ay dapat packed at ang word nakahanay" +#: py/objnamedtuple.c py/bc.c +msgid "unexpected keyword argument '%q'" +msgstr "hindi inaasahang argumento ng keyword na '%q'" -#: shared-module/displayio/Group.c:39 -msgid "Group full" -msgstr "Puno ang group" +#: py/lexer.c +msgid "unicode name escapes" +msgstr "unicode name escapes" -#: shared-module/displayio/Group.c:48 -msgid "Group empty" -msgstr "Walang laman ang group" +#: py/parse.c +msgid "unindent does not match any outer indentation level" +msgstr "unindent hindi tugma sa indentation level sa labas" -#: shared-module/displayio/OnDiskBitmap.c:49 -msgid "Invalid BMP file" -msgstr "Mali ang BMP file" +#: ports/esp8266/modnetwork.c +msgid "unknown config param" +msgstr "hindi alam na config param" -#: shared-module/displayio/OnDiskBitmap.c:59 +#: py/objstr.c #, c-format -msgid "Only Windows format, uncompressed BMP supported %d" -msgstr "Tanging Windows format, uncompressed BMP lamang ang supportado %d" +msgid "unknown conversion specifier %c" +msgstr "hindi alam ang conversion specifier na %c" -#: shared-module/displayio/OnDiskBitmap.c:64 +#: py/objstr.c #, c-format -msgid "Only true color (24 bpp or higher) BMP supported %x" -msgstr "Dapat true color (24 bpp o mas mataas) BMP lamang ang supportado %x" +msgid "unknown format code '%c' for object of type '%s'" +msgstr "hindi alam ang format code '%c' para sa object na ang type ay '%s'" -#: shared-module/storage/__init__.c:155 -msgid "Cannot remount '/' when USB is active." -msgstr "Hindi ma-remount '/' kapag aktibo ang USB." +#: py/objstr.c +#, c-format +msgid "unknown format code '%c' for object of type 'float'" +msgstr "hindi alam ang format code '%c' sa object na ang type ay 'float'" -#: shared-module/struct/__init__.c:39 -msgid "'S' and 'O' are not supported format types" -msgstr "Ang 'S' at 'O' ay hindi suportadong uri ng format" +#: py/objstr.c +#, c-format +msgid "unknown format code '%c' for object of type 'str'" +msgstr "hindi alam ang format ng code na '%c' para sa object ng type ay 'str'" -#: shared-module/struct/__init__.c:83 -msgid "too many arguments provided with the given format" -msgstr "masyadong maraming mga argumento na ibinigay sa ibinigay na format" +#: ports/esp8266/modnetwork.c +msgid "unknown status param" +msgstr "hindi alam na status param" -#: shared-module/usb_hid/Device.c:45 -#, c-format -msgid "Buffer incorrect size. Should be %d bytes." -msgstr "Mali ang size ng buffer. Dapat %d bytes." +#: py/compile.c +msgid "unknown type" +msgstr "hindi malaman ang type (unknown type)" -#: shared-module/usb_hid/Device.c:53 -msgid "USB Busy" -msgstr "Busy ang USB" +#: py/emitnative.c +msgid "unknown type '%q'" +msgstr "hindi malaman ang type '%q'" -#: shared-module/usb_hid/Device.c:59 -msgid "USB Error" -msgstr "May pagkakamali ang USB" +#: py/objstr.c +msgid "unmatched '{' in format" +msgstr "hindi tugma ang '{' sa format" -#: supervisor/shared/safe_mode.c:97 -msgid "You requested starting safe mode by " -msgstr "Ikaw ang humiling sa safe mode sa pamamagitan ng " +#: py/objtype.c py/runtime.c +msgid "unreadable attribute" +msgstr "hindi mabasa ang attribute" -#: supervisor/shared/safe_mode.c:100 -msgid "To exit, please reset the board without " -msgstr "Para lumabas, paki-reset ang board na wala ang " +#: py/emitinlinethumb.c +#, c-format +msgid "unsupported Thumb instruction '%s' with %d arguments" +msgstr "hindi sinusuportahan ang thumb instruktion '%s' sa %d argumento" -#: supervisor/shared/safe_mode.c:107 -msgid "" -"You are running in safe mode which means something unanticipated happened.\n" -msgstr "Ikaw ay tumatakbo sa safe mode dahil may masamang nangyari.\n" +#: py/emitinlinextensa.c +#, c-format +msgid "unsupported Xtensa instruction '%s' with %d arguments" +msgstr "hindi sinusuportahan ang instruction ng Xtensa '%s' sa %d argumento" -#: supervisor/shared/safe_mode.c:109 -msgid "" -"Looks like our core CircuitPython code crashed hard. Whoops!\n" -"Please file an issue at https://github.com/adafruit/circuitpython/issues\n" -" with the contents of your CIRCUITPY drive and this message:\n" -msgstr "" -"Mukhang ang core CircuitPython code nag crash. Ay!\n" -"Maaring mag file ng issue sa https://github.com/adafruit/circuitpython/" -"issues\n" -"kasama ng laman ng iyong CIRCUITPY drive at ang message na ito:\n" +#: shared-bindings/displayio/TileGrid.c +msgid "unsupported bitmap type" +msgstr "Hindi supportadong tipo ng bitmap" -#: supervisor/shared/safe_mode.c:111 -msgid "Crash into the HardFault_Handler.\n" -msgstr "Nagcrash sa HardFault_Handler.\n" +#: py/objstr.c +#, c-format +msgid "unsupported format character '%c' (0x%x) at index %d" +msgstr "hindi sinusuportahan ang format character na '%c' (0x%x) sa index %d" -#: supervisor/shared/safe_mode.c:113 -msgid "MicroPython NLR jump failed. Likely memory corruption.\n" -msgstr "CircuitPython NLR jump nabigo. Maaring memory corruption.\n" +#: py/runtime.c +msgid "unsupported type for %q: '%s'" +msgstr "hindi sinusuportahang type para sa %q: '%s'" -#: supervisor/shared/safe_mode.c:115 -msgid "MicroPython fatal error.\n" -msgstr "CircuitPython fatal na pagkakamali.\n" +#: py/runtime.c +msgid "unsupported type for operator" +msgstr "hindi sinusuportahang type para sa operator" -#: supervisor/shared/safe_mode.c:118 -msgid "" -"The microcontroller's power dipped. Please make sure your power supply " -"provides\n" -"enough power for the whole circuit and press reset (after ejecting " -"CIRCUITPY).\n" -msgstr "" -"Ang kapangyarihan ng mikrokontroller ay bumaba. Mangyaring suriin ang power " -"supply \n" -"pindutin ang reset (pagkatapos i-eject ang CIRCUITPY).\n" +#: py/runtime.c +msgid "unsupported types for %q: '%s', '%s'" +msgstr "hindi sinusuportahang type para sa %q: '%s', '%s'" -#: supervisor/shared/safe_mode.c:120 -msgid "" -"The CircuitPython heap was corrupted because the stack was too small.\n" -"Please increase stack size limits and press reset (after ejecting " -"CIRCUITPY).\n" -"If you didn't change the stack, then file an issue here with the contents of " -"your CIRCUITPY drive:\n" +#: shared-bindings/displayio/Bitmap.c +msgid "value_count must be > 0" msgstr "" -"Ang CircuitPython heap ay na corrupt dahil ang stack ay maliit.\n" -"Maaring i-increase ang stack size limit at i-press ang reset (pagkatapos i-" -"eject ang CIRCUITPY.\n" -"Kung hindi mo pinalitan ang stack, mag file ng issue dito kasama ng laman ng " -"CIRCUITPY drive:\n" -#: supervisor/shared/safe_mode.c:123 -msgid "" -"The reset button was pressed while booting CircuitPython. Press again to " -"exit safe mode.\n" -msgstr "" -"Ang reset button ay pinindot habang nag boot ang CircuitPython. Pindutin " -"ulit para lumabas sa safe mode.\n" +#: ports/esp8266/modnetwork.c +msgid "wifi_set_ip_info() failed" +msgstr "nabigo ang wifi_set_ip_info()" -#~ msgid "Cannot apply GAP parameters." -#~ msgstr "Hindi ma-apply ang GAP parameters." +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "write_args must be a list, tuple, or None" +msgstr "" -#~ msgid "Can not add Characteristic." -#~ msgstr "Hindi mabasa and Characteristic." +#: py/objstr.c +msgid "wrong number of arguments" +msgstr "mali ang bilang ng argumento" -#~ msgid "Can not apply device name in the stack." -#~ msgstr "Hindi maaaring ma-aplay ang device name sa stack." +#: py/runtime.c +msgid "wrong number of values to unpack" +msgstr "maling number ng value na i-unpack" -#~ msgid "Can not encode UUID, to check length." -#~ msgstr "Hindi ma-encode UUID, para suriin ang haba." +#: shared-module/displayio/Shape.c +#, fuzzy +msgid "x value out of bounds" +msgstr "wala sa sakop ang address" -#~ msgid "Can encode UUID into the advertisement packet." -#~ msgstr "Maaring i-encode ang UUID sa advertisement packet." +#: shared-bindings/displayio/Shape.c +msgid "y should be an int" +msgstr "y ay dapat int" -#~ msgid "Invalid Service type" -#~ msgstr "Mali ang tipo ng serbisyo" +#: shared-module/displayio/Shape.c +#, fuzzy +msgid "y value out of bounds" +msgstr "wala sa sakop ang address" -#~ msgid "Can not add Service." -#~ msgstr "Hindi maidaragdag ang serbisyo." +#: py/objrange.c +msgid "zero step" +msgstr "zero step" -#~ msgid "Can not query for the device address." -#~ msgstr "Hindi maaaring mag-query para sa address ng device." +#, fuzzy +#~ msgid "Failed to notify or indicate attribute value, err %0x04x" +#~ msgstr "Hindi mabalitaan ang attribute value, status: 0x%08lX" #, fuzzy -#~ msgid "palette must be displayio.Palette" -#~ msgstr "ang palette ay dapat 32 bytes ang haba" - -#~ msgid "Can not apply advertisement data. status: 0x%02x" -#~ msgstr "Hindi ma i-apply ang advertisement data. status: 0x%02x" - -#~ msgid "Cannot set PPCP parameters." -#~ msgstr "Hindi ma-set ang PPCP parameters." - -#~ msgid "" -#~ "enough power for the whole circuit and press reset (after ejecting " -#~ "CIRCUITPY).\n" -#~ msgstr "" -#~ "ay nagbibigay ng sapat na power para sa buong circuit at i-press ang " -#~ "reset (pagkatapos i-eject ang CIRCUITPY).\n" - -#~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n" -#~ msgstr "" -#~ "Mukhang ang core CircuitPython code ay nag-crash ng malakas. Aray!\n" - -#~ msgid "" -#~ "Please file an issue here with the contents of your CIRCUITPY drive:\n" -#~ msgstr "" -#~ "Mag-file ng isang isyu dito gamit ang mga nilalaman ng iyong CIRCUITPY " -#~ "drive:\n" +#~ msgid "Failed to read attribute value, err %0x04x" +#~ msgstr "Hindi mabasa ang value ng attribute, status: 0x%08lX" + +#~ msgid "Function requires lock." +#~ msgstr "Kailangan ng lock ang function." + +#~ msgid "Only Windows format, uncompressed BMP supported %d" +#~ msgstr "Tanging Windows format, uncompressed BMP lamang ang supportado %d" + +#~ msgid "Only true color (24 bpp or higher) BMP supported %x" +#~ msgstr "Dapat true color (24 bpp o mas mataas) BMP lamang ang supportado %x" + +#~ msgid "position must be 2-tuple" +#~ msgstr "position ay dapat 2-tuple" diff --git a/locale/fr.po b/locale/fr.po index 61781fe5b..f9c007825 100644 --- a/locale/fr.po +++ b/locale/fr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-12-26 20:49+0100\n" +"POT-Creation-Date: 2019-03-25 19:40+0100\n" "PO-Revision-Date: 2018-12-23 20:05+0100\n" "Last-Translator: Pierrick Couturier <arofarn@arofarn.info>\n" "Language-Team: fr\n" @@ -16,2666 +16,2944 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -#: extmod/machine_i2c.c:299 -msgid "invalid I2C peripheral" -msgstr "périphérique I2C invalide" - -#: extmod/machine_i2c.c:340 extmod/machine_i2c.c:354 extmod/machine_i2c.c:368 -#: extmod/machine_i2c.c:392 -msgid "I2C operation not supported" -msgstr "opération sur I2C non supportée" +#: main.c +msgid "" +"\n" +"Code done running. Waiting for reload.\n" +msgstr "" -#: extmod/machine_mem.c:45 ports/unix/modmachine.c:53 -#, c-format -msgid "address %08x is not aligned to %d bytes" -msgstr "l'adresse %08x n'est pas alignée sur %d octets" +#: py/obj.c +msgid " File \"%q\"" +msgstr " Fichier \"%q\"" -#: extmod/machine_spi.c:57 -msgid "invalid SPI peripheral" -msgstr "périphérique SPI invalide" +#: py/obj.c +msgid " File \"%q\", line %d" +msgstr " Fichier \"%q\", ligne %d" -#: extmod/machine_spi.c:124 -msgid "buffers must be the same length" -msgstr "les tampons doivent être de la même longueur" +#: main.c +msgid " output:\n" +msgstr " sortie:\n" -#: extmod/machine_spi.c:207 -msgid "bits must be 8" -msgstr "les bits doivent être 8" +#: py/objstr.c +#, c-format +msgid "%%c requires int or char" +msgstr "%%c nécessite un entier int ou un caractère char" -#: extmod/machine_spi.c:210 -msgid "firstbit must be MSB" -msgstr "le 1er bit doit être le MSB" +#: shared-bindings/microcontroller/Pin.c +msgid "%q in use" +msgstr "%q utilisé" -#: extmod/machine_spi.c:215 -msgid "must specify all of sck/mosi/miso" -msgstr "SCK, MOSI et MISO doivent tous être spécifiés" +#: py/obj.c +msgid "%q index out of range" +msgstr "index %q hors gamme" -#: extmod/modframebuf.c:299 -msgid "invalid format" -msgstr "format invalide" +#: py/obj.c +msgid "%q indices must be integers, not %s" +msgstr "les indices %q doivent être des entiers, pas %s" -#: extmod/modubinascii.c:38 extmod/moduhashlib.c:102 -msgid "a bytes-like object is required" -msgstr "un objet 'bytes-like' est requis" +#: shared-bindings/displayio/Group.c shared-bindings/displayio/Shape.c +#: shared-bindings/bleio/CharacteristicBuffer.c +#, fuzzy +msgid "%q must be >= 1" +msgstr "les slices de tampon doivent être de longueurs égales" -#: extmod/modubinascii.c:90 -msgid "odd-length string" -msgstr "chaîne de longueur impaire" +#: shared-bindings/fontio/BuiltinFont.c +#, fuzzy +msgid "%q should be an int" +msgstr "y doit être un entier (int)" -#: extmod/modubinascii.c:101 -msgid "non-hex digit found" -msgstr "digit non-héxadécimale trouvé" +#: py/objnamedtuple.c py/bc.c +msgid "%q() takes %d positional arguments but %d were given" +msgstr "%q() prend %d arguments mais %d ont été donnés" -#: extmod/modubinascii.c:169 -msgid "incorrect padding" -msgstr "espacement incorrect" +#: py/argcheck.c +msgid "'%q' argument required" +msgstr "'%q' argument requis" -#: extmod/moductypes.c:122 -msgid "syntax error in uctypes descriptor" -msgstr "erreur de syntaxe dans le descripteur d'uctypes" +#: py/emitinlinextensa.c py/emitinlinethumb.c +#, c-format +msgid "'%s' expects a label" +msgstr "'%s' attend un label" -#: extmod/moductypes.c:219 -msgid "Cannot unambiguously get sizeof scalar" -msgstr "Impossible d'obtenir la taille du scalaire sans ambigüité" +#: py/emitinlinextensa.c py/emitinlinethumb.c +#, c-format +msgid "'%s' expects a register" +msgstr "'%s' attend un registre" -#: extmod/moductypes.c:397 -msgid "struct: no fields" -msgstr "struct: aucun champs" +#: py/emitinlinethumb.c +#, fuzzy, c-format +msgid "'%s' expects a special register" +msgstr "'%s' attend un registre special" -#: extmod/moductypes.c:530 -msgid "struct: cannot index" -msgstr "struct: indexage impossible" +#: py/emitinlinethumb.c +#, fuzzy, c-format +msgid "'%s' expects an FPU register" +msgstr "'%s' attend un registre FPU" -#: extmod/moductypes.c:544 -msgid "struct: index out of range" -msgstr "struct: index hors limite" +#: py/emitinlinethumb.c +#, fuzzy, c-format +msgid "'%s' expects an address of the form [a, b]" +msgstr "'%s' attend une adresse de la forme [a, b]" -#: extmod/moduheapq.c:38 -msgid "heap must be a list" -msgstr "'heap' doit être une liste" +#: py/emitinlinextensa.c py/emitinlinethumb.c +#, c-format +msgid "'%s' expects an integer" +msgstr "'%s' attend un entier" -#: extmod/moduheapq.c:86 extmod/modutimeq.c:147 extmod/modutimeq.c:172 -msgid "empty heap" -msgstr "'heap' vide" +#: py/emitinlinethumb.c +#, fuzzy, c-format +msgid "'%s' expects at most r%d" +msgstr "'%s' attend un registre" -#: extmod/modujson.c:281 -msgid "syntax error in JSON" -msgstr "erreur de syntaxe JSON" +#: py/emitinlinethumb.c +#, fuzzy, c-format +msgid "'%s' expects {r0, r1, ...}" +msgstr "'%s' attend {r0, r1, ...}" -#: extmod/modure.c:161 -msgid "Splitting with sub-captures" -msgstr "Fractionnement avec des captures 'sub'" +#: py/emitinlinextensa.c +#, c-format +msgid "'%s' integer %d is not within range %d..%d" +msgstr "'%s' l'entier %d n'est pas dans la gamme %d..%d" -#: extmod/modure.c:207 -msgid "Error in regex" -msgstr "Erreur dans l'expression régulière" +#: py/emitinlinethumb.c +#, fuzzy, c-format +msgid "'%s' integer 0x%x does not fit in mask 0x%x" +msgstr "'%s' l'entier 0x%x ne correspond pas au masque 0x%x" -#: extmod/modussl_axtls.c:81 -msgid "invalid key" -msgstr "clé invalide" +#: py/obj.c +#, c-format +msgid "'%s' object does not support item assignment" +msgstr "l'objet '%s' ne supporte pas l'assignation d'éléments" -#: extmod/modussl_axtls.c:87 -msgid "invalid cert" -msgstr "certificat invalide" +#: py/obj.c +#, c-format +msgid "'%s' object does not support item deletion" +msgstr "l'objet '%s' ne supporte pas la suppression d'éléments" -#: extmod/modutimeq.c:131 -msgid "queue overflow" -msgstr "dépassement de file" +#: py/runtime.c +msgid "'%s' object has no attribute '%q'" +msgstr "l'objet '%s' n'a pas d'attribut '%q'" -#: extmod/moduzlib.c:98 -msgid "compression header" -msgstr "entête de compression" +#: py/runtime.c +#, c-format +msgid "'%s' object is not an iterator" +msgstr "l'objet '%s' n'est pas un itérateur" -#: extmod/uos_dupterm.c:120 -msgid "invalid dupterm index" -msgstr "index invalide pour dupterm" +#: py/objtype.c py/runtime.c +#, c-format +msgid "'%s' object is not callable" +msgstr "objet '%s' non appelable" -#: extmod/vfs_fat.c:426 py/moduerrno.c:154 -msgid "Read-only filesystem" -msgstr "Système de fichier en lecture seule" +#: py/runtime.c +#, c-format +msgid "'%s' object is not iterable" +msgstr "objet '%s' non itérable" -#: extmod/vfs_posix_file.c:48 ports/unix/file.c:50 py/objstringio.c:43 -msgid "I/O operation on closed file" -msgstr "opération d'E/S sur un fichier fermé" +#: py/obj.c +#, c-format +msgid "'%s' object is not subscriptable" +msgstr "l'objet '%s' n'est pas sous-scriptable" -#: lib/embed/abort_.c:8 -msgid "abort() called" -msgstr "abort() appelé" +#: py/objstr.c +msgid "'=' alignment not allowed in string format specifier" +msgstr "'=' alignement non autorisé dans la spéc. de format de chaîne" -#: lib/netutils/netutils.c:83 -msgid "invalid arguments" -msgstr "arguments invalides" +#: shared-module/struct/__init__.c +msgid "'S' and 'O' are not supported format types" +msgstr "'S' et 'O' ne sont pas des types de format supportés" -#: lib/utils/pyexec.c:97 py/builtinimport.c:251 -msgid "script compilation not supported" -msgstr "compilation de script non supporté" +#: py/compile.c +msgid "'align' requires 1 argument" +msgstr "'align' nécessite 1 argument" -#: main.c:150 -msgid " output:\n" -msgstr " sortie:\n" +#: py/compile.c +msgid "'await' outside function" +msgstr "'await' en dehors d'une fonction" -#: main.c:164 main.c:237 -msgid "" -"Auto-reload is on. Simply save files over USB to run them or enter REPL to " -"disable.\n" -msgstr "" -"Auto-chargement activé. Copiez simplement les fichiers en USB pour les " -"lancer ou entrez sur REPL pour le désactiver.\n" +#: py/compile.c +msgid "'break' outside loop" +msgstr "'break' en dehors d'une boucle" -#: main.c:166 -msgid "Running in safe mode! Auto-reload is off.\n" -msgstr "Mode sans-échec. Auto-rechargement désactivé.\n" +#: py/compile.c +msgid "'continue' outside loop" +msgstr "'continue' en dehors d'une boucle" -#: main.c:168 main.c:239 -msgid "Auto-reload is off.\n" -msgstr "Auto-rechargement désactivé.\n" +#: py/compile.c +msgid "'data' requires at least 2 arguments" +msgstr "'data' nécessite au moins 2 arguments" -#: main.c:182 -msgid "Running in safe mode! Not running saved code.\n" -msgstr "Mode sans-échec! Le code sauvegardé ne s'éxecute pas.\n" +#: py/compile.c +msgid "'data' requires integer arguments" +msgstr "'data' nécessite des arguments entiers" -#: main.c:198 -msgid "WARNING: Your code filename has two extensions\n" -msgstr "ATTENTION: le nom de fichier de votre code a deux extensions\n" +#: py/compile.c +msgid "'label' requires 1 argument" +msgstr "'label' nécessite 1 argument" -#: main.c:244 -msgid "Press any key to enter the REPL. Use CTRL-D to reload." -msgstr "Appuyez sur une touche pour entrer sur REPL ou CTRL-D pour recharger." +#: py/compile.c +msgid "'return' outside function" +msgstr "'return' en dehors d'une fonction" -#: main.c:407 -msgid "soft reboot\n" -msgstr "redémarrage logiciel\n" +#: py/compile.c +msgid "'yield' outside function" +msgstr "'yield' en dehors d'une fonction" -#: ports/atmel-samd/audio_dma.c:209 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:361 -msgid "All sync event channels in use" -msgstr "Tous les canaux d'événements de synchro sont utilisés" +#: py/compile.c +msgid "*x must be assignment target" +msgstr "*x doit être la cible de l'assignement" -#: ports/atmel-samd/bindings/samd/Clock.c:135 -msgid "calibration is read only" -msgstr "calibration en lecture seule" +#: py/obj.c +msgid ", in %q\n" +msgstr ", dans %q\n" -#: ports/atmel-samd/bindings/samd/Clock.c:137 -msgid "calibration is out of range" -msgstr "calibration hors gamme" +#: py/objcomplex.c +msgid "0.0 to a complex power" +msgstr "0.0 à une puissance complexe" -#: ports/atmel-samd/board_busses.c:59 ports/nrf/board_busses.c:39 -msgid "No default I2C bus" -msgstr "Pas de bus I2C par défaut" +#: py/modbuiltins.c +msgid "3-arg pow() not supported" +msgstr "pow() avec 3 arguments non supporté" -#: ports/atmel-samd/board_busses.c:85 ports/nrf/board_busses.c:64 -msgid "No default SPI bus" -msgstr "Pas de bus SPI par défaut" +#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c +msgid "A hardware interrupt channel is already in use" +msgstr "Un canal d'interruptions est déjà utilisé" -#: ports/atmel-samd/board_busses.c:112 ports/nrf/board_busses.c:91 -msgid "No default UART bus" -msgstr "Pas de bus UART par défaut" +#: ports/esp8266/modnetwork.c +msgid "AP required" +msgstr "'AP' requis" -#: ports/atmel-samd/common-hal/analogio/AnalogIn.c:63 -#: ports/nrf/common-hal/analogio/AnalogIn.c:39 -msgid "Pin does not have ADC capabilities" -msgstr "la broche ne peut être utilisé pour l'ADC" +#: shared-bindings/bleio/Address.c +#, c-format +msgid "Address is not %d bytes long or is in wrong format" +msgstr "" -#: ports/atmel-samd/common-hal/analogio/AnalogOut.c:49 -msgid "No DAC on chip" -msgstr "Pas de DAC sur la puce" +#: shared-bindings/bleio/Address.c +#, fuzzy, c-format +msgid "Address must be %d bytes long" +msgstr "la palette doit être longue de 32 octets" -#: ports/atmel-samd/common-hal/analogio/AnalogOut.c:56 -msgid "AnalogOut not supported on given pin" -msgstr "AnalogOut n'est pas supporté sur la broche indiquée" +#: ports/nrf/common-hal/busio/I2C.c +#, fuzzy +msgid "All I2C peripherals are in use" +msgstr "Tous les périphériques I2C sont utilisés" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:147 -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:150 -msgid "Invalid bit clock pin" -msgstr "Broche invalide pour 'bit clock'" +#: ports/nrf/common-hal/busio/SPI.c +#, fuzzy +msgid "All SPI peripherals are in use" +msgstr "Tous les périphériques SPI sont utilisés" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:153 -msgid "Bit clock and word select must share a clock unit" -msgstr "'bit clock' et 'word select' doivent partager une horloge" +#: ports/nrf/common-hal/busio/UART.c +#, fuzzy +msgid "All UART peripherals are in use" +msgstr "Tous les périphériques I2C sont utilisés" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:156 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:130 -msgid "Invalid data pin" -msgstr "Broche de données invalide" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "All event channels in use" +msgstr "Tous les canaux d'événements sont utilisés" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:169 -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:174 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:145 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:150 -msgid "Serializer in use" -msgstr "Sérialiseur en cours d'utilisation" +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c ports/atmel-samd/audio_dma.c +msgid "All sync event channels in use" +msgstr "Tous les canaux d'événements de synchro sont utilisés" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:230 -msgid "Clock unit in use" -msgstr "Horloge en cours d'utilisation" +#: shared-bindings/pulseio/PWMOut.c +msgid "All timers for this pin are in use" +msgstr "Tous les timers pour cette broche sont utilisés" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:240 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:172 -msgid "Unable to find free GCLK" -msgstr "Impossible de trouver un GCLK libre" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/pulseio/PulseOut.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c +#: shared-module/_pew/PewPew.c +msgid "All timers in use" +msgstr "Tous les timers sont utilisés" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:254 -msgid "Too many channels in sample." -msgstr "Trop de canaux dans l'échantillon." +#: ports/nrf/common-hal/analogio/AnalogOut.c +msgid "AnalogOut functionality not supported" +msgstr "AnalogOut non supporté" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:305 -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:417 -msgid "No DMA channel found" -msgstr "Aucun canal DMA trouvé" +#: shared-bindings/analogio/AnalogOut.c +msgid "AnalogOut is only 16 bits. Value must be less than 65536." +msgstr "" +"AnalogOut est seulement 16 bits. Les valeurs doivent être inf. à 65536." -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:308 -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:419 -msgid "Unable to allocate buffers for signed conversion" -msgstr "Impossible d'allouer des tampons pour une conversion signée" +#: ports/atmel-samd/common-hal/analogio/AnalogOut.c +msgid "AnalogOut not supported on given pin" +msgstr "AnalogOut n'est pas supporté sur la broche indiquée" -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:109 -msgid "Invalid clock pin" -msgstr "Broche d'horloge invalide" +#: ports/atmel-samd/common-hal/pulseio/PulseOut.c +msgid "Another send is already active" +msgstr "Un autre envoi est déjà actif" -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:134 -msgid "Only 8 or 16 bit mono with " -msgstr "Uniquement 8 ou 16 bit mono avec " +#: shared-bindings/pulseio/PulseOut.c +msgid "Array must contain halfwords (type 'H')" +msgstr "Le tableau doit contenir des halfwords (type 'H')" -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:167 -msgid "sampling rate out of range" -msgstr "taux d'échantillonage hors gamme" +#: shared-bindings/nvm/ByteArray.c +msgid "Array values should be single bytes." +msgstr "Les valeurs du tableau doivent être des octets simples 'bytes'." -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:132 -msgid "DAC already in use" -msgstr "DAC déjà utilisé" +#: supervisor/shared/safe_mode.c +msgid "Attempted heap allocation when MicroPython VM not running.\n" +msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:136 -msgid "Right channel unsupported" -msgstr "Canal droit non supporté" +#: main.c +msgid "Auto-reload is off.\n" +msgstr "Auto-rechargement désactivé.\n" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:139 -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:116 -#: ports/atmel-samd/common-hal/touchio/TouchIn.c:65 -msgid "Invalid pin" -msgstr "Broche invalide" +#: main.c +msgid "" +"Auto-reload is on. Simply save files over USB to run them or enter REPL to " +"disable.\n" +msgstr "" +"Auto-chargement activé. Copiez simplement les fichiers en USB pour les " +"lancer ou entrez sur REPL pour le désactiver.\n" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:147 -msgid "Invalid pin for left channel" -msgstr "Broche invalide pour le canal gauche" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Bit clock and word select must share a clock unit" +msgstr "'bit clock' et 'word select' doivent partager une horloge" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:151 -msgid "Invalid pin for right channel" -msgstr "Broche invalide pour le canal droit" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Bit depth must be multiple of 8." +msgstr "La profondeur de bit doit être un multiple de 8." -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:154 -msgid "Cannot output both channels on the same pin" -msgstr "Les 2 canaux de sortie ne peuvent être sur la même broche" +#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c +msgid "Both pins must support hardware interrupts" +msgstr "Les deux entrées doivent supporter les interruptions" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:243 -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:189 -#: ports/atmel-samd/common-hal/pulseio/PulseOut.c:110 -#: ports/nrf/common-hal/pulseio/PulseOut.c:107 -msgid "All timers in use" -msgstr "Tous les timers sont utilisés" +#: shared-bindings/supervisor/__init__.c +msgid "Brightness must be between 0 and 255" +msgstr "La luminosité doit être entre 0 et 255" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:285 -msgid "All event channels in use" -msgstr "Tous les canaux d'événements sont utilisés" +#: shared-bindings/displayio/Display.c +msgid "Brightness not adjustable" +msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:375 +#: shared-module/usb_hid/Device.c #, c-format -msgid "Sample rate too high. It must be less than %d" -msgstr "Taux d'échantillonage trop élevé. Doit être inf. à %d" +msgid "Buffer incorrect size. Should be %d bytes." +msgstr "Tampon de taille incorrect. Devrait être de %d octets." -#: ports/atmel-samd/common-hal/busio/I2C.c:71 -msgid "Not enough pins available" -msgstr "Pas assez de broches disponibles" +#: shared-bindings/bitbangio/I2C.c shared-bindings/busio/I2C.c +msgid "Buffer must be at least length 1" +msgstr "Le tampon doit être de longueur au moins 1" -#: ports/atmel-samd/common-hal/busio/I2C.c:78 -#: ports/atmel-samd/common-hal/busio/SPI.c:171 -#: ports/atmel-samd/common-hal/busio/UART.c:120 -#: ports/atmel-samd/common-hal/i2cslave/I2CSlave.c:45 -#: ports/nrf/common-hal/busio/I2C.c:82 -msgid "Invalid pins" -msgstr "Broches invalides" +#: ports/atmel-samd/common-hal/displayio/ParallelBus.c +#: ports/nrf/common-hal/displayio/ParallelBus.c +#, fuzzy, c-format +msgid "Bus pin %d is already in use" +msgstr "DAC déjà utilisé" -#: ports/atmel-samd/common-hal/busio/I2C.c:101 -msgid "SDA or SCL needs a pull up" -msgstr "SDA ou SCL a besoin d'une résistance de tirage ('pull up')" +#: shared-bindings/bleio/UUID.c +#, fuzzy +msgid "Byte buffer must be 16 bytes." +msgstr "le tampon doit être un objet bytes-like" -#: ports/atmel-samd/common-hal/busio/I2C.c:121 -msgid "Unsupported baudrate" -msgstr "Débit non supporté" +#: shared-bindings/nvm/ByteArray.c +msgid "Bytes must be between 0 and 255." +msgstr "Les octets 'bytes' doivent être entre 0 et 255" -#: ports/atmel-samd/common-hal/busio/UART.c:67 -msgid "bytes > 8 bits not supported" -msgstr "octets > 8 bits non supporté" +#: ports/esp8266/esp_mphal.c +msgid "C-level assert" +msgstr "" -#: ports/atmel-samd/common-hal/busio/UART.c:73 -#: ports/nrf/common-hal/busio/UART.c:106 -msgid "tx and rx cannot both be None" -msgstr "tx et rx ne peuvent être None tous les deux" +#: shared-bindings/_pixelbuf/PixelBuf.c +#, c-format +msgid "Can not use dotstar with %s" +msgstr "" -#: ports/atmel-samd/common-hal/busio/UART.c:146 -#: ports/nrf/common-hal/busio/UART.c:140 -msgid "Failed to allocate RX buffer" -msgstr "Echec de l'allocation du tampon RX" +#: shared-bindings/bleio/Device.c +msgid "Can't add services in Central mode" +msgstr "Impossible d'ajouter des service en mode Central" -#: ports/atmel-samd/common-hal/busio/UART.c:154 -msgid "Could not initialize UART" -msgstr "L'UART n'a pu être initialisé" +#: shared-bindings/bleio/Device.c +msgid "Can't advertise in Central mode" +msgstr "" -#: ports/atmel-samd/common-hal/busio/UART.c:241 -#: ports/nrf/common-hal/busio/UART.c:185 -msgid "No RX pin" -msgstr "Pas de broche RX" +#: shared-bindings/bleio/Device.c +msgid "Can't change the name in Central mode" +msgstr "Modification du nom impossible en mode Central" -#: ports/atmel-samd/common-hal/busio/UART.c:300 -#: ports/nrf/common-hal/busio/UART.c:220 -msgid "No TX pin" -msgstr "Pas de broche TX" +#: shared-bindings/bleio/Device.c +msgid "Can't connect in Peripheral mode" +msgstr "Impossible de se connecter en mode Peripheral" -#: ports/atmel-samd/common-hal/digitalio/DigitalInOut.c:170 -#: ports/nrf/common-hal/digitalio/DigitalInOut.c:147 -msgid "Cannot get pull while in output mode" -msgstr "Ne peux être tiré ('pull') en mode 'output'" +#: ports/esp8266/modnetwork.c +msgid "Cannot connect to AP" +msgstr "Impossible de se connecter à 'AP'" -#: ports/atmel-samd/common-hal/microcontroller/__init__.c:74 -#: ports/esp8266/common-hal/microcontroller/__init__.c:64 -msgid "Cannot reset into bootloader because no bootloader is present." -msgstr "" -"Ne peut être redémarré vers le bootloader car il n'y a pas de bootloader." +#: shared-bindings/displayio/Bitmap.c shared-bindings/pulseio/PulseIn.c +msgid "Cannot delete values" +msgstr "Impossible de supprimer les valeurs" -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:120 -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:369 -#: ports/nrf/common-hal/pulseio/PWMOut.c:119 -#: ports/nrf/common-hal/pulseio/PWMOut.c:233 -msgid "Invalid PWM frequency" -msgstr "Fréquence de PWM invalide" +#: ports/esp8266/modnetwork.c +msgid "Cannot disconnect from AP" +msgstr "Impossible de se déconnecter de 'AP'" -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:187 -msgid "All timers for this pin are in use" -msgstr "Tous les timers pour cette broche sont utilisés" +#: ports/atmel-samd/common-hal/digitalio/DigitalInOut.c +#: ports/nrf/common-hal/digitalio/DigitalInOut.c +msgid "Cannot get pull while in output mode" +msgstr "Ne peux être tiré ('pull') en mode 'output'" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:110 -msgid "No hardware support on pin" -msgstr "Pas de support matériel pour cette broche" +#: ports/nrf/common-hal/microcontroller/Processor.c +#, fuzzy +msgid "Cannot get temperature" +msgstr "Impossible de lire la température. status: 0x%02x" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:113 -msgid "EXTINT channel already in use" -msgstr "Canal EXTINT déjà utilisé" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Cannot output both channels on the same pin" +msgstr "Les 2 canaux de sortie ne peuvent être sur la même broche" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:118 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:86 -#, c-format -msgid "Failed to allocate RX buffer of %d bytes" -msgstr "Echec de l'allocation de %d octets du tampon RX" +#: shared-module/bitbangio/SPI.c +msgid "Cannot read without MISO pin." +msgstr "Impossible de lire sans broche MISO." -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:205 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:151 -msgid "pop from an empty PulseIn" -msgstr "'pop' d'une entrée PulseIn vide" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Cannot record to a file" +msgstr "Impossible d'enregistrer vers un fichier" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:237 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:422 -msgid "index out of range" -msgstr "index hors gamme" +#: shared-module/storage/__init__.c +msgid "Cannot remount '/' when USB is active." +msgstr "'/' ne peut être remonté quand l'USB est actif." -#: ports/atmel-samd/common-hal/pulseio/PulseOut.c:178 -msgid "Another send is already active" -msgstr "Un autre envoi est déjà actif" +#: ports/atmel-samd/common-hal/microcontroller/__init__.c +#: ports/esp8266/common-hal/microcontroller/__init__.c +msgid "Cannot reset into bootloader because no bootloader is present." +msgstr "" +"Ne peut être redémarré vers le bootloader car il n'y a pas de bootloader." -#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c:38 -msgid "Both pins must support hardware interrupts" -msgstr "Les deux entrées doivent supporter les interruptions" +#: ports/esp8266/modnetwork.c +msgid "Cannot set STA config" +msgstr "Impossible de configurer STA" -#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c:46 -msgid "A hardware interrupt channel is already in use" -msgstr "Un canal d'interruptions est déjà utilisé" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Cannot set value when direction is input." +msgstr "Impossible d'affecter une valeur quand la direction est 'input'." -#: ports/atmel-samd/common-hal/rtc/RTC.c:101 -msgid "calibration value out of range +/-127" -msgstr "valeur de calibration hors gamme +/-127" +#: py/objslice.c +msgid "Cannot subclass slice" +msgstr "On ne peut faire de subclass de slice" -#: ports/atmel-samd/common-hal/touchio/TouchIn.c:75 -msgid "No free GCLKs" -msgstr "Pas de GCLK libre" +#: shared-module/bitbangio/SPI.c +msgid "Cannot transfer without MOSI and MISO pins." +msgstr "Pas de transfert sans broches MOSI et MISO" -#: ports/esp8266/common-hal/analogio/AnalogIn.c:43 -msgid "Pin %q does not have ADC capabilities" -msgstr "La broche %q n'a pas de convertisseur analogique-digital" +#: extmod/moductypes.c +msgid "Cannot unambiguously get sizeof scalar" +msgstr "Impossible d'obtenir la taille du scalaire sans ambigüité" -#: ports/esp8266/common-hal/analogio/AnalogOut.c:39 -msgid "No hardware support for analog out." -msgstr "Pas de support matériel pour une sortie analogique" +#: ports/esp8266/modnetwork.c +msgid "Cannot update i/f status" +msgstr "le status i/f ne peut être mis à jour" -#: ports/esp8266/common-hal/busio/SPI.c:72 -msgid "Pins not valid for SPI" -msgstr "Broche invalide pour le SPI" +#: shared-module/bitbangio/SPI.c +msgid "Cannot write without MOSI pin." +msgstr "Impossible d'écrire sans broche MOSI." -#: ports/esp8266/common-hal/busio/UART.c:45 -msgid "Only tx supported on UART1 (GPIO2)." -msgstr "Seul le tx est supporté sur l'UART1 (GPIO2)." +#: shared-bindings/bleio/Service.c +msgid "Characteristic UUID doesn't match Service UUID" +msgstr "" -#: ports/esp8266/common-hal/busio/UART.c:67 ports/esp8266/machine_uart.c:108 -msgid "invalid data bits" -msgstr "bits de données invalides" +#: ports/nrf/common-hal/bleio/Service.c +msgid "Characteristic already in use by another Service." +msgstr "" -#: ports/esp8266/common-hal/busio/UART.c:91 ports/esp8266/machine_uart.c:144 -msgid "invalid stop bits" -msgstr "bits d'arrêt invalides" +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "CharacteristicBuffer writing not provided" +msgstr "" -#: ports/esp8266/common-hal/digitalio/DigitalInOut.c:200 -msgid "ESP8266 does not support pull down." -msgstr "L'ESP8266 ne supporte pas le rappel (pull-down)" +#: shared-module/bitbangio/SPI.c +msgid "Clock pin init failed." +msgstr "Echec de l'init. de la broche d'horloge" -#: ports/esp8266/common-hal/digitalio/DigitalInOut.c:210 -msgid "GPIO16 does not support pull up." -msgstr "le GPIO16 ne supporte pas le tirage (pull-up)" +#: shared-module/bitbangio/I2C.c +msgid "Clock stretch too long" +msgstr "Période de l'horloge trop longue" -#: ports/esp8266/common-hal/microcontroller/__init__.c:66 -msgid "ESP8226 does not support safe mode." -msgstr "l'ESP8266 ne supporte pas le mode sans-échec" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Clock unit in use" +msgstr "Horloge en cours d'utilisation" -#: ports/esp8266/common-hal/pulseio/PWMOut.c:54 -#: ports/esp8266/common-hal/pulseio/PWMOut.c:113 -#, c-format -msgid "Maximum PWM frequency is %dhz." -msgstr "La fréquence de PWM maximale est %dHz" +#: shared-bindings/_pew/PewPew.c +msgid "Column entry must be digitalio.DigitalInOut" +msgstr "" -#: ports/esp8266/common-hal/pulseio/PWMOut.c:57 -#: ports/esp8266/common-hal/pulseio/PWMOut.c:116 -msgid "Minimum PWM frequency is 1hz." -msgstr "La fréquence de PWM minimale est 1Hz" +#: shared-bindings/displayio/FourWire.c shared-bindings/displayio/ParallelBus.c +#, fuzzy +msgid "Command must be an int between 0 and 255" +msgstr "Les octets 'bytes' doivent être entre 0 et 255" -#: ports/esp8266/common-hal/pulseio/PWMOut.c:68 +#: ports/nrf/common-hal/bleio/UUID.c #, c-format -msgid "Multiple PWM frequencies not supported. PWM already set to %dhz." +msgid "Could not decode ble_uuid, err 0x%04x" msgstr "" -"Les fréquences de PWM multiples ne sont pas supportées. PWM réglé à %dHz" - -#: ports/esp8266/common-hal/pulseio/PWMOut.c:77 ports/esp8266/machine_pwm.c:70 -#, c-format -msgid "PWM not supported on pin %d" -msgstr "La broche %d ne supporte pas le PWM" -#: ports/esp8266/common-hal/pulseio/PulseIn.c:78 -msgid "No PulseIn support for %q" -msgstr "Pas de support de PulseIn pour %q" +#: ports/atmel-samd/common-hal/busio/UART.c +msgid "Could not initialize UART" +msgstr "L'UART n'a pu être initialisé" -#: ports/esp8266/common-hal/storage/__init__.c:34 -msgid "Unable to remount filesystem" -msgstr "Impossible de remonter le système de fichiers" +#: shared-module/audioio/Mixer.c shared-module/audioio/WaveFile.c +msgid "Couldn't allocate first buffer" +msgstr "Impossible d'allouer le 1er tampon" -#: ports/esp8266/common-hal/storage/__init__.c:38 -msgid "Use esptool to erase flash and re-upload Python instead" -msgstr "" -"Utilisez 'esptool' pour effacer la flash et rechargez Python à la place" +#: shared-module/audioio/Mixer.c shared-module/audioio/WaveFile.c +msgid "Couldn't allocate second buffer" +msgstr "Impossible d'allouer le 2e tampon" -#: ports/esp8266/esp_mphal.c:154 -msgid "C-level assert" +#: supervisor/shared/safe_mode.c +msgid "Crash into the HardFault_Handler.\n" msgstr "" -#: ports/esp8266/machine_adc.c:57 -#, c-format -msgid "not a valid ADC Channel: %d" -msgstr "canal ADC non valide : %d" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "DAC already in use" +msgstr "DAC déjà utilisé" -#: ports/esp8266/machine_hspi.c:131 ports/esp8266/machine_hspi.c:137 -msgid "impossible baudrate" -msgstr "débit impossible" +#: ports/atmel-samd/common-hal/displayio/ParallelBus.c +#: ports/nrf/common-hal/displayio/ParallelBus.c +#, fuzzy +msgid "Data 0 pin must be byte aligned" +msgstr "le graphic doit être long de 2048 octets" -#: ports/esp8266/machine_pin.c:129 -msgid "expecting a pin" -msgstr "une broche (Pin) est attendue" +#: shared-module/audioio/WaveFile.c +msgid "Data chunk must follow fmt chunk" +msgstr "Un bloc de données doit suivre un bloc de format" -#: ports/esp8266/machine_pin.c:284 -msgid "Pin(16) doesn't support pull" -msgstr "Pin(16) ne supporte pas le tirage (pull)" +#: ports/nrf/common-hal/bleio/Broadcaster.c +#: ports/nrf/common-hal/bleio/Peripheral.c +msgid "Data too large for advertisement packet" +msgstr "" -#: ports/esp8266/machine_pin.c:323 -msgid "invalid pin" -msgstr "broche invalide" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Data too large for the advertisement packet" +msgstr "" -#: ports/esp8266/machine_pin.c:389 -msgid "pin does not have IRQ capabilities" -msgstr "la broche ne supporte pas les interruptions (IRQ)" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Destination capacity is smaller than destination_length." +msgstr "La capacité de la cible est plus petite que destination_length." -#: ports/esp8266/machine_rtc.c:185 -msgid "buffer too long" -msgstr "tampon trop long" +#: shared-bindings/displayio/Display.c +msgid "Display rotation must be in 90 degree increments" +msgstr "" -#: ports/esp8266/machine_rtc.c:209 ports/esp8266/machine_rtc.c:223 -#: ports/esp8266/machine_rtc.c:246 -msgid "invalid alarm" -msgstr "alarme invalide" +#: ports/unix/modffi.c +msgid "Don't know how to pass object to native function" +msgstr "Ne sais pas comment passer l'objet à une fonction native" -#: ports/esp8266/machine_uart.c:169 -#, c-format -msgid "UART(%d) does not exist" -msgstr "UART(%d) n'existe pas" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Drive mode not used when direction is input." +msgstr "Le mode Drive n'est pas utilisé quand la direction est 'input'." -#: ports/esp8266/machine_uart.c:219 -msgid "UART(1) can't read" -msgstr "UART(1) ne peut pas lire" +#: ports/esp8266/common-hal/microcontroller/__init__.c +msgid "ESP8226 does not support safe mode." +msgstr "l'ESP8266 ne supporte pas le mode sans-échec" -#: ports/esp8266/modesp.c:119 -msgid "len must be multiple of 4" -msgstr "'len' doit être un multiple de 4" +#: ports/esp8266/common-hal/digitalio/DigitalInOut.c +msgid "ESP8266 does not support pull down." +msgstr "L'ESP8266 ne supporte pas le rappel (pull-down)" -#: ports/esp8266/modesp.c:274 -#, c-format -msgid "memory allocation failed, allocating %u bytes for native code" -msgstr "" -"l'allocation de mémoire a échoué en allouant %u octets pour un code natif" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +msgid "EXTINT channel already in use" +msgstr "Canal EXTINT déjà utilisé" -#: ports/esp8266/modesp.c:317 -msgid "flash location must be below 1MByte" -msgstr "l'emplacement en mémoire flash doit être inférieure à 1Mo" +#: ports/unix/modffi.c +msgid "Error in ffi_prep_cif" +msgstr "Erreur dans ffi_prep_cif" -#: ports/esp8266/modmachine.c:63 -msgid "frequency can only be either 80Mhz or 160MHz" -msgstr "la fréquence doit être soit 80MHz soit 160MHz" +#: extmod/modure.c +msgid "Error in regex" +msgstr "Erreur dans l'expression régulière" -#: ports/esp8266/modnetwork.c:61 -msgid "AP required" -msgstr "'AP' requis" +#: shared-bindings/pulseio/PulseOut.c shared-bindings/neopixel_write/__init__.c +#: shared-bindings/terminalio/Terminal.c shared-bindings/microcontroller/Pin.c +msgid "Expected a %q" +msgstr "Attendu : %q" -#: ports/esp8266/modnetwork.c:61 -msgid "STA required" -msgstr "'STA' requis" +#: shared-bindings/bleio/CharacteristicBuffer.c +#, fuzzy +msgid "Expected a Characteristic" +msgstr "Impossible d'ajouter la Characteristic." -#: ports/esp8266/modnetwork.c:87 -msgid "Cannot update i/f status" -msgstr "le status i/f ne peut être mis à jour" +#: shared-bindings/bleio/Descriptor.c shared-bindings/bleio/Service.c +#: shared-bindings/bleio/Characteristic.c +#, fuzzy +msgid "Expected a UUID" +msgstr "Attendu : %q" -#: ports/esp8266/modnetwork.c:142 -msgid "Cannot set STA config" -msgstr "Impossible de configurer STA" +#: shared-module/_pixelbuf/PixelBuf.c +#, c-format +msgid "Expected tuple of length %d, got %d" +msgstr "" -#: ports/esp8266/modnetwork.c:144 -msgid "Cannot connect to AP" -msgstr "Impossible de se connecter à 'AP'" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to acquire mutex" +msgstr "Echec de l'obtention de mutex, status: 0x%08lX" -#: ports/esp8266/modnetwork.c:152 -msgid "Cannot disconnect from AP" -msgstr "Impossible de se déconnecter de 'AP'" +#: ports/nrf/common-hal/bleio/Characteristic.c ports/nrf/sd_mutex.c +#, fuzzy, c-format +msgid "Failed to acquire mutex, err 0x%04x" +msgstr "Echec de l'obtention de mutex, status: 0x%08lX" -#: ports/esp8266/modnetwork.c:173 -msgid "unknown status param" -msgstr "paramètre de status inconnu" +#: ports/nrf/common-hal/bleio/Service.c +#, fuzzy, c-format +msgid "Failed to add characteristic, err 0x%04x" +msgstr "Echec de l'ajout de caractéristique, statut: 0x%08lX" -#: ports/esp8266/modnetwork.c:222 -msgid "STA must be active" -msgstr "'STA' doit être actif" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to add service" +msgstr "Echec de l'ajout de service, statut: 0x%08lX" -#: ports/esp8266/modnetwork.c:239 -msgid "scan failed" -msgstr "échec du scan" +#: ports/nrf/common-hal/bleio/Peripheral.c +#, fuzzy, c-format +msgid "Failed to add service, err 0x%04x" +msgstr "Echec de l'ajout de service, statut: 0x%08lX" -#: ports/esp8266/modnetwork.c:306 -msgid "wifi_set_ip_info() failed" -msgstr "wifi_set_ip_info() a échoué" +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "Failed to allocate RX buffer" +msgstr "Echec de l'allocation du tampon RX" -#: ports/esp8266/modnetwork.c:319 -msgid "either pos or kw args are allowed" -msgstr "soit 'pos', soit 'kw' est permis en argument" +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +#: ports/nrf/common-hal/pulseio/PulseIn.c +#: ports/esp8266/common-hal/pulseio/PulseIn.c +#, c-format +msgid "Failed to allocate RX buffer of %d bytes" +msgstr "Echec de l'allocation de %d octets du tampon RX" -#: ports/esp8266/modnetwork.c:329 -msgid "can't get STA config" -msgstr "impossible de récupérer la config de 'STA'" +#: ports/nrf/common-hal/bleio/Adapter.c +#, fuzzy +msgid "Failed to change softdevice state" +msgstr "Echec de la modification de l'état du périph., erreur: 0x%08lX" -#: ports/esp8266/modnetwork.c:331 -msgid "can't get AP config" -msgstr "impossible de récupérer la config de 'AP'" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to connect:" +msgstr "Connection impossible. statut: 0x%08lX" -#: ports/esp8266/modnetwork.c:346 -msgid "invalid buffer length" -msgstr "longueur de tampon invalide" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to continue scanning" +msgstr "Impossible de commencer à scanner. statut: 0x%0xlX" -#: ports/esp8266/modnetwork.c:405 -msgid "can't set STA config" -msgstr "impossible de régler la config de 'STA'" +#: ports/nrf/common-hal/bleio/Scanner.c +#, fuzzy, c-format +msgid "Failed to continue scanning, err 0x%04x" +msgstr "Impossible de commencer à scanner. statut: 0x%0xlX" -#: ports/esp8266/modnetwork.c:407 -msgid "can't set AP config" -msgstr "impossible de régler la config de 'AP'" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to create mutex" +msgstr "Echec de la création de mutex, statut: 0x%0xlX" -#: ports/esp8266/modnetwork.c:416 -msgid "can query only one param" -msgstr "ne peut demander qu'un seul paramètre" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to discover services" +msgstr "Echec de la découverte de services, statut: 0x%08lX" -#: ports/esp8266/modnetwork.c:469 -msgid "unknown config param" -msgstr "paramètre de config. inconnu" +#: ports/nrf/common-hal/bleio/Adapter.c +#, fuzzy +msgid "Failed to get local address" +msgstr "Echec de l'obtention de l'adresse locale, erreur: 0x%08lX" -#: ports/nrf/common-hal/analogio/AnalogOut.c:37 -msgid "AnalogOut functionality not supported" -msgstr "AnalogOut non supporté" +#: ports/nrf/common-hal/bleio/Adapter.c +#, fuzzy +msgid "Failed to get softdevice state" +msgstr "Echec de l'obtention de l'état du périph., erreur: 0x%08lX" -#: ports/nrf/common-hal/bleio/Adapter.c:41 +#: ports/nrf/common-hal/bleio/Characteristic.c #, c-format -msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX" +msgid "Failed to notify or indicate attribute value, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Adapter.c:125 -#, c-format -msgid "Failed to change softdevice state, error: 0x%08lX" -msgstr "Echec de la modification de l'état du périph., erreur: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Adapter.c:135 -#, c-format -msgid "Failed to get softdevice state, error: 0x%08lX" -msgstr "Echec de l'obtention de l'état du périph., erreur: 0x%08lX" +#: ports/nrf/common-hal/bleio/Characteristic.c +#, fuzzy, c-format +msgid "Failed to read CCCD value, err 0x%04x" +msgstr "Impossible de lire la valeur de l'attribut. status: 0x%08lX" -#: ports/nrf/common-hal/bleio/Adapter.c:155 +#: ports/nrf/common-hal/bleio/Characteristic.c #, c-format -msgid "Failed to get local address, error: 0x%08lX" -msgstr "Echec de l'obtention de l'adresse locale, erreur: 0x%08lX" +msgid "Failed to read attribute value, err 0x%04x" +msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:52 +#: ports/nrf/common-hal/bleio/Characteristic.c #, fuzzy, c-format -msgid "Failed to write gatts value, status: 0x%08lX" +msgid "Failed to read gatts value, err 0x%04x" msgstr "Impossible d'écrire la valeur de gatts. status: 0x%08lX" -#: ports/nrf/common-hal/bleio/Characteristic.c:76 +#: ports/nrf/common-hal/bleio/UUID.c #, fuzzy, c-format -msgid "Failed to notify attribute value, status: 0x%08lX" -msgstr "Impossible de notifier la valeur de l'attribut. status: 0x%08lX" +msgid "Failed to register Vendor-Specific UUID, err 0x%04x" +msgstr "Echec de l'ajout de l'UUID Vendor Specific, , statut: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to release mutex" +msgstr "Impossible de libérer mutex, status: 0x%08lX" -#: ports/nrf/common-hal/bleio/Characteristic.c:91 +#: ports/nrf/common-hal/bleio/Characteristic.c ports/nrf/sd_mutex.c #, fuzzy, c-format -msgid "Failed to read attribute value, status: 0x%08lX" -msgstr "Impossible de lire la valeur de l'attribut. status: 0x%08lX" +msgid "Failed to release mutex, err 0x%04x" +msgstr "Impossible de libérer mutex, status: 0x%08lX" -#: ports/nrf/common-hal/bleio/Characteristic.c:119 -#: ports/nrf/common-hal/bleio/Device.c:272 -#: ports/nrf/common-hal/bleio/Device.c:307 -#, c-format -msgid "Failed to acquire mutex, status: 0x%08lX" -msgstr "Echec de l'obtention de mutex, status: 0x%08lX" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to start advertising" +msgstr "Echec de l'ajout de service, statut: 0x%08lX" -#: ports/nrf/common-hal/bleio/Characteristic.c:126 +#: ports/nrf/common-hal/bleio/Broadcaster.c +#: ports/nrf/common-hal/bleio/Peripheral.c #, fuzzy, c-format -msgid "Failed to write attribute value, status: 0x%08lX" -msgstr "Impossible d'écrire la valeur de l'attribut. status: 0x%08lX" +msgid "Failed to start advertising, err 0x%04x" +msgstr "Impossible de commencer à scanner, statut: 0x%0xlX" -#: ports/nrf/common-hal/bleio/Characteristic.c:138 -#: ports/nrf/common-hal/bleio/Device.c:284 -#: ports/nrf/common-hal/bleio/Device.c:319 -#: ports/nrf/common-hal/bleio/Device.c:354 -#: ports/nrf/common-hal/bleio/Device.c:391 -#, c-format -msgid "Failed to release mutex, status: 0x%08lX" -msgstr "Impossible de libérer mutex, status: 0x%08lX" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to start scanning" +msgstr "Impossible de commencer à scanner, statut: 0x%0xlX" -#: ports/nrf/common-hal/bleio/Device.c:81 -#: ports/nrf/common-hal/bleio/Device.c:114 -msgid "Can not fit data into the advertisment packet" -msgstr "" +#: ports/nrf/common-hal/bleio/Scanner.c +#, fuzzy, c-format +msgid "Failed to start scanning, err 0x%04x" +msgstr "Impossible de commencer à scanner, statut: 0x%0xlX" -#: ports/nrf/common-hal/bleio/Device.c:266 +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to stop advertising" +msgstr "Echec de l'ajout de service, statut: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Broadcaster.c +#: ports/nrf/common-hal/bleio/Peripheral.c #, fuzzy, c-format -msgid "Failed to discover serivices, status: 0x%08lX" -msgstr "Echec de la découverte de services, statut: 0x%08lX" +msgid "Failed to stop advertising, err 0x%04x" +msgstr "Echec de l'ajout de service, statut: 0x%08lX" -#: ports/nrf/common-hal/bleio/Device.c:403 -#: ports/nrf/common-hal/bleio/Scanner.c:76 +#: ports/nrf/common-hal/bleio/Characteristic.c #, fuzzy, c-format -msgid "Failed to continue scanning, status: 0x%0xlX" -msgstr "Impossible de commencer à scanner. statut: 0x%0xlX" +msgid "Failed to write attribute value, err 0x%04x" +msgstr "Impossible d'écrire la valeur de l'attribut. status: 0x%08lX" -#: ports/nrf/common-hal/bleio/Device.c:436 +#: ports/nrf/common-hal/bleio/Characteristic.c #, fuzzy, c-format -msgid "Failed to connect, status: 0x%08lX" -msgstr "Connection impossible. statut: 0x%08lX" +msgid "Failed to write gatts value, err 0x%04x" +msgstr "Impossible d'écrire la valeur de gatts. status: 0x%08lX" + +#: py/moduerrno.c +msgid "File exists" +msgstr "Le fichier existe" + +#: ports/nrf/supervisor/internal_flash.c +msgid "Flash erase failed" +msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:513 +#: ports/nrf/supervisor/internal_flash.c #, c-format -msgid "Failed to add service, status: 0x%08lX" -msgstr "Echec de l'ajout de service, statut: 0x%08lX" +msgid "Flash erase failed to start, err 0x%04x" +msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:531 +#: ports/nrf/supervisor/internal_flash.c +msgid "Flash write failed" +msgstr "" + +#: ports/nrf/supervisor/internal_flash.c #, c-format -msgid "Failed to start advertisment, status: 0x%08lX" +msgid "Flash write failed to start, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:549 -#, fuzzy, c-format -msgid "Failed to stop advertisment, status: 0x%08lX" -msgstr "Echec de l'ajout de service, statut: 0x%08lX" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +msgid "Frequency captured is above capability. Capture Paused." +msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:575 -#: ports/nrf/common-hal/bleio/Scanner.c:103 -#, fuzzy, c-format -msgid "Failed to start scanning, status: 0x%0xlX" -msgstr "Impossible de commencer à scanner, statut: 0x%0xlX" +#: shared-bindings/bitbangio/SPI.c shared-bindings/bitbangio/I2C.c +#: shared-bindings/busio/SPI.c shared-bindings/busio/I2C.c +msgid "Function requires lock" +msgstr "La fonction nécessite un verrou" -#: ports/nrf/common-hal/bleio/Device.c:592 -#, fuzzy, c-format -msgid "Failed to create mutex, status: 0x%0xlX" -msgstr "Echec de la création de mutex, statut: 0x%0xlX" +#: ports/esp8266/common-hal/digitalio/DigitalInOut.c +msgid "GPIO16 does not support pull up." +msgstr "le GPIO16 ne supporte pas le tirage (pull-up)" -#: ports/nrf/common-hal/bleio/Service.c:83 -#, c-format -msgid "Failed to add characteristic, status: 0x%08lX" -msgstr "Echec de l'ajout de caractéristique, statut: 0x%08lX" +#: shared-module/displayio/Group.c +msgid "Group full" +msgstr "Groupe plein" -#: ports/nrf/common-hal/bleio/UUID.c:97 -#, fuzzy, c-format -msgid "Failed to add Vendor Specific UUID, status: 0x%08lX" -msgstr "Echec de l'ajout de l'UUID Vendor Specific, , statut: 0x%08lX" +#: ports/unix/file.c extmod/vfs_posix_file.c py/objstringio.c +msgid "I/O operation on closed file" +msgstr "opération d'E/S sur un fichier fermé" -#: ports/nrf/common-hal/bleio/UUID.c:102 -msgid "Invalid UUID string length" -msgstr "Longeur de chaîne UUID invalide" +#: extmod/machine_i2c.c +msgid "I2C operation not supported" +msgstr "opération sur I2C non supportée" -#: ports/nrf/common-hal/bleio/UUID.c:109 -#: shared-bindings/bleio/Characteristic.c:125 -#: shared-bindings/bleio/Service.c:105 -msgid "Invalid UUID parameter" -msgstr "Paramètre UUID invalide" +#: py/persistentcode.c +msgid "" +"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/" +"mpy-update for more info." +msgstr "" +"Fichier .mpy incompatible. Merci de mettre à jour tous les .mpy. Voirhttp://" +"adafru.it/mpy-update pour plus d'informations." -#: ports/nrf/common-hal/busio/I2C.c:96 -#, fuzzy -msgid "All I2C peripherals are in use" -msgstr "Tous les périphériques I2C sont utilisés" +#: shared-bindings/_pew/PewPew.c +msgid "Incorrect buffer size" +msgstr "" + +#: py/moduerrno.c +msgid "Input/output error" +msgstr "Erreur d'entrée/sortie" -#: ports/nrf/common-hal/busio/SPI.c:133 +#: shared-module/displayio/OnDiskBitmap.c #, fuzzy -msgid "All SPI peripherals are in use" -msgstr "Tous les périphériques SPI sont utilisés" +msgid "Invalid BMP file" +msgstr "Fichier invalide" -#: ports/nrf/common-hal/busio/UART.c:49 -#, c-format -msgid "error = 0x%08lX" -msgstr "erreur = 0x%08lX" +#: ports/atmel-samd/common-hal/pulseio/PWMOut.c +#: ports/nrf/common-hal/pulseio/PWMOut.c shared-bindings/pulseio/PWMOut.c +msgid "Invalid PWM frequency" +msgstr "Fréquence de PWM invalide" -#: ports/nrf/common-hal/busio/UART.c:110 +#: py/moduerrno.c +msgid "Invalid argument" +msgstr "Argument invalide" + +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Invalid bit clock pin" +msgstr "Broche invalide pour 'bit clock'" + +#: ports/nrf/common-hal/busio/UART.c #, fuzzy msgid "Invalid buffer size" msgstr "longueur de tampon invalide" -#: ports/nrf/common-hal/busio/UART.c:114 -#, fuzzy -msgid "Odd parity is not supported" -msgstr "parité impaire non supportée" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +msgid "Invalid capture period. Valid range: 1 - 500" +msgstr "" -#: ports/nrf/common-hal/busio/UART.c:346 ports/nrf/common-hal/busio/UART.c:350 -#: ports/nrf/common-hal/busio/UART.c:355 ports/nrf/common-hal/busio/UART.c:360 -#: ports/nrf/common-hal/busio/UART.c:366 ports/nrf/common-hal/busio/UART.c:371 -#: ports/nrf/common-hal/busio/UART.c:376 ports/nrf/common-hal/busio/UART.c:380 -#: ports/nrf/common-hal/busio/UART.c:388 +#: shared-bindings/audioio/Mixer.c #, fuzzy -msgid "busio.UART not available" -msgstr "busio.UART n'est pas disponible" +msgid "Invalid channel count" +msgstr "Argument invalide" -#: ports/nrf/common-hal/microcontroller/Processor.c:49 -#, c-format -msgid "Can not get temperature. status: 0x%02x" -msgstr "Impossible de lire la température. status: 0x%02x" +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Invalid clock pin" +msgstr "Broche d'horloge invalide" + +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Invalid data pin" +msgstr "Broche de données invalide" + +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Invalid direction." +msgstr "Direction invalide" + +#: shared-module/audioio/WaveFile.c +msgid "Invalid file" +msgstr "Fichier invalide" + +#: shared-module/audioio/WaveFile.c +msgid "Invalid format chunk size" +msgstr "Taille de bloc de formatage invalide" + +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "Invalid number of bits" +msgstr "Nombre de bits invalide" + +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "Invalid phase" +msgstr "Phase invalide" + +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: ports/atmel-samd/common-hal/touchio/TouchIn.c +#: shared-bindings/pulseio/PWMOut.c +msgid "Invalid pin" +msgstr "Broche invalide" + +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Invalid pin for left channel" +msgstr "Broche invalide pour le canal gauche" + +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Invalid pin for right channel" +msgstr "Broche invalide pour le canal droit" + +#: ports/atmel-samd/common-hal/i2cslave/I2CSlave.c +#: ports/atmel-samd/common-hal/busio/UART.c +#: ports/atmel-samd/common-hal/busio/SPI.c +#: ports/atmel-samd/common-hal/busio/I2C.c ports/nrf/common-hal/busio/I2C.c +msgid "Invalid pins" +msgstr "Broches invalides" + +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "Invalid polarity" +msgstr "Polarité invalide" -#: ports/nrf/common-hal/pulseio/PWMOut.c:161 +#: shared-bindings/microcontroller/__init__.c +msgid "Invalid run mode." +msgstr "Mode de lancement invalide" + +#: shared-bindings/audioio/Mixer.c #, fuzzy -msgid "All PWM peripherals are in use" -msgstr "Tous les périphériques PWM sont utilisés" +msgid "Invalid voice count" +msgstr "Type de service invalide" -#: ports/unix/modffi.c:138 -msgid "Unknown type" -msgstr "Type inconnu" +#: shared-module/audioio/WaveFile.c +msgid "Invalid wave file" +msgstr "Fichier WAVE invalide" -#: ports/unix/modffi.c:207 ports/unix/modffi.c:265 -msgid "Error in ffi_prep_cif" -msgstr "Erreur dans ffi_prep_cif" +#: py/compile.c +msgid "LHS of keyword arg must be an id" +msgstr "La partie gauche de l'argument nommé doit être un identifiant" -#: ports/unix/modffi.c:270 -msgid "ffi_prep_closure_loc" +#: shared-module/displayio/Group.c +msgid "Layer must be a Group or TileGrid subclass." msgstr "" -#: ports/unix/modffi.c:413 -msgid "Don't know how to pass object to native function" -msgstr "Ne sais pas comment passer l'objet à une fonction native" +#: py/objslice.c +msgid "Length must be an int" +msgstr "La longueur doit être entière" -#: ports/unix/modusocket.c:474 -#, c-format -msgid "[addrinfo error %d]" +#: py/objslice.c +msgid "Length must be non-negative" +msgstr "La longueur ne doit pas être négative" + +#: supervisor/shared/safe_mode.c +msgid "" +"Looks like our core CircuitPython code crashed hard. Whoops!\n" +"Please file an issue at https://github.com/adafruit/circuitpython/issues\n" +" with the contents of your CIRCUITPY drive and this message:\n" msgstr "" +"On dirait que notre code CircuitPython a durement planté. Oups !\n" +"Merci de remplir un ticket sur https://github.com/adafruit/circuitpython/" +"issues\n" +"avec le contenu de votre lecteur CIRCUITPY et ce message:\n" -#: py/argcheck.c:44 -msgid "function does not take keyword arguments" -msgstr "la fonction ne prend pas d'arguments nommés" +#: shared-module/bitbangio/SPI.c +msgid "MISO pin init failed." +msgstr "Echec de l'init. de la broche MISO" -#: py/argcheck.c:54 py/bc.c:85 py/objnamedtuple.c:104 +#: shared-module/bitbangio/SPI.c +msgid "MOSI pin init failed." +msgstr "Echec de l'init. de la broche MOSI" + +#: ports/esp8266/common-hal/pulseio/PWMOut.c #, c-format -msgid "function takes %d positional arguments but %d were given" -msgstr "la fonction prend %d argument(s) mais %d ont été donné(s)" +msgid "Maximum PWM frequency is %dhz." +msgstr "La fréquence de PWM maximale est %dHz" -#: py/argcheck.c:64 +#: shared-module/displayio/Shape.c #, c-format -msgid "function missing %d required positional arguments" -msgstr "il manque %d arguments obligatoires à la fonction" +msgid "Maximum x value when mirrored is %d" +msgstr "" + +#: supervisor/shared/safe_mode.c +msgid "MicroPython NLR jump failed. Likely memory corruption.\n" +msgstr "" -#: py/argcheck.c:72 +#: supervisor/shared/safe_mode.c +msgid "MicroPython fatal error.\n" +msgstr "Erreur fatale de MicroPython.\n" + +#: shared-bindings/audiobusio/PDMIn.c +msgid "Microphone startup delay must be in range 0.0 to 1.0" +msgstr "Le délais au démarrage du micro doit être entre 0.0 et 1.0" + +#: ports/esp8266/common-hal/pulseio/PWMOut.c +msgid "Minimum PWM frequency is 1hz." +msgstr "La fréquence de PWM minimale est 1Hz" + +#: ports/esp8266/common-hal/pulseio/PWMOut.c #, c-format -msgid "function expected at most %d arguments, got %d" -msgstr "la fonction attendait au plus %d arguments, reçu %d" +msgid "Multiple PWM frequencies not supported. PWM already set to %dhz." +msgstr "" +"Les fréquences de PWM multiples ne sont pas supportées. PWM réglé à %dHz" -#: py/argcheck.c:97 -msgid "'%q' argument required" -msgstr "'%q' argument requis" +#: shared-bindings/displayio/Display.c +msgid "Must be a Group subclass." +msgstr "" -#: py/argcheck.c:122 -msgid "extra positional arguments given" -msgstr "argument positionnel donné en plus" +#: ports/atmel-samd/common-hal/analogio/AnalogOut.c +msgid "No DAC on chip" +msgstr "Pas de DAC sur la puce" -#: py/argcheck.c:130 -msgid "extra keyword arguments given" -msgstr "argument nommé donné en plus" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "No DMA channel found" +msgstr "Aucun canal DMA trouvé" -#: py/argcheck.c:142 -msgid "argument num/types mismatch" -msgstr "argument num/types ne correspond pas" +#: ports/esp8266/common-hal/pulseio/PulseIn.c +msgid "No PulseIn support for %q" +msgstr "Pas de support de PulseIn pour %q" -#: py/argcheck.c:147 -msgid "keyword argument(s) not yet implemented - use normal args instead" +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "No RX pin" +msgstr "Pas de broche RX" + +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "No TX pin" +msgstr "Pas de broche TX" + +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +msgid "No available clocks" msgstr "" -"argument(s) nommé(s) pas encore implémenté - utilisez les arguments normaux" -#: py/bc.c:88 py/objnamedtuple.c:108 -msgid "%q() takes %d positional arguments but %d were given" -msgstr "%q() prend %d arguments mais %d ont été donnés" +#: supervisor/shared/board_busses.c +msgid "No default I2C bus" +msgstr "Pas de bus I2C par défaut" -#: py/bc.c:197 py/bc.c:215 -msgid "unexpected keyword argument" -msgstr "argument nommé imprévu" +#: supervisor/shared/board_busses.c +msgid "No default SPI bus" +msgstr "Pas de bus SPI par défaut" -#: py/bc.c:199 -msgid "keywords must be strings" -msgstr "les noms doivent être des chaînes de caractère" +#: supervisor/shared/board_busses.c +msgid "No default UART bus" +msgstr "Pas de bus UART par défaut" -#: py/bc.c:206 py/objnamedtuple.c:138 -msgid "function got multiple values for argument '%q'" -msgstr "la fonction a reçu plusieurs valeurs pour l'argument '%q'" +#: ports/atmel-samd/common-hal/touchio/TouchIn.c +msgid "No free GCLKs" +msgstr "Pas de GCLK libre" -#: py/bc.c:218 py/objnamedtuple.c:130 -msgid "unexpected keyword argument '%q'" -msgstr "argument nommé '%q' imprévu" +#: shared-bindings/os/__init__.c +msgid "No hardware random available" +msgstr "Pas de source matérielle d'aléa disponible" -#: py/bc.c:244 -#, c-format -msgid "function missing required positional argument #%d" -msgstr "il manque l'argument obligatoire #%d" +#: ports/esp8266/common-hal/analogio/AnalogOut.c +msgid "No hardware support for analog out." +msgstr "Pas de support matériel pour une sortie analogique" -#: py/bc.c:260 -msgid "function missing required keyword argument '%q'" -msgstr "il manque l'argument nommé obligatoire '%q'" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +msgid "No hardware support on pin" +msgstr "Pas de support matériel pour cette broche" -#: py/bc.c:269 -msgid "function missing keyword-only argument" -msgstr "il manque l'argument nommé obligatoire" +#: py/moduerrno.c +msgid "No space left on device" +msgstr "" -#: py/binary.c:112 -msgid "bad typecode" -msgstr "mauvais code type" +#: py/moduerrno.c +msgid "No such file/directory" +msgstr "Fichier/dossier introuvable" -#: py/builtinevex.c:99 -msgid "bad compile mode" -msgstr "mauvais mode de compilation" +#: shared-bindings/bleio/CharacteristicBuffer.c +#, fuzzy +msgid "Not connected" +msgstr "Impossible de se connecter à 'AP'" -#: py/builtinhelp.c:137 -msgid "Plus any modules on the filesystem\n" +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "Not connected." msgstr "" -#: py/builtinhelp.c:183 -#, c-format +#: shared-bindings/audiobusio/I2SOut.c shared-bindings/audioio/AudioOut.c +msgid "Not playing" +msgstr "Ne joue pas" + +#: shared-bindings/util.c msgid "" -"Welcome to Adafruit CircuitPython %s!\n" -"\n" -"Please visit learn.adafruit.com/category/circuitpython for project guides.\n" -"\n" -"To list built-in modules please do `help(\"modules\")`.\n" +"Object has been deinitialized and can no longer be used. Create a new object." msgstr "" -"Bienvenue sur Adafruit CircuitPython %s!\n" -"\n" -"Vistez learn.adafruit.com/category/circuitpython pour des guides.\n" -"\n" -"Pour lister les modules inclus, tapez `help(\"modules\")`.\n" +"L'objet a été désinitialisé et ne peut plus être utilisé. Créez un nouvel " +"objet." -#: py/builtinimport.c:336 -msgid "cannot perform relative import" -msgstr "ne peut pas réaliser un import relatif" +#: ports/nrf/common-hal/busio/UART.c +#, fuzzy +msgid "Odd parity is not supported" +msgstr "parité impaire non supportée" -#: py/builtinimport.c:420 py/builtinimport.c:532 -msgid "module not found" -msgstr "module introuvable" +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Only 8 or 16 bit mono with " +msgstr "Uniquement 8 ou 16 bit mono avec " -#: py/builtinimport.c:423 py/builtinimport.c:535 -msgid "no module named '%q'" -msgstr "pas de module '%q'" +#: shared-module/displayio/OnDiskBitmap.c +#, c-format +msgid "" +"Only Windows format, uncompressed BMP supported: given header size is %d" +msgstr "" -#: py/builtinimport.c:510 -msgid "relative import" -msgstr "import relatif" +#: shared-module/displayio/Bitmap.c +msgid "Only bit maps of 8 bit color or less are supported" +msgstr "Seules les bitmaps de 8bits par couleur ou moins sont supportées" -#: py/compile.c:397 py/compile.c:542 -msgid "can't assign to expression" -msgstr "ne peut pas assigner à l'expression" +#: shared-module/displayio/OnDiskBitmap.c +#, c-format +msgid "" +"Only monochrome, indexed 8bpp, and 16bpp or greater BMPs supported: %d bpp " +"given" +msgstr "" -#: py/compile.c:416 -msgid "multiple *x in assignment" -msgstr "*x multiple dans l'assignement" +#: shared-bindings/_pixelbuf/PixelBuf.c +#, fuzzy +msgid "Only slices with step=1 (aka None) are supported" +msgstr "seuls les slices avec 'step=1' (cad None) sont supportées" -#: py/compile.c:642 -msgid "non-default argument follows default argument" +#: ports/esp8266/common-hal/busio/UART.c +msgid "Only tx supported on UART1 (GPIO2)." +msgstr "Seul le tx est supporté sur l'UART1 (GPIO2)." + +#: shared-bindings/audiobusio/PDMIn.c +msgid "Oversample must be multiple of 8." +msgstr "Le sur-échantillonage doit être un multiple de 8." + +#: shared-bindings/pulseio/PWMOut.c +msgid "" +"PWM duty_cycle must be between 0 and 65535 inclusive (16 bit resolution)" msgstr "" -"un argument sans valeur par défaut suit un argument avec valeur par défaut" +"La valeur de cycle PWM doit être entre 0 et 65535 inclus (résolution de 16 " +"bits)" -#: py/compile.c:771 py/compile.c:789 -msgid "invalid micropython decorator" -msgstr "décorateur micropython invalide" +#: shared-bindings/pulseio/PWMOut.c +#, fuzzy +msgid "" +"PWM frequency not writable when variable_frequency is False on construction." +msgstr "" +"La fréquence de PWM n'est pas modifiable quand variable_frequency est False " +"à la construction." -#: py/compile.c:943 -msgid "can't delete expression" -msgstr "ne peut pas supprimer l'expression" +#: ports/esp8266/common-hal/pulseio/PWMOut.c ports/esp8266/machine_pwm.c +#, c-format +msgid "PWM not supported on pin %d" +msgstr "La broche %d ne supporte pas le PWM" -#: py/compile.c:955 -msgid "'break' outside loop" -msgstr "'break' en dehors d'une boucle" +#: py/moduerrno.c +msgid "Permission denied" +msgstr "Permission refusée" -#: py/compile.c:958 -msgid "'continue' outside loop" -msgstr "'continue' en dehors d'une boucle" +#: ports/esp8266/common-hal/analogio/AnalogIn.c +msgid "Pin %q does not have ADC capabilities" +msgstr "La broche %q n'a pas de convertisseur analogique-digital" -#: py/compile.c:969 -msgid "'return' outside function" -msgstr "'return' en dehors d'une fonction" +#: ports/atmel-samd/common-hal/analogio/AnalogIn.c +#: ports/nrf/common-hal/analogio/AnalogIn.c +msgid "Pin does not have ADC capabilities" +msgstr "la broche ne peut être utilisé pour l'ADC" -#: py/compile.c:1169 -msgid "identifier redefined as global" -msgstr "identifiant redéfini comme global" +#: ports/esp8266/machine_pin.c +msgid "Pin(16) doesn't support pull" +msgstr "Pin(16) ne supporte pas le tirage (pull)" -#: py/compile.c:1185 -msgid "no binding for nonlocal found" -msgstr "pas de lien trouvé pour nonlocal" +#: ports/esp8266/common-hal/busio/SPI.c +msgid "Pins not valid for SPI" +msgstr "Broche invalide pour le SPI" -#: py/compile.c:1188 -msgid "identifier redefined as nonlocal" -msgstr "identifiant redéfini comme nonlocal" +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "Pixel beyond bounds of buffer" +msgstr "" -#: py/compile.c:1197 -msgid "can't declare nonlocal in outer code" -msgstr "ne peut déclarer de nonlocal dans un code externe" +#: py/builtinhelp.c +#, fuzzy +msgid "Plus any modules on the filesystem\n" +msgstr "Impossible de remonter le système de fichiers" -#: py/compile.c:1542 -msgid "default 'except' must be last" -msgstr "l''except' par défaut doit être en dernier" +#: main.c +msgid "Press any key to enter the REPL. Use CTRL-D to reload." +msgstr "Appuyez sur une touche pour entrer sur REPL ou CTRL-D pour recharger." -#: py/compile.c:2095 -msgid "*x must be assignment target" -msgstr "*x doit être la cible de l'assignement" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Pull not used when direction is output." +msgstr "Le tirage 'pull' n'est pas utilisé quand la direction est 'output'." -#: py/compile.c:2193 -msgid "super() can't find self" -msgstr "super() ne peut pas trouver self" +#: shared-bindings/rtc/RTC.c +msgid "RTC calibration is not supported on this board" +msgstr "calibration de la RTC non supportée sur cette carte" -#: py/compile.c:2256 -msgid "can't have multiple *x" -msgstr "il ne peut y avoir de *x multiples" +#: shared-bindings/rtc/RTC.c shared-bindings/time/__init__.c +msgid "RTC is not supported on this board" +msgstr "RTC non supportée sur cette carte" -#: py/compile.c:2263 -msgid "can't have multiple **x" -msgstr "il ne peut y avoir de **x multiples" +#: shared-bindings/_pixelbuf/PixelBuf.c +#, fuzzy +msgid "Range out of bounds" +msgstr "adresse hors limites" -#: py/compile.c:2271 -msgid "LHS of keyword arg must be an id" -msgstr "La partie gauche de l'argument nommé doit être un identifiant" +#: shared-bindings/pulseio/PulseIn.c +msgid "Read-only" +msgstr "Lecture seule" -#: py/compile.c:2287 -msgid "non-keyword arg after */**" -msgstr "argument non-nommé après */**" +#: extmod/vfs_fat.c py/moduerrno.c +msgid "Read-only filesystem" +msgstr "Système de fichier en lecture seule" -#: py/compile.c:2291 -msgid "non-keyword arg after keyword arg" -msgstr "argument non-nommé après argument nommé" +#: shared-module/displayio/Bitmap.c +#, fuzzy +msgid "Read-only object" +msgstr "Lecture seule" -#: py/compile.c:2463 py/compile.c:2473 py/compile.c:2712 py/compile.c:2742 -#: py/parse.c:1176 -msgid "invalid syntax" -msgstr "syntaxe invalide" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Right channel unsupported" +msgstr "Canal droit non supporté" -#: py/compile.c:2465 -msgid "expecting key:value for dict" -msgstr "couple clef:valeur attendu pour un objet dict" +#: shared-bindings/_pew/PewPew.c +msgid "Row entry must be digitalio.DigitalInOut" +msgstr "" -#: py/compile.c:2475 -msgid "expecting just a value for set" -msgstr "une simple valeur est attendue pour set" +#: main.c +msgid "Running in safe mode! Auto-reload is off.\n" +msgstr "Mode sans-échec. Auto-rechargement désactivé.\n" -#: py/compile.c:2600 -msgid "'yield' outside function" -msgstr "'yield' en dehors d'une fonction" +#: main.c +msgid "Running in safe mode! Not running saved code.\n" +msgstr "Mode sans-échec! Le code sauvegardé ne s'éxecute pas.\n" -#: py/compile.c:2619 -msgid "'await' outside function" -msgstr "'await' en dehors d'une fonction" +#: ports/atmel-samd/common-hal/busio/I2C.c +msgid "SDA or SCL needs a pull up" +msgstr "SDA ou SCL a besoin d'une résistance de tirage ('pull up')" -#: py/compile.c:2774 -msgid "name reused for argument" -msgstr "nom réutilisé comme argument" +#: ports/esp8266/modnetwork.c +msgid "STA must be active" +msgstr "'STA' doit être actif" -#: py/compile.c:2827 -msgid "parameter annotation must be an identifier" -msgstr "l'annotation du paramètre doit être un identifiant" +#: ports/esp8266/modnetwork.c +msgid "STA required" +msgstr "'STA' requis" -#: py/compile.c:2969 py/compile.c:3137 -msgid "return annotation must be an identifier" -msgstr "l'annotation de return doit être un identifiant" +#: shared-bindings/audioio/Mixer.c +#, fuzzy +msgid "Sample rate must be positive" +msgstr "le taux d'échantillonage doit être positif" -#: py/compile.c:3097 -msgid "inline assembler must be a function" -msgstr "l'assembleur doit être une fonction" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#, c-format +msgid "Sample rate too high. It must be less than %d" +msgstr "Taux d'échantillonage trop élevé. Doit être inf. à %d" -#: py/compile.c:3134 -msgid "unknown type" -msgstr "type inconnu" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Serializer in use" +msgstr "Sérialiseur en cours d'utilisation" -#: py/compile.c:3154 -msgid "expecting an assembler instruction" -msgstr "une instruction assembleur est attendue" +#: shared-bindings/nvm/ByteArray.c +msgid "Slice and value different lengths." +msgstr "Slice et valeur de tailles différentes" -#: py/compile.c:3184 -msgid "'label' requires 1 argument" -msgstr "'label' nécessite 1 argument" +#: shared-bindings/displayio/Bitmap.c shared-bindings/displayio/TileGrid.c +#: shared-bindings/displayio/Group.c shared-bindings/pulseio/PulseIn.c +msgid "Slices not supported" +msgstr "Slices non supportées" -#: py/compile.c:3190 -msgid "label redefined" -msgstr "label redéfini" +#: ports/nrf/common-hal/bleio/Adapter.c +#, c-format +msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX" +msgstr "" -#: py/compile.c:3196 -msgid "'align' requires 1 argument" -msgstr "'align' nécessite 1 argument" +#: extmod/modure.c +msgid "Splitting with sub-captures" +msgstr "Fractionnement avec des captures 'sub'" -#: py/compile.c:3205 -msgid "'data' requires at least 2 arguments" -msgstr "'data' nécessite au moins 2 arguments" +#: shared-bindings/supervisor/__init__.c +msgid "Stack size must be at least 256" +msgstr "La pile doit être au moins de 256" -#: py/compile.c:3212 -msgid "'data' requires integer arguments" -msgstr "'data' nécessite des arguments entiers" +#: shared-bindings/multiterminal/__init__.c +msgid "Stream missing readinto() or write() method." +msgstr "Il manque une méthode readinto() ou write() au flux." -#: py/emitinlinethumb.c:102 -msgid "can only have up to 4 parameters to Thumb assembly" -msgstr "il peut y avoir jusqu'à 4 paramètres pour Thumb assembly" +#: supervisor/shared/safe_mode.c +msgid "" +"The CircuitPython heap was corrupted because the stack was too small.\n" +"Please increase stack size limits and press reset (after ejecting " +"CIRCUITPY).\n" +"If you didn't change the stack, then file an issue here with the contents of " +"your CIRCUITPY drive:\n" +msgstr "" +"La pile de CircuitPython a été corrompue parce que la pile était trop " +"petite.\n" +"Augmentez la limite de taille de la pile et appuyez sur 'reset' (après avoir " +"éjecter CIRCUITPY).\n" +"Si vous n'avez pas modifié la pile, merci de remplir un ticket avec le " +"contenu de votre lecteur CIRCUITPY :\n" -#: py/emitinlinethumb.c:107 py/emitinlinethumb.c:112 +#: supervisor/shared/safe_mode.c #, fuzzy -msgid "parameters must be registers in sequence r0 to r3" -msgstr "les paramètres doivent être des registres dans la séquence r0 à r3" +msgid "" +"The microcontroller's power dipped. Please make sure your power supply " +"provides\n" +"enough power for the whole circuit and press reset (after ejecting " +"CIRCUITPY).\n" +msgstr "" +"L'alimentation du microcontroleur a chuté. Merci de vérifier que votre " +"alimentation fournit\n" +"suffisamment de puissance pour l'ensemble du circuit et appuyez sur " +"'reset' (après avoir éjecter CIRCUITPY).\n" -#: py/emitinlinethumb.c:188 py/emitinlinethumb.c:230 -#, fuzzy, c-format -msgid "'%s' expects at most r%d" -msgstr "'%s' attend un registre" +#: supervisor/shared/safe_mode.c +msgid "" +"The reset button was pressed while booting CircuitPython. Press again to " +"exit safe mode.\n" +msgstr "" +"Le bouton 'reset' a été appuyé pendant le démarrage de CircuitPython. " +"Appuyer denouveau pour quitter de le mode sans-échec.\n" -#: py/emitinlinethumb.c:197 py/emitinlinextensa.c:162 -#, c-format -msgid "'%s' expects a register" -msgstr "'%s' attend un registre" +#: shared-module/audioio/Mixer.c +msgid "The sample's bits_per_sample does not match the mixer's" +msgstr "Le bits_per_sample de l'échantillon ne correspond pas à celui du mixer" -#: py/emitinlinethumb.c:211 -#, fuzzy, c-format -msgid "'%s' expects a special register" -msgstr "'%s' attend un registre special" +#: shared-module/audioio/Mixer.c +msgid "The sample's channel count does not match the mixer's" +msgstr "Le canal de l'échantillon ne correspond pas à celui du mixer" -#: py/emitinlinethumb.c:239 -#, fuzzy, c-format -msgid "'%s' expects an FPU register" -msgstr "'%s' attend un registre FPU" +#: shared-module/audioio/Mixer.c +msgid "The sample's sample rate does not match the mixer's" +msgstr "L'échantillonage de l'échantillon ne correspond pas à celui du mixer" -#: py/emitinlinethumb.c:292 -#, fuzzy, c-format -msgid "'%s' expects {r0, r1, ...}" -msgstr "'%s' attend {r0, r1, ...}" +#: shared-module/audioio/Mixer.c +msgid "The sample's signedness does not match the mixer's" +msgstr "Le signe de l'échantillon ne correspond pas au mixer" -#: py/emitinlinethumb.c:299 py/emitinlinextensa.c:169 -#, c-format -msgid "'%s' expects an integer" -msgstr "'%s' attend un entier" +#: shared-bindings/displayio/TileGrid.c +msgid "Tile height must exactly divide bitmap height" +msgstr "" -#: py/emitinlinethumb.c:304 -#, fuzzy, c-format -msgid "'%s' integer 0x%x does not fit in mask 0x%x" -msgstr "'%s' l'entier 0x%x ne correspond pas au masque 0x%x" +#: shared-bindings/displayio/TileGrid.c +msgid "Tile indices must be 0 - 255" +msgstr "" -#: py/emitinlinethumb.c:328 -#, fuzzy, c-format -msgid "'%s' expects an address of the form [a, b]" -msgstr "'%s' attend une adresse de la forme [a, b]" +#: shared-bindings/displayio/TileGrid.c +msgid "Tile width must exactly divide bitmap width" +msgstr "" -#: py/emitinlinethumb.c:334 py/emitinlinextensa.c:182 -#, c-format -msgid "'%s' expects a label" -msgstr "'%s' attend un label" +#: supervisor/shared/safe_mode.c +msgid "To exit, please reset the board without " +msgstr "Pour quitter, redémarrez la carte SVP sans " -#: py/emitinlinethumb.c:345 py/emitinlinextensa.c:193 -msgid "label '%q' not defined" -msgstr "label '%q' non supporté" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Too many channels in sample." +msgstr "Trop de canaux dans l'échantillon." -#: py/emitinlinethumb.c:806 -#, fuzzy, c-format -msgid "unsupported Thumb instruction '%s' with %d arguments" -msgstr "instruction Thumb '%s' non supportée avec %d arguments" +#: shared-bindings/displayio/FourWire.c shared-bindings/displayio/ParallelBus.c +msgid "Too many display busses" +msgstr "" -#: py/emitinlinethumb.c:810 -#, fuzzy -msgid "branch not in range" -msgstr "argument de chr() hors de la gamme range(256)" +#: shared-bindings/displayio/Display.c +msgid "Too many displays" +msgstr "" -#: py/emitinlinextensa.c:86 -msgid "can only have up to 4 parameters to Xtensa assembly" -msgstr "Maximum 4 paramètres pour l'assembleur Xtensa" +#: py/obj.c +msgid "Traceback (most recent call last):\n" +msgstr "Trace (appels les plus récents en dernier):\n" -#: py/emitinlinextensa.c:91 py/emitinlinextensa.c:96 -msgid "parameters must be registers in sequence a2 to a5" -msgstr "les paramètres doivent être des registres dans la séquence a2 à a5" +#: shared-bindings/time/__init__.c +msgid "Tuple or struct_time argument required" +msgstr "Argument de type tuple ou struct_time nécessaire" -#: py/emitinlinextensa.c:174 +#: ports/esp8266/machine_uart.c #, c-format -msgid "'%s' integer %d is not within range %d..%d" -msgstr "'%s' l'entier %d n'est pas dans la gamme %d..%d" +msgid "UART(%d) does not exist" +msgstr "UART(%d) n'existe pas" + +#: ports/esp8266/machine_uart.c +msgid "UART(1) can't read" +msgstr "UART(1) ne peut pas lire" + +#: shared-module/usb_hid/Device.c +msgid "USB Busy" +msgstr "USB occupé" + +#: shared-module/usb_hid/Device.c +msgid "USB Error" +msgstr "Erreur USB" -#: py/emitinlinextensa.c:327 +#: shared-bindings/bleio/UUID.c +msgid "UUID integer value not in range 0 to 0xffff" +msgstr "" + +#: shared-bindings/bleio/UUID.c +msgid "UUID string not 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'" +msgstr "" + +#: shared-bindings/bleio/UUID.c +msgid "UUID value is not str, int or byte buffer" +msgstr "" + +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Unable to allocate buffers for signed conversion" +msgstr "Impossible d'allouer des tampons pour une conversion signée" + +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Unable to find free GCLK" +msgstr "Impossible de trouver un GCLK libre" + +#: py/parse.c +msgid "Unable to init parser" +msgstr "Impossible d'initialiser le parser" + +#: shared-module/displayio/OnDiskBitmap.c +msgid "Unable to read color palette data" +msgstr "" + +#: ports/esp8266/common-hal/storage/__init__.c +msgid "Unable to remount filesystem" +msgstr "Impossible de remonter le système de fichiers" + +#: shared-bindings/nvm/ByteArray.c +msgid "Unable to write to nvm." +msgstr "Impossible d'écrire sur la nvm." + +#: ports/nrf/common-hal/bleio/UUID.c +#, fuzzy +msgid "Unexpected nrfx uuid type" +msgstr "indentation inattendue" + +#: ports/unix/modffi.c +msgid "Unknown type" +msgstr "Type inconnu" + +#: shared-bindings/_pixelbuf/PixelBuf.c #, c-format -msgid "unsupported Xtensa instruction '%s' with %d arguments" -msgstr "instruction Xtensa '%s' non supportée avec %d arguments" +msgid "Unmatched number of items on RHS (expected %d, got %d)." +msgstr "" -#: py/emitnative.c:183 -msgid "unknown type '%q'" -msgstr "type '%q' inconnu" +#: ports/atmel-samd/common-hal/busio/I2C.c +msgid "Unsupported baudrate" +msgstr "Débit non supporté" -#: py/emitnative.c:260 -msgid "Viper functions don't currently support more than 4 arguments" -msgstr "les fonctions Viper ne supportent pas plus de 4 arguments actuellement" +#: shared-module/displayio/Display.c +#, fuzzy +msgid "Unsupported display bus type" +msgstr "type de bitmap non supporté" -#: py/emitnative.c:742 -msgid "conversion to object" -msgstr "conversion en objet" +#: shared-module/audioio/WaveFile.c +msgid "Unsupported format" +msgstr "Format non supporté" -#: py/emitnative.c:921 -msgid "local '%q' used before type known" -msgstr "variable locale '%q' utilisée avant d'en connaitre le type" +#: py/moduerrno.c +msgid "Unsupported operation" +msgstr "Opération non supportée" -#: py/emitnative.c:1118 py/emitnative.c:1156 -msgid "can't load from '%q'" -msgstr "impossible de charger depuis '%q'" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Unsupported pull value." +msgstr "Valeur de tirage 'pull' non supportée." -#: py/emitnative.c:1128 -msgid "can't load with '%q' index" -msgstr "impossible de charger avec l'index '%q'" +#: ports/esp8266/common-hal/storage/__init__.c +msgid "Use esptool to erase flash and re-upload Python instead" +msgstr "" +"Utilisez 'esptool' pour effacer la flash et rechargez Python à la place" -#: py/emitnative.c:1188 -msgid "local '%q' has type '%q' but source is '%q'" -msgstr "la variable locale '%q' a le type '%q' mais la source est '%q'" +#: py/emitnative.c +msgid "Viper functions don't currently support more than 4 arguments" +msgstr "les fonctions Viper ne supportent pas plus de 4 arguments actuellement" -#: py/emitnative.c:1289 py/emitnative.c:1379 -msgid "can't store '%q'" -msgstr "impossible de stocker '%q'" +#: shared-module/audioio/Mixer.c +msgid "Voice index too high" +msgstr "Index de la voix trop grand" -#: py/emitnative.c:1358 py/emitnative.c:1419 -msgid "can't store to '%q'" -msgstr "impossible de stocker vers '%q'" +#: main.c +msgid "WARNING: Your code filename has two extensions\n" +msgstr "ATTENTION: le nom de fichier de votre code a deux extensions\n" -#: py/emitnative.c:1369 -msgid "can't store with '%q' index" -msgstr "impossible de stocker avec un index '%q'" +#: py/builtinhelp.c +#, c-format +msgid "" +"Welcome to Adafruit CircuitPython %s!\n" +"\n" +"Please visit learn.adafruit.com/category/circuitpython for project guides.\n" +"\n" +"To list built-in modules please do `help(\"modules\")`.\n" +msgstr "" +"Bienvenue sur Adafruit CircuitPython %s!\n" +"\n" +"Vistez learn.adafruit.com/category/circuitpython pour des guides.\n" +"\n" +"Pour lister les modules inclus, tapez `help(\"modules\")`.\n" -#: py/emitnative.c:1540 -msgid "can't implicitly convert '%q' to 'bool'" -msgstr "impossible de convertir implicitement '%q' en 'bool'" +#: supervisor/shared/safe_mode.c +#, fuzzy +msgid "" +"You are running in safe mode which means something unanticipated happened.\n" +msgstr "" +"Vous êtes en mode sans-échec ce qui signifie qu'un imprévu est survenu.\n" -#: py/emitnative.c:1774 -msgid "unary op %q not implemented" -msgstr "opération unaire '%q' non implémentée" +#: supervisor/shared/safe_mode.c +msgid "You requested starting safe mode by " +msgstr "Vous avez demandé à démarrer en mode sans-échec par " -#: py/emitnative.c:1930 -msgid "binary op %q not implemented" -msgstr "opération binaire '%q' non implémentée" +#: ports/unix/modusocket.c +#, c-format +msgid "[addrinfo error %d]" +msgstr "" -#: py/emitnative.c:1951 -msgid "can't do binary op between '%q' and '%q'" -msgstr "opération binaire impossible entre '%q' et '%q'" +#: py/objtype.c +msgid "__init__() should return None" +msgstr "__init__() doit retourner None" -#: py/emitnative.c:2126 -msgid "casting" -msgstr "typage" +#: py/objtype.c +#, c-format +msgid "__init__() should return None, not '%s'" +msgstr "__init__() doit retourner None, pas '%s'" -#: py/emitnative.c:2173 -msgid "return expected '%q' but got '%q'" -msgstr "return attendait '%q' mais a reçu '%q'" +#: py/objobject.c +msgid "__new__ arg must be a user-type" +msgstr "l'argument __new__ doit être d'un type défini par l'utilisateur" -#: py/emitnative.c:2191 -msgid "must raise an object" -msgstr "doit lever un objet" +#: extmod/modubinascii.c extmod/moduhashlib.c +msgid "a bytes-like object is required" +msgstr "un objet 'bytes-like' est requis" -#: py/emitnative.c:2201 -msgid "native yield" -msgstr "native yield" +#: lib/embed/abort_.c +msgid "abort() called" +msgstr "abort() appelé" -#: py/lexer.c:345 -msgid "unicode name escapes" -msgstr "échappements de nom unicode" +#: ports/unix/modmachine.c extmod/machine_mem.c +#, c-format +msgid "address %08x is not aligned to %d bytes" +msgstr "l'adresse %08x n'est pas alignée sur %d octets" -#: py/modbuiltins.c:162 -msgid "chr() arg not in range(0x110000)" -msgstr "argument de chr() hors de la gamme range(0x11000)" +#: shared-bindings/i2cslave/I2CSlave.c +msgid "address out of bounds" +msgstr "adresse hors limites" -#: py/modbuiltins.c:171 -msgid "chr() arg not in range(256)" -msgstr "argument de chr() hors de la gamme range(256)" +#: shared-bindings/i2cslave/I2CSlave.c +msgid "addresses is empty" +msgstr "adresses vides" -#: py/modbuiltins.c:285 +#: py/modbuiltins.c msgid "arg is an empty sequence" msgstr "l'argument est une séquence vide" -#: py/modbuiltins.c:350 -msgid "ord expects a character" -msgstr "ord attend un caractère" +#: py/runtime.c +msgid "argument has wrong type" +msgstr "l'argument est d'un mauvais type" -#: py/modbuiltins.c:353 -#, c-format -msgid "ord() expected a character, but string of length %d found" -msgstr "ord() attend un caractère mais une chaîne de longueur %d a été trouvée" +#: py/argcheck.c +msgid "argument num/types mismatch" +msgstr "argument num/types ne correspond pas" -#: py/modbuiltins.c:363 -msgid "3-arg pow() not supported" -msgstr "pow() avec 3 arguments non supporté" +#: py/runtime.c +msgid "argument should be a '%q' not a '%q'" +msgstr "l'argument devrait être un(e) '%q', pas '%q'" -#: py/modbuiltins.c:517 -msgid "must use keyword argument for key function" -msgstr "il faut utiliser un argument nommé pour une fonction key" +#: shared-bindings/nvm/ByteArray.c py/objarray.c +msgid "array/bytes required on right side" +msgstr "tableau/octets requis à droite" -#: py/modmath.c:41 shared-bindings/math/__init__.c:53 -msgid "math domain error" -msgstr "erreur de domaine math" +#: py/objstr.c +msgid "attributes not supported yet" +msgstr "attribut pas encore supporté" -#: py/modmath.c:196 py/objfloat.c:270 py/objint_longlong.c:222 -#: py/objint_mpz.c:230 py/runtime.c:619 shared-bindings/math/__init__.c:346 -msgid "division by zero" -msgstr "division par zéro" +#: ports/nrf/common-hal/bleio/Characteristic.c +msgid "bad GATT role" +msgstr "" -#: py/modmicropython.c:155 -msgid "schedule stack full" -msgstr "pile de plannification pleine" +#: py/builtinevex.c +msgid "bad compile mode" +msgstr "mauvais mode de compilation" -#: py/modstruct.c:145 py/modstruct.c:153 py/modstruct.c:234 py/modstruct.c:244 -#: shared-bindings/struct/__init__.c:103 shared-bindings/struct/__init__.c:145 -#: shared-module/struct/__init__.c:91 shared-module/struct/__init__.c:175 -msgid "buffer too small" -msgstr "tampon trop petit" +#: py/objstr.c +msgid "bad conversion specifier" +msgstr "mauvaise spécification de conversion" -#: py/modthread.c:240 -msgid "expecting a dict for keyword args" -msgstr "un dict est attendu pour les arguments nommés" +#: py/objstr.c +msgid "bad format string" +msgstr "chaîne mal-formée" -#: py/moduerrno.c:147 py/moduerrno.c:150 -msgid "Permission denied" -msgstr "Permission refusée" +#: py/binary.c +msgid "bad typecode" +msgstr "mauvais code type" -#: py/moduerrno.c:148 -msgid "No such file/directory" -msgstr "Fichier/dossier introuvable" +#: py/emitnative.c +msgid "binary op %q not implemented" +msgstr "opération binaire '%q' non implémentée" -#: py/moduerrno.c:149 -msgid "Input/output error" -msgstr "Erreur d'entrée/sortie" +#: shared-bindings/busio/UART.c +msgid "bits must be 7, 8 or 9" +msgstr "bits doivent être 7, 8 ou 9" -#: py/moduerrno.c:151 -msgid "File exists" -msgstr "Le fichier existe" +#: extmod/machine_spi.c +msgid "bits must be 8" +msgstr "les bits doivent être 8" -#: py/moduerrno.c:152 -msgid "Unsupported operation" -msgstr "Opération non supportée" +#: shared-bindings/audioio/Mixer.c +#, fuzzy +msgid "bits_per_sample must be 8 or 16" +msgstr "bits doivent être 8 ou 16" -#: py/moduerrno.c:153 -msgid "Invalid argument" -msgstr "Argument invalide" +#: py/emitinlinethumb.c +#, fuzzy +msgid "branch not in range" +msgstr "argument de chr() hors de la gamme range(256)" -#: py/obj.c:92 -msgid "Traceback (most recent call last):\n" -msgstr "Trace (appels les plus récents en dernier):\n" +#: shared-bindings/_pixelbuf/PixelBuf.c +#, c-format +msgid "buf is too small. need %d bytes" +msgstr "" -#: py/obj.c:96 -msgid " File \"%q\", line %d" -msgstr " Fichier \"%q\", ligne %d" +#: shared-bindings/audioio/RawSample.c +msgid "buffer must be a bytes-like object" +msgstr "le tampon doit être un objet bytes-like" -#: py/obj.c:98 -msgid " File \"%q\"" -msgstr " Fichier \"%q\"" +#: shared-module/struct/__init__.c +#, fuzzy +msgid "buffer size must match format" +msgstr "les slices de tampon doivent être de longueurs égales" -#: py/obj.c:102 -msgid ", in %q\n" -msgstr ", dans %q\n" +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "buffer slices must be of equal length" +msgstr "les slices de tampon doivent être de longueurs égales" -#: py/obj.c:259 -msgid "can't convert to int" -msgstr "ne peut convertir en entier (int)" +#: ports/esp8266/machine_rtc.c +msgid "buffer too long" +msgstr "tampon trop long" -#: py/obj.c:262 -#, c-format -msgid "can't convert %s to int" -msgstr "ne peut convertir %s en entier (int)" +#: shared-bindings/struct/__init__.c shared-module/struct/__init__.c +#: py/modstruct.c +msgid "buffer too small" +msgstr "tampon trop petit" -#: py/obj.c:322 -msgid "can't convert to float" -msgstr "ne peut convertir en nombre à virgule flottante (float)" +#: extmod/machine_spi.c +msgid "buffers must be the same length" +msgstr "les tampons doivent être de la même longueur" -#: py/obj.c:325 -#, c-format -msgid "can't convert %s to float" -msgstr "ne peut convertir %s en nombre à virgule flottante (float)" +#: shared-bindings/_pew/PewPew.c +msgid "buttons must be digitalio.DigitalInOut" +msgstr "" -#: py/obj.c:355 -msgid "can't convert to complex" -msgstr "ne peut convertir en nombre complexe" +#: py/vm.c +msgid "byte code not implemented" +msgstr "bytecode non implémenté" -#: py/obj.c:358 +#: shared-bindings/_pixelbuf/PixelBuf.c #, c-format -msgid "can't convert %s to complex" -msgstr "ne peut convertir %s en nombre complexe" +msgid "byteorder is not an instance of ByteOrder (got a %s)" +msgstr "" -#: py/obj.c:373 -msgid "expected tuple/list" -msgstr "un tuple ou une liste est attendu" +#: ports/atmel-samd/common-hal/busio/UART.c +msgid "bytes > 8 bits not supported" +msgstr "octets > 8 bits non supporté" -#: py/obj.c:376 -#, c-format -msgid "object '%s' is not a tuple or list" -msgstr "l'objet '%s' n'est pas un tuple ou une liste" +#: py/objstr.c +msgid "bytes value out of range" +msgstr "valeur des octets hors gamme" -#: py/obj.c:387 -msgid "tuple/list has wrong length" -msgstr "tuple/liste a une mauvaise longueur" +#: ports/atmel-samd/bindings/samd/Clock.c +msgid "calibration is out of range" +msgstr "calibration hors gamme" -#: py/obj.c:389 -#, c-format -msgid "requested length %d but object has length %d" -msgstr "la longueur requise est %d mais l'objet est long de %d" +#: ports/atmel-samd/bindings/samd/Clock.c +msgid "calibration is read only" +msgstr "calibration en lecture seule" -#: py/obj.c:402 -msgid "indices must be integers" -msgstr "les indices doivent être des entiers" +#: ports/atmel-samd/common-hal/rtc/RTC.c +msgid "calibration value out of range +/-127" +msgstr "valeur de calibration hors gamme +/-127" -#: py/obj.c:405 -msgid "%q indices must be integers, not %s" -msgstr "les indices %q doivent être des entiers, pas %s" +#: py/emitinlinethumb.c +msgid "can only have up to 4 parameters to Thumb assembly" +msgstr "il peut y avoir jusqu'à 4 paramètres pour Thumb assembly" -#: py/obj.c:425 -msgid "%q index out of range" -msgstr "index %q hors gamme" +#: py/emitinlinextensa.c +msgid "can only have up to 4 parameters to Xtensa assembly" +msgstr "Maximum 4 paramètres pour l'assembleur Xtensa" -#: py/obj.c:457 -msgid "object has no len" -msgstr "l'objet n'a pas de len" +#: py/persistentcode.c +msgid "can only save bytecode" +msgstr "ne peut sauvegarder que du bytecode" -#: py/obj.c:460 -#, c-format -msgid "object of type '%s' has no len()" -msgstr "l'objet de type '%s' n'a pas de len()" +#: ports/esp8266/modnetwork.c +msgid "can query only one param" +msgstr "ne peut demander qu'un seul paramètre" -#: py/obj.c:500 -msgid "object does not support item deletion" -msgstr "l'objet ne supporte pas la suppression d'éléments" +#: py/objtype.c +msgid "can't add special method to already-subclassed class" +msgstr "" +"impossible d'ajouter une méthode spécial à une classe déjà sous-classée" -#: py/obj.c:503 +#: py/compile.c +msgid "can't assign to expression" +msgstr "ne peut pas assigner à l'expression" + +#: py/obj.c #, c-format -msgid "'%s' object does not support item deletion" -msgstr "l'objet '%s' ne supporte pas la suppression d'éléments" +msgid "can't convert %s to complex" +msgstr "ne peut convertir %s en nombre complexe" -#: py/obj.c:507 -msgid "object is not subscriptable" -msgstr "l'objet n'est pas sous-scriptable" +#: py/obj.c +#, c-format +msgid "can't convert %s to float" +msgstr "ne peut convertir %s en nombre à virgule flottante (float)" -#: py/obj.c:510 +#: py/obj.c #, c-format -msgid "'%s' object is not subscriptable" -msgstr "l'objet '%s' n'est pas sous-scriptable" +msgid "can't convert %s to int" +msgstr "ne peut convertir %s en entier (int)" -#: py/obj.c:514 -msgid "object does not support item assignment" -msgstr "l'objet ne supporte pas l'assignation d'éléments" +#: py/objstr.c +msgid "can't convert '%q' object to %q implicitly" +msgstr "impossible de convertir l'objet '%q' en '%q' implicitement" -#: py/obj.c:517 -#, c-format -msgid "'%s' object does not support item assignment" -msgstr "l'objet '%s' ne supporte pas l'assignation d'éléments" +#: py/objint.c +msgid "can't convert NaN to int" +msgstr "on ne peut convertir NaN en int" -#: py/obj.c:548 -msgid "object with buffer protocol required" -msgstr "un objet avec un protocol de tampon est nécessaire" +#: shared-bindings/i2cslave/I2CSlave.c +#, fuzzy +msgid "can't convert address to int" +msgstr "ne peut convertir %s en entier int" -#: py/objarray.c:413 py/objstr.c:427 py/objstrunicode.c:191 py/objtuple.c:187 -#: shared-bindings/nvm/ByteArray.c:85 -msgid "only slices with step=1 (aka None) are supported" -msgstr "seuls les slices avec 'step=1' (cad None) sont supportées" +#: py/objint.c +msgid "can't convert inf to int" +msgstr "on ne peut convertir inf en int" -#: py/objarray.c:426 -msgid "lhs and rhs should be compatible" -msgstr "Les parties gauches et droites doivent être compatibles" +#: py/obj.c +msgid "can't convert to complex" +msgstr "ne peut convertir en nombre complexe" -#: py/objarray.c:444 shared-bindings/nvm/ByteArray.c:107 -msgid "array/bytes required on right side" -msgstr "tableau/octets requis à droite" +#: py/obj.c +msgid "can't convert to float" +msgstr "ne peut convertir en nombre à virgule flottante (float)" + +#: py/obj.c +msgid "can't convert to int" +msgstr "ne peut convertir en entier (int)" + +#: py/objstr.c +msgid "can't convert to str implicitly" +msgstr "impossible de convertir en str implicitement" + +#: py/compile.c +msgid "can't declare nonlocal in outer code" +msgstr "ne peut déclarer de nonlocal dans un code externe" + +#: py/compile.c +msgid "can't delete expression" +msgstr "ne peut pas supprimer l'expression" + +#: py/emitnative.c +msgid "can't do binary op between '%q' and '%q'" +msgstr "opération binaire impossible entre '%q' et '%q'" -#: py/objcomplex.c:203 +#: py/objcomplex.c msgid "can't do truncated division of a complex number" msgstr "on ne peut pas faire de division tronquée de nombres complexes" -#: py/objcomplex.c:209 -msgid "complex division by zero" -msgstr "division complexe par zéro" +#: ports/esp8266/modnetwork.c +msgid "can't get AP config" +msgstr "impossible de récupérer la config de 'AP'" -#: py/objcomplex.c:237 -msgid "0.0 to a complex power" -msgstr "0.0 à une puissance complexe" +#: ports/esp8266/modnetwork.c +msgid "can't get STA config" +msgstr "impossible de récupérer la config de 'STA'" -#: py/objdeque.c:107 -msgid "full" -msgstr "plein" +#: py/compile.c +msgid "can't have multiple **x" +msgstr "il ne peut y avoir de **x multiples" -#: py/objdeque.c:127 -msgid "empty" -msgstr "vide" +#: py/compile.c +msgid "can't have multiple *x" +msgstr "il ne peut y avoir de *x multiples" -#: py/objdict.c:314 -msgid "popitem(): dictionary is empty" -msgstr "popitem(): dictionnaire vide" +#: py/emitnative.c +msgid "can't implicitly convert '%q' to 'bool'" +msgstr "impossible de convertir implicitement '%q' en 'bool'" -#: py/objdict.c:357 -msgid "dict update sequence has wrong length" -msgstr "la séquence de mise à jour de dict a une mauvaise longueur" +#: py/emitnative.c +msgid "can't load from '%q'" +msgstr "impossible de charger depuis '%q'" -#: py/objfloat.c:308 py/parsenum.c:331 -msgid "complex values not supported" -msgstr "valeurs complexes non supportées" +#: py/emitnative.c +msgid "can't load with '%q' index" +msgstr "impossible de charger avec l'index '%q'" -#: py/objgenerator.c:108 +#: py/objgenerator.c +msgid "can't pend throw to just-started generator" +msgstr "" + +#: py/objgenerator.c msgid "can't send non-None value to a just-started generator" msgstr "" "on ne peut envoyer une valeur autre que None à un générateur fraîchement " "démarré" -#: py/objgenerator.c:126 -msgid "generator already executing" -msgstr "générateur déjà en cours d'exécution" +#: ports/esp8266/modnetwork.c +msgid "can't set AP config" +msgstr "impossible de régler la config de 'AP'" -#: py/objgenerator.c:229 -msgid "generator ignored GeneratorExit" -msgstr "le générateur a ignoré GeneratorExit" +#: ports/esp8266/modnetwork.c +msgid "can't set STA config" +msgstr "impossible de régler la config de 'STA'" -#: py/objgenerator.c:251 -msgid "can't pend throw to just-started generator" +#: py/objnamedtuple.c +msgid "can't set attribute" +msgstr "attribut non modifiable" + +#: py/emitnative.c +msgid "can't store '%q'" +msgstr "impossible de stocker '%q'" + +#: py/emitnative.c +msgid "can't store to '%q'" +msgstr "impossible de stocker vers '%q'" + +#: py/emitnative.c +msgid "can't store with '%q' index" +msgstr "impossible de stocker avec un index '%q'" + +#: py/objstr.c +msgid "" +"can't switch from automatic field numbering to manual field specification" msgstr "" +"impossible de passer d'une énumération auto des champs à une spécification " +"manuelle" -#: py/objint.c:144 -msgid "can't convert inf to int" -msgstr "on ne peut convertir inf en int" +#: py/objstr.c +msgid "" +"can't switch from manual field specification to automatic field numbering" +msgstr "" +"impossible de passer d'une spécification manuelle des champs à une " +"énumération auto" -#: py/objint.c:146 -msgid "can't convert NaN to int" -msgstr "on ne peut convertir NaN en int" +#: py/objtype.c +msgid "cannot create '%q' instances" +msgstr "ne peut pas créer une instance de '%q'" -#: py/objint.c:163 -msgid "float too big" -msgstr "nombre flottant trop grand" +#: py/objtype.c +msgid "cannot create instance" +msgstr "ne peut pas créer une instance" -#: py/objint.c:328 -msgid "long int not supported in this build" -msgstr "entiers longs non supportés dans cette build" +#: py/runtime.c +msgid "cannot import name %q" +msgstr "ne peut pas importer le nom %q" -#: py/objint.c:334 py/objint.c:340 py/objint.c:350 py/objint.c:358 -msgid "small int overflow" -msgstr "dépassement de capacité d'un entier court" +#: py/builtinimport.c +msgid "cannot perform relative import" +msgstr "ne peut pas réaliser un import relatif" -#: py/objint_longlong.c:189 py/objint_mpz.c:283 py/runtime.c:486 -msgid "negative power with no float support" -msgstr "puissance négative sans support des nombres flottants" +#: py/emitnative.c +msgid "casting" +msgstr "typage" -#: py/objint_longlong.c:251 -msgid "ulonglong too large" -msgstr "ulonglong trop grand" +#: shared-bindings/bleio/Service.c +msgid "characteristics includes an object that is not a Characteristic" +msgstr "" -#: py/objint_mpz.c:267 py/runtime.c:396 py/runtime.c:411 -msgid "negative shift count" -msgstr "compte de décalage négatif" +#: shared-bindings/_stage/Text.c +msgid "chars buffer too small" +msgstr "tampon de caractères trop petit" -#: py/objint_mpz.c:336 -msgid "pow() with 3 arguments requires integers" -msgstr "pow() avec 3 arguments nécessite des entiers" +#: py/modbuiltins.c +msgid "chr() arg not in range(0x110000)" +msgstr "argument de chr() hors de la gamme range(0x11000)" -#: py/objint_mpz.c:347 -msgid "pow() 3rd argument cannot be 0" -msgstr "le 3e argument de pow() ne peut être 0" +#: py/modbuiltins.c +msgid "chr() arg not in range(256)" +msgstr "argument de chr() hors de la gamme range(256)" -#: py/objint_mpz.c:415 -msgid "overflow converting long int to machine word" -msgstr "dépassement de capacité en convertissant un entier long en mot machine" +#: shared-bindings/displayio/Palette.c +msgid "color buffer must be 3 bytes (RGB) or 4 bytes (RGB + pad byte)" +msgstr "le tampon de couleur doit faire 3 octets (RVB) ou 4 (RVB + pad byte)" -#: py/objlist.c:273 -msgid "pop from empty list" -msgstr "pop d'une liste vide" +#: shared-bindings/displayio/Palette.c +#, fuzzy +msgid "color buffer must be a buffer or int" +msgstr "le tampon de couleur doit être un tampon ou un entier" -#: py/objnamedtuple.c:92 -msgid "can't set attribute" -msgstr "attribut non modifiable" +#: shared-bindings/displayio/Palette.c +#, fuzzy +msgid "color buffer must be a bytearray or array of type 'b' or 'B'" +msgstr "" +"le tampon de couleur doit être un bytearray ou un tableau de type 'b' ou 'B'" -#: py/objobject.c:55 -msgid "__new__ arg must be a user-type" -msgstr "l'argument __new__ doit être d'un type défini par l'utilisateur" +#: shared-bindings/displayio/Palette.c +#, fuzzy +msgid "color must be between 0x000000 and 0xffffff" +msgstr "la couleur doit être entre 0x000000 et 0xffffff" -#: py/objrange.c:110 -msgid "zero step" -msgstr "'step' nul" +#: shared-bindings/displayio/ColorConverter.c +#, fuzzy +msgid "color should be an int" +msgstr "la couleur doit être un entier (int)" -#: py/objset.c:371 -msgid "pop from an empty set" -msgstr "pop d'un ensemble set vide" +#: py/objcomplex.c +msgid "complex division by zero" +msgstr "division complexe par zéro" -#: py/objslice.c:66 -msgid "Length must be an int" -msgstr "La longueur doit être entière" +#: py/parsenum.c py/objfloat.c +msgid "complex values not supported" +msgstr "valeurs complexes non supportées" -#: py/objslice.c:71 -msgid "Length must be non-negative" -msgstr "La longueur ne doit pas être négative" +#: extmod/moduzlib.c +msgid "compression header" +msgstr "entête de compression" -#: py/objslice.c:86 py/sequence.c:57 -msgid "slice step cannot be zero" -msgstr "le pas 'step' de slice ne peut être zéro" +#: py/parse.c +msgid "constant must be an integer" +msgstr "une constante doit être un entier" -#: py/objslice.c:159 -msgid "Cannot subclass slice" -msgstr "On ne peut faire de subclass de slice" +#: py/emitnative.c +msgid "conversion to object" +msgstr "conversion en objet" -#: py/objstr.c:261 -msgid "bytes value out of range" -msgstr "valeur des octets hors gamme" +#: py/parsenum.c +msgid "decimal numbers not supported" +msgstr "nombres décimaux non supportés" -#: py/objstr.c:270 -msgid "wrong number of arguments" -msgstr "mauvais nombres d'arguments" +#: py/compile.c +msgid "default 'except' must be last" +msgstr "l''except' par défaut doit être en dernier" -#: py/objstr.c:467 -msgid "join expects a list of str/bytes objects consistent with self object" -msgstr "join attend une liste d'objets str/bytes cohérent avec l'objet self" +#: shared-bindings/audiobusio/PDMIn.c +msgid "" +"destination buffer must be a bytearray or array of type 'B' for bit_depth = 8" +msgstr "" +"le tampon de destination doit être un tableau de type 'B' pour bit_depth = 8" -#: py/objstr.c:542 py/objstr.c:647 py/objstr.c:1744 -msgid "empty separator" -msgstr "séparateur vide" +#: shared-bindings/audiobusio/PDMIn.c +msgid "destination buffer must be an array of type 'H' for bit_depth = 16" +msgstr "" +"le tampon de destination doit être un tableau de type 'H' pour bit_depth = 16" -#: py/objstr.c:641 -msgid "rsplit(None,n)" -msgstr "rsplit(None,n)" +#: shared-bindings/audiobusio/PDMIn.c +msgid "destination_length must be an int >= 0" +msgstr "destination_length doit être un entier >= 0" -#: py/objstr.c:713 -msgid "substring not found" -msgstr "sous-chaîne non trouvée" +#: py/objdict.c +msgid "dict update sequence has wrong length" +msgstr "la séquence de mise à jour de dict a une mauvaise longueur" -#: py/objstr.c:770 -msgid "start/end indices" -msgstr "indices de début/fin" +#: shared-bindings/math/__init__.c py/runtime.c py/modmath.c py/objint_mpz.c +#: py/objint_longlong.c py/objfloat.c +msgid "division by zero" +msgstr "division par zéro" -#: py/objstr.c:931 -msgid "bad format string" -msgstr "chaîne mal-formée" +#: ports/esp8266/modnetwork.c +msgid "either pos or kw args are allowed" +msgstr "soit 'pos', soit 'kw' est permis en argument" -#: py/objstr.c:953 -msgid "single '}' encountered in format string" -msgstr "'}' seule rencontrée dans une chaîne de format" +#: py/objdeque.c +msgid "empty" +msgstr "vide" -#: py/objstr.c:992 -msgid "bad conversion specifier" -msgstr "mauvaise spécification de conversion" +#: extmod/modutimeq.c extmod/moduheapq.c +msgid "empty heap" +msgstr "'heap' vide" + +#: py/objstr.c +msgid "empty separator" +msgstr "séparateur vide" + +#: shared-bindings/random/__init__.c +msgid "empty sequence" +msgstr "séquence vide" -#: py/objstr.c:996 +#: py/objstr.c msgid "end of format while looking for conversion specifier" msgstr "fin de format en cherchant une spécification de conversion" -#: py/objstr.c:998 +#: shared-bindings/displayio/Shape.c +#, fuzzy +msgid "end_x should be an int" +msgstr "y doit être un entier (int)" + +#: ports/nrf/common-hal/busio/UART.c #, c-format -msgid "unknown conversion specifier %c" -msgstr "spécification %c de conversion inconnue" +msgid "error = 0x%08lX" +msgstr "erreur = 0x%08lX" -#: py/objstr.c:1029 -msgid "unmatched '{' in format" -msgstr "'{' sans correspondance dans le format" +#: py/runtime.c +msgid "exceptions must derive from BaseException" +msgstr "les exceptions doivent dériver de BaseException" -#: py/objstr.c:1036 +#: py/objstr.c msgid "expected ':' after format specifier" msgstr "':' attendu après la spécification de format" -#: py/objstr.c:1050 -msgid "" -"can't switch from automatic field numbering to manual field specification" -msgstr "" -"impossible de passer d'une énumération auto des champs à une spécification " -"manuelle" +#: shared-bindings/gamepad/GamePad.c +msgid "expected a DigitalInOut" +msgstr "objet DigitalInOut attendu" -#: py/objstr.c:1055 py/objstr.c:1083 -msgid "tuple index out of range" -msgstr "index du tuple hors gamme" +#: py/obj.c +msgid "expected tuple/list" +msgstr "un tuple ou une liste est attendu" -#: py/objstr.c:1071 -msgid "attributes not supported yet" -msgstr "attribut pas encore supporté" +#: py/modthread.c +msgid "expecting a dict for keyword args" +msgstr "un dict est attendu pour les arguments nommés" -#: py/objstr.c:1079 -msgid "" -"can't switch from manual field specification to automatic field numbering" -msgstr "" -"impossible de passer d'une spécification manuelle des champs à une " -"énumération auto" +#: ports/esp8266/machine_pin.c +msgid "expecting a pin" +msgstr "une broche (Pin) est attendue" -#: py/objstr.c:1171 -msgid "invalid format specifier" -msgstr "spécification de format invalide" +#: py/compile.c +msgid "expecting an assembler instruction" +msgstr "une instruction assembleur est attendue" -#: py/objstr.c:1192 -msgid "sign not allowed in string format specifier" -msgstr "signe non autorisé dans les spéc. de formats de chaînes de caractères" +#: py/compile.c +msgid "expecting just a value for set" +msgstr "une simple valeur est attendue pour set" -#: py/objstr.c:1200 -msgid "sign not allowed with integer format specifier 'c'" -msgstr "signe non autorisé avec la spéc. de format d'entier 'c'" +#: py/compile.c +msgid "expecting key:value for dict" +msgstr "couple clef:valeur attendu pour un objet dict" -#: py/objstr.c:1259 -#, c-format -msgid "unknown format code '%c' for object of type '%s'" -msgstr "code de format '%c' inconnu pour un objet de type '%s'" +#: py/argcheck.c +msgid "extra keyword arguments given" +msgstr "argument nommé donné en plus" -#: py/objstr.c:1331 -#, c-format -msgid "unknown format code '%c' for object of type 'float'" -msgstr "code de format '%c' inconnu pour un objet de type 'float'" +#: py/argcheck.c +msgid "extra positional arguments given" +msgstr "argument positionnel donné en plus" -#: py/objstr.c:1343 -msgid "'=' alignment not allowed in string format specifier" -msgstr "'=' alignement non autorisé dans la spéc. de format de chaîne" +#: ports/unix/modffi.c +msgid "ffi_prep_closure_loc" +msgstr "" -#: py/objstr.c:1367 -#, c-format -msgid "unknown format code '%c' for object of type 'str'" -msgstr "code de format '%c' inconnu pour un objet de type 'str'" +#: shared-bindings/displayio/OnDiskBitmap.c shared-bindings/audioio/WaveFile.c +msgid "file must be a file opened in byte mode" +msgstr "le fichier doit être un fichier ouvert en mode 'byte'" -#: py/objstr.c:1415 -msgid "format requires a dict" -msgstr "le format nécessite un dict" +#: shared-bindings/storage/__init__.c +msgid "filesystem must provide mount method" +msgstr "le system de fichier doit fournir une méthode 'mount'" -#: py/objstr.c:1424 -msgid "incomplete format key" -msgstr "clé de format incomplète" +#: py/objtype.c +msgid "first argument to super() must be type" +msgstr "le premier argument de super() doit être un type" -#: py/objstr.c:1482 -msgid "incomplete format" -msgstr "format incomplet" +#: extmod/machine_spi.c +msgid "firstbit must be MSB" +msgstr "le 1er bit doit être le MSB" -#: py/objstr.c:1490 -msgid "not enough arguments for format string" -msgstr "pas assez d'arguments pour la chaîne de format" +#: ports/esp8266/modesp.c +msgid "flash location must be below 1MByte" +msgstr "l'emplacement en mémoire flash doit être inférieure à 1Mo" -#: py/objstr.c:1500 -#, c-format -msgid "%%c requires int or char" -msgstr "%%c nécessite un entier int ou un caractère char" +#: py/objint.c +msgid "float too big" +msgstr "nombre flottant trop grand" -#: py/objstr.c:1507 -msgid "integer required" -msgstr "entier requis" +#: shared-bindings/_stage/Text.c +msgid "font must be 2048 bytes long" +msgstr "la fonte doit être longue de 2048 octets" -#: py/objstr.c:1570 -#, c-format -msgid "unsupported format character '%c' (0x%x) at index %d" -msgstr "caractère de format '%c' (0x%x) non supporté à l'index %d" +#: py/objstr.c +msgid "format requires a dict" +msgstr "le format nécessite un dict" -#: py/objstr.c:1577 -msgid "not all arguments converted during string formatting" -msgstr "" -"tous les arguments n'ont pas été convertis pendant le formatage de la chaîne" +#: ports/esp8266/modmachine.c +msgid "frequency can only be either 80Mhz or 160MHz" +msgstr "la fréquence doit être soit 80MHz soit 160MHz" -#: py/objstr.c:2102 -msgid "can't convert to str implicitly" -msgstr "impossible de convertir en str implicitement" +#: py/objdeque.c +msgid "full" +msgstr "plein" -#: py/objstr.c:2106 -msgid "can't convert '%q' object to %q implicitly" -msgstr "impossible de convertir l'objet '%q' en '%q' implicitement" +#: py/argcheck.c +msgid "function does not take keyword arguments" +msgstr "la fonction ne prend pas d'arguments nommés" -#: py/objstrunicode.c:134 +#: py/argcheck.c #, c-format -msgid "string indices must be integers, not %s" -msgstr "les indices de chaîne de caractère doivent être des entiers, pas %s" - -#: py/objstrunicode.c:145 py/objstrunicode.c:164 -msgid "string index out of range" -msgstr "index de chaîne hors gamme" +msgid "function expected at most %d arguments, got %d" +msgstr "la fonction attendait au plus %d arguments, reçu %d" -#: py/objtype.c:358 -msgid "__init__() should return None" -msgstr "__init__() doit retourner None" +#: py/objnamedtuple.c py/bc.c +msgid "function got multiple values for argument '%q'" +msgstr "la fonction a reçu plusieurs valeurs pour l'argument '%q'" -#: py/objtype.c:360 +#: py/argcheck.c #, c-format -msgid "__init__() should return None, not '%s'" -msgstr "__init__() doit retourner None, pas '%s'" +msgid "function missing %d required positional arguments" +msgstr "il manque %d arguments obligatoires à la fonction" -#: py/objtype.c:623 py/objtype.c:1275 py/runtime.c:1065 -msgid "unreadable attribute" -msgstr "attribut illisible" +#: py/bc.c +msgid "function missing keyword-only argument" +msgstr "il manque l'argument nommé obligatoire" -#: py/objtype.c:868 py/runtime.c:653 -msgid "object not callable" -msgstr "objet non appelable" +#: py/bc.c +msgid "function missing required keyword argument '%q'" +msgstr "il manque l'argument nommé obligatoire '%q'" -#: py/objtype.c:870 py/runtime.c:655 +#: py/bc.c #, c-format -msgid "'%s' object is not callable" -msgstr "objet '%s' non appelable" +msgid "function missing required positional argument #%d" +msgstr "il manque l'argument obligatoire #%d" -#: py/objtype.c:978 -msgid "type takes 1 or 3 arguments" -msgstr "le type prend 1 ou 3 arguments" +#: py/argcheck.c py/objnamedtuple.c py/bc.c +#, c-format +msgid "function takes %d positional arguments but %d were given" +msgstr "la fonction prend %d argument(s) mais %d ont été donné(s)" -#: py/objtype.c:989 -msgid "cannot create instance" -msgstr "ne peut pas créer une instance" +#: shared-bindings/time/__init__.c +msgid "function takes exactly 9 arguments" +msgstr "la fonction prend exactement 9 arguments" -#: py/objtype.c:991 -msgid "cannot create '%q' instances" -msgstr "ne peut pas créer une instance de '%q'" +#: py/objgenerator.c +msgid "generator already executing" +msgstr "générateur déjà en cours d'exécution" -#: py/objtype.c:1047 -msgid "can't add special method to already-subclassed class" -msgstr "" -"impossible d'ajouter une méthode spécial à une classe déjà sous-classée" +#: py/objgenerator.c +msgid "generator ignored GeneratorExit" +msgstr "le générateur a ignoré GeneratorExit" -#: py/objtype.c:1091 py/objtype.c:1097 -msgid "type is not an acceptable base type" -msgstr "le type n'est pas un type de base accepté" +#: shared-bindings/_stage/Layer.c +msgid "graphic must be 2048 bytes long" +msgstr "le graphic doit être long de 2048 octets" -#: py/objtype.c:1100 -msgid "type '%q' is not an acceptable base type" -msgstr "le type '%q' n'est pas un type de base accepté" +#: extmod/moduheapq.c +msgid "heap must be a list" +msgstr "'heap' doit être une liste" -#: py/objtype.c:1137 -msgid "multiple inheritance not supported" -msgstr "héritage multiple non supporté" +#: py/compile.c +msgid "identifier redefined as global" +msgstr "identifiant redéfini comme global" -#: py/objtype.c:1164 -msgid "multiple bases have instance lay-out conflict" -msgstr "de multiple bases ont un conflit de lay-out d'instance" +#: py/compile.c +msgid "identifier redefined as nonlocal" +msgstr "identifiant redéfini comme nonlocal" -#: py/objtype.c:1205 -msgid "first argument to super() must be type" -msgstr "le premier argument de super() doit être un type" +#: ports/esp8266/machine_hspi.c +msgid "impossible baudrate" +msgstr "débit impossible" -#: py/objtype.c:1370 -msgid "issubclass() arg 2 must be a class or a tuple of classes" -msgstr "" -"l'argument 2 de issubclass() doit être une classe ou un tuple de classes" +#: py/objstr.c +msgid "incomplete format" +msgstr "format incomplet" -#: py/objtype.c:1384 -msgid "issubclass() arg 1 must be a class" -msgstr "l'argument 1 de issubclass() doit être une classe" +#: py/objstr.c +msgid "incomplete format key" +msgstr "clé de format incomplète" -#: py/parse.c:726 -msgid "constant must be an integer" -msgstr "une constante doit être un entier" +#: extmod/modubinascii.c +msgid "incorrect padding" +msgstr "espacement incorrect" -#: py/parse.c:868 -msgid "Unable to init parser" -msgstr "Impossible d'initialiser le parser" +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +#: ports/nrf/common-hal/pulseio/PulseIn.c +#: ports/esp8266/common-hal/pulseio/PulseIn.c py/obj.c +msgid "index out of range" +msgstr "index hors gamme" -#: py/parse.c:1170 -msgid "unexpected indent" -msgstr "indentation inattendue" +#: py/obj.c +msgid "indices must be integers" +msgstr "les indices doivent être des entiers" -#: py/parse.c:1173 -msgid "unindent does not match any outer indentation level" -msgstr "la désindentation ne correspond à aucune indentation" +#: py/compile.c +msgid "inline assembler must be a function" +msgstr "l'assembleur doit être une fonction" -#: py/parsenum.c:60 +#: py/parsenum.c msgid "int() arg 2 must be >= 2 and <= 36" msgstr "l'argument 2 de int() doit être >=2 et <=36" -#: py/parsenum.c:151 -msgid "invalid syntax for integer" -msgstr "syntaxe invalide pour un entier" - -#: py/parsenum.c:155 -#, c-format -msgid "invalid syntax for integer with base %d" -msgstr "syntaxe invalide pour un entier de base %d" - -#: py/parsenum.c:339 -msgid "invalid syntax for number" -msgstr "syntaxe invalide pour un nombre" - -#: py/parsenum.c:342 -msgid "decimal numbers not supported" -msgstr "nombres décimaux non supportés" +#: py/objstr.c +msgid "integer required" +msgstr "entier requis" -#: py/persistentcode.c:223 -msgid "" -"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/" -"mpy-update for more info." +#: ports/nrf/common-hal/bleio/Broadcaster.c +msgid "interval not in range 0.0020 to 10.24" msgstr "" -"Fichier .mpy incompatible. Merci de mettre à jour tous les .mpy. Voirhttp://" -"adafru.it/mpy-update pour plus d'informations." -#: py/persistentcode.c:326 -msgid "can only save bytecode" -msgstr "ne peut sauvegarder que du bytecode" +#: extmod/machine_i2c.c +msgid "invalid I2C peripheral" +msgstr "périphérique I2C invalide" -#: py/runtime.c:206 -msgid "name not defined" -msgstr "nom non défini" +#: extmod/machine_spi.c +msgid "invalid SPI peripheral" +msgstr "périphérique SPI invalide" -#: py/runtime.c:209 -msgid "name '%q' is not defined" -msgstr "nom '%q' non défini" +#: ports/esp8266/machine_rtc.c +msgid "invalid alarm" +msgstr "alarme invalide" -#: py/runtime.c:304 py/runtime.c:611 -msgid "unsupported type for operator" -msgstr "type non supporté pour l'opérateur" +#: lib/netutils/netutils.c +msgid "invalid arguments" +msgstr "arguments invalides" -#: py/runtime.c:307 -msgid "unsupported type for %q: '%s'" -msgstr "type non supporté pour %q: '%s'" +#: ports/esp8266/modnetwork.c +msgid "invalid buffer length" +msgstr "longueur de tampon invalide" -#: py/runtime.c:614 -msgid "unsupported types for %q: '%s', '%s'" -msgstr "type non supporté pour %q: '%s', '%s'" +#: extmod/modussl_axtls.c +msgid "invalid cert" +msgstr "certificat invalide" -#: py/runtime.c:881 py/runtime.c:888 py/runtime.c:945 -msgid "wrong number of values to unpack" -msgstr "mauvais nombre de valeurs à dégrouper" +#: ports/esp8266/common-hal/busio/UART.c ports/esp8266/machine_uart.c +msgid "invalid data bits" +msgstr "bits de données invalides" -#: py/runtime.c:883 py/runtime.c:947 -#, c-format -msgid "need more than %d values to unpack" -msgstr "nécessite plus de %d valeur à dégrouper" +#: extmod/uos_dupterm.c +msgid "invalid dupterm index" +msgstr "index invalide pour dupterm" -#: py/runtime.c:890 -#, c-format -msgid "too many values to unpack (expected %d)" -msgstr "trop de valeur à dégrouper (%d attendues)" +#: extmod/modframebuf.c +msgid "invalid format" +msgstr "format invalide" -#: py/runtime.c:984 -msgid "argument has wrong type" -msgstr "l'argument est d'un mauvais type" +#: py/objstr.c +msgid "invalid format specifier" +msgstr "spécification de format invalide" -#: py/runtime.c:986 -msgid "argument should be a '%q' not a '%q'" -msgstr "l'argument devrait être un(e) '%q', pas '%q'" +#: extmod/modussl_axtls.c +msgid "invalid key" +msgstr "clé invalide" -#: py/runtime.c:1123 py/runtime.c:1197 -msgid "no such attribute" -msgstr "pas de tel attribut" +#: py/compile.c +msgid "invalid micropython decorator" +msgstr "décorateur micropython invalide" -#: py/runtime.c:1128 -msgid "type object '%q' has no attribute '%q'" -msgstr "l'objet de type '%q' n'a pas d'attribut '%q'" +#: ports/esp8266/machine_pin.c +msgid "invalid pin" +msgstr "broche invalide" -#: py/runtime.c:1132 py/runtime.c:1200 -msgid "'%s' object has no attribute '%q'" -msgstr "l'objet '%s' n'a pas d'attribut '%q'" +#: shared-bindings/random/__init__.c +msgid "invalid step" +msgstr "pas invalide" -#: py/runtime.c:1238 -msgid "object not iterable" -msgstr "objet non itérable" +#: ports/esp8266/common-hal/busio/UART.c ports/esp8266/machine_uart.c +msgid "invalid stop bits" +msgstr "bits d'arrêt invalides" -#: py/runtime.c:1241 -#, c-format -msgid "'%s' object is not iterable" -msgstr "objet '%s' non itérable" +#: py/compile.c py/parse.c +msgid "invalid syntax" +msgstr "syntaxe invalide" -#: py/runtime.c:1260 py/runtime.c:1296 -msgid "object not an iterator" -msgstr "l'objet n'est pas un itérateur" +#: py/parsenum.c +msgid "invalid syntax for integer" +msgstr "syntaxe invalide pour un entier" -#: py/runtime.c:1262 py/runtime.c:1298 +#: py/parsenum.c #, c-format -msgid "'%s' object is not an iterator" -msgstr "l'objet '%s' n'est pas un itérateur" +msgid "invalid syntax for integer with base %d" +msgstr "syntaxe invalide pour un entier de base %d" -#: py/runtime.c:1401 -msgid "exceptions must derive from BaseException" -msgstr "les exceptions doivent dériver de BaseException" +#: py/parsenum.c +msgid "invalid syntax for number" +msgstr "syntaxe invalide pour un nombre" -#: py/runtime.c:1430 -msgid "cannot import name %q" -msgstr "ne peut pas importer le nom %q" +#: py/objtype.c +msgid "issubclass() arg 1 must be a class" +msgstr "l'argument 1 de issubclass() doit être une classe" -#: py/runtime.c:1535 -msgid "memory allocation failed, heap is locked" -msgstr "l'allocation de mémoire a échoué, la pile est vérrouillé" +#: py/objtype.c +msgid "issubclass() arg 2 must be a class or a tuple of classes" +msgstr "" +"l'argument 2 de issubclass() doit être une classe ou un tuple de classes" -#: py/runtime.c:1539 -#, c-format -msgid "memory allocation failed, allocating %u bytes" -msgstr "l'allocation de mémoire a échoué en allouant %u octets" +#: py/objstr.c +msgid "join expects a list of str/bytes objects consistent with self object" +msgstr "join attend une liste d'objets str/bytes cohérent avec l'objet self" -#: py/runtime.c:1609 -msgid "maximum recursion depth exceeded" -msgstr "profondeur maximale de récursivité dépassée" +#: py/argcheck.c +msgid "keyword argument(s) not yet implemented - use normal args instead" +msgstr "" +"argument(s) nommé(s) pas encore implémenté - utilisez les arguments normaux" -#: py/sequence.c:264 -msgid "object not in sequence" -msgstr "l'objet n'est pas dans la séquence" +#: py/bc.c +msgid "keywords must be strings" +msgstr "les noms doivent être des chaînes de caractère" -#: py/stream.c:96 -msgid "stream operation not supported" -msgstr "opération de flux non supportée" +#: py/emitinlinextensa.c py/emitinlinethumb.c +msgid "label '%q' not defined" +msgstr "label '%q' non supporté" -#: py/stream.c:254 -msgid "string not supported; use bytes or bytearray" -msgstr "" -"chaîne de carac. non supportée; utilisez des bytes ou un tableau de bytes" +#: py/compile.c +msgid "label redefined" +msgstr "label redéfini" + +#: ports/esp8266/modesp.c +msgid "len must be multiple of 4" +msgstr "'len' doit être un multiple de 4" -#: py/stream.c:289 +#: py/stream.c msgid "length argument not allowed for this type" msgstr "argument lenght non permis pour ce type" -#: py/vm.c:255 -msgid "local variable referenced before assignment" -msgstr "variable locale référencée avant d'être assignée" +#: py/objarray.c +msgid "lhs and rhs should be compatible" +msgstr "Les parties gauches et droites doivent être compatibles" -#: py/vm.c:1142 -msgid "no active exception to reraise" -msgstr "aucune exception active à relever" +#: py/emitnative.c +msgid "local '%q' has type '%q' but source is '%q'" +msgstr "la variable locale '%q' a le type '%q' mais la source est '%q'" -#: py/vm.c:1284 -msgid "byte code not implemented" -msgstr "bytecode non implémenté" +#: py/emitnative.c +msgid "local '%q' used before type known" +msgstr "variable locale '%q' utilisée avant d'en connaitre le type" -#: shared-bindings/_stage/Layer.c:71 -msgid "graphic must be 2048 bytes long" -msgstr "le graphic doit être long de 2048 octets" +#: py/vm.c +msgid "local variable referenced before assignment" +msgstr "variable locale référencée avant d'être assignée" -#: shared-bindings/_stage/Layer.c:77 shared-bindings/_stage/Text.c:75 -msgid "palette must be 32 bytes long" -msgstr "la palette doit être longue de 32 octets" +#: py/objint.c +msgid "long int not supported in this build" +msgstr "entiers longs non supportés dans cette build" -#: shared-bindings/_stage/Layer.c:84 +#: shared-bindings/_stage/Layer.c msgid "map buffer too small" msgstr "tampon trop petit" -#: shared-bindings/_stage/Text.c:69 -msgid "font must be 2048 bytes long" -msgstr "la fonte doit être longue de 2048 octets" +#: shared-bindings/math/__init__.c py/modmath.c +msgid "math domain error" +msgstr "erreur de domaine math" -#: shared-bindings/_stage/Text.c:81 -msgid "chars buffer too small" -msgstr "tampon de caractères trop petit" +#: py/runtime.c +msgid "maximum recursion depth exceeded" +msgstr "profondeur maximale de récursivité dépassée" -#: shared-bindings/analogio/AnalogOut.c:118 -msgid "AnalogOut is only 16 bits. Value must be less than 65536." +#: py/runtime.c +#, c-format +msgid "memory allocation failed, allocating %u bytes" +msgstr "l'allocation de mémoire a échoué en allouant %u octets" + +#: ports/esp8266/modesp.c +#, c-format +msgid "memory allocation failed, allocating %u bytes for native code" msgstr "" -"AnalogOut est seulement 16 bits. Les valeurs doivent être inf. à 65536." +"l'allocation de mémoire a échoué en allouant %u octets pour un code natif" -#: shared-bindings/audiobusio/I2SOut.c:225 -#: shared-bindings/audioio/AudioOut.c:226 -msgid "Not playing" -msgstr "Ne joue pas" +#: py/runtime.c +msgid "memory allocation failed, heap is locked" +msgstr "l'allocation de mémoire a échoué, la pile est vérrouillé" -#: shared-bindings/audiobusio/PDMIn.c:124 -msgid "Bit depth must be multiple of 8." -msgstr "La profondeur de bit doit être un multiple de 8." +#: py/builtinimport.c +msgid "module not found" +msgstr "module introuvable" -#: shared-bindings/audiobusio/PDMIn.c:128 -msgid "Oversample must be multiple of 8." -msgstr "Le sur-échantillonage doit être un multiple de 8." +#: py/compile.c +msgid "multiple *x in assignment" +msgstr "*x multiple dans l'assignement" -#: shared-bindings/audiobusio/PDMIn.c:136 -msgid "Microphone startup delay must be in range 0.0 to 1.0" -msgstr "Le délais au démarrage du micro doit être entre 0.0 et 1.0" +#: py/objtype.c +msgid "multiple bases have instance lay-out conflict" +msgstr "de multiple bases ont un conflit de lay-out d'instance" -#: shared-bindings/audiobusio/PDMIn.c:193 -msgid "destination_length must be an int >= 0" -msgstr "destination_length doit être un entier >= 0" +#: py/objtype.c +msgid "multiple inheritance not supported" +msgstr "héritage multiple non supporté" -#: shared-bindings/audiobusio/PDMIn.c:199 -msgid "Cannot record to a file" -msgstr "Impossible d'enregistrer vers un fichier" +#: py/emitnative.c +msgid "must raise an object" +msgstr "doit lever un objet" -#: shared-bindings/audiobusio/PDMIn.c:202 -msgid "Destination capacity is smaller than destination_length." -msgstr "La capacité de la cible est plus petite que destination_length." +#: extmod/machine_spi.c +msgid "must specify all of sck/mosi/miso" +msgstr "SCK, MOSI et MISO doivent tous être spécifiés" -#: shared-bindings/audiobusio/PDMIn.c:206 -msgid "destination buffer must be an array of type 'H' for bit_depth = 16" -msgstr "" -"le tampon de destination doit être un tableau de type 'H' pour bit_depth = 16" +#: py/modbuiltins.c +msgid "must use keyword argument for key function" +msgstr "il faut utiliser un argument nommé pour une fonction key" -#: shared-bindings/audiobusio/PDMIn.c:208 -msgid "" -"destination buffer must be a bytearray or array of type 'B' for bit_depth = 8" -msgstr "" -"le tampon de destination doit être un tableau de type 'B' pour bit_depth = 8" +#: py/runtime.c +msgid "name '%q' is not defined" +msgstr "nom '%q' non défini" -#: shared-bindings/audioio/Mixer.c:94 +#: shared-bindings/bleio/Peripheral.c #, fuzzy -msgid "Invalid voice count" -msgstr "Type de service invalide" - -#: shared-bindings/audioio/Mixer.c:99 -msgid "Invalid channel count" -msgstr "" +msgid "name must be a string" +msgstr "les noms doivent être des chaînes de caractère" -#: shared-bindings/audioio/Mixer.c:103 -#, fuzzy -msgid "Sample rate must be positive" -msgstr "le taux d'échantillonage doit être positif" +#: py/runtime.c +msgid "name not defined" +msgstr "nom non défini" -#: shared-bindings/audioio/Mixer.c:107 -#, fuzzy -msgid "bits_per_sample must be 8 or 16" -msgstr "bits doivent être 8 ou 16" +#: py/compile.c +msgid "name reused for argument" +msgstr "nom réutilisé comme argument" -#: shared-bindings/audioio/RawSample.c:98 -msgid "" -"sample_source buffer must be a bytearray or array of type 'h', 'H', 'b' or " -"'B'" +#: py/emitnative.c +msgid "native yield" msgstr "" -"le tampon de sample_source doit être un bytearray ou un tableau de type " -"'h','H', 'b' ou 'B'" - -#: shared-bindings/audioio/RawSample.c:104 -msgid "buffer must be a bytes-like object" -msgstr "le tampon doit être un objet bytes-like" -#: shared-bindings/audioio/WaveFile.c:78 -#: shared-bindings/displayio/OnDiskBitmap.c:85 -msgid "file must be a file opened in byte mode" -msgstr "le fichier doit être un fichier ouvert en mode 'byte'" +#: py/runtime.c +#, c-format +msgid "need more than %d values to unpack" +msgstr "nécessite plus de %d valeur à dégrouper" -#: shared-bindings/bitbangio/I2C.c:111 shared-bindings/bitbangio/SPI.c:121 -#: shared-bindings/busio/SPI.c:133 -msgid "Function requires lock" -msgstr "La fonction nécessite un verrou" +#: py/runtime.c py/objint_mpz.c py/objint_longlong.c +msgid "negative power with no float support" +msgstr "puissance négative sans support des nombres flottants" -#: shared-bindings/bitbangio/I2C.c:195 shared-bindings/busio/I2C.c:210 -msgid "Buffer must be at least length 1" -msgstr "Le tampon doit être de longueur au moins 1" +#: py/runtime.c py/objint_mpz.c +msgid "negative shift count" +msgstr "compte de décalage négatif" -#: shared-bindings/bitbangio/SPI.c:151 shared-bindings/busio/SPI.c:175 -msgid "Invalid polarity" -msgstr "Polarité invalide" +#: py/vm.c +msgid "no active exception to reraise" +msgstr "aucune exception active à relever" -#: shared-bindings/bitbangio/SPI.c:155 shared-bindings/busio/SPI.c:179 -msgid "Invalid phase" -msgstr "Phase invalide" +#: shared-bindings/socket/__init__.c shared-module/network/__init__.c +#, fuzzy +msgid "no available NIC" +msgstr "NIC non disponible" -#: shared-bindings/bitbangio/SPI.c:159 shared-bindings/busio/SPI.c:183 -msgid "Invalid number of bits" -msgstr "Nombre de bits invalide" +#: py/compile.c +msgid "no binding for nonlocal found" +msgstr "pas de lien trouvé pour nonlocal" -#: shared-bindings/bitbangio/SPI.c:284 shared-bindings/busio/SPI.c:348 -msgid "buffer slices must be of equal length" -msgstr "les slices de tampon doivent être de longueurs égales" +#: py/builtinimport.c +msgid "no module named '%q'" +msgstr "pas de module '%q'" -#: shared-bindings/bleio/Address.c:101 -msgid "Wrong address length" -msgstr "Mauvaise longueur d'adresse" +#: shared-bindings/_pixelbuf/__init__.c py/runtime.c +msgid "no such attribute" +msgstr "pas de tel attribut" -#: shared-bindings/bleio/Address.c:107 -#, fuzzy -msgid "Wrong number of bytes provided" -msgstr "mauvais nombre d'octets fourni'" +#: py/compile.c +msgid "non-default argument follows default argument" +msgstr "" +"un argument sans valeur par défaut suit un argument avec valeur par défaut" -#: shared-bindings/bleio/Device.c:210 -msgid "Can't add services in Central mode" -msgstr "Impossible d'ajouter des service en mode Central" +#: extmod/modubinascii.c +msgid "non-hex digit found" +msgstr "digit non-héxadécimale trouvé" -#: shared-bindings/bleio/Device.c:226 -msgid "Can't connect in Peripheral mode" -msgstr "Impossible de se connecter en mode Peripheral" +#: py/compile.c +msgid "non-keyword arg after */**" +msgstr "argument non-nommé après */**" -#: shared-bindings/bleio/Device.c:256 -msgid "Can't change the name in Central mode" -msgstr "Modification du nom impossible en mode Central" +#: py/compile.c +msgid "non-keyword arg after keyword arg" +msgstr "argument non-nommé après argument nommé" -#: shared-bindings/bleio/Device.c:277 shared-bindings/bleio/Device.c:313 -msgid "Can't advertise in Central mode" +#: shared-bindings/bleio/UUID.c +msgid "not a 128-bit UUID" msgstr "" -#: shared-bindings/busio/I2C.c:120 -msgid "Function requires lock." -msgstr "La fonction nécessite un verrou." +#: ports/esp8266/machine_adc.c +#, c-format +msgid "not a valid ADC Channel: %d" +msgstr "canal ADC non valide : %d" -#: shared-bindings/busio/UART.c:106 -msgid "bits must be 7, 8 or 9" -msgstr "bits doivent être 7, 8 ou 9" +#: py/objstr.c +msgid "not all arguments converted during string formatting" +msgstr "" +"tous les arguments n'ont pas été convertis pendant le formatage de la chaîne" -#: shared-bindings/busio/UART.c:118 -msgid "stop must be 1 or 2" -msgstr "stop doit être 1 ou 2" +#: py/objstr.c +msgid "not enough arguments for format string" +msgstr "pas assez d'arguments pour la chaîne de format" -#: shared-bindings/busio/UART.c:123 -msgid "timeout >100 (units are now seconds, not msecs)" -msgstr "timeout >100 (exprimé en secondes, pas en ms)" +#: py/obj.c +#, c-format +msgid "object '%s' is not a tuple or list" +msgstr "l'objet '%s' n'est pas un tuple ou une liste" -#: shared-bindings/digitalio/DigitalInOut.c:211 -msgid "Invalid direction." -msgstr "Direction invalide" +#: py/obj.c +msgid "object does not support item assignment" +msgstr "l'objet ne supporte pas l'assignation d'éléments" -#: shared-bindings/digitalio/DigitalInOut.c:240 -msgid "Cannot set value when direction is input." -msgstr "Impossible d'affecter une valeur quand la direction est 'input'." +#: py/obj.c +msgid "object does not support item deletion" +msgstr "l'objet ne supporte pas la suppression d'éléments" -#: shared-bindings/digitalio/DigitalInOut.c:266 -#: shared-bindings/digitalio/DigitalInOut.c:281 -msgid "Drive mode not used when direction is input." -msgstr "Le mode Drive n'est pas utilisé quand la direction est 'input'." +#: py/obj.c +msgid "object has no len" +msgstr "l'objet n'a pas de len" -#: shared-bindings/digitalio/DigitalInOut.c:314 -#: shared-bindings/digitalio/DigitalInOut.c:331 -msgid "Pull not used when direction is output." -msgstr "Le tirage 'pull' n'est pas utilisé quand la direction est 'output'." +#: py/obj.c +msgid "object is not subscriptable" +msgstr "l'objet n'est pas sous-scriptable" -#: shared-bindings/digitalio/DigitalInOut.c:340 -msgid "Unsupported pull value." -msgstr "Valeur de tirage 'pull' non supportée." +#: py/runtime.c +msgid "object not an iterator" +msgstr "l'objet n'est pas un itérateur" -#: shared-bindings/displayio/Bitmap.c:84 -#, fuzzy -msgid "y should be an int" -msgstr "y doit être un entier (int)" +#: py/objtype.c py/runtime.c +msgid "object not callable" +msgstr "objet non appelable" -#: shared-bindings/displayio/Bitmap.c:89 -#, fuzzy -msgid "row buffer must be a bytearray or array of type 'b' or 'B'" -msgstr "" -"le tampon de ligne doit être un bytearray ou un tableau de type 'b' ou 'B'" +#: py/sequence.c +msgid "object not in sequence" +msgstr "l'objet n'est pas dans la séquence" -#: shared-bindings/displayio/Bitmap.c:94 -#, fuzzy -msgid "row data must be a buffer" -msgstr "les données de ligne doivent être un tampon" +#: py/runtime.c +msgid "object not iterable" +msgstr "objet non itérable" -#: shared-bindings/displayio/ColorConverter.c:72 -#, fuzzy -msgid "color should be an int" -msgstr "la couleur doit être un entier (int)" +#: py/obj.c +#, c-format +msgid "object of type '%s' has no len()" +msgstr "l'objet de type '%s' n'a pas de len()" -#: shared-bindings/displayio/FourWire.c:55 -#: shared-bindings/displayio/FourWire.c:64 -msgid "displayio is a work in progress" -msgstr "displayio est en cours de développement" +#: py/obj.c +msgid "object with buffer protocol required" +msgstr "un objet avec un protocol de tampon est nécessaire" -#: shared-bindings/displayio/Group.c:65 -#, fuzzy -msgid "Group must have size at least 1" -msgstr "Le tampon doit être de longueur au moins 1" +#: extmod/modubinascii.c +msgid "odd-length string" +msgstr "chaîne de longueur impaire" -#: shared-bindings/displayio/Palette.c:96 +#: py/objstrunicode.c py/objstr.c #, fuzzy -msgid "color buffer must be a bytearray or array of type 'b' or 'B'" -msgstr "" -"le tampon de couleur doit être un bytearray ou un tableau de type 'b' ou 'B'" +msgid "offset out of bounds" +msgstr "adresse hors limites" -#: shared-bindings/displayio/Palette.c:102 -msgid "color buffer must be 3 bytes (RGB) or 4 bytes (RGB + pad byte)" -msgstr "le tampon de couleur doit faire 3 octets (RVB) ou 4 (RVB + pad byte)" +#: shared-bindings/nvm/ByteArray.c py/objarray.c py/objtuple.c +#: py/objstrunicode.c py/objstr.c +msgid "only slices with step=1 (aka None) are supported" +msgstr "seuls les slices avec 'step=1' (cad None) sont supportées" -#: shared-bindings/displayio/Palette.c:106 -#, fuzzy -msgid "color must be between 0x000000 and 0xffffff" -msgstr "la couleur doit être entre 0x000000 et 0xffffff" +#: py/modbuiltins.c +msgid "ord expects a character" +msgstr "ord attend un caractère" -#: shared-bindings/displayio/Palette.c:110 -#, fuzzy -msgid "color buffer must be a buffer or int" -msgstr "le tampon de couleur doit être un tampon ou un entier" +#: py/modbuiltins.c +#, c-format +msgid "ord() expected a character, but string of length %d found" +msgstr "ord() attend un caractère mais une chaîne de longueur %d a été trouvée" + +#: py/objint_mpz.c +msgid "overflow converting long int to machine word" +msgstr "dépassement de capacité en convertissant un entier long en mot machine" -#: shared-bindings/displayio/Palette.c:123 -#: shared-bindings/displayio/Palette.c:137 +#: shared-bindings/_stage/Text.c shared-bindings/_stage/Layer.c +msgid "palette must be 32 bytes long" +msgstr "la palette doit être longue de 32 octets" + +#: shared-bindings/displayio/Palette.c #, fuzzy msgid "palette_index should be an int" msgstr "palette_index devrait être un entier (int)'" -#: shared-bindings/displayio/Sprite.c:48 +#: py/compile.c +msgid "parameter annotation must be an identifier" +msgstr "l'annotation du paramètre doit être un identifiant" + +#: py/emitinlinextensa.c +msgid "parameters must be registers in sequence a2 to a5" +msgstr "les paramètres doivent être des registres dans la séquence a2 à a5" + +#: py/emitinlinethumb.c #, fuzzy -msgid "position must be 2-tuple" -msgstr "position doit être un 2-tuple" +msgid "parameters must be registers in sequence r0 to r3" +msgstr "les paramètres doivent être des registres dans la séquence r0 à r3" + +#: ports/esp8266/machine_pin.c +msgid "pin does not have IRQ capabilities" +msgstr "la broche ne supporte pas les interruptions (IRQ)" -#: shared-bindings/displayio/Sprite.c:97 +#: shared-bindings/displayio/Bitmap.c #, fuzzy -msgid "unsupported bitmap type" -msgstr "type de bitmap non supporté" +msgid "pixel coordinates out of bounds" +msgstr "adresse hors limites" -#: shared-bindings/displayio/Sprite.c:162 +#: shared-bindings/displayio/Bitmap.c +msgid "pixel value requires too many bits" +msgstr "" + +#: shared-bindings/displayio/TileGrid.c msgid "pixel_shader must be displayio.Palette or displayio.ColorConverter" msgstr "" "pixel_shader doit être un objet displayio.Palette ou displayio.ColorConverter" -#: shared-bindings/gamepad/GamePad.c:100 -msgid "too many arguments" -msgstr "trop d'arguments" +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +#: ports/nrf/common-hal/pulseio/PulseIn.c +#: ports/esp8266/common-hal/pulseio/PulseIn.c +msgid "pop from an empty PulseIn" +msgstr "'pop' d'une entrée PulseIn vide" -#: shared-bindings/gamepad/GamePad.c:104 -msgid "expected a DigitalInOut" -msgstr "objet DigitalInOut attendu" +#: py/objset.c +msgid "pop from an empty set" +msgstr "pop d'un ensemble set vide" -#: shared-bindings/i2cslave/I2CSlave.c:98 -#, fuzzy -msgid "can't convert address to int" -msgstr "ne peut convertir %s en entier int" +#: py/objlist.c +msgid "pop from empty list" +msgstr "pop d'une liste vide" -#: shared-bindings/i2cslave/I2CSlave.c:101 -msgid "address out of bounds" -msgstr "adresse hors limites" +#: py/objdict.c +msgid "popitem(): dictionary is empty" +msgstr "popitem(): dictionnaire vide" -#: shared-bindings/i2cslave/I2CSlave.c:107 -msgid "addresses is empty" -msgstr "adresses vides" +#: py/objint_mpz.c +msgid "pow() 3rd argument cannot be 0" +msgstr "le 3e argument de pow() ne peut être 0" -#: shared-bindings/microcontroller/Pin.c:89 -#: shared-bindings/neopixel_write/__init__.c:67 -#: shared-bindings/pulseio/PulseOut.c:76 -msgid "Expected a %q" -msgstr "Attendu : %q" +#: py/objint_mpz.c +msgid "pow() with 3 arguments requires integers" +msgstr "pow() avec 3 arguments nécessite des entiers" -#: shared-bindings/microcontroller/Pin.c:100 -msgid "%q in use" -msgstr "%q utilisé" +#: extmod/modutimeq.c +msgid "queue overflow" +msgstr "dépassement de file" -#: shared-bindings/microcontroller/__init__.c:126 -msgid "Invalid run mode." -msgstr "Mode de lancement invalide" +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "rawbuf is not the same size as buf" +msgstr "" -#: shared-bindings/multiterminal/__init__.c:68 -msgid "Stream missing readinto() or write() method." -msgstr "Il manque une méthode readinto() ou write() au flux." +#: shared-bindings/_pixelbuf/__init__.c +#, fuzzy +msgid "readonly attribute" +msgstr "attribut illisible" -#: shared-bindings/nvm/ByteArray.c:99 -msgid "Slice and value different lengths." -msgstr "Slice et valeur de tailles différentes" +#: py/builtinimport.c +msgid "relative import" +msgstr "import relatif" -#: shared-bindings/nvm/ByteArray.c:104 -msgid "Array values should be single bytes." -msgstr "Les valeurs du tableau doivent être des octets simples 'bytes'." +#: py/obj.c +#, c-format +msgid "requested length %d but object has length %d" +msgstr "la longueur requise est %d mais l'objet est long de %d" -#: shared-bindings/nvm/ByteArray.c:111 shared-bindings/nvm/ByteArray.c:141 -msgid "Unable to write to nvm." -msgstr "Impossible d'écrire sur la nvm." +#: py/compile.c +msgid "return annotation must be an identifier" +msgstr "l'annotation de return doit être un identifiant" -#: shared-bindings/nvm/ByteArray.c:137 -msgid "Bytes must be between 0 and 255." -msgstr "Les octets 'bytes' doivent être entre 0 et 255" +#: py/emitnative.c +msgid "return expected '%q' but got '%q'" +msgstr "return attendait '%q' mais a reçu '%q'" -#: shared-bindings/os/__init__.c:200 -msgid "No hardware random available" -msgstr "Pas de source matérielle d'aléa disponible" +#: shared-module/displayio/Bitmap.c +msgid "row must be packed and word aligned" +msgstr "" -#: shared-bindings/pulseio/PWMOut.c:164 -msgid "" -"PWM duty_cycle must be between 0 and 65535 inclusive (16 bit resolution)" +#: py/objstr.c +msgid "rsplit(None,n)" msgstr "" -"La valeur de cycle PWM doit être entre 0 et 65535 inclus (résolution de 16 " -"bits)" -#: shared-bindings/pulseio/PWMOut.c:195 -#, fuzzy +#: shared-bindings/audioio/RawSample.c msgid "" -"PWM frequency not writable when variable_frequency is False on construction." +"sample_source buffer must be a bytearray or array of type 'h', 'H', 'b' or " +"'B'" msgstr "" -"La fréquence de PWM n'est pas modifiable quand variable_frequency est False " -"à la construction." +"le tampon de sample_source doit être un bytearray ou un tableau de type " +"'h','H', 'b' ou 'B'" -#: shared-bindings/pulseio/PulseIn.c:275 -msgid "Cannot delete values" -msgstr "Impossible de supprimer les valeurs" +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "sampling rate out of range" +msgstr "taux d'échantillonage hors gamme" -#: shared-bindings/pulseio/PulseIn.c:281 -msgid "Slices not supported" -msgstr "Slices non supportées" +#: ports/esp8266/modnetwork.c +msgid "scan failed" +msgstr "échec du scan" -#: shared-bindings/pulseio/PulseIn.c:287 -msgid "index must be int" -msgstr "l'index doit être un entier" +#: py/modmicropython.c +msgid "schedule stack full" +msgstr "pile de plannification pleine" -#: shared-bindings/pulseio/PulseIn.c:293 -msgid "Read-only" -msgstr "Lecture seule" +#: lib/utils/pyexec.c py/builtinimport.c +msgid "script compilation not supported" +msgstr "compilation de script non supporté" -#: shared-bindings/pulseio/PulseOut.c:135 -msgid "Array must contain halfwords (type 'H')" -msgstr "Le tableau doit contenir des halfwords (type 'H')" +#: shared-bindings/bleio/Peripheral.c +msgid "services includes an object that is not a Service" +msgstr "" -#: shared-bindings/random/__init__.c:92 shared-bindings/random/__init__.c:100 -msgid "stop not reachable from start" -msgstr "stop n'est pas accessible au démarrage" +#: py/objstr.c +msgid "sign not allowed in string format specifier" +msgstr "signe non autorisé dans les spéc. de formats de chaînes de caractères" -#: shared-bindings/random/__init__.c:111 -msgid "step must be non-zero" -msgstr "le pas 'step' doit être non nul" +#: py/objstr.c +msgid "sign not allowed with integer format specifier 'c'" +msgstr "signe non autorisé avec la spéc. de format d'entier 'c'" -#: shared-bindings/random/__init__.c:114 -msgid "invalid step" -msgstr "pas invalide" +#: py/objstr.c +msgid "single '}' encountered in format string" +msgstr "'}' seule rencontrée dans une chaîne de format" -#: shared-bindings/random/__init__.c:146 -msgid "empty sequence" -msgstr "séquence vide" +#: shared-bindings/time/__init__.c +msgid "sleep length must be non-negative" +msgstr "la longueur de sleep ne doit pas être négative" -#: shared-bindings/rtc/RTC.c:40 shared-bindings/rtc/RTC.c:44 -#: shared-bindings/time/__init__.c:190 -msgid "RTC is not supported on this board" -msgstr "RTC non supportée sur cette carte" +#: py/objslice.c py/sequence.c +msgid "slice step cannot be zero" +msgstr "le pas 'step' de slice ne peut être zéro" -#: shared-bindings/rtc/RTC.c:52 -msgid "RTC calibration is not supported on this board" -msgstr "calibration de la RTC non supportée sur cette carte" +#: py/sequence.c py/objint.c +msgid "small int overflow" +msgstr "dépassement de capacité d'un entier court" -#: shared-bindings/socket/__init__.c:516 shared-module/network/__init__.c:81 +#: main.c +msgid "soft reboot\n" +msgstr "redémarrage logiciel\n" + +#: py/objstr.c +msgid "start/end indices" +msgstr "indices de début/fin" + +#: shared-bindings/displayio/Shape.c #, fuzzy -msgid "no available NIC" -msgstr "NIC non disponible" +msgid "start_x should be an int" +msgstr "y doit être un entier (int)" -#: shared-bindings/storage/__init__.c:77 -msgid "filesystem must provide mount method" -msgstr "le system de fichier doit fournir une méthode 'mount'" +#: shared-bindings/random/__init__.c +msgid "step must be non-zero" +msgstr "le pas 'step' doit être non nul" -#: shared-bindings/supervisor/__init__.c:93 -msgid "Brightness must be between 0 and 255" -msgstr "La luminosité doit être entre 0 et 255" +#: shared-bindings/busio/UART.c +msgid "stop must be 1 or 2" +msgstr "stop doit être 1 ou 2" -#: shared-bindings/supervisor/__init__.c:119 -msgid "Stack size must be at least 256" -msgstr "La pile doit être au moins de 256" +#: shared-bindings/random/__init__.c +msgid "stop not reachable from start" +msgstr "stop n'est pas accessible au démarrage" -#: shared-bindings/time/__init__.c:78 -msgid "sleep length must be non-negative" -msgstr "la longueur de sleep ne doit pas être négative" +#: py/stream.c +msgid "stream operation not supported" +msgstr "opération de flux non supportée" -#: shared-bindings/time/__init__.c:88 -msgid "time.struct_time() takes exactly 1 argument" -msgstr "time.struct_time() prend exactement 1 argument" +#: py/objstrunicode.c +msgid "string index out of range" +msgstr "index de chaîne hors gamme" -#: shared-bindings/time/__init__.c:91 -msgid "time.struct_time() takes a 9-sequence" -msgstr "time.struct_time() prend une séquence de longueur 9" +#: py/objstrunicode.c +#, c-format +msgid "string indices must be integers, not %s" +msgstr "les indices de chaîne de caractère doivent être des entiers, pas %s" -#: shared-bindings/time/__init__.c:169 shared-bindings/time/__init__.c:263 -msgid "Tuple or struct_time argument required" -msgstr "Argument de type tuple ou struct_time nécessaire" +#: py/stream.c +msgid "string not supported; use bytes or bytearray" +msgstr "" +"chaîne de carac. non supportée; utilisez des bytes ou un tableau de bytes" -#: shared-bindings/time/__init__.c:174 shared-bindings/time/__init__.c:268 -msgid "function takes exactly 9 arguments" -msgstr "la fonction prend exactement 9 arguments" +#: extmod/moductypes.c +msgid "struct: cannot index" +msgstr "struct: indexage impossible" -#: shared-bindings/time/__init__.c:239 shared-bindings/time/__init__.c:272 -msgid "timestamp out of range for platform time_t" -msgstr "timestamp hors gamme pour time_t de la plateforme" +#: extmod/moductypes.c +msgid "struct: index out of range" +msgstr "struct: index hors limite" + +#: extmod/moductypes.c +msgid "struct: no fields" +msgstr "struct: aucun champs" + +#: py/objstr.c +msgid "substring not found" +msgstr "sous-chaîne non trouvée" + +#: py/compile.c +msgid "super() can't find self" +msgstr "super() ne peut pas trouver self" + +#: extmod/modujson.c +msgid "syntax error in JSON" +msgstr "erreur de syntaxe JSON" -#: shared-bindings/touchio/TouchIn.c:173 +#: extmod/moductypes.c +msgid "syntax error in uctypes descriptor" +msgstr "erreur de syntaxe dans le descripteur d'uctypes" + +#: shared-bindings/touchio/TouchIn.c msgid "threshold must be in the range 0-65536" msgstr "le seuil doit être dans la gamme 0-65536" -#: shared-bindings/util.c:38 -msgid "" -"Object has been deinitialized and can no longer be used. Create a new object." +#: shared-bindings/displayio/TileGrid.c +msgid "tile index out of bounds" msgstr "" -"L'objet a été désinitialisé et ne peut plus être utilisé. Créez un nouvel " -"objet." -#: shared-module/audioio/Mixer.c:47 shared-module/audioio/WaveFile.c:117 -msgid "Couldn't allocate first buffer" -msgstr "Impossible d'allouer le 1er tampon" +#: shared-bindings/time/__init__.c +msgid "time.struct_time() takes a 9-sequence" +msgstr "time.struct_time() prend une séquence de longueur 9" -#: shared-module/audioio/Mixer.c:53 shared-module/audioio/WaveFile.c:123 -msgid "Couldn't allocate second buffer" -msgstr "Impossible d'allouer le 2e tampon" +#: shared-bindings/time/__init__.c +msgid "time.struct_time() takes exactly 1 argument" +msgstr "time.struct_time() prend exactement 1 argument" -#: shared-module/audioio/Mixer.c:82 -msgid "Voice index too high" -msgstr "Index de la voix trop grand" +#: shared-bindings/busio/UART.c +msgid "timeout >100 (units are now seconds, not msecs)" +msgstr "timeout >100 (exprimé en secondes, pas en ms)" -#: shared-module/audioio/Mixer.c:85 -msgid "The sample's sample rate does not match the mixer's" -msgstr "L'échantillonage de l'échantillon ne correspond pas à celui du mixer" +#: shared-bindings/bleio/CharacteristicBuffer.c +#, fuzzy +msgid "timeout must be >= 0.0" +msgstr "les bits doivent être 8" -#: shared-module/audioio/Mixer.c:88 -msgid "The sample's channel count does not match the mixer's" -msgstr "Le canal de l'échantillon ne correspond pas à celui du mixer" +#: shared-bindings/time/__init__.c +msgid "timestamp out of range for platform time_t" +msgstr "timestamp hors gamme pour time_t de la plateforme" -#: shared-module/audioio/Mixer.c:91 -msgid "The sample's bits_per_sample does not match the mixer's" -msgstr "Le bits_per_sample de l'échantillon ne correspond pas à celui du mixer" +#: shared-bindings/gamepad/GamePad.c +msgid "too many arguments" +msgstr "trop d'arguments" -#: shared-module/audioio/Mixer.c:100 -msgid "The sample's signedness does not match the mixer's" -msgstr "Le signe de l'échantillon ne correspond pas au mixer" +#: shared-module/struct/__init__.c +msgid "too many arguments provided with the given format" +msgstr "trop d'arguments fournis avec ce format" -#: shared-module/audioio/WaveFile.c:61 -msgid "Invalid wave file" -msgstr "Fichier WAVE invalide" +#: py/runtime.c +#, c-format +msgid "too many values to unpack (expected %d)" +msgstr "trop de valeur à dégrouper (%d attendues)" -#: shared-module/audioio/WaveFile.c:69 -msgid "Invalid format chunk size" -msgstr "Taille de bloc de formatage invalide" +#: py/objstr.c +msgid "tuple index out of range" +msgstr "index du tuple hors gamme" -#: shared-module/audioio/WaveFile.c:83 -msgid "Unsupported format" -msgstr "Format non supporté" +#: py/obj.c +msgid "tuple/list has wrong length" +msgstr "tuple/liste a une mauvaise longueur" -#: shared-module/audioio/WaveFile.c:99 -msgid "Data chunk must follow fmt chunk" -msgstr "Un bloc de données doit suivre un bloc de format" +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "tuple/list required on RHS" +msgstr "" -#: shared-module/audioio/WaveFile.c:107 -msgid "Invalid file" -msgstr "Fichier invalide" +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "tx and rx cannot both be None" +msgstr "tx et rx ne peuvent être None tous les deux" -#: shared-module/bitbangio/I2C.c:58 -msgid "Clock stretch too long" -msgstr "Période de l'horloge trop longue" +#: py/objtype.c +msgid "type '%q' is not an acceptable base type" +msgstr "le type '%q' n'est pas un type de base accepté" -#: shared-module/bitbangio/SPI.c:44 -msgid "Clock pin init failed." -msgstr "Echec de l'init. de la broche d'horloge" +#: py/objtype.c +msgid "type is not an acceptable base type" +msgstr "le type n'est pas un type de base accepté" -#: shared-module/bitbangio/SPI.c:50 -msgid "MOSI pin init failed." -msgstr "Echec de l'init. de la broche MOSI" +#: py/runtime.c +msgid "type object '%q' has no attribute '%q'" +msgstr "l'objet de type '%q' n'a pas d'attribut '%q'" -#: shared-module/bitbangio/SPI.c:61 -msgid "MISO pin init failed." -msgstr "Echec de l'init. de la broche MISO" +#: py/objtype.c +msgid "type takes 1 or 3 arguments" +msgstr "le type prend 1 ou 3 arguments" -#: shared-module/bitbangio/SPI.c:121 -msgid "Cannot write without MOSI pin." -msgstr "Impossible d'écrire sans broche MOSI." +#: py/objint_longlong.c +msgid "ulonglong too large" +msgstr "ulonglong trop grand" -#: shared-module/bitbangio/SPI.c:176 -msgid "Cannot read without MISO pin." -msgstr "Impossible de lire sans broche MISO." +#: py/emitnative.c +msgid "unary op %q not implemented" +msgstr "opération unaire '%q' non implémentée" -#: shared-module/bitbangio/SPI.c:240 -msgid "Cannot transfer without MOSI and MISO pins." -msgstr "Pas de transfert sans broches MOSI et MISO" +#: py/parse.c +msgid "unexpected indent" +msgstr "indentation inattendue" -#: shared-module/displayio/Bitmap.c:49 -msgid "Only bit maps of 8 bit color or less are supported" -msgstr "Seules les bitmaps de 8bits par couleur ou moins sont supportées" +#: py/bc.c +msgid "unexpected keyword argument" +msgstr "argument nommé imprévu" -#: shared-module/displayio/Bitmap.c:69 -msgid "row must be packed and word aligned" -msgstr "" +#: py/objnamedtuple.c py/bc.c +msgid "unexpected keyword argument '%q'" +msgstr "argument nommé '%q' imprévu" -#: shared-module/displayio/Group.c:39 -msgid "Group full" -msgstr "Groupe plein" +#: py/lexer.c +msgid "unicode name escapes" +msgstr "échappements de nom unicode" -#: shared-module/displayio/Group.c:48 -#, fuzzy -msgid "Group empty" -msgstr "Groupe vide" +#: py/parse.c +msgid "unindent does not match any outer indentation level" +msgstr "la désindentation ne correspond à aucune indentation" -#: shared-module/displayio/OnDiskBitmap.c:49 -#, fuzzy -msgid "Invalid BMP file" -msgstr "Fichier invalide" +#: ports/esp8266/modnetwork.c +msgid "unknown config param" +msgstr "paramètre de config. inconnu" -#: shared-module/displayio/OnDiskBitmap.c:59 +#: py/objstr.c #, c-format -msgid "Only Windows format, uncompressed BMP supported %d" -msgstr "Seul les BMP non-compressé au format Windows sont supportés %d" +msgid "unknown conversion specifier %c" +msgstr "spécification %c de conversion inconnue" -#: shared-module/displayio/OnDiskBitmap.c:64 +#: py/objstr.c #, c-format -msgid "Only true color (24 bpp or higher) BMP supported %x" -msgstr "Seul les BMP 24bits ou plus sont supportés %x" +msgid "unknown format code '%c' for object of type '%s'" +msgstr "code de format '%c' inconnu pour un objet de type '%s'" -#: shared-module/storage/__init__.c:155 -msgid "Cannot remount '/' when USB is active." -msgstr "'/' ne peut être remonté quand l'USB est actif." +#: py/objstr.c +#, c-format +msgid "unknown format code '%c' for object of type 'float'" +msgstr "code de format '%c' inconnu pour un objet de type 'float'" -#: shared-module/struct/__init__.c:39 -msgid "'S' and 'O' are not supported format types" -msgstr "'S' et 'O' ne sont pas des types de format supportés" +#: py/objstr.c +#, c-format +msgid "unknown format code '%c' for object of type 'str'" +msgstr "code de format '%c' inconnu pour un objet de type 'str'" -#: shared-module/struct/__init__.c:83 -msgid "too many arguments provided with the given format" -msgstr "trop d'arguments fournis avec ce format" +#: ports/esp8266/modnetwork.c +msgid "unknown status param" +msgstr "paramètre de status inconnu" -#: shared-module/usb_hid/Device.c:45 -#, c-format -msgid "Buffer incorrect size. Should be %d bytes." -msgstr "Tampon de taille incorrect. Devrait être de %d octets." +#: py/compile.c +msgid "unknown type" +msgstr "type inconnu" -#: shared-module/usb_hid/Device.c:53 -msgid "USB Busy" -msgstr "USB occupé" +#: py/emitnative.c +msgid "unknown type '%q'" +msgstr "type '%q' inconnu" -#: shared-module/usb_hid/Device.c:59 -msgid "USB Error" -msgstr "Erreur USB" +#: py/objstr.c +msgid "unmatched '{' in format" +msgstr "'{' sans correspondance dans le format" -#: supervisor/shared/safe_mode.c:97 -msgid "You requested starting safe mode by " -msgstr "Vous avez demandé à démarrer en mode sans-échec par " +#: py/objtype.c py/runtime.c +msgid "unreadable attribute" +msgstr "attribut illisible" -#: supervisor/shared/safe_mode.c:100 -msgid "To exit, please reset the board without " -msgstr "Pour quitter, redémarrez la carte SVP sans " +#: py/emitinlinethumb.c +#, fuzzy, c-format +msgid "unsupported Thumb instruction '%s' with %d arguments" +msgstr "instruction Thumb '%s' non supportée avec %d arguments" + +#: py/emitinlinextensa.c +#, c-format +msgid "unsupported Xtensa instruction '%s' with %d arguments" +msgstr "instruction Xtensa '%s' non supportée avec %d arguments" -#: supervisor/shared/safe_mode.c:107 +#: shared-bindings/displayio/TileGrid.c #, fuzzy -msgid "" -"You are running in safe mode which means something unanticipated happened.\n" -msgstr "" -"Vous êtes en mode sans-échec ce qui signifie qu'un imprévu est survenu.\n" +msgid "unsupported bitmap type" +msgstr "type de bitmap non supporté" -#: supervisor/shared/safe_mode.c:109 -msgid "" -"Looks like our core CircuitPython code crashed hard. Whoops!\n" -"Please file an issue at https://github.com/adafruit/circuitpython/issues\n" -" with the contents of your CIRCUITPY drive and this message:\n" -msgstr "" -"On dirait que notre code CircuitPython a durement planté. Oups !\n" -"Merci de remplir un ticket sur https://github.com/adafruit/circuitpython/" -"issues\n" -"avec le contenu de votre lecteur CIRCUITPY et ce message:\n" +#: py/objstr.c +#, c-format +msgid "unsupported format character '%c' (0x%x) at index %d" +msgstr "caractère de format '%c' (0x%x) non supporté à l'index %d" -#: supervisor/shared/safe_mode.c:111 -msgid "Crash into the HardFault_Handler.\n" -msgstr "" +#: py/runtime.c +msgid "unsupported type for %q: '%s'" +msgstr "type non supporté pour %q: '%s'" -#: supervisor/shared/safe_mode.c:113 -msgid "MicroPython NLR jump failed. Likely memory corruption.\n" -msgstr "" +#: py/runtime.c +msgid "unsupported type for operator" +msgstr "type non supporté pour l'opérateur" -#: supervisor/shared/safe_mode.c:115 -msgid "MicroPython fatal error.\n" -msgstr "Erreur fatale de MicroPython.\n" +#: py/runtime.c +msgid "unsupported types for %q: '%s', '%s'" +msgstr "type non supporté pour %q: '%s', '%s'" -#: supervisor/shared/safe_mode.c:118 -#, fuzzy -msgid "" -"The microcontroller's power dipped. Please make sure your power supply " -"provides\n" -"enough power for the whole circuit and press reset (after ejecting " -"CIRCUITPY).\n" +#: shared-bindings/displayio/Bitmap.c +msgid "value_count must be > 0" msgstr "" -"L'alimentation du microcontroleur a chuté. Merci de vérifier que votre " -"alimentation fournit\n" -"suffisamment de puissance pour l'ensemble du circuit et appuyez sur " -"'reset' (après avoir éjecter CIRCUITPY).\n" -#: supervisor/shared/safe_mode.c:120 -msgid "" -"The CircuitPython heap was corrupted because the stack was too small.\n" -"Please increase stack size limits and press reset (after ejecting " -"CIRCUITPY).\n" -"If you didn't change the stack, then file an issue here with the contents of " -"your CIRCUITPY drive:\n" -msgstr "" -"La pile de CircuitPython a été corrompue parce que la pile était trop " -"petite.\n" -"Augmentez la limite de taille de la pile et appuyez sur 'reset' (après avoir " -"éjecter CIRCUITPY).\n" -"Si vous n'avez pas modifié la pile, merci de remplir un ticket avec le " -"contenu de votre lecteur CIRCUITPY :\n" +#: ports/esp8266/modnetwork.c +msgid "wifi_set_ip_info() failed" +msgstr "wifi_set_ip_info() a échoué" -#: supervisor/shared/safe_mode.c:123 -msgid "" -"The reset button was pressed while booting CircuitPython. Press again to " -"exit safe mode.\n" +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "write_args must be a list, tuple, or None" msgstr "" -"Le bouton 'reset' a été appuyé pendant le démarrage de CircuitPython. " -"Appuyer denouveau pour quitter de le mode sans-échec.\n" -#~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n" -#~ msgstr "" -#~ "Il semblerait que votre code CircuitPython a durement planté. Oups!\n" - -#~ msgid "" -#~ "Please file an issue here with the contents of your CIRCUITPY drive:\n" -#~ msgstr "" -#~ "SVP, remontez le problème là avec le contenu du lecteur CIRCUITPY:\n" +#: py/objstr.c +msgid "wrong number of arguments" +msgstr "mauvais nombres d'arguments" -#~ msgid "Can not add Service." -#~ msgstr "Impossible d'ajouter le Service" +#: py/runtime.c +msgid "wrong number of values to unpack" +msgstr "mauvais nombre de valeurs à dégrouper" -#~ msgid "Invalid Service type" -#~ msgstr "Type de service invalide" +#: shared-module/displayio/Shape.c +#, fuzzy +msgid "x value out of bounds" +msgstr "adresse hors limites" -#~ msgid "Can not encode UUID, to check length." -#~ msgstr "Impossible d'encoder l'UUID pour vérifier la longueur." +#: shared-bindings/displayio/Shape.c +#, fuzzy +msgid "y should be an int" +msgstr "y doit être un entier (int)" -#~ msgid "Can not add Characteristic." -#~ msgstr "Impossible d'ajouter la Characteristic." +#: shared-module/displayio/Shape.c +#, fuzzy +msgid "y value out of bounds" +msgstr "adresse hors limites" -#~ msgid "Can not query for the device address." -#~ msgstr "Impossible d'obtenir l'adresse du périphérique" +#: py/objrange.c +msgid "zero step" +msgstr "'step' nul" -#~ msgid "" -#~ "enough power for the whole circuit and press reset (after ejecting " -#~ "CIRCUITPY).\n" -#~ msgstr "" -#~ "assez de puissance pour l'ensemble du circuit et appuyez sur " -#~ "'reset' (après avoir éjecter CIRCUITPY).\n" +#, fuzzy +#~ msgid "Failed to notify or indicate attribute value, err %0x04x" +#~ msgstr "Impossible de notifier la valeur de l'attribut. status: 0x%08lX" -#~ msgid "Cannot set PPCP parameters." -#~ msgstr "Impossible d'appliquer les paramètres PPCP" +#, fuzzy +#~ msgid "Failed to read attribute value, err %0x04x" +#~ msgstr "Impossible de lire la valeur de l'attribut. status: 0x%08lX" -#~ msgid "Can not apply device name in the stack." -#~ msgstr "Impossible d'appliquer le nom de périphérique dans la pile" +#~ msgid "Function requires lock." +#~ msgstr "La fonction nécessite un verrou." -#~ msgid "Cannot apply GAP parameters." -#~ msgstr "Impossible d'appliquer les paramètres GAP" +#~ msgid "Only Windows format, uncompressed BMP supported %d" +#~ msgstr "Seul les BMP non-compressé au format Windows sont supportés %d" -#, fuzzy -#~ msgid "value_size must be power of two" -#~ msgstr "value_size doit être une puissance de 2" +#~ msgid "Only true color (24 bpp or higher) BMP supported %x" +#~ msgstr "Seul les BMP 24bits ou plus sont supportés %x" #, fuzzy -#~ msgid "palette must be displayio.Palette" -#~ msgstr "la palette doit être une displayio.Palette" +#~ msgid "position must be 2-tuple" +#~ msgstr "position doit être un 2-tuple" diff --git a/locale/it_IT.po b/locale/it_IT.po index 4cb328319..693f8a03c 100644 --- a/locale/it_IT.po +++ b/locale/it_IT.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-12-26 20:49+0100\n" +"POT-Creation-Date: 2019-03-25 19:40+0100\n" "PO-Revision-Date: 2018-10-02 16:27+0200\n" "Last-Translator: Enrico Paganin <enrico.paganin@mail.com>\n" "Language-Team: \n" @@ -17,2634 +17,2912 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: extmod/machine_i2c.c:299 -msgid "invalid I2C peripheral" -msgstr "periferica I2C invalida" +#: main.c +msgid "" +"\n" +"Code done running. Waiting for reload.\n" +msgstr "" -#: extmod/machine_i2c.c:340 extmod/machine_i2c.c:354 extmod/machine_i2c.c:368 -#: extmod/machine_i2c.c:392 -msgid "I2C operation not supported" -msgstr "operazione I2C non supportata" +#: py/obj.c +msgid " File \"%q\"" +msgstr " File \"%q\"" -#: extmod/machine_mem.c:45 ports/unix/modmachine.c:53 +#: py/obj.c +msgid " File \"%q\", line %d" +msgstr " File \"%q\", riga %d" + +#: main.c +msgid " output:\n" +msgstr " output:\n" + +#: py/objstr.c #, c-format -msgid "address %08x is not aligned to %d bytes" -msgstr "l'indirizzo %08x non è allineato a %d bytes" +msgid "%%c requires int or char" +msgstr "%%c necessita di int o char" -#: extmod/machine_spi.c:57 -msgid "invalid SPI peripheral" -msgstr "periferica SPI invalida" +#: shared-bindings/microcontroller/Pin.c +msgid "%q in use" +msgstr "%q in uso" -#: extmod/machine_spi.c:124 -msgid "buffers must be the same length" -msgstr "i buffer devono essere della stessa lunghezza" +#: py/obj.c +msgid "%q index out of range" +msgstr "indice %q fuori intervallo" -#: extmod/machine_spi.c:207 -msgid "bits must be 8" -msgstr "i bit devono essere 8" +#: py/obj.c +msgid "%q indices must be integers, not %s" +msgstr "gli indici %q devono essere interi, non %s" -#: extmod/machine_spi.c:210 -msgid "firstbit must be MSB" -msgstr "il primo bit deve essere il più significativo (MSB)" +#: shared-bindings/displayio/Group.c shared-bindings/displayio/Shape.c +#: shared-bindings/bleio/CharacteristicBuffer.c +#, fuzzy +msgid "%q must be >= 1" +msgstr "slice del buffer devono essere della stessa lunghezza" -#: extmod/machine_spi.c:215 -msgid "must specify all of sck/mosi/miso" -msgstr "è necessario specificare tutte le sck/mosi/miso" +#: shared-bindings/fontio/BuiltinFont.c +#, fuzzy +msgid "%q should be an int" +msgstr "y dovrebbe essere un int" -#: extmod/modframebuf.c:299 -msgid "invalid format" -msgstr "formato non valido" +#: py/objnamedtuple.c py/bc.c +msgid "%q() takes %d positional arguments but %d were given" +msgstr "%q() prende %d argomenti posizionali ma ne sono stati forniti %d" -#: extmod/modubinascii.c:38 extmod/moduhashlib.c:102 -msgid "a bytes-like object is required" -msgstr "un oggetto byte-like è richiesto" +#: py/argcheck.c +msgid "'%q' argument required" +msgstr "'%q' argomento richiesto" -#: extmod/modubinascii.c:90 -msgid "odd-length string" -msgstr "stringa di lunghezza dispari" +#: py/emitinlinextensa.c py/emitinlinethumb.c +#, c-format +msgid "'%s' expects a label" +msgstr "'%s' aspetta una etichetta" -#: extmod/modubinascii.c:101 -msgid "non-hex digit found" -msgstr "trovata cifra non esadecimale" +#: py/emitinlinextensa.c py/emitinlinethumb.c +#, c-format +msgid "'%s' expects a register" +msgstr "'%s' aspetta un registro" -#: extmod/modubinascii.c:169 -msgid "incorrect padding" -msgstr "padding incorretto" +#: py/emitinlinethumb.c +#, fuzzy, c-format +msgid "'%s' expects a special register" +msgstr "'%s' aspetta un registro" -#: extmod/moductypes.c:122 -msgid "syntax error in uctypes descriptor" -msgstr "errore di sintassi nel descrittore uctypes" +#: py/emitinlinethumb.c +#, fuzzy, c-format +msgid "'%s' expects an FPU register" +msgstr "'%s' aspetta un registro" -#: extmod/moductypes.c:219 -msgid "Cannot unambiguously get sizeof scalar" -msgstr "Impossibile ricavare la grandezza scalare di sizeof inequivocabilmente" +#: py/emitinlinethumb.c +#, fuzzy, c-format +msgid "'%s' expects an address of the form [a, b]" +msgstr "'%s' aspetta un registro" -#: extmod/moductypes.c:397 -msgid "struct: no fields" -msgstr "struct: nessun campo" +#: py/emitinlinextensa.c py/emitinlinethumb.c +#, c-format +msgid "'%s' expects an integer" +msgstr "'%s' aspetta un intero" -#: extmod/moductypes.c:530 -msgid "struct: cannot index" -msgstr "struct: impossibile indicizzare" +#: py/emitinlinethumb.c +#, fuzzy, c-format +msgid "'%s' expects at most r%d" +msgstr "'%s' aspetta un registro" -#: extmod/moductypes.c:544 -msgid "struct: index out of range" -msgstr "struct: indice fuori intervallo" +#: py/emitinlinethumb.c +#, fuzzy, c-format +msgid "'%s' expects {r0, r1, ...}" +msgstr "'%s' aspetta un registro" -#: extmod/moduheapq.c:38 -msgid "heap must be a list" -msgstr "l'heap deve essere una lista" +#: py/emitinlinextensa.c +#, c-format +msgid "'%s' integer %d is not within range %d..%d" +msgstr "intero '%s' non è nell'intervallo %d..%d" -#: extmod/moduheapq.c:86 extmod/modutimeq.c:147 extmod/modutimeq.c:172 -msgid "empty heap" -msgstr "heap vuoto" +#: py/emitinlinethumb.c +#, fuzzy, c-format +msgid "'%s' integer 0x%x does not fit in mask 0x%x" +msgstr "intero '%s' non è nell'intervallo %d..%d" -#: extmod/modujson.c:281 -msgid "syntax error in JSON" -msgstr "errore di sintassi nel JSON" +#: py/obj.c +#, c-format +msgid "'%s' object does not support item assignment" +msgstr "" -#: extmod/modure.c:161 -msgid "Splitting with sub-captures" -msgstr "Suddivisione con sotto-catture" +#: py/obj.c +#, c-format +msgid "'%s' object does not support item deletion" +msgstr "" -#: extmod/modure.c:207 -msgid "Error in regex" -msgstr "Errore nella regex" +#: py/runtime.c +msgid "'%s' object has no attribute '%q'" +msgstr "l'oggetto '%s' non ha l'attributo '%q'" -#: extmod/modussl_axtls.c:81 -msgid "invalid key" -msgstr "chiave non valida" +#: py/runtime.c +#, c-format +msgid "'%s' object is not an iterator" +msgstr "l'oggetto '%s' non è un iteratore" -#: extmod/modussl_axtls.c:87 -msgid "invalid cert" -msgstr "certificato non valido" +#: py/objtype.c py/runtime.c +#, c-format +msgid "'%s' object is not callable" +msgstr "" -#: extmod/modutimeq.c:131 -msgid "queue overflow" -msgstr "overflow della coda" +#: py/runtime.c +#, c-format +msgid "'%s' object is not iterable" +msgstr "l'oggetto '%s' non è iterabile" -#: extmod/moduzlib.c:98 -msgid "compression header" -msgstr "compressione dell'header" +#: py/obj.c +#, c-format +msgid "'%s' object is not subscriptable" +msgstr "" -#: extmod/uos_dupterm.c:120 -msgid "invalid dupterm index" -msgstr "indice dupterm non valido" +#: py/objstr.c +msgid "'=' alignment not allowed in string format specifier" +msgstr "" -#: extmod/vfs_fat.c:426 py/moduerrno.c:154 -msgid "Read-only filesystem" -msgstr "Filesystem in sola lettura" +#: shared-module/struct/__init__.c +msgid "'S' and 'O' are not supported format types" +msgstr "'S' e 'O' non sono formati supportati" -#: extmod/vfs_posix_file.c:48 ports/unix/file.c:50 py/objstringio.c:43 -msgid "I/O operation on closed file" -msgstr "operazione I/O su file chiuso" +#: py/compile.c +msgid "'align' requires 1 argument" +msgstr "'align' richiede 1 argomento" -#: lib/embed/abort_.c:8 -msgid "abort() called" -msgstr "abort() chiamato" +#: py/compile.c +msgid "'await' outside function" +msgstr "'await' al di fuori della funzione" -#: lib/netutils/netutils.c:83 -msgid "invalid arguments" -msgstr "argomenti non validi" +#: py/compile.c +msgid "'break' outside loop" +msgstr "'break' al di fuori del ciclo" -#: lib/utils/pyexec.c:97 py/builtinimport.c:251 -msgid "script compilation not supported" -msgstr "compilazione dello scrip non suportata" +#: py/compile.c +msgid "'continue' outside loop" +msgstr "'continue' al di fuori del ciclo" -#: main.c:150 -msgid " output:\n" -msgstr " output:\n" +#: py/compile.c +msgid "'data' requires at least 2 arguments" +msgstr "'data' richiede almeno 2 argomento" -#: main.c:164 main.c:237 -msgid "" -"Auto-reload is on. Simply save files over USB to run them or enter REPL to " -"disable.\n" +#: py/compile.c +msgid "'data' requires integer arguments" +msgstr "'data' richiede argomenti interi" + +#: py/compile.c +msgid "'label' requires 1 argument" +msgstr "'label' richiede 1 argomento" + +#: py/compile.c +msgid "'return' outside function" +msgstr "'return' al di fuori della funzione" + +#: py/compile.c +msgid "'yield' outside function" +msgstr "'yield' al di fuori della funzione" + +#: py/compile.c +msgid "*x must be assignment target" msgstr "" -"L'auto-reload è attivo. Salva i file su USB per eseguirli o entra nel REPL " -"per disabilitarlo.\n" -#: main.c:166 -msgid "Running in safe mode! Auto-reload is off.\n" -msgstr "Modalità sicura in esecuzione! Auto-reload disattivato.\n" +#: py/obj.c +msgid ", in %q\n" +msgstr ", in %q\n" -#: main.c:168 main.c:239 -msgid "Auto-reload is off.\n" -msgstr "Auto-reload disattivato.\n" +#: py/objcomplex.c +msgid "0.0 to a complex power" +msgstr "0.0 elevato alla potenza di un numero complesso" -#: main.c:182 -msgid "Running in safe mode! Not running saved code.\n" -msgstr "Modalità sicura in esecuzione! Codice salvato non in esecuzione.\n" +#: py/modbuiltins.c +msgid "3-arg pow() not supported" +msgstr "pow() con tre argmomenti non supportata" -#: main.c:198 -msgid "WARNING: Your code filename has two extensions\n" -msgstr "ATTENZIONE: Il nome del sorgente ha due estensioni\n" +#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c +msgid "A hardware interrupt channel is already in use" +msgstr "Un canale di interrupt hardware è già in uso" -#: main.c:244 -msgid "Press any key to enter the REPL. Use CTRL-D to reload." +#: ports/esp8266/modnetwork.c +msgid "AP required" +msgstr "AP richiesto" + +#: shared-bindings/bleio/Address.c +#, c-format +msgid "Address is not %d bytes long or is in wrong format" msgstr "" -"Premi un qualunque tasto per entrare nel REPL. Usa CTRL-D per ricaricare." -#: main.c:407 -msgid "soft reboot\n" -msgstr "soft reboot\n" +#: shared-bindings/bleio/Address.c +#, fuzzy, c-format +msgid "Address must be %d bytes long" +msgstr "la palette deve essere lunga 32 byte" -#: ports/atmel-samd/audio_dma.c:209 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:361 -msgid "All sync event channels in use" -msgstr "Tutti i canali di eventi sincronizzati in uso" +#: ports/nrf/common-hal/busio/I2C.c +msgid "All I2C peripherals are in use" +msgstr "Tutte le periferiche I2C sono in uso" -#: ports/atmel-samd/bindings/samd/Clock.c:135 -msgid "calibration is read only" -msgstr "la calibrazione è in sola lettura" +#: ports/nrf/common-hal/busio/SPI.c +msgid "All SPI peripherals are in use" +msgstr "Tutte le periferiche SPI sono in uso" -#: ports/atmel-samd/bindings/samd/Clock.c:137 -msgid "calibration is out of range" -msgstr "la calibrazione è fuori intervallo" +#: ports/nrf/common-hal/busio/UART.c +#, fuzzy +msgid "All UART peripherals are in use" +msgstr "Tutte le periferiche I2C sono in uso" -#: ports/atmel-samd/board_busses.c:59 ports/nrf/board_busses.c:39 -msgid "No default I2C bus" -msgstr "Nessun bus I2C predefinito" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "All event channels in use" +msgstr "Tutti i canali eventi utilizati" -#: ports/atmel-samd/board_busses.c:85 ports/nrf/board_busses.c:64 -msgid "No default SPI bus" -msgstr "Nessun bus SPI predefinito" +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c ports/atmel-samd/audio_dma.c +msgid "All sync event channels in use" +msgstr "Tutti i canali di eventi sincronizzati in uso" -#: ports/atmel-samd/board_busses.c:112 ports/nrf/board_busses.c:91 -msgid "No default UART bus" -msgstr "Nessun bus UART predefinito" +#: shared-bindings/pulseio/PWMOut.c +msgid "All timers for this pin are in use" +msgstr "Tutti i timer per questo pin sono in uso" -#: ports/atmel-samd/common-hal/analogio/AnalogIn.c:63 -#: ports/nrf/common-hal/analogio/AnalogIn.c:39 -msgid "Pin does not have ADC capabilities" -msgstr "Il pin non ha capacità di ADC" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/pulseio/PulseOut.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c +#: shared-module/_pew/PewPew.c +msgid "All timers in use" +msgstr "Tutti i timer utilizzati" -#: ports/atmel-samd/common-hal/analogio/AnalogOut.c:49 -msgid "No DAC on chip" -msgstr "Nessun DAC sul chip" +#: ports/nrf/common-hal/analogio/AnalogOut.c +msgid "AnalogOut functionality not supported" +msgstr "funzionalità AnalogOut non supportata" + +#: shared-bindings/analogio/AnalogOut.c +msgid "AnalogOut is only 16 bits. Value must be less than 65536." +msgstr "AnalogOut ha solo 16 bit. Il valore deve essere meno di 65536." -#: ports/atmel-samd/common-hal/analogio/AnalogOut.c:56 +#: ports/atmel-samd/common-hal/analogio/AnalogOut.c msgid "AnalogOut not supported on given pin" msgstr "AnalogOut non supportato sul pin scelto" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:147 -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:150 -msgid "Invalid bit clock pin" -msgstr "Pin del clock di bit non valido" +#: ports/atmel-samd/common-hal/pulseio/PulseOut.c +msgid "Another send is already active" +msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:153 -msgid "Bit clock and word select must share a clock unit" +#: shared-bindings/pulseio/PulseOut.c +msgid "Array must contain halfwords (type 'H')" msgstr "" -"Clock di bit e selezione parola devono condividere la stessa unità di clock" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:156 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:130 -msgid "Invalid data pin" -msgstr "Pin dati non valido" +#: shared-bindings/nvm/ByteArray.c +msgid "Array values should be single bytes." +msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:169 -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:174 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:145 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:150 -msgid "Serializer in use" -msgstr "Serializer in uso" +#: supervisor/shared/safe_mode.c +msgid "Attempted heap allocation when MicroPython VM not running.\n" +msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:230 -msgid "Clock unit in use" -msgstr "Unità di clock in uso" +#: main.c +msgid "Auto-reload is off.\n" +msgstr "Auto-reload disattivato.\n" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:240 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:172 -msgid "Unable to find free GCLK" -msgstr "Impossibile trovare un GCLK libero" +#: main.c +msgid "" +"Auto-reload is on. Simply save files over USB to run them or enter REPL to " +"disable.\n" +msgstr "" +"L'auto-reload è attivo. Salva i file su USB per eseguirli o entra nel REPL " +"per disabilitarlo.\n" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:254 -msgid "Too many channels in sample." +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Bit clock and word select must share a clock unit" msgstr "" +"Clock di bit e selezione parola devono condividere la stessa unità di clock" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:305 -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:417 -msgid "No DMA channel found" -msgstr "Nessun canale DMA trovato" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Bit depth must be multiple of 8." +msgstr "La profondità di bit deve essere multipla di 8." -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:308 -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:419 -msgid "Unable to allocate buffers for signed conversion" -msgstr "Ipossibilitato ad allocare buffer per la conversione con segno" +#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c +msgid "Both pins must support hardware interrupts" +msgstr "Entrambi i pin devono supportare gli interrupt hardware" -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:109 -msgid "Invalid clock pin" -msgstr "Pin di clock non valido" +#: shared-bindings/supervisor/__init__.c +msgid "Brightness must be between 0 and 255" +msgstr "La luminosità deve essere compreso tra 0 e 255" -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:134 -msgid "Only 8 or 16 bit mono with " +#: shared-bindings/displayio/Display.c +msgid "Brightness not adjustable" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:167 -msgid "sampling rate out of range" -msgstr "frequenza di campionamento fuori intervallo" - -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:132 -msgid "DAC already in use" -msgstr "DAC già in uso" +#: shared-module/usb_hid/Device.c +#, c-format +msgid "Buffer incorrect size. Should be %d bytes." +msgstr "Buffer di lunghezza non valida. Dovrebbe essere di %d bytes." -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:136 -msgid "Right channel unsupported" -msgstr "Canale destro non supportato" +#: shared-bindings/bitbangio/I2C.c shared-bindings/busio/I2C.c +msgid "Buffer must be at least length 1" +msgstr "Il buffer deve essere lungo almeno 1" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:139 -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:116 -#: ports/atmel-samd/common-hal/touchio/TouchIn.c:65 -msgid "Invalid pin" -msgstr "Pin non valido" +#: ports/atmel-samd/common-hal/displayio/ParallelBus.c +#: ports/nrf/common-hal/displayio/ParallelBus.c +#, fuzzy, c-format +msgid "Bus pin %d is already in use" +msgstr "DAC già in uso" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:147 -msgid "Invalid pin for left channel" -msgstr "Pin non valido per il canale sinistro" +#: shared-bindings/bleio/UUID.c +#, fuzzy +msgid "Byte buffer must be 16 bytes." +msgstr "i buffer devono essere della stessa lunghezza" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:151 -msgid "Invalid pin for right channel" -msgstr "Pin non valido per il canale destro" +#: shared-bindings/nvm/ByteArray.c +msgid "Bytes must be between 0 and 255." +msgstr "I byte devono essere compresi tra 0 e 255" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:154 -msgid "Cannot output both channels on the same pin" -msgstr "Impossibile dare in output entrambi i canal sullo stesso pin" +#: ports/esp8266/esp_mphal.c +msgid "C-level assert" +msgstr "assert a livello C" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:243 -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:189 -#: ports/atmel-samd/common-hal/pulseio/PulseOut.c:110 -#: ports/nrf/common-hal/pulseio/PulseOut.c:107 -msgid "All timers in use" -msgstr "Tutti i timer utilizzati" +#: shared-bindings/_pixelbuf/PixelBuf.c +#, c-format +msgid "Can not use dotstar with %s" +msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:285 -msgid "All event channels in use" -msgstr "Tutti i canali eventi utilizati" +#: shared-bindings/bleio/Device.c +msgid "Can't add services in Central mode" +msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:375 -#, c-format -msgid "Sample rate too high. It must be less than %d" +#: shared-bindings/bleio/Device.c +msgid "Can't advertise in Central mode" msgstr "" -"Frequenza di campionamento troppo alta. Il valore deve essere inferiore a %d" -#: ports/atmel-samd/common-hal/busio/I2C.c:71 -msgid "Not enough pins available" -msgstr "Non sono presenti abbastanza pin" +#: shared-bindings/bleio/Device.c +msgid "Can't change the name in Central mode" +msgstr "" -#: ports/atmel-samd/common-hal/busio/I2C.c:78 -#: ports/atmel-samd/common-hal/busio/SPI.c:171 -#: ports/atmel-samd/common-hal/busio/UART.c:120 -#: ports/atmel-samd/common-hal/i2cslave/I2CSlave.c:45 -#: ports/nrf/common-hal/busio/I2C.c:82 -msgid "Invalid pins" -msgstr "Pin non validi" +#: shared-bindings/bleio/Device.c +msgid "Can't connect in Peripheral mode" +msgstr "" -#: ports/atmel-samd/common-hal/busio/I2C.c:101 -msgid "SDA or SCL needs a pull up" -msgstr "SDA o SCL necessitano un pull-up" +#: ports/esp8266/modnetwork.c +msgid "Cannot connect to AP" +msgstr "Impossible connettersi all'AP" -#: ports/atmel-samd/common-hal/busio/I2C.c:121 -msgid "Unsupported baudrate" -msgstr "baudrate non supportato" +#: shared-bindings/displayio/Bitmap.c shared-bindings/pulseio/PulseIn.c +msgid "Cannot delete values" +msgstr "Impossibile cancellare valori" -#: ports/atmel-samd/common-hal/busio/UART.c:67 -msgid "bytes > 8 bits not supported" -msgstr "byte > 8 bit non supportati" +#: ports/esp8266/modnetwork.c +msgid "Cannot disconnect from AP" +msgstr "Impossible disconnettersi all'AP" -#: ports/atmel-samd/common-hal/busio/UART.c:73 -#: ports/nrf/common-hal/busio/UART.c:106 -msgid "tx and rx cannot both be None" -msgstr "tx e rx non possono essere entrambi None" +#: ports/atmel-samd/common-hal/digitalio/DigitalInOut.c +#: ports/nrf/common-hal/digitalio/DigitalInOut.c +msgid "Cannot get pull while in output mode" +msgstr "" -#: ports/atmel-samd/common-hal/busio/UART.c:146 -#: ports/nrf/common-hal/busio/UART.c:140 -msgid "Failed to allocate RX buffer" -msgstr "Impossibile allocare buffer RX" +#: ports/nrf/common-hal/microcontroller/Processor.c +#, fuzzy +msgid "Cannot get temperature" +msgstr "Impossibile leggere la temperatura. status: 0x%02x" -#: ports/atmel-samd/common-hal/busio/UART.c:154 -msgid "Could not initialize UART" -msgstr "Impossibile inizializzare l'UART" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Cannot output both channels on the same pin" +msgstr "Impossibile dare in output entrambi i canal sullo stesso pin" -#: ports/atmel-samd/common-hal/busio/UART.c:241 -#: ports/nrf/common-hal/busio/UART.c:185 -msgid "No RX pin" -msgstr "Nessun pin RX" +#: shared-module/bitbangio/SPI.c +msgid "Cannot read without MISO pin." +msgstr "Impossibile leggere senza pin MISO." -#: ports/atmel-samd/common-hal/busio/UART.c:300 -#: ports/nrf/common-hal/busio/UART.c:220 -msgid "No TX pin" -msgstr "Nessun pin TX" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Cannot record to a file" +msgstr "Impossibile registrare in un file" -#: ports/atmel-samd/common-hal/digitalio/DigitalInOut.c:170 -#: ports/nrf/common-hal/digitalio/DigitalInOut.c:147 -msgid "Cannot get pull while in output mode" -msgstr "" +#: shared-module/storage/__init__.c +msgid "Cannot remount '/' when USB is active." +msgstr "Non è possibile rimontare '/' mentre l'USB è attiva." -#: ports/atmel-samd/common-hal/microcontroller/__init__.c:74 -#: ports/esp8266/common-hal/microcontroller/__init__.c:64 +#: ports/atmel-samd/common-hal/microcontroller/__init__.c +#: ports/esp8266/common-hal/microcontroller/__init__.c msgid "Cannot reset into bootloader because no bootloader is present." msgstr "" "Impossibile resettare nel bootloader poiché nessun bootloader è presente." -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:120 -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:369 -#: ports/nrf/common-hal/pulseio/PWMOut.c:119 -#: ports/nrf/common-hal/pulseio/PWMOut.c:233 -msgid "Invalid PWM frequency" -msgstr "Frequenza PWM non valida" +#: ports/esp8266/modnetwork.c +msgid "Cannot set STA config" +msgstr "Impossibile impostare la configurazione della STA" -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:187 -msgid "All timers for this pin are in use" -msgstr "Tutti i timer per questo pin sono in uso" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Cannot set value when direction is input." +msgstr "" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:110 -msgid "No hardware support on pin" -msgstr "Nessun supporto hardware sul pin" +#: py/objslice.c +msgid "Cannot subclass slice" +msgstr "Impossibile subclasare slice" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:113 -msgid "EXTINT channel already in use" -msgstr "Canale EXTINT già in uso" +#: shared-module/bitbangio/SPI.c +msgid "Cannot transfer without MOSI and MISO pins." +msgstr "Impossibile trasferire senza i pin MOSI e MISO." -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:118 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:86 -#, c-format -msgid "Failed to allocate RX buffer of %d bytes" -msgstr "Fallita allocazione del buffer RX di %d byte" +#: extmod/moductypes.c +msgid "Cannot unambiguously get sizeof scalar" +msgstr "Impossibile ricavare la grandezza scalare di sizeof inequivocabilmente" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:205 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:151 -msgid "pop from an empty PulseIn" -msgstr "pop sun un PulseIn vuoto" +#: ports/esp8266/modnetwork.c +msgid "Cannot update i/f status" +msgstr "Impossibile aggiornare status di i/f" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:237 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:422 -msgid "index out of range" -msgstr "indice fuori intervallo" +#: shared-module/bitbangio/SPI.c +msgid "Cannot write without MOSI pin." +msgstr "Impossibile scrivere senza pin MOSI." -#: ports/atmel-samd/common-hal/pulseio/PulseOut.c:178 -msgid "Another send is already active" +#: shared-bindings/bleio/Service.c +msgid "Characteristic UUID doesn't match Service UUID" msgstr "" -#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c:38 -msgid "Both pins must support hardware interrupts" -msgstr "Entrambi i pin devono supportare gli interrupt hardware" - -#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c:46 -msgid "A hardware interrupt channel is already in use" -msgstr "Un canale di interrupt hardware è già in uso" - -#: ports/atmel-samd/common-hal/rtc/RTC.c:101 -msgid "calibration value out of range +/-127" -msgstr "valore di calibrazione fuori intervallo +/-127" - -#: ports/atmel-samd/common-hal/touchio/TouchIn.c:75 -msgid "No free GCLKs" -msgstr "Nessun GCLK libero" +#: ports/nrf/common-hal/bleio/Service.c +msgid "Characteristic already in use by another Service." +msgstr "" -#: ports/esp8266/common-hal/analogio/AnalogIn.c:43 -msgid "Pin %q does not have ADC capabilities" -msgstr "Il pin %q non ha capacità ADC" +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "CharacteristicBuffer writing not provided" +msgstr "" -#: ports/esp8266/common-hal/analogio/AnalogOut.c:39 -msgid "No hardware support for analog out." -msgstr "Nessun supporto hardware per l'uscita analogica." +#: shared-module/bitbangio/SPI.c +msgid "Clock pin init failed." +msgstr "Inizializzazione del pin di clock fallita." -#: ports/esp8266/common-hal/busio/SPI.c:72 -msgid "Pins not valid for SPI" -msgstr "Pin non validi per SPI" +#: shared-module/bitbangio/I2C.c +msgid "Clock stretch too long" +msgstr "" -#: ports/esp8266/common-hal/busio/UART.c:45 -msgid "Only tx supported on UART1 (GPIO2)." -msgstr "Solo tx supportato su UART1 (GPIO2)." +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Clock unit in use" +msgstr "Unità di clock in uso" -#: ports/esp8266/common-hal/busio/UART.c:67 ports/esp8266/machine_uart.c:108 -msgid "invalid data bits" -msgstr "bit dati invalidi" +#: shared-bindings/_pew/PewPew.c +msgid "Column entry must be digitalio.DigitalInOut" +msgstr "" -#: ports/esp8266/common-hal/busio/UART.c:91 ports/esp8266/machine_uart.c:144 -msgid "invalid stop bits" -msgstr "bit di stop invalidi" +#: shared-bindings/displayio/FourWire.c shared-bindings/displayio/ParallelBus.c +#, fuzzy +msgid "Command must be an int between 0 and 255" +msgstr "I byte devono essere compresi tra 0 e 255" -#: ports/esp8266/common-hal/digitalio/DigitalInOut.c:200 -msgid "ESP8266 does not support pull down." -msgstr "ESP8266 non supporta pull-down" +#: ports/nrf/common-hal/bleio/UUID.c +#, c-format +msgid "Could not decode ble_uuid, err 0x%04x" +msgstr "" -#: ports/esp8266/common-hal/digitalio/DigitalInOut.c:210 -msgid "GPIO16 does not support pull up." -msgstr "GPIO16 non supporta pull-up" +#: ports/atmel-samd/common-hal/busio/UART.c +msgid "Could not initialize UART" +msgstr "Impossibile inizializzare l'UART" -#: ports/esp8266/common-hal/microcontroller/__init__.c:66 -msgid "ESP8226 does not support safe mode." -msgstr "ESP8266 non supporta la modalità sicura." +#: shared-module/audioio/Mixer.c shared-module/audioio/WaveFile.c +msgid "Couldn't allocate first buffer" +msgstr "Impossibile allocare il primo buffer" -#: ports/esp8266/common-hal/pulseio/PWMOut.c:54 -#: ports/esp8266/common-hal/pulseio/PWMOut.c:113 -#, c-format -msgid "Maximum PWM frequency is %dhz." -msgstr "Frequenza massima su PWM è %dhz" +#: shared-module/audioio/Mixer.c shared-module/audioio/WaveFile.c +msgid "Couldn't allocate second buffer" +msgstr "Impossibile allocare il secondo buffer" -#: ports/esp8266/common-hal/pulseio/PWMOut.c:57 -#: ports/esp8266/common-hal/pulseio/PWMOut.c:116 -msgid "Minimum PWM frequency is 1hz." -msgstr "Frequenza minima su PWM è 1hz" +#: supervisor/shared/safe_mode.c +msgid "Crash into the HardFault_Handler.\n" +msgstr "" -#: ports/esp8266/common-hal/pulseio/PWMOut.c:68 -#, c-format -msgid "Multiple PWM frequencies not supported. PWM already set to %dhz." -msgstr "Frequenze PWM multiple non supportate. PWM già impostato a %shz." +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "DAC already in use" +msgstr "DAC già in uso" -#: ports/esp8266/common-hal/pulseio/PWMOut.c:77 ports/esp8266/machine_pwm.c:70 -#, c-format -msgid "PWM not supported on pin %d" -msgstr "PWM non è supportato sul pin %d" +#: ports/atmel-samd/common-hal/displayio/ParallelBus.c +#: ports/nrf/common-hal/displayio/ParallelBus.c +#, fuzzy +msgid "Data 0 pin must be byte aligned" +msgstr "graphic deve essere lunga 2048 byte" -#: ports/esp8266/common-hal/pulseio/PulseIn.c:78 -msgid "No PulseIn support for %q" -msgstr "Nessun supporto per PulseIn per %q" +#: shared-module/audioio/WaveFile.c +msgid "Data chunk must follow fmt chunk" +msgstr "" -#: ports/esp8266/common-hal/storage/__init__.c:34 -msgid "Unable to remount filesystem" -msgstr "Imposssibile rimontare il filesystem" +#: ports/nrf/common-hal/bleio/Broadcaster.c +#: ports/nrf/common-hal/bleio/Peripheral.c +#, fuzzy +msgid "Data too large for advertisement packet" +msgstr "Impossibile inserire dati nel pacchetto di advertisement." -#: ports/esp8266/common-hal/storage/__init__.c:38 -msgid "Use esptool to erase flash and re-upload Python instead" -msgstr "Usa esptool per cancellare la flash e ricaricare Python invece" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Data too large for the advertisement packet" +msgstr "Impossibile inserire dati nel pacchetto di advertisement." -#: ports/esp8266/esp_mphal.c:154 -msgid "C-level assert" -msgstr "assert a livello C" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Destination capacity is smaller than destination_length." +msgstr "La capacità di destinazione è più piccola di destination_length." -#: ports/esp8266/machine_adc.c:57 -#, c-format -msgid "not a valid ADC Channel: %d" -msgstr "canale ADC non valido: %d" +#: shared-bindings/displayio/Display.c +msgid "Display rotation must be in 90 degree increments" +msgstr "" -#: ports/esp8266/machine_hspi.c:131 ports/esp8266/machine_hspi.c:137 -msgid "impossible baudrate" -msgstr "baudrate impossibile" +#: ports/unix/modffi.c +msgid "Don't know how to pass object to native function" +msgstr "Non so come passare l'oggetto alla funzione nativa" -#: ports/esp8266/machine_pin.c:129 -msgid "expecting a pin" -msgstr "pin atteso" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Drive mode not used when direction is input." +msgstr "" -#: ports/esp8266/machine_pin.c:284 -msgid "Pin(16) doesn't support pull" -msgstr "Pin(16) non supporta pull" +#: ports/esp8266/common-hal/microcontroller/__init__.c +msgid "ESP8226 does not support safe mode." +msgstr "ESP8266 non supporta la modalità sicura." -#: ports/esp8266/machine_pin.c:323 -msgid "invalid pin" -msgstr "pin non valido" +#: ports/esp8266/common-hal/digitalio/DigitalInOut.c +msgid "ESP8266 does not support pull down." +msgstr "ESP8266 non supporta pull-down" -#: ports/esp8266/machine_pin.c:389 -msgid "pin does not have IRQ capabilities" -msgstr "il pin non implementa IRQ" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +msgid "EXTINT channel already in use" +msgstr "Canale EXTINT già in uso" -#: ports/esp8266/machine_rtc.c:185 -msgid "buffer too long" -msgstr "buffer troppo lungo" +#: ports/unix/modffi.c +msgid "Error in ffi_prep_cif" +msgstr "Errore in ffi_prep_cif" -#: ports/esp8266/machine_rtc.c:209 ports/esp8266/machine_rtc.c:223 -#: ports/esp8266/machine_rtc.c:246 -msgid "invalid alarm" -msgstr "alarm non valido" +#: extmod/modure.c +msgid "Error in regex" +msgstr "Errore nella regex" -#: ports/esp8266/machine_uart.c:169 -#, c-format -msgid "UART(%d) does not exist" -msgstr "UART(%d) non esistente" +#: shared-bindings/pulseio/PulseOut.c shared-bindings/neopixel_write/__init__.c +#: shared-bindings/terminalio/Terminal.c shared-bindings/microcontroller/Pin.c +msgid "Expected a %q" +msgstr "Atteso un %q" -#: ports/esp8266/machine_uart.c:219 -msgid "UART(1) can't read" -msgstr "UART(1) non leggibile" +#: shared-bindings/bleio/CharacteristicBuffer.c +#, fuzzy +msgid "Expected a Characteristic" +msgstr "Non è possibile aggiungere Characteristic." -#: ports/esp8266/modesp.c:119 -msgid "len must be multiple of 4" -msgstr "len deve essere multiplo di 4" +#: shared-bindings/bleio/Descriptor.c shared-bindings/bleio/Service.c +#: shared-bindings/bleio/Characteristic.c +#, fuzzy +msgid "Expected a UUID" +msgstr "Atteso un %q" -#: ports/esp8266/modesp.c:274 +#: shared-module/_pixelbuf/PixelBuf.c #, c-format -msgid "memory allocation failed, allocating %u bytes for native code" +msgid "Expected tuple of length %d, got %d" msgstr "" -"allocazione di memoria fallita, allocazione di %d byte per codice nativo" - -#: ports/esp8266/modesp.c:317 -msgid "flash location must be below 1MByte" -msgstr "Locazione della flash deve essere inferiore a 1mb" - -#: ports/esp8266/modmachine.c:63 -msgid "frequency can only be either 80Mhz or 160MHz" -msgstr "la frequenza può essere o 80Mhz o 160Mhz" - -#: ports/esp8266/modnetwork.c:61 -msgid "AP required" -msgstr "AP richiesto" - -#: ports/esp8266/modnetwork.c:61 -msgid "STA required" -msgstr "STA richiesta" - -#: ports/esp8266/modnetwork.c:87 -msgid "Cannot update i/f status" -msgstr "Impossibile aggiornare status di i/f" - -#: ports/esp8266/modnetwork.c:142 -msgid "Cannot set STA config" -msgstr "Impossibile impostare la configurazione della STA" - -#: ports/esp8266/modnetwork.c:144 -msgid "Cannot connect to AP" -msgstr "Impossible connettersi all'AP" - -#: ports/esp8266/modnetwork.c:152 -msgid "Cannot disconnect from AP" -msgstr "Impossible disconnettersi all'AP" -#: ports/esp8266/modnetwork.c:173 -msgid "unknown status param" -msgstr "prametro di stato sconosciuto" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to acquire mutex" +msgstr "Impossibile allocare buffer RX" -#: ports/esp8266/modnetwork.c:222 -msgid "STA must be active" -msgstr "STA deve essere attiva" +#: ports/nrf/common-hal/bleio/Characteristic.c ports/nrf/sd_mutex.c +#, fuzzy, c-format +msgid "Failed to acquire mutex, err 0x%04x" +msgstr "Impossibile leggere valore dell'attributo. status: 0x%02x" -#: ports/esp8266/modnetwork.c:239 -msgid "scan failed" -msgstr "scansione fallita" +#: ports/nrf/common-hal/bleio/Service.c +#, fuzzy, c-format +msgid "Failed to add characteristic, err 0x%04x" +msgstr "Impossibile fermare advertisement. status: 0x%02x" -#: ports/esp8266/modnetwork.c:306 -msgid "wifi_set_ip_info() failed" -msgstr "wifi_set_ip_info() faillito" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to add service" +msgstr "Impossibile fermare advertisement. status: 0x%02x" -#: ports/esp8266/modnetwork.c:319 -msgid "either pos or kw args are allowed" -msgstr "sono permesse solo gli argomenti pos o kw" +#: ports/nrf/common-hal/bleio/Peripheral.c +#, fuzzy, c-format +msgid "Failed to add service, err 0x%04x" +msgstr "Impossibile fermare advertisement. status: 0x%02x" -#: ports/esp8266/modnetwork.c:329 -msgid "can't get STA config" -msgstr "impossibile recuperare la configurazione della STA" +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "Failed to allocate RX buffer" +msgstr "Impossibile allocare buffer RX" -#: ports/esp8266/modnetwork.c:331 -msgid "can't get AP config" -msgstr "impossibile recuperare le configurazioni dell'AP" +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +#: ports/nrf/common-hal/pulseio/PulseIn.c +#: ports/esp8266/common-hal/pulseio/PulseIn.c +#, c-format +msgid "Failed to allocate RX buffer of %d bytes" +msgstr "Fallita allocazione del buffer RX di %d byte" -#: ports/esp8266/modnetwork.c:346 -msgid "invalid buffer length" -msgstr "lunghezza del buffer non valida" +#: ports/nrf/common-hal/bleio/Adapter.c +#, fuzzy +msgid "Failed to change softdevice state" +msgstr "Impossibile fermare advertisement. status: 0x%02x" -#: ports/esp8266/modnetwork.c:405 -msgid "can't set STA config" -msgstr "impossibile impostare le configurazioni della STA" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to connect:" +msgstr "Impossibile connettersi. status: 0x%02x" -#: ports/esp8266/modnetwork.c:407 -msgid "can't set AP config" -msgstr "impossibile impostare le configurazioni dell'AP" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to continue scanning" +msgstr "Impossible iniziare la scansione. status: 0x%02x" -#: ports/esp8266/modnetwork.c:416 -msgid "can query only one param" -msgstr "è possibile interrogare solo un parametro" +#: ports/nrf/common-hal/bleio/Scanner.c +#, fuzzy, c-format +msgid "Failed to continue scanning, err 0x%04x" +msgstr "Impossible iniziare la scansione. status: 0x%02x" -#: ports/esp8266/modnetwork.c:469 -msgid "unknown config param" -msgstr "parametro di configurazione sconosciuto" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to create mutex" +msgstr "Impossibile leggere valore dell'attributo. status: 0x%02x" -#: ports/nrf/common-hal/analogio/AnalogOut.c:37 -msgid "AnalogOut functionality not supported" -msgstr "funzionalità AnalogOut non supportata" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to discover services" +msgstr "Impossibile fermare advertisement. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Adapter.c:41 -#, c-format -msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX" +#: ports/nrf/common-hal/bleio/Adapter.c +msgid "Failed to get local address" msgstr "" -#: ports/nrf/common-hal/bleio/Adapter.c:125 -#, c-format -msgid "Failed to change softdevice state, error: 0x%08lX" -msgstr "" +#: ports/nrf/common-hal/bleio/Adapter.c +#, fuzzy +msgid "Failed to get softdevice state" +msgstr "Impossibile fermare advertisement. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Adapter.c:135 +#: ports/nrf/common-hal/bleio/Characteristic.c #, c-format -msgid "Failed to get softdevice state, error: 0x%08lX" +msgid "Failed to notify or indicate attribute value, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Adapter.c:155 +#: ports/nrf/common-hal/bleio/Characteristic.c +#, fuzzy, c-format +msgid "Failed to read CCCD value, err 0x%04x" +msgstr "Impossibile leggere valore dell'attributo. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Characteristic.c #, c-format -msgid "Failed to get local address, error: 0x%08lX" +msgid "Failed to read attribute value, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:52 +#: ports/nrf/common-hal/bleio/Characteristic.c #, fuzzy, c-format -msgid "Failed to write gatts value, status: 0x%08lX" +msgid "Failed to read gatts value, err 0x%04x" msgstr "Impossibile scrivere valore dell'attributo. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Characteristic.c:76 +#: ports/nrf/common-hal/bleio/UUID.c #, fuzzy, c-format -msgid "Failed to notify attribute value, status: 0x%08lX" -msgstr "Impossibile notificare valore dell'attributo. status: 0x%02x" +msgid "Failed to register Vendor-Specific UUID, err 0x%04x" +msgstr "Non è possibile aggiungere l'UUID del vendor specifico da 128-bit" + +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to release mutex" +msgstr "Impossibile leggere valore dell'attributo. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Characteristic.c:91 +#: ports/nrf/common-hal/bleio/Characteristic.c ports/nrf/sd_mutex.c #, fuzzy, c-format -msgid "Failed to read attribute value, status: 0x%08lX" +msgid "Failed to release mutex, err 0x%04x" msgstr "Impossibile leggere valore dell'attributo. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Characteristic.c:119 -#: ports/nrf/common-hal/bleio/Device.c:272 -#: ports/nrf/common-hal/bleio/Device.c:307 -#, c-format -msgid "Failed to acquire mutex, status: 0x%08lX" -msgstr "" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to start advertising" +msgstr "Impossibile avviare advertisement. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Characteristic.c:126 +#: ports/nrf/common-hal/bleio/Broadcaster.c +#: ports/nrf/common-hal/bleio/Peripheral.c #, fuzzy, c-format -msgid "Failed to write attribute value, status: 0x%08lX" -msgstr "Impossibile scrivere valore dell'attributo. status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Characteristic.c:138 -#: ports/nrf/common-hal/bleio/Device.c:284 -#: ports/nrf/common-hal/bleio/Device.c:319 -#: ports/nrf/common-hal/bleio/Device.c:354 -#: ports/nrf/common-hal/bleio/Device.c:391 -#, c-format -msgid "Failed to release mutex, status: 0x%08lX" -msgstr "" +msgid "Failed to start advertising, err 0x%04x" +msgstr "Impossibile avviare advertisement. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Device.c:81 -#: ports/nrf/common-hal/bleio/Device.c:114 +#: ports/nrf/common-hal/bleio/Device.c #, fuzzy -msgid "Can not fit data into the advertisment packet" -msgstr "Impossibile inserire dati nel pacchetto di advertisement." - -#: ports/nrf/common-hal/bleio/Device.c:266 -#, c-format -msgid "Failed to discover serivices, status: 0x%08lX" -msgstr "" +msgid "Failed to start scanning" +msgstr "Impossible iniziare la scansione. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Device.c:403 -#: ports/nrf/common-hal/bleio/Scanner.c:76 +#: ports/nrf/common-hal/bleio/Scanner.c #, fuzzy, c-format -msgid "Failed to continue scanning, status: 0x%0xlX" +msgid "Failed to start scanning, err 0x%04x" msgstr "Impossible iniziare la scansione. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Device.c:436 -#, fuzzy, c-format -msgid "Failed to connect, status: 0x%08lX" -msgstr "Impossibile connettersi. status: 0x%02x" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to stop advertising" +msgstr "Impossibile fermare advertisement. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Device.c:513 +#: ports/nrf/common-hal/bleio/Broadcaster.c +#: ports/nrf/common-hal/bleio/Peripheral.c #, fuzzy, c-format -msgid "Failed to add service, status: 0x%08lX" +msgid "Failed to stop advertising, err 0x%04x" msgstr "Impossibile fermare advertisement. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Device.c:531 +#: ports/nrf/common-hal/bleio/Characteristic.c #, fuzzy, c-format -msgid "Failed to start advertisment, status: 0x%08lX" -msgstr "Impossibile avviare advertisement. status: 0x%02x" +msgid "Failed to write attribute value, err 0x%04x" +msgstr "Impossibile scrivere valore dell'attributo. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Device.c:549 +#: ports/nrf/common-hal/bleio/Characteristic.c #, fuzzy, c-format -msgid "Failed to stop advertisment, status: 0x%08lX" -msgstr "Impossibile fermare advertisement. status: 0x%02x" +msgid "Failed to write gatts value, err 0x%04x" +msgstr "Impossibile scrivere valore dell'attributo. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Device.c:575 -#: ports/nrf/common-hal/bleio/Scanner.c:103 -#, fuzzy, c-format -msgid "Failed to start scanning, status: 0x%0xlX" -msgstr "Impossible iniziare la scansione. status: 0x%02x" +#: py/moduerrno.c +msgid "File exists" +msgstr "File esistente" -#: ports/nrf/common-hal/bleio/Device.c:592 -#, fuzzy, c-format -msgid "Failed to create mutex, status: 0x%0xlX" -msgstr "Impossibile leggere valore dell'attributo. status: 0x%02x" +#: ports/nrf/supervisor/internal_flash.c +msgid "Flash erase failed" +msgstr "" -#: ports/nrf/common-hal/bleio/Service.c:83 +#: ports/nrf/supervisor/internal_flash.c #, c-format -msgid "Failed to add characteristic, status: 0x%08lX" +msgid "Flash erase failed to start, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/UUID.c:97 -#, fuzzy, c-format -msgid "Failed to add Vendor Specific UUID, status: 0x%08lX" -msgstr "Non è possibile aggiungere l'UUID del vendor specifico da 128-bit" +#: ports/nrf/supervisor/internal_flash.c +msgid "Flash write failed" +msgstr "" -#: ports/nrf/common-hal/bleio/UUID.c:102 -msgid "Invalid UUID string length" -msgstr "Lunghezza della stringa UUID non valida" +#: ports/nrf/supervisor/internal_flash.c +#, c-format +msgid "Flash write failed to start, err 0x%04x" +msgstr "" -#: ports/nrf/common-hal/bleio/UUID.c:109 -#: shared-bindings/bleio/Characteristic.c:125 -#: shared-bindings/bleio/Service.c:105 -msgid "Invalid UUID parameter" -msgstr "Parametro UUID non valido" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +msgid "Frequency captured is above capability. Capture Paused." +msgstr "" -#: ports/nrf/common-hal/busio/I2C.c:96 -msgid "All I2C peripherals are in use" -msgstr "Tutte le periferiche I2C sono in uso" +#: shared-bindings/bitbangio/SPI.c shared-bindings/bitbangio/I2C.c +#: shared-bindings/busio/SPI.c shared-bindings/busio/I2C.c +msgid "Function requires lock" +msgstr "" -#: ports/nrf/common-hal/busio/SPI.c:133 -msgid "All SPI peripherals are in use" -msgstr "Tutte le periferiche SPI sono in uso" +#: ports/esp8266/common-hal/digitalio/DigitalInOut.c +msgid "GPIO16 does not support pull up." +msgstr "GPIO16 non supporta pull-up" -#: ports/nrf/common-hal/busio/UART.c:49 -#, c-format -msgid "error = 0x%08lX" +#: shared-module/displayio/Group.c +msgid "Group full" +msgstr "Gruppo pieno" + +#: ports/unix/file.c extmod/vfs_posix_file.c py/objstringio.c +msgid "I/O operation on closed file" +msgstr "operazione I/O su file chiuso" + +#: extmod/machine_i2c.c +msgid "I2C operation not supported" +msgstr "operazione I2C non supportata" + +#: py/persistentcode.c +msgid "" +"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/" +"mpy-update for more info." +msgstr "" +"File .mpy incompatibile. Aggiorna tutti i file .mpy. Vedi http://adafru.it/" +"mpy-update per più informazioni." + +#: shared-bindings/_pew/PewPew.c +msgid "Incorrect buffer size" msgstr "" -#: ports/nrf/common-hal/busio/UART.c:110 +#: py/moduerrno.c +msgid "Input/output error" +msgstr "Errore input/output" + +#: shared-module/displayio/OnDiskBitmap.c +msgid "Invalid BMP file" +msgstr "File BMP non valido" + +#: ports/atmel-samd/common-hal/pulseio/PWMOut.c +#: ports/nrf/common-hal/pulseio/PWMOut.c shared-bindings/pulseio/PWMOut.c +msgid "Invalid PWM frequency" +msgstr "Frequenza PWM non valida" + +#: py/moduerrno.c +msgid "Invalid argument" +msgstr "Argomento non valido" + +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Invalid bit clock pin" +msgstr "Pin del clock di bit non valido" + +#: ports/nrf/common-hal/busio/UART.c #, fuzzy msgid "Invalid buffer size" msgstr "lunghezza del buffer non valida" -#: ports/nrf/common-hal/busio/UART.c:114 -#, fuzzy -msgid "Odd parity is not supported" -msgstr "operazione I2C non supportata" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +msgid "Invalid capture period. Valid range: 1 - 500" +msgstr "" -#: ports/nrf/common-hal/busio/UART.c:346 ports/nrf/common-hal/busio/UART.c:350 -#: ports/nrf/common-hal/busio/UART.c:355 ports/nrf/common-hal/busio/UART.c:360 -#: ports/nrf/common-hal/busio/UART.c:366 ports/nrf/common-hal/busio/UART.c:371 -#: ports/nrf/common-hal/busio/UART.c:376 ports/nrf/common-hal/busio/UART.c:380 -#: ports/nrf/common-hal/busio/UART.c:388 +#: shared-bindings/audioio/Mixer.c #, fuzzy -msgid "busio.UART not available" -msgstr "busio.UART non ancora implementato" +msgid "Invalid channel count" +msgstr "Argomento non valido" -#: ports/nrf/common-hal/microcontroller/Processor.c:49 -#, c-format -msgid "Can not get temperature. status: 0x%02x" -msgstr "Impossibile leggere la temperatura. status: 0x%02x" +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Invalid clock pin" +msgstr "Pin di clock non valido" -#: ports/nrf/common-hal/pulseio/PWMOut.c:161 -#, fuzzy -msgid "All PWM peripherals are in use" -msgstr "Tutte le periferiche SPI sono in uso" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Invalid data pin" +msgstr "Pin dati non valido" -#: ports/unix/modffi.c:138 -msgid "Unknown type" -msgstr "Tipo sconosciuto" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Invalid direction." +msgstr "Direzione non valida." -#: ports/unix/modffi.c:207 ports/unix/modffi.c:265 -msgid "Error in ffi_prep_cif" -msgstr "Errore in ffi_prep_cif" +#: shared-module/audioio/WaveFile.c +msgid "Invalid file" +msgstr "File non valido" -#: ports/unix/modffi.c:270 -msgid "ffi_prep_closure_loc" -msgstr "ffi_prep_closure_loc" +#: shared-module/audioio/WaveFile.c +msgid "Invalid format chunk size" +msgstr "" -#: ports/unix/modffi.c:413 -msgid "Don't know how to pass object to native function" -msgstr "Non so come passare l'oggetto alla funzione nativa" +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "Invalid number of bits" +msgstr "Numero di bit non valido" -#: ports/unix/modusocket.c:474 -#, c-format -msgid "[addrinfo error %d]" -msgstr "[errore addrinfo %d]" +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "Invalid phase" +msgstr "Fase non valida" -#: py/argcheck.c:44 -msgid "function does not take keyword arguments" -msgstr "la funzione non prende argomenti nominati" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: ports/atmel-samd/common-hal/touchio/TouchIn.c +#: shared-bindings/pulseio/PWMOut.c +msgid "Invalid pin" +msgstr "Pin non valido" -#: py/argcheck.c:54 py/bc.c:85 py/objnamedtuple.c:104 -#, c-format -msgid "function takes %d positional arguments but %d were given" -msgstr "" -"la funzione prende %d argomenti posizionali ma ne sono stati forniti %d" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Invalid pin for left channel" +msgstr "Pin non valido per il canale sinistro" -#: py/argcheck.c:64 -#, c-format -msgid "function missing %d required positional arguments" -msgstr "mancano %d argomenti posizionali obbligatori alla funzione" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Invalid pin for right channel" +msgstr "Pin non valido per il canale destro" -#: py/argcheck.c:72 -#, c-format -msgid "function expected at most %d arguments, got %d" -msgstr "la funzione prevede al massimo %d argmoneti, ma ne ha ricevuti %d" +#: ports/atmel-samd/common-hal/i2cslave/I2CSlave.c +#: ports/atmel-samd/common-hal/busio/UART.c +#: ports/atmel-samd/common-hal/busio/SPI.c +#: ports/atmel-samd/common-hal/busio/I2C.c ports/nrf/common-hal/busio/I2C.c +msgid "Invalid pins" +msgstr "Pin non validi" -#: py/argcheck.c:97 -msgid "'%q' argument required" -msgstr "'%q' argomento richiesto" +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "Invalid polarity" +msgstr "Polarità non valida" -#: py/argcheck.c:122 -msgid "extra positional arguments given" -msgstr "argomenti posizonali extra dati" +#: shared-bindings/microcontroller/__init__.c +msgid "Invalid run mode." +msgstr "Modalità di esecuzione non valida." -#: py/argcheck.c:130 -msgid "extra keyword arguments given" -msgstr "argomento nominato aggiuntivo fornito" +#: shared-bindings/audioio/Mixer.c +#, fuzzy +msgid "Invalid voice count" +msgstr "Tipo di servizio non valido" -#: py/argcheck.c:142 -msgid "argument num/types mismatch" -msgstr "discrepanza di numero/tipo di argomenti" +#: shared-module/audioio/WaveFile.c +msgid "Invalid wave file" +msgstr "File wave non valido" -#: py/argcheck.c:147 -msgid "keyword argument(s) not yet implemented - use normal args instead" +#: py/compile.c +msgid "LHS of keyword arg must be an id" msgstr "" -"argomento(i) nominati non ancora implementati - usare invece argomenti " -"normali" -#: py/bc.c:88 py/objnamedtuple.c:108 -msgid "%q() takes %d positional arguments but %d were given" -msgstr "%q() prende %d argomenti posizionali ma ne sono stati forniti %d" +#: shared-module/displayio/Group.c +msgid "Layer must be a Group or TileGrid subclass." +msgstr "" -#: py/bc.c:197 py/bc.c:215 -msgid "unexpected keyword argument" -msgstr "argomento nominato inaspettato" +#: py/objslice.c +msgid "Length must be an int" +msgstr "Length deve essere un intero" -#: py/bc.c:199 -msgid "keywords must be strings" -msgstr "argomenti nominati devono essere stringhe" +#: py/objslice.c +msgid "Length must be non-negative" +msgstr "Length deve essere non negativo" -#: py/bc.c:206 py/objnamedtuple.c:138 -msgid "function got multiple values for argument '%q'" -msgstr "la funzione ha ricevuto valori multipli per l'argomento '%q'" +#: supervisor/shared/safe_mode.c +msgid "" +"Looks like our core CircuitPython code crashed hard. Whoops!\n" +"Please file an issue at https://github.com/adafruit/circuitpython/issues\n" +" with the contents of your CIRCUITPY drive and this message:\n" +msgstr "" -#: py/bc.c:218 py/objnamedtuple.c:130 -msgid "unexpected keyword argument '%q'" -msgstr "argomento nominato '%q' inaspettato" +#: shared-module/bitbangio/SPI.c +msgid "MISO pin init failed." +msgstr "inizializzazione del pin MISO fallita." -#: py/bc.c:244 +#: shared-module/bitbangio/SPI.c +msgid "MOSI pin init failed." +msgstr "inizializzazione del pin MOSI fallita." + +#: ports/esp8266/common-hal/pulseio/PWMOut.c #, c-format -msgid "function missing required positional argument #%d" -msgstr "mancante il #%d argomento posizonale obbligatorio della funzione" +msgid "Maximum PWM frequency is %dhz." +msgstr "Frequenza massima su PWM è %dhz" -#: py/bc.c:260 -msgid "function missing required keyword argument '%q'" -msgstr "argomento nominato '%q' mancante alla funzione" +#: shared-module/displayio/Shape.c +#, c-format +msgid "Maximum x value when mirrored is %d" +msgstr "" -#: py/bc.c:269 -msgid "function missing keyword-only argument" -msgstr "argomento nominato mancante alla funzione" +#: supervisor/shared/safe_mode.c +msgid "MicroPython NLR jump failed. Likely memory corruption.\n" +msgstr "" -#: py/binary.c:112 -msgid "bad typecode" +#: supervisor/shared/safe_mode.c +msgid "MicroPython fatal error.\n" msgstr "" -#: py/builtinevex.c:99 -msgid "bad compile mode" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Microphone startup delay must be in range 0.0 to 1.0" msgstr "" +"Il ritardo di avvio del microfono deve essere nell'intervallo tra 0.0 e 1.0" -#: py/builtinhelp.c:137 -#, fuzzy -msgid "Plus any modules on the filesystem\n" -msgstr "Imposssibile rimontare il filesystem" +#: ports/esp8266/common-hal/pulseio/PWMOut.c +msgid "Minimum PWM frequency is 1hz." +msgstr "Frequenza minima su PWM è 1hz" -#: py/builtinhelp.c:183 +#: ports/esp8266/common-hal/pulseio/PWMOut.c #, c-format -msgid "" -"Welcome to Adafruit CircuitPython %s!\n" -"\n" -"Please visit learn.adafruit.com/category/circuitpython for project guides.\n" -"\n" -"To list built-in modules please do `help(\"modules\")`.\n" -msgstr "" - -#: py/builtinimport.c:336 -msgid "cannot perform relative import" -msgstr "impossibile effettuare l'importazione relativa" +msgid "Multiple PWM frequencies not supported. PWM already set to %dhz." +msgstr "Frequenze PWM multiple non supportate. PWM già impostato a %shz." -#: py/builtinimport.c:420 py/builtinimport.c:532 -msgid "module not found" -msgstr "modulo non trovato" +#: shared-bindings/displayio/Display.c +msgid "Must be a Group subclass." +msgstr "" -#: py/builtinimport.c:423 py/builtinimport.c:535 -msgid "no module named '%q'" -msgstr "nessun modulo chiamato '%q'" +#: ports/atmel-samd/common-hal/analogio/AnalogOut.c +msgid "No DAC on chip" +msgstr "Nessun DAC sul chip" -#: py/builtinimport.c:510 -msgid "relative import" -msgstr "importazione relativa" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "No DMA channel found" +msgstr "Nessun canale DMA trovato" -#: py/compile.c:397 py/compile.c:542 -msgid "can't assign to expression" -msgstr "impossibile assegnare all'espressione" +#: ports/esp8266/common-hal/pulseio/PulseIn.c +msgid "No PulseIn support for %q" +msgstr "Nessun supporto per PulseIn per %q" -#: py/compile.c:416 -msgid "multiple *x in assignment" -msgstr "*x multipli nell'assegnamento" +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "No RX pin" +msgstr "Nessun pin RX" -#: py/compile.c:642 -msgid "non-default argument follows default argument" -msgstr "argomento non predefinito segue argmoento predfinito" +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "No TX pin" +msgstr "Nessun pin TX" -#: py/compile.c:771 py/compile.c:789 -msgid "invalid micropython decorator" -msgstr "decoratore non valido in micropython" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +msgid "No available clocks" +msgstr "" -#: py/compile.c:943 -msgid "can't delete expression" -msgstr "impossibile cancellare l'espessione" +#: supervisor/shared/board_busses.c +msgid "No default I2C bus" +msgstr "Nessun bus I2C predefinito" -#: py/compile.c:955 -msgid "'break' outside loop" -msgstr "'break' al di fuori del ciclo" +#: supervisor/shared/board_busses.c +msgid "No default SPI bus" +msgstr "Nessun bus SPI predefinito" -#: py/compile.c:958 -msgid "'continue' outside loop" -msgstr "'continue' al di fuori del ciclo" +#: supervisor/shared/board_busses.c +msgid "No default UART bus" +msgstr "Nessun bus UART predefinito" -#: py/compile.c:969 -msgid "'return' outside function" -msgstr "'return' al di fuori della funzione" +#: ports/atmel-samd/common-hal/touchio/TouchIn.c +msgid "No free GCLKs" +msgstr "Nessun GCLK libero" -#: py/compile.c:1169 -msgid "identifier redefined as global" -msgstr "identificatore ridefinito come globale" +#: shared-bindings/os/__init__.c +msgid "No hardware random available" +msgstr "Nessun generatore hardware di numeri casuali disponibile" -#: py/compile.c:1185 -msgid "no binding for nonlocal found" -msgstr "nessun binding per nonlocal trovato" +#: ports/esp8266/common-hal/analogio/AnalogOut.c +msgid "No hardware support for analog out." +msgstr "Nessun supporto hardware per l'uscita analogica." -#: py/compile.c:1188 -msgid "identifier redefined as nonlocal" -msgstr "identificatore ridefinito come nonlocal" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +msgid "No hardware support on pin" +msgstr "Nessun supporto hardware sul pin" -#: py/compile.c:1197 -msgid "can't declare nonlocal in outer code" -msgstr "impossibile dichiarare nonlocal nel codice esterno" +#: py/moduerrno.c +msgid "No space left on device" +msgstr "" -#: py/compile.c:1542 -msgid "default 'except' must be last" -msgstr "'except' predefinito deve essere ultimo" +#: py/moduerrno.c +msgid "No such file/directory" +msgstr "Nessun file/directory esistente" -#: py/compile.c:2095 -msgid "*x must be assignment target" -msgstr "" +#: shared-bindings/bleio/CharacteristicBuffer.c +#, fuzzy +msgid "Not connected" +msgstr "Impossible connettersi all'AP" -#: py/compile.c:2193 -msgid "super() can't find self" +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "Not connected." msgstr "" -#: py/compile.c:2256 -msgid "can't have multiple *x" -msgstr "impossibile usare *x multipli" - -#: py/compile.c:2263 -msgid "can't have multiple **x" -msgstr "impossibile usare **x multipli" +#: shared-bindings/audiobusio/I2SOut.c shared-bindings/audioio/AudioOut.c +msgid "Not playing" +msgstr "In pausa" -#: py/compile.c:2271 -msgid "LHS of keyword arg must be an id" +#: shared-bindings/util.c +msgid "" +"Object has been deinitialized and can no longer be used. Create a new object." msgstr "" +"L'oggetto è stato deinizializzato e non può essere più usato. Crea un nuovo " +"oggetto." -#: py/compile.c:2287 -msgid "non-keyword arg after */**" -msgstr "argomento non nominato dopo */**" +#: ports/nrf/common-hal/busio/UART.c +#, fuzzy +msgid "Odd parity is not supported" +msgstr "operazione I2C non supportata" -#: py/compile.c:2291 -msgid "non-keyword arg after keyword arg" -msgstr "argomento non nominato seguito da argomento nominato" +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Only 8 or 16 bit mono with " +msgstr "" -#: py/compile.c:2463 py/compile.c:2473 py/compile.c:2712 py/compile.c:2742 -#: py/parse.c:1176 -msgid "invalid syntax" -msgstr "sintassi non valida" +#: shared-module/displayio/OnDiskBitmap.c +#, c-format +msgid "" +"Only Windows format, uncompressed BMP supported: given header size is %d" +msgstr "" -#: py/compile.c:2465 -msgid "expecting key:value for dict" -msgstr "chiave:valore atteso per dict" +#: shared-module/displayio/Bitmap.c +msgid "Only bit maps of 8 bit color or less are supported" +msgstr "Sono supportate solo bitmap con colori a 8 bit o meno" -#: py/compile.c:2475 -msgid "expecting just a value for set" -msgstr "un solo valore atteso per set" +#: shared-module/displayio/OnDiskBitmap.c +#, c-format +msgid "" +"Only monochrome, indexed 8bpp, and 16bpp or greater BMPs supported: %d bpp " +"given" +msgstr "" -#: py/compile.c:2600 -msgid "'yield' outside function" -msgstr "'yield' al di fuori della funzione" +#: shared-bindings/_pixelbuf/PixelBuf.c +#, fuzzy +msgid "Only slices with step=1 (aka None) are supported" +msgstr "solo slice con step=1 (aka None) sono supportate" -#: py/compile.c:2619 -msgid "'await' outside function" -msgstr "'await' al di fuori della funzione" +#: ports/esp8266/common-hal/busio/UART.c +msgid "Only tx supported on UART1 (GPIO2)." +msgstr "Solo tx supportato su UART1 (GPIO2)." -#: py/compile.c:2774 -msgid "name reused for argument" -msgstr "nome riutilizzato come argomento" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Oversample must be multiple of 8." +msgstr "L'oversampling deve essere multiplo di 8." -#: py/compile.c:2827 -msgid "parameter annotation must be an identifier" +#: shared-bindings/pulseio/PWMOut.c +msgid "" +"PWM duty_cycle must be between 0 and 65535 inclusive (16 bit resolution)" msgstr "" +"duty_cycle del PWM deve essere compresa tra 0 e 65535 inclusiva (risoluzione " +"a 16 bit)" -#: py/compile.c:2969 py/compile.c:3137 -msgid "return annotation must be an identifier" +#: shared-bindings/pulseio/PWMOut.c +#, fuzzy +msgid "" +"PWM frequency not writable when variable_frequency is False on construction." msgstr "" +"frequenza PWM frequency non è scrivibile quando variable_frequency è " +"impostato nel costruttore a False." -#: py/compile.c:3097 -msgid "inline assembler must be a function" -msgstr "inline assembler deve essere una funzione" - -#: py/compile.c:3134 -msgid "unknown type" -msgstr "tipo sconosciuto" +#: ports/esp8266/common-hal/pulseio/PWMOut.c ports/esp8266/machine_pwm.c +#, c-format +msgid "PWM not supported on pin %d" +msgstr "PWM non è supportato sul pin %d" -#: py/compile.c:3154 -msgid "expecting an assembler instruction" -msgstr "istruzione assembler attesa" +#: py/moduerrno.c +msgid "Permission denied" +msgstr "Permesso negato" -#: py/compile.c:3184 -msgid "'label' requires 1 argument" -msgstr "'label' richiede 1 argomento" +#: ports/esp8266/common-hal/analogio/AnalogIn.c +msgid "Pin %q does not have ADC capabilities" +msgstr "Il pin %q non ha capacità ADC" -#: py/compile.c:3190 -msgid "label redefined" -msgstr "etichetta ridefinita" +#: ports/atmel-samd/common-hal/analogio/AnalogIn.c +#: ports/nrf/common-hal/analogio/AnalogIn.c +msgid "Pin does not have ADC capabilities" +msgstr "Il pin non ha capacità di ADC" -#: py/compile.c:3196 -msgid "'align' requires 1 argument" -msgstr "'align' richiede 1 argomento" +#: ports/esp8266/machine_pin.c +msgid "Pin(16) doesn't support pull" +msgstr "Pin(16) non supporta pull" -#: py/compile.c:3205 -msgid "'data' requires at least 2 arguments" -msgstr "'data' richiede almeno 2 argomento" +#: ports/esp8266/common-hal/busio/SPI.c +msgid "Pins not valid for SPI" +msgstr "Pin non validi per SPI" -#: py/compile.c:3212 -msgid "'data' requires integer arguments" -msgstr "'data' richiede argomenti interi" +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "Pixel beyond bounds of buffer" +msgstr "" -#: py/emitinlinethumb.c:102 +#: py/builtinhelp.c #, fuzzy -msgid "can only have up to 4 parameters to Thumb assembly" -msgstr "sono disponibili fino a 4 parametri per il Xtensa assembly" +msgid "Plus any modules on the filesystem\n" +msgstr "Imposssibile rimontare il filesystem" -#: py/emitinlinethumb.c:107 py/emitinlinethumb.c:112 -#, fuzzy -msgid "parameters must be registers in sequence r0 to r3" -msgstr "parametri devono essere i registri in sequenza da a2 a a5" +#: main.c +msgid "Press any key to enter the REPL. Use CTRL-D to reload." +msgstr "" +"Premi un qualunque tasto per entrare nel REPL. Usa CTRL-D per ricaricare." -#: py/emitinlinethumb.c:188 py/emitinlinethumb.c:230 -#, fuzzy, c-format -msgid "'%s' expects at most r%d" -msgstr "'%s' aspetta un registro" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Pull not used when direction is output." +msgstr "" -#: py/emitinlinethumb.c:197 py/emitinlinextensa.c:162 -#, c-format -msgid "'%s' expects a register" -msgstr "'%s' aspetta un registro" +#: shared-bindings/rtc/RTC.c +msgid "RTC calibration is not supported on this board" +msgstr "calibrazione RTC non supportata su questa scheda" -#: py/emitinlinethumb.c:211 -#, fuzzy, c-format -msgid "'%s' expects a special register" -msgstr "'%s' aspetta un registro" +#: shared-bindings/rtc/RTC.c shared-bindings/time/__init__.c +msgid "RTC is not supported on this board" +msgstr "RTC non supportato su questa scheda" -#: py/emitinlinethumb.c:239 -#, fuzzy, c-format -msgid "'%s' expects an FPU register" -msgstr "'%s' aspetta un registro" +#: shared-bindings/_pixelbuf/PixelBuf.c +#, fuzzy +msgid "Range out of bounds" +msgstr "indirizzo fuori limite" -#: py/emitinlinethumb.c:292 -#, fuzzy, c-format -msgid "'%s' expects {r0, r1, ...}" -msgstr "'%s' aspetta un registro" +#: shared-bindings/pulseio/PulseIn.c +msgid "Read-only" +msgstr "Sola lettura" -#: py/emitinlinethumb.c:299 py/emitinlinextensa.c:169 -#, c-format -msgid "'%s' expects an integer" -msgstr "'%s' aspetta un intero" +#: extmod/vfs_fat.c py/moduerrno.c +msgid "Read-only filesystem" +msgstr "Filesystem in sola lettura" -#: py/emitinlinethumb.c:304 -#, fuzzy, c-format -msgid "'%s' integer 0x%x does not fit in mask 0x%x" -msgstr "intero '%s' non è nell'intervallo %d..%d" +#: shared-module/displayio/Bitmap.c +#, fuzzy +msgid "Read-only object" +msgstr "Sola lettura" -#: py/emitinlinethumb.c:328 -#, fuzzy, c-format -msgid "'%s' expects an address of the form [a, b]" -msgstr "'%s' aspetta un registro" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Right channel unsupported" +msgstr "Canale destro non supportato" -#: py/emitinlinethumb.c:334 py/emitinlinextensa.c:182 -#, c-format -msgid "'%s' expects a label" -msgstr "'%s' aspetta una etichetta" +#: shared-bindings/_pew/PewPew.c +msgid "Row entry must be digitalio.DigitalInOut" +msgstr "" -#: py/emitinlinethumb.c:345 py/emitinlinextensa.c:193 -msgid "label '%q' not defined" -msgstr "etichetta '%q' non definita" +#: main.c +msgid "Running in safe mode! Auto-reload is off.\n" +msgstr "Modalità sicura in esecuzione! Auto-reload disattivato.\n" -#: py/emitinlinethumb.c:806 -#, fuzzy, c-format -msgid "unsupported Thumb instruction '%s' with %d arguments" -msgstr "istruzione '%s' Xtensa non supportata con %d argomenti" +#: main.c +msgid "Running in safe mode! Not running saved code.\n" +msgstr "Modalità sicura in esecuzione! Codice salvato non in esecuzione.\n" -#: py/emitinlinethumb.c:810 -#, fuzzy -msgid "branch not in range" -msgstr "argomento di chr() non è in range(256)" +#: ports/atmel-samd/common-hal/busio/I2C.c +msgid "SDA or SCL needs a pull up" +msgstr "SDA o SCL necessitano un pull-up" -#: py/emitinlinextensa.c:86 -msgid "can only have up to 4 parameters to Xtensa assembly" -msgstr "sono disponibili fino a 4 parametri per il Xtensa assembly" +#: ports/esp8266/modnetwork.c +msgid "STA must be active" +msgstr "STA deve essere attiva" -#: py/emitinlinextensa.c:91 py/emitinlinextensa.c:96 -msgid "parameters must be registers in sequence a2 to a5" -msgstr "parametri devono essere i registri in sequenza da a2 a a5" +#: ports/esp8266/modnetwork.c +msgid "STA required" +msgstr "STA richiesta" -#: py/emitinlinextensa.c:174 -#, c-format -msgid "'%s' integer %d is not within range %d..%d" -msgstr "intero '%s' non è nell'intervallo %d..%d" +#: shared-bindings/audioio/Mixer.c +#, fuzzy +msgid "Sample rate must be positive" +msgstr "STA deve essere attiva" -#: py/emitinlinextensa.c:327 +#: ports/atmel-samd/common-hal/audioio/AudioOut.c #, c-format -msgid "unsupported Xtensa instruction '%s' with %d arguments" -msgstr "istruzione '%s' Xtensa non supportata con %d argomenti" +msgid "Sample rate too high. It must be less than %d" +msgstr "" +"Frequenza di campionamento troppo alta. Il valore deve essere inferiore a %d" -#: py/emitnative.c:183 -msgid "unknown type '%q'" -msgstr "tipo '%q' sconosciuto" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Serializer in use" +msgstr "Serializer in uso" -#: py/emitnative.c:260 -msgid "Viper functions don't currently support more than 4 arguments" -msgstr "Le funzioni Viper non supportano più di 4 argomenti al momento" +#: shared-bindings/nvm/ByteArray.c +msgid "Slice and value different lengths." +msgstr "" -#: py/emitnative.c:742 -msgid "conversion to object" -msgstr "conversione in oggetto" +#: shared-bindings/displayio/Bitmap.c shared-bindings/displayio/TileGrid.c +#: shared-bindings/displayio/Group.c shared-bindings/pulseio/PulseIn.c +msgid "Slices not supported" +msgstr "Slice non supportate" -#: py/emitnative.c:921 -msgid "local '%q' used before type known" -msgstr "locla '%q' utilizzato prima che il tipo fosse noto" +#: ports/nrf/common-hal/bleio/Adapter.c +#, c-format +msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX" +msgstr "" -#: py/emitnative.c:1118 py/emitnative.c:1156 -msgid "can't load from '%q'" -msgstr "impossibile caricare da '%q'" +#: extmod/modure.c +msgid "Splitting with sub-captures" +msgstr "Suddivisione con sotto-catture" -#: py/emitnative.c:1128 -msgid "can't load with '%q' index" -msgstr "impossibile caricare con indice '%q'" +#: shared-bindings/supervisor/__init__.c +msgid "Stack size must be at least 256" +msgstr "La dimensione dello stack deve essere almeno 256" -#: py/emitnative.c:1188 -msgid "local '%q' has type '%q' but source is '%q'" -msgstr "local '%q' ha tipo '%q' ma sorgente è '%q'" +#: shared-bindings/multiterminal/__init__.c +msgid "Stream missing readinto() or write() method." +msgstr "Metodi mancanti readinto() o write() allo stream." -#: py/emitnative.c:1289 py/emitnative.c:1379 -msgid "can't store '%q'" -msgstr "impossibile memorizzare '%q'" +#: supervisor/shared/safe_mode.c +msgid "" +"The CircuitPython heap was corrupted because the stack was too small.\n" +"Please increase stack size limits and press reset (after ejecting " +"CIRCUITPY).\n" +"If you didn't change the stack, then file an issue here with the contents of " +"your CIRCUITPY drive:\n" +msgstr "" -#: py/emitnative.c:1358 py/emitnative.c:1419 -msgid "can't store to '%q'" -msgstr "impossibile memorizzare in '%q'" +#: supervisor/shared/safe_mode.c +#, fuzzy +msgid "" +"The microcontroller's power dipped. Please make sure your power supply " +"provides\n" +"enough power for the whole circuit and press reset (after ejecting " +"CIRCUITPY).\n" +msgstr "" +"La potenza del microcontrollore è calata. Assicurati che l'alimentazione sia " +"attaccata correttamente\n" -#: py/emitnative.c:1369 -msgid "can't store with '%q' index" -msgstr "impossibile memorizzare con indice '%q'" +#: supervisor/shared/safe_mode.c +msgid "" +"The reset button was pressed while booting CircuitPython. Press again to " +"exit safe mode.\n" +msgstr "" -#: py/emitnative.c:1540 -msgid "can't implicitly convert '%q' to 'bool'" -msgstr "non è possibile convertire implicitamente '%q' in 'bool'" +#: shared-module/audioio/Mixer.c +msgid "The sample's bits_per_sample does not match the mixer's" +msgstr "" -#: py/emitnative.c:1774 -msgid "unary op %q not implemented" -msgstr "operazione unaria %q non implementata" +#: shared-module/audioio/Mixer.c +msgid "The sample's channel count does not match the mixer's" +msgstr "" -#: py/emitnative.c:1930 -msgid "binary op %q not implemented" -msgstr "operazione binaria %q non implementata" +#: shared-module/audioio/Mixer.c +msgid "The sample's sample rate does not match the mixer's" +msgstr "" -#: py/emitnative.c:1951 -msgid "can't do binary op between '%q' and '%q'" -msgstr "impossibile eseguire operazione binaria tra '%q' e '%q'" +#: shared-module/audioio/Mixer.c +msgid "The sample's signedness does not match the mixer's" +msgstr "" -#: py/emitnative.c:2126 -msgid "casting" -msgstr "casting" +#: shared-bindings/displayio/TileGrid.c +msgid "Tile height must exactly divide bitmap height" +msgstr "" -#: py/emitnative.c:2173 -msgid "return expected '%q' but got '%q'" -msgstr "return aspettava '%q' ma ha ottenuto '%q'" +#: shared-bindings/displayio/TileGrid.c +msgid "Tile indices must be 0 - 255" +msgstr "" -#: py/emitnative.c:2191 -msgid "must raise an object" -msgstr "deve lanciare un oggetto" +#: shared-bindings/displayio/TileGrid.c +msgid "Tile width must exactly divide bitmap width" +msgstr "" -#: py/emitnative.c:2201 -msgid "native yield" -msgstr "yield nativo" +#: supervisor/shared/safe_mode.c +msgid "To exit, please reset the board without " +msgstr "Per uscire resettare la scheda senza " -#: py/lexer.c:345 -msgid "unicode name escapes" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Too many channels in sample." msgstr "" -#: py/modbuiltins.c:162 -msgid "chr() arg not in range(0x110000)" -msgstr "argomento di chr() non è in range(0x110000)" +#: shared-bindings/displayio/FourWire.c shared-bindings/displayio/ParallelBus.c +msgid "Too many display busses" +msgstr "" -#: py/modbuiltins.c:171 -msgid "chr() arg not in range(256)" -msgstr "argomento di chr() non è in range(256)" +#: shared-bindings/displayio/Display.c +msgid "Too many displays" +msgstr "" -#: py/modbuiltins.c:285 -msgid "arg is an empty sequence" -msgstr "l'argomento è una sequenza vuota" +#: py/obj.c +msgid "Traceback (most recent call last):\n" +msgstr "Traceback (chiamata più recente per ultima):\n" -#: py/modbuiltins.c:350 -msgid "ord expects a character" -msgstr "ord() aspetta un carattere" +#: shared-bindings/time/__init__.c +msgid "Tuple or struct_time argument required" +msgstr "Tupla o struct_time richiesto come argomento" -#: py/modbuiltins.c:353 +#: ports/esp8266/machine_uart.c #, c-format -msgid "ord() expected a character, but string of length %d found" +msgid "UART(%d) does not exist" +msgstr "UART(%d) non esistente" + +#: ports/esp8266/machine_uart.c +msgid "UART(1) can't read" +msgstr "UART(1) non leggibile" + +#: shared-module/usb_hid/Device.c +msgid "USB Busy" +msgstr "USB occupata" + +#: shared-module/usb_hid/Device.c +msgid "USB Error" +msgstr "Errore USB" + +#: shared-bindings/bleio/UUID.c +msgid "UUID integer value not in range 0 to 0xffff" msgstr "" -"ord() aspettava un carattere, ma ha ricevuto una stringa di lunghezza %d" -#: py/modbuiltins.c:363 -msgid "3-arg pow() not supported" -msgstr "pow() con tre argmomenti non supportata" +#: shared-bindings/bleio/UUID.c +msgid "UUID string not 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'" +msgstr "" -#: py/modbuiltins.c:517 -msgid "must use keyword argument for key function" +#: shared-bindings/bleio/UUID.c +msgid "UUID value is not str, int or byte buffer" msgstr "" -#: py/modmath.c:41 shared-bindings/math/__init__.c:53 -msgid "math domain error" -msgstr "errore di dominio matematico" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Unable to allocate buffers for signed conversion" +msgstr "Ipossibilitato ad allocare buffer per la conversione con segno" -#: py/modmath.c:196 py/objfloat.c:270 py/objint_longlong.c:222 -#: py/objint_mpz.c:230 py/runtime.c:619 shared-bindings/math/__init__.c:346 -msgid "division by zero" -msgstr "divisione per zero" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Unable to find free GCLK" +msgstr "Impossibile trovare un GCLK libero" -#: py/modmicropython.c:155 -msgid "schedule stack full" +#: py/parse.c +msgid "Unable to init parser" +msgstr "Inizilizzazione del parser non possibile" + +#: shared-module/displayio/OnDiskBitmap.c +msgid "Unable to read color palette data" msgstr "" -#: py/modstruct.c:145 py/modstruct.c:153 py/modstruct.c:234 py/modstruct.c:244 -#: shared-bindings/struct/__init__.c:103 shared-bindings/struct/__init__.c:145 -#: shared-module/struct/__init__.c:91 shared-module/struct/__init__.c:175 -msgid "buffer too small" -msgstr "buffer troppo piccolo" +#: ports/esp8266/common-hal/storage/__init__.c +msgid "Unable to remount filesystem" +msgstr "Imposssibile rimontare il filesystem" -#: py/modthread.c:240 -msgid "expecting a dict for keyword args" -msgstr "argomenti nominati necessitano un dizionario" +#: shared-bindings/nvm/ByteArray.c +msgid "Unable to write to nvm." +msgstr "Imposibile scrivere su nvm." -#: py/moduerrno.c:147 py/moduerrno.c:150 -msgid "Permission denied" -msgstr "Permesso negato" +#: ports/nrf/common-hal/bleio/UUID.c +#, fuzzy +msgid "Unexpected nrfx uuid type" +msgstr "indentazione inaspettata" -#: py/moduerrno.c:148 -msgid "No such file/directory" -msgstr "Nessun file/directory esistente" +#: ports/unix/modffi.c +msgid "Unknown type" +msgstr "Tipo sconosciuto" -#: py/moduerrno.c:149 -msgid "Input/output error" -msgstr "Errore input/output" +#: shared-bindings/_pixelbuf/PixelBuf.c +#, c-format +msgid "Unmatched number of items on RHS (expected %d, got %d)." +msgstr "" -#: py/moduerrno.c:151 -msgid "File exists" -msgstr "File esistente" +#: ports/atmel-samd/common-hal/busio/I2C.c +msgid "Unsupported baudrate" +msgstr "baudrate non supportato" + +#: shared-module/displayio/Display.c +#, fuzzy +msgid "Unsupported display bus type" +msgstr "tipo di bitmap non supportato" -#: py/moduerrno.c:152 +#: shared-module/audioio/WaveFile.c +msgid "Unsupported format" +msgstr "Formato non supportato" + +#: py/moduerrno.c msgid "Unsupported operation" msgstr "Operazione non supportata" -#: py/moduerrno.c:153 -msgid "Invalid argument" -msgstr "Argomento non valido" - -#: py/obj.c:92 -msgid "Traceback (most recent call last):\n" -msgstr "Traceback (chiamata più recente per ultima):\n" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Unsupported pull value." +msgstr "Valore di pull non supportato." -#: py/obj.c:96 -msgid " File \"%q\", line %d" -msgstr " File \"%q\", riga %d" +#: ports/esp8266/common-hal/storage/__init__.c +msgid "Use esptool to erase flash and re-upload Python instead" +msgstr "Usa esptool per cancellare la flash e ricaricare Python invece" -#: py/obj.c:98 -msgid " File \"%q\"" -msgstr " File \"%q\"" +#: py/emitnative.c +msgid "Viper functions don't currently support more than 4 arguments" +msgstr "Le funzioni Viper non supportano più di 4 argomenti al momento" -#: py/obj.c:102 -msgid ", in %q\n" -msgstr ", in %q\n" +#: shared-module/audioio/Mixer.c +msgid "Voice index too high" +msgstr "" -#: py/obj.c:259 -msgid "can't convert to int" -msgstr "non è possibile convertire a int" +#: main.c +msgid "WARNING: Your code filename has two extensions\n" +msgstr "ATTENZIONE: Il nome del sorgente ha due estensioni\n" -#: py/obj.c:262 +#: py/builtinhelp.c #, c-format -msgid "can't convert %s to int" -msgstr "non è possibile convertire %s a int" +msgid "" +"Welcome to Adafruit CircuitPython %s!\n" +"\n" +"Please visit learn.adafruit.com/category/circuitpython for project guides.\n" +"\n" +"To list built-in modules please do `help(\"modules\")`.\n" +msgstr "" -#: py/obj.c:322 -msgid "can't convert to float" -msgstr "non è possibile convertire a float" +#: supervisor/shared/safe_mode.c +#, fuzzy +msgid "" +"You are running in safe mode which means something unanticipated happened.\n" +msgstr "" +"Sei nella modalità sicura che significa che qualcosa di molto brutto è " +"successo.\n" + +#: supervisor/shared/safe_mode.c +msgid "You requested starting safe mode by " +msgstr "È stato richiesto l'avvio in modalità sicura da " -#: py/obj.c:325 +#: ports/unix/modusocket.c #, c-format -msgid "can't convert %s to float" -msgstr "non è possibile convertire %s a float" +msgid "[addrinfo error %d]" +msgstr "[errore addrinfo %d]" -#: py/obj.c:355 -msgid "can't convert to complex" -msgstr "non è possibile convertire a complex" +#: py/objtype.c +msgid "__init__() should return None" +msgstr "__init__() deve ritornare None" -#: py/obj.c:358 +#: py/objtype.c #, c-format -msgid "can't convert %s to complex" -msgstr "non è possibile convertire a complex" +msgid "__init__() should return None, not '%s'" +msgstr "__init__() deve ritornare None, non '%s'" -#: py/obj.c:373 -msgid "expected tuple/list" -msgstr "lista/tupla prevista" +#: py/objobject.c +msgid "__new__ arg must be a user-type" +msgstr "" -#: py/obj.c:376 -#, c-format -msgid "object '%s' is not a tuple or list" -msgstr "oggetto '%s' non è una tupla o una lista" +#: extmod/modubinascii.c extmod/moduhashlib.c +msgid "a bytes-like object is required" +msgstr "un oggetto byte-like è richiesto" -#: py/obj.c:387 -msgid "tuple/list has wrong length" -msgstr "tupla/lista ha la lunghezza sbagliata" +#: lib/embed/abort_.c +msgid "abort() called" +msgstr "abort() chiamato" -#: py/obj.c:389 +#: ports/unix/modmachine.c extmod/machine_mem.c #, c-format -msgid "requested length %d but object has length %d" -msgstr "lunghezza %d richiesta ma l'oggetto ha lunghezza %d" +msgid "address %08x is not aligned to %d bytes" +msgstr "l'indirizzo %08x non è allineato a %d bytes" -#: py/obj.c:402 -msgid "indices must be integers" -msgstr "gli indici devono essere interi" +#: shared-bindings/i2cslave/I2CSlave.c +msgid "address out of bounds" +msgstr "indirizzo fuori limite" -#: py/obj.c:405 -msgid "%q indices must be integers, not %s" -msgstr "gli indici %q devono essere interi, non %s" +#: shared-bindings/i2cslave/I2CSlave.c +msgid "addresses is empty" +msgstr "gli indirizzi sono vuoti" -#: py/obj.c:425 -msgid "%q index out of range" -msgstr "indice %q fuori intervallo" +#: py/modbuiltins.c +msgid "arg is an empty sequence" +msgstr "l'argomento è una sequenza vuota" -#: py/obj.c:457 -msgid "object has no len" -msgstr "l'oggetto non ha lunghezza" +#: py/runtime.c +msgid "argument has wrong type" +msgstr "il tipo dell'argomento è errato" -#: py/obj.c:460 -#, c-format -msgid "object of type '%s' has no len()" -msgstr "l'oggetto di tipo '%s' non implementa len()" +#: py/argcheck.c +msgid "argument num/types mismatch" +msgstr "discrepanza di numero/tipo di argomenti" -#: py/obj.c:500 -msgid "object does not support item deletion" -msgstr "" +#: py/runtime.c +msgid "argument should be a '%q' not a '%q'" +msgstr "l'argomento dovrebbe essere un '%q' e non un '%q'" -#: py/obj.c:503 -#, c-format -msgid "'%s' object does not support item deletion" +#: shared-bindings/nvm/ByteArray.c py/objarray.c +msgid "array/bytes required on right side" msgstr "" -#: py/obj.c:507 -msgid "object is not subscriptable" +#: py/objstr.c +msgid "attributes not supported yet" +msgstr "attributi non ancora supportati" + +#: ports/nrf/common-hal/bleio/Characteristic.c +msgid "bad GATT role" msgstr "" -#: py/obj.c:510 -#, c-format -msgid "'%s' object is not subscriptable" +#: py/builtinevex.c +msgid "bad compile mode" msgstr "" -#: py/obj.c:514 -msgid "object does not support item assignment" +#: py/objstr.c +msgid "bad conversion specifier" +msgstr "specificatore di conversione scorretto" + +#: py/objstr.c +msgid "bad format string" +msgstr "stringa di formattazione scorretta" + +#: py/binary.c +msgid "bad typecode" msgstr "" -#: py/obj.c:517 +#: py/emitnative.c +msgid "binary op %q not implemented" +msgstr "operazione binaria %q non implementata" + +#: shared-bindings/busio/UART.c +msgid "bits must be 7, 8 or 9" +msgstr "i bit devono essere 7, 8 o 9" + +#: extmod/machine_spi.c +msgid "bits must be 8" +msgstr "i bit devono essere 8" + +#: shared-bindings/audioio/Mixer.c +#, fuzzy +msgid "bits_per_sample must be 8 or 16" +msgstr "i bit devono essere 7, 8 o 9" + +#: py/emitinlinethumb.c +#, fuzzy +msgid "branch not in range" +msgstr "argomento di chr() non è in range(256)" + +#: shared-bindings/_pixelbuf/PixelBuf.c #, c-format -msgid "'%s' object does not support item assignment" +msgid "buf is too small. need %d bytes" msgstr "" -#: py/obj.c:548 -msgid "object with buffer protocol required" +#: shared-bindings/audioio/RawSample.c +msgid "buffer must be a bytes-like object" msgstr "" -#: py/objarray.c:413 py/objstr.c:427 py/objstrunicode.c:191 py/objtuple.c:187 -#: shared-bindings/nvm/ByteArray.c:85 -msgid "only slices with step=1 (aka None) are supported" -msgstr "solo slice con step=1 (aka None) sono supportate" +#: shared-module/struct/__init__.c +#, fuzzy +msgid "buffer size must match format" +msgstr "slice del buffer devono essere della stessa lunghezza" -#: py/objarray.c:426 -msgid "lhs and rhs should be compatible" -msgstr "lhs e rhs devono essere compatibili" +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "buffer slices must be of equal length" +msgstr "slice del buffer devono essere della stessa lunghezza" -#: py/objarray.c:444 shared-bindings/nvm/ByteArray.c:107 -msgid "array/bytes required on right side" +#: ports/esp8266/machine_rtc.c +msgid "buffer too long" +msgstr "buffer troppo lungo" + +#: shared-bindings/struct/__init__.c shared-module/struct/__init__.c +#: py/modstruct.c +msgid "buffer too small" +msgstr "buffer troppo piccolo" + +#: extmod/machine_spi.c +msgid "buffers must be the same length" +msgstr "i buffer devono essere della stessa lunghezza" + +#: shared-bindings/_pew/PewPew.c +msgid "buttons must be digitalio.DigitalInOut" msgstr "" -#: py/objcomplex.c:203 -msgid "can't do truncated division of a complex number" -msgstr "impossibile fare il modulo di un numero complesso" +#: py/vm.c +msgid "byte code not implemented" +msgstr "byte code non implementato" -#: py/objcomplex.c:209 -msgid "complex division by zero" -msgstr "complex divisione per zero" +#: shared-bindings/_pixelbuf/PixelBuf.c +#, c-format +msgid "byteorder is not an instance of ByteOrder (got a %s)" +msgstr "" -#: py/objcomplex.c:237 -msgid "0.0 to a complex power" -msgstr "0.0 elevato alla potenza di un numero complesso" +#: ports/atmel-samd/common-hal/busio/UART.c +msgid "bytes > 8 bits not supported" +msgstr "byte > 8 bit non supportati" -#: py/objdeque.c:107 -msgid "full" -msgstr "pieno" +#: py/objstr.c +msgid "bytes value out of range" +msgstr "valore byte fuori intervallo" -#: py/objdeque.c:127 -msgid "empty" -msgstr "vuoto" +#: ports/atmel-samd/bindings/samd/Clock.c +msgid "calibration is out of range" +msgstr "la calibrazione è fuori intervallo" -#: py/objdict.c:314 -msgid "popitem(): dictionary is empty" -msgstr "popitem(): il dizionario è vuoto" +#: ports/atmel-samd/bindings/samd/Clock.c +msgid "calibration is read only" +msgstr "la calibrazione è in sola lettura" -#: py/objdict.c:357 -msgid "dict update sequence has wrong length" -msgstr "sequanza di aggiornamento del dizionario ha la lunghezza errata" +#: ports/atmel-samd/common-hal/rtc/RTC.c +msgid "calibration value out of range +/-127" +msgstr "valore di calibrazione fuori intervallo +/-127" -#: py/objfloat.c:308 py/parsenum.c:331 -msgid "complex values not supported" -msgstr "valori complessi non supportai" +#: py/emitinlinethumb.c +#, fuzzy +msgid "can only have up to 4 parameters to Thumb assembly" +msgstr "sono disponibili fino a 4 parametri per il Xtensa assembly" -#: py/objgenerator.c:108 -msgid "can't send non-None value to a just-started generator" -msgstr "" +#: py/emitinlinextensa.c +msgid "can only have up to 4 parameters to Xtensa assembly" +msgstr "sono disponibili fino a 4 parametri per il Xtensa assembly" -#: py/objgenerator.c:126 -msgid "generator already executing" -msgstr "" +#: py/persistentcode.c +msgid "can only save bytecode" +msgstr "È possibile salvare solo bytecode" -#: py/objgenerator.c:229 -msgid "generator ignored GeneratorExit" -msgstr "" +#: ports/esp8266/modnetwork.c +msgid "can query only one param" +msgstr "è possibile interrogare solo un parametro" -#: py/objgenerator.c:251 -msgid "can't pend throw to just-started generator" +#: py/objtype.c +msgid "can't add special method to already-subclassed class" msgstr "" -#: py/objint.c:144 -msgid "can't convert inf to int" -msgstr "impossibile convertire inf in int" +#: py/compile.c +msgid "can't assign to expression" +msgstr "impossibile assegnare all'espressione" + +#: py/obj.c +#, c-format +msgid "can't convert %s to complex" +msgstr "non è possibile convertire a complex" + +#: py/obj.c +#, c-format +msgid "can't convert %s to float" +msgstr "non è possibile convertire %s a float" + +#: py/obj.c +#, c-format +msgid "can't convert %s to int" +msgstr "non è possibile convertire %s a int" + +#: py/objstr.c +msgid "can't convert '%q' object to %q implicitly" +msgstr "impossibile convertire l'oggetto '%q' implicitamente in %q" -#: py/objint.c:146 +#: py/objint.c msgid "can't convert NaN to int" msgstr "impossibile convertire NaN in int" -#: py/objint.c:163 -msgid "float too big" -msgstr "float troppo grande" +#: shared-bindings/i2cslave/I2CSlave.c +msgid "can't convert address to int" +msgstr "impossible convertire indirizzo in int" -#: py/objint.c:328 -msgid "long int not supported in this build" -msgstr "long int non supportata in questa build" +#: py/objint.c +msgid "can't convert inf to int" +msgstr "impossibile convertire inf in int" -#: py/objint.c:334 py/objint.c:340 py/objint.c:350 py/objint.c:358 -msgid "small int overflow" -msgstr "small int overflow" +#: py/obj.c +msgid "can't convert to complex" +msgstr "non è possibile convertire a complex" -#: py/objint_longlong.c:189 py/objint_mpz.c:283 py/runtime.c:486 -msgid "negative power with no float support" -msgstr "potenza negativa senza supporto per float" +#: py/obj.c +msgid "can't convert to float" +msgstr "non è possibile convertire a float" -#: py/objint_longlong.c:251 -msgid "ulonglong too large" -msgstr "ulonglong troppo grande" +#: py/obj.c +msgid "can't convert to int" +msgstr "non è possibile convertire a int" -#: py/objint_mpz.c:267 py/runtime.c:396 py/runtime.c:411 -msgid "negative shift count" -msgstr "" +#: py/objstr.c +msgid "can't convert to str implicitly" +msgstr "impossibile convertire a stringa implicitamente" -#: py/objint_mpz.c:336 -msgid "pow() with 3 arguments requires integers" -msgstr "pow() con 3 argomenti richiede interi" +#: py/compile.c +msgid "can't declare nonlocal in outer code" +msgstr "impossibile dichiarare nonlocal nel codice esterno" -#: py/objint_mpz.c:347 -msgid "pow() 3rd argument cannot be 0" -msgstr "il terzo argomento di pow() non può essere 0" +#: py/compile.c +msgid "can't delete expression" +msgstr "impossibile cancellare l'espessione" -#: py/objint_mpz.c:415 -msgid "overflow converting long int to machine word" -msgstr "overflow convertendo long int in parola" +#: py/emitnative.c +msgid "can't do binary op between '%q' and '%q'" +msgstr "impossibile eseguire operazione binaria tra '%q' e '%q'" -#: py/objlist.c:273 -msgid "pop from empty list" -msgstr "pop da una lista vuota" +#: py/objcomplex.c +msgid "can't do truncated division of a complex number" +msgstr "impossibile fare il modulo di un numero complesso" + +#: ports/esp8266/modnetwork.c +msgid "can't get AP config" +msgstr "impossibile recuperare le configurazioni dell'AP" + +#: ports/esp8266/modnetwork.c +msgid "can't get STA config" +msgstr "impossibile recuperare la configurazione della STA" + +#: py/compile.c +msgid "can't have multiple **x" +msgstr "impossibile usare **x multipli" + +#: py/compile.c +msgid "can't have multiple *x" +msgstr "impossibile usare *x multipli" + +#: py/emitnative.c +msgid "can't implicitly convert '%q' to 'bool'" +msgstr "non è possibile convertire implicitamente '%q' in 'bool'" + +#: py/emitnative.c +msgid "can't load from '%q'" +msgstr "impossibile caricare da '%q'" + +#: py/emitnative.c +msgid "can't load with '%q' index" +msgstr "impossibile caricare con indice '%q'" + +#: py/objgenerator.c +msgid "can't pend throw to just-started generator" +msgstr "" -#: py/objnamedtuple.c:92 +#: py/objgenerator.c +msgid "can't send non-None value to a just-started generator" +msgstr "" + +#: ports/esp8266/modnetwork.c +msgid "can't set AP config" +msgstr "impossibile impostare le configurazioni dell'AP" + +#: ports/esp8266/modnetwork.c +msgid "can't set STA config" +msgstr "impossibile impostare le configurazioni della STA" + +#: py/objnamedtuple.c msgid "can't set attribute" msgstr "impossibile impostare attributo" -#: py/objobject.c:55 -msgid "__new__ arg must be a user-type" -msgstr "" +#: py/emitnative.c +msgid "can't store '%q'" +msgstr "impossibile memorizzare '%q'" -#: py/objrange.c:110 -msgid "zero step" -msgstr "zero step" +#: py/emitnative.c +msgid "can't store to '%q'" +msgstr "impossibile memorizzare in '%q'" -#: py/objset.c:371 -msgid "pop from an empty set" -msgstr "pop da un set vuoto" +#: py/emitnative.c +msgid "can't store with '%q' index" +msgstr "impossibile memorizzare con indice '%q'" -#: py/objslice.c:66 -msgid "Length must be an int" -msgstr "Length deve essere un intero" +#: py/objstr.c +msgid "" +"can't switch from automatic field numbering to manual field specification" +msgstr "" -#: py/objslice.c:71 -msgid "Length must be non-negative" -msgstr "Length deve essere non negativo" +#: py/objstr.c +msgid "" +"can't switch from manual field specification to automatic field numbering" +msgstr "" -#: py/objslice.c:86 py/sequence.c:57 -msgid "slice step cannot be zero" -msgstr "la step della slice non può essere zero" +#: py/objtype.c +msgid "cannot create '%q' instances" +msgstr "creare '%q' istanze" -#: py/objslice.c:159 -msgid "Cannot subclass slice" -msgstr "Impossibile subclasare slice" +#: py/objtype.c +msgid "cannot create instance" +msgstr "impossibile creare un istanza" -#: py/objstr.c:261 -msgid "bytes value out of range" -msgstr "valore byte fuori intervallo" +#: py/runtime.c +msgid "cannot import name %q" +msgstr "impossibile imporate il nome %q" -#: py/objstr.c:270 -msgid "wrong number of arguments" -msgstr "numero di argomenti errato" +#: py/builtinimport.c +msgid "cannot perform relative import" +msgstr "impossibile effettuare l'importazione relativa" -#: py/objstr.c:467 -msgid "join expects a list of str/bytes objects consistent with self object" +#: py/emitnative.c +msgid "casting" +msgstr "casting" + +#: shared-bindings/bleio/Service.c +msgid "characteristics includes an object that is not a Characteristic" msgstr "" -"join prende una lista di oggetti str/byte consistenti con l'oggetto stesso" -#: py/objstr.c:542 py/objstr.c:647 py/objstr.c:1744 -msgid "empty separator" -msgstr "separatore vuoto" +#: shared-bindings/_stage/Text.c +msgid "chars buffer too small" +msgstr "buffer dei caratteri troppo piccolo" -#: py/objstr.c:641 -msgid "rsplit(None,n)" +#: py/modbuiltins.c +msgid "chr() arg not in range(0x110000)" +msgstr "argomento di chr() non è in range(0x110000)" + +#: py/modbuiltins.c +msgid "chr() arg not in range(256)" +msgstr "argomento di chr() non è in range(256)" + +#: shared-bindings/displayio/Palette.c +msgid "color buffer must be 3 bytes (RGB) or 4 bytes (RGB + pad byte)" msgstr "" +"il buffer del colore deve esseer di 3 byte (RGB) o 4 byte (RGB + pad byte)" -#: py/objstr.c:713 -msgid "substring not found" -msgstr "sottostringa non trovata" +#: shared-bindings/displayio/Palette.c +msgid "color buffer must be a buffer or int" +msgstr "il buffer del colore deve essere un buffer o un int" -#: py/objstr.c:770 -msgid "start/end indices" +#: shared-bindings/displayio/Palette.c +msgid "color buffer must be a bytearray or array of type 'b' or 'B'" msgstr "" +"buffer del colore deve essere un bytearray o un array di tipo 'b' o 'B'" -#: py/objstr.c:931 -msgid "bad format string" -msgstr "stringa di formattazione scorretta" +#: shared-bindings/displayio/Palette.c +msgid "color must be between 0x000000 and 0xffffff" +msgstr "il colore deve essere compreso tra 0x000000 e 0xffffff" -#: py/objstr.c:953 -msgid "single '}' encountered in format string" -msgstr "'}' singolo presente nella stringa di formattazione" +#: shared-bindings/displayio/ColorConverter.c +msgid "color should be an int" +msgstr "il colore deve essere un int" -#: py/objstr.c:992 -msgid "bad conversion specifier" -msgstr "specificatore di conversione scorretto" +#: py/objcomplex.c +msgid "complex division by zero" +msgstr "complex divisione per zero" -#: py/objstr.c:996 -msgid "end of format while looking for conversion specifier" -msgstr "" +#: py/parsenum.c py/objfloat.c +msgid "complex values not supported" +msgstr "valori complessi non supportai" -#: py/objstr.c:998 -#, c-format -msgid "unknown conversion specifier %c" -msgstr "specificatore di conversione %s sconosciuto" +#: extmod/moduzlib.c +msgid "compression header" +msgstr "compressione dell'header" -#: py/objstr.c:1029 -msgid "unmatched '{' in format" -msgstr "'{' spaiato nella stringa di formattazione" +#: py/parse.c +msgid "constant must be an integer" +msgstr "la costante deve essere un intero" -#: py/objstr.c:1036 -msgid "expected ':' after format specifier" -msgstr "':' atteso dopo lo specificatore di formato" +#: py/emitnative.c +msgid "conversion to object" +msgstr "conversione in oggetto" + +#: py/parsenum.c +msgid "decimal numbers not supported" +msgstr "numeri decimali non supportati" -#: py/objstr.c:1050 +#: py/compile.c +msgid "default 'except' must be last" +msgstr "'except' predefinito deve essere ultimo" + +#: shared-bindings/audiobusio/PDMIn.c msgid "" -"can't switch from automatic field numbering to manual field specification" +"destination buffer must be a bytearray or array of type 'B' for bit_depth = 8" msgstr "" +"il buffer di destinazione deve essere un bytearray o un array di tipo 'B' " +"con bit_depth = 8" -#: py/objstr.c:1055 py/objstr.c:1083 -msgid "tuple index out of range" -msgstr "indice della tupla fuori intervallo" +#: shared-bindings/audiobusio/PDMIn.c +msgid "destination buffer must be an array of type 'H' for bit_depth = 16" +msgstr "" +"il buffer di destinazione deve essere un array di tipo 'H' con bit_depth = 16" -#: py/objstr.c:1071 -msgid "attributes not supported yet" -msgstr "attributi non ancora supportati" +#: shared-bindings/audiobusio/PDMIn.c +msgid "destination_length must be an int >= 0" +msgstr "destination_length deve essere un int >= 0" -#: py/objstr.c:1079 -msgid "" -"can't switch from manual field specification to automatic field numbering" -msgstr "" +#: py/objdict.c +msgid "dict update sequence has wrong length" +msgstr "sequanza di aggiornamento del dizionario ha la lunghezza errata" -#: py/objstr.c:1171 -msgid "invalid format specifier" -msgstr "specificatore di formato non valido" +#: shared-bindings/math/__init__.c py/runtime.c py/modmath.c py/objint_mpz.c +#: py/objint_longlong.c py/objfloat.c +msgid "division by zero" +msgstr "divisione per zero" -#: py/objstr.c:1192 -msgid "sign not allowed in string format specifier" -msgstr "segno non permesso nello spcificatore di formato della stringa" +#: ports/esp8266/modnetwork.c +msgid "either pos or kw args are allowed" +msgstr "sono permesse solo gli argomenti pos o kw" -#: py/objstr.c:1200 -msgid "sign not allowed with integer format specifier 'c'" -msgstr "segno non permesso nello spcificatore di formato 'c' della stringa" +#: py/objdeque.c +msgid "empty" +msgstr "vuoto" -#: py/objstr.c:1259 -#, c-format -msgid "unknown format code '%c' for object of type '%s'" -msgstr "codice di formattaione '%c' sconosciuto per oggetto di tipo '%s'" +#: extmod/modutimeq.c extmod/moduheapq.c +msgid "empty heap" +msgstr "heap vuoto" -#: py/objstr.c:1331 -#, c-format -msgid "unknown format code '%c' for object of type 'float'" -msgstr "codice di formattazione '%c' sconosciuto per oggetto di tipo 'float'" +#: py/objstr.c +msgid "empty separator" +msgstr "separatore vuoto" -#: py/objstr.c:1343 -msgid "'=' alignment not allowed in string format specifier" +#: shared-bindings/random/__init__.c +msgid "empty sequence" +msgstr "sequenza vuota" + +#: py/objstr.c +msgid "end of format while looking for conversion specifier" msgstr "" -#: py/objstr.c:1367 +#: shared-bindings/displayio/Shape.c +#, fuzzy +msgid "end_x should be an int" +msgstr "y dovrebbe essere un int" + +#: ports/nrf/common-hal/busio/UART.c #, c-format -msgid "unknown format code '%c' for object of type 'str'" -msgstr "codice di formattazione '%c' sconosciuto per oggetto di tipo 'str'" +msgid "error = 0x%08lX" +msgstr "" -#: py/objstr.c:1415 -msgid "format requires a dict" -msgstr "la formattazione richiede un dict" +#: py/runtime.c +msgid "exceptions must derive from BaseException" +msgstr "le eccezioni devono derivare da BaseException" -#: py/objstr.c:1424 -msgid "incomplete format key" -msgstr "" +#: py/objstr.c +msgid "expected ':' after format specifier" +msgstr "':' atteso dopo lo specificatore di formato" -#: py/objstr.c:1482 -msgid "incomplete format" -msgstr "formato incompleto" +#: shared-bindings/gamepad/GamePad.c +msgid "expected a DigitalInOut" +msgstr "DigitalInOut atteso" -#: py/objstr.c:1490 -msgid "not enough arguments for format string" -msgstr "argomenti non sufficienti per la stringa di formattazione" +#: py/obj.c +msgid "expected tuple/list" +msgstr "lista/tupla prevista" -#: py/objstr.c:1500 -#, c-format -msgid "%%c requires int or char" -msgstr "%%c necessita di int o char" +#: py/modthread.c +msgid "expecting a dict for keyword args" +msgstr "argomenti nominati necessitano un dizionario" -#: py/objstr.c:1507 -msgid "integer required" -msgstr "intero richiesto" +#: ports/esp8266/machine_pin.c +msgid "expecting a pin" +msgstr "pin atteso" -#: py/objstr.c:1570 -#, c-format -msgid "unsupported format character '%c' (0x%x) at index %d" -msgstr "carattere di formattazione '%c' (0x%x) non supportato all indice %d" +#: py/compile.c +msgid "expecting an assembler instruction" +msgstr "istruzione assembler attesa" -#: py/objstr.c:1577 -msgid "not all arguments converted during string formatting" +#: py/compile.c +msgid "expecting just a value for set" +msgstr "un solo valore atteso per set" + +#: py/compile.c +msgid "expecting key:value for dict" +msgstr "chiave:valore atteso per dict" + +#: py/argcheck.c +msgid "extra keyword arguments given" +msgstr "argomento nominato aggiuntivo fornito" + +#: py/argcheck.c +msgid "extra positional arguments given" +msgstr "argomenti posizonali extra dati" + +#: ports/unix/modffi.c +msgid "ffi_prep_closure_loc" +msgstr "ffi_prep_closure_loc" + +#: shared-bindings/displayio/OnDiskBitmap.c shared-bindings/audioio/WaveFile.c +msgid "file must be a file opened in byte mode" msgstr "" -"non tutti gli argomenti sono stati convertiti durante la formatazione in " -"stringhe" -#: py/objstr.c:2102 -msgid "can't convert to str implicitly" -msgstr "impossibile convertire a stringa implicitamente" +#: shared-bindings/storage/__init__.c +msgid "filesystem must provide mount method" +msgstr "il filesystem deve fornire un metodo di mount" -#: py/objstr.c:2106 -msgid "can't convert '%q' object to %q implicitly" -msgstr "impossibile convertire l'oggetto '%q' implicitamente in %q" +#: py/objtype.c +msgid "first argument to super() must be type" +msgstr "" -#: py/objstrunicode.c:134 -#, c-format -msgid "string indices must be integers, not %s" -msgstr "indici della stringa devono essere interi, non %s" +#: extmod/machine_spi.c +msgid "firstbit must be MSB" +msgstr "il primo bit deve essere il più significativo (MSB)" -#: py/objstrunicode.c:145 py/objstrunicode.c:164 -msgid "string index out of range" -msgstr "indice della stringa fuori intervallo" +#: ports/esp8266/modesp.c +msgid "flash location must be below 1MByte" +msgstr "Locazione della flash deve essere inferiore a 1mb" -#: py/objtype.c:358 -msgid "__init__() should return None" -msgstr "__init__() deve ritornare None" +#: py/objint.c +msgid "float too big" +msgstr "float troppo grande" -#: py/objtype.c:360 -#, c-format -msgid "__init__() should return None, not '%s'" -msgstr "__init__() deve ritornare None, non '%s'" +#: shared-bindings/_stage/Text.c +msgid "font must be 2048 bytes long" +msgstr "il font deve essere lungo 2048 byte" -#: py/objtype.c:623 py/objtype.c:1275 py/runtime.c:1065 -msgid "unreadable attribute" -msgstr "attributo non leggibile" +#: py/objstr.c +msgid "format requires a dict" +msgstr "la formattazione richiede un dict" -#: py/objtype.c:868 py/runtime.c:653 -msgid "object not callable" -msgstr "" +#: ports/esp8266/modmachine.c +msgid "frequency can only be either 80Mhz or 160MHz" +msgstr "la frequenza può essere o 80Mhz o 160Mhz" -#: py/objtype.c:870 py/runtime.c:655 -#, c-format -msgid "'%s' object is not callable" -msgstr "" +#: py/objdeque.c +msgid "full" +msgstr "pieno" -#: py/objtype.c:978 -msgid "type takes 1 or 3 arguments" -msgstr "tipo prende 1 o 3 argomenti" +#: py/argcheck.c +msgid "function does not take keyword arguments" +msgstr "la funzione non prende argomenti nominati" -#: py/objtype.c:989 -msgid "cannot create instance" -msgstr "impossibile creare un istanza" +#: py/argcheck.c +#, c-format +msgid "function expected at most %d arguments, got %d" +msgstr "la funzione prevede al massimo %d argmoneti, ma ne ha ricevuti %d" -#: py/objtype.c:991 -msgid "cannot create '%q' instances" -msgstr "creare '%q' istanze" +#: py/objnamedtuple.c py/bc.c +msgid "function got multiple values for argument '%q'" +msgstr "la funzione ha ricevuto valori multipli per l'argomento '%q'" -#: py/objtype.c:1047 -msgid "can't add special method to already-subclassed class" -msgstr "" +#: py/argcheck.c +#, c-format +msgid "function missing %d required positional arguments" +msgstr "mancano %d argomenti posizionali obbligatori alla funzione" -#: py/objtype.c:1091 py/objtype.c:1097 -msgid "type is not an acceptable base type" -msgstr "il tipo non è un tipo di base accettabile" +#: py/bc.c +msgid "function missing keyword-only argument" +msgstr "argomento nominato mancante alla funzione" -#: py/objtype.c:1100 -msgid "type '%q' is not an acceptable base type" -msgstr "il tipo '%q' non è un tipo di base accettabile" +#: py/bc.c +msgid "function missing required keyword argument '%q'" +msgstr "argomento nominato '%q' mancante alla funzione" -#: py/objtype.c:1137 -msgid "multiple inheritance not supported" -msgstr "ereditarietà multipla non supportata" +#: py/bc.c +#, c-format +msgid "function missing required positional argument #%d" +msgstr "mancante il #%d argomento posizonale obbligatorio della funzione" -#: py/objtype.c:1164 -msgid "multiple bases have instance lay-out conflict" +#: py/argcheck.c py/objnamedtuple.c py/bc.c +#, c-format +msgid "function takes %d positional arguments but %d were given" msgstr "" +"la funzione prende %d argomenti posizionali ma ne sono stati forniti %d" -#: py/objtype.c:1205 -msgid "first argument to super() must be type" +#: shared-bindings/time/__init__.c +msgid "function takes exactly 9 arguments" +msgstr "la funzione prende esattamente 9 argomenti" + +#: py/objgenerator.c +msgid "generator already executing" msgstr "" -#: py/objtype.c:1370 -msgid "issubclass() arg 2 must be a class or a tuple of classes" +#: py/objgenerator.c +msgid "generator ignored GeneratorExit" msgstr "" -"il secondo argomento di issubclass() deve essere una classe o una tupla di " -"classi" -#: py/objtype.c:1384 -msgid "issubclass() arg 1 must be a class" -msgstr "il primo argomento di issubclass() deve essere una classe" +#: shared-bindings/_stage/Layer.c +msgid "graphic must be 2048 bytes long" +msgstr "graphic deve essere lunga 2048 byte" -#: py/parse.c:726 -msgid "constant must be an integer" -msgstr "la costante deve essere un intero" +#: extmod/moduheapq.c +msgid "heap must be a list" +msgstr "l'heap deve essere una lista" -#: py/parse.c:868 -msgid "Unable to init parser" -msgstr "Inizilizzazione del parser non possibile" +#: py/compile.c +msgid "identifier redefined as global" +msgstr "identificatore ridefinito come globale" -#: py/parse.c:1170 -msgid "unexpected indent" -msgstr "indentazione inaspettata" +#: py/compile.c +msgid "identifier redefined as nonlocal" +msgstr "identificatore ridefinito come nonlocal" -#: py/parse.c:1173 -msgid "unindent does not match any outer indentation level" +#: ports/esp8266/machine_hspi.c +msgid "impossible baudrate" +msgstr "baudrate impossibile" + +#: py/objstr.c +msgid "incomplete format" +msgstr "formato incompleto" + +#: py/objstr.c +msgid "incomplete format key" msgstr "" -#: py/parsenum.c:60 -msgid "int() arg 2 must be >= 2 and <= 36" -msgstr "il secondo argomanto di int() deve essere >= 2 e <= 36" +#: extmod/modubinascii.c +msgid "incorrect padding" +msgstr "padding incorretto" -#: py/parsenum.c:151 -msgid "invalid syntax for integer" -msgstr "sintassi invalida per l'intero" +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +#: ports/nrf/common-hal/pulseio/PulseIn.c +#: ports/esp8266/common-hal/pulseio/PulseIn.c py/obj.c +msgid "index out of range" +msgstr "indice fuori intervallo" -#: py/parsenum.c:155 -#, c-format -msgid "invalid syntax for integer with base %d" -msgstr "sintassi invalida per l'intero con base %d" +#: py/obj.c +msgid "indices must be integers" +msgstr "gli indici devono essere interi" -#: py/parsenum.c:339 -msgid "invalid syntax for number" -msgstr "sintassi invalida per il numero" +#: py/compile.c +msgid "inline assembler must be a function" +msgstr "inline assembler deve essere una funzione" -#: py/parsenum.c:342 -msgid "decimal numbers not supported" -msgstr "numeri decimali non supportati" +#: py/parsenum.c +msgid "int() arg 2 must be >= 2 and <= 36" +msgstr "il secondo argomanto di int() deve essere >= 2 e <= 36" -#: py/persistentcode.c:223 -msgid "" -"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/" -"mpy-update for more info." +#: py/objstr.c +msgid "integer required" +msgstr "intero richiesto" + +#: ports/nrf/common-hal/bleio/Broadcaster.c +msgid "interval not in range 0.0020 to 10.24" msgstr "" -"File .mpy incompatibile. Aggiorna tutti i file .mpy. Vedi http://adafru.it/" -"mpy-update per più informazioni." -#: py/persistentcode.c:326 -msgid "can only save bytecode" -msgstr "È possibile salvare solo bytecode" +#: extmod/machine_i2c.c +msgid "invalid I2C peripheral" +msgstr "periferica I2C invalida" -#: py/runtime.c:206 -msgid "name not defined" -msgstr "nome non definito" +#: extmod/machine_spi.c +msgid "invalid SPI peripheral" +msgstr "periferica SPI invalida" -#: py/runtime.c:209 -msgid "name '%q' is not defined" -msgstr "nome '%q'non definito" +#: ports/esp8266/machine_rtc.c +msgid "invalid alarm" +msgstr "alarm non valido" -#: py/runtime.c:304 py/runtime.c:611 -msgid "unsupported type for operator" -msgstr "tipo non supportato per l'operando" +#: lib/netutils/netutils.c +msgid "invalid arguments" +msgstr "argomenti non validi" -#: py/runtime.c:307 -msgid "unsupported type for %q: '%s'" -msgstr "tipo non supportato per %q: '%s'" +#: ports/esp8266/modnetwork.c +msgid "invalid buffer length" +msgstr "lunghezza del buffer non valida" -#: py/runtime.c:614 -msgid "unsupported types for %q: '%s', '%s'" -msgstr "tipi non supportati per %q: '%s', '%s'" +#: extmod/modussl_axtls.c +msgid "invalid cert" +msgstr "certificato non valido" -#: py/runtime.c:881 py/runtime.c:888 py/runtime.c:945 -msgid "wrong number of values to unpack" -msgstr "numero di valori da scompattare non corretto" +#: ports/esp8266/common-hal/busio/UART.c ports/esp8266/machine_uart.c +msgid "invalid data bits" +msgstr "bit dati invalidi" -#: py/runtime.c:883 py/runtime.c:947 -#, c-format -msgid "need more than %d values to unpack" -msgstr "necessari più di %d valori da scompattare" +#: extmod/uos_dupterm.c +msgid "invalid dupterm index" +msgstr "indice dupterm non valido" -#: py/runtime.c:890 -#, c-format -msgid "too many values to unpack (expected %d)" -msgstr "troppi valori da scompattare (%d attesi)" +#: extmod/modframebuf.c +msgid "invalid format" +msgstr "formato non valido" -#: py/runtime.c:984 -msgid "argument has wrong type" -msgstr "il tipo dell'argomento è errato" +#: py/objstr.c +msgid "invalid format specifier" +msgstr "specificatore di formato non valido" -#: py/runtime.c:986 -msgid "argument should be a '%q' not a '%q'" -msgstr "l'argomento dovrebbe essere un '%q' e non un '%q'" +#: extmod/modussl_axtls.c +msgid "invalid key" +msgstr "chiave non valida" -#: py/runtime.c:1123 py/runtime.c:1197 -msgid "no such attribute" -msgstr "attributo inesistente" +#: py/compile.c +msgid "invalid micropython decorator" +msgstr "decoratore non valido in micropython" -#: py/runtime.c:1128 -msgid "type object '%q' has no attribute '%q'" -msgstr "l'oggetto di tipo '%q' non ha l'attributo '%q'" +#: ports/esp8266/machine_pin.c +msgid "invalid pin" +msgstr "pin non valido" -#: py/runtime.c:1132 py/runtime.c:1200 -msgid "'%s' object has no attribute '%q'" -msgstr "l'oggetto '%s' non ha l'attributo '%q'" +#: shared-bindings/random/__init__.c +msgid "invalid step" +msgstr "step non valida" -#: py/runtime.c:1238 -msgid "object not iterable" -msgstr "oggetto non iterabile" +#: ports/esp8266/common-hal/busio/UART.c ports/esp8266/machine_uart.c +msgid "invalid stop bits" +msgstr "bit di stop invalidi" -#: py/runtime.c:1241 -#, c-format -msgid "'%s' object is not iterable" -msgstr "l'oggetto '%s' non è iterabile" +#: py/compile.c py/parse.c +msgid "invalid syntax" +msgstr "sintassi non valida" -#: py/runtime.c:1260 py/runtime.c:1296 -msgid "object not an iterator" -msgstr "l'oggetto non è un iteratore" +#: py/parsenum.c +msgid "invalid syntax for integer" +msgstr "sintassi invalida per l'intero" -#: py/runtime.c:1262 py/runtime.c:1298 +#: py/parsenum.c #, c-format -msgid "'%s' object is not an iterator" -msgstr "l'oggetto '%s' non è un iteratore" +msgid "invalid syntax for integer with base %d" +msgstr "sintassi invalida per l'intero con base %d" -#: py/runtime.c:1401 -msgid "exceptions must derive from BaseException" -msgstr "le eccezioni devono derivare da BaseException" +#: py/parsenum.c +msgid "invalid syntax for number" +msgstr "sintassi invalida per il numero" -#: py/runtime.c:1430 -msgid "cannot import name %q" -msgstr "impossibile imporate il nome %q" +#: py/objtype.c +msgid "issubclass() arg 1 must be a class" +msgstr "il primo argomento di issubclass() deve essere una classe" -#: py/runtime.c:1535 -msgid "memory allocation failed, heap is locked" -msgstr "allocazione di memoria fallita, l'heap è bloccato" +#: py/objtype.c +msgid "issubclass() arg 2 must be a class or a tuple of classes" +msgstr "" +"il secondo argomento di issubclass() deve essere una classe o una tupla di " +"classi" -#: py/runtime.c:1539 -#, c-format -msgid "memory allocation failed, allocating %u bytes" -msgstr "allocazione di memoria fallita, allocando %u byte" +#: py/objstr.c +msgid "join expects a list of str/bytes objects consistent with self object" +msgstr "" +"join prende una lista di oggetti str/byte consistenti con l'oggetto stesso" -#: py/runtime.c:1609 -msgid "maximum recursion depth exceeded" -msgstr "profondità massima di ricorsione superata" +#: py/argcheck.c +msgid "keyword argument(s) not yet implemented - use normal args instead" +msgstr "" +"argomento(i) nominati non ancora implementati - usare invece argomenti " +"normali" -#: py/sequence.c:264 -msgid "object not in sequence" -msgstr "oggetto non in sequenza" +#: py/bc.c +msgid "keywords must be strings" +msgstr "argomenti nominati devono essere stringhe" -#: py/stream.c:96 -msgid "stream operation not supported" -msgstr "operazione di stream non supportata" +#: py/emitinlinextensa.c py/emitinlinethumb.c +msgid "label '%q' not defined" +msgstr "etichetta '%q' non definita" -#: py/stream.c:254 -msgid "string not supported; use bytes or bytearray" -msgstr "" +#: py/compile.c +msgid "label redefined" +msgstr "etichetta ridefinita" -#: py/stream.c:289 +#: ports/esp8266/modesp.c +msgid "len must be multiple of 4" +msgstr "len deve essere multiplo di 4" + +#: py/stream.c msgid "length argument not allowed for this type" msgstr "" -#: py/vm.c:255 -msgid "local variable referenced before assignment" -msgstr "variabile locale richiamata prima di un assegnamento" +#: py/objarray.c +msgid "lhs and rhs should be compatible" +msgstr "lhs e rhs devono essere compatibili" -#: py/vm.c:1142 -msgid "no active exception to reraise" -msgstr "nessuna eccezione attiva da rilanciare" +#: py/emitnative.c +msgid "local '%q' has type '%q' but source is '%q'" +msgstr "local '%q' ha tipo '%q' ma sorgente è '%q'" -#: py/vm.c:1284 -msgid "byte code not implemented" -msgstr "byte code non implementato" +#: py/emitnative.c +msgid "local '%q' used before type known" +msgstr "locla '%q' utilizzato prima che il tipo fosse noto" -#: shared-bindings/_stage/Layer.c:71 -msgid "graphic must be 2048 bytes long" -msgstr "graphic deve essere lunga 2048 byte" +#: py/vm.c +msgid "local variable referenced before assignment" +msgstr "variabile locale richiamata prima di un assegnamento" -#: shared-bindings/_stage/Layer.c:77 shared-bindings/_stage/Text.c:75 -msgid "palette must be 32 bytes long" -msgstr "la palette deve essere lunga 32 byte" +#: py/objint.c +msgid "long int not supported in this build" +msgstr "long int non supportata in questa build" -#: shared-bindings/_stage/Layer.c:84 +#: shared-bindings/_stage/Layer.c msgid "map buffer too small" msgstr "map buffer troppo piccolo" -#: shared-bindings/_stage/Text.c:69 -msgid "font must be 2048 bytes long" -msgstr "il font deve essere lungo 2048 byte" +#: shared-bindings/math/__init__.c py/modmath.c +msgid "math domain error" +msgstr "errore di dominio matematico" -#: shared-bindings/_stage/Text.c:81 -msgid "chars buffer too small" -msgstr "buffer dei caratteri troppo piccolo" +#: py/runtime.c +msgid "maximum recursion depth exceeded" +msgstr "profondità massima di ricorsione superata" -#: shared-bindings/analogio/AnalogOut.c:118 -msgid "AnalogOut is only 16 bits. Value must be less than 65536." -msgstr "AnalogOut ha solo 16 bit. Il valore deve essere meno di 65536." +#: py/runtime.c +#, c-format +msgid "memory allocation failed, allocating %u bytes" +msgstr "allocazione di memoria fallita, allocando %u byte" -#: shared-bindings/audiobusio/I2SOut.c:225 -#: shared-bindings/audioio/AudioOut.c:226 -msgid "Not playing" -msgstr "In pausa" +#: ports/esp8266/modesp.c +#, c-format +msgid "memory allocation failed, allocating %u bytes for native code" +msgstr "" +"allocazione di memoria fallita, allocazione di %d byte per codice nativo" -#: shared-bindings/audiobusio/PDMIn.c:124 -msgid "Bit depth must be multiple of 8." -msgstr "La profondità di bit deve essere multipla di 8." +#: py/runtime.c +msgid "memory allocation failed, heap is locked" +msgstr "allocazione di memoria fallita, l'heap è bloccato" -#: shared-bindings/audiobusio/PDMIn.c:128 -msgid "Oversample must be multiple of 8." -msgstr "L'oversampling deve essere multiplo di 8." +#: py/builtinimport.c +msgid "module not found" +msgstr "modulo non trovato" -#: shared-bindings/audiobusio/PDMIn.c:136 -msgid "Microphone startup delay must be in range 0.0 to 1.0" +#: py/compile.c +msgid "multiple *x in assignment" +msgstr "*x multipli nell'assegnamento" + +#: py/objtype.c +msgid "multiple bases have instance lay-out conflict" msgstr "" -"Il ritardo di avvio del microfono deve essere nell'intervallo tra 0.0 e 1.0" -#: shared-bindings/audiobusio/PDMIn.c:193 -msgid "destination_length must be an int >= 0" -msgstr "destination_length deve essere un int >= 0" +#: py/objtype.c +msgid "multiple inheritance not supported" +msgstr "ereditarietà multipla non supportata" -#: shared-bindings/audiobusio/PDMIn.c:199 -msgid "Cannot record to a file" -msgstr "Impossibile registrare in un file" +#: py/emitnative.c +msgid "must raise an object" +msgstr "deve lanciare un oggetto" -#: shared-bindings/audiobusio/PDMIn.c:202 -msgid "Destination capacity is smaller than destination_length." -msgstr "La capacità di destinazione è più piccola di destination_length." +#: extmod/machine_spi.c +msgid "must specify all of sck/mosi/miso" +msgstr "è necessario specificare tutte le sck/mosi/miso" -#: shared-bindings/audiobusio/PDMIn.c:206 -msgid "destination buffer must be an array of type 'H' for bit_depth = 16" +#: py/modbuiltins.c +msgid "must use keyword argument for key function" msgstr "" -"il buffer di destinazione deve essere un array di tipo 'H' con bit_depth = 16" -#: shared-bindings/audiobusio/PDMIn.c:208 -msgid "" -"destination buffer must be a bytearray or array of type 'B' for bit_depth = 8" -msgstr "" -"il buffer di destinazione deve essere un bytearray o un array di tipo 'B' " -"con bit_depth = 8" +#: py/runtime.c +msgid "name '%q' is not defined" +msgstr "nome '%q'non definito" -#: shared-bindings/audioio/Mixer.c:94 +#: shared-bindings/bleio/Peripheral.c #, fuzzy -msgid "Invalid voice count" -msgstr "Tipo di servizio non valido" +msgid "name must be a string" +msgstr "argomenti nominati devono essere stringhe" -#: shared-bindings/audioio/Mixer.c:99 -#, fuzzy -msgid "Invalid channel count" -msgstr "Argomento non valido" +#: py/runtime.c +msgid "name not defined" +msgstr "nome non definito" -#: shared-bindings/audioio/Mixer.c:103 -#, fuzzy -msgid "Sample rate must be positive" -msgstr "STA deve essere attiva" +#: py/compile.c +msgid "name reused for argument" +msgstr "nome riutilizzato come argomento" -#: shared-bindings/audioio/Mixer.c:107 -#, fuzzy -msgid "bits_per_sample must be 8 or 16" -msgstr "i bit devono essere 7, 8 o 9" +#: py/emitnative.c +msgid "native yield" +msgstr "yield nativo" -#: shared-bindings/audioio/RawSample.c:98 -msgid "" -"sample_source buffer must be a bytearray or array of type 'h', 'H', 'b' or " -"'B'" -msgstr "" -"il buffer sample_source deve essere un bytearray o un array di tipo 'h', " -"'H', 'b' o 'B'" +#: py/runtime.c +#, c-format +msgid "need more than %d values to unpack" +msgstr "necessari più di %d valori da scompattare" -#: shared-bindings/audioio/RawSample.c:104 -msgid "buffer must be a bytes-like object" -msgstr "" +#: py/runtime.c py/objint_mpz.c py/objint_longlong.c +msgid "negative power with no float support" +msgstr "potenza negativa senza supporto per float" -#: shared-bindings/audioio/WaveFile.c:78 -#: shared-bindings/displayio/OnDiskBitmap.c:85 -msgid "file must be a file opened in byte mode" +#: py/runtime.c py/objint_mpz.c +msgid "negative shift count" msgstr "" -#: shared-bindings/bitbangio/I2C.c:111 shared-bindings/bitbangio/SPI.c:121 -#: shared-bindings/busio/SPI.c:133 -msgid "Function requires lock" -msgstr "" +#: py/vm.c +msgid "no active exception to reraise" +msgstr "nessuna eccezione attiva da rilanciare" -#: shared-bindings/bitbangio/I2C.c:195 shared-bindings/busio/I2C.c:210 -msgid "Buffer must be at least length 1" -msgstr "Il buffer deve essere lungo almeno 1" +#: shared-bindings/socket/__init__.c shared-module/network/__init__.c +#, fuzzy +msgid "no available NIC" +msgstr "busio.UART non ancora implementato" -#: shared-bindings/bitbangio/SPI.c:151 shared-bindings/busio/SPI.c:175 -msgid "Invalid polarity" -msgstr "Polarità non valida" +#: py/compile.c +msgid "no binding for nonlocal found" +msgstr "nessun binding per nonlocal trovato" -#: shared-bindings/bitbangio/SPI.c:155 shared-bindings/busio/SPI.c:179 -msgid "Invalid phase" -msgstr "Fase non valida" +#: py/builtinimport.c +msgid "no module named '%q'" +msgstr "nessun modulo chiamato '%q'" -#: shared-bindings/bitbangio/SPI.c:159 shared-bindings/busio/SPI.c:183 -msgid "Invalid number of bits" -msgstr "Numero di bit non valido" +#: shared-bindings/_pixelbuf/__init__.c py/runtime.c +msgid "no such attribute" +msgstr "attributo inesistente" -#: shared-bindings/bitbangio/SPI.c:284 shared-bindings/busio/SPI.c:348 -msgid "buffer slices must be of equal length" -msgstr "slice del buffer devono essere della stessa lunghezza" +#: py/compile.c +msgid "non-default argument follows default argument" +msgstr "argomento non predefinito segue argmoento predfinito" -#: shared-bindings/bleio/Address.c:101 -msgid "Wrong address length" -msgstr "" +#: extmod/modubinascii.c +msgid "non-hex digit found" +msgstr "trovata cifra non esadecimale" -#: shared-bindings/bleio/Address.c:107 -#, fuzzy -msgid "Wrong number of bytes provided" -msgstr "numero di argomenti errato" +#: py/compile.c +msgid "non-keyword arg after */**" +msgstr "argomento non nominato dopo */**" -#: shared-bindings/bleio/Device.c:210 -msgid "Can't add services in Central mode" -msgstr "" +#: py/compile.c +msgid "non-keyword arg after keyword arg" +msgstr "argomento non nominato seguito da argomento nominato" -#: shared-bindings/bleio/Device.c:226 -msgid "Can't connect in Peripheral mode" +#: shared-bindings/bleio/UUID.c +msgid "not a 128-bit UUID" msgstr "" -#: shared-bindings/bleio/Device.c:256 -msgid "Can't change the name in Central mode" -msgstr "" +#: ports/esp8266/machine_adc.c +#, c-format +msgid "not a valid ADC Channel: %d" +msgstr "canale ADC non valido: %d" -#: shared-bindings/bleio/Device.c:277 shared-bindings/bleio/Device.c:313 -msgid "Can't advertise in Central mode" +#: py/objstr.c +msgid "not all arguments converted during string formatting" msgstr "" +"non tutti gli argomenti sono stati convertiti durante la formatazione in " +"stringhe" -#: shared-bindings/busio/I2C.c:120 -msgid "Function requires lock." -msgstr "" +#: py/objstr.c +msgid "not enough arguments for format string" +msgstr "argomenti non sufficienti per la stringa di formattazione" -#: shared-bindings/busio/UART.c:106 -msgid "bits must be 7, 8 or 9" -msgstr "i bit devono essere 7, 8 o 9" +#: py/obj.c +#, c-format +msgid "object '%s' is not a tuple or list" +msgstr "oggetto '%s' non è una tupla o una lista" -#: shared-bindings/busio/UART.c:118 -msgid "stop must be 1 or 2" +#: py/obj.c +msgid "object does not support item assignment" msgstr "" -#: shared-bindings/busio/UART.c:123 -msgid "timeout >100 (units are now seconds, not msecs)" +#: py/obj.c +msgid "object does not support item deletion" msgstr "" -#: shared-bindings/digitalio/DigitalInOut.c:211 -msgid "Invalid direction." -msgstr "Direzione non valida." +#: py/obj.c +msgid "object has no len" +msgstr "l'oggetto non ha lunghezza" -#: shared-bindings/digitalio/DigitalInOut.c:240 -msgid "Cannot set value when direction is input." +#: py/obj.c +msgid "object is not subscriptable" msgstr "" -#: shared-bindings/digitalio/DigitalInOut.c:266 -#: shared-bindings/digitalio/DigitalInOut.c:281 -msgid "Drive mode not used when direction is input." -msgstr "" +#: py/runtime.c +msgid "object not an iterator" +msgstr "l'oggetto non è un iteratore" -#: shared-bindings/digitalio/DigitalInOut.c:314 -#: shared-bindings/digitalio/DigitalInOut.c:331 -msgid "Pull not used when direction is output." +#: py/objtype.c py/runtime.c +msgid "object not callable" msgstr "" -#: shared-bindings/digitalio/DigitalInOut.c:340 -msgid "Unsupported pull value." -msgstr "Valore di pull non supportato." +#: py/sequence.c +msgid "object not in sequence" +msgstr "oggetto non in sequenza" -#: shared-bindings/displayio/Bitmap.c:84 -msgid "y should be an int" -msgstr "y dovrebbe essere un int" +#: py/runtime.c +msgid "object not iterable" +msgstr "oggetto non iterabile" -#: shared-bindings/displayio/Bitmap.c:89 -msgid "row buffer must be a bytearray or array of type 'b' or 'B'" -msgstr "buffer di riga deve essere un bytearray o un array di tipo 'b' o 'B'" +#: py/obj.c +#, c-format +msgid "object of type '%s' has no len()" +msgstr "l'oggetto di tipo '%s' non implementa len()" -#: shared-bindings/displayio/Bitmap.c:94 -msgid "row data must be a buffer" -msgstr "valori della riga devono essere un buffer" +#: py/obj.c +msgid "object with buffer protocol required" +msgstr "" -#: shared-bindings/displayio/ColorConverter.c:72 -msgid "color should be an int" -msgstr "il colore deve essere un int" +#: extmod/modubinascii.c +msgid "odd-length string" +msgstr "stringa di lunghezza dispari" -#: shared-bindings/displayio/FourWire.c:55 -#: shared-bindings/displayio/FourWire.c:64 -msgid "displayio is a work in progress" -msgstr "" +#: py/objstrunicode.c py/objstr.c +#, fuzzy +msgid "offset out of bounds" +msgstr "indirizzo fuori limite" -#: shared-bindings/displayio/Group.c:65 -msgid "Group must have size at least 1" -msgstr "Il gruppo deve avere dimensione almeno 1" +#: shared-bindings/nvm/ByteArray.c py/objarray.c py/objtuple.c +#: py/objstrunicode.c py/objstr.c +msgid "only slices with step=1 (aka None) are supported" +msgstr "solo slice con step=1 (aka None) sono supportate" -#: shared-bindings/displayio/Palette.c:96 -msgid "color buffer must be a bytearray or array of type 'b' or 'B'" -msgstr "" -"buffer del colore deve essere un bytearray o un array di tipo 'b' o 'B'" +#: py/modbuiltins.c +msgid "ord expects a character" +msgstr "ord() aspetta un carattere" -#: shared-bindings/displayio/Palette.c:102 -msgid "color buffer must be 3 bytes (RGB) or 4 bytes (RGB + pad byte)" +#: py/modbuiltins.c +#, c-format +msgid "ord() expected a character, but string of length %d found" msgstr "" -"il buffer del colore deve esseer di 3 byte (RGB) o 4 byte (RGB + pad byte)" +"ord() aspettava un carattere, ma ha ricevuto una stringa di lunghezza %d" -#: shared-bindings/displayio/Palette.c:106 -msgid "color must be between 0x000000 and 0xffffff" -msgstr "il colore deve essere compreso tra 0x000000 e 0xffffff" +#: py/objint_mpz.c +msgid "overflow converting long int to machine word" +msgstr "overflow convertendo long int in parola" -#: shared-bindings/displayio/Palette.c:110 -msgid "color buffer must be a buffer or int" -msgstr "il buffer del colore deve essere un buffer o un int" +#: shared-bindings/_stage/Text.c shared-bindings/_stage/Layer.c +msgid "palette must be 32 bytes long" +msgstr "la palette deve essere lunga 32 byte" -#: shared-bindings/displayio/Palette.c:123 -#: shared-bindings/displayio/Palette.c:137 +#: shared-bindings/displayio/Palette.c msgid "palette_index should be an int" msgstr "palette_index deve essere un int" -#: shared-bindings/displayio/Sprite.c:48 -msgid "position must be 2-tuple" -msgstr "position deve essere una 2-tuple" +#: py/compile.c +msgid "parameter annotation must be an identifier" +msgstr "" -#: shared-bindings/displayio/Sprite.c:97 -msgid "unsupported bitmap type" -msgstr "tipo di bitmap non supportato" +#: py/emitinlinextensa.c +msgid "parameters must be registers in sequence a2 to a5" +msgstr "parametri devono essere i registri in sequenza da a2 a a5" + +#: py/emitinlinethumb.c +#, fuzzy +msgid "parameters must be registers in sequence r0 to r3" +msgstr "parametri devono essere i registri in sequenza da a2 a a5" + +#: ports/esp8266/machine_pin.c +msgid "pin does not have IRQ capabilities" +msgstr "il pin non implementa IRQ" + +#: shared-bindings/displayio/Bitmap.c +#, fuzzy +msgid "pixel coordinates out of bounds" +msgstr "indirizzo fuori limite" -#: shared-bindings/displayio/Sprite.c:162 +#: shared-bindings/displayio/Bitmap.c +msgid "pixel value requires too many bits" +msgstr "" + +#: shared-bindings/displayio/TileGrid.c msgid "pixel_shader must be displayio.Palette or displayio.ColorConverter" msgstr "pixel_shader deve essere displayio.Palette o displayio.ColorConverter" -#: shared-bindings/gamepad/GamePad.c:100 -msgid "too many arguments" -msgstr "troppi argomenti" +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +#: ports/nrf/common-hal/pulseio/PulseIn.c +#: ports/esp8266/common-hal/pulseio/PulseIn.c +msgid "pop from an empty PulseIn" +msgstr "pop sun un PulseIn vuoto" -#: shared-bindings/gamepad/GamePad.c:104 -msgid "expected a DigitalInOut" -msgstr "DigitalInOut atteso" +#: py/objset.c +msgid "pop from an empty set" +msgstr "pop da un set vuoto" -#: shared-bindings/i2cslave/I2CSlave.c:98 -msgid "can't convert address to int" -msgstr "impossible convertire indirizzo in int" +#: py/objlist.c +msgid "pop from empty list" +msgstr "pop da una lista vuota" -#: shared-bindings/i2cslave/I2CSlave.c:101 -msgid "address out of bounds" -msgstr "indirizzo fuori limite" +#: py/objdict.c +msgid "popitem(): dictionary is empty" +msgstr "popitem(): il dizionario è vuoto" -#: shared-bindings/i2cslave/I2CSlave.c:107 -msgid "addresses is empty" -msgstr "gli indirizzi sono vuoti" +#: py/objint_mpz.c +msgid "pow() 3rd argument cannot be 0" +msgstr "il terzo argomento di pow() non può essere 0" -#: shared-bindings/microcontroller/Pin.c:89 -#: shared-bindings/neopixel_write/__init__.c:67 -#: shared-bindings/pulseio/PulseOut.c:76 -msgid "Expected a %q" -msgstr "Atteso un %q" +#: py/objint_mpz.c +msgid "pow() with 3 arguments requires integers" +msgstr "pow() con 3 argomenti richiede interi" -#: shared-bindings/microcontroller/Pin.c:100 -msgid "%q in use" -msgstr "%q in uso" +#: extmod/modutimeq.c +msgid "queue overflow" +msgstr "overflow della coda" -#: shared-bindings/microcontroller/__init__.c:126 -msgid "Invalid run mode." -msgstr "Modalità di esecuzione non valida." +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "rawbuf is not the same size as buf" +msgstr "" -#: shared-bindings/multiterminal/__init__.c:68 -msgid "Stream missing readinto() or write() method." -msgstr "Metodi mancanti readinto() o write() allo stream." +#: shared-bindings/_pixelbuf/__init__.c +#, fuzzy +msgid "readonly attribute" +msgstr "attributo non leggibile" -#: shared-bindings/nvm/ByteArray.c:99 -msgid "Slice and value different lengths." -msgstr "" +#: py/builtinimport.c +msgid "relative import" +msgstr "importazione relativa" -#: shared-bindings/nvm/ByteArray.c:104 -msgid "Array values should be single bytes." +#: py/obj.c +#, c-format +msgid "requested length %d but object has length %d" +msgstr "lunghezza %d richiesta ma l'oggetto ha lunghezza %d" + +#: py/compile.c +msgid "return annotation must be an identifier" msgstr "" -#: shared-bindings/nvm/ByteArray.c:111 shared-bindings/nvm/ByteArray.c:141 -msgid "Unable to write to nvm." -msgstr "Imposibile scrivere su nvm." +#: py/emitnative.c +msgid "return expected '%q' but got '%q'" +msgstr "return aspettava '%q' ma ha ottenuto '%q'" -#: shared-bindings/nvm/ByteArray.c:137 -msgid "Bytes must be between 0 and 255." -msgstr "I byte devono essere compresi tra 0 e 255" +#: shared-module/displayio/Bitmap.c +msgid "row must be packed and word aligned" +msgstr "la riga deve essere compattata e allineata alla parola" -#: shared-bindings/os/__init__.c:200 -msgid "No hardware random available" -msgstr "Nessun generatore hardware di numeri casuali disponibile" +#: py/objstr.c +msgid "rsplit(None,n)" +msgstr "" -#: shared-bindings/pulseio/PWMOut.c:164 +#: shared-bindings/audioio/RawSample.c msgid "" -"PWM duty_cycle must be between 0 and 65535 inclusive (16 bit resolution)" +"sample_source buffer must be a bytearray or array of type 'h', 'H', 'b' or " +"'B'" msgstr "" -"duty_cycle del PWM deve essere compresa tra 0 e 65535 inclusiva (risoluzione " -"a 16 bit)" +"il buffer sample_source deve essere un bytearray o un array di tipo 'h', " +"'H', 'b' o 'B'" -#: shared-bindings/pulseio/PWMOut.c:195 -#, fuzzy -msgid "" -"PWM frequency not writable when variable_frequency is False on construction." +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "sampling rate out of range" +msgstr "frequenza di campionamento fuori intervallo" + +#: ports/esp8266/modnetwork.c +msgid "scan failed" +msgstr "scansione fallita" + +#: py/modmicropython.c +msgid "schedule stack full" msgstr "" -"frequenza PWM frequency non è scrivibile quando variable_frequency è " -"impostato nel costruttore a False." -#: shared-bindings/pulseio/PulseIn.c:275 -msgid "Cannot delete values" -msgstr "Impossibile cancellare valori" +#: lib/utils/pyexec.c py/builtinimport.c +msgid "script compilation not supported" +msgstr "compilazione dello scrip non suportata" -#: shared-bindings/pulseio/PulseIn.c:281 -msgid "Slices not supported" -msgstr "Slice non supportate" +#: shared-bindings/bleio/Peripheral.c +msgid "services includes an object that is not a Service" +msgstr "" -#: shared-bindings/pulseio/PulseIn.c:287 -msgid "index must be int" -msgstr "l'indice deve essere int" +#: py/objstr.c +msgid "sign not allowed in string format specifier" +msgstr "segno non permesso nello spcificatore di formato della stringa" -#: shared-bindings/pulseio/PulseIn.c:293 -msgid "Read-only" -msgstr "Sola lettura" +#: py/objstr.c +msgid "sign not allowed with integer format specifier 'c'" +msgstr "segno non permesso nello spcificatore di formato 'c' della stringa" -#: shared-bindings/pulseio/PulseOut.c:135 -msgid "Array must contain halfwords (type 'H')" +#: py/objstr.c +msgid "single '}' encountered in format string" +msgstr "'}' singolo presente nella stringa di formattazione" + +#: shared-bindings/time/__init__.c +msgid "sleep length must be non-negative" +msgstr "la lunghezza di sleed deve essere non negativa" + +#: py/objslice.c py/sequence.c +msgid "slice step cannot be zero" +msgstr "la step della slice non può essere zero" + +#: py/sequence.c py/objint.c +msgid "small int overflow" +msgstr "small int overflow" + +#: main.c +msgid "soft reboot\n" +msgstr "soft reboot\n" + +#: py/objstr.c +msgid "start/end indices" msgstr "" -#: shared-bindings/random/__init__.c:92 shared-bindings/random/__init__.c:100 -msgid "stop not reachable from start" -msgstr "stop non raggiungibile dall'inizio" +#: shared-bindings/displayio/Shape.c +#, fuzzy +msgid "start_x should be an int" +msgstr "y dovrebbe essere un int" -#: shared-bindings/random/__init__.c:111 +#: shared-bindings/random/__init__.c msgid "step must be non-zero" msgstr "step deve essere non zero" -#: shared-bindings/random/__init__.c:114 -msgid "invalid step" -msgstr "step non valida" +#: shared-bindings/busio/UART.c +msgid "stop must be 1 or 2" +msgstr "" -#: shared-bindings/random/__init__.c:146 -msgid "empty sequence" -msgstr "sequenza vuota" +#: shared-bindings/random/__init__.c +msgid "stop not reachable from start" +msgstr "stop non raggiungibile dall'inizio" -#: shared-bindings/rtc/RTC.c:40 shared-bindings/rtc/RTC.c:44 -#: shared-bindings/time/__init__.c:190 -msgid "RTC is not supported on this board" -msgstr "RTC non supportato su questa scheda" +#: py/stream.c +msgid "stream operation not supported" +msgstr "operazione di stream non supportata" -#: shared-bindings/rtc/RTC.c:52 -msgid "RTC calibration is not supported on this board" -msgstr "calibrazione RTC non supportata su questa scheda" +#: py/objstrunicode.c +msgid "string index out of range" +msgstr "indice della stringa fuori intervallo" -#: shared-bindings/socket/__init__.c:516 shared-module/network/__init__.c:81 -#, fuzzy -msgid "no available NIC" -msgstr "busio.UART non ancora implementato" +#: py/objstrunicode.c +#, c-format +msgid "string indices must be integers, not %s" +msgstr "indici della stringa devono essere interi, non %s" -#: shared-bindings/storage/__init__.c:77 -msgid "filesystem must provide mount method" -msgstr "il filesystem deve fornire un metodo di mount" +#: py/stream.c +msgid "string not supported; use bytes or bytearray" +msgstr "" -#: shared-bindings/supervisor/__init__.c:93 -msgid "Brightness must be between 0 and 255" -msgstr "La luminosità deve essere compreso tra 0 e 255" +#: extmod/moductypes.c +msgid "struct: cannot index" +msgstr "struct: impossibile indicizzare" -#: shared-bindings/supervisor/__init__.c:119 -msgid "Stack size must be at least 256" -msgstr "La dimensione dello stack deve essere almeno 256" +#: extmod/moductypes.c +msgid "struct: index out of range" +msgstr "struct: indice fuori intervallo" -#: shared-bindings/time/__init__.c:78 -msgid "sleep length must be non-negative" -msgstr "la lunghezza di sleed deve essere non negativa" +#: extmod/moductypes.c +msgid "struct: no fields" +msgstr "struct: nessun campo" -#: shared-bindings/time/__init__.c:88 -msgid "time.struct_time() takes exactly 1 argument" -msgstr "time.struct_time() prende esattamente un argomento" +#: py/objstr.c +msgid "substring not found" +msgstr "sottostringa non trovata" -#: shared-bindings/time/__init__.c:91 -msgid "time.struct_time() takes a 9-sequence" +#: py/compile.c +msgid "super() can't find self" msgstr "" -#: shared-bindings/time/__init__.c:169 shared-bindings/time/__init__.c:263 -msgid "Tuple or struct_time argument required" -msgstr "Tupla o struct_time richiesto come argomento" - -#: shared-bindings/time/__init__.c:174 shared-bindings/time/__init__.c:268 -msgid "function takes exactly 9 arguments" -msgstr "la funzione prende esattamente 9 argomenti" +#: extmod/modujson.c +msgid "syntax error in JSON" +msgstr "errore di sintassi nel JSON" -#: shared-bindings/time/__init__.c:239 shared-bindings/time/__init__.c:272 -msgid "timestamp out of range for platform time_t" -msgstr "timestamp è fuori intervallo per il time_t della piattaforma" +#: extmod/moductypes.c +msgid "syntax error in uctypes descriptor" +msgstr "errore di sintassi nel descrittore uctypes" -#: shared-bindings/touchio/TouchIn.c:173 +#: shared-bindings/touchio/TouchIn.c msgid "threshold must be in the range 0-65536" msgstr "la soglia deve essere nell'intervallo 0-65536" -#: shared-bindings/util.c:38 -msgid "" -"Object has been deinitialized and can no longer be used. Create a new object." +#: shared-bindings/displayio/TileGrid.c +msgid "tile index out of bounds" msgstr "" -"L'oggetto è stato deinizializzato e non può essere più usato. Crea un nuovo " -"oggetto." -#: shared-module/audioio/Mixer.c:47 shared-module/audioio/WaveFile.c:117 -msgid "Couldn't allocate first buffer" -msgstr "Impossibile allocare il primo buffer" +#: shared-bindings/time/__init__.c +msgid "time.struct_time() takes a 9-sequence" +msgstr "" -#: shared-module/audioio/Mixer.c:53 shared-module/audioio/WaveFile.c:123 -msgid "Couldn't allocate second buffer" -msgstr "Impossibile allocare il secondo buffer" +#: shared-bindings/time/__init__.c +msgid "time.struct_time() takes exactly 1 argument" +msgstr "time.struct_time() prende esattamente un argomento" -#: shared-module/audioio/Mixer.c:82 -msgid "Voice index too high" +#: shared-bindings/busio/UART.c +msgid "timeout >100 (units are now seconds, not msecs)" msgstr "" -#: shared-module/audioio/Mixer.c:85 -msgid "The sample's sample rate does not match the mixer's" -msgstr "" +#: shared-bindings/bleio/CharacteristicBuffer.c +#, fuzzy +msgid "timeout must be >= 0.0" +msgstr "i bit devono essere 8" -#: shared-module/audioio/Mixer.c:88 -msgid "The sample's channel count does not match the mixer's" -msgstr "" +#: shared-bindings/time/__init__.c +msgid "timestamp out of range for platform time_t" +msgstr "timestamp è fuori intervallo per il time_t della piattaforma" -#: shared-module/audioio/Mixer.c:91 -msgid "The sample's bits_per_sample does not match the mixer's" -msgstr "" +#: shared-bindings/gamepad/GamePad.c +msgid "too many arguments" +msgstr "troppi argomenti" -#: shared-module/audioio/Mixer.c:100 -msgid "The sample's signedness does not match the mixer's" -msgstr "" +#: shared-module/struct/__init__.c +msgid "too many arguments provided with the given format" +msgstr "troppi argomenti forniti con il formato specificato" -#: shared-module/audioio/WaveFile.c:61 -msgid "Invalid wave file" -msgstr "File wave non valido" +#: py/runtime.c +#, c-format +msgid "too many values to unpack (expected %d)" +msgstr "troppi valori da scompattare (%d attesi)" -#: shared-module/audioio/WaveFile.c:69 -msgid "Invalid format chunk size" -msgstr "" +#: py/objstr.c +msgid "tuple index out of range" +msgstr "indice della tupla fuori intervallo" -#: shared-module/audioio/WaveFile.c:83 -msgid "Unsupported format" -msgstr "Formato non supportato" +#: py/obj.c +msgid "tuple/list has wrong length" +msgstr "tupla/lista ha la lunghezza sbagliata" -#: shared-module/audioio/WaveFile.c:99 -msgid "Data chunk must follow fmt chunk" +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "tuple/list required on RHS" msgstr "" -#: shared-module/audioio/WaveFile.c:107 -msgid "Invalid file" -msgstr "File non valido" +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "tx and rx cannot both be None" +msgstr "tx e rx non possono essere entrambi None" -#: shared-module/bitbangio/I2C.c:58 -msgid "Clock stretch too long" -msgstr "" +#: py/objtype.c +msgid "type '%q' is not an acceptable base type" +msgstr "il tipo '%q' non è un tipo di base accettabile" -#: shared-module/bitbangio/SPI.c:44 -msgid "Clock pin init failed." -msgstr "Inizializzazione del pin di clock fallita." +#: py/objtype.c +msgid "type is not an acceptable base type" +msgstr "il tipo non è un tipo di base accettabile" -#: shared-module/bitbangio/SPI.c:50 -msgid "MOSI pin init failed." -msgstr "inizializzazione del pin MOSI fallita." +#: py/runtime.c +msgid "type object '%q' has no attribute '%q'" +msgstr "l'oggetto di tipo '%q' non ha l'attributo '%q'" -#: shared-module/bitbangio/SPI.c:61 -msgid "MISO pin init failed." -msgstr "inizializzazione del pin MISO fallita." +#: py/objtype.c +msgid "type takes 1 or 3 arguments" +msgstr "tipo prende 1 o 3 argomenti" -#: shared-module/bitbangio/SPI.c:121 -msgid "Cannot write without MOSI pin." -msgstr "Impossibile scrivere senza pin MOSI." +#: py/objint_longlong.c +msgid "ulonglong too large" +msgstr "ulonglong troppo grande" -#: shared-module/bitbangio/SPI.c:176 -msgid "Cannot read without MISO pin." -msgstr "Impossibile leggere senza pin MISO." +#: py/emitnative.c +msgid "unary op %q not implemented" +msgstr "operazione unaria %q non implementata" -#: shared-module/bitbangio/SPI.c:240 -msgid "Cannot transfer without MOSI and MISO pins." -msgstr "Impossibile trasferire senza i pin MOSI e MISO." +#: py/parse.c +msgid "unexpected indent" +msgstr "indentazione inaspettata" -#: shared-module/displayio/Bitmap.c:49 -msgid "Only bit maps of 8 bit color or less are supported" -msgstr "Sono supportate solo bitmap con colori a 8 bit o meno" +#: py/bc.c +msgid "unexpected keyword argument" +msgstr "argomento nominato inaspettato" -#: shared-module/displayio/Bitmap.c:69 -msgid "row must be packed and word aligned" -msgstr "la riga deve essere compattata e allineata alla parola" +#: py/objnamedtuple.c py/bc.c +msgid "unexpected keyword argument '%q'" +msgstr "argomento nominato '%q' inaspettato" -#: shared-module/displayio/Group.c:39 -msgid "Group full" -msgstr "Gruppo pieno" +#: py/lexer.c +msgid "unicode name escapes" +msgstr "" -#: shared-module/displayio/Group.c:48 -msgid "Group empty" -msgstr "Gruppo vuoto" +#: py/parse.c +msgid "unindent does not match any outer indentation level" +msgstr "" -#: shared-module/displayio/OnDiskBitmap.c:49 -msgid "Invalid BMP file" -msgstr "File BMP non valido" +#: ports/esp8266/modnetwork.c +msgid "unknown config param" +msgstr "parametro di configurazione sconosciuto" -#: shared-module/displayio/OnDiskBitmap.c:59 +#: py/objstr.c #, c-format -msgid "Only Windows format, uncompressed BMP supported %d" -msgstr "Formato solo di Windows, BMP non compresso supportato %d" +msgid "unknown conversion specifier %c" +msgstr "specificatore di conversione %s sconosciuto" -#: shared-module/displayio/OnDiskBitmap.c:64 +#: py/objstr.c #, c-format -msgid "Only true color (24 bpp or higher) BMP supported %x" -msgstr "Solo BMP true color (24 bpp o superiore) sono supportati %x" - -#: shared-module/storage/__init__.c:155 -msgid "Cannot remount '/' when USB is active." -msgstr "Non è possibile rimontare '/' mentre l'USB è attiva." - -#: shared-module/struct/__init__.c:39 -msgid "'S' and 'O' are not supported format types" -msgstr "'S' e 'O' non sono formati supportati" +msgid "unknown format code '%c' for object of type '%s'" +msgstr "codice di formattaione '%c' sconosciuto per oggetto di tipo '%s'" -#: shared-module/struct/__init__.c:83 -msgid "too many arguments provided with the given format" -msgstr "troppi argomenti forniti con il formato specificato" +#: py/objstr.c +#, c-format +msgid "unknown format code '%c' for object of type 'float'" +msgstr "codice di formattazione '%c' sconosciuto per oggetto di tipo 'float'" -#: shared-module/usb_hid/Device.c:45 +#: py/objstr.c #, c-format -msgid "Buffer incorrect size. Should be %d bytes." -msgstr "Buffer di lunghezza non valida. Dovrebbe essere di %d bytes." +msgid "unknown format code '%c' for object of type 'str'" +msgstr "codice di formattazione '%c' sconosciuto per oggetto di tipo 'str'" -#: shared-module/usb_hid/Device.c:53 -msgid "USB Busy" -msgstr "USB occupata" +#: ports/esp8266/modnetwork.c +msgid "unknown status param" +msgstr "prametro di stato sconosciuto" -#: shared-module/usb_hid/Device.c:59 -msgid "USB Error" -msgstr "Errore USB" +#: py/compile.c +msgid "unknown type" +msgstr "tipo sconosciuto" -#: supervisor/shared/safe_mode.c:97 -msgid "You requested starting safe mode by " -msgstr "È stato richiesto l'avvio in modalità sicura da " +#: py/emitnative.c +msgid "unknown type '%q'" +msgstr "tipo '%q' sconosciuto" -#: supervisor/shared/safe_mode.c:100 -msgid "To exit, please reset the board without " -msgstr "Per uscire resettare la scheda senza " +#: py/objstr.c +msgid "unmatched '{' in format" +msgstr "'{' spaiato nella stringa di formattazione" -#: supervisor/shared/safe_mode.c:107 -#, fuzzy -msgid "" -"You are running in safe mode which means something unanticipated happened.\n" -msgstr "" -"Sei nella modalità sicura che significa che qualcosa di molto brutto è " -"successo.\n" +#: py/objtype.c py/runtime.c +msgid "unreadable attribute" +msgstr "attributo non leggibile" -#: supervisor/shared/safe_mode.c:109 -msgid "" -"Looks like our core CircuitPython code crashed hard. Whoops!\n" -"Please file an issue at https://github.com/adafruit/circuitpython/issues\n" -" with the contents of your CIRCUITPY drive and this message:\n" -msgstr "" +#: py/emitinlinethumb.c +#, fuzzy, c-format +msgid "unsupported Thumb instruction '%s' with %d arguments" +msgstr "istruzione '%s' Xtensa non supportata con %d argomenti" -#: supervisor/shared/safe_mode.c:111 -msgid "Crash into the HardFault_Handler.\n" -msgstr "" +#: py/emitinlinextensa.c +#, c-format +msgid "unsupported Xtensa instruction '%s' with %d arguments" +msgstr "istruzione '%s' Xtensa non supportata con %d argomenti" -#: supervisor/shared/safe_mode.c:113 -msgid "MicroPython NLR jump failed. Likely memory corruption.\n" -msgstr "" +#: shared-bindings/displayio/TileGrid.c +msgid "unsupported bitmap type" +msgstr "tipo di bitmap non supportato" -#: supervisor/shared/safe_mode.c:115 -msgid "MicroPython fatal error.\n" -msgstr "" +#: py/objstr.c +#, c-format +msgid "unsupported format character '%c' (0x%x) at index %d" +msgstr "carattere di formattazione '%c' (0x%x) non supportato all indice %d" -#: supervisor/shared/safe_mode.c:118 -#, fuzzy -msgid "" -"The microcontroller's power dipped. Please make sure your power supply " -"provides\n" -"enough power for the whole circuit and press reset (after ejecting " -"CIRCUITPY).\n" -msgstr "" -"La potenza del microcontrollore è calata. Assicurati che l'alimentazione sia " -"attaccata correttamente\n" +#: py/runtime.c +msgid "unsupported type for %q: '%s'" +msgstr "tipo non supportato per %q: '%s'" -#: supervisor/shared/safe_mode.c:120 -msgid "" -"The CircuitPython heap was corrupted because the stack was too small.\n" -"Please increase stack size limits and press reset (after ejecting " -"CIRCUITPY).\n" -"If you didn't change the stack, then file an issue here with the contents of " -"your CIRCUITPY drive:\n" -msgstr "" +#: py/runtime.c +msgid "unsupported type for operator" +msgstr "tipo non supportato per l'operando" -#: supervisor/shared/safe_mode.c:123 -msgid "" -"The reset button was pressed while booting CircuitPython. Press again to " -"exit safe mode.\n" +#: py/runtime.c +msgid "unsupported types for %q: '%s', '%s'" +msgstr "tipi non supportati per %q: '%s', '%s'" + +#: shared-bindings/displayio/Bitmap.c +msgid "value_count must be > 0" msgstr "" -#~ msgid "Invalid Service type" -#~ msgstr "Tipo di servizio non valido" +#: ports/esp8266/modnetwork.c +msgid "wifi_set_ip_info() failed" +msgstr "wifi_set_ip_info() faillito" -#~ msgid "Can not apply advertisement data. status: 0x%02x" -#~ msgstr "Impossible inserire dati advertisement. status: 0x%02x" +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "write_args must be a list, tuple, or None" +msgstr "" -#~ msgid "Cannot apply GAP parameters." -#~ msgstr "Impossibile applicare i parametri GAP." +#: py/objstr.c +msgid "wrong number of arguments" +msgstr "numero di argomenti errato" -#~ msgid "Can not apply device name in the stack." -#~ msgstr "Non è possibile inserire il nome del dipositivo nella lista." +#: py/runtime.c +msgid "wrong number of values to unpack" +msgstr "numero di valori da scompattare non corretto" -#~ msgid "Cannot set PPCP parameters." -#~ msgstr "Impossibile impostare i parametri PPCP." +#: shared-module/displayio/Shape.c +#, fuzzy +msgid "x value out of bounds" +msgstr "indirizzo fuori limite" -#~ msgid "" -#~ "enough power for the whole circuit and press reset (after ejecting " -#~ "CIRCUITPY).\n" -#~ msgstr "" -#~ "abbastanza potenza per l'intero circuito e premere reset (dopo aver " -#~ "espulso CIRCUITPY).\n" +#: shared-bindings/displayio/Shape.c +msgid "y should be an int" +msgstr "y dovrebbe essere un int" -#~ msgid "Can not query for the device address." -#~ msgstr "Non è possibile trovare l'indirizzo del dispositivo." +#: shared-module/displayio/Shape.c +#, fuzzy +msgid "y value out of bounds" +msgstr "indirizzo fuori limite" -#~ msgid "Can not add Characteristic." -#~ msgstr "Non è possibile aggiungere Characteristic." +#: py/objrange.c +msgid "zero step" +msgstr "zero step" -#~ msgid "Can not encode UUID, to check length." -#~ msgstr "Non è possibile codificare l'UUID, lunghezza da controllare." +#, fuzzy +#~ msgid "Failed to notify or indicate attribute value, err %0x04x" +#~ msgstr "Impossibile notificare valore dell'attributo. status: 0x%02x" -#~ msgid "Can encode UUID into the advertisement packet." -#~ msgstr "È possibile codificare l'UUID nel pacchetto di advertisement." +#, fuzzy +#~ msgid "Failed to read attribute value, err %0x04x" +#~ msgstr "Impossibile leggere valore dell'attributo. status: 0x%02x" -#~ msgid "Can not add Service." -#~ msgstr "Non è possibile aggiungere Service." +#~ msgid "Only Windows format, uncompressed BMP supported %d" +#~ msgstr "Formato solo di Windows, BMP non compresso supportato %d" -#~ msgid "" -#~ "Please file an issue here with the contents of your CIRCUITPY drive:\n" -#~ msgstr "" -#~ "Ti preghiamo di compilare una issue con il contenuto del tuo drie " -#~ "CIRCUITPY:\n" +#~ msgid "Only true color (24 bpp or higher) BMP supported %x" +#~ msgstr "Solo BMP true color (24 bpp o superiore) sono supportati %x" -#~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n" -#~ msgstr "" -#~ "Sembra che il codice del core di CircuitPython sia crashato malamente. " -#~ "Whoops!\n" +#~ msgid "position must be 2-tuple" +#~ msgstr "position deve essere una 2-tuple" diff --git a/locale/pt_BR.po b/locale/pt_BR.po index 1b35b4824..587ed00ba 100644 --- a/locale/pt_BR.po +++ b/locale/pt_BR.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-12-26 20:49+0100\n" +"POT-Creation-Date: 2019-03-25 19:40+0100\n" "PO-Revision-Date: 2018-10-02 21:14-0000\n" "Last-Translator: \n" "Language-Team: \n" @@ -17,2572 +17,2857 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: extmod/machine_i2c.c:299 -msgid "invalid I2C peripheral" -msgstr "periférico I2C inválido" +#: main.c +msgid "" +"\n" +"Code done running. Waiting for reload.\n" +msgstr "" -#: extmod/machine_i2c.c:340 extmod/machine_i2c.c:354 extmod/machine_i2c.c:368 -#: extmod/machine_i2c.c:392 -msgid "I2C operation not supported" -msgstr "I2C operação não suportada" +#: py/obj.c +msgid " File \"%q\"" +msgstr " Arquivo \"%q\"" -#: extmod/machine_mem.c:45 ports/unix/modmachine.c:53 -#, c-format -msgid "address %08x is not aligned to %d bytes" -msgstr "endereço %08x não está alinhado com %d bytes" +#: py/obj.c +msgid " File \"%q\", line %d" +msgstr " Arquivo \"%q\", linha %d" -#: extmod/machine_spi.c:57 -msgid "invalid SPI peripheral" -msgstr "periférico SPI inválido" +#: main.c +msgid " output:\n" +msgstr " saída:\n" -#: extmod/machine_spi.c:124 -msgid "buffers must be the same length" -msgstr "buffers devem ser o mesmo tamanho" +#: py/objstr.c +#, c-format +msgid "%%c requires int or char" +msgstr "%%c requer int ou char" -#: extmod/machine_spi.c:207 -msgid "bits must be 8" -msgstr "bits devem ser 8" +#: shared-bindings/microcontroller/Pin.c +msgid "%q in use" +msgstr "%q em uso" -#: extmod/machine_spi.c:210 -msgid "firstbit must be MSB" -msgstr "firstbit devem ser MSB" +#: py/obj.c +msgid "%q index out of range" +msgstr "" -#: extmod/machine_spi.c:215 -msgid "must specify all of sck/mosi/miso" -msgstr "deve especificar todos sck/mosi/miso" +#: py/obj.c +msgid "%q indices must be integers, not %s" +msgstr "" -#: extmod/modframebuf.c:299 -msgid "invalid format" -msgstr "formato inválido" +#: shared-bindings/displayio/Group.c shared-bindings/displayio/Shape.c +#: shared-bindings/bleio/CharacteristicBuffer.c +#, fuzzy +msgid "%q must be >= 1" +msgstr "buffers devem ser o mesmo tamanho" -#: extmod/modubinascii.c:38 extmod/moduhashlib.c:102 -msgid "a bytes-like object is required" -msgstr "" +#: shared-bindings/fontio/BuiltinFont.c +#, fuzzy +msgid "%q should be an int" +msgstr "y deve ser um int" -#: extmod/modubinascii.c:90 -msgid "odd-length string" +#: py/objnamedtuple.c py/bc.c +msgid "%q() takes %d positional arguments but %d were given" msgstr "" -#: extmod/modubinascii.c:101 -msgid "non-hex digit found" +#: py/argcheck.c +msgid "'%q' argument required" +msgstr "'%q' argumento(s) requerido(s)" + +#: py/emitinlinextensa.c py/emitinlinethumb.c +#, c-format +msgid "'%s' expects a label" msgstr "" -#: extmod/modubinascii.c:169 -msgid "incorrect padding" -msgstr "preenchimento incorreto" +#: py/emitinlinextensa.c py/emitinlinethumb.c +#, c-format +msgid "'%s' expects a register" +msgstr "" -#: extmod/moductypes.c:122 -msgid "syntax error in uctypes descriptor" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects a special register" msgstr "" -#: extmod/moductypes.c:219 -msgid "Cannot unambiguously get sizeof scalar" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects an FPU register" msgstr "" -#: extmod/moductypes.c:397 -msgid "struct: no fields" -msgstr "struct: sem campos" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects an address of the form [a, b]" +msgstr "" -#: extmod/moductypes.c:530 -msgid "struct: cannot index" -msgstr "struct: não pode indexar" +#: py/emitinlinextensa.c py/emitinlinethumb.c +#, c-format +msgid "'%s' expects an integer" +msgstr "" -#: extmod/moductypes.c:544 -msgid "struct: index out of range" -msgstr "struct: índice fora do intervalo" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects at most r%d" +msgstr "" -#: extmod/moduheapq.c:38 -msgid "heap must be a list" -msgstr "heap deve ser uma lista" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' expects {r0, r1, ...}" +msgstr "" -#: extmod/moduheapq.c:86 extmod/modutimeq.c:147 extmod/modutimeq.c:172 -msgid "empty heap" -msgstr "heap vazia" +#: py/emitinlinextensa.c +#, c-format +msgid "'%s' integer %d is not within range %d..%d" +msgstr "" -#: extmod/modujson.c:281 -msgid "syntax error in JSON" -msgstr "erro de sintaxe no JSON" +#: py/emitinlinethumb.c +#, c-format +msgid "'%s' integer 0x%x does not fit in mask 0x%x" +msgstr "" -#: extmod/modure.c:161 -msgid "Splitting with sub-captures" +#: py/obj.c +#, c-format +msgid "'%s' object does not support item assignment" msgstr "" -#: extmod/modure.c:207 -msgid "Error in regex" -msgstr "Erro no regex" +#: py/obj.c +#, c-format +msgid "'%s' object does not support item deletion" +msgstr "" -#: extmod/modussl_axtls.c:81 -msgid "invalid key" -msgstr "chave inválida" +#: py/runtime.c +msgid "'%s' object has no attribute '%q'" +msgstr "" -#: extmod/modussl_axtls.c:87 -msgid "invalid cert" -msgstr "certificado inválido" +#: py/runtime.c +#, c-format +msgid "'%s' object is not an iterator" +msgstr "" -#: extmod/modutimeq.c:131 -msgid "queue overflow" -msgstr "estouro de fila" +#: py/objtype.c py/runtime.c +#, c-format +msgid "'%s' object is not callable" +msgstr "" -#: extmod/moduzlib.c:98 -msgid "compression header" +#: py/runtime.c +#, c-format +msgid "'%s' object is not iterable" msgstr "" -#: extmod/uos_dupterm.c:120 -msgid "invalid dupterm index" -msgstr "Índice de dupterm inválido" +#: py/obj.c +#, c-format +msgid "'%s' object is not subscriptable" +msgstr "" -#: extmod/vfs_fat.c:426 py/moduerrno.c:154 -msgid "Read-only filesystem" -msgstr "Sistema de arquivos somente leitura" +#: py/objstr.c +msgid "'=' alignment not allowed in string format specifier" +msgstr "" -#: extmod/vfs_posix_file.c:48 ports/unix/file.c:50 py/objstringio.c:43 -msgid "I/O operation on closed file" -msgstr "Operação I/O no arquivo fechado" +#: shared-module/struct/__init__.c +msgid "'S' and 'O' are not supported format types" +msgstr "'S' e 'O' não são tipos de formato suportados" -#: lib/embed/abort_.c:8 -msgid "abort() called" -msgstr "abort() chamado" +#: py/compile.c +msgid "'align' requires 1 argument" +msgstr "" -#: lib/netutils/netutils.c:83 -msgid "invalid arguments" -msgstr "argumentos inválidos" +#: py/compile.c +msgid "'await' outside function" +msgstr "" -#: lib/utils/pyexec.c:97 py/builtinimport.c:251 -msgid "script compilation not supported" -msgstr "compilação de script não suportada" +#: py/compile.c +msgid "'break' outside loop" +msgstr "" -#: main.c:150 -msgid " output:\n" -msgstr " saída:\n" +#: py/compile.c +msgid "'continue' outside loop" +msgstr "" -#: main.c:164 main.c:237 -msgid "" -"Auto-reload is on. Simply save files over USB to run them or enter REPL to " -"disable.\n" +#: py/compile.c +msgid "'data' requires at least 2 arguments" msgstr "" -#: main.c:166 -msgid "Running in safe mode! Auto-reload is off.\n" -msgstr "Rodando em modo seguro! Atualização automática está desligada.\n" +#: py/compile.c +msgid "'data' requires integer arguments" +msgstr "" -#: main.c:168 main.c:239 -msgid "Auto-reload is off.\n" -msgstr "A atualização automática está desligada.\n" +#: py/compile.c +msgid "'label' requires 1 argument" +msgstr "" -#: main.c:182 -msgid "Running in safe mode! Not running saved code.\n" -msgstr "Rodando em modo seguro! Não está executando o código salvo.\n" +#: py/compile.c +msgid "'return' outside function" +msgstr "" -#: main.c:198 -msgid "WARNING: Your code filename has two extensions\n" -msgstr "AVISO: Seu arquivo de código tem duas extensões\n" +#: py/compile.c +msgid "'yield' outside function" +msgstr "" -#: main.c:244 -msgid "Press any key to enter the REPL. Use CTRL-D to reload." +#: py/compile.c +msgid "*x must be assignment target" msgstr "" -#: main.c:407 -msgid "soft reboot\n" +#: py/obj.c +msgid ", in %q\n" msgstr "" -#: ports/atmel-samd/audio_dma.c:209 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:361 -msgid "All sync event channels in use" +#: py/objcomplex.c +msgid "0.0 to a complex power" msgstr "" -#: ports/atmel-samd/bindings/samd/Clock.c:135 -msgid "calibration is read only" -msgstr "Calibração é somente leitura" +#: py/modbuiltins.c +msgid "3-arg pow() not supported" +msgstr "" -#: ports/atmel-samd/bindings/samd/Clock.c:137 -msgid "calibration is out of range" -msgstr "Calibração está fora do intervalo" +#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c +msgid "A hardware interrupt channel is already in use" +msgstr "Um canal de interrupção de hardware já está em uso" -#: ports/atmel-samd/board_busses.c:59 ports/nrf/board_busses.c:39 -msgid "No default I2C bus" -msgstr "Nenhum barramento I2C padrão" +#: ports/esp8266/modnetwork.c +msgid "AP required" +msgstr "AP requerido" -#: ports/atmel-samd/board_busses.c:85 ports/nrf/board_busses.c:64 -msgid "No default SPI bus" -msgstr "Nenhum barramento SPI padrão" +#: shared-bindings/bleio/Address.c +#, c-format +msgid "Address is not %d bytes long or is in wrong format" +msgstr "" -#: ports/atmel-samd/board_busses.c:112 ports/nrf/board_busses.c:91 -msgid "No default UART bus" -msgstr "Nenhum barramento UART padrão" +#: shared-bindings/bleio/Address.c +#, fuzzy, c-format +msgid "Address must be %d bytes long" +msgstr "buffers devem ser o mesmo tamanho" -#: ports/atmel-samd/common-hal/analogio/AnalogIn.c:63 -#: ports/nrf/common-hal/analogio/AnalogIn.c:39 -msgid "Pin does not have ADC capabilities" -msgstr "O pino não tem recursos de ADC" +#: ports/nrf/common-hal/busio/I2C.c +msgid "All I2C peripherals are in use" +msgstr "Todos os periféricos I2C estão em uso" -#: ports/atmel-samd/common-hal/analogio/AnalogOut.c:49 -msgid "No DAC on chip" -msgstr "Nenhum DAC no chip" +#: ports/nrf/common-hal/busio/SPI.c +msgid "All SPI peripherals are in use" +msgstr "Todos os periféricos SPI estão em uso" -#: ports/atmel-samd/common-hal/analogio/AnalogOut.c:56 -msgid "AnalogOut not supported on given pin" -msgstr "Saída analógica não suportada no pino fornecido" +#: ports/nrf/common-hal/busio/UART.c +#, fuzzy +msgid "All UART peripherals are in use" +msgstr "Todos os periféricos I2C estão em uso" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:147 -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:150 -msgid "Invalid bit clock pin" -msgstr "Pino de bit clock inválido" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "All event channels in use" +msgstr "Todos os canais de eventos em uso" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:153 -msgid "Bit clock and word select must share a clock unit" +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c ports/atmel-samd/audio_dma.c +msgid "All sync event channels in use" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:156 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:130 -msgid "Invalid data pin" -msgstr "Pino de dados inválido" +#: shared-bindings/pulseio/PWMOut.c +msgid "All timers for this pin are in use" +msgstr "Todos os temporizadores para este pino estão em uso" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:169 -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:174 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:145 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:150 -msgid "Serializer in use" -msgstr "Serializer em uso" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/pulseio/PulseOut.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: ports/nrf/common-hal/pulseio/PulseOut.c shared-bindings/pulseio/PWMOut.c +#: shared-module/_pew/PewPew.c +msgid "All timers in use" +msgstr "Todos os temporizadores em uso" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:230 -msgid "Clock unit in use" -msgstr "Unidade de Clock em uso" +#: ports/nrf/common-hal/analogio/AnalogOut.c +msgid "AnalogOut functionality not supported" +msgstr "Funcionalidade AnalogOut não suportada" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:240 -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:172 -msgid "Unable to find free GCLK" -msgstr "Não é possível encontrar GCLK livre" +#: shared-bindings/analogio/AnalogOut.c +msgid "AnalogOut is only 16 bits. Value must be less than 65536." +msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:254 -msgid "Too many channels in sample." -msgstr "Muitos canais na amostra." +#: ports/atmel-samd/common-hal/analogio/AnalogOut.c +msgid "AnalogOut not supported on given pin" +msgstr "Saída analógica não suportada no pino fornecido" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:305 -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:417 -msgid "No DMA channel found" -msgstr "Nenhum canal DMA encontrado" +#: ports/atmel-samd/common-hal/pulseio/PulseOut.c +msgid "Another send is already active" +msgstr "Outro envio já está ativo" -#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c:308 -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:419 -msgid "Unable to allocate buffers for signed conversion" -msgstr "Não é possível alocar buffers para conversão assinada" +#: shared-bindings/pulseio/PulseOut.c +msgid "Array must contain halfwords (type 'H')" +msgstr "Array deve conter meias palavras (tipo 'H')" -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:109 -msgid "Invalid clock pin" -msgstr "Pino do Clock inválido" +#: shared-bindings/nvm/ByteArray.c +msgid "Array values should be single bytes." +msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:134 -msgid "Only 8 or 16 bit mono with " +#: supervisor/shared/safe_mode.c +msgid "Attempted heap allocation when MicroPython VM not running.\n" msgstr "" -#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c:167 -msgid "sampling rate out of range" -msgstr "Taxa de amostragem fora do intervalo" +#: main.c +msgid "Auto-reload is off.\n" +msgstr "A atualização automática está desligada.\n" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:132 -msgid "DAC already in use" -msgstr "DAC em uso" +#: main.c +msgid "" +"Auto-reload is on. Simply save files over USB to run them or enter REPL to " +"disable.\n" +msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:136 -msgid "Right channel unsupported" -msgstr "Canal direito não suportado" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Bit clock and word select must share a clock unit" +msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:139 -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:116 -#: ports/atmel-samd/common-hal/touchio/TouchIn.c:65 -msgid "Invalid pin" -msgstr "Pino inválido" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Bit depth must be multiple of 8." +msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:147 -msgid "Invalid pin for left channel" -msgstr "Pino inválido para canal esquerdo" +#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c +msgid "Both pins must support hardware interrupts" +msgstr "Ambos os pinos devem suportar interrupções de hardware" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:151 -msgid "Invalid pin for right channel" -msgstr "Pino inválido para canal direito" +#: shared-bindings/supervisor/__init__.c +msgid "Brightness must be between 0 and 255" +msgstr "O brilho deve estar entre 0 e 255" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:154 -msgid "Cannot output both channels on the same pin" +#: shared-bindings/displayio/Display.c +msgid "Brightness not adjustable" msgstr "" -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:243 -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:189 -#: ports/atmel-samd/common-hal/pulseio/PulseOut.c:110 -#: ports/nrf/common-hal/pulseio/PulseOut.c:107 -msgid "All timers in use" -msgstr "Todos os temporizadores em uso" - -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:285 -msgid "All event channels in use" -msgstr "Todos os canais de eventos em uso" - -#: ports/atmel-samd/common-hal/audioio/AudioOut.c:375 +#: shared-module/usb_hid/Device.c #, c-format -msgid "Sample rate too high. It must be less than %d" -msgstr "Taxa de amostragem muito alta. Deve ser menor que %d" - -#: ports/atmel-samd/common-hal/busio/I2C.c:71 -msgid "Not enough pins available" -msgstr "Não há pinos suficientes disponíveis" - -#: ports/atmel-samd/common-hal/busio/I2C.c:78 -#: ports/atmel-samd/common-hal/busio/SPI.c:171 -#: ports/atmel-samd/common-hal/busio/UART.c:120 -#: ports/atmel-samd/common-hal/i2cslave/I2CSlave.c:45 -#: ports/nrf/common-hal/busio/I2C.c:82 -msgid "Invalid pins" -msgstr "Pinos inválidos" +msgid "Buffer incorrect size. Should be %d bytes." +msgstr "Buffer de tamanho incorreto. Deve ser %d bytes." -#: ports/atmel-samd/common-hal/busio/I2C.c:101 -msgid "SDA or SCL needs a pull up" -msgstr "SDA ou SCL precisa de um pull up" +#: shared-bindings/bitbangio/I2C.c shared-bindings/busio/I2C.c +msgid "Buffer must be at least length 1" +msgstr "" -#: ports/atmel-samd/common-hal/busio/I2C.c:121 -msgid "Unsupported baudrate" -msgstr "Taxa de transmissão não suportada" +#: ports/atmel-samd/common-hal/displayio/ParallelBus.c +#: ports/nrf/common-hal/displayio/ParallelBus.c +#, fuzzy, c-format +msgid "Bus pin %d is already in use" +msgstr "DAC em uso" -#: ports/atmel-samd/common-hal/busio/UART.c:67 -msgid "bytes > 8 bits not supported" -msgstr "bytes > 8 bits não suportado" +#: shared-bindings/bleio/UUID.c +#, fuzzy +msgid "Byte buffer must be 16 bytes." +msgstr "buffers devem ser o mesmo tamanho" -#: ports/atmel-samd/common-hal/busio/UART.c:73 -#: ports/nrf/common-hal/busio/UART.c:106 -msgid "tx and rx cannot both be None" -msgstr "TX e RX não podem ser ambos" +#: shared-bindings/nvm/ByteArray.c +msgid "Bytes must be between 0 and 255." +msgstr "Os bytes devem estar entre 0 e 255." -#: ports/atmel-samd/common-hal/busio/UART.c:146 -#: ports/nrf/common-hal/busio/UART.c:140 -msgid "Failed to allocate RX buffer" -msgstr "Falha ao alocar buffer RX" +#: ports/esp8266/esp_mphal.c +msgid "C-level assert" +msgstr "" -#: ports/atmel-samd/common-hal/busio/UART.c:154 -msgid "Could not initialize UART" -msgstr "Não foi possível inicializar o UART" +#: shared-bindings/_pixelbuf/PixelBuf.c +#, c-format +msgid "Can not use dotstar with %s" +msgstr "" -#: ports/atmel-samd/common-hal/busio/UART.c:241 -#: ports/nrf/common-hal/busio/UART.c:185 -msgid "No RX pin" -msgstr "Nenhum pino RX" +#: shared-bindings/bleio/Device.c +msgid "Can't add services in Central mode" +msgstr "" -#: ports/atmel-samd/common-hal/busio/UART.c:300 -#: ports/nrf/common-hal/busio/UART.c:220 -msgid "No TX pin" -msgstr "Nenhum pino TX" +#: shared-bindings/bleio/Device.c +msgid "Can't advertise in Central mode" +msgstr "" -#: ports/atmel-samd/common-hal/digitalio/DigitalInOut.c:170 -#: ports/nrf/common-hal/digitalio/DigitalInOut.c:147 -msgid "Cannot get pull while in output mode" +#: shared-bindings/bleio/Device.c +msgid "Can't change the name in Central mode" msgstr "" -#: ports/atmel-samd/common-hal/microcontroller/__init__.c:74 -#: ports/esp8266/common-hal/microcontroller/__init__.c:64 -msgid "Cannot reset into bootloader because no bootloader is present." +#: shared-bindings/bleio/Device.c +msgid "Can't connect in Peripheral mode" msgstr "" -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:120 -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:369 -#: ports/nrf/common-hal/pulseio/PWMOut.c:119 -#: ports/nrf/common-hal/pulseio/PWMOut.c:233 -msgid "Invalid PWM frequency" -msgstr "Frequência PWM inválida" +#: ports/esp8266/modnetwork.c +msgid "Cannot connect to AP" +msgstr "Não é possível conectar-se ao AP" -#: ports/atmel-samd/common-hal/pulseio/PWMOut.c:187 -msgid "All timers for this pin are in use" -msgstr "Todos os temporizadores para este pino estão em uso" +#: shared-bindings/displayio/Bitmap.c shared-bindings/pulseio/PulseIn.c +msgid "Cannot delete values" +msgstr "Não é possível excluir valores" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:110 -msgid "No hardware support on pin" -msgstr "Nenhum suporte de hardware no pino" +#: ports/esp8266/modnetwork.c +msgid "Cannot disconnect from AP" +msgstr "Não é possível desconectar do AP" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:113 -msgid "EXTINT channel already in use" -msgstr "Canal EXTINT em uso" +#: ports/atmel-samd/common-hal/digitalio/DigitalInOut.c +#: ports/nrf/common-hal/digitalio/DigitalInOut.c +msgid "Cannot get pull while in output mode" +msgstr "" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:118 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:86 -#, c-format -msgid "Failed to allocate RX buffer of %d bytes" -msgstr "Falha ao alocar buffer RX de %d bytes" +#: ports/nrf/common-hal/microcontroller/Processor.c +#, fuzzy +msgid "Cannot get temperature" +msgstr "Não pode obter a temperatura. status: 0x%02x" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:205 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:151 -msgid "pop from an empty PulseIn" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Cannot output both channels on the same pin" msgstr "" -#: ports/atmel-samd/common-hal/pulseio/PulseIn.c:237 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:422 -msgid "index out of range" -msgstr "Índice fora do intervalo" +#: shared-module/bitbangio/SPI.c +msgid "Cannot read without MISO pin." +msgstr "Não é possível ler sem o pino MISO." -#: ports/atmel-samd/common-hal/pulseio/PulseOut.c:178 -msgid "Another send is already active" -msgstr "Outro envio já está ativo" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Cannot record to a file" +msgstr "Não é possível gravar em um arquivo" -#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c:38 -msgid "Both pins must support hardware interrupts" -msgstr "Ambos os pinos devem suportar interrupções de hardware" +#: shared-module/storage/__init__.c +msgid "Cannot remount '/' when USB is active." +msgstr "Não é possível remontar '/' enquanto o USB estiver ativo." -#: ports/atmel-samd/common-hal/rotaryio/IncrementalEncoder.c:46 -msgid "A hardware interrupt channel is already in use" -msgstr "Um canal de interrupção de hardware já está em uso" +#: ports/atmel-samd/common-hal/microcontroller/__init__.c +#: ports/esp8266/common-hal/microcontroller/__init__.c +msgid "Cannot reset into bootloader because no bootloader is present." +msgstr "" -#: ports/atmel-samd/common-hal/rtc/RTC.c:101 -msgid "calibration value out of range +/-127" -msgstr "Valor de calibração fora do intervalo +/- 127" +#: ports/esp8266/modnetwork.c +msgid "Cannot set STA config" +msgstr "Não é possível definir a configuração STA" -#: ports/atmel-samd/common-hal/touchio/TouchIn.c:75 -msgid "No free GCLKs" -msgstr "Não há GCLKs livre" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Cannot set value when direction is input." +msgstr "" -#: ports/esp8266/common-hal/analogio/AnalogIn.c:43 -msgid "Pin %q does not have ADC capabilities" -msgstr "Pino %q não tem recursos de ADC" +#: py/objslice.c +msgid "Cannot subclass slice" +msgstr "" -#: ports/esp8266/common-hal/analogio/AnalogOut.c:39 -msgid "No hardware support for analog out." -msgstr "Nenhum suporte de hardware para saída analógica." +#: shared-module/bitbangio/SPI.c +msgid "Cannot transfer without MOSI and MISO pins." +msgstr "Não é possível transferir sem os pinos MOSI e MISO." -#: ports/esp8266/common-hal/busio/SPI.c:72 -msgid "Pins not valid for SPI" -msgstr "Pinos não válidos para SPI" +#: extmod/moductypes.c +msgid "Cannot unambiguously get sizeof scalar" +msgstr "" -#: ports/esp8266/common-hal/busio/UART.c:45 -msgid "Only tx supported on UART1 (GPIO2)." -msgstr "Apenas TX suportado no UART1 (GPIO2)." +#: ports/esp8266/modnetwork.c +msgid "Cannot update i/f status" +msgstr "Não é possível atualizar o status i/f" -#: ports/esp8266/common-hal/busio/UART.c:67 ports/esp8266/machine_uart.c:108 -msgid "invalid data bits" -msgstr "Bits de dados inválidos" +#: shared-module/bitbangio/SPI.c +msgid "Cannot write without MOSI pin." +msgstr "Não é possível ler sem um pino MOSI" -#: ports/esp8266/common-hal/busio/UART.c:91 ports/esp8266/machine_uart.c:144 -msgid "invalid stop bits" -msgstr "Bits de parada inválidos" +#: shared-bindings/bleio/Service.c +msgid "Characteristic UUID doesn't match Service UUID" +msgstr "" -#: ports/esp8266/common-hal/digitalio/DigitalInOut.c:200 -msgid "ESP8266 does not support pull down." -msgstr "ESP8266 não suporta pull down." +#: ports/nrf/common-hal/bleio/Service.c +msgid "Characteristic already in use by another Service." +msgstr "" -#: ports/esp8266/common-hal/digitalio/DigitalInOut.c:210 -msgid "GPIO16 does not support pull up." -msgstr "GPIO16 não suporta pull up." +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "CharacteristicBuffer writing not provided" +msgstr "" -#: ports/esp8266/common-hal/microcontroller/__init__.c:66 -msgid "ESP8226 does not support safe mode." -msgstr "O ESP8226 não suporta o modo de segurança." +#: shared-module/bitbangio/SPI.c +msgid "Clock pin init failed." +msgstr "Inicialização do pino de Clock falhou." -#: ports/esp8266/common-hal/pulseio/PWMOut.c:54 -#: ports/esp8266/common-hal/pulseio/PWMOut.c:113 -#, c-format -msgid "Maximum PWM frequency is %dhz." -msgstr "A frequência máxima PWM é de %dhz." +#: shared-module/bitbangio/I2C.c +msgid "Clock stretch too long" +msgstr "Clock se estendeu por tempo demais" -#: ports/esp8266/common-hal/pulseio/PWMOut.c:57 -#: ports/esp8266/common-hal/pulseio/PWMOut.c:116 -msgid "Minimum PWM frequency is 1hz." -msgstr "A frequência mínima PWM é de 1hz" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Clock unit in use" +msgstr "Unidade de Clock em uso" -#: ports/esp8266/common-hal/pulseio/PWMOut.c:68 -#, c-format -msgid "Multiple PWM frequencies not supported. PWM already set to %dhz." -msgstr "Múltiplas frequências PWM não suportadas. PWM já definido para %dhz." +#: shared-bindings/_pew/PewPew.c +msgid "Column entry must be digitalio.DigitalInOut" +msgstr "" + +#: shared-bindings/displayio/FourWire.c shared-bindings/displayio/ParallelBus.c +#, fuzzy +msgid "Command must be an int between 0 and 255" +msgstr "Os bytes devem estar entre 0 e 255." -#: ports/esp8266/common-hal/pulseio/PWMOut.c:77 ports/esp8266/machine_pwm.c:70 +#: ports/nrf/common-hal/bleio/UUID.c #, c-format -msgid "PWM not supported on pin %d" -msgstr "PWM não suportado no pino %d" +msgid "Could not decode ble_uuid, err 0x%04x" +msgstr "" -#: ports/esp8266/common-hal/pulseio/PulseIn.c:78 -msgid "No PulseIn support for %q" -msgstr "Não há suporte para PulseIn no pino %q" +#: ports/atmel-samd/common-hal/busio/UART.c +msgid "Could not initialize UART" +msgstr "Não foi possível inicializar o UART" -#: ports/esp8266/common-hal/storage/__init__.c:34 -msgid "Unable to remount filesystem" -msgstr "Não é possível remontar o sistema de arquivos" +#: shared-module/audioio/Mixer.c shared-module/audioio/WaveFile.c +msgid "Couldn't allocate first buffer" +msgstr "Não pôde alocar primeiro buffer" -#: ports/esp8266/common-hal/storage/__init__.c:38 -msgid "Use esptool to erase flash and re-upload Python instead" -msgstr "Use o esptool para apagar o flash e recarregar o Python" +#: shared-module/audioio/Mixer.c shared-module/audioio/WaveFile.c +msgid "Couldn't allocate second buffer" +msgstr "Não pôde alocar segundo buffer" -#: ports/esp8266/esp_mphal.c:154 -msgid "C-level assert" +#: supervisor/shared/safe_mode.c +msgid "Crash into the HardFault_Handler.\n" msgstr "" -#: ports/esp8266/machine_adc.c:57 -#, c-format -msgid "not a valid ADC Channel: %d" -msgstr "não é um canal ADC válido: %d" - -#: ports/esp8266/machine_hspi.c:131 ports/esp8266/machine_hspi.c:137 -msgid "impossible baudrate" -msgstr "taxa de transmissão impossível" - -#: ports/esp8266/machine_pin.c:129 -msgid "expecting a pin" -msgstr "esperando um pino" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "DAC already in use" +msgstr "DAC em uso" -#: ports/esp8266/machine_pin.c:284 -msgid "Pin(16) doesn't support pull" -msgstr "Pino (16) não suporta pull" +#: ports/atmel-samd/common-hal/displayio/ParallelBus.c +#: ports/nrf/common-hal/displayio/ParallelBus.c +msgid "Data 0 pin must be byte aligned" +msgstr "" -#: ports/esp8266/machine_pin.c:323 -msgid "invalid pin" -msgstr "Pino inválido" +#: shared-module/audioio/WaveFile.c +msgid "Data chunk must follow fmt chunk" +msgstr "Pedaço de dados deve seguir o pedaço de cortes" -#: ports/esp8266/machine_pin.c:389 -msgid "pin does not have IRQ capabilities" -msgstr "Pino não tem recursos de IRQ" +#: ports/nrf/common-hal/bleio/Broadcaster.c +#: ports/nrf/common-hal/bleio/Peripheral.c +#, fuzzy +msgid "Data too large for advertisement packet" +msgstr "Não é possível ajustar dados no pacote de anúncios." -#: ports/esp8266/machine_rtc.c:185 -msgid "buffer too long" -msgstr "buffer muito longo" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Data too large for the advertisement packet" +msgstr "Não é possível ajustar dados no pacote de anúncios." -#: ports/esp8266/machine_rtc.c:209 ports/esp8266/machine_rtc.c:223 -#: ports/esp8266/machine_rtc.c:246 -msgid "invalid alarm" -msgstr "Alarme inválido" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Destination capacity is smaller than destination_length." +msgstr "" -#: ports/esp8266/machine_uart.c:169 -#, c-format -msgid "UART(%d) does not exist" -msgstr "UART(%d) não existe" +#: shared-bindings/displayio/Display.c +msgid "Display rotation must be in 90 degree increments" +msgstr "" -#: ports/esp8266/machine_uart.c:219 -msgid "UART(1) can't read" -msgstr "UART(1) não pode ler" +#: ports/unix/modffi.c +msgid "Don't know how to pass object to native function" +msgstr "Não sabe como passar o objeto para a função nativa" -#: ports/esp8266/modesp.c:119 -msgid "len must be multiple of 4" -msgstr "len deve ser múltiplo de 4" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Drive mode not used when direction is input." +msgstr "" -#: ports/esp8266/modesp.c:274 -#, c-format -msgid "memory allocation failed, allocating %u bytes for native code" -msgstr "alocação de memória falhou, alocando %u bytes para código nativo" +#: ports/esp8266/common-hal/microcontroller/__init__.c +msgid "ESP8226 does not support safe mode." +msgstr "O ESP8226 não suporta o modo de segurança." -#: ports/esp8266/modesp.c:317 -msgid "flash location must be below 1MByte" -msgstr "o local do flash deve estar abaixo de 1 MByte" +#: ports/esp8266/common-hal/digitalio/DigitalInOut.c +msgid "ESP8266 does not support pull down." +msgstr "ESP8266 não suporta pull down." -#: ports/esp8266/modmachine.c:63 -msgid "frequency can only be either 80Mhz or 160MHz" -msgstr "A frequência só pode ser 80Mhz ou 160MHz" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +msgid "EXTINT channel already in use" +msgstr "Canal EXTINT em uso" -#: ports/esp8266/modnetwork.c:61 -msgid "AP required" -msgstr "AP requerido" +#: ports/unix/modffi.c +msgid "Error in ffi_prep_cif" +msgstr "Erro no ffi_prep_cif" -#: ports/esp8266/modnetwork.c:61 -msgid "STA required" -msgstr "STA requerido" +#: extmod/modure.c +msgid "Error in regex" +msgstr "Erro no regex" -#: ports/esp8266/modnetwork.c:87 -msgid "Cannot update i/f status" -msgstr "Não é possível atualizar o status i/f" +#: shared-bindings/pulseio/PulseOut.c shared-bindings/neopixel_write/__init__.c +#: shared-bindings/terminalio/Terminal.c shared-bindings/microcontroller/Pin.c +msgid "Expected a %q" +msgstr "Esperado um" -#: ports/esp8266/modnetwork.c:142 -msgid "Cannot set STA config" -msgstr "Não é possível definir a configuração STA" +#: shared-bindings/bleio/CharacteristicBuffer.c +#, fuzzy +msgid "Expected a Characteristic" +msgstr "Não é possível adicionar Característica." -#: ports/esp8266/modnetwork.c:144 -msgid "Cannot connect to AP" -msgstr "Não é possível conectar-se ao AP" +#: shared-bindings/bleio/Descriptor.c shared-bindings/bleio/Service.c +#: shared-bindings/bleio/Characteristic.c +#, fuzzy +msgid "Expected a UUID" +msgstr "Esperado um" -#: ports/esp8266/modnetwork.c:152 -msgid "Cannot disconnect from AP" -msgstr "Não é possível desconectar do AP" +#: shared-module/_pixelbuf/PixelBuf.c +#, c-format +msgid "Expected tuple of length %d, got %d" +msgstr "" -#: ports/esp8266/modnetwork.c:173 -msgid "unknown status param" -msgstr "parâmetro de status desconhecido" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to acquire mutex" +msgstr "Falha ao alocar buffer RX" -#: ports/esp8266/modnetwork.c:222 -msgid "STA must be active" -msgstr "STA deve estar ativo" +#: ports/nrf/common-hal/bleio/Characteristic.c ports/nrf/sd_mutex.c +#, fuzzy, c-format +msgid "Failed to acquire mutex, err 0x%04x" +msgstr "Não é possível ler o valor do atributo. status: 0x%02x" -#: ports/esp8266/modnetwork.c:239 -msgid "scan failed" -msgstr "varredura falhou" +#: ports/nrf/common-hal/bleio/Service.c +#, fuzzy, c-format +msgid "Failed to add characteristic, err 0x%04x" +msgstr "Não pode parar propaganda. status: 0x%02x" -#: ports/esp8266/modnetwork.c:306 -msgid "wifi_set_ip_info() failed" -msgstr "wifi_set_ip_info() falhou" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to add service" +msgstr "Não pode parar propaganda. status: 0x%02x" -#: ports/esp8266/modnetwork.c:319 -msgid "either pos or kw args are allowed" -msgstr "pos ou kw args são permitidos" +#: ports/nrf/common-hal/bleio/Peripheral.c +#, fuzzy, c-format +msgid "Failed to add service, err 0x%04x" +msgstr "Não pode parar propaganda. status: 0x%02x" -#: ports/esp8266/modnetwork.c:329 -msgid "can't get STA config" -msgstr "não pode obter a configuração STA" +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "Failed to allocate RX buffer" +msgstr "Falha ao alocar buffer RX" -#: ports/esp8266/modnetwork.c:331 -msgid "can't get AP config" -msgstr "não pode obter configuração de AP" +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +#: ports/nrf/common-hal/pulseio/PulseIn.c +#: ports/esp8266/common-hal/pulseio/PulseIn.c +#, c-format +msgid "Failed to allocate RX buffer of %d bytes" +msgstr "Falha ao alocar buffer RX de %d bytes" -#: ports/esp8266/modnetwork.c:346 -msgid "invalid buffer length" -msgstr "comprimento de buffer inválido" +#: ports/nrf/common-hal/bleio/Adapter.c +#, fuzzy +msgid "Failed to change softdevice state" +msgstr "Não pode parar propaganda. status: 0x%02x" -#: ports/esp8266/modnetwork.c:405 -msgid "can't set STA config" -msgstr "não é possível definir a configuração STA" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to connect:" +msgstr "" -#: ports/esp8266/modnetwork.c:407 -msgid "can't set AP config" -msgstr "não é possível definir a configuração do AP" +#: ports/nrf/common-hal/bleio/Device.c +msgid "Failed to continue scanning" +msgstr "" -#: ports/esp8266/modnetwork.c:416 -msgid "can query only one param" -msgstr "pode consultar apenas um parâmetro" +#: ports/nrf/common-hal/bleio/Scanner.c +#, fuzzy, c-format +msgid "Failed to continue scanning, err 0x%04x" +msgstr "Não é possível iniciar o anúncio. status: 0x%02x" -#: ports/esp8266/modnetwork.c:469 -msgid "unknown config param" -msgstr "parâmetro configuração desconhecido" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to create mutex" +msgstr "Não é possível ler o valor do atributo. status: 0x%02x" -#: ports/nrf/common-hal/analogio/AnalogOut.c:37 -msgid "AnalogOut functionality not supported" -msgstr "Funcionalidade AnalogOut não suportada" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to discover services" +msgstr "Não pode parar propaganda. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Adapter.c:41 -#, c-format -msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX" +#: ports/nrf/common-hal/bleio/Adapter.c +msgid "Failed to get local address" msgstr "" -#: ports/nrf/common-hal/bleio/Adapter.c:125 -#, c-format -msgid "Failed to change softdevice state, error: 0x%08lX" -msgstr "" +#: ports/nrf/common-hal/bleio/Adapter.c +#, fuzzy +msgid "Failed to get softdevice state" +msgstr "Não pode parar propaganda. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Adapter.c:135 +#: ports/nrf/common-hal/bleio/Characteristic.c #, c-format -msgid "Failed to get softdevice state, error: 0x%08lX" +msgid "Failed to notify or indicate attribute value, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Adapter.c:155 +#: ports/nrf/common-hal/bleio/Characteristic.c +#, fuzzy, c-format +msgid "Failed to read CCCD value, err 0x%04x" +msgstr "Não é possível ler o valor do atributo. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Characteristic.c #, c-format -msgid "Failed to get local address, error: 0x%08lX" +msgid "Failed to read attribute value, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:52 +#: ports/nrf/common-hal/bleio/Characteristic.c #, fuzzy, c-format -msgid "Failed to write gatts value, status: 0x%08lX" +msgid "Failed to read gatts value, err 0x%04x" msgstr "Não é possível gravar o valor do atributo. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Characteristic.c:76 +#: ports/nrf/common-hal/bleio/UUID.c #, fuzzy, c-format -msgid "Failed to notify attribute value, status: 0x%08lX" -msgstr "Não é possível gravar o valor do atributo. status: 0x%02x" +msgid "Failed to register Vendor-Specific UUID, err 0x%04x" +msgstr "Não é possível adicionar o UUID de 128 bits específico do fornecedor." -#: ports/nrf/common-hal/bleio/Characteristic.c:91 +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to release mutex" +msgstr "Não é possível ler o valor do atributo. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Characteristic.c ports/nrf/sd_mutex.c #, fuzzy, c-format -msgid "Failed to read attribute value, status: 0x%08lX" +msgid "Failed to release mutex, err 0x%04x" msgstr "Não é possível ler o valor do atributo. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Characteristic.c:119 -#: ports/nrf/common-hal/bleio/Device.c:272 -#: ports/nrf/common-hal/bleio/Device.c:307 -#, c-format -msgid "Failed to acquire mutex, status: 0x%08lX" -msgstr "" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to start advertising" +msgstr "Não é possível iniciar o anúncio. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Characteristic.c:126 +#: ports/nrf/common-hal/bleio/Broadcaster.c +#: ports/nrf/common-hal/bleio/Peripheral.c #, fuzzy, c-format -msgid "Failed to write attribute value, status: 0x%08lX" -msgstr "Não é possível gravar o valor do atributo. status: 0x%02x" +msgid "Failed to start advertising, err 0x%04x" +msgstr "Não é possível iniciar o anúncio. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Characteristic.c:138 -#: ports/nrf/common-hal/bleio/Device.c:284 -#: ports/nrf/common-hal/bleio/Device.c:319 -#: ports/nrf/common-hal/bleio/Device.c:354 -#: ports/nrf/common-hal/bleio/Device.c:391 -#, c-format -msgid "Failed to release mutex, status: 0x%08lX" -msgstr "" +#: ports/nrf/common-hal/bleio/Device.c +#, fuzzy +msgid "Failed to start scanning" +msgstr "Não é possível iniciar o anúncio. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Scanner.c +#, fuzzy, c-format +msgid "Failed to start scanning, err 0x%04x" +msgstr "Não é possível iniciar o anúncio. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Device.c:81 -#: ports/nrf/common-hal/bleio/Device.c:114 +#: ports/nrf/common-hal/bleio/Device.c #, fuzzy -msgid "Can not fit data into the advertisment packet" -msgstr "Não é possível ajustar dados no pacote de anúncios." +msgid "Failed to stop advertising" +msgstr "Não pode parar propaganda. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Device.c:266 -#, c-format -msgid "Failed to discover serivices, status: 0x%08lX" +#: ports/nrf/common-hal/bleio/Broadcaster.c +#: ports/nrf/common-hal/bleio/Peripheral.c +#, fuzzy, c-format +msgid "Failed to stop advertising, err 0x%04x" +msgstr "Não pode parar propaganda. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Characteristic.c +#, fuzzy, c-format +msgid "Failed to write attribute value, err 0x%04x" +msgstr "Não é possível gravar o valor do atributo. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Characteristic.c +#, fuzzy, c-format +msgid "Failed to write gatts value, err 0x%04x" +msgstr "Não é possível gravar o valor do atributo. status: 0x%02x" + +#: py/moduerrno.c +msgid "File exists" +msgstr "Arquivo já existe" + +#: ports/nrf/supervisor/internal_flash.c +msgid "Flash erase failed" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:403 -#: ports/nrf/common-hal/bleio/Scanner.c:76 +#: ports/nrf/supervisor/internal_flash.c #, c-format -msgid "Failed to continue scanning, status: 0x%0xlX" +msgid "Flash erase failed to start, err 0x%04x" +msgstr "" + +#: ports/nrf/supervisor/internal_flash.c +msgid "Flash write failed" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:436 +#: ports/nrf/supervisor/internal_flash.c #, c-format -msgid "Failed to connect, status: 0x%08lX" +msgid "Flash write failed to start, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:513 -#, fuzzy, c-format -msgid "Failed to add service, status: 0x%08lX" -msgstr "Não pode parar propaganda. status: 0x%02x" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +msgid "Frequency captured is above capability. Capture Paused." +msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:531 -#, fuzzy, c-format -msgid "Failed to start advertisment, status: 0x%08lX" -msgstr "Não é possível iniciar o anúncio. status: 0x%02x" +#: shared-bindings/bitbangio/SPI.c shared-bindings/bitbangio/I2C.c +#: shared-bindings/busio/SPI.c shared-bindings/busio/I2C.c +msgid "Function requires lock" +msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:549 -#, fuzzy, c-format -msgid "Failed to stop advertisment, status: 0x%08lX" -msgstr "Não pode parar propaganda. status: 0x%02x" +#: ports/esp8266/common-hal/digitalio/DigitalInOut.c +msgid "GPIO16 does not support pull up." +msgstr "GPIO16 não suporta pull up." -#: ports/nrf/common-hal/bleio/Device.c:575 -#: ports/nrf/common-hal/bleio/Scanner.c:103 -#, fuzzy, c-format -msgid "Failed to start scanning, status: 0x%0xlX" -msgstr "Não é possível iniciar o anúncio. status: 0x%02x" +#: shared-module/displayio/Group.c +msgid "Group full" +msgstr "Grupo cheio" -#: ports/nrf/common-hal/bleio/Device.c:592 -#, fuzzy, c-format -msgid "Failed to create mutex, status: 0x%0xlX" -msgstr "Não é possível ler o valor do atributo. status: 0x%02x" +#: ports/unix/file.c extmod/vfs_posix_file.c py/objstringio.c +msgid "I/O operation on closed file" +msgstr "Operação I/O no arquivo fechado" -#: ports/nrf/common-hal/bleio/Service.c:83 -#, c-format -msgid "Failed to add characteristic, status: 0x%08lX" +#: extmod/machine_i2c.c +msgid "I2C operation not supported" +msgstr "I2C operação não suportada" + +#: py/persistentcode.c +msgid "" +"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/" +"mpy-update for more info." msgstr "" -#: ports/nrf/common-hal/bleio/UUID.c:97 -#, fuzzy, c-format -msgid "Failed to add Vendor Specific UUID, status: 0x%08lX" -msgstr "Não é possível adicionar o UUID de 128 bits específico do fornecedor." +#: shared-bindings/_pew/PewPew.c +msgid "Incorrect buffer size" +msgstr "" -#: ports/nrf/common-hal/bleio/UUID.c:102 -msgid "Invalid UUID string length" +#: py/moduerrno.c +msgid "Input/output error" msgstr "" -#: ports/nrf/common-hal/bleio/UUID.c:109 -#: shared-bindings/bleio/Characteristic.c:125 -#: shared-bindings/bleio/Service.c:105 -msgid "Invalid UUID parameter" -msgstr "Parâmetro UUID inválido" +#: shared-module/displayio/OnDiskBitmap.c +msgid "Invalid BMP file" +msgstr "Arquivo BMP inválido" -#: ports/nrf/common-hal/busio/I2C.c:96 -msgid "All I2C peripherals are in use" -msgstr "Todos os periféricos I2C estão em uso" +#: ports/atmel-samd/common-hal/pulseio/PWMOut.c +#: ports/nrf/common-hal/pulseio/PWMOut.c shared-bindings/pulseio/PWMOut.c +msgid "Invalid PWM frequency" +msgstr "Frequência PWM inválida" -#: ports/nrf/common-hal/busio/SPI.c:133 -msgid "All SPI peripherals are in use" -msgstr "Todos os periféricos SPI estão em uso" +#: py/moduerrno.c +msgid "Invalid argument" +msgstr "Argumento inválido" -#: ports/nrf/common-hal/busio/UART.c:49 -#, c-format -msgid "error = 0x%08lX" -msgstr "erro = 0x%08lX" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Invalid bit clock pin" +msgstr "Pino de bit clock inválido" -#: ports/nrf/common-hal/busio/UART.c:110 +#: ports/nrf/common-hal/busio/UART.c #, fuzzy msgid "Invalid buffer size" msgstr "Arquivo inválido" -#: ports/nrf/common-hal/busio/UART.c:114 +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +msgid "Invalid capture period. Valid range: 1 - 500" +msgstr "" + +#: shared-bindings/audioio/Mixer.c #, fuzzy -msgid "Odd parity is not supported" -msgstr "I2C operação não suportada" +msgid "Invalid channel count" +msgstr "certificado inválido" -#: ports/nrf/common-hal/busio/UART.c:346 ports/nrf/common-hal/busio/UART.c:350 -#: ports/nrf/common-hal/busio/UART.c:355 ports/nrf/common-hal/busio/UART.c:360 -#: ports/nrf/common-hal/busio/UART.c:366 ports/nrf/common-hal/busio/UART.c:371 -#: ports/nrf/common-hal/busio/UART.c:376 ports/nrf/common-hal/busio/UART.c:380 -#: ports/nrf/common-hal/busio/UART.c:388 -msgid "busio.UART not available" -msgstr "busio.UART não disponível" +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Invalid clock pin" +msgstr "Pino do Clock inválido" -#: ports/nrf/common-hal/microcontroller/Processor.c:49 -#, c-format -msgid "Can not get temperature. status: 0x%02x" -msgstr "Não pode obter a temperatura. status: 0x%02x" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Invalid data pin" +msgstr "Pino de dados inválido" -#: ports/nrf/common-hal/pulseio/PWMOut.c:161 -#, fuzzy -msgid "All PWM peripherals are in use" -msgstr "Todos os temporizadores em uso" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Invalid direction." +msgstr "Direção inválida" -#: ports/unix/modffi.c:138 -msgid "Unknown type" -msgstr "Tipo desconhecido" +#: shared-module/audioio/WaveFile.c +msgid "Invalid file" +msgstr "Arquivo inválido" -#: ports/unix/modffi.c:207 ports/unix/modffi.c:265 -msgid "Error in ffi_prep_cif" -msgstr "Erro no ffi_prep_cif" +#: shared-module/audioio/WaveFile.c +msgid "Invalid format chunk size" +msgstr "Tamanho do pedaço de formato inválido" -#: ports/unix/modffi.c:270 -msgid "ffi_prep_closure_loc" -msgstr "ffi_prep_closure_loc" +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "Invalid number of bits" +msgstr "Número inválido de bits" -#: ports/unix/modffi.c:413 -msgid "Don't know how to pass object to native function" -msgstr "Não sabe como passar o objeto para a função nativa" +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "Invalid phase" +msgstr "Fase Inválida" -#: ports/unix/modusocket.c:474 -#, c-format -msgid "[addrinfo error %d]" -msgstr "" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#: ports/atmel-samd/common-hal/touchio/TouchIn.c +#: shared-bindings/pulseio/PWMOut.c +msgid "Invalid pin" +msgstr "Pino inválido" -#: py/argcheck.c:44 -msgid "function does not take keyword arguments" -msgstr "função não aceita argumentos de palavras-chave" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Invalid pin for left channel" +msgstr "Pino inválido para canal esquerdo" -#: py/argcheck.c:54 py/bc.c:85 py/objnamedtuple.c:104 -#, c-format -msgid "function takes %d positional arguments but %d were given" -msgstr "função leva %d argumentos posicionais, mas apenas %d foram passadas" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Invalid pin for right channel" +msgstr "Pino inválido para canal direito" -#: py/argcheck.c:64 -#, c-format -msgid "function missing %d required positional arguments" -msgstr "função ausente %d requer argumentos posicionais" +#: ports/atmel-samd/common-hal/i2cslave/I2CSlave.c +#: ports/atmel-samd/common-hal/busio/UART.c +#: ports/atmel-samd/common-hal/busio/SPI.c +#: ports/atmel-samd/common-hal/busio/I2C.c ports/nrf/common-hal/busio/I2C.c +msgid "Invalid pins" +msgstr "Pinos inválidos" -#: py/argcheck.c:72 -#, c-format -msgid "function expected at most %d arguments, got %d" -msgstr "função esperada na maioria dos %d argumentos, obteve %d" +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "Invalid polarity" +msgstr "" -#: py/argcheck.c:97 -msgid "'%q' argument required" -msgstr "'%q' argumento(s) requerido(s)" +#: shared-bindings/microcontroller/__init__.c +msgid "Invalid run mode." +msgstr "" -#: py/argcheck.c:122 -msgid "extra positional arguments given" -msgstr "argumentos extra posicionais passados" +#: shared-bindings/audioio/Mixer.c +#, fuzzy +msgid "Invalid voice count" +msgstr "certificado inválido" -#: py/argcheck.c:130 -msgid "extra keyword arguments given" -msgstr "argumentos extras de palavras-chave passados" +#: shared-module/audioio/WaveFile.c +msgid "Invalid wave file" +msgstr "Aqruivo de ondas inválido" -#: py/argcheck.c:142 -msgid "argument num/types mismatch" +#: py/compile.c +msgid "LHS of keyword arg must be an id" msgstr "" -#: py/argcheck.c:147 -msgid "keyword argument(s) not yet implemented - use normal args instead" +#: shared-module/displayio/Group.c +msgid "Layer must be a Group or TileGrid subclass." msgstr "" -#: py/bc.c:88 py/objnamedtuple.c:108 -msgid "%q() takes %d positional arguments but %d were given" -msgstr "" +#: py/objslice.c +msgid "Length must be an int" +msgstr "Tamanho deve ser um int" -#: py/bc.c:197 py/bc.c:215 -msgid "unexpected keyword argument" +#: py/objslice.c +msgid "Length must be non-negative" msgstr "" -#: py/bc.c:199 -msgid "keywords must be strings" +#: supervisor/shared/safe_mode.c +msgid "" +"Looks like our core CircuitPython code crashed hard. Whoops!\n" +"Please file an issue at https://github.com/adafruit/circuitpython/issues\n" +" with the contents of your CIRCUITPY drive and this message:\n" msgstr "" -#: py/bc.c:206 py/objnamedtuple.c:138 -msgid "function got multiple values for argument '%q'" -msgstr "" +#: shared-module/bitbangio/SPI.c +msgid "MISO pin init failed." +msgstr "Inicialização do pino MISO falhou" -#: py/bc.c:218 py/objnamedtuple.c:130 -msgid "unexpected keyword argument '%q'" -msgstr "" +#: shared-module/bitbangio/SPI.c +msgid "MOSI pin init failed." +msgstr "Inicialização do pino MOSI falhou." -#: py/bc.c:244 +#: ports/esp8266/common-hal/pulseio/PWMOut.c #, c-format -msgid "function missing required positional argument #%d" -msgstr "" +msgid "Maximum PWM frequency is %dhz." +msgstr "A frequência máxima PWM é de %dhz." -#: py/bc.c:260 -msgid "function missing required keyword argument '%q'" +#: shared-module/displayio/Shape.c +#, c-format +msgid "Maximum x value when mirrored is %d" msgstr "" -#: py/bc.c:269 -msgid "function missing keyword-only argument" +#: supervisor/shared/safe_mode.c +msgid "MicroPython NLR jump failed. Likely memory corruption.\n" msgstr "" -#: py/binary.c:112 -msgid "bad typecode" +#: supervisor/shared/safe_mode.c +msgid "MicroPython fatal error.\n" msgstr "" -#: py/builtinevex.c:99 -msgid "bad compile mode" +#: shared-bindings/audiobusio/PDMIn.c +msgid "Microphone startup delay must be in range 0.0 to 1.0" msgstr "" -#: py/builtinhelp.c:137 -#, fuzzy -msgid "Plus any modules on the filesystem\n" -msgstr "Não é possível remontar o sistema de arquivos" +#: ports/esp8266/common-hal/pulseio/PWMOut.c +msgid "Minimum PWM frequency is 1hz." +msgstr "A frequência mínima PWM é de 1hz" -#: py/builtinhelp.c:183 +#: ports/esp8266/common-hal/pulseio/PWMOut.c #, c-format -msgid "" -"Welcome to Adafruit CircuitPython %s!\n" -"\n" -"Please visit learn.adafruit.com/category/circuitpython for project guides.\n" -"\n" -"To list built-in modules please do `help(\"modules\")`.\n" -msgstr "" +msgid "Multiple PWM frequencies not supported. PWM already set to %dhz." +msgstr "Múltiplas frequências PWM não suportadas. PWM já definido para %dhz." -#: py/builtinimport.c:336 -msgid "cannot perform relative import" +#: shared-bindings/displayio/Display.c +msgid "Must be a Group subclass." msgstr "" -#: py/builtinimport.c:420 py/builtinimport.c:532 -msgid "module not found" -msgstr "" +#: ports/atmel-samd/common-hal/analogio/AnalogOut.c +msgid "No DAC on chip" +msgstr "Nenhum DAC no chip" -#: py/builtinimport.c:423 py/builtinimport.c:535 -msgid "no module named '%q'" -msgstr "" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "No DMA channel found" +msgstr "Nenhum canal DMA encontrado" -#: py/builtinimport.c:510 -msgid "relative import" -msgstr "" +#: ports/esp8266/common-hal/pulseio/PulseIn.c +msgid "No PulseIn support for %q" +msgstr "Não há suporte para PulseIn no pino %q" -#: py/compile.c:397 py/compile.c:542 -msgid "can't assign to expression" -msgstr "" +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "No RX pin" +msgstr "Nenhum pino RX" -#: py/compile.c:416 -msgid "multiple *x in assignment" -msgstr "" +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "No TX pin" +msgstr "Nenhum pino TX" -#: py/compile.c:642 -msgid "non-default argument follows default argument" +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +msgid "No available clocks" msgstr "" -#: py/compile.c:771 py/compile.c:789 -msgid "invalid micropython decorator" -msgstr "" +#: supervisor/shared/board_busses.c +msgid "No default I2C bus" +msgstr "Nenhum barramento I2C padrão" -#: py/compile.c:943 -msgid "can't delete expression" -msgstr "" +#: supervisor/shared/board_busses.c +msgid "No default SPI bus" +msgstr "Nenhum barramento SPI padrão" -#: py/compile.c:955 -msgid "'break' outside loop" -msgstr "" +#: supervisor/shared/board_busses.c +msgid "No default UART bus" +msgstr "Nenhum barramento UART padrão" -#: py/compile.c:958 -msgid "'continue' outside loop" +#: ports/atmel-samd/common-hal/touchio/TouchIn.c +msgid "No free GCLKs" +msgstr "Não há GCLKs livre" + +#: shared-bindings/os/__init__.c +msgid "No hardware random available" msgstr "" -#: py/compile.c:969 -msgid "'return' outside function" +#: ports/esp8266/common-hal/analogio/AnalogOut.c +msgid "No hardware support for analog out." +msgstr "Nenhum suporte de hardware para saída analógica." + +#: ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +msgid "No hardware support on pin" +msgstr "Nenhum suporte de hardware no pino" + +#: py/moduerrno.c +msgid "No space left on device" msgstr "" -#: py/compile.c:1169 -msgid "identifier redefined as global" +#: py/moduerrno.c +msgid "No such file/directory" msgstr "" -#: py/compile.c:1185 -msgid "no binding for nonlocal found" +#: shared-bindings/bleio/CharacteristicBuffer.c +#, fuzzy +msgid "Not connected" +msgstr "Não é possível conectar-se ao AP" + +#: shared-bindings/bleio/CharacteristicBuffer.c +msgid "Not connected." msgstr "" -#: py/compile.c:1188 -msgid "identifier redefined as nonlocal" +#: shared-bindings/audiobusio/I2SOut.c shared-bindings/audioio/AudioOut.c +msgid "Not playing" msgstr "" -#: py/compile.c:1197 -msgid "can't declare nonlocal in outer code" +#: shared-bindings/util.c +msgid "" +"Object has been deinitialized and can no longer be used. Create a new object." msgstr "" +"Objeto foi desinicializado e não pode ser mais usaado. Crie um novo objeto." -#: py/compile.c:1542 -msgid "default 'except' must be last" +#: ports/nrf/common-hal/busio/UART.c +#, fuzzy +msgid "Odd parity is not supported" +msgstr "I2C operação não suportada" + +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Only 8 or 16 bit mono with " msgstr "" -#: py/compile.c:2095 -msgid "*x must be assignment target" +#: shared-module/displayio/OnDiskBitmap.c +#, c-format +msgid "" +"Only Windows format, uncompressed BMP supported: given header size is %d" msgstr "" -#: py/compile.c:2193 -msgid "super() can't find self" +#: shared-module/displayio/Bitmap.c +msgid "Only bit maps of 8 bit color or less are supported" +msgstr "Apenas bit maps de cores de 8 bit ou menos são suportados" + +#: shared-module/displayio/OnDiskBitmap.c +#, c-format +msgid "" +"Only monochrome, indexed 8bpp, and 16bpp or greater BMPs supported: %d bpp " +"given" msgstr "" -#: py/compile.c:2256 -msgid "can't have multiple *x" +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "Only slices with step=1 (aka None) are supported" msgstr "" -#: py/compile.c:2263 -msgid "can't have multiple **x" +#: ports/esp8266/common-hal/busio/UART.c +msgid "Only tx supported on UART1 (GPIO2)." +msgstr "Apenas TX suportado no UART1 (GPIO2)." + +#: shared-bindings/audiobusio/PDMIn.c +msgid "Oversample must be multiple of 8." msgstr "" -#: py/compile.c:2271 -msgid "LHS of keyword arg must be an id" +#: shared-bindings/pulseio/PWMOut.c +msgid "" +"PWM duty_cycle must be between 0 and 65535 inclusive (16 bit resolution)" msgstr "" -#: py/compile.c:2287 -msgid "non-keyword arg after */**" +#: shared-bindings/pulseio/PWMOut.c +msgid "" +"PWM frequency not writable when variable_frequency is False on construction." msgstr "" -#: py/compile.c:2291 -msgid "non-keyword arg after keyword arg" +#: ports/esp8266/common-hal/pulseio/PWMOut.c ports/esp8266/machine_pwm.c +#, c-format +msgid "PWM not supported on pin %d" +msgstr "PWM não suportado no pino %d" + +#: py/moduerrno.c +msgid "Permission denied" +msgstr "Permissão negada" + +#: ports/esp8266/common-hal/analogio/AnalogIn.c +msgid "Pin %q does not have ADC capabilities" +msgstr "Pino %q não tem recursos de ADC" + +#: ports/atmel-samd/common-hal/analogio/AnalogIn.c +#: ports/nrf/common-hal/analogio/AnalogIn.c +msgid "Pin does not have ADC capabilities" +msgstr "O pino não tem recursos de ADC" + +#: ports/esp8266/machine_pin.c +msgid "Pin(16) doesn't support pull" +msgstr "Pino (16) não suporta pull" + +#: ports/esp8266/common-hal/busio/SPI.c +msgid "Pins not valid for SPI" +msgstr "Pinos não válidos para SPI" + +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "Pixel beyond bounds of buffer" msgstr "" -#: py/compile.c:2463 py/compile.c:2473 py/compile.c:2712 py/compile.c:2742 -#: py/parse.c:1176 -msgid "invalid syntax" +#: py/builtinhelp.c +#, fuzzy +msgid "Plus any modules on the filesystem\n" +msgstr "Não é possível remontar o sistema de arquivos" + +#: main.c +msgid "Press any key to enter the REPL. Use CTRL-D to reload." msgstr "" -#: py/compile.c:2465 -msgid "expecting key:value for dict" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Pull not used when direction is output." msgstr "" -#: py/compile.c:2475 -msgid "expecting just a value for set" +#: shared-bindings/rtc/RTC.c +msgid "RTC calibration is not supported on this board" +msgstr "A calibração RTC não é suportada nesta placa" + +#: shared-bindings/rtc/RTC.c shared-bindings/time/__init__.c +msgid "RTC is not supported on this board" +msgstr "O RTC não é suportado nesta placa" + +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "Range out of bounds" msgstr "" -#: py/compile.c:2600 -msgid "'yield' outside function" +#: shared-bindings/pulseio/PulseIn.c +msgid "Read-only" +msgstr "Somente leitura" + +#: extmod/vfs_fat.c py/moduerrno.c +msgid "Read-only filesystem" +msgstr "Sistema de arquivos somente leitura" + +#: shared-module/displayio/Bitmap.c +#, fuzzy +msgid "Read-only object" +msgstr "Somente leitura" + +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Right channel unsupported" +msgstr "Canal direito não suportado" + +#: shared-bindings/_pew/PewPew.c +msgid "Row entry must be digitalio.DigitalInOut" msgstr "" -#: py/compile.c:2619 -msgid "'await' outside function" +#: main.c +msgid "Running in safe mode! Auto-reload is off.\n" +msgstr "Rodando em modo seguro! Atualização automática está desligada.\n" + +#: main.c +msgid "Running in safe mode! Not running saved code.\n" +msgstr "Rodando em modo seguro! Não está executando o código salvo.\n" + +#: ports/atmel-samd/common-hal/busio/I2C.c +msgid "SDA or SCL needs a pull up" +msgstr "SDA ou SCL precisa de um pull up" + +#: ports/esp8266/modnetwork.c +msgid "STA must be active" +msgstr "STA deve estar ativo" + +#: ports/esp8266/modnetwork.c +msgid "STA required" +msgstr "STA requerido" + +#: shared-bindings/audioio/Mixer.c +msgid "Sample rate must be positive" msgstr "" -#: py/compile.c:2774 -msgid "name reused for argument" +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +#, c-format +msgid "Sample rate too high. It must be less than %d" +msgstr "Taxa de amostragem muito alta. Deve ser menor que %d" + +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Serializer in use" +msgstr "Serializer em uso" + +#: shared-bindings/nvm/ByteArray.c +msgid "Slice and value different lengths." msgstr "" -#: py/compile.c:2827 -msgid "parameter annotation must be an identifier" +#: shared-bindings/displayio/Bitmap.c shared-bindings/displayio/TileGrid.c +#: shared-bindings/displayio/Group.c shared-bindings/pulseio/PulseIn.c +msgid "Slices not supported" msgstr "" -#: py/compile.c:2969 py/compile.c:3137 -msgid "return annotation must be an identifier" +#: ports/nrf/common-hal/bleio/Adapter.c +#, c-format +msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX" msgstr "" -#: py/compile.c:3097 -msgid "inline assembler must be a function" +#: extmod/modure.c +msgid "Splitting with sub-captures" msgstr "" -#: py/compile.c:3134 -msgid "unknown type" +#: shared-bindings/supervisor/__init__.c +msgid "Stack size must be at least 256" +msgstr "O tamanho da pilha deve ser pelo menos 256" + +#: shared-bindings/multiterminal/__init__.c +msgid "Stream missing readinto() or write() method." msgstr "" -#: py/compile.c:3154 -msgid "expecting an assembler instruction" +#: supervisor/shared/safe_mode.c +msgid "" +"The CircuitPython heap was corrupted because the stack was too small.\n" +"Please increase stack size limits and press reset (after ejecting " +"CIRCUITPY).\n" +"If you didn't change the stack, then file an issue here with the contents of " +"your CIRCUITPY drive:\n" msgstr "" -#: py/compile.c:3184 -msgid "'label' requires 1 argument" +#: supervisor/shared/safe_mode.c +msgid "" +"The microcontroller's power dipped. Please make sure your power supply " +"provides\n" +"enough power for the whole circuit and press reset (after ejecting " +"CIRCUITPY).\n" msgstr "" -#: py/compile.c:3190 -msgid "label redefined" +#: supervisor/shared/safe_mode.c +msgid "" +"The reset button was pressed while booting CircuitPython. Press again to " +"exit safe mode.\n" msgstr "" -#: py/compile.c:3196 -msgid "'align' requires 1 argument" +#: shared-module/audioio/Mixer.c +msgid "The sample's bits_per_sample does not match the mixer's" msgstr "" -#: py/compile.c:3205 -msgid "'data' requires at least 2 arguments" +#: shared-module/audioio/Mixer.c +msgid "The sample's channel count does not match the mixer's" msgstr "" -#: py/compile.c:3212 -msgid "'data' requires integer arguments" +#: shared-module/audioio/Mixer.c +msgid "The sample's sample rate does not match the mixer's" msgstr "" -#: py/emitinlinethumb.c:102 -msgid "can only have up to 4 parameters to Thumb assembly" +#: shared-module/audioio/Mixer.c +msgid "The sample's signedness does not match the mixer's" msgstr "" -#: py/emitinlinethumb.c:107 py/emitinlinethumb.c:112 -msgid "parameters must be registers in sequence r0 to r3" +#: shared-bindings/displayio/TileGrid.c +msgid "Tile height must exactly divide bitmap height" msgstr "" -#: py/emitinlinethumb.c:188 py/emitinlinethumb.c:230 -#, c-format -msgid "'%s' expects at most r%d" +#: shared-bindings/displayio/TileGrid.c +msgid "Tile indices must be 0 - 255" msgstr "" -#: py/emitinlinethumb.c:197 py/emitinlinextensa.c:162 -#, c-format -msgid "'%s' expects a register" +#: shared-bindings/displayio/TileGrid.c +msgid "Tile width must exactly divide bitmap width" msgstr "" -#: py/emitinlinethumb.c:211 -#, c-format -msgid "'%s' expects a special register" +#: supervisor/shared/safe_mode.c +msgid "To exit, please reset the board without " +msgstr "Para sair, por favor, reinicie a placa sem " + +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +msgid "Too many channels in sample." +msgstr "Muitos canais na amostra." + +#: shared-bindings/displayio/FourWire.c shared-bindings/displayio/ParallelBus.c +msgid "Too many display busses" msgstr "" -#: py/emitinlinethumb.c:239 -#, c-format -msgid "'%s' expects an FPU register" +#: shared-bindings/displayio/Display.c +msgid "Too many displays" msgstr "" -#: py/emitinlinethumb.c:292 -#, c-format -msgid "'%s' expects {r0, r1, ...}" +#: py/obj.c +msgid "Traceback (most recent call last):\n" msgstr "" -#: py/emitinlinethumb.c:299 py/emitinlinextensa.c:169 -#, c-format -msgid "'%s' expects an integer" +#: shared-bindings/time/__init__.c +msgid "Tuple or struct_time argument required" msgstr "" -#: py/emitinlinethumb.c:304 +#: ports/esp8266/machine_uart.c #, c-format -msgid "'%s' integer 0x%x does not fit in mask 0x%x" +msgid "UART(%d) does not exist" +msgstr "UART(%d) não existe" + +#: ports/esp8266/machine_uart.c +msgid "UART(1) can't read" +msgstr "UART(1) não pode ler" + +#: shared-module/usb_hid/Device.c +msgid "USB Busy" +msgstr "USB ocupada" + +#: shared-module/usb_hid/Device.c +msgid "USB Error" +msgstr "Erro na USB" + +#: shared-bindings/bleio/UUID.c +msgid "UUID integer value not in range 0 to 0xffff" msgstr "" -#: py/emitinlinethumb.c:328 -#, c-format -msgid "'%s' expects an address of the form [a, b]" +#: shared-bindings/bleio/UUID.c +msgid "UUID string not 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'" msgstr "" -#: py/emitinlinethumb.c:334 py/emitinlinextensa.c:182 -#, c-format -msgid "'%s' expects a label" +#: shared-bindings/bleio/UUID.c +msgid "UUID value is not str, int or byte buffer" msgstr "" -#: py/emitinlinethumb.c:345 py/emitinlinextensa.c:193 -msgid "label '%q' not defined" +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audioio/AudioOut.c +msgid "Unable to allocate buffers for signed conversion" +msgstr "Não é possível alocar buffers para conversão assinada" + +#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "Unable to find free GCLK" +msgstr "Não é possível encontrar GCLK livre" + +#: py/parse.c +msgid "Unable to init parser" msgstr "" -#: py/emitinlinethumb.c:806 -#, c-format -msgid "unsupported Thumb instruction '%s' with %d arguments" +#: shared-module/displayio/OnDiskBitmap.c +msgid "Unable to read color palette data" msgstr "" -#: py/emitinlinethumb.c:810 -#, fuzzy -msgid "branch not in range" -msgstr "Calibração está fora do intervalo" +#: ports/esp8266/common-hal/storage/__init__.c +msgid "Unable to remount filesystem" +msgstr "Não é possível remontar o sistema de arquivos" -#: py/emitinlinextensa.c:86 -msgid "can only have up to 4 parameters to Xtensa assembly" -msgstr "" +#: shared-bindings/nvm/ByteArray.c +msgid "Unable to write to nvm." +msgstr "Não é possível gravar no nvm." -#: py/emitinlinextensa.c:91 py/emitinlinextensa.c:96 -msgid "parameters must be registers in sequence a2 to a5" +#: ports/nrf/common-hal/bleio/UUID.c +msgid "Unexpected nrfx uuid type" msgstr "" -#: py/emitinlinextensa.c:174 +#: ports/unix/modffi.c +msgid "Unknown type" +msgstr "Tipo desconhecido" + +#: shared-bindings/_pixelbuf/PixelBuf.c #, c-format -msgid "'%s' integer %d is not within range %d..%d" +msgid "Unmatched number of items on RHS (expected %d, got %d)." msgstr "" -#: py/emitinlinextensa.c:327 -#, c-format -msgid "unsupported Xtensa instruction '%s' with %d arguments" +#: ports/atmel-samd/common-hal/busio/I2C.c +msgid "Unsupported baudrate" +msgstr "Taxa de transmissão não suportada" + +#: shared-module/displayio/Display.c +#, fuzzy +msgid "Unsupported display bus type" +msgstr "Taxa de transmissão não suportada" + +#: shared-module/audioio/WaveFile.c +msgid "Unsupported format" +msgstr "Formato não suportado" + +#: py/moduerrno.c +msgid "Unsupported operation" msgstr "" -#: py/emitnative.c:183 -msgid "unknown type '%q'" +#: shared-bindings/digitalio/DigitalInOut.c +msgid "Unsupported pull value." msgstr "" -#: py/emitnative.c:260 +#: ports/esp8266/common-hal/storage/__init__.c +msgid "Use esptool to erase flash and re-upload Python instead" +msgstr "Use o esptool para apagar o flash e recarregar o Python" + +#: py/emitnative.c msgid "Viper functions don't currently support more than 4 arguments" msgstr "" -#: py/emitnative.c:742 -msgid "conversion to object" +#: shared-module/audioio/Mixer.c +msgid "Voice index too high" msgstr "" -#: py/emitnative.c:921 -msgid "local '%q' used before type known" -msgstr "" +#: main.c +msgid "WARNING: Your code filename has two extensions\n" +msgstr "AVISO: Seu arquivo de código tem duas extensões\n" -#: py/emitnative.c:1118 py/emitnative.c:1156 -msgid "can't load from '%q'" +#: py/builtinhelp.c +#, c-format +msgid "" +"Welcome to Adafruit CircuitPython %s!\n" +"\n" +"Please visit learn.adafruit.com/category/circuitpython for project guides.\n" +"\n" +"To list built-in modules please do `help(\"modules\")`.\n" msgstr "" -#: py/emitnative.c:1128 -msgid "can't load with '%q' index" +#: supervisor/shared/safe_mode.c +msgid "" +"You are running in safe mode which means something unanticipated happened.\n" msgstr "" -#: py/emitnative.c:1188 -msgid "local '%q' has type '%q' but source is '%q'" -msgstr "" +#: supervisor/shared/safe_mode.c +msgid "You requested starting safe mode by " +msgstr "Você solicitou o início do modo de segurança" -#: py/emitnative.c:1289 py/emitnative.c:1379 -msgid "can't store '%q'" +#: ports/unix/modusocket.c +#, c-format +msgid "[addrinfo error %d]" msgstr "" -#: py/emitnative.c:1358 py/emitnative.c:1419 -msgid "can't store to '%q'" +#: py/objtype.c +msgid "__init__() should return None" msgstr "" -#: py/emitnative.c:1369 -msgid "can't store with '%q' index" +#: py/objtype.c +#, c-format +msgid "__init__() should return None, not '%s'" msgstr "" -#: py/emitnative.c:1540 -msgid "can't implicitly convert '%q' to 'bool'" +#: py/objobject.c +msgid "__new__ arg must be a user-type" msgstr "" -#: py/emitnative.c:1774 -msgid "unary op %q not implemented" +#: extmod/modubinascii.c extmod/moduhashlib.c +msgid "a bytes-like object is required" msgstr "" -#: py/emitnative.c:1930 -msgid "binary op %q not implemented" -msgstr "" +#: lib/embed/abort_.c +msgid "abort() called" +msgstr "abort() chamado" -#: py/emitnative.c:1951 -msgid "can't do binary op between '%q' and '%q'" -msgstr "" +#: ports/unix/modmachine.c extmod/machine_mem.c +#, c-format +msgid "address %08x is not aligned to %d bytes" +msgstr "endereço %08x não está alinhado com %d bytes" -#: py/emitnative.c:2126 -msgid "casting" +#: shared-bindings/i2cslave/I2CSlave.c +msgid "address out of bounds" msgstr "" -#: py/emitnative.c:2173 -msgid "return expected '%q' but got '%q'" +#: shared-bindings/i2cslave/I2CSlave.c +msgid "addresses is empty" msgstr "" -#: py/emitnative.c:2191 -msgid "must raise an object" +#: py/modbuiltins.c +msgid "arg is an empty sequence" msgstr "" -#: py/emitnative.c:2201 -msgid "native yield" +#: py/runtime.c +msgid "argument has wrong type" +msgstr "argumento tem tipo errado" + +#: py/argcheck.c +msgid "argument num/types mismatch" msgstr "" -#: py/lexer.c:345 -msgid "unicode name escapes" +#: py/runtime.c +msgid "argument should be a '%q' not a '%q'" msgstr "" -#: py/modbuiltins.c:162 -msgid "chr() arg not in range(0x110000)" +#: shared-bindings/nvm/ByteArray.c py/objarray.c +msgid "array/bytes required on right side" msgstr "" -#: py/modbuiltins.c:171 -msgid "chr() arg not in range(256)" +#: py/objstr.c +msgid "attributes not supported yet" +msgstr "atributos ainda não suportados" + +#: ports/nrf/common-hal/bleio/Characteristic.c +msgid "bad GATT role" msgstr "" -#: py/modbuiltins.c:285 -msgid "arg is an empty sequence" +#: py/builtinevex.c +msgid "bad compile mode" msgstr "" -#: py/modbuiltins.c:350 -msgid "ord expects a character" +#: py/objstr.c +msgid "bad conversion specifier" msgstr "" -#: py/modbuiltins.c:353 -#, c-format -msgid "ord() expected a character, but string of length %d found" +#: py/objstr.c +msgid "bad format string" msgstr "" -#: py/modbuiltins.c:363 -msgid "3-arg pow() not supported" +#: py/binary.c +msgid "bad typecode" msgstr "" -#: py/modbuiltins.c:517 -msgid "must use keyword argument for key function" +#: py/emitnative.c +msgid "binary op %q not implemented" msgstr "" -#: py/modmath.c:41 shared-bindings/math/__init__.c:53 -msgid "math domain error" +#: shared-bindings/busio/UART.c +msgid "bits must be 7, 8 or 9" msgstr "" -#: py/modmath.c:196 py/objfloat.c:270 py/objint_longlong.c:222 -#: py/objint_mpz.c:230 py/runtime.c:619 shared-bindings/math/__init__.c:346 -msgid "division by zero" -msgstr "divisão por zero" +#: extmod/machine_spi.c +msgid "bits must be 8" +msgstr "bits devem ser 8" -#: py/modmicropython.c:155 -msgid "schedule stack full" +#: shared-bindings/audioio/Mixer.c +#, fuzzy +msgid "bits_per_sample must be 8 or 16" +msgstr "bits devem ser 8" + +#: py/emitinlinethumb.c +#, fuzzy +msgid "branch not in range" +msgstr "Calibração está fora do intervalo" + +#: shared-bindings/_pixelbuf/PixelBuf.c +#, c-format +msgid "buf is too small. need %d bytes" msgstr "" -#: py/modstruct.c:145 py/modstruct.c:153 py/modstruct.c:234 py/modstruct.c:244 -#: shared-bindings/struct/__init__.c:103 shared-bindings/struct/__init__.c:145 -#: shared-module/struct/__init__.c:91 shared-module/struct/__init__.c:175 -msgid "buffer too small" +#: shared-bindings/audioio/RawSample.c +msgid "buffer must be a bytes-like object" msgstr "" -#: py/modthread.c:240 -msgid "expecting a dict for keyword args" +#: shared-module/struct/__init__.c +#, fuzzy +msgid "buffer size must match format" +msgstr "buffers devem ser o mesmo tamanho" + +#: shared-bindings/bitbangio/SPI.c shared-bindings/busio/SPI.c +msgid "buffer slices must be of equal length" msgstr "" -#: py/moduerrno.c:147 py/moduerrno.c:150 -msgid "Permission denied" -msgstr "Permissão negada" +#: ports/esp8266/machine_rtc.c +msgid "buffer too long" +msgstr "buffer muito longo" -#: py/moduerrno.c:148 -msgid "No such file/directory" +#: shared-bindings/struct/__init__.c shared-module/struct/__init__.c +#: py/modstruct.c +msgid "buffer too small" msgstr "" -#: py/moduerrno.c:149 -msgid "Input/output error" +#: extmod/machine_spi.c +msgid "buffers must be the same length" +msgstr "buffers devem ser o mesmo tamanho" + +#: shared-bindings/_pew/PewPew.c +msgid "buttons must be digitalio.DigitalInOut" msgstr "" -#: py/moduerrno.c:151 -msgid "File exists" -msgstr "Arquivo já existe" +#: py/vm.c +msgid "byte code not implemented" +msgstr "" -#: py/moduerrno.c:152 -msgid "Unsupported operation" +#: shared-bindings/_pixelbuf/PixelBuf.c +#, c-format +msgid "byteorder is not an instance of ByteOrder (got a %s)" msgstr "" -#: py/moduerrno.c:153 -msgid "Invalid argument" -msgstr "Argumento inválido" +#: ports/atmel-samd/common-hal/busio/UART.c +msgid "bytes > 8 bits not supported" +msgstr "bytes > 8 bits não suportado" -#: py/obj.c:92 -msgid "Traceback (most recent call last):\n" +#: py/objstr.c +msgid "bytes value out of range" msgstr "" -#: py/obj.c:96 -msgid " File \"%q\", line %d" -msgstr " Arquivo \"%q\", linha %d" +#: ports/atmel-samd/bindings/samd/Clock.c +msgid "calibration is out of range" +msgstr "Calibração está fora do intervalo" -#: py/obj.c:98 -msgid " File \"%q\"" -msgstr " Arquivo \"%q\"" +#: ports/atmel-samd/bindings/samd/Clock.c +msgid "calibration is read only" +msgstr "Calibração é somente leitura" -#: py/obj.c:102 -msgid ", in %q\n" -msgstr "" +#: ports/atmel-samd/common-hal/rtc/RTC.c +msgid "calibration value out of range +/-127" +msgstr "Valor de calibração fora do intervalo +/- 127" -#: py/obj.c:259 -msgid "can't convert to int" +#: py/emitinlinethumb.c +msgid "can only have up to 4 parameters to Thumb assembly" msgstr "" -#: py/obj.c:262 -#, c-format -msgid "can't convert %s to int" +#: py/emitinlinextensa.c +msgid "can only have up to 4 parameters to Xtensa assembly" msgstr "" -#: py/obj.c:322 -msgid "can't convert to float" +#: py/persistentcode.c +msgid "can only save bytecode" msgstr "" -#: py/obj.c:325 -#, c-format -msgid "can't convert %s to float" +#: ports/esp8266/modnetwork.c +msgid "can query only one param" +msgstr "pode consultar apenas um parâmetro" + +#: py/objtype.c +msgid "can't add special method to already-subclassed class" msgstr "" -#: py/obj.c:355 -msgid "can't convert to complex" +#: py/compile.c +msgid "can't assign to expression" msgstr "" -#: py/obj.c:358 +#: py/obj.c #, c-format msgid "can't convert %s to complex" msgstr "" -#: py/obj.c:373 -msgid "expected tuple/list" +#: py/obj.c +#, c-format +msgid "can't convert %s to float" msgstr "" -#: py/obj.c:376 +#: py/obj.c #, c-format -msgid "object '%s' is not a tuple or list" +msgid "can't convert %s to int" msgstr "" -#: py/obj.c:387 -msgid "tuple/list has wrong length" +#: py/objstr.c +msgid "can't convert '%q' object to %q implicitly" msgstr "" -#: py/obj.c:389 -#, c-format -msgid "requested length %d but object has length %d" +#: py/objint.c +msgid "can't convert NaN to int" msgstr "" -#: py/obj.c:402 -msgid "indices must be integers" +#: shared-bindings/i2cslave/I2CSlave.c +msgid "can't convert address to int" msgstr "" -#: py/obj.c:405 -msgid "%q indices must be integers, not %s" +#: py/objint.c +msgid "can't convert inf to int" msgstr "" -#: py/obj.c:425 -msgid "%q index out of range" +#: py/obj.c +msgid "can't convert to complex" msgstr "" -#: py/obj.c:457 -msgid "object has no len" +#: py/obj.c +msgid "can't convert to float" msgstr "" -#: py/obj.c:460 -#, c-format -msgid "object of type '%s' has no len()" +#: py/obj.c +msgid "can't convert to int" msgstr "" -#: py/obj.c:500 -msgid "object does not support item deletion" +#: py/objstr.c +msgid "can't convert to str implicitly" msgstr "" -#: py/obj.c:503 -#, c-format -msgid "'%s' object does not support item deletion" +#: py/compile.c +msgid "can't declare nonlocal in outer code" msgstr "" -#: py/obj.c:507 -msgid "object is not subscriptable" +#: py/compile.c +msgid "can't delete expression" msgstr "" -#: py/obj.c:510 -#, c-format -msgid "'%s' object is not subscriptable" +#: py/emitnative.c +msgid "can't do binary op between '%q' and '%q'" msgstr "" -#: py/obj.c:514 -msgid "object does not support item assignment" +#: py/objcomplex.c +msgid "can't do truncated division of a complex number" msgstr "" -#: py/obj.c:517 -#, c-format -msgid "'%s' object does not support item assignment" -msgstr "" +#: ports/esp8266/modnetwork.c +msgid "can't get AP config" +msgstr "não pode obter configuração de AP" -#: py/obj.c:548 -msgid "object with buffer protocol required" -msgstr "" +#: ports/esp8266/modnetwork.c +msgid "can't get STA config" +msgstr "não pode obter a configuração STA" -#: py/objarray.c:413 py/objstr.c:427 py/objstrunicode.c:191 py/objtuple.c:187 -#: shared-bindings/nvm/ByteArray.c:85 -msgid "only slices with step=1 (aka None) are supported" +#: py/compile.c +msgid "can't have multiple **x" msgstr "" -#: py/objarray.c:426 -msgid "lhs and rhs should be compatible" +#: py/compile.c +msgid "can't have multiple *x" msgstr "" -#: py/objarray.c:444 shared-bindings/nvm/ByteArray.c:107 -msgid "array/bytes required on right side" +#: py/emitnative.c +msgid "can't implicitly convert '%q' to 'bool'" msgstr "" -#: py/objcomplex.c:203 -msgid "can't do truncated division of a complex number" +#: py/emitnative.c +msgid "can't load from '%q'" msgstr "" -#: py/objcomplex.c:209 -msgid "complex division by zero" +#: py/emitnative.c +msgid "can't load with '%q' index" msgstr "" -#: py/objcomplex.c:237 -msgid "0.0 to a complex power" +#: py/objgenerator.c +msgid "can't pend throw to just-started generator" msgstr "" -#: py/objdeque.c:107 -msgid "full" -msgstr "cheio" +#: py/objgenerator.c +msgid "can't send non-None value to a just-started generator" +msgstr "" -#: py/objdeque.c:127 -msgid "empty" -msgstr "vazio" +#: ports/esp8266/modnetwork.c +msgid "can't set AP config" +msgstr "não é possível definir a configuração do AP" -#: py/objdict.c:314 -msgid "popitem(): dictionary is empty" -msgstr "" +#: ports/esp8266/modnetwork.c +msgid "can't set STA config" +msgstr "não é possível definir a configuração STA" -#: py/objdict.c:357 -msgid "dict update sequence has wrong length" +#: py/objnamedtuple.c +msgid "can't set attribute" msgstr "" -#: py/objfloat.c:308 py/parsenum.c:331 -msgid "complex values not supported" +#: py/emitnative.c +msgid "can't store '%q'" msgstr "" -#: py/objgenerator.c:108 -msgid "can't send non-None value to a just-started generator" +#: py/emitnative.c +msgid "can't store to '%q'" msgstr "" -#: py/objgenerator.c:126 -msgid "generator already executing" +#: py/emitnative.c +msgid "can't store with '%q' index" msgstr "" -#: py/objgenerator.c:229 -msgid "generator ignored GeneratorExit" +#: py/objstr.c +msgid "" +"can't switch from automatic field numbering to manual field specification" msgstr "" -#: py/objgenerator.c:251 -msgid "can't pend throw to just-started generator" +#: py/objstr.c +msgid "" +"can't switch from manual field specification to automatic field numbering" msgstr "" -#: py/objint.c:144 -msgid "can't convert inf to int" +#: py/objtype.c +msgid "cannot create '%q' instances" msgstr "" -#: py/objint.c:146 -msgid "can't convert NaN to int" -msgstr "" +#: py/objtype.c +msgid "cannot create instance" +msgstr "não é possível criar instância" -#: py/objint.c:163 -msgid "float too big" -msgstr "float muito grande" +#: py/runtime.c +msgid "cannot import name %q" +msgstr "não pode importar nome %q" -#: py/objint.c:328 -msgid "long int not supported in this build" +#: py/builtinimport.c +msgid "cannot perform relative import" msgstr "" -#: py/objint.c:334 py/objint.c:340 py/objint.c:350 py/objint.c:358 -msgid "small int overflow" +#: py/emitnative.c +msgid "casting" msgstr "" -#: py/objint_longlong.c:189 py/objint_mpz.c:283 py/runtime.c:486 -msgid "negative power with no float support" +#: shared-bindings/bleio/Service.c +msgid "characteristics includes an object that is not a Characteristic" msgstr "" -#: py/objint_longlong.c:251 -msgid "ulonglong too large" +#: shared-bindings/_stage/Text.c +msgid "chars buffer too small" msgstr "" -#: py/objint_mpz.c:267 py/runtime.c:396 py/runtime.c:411 -msgid "negative shift count" +#: py/modbuiltins.c +msgid "chr() arg not in range(0x110000)" msgstr "" -#: py/objint_mpz.c:336 -msgid "pow() with 3 arguments requires integers" +#: py/modbuiltins.c +msgid "chr() arg not in range(256)" msgstr "" -#: py/objint_mpz.c:347 -msgid "pow() 3rd argument cannot be 0" +#: shared-bindings/displayio/Palette.c +msgid "color buffer must be 3 bytes (RGB) or 4 bytes (RGB + pad byte)" msgstr "" -#: py/objint_mpz.c:415 -msgid "overflow converting long int to machine word" +#: shared-bindings/displayio/Palette.c +msgid "color buffer must be a buffer or int" msgstr "" -#: py/objlist.c:273 -msgid "pop from empty list" +#: shared-bindings/displayio/Palette.c +msgid "color buffer must be a bytearray or array of type 'b' or 'B'" msgstr "" -#: py/objnamedtuple.c:92 -msgid "can't set attribute" -msgstr "" +#: shared-bindings/displayio/Palette.c +msgid "color must be between 0x000000 and 0xffffff" +msgstr "cor deve estar entre 0x000000 e 0xffffff" -#: py/objobject.c:55 -msgid "__new__ arg must be a user-type" +#: shared-bindings/displayio/ColorConverter.c +msgid "color should be an int" +msgstr "cor deve ser um int" + +#: py/objcomplex.c +msgid "complex division by zero" msgstr "" -#: py/objrange.c:110 -msgid "zero step" -msgstr "passo zero" +#: py/parsenum.c py/objfloat.c +msgid "complex values not supported" +msgstr "" -#: py/objset.c:371 -msgid "pop from an empty set" +#: extmod/moduzlib.c +msgid "compression header" msgstr "" -#: py/objslice.c:66 -msgid "Length must be an int" -msgstr "Tamanho deve ser um int" +#: py/parse.c +msgid "constant must be an integer" +msgstr "constante deve ser um inteiro" -#: py/objslice.c:71 -msgid "Length must be non-negative" +#: py/emitnative.c +msgid "conversion to object" msgstr "" -#: py/objslice.c:86 py/sequence.c:57 -msgid "slice step cannot be zero" +#: py/parsenum.c +msgid "decimal numbers not supported" msgstr "" -#: py/objslice.c:159 -msgid "Cannot subclass slice" +#: py/compile.c +msgid "default 'except' must be last" msgstr "" -#: py/objstr.c:261 -msgid "bytes value out of range" +#: shared-bindings/audiobusio/PDMIn.c +msgid "" +"destination buffer must be a bytearray or array of type 'B' for bit_depth = 8" msgstr "" -#: py/objstr.c:270 -msgid "wrong number of arguments" +#: shared-bindings/audiobusio/PDMIn.c +msgid "destination buffer must be an array of type 'H' for bit_depth = 16" msgstr "" -#: py/objstr.c:467 -msgid "join expects a list of str/bytes objects consistent with self object" -msgstr "" +#: shared-bindings/audiobusio/PDMIn.c +msgid "destination_length must be an int >= 0" +msgstr "destination_length deve ser um int >= 0" -#: py/objstr.c:542 py/objstr.c:647 py/objstr.c:1744 -msgid "empty separator" +#: py/objdict.c +msgid "dict update sequence has wrong length" msgstr "" -#: py/objstr.c:641 -msgid "rsplit(None,n)" -msgstr "" +#: shared-bindings/math/__init__.c py/runtime.c py/modmath.c py/objint_mpz.c +#: py/objint_longlong.c py/objfloat.c +msgid "division by zero" +msgstr "divisão por zero" -#: py/objstr.c:713 -msgid "substring not found" -msgstr "" +#: ports/esp8266/modnetwork.c +msgid "either pos or kw args are allowed" +msgstr "pos ou kw args são permitidos" -#: py/objstr.c:770 -msgid "start/end indices" -msgstr "" +#: py/objdeque.c +msgid "empty" +msgstr "vazio" -#: py/objstr.c:931 -msgid "bad format string" -msgstr "" +#: extmod/modutimeq.c extmod/moduheapq.c +msgid "empty heap" +msgstr "heap vazia" -#: py/objstr.c:953 -msgid "single '}' encountered in format string" +#: py/objstr.c +msgid "empty separator" msgstr "" -#: py/objstr.c:992 -msgid "bad conversion specifier" -msgstr "" +#: shared-bindings/random/__init__.c +msgid "empty sequence" +msgstr "seqüência vazia" -#: py/objstr.c:996 +#: py/objstr.c msgid "end of format while looking for conversion specifier" msgstr "" -#: py/objstr.c:998 +#: shared-bindings/displayio/Shape.c +#, fuzzy +msgid "end_x should be an int" +msgstr "y deve ser um int" + +#: ports/nrf/common-hal/busio/UART.c #, c-format -msgid "unknown conversion specifier %c" -msgstr "" +msgid "error = 0x%08lX" +msgstr "erro = 0x%08lX" -#: py/objstr.c:1029 -msgid "unmatched '{' in format" +#: py/runtime.c +msgid "exceptions must derive from BaseException" msgstr "" -#: py/objstr.c:1036 +#: py/objstr.c msgid "expected ':' after format specifier" msgstr "" -#: py/objstr.c:1050 -msgid "" -"can't switch from automatic field numbering to manual field specification" +#: shared-bindings/gamepad/GamePad.c +msgid "expected a DigitalInOut" msgstr "" -#: py/objstr.c:1055 py/objstr.c:1083 -msgid "tuple index out of range" +#: py/obj.c +msgid "expected tuple/list" msgstr "" -#: py/objstr.c:1071 -msgid "attributes not supported yet" -msgstr "atributos ainda não suportados" - -#: py/objstr.c:1079 -msgid "" -"can't switch from manual field specification to automatic field numbering" +#: py/modthread.c +msgid "expecting a dict for keyword args" msgstr "" -#: py/objstr.c:1171 -msgid "invalid format specifier" -msgstr "" +#: ports/esp8266/machine_pin.c +msgid "expecting a pin" +msgstr "esperando um pino" -#: py/objstr.c:1192 -msgid "sign not allowed in string format specifier" +#: py/compile.c +msgid "expecting an assembler instruction" msgstr "" -#: py/objstr.c:1200 -msgid "sign not allowed with integer format specifier 'c'" +#: py/compile.c +msgid "expecting just a value for set" msgstr "" -#: py/objstr.c:1259 -#, c-format -msgid "unknown format code '%c' for object of type '%s'" +#: py/compile.c +msgid "expecting key:value for dict" msgstr "" -#: py/objstr.c:1331 -#, c-format -msgid "unknown format code '%c' for object of type 'float'" +#: py/argcheck.c +msgid "extra keyword arguments given" +msgstr "argumentos extras de palavras-chave passados" + +#: py/argcheck.c +msgid "extra positional arguments given" +msgstr "argumentos extra posicionais passados" + +#: ports/unix/modffi.c +msgid "ffi_prep_closure_loc" +msgstr "ffi_prep_closure_loc" + +#: shared-bindings/displayio/OnDiskBitmap.c shared-bindings/audioio/WaveFile.c +msgid "file must be a file opened in byte mode" msgstr "" -#: py/objstr.c:1343 -msgid "'=' alignment not allowed in string format specifier" +#: shared-bindings/storage/__init__.c +msgid "filesystem must provide mount method" +msgstr "sistema de arquivos deve fornecer método de montagem" + +#: py/objtype.c +msgid "first argument to super() must be type" msgstr "" -#: py/objstr.c:1367 -#, c-format -msgid "unknown format code '%c' for object of type 'str'" +#: extmod/machine_spi.c +msgid "firstbit must be MSB" +msgstr "firstbit devem ser MSB" + +#: ports/esp8266/modesp.c +msgid "flash location must be below 1MByte" +msgstr "o local do flash deve estar abaixo de 1 MByte" + +#: py/objint.c +msgid "float too big" +msgstr "float muito grande" + +#: shared-bindings/_stage/Text.c +msgid "font must be 2048 bytes long" msgstr "" -#: py/objstr.c:1415 +#: py/objstr.c msgid "format requires a dict" msgstr "" -#: py/objstr.c:1424 -msgid "incomplete format key" -msgstr "" +#: ports/esp8266/modmachine.c +msgid "frequency can only be either 80Mhz or 160MHz" +msgstr "A frequência só pode ser 80Mhz ou 160MHz" -#: py/objstr.c:1482 -msgid "incomplete format" -msgstr "formato incompleto" +#: py/objdeque.c +msgid "full" +msgstr "cheio" -#: py/objstr.c:1490 -msgid "not enough arguments for format string" -msgstr "" +#: py/argcheck.c +msgid "function does not take keyword arguments" +msgstr "função não aceita argumentos de palavras-chave" -#: py/objstr.c:1500 +#: py/argcheck.c #, c-format -msgid "%%c requires int or char" -msgstr "%%c requer int ou char" +msgid "function expected at most %d arguments, got %d" +msgstr "função esperada na maioria dos %d argumentos, obteve %d" -#: py/objstr.c:1507 -msgid "integer required" -msgstr "inteiro requerido" +#: py/objnamedtuple.c py/bc.c +msgid "function got multiple values for argument '%q'" +msgstr "" -#: py/objstr.c:1570 +#: py/argcheck.c #, c-format -msgid "unsupported format character '%c' (0x%x) at index %d" -msgstr "" +msgid "function missing %d required positional arguments" +msgstr "função ausente %d requer argumentos posicionais" -#: py/objstr.c:1577 -msgid "not all arguments converted during string formatting" +#: py/bc.c +msgid "function missing keyword-only argument" msgstr "" -#: py/objstr.c:2102 -msgid "can't convert to str implicitly" +#: py/bc.c +msgid "function missing required keyword argument '%q'" msgstr "" -#: py/objstr.c:2106 -msgid "can't convert '%q' object to %q implicitly" +#: py/bc.c +#, c-format +msgid "function missing required positional argument #%d" msgstr "" -#: py/objstrunicode.c:134 +#: py/argcheck.c py/objnamedtuple.c py/bc.c #, c-format -msgid "string indices must be integers, not %s" -msgstr "" +msgid "function takes %d positional arguments but %d were given" +msgstr "função leva %d argumentos posicionais, mas apenas %d foram passadas" -#: py/objstrunicode.c:145 py/objstrunicode.c:164 -msgid "string index out of range" +#: shared-bindings/time/__init__.c +msgid "function takes exactly 9 arguments" +msgstr "função leva exatamente 9 argumentos" + +#: py/objgenerator.c +msgid "generator already executing" msgstr "" -#: py/objtype.c:358 -msgid "__init__() should return None" +#: py/objgenerator.c +msgid "generator ignored GeneratorExit" msgstr "" -#: py/objtype.c:360 -#, c-format -msgid "__init__() should return None, not '%s'" +#: shared-bindings/_stage/Layer.c +msgid "graphic must be 2048 bytes long" msgstr "" -#: py/objtype.c:623 py/objtype.c:1275 py/runtime.c:1065 -msgid "unreadable attribute" -msgstr "atributo ilegível" +#: extmod/moduheapq.c +msgid "heap must be a list" +msgstr "heap deve ser uma lista" -#: py/objtype.c:868 py/runtime.c:653 -msgid "object not callable" +#: py/compile.c +msgid "identifier redefined as global" msgstr "" -#: py/objtype.c:870 py/runtime.c:655 -#, c-format -msgid "'%s' object is not callable" +#: py/compile.c +msgid "identifier redefined as nonlocal" msgstr "" -#: py/objtype.c:978 -msgid "type takes 1 or 3 arguments" -msgstr "" +#: ports/esp8266/machine_hspi.c +msgid "impossible baudrate" +msgstr "taxa de transmissão impossível" -#: py/objtype.c:989 -msgid "cannot create instance" -msgstr "não é possível criar instância" +#: py/objstr.c +msgid "incomplete format" +msgstr "formato incompleto" -#: py/objtype.c:991 -msgid "cannot create '%q' instances" +#: py/objstr.c +msgid "incomplete format key" msgstr "" -#: py/objtype.c:1047 -msgid "can't add special method to already-subclassed class" -msgstr "" +#: extmod/modubinascii.c +msgid "incorrect padding" +msgstr "preenchimento incorreto" -#: py/objtype.c:1091 py/objtype.c:1097 -msgid "type is not an acceptable base type" -msgstr "" +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +#: ports/nrf/common-hal/pulseio/PulseIn.c +#: ports/esp8266/common-hal/pulseio/PulseIn.c py/obj.c +msgid "index out of range" +msgstr "Índice fora do intervalo" -#: py/objtype.c:1100 -msgid "type '%q' is not an acceptable base type" +#: py/obj.c +msgid "indices must be integers" msgstr "" -#: py/objtype.c:1137 -msgid "multiple inheritance not supported" +#: py/compile.c +msgid "inline assembler must be a function" msgstr "" -#: py/objtype.c:1164 -msgid "multiple bases have instance lay-out conflict" +#: py/parsenum.c +msgid "int() arg 2 must be >= 2 and <= 36" msgstr "" -#: py/objtype.c:1205 -msgid "first argument to super() must be type" -msgstr "" +#: py/objstr.c +msgid "integer required" +msgstr "inteiro requerido" -#: py/objtype.c:1370 -msgid "issubclass() arg 2 must be a class or a tuple of classes" +#: ports/nrf/common-hal/bleio/Broadcaster.c +msgid "interval not in range 0.0020 to 10.24" msgstr "" -#: py/objtype.c:1384 -msgid "issubclass() arg 1 must be a class" -msgstr "" +#: extmod/machine_i2c.c +msgid "invalid I2C peripheral" +msgstr "periférico I2C inválido" -#: py/parse.c:726 -msgid "constant must be an integer" -msgstr "constante deve ser um inteiro" +#: extmod/machine_spi.c +msgid "invalid SPI peripheral" +msgstr "periférico SPI inválido" -#: py/parse.c:868 -msgid "Unable to init parser" -msgstr "" +#: ports/esp8266/machine_rtc.c +msgid "invalid alarm" +msgstr "Alarme inválido" -#: py/parse.c:1170 -msgid "unexpected indent" +#: lib/netutils/netutils.c +msgid "invalid arguments" +msgstr "argumentos inválidos" + +#: ports/esp8266/modnetwork.c +msgid "invalid buffer length" +msgstr "comprimento de buffer inválido" + +#: extmod/modussl_axtls.c +msgid "invalid cert" +msgstr "certificado inválido" + +#: ports/esp8266/common-hal/busio/UART.c ports/esp8266/machine_uart.c +msgid "invalid data bits" +msgstr "Bits de dados inválidos" + +#: extmod/uos_dupterm.c +msgid "invalid dupterm index" +msgstr "Índice de dupterm inválido" + +#: extmod/modframebuf.c +msgid "invalid format" +msgstr "formato inválido" + +#: py/objstr.c +msgid "invalid format specifier" msgstr "" -#: py/parse.c:1173 -msgid "unindent does not match any outer indentation level" +#: extmod/modussl_axtls.c +msgid "invalid key" +msgstr "chave inválida" + +#: py/compile.c +msgid "invalid micropython decorator" msgstr "" -#: py/parsenum.c:60 -msgid "int() arg 2 must be >= 2 and <= 36" +#: ports/esp8266/machine_pin.c +msgid "invalid pin" +msgstr "Pino inválido" + +#: shared-bindings/random/__init__.c +msgid "invalid step" +msgstr "passo inválido" + +#: ports/esp8266/common-hal/busio/UART.c ports/esp8266/machine_uart.c +msgid "invalid stop bits" +msgstr "Bits de parada inválidos" + +#: py/compile.c py/parse.c +msgid "invalid syntax" msgstr "" -#: py/parsenum.c:151 +#: py/parsenum.c msgid "invalid syntax for integer" msgstr "" -#: py/parsenum.c:155 +#: py/parsenum.c #, c-format msgid "invalid syntax for integer with base %d" msgstr "" -#: py/parsenum.c:339 +#: py/parsenum.c msgid "invalid syntax for number" msgstr "" -#: py/parsenum.c:342 -msgid "decimal numbers not supported" -msgstr "" - -#: py/persistentcode.c:223 -msgid "" -"Incompatible .mpy file. Please update all .mpy files. See http://adafru.it/" -"mpy-update for more info." +#: py/objtype.c +msgid "issubclass() arg 1 must be a class" msgstr "" -#: py/persistentcode.c:326 -msgid "can only save bytecode" +#: py/objtype.c +msgid "issubclass() arg 2 must be a class or a tuple of classes" msgstr "" -#: py/runtime.c:206 -msgid "name not defined" -msgstr "nome não definido" - -#: py/runtime.c:209 -msgid "name '%q' is not defined" +#: py/objstr.c +msgid "join expects a list of str/bytes objects consistent with self object" msgstr "" -#: py/runtime.c:304 py/runtime.c:611 -msgid "unsupported type for operator" +#: py/argcheck.c +msgid "keyword argument(s) not yet implemented - use normal args instead" msgstr "" -#: py/runtime.c:307 -msgid "unsupported type for %q: '%s'" +#: py/bc.c +msgid "keywords must be strings" msgstr "" -#: py/runtime.c:614 -msgid "unsupported types for %q: '%s', '%s'" +#: py/emitinlinextensa.c py/emitinlinethumb.c +msgid "label '%q' not defined" msgstr "" -#: py/runtime.c:881 py/runtime.c:888 py/runtime.c:945 -msgid "wrong number of values to unpack" +#: py/compile.c +msgid "label redefined" msgstr "" -#: py/runtime.c:883 py/runtime.c:947 -#, c-format -msgid "need more than %d values to unpack" -msgstr "precisa de mais de %d valores para desempacotar" +#: ports/esp8266/modesp.c +msgid "len must be multiple of 4" +msgstr "len deve ser múltiplo de 4" -#: py/runtime.c:890 -#, c-format -msgid "too many values to unpack (expected %d)" +#: py/stream.c +msgid "length argument not allowed for this type" msgstr "" -#: py/runtime.c:984 -msgid "argument has wrong type" -msgstr "argumento tem tipo errado" - -#: py/runtime.c:986 -msgid "argument should be a '%q' not a '%q'" +#: py/objarray.c +msgid "lhs and rhs should be compatible" msgstr "" -#: py/runtime.c:1123 py/runtime.c:1197 -msgid "no such attribute" +#: py/emitnative.c +msgid "local '%q' has type '%q' but source is '%q'" msgstr "" -#: py/runtime.c:1128 -msgid "type object '%q' has no attribute '%q'" +#: py/emitnative.c +msgid "local '%q' used before type known" msgstr "" -#: py/runtime.c:1132 py/runtime.c:1200 -msgid "'%s' object has no attribute '%q'" +#: py/vm.c +msgid "local variable referenced before assignment" msgstr "" -#: py/runtime.c:1238 -msgid "object not iterable" -msgstr "objeto não iterável" +#: py/objint.c +msgid "long int not supported in this build" +msgstr "" -#: py/runtime.c:1241 -#, c-format -msgid "'%s' object is not iterable" +#: shared-bindings/_stage/Layer.c +msgid "map buffer too small" msgstr "" -#: py/runtime.c:1260 py/runtime.c:1296 -msgid "object not an iterator" +#: shared-bindings/math/__init__.c py/modmath.c +msgid "math domain error" msgstr "" -#: py/runtime.c:1262 py/runtime.c:1298 -#, c-format -msgid "'%s' object is not an iterator" +#: py/runtime.c +msgid "maximum recursion depth exceeded" msgstr "" -#: py/runtime.c:1401 -msgid "exceptions must derive from BaseException" +#: py/runtime.c +#, c-format +msgid "memory allocation failed, allocating %u bytes" msgstr "" -#: py/runtime.c:1430 -msgid "cannot import name %q" -msgstr "não pode importar nome %q" +#: ports/esp8266/modesp.c +#, c-format +msgid "memory allocation failed, allocating %u bytes for native code" +msgstr "alocação de memória falhou, alocando %u bytes para código nativo" -#: py/runtime.c:1535 +#: py/runtime.c msgid "memory allocation failed, heap is locked" msgstr "" -#: py/runtime.c:1539 -#, c-format -msgid "memory allocation failed, allocating %u bytes" +#: py/builtinimport.c +msgid "module not found" msgstr "" -#: py/runtime.c:1609 -msgid "maximum recursion depth exceeded" +#: py/compile.c +msgid "multiple *x in assignment" msgstr "" -#: py/sequence.c:264 -msgid "object not in sequence" -msgstr "objeto não em seqüência" - -#: py/stream.c:96 -msgid "stream operation not supported" +#: py/objtype.c +msgid "multiple bases have instance lay-out conflict" msgstr "" -#: py/stream.c:254 -msgid "string not supported; use bytes or bytearray" +#: py/objtype.c +msgid "multiple inheritance not supported" msgstr "" -#: py/stream.c:289 -msgid "length argument not allowed for this type" +#: py/emitnative.c +msgid "must raise an object" msgstr "" -#: py/vm.c:255 -msgid "local variable referenced before assignment" -msgstr "" +#: extmod/machine_spi.c +msgid "must specify all of sck/mosi/miso" +msgstr "deve especificar todos sck/mosi/miso" -#: py/vm.c:1142 -msgid "no active exception to reraise" +#: py/modbuiltins.c +msgid "must use keyword argument for key function" msgstr "" -#: py/vm.c:1284 -msgid "byte code not implemented" +#: py/runtime.c +msgid "name '%q' is not defined" msgstr "" -#: shared-bindings/_stage/Layer.c:71 -msgid "graphic must be 2048 bytes long" -msgstr "" +#: shared-bindings/bleio/Peripheral.c +#, fuzzy +msgid "name must be a string" +msgstr "heap deve ser uma lista" -#: shared-bindings/_stage/Layer.c:77 shared-bindings/_stage/Text.c:75 -msgid "palette must be 32 bytes long" +#: py/runtime.c +msgid "name not defined" +msgstr "nome não definido" + +#: py/compile.c +msgid "name reused for argument" msgstr "" -#: shared-bindings/_stage/Layer.c:84 -msgid "map buffer too small" +#: py/emitnative.c +msgid "native yield" msgstr "" -#: shared-bindings/_stage/Text.c:69 -msgid "font must be 2048 bytes long" +#: py/runtime.c +#, c-format +msgid "need more than %d values to unpack" +msgstr "precisa de mais de %d valores para desempacotar" + +#: py/runtime.c py/objint_mpz.c py/objint_longlong.c +msgid "negative power with no float support" msgstr "" -#: shared-bindings/_stage/Text.c:81 -msgid "chars buffer too small" +#: py/runtime.c py/objint_mpz.c +msgid "negative shift count" msgstr "" -#: shared-bindings/analogio/AnalogOut.c:118 -msgid "AnalogOut is only 16 bits. Value must be less than 65536." +#: py/vm.c +msgid "no active exception to reraise" msgstr "" -#: shared-bindings/audiobusio/I2SOut.c:225 -#: shared-bindings/audioio/AudioOut.c:226 -msgid "Not playing" +#: shared-bindings/socket/__init__.c shared-module/network/__init__.c +msgid "no available NIC" msgstr "" -#: shared-bindings/audiobusio/PDMIn.c:124 -msgid "Bit depth must be multiple of 8." +#: py/compile.c +msgid "no binding for nonlocal found" msgstr "" -#: shared-bindings/audiobusio/PDMIn.c:128 -msgid "Oversample must be multiple of 8." +#: py/builtinimport.c +msgid "no module named '%q'" msgstr "" -#: shared-bindings/audiobusio/PDMIn.c:136 -msgid "Microphone startup delay must be in range 0.0 to 1.0" +#: shared-bindings/_pixelbuf/__init__.c py/runtime.c +msgid "no such attribute" msgstr "" -#: shared-bindings/audiobusio/PDMIn.c:193 -msgid "destination_length must be an int >= 0" -msgstr "destination_length deve ser um int >= 0" +#: py/compile.c +msgid "non-default argument follows default argument" +msgstr "" -#: shared-bindings/audiobusio/PDMIn.c:199 -msgid "Cannot record to a file" -msgstr "Não é possível gravar em um arquivo" +#: extmod/modubinascii.c +msgid "non-hex digit found" +msgstr "" -#: shared-bindings/audiobusio/PDMIn.c:202 -msgid "Destination capacity is smaller than destination_length." +#: py/compile.c +msgid "non-keyword arg after */**" msgstr "" -#: shared-bindings/audiobusio/PDMIn.c:206 -msgid "destination buffer must be an array of type 'H' for bit_depth = 16" +#: py/compile.c +msgid "non-keyword arg after keyword arg" msgstr "" -#: shared-bindings/audiobusio/PDMIn.c:208 -msgid "" -"destination buffer must be a bytearray or array of type 'B' for bit_depth = 8" +#: shared-bindings/bleio/UUID.c +msgid "not a 128-bit UUID" msgstr "" -#: shared-bindings/audioio/Mixer.c:94 -#, fuzzy -msgid "Invalid voice count" -msgstr "certificado inválido" +#: ports/esp8266/machine_adc.c +#, c-format +msgid "not a valid ADC Channel: %d" +msgstr "não é um canal ADC válido: %d" -#: shared-bindings/audioio/Mixer.c:99 -#, fuzzy -msgid "Invalid channel count" -msgstr "certificado inválido" +#: py/objstr.c +msgid "not all arguments converted during string formatting" +msgstr "" -#: shared-bindings/audioio/Mixer.c:103 -msgid "Sample rate must be positive" +#: py/objstr.c +msgid "not enough arguments for format string" msgstr "" -#: shared-bindings/audioio/Mixer.c:107 -#, fuzzy -msgid "bits_per_sample must be 8 or 16" -msgstr "bits devem ser 8" +#: py/obj.c +#, c-format +msgid "object '%s' is not a tuple or list" +msgstr "" -#: shared-bindings/audioio/RawSample.c:98 -msgid "" -"sample_source buffer must be a bytearray or array of type 'h', 'H', 'b' or " -"'B'" +#: py/obj.c +msgid "object does not support item assignment" msgstr "" -#: shared-bindings/audioio/RawSample.c:104 -msgid "buffer must be a bytes-like object" +#: py/obj.c +msgid "object does not support item deletion" msgstr "" -#: shared-bindings/audioio/WaveFile.c:78 -#: shared-bindings/displayio/OnDiskBitmap.c:85 -msgid "file must be a file opened in byte mode" +#: py/obj.c +msgid "object has no len" msgstr "" -#: shared-bindings/bitbangio/I2C.c:111 shared-bindings/bitbangio/SPI.c:121 -#: shared-bindings/busio/SPI.c:133 -msgid "Function requires lock" +#: py/obj.c +msgid "object is not subscriptable" msgstr "" -#: shared-bindings/bitbangio/I2C.c:195 shared-bindings/busio/I2C.c:210 -msgid "Buffer must be at least length 1" +#: py/runtime.c +msgid "object not an iterator" msgstr "" -#: shared-bindings/bitbangio/SPI.c:151 shared-bindings/busio/SPI.c:175 -msgid "Invalid polarity" +#: py/objtype.c py/runtime.c +msgid "object not callable" msgstr "" -#: shared-bindings/bitbangio/SPI.c:155 shared-bindings/busio/SPI.c:179 -msgid "Invalid phase" -msgstr "Fase Inválida" +#: py/sequence.c +msgid "object not in sequence" +msgstr "objeto não em seqüência" -#: shared-bindings/bitbangio/SPI.c:159 shared-bindings/busio/SPI.c:183 -msgid "Invalid number of bits" -msgstr "Número inválido de bits" +#: py/runtime.c +msgid "object not iterable" +msgstr "objeto não iterável" -#: shared-bindings/bitbangio/SPI.c:284 shared-bindings/busio/SPI.c:348 -msgid "buffer slices must be of equal length" +#: py/obj.c +#, c-format +msgid "object of type '%s' has no len()" msgstr "" -#: shared-bindings/bleio/Address.c:101 -msgid "Wrong address length" +#: py/obj.c +msgid "object with buffer protocol required" msgstr "" -#: shared-bindings/bleio/Address.c:107 -msgid "Wrong number of bytes provided" +#: extmod/modubinascii.c +msgid "odd-length string" msgstr "" -#: shared-bindings/bleio/Device.c:210 -msgid "Can't add services in Central mode" +#: py/objstrunicode.c py/objstr.c +msgid "offset out of bounds" msgstr "" -#: shared-bindings/bleio/Device.c:226 -msgid "Can't connect in Peripheral mode" +#: shared-bindings/nvm/ByteArray.c py/objarray.c py/objtuple.c +#: py/objstrunicode.c py/objstr.c +msgid "only slices with step=1 (aka None) are supported" msgstr "" -#: shared-bindings/bleio/Device.c:256 -msgid "Can't change the name in Central mode" +#: py/modbuiltins.c +msgid "ord expects a character" msgstr "" -#: shared-bindings/bleio/Device.c:277 shared-bindings/bleio/Device.c:313 -msgid "Can't advertise in Central mode" +#: py/modbuiltins.c +#, c-format +msgid "ord() expected a character, but string of length %d found" msgstr "" -#: shared-bindings/busio/I2C.c:120 -msgid "Function requires lock." +#: py/objint_mpz.c +msgid "overflow converting long int to machine word" msgstr "" -#: shared-bindings/busio/UART.c:106 -msgid "bits must be 7, 8 or 9" +#: shared-bindings/_stage/Text.c shared-bindings/_stage/Layer.c +msgid "palette must be 32 bytes long" msgstr "" -#: shared-bindings/busio/UART.c:118 -msgid "stop must be 1 or 2" +#: shared-bindings/displayio/Palette.c +msgid "palette_index should be an int" msgstr "" -#: shared-bindings/busio/UART.c:123 -msgid "timeout >100 (units are now seconds, not msecs)" +#: py/compile.c +msgid "parameter annotation must be an identifier" msgstr "" -#: shared-bindings/digitalio/DigitalInOut.c:211 -msgid "Invalid direction." -msgstr "Direção inválida" - -#: shared-bindings/digitalio/DigitalInOut.c:240 -msgid "Cannot set value when direction is input." +#: py/emitinlinextensa.c +msgid "parameters must be registers in sequence a2 to a5" msgstr "" -#: shared-bindings/digitalio/DigitalInOut.c:266 -#: shared-bindings/digitalio/DigitalInOut.c:281 -msgid "Drive mode not used when direction is input." +#: py/emitinlinethumb.c +msgid "parameters must be registers in sequence r0 to r3" msgstr "" -#: shared-bindings/digitalio/DigitalInOut.c:314 -#: shared-bindings/digitalio/DigitalInOut.c:331 -msgid "Pull not used when direction is output." -msgstr "" +#: ports/esp8266/machine_pin.c +msgid "pin does not have IRQ capabilities" +msgstr "Pino não tem recursos de IRQ" -#: shared-bindings/digitalio/DigitalInOut.c:340 -msgid "Unsupported pull value." +#: shared-bindings/displayio/Bitmap.c +msgid "pixel coordinates out of bounds" msgstr "" -#: shared-bindings/displayio/Bitmap.c:84 -msgid "y should be an int" -msgstr "y deve ser um int" +#: shared-bindings/displayio/Bitmap.c +msgid "pixel value requires too many bits" +msgstr "" -#: shared-bindings/displayio/Bitmap.c:89 -msgid "row buffer must be a bytearray or array of type 'b' or 'B'" +#: shared-bindings/displayio/TileGrid.c +msgid "pixel_shader must be displayio.Palette or displayio.ColorConverter" msgstr "" -#: shared-bindings/displayio/Bitmap.c:94 -msgid "row data must be a buffer" +#: ports/atmel-samd/common-hal/pulseio/PulseIn.c +#: ports/nrf/common-hal/pulseio/PulseIn.c +#: ports/esp8266/common-hal/pulseio/PulseIn.c +msgid "pop from an empty PulseIn" msgstr "" -#: shared-bindings/displayio/ColorConverter.c:72 -msgid "color should be an int" -msgstr "cor deve ser um int" +#: py/objset.c +msgid "pop from an empty set" +msgstr "" -#: shared-bindings/displayio/FourWire.c:55 -#: shared-bindings/displayio/FourWire.c:64 -msgid "displayio is a work in progress" +#: py/objlist.c +msgid "pop from empty list" msgstr "" -#: shared-bindings/displayio/Group.c:65 -msgid "Group must have size at least 1" -msgstr "Grupo deve ter tamanho pelo menos 1" +#: py/objdict.c +msgid "popitem(): dictionary is empty" +msgstr "" -#: shared-bindings/displayio/Palette.c:96 -msgid "color buffer must be a bytearray or array of type 'b' or 'B'" +#: py/objint_mpz.c +msgid "pow() 3rd argument cannot be 0" msgstr "" -#: shared-bindings/displayio/Palette.c:102 -msgid "color buffer must be 3 bytes (RGB) or 4 bytes (RGB + pad byte)" +#: py/objint_mpz.c +msgid "pow() with 3 arguments requires integers" msgstr "" -#: shared-bindings/displayio/Palette.c:106 -msgid "color must be between 0x000000 and 0xffffff" -msgstr "cor deve estar entre 0x000000 e 0xffffff" +#: extmod/modutimeq.c +msgid "queue overflow" +msgstr "estouro de fila" -#: shared-bindings/displayio/Palette.c:110 -msgid "color buffer must be a buffer or int" +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "rawbuf is not the same size as buf" msgstr "" -#: shared-bindings/displayio/Palette.c:123 -#: shared-bindings/displayio/Palette.c:137 -msgid "palette_index should be an int" +#: shared-bindings/_pixelbuf/__init__.c +#, fuzzy +msgid "readonly attribute" +msgstr "atributo ilegível" + +#: py/builtinimport.c +msgid "relative import" msgstr "" -#: shared-bindings/displayio/Sprite.c:48 -msgid "position must be 2-tuple" +#: py/obj.c +#, c-format +msgid "requested length %d but object has length %d" msgstr "" -#: shared-bindings/displayio/Sprite.c:97 -msgid "unsupported bitmap type" +#: py/compile.c +msgid "return annotation must be an identifier" msgstr "" -#: shared-bindings/displayio/Sprite.c:162 -msgid "pixel_shader must be displayio.Palette or displayio.ColorConverter" +#: py/emitnative.c +msgid "return expected '%q' but got '%q'" msgstr "" -#: shared-bindings/gamepad/GamePad.c:100 -msgid "too many arguments" -msgstr "muitos argumentos" +#: shared-module/displayio/Bitmap.c +msgid "row must be packed and word aligned" +msgstr "Linha deve ser comprimida e com as palavras alinhadas" -#: shared-bindings/gamepad/GamePad.c:104 -msgid "expected a DigitalInOut" +#: py/objstr.c +msgid "rsplit(None,n)" msgstr "" -#: shared-bindings/i2cslave/I2CSlave.c:98 -msgid "can't convert address to int" +#: shared-bindings/audioio/RawSample.c +msgid "" +"sample_source buffer must be a bytearray or array of type 'h', 'H', 'b' or " +"'B'" msgstr "" -#: shared-bindings/i2cslave/I2CSlave.c:101 -msgid "address out of bounds" -msgstr "" +#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c +msgid "sampling rate out of range" +msgstr "Taxa de amostragem fora do intervalo" -#: shared-bindings/i2cslave/I2CSlave.c:107 -msgid "addresses is empty" -msgstr "" +#: ports/esp8266/modnetwork.c +msgid "scan failed" +msgstr "varredura falhou" -#: shared-bindings/microcontroller/Pin.c:89 -#: shared-bindings/neopixel_write/__init__.c:67 -#: shared-bindings/pulseio/PulseOut.c:76 -msgid "Expected a %q" -msgstr "Esperado um" +#: py/modmicropython.c +msgid "schedule stack full" +msgstr "" -#: shared-bindings/microcontroller/Pin.c:100 -msgid "%q in use" -msgstr "%q em uso" +#: lib/utils/pyexec.c py/builtinimport.c +msgid "script compilation not supported" +msgstr "compilação de script não suportada" -#: shared-bindings/microcontroller/__init__.c:126 -msgid "Invalid run mode." +#: shared-bindings/bleio/Peripheral.c +msgid "services includes an object that is not a Service" msgstr "" -#: shared-bindings/multiterminal/__init__.c:68 -msgid "Stream missing readinto() or write() method." +#: py/objstr.c +msgid "sign not allowed in string format specifier" msgstr "" -#: shared-bindings/nvm/ByteArray.c:99 -msgid "Slice and value different lengths." +#: py/objstr.c +msgid "sign not allowed with integer format specifier 'c'" msgstr "" -#: shared-bindings/nvm/ByteArray.c:104 -msgid "Array values should be single bytes." +#: py/objstr.c +msgid "single '}' encountered in format string" msgstr "" -#: shared-bindings/nvm/ByteArray.c:111 shared-bindings/nvm/ByteArray.c:141 -msgid "Unable to write to nvm." -msgstr "Não é possível gravar no nvm." +#: shared-bindings/time/__init__.c +msgid "sleep length must be non-negative" +msgstr "" -#: shared-bindings/nvm/ByteArray.c:137 -msgid "Bytes must be between 0 and 255." -msgstr "Os bytes devem estar entre 0 e 255." +#: py/objslice.c py/sequence.c +msgid "slice step cannot be zero" +msgstr "" -#: shared-bindings/os/__init__.c:200 -msgid "No hardware random available" +#: py/sequence.c py/objint.c +msgid "small int overflow" msgstr "" -#: shared-bindings/pulseio/PWMOut.c:164 -msgid "" -"PWM duty_cycle must be between 0 and 65535 inclusive (16 bit resolution)" +#: main.c +msgid "soft reboot\n" msgstr "" -#: shared-bindings/pulseio/PWMOut.c:195 -msgid "" -"PWM frequency not writable when variable_frequency is False on construction." +#: py/objstr.c +msgid "start/end indices" msgstr "" -#: shared-bindings/pulseio/PulseIn.c:275 -msgid "Cannot delete values" -msgstr "Não é possível excluir valores" +#: shared-bindings/displayio/Shape.c +#, fuzzy +msgid "start_x should be an int" +msgstr "y deve ser um int" -#: shared-bindings/pulseio/PulseIn.c:281 -msgid "Slices not supported" +#: shared-bindings/random/__init__.c +msgid "step must be non-zero" +msgstr "o passo deve ser diferente de zero" + +#: shared-bindings/busio/UART.c +msgid "stop must be 1 or 2" msgstr "" -#: shared-bindings/pulseio/PulseIn.c:287 -msgid "index must be int" -msgstr "index deve ser int" +#: shared-bindings/random/__init__.c +msgid "stop not reachable from start" +msgstr "" -#: shared-bindings/pulseio/PulseIn.c:293 -msgid "Read-only" -msgstr "Somente leitura" +#: py/stream.c +msgid "stream operation not supported" +msgstr "" -#: shared-bindings/pulseio/PulseOut.c:135 -msgid "Array must contain halfwords (type 'H')" -msgstr "Array deve conter meias palavras (tipo 'H')" +#: py/objstrunicode.c +msgid "string index out of range" +msgstr "" -#: shared-bindings/random/__init__.c:92 shared-bindings/random/__init__.c:100 -msgid "stop not reachable from start" +#: py/objstrunicode.c +#, c-format +msgid "string indices must be integers, not %s" msgstr "" -#: shared-bindings/random/__init__.c:111 -msgid "step must be non-zero" -msgstr "o passo deve ser diferente de zero" +#: py/stream.c +msgid "string not supported; use bytes or bytearray" +msgstr "" -#: shared-bindings/random/__init__.c:114 -msgid "invalid step" -msgstr "passo inválido" +#: extmod/moductypes.c +msgid "struct: cannot index" +msgstr "struct: não pode indexar" -#: shared-bindings/random/__init__.c:146 -msgid "empty sequence" -msgstr "seqüência vazia" +#: extmod/moductypes.c +msgid "struct: index out of range" +msgstr "struct: índice fora do intervalo" -#: shared-bindings/rtc/RTC.c:40 shared-bindings/rtc/RTC.c:44 -#: shared-bindings/time/__init__.c:190 -msgid "RTC is not supported on this board" -msgstr "O RTC não é suportado nesta placa" +#: extmod/moductypes.c +msgid "struct: no fields" +msgstr "struct: sem campos" -#: shared-bindings/rtc/RTC.c:52 -msgid "RTC calibration is not supported on this board" -msgstr "A calibração RTC não é suportada nesta placa" +#: py/objstr.c +msgid "substring not found" +msgstr "" -#: shared-bindings/socket/__init__.c:516 shared-module/network/__init__.c:81 -msgid "no available NIC" +#: py/compile.c +msgid "super() can't find self" msgstr "" -#: shared-bindings/storage/__init__.c:77 -msgid "filesystem must provide mount method" -msgstr "sistema de arquivos deve fornecer método de montagem" +#: extmod/modujson.c +msgid "syntax error in JSON" +msgstr "erro de sintaxe no JSON" -#: shared-bindings/supervisor/__init__.c:93 -msgid "Brightness must be between 0 and 255" -msgstr "O brilho deve estar entre 0 e 255" +#: extmod/moductypes.c +msgid "syntax error in uctypes descriptor" +msgstr "" -#: shared-bindings/supervisor/__init__.c:119 -msgid "Stack size must be at least 256" -msgstr "O tamanho da pilha deve ser pelo menos 256" +#: shared-bindings/touchio/TouchIn.c +msgid "threshold must be in the range 0-65536" +msgstr "Limite deve estar no alcance de 0-65536" -#: shared-bindings/time/__init__.c:78 -msgid "sleep length must be non-negative" +#: shared-bindings/displayio/TileGrid.c +msgid "tile index out of bounds" msgstr "" -#: shared-bindings/time/__init__.c:88 -msgid "time.struct_time() takes exactly 1 argument" +#: shared-bindings/time/__init__.c +msgid "time.struct_time() takes a 9-sequence" msgstr "" -#: shared-bindings/time/__init__.c:91 -msgid "time.struct_time() takes a 9-sequence" +#: shared-bindings/time/__init__.c +msgid "time.struct_time() takes exactly 1 argument" msgstr "" -#: shared-bindings/time/__init__.c:169 shared-bindings/time/__init__.c:263 -msgid "Tuple or struct_time argument required" -msgstr "Tuple or struct_time argument required" +#: shared-bindings/busio/UART.c +msgid "timeout >100 (units are now seconds, not msecs)" +msgstr "" -#: shared-bindings/time/__init__.c:174 shared-bindings/time/__init__.c:268 -msgid "function takes exactly 9 arguments" -msgstr "função leva exatamente 9 argumentos" +#: shared-bindings/bleio/CharacteristicBuffer.c +#, fuzzy +msgid "timeout must be >= 0.0" +msgstr "bits devem ser 8" -#: shared-bindings/time/__init__.c:239 shared-bindings/time/__init__.c:272 +#: shared-bindings/time/__init__.c msgid "timestamp out of range for platform time_t" msgstr "timestamp fora do intervalo para a plataforma time_t" -#: shared-bindings/touchio/TouchIn.c:173 -msgid "threshold must be in the range 0-65536" -msgstr "Limite deve estar no alcance de 0-65536" +#: shared-bindings/gamepad/GamePad.c +msgid "too many arguments" +msgstr "muitos argumentos" -#: shared-bindings/util.c:38 -msgid "" -"Object has been deinitialized and can no longer be used. Create a new object." +#: shared-module/struct/__init__.c +msgid "too many arguments provided with the given format" +msgstr "Muitos argumentos fornecidos com o formato dado" + +#: py/runtime.c +#, c-format +msgid "too many values to unpack (expected %d)" msgstr "" -"Objeto foi desinicializado e não pode ser mais usaado. Crie um novo objeto." -#: shared-module/audioio/Mixer.c:47 shared-module/audioio/WaveFile.c:117 -msgid "Couldn't allocate first buffer" -msgstr "Não pôde alocar primeiro buffer" +#: py/objstr.c +msgid "tuple index out of range" +msgstr "" -#: shared-module/audioio/Mixer.c:53 shared-module/audioio/WaveFile.c:123 -msgid "Couldn't allocate second buffer" -msgstr "Não pôde alocar segundo buffer" +#: py/obj.c +msgid "tuple/list has wrong length" +msgstr "" -#: shared-module/audioio/Mixer.c:82 -msgid "Voice index too high" +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "tuple/list required on RHS" msgstr "" -#: shared-module/audioio/Mixer.c:85 -msgid "The sample's sample rate does not match the mixer's" +#: ports/atmel-samd/common-hal/busio/UART.c ports/nrf/common-hal/busio/UART.c +msgid "tx and rx cannot both be None" +msgstr "TX e RX não podem ser ambos" + +#: py/objtype.c +msgid "type '%q' is not an acceptable base type" msgstr "" -#: shared-module/audioio/Mixer.c:88 -msgid "The sample's channel count does not match the mixer's" +#: py/objtype.c +msgid "type is not an acceptable base type" msgstr "" -#: shared-module/audioio/Mixer.c:91 -msgid "The sample's bits_per_sample does not match the mixer's" +#: py/runtime.c +msgid "type object '%q' has no attribute '%q'" msgstr "" -#: shared-module/audioio/Mixer.c:100 -msgid "The sample's signedness does not match the mixer's" +#: py/objtype.c +msgid "type takes 1 or 3 arguments" msgstr "" -#: shared-module/audioio/WaveFile.c:61 -msgid "Invalid wave file" -msgstr "Aqruivo de ondas inválido" +#: py/objint_longlong.c +msgid "ulonglong too large" +msgstr "" -#: shared-module/audioio/WaveFile.c:69 -msgid "Invalid format chunk size" -msgstr "Tamanho do pedaço de formato inválido" +#: py/emitnative.c +msgid "unary op %q not implemented" +msgstr "" -#: shared-module/audioio/WaveFile.c:83 -msgid "Unsupported format" -msgstr "Formato não suportado" +#: py/parse.c +msgid "unexpected indent" +msgstr "" -#: shared-module/audioio/WaveFile.c:99 -msgid "Data chunk must follow fmt chunk" -msgstr "Pedaço de dados deve seguir o pedaço de cortes" +#: py/bc.c +msgid "unexpected keyword argument" +msgstr "" -#: shared-module/audioio/WaveFile.c:107 -msgid "Invalid file" -msgstr "Arquivo inválido" +#: py/objnamedtuple.c py/bc.c +msgid "unexpected keyword argument '%q'" +msgstr "" -#: shared-module/bitbangio/I2C.c:58 -msgid "Clock stretch too long" -msgstr "Clock se estendeu por tempo demais" +#: py/lexer.c +msgid "unicode name escapes" +msgstr "" -#: shared-module/bitbangio/SPI.c:44 -msgid "Clock pin init failed." -msgstr "Inicialização do pino de Clock falhou." +#: py/parse.c +msgid "unindent does not match any outer indentation level" +msgstr "" -#: shared-module/bitbangio/SPI.c:50 -msgid "MOSI pin init failed." -msgstr "Inicialização do pino MOSI falhou." +#: ports/esp8266/modnetwork.c +msgid "unknown config param" +msgstr "parâmetro configuração desconhecido" -#: shared-module/bitbangio/SPI.c:61 -msgid "MISO pin init failed." -msgstr "Inicialização do pino MISO falhou" +#: py/objstr.c +#, c-format +msgid "unknown conversion specifier %c" +msgstr "" -#: shared-module/bitbangio/SPI.c:121 -msgid "Cannot write without MOSI pin." -msgstr "Não é possível ler sem um pino MOSI" +#: py/objstr.c +#, c-format +msgid "unknown format code '%c' for object of type '%s'" +msgstr "" -#: shared-module/bitbangio/SPI.c:176 -msgid "Cannot read without MISO pin." -msgstr "Não é possível ler sem o pino MISO." +#: py/objstr.c +#, c-format +msgid "unknown format code '%c' for object of type 'float'" +msgstr "" -#: shared-module/bitbangio/SPI.c:240 -msgid "Cannot transfer without MOSI and MISO pins." -msgstr "Não é possível transferir sem os pinos MOSI e MISO." +#: py/objstr.c +#, c-format +msgid "unknown format code '%c' for object of type 'str'" +msgstr "" -#: shared-module/displayio/Bitmap.c:49 -msgid "Only bit maps of 8 bit color or less are supported" -msgstr "Apenas bit maps de cores de 8 bit ou menos são suportados" +#: ports/esp8266/modnetwork.c +msgid "unknown status param" +msgstr "parâmetro de status desconhecido" -#: shared-module/displayio/Bitmap.c:69 -msgid "row must be packed and word aligned" -msgstr "Linha deve ser comprimida e com as palavras alinhadas" +#: py/compile.c +msgid "unknown type" +msgstr "" -#: shared-module/displayio/Group.c:39 -msgid "Group full" -msgstr "Grupo cheio" +#: py/emitnative.c +msgid "unknown type '%q'" +msgstr "" -#: shared-module/displayio/Group.c:48 -msgid "Group empty" -msgstr "Grupo vazio" +#: py/objstr.c +msgid "unmatched '{' in format" +msgstr "" -#: shared-module/displayio/OnDiskBitmap.c:49 -msgid "Invalid BMP file" -msgstr "Arquivo BMP inválido" +#: py/objtype.c py/runtime.c +msgid "unreadable attribute" +msgstr "atributo ilegível" -#: shared-module/displayio/OnDiskBitmap.c:59 +#: py/emitinlinethumb.c #, c-format -msgid "Only Windows format, uncompressed BMP supported %d" -msgstr "Apenas formato Windows, BMP descomprimido suportado" +msgid "unsupported Thumb instruction '%s' with %d arguments" +msgstr "" -#: shared-module/displayio/OnDiskBitmap.c:64 +#: py/emitinlinextensa.c #, c-format -msgid "Only true color (24 bpp or higher) BMP supported %x" -msgstr "Apenas cores verdadeiras (24 bpp ou maior) BMP suportadas" - -#: shared-module/storage/__init__.c:155 -msgid "Cannot remount '/' when USB is active." -msgstr "Não é possível remontar '/' enquanto o USB estiver ativo." - -#: shared-module/struct/__init__.c:39 -msgid "'S' and 'O' are not supported format types" -msgstr "'S' e 'O' não são tipos de formato suportados" +msgid "unsupported Xtensa instruction '%s' with %d arguments" +msgstr "" -#: shared-module/struct/__init__.c:83 -msgid "too many arguments provided with the given format" -msgstr "Muitos argumentos fornecidos com o formato dado" +#: shared-bindings/displayio/TileGrid.c +msgid "unsupported bitmap type" +msgstr "" -#: shared-module/usb_hid/Device.c:45 +#: py/objstr.c #, c-format -msgid "Buffer incorrect size. Should be %d bytes." -msgstr "Buffer de tamanho incorreto. Deve ser %d bytes." - -#: shared-module/usb_hid/Device.c:53 -msgid "USB Busy" -msgstr "USB ocupada" - -#: shared-module/usb_hid/Device.c:59 -msgid "USB Error" -msgstr "Erro na USB" - -#: supervisor/shared/safe_mode.c:97 -msgid "You requested starting safe mode by " -msgstr "Você solicitou o início do modo de segurança" - -#: supervisor/shared/safe_mode.c:100 -msgid "To exit, please reset the board without " -msgstr "Para sair, por favor, reinicie a placa sem " - -#: supervisor/shared/safe_mode.c:107 -msgid "" -"You are running in safe mode which means something unanticipated happened.\n" +msgid "unsupported format character '%c' (0x%x) at index %d" msgstr "" -#: supervisor/shared/safe_mode.c:109 -msgid "" -"Looks like our core CircuitPython code crashed hard. Whoops!\n" -"Please file an issue at https://github.com/adafruit/circuitpython/issues\n" -" with the contents of your CIRCUITPY drive and this message:\n" +#: py/runtime.c +msgid "unsupported type for %q: '%s'" msgstr "" -#: supervisor/shared/safe_mode.c:111 -msgid "Crash into the HardFault_Handler.\n" +#: py/runtime.c +msgid "unsupported type for operator" msgstr "" -#: supervisor/shared/safe_mode.c:113 -msgid "MicroPython NLR jump failed. Likely memory corruption.\n" +#: py/runtime.c +msgid "unsupported types for %q: '%s', '%s'" msgstr "" -#: supervisor/shared/safe_mode.c:115 -msgid "MicroPython fatal error.\n" +#: shared-bindings/displayio/Bitmap.c +msgid "value_count must be > 0" msgstr "" -#: supervisor/shared/safe_mode.c:118 -msgid "" -"The microcontroller's power dipped. Please make sure your power supply " -"provides\n" -"enough power for the whole circuit and press reset (after ejecting " -"CIRCUITPY).\n" -msgstr "" +#: ports/esp8266/modnetwork.c +msgid "wifi_set_ip_info() failed" +msgstr "wifi_set_ip_info() falhou" -#: supervisor/shared/safe_mode.c:120 -msgid "" -"The CircuitPython heap was corrupted because the stack was too small.\n" -"Please increase stack size limits and press reset (after ejecting " -"CIRCUITPY).\n" -"If you didn't change the stack, then file an issue here with the contents of " -"your CIRCUITPY drive:\n" +#: shared-bindings/_pixelbuf/PixelBuf.c +msgid "write_args must be a list, tuple, or None" msgstr "" -#: supervisor/shared/safe_mode.c:123 -msgid "" -"The reset button was pressed while booting CircuitPython. Press again to " -"exit safe mode.\n" +#: py/objstr.c +msgid "wrong number of arguments" msgstr "" -#~ msgid "Can not apply device name in the stack." -#~ msgstr "Não é possível aplicar o nome do dispositivo na pilha." - -#~ msgid "Can not add Characteristic." -#~ msgstr "Não é possível adicionar Característica." +#: py/runtime.c +msgid "wrong number of values to unpack" +msgstr "" -#~ msgid "Can encode UUID into the advertisement packet." -#~ msgstr "Pode codificar o UUID no pacote de anúncios." +#: shared-module/displayio/Shape.c +msgid "x value out of bounds" +msgstr "" -#~ msgid "Invalid Service type" -#~ msgstr "Tipo de serviço inválido" +#: shared-bindings/displayio/Shape.c +msgid "y should be an int" +msgstr "y deve ser um int" -#~ msgid "Cannot apply GAP parameters." -#~ msgstr "Não é possível aplicar parâmetros GAP." +#: shared-module/displayio/Shape.c +msgid "y value out of bounds" +msgstr "" -#~ msgid "Cannot set PPCP parameters." -#~ msgstr "Não é possível definir parâmetros PPCP." +#: py/objrange.c +msgid "zero step" +msgstr "passo zero" -#~ msgid "Can not query for the device address." -#~ msgstr "Não é possível consultar o endereço do dispositivo." +#, fuzzy +#~ msgid "Failed to notify or indicate attribute value, err %0x04x" +#~ msgstr "Não é possível gravar o valor do atributo. status: 0x%02x" -#~ msgid "Baud rate too high for this SPI peripheral" -#~ msgstr "Taxa de transmissão muito alta para esse periférico SPI" +#, fuzzy +#~ msgid "Failed to read attribute value, err %0x04x" +#~ msgstr "Não é possível ler o valor do atributo. status: 0x%02x" -#~ msgid "Can not apply advertisement data. status: 0x%02x" -#~ msgstr "Não é possível aplicar dados de anúncio. status: 0x%02x" +#~ msgid "Only Windows format, uncompressed BMP supported %d" +#~ msgstr "Apenas formato Windows, BMP descomprimido suportado" -#~ msgid "Can not add Service." -#~ msgstr "Não é possível adicionar o serviço." +#~ msgid "Only true color (24 bpp or higher) BMP supported %x" +#~ msgstr "Apenas cores verdadeiras (24 bpp ou maior) BMP suportadas" @@ -44,11 +44,13 @@ #include "lib/utils/pyexec.h" #include "mpconfigboard.h" +#include "shared-module/displayio/__init__.h" #include "supervisor/cpu.h" #include "supervisor/memory.h" #include "supervisor/port.h" #include "supervisor/filesystem.h" #include "supervisor/shared/autoreload.h" +#include "supervisor/shared/board_busses.h" #include "supervisor/shared/translate.h" #include "supervisor/shared/rgb_led_status.h" #include "supervisor/shared/safe_mode.h" @@ -56,7 +58,7 @@ #include "supervisor/shared/stack.h" #include "supervisor/serial.h" -#ifdef MICROPY_PY_NETWORK +#if CIRCUITPY_NETWORK #include "shared-module/network/__init__.h" #endif @@ -116,15 +118,28 @@ void start_mp(supervisor_allocation* heap) { mp_obj_list_init(mp_sys_argv, 0); - #if MICROPY_PY_NETWORK + #if CIRCUITPY_NETWORK network_module_init(); #endif } void stop_mp(void) { - #if MICROPY_PY_NETWORK + #if CIRCUITPY_NETWORK network_module_deinit(); #endif + + #if MICROPY_VFS + mp_vfs_mount_t *vfs = MP_STATE_VM(vfs_mount_table); + + // Unmount all heap allocated vfs mounts. + while (gc_nbytes(vfs) > 0) { + vfs = vfs->next; + } + MP_STATE_VM(vfs_mount_table) = vfs; + MP_STATE_VM(vfs_cur) = vfs; + #endif + + gc_deinit(); } #define STRING_LIST(...) {__VA_ARGS__, ""} @@ -183,8 +198,8 @@ bool run_code_py(safe_mode_t safe_mode) { } else { new_status_color(MAIN_RUNNING); - const char *supported_filenames[] = STRING_LIST("code.txt", "code.py", "main.py", "main.txt"); - const char *double_extension_filenames[] = STRING_LIST("code.txt.py", "code.py.txt", "code.txt.txt","code.py.py", + static const char *supported_filenames[] = STRING_LIST("code.txt", "code.py", "main.py", "main.txt"); + static const char *double_extension_filenames[] = STRING_LIST("code.txt.py", "code.py.txt", "code.txt.txt","code.py.py", "main.txt.py", "main.py.txt", "main.txt.txt","main.py.py"); stack_resize(); @@ -198,10 +213,17 @@ bool run_code_py(safe_mode_t safe_mode) { serial_write_compressed(translate("WARNING: Your code filename has two extensions\n")); } } + // Turn off the display and flush the fileystem before the heap disappears. + #if CIRCUITPY_DISPLAYIO + reset_displays(); + #endif + filesystem_flush(); stop_mp(); free_memory(heap); + supervisor_move_memory(); reset_port(); + reset_board_busses(); reset_board(); reset_status_led(); @@ -211,6 +233,10 @@ bool run_code_py(safe_mode_t safe_mode) { } // Wait for connection or character. + if (!serial_connected_at_start) { + serial_write_compressed(translate("\nCode done running. Waiting for reload.\n")); + } + bool serial_connected_before_animation = false; rgb_status_animation_t animation; prep_rgb_status_animation(&result, found_main, safe_mode, &animation); @@ -219,6 +245,7 @@ bool run_code_py(safe_mode_t safe_mode) { MICROPY_VM_HOOK_LOOP #endif if (reload_requested) { + reload_requested = false; return true; } @@ -296,12 +323,12 @@ void __attribute__ ((noinline)) run_boot_py(safe_mode_t safe_mode) { mp_hal_delay_ms(1500); // USB isn't up, so we can write the file. - filesystem_writable_by_python(true); + filesystem_set_internal_writable_by_usb(false); f_open(fs, boot_output_file, CIRCUITPY_BOOT_OUTPUT_FILE, FA_WRITE | FA_CREATE_ALWAYS); // Switch the filesystem back to non-writable by Python now instead of later, // since boot.py might change it back to writable. - filesystem_writable_by_python(false); + filesystem_set_internal_writable_by_usb(true); // Write version info to boot_out.txt. mp_hal_stdout_tx_str(MICROPY_FULL_VERSION_INFO); @@ -332,6 +359,7 @@ void __attribute__ ((noinline)) run_boot_py(safe_mode_t safe_mode) { reset_board(); stop_mp(); free_memory(heap); + supervisor_move_memory(); } } @@ -348,10 +376,12 @@ int run_repl(void) { } else { exit_code = pyexec_friendly_repl(); } + filesystem_flush(); reset_port(); reset_board(); stop_mp(); free_memory(heap); + supervisor_move_memory(); autoreload_resume(); return exit_code; } @@ -387,7 +417,8 @@ int __attribute__((used)) main(void) { // 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. - filesystem_writable_by_python(false); + filesystem_set_internal_concurrent_write_protection(true); + filesystem_set_internal_writable_by_usb(true); run_boot_py(safe_mode); diff --git a/mpy-cross/Makefile b/mpy-cross/Makefile index fb1ab1ffd..42dbace98 100644 --- a/mpy-cross/Makefile +++ b/mpy-cross/Makefile @@ -78,6 +78,7 @@ endif SRC_C = \ main.c \ gccollect.c \ + supervisor/stub/safe_mode.c \ supervisor/stub/stack.c \ supervisor/shared/translate.c diff --git a/ports/atmel-samd/Makefile b/ports/atmel-samd/Makefile index 9a31eb42a..0851b6bbb 100644 --- a/ports/atmel-samd/Makefile +++ b/ports/atmel-samd/Makefile @@ -1,3 +1,27 @@ +# This file is part of the MicroPython project, http://micropython.org/ +# +# The MIT License (MIT) +# +# Copyright (c) 2019 Dan Halbert for Adafruit Industries +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + # Select the board to build for. ifeq ($(BOARD),) $(error You must provide a BOARD parameter) @@ -7,13 +31,16 @@ else endif endif - # If the build directory is not given, make it reflect the board name. BUILD ?= build-$(BOARD) include ../../py/mkenv.mk +# Board-specific include boards/$(BOARD)/mpconfigboard.mk --include mpconfigport.mk +# Port-specific +include mpconfigport.mk +# CircuitPython-specific +include $(TOP)/py/circuitpy_mpconfig.mk # qstr definitions (must come before including py.mk) QSTR_DEFS = qstrdefsport.h @@ -23,9 +50,10 @@ include $(TOP)/py/py.mk include $(TOP)/supervisor/supervisor.mk -CROSS_COMPILE = arm-none-eabi- +# Include make rules and variables common across CircuitPython builds. +include $(TOP)/py/circuitpy_defns.mk -BOSSAC := tools/bossac_osx +CROSS_COMPILE = arm-none-eabi- HAL_DIR=hal/$(MCU_SERIES) @@ -54,48 +82,19 @@ INC += -I. \ -I../../supervisor/shared/usb \ -I$(BUILD) -BASE_CFLAGS = \ - -fsingle-precision-constant \ - -fno-strict-aliasing \ - -Wdouble-promotion \ - -Wno-endif-labels \ - -Wstrict-prototypes \ - -Werror-implicit-function-declaration \ - -Wfloat-equal \ - -Wundef \ - -Wshadow \ - -Wwrite-strings \ - -Wsign-compare \ - -Wmissing-format-attribute \ - -Wno-deprecated-declarations \ - -Wnested-externs \ - -Wunreachable-code \ - -Wcast-align \ - -Wno-error=lto-type-mismatch \ - -D__$(CHIP_VARIANT)__ \ - -ffunction-sections \ - -fdata-sections \ - -fshort-enums \ - -DCIRCUITPY_SOFTWARE_SAFE_MODE=0x0ADABEEF \ - -DCIRCUITPY_CANARY_WORD=0xADAF00 \ - -DCIRCUITPY_SAFE_RESTART_WORD=0xDEADBEEF \ - --param max-inline-insns-single=500 - - # Use these flags to debug build times and header includes. - # -ftime-report - # -H + # NDEBUG disables assert() statements. This reduces code size pretty dramatically, per tannewt. ifeq ($(CHIP_FAMILY), samd21) CFLAGS += -Os -DNDEBUG # TinyUSB defines -CFLAGS += -DCFG_TUSB_MCU=OPT_MCU_SAMD21 -DCFG_TUD_CDC_RX_BUFSIZE=128 -DCFG_TUD_CDC_TX_BUFSIZE=128 -DCFG_TUD_MSC_BUFSIZE=512 +CFLAGS += -DCFG_TUSB_MCU=OPT_MCU_SAMD21 -DCFG_TUD_MIDI_RX_BUFSIZE=128 -DCFG_TUD_CDC_RX_BUFSIZE=128 -DCFG_TUD_MIDI_TX_BUFSIZE=128 -DCFG_TUD_CDC_TX_BUFSIZE=128 -DCFG_TUD_MSC_BUFSIZE=512 endif ifeq ($(CHIP_FAMILY), samd51) CFLAGS += -Os -DNDEBUG # TinyUSB defines -CFLAGS += -DCFG_TUSB_MCU=OPT_MCU_SAMD51 -DCFG_TUD_CDC_RX_BUFSIZE=256 -DCFG_TUD_CDC_TX_BUFSIZE=256 -DCFG_TUD_MSC_BUFSIZE=1024 +CFLAGS += -DCFG_TUSB_MCU=OPT_MCU_SAMD51 -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 #Debugging/Optimization @@ -113,7 +112,7 @@ else # -finline-limit can shrink the image size. # -finline-limit=80 or so is similar to not having it on. # There is no simple default value, though. - ifdef INTERNAL_FLASH_FILESYSTEM + ifeq ($(INTERNAL_FLASH_FILESYSTEM),1) CFLAGS += -finline-limit=50 endif ifdef CFLAGS_INLINE_LIMIT @@ -143,22 +142,7 @@ CFLAGS += \ -DSAMD51 endif -ifneq ($(FROZEN_DIR),) -# To use frozen source modules, put your .py files in a subdirectory (eg scripts/) -# and then invoke make with FROZEN_DIR=scripts (be sure to build from scratch). -CFLAGS += -DMICROPY_MODULE_FROZEN_STR -CFLAGS += -Wno-error=lto-type-mismatch -endif - -# To use frozen bytecode, put your .py files in a subdirectory (eg frozen/) and -# then invoke make with FROZEN_MPY_DIR=frozen or FROZEN_MPY_DIRS="dir1 dir2" -# (be sure to build from scratch). -ifneq ($(FROZEN_MPY_DIRS),) -CFLAGS += -DMICROPY_QSTR_EXTRA_POOL=mp_qstr_frozen_const_pool -CFLAGS += -DMICROPY_MODULE_FROZEN_MPY -CFLAGS += -Wno-error=lto-type-mismatch -endif LDFLAGS = $(CFLAGS) -nostartfiles -fshort-enums -Wl,-nostdlib -Wl,-T,$(LD_FILE) -Wl,-Map=$@.map -Wl,-cref -Wl,-gc-sections -specs=nano.specs LIBS := -lgcc -lc @@ -168,20 +152,6 @@ ifndef INTERNAL_LIBM LIBS += -lm endif -# Propagate longint choice from .mk to C. There's no easy string comparison -# in cpp coniditionals, so we #define separate names for each. -ifeq ($(LONGINT_IMPL),NONE) -CFLAGS += -DLONGINT_IMPL_NONE -endif - -ifeq ($(LONGINT_IMPL),MPZ) -CFLAGS += -DLONGINT_IMPL_MPZ -endif - -ifeq ($(LONGINT_IMPL),LONGLONG) -CFLAGS += -DLONGINT_IMPL_LONGLONG -endif - ifeq ($(CHIP_FAMILY), samd21) LDFLAGS += -mthumb -mcpu=cortex-m0plus -Lasf/thirdparty/CMSIS/Lib/GCC/ BOOTLOADER_SIZE := 0x2000 @@ -237,48 +207,48 @@ SRC_ASF := $(addprefix asf4/$(CHIP_FAMILY)/, $(SRC_ASF)) SRC_C = \ audio_dma.c \ - board_busses.c \ background.c \ - fatfs_port.c \ - mphalport.c \ - reset.c \ - peripherals/samd/clocks.c \ - peripherals/samd/dma.c \ - peripherals/samd/events.c \ - peripherals/samd/external_interrupts.c \ - peripherals/samd/sercom.c \ - peripherals/samd/timers.c \ - peripherals/samd/$(CHIP_FAMILY)/adc.c \ - peripherals/samd/$(CHIP_FAMILY)/cache.c \ - peripherals/samd/$(CHIP_FAMILY)/clocks.c \ - peripherals/samd/$(CHIP_FAMILY)/dma.c \ - peripherals/samd/$(CHIP_FAMILY)/events.c \ - peripherals/samd/$(CHIP_FAMILY)/external_interrupts.c \ - peripherals/samd/$(CHIP_FAMILY)/pins.c \ - peripherals/samd/$(CHIP_FAMILY)/sercom.c \ - peripherals/samd/$(CHIP_FAMILY)/timers.c \ - tick.c \ - bindings/samd/__init__.c \ bindings/samd/Clock.c \ + bindings/samd/__init__.c \ boards/$(BOARD)/board.c \ boards/$(BOARD)/pins.c \ + fatfs_port.c \ + freetouch/adafruit_ptc.c \ + lib/libc/string0.c \ + lib/mp-readline/readline.c \ lib/oofatfs/ff.c \ lib/oofatfs/option/ccsbcs.c \ lib/timeutils/timeutils.c \ lib/tinyusb/src/portable/microchip/$(CHIP_FAMILY)/dcd_$(CHIP_FAMILY).c \ - lib/tinyusb/src/portable/microchip/$(CHIP_FAMILY)/hal_$(CHIP_FAMILY).c \ lib/utils/buffer_helper.c \ lib/utils/context_manager_helpers.c \ lib/utils/interrupt_char.c \ lib/utils/pyexec.c \ lib/utils/stdout_helpers.c \ lib/utils/sys_stdio_mphal.c \ - lib/libc/string0.c \ - lib/mp-readline/readline.c \ - freetouch/adafruit_ptc.c \ - supervisor/shared/memory.c + mphalport.c \ + peripherals/samd/$(CHIP_FAMILY)/adc.c \ + peripherals/samd/$(CHIP_FAMILY)/cache.c \ + peripherals/samd/$(CHIP_FAMILY)/clocks.c \ + peripherals/samd/$(CHIP_FAMILY)/dma.c \ + peripherals/samd/$(CHIP_FAMILY)/events.c \ + peripherals/samd/$(CHIP_FAMILY)/external_interrupts.c \ + peripherals/samd/$(CHIP_FAMILY)/pins.c \ + peripherals/samd/$(CHIP_FAMILY)/sercom.c \ + peripherals/samd/$(CHIP_FAMILY)/timers.c \ + peripherals/samd/clocks.c \ + peripherals/samd/dma.c \ + peripherals/samd/events.c \ + peripherals/samd/external_interrupts.c \ + peripherals/samd/sercom.c \ + peripherals/samd/timers.c \ + reset.c \ + supervisor/shared/memory.c \ + tick.c \ + timer_handler.c \ -ifeq ($(MICROPY_PY_NETWORK),1) + +ifeq ($(CIRCUITPY_NETWORK),1) CFLAGS += -DMICROPY_PY_NETWORK=1 SRC_MOD += lib/netutils/netutils.c @@ -296,140 +266,17 @@ SRC_MOD += $(addprefix $(WIZNET5K_DIR)/,\ ) endif # MICROPY_PY_WIZNET5K -endif # MICROPY_PY_NETWORK - -SRC_COMMON_HAL = \ - board/__init__.c \ - busio/__init__.c \ - busio/I2C.c \ - busio/SPI.c \ - busio/UART.c \ - digitalio/__init__.c \ - digitalio/DigitalInOut.c \ - displayio/FourWire.c \ - i2cslave/__init__.c \ - i2cslave/I2CSlave.c \ - microcontroller/__init__.c \ - microcontroller/Pin.c \ - microcontroller/Processor.c \ - neopixel_write/__init__.c \ - os/__init__.c \ - rotaryio/__init__.c \ - rotaryio/IncrementalEncoder.c \ - rtc/__init__.c \ - rtc/RTC.c \ - supervisor/__init__.c \ - supervisor/Runtime.c \ - time/__init__.c \ - analogio/__init__.c \ - analogio/AnalogIn.c \ - analogio/AnalogOut.c \ - nvm/__init__.c \ - nvm/ByteArray.c \ - pulseio/__init__.c \ - pulseio/PulseIn.c \ - pulseio/PulseOut.c \ - pulseio/PWMOut.c \ - touchio/__init__.c \ - touchio/TouchIn.c +endif # CIRCUITPY_NETWORK -ifeq ($(INTERNAL_LIBM),1) -SRC_LIBM = $(addprefix lib/,\ - libm/math.c \ - libm/roundf.c \ - libm/fmodf.c \ - libm/nearbyintf.c \ - libm/ef_sqrt.c \ - libm/kf_rem_pio2.c \ - libm/kf_sin.c \ - libm/kf_cos.c \ - libm/kf_tan.c \ - libm/ef_rem_pio2.c \ - libm/sf_sin.c \ - libm/sf_cos.c \ - libm/sf_tan.c \ - libm/sf_frexp.c \ - libm/sf_modf.c \ - libm/sf_ldexp.c \ - libm/asinfacosf.c \ - libm/atanf.c \ - libm/atan2f.c \ - ) -endif - -# These don't have corresponding files in each port but are still located in -# shared-bindings to make it clear what the contents of the modules are. -SRC_BINDINGS_ENUMS = \ - digitalio/Direction.c \ - digitalio/DriveMode.c \ - digitalio/Pull.c \ - microcontroller/RunMode.c \ - help.c \ - math/__init__.c \ - supervisor/__init__.c \ - util.c - - -SRC_SHARED_MODULE = \ - bitbangio/__init__.c \ - bitbangio/I2C.c \ - bitbangio/OneWire.c \ - bitbangio/SPI.c \ - busio/OneWire.c \ - displayio/__init__.c \ - displayio/Bitmap.c \ - displayio/ColorConverter.c \ - displayio/Group.c \ - displayio/OnDiskBitmap.c \ - displayio/Palette.c \ - displayio/Sprite.c \ - gamepad/__init__.c \ - gamepad/GamePad.c \ - _stage/__init__.c \ - _stage/Layer.c \ - _stage/Text.c \ - storage/__init__.c \ - os/__init__.c \ - random/__init__.c \ - struct/__init__.c \ - uheap/__init__.c \ - ustack/__init__.c \ - usb_hid/__init__.c \ - usb_hid/Device.c - - # usb_midi/__init__.c - # usb_midi/Port.c - -ifeq ($(MICROPY_PY_NETWORK),1) -SRC_SHARED_MODULE += socket/__init__.c network/__init__.c +ifeq ($(CIRCUITPY_NETWORK),1) ifneq ($(MICROPY_PY_WIZNET5K),0) SRC_SHARED_MODULE += wiznet/__init__.c wiznet/wiznet5k.c endif endif -# SAMRs don't have a DAC -ifneq ($(CHIP_VARIANT),SAMR21G18A) - SRC_COMMON_HAL += \ - audioio/__init__.c \ - audioio/AudioOut.c - SRC_SHARED_MODULE += \ - audioio/__init__.c \ - audioio/Mixer.c \ - audioio/RawSample.c \ - audioio/WaveFile.c -endif - # The smallest SAMD51 packages don't have I2S. Everything else does. -ifneq ($(CHIP_VARIANT),SAMD51G18A) - ifneq ($(CHIP_VARIANT),SAMD51G19A) - ifneq ($(CHIP_VARIANT),SAMR21G18A) - SRC_COMMON_HAL += \ - audiobusio/__init__.c \ - audiobusio/I2SOut.c \ - audiobusio/PDMIn.c - SRC_C += peripherals/samd/i2s.c peripherals/samd/$(CHIP_FAMILY)/i2s.c - endif - endif +ifeq ($(CIRCUITPY_AUDIOBUSIO),1) +SRC_C += peripherals/samd/i2s.c peripherals/samd/$(CHIP_FAMILY)/i2s.c endif SRC_COMMON_HAL_EXPANDED = $(addprefix shared-bindings/, $(SRC_COMMON_HAL)) \ @@ -451,7 +298,7 @@ endif OBJ += $(addprefix $(BUILD)/, $(SRC_S:.s=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_MOD:.c=.o)) -SRC_QSTR += $(SRC_C) $(SRC_SUPERVISOR) $(SRC_COMMON_HAL_EXPANDED) $(SRC_SHARED_MODULE_EXPANDED) $(STM_SRC_C) +SRC_QSTR += $(SRC_C) $(SRC_SUPERVISOR) $(SRC_COMMON_HAL_EXPANDED) $(SRC_SHARED_MODULE_EXPANDED) # Sources that only hold QSTRs after pre-processing. SRC_QSTR_PREPROCESSOR += peripherals/samd/$(CHIP_FAMILY)/clocks.c @@ -470,20 +317,9 @@ $(BUILD)/firmware.uf2: $(BUILD)/firmware.bin $(STEPECHO) "Create $@" $(Q)$(PYTHON3) $(TOP)/tools/uf2/utils/uf2conv.py -b $(BOOTLOADER_SIZE) -c -o $@ $^ -deploy: $(BUILD)/firmware.bin - $(ECHO) "Writing $< to the board" - $(BOSSAC) -u $< - -# Run emulation build on a POSIX system with suitable terminal settings -run: - stty raw opost -echo - build/firmware.elf - @echo Resetting terminal... -# This sleep is useful to spot segfaults - sleep 1 - reset - -test: $(BUILD)/firmware.elf - $(Q)/bin/echo -e "print('hello world!', list(x+1 for x in range(10)), end='eol\\\\n')\\r\\n\\x04" | $(BUILD)/firmware.elf | tail -n2 | grep "^hello world! \\[1, 2, 3, 4, 5, 6, 7, 8, 9, 10\\]eol" - include $(TOP)/py/mkrules.mk + +# Print out the value of a make variable. +# https://stackoverflow.com/questions/16467718/how-to-print-out-a-variable-in-makefile +print-%: + @echo $* = $($*) diff --git a/ports/atmel-samd/README.rst b/ports/atmel-samd/README.rst index 6037c7d3b..167373b26 100644 --- a/ports/atmel-samd/README.rst +++ b/ports/atmel-samd/README.rst @@ -22,51 +22,51 @@ different names. The table below matches the pin order in and omits the pins only available on the largest package because all supported boards use smaller version. -===================== =================== =============== =========================== ====================== ================ ================== ========================= ================ ================ +===================== =================== =============== =========================== ====================== ================ ================== ========================= ================ ================================ ====================== ================ `microcontroller.pin` `board` ---------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -Datasheet arduino_mkrzero arduino_zero circuitplayground_express feather_m0_adalogger feather_m0_basic feather_m0_express gemma_m0 metro_m0_express trinket_m0 -===================== =================== =============== =========================== ====================== ================ ================== ========================= ================ ================ -PA00 ``ACCELEROMETER_SDA`` ``APA102_MOSI`` ``APA102_MOSI`` -PA01 ``ACCELEROMETER_SCL`` ``APA102_SCK`` ``APA102_SCK`` -PA02 ``A0`` ``A0`` ``A0`` / ``SPEAKER`` ``A0`` ``A0`` ``A0`` ``A0`` / ``D1`` ``A0`` ``D1`` / ``A0`` +--------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Datasheet arduino_mkrzero arduino_zero circuitplayground_express feather_m0_adalogger feather_m0_basic feather_m0_express gemma_m0 metro_m0_express sparkfun_samd21_mini sparkfun_samd21_dev trinket_m0 +===================== =================== =============== =========================== ====================== ================ ================== ========================= ================ ================================ ====================== ================ +PA00 ``ACCELEROMETER_SDA`` ``APA102_MOSI`` ``APA102_MOSI`` +PA01 ``ACCELEROMETER_SCL`` ``APA102_SCK`` ``APA102_SCK`` +PA02 ``A0`` ``A0`` ``A0`` / ``SPEAKER`` ``A0`` ``A0`` ``A0`` ``A0`` / ``D1`` ``A0`` ``A0`` ``A0`` ``D1`` / ``A0`` PA03 -PB08 ``L`` ``A1`` ``A7`` / ``TX`` ``A1`` ``A1`` ``A1`` ``A1`` -PB09 ``BATTERY`` ``A2`` ``A6`` / ``RX`` ``A2`` ``A2`` ``A2`` ``A2`` -PA04 ``A3`` ``A3`` ``IR_PROXIMITY`` ``A3`` ``A3`` ``A3`` ``D0`` / ``TX`` / ``SDA`` ``A3`` -PA05 ``A4`` ``A4`` ``A1`` ``A4`` ``A4`` ``A4`` ``D2`` / ``RX`` / ``SCL`` ``A4`` -PA06 ``A5`` ``D8`` ``A2`` ``D8`` / ``GREEN_LED`` ``NEOPIXEL`` ``D8`` ``D4`` / ``TX`` -PA07 ``A6`` ``D9`` ``A3`` ``D9`` ``D9`` ``D9`` ``D9`` ``D3`` / ``RX`` -PA08 ``D11`` / ``SDA`` ``D4`` ``MICROPHONE_DO`` ``D4`` / ``SD_CS`` ``D4`` ``D0`` / ``SDA`` -PA09 ``D12`` / ``SCL`` ``D3`` ``TEMPERATURE`` / ``A9`` ``D3`` ``D2`` / ``SCL`` -PA10 ``D2`` ``D1`` / ``TX`` ``MICROPHONE_SCK`` ``D1`` / ``TX`` ``D1`` / ``TX`` ``D1`` / ``TX`` ``D1`` / ``TX`` ``D13`` -PA11 ``D3`` ``D0`` / ``RX`` ``LIGHT`` / ``A8`` ``D0`` / ``RX`` ``D0`` / ``RX`` ``D0`` / ``RX`` ``D0`` / ``RX`` -PB10 ``D4`` ``MOSI`` ``MOSI`` ``MOSI`` ``MOSI`` ``MOSI`` -PB11 ``D5`` ``SCK`` ``SCK`` ``SCK`` ``SCK`` ``SCK`` -PA12 ``SD_MOSI`` ``MISO`` ``REMOTEIN`` / ``IR_RX`` ``MISO`` ``MISO`` ``MISO`` ``MISO`` -PA13 ``SD_SCK`` ``ACCELEROMETER_INTERRUPT`` ``FLASH_CS`` -PA14 ``SD_CS`` ``D2`` ``BUTTON_B`` / ``D5`` ``D2`` -PA15 ``SD_MISO`` ``D5`` ``SLIDE_SWITCH`` / ``D7`` ``D5`` ``D5`` ``D5`` ``D5`` -PA16 ``D8`` / ``MOSI`` ``D11`` ``MISO`` ``D11`` ``D11`` ``D11`` ``D11`` -PA17 ``D9`` / ``SCK`` ``D13`` ``D13`` ``D13`` / ``RED_LED`` ``D13`` ``D13`` ``D13`` -PA18 ``D10`` ``D10`` ``D10`` ``D10`` ``D10`` -PA19 ``D10`` / ``MISO`` ``D12`` ``D12`` ``D12`` ``D12`` ``D12`` -PA20 ``D6`` ``D6`` ``MOSI`` ``D6`` ``D6`` ``D6`` ``D6`` -PA21 ``D7`` ``D7`` ``SCK`` ``D7`` / ``SD_CD`` ``D7`` -PA22 ``D0`` ``SDA`` ``SDA`` ``SDA`` ``SDA`` ``SDA`` -PA23 ``D1`` ``SCL`` ``REMOTEOUT`` / ``IR_TX`` ``SCL`` ``SCL`` ``SCL`` ``L`` / ``D13`` ``SCL`` +PB08 ``L`` ``A1`` ``A7`` / ``TX`` ``A1`` ``A1`` ``A1`` ``A1`` ``A1`` ``A1`` +PB09 ``BATTERY`` ``A2`` ``A6`` / ``RX`` ``A2`` ``A2`` ``A2`` ``A2`` ``A2`` ``A2`` +PA04 ``A3`` ``A3`` ``IR_PROXIMITY`` ``A3`` ``A3`` ``A3`` ``D0`` / ``TX`` / ``SDA`` ``A3`` ``A3`` ``A3`` +PA05 ``A4`` ``A4`` ``A1`` ``A4`` ``A4`` ``A4`` ``D2`` / ``RX`` / ``SCL`` ``A4`` ``A4`` +PA06 ``A5`` ``D8`` ``A2`` ``D8`` / ``GREEN_LED`` ``NEOPIXEL`` ``D8`` ``D8`` ``D8`` ``D4`` / ``TX`` +PA07 ``A6`` ``D9`` ``A3`` ``D9`` ``D9`` ``D9`` ``D9`` ``D9`` ``D9`` ``D3`` / ``RX`` +PA08 ``D11`` / ``SDA`` ``D4`` ``MICROPHONE_DO`` ``D4`` / ``SD_CS`` ``D4`` ``D4`` ``D4`` ``D0`` / ``SDA`` +PA09 ``D12`` / ``SCL`` ``D3`` ``TEMPERATURE`` / ``A9`` ``D3`` ``D3`` ``D3`` ``D2`` / ``SCL`` +PA10 ``D2`` ``D1`` / ``TX`` ``MICROPHONE_SCK`` ``D1`` / ``TX`` ``D1`` / ``TX`` ``D1`` / ``TX`` ``D1`` / ``TX`` ``D1`` / ``TX`` ``D1`` / ``TX`` ``D13`` +PA11 ``D3`` ``D0`` / ``RX`` ``LIGHT`` / ``A8`` ``D0`` / ``RX`` ``D0`` / ``RX`` ``D0`` / ``RX`` ``D0`` / ``RX`` ``D0`` / ``RX`` ``D0`` / ``RX`` +PB10 ``D4`` ``MOSI`` ``MOSI`` ``MOSI`` ``MOSI`` ``MOSI`` ``MOSI`` +PB11 ``D5`` ``SCK`` ``SCK`` ``SCK`` ``SCK`` ``SCK`` ``SCK`` +PA12 ``SD_MOSI`` ``MISO`` ``REMOTEIN`` / ``IR_RX`` ``MISO`` ``MISO`` ``MISO`` ``MISO`` ``MISO`` +PA13 ``SD_SCK`` ``ACCELEROMETER_INTERRUPT`` ``FLASH_CS`` ``D38`` +PA14 ``SD_CS`` ``D2`` ``BUTTON_B`` / ``D5`` ``D2`` ``D2`` ``D2`` +PA15 ``SD_MISO`` ``D5`` ``SLIDE_SWITCH`` / ``D7`` ``D5`` ``D5`` ``D5`` ``D5`` ``D5`` ``D5`` +PA16 ``D8`` / ``MOSI`` ``D11`` ``MISO`` ``D11`` ``D11`` ``D11`` ``D11`` ``D11`` / ``MOSI`` ``D11`` +PA17 ``D9`` / ``SCK`` ``D13`` ``D13`` ``D13`` / ``RED_LED`` ``D13`` ``D13`` ``D13`` ``D13`` / ``SCK`` / ``BLUE_LED`` ``D13`` / ``BLUE_LED`` +PA18 ``D10`` ``D10`` ``D10`` ``D10`` ``D10`` ``D10`` ``D10`` +PA19 ``D10`` / ``MISO`` ``D12`` ``D12`` ``D12`` ``D12`` ``D12`` ``D12`` / ``MISO`` ``D12`` +PA20 ``D6`` ``D6`` ``MOSI`` ``D6`` ``D6`` ``D6`` ``D6`` ``D6`` ``D6`` +PA21 ``D7`` ``D7`` ``SCK`` ``D7`` / ``SD_CD`` ``D7`` ``D7`` ``D7`` +PA22 ``D0`` ``SDA`` ``SDA`` ``SDA`` ``SDA`` ``SDA`` ``SDA`` ``SDA`` +PA23 ``D1`` ``SCL`` ``REMOTEOUT`` / ``IR_TX`` ``SCL`` ``SCL`` ``SCL`` ``L`` / ``D13`` ``SCL`` ``SCL`` ``SCL`` PA24 PA25 -PB22 ``D14`` / ``TX`` ``FLASH_CS`` -PB23 ``D13`` / ``RX`` ``NEOPIXEL`` / ``D8`` -PA27 ``SD_CD`` +PB22 ``D14`` / ``TX`` ``FLASH_CS`` ``D30`` / ``TX1`` +PB23 ``D13`` / ``RX`` ``NEOPIXEL`` / ``D8`` ``D31`` / ``RX1`` +PA27 ``SD_CD`` ``GREEN_LED`` ``GREEN_LED`` PA28 ``BUTTON_A`` / ``D4`` PA29 PA30 ``SPEAKER_ENABLE`` ``NEOPIXEL`` PA31 -PB02 ``A1`` ``A5`` ``A5`` / ``SDA`` ``A5`` ``A5`` ``A5`` ``A5`` -PB03 ``A2`` ``A4`` / ``SCL`` -===================== =================== =============== =========================== ====================== ================ ================== ========================= ================ ================ +PB02 ``A1`` ``A5`` ``A5`` / ``SDA`` ``A5`` ``A5`` ``A5`` ``A5`` ``A5`` +PB03 ``A2`` ``A4`` / ``SCL`` ``YELLOW_LED`` ``YELLOW_LED`` +===================== =================== =============== =========================== ====================== ================ ================== ========================= ================ ================================ ====================== ================ Here is a table about which pins can do what in CircuitPython terms. However, just because something is listed, doesn't mean it will always work. Existing use diff --git a/ports/atmel-samd/background.c b/ports/atmel-samd/background.c index 439877d2e..a8c4e3891 100644 --- a/ports/atmel-samd/background.c +++ b/ports/atmel-samd/background.c @@ -27,13 +27,17 @@ #include "audio_dma.h" #include "tick.h" +#include "supervisor/filesystem.h" #include "supervisor/usb.h" #include "py/runtime.h" -#include "shared-module/displayio/__init__.h" #include "shared-module/network/__init__.h" #include "supervisor/shared/stack.h" +#ifdef CIRCUITPY_DISPLAYIO +#include "shared-module/displayio/__init__.h" +#endif + volatile uint64_t last_finished_tick = 0; bool stack_ok_so_far = true; @@ -43,13 +47,14 @@ void run_background_tasks(void) { #if (defined(SAMD21) && defined(PIN_PA02)) || defined(SAMD51) audio_dma_background(); #endif - #ifdef CIRCUITPY_DISPLAYIO - displayio_refresh_display(); + #if CIRCUITPY_DISPLAYIO + displayio_refresh_displays(); #endif - #if MICROPY_PY_NETWORK + #if CIRCUITPY_NETWORK network_module_background(); #endif + filesystem_background(); usb_background(); assert_heap_ok(); diff --git a/ports/atmel-samd/boards/arduino_mkr1300/mpconfigboard.h b/ports/atmel-samd/boards/arduino_mkr1300/mpconfigboard.h index 1deda871a..a508d9191 100644 --- a/ports/atmel-samd/boards/arduino_mkr1300/mpconfigboard.h +++ b/ports/atmel-samd/boards/arduino_mkr1300/mpconfigboard.h @@ -7,9 +7,9 @@ #define MICROPY_HW_LED_STATUS (&pin_PB23) -#define CIRCUITPY_INTERNAL_NVM_SIZE 0 +#define CIRCUITPY_INTERNAL_NVM_SIZE 256 -#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000) +#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE) #define DEFAULT_I2C_BUS_SCL (&pin_PA09) #define DEFAULT_I2C_BUS_SDA (&pin_PA08) diff --git a/ports/atmel-samd/boards/arduino_mkr1300/mpconfigboard.mk b/ports/atmel-samd/boards/arduino_mkr1300/mpconfigboard.mk index 071f7e64c..b1b127ced 100644 --- a/ports/atmel-samd/boards/arduino_mkr1300/mpconfigboard.mk +++ b/ports/atmel-samd/boards/arduino_mkr1300/mpconfigboard.mk @@ -6,6 +6,9 @@ USB_MANUFACTURER = "Arduino" INTERNAL_FLASH_FILESYSTEM = 1 LONGINT_IMPL = NONE +CIRCUITPY_SMALL_BUILD = 1 CHIP_VARIANT = SAMD21G18A CHIP_FAMILY = samd21 + +CIRCUITPY_FREQUENCYIO = 0 diff --git a/ports/atmel-samd/boards/arduino_mkr1300/pins.c b/ports/atmel-samd/boards/arduino_mkr1300/pins.c index de9f9769c..a5a058ace 100644 --- a/ports/atmel-samd/boards/arduino_mkr1300/pins.c +++ b/ports/atmel-samd/boards/arduino_mkr1300/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" STATIC const mp_rom_map_elem_t board_global_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA02) }, diff --git a/ports/atmel-samd/boards/arduino_mkrzero/mpconfigboard.h b/ports/atmel-samd/boards/arduino_mkrzero/mpconfigboard.h index d98da4d14..02750e646 100644 --- a/ports/atmel-samd/boards/arduino_mkrzero/mpconfigboard.h +++ b/ports/atmel-samd/boards/arduino_mkrzero/mpconfigboard.h @@ -5,9 +5,9 @@ #define MICROPY_PORT_B (0) #define MICROPY_PORT_C (0) -#define CIRCUITPY_INTERNAL_NVM_SIZE 0 +#define CIRCUITPY_INTERNAL_NVM_SIZE 256 -#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000) +#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE) #define DEFAULT_I2C_BUS_SCL (&pin_PA09) #define DEFAULT_I2C_BUS_SDA (&pin_PA08) diff --git a/ports/atmel-samd/boards/arduino_mkrzero/mpconfigboard.mk b/ports/atmel-samd/boards/arduino_mkrzero/mpconfigboard.mk index 309351289..0e6fb612e 100644 --- a/ports/atmel-samd/boards/arduino_mkrzero/mpconfigboard.mk +++ b/ports/atmel-samd/boards/arduino_mkrzero/mpconfigboard.mk @@ -6,6 +6,9 @@ USB_MANUFACTURER = "Arduino" INTERNAL_FLASH_FILESYSTEM = 1 LONGINT_IMPL = NONE +CIRCUITPY_SMALL_BUILD = 1 CHIP_VARIANT = SAMD21G18A CHIP_FAMILY = samd21 + +CIRCUITPY_FREQUENCYIO = 0 diff --git a/ports/atmel-samd/boards/arduino_mkrzero/pins.c b/ports/atmel-samd/boards/arduino_mkrzero/pins.c index 3ffd37fa6..654c0d6da 100644 --- a/ports/atmel-samd/boards/arduino_mkrzero/pins.c +++ b/ports/atmel-samd/boards/arduino_mkrzero/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" STATIC const mp_rom_map_elem_t board_global_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA02) }, @@ -31,7 +31,7 @@ STATIC const mp_rom_map_elem_t board_global_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_PB23) }, { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_PB23) }, { MP_ROM_QSTR(MP_QSTR_D14), MP_ROM_PTR(&pin_PB22) }, - { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_PB22) }, + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_PB22) }, { MP_ROM_QSTR(MP_QSTR_SD_SCK), MP_ROM_PTR(&pin_PA13) }, { MP_ROM_QSTR(MP_QSTR_SD_MOSI), MP_ROM_PTR(&pin_PA12) }, { MP_ROM_QSTR(MP_QSTR_SD_MISO), MP_ROM_PTR(&pin_PA15) }, diff --git a/ports/atmel-samd/boards/arduino_zero/mpconfigboard.h b/ports/atmel-samd/boards/arduino_zero/mpconfigboard.h index 7ab09d447..ec201e6ef 100644 --- a/ports/atmel-samd/boards/arduino_zero/mpconfigboard.h +++ b/ports/atmel-samd/boards/arduino_zero/mpconfigboard.h @@ -10,9 +10,9 @@ #define MICROPY_PORT_B (PORT_PB03) #define MICROPY_PORT_C (0) -#define CIRCUITPY_INTERNAL_NVM_SIZE 0 +#define CIRCUITPY_INTERNAL_NVM_SIZE 256 -#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000) +#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE) #define DEFAULT_I2C_BUS_SCL (&pin_PA23) #define DEFAULT_I2C_BUS_SDA (&pin_PA22) diff --git a/ports/atmel-samd/boards/arduino_zero/mpconfigboard.mk b/ports/atmel-samd/boards/arduino_zero/mpconfigboard.mk index 017e66ddf..26f771b50 100644 --- a/ports/atmel-samd/boards/arduino_zero/mpconfigboard.mk +++ b/ports/atmel-samd/boards/arduino_zero/mpconfigboard.mk @@ -6,6 +6,9 @@ USB_MANUFACTURER = "Arduino" INTERNAL_FLASH_FILESYSTEM = 1 LONGINT_IMPL = NONE +CIRCUITPY_SMALL_BUILD = 1 CHIP_VARIANT = SAMD21G18A CHIP_FAMILY = samd21 + +CIRCUITPY_FREQUENCYIO = 0 diff --git a/ports/atmel-samd/boards/arduino_zero/pins.c b/ports/atmel-samd/boards/arduino_zero/pins.c index 8a7ff70e6..f9403bb9a 100644 --- a/ports/atmel-samd/boards/arduino_zero/pins.c +++ b/ports/atmel-samd/boards/arduino_zero/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" STATIC const mp_rom_map_elem_t board_global_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA02) }, diff --git a/ports/atmel-samd/boards/board.h b/ports/atmel-samd/boards/board.h index 61acc730e..4f0ae9d72 100644 --- a/ports/atmel-samd/boards/board.h +++ b/ports/atmel-samd/boards/board.h @@ -33,12 +33,6 @@ #include "py/mpconfig.h" -#ifdef CIRCUITPY_DISPLAYIO -#include "common-hal/displayio/FourWire.h" - -extern displayio_fourwire_obj_t board_display_obj; -#endif - // Initializes board related state once on start up. void board_init(void); diff --git a/ports/atmel-samd/boards/catwan_usbstick/mpconfigboard.h b/ports/atmel-samd/boards/catwan_usbstick/mpconfigboard.h index 341dcc27e..7a32bf023 100644 --- a/ports/atmel-samd/boards/catwan_usbstick/mpconfigboard.h +++ b/ports/atmel-samd/boards/catwan_usbstick/mpconfigboard.h @@ -7,13 +7,13 @@ #define MICROPY_PORT_B (0) #define MICROPY_PORT_C (0) -#define CIRCUITPY_INTERNAL_NVM_SIZE 0 +#define CIRCUITPY_INTERNAL_NVM_SIZE 256 #define DEFAULT_SPI_BUS_SCK (&pin_PA19) #define DEFAULT_SPI_BUS_MOSI (&pin_PA18) #define DEFAULT_SPI_BUS_MISO (&pin_PA22) -#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000) +#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE) #define IGNORE_PIN_PA00 1 #define IGNORE_PIN_PA01 1 diff --git a/ports/atmel-samd/boards/catwan_usbstick/mpconfigboard.mk b/ports/atmel-samd/boards/catwan_usbstick/mpconfigboard.mk index fd4590166..3059eb704 100644 --- a/ports/atmel-samd/boards/catwan_usbstick/mpconfigboard.mk +++ b/ports/atmel-samd/boards/catwan_usbstick/mpconfigboard.mk @@ -6,6 +6,9 @@ USB_MANUFACTURER = "Electronic Cats" INTERNAL_FLASH_FILESYSTEM = 1 LONGINT_IMPL = NONE +CIRCUITPY_SMALL_BUILD = 1 CHIP_VARIANT = SAMD21E18A CHIP_FAMILY = samd21 + +CIRCUITPY_FREQUENCYIO = 0 diff --git a/ports/atmel-samd/boards/catwan_usbstick/pins.c b/ports/atmel-samd/boards/catwan_usbstick/pins.c index 8997b653f..87ee84c0b 100644 --- a/ports/atmel-samd/boards/catwan_usbstick/pins.c +++ b/ports/atmel-samd/boards/catwan_usbstick/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" STATIC const mp_rom_map_elem_t board_global_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_PA30) }, diff --git a/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.mk b/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.mk index f701ef173..868ca9443 100644 --- a/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.mk +++ b/ports/atmel-samd/boards/circuitplayground_express/mpconfigboard.mk @@ -9,6 +9,11 @@ EXTERNAL_FLASH_DEVICE_COUNT = 2 EXTERNAL_FLASH_DEVICES = "S25FL216K, GD25Q16C" LONGINT_IMPL = MPZ +# Make room for frozen libs. +CIRCUITPY_DISPLAYIO = 0 +CIRCUITPY_FREQUENCYIO = 0 +CIRCUITPY_I2CSLAVE = 0 + CHIP_VARIANT = SAMD21G18A CHIP_FAMILY = samd21 diff --git a/ports/atmel-samd/boards/circuitplayground_express/pins.c b/ports/atmel-samd/boards/circuitplayground_express/pins.c index 14ae89c55..70743366e 100644 --- a/ports/atmel-samd/boards/circuitplayground_express/pins.c +++ b/ports/atmel-samd/boards/circuitplayground_express/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" STATIC const mp_rom_map_elem_t board_global_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA02) }, diff --git a/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.h b/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.h index e66d9c40e..ca6f9b773 100644 --- a/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.h +++ b/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.h @@ -3,9 +3,6 @@ #define MICROPY_HW_LED_STATUS (&pin_PA17) -// No framebuf on CRICKit version to save space. -#define MICROPY_PY_FRAMEBUF (0) - // Don't allow touch on A0 (PA02), because it's connected to the speaker. #define PA02_NO_TOUCH (true) diff --git a/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk b/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk index b07d63984..1dbd1a739 100644 --- a/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk +++ b/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk @@ -10,6 +10,11 @@ EXTERNAL_FLASH_DEVICES = "S25FL216K, GD25Q16C" # Turn off longints for Crickit build to make room for additional frozen libs. LONGINT_IMPL = NONE +CIRCUITPY_DISPLAYIO = 0 +CIRCUITPY_PIXELBUF = 0 +CIRCUITPY_FREQUENCYIO = 0 +CIRCUITPY_I2CSLAVE = 0 + CHIP_VARIANT = SAMD21G18A CHIP_FAMILY = samd21 diff --git a/ports/atmel-samd/boards/circuitplayground_express_crickit/pins.c b/ports/atmel-samd/boards/circuitplayground_express_crickit/pins.c index 14ae89c55..70743366e 100644 --- a/ports/atmel-samd/boards/circuitplayground_express_crickit/pins.c +++ b/ports/atmel-samd/boards/circuitplayground_express_crickit/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" STATIC const mp_rom_map_elem_t board_global_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA02) }, diff --git a/ports/atmel-samd/boards/cp32-m4/mpconfigboard.mk b/ports/atmel-samd/boards/cp32-m4/mpconfigboard.mk index 63acd03b4..0fba81ac0 100644 --- a/ports/atmel-samd/boards/cp32-m4/mpconfigboard.mk +++ b/ports/atmel-samd/boards/cp32-m4/mpconfigboard.mk @@ -8,5 +8,10 @@ QSPI_FLASH_FILESYSTEM = 1 EXTERNAL_FLASH_DEVICE_COUNT = 1 EXTERNAL_FLASH_DEVICES = "W25Q128JV_PM" +# No I2S on SAMD51G +CIRCUITPY_AUDIOBUSIO = 0 +# No touch on SAMD51 yet +CIRCUITPY_TOUCHIO = 0 + CHIP_VARIANT = SAMD51G19A CHIP_FAMILY = samd51 diff --git a/ports/atmel-samd/boards/cp32-m4/pins.c b/ports/atmel-samd/boards/cp32-m4/pins.c index 93c169c8b..9da67dfb4 100644 --- a/ports/atmel-samd/boards/cp32-m4/pins.c +++ b/ports/atmel-samd/boards/cp32-m4/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" // This mapping only includes functional names because pins broken // out on connectors are labeled with their MCU name available from diff --git a/ports/atmel-samd/boards/datalore_ip_m4/board.c b/ports/atmel-samd/boards/datalore_ip_m4/board.c new file mode 100644 index 000000000..0f60736a2 --- /dev/null +++ b/ports/atmel-samd/boards/datalore_ip_m4/board.c @@ -0,0 +1,39 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2017 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "boards/board.h" +#include "mpconfigboard.h" +#include "hal/include/hal_gpio.h" + +void board_init(void) { +} + +bool board_requests_safe_mode(void) { + return false; +} + +void reset_board(void) { +} diff --git a/ports/atmel-samd/boards/datalore_ip_m4/mpconfigboard.h b/ports/atmel-samd/boards/datalore_ip_m4/mpconfigboard.h new file mode 100644 index 000000000..99167d31b --- /dev/null +++ b/ports/atmel-samd/boards/datalore_ip_m4/mpconfigboard.h @@ -0,0 +1,45 @@ +#define MICROPY_HW_BOARD_NAME "TG-Boards' Datalore IP M4" +#define MICROPY_HW_MCU_NAME "samd51j19" + +#define CIRCUITPY_MCU_FAMILY samd51 + +// This is for Rev F which is green + +#define MICROPY_HW_LED_TX (&pin_PA27) +#define MICROPY_HW_LED_RX (&pin_PB06) + +#define MICROPY_HW_LED_STATUS (&pin_PA16) + +#define MICROPY_HW_NEOPIXEL (&pin_PB22) + +// These are pins not to reset. +// QSPI Data pins +#define MICROPY_PORT_A (PORT_PA08 | PORT_PA09 | PORT_PA10 | PORT_PA11) +// QSPI CS, QSPI SCK and NeoPixel pin +#define MICROPY_PORT_B (PORT_PB10 | PORT_PB11 | PORT_PB22) +#define MICROPY_PORT_C (0) +#define MICROPY_PORT_D (0) + +#define AUTORESET_DELAY_MS 500 + +// If you change this, then make sure to update the linker scripts as well to +// make sure you don't overwrite code +#define CIRCUITPY_INTERNAL_NVM_SIZE 8192 + +#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE) + +#define BOARD_HAS_CRYSTAL 1 + +#define DEFAULT_I2C_BUS_SCL (&pin_PB03) +#define DEFAULT_I2C_BUS_SDA (&pin_PB02) + +#define DEFAULT_SPI_BUS_SCK (&pin_PA13) +#define DEFAULT_SPI_BUS_MOSI (&pin_PA12) +#define DEFAULT_SPI_BUS_MISO (&pin_PA14) + +#define DEFAULT_UART_BUS_RX (&pin_PA23) +#define DEFAULT_UART_BUS_TX (&pin_PA22) + +// USB is always used internally so skip the pin objects for it. +#define IGNORE_PIN_PA24 1 +#define IGNORE_PIN_PA25 1 diff --git a/ports/atmel-samd/boards/datalore_ip_m4/mpconfigboard.mk b/ports/atmel-samd/boards/datalore_ip_m4/mpconfigboard.mk new file mode 100644 index 000000000..e6b21e25b --- /dev/null +++ b/ports/atmel-samd/boards/datalore_ip_m4/mpconfigboard.mk @@ -0,0 +1,20 @@ +LD_FILE = boards/samd51x19-bootloader-external-flash.ld +USB_VID = 0x4097 +USB_PID = 0x0001 +USB_PRODUCT = "Datalore IP M4" +USB_MANUFACTURER = "TG-Boards" + +QSPI_FLASH_FILESYSTEM = 1 +EXTERNAL_FLASH_DEVICE_COUNT = 3 +EXTERNAL_FLASH_DEVICES = "GD25Q16C, W25Q16JV_IQ, W25Q16JV_IM" + +LONGINT_IMPL = MPZ + +CHIP_VARIANT = SAMD51J19A +CHIP_FAMILY = samd51 + +# No touch on SAMD51 yet +CIRCUITPY_TOUCHIO = 0 + +CIRCUITPY_NETWORK = 1 +MICROPY_PY_WIZNET5K = 5500 diff --git a/ports/atmel-samd/boards/datalore_ip_m4/pins.c b/ports/atmel-samd/boards/datalore_ip_m4/pins.c new file mode 100644 index 000000000..63ae319a2 --- /dev/null +++ b/ports/atmel-samd/boards/datalore_ip_m4/pins.c @@ -0,0 +1,48 @@ +#include "shared-bindings/board/__init__.h" + +#include "supervisor/shared/board_busses.h" + +// This mapping only includes functional names because pins broken +// out on connectors are labeled with their MCU name available from +// microcontroller.pin. +STATIC const mp_rom_map_elem_t board_global_dict_table[] = { + { MP_OBJ_NEW_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA02) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_PA05) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_PA06) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_PA04) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_PB08) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_PB09) }, + + { MP_OBJ_NEW_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_PA23) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_PA23) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_PA22) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_PA22) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_PB17) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_PB16) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_PB13) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_PB14) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_PB15) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_PB12) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D8), MP_ROM_PTR(&pin_PA21) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_PA20) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_PA18) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_PA19) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_PA17) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D13),MP_ROM_PTR(&pin_PA16) }, + + { MP_OBJ_NEW_QSTR(MP_QSTR_SDA),MP_ROM_PTR(&pin_PB02) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_SCL),MP_ROM_PTR(&pin_PB03) }, + + { MP_OBJ_NEW_QSTR(MP_QSTR_NEOPIXEL),MP_ROM_PTR(&pin_PB22) }, + + { MP_OBJ_NEW_QSTR(MP_QSTR_SCK),MP_ROM_PTR(&pin_PA13) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_MOSI),MP_ROM_PTR(&pin_PA12) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_MISO),MP_ROM_PTR(&pin_PA14) }, + + { MP_OBJ_NEW_QSTR(MP_QSTR_LED_RX),MP_ROM_PTR(&pin_PB06) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_LED_TX),MP_ROM_PTR(&pin_PA27) }, + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_global_dict_table); diff --git a/ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.h b/ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.h index 787a3ee55..eb1b90585 100644 --- a/ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.h +++ b/ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.h @@ -8,9 +8,9 @@ #define MICROPY_PORT_B (0) #define MICROPY_PORT_C (0) -#define CIRCUITPY_INTERNAL_NVM_SIZE 0 +#define CIRCUITPY_INTERNAL_NVM_SIZE 256 -#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000) +#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE) #define DEFAULT_I2C_BUS_SCL (&pin_PA22) #define DEFAULT_I2C_BUS_SDA (&pin_PA23) diff --git a/ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.mk index 4f2855d73..0b9995583 100644 --- a/ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.mk +++ b/ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.mk @@ -6,6 +6,9 @@ USB_MANUFACTURER = "Adafruit Industries LLC" INTERNAL_FLASH_FILESYSTEM = 1 LONGINT_IMPL = NONE +CIRCUITPY_SMALL_BUILD = 1 CHIP_VARIANT = SAMD21G18A CHIP_FAMILY = samd21 + +CIRCUITPY_FREQUENCYIO = 0 diff --git a/ports/atmel-samd/boards/feather_m0_adalogger/pins.c b/ports/atmel-samd/boards/feather_m0_adalogger/pins.c index 0029bba1a..d99e62c95 100644 --- a/ports/atmel-samd/boards/feather_m0_adalogger/pins.c +++ b/ports/atmel-samd/boards/feather_m0_adalogger/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" STATIC const mp_rom_map_elem_t board_global_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA02) }, diff --git a/ports/atmel-samd/boards/feather_m0_basic/mpconfigboard.h b/ports/atmel-samd/boards/feather_m0_basic/mpconfigboard.h index 2a21b8f02..a16cee0b4 100644 --- a/ports/atmel-samd/boards/feather_m0_basic/mpconfigboard.h +++ b/ports/atmel-samd/boards/feather_m0_basic/mpconfigboard.h @@ -8,9 +8,9 @@ #define MICROPY_PORT_B (0) #define MICROPY_PORT_C (0) -#define CIRCUITPY_INTERNAL_NVM_SIZE 0 +#define CIRCUITPY_INTERNAL_NVM_SIZE 256 -#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000) +#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE) #define DEFAULT_I2C_BUS_SCL (&pin_PA23) #define DEFAULT_I2C_BUS_SDA (&pin_PA22) diff --git a/ports/atmel-samd/boards/feather_m0_basic/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_basic/mpconfigboard.mk index a77da91f2..a469dcf1d 100644 --- a/ports/atmel-samd/boards/feather_m0_basic/mpconfigboard.mk +++ b/ports/atmel-samd/boards/feather_m0_basic/mpconfigboard.mk @@ -6,6 +6,9 @@ USB_MANUFACTURER = "Adafruit Industries LLC" INTERNAL_FLASH_FILESYSTEM = 1 LONGINT_IMPL = NONE +CIRCUITPY_SMALL_BUILD = 1 CHIP_VARIANT = SAMD21G18A CHIP_FAMILY = samd21 + +CIRCUITPY_FREQUENCYIO = 0 diff --git a/ports/atmel-samd/boards/feather_m0_basic/pins.c b/ports/atmel-samd/boards/feather_m0_basic/pins.c index 4400a253d..f9b6db63b 100644 --- a/ports/atmel-samd/boards/feather_m0_basic/pins.c +++ b/ports/atmel-samd/boards/feather_m0_basic/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" STATIC const mp_rom_map_elem_t board_global_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA02) }, diff --git a/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.h b/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.h index 7c10a92ec..e6cd1c729 100644 --- a/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.h +++ b/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.h @@ -37,5 +37,3 @@ // USB is always used internally so skip the pin objects for it. #define IGNORE_PIN_PA24 1 #define IGNORE_PIN_PA25 1 - -#define CIRCUITPY_I2CSLAVE diff --git a/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk index 57ce96285..03a89f5f5 100644 --- a/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk +++ b/ports/atmel-samd/boards/feather_m0_express/mpconfigboard.mk @@ -12,5 +12,4 @@ LONGINT_IMPL = MPZ CHIP_VARIANT = SAMD21G18A CHIP_FAMILY = samd21 -MICROPY_PY_NETWORK = 1 -MICROPY_PY_WIZNET5K = 5500 +CIRCUITPY_FREQUENCYIO = 0 diff --git a/ports/atmel-samd/boards/feather_m0_express/pins.c b/ports/atmel-samd/boards/feather_m0_express/pins.c index cd6c351d4..1eaa98a58 100644 --- a/ports/atmel-samd/boards/feather_m0_express/pins.c +++ b/ports/atmel-samd/boards/feather_m0_express/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" STATIC const mp_rom_map_elem_t board_global_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA02) }, diff --git a/ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.mk index f773bcb57..fa39de33f 100644 --- a/ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.mk +++ b/ports/atmel-samd/boards/feather_m0_express_crickit/mpconfigboard.mk @@ -9,10 +9,15 @@ EXTERNAL_FLASH_DEVICE_COUNT = 2 EXTERNAL_FLASH_DEVICES = "S25FL216K, GD25Q16C" LONGINT_IMPL = MPZ +# Make space for frozen libs +CIRCUITPY_DISPLAYIO = 0 +CIRCUITPY_FREQUENCYIO = 0 +CIRCUITPY_I2CSLAVE = 0 + CHIP_VARIANT = SAMD21G18A CHIP_FAMILY = samd21 -CFLAGS_INLINE_LIMIT = 55 +CFLAGS_INLINE_LIMIT = 50 # Include these Python libraries in firmware. FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_BusDevice diff --git a/ports/atmel-samd/boards/feather_m0_express_crickit/pins.c b/ports/atmel-samd/boards/feather_m0_express_crickit/pins.c index cd6c351d4..1eaa98a58 100644 --- a/ports/atmel-samd/boards/feather_m0_express_crickit/pins.c +++ b/ports/atmel-samd/boards/feather_m0_express_crickit/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" STATIC const mp_rom_map_elem_t board_global_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA02) }, diff --git a/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.h b/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.h index a0f79ed72..19a514758 100644 --- a/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.h +++ b/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.h @@ -8,9 +8,9 @@ #define MICROPY_PORT_B (0) #define MICROPY_PORT_C (0) -#define CIRCUITPY_INTERNAL_NVM_SIZE 0 +#define CIRCUITPY_INTERNAL_NVM_SIZE 256 -#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000) +#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE) #define DEFAULT_I2C_BUS_SCL (&pin_PA23) #define DEFAULT_I2C_BUS_SDA (&pin_PA22) diff --git a/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.mk index bd1a96479..16696297d 100644 --- a/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.mk +++ b/ports/atmel-samd/boards/feather_m0_rfm69/mpconfigboard.mk @@ -6,6 +6,9 @@ USB_MANUFACTURER = "Adafruit Industries LLC" INTERNAL_FLASH_FILESYSTEM = 1 LONGINT_IMPL = NONE +CIRCUITPY_SMALL_BUILD = 1 CHIP_VARIANT = SAMD21G18A CHIP_FAMILY = samd21 + +CIRCUITPY_FREQUENCYIO = 0 diff --git a/ports/atmel-samd/boards/feather_m0_rfm69/pins.c b/ports/atmel-samd/boards/feather_m0_rfm69/pins.c index 7e14b3f25..ba59cb69b 100644 --- a/ports/atmel-samd/boards/feather_m0_rfm69/pins.c +++ b/ports/atmel-samd/boards/feather_m0_rfm69/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" STATIC const mp_rom_map_elem_t board_global_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA02) }, diff --git a/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.h b/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.h index 85c24bfd0..d3db098e5 100644 --- a/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.h +++ b/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.h @@ -8,9 +8,9 @@ #define MICROPY_PORT_B (0) #define MICROPY_PORT_C (0) -#define CIRCUITPY_INTERNAL_NVM_SIZE 0 +#define CIRCUITPY_INTERNAL_NVM_SIZE 256 -#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000) +#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE) #define DEFAULT_I2C_BUS_SCL (&pin_PA23) #define DEFAULT_I2C_BUS_SDA (&pin_PA22) diff --git a/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.mk index fedd8d072..39fdc591d 100644 --- a/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.mk +++ b/ports/atmel-samd/boards/feather_m0_rfm9x/mpconfigboard.mk @@ -6,6 +6,9 @@ USB_MANUFACTURER = "Adafruit Industries LLC" INTERNAL_FLASH_FILESYSTEM = 1 LONGINT_IMPL = NONE +CIRCUITPY_SMALL_BUILD = 1 CHIP_VARIANT = SAMD21G18A CHIP_FAMILY = samd21 + +CIRCUITPY_FREQUENCYIO = 0 diff --git a/ports/atmel-samd/boards/feather_m0_rfm9x/pins.c b/ports/atmel-samd/boards/feather_m0_rfm9x/pins.c index 4e77b7fb9..29a01d405 100644 --- a/ports/atmel-samd/boards/feather_m0_rfm9x/pins.c +++ b/ports/atmel-samd/boards/feather_m0_rfm9x/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" STATIC const mp_rom_map_elem_t board_global_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA02) }, diff --git a/ports/atmel-samd/boards/feather_m0_supersized/pins.c b/ports/atmel-samd/boards/feather_m0_supersized/pins.c index cd6c351d4..1eaa98a58 100644 --- a/ports/atmel-samd/boards/feather_m0_supersized/pins.c +++ b/ports/atmel-samd/boards/feather_m0_supersized/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" STATIC const mp_rom_map_elem_t board_global_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA02) }, diff --git a/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.h b/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.h index ed1dfe763..f65ea8db7 100644 --- a/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.h +++ b/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.h @@ -41,5 +41,3 @@ // USB is always used internally so skip the pin objects for it. #define IGNORE_PIN_PA24 1 #define IGNORE_PIN_PA25 1 - -#define CIRCUITPY_I2CSLAVE diff --git a/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.mk index 3f2cb6ce4..4fddcffc1 100644 --- a/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.mk +++ b/ports/atmel-samd/boards/feather_m4_express/mpconfigboard.mk @@ -10,8 +10,11 @@ EXTERNAL_FLASH_DEVICE_COUNT = 1 EXTERNAL_FLASH_DEVICES = GD25Q16C LONGINT_IMPL = MPZ +# No touch on SAMD51 yet +CIRCUITPY_TOUCHIO = 0 + CHIP_VARIANT = SAMD51J19A CHIP_FAMILY = samd51 -MICROPY_PY_NETWORK = 1 +CIRCUITPY_NETWORK = 1 MICROPY_PY_WIZNET5K = 5500 diff --git a/ports/atmel-samd/boards/feather_m4_express/pins.c b/ports/atmel-samd/boards/feather_m4_express/pins.c index 5004254c5..cec9fe37f 100644 --- a/ports/atmel-samd/boards/feather_m4_express/pins.c +++ b/ports/atmel-samd/boards/feather_m4_express/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" STATIC const mp_rom_map_elem_t board_global_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA02) }, diff --git a/ports/atmel-samd/boards/feather_radiofruit_zigbee/mpconfigboard.mk b/ports/atmel-samd/boards/feather_radiofruit_zigbee/mpconfigboard.mk index 634a9ede7..d9350ea22 100755 --- a/ports/atmel-samd/boards/feather_radiofruit_zigbee/mpconfigboard.mk +++ b/ports/atmel-samd/boards/feather_radiofruit_zigbee/mpconfigboard.mk @@ -9,5 +9,10 @@ EXTERNAL_FLASH_DEVICE_COUNT = 2 EXTERNAL_FLASH_DEVICES = "S25FL216K, GD25Q16C" LONGINT_IMPL = MPZ +# No I2S on SAMR21G +CIRCUITPY_AUDIOBUSIO = 0 +# No DAC on SAMR21G +CIRCUITPY_AUDIOIO = 0 + CHIP_VARIANT = SAMR21G18A CHIP_FAMILY = samd21 diff --git a/ports/atmel-samd/boards/feather_radiofruit_zigbee/pins.c b/ports/atmel-samd/boards/feather_radiofruit_zigbee/pins.c index cd111e174..211596f78 100755 --- a/ports/atmel-samd/boards/feather_radiofruit_zigbee/pins.c +++ b/ports/atmel-samd/boards/feather_radiofruit_zigbee/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" STATIC const mp_rom_map_elem_t board_global_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PB02) }, diff --git a/ports/atmel-samd/boards/gemma_m0/mpconfigboard.h b/ports/atmel-samd/boards/gemma_m0/mpconfigboard.h index 59e0b3c61..bc60ba49b 100644 --- a/ports/atmel-samd/boards/gemma_m0/mpconfigboard.h +++ b/ports/atmel-samd/boards/gemma_m0/mpconfigboard.h @@ -12,7 +12,7 @@ #define MICROPY_PORT_B (0) #define MICROPY_PORT_C (0) -#define CIRCUITPY_INTERNAL_NVM_SIZE 0 +#define CIRCUITPY_INTERNAL_NVM_SIZE 256 #define DEFAULT_I2C_BUS_SCL (&pin_PA05) #define DEFAULT_I2C_BUS_SDA (&pin_PA04) @@ -20,7 +20,7 @@ #define DEFAULT_UART_BUS_RX (&pin_PA05) #define DEFAULT_UART_BUS_TX (&pin_PA04) -#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000) +#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE) #define IGNORE_PIN_PA03 1 #define IGNORE_PIN_PA06 1 diff --git a/ports/atmel-samd/boards/gemma_m0/mpconfigboard.mk b/ports/atmel-samd/boards/gemma_m0/mpconfigboard.mk index ddc4287c3..d44f2feb9 100644 --- a/ports/atmel-samd/boards/gemma_m0/mpconfigboard.mk +++ b/ports/atmel-samd/boards/gemma_m0/mpconfigboard.mk @@ -6,6 +6,9 @@ USB_MANUFACTURER = "Adafruit Industries LLC" INTERNAL_FLASH_FILESYSTEM = 1 LONGINT_IMPL = NONE +CIRCUITPY_SMALL_BUILD = 1 CHIP_VARIANT = SAMD21E18A CHIP_FAMILY = samd21 + +CIRCUITPY_FREQUENCYIO = 0 diff --git a/ports/atmel-samd/boards/gemma_m0/pins.c b/ports/atmel-samd/boards/gemma_m0/pins.c index c9c7ea555..b24b45838 100644 --- a/ports/atmel-samd/boards/gemma_m0/pins.c +++ b/ports/atmel-samd/boards/gemma_m0/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" STATIC const mp_rom_map_elem_t board_global_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_PA05) }, // pad 1 diff --git a/ports/atmel-samd/boards/grandcentral_m4_express/mpconfigboard.h b/ports/atmel-samd/boards/grandcentral_m4_express/mpconfigboard.h index e1bef0019..bc8f5a134 100644 --- a/ports/atmel-samd/boards/grandcentral_m4_express/mpconfigboard.h +++ b/ports/atmel-samd/boards/grandcentral_m4_express/mpconfigboard.h @@ -44,5 +44,3 @@ // USB is always used internally so skip the pin objects for it. #define IGNORE_PIN_PA24 1 #define IGNORE_PIN_PA25 1 - -#define CIRCUITPY_I2CSLAVE diff --git a/ports/atmel-samd/boards/grandcentral_m4_express/mpconfigboard.mk b/ports/atmel-samd/boards/grandcentral_m4_express/mpconfigboard.mk index 2605c9f55..63158681b 100644 --- a/ports/atmel-samd/boards/grandcentral_m4_express/mpconfigboard.mk +++ b/ports/atmel-samd/boards/grandcentral_m4_express/mpconfigboard.mk @@ -6,9 +6,12 @@ USB_MANUFACTURER = "Adafruit Industries LLC" QSPI_FLASH_FILESYSTEM = 1 -EXTERNAL_FLASH_DEVICE_COUNT = 1 -EXTERNAL_FLASH_DEVICES = "GD25Q64C" +EXTERNAL_FLASH_DEVICE_COUNT = 2 +EXTERNAL_FLASH_DEVICES = "W25Q64JV_IQ, GD25Q64C" LONGINT_IMPL = MPZ +# No touch on SAMD51 yet +CIRCUITPY_TOUCHIO = 0 + CHIP_VARIANT = SAMD51P20A CHIP_FAMILY = samd51 diff --git a/ports/atmel-samd/boards/grandcentral_m4_express/pins.c b/ports/atmel-samd/boards/grandcentral_m4_express/pins.c index 081bb701e..26d0e71a0 100644 --- a/ports/atmel-samd/boards/grandcentral_m4_express/pins.c +++ b/ports/atmel-samd/boards/grandcentral_m4_express/pins.c @@ -1,133 +1,133 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" // This mapping only includes functional names because pins broken // out on connectors are labeled with their MCU name available from // microcontroller.pin. -STATIC const mp_map_elem_t board_global_dict_table[] = { - { MP_OBJ_NEW_QSTR(MP_QSTR_AREF), (mp_obj_t)&pin_PA03 }, +STATIC const mp_rom_map_elem_t board_global_dict_table[] = { + { MP_OBJ_NEW_QSTR(MP_QSTR_AREF), MP_ROM_PTR(&pin_PA03) }, - { MP_OBJ_NEW_QSTR(MP_QSTR_A0), (mp_obj_t)&pin_PA02 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_A1), (mp_obj_t)&pin_PA05 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_A2), (mp_obj_t)&pin_PB03 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_A3), (mp_obj_t)&pin_PC00 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_A4), (mp_obj_t)&pin_PC01 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_A5), (mp_obj_t)&pin_PC02 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_A6), (mp_obj_t)&pin_PC03 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_A7), (mp_obj_t)&pin_PB04 }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA02) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_PA05) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_PB03) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_PC00) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_PC01) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_PC02) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A6), MP_ROM_PTR(&pin_PC03) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A7), MP_ROM_PTR(&pin_PB04) }, - { MP_OBJ_NEW_QSTR(MP_QSTR_A8), (mp_obj_t)&pin_PB05 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_A9), (mp_obj_t)&pin_PB06 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_A10), (mp_obj_t)&pin_PB07 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_A11), (mp_obj_t)&pin_PB08 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_A12), (mp_obj_t)&pin_PB09 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_A13), (mp_obj_t)&pin_PA04 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_A14), (mp_obj_t)&pin_PA06 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_A15), (mp_obj_t)&pin_PA07 }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A8), MP_ROM_PTR(&pin_PB05) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A9), MP_ROM_PTR(&pin_PB06) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A10), MP_ROM_PTR(&pin_PB07) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A11), MP_ROM_PTR(&pin_PB08) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A12), MP_ROM_PTR(&pin_PB09) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A13), MP_ROM_PTR(&pin_PA04) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A14), MP_ROM_PTR(&pin_PA06) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A15), MP_ROM_PTR(&pin_PA07) }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D0), (mp_obj_t)&pin_PB25 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_RX), (mp_obj_t)&pin_PB25 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D1), (mp_obj_t)&pin_PB24 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_TX), (mp_obj_t)&pin_PB24 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D2), (mp_obj_t)&pin_PC18 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D3), (mp_obj_t)&pin_PC19 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D4), (mp_obj_t)&pin_PC20 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D5), (mp_obj_t)&pin_PC21 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D6), (mp_obj_t)&pin_PD20 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D7), (mp_obj_t)&pin_PD21 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D8), (mp_obj_t)&pin_PB18 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D9), (mp_obj_t)&pin_PB02 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D10), (mp_obj_t)&pin_PB22 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D11), (mp_obj_t)&pin_PB23 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D12), (mp_obj_t)&pin_PB00 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D13), (mp_obj_t)&pin_PB01 }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_PB25) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_PB25) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_PB24) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_PB24) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_PC18) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_PC19) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_PC20) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_PC21) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_PD20) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_PD21) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D8), MP_ROM_PTR(&pin_PB18) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_PB02) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_PB22) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_PB23) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_PB00) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_PB01) }, - { MP_OBJ_NEW_QSTR(MP_QSTR_TX3), (mp_obj_t)&pin_PB16 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D14), (mp_obj_t)&pin_PB16 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_RX3), (mp_obj_t)&pin_PB17 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D15), (mp_obj_t)&pin_PB17 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_TX2), (mp_obj_t)&pin_PC22 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D16), (mp_obj_t)&pin_PC22 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_RX2), (mp_obj_t)&pin_PC23 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D17), (mp_obj_t)&pin_PC23 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_TX1), (mp_obj_t)&pin_PB12 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D18), (mp_obj_t)&pin_PB12 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_RX1), (mp_obj_t)&pin_PB13 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D19), (mp_obj_t)&pin_PB13 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D20), (mp_obj_t)&pin_PB20 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_SDA), (mp_obj_t)&pin_PB20 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D21), (mp_obj_t)&pin_PB21 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_SCL), (mp_obj_t)&pin_PB21 }, + { MP_OBJ_NEW_QSTR(MP_QSTR_TX3), MP_ROM_PTR(&pin_PB16) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D14), MP_ROM_PTR(&pin_PB16) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_RX3), MP_ROM_PTR(&pin_PB17) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D15), MP_ROM_PTR(&pin_PB17) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_TX2), MP_ROM_PTR(&pin_PC22) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D16), MP_ROM_PTR(&pin_PC22) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_RX2), MP_ROM_PTR(&pin_PC23) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D17), MP_ROM_PTR(&pin_PC23) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_TX1), MP_ROM_PTR(&pin_PB12) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D18), MP_ROM_PTR(&pin_PB12) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_RX1), MP_ROM_PTR(&pin_PB13) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D19), MP_ROM_PTR(&pin_PB13) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D20), MP_ROM_PTR(&pin_PB20) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_PB20) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D21), MP_ROM_PTR(&pin_PB21) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_PB21) }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D22), (mp_obj_t)&pin_PD12 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D23), (mp_obj_t)&pin_PA15 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D24), (mp_obj_t)&pin_PC17 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_SCL1), (mp_obj_t)&pin_PC17 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D25), (mp_obj_t)&pin_PC16 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_SDA1), (mp_obj_t)&pin_PC16 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D26), (mp_obj_t)&pin_PA12 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_DEN1), (mp_obj_t)&pin_PA12 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D27), (mp_obj_t)&pin_PA13 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_DEN2), (mp_obj_t)&pin_PA13 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D28), (mp_obj_t)&pin_PA14 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_CLK), (mp_obj_t)&pin_PA14 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D29), (mp_obj_t)&pin_PB19 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_XCLK), (mp_obj_t)&pin_PB19 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D30), (mp_obj_t)&pin_PA23 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_D7), (mp_obj_t)&pin_PA23 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D31), (mp_obj_t)&pin_PA22 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_D6), (mp_obj_t)&pin_PA22 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D32), (mp_obj_t)&pin_PA21 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_D5), (mp_obj_t)&pin_PA21 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D33), (mp_obj_t)&pin_PA20 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_D4), (mp_obj_t)&pin_PA20 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D34), (mp_obj_t)&pin_PA19 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_D3), (mp_obj_t)&pin_PA19 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D35), (mp_obj_t)&pin_PA18 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_D2), (mp_obj_t)&pin_PA18 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D36), (mp_obj_t)&pin_PA17 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_D1), (mp_obj_t)&pin_PA17 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D37), (mp_obj_t)&pin_PA16 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_D0), (mp_obj_t)&pin_PA16 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D38), (mp_obj_t)&pin_PB15 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_D9), (mp_obj_t)&pin_PB15 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D39), (mp_obj_t)&pin_PB14 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_D8), (mp_obj_t)&pin_PB14 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D40), (mp_obj_t)&pin_PC13 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_D11), (mp_obj_t)&pin_PC13 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D41), (mp_obj_t)&pin_PC12 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_D10), (mp_obj_t)&pin_PC12 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D42), (mp_obj_t)&pin_PC15 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_D13), (mp_obj_t)&pin_PC15 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D43), (mp_obj_t)&pin_PC14 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_D12), (mp_obj_t)&pin_PC14 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D44), (mp_obj_t)&pin_PC11 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D45), (mp_obj_t)&pin_PC10 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D46), (mp_obj_t)&pin_PC06 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D47), (mp_obj_t)&pin_PC07 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D48), (mp_obj_t)&pin_PC04 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D49), (mp_obj_t)&pin_PC05 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D50), (mp_obj_t)&pin_PD11 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_MISO), (mp_obj_t)&pin_PD11 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D51), (mp_obj_t)&pin_PD08 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_MOSI), (mp_obj_t)&pin_PD08 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D52), (mp_obj_t)&pin_PD09 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_SCK), (mp_obj_t)&pin_PD09 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D53), (mp_obj_t)&pin_PD10 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_SS), (mp_obj_t)&pin_PD10 }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D22), MP_ROM_PTR(&pin_PD12) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D23), MP_ROM_PTR(&pin_PA15) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D24), MP_ROM_PTR(&pin_PC17) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_SCL1), MP_ROM_PTR(&pin_PC17) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D25), MP_ROM_PTR(&pin_PC16) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_SDA1), MP_ROM_PTR(&pin_PC16) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D26), MP_ROM_PTR(&pin_PA12) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_DEN1), MP_ROM_PTR(&pin_PA12) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D27), MP_ROM_PTR(&pin_PA13) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_DEN2), MP_ROM_PTR(&pin_PA13) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D28), MP_ROM_PTR(&pin_PA14) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_CLK), MP_ROM_PTR(&pin_PA14) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D29), MP_ROM_PTR(&pin_PB19) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_XCLK), MP_ROM_PTR(&pin_PB19) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D30), MP_ROM_PTR(&pin_PA23) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_D7), MP_ROM_PTR(&pin_PA23) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D31), MP_ROM_PTR(&pin_PA22) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_D6), MP_ROM_PTR(&pin_PA22) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D32), MP_ROM_PTR(&pin_PA21) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_D5), MP_ROM_PTR(&pin_PA21) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D33), MP_ROM_PTR(&pin_PA20) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_D4), MP_ROM_PTR(&pin_PA20) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D34), MP_ROM_PTR(&pin_PA19) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_D3), MP_ROM_PTR(&pin_PA19) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D35), MP_ROM_PTR(&pin_PA18) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_D2), MP_ROM_PTR(&pin_PA18) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D36), MP_ROM_PTR(&pin_PA17) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_D1), MP_ROM_PTR(&pin_PA17) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D37), MP_ROM_PTR(&pin_PA16) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_D0), MP_ROM_PTR(&pin_PA16) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D38), MP_ROM_PTR(&pin_PB15) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_D9), MP_ROM_PTR(&pin_PB15) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D39), MP_ROM_PTR(&pin_PB14) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_D8), MP_ROM_PTR(&pin_PB14) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D40), MP_ROM_PTR(&pin_PC13) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_D11), MP_ROM_PTR(&pin_PC13) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D41), MP_ROM_PTR(&pin_PC12) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_D10), MP_ROM_PTR(&pin_PC12) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D42), MP_ROM_PTR(&pin_PC15) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_D13), MP_ROM_PTR(&pin_PC15) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D43), MP_ROM_PTR(&pin_PC14) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_PCC_D12), MP_ROM_PTR(&pin_PC14) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D44), MP_ROM_PTR(&pin_PC11) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D45), MP_ROM_PTR(&pin_PC10) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D46), MP_ROM_PTR(&pin_PC06) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D47), MP_ROM_PTR(&pin_PC07) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D48), MP_ROM_PTR(&pin_PC04) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D49), MP_ROM_PTR(&pin_PC05) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D50), MP_ROM_PTR(&pin_PD11) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_PD11) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D51), MP_ROM_PTR(&pin_PD08) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_PD08) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D52), MP_ROM_PTR(&pin_PD09) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_PD09) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D53), MP_ROM_PTR(&pin_PD10) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_SS), MP_ROM_PTR(&pin_PD10) }, - { MP_OBJ_NEW_QSTR(MP_QSTR_SD_MOSI), (mp_obj_t)&pin_PB26 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_SD_SCK), (mp_obj_t)&pin_PB27 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_SD_CS), (mp_obj_t)&pin_PB28 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_SD_MISO), (mp_obj_t)&pin_PB29 }, + { MP_OBJ_NEW_QSTR(MP_QSTR_SD_MOSI), MP_ROM_PTR(&pin_PB26) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_SD_SCK), MP_ROM_PTR(&pin_PB27) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_SD_CS), MP_ROM_PTR(&pin_PB28) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_SD_MISO), MP_ROM_PTR(&pin_PB29) }, - { MP_OBJ_NEW_QSTR(MP_QSTR_SD_CARD_DETECT), (mp_obj_t)&pin_PB31 }, + { MP_OBJ_NEW_QSTR(MP_QSTR_SD_CARD_DETECT), MP_ROM_PTR(&pin_PB31) }, - { MP_OBJ_NEW_QSTR(MP_QSTR_NEOPIXEL), (mp_obj_t)&pin_PC24 }, + { MP_OBJ_NEW_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_PC24) }, - { MP_OBJ_NEW_QSTR(MP_QSTR_LED_RX), (mp_obj_t)&pin_PC31 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_LED_TX), (mp_obj_t)&pin_PC30 }, + { MP_OBJ_NEW_QSTR(MP_QSTR_LED_RX), MP_ROM_PTR(&pin_PC31) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_LED_TX), MP_ROM_PTR(&pin_PC30) }, { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, diff --git a/ports/atmel-samd/boards/hallowing_m0_express/board.c b/ports/atmel-samd/boards/hallowing_m0_express/board.c index b47c5fbb2..23b119413 100644 --- a/ports/atmel-samd/boards/hallowing_m0_express/board.c +++ b/ports/atmel-samd/boards/hallowing_m0_express/board.c @@ -27,6 +27,7 @@ #include "boards/board.h" #include "shared-bindings/displayio/FourWire.h" +#include "shared-module/displayio/__init__.h" #include "shared-module/displayio/mipi_constants.h" #include "tick.h" @@ -68,47 +69,32 @@ uint8_t display_init_sequence[] = { }; void board_init(void) { - board_display_obj.base.type = &displayio_fourwire_type; - common_hal_displayio_fourwire_construct(&board_display_obj, - &pin_PB23, // Clock - &pin_PB22, // Data + displayio_fourwire_obj_t* bus = &displays[0].fourwire_bus; + bus->base.type = &displayio_fourwire_type; + common_hal_displayio_fourwire_construct(bus, + board_spi(), &pin_PA28, // Command or data &pin_PA01, // Chip select - &pin_PA27, // Reset + &pin_PA27); // Reset + + displayio_display_obj_t* display = &displays[0].display; + display->base.type = &displayio_display_type; + common_hal_displayio_display_construct(display, + bus, 128, // Width 128, // Height 2, // column start - 0, // row start + 1, // row start + 0, // rotation 16, // Color depth MIPI_COMMAND_SET_COLUMN_ADDRESS, // Set column command MIPI_COMMAND_SET_PAGE_ADDRESS, // Set row command - MIPI_COMMAND_WRITE_MEMORY_START); // Write memory command - - uint32_t i = 0; - common_hal_displayio_fourwire_begin_transaction(&board_display_obj); - while (i < sizeof(display_init_sequence)) { - uint8_t *cmd = display_init_sequence + i; - uint8_t data_size = *(cmd + 1); - bool delay = (data_size & DELAY) != 0; - data_size &= ~DELAY; - uint8_t *data = cmd + 2; - common_hal_displayio_fourwire_send(&board_display_obj, true, cmd, 1); - common_hal_displayio_fourwire_send(&board_display_obj, false, data, data_size); - if (delay) { - data_size++; - uint16_t delay_length_ms = *(cmd + 1 + data_size); - if (delay_length_ms == 255) { - delay_length_ms = 500; - } - uint64_t start = ticks_ms; - while (ticks_ms - start < delay_length_ms) {} - } else { - uint64_t start = ticks_ms; - while (ticks_ms - start < 10) {} - } - i += 2 + data_size; - } - common_hal_displayio_fourwire_end_transaction(&board_display_obj); + MIPI_COMMAND_WRITE_MEMORY_START, // Write memory command + 0x37, // set vertical scroll command + display_init_sequence, + sizeof(display_init_sequence), + &pin_PA00); + common_hal_displayio_display_set_auto_brightness(display, true); } bool board_requests_safe_mode(void) { @@ -116,5 +102,4 @@ bool board_requests_safe_mode(void) { } void reset_board(void) { - common_hal_displayio_fourwire_show(&board_display_obj, NULL); } diff --git a/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.h b/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.h index 1a570092b..4b5460706 100644 --- a/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.h +++ b/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.h @@ -35,5 +35,3 @@ // USB is always used internally so skip the pin objects for it. #define IGNORE_PIN_PA24 1 #define IGNORE_PIN_PA25 1 - -#define CIRCUITPY_DISPLAYIO (1) diff --git a/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.mk b/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.mk index 37f1bdef0..36cb67ea5 100644 --- a/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.mk +++ b/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.mk @@ -14,6 +14,9 @@ CHIP_FAMILY = samd21 # Include these Python libraries in firmware. FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_BusDevice -FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_HID FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_LIS3DH FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_NeoPixel + +# To keep the build small +CIRCUITPY_I2CSLAVE = 0 +CIRCUITPY_FREQUENCYIO = 0 diff --git a/ports/atmel-samd/boards/hallowing_m0_express/pins.c b/ports/atmel-samd/boards/hallowing_m0_express/pins.c index d1f8609ff..3db1b1752 100644 --- a/ports/atmel-samd/boards/hallowing_m0_express/pins.c +++ b/ports/atmel-samd/boards/hallowing_m0_express/pins.c @@ -1,7 +1,8 @@ #include "shared-bindings/board/__init__.h" #include "boards/board.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" +#include "shared-module/displayio/__init__.h" STATIC const mp_rom_map_elem_t board_global_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA02) }, @@ -62,6 +63,6 @@ STATIC const mp_rom_map_elem_t board_global_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, - { MP_ROM_QSTR(MP_QSTR_DISPLAY), MP_ROM_PTR(&board_display_obj)} + { MP_ROM_QSTR(MP_QSTR_DISPLAY), MP_ROM_PTR(&displays[0].display)} }; MP_DEFINE_CONST_DICT(board_module_globals, board_global_dict_table); diff --git a/ports/atmel-samd/boards/itsybitsy_m0_express/pins.c b/ports/atmel-samd/boards/itsybitsy_m0_express/pins.c index 25407bc14..912fba4ed 100644 --- a/ports/atmel-samd/boards/itsybitsy_m0_express/pins.c +++ b/ports/atmel-samd/boards/itsybitsy_m0_express/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" STATIC const mp_rom_map_elem_t board_global_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_PA11) }, diff --git a/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.mk b/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.mk index 2afff5965..d4d674d9d 100644 --- a/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.mk +++ b/ports/atmel-samd/boards/itsybitsy_m4_express/mpconfigboard.mk @@ -9,5 +9,10 @@ EXTERNAL_FLASH_DEVICE_COUNT = 1 EXTERNAL_FLASH_DEVICES = GD25Q16C LONGINT_IMPL = MPZ +# No I2S on SAMD51G +CIRCUITPY_AUDIOBUSIO = 0 +# No touch on SAMD51 yet +CIRCUITPY_TOUCHIO = 0 + CHIP_VARIANT = SAMD51G19A CHIP_FAMILY = samd51 diff --git a/ports/atmel-samd/boards/itsybitsy_m4_express/pins.c b/ports/atmel-samd/boards/itsybitsy_m4_express/pins.c index 2a89c3037..ed91c88ee 100644 --- a/ports/atmel-samd/boards/itsybitsy_m4_express/pins.c +++ b/ports/atmel-samd/boards/itsybitsy_m4_express/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" // This mapping only includes functional names because pins broken // out on connectors are labeled with their MCU name available from diff --git a/ports/atmel-samd/boards/meowmeow/mpconfigboard.h b/ports/atmel-samd/boards/meowmeow/mpconfigboard.h index fe741a0f7..1304b6dfb 100644 --- a/ports/atmel-samd/boards/meowmeow/mpconfigboard.h +++ b/ports/atmel-samd/boards/meowmeow/mpconfigboard.h @@ -10,9 +10,9 @@ // If you change this, then make sure to update the linker scripts as well to // make sure you don't overwrite code. -#define CIRCUITPY_INTERNAL_NVM_SIZE 0 +#define CIRCUITPY_INTERNAL_NVM_SIZE 256 -#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000) +#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE) #define CALIBRATE_CRYSTALLESS 1 diff --git a/ports/atmel-samd/boards/meowmeow/mpconfigboard.mk b/ports/atmel-samd/boards/meowmeow/mpconfigboard.mk index 31015ad17..3547235dd 100644 --- a/ports/atmel-samd/boards/meowmeow/mpconfigboard.mk +++ b/ports/atmel-samd/boards/meowmeow/mpconfigboard.mk @@ -6,6 +6,9 @@ USB_MANUFACTURER = "Electronic Cats" INTERNAL_FLASH_FILESYSTEM = 1 LONGINT_IMPL = NONE +CIRCUITPY_SMALL_BUILD = 1 CHIP_VARIANT = SAMD21G18A -CHIP_FAMILY = samd21
\ No newline at end of file +CHIP_FAMILY = samd21 + +CIRCUITPY_FREQUENCYIO = 0 diff --git a/ports/atmel-samd/boards/meowmeow/pins.c b/ports/atmel-samd/boards/meowmeow/pins.c index 59c51f4eb..089baad32 100644 --- a/ports/atmel-samd/boards/meowmeow/pins.c +++ b/ports/atmel-samd/boards/meowmeow/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" STATIC const mp_rom_map_elem_t board_global_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA02) }, diff --git a/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.h b/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.h index 4835ee7d2..bfa254b95 100644 --- a/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.h +++ b/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.h @@ -42,5 +42,3 @@ // USB is always used internally so skip the pin objects for it. #define IGNORE_PIN_PA24 1 #define IGNORE_PIN_PA25 1 - -#define CIRCUITPY_I2CSLAVE diff --git a/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk b/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk index 49a94144b..5104b601b 100644 --- a/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk +++ b/ports/atmel-samd/boards/metro_m0_express/mpconfigboard.mk @@ -5,14 +5,12 @@ USB_PRODUCT = "Metro M0 Express" USB_MANUFACTURER = "Adafruit Industries LLC" SPI_FLASH_FILESYSTEM = 1 +EXTERNAL_FLASH_DEVICE_COUNT = 2 +EXTERNAL_FLASH_DEVICES = "S25FL216K, GD25Q16C" + LONGINT_IMPL = MPZ CHIP_VARIANT = SAMD21G18A CHIP_FAMILY = samd21 -MICROPY_PY_NETWORK = 1 -MICROPY_PY_WIZNET5K = 5500 - -SPI_FLASH_FILESYSTEM = 1 -EXTERNAL_FLASH_DEVICE_COUNT = 2 -EXTERNAL_FLASH_DEVICES = "S25FL216K, GD25Q16C" +CIRCUITPY_FREQUENCYIO = 0 diff --git a/ports/atmel-samd/boards/metro_m0_express/pins.c b/ports/atmel-samd/boards/metro_m0_express/pins.c index 13f0eb0ba..0707a3581 100644 --- a/ports/atmel-samd/boards/metro_m0_express/pins.c +++ b/ports/atmel-samd/boards/metro_m0_express/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" STATIC const mp_rom_map_elem_t board_global_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA02) }, diff --git a/ports/atmel-samd/boards/metro_m4_express/mpconfigboard.h b/ports/atmel-samd/boards/metro_m4_express/mpconfigboard.h index 073468899..2a8878874 100644 --- a/ports/atmel-samd/boards/metro_m4_express/mpconfigboard.h +++ b/ports/atmel-samd/boards/metro_m4_express/mpconfigboard.h @@ -43,5 +43,3 @@ // USB is always used internally so skip the pin objects for it. #define IGNORE_PIN_PA24 1 #define IGNORE_PIN_PA25 1 - -#define CIRCUITPY_I2CSLAVE diff --git a/ports/atmel-samd/boards/metro_m4_express/mpconfigboard.mk b/ports/atmel-samd/boards/metro_m4_express/mpconfigboard.mk index 633856362..35162b678 100644 --- a/ports/atmel-samd/boards/metro_m4_express/mpconfigboard.mk +++ b/ports/atmel-samd/boards/metro_m4_express/mpconfigboard.mk @@ -10,8 +10,11 @@ EXTERNAL_FLASH_DEVICES = "S25FL116K, S25FL216K, GD25Q16C" LONGINT_IMPL = MPZ +# No touch on SAMD51 yet +CIRCUITPY_TOUCHIO = 0 + CHIP_VARIANT = SAMD51J19A CHIP_FAMILY = samd51 -MICROPY_PY_NETWORK = 1 +CIRCUITPY_NETWORK = 1 MICROPY_PY_WIZNET5K = 5500 diff --git a/ports/atmel-samd/boards/metro_m4_express/pins.c b/ports/atmel-samd/boards/metro_m4_express/pins.c index 0e66817f7..63ae319a2 100644 --- a/ports/atmel-samd/boards/metro_m4_express/pins.c +++ b/ports/atmel-samd/boards/metro_m4_express/pins.c @@ -1,46 +1,46 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" // This mapping only includes functional names because pins broken // out on connectors are labeled with their MCU name available from // microcontroller.pin. -STATIC const mp_map_elem_t board_global_dict_table[] = { - { MP_OBJ_NEW_QSTR(MP_QSTR_A0), (mp_obj_t)&pin_PA02 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_A1), (mp_obj_t)&pin_PA05 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_A2), (mp_obj_t)&pin_PA06 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_A3), (mp_obj_t)&pin_PA04 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_A4), (mp_obj_t)&pin_PB08 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_A5), (mp_obj_t)&pin_PB09 }, +STATIC const mp_rom_map_elem_t board_global_dict_table[] = { + { MP_OBJ_NEW_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA02) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_PA05) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_PA06) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_PA04) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_PB08) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_PB09) }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D0), (mp_obj_t)&pin_PA23 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_RX), (mp_obj_t)&pin_PA23 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D1), (mp_obj_t)&pin_PA22 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_TX), (mp_obj_t)&pin_PA22 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D2), (mp_obj_t)&pin_PB17 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D3), (mp_obj_t)&pin_PB16 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D4), (mp_obj_t)&pin_PB13 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D5), (mp_obj_t)&pin_PB14 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D6), (mp_obj_t)&pin_PB15 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D7), (mp_obj_t)&pin_PB12 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D8), (mp_obj_t)&pin_PA21 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D9), (mp_obj_t)&pin_PA20 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D10), (mp_obj_t)&pin_PA18 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D11), (mp_obj_t)&pin_PA19 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D12), (mp_obj_t)&pin_PA17 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D13), (mp_obj_t)&pin_PA16 }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_PA23) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_PA23) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_PA22) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_PA22) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_PB17) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_PB16) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_PB13) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_PB14) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_PB15) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_PB12) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D8), MP_ROM_PTR(&pin_PA21) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_PA20) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_PA18) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_PA19) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_PA17) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D13),MP_ROM_PTR(&pin_PA16) }, - { MP_OBJ_NEW_QSTR(MP_QSTR_SDA), (mp_obj_t)&pin_PB02 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_SCL), (mp_obj_t)&pin_PB03 }, + { MP_OBJ_NEW_QSTR(MP_QSTR_SDA),MP_ROM_PTR(&pin_PB02) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_SCL),MP_ROM_PTR(&pin_PB03) }, - { MP_OBJ_NEW_QSTR(MP_QSTR_NEOPIXEL), (mp_obj_t)&pin_PB22 }, + { MP_OBJ_NEW_QSTR(MP_QSTR_NEOPIXEL),MP_ROM_PTR(&pin_PB22) }, - { MP_OBJ_NEW_QSTR(MP_QSTR_SCK), (mp_obj_t)&pin_PA13 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_MOSI), (mp_obj_t)&pin_PA12 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_MISO), (mp_obj_t)&pin_PA14 }, + { MP_OBJ_NEW_QSTR(MP_QSTR_SCK),MP_ROM_PTR(&pin_PA13) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_MOSI),MP_ROM_PTR(&pin_PA12) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_MISO),MP_ROM_PTR(&pin_PA14) }, - { MP_OBJ_NEW_QSTR(MP_QSTR_LED_RX), (mp_obj_t)&pin_PB06 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_LED_TX), (mp_obj_t)&pin_PA27 }, + { MP_OBJ_NEW_QSTR(MP_QSTR_LED_RX),MP_ROM_PTR(&pin_PB06) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_LED_TX),MP_ROM_PTR(&pin_PA27) }, { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, diff --git a/ports/atmel-samd/boards/mini_sam_m4/mpconfigboard.mk b/ports/atmel-samd/boards/mini_sam_m4/mpconfigboard.mk index a69d2f623..27bad2693 100644 --- a/ports/atmel-samd/boards/mini_sam_m4/mpconfigboard.mk +++ b/ports/atmel-samd/boards/mini_sam_m4/mpconfigboard.mk @@ -7,7 +7,13 @@ USB_MANUFACTURER = "Benjamin Shockley" QSPI_FLASH_FILESYSTEM = 1 EXTERNAL_FLASH_DEVICE_COUNT = 1 EXTERNAL_FLASH_DEVICES = "W25Q16JV_IM" + LONGINT_IMPL = MPZ +# No I2S on SAMD51G +CIRCUITPY_AUDIOBUSIO = 0 +# No touch on SAMD51 yet +CIRCUITPY_TOUCHIO = 0 + CHIP_VARIANT = SAMD51G19A CHIP_FAMILY = samd51 diff --git a/ports/atmel-samd/boards/mini_sam_m4/pins.c b/ports/atmel-samd/boards/mini_sam_m4/pins.c index 87e210381..f78fe1bc8 100644 --- a/ports/atmel-samd/boards/mini_sam_m4/pins.c +++ b/ports/atmel-samd/boards/mini_sam_m4/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" // This mapping only includes functional names because pins broken // out on connectors are labeled with their MCU name available from diff --git a/ports/nrf/boards/feather_nrf52832/board.c b/ports/atmel-samd/boards/pewpew10/board.c index 29ee2fdcd..d7e856d61 100644 --- a/ports/nrf/boards/feather_nrf52832/board.c +++ b/ports/atmel-samd/boards/pewpew10/board.c @@ -24,11 +24,6 @@ * THE SOFTWARE. */ -#include <string.h> -#include <stdbool.h> - -#include "nrf.h" - #include "boards/board.h" void board_init(void) { diff --git a/ports/atmel-samd/boards/pewpew10/mpconfigboard.h b/ports/atmel-samd/boards/pewpew10/mpconfigboard.h new file mode 100644 index 000000000..445ccc435 --- /dev/null +++ b/ports/atmel-samd/boards/pewpew10/mpconfigboard.h @@ -0,0 +1,50 @@ +#define MICROPY_HW_BOARD_NAME "PewPew 10.2" +#define MICROPY_HW_MCU_NAME "samd21e18" + +#define MICROPY_PORT_A (PORT_PA24 | PORT_PA25) +#define MICROPY_PORT_B (0) +#define MICROPY_PORT_C (0) + +#define CIRCUITPY_INTERNAL_NVM_SIZE 256 + +#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE) + + +#define IGNORE_PIN_PB00 1 +#define IGNORE_PIN_PB01 1 +#define IGNORE_PIN_PB02 1 +#define IGNORE_PIN_PB03 1 +#define IGNORE_PIN_PB04 1 +#define IGNORE_PIN_PB05 1 +#define IGNORE_PIN_PB06 1 +#define IGNORE_PIN_PB07 1 +#define IGNORE_PIN_PB08 1 +#define IGNORE_PIN_PB09 1 +#define IGNORE_PIN_PB10 1 +#define IGNORE_PIN_PB11 1 +#define IGNORE_PIN_PB12 1 +#define IGNORE_PIN_PB13 1 +#define IGNORE_PIN_PB14 1 +#define IGNORE_PIN_PB15 1 +#define IGNORE_PIN_PB16 1 +#define IGNORE_PIN_PB17 1 +#define IGNORE_PIN_PB22 1 +#define IGNORE_PIN_PB23 1 +#define IGNORE_PIN_PB30 1 +#define IGNORE_PIN_PB31 1 + +// USB is always used internally so skip the pin objects for it. +#define IGNORE_PIN_PA24 1 +#define IGNORE_PIN_PA25 1 + +// Default protocol pins. + +#define DEFAULT_I2C_BUS_SCL (&pin_PA01) +#define DEFAULT_I2C_BUS_SDA (&pin_PA00) + +#define DEFAULT_SPI_BUS_SCK (&pin_PA31) +#define DEFAULT_SPI_BUS_MOSI (&pin_PA30) +#define DEFAULT_SPI_BUS_MISO (&pin_PA04) + +#define DEFAULT_UART_BUS_RX (&pin_PA01) +#define DEFAULT_UART_BUS_TX (&pin_PA00) diff --git a/ports/atmel-samd/boards/pewpew10/mpconfigboard.mk b/ports/atmel-samd/boards/pewpew10/mpconfigboard.mk new file mode 100644 index 000000000..92f8cff52 --- /dev/null +++ b/ports/atmel-samd/boards/pewpew10/mpconfigboard.mk @@ -0,0 +1,23 @@ +LD_FILE = boards/samd21x18-bootloader.ld +USB_VID = 0x239A +USB_PID = 0x801D +USB_PRODUCT = "PewPew 10.2" +USB_MANUFACTURER = "Radomir Dopieralski" + +INTERNAL_FLASH_FILESYSTEM = 1 +LONGINT_IMPL = NONE + +CHIP_VARIANT = SAMD21E18A +CHIP_FAMILY = samd21 + +FROZEN_MPY_DIRS += $(TOP)/frozen/pew-pewpew-standalone-10.x + +CIRCUITPY_PEW = 1 +CIRCUITPY_ANALOGIO = 1 +CIRCUITPY_MATH = 1 +CIRCUITPY_NEOPIXEL_WRITE = 1 +CIRCUITPY_RTC = 0 +CIRCUITPY_SAMD = 0 +CIRCUITPY_USB_MIDI = 0 +CIRCUITPY_SMALL_BUILD = 1 +CIRCUITPY_FREQUENCYIO = 0 diff --git a/ports/atmel-samd/boards/pewpew10/pins.c b/ports/atmel-samd/boards/pewpew10/pins.c new file mode 100644 index 000000000..e2552dc32 --- /dev/null +++ b/ports/atmel-samd/boards/pewpew10/pins.c @@ -0,0 +1,53 @@ +#include "shared-bindings/board/__init__.h" + +#include "supervisor/shared/board_busses.h" + +STATIC const mp_rom_map_elem_t board_global_dict_table[] = { + // Pins for internal use. + { MP_ROM_QSTR(MP_QSTR__R1), MP_ROM_PTR(&pin_PA05) }, + { MP_ROM_QSTR(MP_QSTR__R2), MP_ROM_PTR(&pin_PA11) }, + { MP_ROM_QSTR(MP_QSTR__R3), MP_ROM_PTR(&pin_PA28) }, + { MP_ROM_QSTR(MP_QSTR__R4), MP_ROM_PTR(&pin_PA09) }, + { MP_ROM_QSTR(MP_QSTR__R5), MP_ROM_PTR(&pin_PA16) }, + { MP_ROM_QSTR(MP_QSTR__R6), MP_ROM_PTR(&pin_PA27) }, + { MP_ROM_QSTR(MP_QSTR__R7), MP_ROM_PTR(&pin_PA17) }, + { MP_ROM_QSTR(MP_QSTR__R8), MP_ROM_PTR(&pin_PA22) }, + + { MP_ROM_QSTR(MP_QSTR__C8), MP_ROM_PTR(&pin_PA10) }, + { MP_ROM_QSTR(MP_QSTR__C7), MP_ROM_PTR(&pin_PA18) }, + { MP_ROM_QSTR(MP_QSTR__C6), MP_ROM_PTR(&pin_PA19) }, + { MP_ROM_QSTR(MP_QSTR__C5), MP_ROM_PTR(&pin_PA06) }, + { MP_ROM_QSTR(MP_QSTR__C4), MP_ROM_PTR(&pin_PA23) }, + { MP_ROM_QSTR(MP_QSTR__C3), MP_ROM_PTR(&pin_PA07) }, + { MP_ROM_QSTR(MP_QSTR__C2), MP_ROM_PTR(&pin_PA14) }, + { MP_ROM_QSTR(MP_QSTR__C1), MP_ROM_PTR(&pin_PA15) }, + + { MP_ROM_QSTR(MP_QSTR__BUTTONS), MP_ROM_PTR(&pin_PA08) }, + + // User pins. + { MP_ROM_QSTR(MP_QSTR_P1), MP_ROM_PTR(&pin_PA30) }, + { MP_ROM_QSTR(MP_QSTR_P2), MP_ROM_PTR(&pin_PA31) }, + { MP_ROM_QSTR(MP_QSTR_P3), MP_ROM_PTR(&pin_PA00) }, + { MP_ROM_QSTR(MP_QSTR_P4), MP_ROM_PTR(&pin_PA01) }, + { MP_ROM_QSTR(MP_QSTR_P5), MP_ROM_PTR(&pin_PA02) }, + { MP_ROM_QSTR(MP_QSTR_P6), MP_ROM_PTR(&pin_PA03) }, + { MP_ROM_QSTR(MP_QSTR_P7), MP_ROM_PTR(&pin_PA04) }, + + // Protocol aliases. + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_PA00) }, + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_PA01) }, + + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_PA00) }, + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_PA01) }, + + { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_PA04) }, + { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_PA30) }, + { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_PA31) }, + + { MP_ROM_QSTR(MP_QSTR_DAC), MP_ROM_PTR(&pin_PA02) }, + + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_global_dict_table); diff --git a/ports/atmel-samd/boards/pirkey_m0/mpconfigboard.h b/ports/atmel-samd/boards/pirkey_m0/mpconfigboard.h index cbbd4b569..288208f65 100644 --- a/ports/atmel-samd/boards/pirkey_m0/mpconfigboard.h +++ b/ports/atmel-samd/boards/pirkey_m0/mpconfigboard.h @@ -10,12 +10,9 @@ #define MICROPY_PORT_B (0) #define MICROPY_PORT_C (0) -#define CIRCUITPY_INTERNAL_NVM_SIZE 0 +#define CIRCUITPY_INTERNAL_NVM_SIZE 256 -// A number of modules are removed for pIRKey to make room for frozen libraries. -#define PIRKEY_M0 (1) - -#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000) +#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE) #define IGNORE_PIN_PA02 1 #define IGNORE_PIN_PA03 1 diff --git a/ports/atmel-samd/boards/pirkey_m0/mpconfigboard.mk b/ports/atmel-samd/boards/pirkey_m0/mpconfigboard.mk index ddc262a57..418f70d92 100644 --- a/ports/atmel-samd/boards/pirkey_m0/mpconfigboard.mk +++ b/ports/atmel-samd/boards/pirkey_m0/mpconfigboard.mk @@ -7,6 +7,18 @@ USB_MANUFACTURER = "Adafruit Industries LLC" INTERNAL_FLASH_FILESYSTEM = 1 LONGINT_IMPL = NONE +# A number of modules are removed for pIRKey to make room for frozen libraries. +# Many I/O functions are not available. +# math is very large and is also removed. +CIRCUITPY_ANALOGIO = 0 +CIRCUITPY_MATH = 0 +CIRCUITPY_NEOPIXEL_WRITE = 0 +CIRCUITPY_RTC = 0 +CIRCUITPY_SAMD = 0 +CIRCUITPY_USB_MIDI = 0 +CIRCUITPY_SMALL_BUILD = 1 +CIRCUITPY_FREQUENCYIO = 0 + CHIP_VARIANT = SAMD21E18A CHIP_FAMILY = samd21 diff --git a/ports/atmel-samd/boards/pirkey_m0/pins.c b/ports/atmel-samd/boards/pirkey_m0/pins.c index e08302f14..a6dbcefe3 100644 --- a/ports/atmel-samd/boards/pirkey_m0/pins.c +++ b/ports/atmel-samd/boards/pirkey_m0/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" STATIC const mp_rom_map_elem_t board_global_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_REMOTEIN), MP_ROM_PTR(&pin_PA28) }, diff --git a/ports/atmel-samd/boards/pybadge/board.c b/ports/atmel-samd/boards/pybadge/board.c new file mode 100644 index 000000000..0881d8f45 --- /dev/null +++ b/ports/atmel-samd/boards/pybadge/board.c @@ -0,0 +1,111 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2017 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "boards/board.h" +#include "mpconfigboard.h" +#include "hal/include/hal_gpio.h" +#include "shared-bindings/busio/SPI.h" +#include "shared-bindings/displayio/FourWire.h" +#include "shared-module/displayio/__init__.h" +#include "shared-module/displayio/mipi_constants.h" +#include "tick.h" + +displayio_fourwire_obj_t board_display_obj; + +#define DELAY 0x80 + +uint8_t display_init_sequence[] = { + 0x01, 0 | DELAY, 150, // SWRESET + 0x11, 0 | DELAY, 255, // SLPOUT + 0xb1, 3, 0x01, 0x2C, 0x2D, // _FRMCTR1 + 0xb2, 3, 0x01, 0x2C, 0x2D, // + 0xb3, 6, 0x01, 0x2C, 0x2D, 0x01, 0x2C, 0x2D, + 0xb4, 1, 0x07, // _INVCTR line inversion + 0xc0, 3, 0xa2, 0x02, 0x84, // _PWCTR1 GVDD = 4.7V, 1.0uA + 0xc1, 1, 0xc5, // _PWCTR2 VGH=14.7V, VGL=-7.35V + 0xc2, 2, 0x0a, 0x00, // _PWCTR3 Opamp current small, Boost frequency + 0xc3, 2, 0x8a, 0x2a, + 0xc4, 2, 0x8a, 0xee, + 0xc5, 1, 0x0e, // _VMCTR1 VCOMH = 4V, VOML = -1.1V + 0x2a, 0, // _INVOFF + 0x36, 1, 0x00, // _MADCTL top to bottom refresh in vsync aligned order. + // 1 clk cycle nonoverlap, 2 cycle gate rise, 3 sycle osc equalie, + // fix on VTL + 0x3a, 1, 0x05, // COLMOD - 16bit color + 0xe0, 16, 0x02, 0x1c, 0x07, 0x12, // _GMCTRP1 Gamma + 0x37, 0x32, 0x29, 0x2d, + 0x29, 0x25, 0x2B, 0x39, + 0x00, 0x01, 0x03, 0x10, + 0xe1, 16, 0x03, 0x1d, 0x07, 0x06, // _GMCTRN1 + 0x2E, 0x2C, 0x29, 0x2D, + 0x2E, 0x2E, 0x37, 0x3F, + 0x00, 0x00, 0x02, 0x10, + 0x2a, 3, 0x02, 0x00, 0x81, // _CASET XSTART = 2, XEND = 129 + 0x2b, 3, 0x02, 0x00, 0x81, // _RASET XSTART = 2, XEND = 129 + 0x13, 0 | DELAY, 10, // _NORON + 0x29, 0 | DELAY, 100, // _DISPON +}; + +STATIC busio_spi_obj_t display_spi_obj; + +void board_init(void) { + common_hal_busio_spi_construct(&display_spi_obj, &pin_PB13, &pin_PB12, NULL); + common_hal_busio_spi_never_reset(&display_spi_obj); + + displayio_fourwire_obj_t* bus = &displays[0].fourwire_bus; + bus->base.type = &displayio_fourwire_type; + common_hal_displayio_fourwire_construct(bus, + &display_spi_obj, + &pin_PB05, // TFT_DC Command or data + &pin_PB07, // TFT_CS Chip select + &pin_PA01); // TFT_RST Reset + + displayio_display_obj_t* display = &displays[0].display; + display->base.type = &displayio_display_type; + common_hal_displayio_display_construct(display, + bus, + 160, // Width + 128, // Height + 0, // column start + 0, // row start + 270, // rotation + 16, // Color depth + MIPI_COMMAND_SET_COLUMN_ADDRESS, // Set column command + MIPI_COMMAND_SET_PAGE_ADDRESS, // Set row command + MIPI_COMMAND_WRITE_MEMORY_START, // Write memory command + 0x37, // set vertical scroll command + display_init_sequence, + sizeof(display_init_sequence), + &pin_PA00); + common_hal_displayio_display_set_auto_brightness(display, true); +} + +bool board_requests_safe_mode(void) { + return false; +} + +void reset_board(void) { +} diff --git a/ports/atmel-samd/boards/pybadge/mpconfigboard.h b/ports/atmel-samd/boards/pybadge/mpconfigboard.h new file mode 100644 index 000000000..36115bc87 --- /dev/null +++ b/ports/atmel-samd/boards/pybadge/mpconfigboard.h @@ -0,0 +1,37 @@ +#define MICROPY_HW_BOARD_NAME "Adafruit Pybadge" +#define MICROPY_HW_MCU_NAME "samd51j19" + +#define CIRCUITPY_MCU_FAMILY samd51 + +// This is for Rev B +#define MICROPY_HW_LED_STATUS (&pin_PA23) + +// These are pins not to reset. +// QSPI Data pins +#define MICROPY_PORT_A (PORT_PA08 | PORT_PA09 | PORT_PA10 | PORT_PA11) +// DotStar pins, QSPI CS, and QSPI SCK +#define MICROPY_PORT_B (PORT_PB10 | PORT_PB11) +#define MICROPY_PORT_C (0) +#define MICROPY_PORT_D (0) + +#define AUTORESET_DELAY_MS 500 + +// If you change this, then make sure to update the linker scripts as well to +// make sure you don't overwrite code +#define CIRCUITPY_INTERNAL_NVM_SIZE 8192 + +#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE) + +#define DEFAULT_I2C_BUS_SCL (&pin_PA13) +#define DEFAULT_I2C_BUS_SDA (&pin_PA12) + +#define DEFAULT_SPI_BUS_SCK (&pin_PA17) +#define DEFAULT_SPI_BUS_MOSI (&pin_PB23) +#define DEFAULT_SPI_BUS_MISO (&pin_PB22) + +#define DEFAULT_UART_BUS_RX (&pin_PB17) +#define DEFAULT_UART_BUS_TX (&pin_PB16) + +// USB is always used internally so skip the pin objects for it. +#define IGNORE_PIN_PA24 1 +#define IGNORE_PIN_PA25 1 diff --git a/ports/atmel-samd/boards/pybadge/mpconfigboard.mk b/ports/atmel-samd/boards/pybadge/mpconfigboard.mk new file mode 100644 index 000000000..8ab759865 --- /dev/null +++ b/ports/atmel-samd/boards/pybadge/mpconfigboard.mk @@ -0,0 +1,18 @@ +LD_FILE = boards/samd51x19-bootloader-external-flash.ld +USB_VID = 0x239A +USB_PID = 0x802C +USB_PRODUCT = "PyBadge" +USB_MANUFACTURER = "Adafruit Industries LLC" + +QSPI_FLASH_FILESYSTEM = 1 +EXTERNAL_FLASH_DEVICE_COUNT = 1 +EXTERNAL_FLASH_DEVICES = GD25Q64C +LONGINT_IMPL = MPZ + +# No I2S on SAMD51G +CIRCUITPY_AUDIOBUSIO = 0 +# No touch on SAMD51 yet +CIRCUITPY_TOUCHIO = 0 + +CHIP_VARIANT = SAMD51J19A +CHIP_FAMILY = samd51 diff --git a/ports/atmel-samd/boards/pybadge/pins.c b/ports/atmel-samd/boards/pybadge/pins.c new file mode 100644 index 000000000..41ab634c9 --- /dev/null +++ b/ports/atmel-samd/boards/pybadge/pins.c @@ -0,0 +1,42 @@ +#include "shared-bindings/board/__init__.h" + +#include "boards/board.h" +#include "supervisor/shared/board_busses.h" +#include "shared-module/displayio/__init__.h" + +STATIC const mp_rom_map_elem_t board_global_dict_table[] = { + { MP_OBJ_NEW_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_PB08) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_PB09) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_PA04) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_PA06) }, + + { MP_OBJ_NEW_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_PA16) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_PA18) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_PA19) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_PA20) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_PA21) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_PA22) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_PA23) }, + + { MP_OBJ_NEW_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_PA15) }, + + { MP_OBJ_NEW_QSTR(MP_QSTR_AVCC), MP_ROM_PTR(&pin_PA03) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_LEFT_DAC), MP_ROM_PTR(&pin_PA02) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_RIGHT_DAC), MP_ROM_PTR(&pin_PA05) }, + + { MP_OBJ_NEW_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_PA17) }, + + { MP_OBJ_NEW_QSTR(MP_QSTR_TFT_LITE), MP_ROM_PTR(&pin_PA00) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_TFT_MOSI), MP_ROM_PTR(&pin_PA12) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_TFT_SCK), MP_ROM_PTR(&pin_PA13) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_TFT_RST), MP_ROM_PTR(&pin_PA01) }, + { MP_ROM_QSTR(MP_QSTR_TFT_CS), MP_ROM_PTR(&pin_PB07) }, + { MP_ROM_QSTR(MP_QSTR_TFT_DC), MP_ROM_PTR(&pin_PB05) }, + + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, + + { MP_ROM_QSTR(MP_QSTR_DISPLAY), MP_ROM_PTR(&displays[0].display)} +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_global_dict_table); diff --git a/ports/atmel-samd/boards/pyportal/board.c b/ports/atmel-samd/boards/pyportal/board.c index 7599f02b8..d2c328850 100644 --- a/ports/atmel-samd/boards/pyportal/board.c +++ b/ports/atmel-samd/boards/pyportal/board.c @@ -3,7 +3,7 @@ * * The MIT License (MIT) * - * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries + * Copyright (c) 2019 Scott Shawcroft for Adafruit Industries * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -25,10 +25,73 @@ */ #include "boards/board.h" +#include "supervisor/shared/board_busses.h" #include "mpconfigboard.h" #include "hal/include/hal_gpio.h" +#include "shared-module/displayio/__init__.h" +#include "shared-module/displayio/mipi_constants.h" + +#include "tick.h" + +#define DELAY 0x80 + +uint8_t display_init_sequence[] = { + 0xEF, 3, 0x03, 0x80, 0x02, + 0xCF, 3, 0x00, 0xC1, 0x30, + 0xED, 4, 0x64, 0x03, 0x12, 0x81, + 0xE8, 3, 0x85, 0x00, 0x78, + 0xCB, 5, 0x39, 0x2C, 0x00, 0x34, 0x02, + 0xF7, 1, 0x20, + 0xEA, 2, 0x00, 0x00, + 0xc0, 1, 0x23, // Power control VRH[5:0] + 0xc1, 1, 0x10, // Power control SAP[2:0];BT[3:0] + 0xc5, 2, 0x3e, 0x28, // VCM control + 0xc7, 1, 0x86, // VCM control2 + 0x36, 1, 0xa8, // Memory Access Control + 0x37, 1, 0x00, // Vertical scroll zero + 0x3a, 1, 0x55, // COLMOD: Pixel Format Set + 0xb1, 2, 0x00, 0x18, // Frame Rate Control (In Normal Mode/Full Colors) + 0xb6, 3, 0x08, 0xa2, 0x27, // Display Function Control + 0xF2, 1, 0x00, // 3Gamma Function Disable + 0x26, 1, 0x01, // Gamma curve selected + 0xe0, 15, 0x0F, 0x31, 0x2B, 0x0C, 0x0E, 0x08, // Set Gamma + 0x4E, 0xF1, 0x37, 0x07, 0x10, 0x03, 0x0E, 0x09, 0x00, + 0xe1, 15, 0x00, 0x0E, 0x14, 0x03, 0x11, 0x07, // Set Gamma + 0x31, 0xC1, 0x48, 0x08, 0x0F, 0x0C, 0x31, 0x36, 0x0F, + 0x11, DELAY, 120, // Exit Sleep + 0x29, DELAY, 120, // Display on +}; + void board_init(void) { + displayio_parallelbus_obj_t* bus = &displays[0].parallel_bus; + bus->base.type = &displayio_parallelbus_type; + common_hal_displayio_parallelbus_construct(bus, + &pin_PA16, // Data0 + &pin_PB05, // Command or data + &pin_PB06, // Chip select + &pin_PB09, // Write + &pin_PB04, // Read + &pin_PA00); // Reset + + displayio_display_obj_t* display = &displays[0].display; + display->base.type = &displayio_display_type; + common_hal_displayio_display_construct(display, + bus, + 320, // Width + 240, // Height + 0, // column start + 0, // row start + 0, // rotation + 16, // Color depth + MIPI_COMMAND_SET_COLUMN_ADDRESS, // Set column command + MIPI_COMMAND_SET_PAGE_ADDRESS, // Set row command + MIPI_COMMAND_WRITE_MEMORY_START, // Write memory command + 0x37, // Set vertical scroll command + display_init_sequence, + sizeof(display_init_sequence), + &pin_PB31); + common_hal_displayio_display_set_auto_brightness(display, true); } bool board_requests_safe_mode(void) { diff --git a/ports/atmel-samd/boards/pyportal/mpconfigboard.h b/ports/atmel-samd/boards/pyportal/mpconfigboard.h index 16b104297..43346488b 100644 --- a/ports/atmel-samd/boards/pyportal/mpconfigboard.h +++ b/ports/atmel-samd/boards/pyportal/mpconfigboard.h @@ -13,7 +13,7 @@ // QSPI Data pins #define MICROPY_PORT_A ( PORT_PA08 | PORT_PA09 | PORT_PA10 | PORT_PA11 ) // QSPI CS, and QSPI SCK -#define MICROPY_PORT_B ( PORT_PB10 | PORT_PB11 ) +#define MICROPY_PORT_B ( PORT_PB10 | PORT_PB11 | PORT_PB22 ) #define MICROPY_PORT_C ( 0 ) #define MICROPY_PORT_D (0) diff --git a/ports/atmel-samd/boards/pyportal/mpconfigboard.mk b/ports/atmel-samd/boards/pyportal/mpconfigboard.mk index 649bbb648..34a94ac2b 100644 --- a/ports/atmel-samd/boards/pyportal/mpconfigboard.mk +++ b/ports/atmel-samd/boards/pyportal/mpconfigboard.mk @@ -6,9 +6,12 @@ USB_MANUFACTURER = "Adafruit Industries LLC" QSPI_FLASH_FILESYSTEM = 1 -EXTERNAL_FLASH_DEVICE_COUNT = 1 -EXTERNAL_FLASH_DEVICES = "GD25Q64C" +EXTERNAL_FLASH_DEVICE_COUNT = 2 +EXTERNAL_FLASH_DEVICES = "W25Q64JV_IQ, GD25Q64C" LONGINT_IMPL = MPZ +# No touch on SAMD51 yet +CIRCUITPY_TOUCHIO = 0 + CHIP_VARIANT = SAMD51J20A CHIP_FAMILY = samd51 diff --git a/ports/atmel-samd/boards/pyportal/pins.c b/ports/atmel-samd/boards/pyportal/pins.c index 84ecbafff..4a41ee913 100644 --- a/ports/atmel-samd/boards/pyportal/pins.c +++ b/ports/atmel-samd/boards/pyportal/pins.c @@ -1,55 +1,86 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "boards/board.h" +#include "shared-module/displayio/__init__.h" +#include "supervisor/shared/board_busses.h" // This mapping only includes functional names because pins broken // out on connectors are labeled with their MCU name available from // microcontroller.pin. -STATIC const mp_map_elem_t board_global_dict_table[] = { - { MP_OBJ_NEW_QSTR(MP_QSTR_AUDIO_OUT), (mp_obj_t)&pin_PA02 }, +STATIC const mp_rom_map_elem_t board_global_dict_table[] = { + { MP_OBJ_NEW_QSTR(MP_QSTR_SPEAKER), MP_ROM_PTR(&pin_PA02) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_AUDIO_OUT), MP_ROM_PTR(&pin_PA02) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA02) }, // analog out/in + { MP_OBJ_NEW_QSTR(MP_QSTR_SPEAKER_ENABLE), MP_ROM_PTR(&pin_PA27) }, - { MP_OBJ_NEW_QSTR(MP_QSTR_D13), (mp_obj_t)&pin_PA27 }, + // Light sensor + { MP_OBJ_NEW_QSTR(MP_QSTR_LIGHT), MP_ROM_PTR(&pin_PA07) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_PA07) }, + + // STEMMA connectors + { MP_OBJ_NEW_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_PA04) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_PA04) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_PA05) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_PA05) }, + + // Indicator LED + { MP_OBJ_NEW_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_PB23) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_L), MP_ROM_PTR(&pin_PB23) }, + + { MP_OBJ_NEW_QSTR(MP_QSTR_NEOPIXEL),MP_ROM_PTR(&pin_PB22) }, // LCD pins - { MP_OBJ_NEW_QSTR(MP_QSTR_TFT_RESET), (mp_obj_t)&pin_PA00 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_TFT_RD), (mp_obj_t)&pin_PB04 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_TFT_RS), (mp_obj_t)&pin_PB05 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_TFT_CS), (mp_obj_t)&pin_PB06 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_TFT_TE), (mp_obj_t)&pin_PB07 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_TFT_WR), (mp_obj_t)&pin_PB09 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_TFT_BACKLIGHT), (mp_obj_t)&pin_PB31 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_LCD_DATA0), (mp_obj_t)&pin_PA16 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_LCD_DATA1), (mp_obj_t)&pin_PA17 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_LCD_DATA2), (mp_obj_t)&pin_PA18 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_LCD_DATA3), (mp_obj_t)&pin_PA19 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_LCD_DATA4), (mp_obj_t)&pin_PA20 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_LCD_DATA5), (mp_obj_t)&pin_PA21 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_LCD_DATA6), (mp_obj_t)&pin_PA22 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_LCD_DATA7), (mp_obj_t)&pin_PA23 }, + { MP_OBJ_NEW_QSTR(MP_QSTR_TFT_RESET), MP_ROM_PTR(&pin_PA00) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_TFT_RD), MP_ROM_PTR(&pin_PB04) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_TFT_RS), MP_ROM_PTR(&pin_PB05) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_TFT_CS), MP_ROM_PTR(&pin_PB06) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_TFT_TE), MP_ROM_PTR(&pin_PB07) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_TFT_WR), MP_ROM_PTR(&pin_PB09) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_TFT_DC), MP_ROM_PTR(&pin_PB09) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_TFT_BACKLIGHT), MP_ROM_PTR(&pin_PB31) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_LCD_DATA0), MP_ROM_PTR(&pin_PA16) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_LCD_DATA1), MP_ROM_PTR(&pin_PA17) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_LCD_DATA2), MP_ROM_PTR(&pin_PA18) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_LCD_DATA3), MP_ROM_PTR(&pin_PA19) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_LCD_DATA4), MP_ROM_PTR(&pin_PA20) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_LCD_DATA5), MP_ROM_PTR(&pin_PA21) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_LCD_DATA6), MP_ROM_PTR(&pin_PA22) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_LCD_DATA7), MP_ROM_PTR(&pin_PA23) }, // Touch pins - { MP_OBJ_NEW_QSTR(MP_QSTR_TOUCH_YD), (mp_obj_t)&pin_PA04 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_TOUCH_XL), (mp_obj_t)&pin_PA05 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_TOUCH_YU), (mp_obj_t)&pin_PA06 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_TOUCH_XR), (mp_obj_t)&pin_PB08 }, + { MP_OBJ_NEW_QSTR(MP_QSTR_TOUCH_YD), MP_ROM_PTR(&pin_PB00) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_TOUCH_XL), MP_ROM_PTR(&pin_PB01) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_TOUCH_YU), MP_ROM_PTR(&pin_PA06) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_TOUCH_XR), MP_ROM_PTR(&pin_PB08) }, // ESP control - { MP_OBJ_NEW_QSTR(MP_QSTR_ESP_CS), (mp_obj_t)&pin_PA15 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_ESP_BUSY), (mp_obj_t)&pin_PB14 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_ESP_GPIO0), (mp_obj_t)&pin_PB15 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_ESP_RESET), (mp_obj_t)&pin_PB16 }, + { MP_OBJ_NEW_QSTR(MP_QSTR_ESP_CS), MP_ROM_PTR(&pin_PB14) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_ESP_GPIO0), MP_ROM_PTR(&pin_PB15) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_ESP_BUSY), MP_ROM_PTR(&pin_PB16) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_ESP_RESET), MP_ROM_PTR(&pin_PB17) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_ESP_RTS), MP_ROM_PTR(&pin_PA15) }, + // UART + { MP_OBJ_NEW_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_PB12) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_PB13) }, - // SD Card - { MP_OBJ_NEW_QSTR(MP_QSTR_SD_MOSI), (mp_obj_t)&pin_PA12 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_SD_SCK), (mp_obj_t)&pin_PA13 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_SD_CS), (mp_obj_t)&pin_PB30 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_SD_MISO), (mp_obj_t)&pin_PA14 }, - { MP_OBJ_NEW_QSTR(MP_QSTR_SD_CARD_DETECT), (mp_obj_t)&pin_PA01 }, + // SPI + { MP_OBJ_NEW_QSTR(MP_QSTR_MOSI),MP_ROM_PTR(&pin_PA12) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_SCK),MP_ROM_PTR(&pin_PA13) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_MISO),MP_ROM_PTR(&pin_PA14) }, - { MP_OBJ_NEW_QSTR(MP_QSTR_NEOPIXEL), (mp_obj_t)&pin_PB22 }, + // I2C + { MP_OBJ_NEW_QSTR(MP_QSTR_SDA),MP_ROM_PTR(&pin_PB02) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_SCL),MP_ROM_PTR(&pin_PB03) }, + + // SD Card + { MP_OBJ_NEW_QSTR(MP_QSTR_SD_CS),MP_ROM_PTR(&pin_PB30) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_SD_CARD_DETECT),MP_ROM_PTR(&pin_PA01) }, { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, + + { MP_ROM_QSTR(MP_QSTR_DISPLAY), MP_ROM_PTR(&displays[0].display) }, }; MP_DEFINE_CONST_DICT(board_module_globals, board_global_dict_table); diff --git a/ports/atmel-samd/boards/sam32/board.c b/ports/atmel-samd/boards/sam32/board.c new file mode 100644 index 000000000..7a23d3007 --- /dev/null +++ b/ports/atmel-samd/boards/sam32/board.c @@ -0,0 +1,52 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2017 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#include <string.h> + +#include "boards/board.h" +#include "py/mpconfig.h" + +#include "common-hal/digitalio/DigitalInOut.h" +#include "shared-bindings/digitalio/DigitalInOut.h" +#include "shared-bindings/neopixel_write/__init__.h" + +void board_init(void) { +} + +bool board_requests_safe_mode(void) { + return false; +} + +void reset_board(void) { + uint8_t zeroes[96]; + memset(zeroes, 0, 96); + digitalio_digitalinout_obj_t neopixel; + common_hal_digitalio_digitalinout_construct(&neopixel, &pin_PA15); + common_hal_digitalio_digitalinout_switch_to_output(&neopixel, false, DRIVE_MODE_PUSH_PULL); + common_hal_neopixel_write(&neopixel, zeroes, 96); + common_hal_digitalio_digitalinout_deinit(&neopixel); +}
\ No newline at end of file diff --git a/ports/atmel-samd/boards/sam32/mpconfigboard.h b/ports/atmel-samd/boards/sam32/mpconfigboard.h new file mode 100644 index 000000000..f6d3fb6b4 --- /dev/null +++ b/ports/atmel-samd/boards/sam32/mpconfigboard.h @@ -0,0 +1,33 @@ + +#define MICROPY_HW_BOARD_NAME "SAM32v2a" +#define MICROPY_HW_MCU_NAME "samd51j20" +#define CIRCUITPY_MCU_FAMILY samd51 + +#define MICROPY_HW_LED_STATUS (&pin_PA27) +#define MICROPY_HW_NEOPIXEL (&pin_PA15) + +#define MICROPY_PORT_A (PORT_PA24 | PORT_PA25) +#define MICROPY_PORT_B (0) +#define MICROPY_PORT_C (0) +#define MICROPY_PORT_D (0) + +#define AUTORESET_DELAY_MS 500 + +#define CIRCUITPY_INTERNAL_NVM_SIZE 0 + +#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - 0x010000) + +#define BOARD_HAS_CRYSTAL 1 + +#define DEFAULT_I2C_BUS_SCL (&pin_PA04) +#define DEFAULT_I2C_BUS_SDA (&pin_PA07) + +#define DEFAULT_SPI_BUS_SCK (&pin_PB13) +#define DEFAULT_SPI_BUS_MOSI (&pin_PB12) +#define DEFAULT_SPI_BUS_MISO (&pin_PB14) + +#define DEFAULT_UART_BUS_TX (&pin_PB16) +#define DEFAULT_UART_BUS_RX (&pin_PB17) + +#define IGNORE_PIN_PA24 1 +#define IGNORE_PIN_PA25 1 diff --git a/ports/atmel-samd/boards/sam32/mpconfigboard.mk b/ports/atmel-samd/boards/sam32/mpconfigboard.mk new file mode 100644 index 000000000..d76696b39 --- /dev/null +++ b/ports/atmel-samd/boards/sam32/mpconfigboard.mk @@ -0,0 +1,14 @@ +LD_FILE = boards/samd51x20-bootloader.ld +USB_VID = 0x04D8 +USB_PID = 0xEDBE +USB_PRODUCT = "SAM32" +USB_MANUFACTURER = "maholli" + +INTERNAL_FLASH_FILESYSTEM = 1 +LONGINT_IMPL = MPZ + +# No touch on SAMD51 yet +CIRCUITPY_TOUCHIO = 0 + +CHIP_VARIANT = SAMD51J20A +CHIP_FAMILY = samd51 diff --git a/ports/atmel-samd/boards/sam32/pins.c b/ports/atmel-samd/boards/sam32/pins.c new file mode 100644 index 000000000..b2e0a3f2b --- /dev/null +++ b/ports/atmel-samd/boards/sam32/pins.c @@ -0,0 +1,59 @@ +#include "shared-bindings/board/__init__.h" + +#include "supervisor/shared/board_busses.h" + +STATIC const mp_rom_map_elem_t board_global_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PB08) }, + { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_PB09) }, + { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_PA08) }, + { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_PA09) }, + { MP_ROM_QSTR(MP_QSTR_A6), MP_ROM_PTR(&pin_PB04) }, + { MP_ROM_QSTR(MP_QSTR_A7), MP_ROM_PTR(&pin_PB05) }, + { MP_ROM_QSTR(MP_QSTR_A8), MP_ROM_PTR(&pin_PB06) }, + { MP_ROM_QSTR(MP_QSTR_A9), MP_ROM_PTR(&pin_PB07) }, + + { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_PB13) }, + { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_PB12) }, + { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_PB14) }, + { MP_ROM_QSTR(MP_QSTR_xSDCS),MP_ROM_PTR(&pin_PB15) }, + + { MP_ROM_QSTR(MP_QSTR_DAC0), MP_ROM_PTR(&pin_PA02) }, + { MP_ROM_QSTR(MP_QSTR_DAC1), MP_ROM_PTR(&pin_PA05) }, + + { MP_ROM_QSTR(MP_QSTR_D19), MP_ROM_PTR(&pin_PA10) }, + { MP_ROM_QSTR(MP_QSTR_D20), MP_ROM_PTR(&pin_PA11) }, + { MP_ROM_QSTR(MP_QSTR_D29), MP_ROM_PTR(&pin_PA12) }, + { MP_ROM_QSTR(MP_QSTR_D30), MP_ROM_PTR(&pin_PA13) }, + { MP_ROM_QSTR(MP_QSTR_D31), MP_ROM_PTR(&pin_PA14) }, + { MP_ROM_QSTR(MP_QSTR_D35), MP_ROM_PTR(&pin_PA16) }, + { MP_ROM_QSTR(MP_QSTR_D36), MP_ROM_PTR(&pin_PA17) }, + { MP_ROM_QSTR(MP_QSTR_D37), MP_ROM_PTR(&pin_PA18) }, + { MP_ROM_QSTR(MP_QSTR_D38), MP_ROM_PTR(&pin_PA19) }, + { MP_ROM_QSTR(MP_QSTR_D41), MP_ROM_PTR(&pin_PA20) }, + { MP_ROM_QSTR(MP_QSTR_D42), MP_ROM_PTR(&pin_PA21) }, + { MP_ROM_QSTR(MP_QSTR_D43), MP_ROM_PTR(&pin_PA22) }, + { MP_ROM_QSTR(MP_QSTR_D44), MP_ROM_PTR(&pin_PA23) }, + { MP_ROM_QSTR(MP_QSTR_D49), MP_ROM_PTR(&pin_PB22) }, + { MP_ROM_QSTR(MP_QSTR_D50), MP_ROM_PTR(&pin_PB23) }, + { MP_ROM_QSTR(MP_QSTR_D59), MP_ROM_PTR(&pin_PB30) }, + { MP_ROM_QSTR(MP_QSTR_D60), MP_ROM_PTR(&pin_PB31) }, + { MP_ROM_QSTR(MP_QSTR_D64), MP_ROM_PTR(&pin_PB03) }, + + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_PB16) }, + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_PB17) }, + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_PA07) }, + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_PA04) }, + + { MP_ROM_QSTR(MP_QSTR_RTS), MP_ROM_PTR(&pin_PB11) }, + { MP_ROM_QSTR(MP_QSTR_DTR), MP_ROM_PTR(&pin_PB10) }, + + { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_PA27) }, + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_PA15) }, + + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_BATTERY), MP_ROM_PTR(&pin_PA06) }, + +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_global_dict_table);
\ No newline at end of file diff --git a/ports/atmel-samd/boards/samd21x18-bootloader.ld b/ports/atmel-samd/boards/samd21x18-bootloader.ld index 3eb97ee02..2ef09ba9a 100644 --- a/ports/atmel-samd/boards/samd21x18-bootloader.ld +++ b/ports/atmel-samd/boards/samd21x18-bootloader.ld @@ -5,8 +5,9 @@ /* Specify the memory areas */ MEMORY { - /* Leave 8KiB for the bootloader, and 64k for the flash file system. */ - FLASH (rx) : ORIGIN = 0x00000000 + 8K, LENGTH = 256K - 8K - 64K + /* Leave 8KiB for the bootloader, 64k for the flash file system, and 256b + for user config. */ + FLASH (rx) : ORIGIN = 0x00000000 + 8K, LENGTH = 256K - 8K - 64K - 256 RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K } diff --git a/ports/atmel-samd/boards/sparkfun_lumidrive/board.c b/ports/atmel-samd/boards/sparkfun_lumidrive/board.c new file mode 100755 index 000000000..c8e20206a --- /dev/null +++ b/ports/atmel-samd/boards/sparkfun_lumidrive/board.c @@ -0,0 +1,38 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2017 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "boards/board.h" + +void board_init(void) +{ +} + +bool board_requests_safe_mode(void) { + return false; +} + +void reset_board(void) { +} diff --git a/ports/atmel-samd/boards/sparkfun_lumidrive/mpconfigboard.h b/ports/atmel-samd/boards/sparkfun_lumidrive/mpconfigboard.h new file mode 100755 index 000000000..6b470af2e --- /dev/null +++ b/ports/atmel-samd/boards/sparkfun_lumidrive/mpconfigboard.h @@ -0,0 +1,39 @@ +#define MICROPY_HW_BOARD_NAME "SparkFun LUMIDrive" +#define MICROPY_HW_MCU_NAME "samd21g18" + +//#define MICROPY_HW_NEOPIXEL (&pin_PA06) + +// Clock rates are off: Salae reads 12MHz which is the limit even though we set it to the safer 8MHz. +#define SPI_FLASH_BAUDRATE (8000000) + +#define SPI_FLASH_MOSI_PIN &pin_PA08 +#define SPI_FLASH_MISO_PIN &pin_PA14 +#define SPI_FLASH_SCK_PIN &pin_PA09 +#define SPI_FLASH_CS_PIN &pin_PA13 + +#define MICROPY_PORT_A ( 0 ) +#define MICROPY_PORT_B ( 0 ) +#define MICROPY_PORT_C ( 0 ) + +#define CIRCUITPY_INTERNAL_NVM_SIZE 256 + +#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - CIRCUITPY_INTERNAL_NVM_SIZE) + +#define BOARD_HAS_CRYSTAL 1 + +//I2C +#define DEFAULT_I2C_BUS_SCL (&pin_PA23) +#define DEFAULT_I2C_BUS_SDA (&pin_PA22) + +//SPI +#define DEFAULT_SPI_BUS_SCK (&pin_PA19) +#define DEFAULT_SPI_BUS_MOSI (&pin_PA18) +#define DEFAULT_SPI_BUS_MISO (&pin_PA21) + +//UART +#define DEFAULT_UART_BUS_RX (&pin_PA11) +#define DEFAULT_UART_BUS_TX (&pin_PA10) + +// USB is always used internally so skip the pin objects for it. +#define IGNORE_PIN_PA24 1 +#define IGNORE_PIN_PA25 1 diff --git a/ports/atmel-samd/boards/sparkfun_lumidrive/mpconfigboard.mk b/ports/atmel-samd/boards/sparkfun_lumidrive/mpconfigboard.mk new file mode 100755 index 000000000..bd8fa17e9 --- /dev/null +++ b/ports/atmel-samd/boards/sparkfun_lumidrive/mpconfigboard.mk @@ -0,0 +1,17 @@ +LD_FILE = boards/samd21x18-bootloader-external-flash.ld +USB_VID = 0x1B4F +USB_PID = 0x0017 +USB_PRODUCT = "LUMIDrive Board" +USB_MANUFACTURER = "SparkFun Electronics" + +SPI_FLASH_FILESYSTEM = 1 +LONGINT_IMPL = MPZ + +CHIP_VARIANT = SAMD21G18A +CHIP_FAMILY = samd21 + +EXTERNAL_FLASH_DEVICE_COUNT = 1 +EXTERNAL_FLASH_DEVICES = "W25Q32FV" + +FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_DotStar + diff --git a/ports/atmel-samd/boards/sparkfun_lumidrive/pins.c b/ports/atmel-samd/boards/sparkfun_lumidrive/pins.c new file mode 100755 index 000000000..232c89e38 --- /dev/null +++ b/ports/atmel-samd/boards/sparkfun_lumidrive/pins.c @@ -0,0 +1,21 @@ +#include "shared-bindings/board/__init__.h" + +#include "supervisor/shared/board_busses.h" + +STATIC const mp_rom_map_elem_t board_global_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_PA04) }, + { MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_PA05) }, + { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_PA19) }, // + { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_PA18) }, // + { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_PA11) }, // + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_PA11) }, + { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_PA10) }, + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_PA10) }, + { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_PA20) }, // + { MP_ROM_QSTR(MP_QSTR_D8), MP_ROM_PTR(&pin_PA06) }, // + { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_PA07) }, + { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_PA18) }, + { MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_PA17) }, // + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_global_dict_table); diff --git a/ports/atmel-samd/boards/sparkfun_redboard_turbo/board.c b/ports/atmel-samd/boards/sparkfun_redboard_turbo/board.c new file mode 100755 index 000000000..c8e20206a --- /dev/null +++ b/ports/atmel-samd/boards/sparkfun_redboard_turbo/board.c @@ -0,0 +1,38 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2017 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "boards/board.h" + +void board_init(void) +{ +} + +bool board_requests_safe_mode(void) { + return false; +} + +void reset_board(void) { +} diff --git a/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.h b/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.h new file mode 100755 index 000000000..cf7c3998b --- /dev/null +++ b/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.h @@ -0,0 +1,47 @@ +#define MICROPY_HW_BOARD_NAME "SparkFun RedBoard Turbo" +#define MICROPY_HW_MCU_NAME "samd21g18" + + +#define MICROPY_HW_LED_TX &pin_PA27 +#define MICROPY_HW_LED_RX &pin_PA31 + +#define MICROPY_HW_NEOPIXEL (&pin_PA30) + +// Clock rates are off: Salae reads 12MHz which is the limit even though we set it to the safer 8MHz. +#define SPI_FLASH_BAUDRATE (8000000) + +#define SPI_FLASH_MOSI_PIN &pin_PB22 +#define SPI_FLASH_MISO_PIN &pin_PB03 +#define SPI_FLASH_SCK_PIN &pin_PB23 +#define SPI_FLASH_CS_PIN &pin_PA13 + +#define MICROPY_PORT_A ( 0 ) +#define MICROPY_PORT_B ( 0 ) +#define MICROPY_PORT_C ( 0 ) + + +// If you change this, then make sure to update the linker scripts as well to +// make sure you don't overwrite code. +#define CIRCUITPY_INTERNAL_NVM_SIZE 256 + +#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - CIRCUITPY_INTERNAL_NVM_SIZE) + +#define BOARD_HAS_CRYSTAL 1 + + +// I2C - also QWIIC +#define DEFAULT_I2C_BUS_SCL (&pin_PA23) +#define DEFAULT_I2C_BUS_SDA (&pin_PA22) + + +#define DEFAULT_SPI_BUS_SCK (&pin_PB11) +#define DEFAULT_SPI_BUS_MOSI (&pin_PB10) +#define DEFAULT_SPI_BUS_MISO (&pin_PA12) + + +#define DEFAULT_UART_BUS_RX (&pin_PA11) +#define DEFAULT_UART_BUS_TX (&pin_PA10) + +// USB is always used internally so skip the pin objects for it. +#define IGNORE_PIN_PA24 1 +#define IGNORE_PIN_PA25 1 diff --git a/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.mk b/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.mk new file mode 100755 index 000000000..63f61efe1 --- /dev/null +++ b/ports/atmel-samd/boards/sparkfun_redboard_turbo/mpconfigboard.mk @@ -0,0 +1,14 @@ +LD_FILE = boards/samd21x18-bootloader-external-flash.ld +USB_VID = 0x1B4F +USB_PID = 0x0015 +USB_PRODUCT = "RedBoard Turbo Board" +USB_MANUFACTURER = "SparkFun Electronics" + +SPI_FLASH_FILESYSTEM = 1 +LONGINT_IMPL = MPZ + +CHIP_VARIANT = SAMD21G18A +CHIP_FAMILY = samd21 + +EXTERNAL_FLASH_DEVICE_COUNT = 1 +EXTERNAL_FLASH_DEVICES = "W25Q32FV" diff --git a/ports/atmel-samd/boards/sparkfun_redboard_turbo/pins.c b/ports/atmel-samd/boards/sparkfun_redboard_turbo/pins.c new file mode 100755 index 000000000..223e20359 --- /dev/null +++ b/ports/atmel-samd/boards/sparkfun_redboard_turbo/pins.c @@ -0,0 +1,38 @@ +#include "shared-bindings/board/__init__.h" + +#include "supervisor/shared/board_busses.h" + +STATIC const mp_rom_map_elem_t board_global_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA02) }, + { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_PB08) }, + { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_PB09) }, + { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_PA04) }, + { MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_PA05) }, + { MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_PB02) }, + { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_PA11) }, + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_PA11) }, + { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_PA10) }, + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_PA10) }, + { MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_PA14) }, + { MP_ROM_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_PA09) }, + { MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_PA08) }, + { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_PA15) }, + { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_PA20) }, + { MP_ROM_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_PA21) }, + { MP_ROM_QSTR(MP_QSTR_D8), MP_ROM_PTR(&pin_PA06) }, + { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_PA07) }, + { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_PA18) }, + { MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_PA16) }, + { MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_PA19) }, + { MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_PA17) }, + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_PA22) }, + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_PA23) }, + { MP_ROM_QSTR(MP_QSTR_RGB_LED), MP_ROM_PTR(&pin_PA30) }, + { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_PB11) }, + { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_PB10) }, + { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_PA12) }, + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_global_dict_table); diff --git a/ports/atmel-samd/boards/sparkfun_samd21_dev/board.c b/ports/atmel-samd/boards/sparkfun_samd21_dev/board.c new file mode 100644 index 000000000..0f60736a2 --- /dev/null +++ b/ports/atmel-samd/boards/sparkfun_samd21_dev/board.c @@ -0,0 +1,39 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2017 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "boards/board.h" +#include "mpconfigboard.h" +#include "hal/include/hal_gpio.h" + +void board_init(void) { +} + +bool board_requests_safe_mode(void) { + return false; +} + +void reset_board(void) { +} diff --git a/ports/atmel-samd/boards/sparkfun_samd21_dev/mpconfigboard.h b/ports/atmel-samd/boards/sparkfun_samd21_dev/mpconfigboard.h new file mode 100644 index 000000000..a50c61cf2 --- /dev/null +++ b/ports/atmel-samd/boards/sparkfun_samd21_dev/mpconfigboard.h @@ -0,0 +1,24 @@ +#define MICROPY_HW_BOARD_NAME "SparkFun SAMD21 Dev Breakout" +#define MICROPY_HW_MCU_NAME "samd21g18" + +#define MICROPY_PORT_A (0) +#define MICROPY_PORT_B (0) +#define MICROPY_PORT_C (0) + +#define CIRCUITPY_INTERNAL_NVM_SIZE 256 + +#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE) + +#define DEFAULT_I2C_BUS_SCL (&pin_PA23) +#define DEFAULT_I2C_BUS_SDA (&pin_PA22) + +#define DEFAULT_SPI_BUS_SCK (&pin_PB11) +#define DEFAULT_SPI_BUS_MOSI (&pin_PB10) +#define DEFAULT_SPI_BUS_MISO (&pin_PA12) + +#define DEFAULT_UART_BUS_RX (&pin_PA11) +#define DEFAULT_UART_BUS_TX (&pin_PA10) + +// USB is always used internally so skip the pin objects for it. +#define IGNORE_PIN_PA24 1 +#define IGNORE_PIN_PA25 1 diff --git a/ports/atmel-samd/boards/sparkfun_samd21_dev/mpconfigboard.mk b/ports/atmel-samd/boards/sparkfun_samd21_dev/mpconfigboard.mk new file mode 100644 index 000000000..ec627b523 --- /dev/null +++ b/ports/atmel-samd/boards/sparkfun_samd21_dev/mpconfigboard.mk @@ -0,0 +1,14 @@ +LD_FILE = boards/samd21x18-bootloader.ld +USB_VID = 0x1B4F +USB_PID = 0x8D23 +USB_PRODUCT = "SparkFun SAMD21 Dev Breakout" +USB_MANUFACTURER = "SparkFun" + +INTERNAL_FLASH_FILESYSTEM = 1 +LONGINT_IMPL = NONE +CIRCUITPY_SMALL_BUILD = 1 + +CHIP_VARIANT = SAMD21G18A +CHIP_FAMILY = samd21 + +CIRCUITPY_FREQUENCYIO = 0 diff --git a/ports/atmel-samd/boards/sparkfun_samd21_dev/pins.c b/ports/atmel-samd/boards/sparkfun_samd21_dev/pins.c new file mode 100644 index 000000000..9eab132c3 --- /dev/null +++ b/ports/atmel-samd/boards/sparkfun_samd21_dev/pins.c @@ -0,0 +1,60 @@ +#include "shared-bindings/board/__init__.h" + +#include "supervisor/shared/board_busses.h" + +STATIC const mp_rom_map_elem_t board_global_dict_table[] = { + + // Analog pins + { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA02) }, + { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_PB08) }, + { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_PB09) }, + { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_PA04) }, + { MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_PA05) }, + { MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_PB02) }, + + // Digital pins + { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_PA11) }, + { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_PA10) }, + { MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_PA14) }, + { MP_ROM_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_PA09) }, + { MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_PA08) }, + { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_PA15) }, + { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_PA20) }, + { MP_ROM_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_PA21) }, + { MP_ROM_QSTR(MP_QSTR_D8), MP_ROM_PTR(&pin_PA06) }, + { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_PA07) }, + { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_PA18) }, + { MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_PA16) }, + { MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_PA19) }, + { MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_PA17) }, + { MP_ROM_QSTR(MP_QSTR_D30), MP_ROM_PTR(&pin_PB22) }, + { MP_ROM_QSTR(MP_QSTR_D31), MP_ROM_PTR(&pin_PB23) }, + { MP_ROM_QSTR(MP_QSTR_D38), MP_ROM_PTR(&pin_PA13) }, + + // UART pins + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_PA10) }, + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_PA11) }, + { MP_ROM_QSTR(MP_QSTR_TX1), MP_ROM_PTR(&pin_PB22) }, + { MP_ROM_QSTR(MP_QSTR_RX1), MP_ROM_PTR(&pin_PB23) }, + + // SPI pins + { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_PB10) }, + { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_PB11) }, + { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_PA12) }, + + // I2C pins + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_PA23) }, + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_PA22) }, + + // LED pins + { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_PA17) }, + { MP_ROM_QSTR(MP_QSTR_BLUE_LED), MP_ROM_PTR(&pin_PA17) }, + { MP_ROM_QSTR(MP_QSTR_GREEN_LED), MP_ROM_PTR(&pin_PA27) }, + { MP_ROM_QSTR(MP_QSTR_YELLOW_LED), MP_ROM_PTR(&pin_PB03) }, + + // Comm objects + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_global_dict_table); diff --git a/ports/atmel-samd/boards/sparkfun_samd21_mini/board.c b/ports/atmel-samd/boards/sparkfun_samd21_mini/board.c new file mode 100644 index 000000000..0f60736a2 --- /dev/null +++ b/ports/atmel-samd/boards/sparkfun_samd21_mini/board.c @@ -0,0 +1,39 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2017 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "boards/board.h" +#include "mpconfigboard.h" +#include "hal/include/hal_gpio.h" + +void board_init(void) { +} + +bool board_requests_safe_mode(void) { + return false; +} + +void reset_board(void) { +} diff --git a/ports/atmel-samd/boards/sparkfun_samd21_mini/mpconfigboard.h b/ports/atmel-samd/boards/sparkfun_samd21_mini/mpconfigboard.h new file mode 100644 index 000000000..6af7fa191 --- /dev/null +++ b/ports/atmel-samd/boards/sparkfun_samd21_mini/mpconfigboard.h @@ -0,0 +1,24 @@ +#define MICROPY_HW_BOARD_NAME "SparkFun SAMD21 Mini Breakout" +#define MICROPY_HW_MCU_NAME "samd21g18" + +#define MICROPY_PORT_A (0) +#define MICROPY_PORT_B (0) +#define MICROPY_PORT_C (0) + +#define CIRCUITPY_INTERNAL_NVM_SIZE 256 + +#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE) + +#define DEFAULT_I2C_BUS_SCL (&pin_PA23) +#define DEFAULT_I2C_BUS_SDA (&pin_PA22) + +#define DEFAULT_SPI_BUS_SCK (&pin_PA17) +#define DEFAULT_SPI_BUS_MOSI (&pin_PA16) +#define DEFAULT_SPI_BUS_MISO (&pin_PA19) + +#define DEFAULT_UART_BUS_RX (&pin_PA11) +#define DEFAULT_UART_BUS_TX (&pin_PA10) + +// USB is always used internally so skip the pin objects for it. +#define IGNORE_PIN_PA24 1 +#define IGNORE_PIN_PA25 1 diff --git a/ports/atmel-samd/boards/sparkfun_samd21_mini/mpconfigboard.mk b/ports/atmel-samd/boards/sparkfun_samd21_mini/mpconfigboard.mk new file mode 100644 index 000000000..8d2f35a69 --- /dev/null +++ b/ports/atmel-samd/boards/sparkfun_samd21_mini/mpconfigboard.mk @@ -0,0 +1,14 @@ +LD_FILE = boards/samd21x18-bootloader.ld +USB_VID = 0x1B4F +USB_PID = 0x8D22 +USB_PRODUCT = "SparkFun SAMD21 Mini Breakout" +USB_MANUFACTURER = "SparkFun" + +INTERNAL_FLASH_FILESYSTEM = 1 +LONGINT_IMPL = NONE +CIRCUITPY_SMALL_BUILD = 1 + +CHIP_VARIANT = SAMD21G18A +CHIP_FAMILY = samd21 + +CIRCUITPY_FREQUENCYIO = 0 diff --git a/ports/atmel-samd/boards/sparkfun_samd21_mini/pins.c b/ports/atmel-samd/boards/sparkfun_samd21_mini/pins.c new file mode 100644 index 000000000..42cd3736b --- /dev/null +++ b/ports/atmel-samd/boards/sparkfun_samd21_mini/pins.c @@ -0,0 +1,53 @@ +#include "shared-bindings/board/__init__.h" + +#include "supervisor/shared/board_busses.h" + +STATIC const mp_rom_map_elem_t board_global_dict_table[] = { + + // Analog pins + { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PA02) }, + { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_PB08) }, + { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_PB09) }, + { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_PA04) }, + + // Digital pins + { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_PA11) }, + { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_PA10) }, + { MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_PA14) }, + { MP_ROM_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_PA09) }, + { MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_PA08) }, + { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_PA15) }, + { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_PA20) }, + { MP_ROM_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_PA21) }, + { MP_ROM_QSTR(MP_QSTR_D8), MP_ROM_PTR(&pin_PA06) }, + { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_PA07) }, + { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_PA18) }, + { MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_PA16) }, + { MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_PA19) }, + { MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_PA17) }, + + // UART pins + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_PA10) }, + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_PA11) }, + + // SPI pins + { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_PA16) }, + { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_PA17) }, + { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_PA19) }, + + // I2C pins + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_PA23) }, + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_PA22) }, + + // LED pins + { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_PA17) }, + { MP_ROM_QSTR(MP_QSTR_BLUE_LED), MP_ROM_PTR(&pin_PA17) }, + { MP_ROM_QSTR(MP_QSTR_GREEN_LED), MP_ROM_PTR(&pin_PA27) }, + { MP_ROM_QSTR(MP_QSTR_YELLOW_LED), MP_ROM_PTR(&pin_PB03) }, + + // Comm objects + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_global_dict_table); diff --git a/ports/atmel-samd/boards/trellis_m4_express/mpconfigboard.mk b/ports/atmel-samd/boards/trellis_m4_express/mpconfigboard.mk index 7094b79be..93b07bc76 100644 --- a/ports/atmel-samd/boards/trellis_m4_express/mpconfigboard.mk +++ b/ports/atmel-samd/boards/trellis_m4_express/mpconfigboard.mk @@ -5,9 +5,14 @@ USB_PRODUCT = "Trellis M4 Express" USB_MANUFACTURER = "Adafruit Industries LLC" QSPI_FLASH_FILESYSTEM = 1 -EXTERNAL_FLASH_DEVICE_COUNT = 1 -EXTERNAL_FLASH_DEVICES = GD25Q64C +EXTERNAL_FLASH_DEVICE_COUNT = 2 +EXTERNAL_FLASH_DEVICES = "W25Q64JV_IQ, GD25Q64C" LONGINT_IMPL = MPZ +# No I2S on SAMD51G +CIRCUITPY_AUDIOBUSIO = 0 +# No touch on SAMD51 yet +CIRCUITPY_TOUCHIO = 0 + CHIP_VARIANT = SAMD51G19A CHIP_FAMILY = samd51 diff --git a/ports/atmel-samd/boards/trellis_m4_express/pins.c b/ports/atmel-samd/boards/trellis_m4_express/pins.c index 9626f525f..a9f204318 100644 --- a/ports/atmel-samd/boards/trellis_m4_express/pins.c +++ b/ports/atmel-samd/boards/trellis_m4_express/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" // This mapping only includes functional names because pins broken // out on connectors are labeled with their MCU name available from diff --git a/ports/atmel-samd/boards/trinket_m0/mpconfigboard.h b/ports/atmel-samd/boards/trinket_m0/mpconfigboard.h index cef35983e..dd8bc03cc 100644 --- a/ports/atmel-samd/boards/trinket_m0/mpconfigboard.h +++ b/ports/atmel-samd/boards/trinket_m0/mpconfigboard.h @@ -11,9 +11,9 @@ #define MICROPY_PORT_B (0) #define MICROPY_PORT_C (0) -#define CIRCUITPY_INTERNAL_NVM_SIZE 0 +#define CIRCUITPY_INTERNAL_NVM_SIZE 256 -#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000) +#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000 - CIRCUITPY_INTERNAL_NVM_SIZE) #define IGNORE_PIN_PA03 1 #define IGNORE_PIN_PA04 1 diff --git a/ports/atmel-samd/boards/trinket_m0/mpconfigboard.mk b/ports/atmel-samd/boards/trinket_m0/mpconfigboard.mk index c9c45152b..b3448cf49 100644 --- a/ports/atmel-samd/boards/trinket_m0/mpconfigboard.mk +++ b/ports/atmel-samd/boards/trinket_m0/mpconfigboard.mk @@ -6,6 +6,9 @@ USB_MANUFACTURER = "Adafruit Industries LLC" INTERNAL_FLASH_FILESYSTEM = 1 LONGINT_IMPL = NONE +CIRCUITPY_SMALL_BUILD = 1 CHIP_VARIANT = SAMD21E18A CHIP_FAMILY = samd21 + +CIRCUITPY_FREQUENCYIO = 0 diff --git a/ports/atmel-samd/boards/trinket_m0/pins.c b/ports/atmel-samd/boards/trinket_m0/pins.c index 633017024..b3637bd5b 100644 --- a/ports/atmel-samd/boards/trinket_m0/pins.c +++ b/ports/atmel-samd/boards/trinket_m0/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" STATIC const mp_rom_map_elem_t board_global_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_PA08) }, diff --git a/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.mk b/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.mk index c9c196da7..5975ad1ba 100644 --- a/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.mk +++ b/ports/atmel-samd/boards/trinket_m0_haxpress/mpconfigboard.mk @@ -11,3 +11,5 @@ LONGINT_IMPL = MPZ CHIP_VARIANT = SAMD21E18A CHIP_FAMILY = samd21 + +CIRCUITPY_FREQUENCYIO = 0 diff --git a/ports/atmel-samd/boards/trinket_m0_haxpress/pins.c b/ports/atmel-samd/boards/trinket_m0_haxpress/pins.c index 633017024..b3637bd5b 100644 --- a/ports/atmel-samd/boards/trinket_m0_haxpress/pins.c +++ b/ports/atmel-samd/boards/trinket_m0_haxpress/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" STATIC const mp_rom_map_elem_t board_global_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_PA08) }, diff --git a/ports/atmel-samd/boards/uchip/board.c b/ports/atmel-samd/boards/uchip/board.c new file mode 100644 index 000000000..0f60736a2 --- /dev/null +++ b/ports/atmel-samd/boards/uchip/board.c @@ -0,0 +1,39 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2017 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "boards/board.h" +#include "mpconfigboard.h" +#include "hal/include/hal_gpio.h" + +void board_init(void) { +} + +bool board_requests_safe_mode(void) { + return false; +} + +void reset_board(void) { +} diff --git a/ports/atmel-samd/boards/uchip/mpconfigboard.h b/ports/atmel-samd/boards/uchip/mpconfigboard.h new file mode 100644 index 000000000..ce4b5d070 --- /dev/null +++ b/ports/atmel-samd/boards/uchip/mpconfigboard.h @@ -0,0 +1,55 @@ +#define MICROPY_HW_BOARD_NAME "uChip" +#define MICROPY_HW_MCU_NAME "samd21e18" + +#define MICROPY_HW_LED_STATUS (&pin_PA07) + +#define MICROPY_PORT_A (PORT_PA00 | PORT_PA01 | PORT_PA14 | PORT_PA15 | PORT_PA28 | PORT_PA27 | PORT_PA24 | PORT_PA25) +#define MICROPY_PORT_B (0) +#define MICROPY_PORT_C (0) + +#define CIRCUITPY_INTERNAL_NVM_SIZE 0 + +#define BOARD_FLASH_SIZE (0x00040000 - 0x2000 - 0x010000) + + +// USB is always used internally so skip the pin objects for it. +#define IGNORE_PIN_PA24 1 +#define IGNORE_PIN_PA25 1 + +#define IGNORE_PIN_PA27 1 +#define IGNORE_PIN_PA28 1 +#define IGNORE_PIN_PA30 1 +#define IGNORE_PIN_PA31 1 + +#define IGNORE_PIN_PB01 1 +#define IGNORE_PIN_PB02 1 +#define IGNORE_PIN_PB03 1 +#define IGNORE_PIN_PB04 1 +#define IGNORE_PIN_PB05 1 +#define IGNORE_PIN_PB06 1 +#define IGNORE_PIN_PB07 1 +#define IGNORE_PIN_PB08 1 +#define IGNORE_PIN_PB09 1 +#define IGNORE_PIN_PB10 1 +#define IGNORE_PIN_PB11 1 +#define IGNORE_PIN_PB12 1 +#define IGNORE_PIN_PB13 1 +#define IGNORE_PIN_PB14 1 +#define IGNORE_PIN_PB15 1 +#define IGNORE_PIN_PB16 1 +#define IGNORE_PIN_PB17 1 +#define IGNORE_PIN_PB22 1 +#define IGNORE_PIN_PB23 1 +#define IGNORE_PIN_PB30 1 +#define IGNORE_PIN_PB31 1 +#define IGNORE_PIN_PB00 1 + +#define DEFAULT_I2C_BUS_SCL (&pin_PA23) +#define DEFAULT_I2C_BUS_SDA (&pin_PA22) + +#define DEFAULT_SPI_BUS_SCK (&pin_PA16) +#define DEFAULT_SPI_BUS_MOSI (&pin_PA17) +#define DEFAULT_SPI_BUS_MISO (&pin_PA19) + +#define DEFAULT_UART_BUS_RX (&pin_PA11) +#define DEFAULT_UART_BUS_TX (&pin_PA10) diff --git a/ports/atmel-samd/boards/uchip/mpconfigboard.mk b/ports/atmel-samd/boards/uchip/mpconfigboard.mk new file mode 100644 index 000000000..53b8c2771 --- /dev/null +++ b/ports/atmel-samd/boards/uchip/mpconfigboard.mk @@ -0,0 +1,14 @@ +LD_FILE = boards/samd21x18-bootloader.ld +USB_VID = 0x04D8 +USB_PID = 0xED7D +USB_PRODUCT = "uChip CircuitPython" +USB_MANUFACTURER = "Itaca Innovation" + +INTERNAL_FLASH_FILESYSTEM = 1 +LONGINT_IMPL = NONE +CIRCUITPY_SMALL_BUILD = 1 + +CHIP_VARIANT = SAMD21E18A +CHIP_FAMILY = samd21 + +CIRCUITPY_FREQUENCYIO = 0 diff --git a/ports/atmel-samd/boards/uchip/pins.c b/ports/atmel-samd/boards/uchip/pins.c new file mode 100644 index 000000000..7476c60ad --- /dev/null +++ b/ports/atmel-samd/boards/uchip/pins.c @@ -0,0 +1,38 @@ +#include "shared-bindings/board/__init__.h" + +#include "supervisor/shared/board_busses.h" + +STATIC const mp_rom_map_elem_t board_global_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_PA06) }, + { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_PA08) }, + { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_PA10) }, + { MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_PA09) }, + { MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_PA11) }, + { MP_ROM_QSTR(MP_QSTR_A6), MP_ROM_PTR(&pin_PA05) }, + { MP_ROM_QSTR(MP_QSTR_A7), MP_ROM_PTR(&pin_PA02) }, + { MP_ROM_QSTR(MP_QSTR_A8), MP_ROM_PTR(&pin_PA04) }, + { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_PA06) }, + { MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_PA08) }, + { MP_ROM_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_PA10) }, + { MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_PA09) }, + { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_PA11) }, + { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_PA17) }, + { MP_ROM_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_PA18) }, + { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_PA19) }, + { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_PA22) }, + { MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_PA23) }, + { MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_PA05) }, + { MP_ROM_QSTR(MP_QSTR_D14), MP_ROM_PTR(&pin_PA02) }, + { MP_ROM_QSTR(MP_QSTR_D15), MP_ROM_PTR(&pin_PA04) }, + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_PA11) }, + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_PA10) }, + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_PA22) }, + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_PA23) }, + { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_PA16) }, + { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_PA17) }, + { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_PA19) }, + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_global_dict_table); diff --git a/ports/atmel-samd/boards/ugame10/mpconfigboard.h b/ports/atmel-samd/boards/ugame10/mpconfigboard.h index c22a3f735..caa05bc1a 100644 --- a/ports/atmel-samd/boards/ugame10/mpconfigboard.h +++ b/ports/atmel-samd/boards/ugame10/mpconfigboard.h @@ -24,6 +24,29 @@ { MP_OBJ_NEW_QSTR(MP_QSTR_gamepad),(mp_obj_t)&gamepad_module }, \ { MP_OBJ_NEW_QSTR(MP_QSTR__stage), (mp_obj_t)&stage_module } +#define IGNORE_PIN_PB00 1 +#define IGNORE_PIN_PB01 1 +#define IGNORE_PIN_PB02 1 +#define IGNORE_PIN_PB03 1 +#define IGNORE_PIN_PB04 1 +#define IGNORE_PIN_PB05 1 +#define IGNORE_PIN_PB06 1 +#define IGNORE_PIN_PB07 1 +#define IGNORE_PIN_PB08 1 +#define IGNORE_PIN_PB09 1 +#define IGNORE_PIN_PB10 1 +#define IGNORE_PIN_PB11 1 +#define IGNORE_PIN_PB12 1 +#define IGNORE_PIN_PB13 1 +#define IGNORE_PIN_PB14 1 +#define IGNORE_PIN_PB15 1 +#define IGNORE_PIN_PB16 1 +#define IGNORE_PIN_PB17 1 +#define IGNORE_PIN_PB22 1 +#define IGNORE_PIN_PB23 1 +#define IGNORE_PIN_PB30 1 +#define IGNORE_PIN_PB31 1 + // USB is always used internally so skip the pin objects for it. #define IGNORE_PIN_PA24 1 #define IGNORE_PIN_PA25 1 diff --git a/ports/atmel-samd/boards/ugame10/mpconfigboard.mk b/ports/atmel-samd/boards/ugame10/mpconfigboard.mk index 6dc0af9cf..0a727c8b1 100644 --- a/ports/atmel-samd/boards/ugame10/mpconfigboard.mk +++ b/ports/atmel-samd/boards/ugame10/mpconfigboard.mk @@ -1,5 +1,4 @@ LD_FILE = boards/samd21x18-bootloader-external-flash-crystalless.ld -#LD_FILE = boards/samd21x18-bootloader.ld USB_VID = 0x239A USB_PID = 0x801F USB_PRODUCT = "uGame10" @@ -13,5 +12,18 @@ LONGINT_IMPL = MPZ CHIP_VARIANT = SAMD21E18A CHIP_FAMILY = samd21 +CIRCUITPY_STAGE = 1 +CIRCUITPY_MATH = 1 +CIRCUITPY_AUDIOIO = 1 +CIRCUITPY_ANALOGIO = 1 +CIRCUITPY_GAMEPAD = 1 +CIRCUITPY_TOUCHIO = 0 +CIRCUITPY_NEOPIXEL_WRITE = 0 +CIRCUITPY_RTC = 0 +CIRCUITPY_SAMD = 0 +CIRCUITPY_USB_MIDI = 0 +CIRCUITPY_USB_HID = 0 +CIRCUITPY_FREQUENCYIO = 0 +CIRCUITPY_SMALL_BUILD = 1 -FROZEN_MPY_DIRS += $(TOP)/frozen/ugame10 +FROZEN_MPY_DIRS += $(TOP)/frozen/circuitpython-stage diff --git a/ports/atmel-samd/boards/ugame10/pins.c b/ports/atmel-samd/boards/ugame10/pins.c index 87ace5e96..71db52752 100644 --- a/ports/atmel-samd/boards/ugame10/pins.c +++ b/ports/atmel-samd/boards/ugame10/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" STATIC const mp_rom_map_elem_t board_global_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_X), MP_ROM_PTR(&pin_PA00) }, diff --git a/ports/atmel-samd/common-hal/analogio/AnalogOut.c b/ports/atmel-samd/common-hal/analogio/AnalogOut.c index 19475e00b..9ac1f7bd1 100644 --- a/ports/atmel-samd/common-hal/analogio/AnalogOut.c +++ b/ports/atmel-samd/common-hal/analogio/AnalogOut.c @@ -31,6 +31,7 @@ #include "py/runtime.h" #include "shared-bindings/analogio/AnalogOut.h" +#include "shared-bindings/audioio/AudioOut.h" #include "shared-bindings/microcontroller/Pin.h" #include "supervisor/shared/translate.h" @@ -138,5 +139,17 @@ void common_hal_analogio_analogout_set_value(analogio_analogout_obj_t *self, } void analogout_reset(void) { - // AudioOut resets the DAC in case its been used for audio which requires special handling. + // audioout_reset also resets the DAC, and does a smooth ramp down to avoid clicks + // if it was enabled, so do that instead if AudioOut is enabled. +#if CIRCUITPY_AUDIOIO + audioout_reset(); +#else + #ifdef SAMD21 + while (DAC->STATUS.reg & DAC_STATUS_SYNCBUSY) {} + #endif + #ifdef SAMD51 + while (DAC->SYNCBUSY.reg & DAC_SYNCBUSY_SWRST) {} + #endif + DAC->CTRLA.reg |= DAC_CTRLA_SWRST; +#endif } diff --git a/ports/atmel-samd/common-hal/audioio/AudioOut.c b/ports/atmel-samd/common-hal/audioio/AudioOut.c index 596f3214a..a75abd324 100644 --- a/ports/atmel-samd/common-hal/audioio/AudioOut.c +++ b/ports/atmel-samd/common-hal/audioio/AudioOut.c @@ -47,6 +47,7 @@ #endif #include "audio_dma.h" +#include "timer_handler.h" #include "samd/dma.h" #include "samd/events.h" @@ -251,6 +252,7 @@ void common_hal_audioio_audioout_construct(audioio_audioout_obj_t* self, tc_gclk = 1; #endif + set_timer_handler(true, tc_index, TC_HANDLER_NO_INTERRUPT); turn_on_clocks(true, tc_index, tc_gclk); // Don't bother setting the period. We set it before you playback anything. diff --git a/ports/atmel-samd/common-hal/busio/I2C.c b/ports/atmel-samd/common-hal/busio/I2C.c index dac15bcc1..a0c04d65d 100644 --- a/ports/atmel-samd/common-hal/busio/I2C.c +++ b/ports/atmel-samd/common-hal/busio/I2C.c @@ -67,10 +67,6 @@ Sercom *samd_i2c_get_sercom(const mcu_pin_obj_t* scl, const mcu_pin_obj_t* sda, void common_hal_busio_i2c_construct(busio_i2c_obj_t *self, const mcu_pin_obj_t* scl, const mcu_pin_obj_t* sda, uint32_t frequency, uint32_t timeout) { - #ifdef PIRKEY_M0 - mp_raise_NotImplementedError(translate("Not enough pins available")); - return; - #endif uint8_t sercom_index; uint32_t sda_pinmux, scl_pinmux; Sercom* sercom = samd_i2c_get_sercom(scl, sda, &sercom_index, &sda_pinmux, &scl_pinmux); diff --git a/ports/atmel-samd/common-hal/busio/SPI.c b/ports/atmel-samd/common-hal/busio/SPI.c index 4de34c975..ca58e3fd5 100644 --- a/ports/atmel-samd/common-hal/busio/SPI.c +++ b/ports/atmel-samd/common-hal/busio/SPI.c @@ -54,6 +54,17 @@ void never_reset_sercom(Sercom* sercom) { } } +void allow_reset_sercom(Sercom* sercom) { + // Reset all SERCOMs except the ones being used by on-board devices. + Sercom *sercom_instances[SERCOM_INST_NUM] = SERCOM_INSTS; + for (int i = 0; i < SERCOM_INST_NUM; i++) { + if (sercom_instances[i] == sercom) { + never_reset_sercoms[i] = false; + break; + } + } +} + void reset_sercoms(void) { // Reset all SERCOMs except the ones being used by on-board devices. Sercom *sercom_instances[SERCOM_INST_NUM] = SERCOM_INSTS; @@ -66,12 +77,6 @@ void reset_sercoms(void) { continue; } #endif - #ifdef CIRCUITPY_DISPLAYIO - // TODO(tannewt): Make this dynamic. - if (sercom_instances[i] == board_display_obj.bus.spi_desc.dev.prvt) { - continue; - } - #endif // SWRST is same for all modes of SERCOMs. sercom_instances[i]->SPI.CTRLA.bit.SWRST = 1; } @@ -84,14 +89,16 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self, Sercom* sercom = NULL; uint8_t sercom_index; uint32_t clock_pinmux = 0; - bool mosi_none = mosi == mp_const_none; - bool miso_none = miso == mp_const_none; + bool mosi_none = mosi == mp_const_none || mosi == NULL; + bool miso_none = miso == mp_const_none || miso == NULL; uint32_t mosi_pinmux = 0; uint32_t miso_pinmux = 0; uint8_t clock_pad = 0; uint8_t mosi_pad = 0; uint8_t miso_pad = 0; uint8_t dopo = 255; + + // Special case for SAMR boards. #ifdef PIN_PC19 if (miso == &pin_PC19) { if (mosi == &pin_PB30 && clock == &pin_PC18) { @@ -241,6 +248,8 @@ void common_hal_busio_spi_deinit(busio_spi_obj_t *self) { if (common_hal_busio_spi_deinited(self)) { return; } + allow_reset_sercom(self->spi_desc.dev.prvt); + spi_m_sync_disable(&self->spi_desc); spi_m_sync_deinit(&self->spi_desc); reset_pin_number(self->clock_pin); diff --git a/ports/atmel-samd/common-hal/busio/UART.c b/ports/atmel-samd/common-hal/busio/UART.c index bb0666577..10618d1ce 100644 --- a/ports/atmel-samd/common-hal/busio/UART.c +++ b/ports/atmel-samd/common-hal/busio/UART.c @@ -164,24 +164,35 @@ void common_hal_busio_uart_construct(busio_uart_obj_t *self, // 0x1: TX pad 2; no RTS/CTS // 0x2: TX pad 0; RTS: pad 2, CTS: pad 3 (not used by us right now) // So divide by 2 to map pad to value. - hri_sercomusart_write_CTRLA_TXPO_bf(sercom, tx_pad / 2); // RXPO: // 0x0: RX pad 0 // 0x1: RX pad 1 // 0x2: RX pad 2 // 0x3: RX pad 3 - hri_sercomusart_write_CTRLA_RXPO_bf(sercom, rx_pad); + + // Doing a group mask and set of the registers saves 60 bytes over setting the bitfields individually. + + sercom->USART.CTRLA.reg &= ~(SERCOM_USART_CTRLA_TXPO_Msk | + SERCOM_USART_CTRLA_RXPO_Msk | + SERCOM_USART_CTRLA_FORM_Msk); + sercom->USART.CTRLA.reg |= SERCOM_USART_CTRLA_TXPO(tx_pad / 2) | + SERCOM_USART_CTRLA_RXPO(rx_pad) | + (parity == PARITY_NONE ? 0 : SERCOM_USART_CTRLA_FORM(1)); // Enable tx and/or rx based on whether the pins were specified. - hri_sercomusart_write_CTRLB_TXEN_bit(sercom, have_tx); - hri_sercomusart_write_CTRLB_RXEN_bit(sercom, have_rx); - - // Set parity, baud rate, stop bits, etc. 9-bit bytes not supported. - usart_async_set_parity(usart_desc_p, parity == PARITY_NONE ? USART_PARITY_NONE : - (parity == PARITY_ODD ? USART_PARITY_ODD : USART_PARITY_EVEN)); - usart_async_set_stopbits(usart_desc_p, stop == 1 ? USART_STOP_BITS_ONE : USART_STOP_BITS_TWO); - // This field is 0 for 8 bits, 5, 6, 7 for 5, 6, 7 bits. 1 for 9 bits, but we don't support that. - usart_async_set_character_size(usart_desc_p, bits % 8); + // CHSIZE is 0 for 8 bits, 5, 6, 7 for 5, 6, 7 bits. 1 for 9 bits, but we don't support that. + sercom->USART.CTRLB.reg &= ~(SERCOM_USART_CTRLB_TXEN | + SERCOM_USART_CTRLB_RXEN | + SERCOM_USART_CTRLB_PMODE | + SERCOM_USART_CTRLB_SBMODE | + SERCOM_USART_CTRLB_CHSIZE_Msk); + sercom->USART.CTRLB.reg |= (have_tx ? SERCOM_USART_CTRLB_TXEN : 0) | + (have_rx ? SERCOM_USART_CTRLB_RXEN : 0) | + (parity == PARITY_ODD ? SERCOM_USART_CTRLB_PMODE : 0) | + (stop > 1 ? SERCOM_USART_CTRLB_SBMODE : 0) | + SERCOM_USART_CTRLB_CHSIZE(bits % 8); + + // Set baud rate common_hal_busio_uart_set_baudrate(self, baudrate); // Turn on rx interrupt handling. The UART async driver has its own set of internal callbacks, diff --git a/ports/atmel-samd/common-hal/displayio/FourWire.c b/ports/atmel-samd/common-hal/displayio/FourWire.c deleted file mode 100644 index 6c3b75a85..000000000 --- a/ports/atmel-samd/common-hal/displayio/FourWire.c +++ /dev/null @@ -1,139 +0,0 @@ -/* - * This file is part of the MicroPython project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#include "shared-bindings/displayio/FourWire.h" - -#include <stdint.h> - -#include "shared-bindings/busio/SPI.h" -#include "shared-bindings/digitalio/DigitalInOut.h" - -#include "tick.h" - -void common_hal_displayio_fourwire_construct(displayio_fourwire_obj_t* self, - const mcu_pin_obj_t* clock, const mcu_pin_obj_t* data, const mcu_pin_obj_t* command, - const mcu_pin_obj_t* chip_select, const mcu_pin_obj_t* reset, uint16_t width, - uint16_t height, int16_t colstart, int16_t rowstart, uint16_t color_depth, - uint8_t set_column_command, uint8_t set_row_command, uint8_t write_ram_command) { - - common_hal_busio_spi_construct(&self->bus, clock, data, mp_const_none); - common_hal_digitalio_digitalinout_construct(&self->command, command); - common_hal_digitalio_digitalinout_switch_to_output(&self->command, true, DRIVE_MODE_PUSH_PULL); - common_hal_digitalio_digitalinout_construct(&self->chip_select, chip_select); - common_hal_digitalio_digitalinout_switch_to_output(&self->chip_select, true, DRIVE_MODE_PUSH_PULL); - - common_hal_digitalio_digitalinout_construct(&self->reset, reset); - common_hal_digitalio_digitalinout_switch_to_output(&self->reset, true, DRIVE_MODE_PUSH_PULL); - - self->width = width; - self->height = height; - self->color_depth = color_depth; - self->set_column_command = set_column_command; - self->set_row_command = set_row_command; - self->write_ram_command = write_ram_command; - self->current_group = NULL; - self->colstart = colstart; - self->rowstart = rowstart; -} - -bool common_hal_displayio_fourwire_begin_transaction(displayio_fourwire_obj_t* self) { - if (!common_hal_busio_spi_try_lock(&self->bus)) { - return false; - } - // TODO(tannewt): Stop hardcoding SPI frequency, polarity and phase. - common_hal_busio_spi_configure(&self->bus, 12000000, 0, 0, 8); - common_hal_digitalio_digitalinout_set_value(&self->chip_select, false); - return true; -} - -void common_hal_displayio_fourwire_send(displayio_fourwire_obj_t* self, bool command, uint8_t *data, uint32_t data_length) { - common_hal_digitalio_digitalinout_set_value(&self->command, !command); - common_hal_busio_spi_write(&self->bus, data, data_length); -} - -void common_hal_displayio_fourwire_end_transaction(displayio_fourwire_obj_t* self) { - common_hal_digitalio_digitalinout_set_value(&self->chip_select, true); - common_hal_busio_spi_unlock(&self->bus); -} - -void common_hal_displayio_fourwire_show(displayio_fourwire_obj_t* self, displayio_group_t* root_group) { - self->current_group = root_group; - common_hal_displayio_fourwire_refresh_soon(self); -} - -void common_hal_displayio_fourwire_refresh_soon(displayio_fourwire_obj_t* self) { - self->refresh = true; -} - -int32_t common_hal_displayio_fourwire_wait_for_frame(displayio_fourwire_obj_t* self) { - uint64_t last_refresh = self->last_refresh; - while (last_refresh == self->last_refresh) { - MICROPY_VM_HOOK_LOOP - } - return 0; -} - -void displayio_fourwire_start_region_update(displayio_fourwire_obj_t* self, uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { - // TODO(tannewt): Handle displays with single byte bounds. - common_hal_displayio_fourwire_begin_transaction(self); - uint16_t data[2]; - common_hal_displayio_fourwire_send(self, true, &self->set_column_command, 1); - data[0] = __builtin_bswap16(x0 + self->colstart); - data[1] = __builtin_bswap16(x1-1 + self->colstart); - common_hal_displayio_fourwire_send(self, false, (uint8_t*) data, 4); - common_hal_displayio_fourwire_send(self, true, &self->set_row_command, 1); - data[0] = __builtin_bswap16(y0 + 1 + self->rowstart); - data[1] = __builtin_bswap16(y1 + self->rowstart); - common_hal_displayio_fourwire_send(self, false, (uint8_t*) data, 4); - common_hal_displayio_fourwire_send(self, true, &self->write_ram_command, 1); -} - -bool displayio_fourwire_send_pixels(displayio_fourwire_obj_t* self, uint32_t* pixels, uint32_t length) { - // TODO: Set this up so its async and 32 bit DMA transfers. - common_hal_displayio_fourwire_send(self, false, (uint8_t*) pixels, length*4); - return true; -} - -void displayio_fourwire_finish_region_update(displayio_fourwire_obj_t* self) { - common_hal_displayio_fourwire_end_transaction(self); -} - -bool displayio_fourwire_frame_queued(displayio_fourwire_obj_t* self) { - // Refresh at ~30 fps. - return (ticks_ms - self->last_refresh) > 32; -} - -bool displayio_fourwire_refresh_queued(displayio_fourwire_obj_t* self) { - return self->refresh || (self->current_group != NULL && displayio_group_needs_refresh(self->current_group)); -} - -void displayio_fourwire_finish_refresh(displayio_fourwire_obj_t* self) { - if (self->current_group != NULL) { - displayio_group_finish_refresh(self->current_group); - } - self->refresh = false; - self->last_refresh = ticks_ms; -} diff --git a/ports/atmel-samd/common-hal/displayio/ParallelBus.c b/ports/atmel-samd/common-hal/displayio/ParallelBus.c new file mode 100644 index 000000000..7a5f61448 --- /dev/null +++ b/ports/atmel-samd/common-hal/displayio/ParallelBus.c @@ -0,0 +1,129 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "shared-bindings/displayio/ParallelBus.h" + +#include <stdint.h> + +#include "common-hal/microcontroller/Pin.h" +#include "py/runtime.h" +#include "shared-bindings/digitalio/DigitalInOut.h" + +#include "tick.h" + +void common_hal_displayio_parallelbus_construct(displayio_parallelbus_obj_t* self, + const mcu_pin_obj_t* data0, const mcu_pin_obj_t* command, const mcu_pin_obj_t* chip_select, + const mcu_pin_obj_t* write, const mcu_pin_obj_t* read, const mcu_pin_obj_t* reset) { + + uint8_t data_pin = data0->number; + if (data_pin % 8 != 0) { + mp_raise_ValueError(translate("Data 0 pin must be byte aligned")); + } + for (uint8_t i = 0; i < 8; i++) { + if (!pin_number_is_free(data_pin + i)) { + mp_raise_ValueError_varg(translate("Bus pin %d is already in use"), i); + } + } + PortGroup *const g = &PORT->Group[data0->number / 32]; + g->DIRSET.reg = 0xff << (data_pin % 32); + uint32_t wrconfig = PORT_WRCONFIG_WRPINCFG | PORT_WRCONFIG_DRVSTR; + if (data_pin % 32 > 15) { + wrconfig |= PORT_WRCONFIG_HWSEL | (0xff << ((data_pin % 32) - 16)); + } else { + wrconfig |= 0xff << (data_pin % 32); + } + g->WRCONFIG.reg = wrconfig; + self->bus = ((uint8_t*) &g->OUT.reg) + (data0->number % 32 / 8); + + self->command.base.type = &digitalio_digitalinout_type; + common_hal_digitalio_digitalinout_construct(&self->command, command); + common_hal_digitalio_digitalinout_switch_to_output(&self->command, true, DRIVE_MODE_PUSH_PULL); + + self->chip_select.base.type = &digitalio_digitalinout_type; + common_hal_digitalio_digitalinout_construct(&self->chip_select, chip_select); + common_hal_digitalio_digitalinout_switch_to_output(&self->chip_select, true, DRIVE_MODE_PUSH_PULL); + + self->reset.base.type = &digitalio_digitalinout_type; + common_hal_digitalio_digitalinout_construct(&self->reset, reset); + common_hal_digitalio_digitalinout_switch_to_output(&self->reset, true, DRIVE_MODE_PUSH_PULL); + + self->write.base.type = &digitalio_digitalinout_type; + common_hal_digitalio_digitalinout_construct(&self->write, write); + common_hal_digitalio_digitalinout_switch_to_output(&self->write, true, DRIVE_MODE_PUSH_PULL); + + self->read.base.type = &digitalio_digitalinout_type; + common_hal_digitalio_digitalinout_construct(&self->read, read); + common_hal_digitalio_digitalinout_switch_to_output(&self->read, true, DRIVE_MODE_PUSH_PULL); + + self->data0_pin = data_pin; + self->write_group = &PORT->Group[write->number / 32]; + self->write_mask = 1 << (write->number % 32); + + never_reset_pin_number(command->number); + never_reset_pin_number(chip_select->number); + never_reset_pin_number(write->number); + never_reset_pin_number(read->number); + never_reset_pin_number(reset->number); + for (uint8_t i = 0; i < 8; i++) { + never_reset_pin_number(data_pin + i); + } +} + +void common_hal_displayio_parallelbus_deinit(displayio_parallelbus_obj_t* self) { + for (uint8_t i = 0; i < 8; i++) { + reset_pin_number(self->data0_pin + i); + } + + reset_pin_number(self->command.pin->number); + reset_pin_number(self->chip_select.pin->number); + reset_pin_number(self->write.pin->number); + reset_pin_number(self->read.pin->number); + reset_pin_number(self->reset.pin->number); +} + +bool common_hal_displayio_parallelbus_begin_transaction(mp_obj_t obj) { + displayio_parallelbus_obj_t* self = MP_OBJ_TO_PTR(obj); + common_hal_digitalio_digitalinout_set_value(&self->chip_select, false); + return true; +} + +void common_hal_displayio_parallelbus_send(mp_obj_t obj, bool command, uint8_t *data, uint32_t data_length) { + displayio_parallelbus_obj_t* self = MP_OBJ_TO_PTR(obj); + common_hal_digitalio_digitalinout_set_value(&self->command, !command); + uint32_t* clear_write = (uint32_t*) &self->write_group->OUTCLR.reg; + uint32_t* set_write = (uint32_t*) &self->write_group->OUTSET.reg; + uint32_t mask = self->write_mask; + for (uint32_t i = 0; i < data_length; i++) { + *clear_write = mask; + *self->bus = data[i]; + *set_write = mask; + } +} + +void common_hal_displayio_parallelbus_end_transaction(mp_obj_t obj) { + displayio_parallelbus_obj_t* self = MP_OBJ_TO_PTR(obj); + common_hal_digitalio_digitalinout_set_value(&self->chip_select, true); +} diff --git a/ports/atmel-samd/common-hal/displayio/ParallelBus.h b/ports/atmel-samd/common-hal/displayio/ParallelBus.h new file mode 100644 index 000000000..630bec351 --- /dev/null +++ b/ports/atmel-samd/common-hal/displayio/ParallelBus.h @@ -0,0 +1,45 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_DISPLAYIO_PARALLELBUS_H +#define MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_DISPLAYIO_PARALLELBUS_H + +#include "common-hal/digitalio/DigitalInOut.h" + +typedef struct { + mp_obj_base_t base; + uint8_t* bus; + digitalio_digitalinout_obj_t command; + digitalio_digitalinout_obj_t chip_select; + digitalio_digitalinout_obj_t reset; + digitalio_digitalinout_obj_t write; + digitalio_digitalinout_obj_t read; + uint8_t data0_pin; + PortGroup* write_group; + uint32_t write_mask; +} displayio_parallelbus_obj_t; + +#endif // MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_DISPLAYIO_PARALLELBUS_H diff --git a/ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c b/ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c new file mode 100644 index 000000000..fa5d08a3f --- /dev/null +++ b/ports/atmel-samd/common-hal/frequencyio/FrequencyIn.c @@ -0,0 +1,547 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Michael Schroeder + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include <stdint.h> + +#include "hal/include/hal_gpio.h" +#include "atmel_start_pins.h" +#include "supervisor/shared/translate.h" + +#include "mpconfigport.h" +#include "py/runtime.h" +#include "timer_handler.h" +#include "background.h" + +#include "samd/clocks.h" +#include "samd/timers.h" +#include "samd/events.h" +#include "samd/pins.h" +#include "samd/external_interrupts.h" + +#include "shared-bindings/frequencyio/FrequencyIn.h" +#include "peripheral_clk_config.h" +#include "hpl_gclk_config.h" + +#include "tick.h" + +#ifdef SAMD21 +#include "hpl/gclk/hpl_gclk_base.h" +#endif + +static frequencyio_frequencyin_obj_t *active_frequencyins[TC_INST_NUM]; +volatile uint8_t reference_tc = 0xff; +#ifdef SAMD51 +static uint8_t dpll_gclk; +#endif + +void frequencyin_emergency_cancel_capture(uint8_t index) { + frequencyio_frequencyin_obj_t* self = active_frequencyins[index]; + + NVIC_DisableIRQ(self->TC_IRQ); + NVIC_ClearPendingIRQ(self->TC_IRQ); + #ifdef SAMD21 + NVIC_DisableIRQ(EIC_IRQn); + NVIC_ClearPendingIRQ(EIC_IRQn); + #endif + #ifdef SAMD51 + NVIC_DisableIRQ(EIC_0_IRQn + self->channel); + NVIC_ClearPendingIRQ(EIC_0_IRQn + self->channel); + #endif + + common_hal_frequencyio_frequencyin_pause(self); // pause any further captures + + NVIC_EnableIRQ(self->TC_IRQ); + #ifdef SAMD21 + NVIC_EnableIRQ(EIC_IRQn); + #endif + #ifdef SAMD51 + NVIC_EnableIRQ(EIC_0_IRQn + self->channel); + #endif + mp_raise_RuntimeError(translate("Frequency captured is above capability. Capture Paused.")); +} + +void frequencyin_interrupt_handler(uint8_t index) { + Tc* ref_tc = tc_insts[reference_tc]; + + if (!ref_tc->COUNT16.INTFLAG.bit.OVF) return; // false trigger + + uint32_t current_us; + uint64_t current_ms; + current_tick(¤t_ms, ¤t_us); + + for (uint8_t i = 0; i <= (TC_INST_NUM - 1); i++) { + if (active_frequencyins[i] != NULL) { + frequencyio_frequencyin_obj_t* self = active_frequencyins[i]; + Tc* tc = tc_insts[self->tc_index]; + + uint32_t mask = 1 << self->channel; + if ((EIC->INTFLAG.reg & mask) == mask) { + // Make sure capture_period has elapsed before we + // record a new event count. + if (current_ms - self->last_ms >= self->capture_period) { + float new_factor = self->last_us + (1000 - current_us); + self->factor = (current_ms - self->last_ms) + (new_factor / 1000); + self->last_ms = current_ms; + self->last_us = current_us; + + #ifdef SAMD51 + tc->COUNT16.CTRLBSET.bit.CMD = TC_CTRLBSET_CMD_READSYNC_Val; + while ((tc->COUNT16.SYNCBUSY.bit.COUNT == 1) || + (tc->COUNT16.CTRLBSET.bit.CMD == TC_CTRLBSET_CMD_READSYNC_Val)) { + } + #endif + + uint16_t new_freq = tc->COUNT16.COUNT.reg; + if ((tc->COUNT16.INTFLAG.reg & TC_INTFLAG_OVF) == 1) { + new_freq += 65535; + tc->COUNT16.INTFLAG.reg |= TC_INTFLAG_OVF; + } + self->frequency = new_freq; + + #ifdef SAMD51 + tc->COUNT16.CTRLBSET.bit.CMD = TC_CTRLBSET_CMD_RETRIGGER_Val; + while ((tc->COUNT16.SYNCBUSY.bit.COUNT == 1) || + (tc->COUNT16.CTRLBSET.bit.CMD == TC_CTRLBSET_CMD_RETRIGGER_Val)) { + } + #endif + } + EIC->INTFLAG.reg |= mask; + } + + // Check if we've reached the upper limit of detection + if (!background_tasks_ok() || self->errored_too_fast) { + self->errored_too_fast = true; + frequencyin_emergency_cancel_capture(i); + } + } + } + ref_tc->COUNT16.INTFLAG.reg |= TC_INTFLAG_OVF; +} + +void frequencyin_reference_tc_init() { + if (reference_tc == 0xff) { + return; + } + #ifdef SAMD21 + set_timer_handler(true, reference_tc, TC_HANDLER_FREQUENCYIN); + turn_on_clocks(true, reference_tc, 0); + #endif + // use the DPLL we setup so that the reference_tc and freqin_tc(s) + // are using the same clock frequency. + #ifdef SAMD51 + if (dpll_gclk == 0xff) { + frequencyin_samd51_start_dpll(); + } + set_timer_handler(true, reference_tc, TC_HANDLER_FREQUENCYIN); + turn_on_clocks(true, reference_tc, dpll_gclk); + #endif + + Tc *tc = tc_insts[reference_tc]; + tc_set_enable(tc, false); + tc_reset(tc); + + #ifdef SAMD21 + tc->COUNT16.CTRLA.reg = TC_CTRLA_MODE_COUNT16 | TC_CTRLA_PRESCALER_DIV1; + tc->COUNT16.INTENSET.bit.OVF = 1; + NVIC_EnableIRQ(TC3_IRQn + reference_tc); + #endif + #ifdef SAMD51 + tc->COUNT16.CTRLA.reg = TC_CTRLA_MODE_COUNT16 | + TC_CTRLA_PRESCALER_DIV1; + tc->COUNT16.INTENSET.bit.OVF = 1; + NVIC_EnableIRQ(TC0_IRQn + reference_tc); + #endif +} + +bool frequencyin_reference_tc_enabled() { + if (reference_tc == 0xff) { + return false; + } + Tc *tc = tc_insts[reference_tc]; + return tc->COUNT16.CTRLA.bit.ENABLE; +} + +void frequencyin_reference_tc_enable(bool enable) { + if (reference_tc == 0xff) { + return; + } + Tc *tc = tc_insts[reference_tc]; + tc_set_enable(tc, enable); +} + +#ifdef SAMD51 +void frequencyin_samd51_start_dpll() { + if (clock_get_enabled(0, GCLK_SOURCE_DPLL1)) { + return; + } + + uint8_t free_gclk = find_free_gclk(1); + if (free_gclk == 0xff) { + dpll_gclk = 0xff; + return; + } + + GCLK->PCHCTRL[OSCCTRL_GCLK_ID_FDPLL1].reg = GCLK_PCHCTRL_CHEN | GCLK_PCHCTRL_GEN(free_gclk); + // TC4-7 can only have a max of 100MHz source + // DPLL1 frequency equation with [X]OSC32K as source: 98.304MHz = 32768(2999 + 1 + 0/32) + // Will also enable the Lock Bypass due to low-frequency sources causing DPLL unlocks + // as outlined in the Errata (1.12.1) + OSCCTRL->Dpll[1].DPLLRATIO.reg = OSCCTRL_DPLLRATIO_LDRFRAC(0) | OSCCTRL_DPLLRATIO_LDR(2999); + if (board_has_crystal()) { // we can use XOSC32K directly as the source + OSC32KCTRL->XOSC32K.bit.EN32K = 1; + OSCCTRL->Dpll[1].DPLLCTRLB.reg = OSCCTRL_DPLLCTRLB_REFCLK(1) | + OSCCTRL_DPLLCTRLB_LBYPASS; + } else { + // can't use OSCULP32K directly; need to setup a GCLK as a reference, + // which must be done in samd/clocks.c to avoid waiting for sync + return; + //OSC32KCTRL->OSCULP32K.bit.EN32K = 1; + //OSCCTRL->Dpll[1].DPLLCTRLB.reg = OSCCTRL_DPLLCTRLB_REFCLK(0); + } + OSCCTRL->Dpll[1].DPLLCTRLA.reg = OSCCTRL_DPLLCTRLA_ENABLE; + + while (!(OSCCTRL->Dpll[1].DPLLSTATUS.bit.LOCK || OSCCTRL->Dpll[1].DPLLSTATUS.bit.CLKRDY)) {} + enable_clock_generator(free_gclk, GCLK_GENCTRL_SRC_DPLL1_Val, 1); + dpll_gclk = free_gclk; +} + +void frequencyin_samd51_stop_dpll() { + if (!clock_get_enabled(0, GCLK_SOURCE_DPLL1)) { + return; + } + + disable_clock_generator(dpll_gclk); + + GCLK->PCHCTRL[OSCCTRL_GCLK_ID_FDPLL1].reg = 0; + OSCCTRL->Dpll[1].DPLLCTRLA.reg = 0; + OSCCTRL->Dpll[1].DPLLRATIO.reg = 0; + OSCCTRL->Dpll[1].DPLLCTRLB.reg = 0; + + while (OSCCTRL->Dpll[1].DPLLSYNCBUSY.bit.ENABLE) { + } + dpll_gclk = 0xff; +} +#endif + +void common_hal_frequencyio_frequencyin_construct(frequencyio_frequencyin_obj_t* self, const mcu_pin_obj_t* pin, const uint16_t capture_period) { + + if (!pin->has_extint) { + mp_raise_RuntimeError(translate("No hardware support on pin")); + } + if ((capture_period == 0) || (capture_period > 500)) { + mp_raise_ValueError(translate("Invalid capture period. Valid range: 1 - 500")); + } + uint32_t mask = 1 << pin->extint_channel; + if (eic_get_enable() == 1 && + #ifdef SAMD21 + ((EIC->INTENSET.vec.EXTINT & mask) != 0 || (EIC->EVCTRL.vec.EXTINTEO & mask) != 0)) { + #endif + #ifdef SAMD51 + ((EIC->INTENSET.bit.EXTINT & mask) != 0 || (EIC->EVCTRL.bit.EXTINTEO & mask) != 0)) { + #endif + mp_raise_RuntimeError(translate("EXTINT channel already in use")); + } + + uint8_t timer_index = find_free_timer(); + if (timer_index == 0xff) { + mp_raise_RuntimeError(translate("All timers in use")); + } + Tc *tc = tc_insts[timer_index]; + + self->tc_index = timer_index; + self->pin = pin->number; + self->channel = pin->extint_channel; + self->errored_too_fast = false; + self->last_ms = 0; + self->last_us = 1000; + self->capture_period = capture_period; + #ifdef SAMD21 + self->TC_IRQ = TC3_IRQn + timer_index; + #endif + #ifdef SAMD51 + self->TC_IRQ = TC0_IRQn + timer_index; + #endif + + active_frequencyins[timer_index] = self; + + // SAMD21: We use GCLK0 generated from DFLL running at 48mhz + // SAMD51: We use a GCLK generated from DPLL1 running at <100mhz + #ifdef SAMD21 + set_timer_handler(timer_index, 0, TC_HANDLER_NO_INTERRUPT); + turn_on_clocks(true, timer_index, 0); + #endif + #ifdef SAMD51 + frequencyin_samd51_start_dpll(); + if (dpll_gclk == 0xff && !clock_get_enabled(0, GCLK_SOURCE_DPLL1)) { + common_hal_frequencyio_frequencyin_deinit(self); + mp_raise_RuntimeError(translate("No available clocks")); + } + set_timer_handler(timer_index, dpll_gclk, TC_HANDLER_NO_INTERRUPT); + turn_on_clocks(true, timer_index, dpll_gclk); + #endif + + // Ensure EIC is on + if (eic_get_enable() == 0) { + turn_on_external_interrupt_controller(); // enables EIC, so disable it after + } + eic_set_enable(false); + + uint8_t sense_setting = EIC_CONFIG_SENSE0_HIGH_Val; + uint8_t config_index = self->channel / 8; + uint8_t position = (self->channel % 8) * 4; + uint32_t masked_value = EIC->CONFIG[config_index].reg & ~(0xf << position); + EIC->CONFIG[config_index].reg = masked_value | (sense_setting << position); + + #ifdef SAMD21 + masked_value = EIC->EVCTRL.vec.EXTINTEO; + EIC->EVCTRL.vec.EXTINTEO = masked_value | (1 << self->channel); + #endif + #ifdef SAMD51 + masked_value = EIC->EVCTRL.bit.EXTINTEO; + EIC->EVCTRL.bit.EXTINTEO = masked_value | (1 << self->channel); + EIC->ASYNCH.bit.ASYNCH = 1; + #endif + + turn_on_cpu_interrupt(self->channel); + + eic_set_enable(true); + + // Turn on EVSYS + turn_on_event_system(); + uint8_t evsys_channel = find_async_event_channel(); + #ifdef SAMD21 + connect_event_user_to_channel((EVSYS_ID_USER_TC3_EVU + timer_index), evsys_channel); + #endif + #ifdef SAMD51 + connect_event_user_to_channel((EVSYS_ID_USER_TC0_EVU + timer_index), evsys_channel); + #endif + init_async_event_channel(evsys_channel, (EVSYS_ID_GEN_EIC_EXTINT_0 + self->channel)); + self->event_channel = evsys_channel; + + tc_set_enable(tc, false); + tc_reset(tc); + #ifdef SAMD21 + tc->COUNT16.CTRLA.reg = TC_CTRLA_MODE_COUNT16 | + TC_CTRLA_PRESCALER_DIV1; + tc->COUNT16.EVCTRL.bit.TCEI = 1; + tc->COUNT16.EVCTRL.bit.EVACT = TC_EVCTRL_EVACT_COUNT_Val; + #endif + + #ifdef SAMD51 + tc->COUNT16.EVCTRL.reg = TC_EVCTRL_EVACT(TC_EVCTRL_EVACT_COUNT_Val) | TC_EVCTRL_TCEI; + tc->COUNT16.CTRLA.reg = TC_CTRLA_MODE_COUNT16 | + TC_CTRLA_PRESCALER_DIV1; + #endif + + NVIC_EnableIRQ(self->TC_IRQ); + + gpio_set_pin_function(pin->number, GPIO_PIN_FUNCTION_A); + + tc_set_enable(tc, true); + + // setup reference TC if not already + if (reference_tc == 0xff) { + reference_tc = find_free_timer(); + if (reference_tc == 0xff) { + common_hal_frequencyio_frequencyin_deinit(self); + mp_raise_RuntimeError(translate("All timers in use")); + } + frequencyin_reference_tc_init(); + } + if (!frequencyin_reference_tc_enabled()) { + frequencyin_reference_tc_enable(true); + } +} + +bool common_hal_frequencyio_frequencyin_deinited(frequencyio_frequencyin_obj_t* self) { + return self->pin == NO_PIN; +} + +void common_hal_frequencyio_frequencyin_deinit(frequencyio_frequencyin_obj_t* self) { + if (common_hal_frequencyio_frequencyin_deinited(self)) { + return; + } + reset_pin_number(self->pin); + + // turn off EIC & EVSYS utilized by this TC + disable_event_channel(self->event_channel); + eic_set_enable(false); + #ifdef SAMD21 + disable_event_user(EVSYS_ID_USER_TC3_EVU + self->tc_index); + uint32_t masked_value = EIC->EVCTRL.vec.EXTINTEO; + EIC->EVCTRL.vec.EXTINTEO = masked_value ^ (1 << self->channel); + #endif + #ifdef SAMD51 + disable_event_user(EVSYS_ID_USER_TC0_EVU + self->tc_index); + uint32_t masked_value = EIC->EVCTRL.bit.EXTINTEO; + EIC->EVCTRL.bit.EXTINTEO = masked_value ^ (1 << self->channel); + NVIC_DisableIRQ(EIC_0_IRQn + self->channel); + NVIC_ClearPendingIRQ(EIC_0_IRQn + self->channel); + #endif + eic_set_enable(true); + // check if any other objects are using the EIC; if not, turn it off + if (EIC->EVCTRL.reg == 0 && EIC->INTENSET.reg == 0) { + eic_reset(); + turn_off_external_interrupt_controller(); + } + + // turn off the TC we were using + Tc *tc = tc_insts[self->tc_index]; + tc_set_enable(tc, false); + tc_reset(tc); + NVIC_DisableIRQ(self->TC_IRQ); + NVIC_ClearPendingIRQ(self->TC_IRQ); + + active_frequencyins[self->tc_index] = NULL; + self->tc_index = 0xff; + self->pin = NO_PIN; + + bool check_active = false; + for (uint8_t i = 0; i <= (TC_INST_NUM - 1); i++) { + if (active_frequencyins[i] != NULL) { + check_active = true; + } + } + if (!check_active) { + frequencyin_reference_tc_enable(false); + reference_tc = 0xff; + #ifdef SAMD51 + frequencyin_samd51_stop_dpll(); + #endif + } +} + +uint32_t common_hal_frequencyio_frequencyin_get_item(frequencyio_frequencyin_obj_t* self) { + NVIC_DisableIRQ(self->TC_IRQ); + #ifdef SAMD21 + NVIC_DisableIRQ(EIC_IRQn); + #endif + #ifdef SAMD51 + NVIC_DisableIRQ(EIC_0_IRQn + self->channel); + #endif + + // adjust for actual capture period vs base `capture_period` + float frequency_adjustment = 0.0; + if (self->factor > self->capture_period) { + float time_each_event = self->factor / self->frequency; // get the time for each event during actual period + float capture_diff = self->factor - self->capture_period; // get the difference of actual and base periods + // we only need to adjust if the capture_diff can contain 1 or more events + // if so, we add how many events could have occured during the diff time + if (time_each_event > capture_diff) { + frequency_adjustment = capture_diff / time_each_event; + } + } + + float value = 1000 / (self->capture_period / (self->frequency + frequency_adjustment)); + + NVIC_ClearPendingIRQ(self->TC_IRQ); + NVIC_EnableIRQ(self->TC_IRQ); + #ifdef SAMD21 + NVIC_ClearPendingIRQ(EIC_IRQn); + NVIC_EnableIRQ(EIC_IRQn); + #endif + #ifdef SAMD51 + NVIC_ClearPendingIRQ(EIC_0_IRQn + self->channel); + NVIC_EnableIRQ(EIC_0_IRQn + self->channel); + #endif + + return value; +} + +void common_hal_frequencyio_frequencyin_pause(frequencyio_frequencyin_obj_t* self) { + Tc *tc = tc_insts[self->tc_index]; + if (!tc->COUNT16.EVCTRL.bit.TCEI) { + return; + } + tc->COUNT16.EVCTRL.bit.TCEI = 0; + + #ifdef SAMD21 + uint32_t masked_value = EIC->EVCTRL.vec.EXTINTEO; + EIC->EVCTRL.vec.EXTINTEO = masked_value ^ (1 << self->channel); + #endif + #ifdef SAMD51 + uint32_t masked_value = EIC->EVCTRL.bit.EXTINTEO; + EIC->EVCTRL.bit.EXTINTEO = masked_value ^ (1 << self->channel); + #endif + return; +} + +void common_hal_frequencyio_frequencyin_resume(frequencyio_frequencyin_obj_t* self) { + Tc *tc = tc_insts[self->tc_index]; + if (tc->COUNT16.EVCTRL.bit.TCEI) { + return; + } + tc->COUNT16.EVCTRL.bit.TCEI = 1; + + #ifdef SAMD21 + uint32_t masked_value = EIC->EVCTRL.vec.EXTINTEO; + EIC->EVCTRL.vec.EXTINTEO = masked_value | (1 << self->channel); + #endif + #ifdef SAMD51 + uint32_t masked_value = EIC->EVCTRL.bit.EXTINTEO; + EIC->EVCTRL.bit.EXTINTEO = masked_value | (1 << self->channel); + #endif + self->errored_too_fast = false; + return; +} + +void common_hal_frequencyio_frequencyin_clear(frequencyio_frequencyin_obj_t* self) { + NVIC_DisableIRQ(self->TC_IRQ); + #ifdef SAMD21 + NVIC_DisableIRQ(EIC_IRQn); + #endif + #ifdef SAMD51 + NVIC_DisableIRQ(EIC_0_IRQn + self->channel); + #endif + + self->frequency = 0; + + NVIC_ClearPendingIRQ(self->TC_IRQ); + NVIC_EnableIRQ(self->TC_IRQ); + #ifdef SAMD21 + NVIC_ClearPendingIRQ(EIC_IRQn); + NVIC_EnableIRQ(EIC_IRQn); + #endif + #ifdef SAMD51 + NVIC_ClearPendingIRQ(EIC_0_IRQn + self->channel); + NVIC_EnableIRQ(EIC_0_IRQn + self->channel); + #endif + return; +} + +uint16_t common_hal_frequencyio_frequencyin_get_capture_period(frequencyio_frequencyin_obj_t *self) { + return self->capture_period; +} + +void common_hal_frequencyio_frequencyin_set_capture_period(frequencyio_frequencyin_obj_t *self, uint16_t capture_period) { + if ((capture_period == 0) || (capture_period > 500)) { + mp_raise_ValueError(translate("Invalid capture period. Valid range: 1 - 500")); + } + + self->capture_period = capture_period; + + common_hal_frequencyio_frequencyin_clear(self); +} diff --git a/ports/atmel-samd/common-hal/frequencyio/FrequencyIn.h b/ports/atmel-samd/common-hal/frequencyio/FrequencyIn.h new file mode 100644 index 000000000..abd63cc86 --- /dev/null +++ b/ports/atmel-samd/common-hal/frequencyio/FrequencyIn.h @@ -0,0 +1,60 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Michael Schroeder + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_FREQUENCYIO_FREQUENCYIN_H +#define MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_FREQUENCYIO_FREQUENCYIN_H + +#include "common-hal/microcontroller/Pin.h" + +#include "py/obj.h" + +typedef struct { + mp_obj_base_t base; + uint8_t tc_index; + uint8_t pin; + uint8_t channel; + uint8_t event_channel; + uint32_t frequency; + volatile uint64_t last_ms; + volatile uint32_t last_us; + float factor; + uint32_t capture_period; + uint8_t TC_IRQ; + volatile bool errored_too_fast; +} frequencyio_frequencyin_obj_t; + +void frequencyin_interrupt_handler(uint8_t index); +void frequencyin_emergency_cancel_capture(uint8_t index); +void frequencyin_reference_tc_init(void); +void frequencyin_reference_tc_enable(bool enable); +bool frequencyin_reference_tc_enabled(void); +#ifdef SAMD51 +void frequencyin_samd51_start_dpll(void); +void frequencyin_samd51_stop_dpll(void); +#endif + + +#endif // MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_FREQUENCYIO_FREQUENCYIN_H diff --git a/ports/atmel-samd/common-hal/frequencyio/__init__.c b/ports/atmel-samd/common-hal/frequencyio/__init__.c new file mode 100644 index 000000000..487814bd0 --- /dev/null +++ b/ports/atmel-samd/common-hal/frequencyio/__init__.c @@ -0,0 +1 @@ +// No ferquencyio module functions. diff --git a/ports/atmel-samd/common-hal/microcontroller/Pin.c b/ports/atmel-samd/common-hal/microcontroller/Pin.c index 7dd9c6b09..6f3cbc759 100644 --- a/ports/atmel-samd/common-hal/microcontroller/Pin.c +++ b/ports/atmel-samd/common-hal/microcontroller/Pin.c @@ -45,13 +45,25 @@ bool speaker_enable_in_use; #define PORT_COUNT (PORT_BITS / 32 + 1) +#ifdef SAMD51 +#define SWD_MUX GPIO_PIN_FUNCTION_H +#endif +#ifdef SAMD21 +#define SWD_MUX GPIO_PIN_FUNCTION_G +#endif + STATIC uint32_t never_reset_pins[PORT_COUNT]; void reset_all_pins(void) { uint32_t pin_mask[PORT_COUNT] = PORT_OUT_IMPLEMENTED; - // Do not full reset USB or SWD lines. - pin_mask[0] &= ~(PORT_PA24 | PORT_PA25 | PORT_PA30 | PORT_PA31); + // Do not full reset USB lines. + pin_mask[0] &= ~(PORT_PA24 | PORT_PA25); + + // Do not reset SWD when a debugger is present. + if (DSU->STATUSB.bit.DBGPRES == 1) { + pin_mask[0] &= ~(PORT_PA30 | PORT_PA31); + } for (uint32_t i = 0; i < PORT_COUNT; i++) { pin_mask[i] &= ~never_reset_pins[i]; @@ -66,16 +78,14 @@ void reset_all_pins(void) { gpio_set_port_direction(GPIO_PORTD, pin_mask[3] & ~MICROPY_PORT_D, GPIO_DIRECTION_OFF); #endif - // Configure SWD + // Configure SWD. SWDIO will be automatically switched on PA31 when a signal is input on + // SWCLK. #ifdef SAMD51 gpio_set_pin_function(PIN_PA30, MUX_PA30H_CM4_SWCLK); - // SWDIO will be automatically switched on PA31 when a signal is input on - // SWCLK. #endif #ifdef SAMD21 - //gpio_set_pin_function(PIN_PA30, GPIO_PIN_FUNCTION_G); - //gpio_set_pin_direction(PIN_PA31, GPIO_DIRECTION_OUT); - //gpio_set_pin_function(PIN_PA31, GPIO_PIN_FUNCTION_G); + gpio_set_pin_function(PIN_PA30, GPIO_PIN_FUNCTION_G); + gpio_set_pin_function(PIN_PA31, GPIO_PIN_FUNCTION_G); #endif #ifdef MICROPY_HW_NEOPIXEL @@ -100,6 +110,8 @@ void never_reset_pin_number(uint8_t pin_number) { } void reset_pin_number(uint8_t pin_number) { + never_reset_pins[GPIO_PORT(pin_number)] &= ~(1 << GPIO_PIN(pin_number)); + if (pin_number >= PORT_BITS) { return; } @@ -126,12 +138,11 @@ void reset_pin_number(uint8_t pin_number) { if (pin_number == PIN_PA30 #ifdef SAMD51 ) { - gpio_set_pin_function(pin_number, GPIO_PIN_FUNCTION_H); #endif #ifdef SAMD21 || pin_number == PIN_PA31) { - gpio_set_pin_function(pin_number, GPIO_PIN_FUNCTION_G); #endif + gpio_set_pin_function(pin_number, SWD_MUX); } else { gpio_set_pin_direction(pin_number, GPIO_DIRECTION_OFF); gpio_set_pin_function(pin_number, GPIO_PIN_FUNCTION_OFF); @@ -169,9 +180,38 @@ void claim_pin(const mcu_pin_obj_t* pin) { #endif } +bool pin_number_is_free(uint8_t pin_number) { + PortGroup *const port = &PORT->Group[(enum gpio_port)GPIO_PORT(pin_number)]; + uint8_t pin_index = GPIO_PIN(pin_number); + volatile PORT_PINCFG_Type *state = &port->PINCFG[pin_index]; + volatile PORT_PMUX_Type *pmux = &port->PMUX[pin_index / 2]; + + if (pin_number == PIN_PA30 || pin_number == PIN_PA31) { + if (DSU->STATUSB.bit.DBGPRES == 1) { + return false; + } + if (pin_number == PIN_PA30 + #ifdef SAMD51 + ) { + #endif + #ifdef SAMD21 + || pin_number == PIN_PA31) { + #endif) { + return state->bit.PMUXEN == 1 && ((pmux->reg >> (4 * pin_index % 2)) & 0xf) == SWD_MUX; + } + } + + return state->bit.PMUXEN == 0 && state->bit.INEN == 0 && + state->bit.PULLEN == 0 && (port->DIR.reg & (1 << pin_index)) == 0; +} + bool common_hal_mcu_pin_is_free(const mcu_pin_obj_t* pin) { #ifdef MICROPY_HW_NEOPIXEL if (pin == MICROPY_HW_NEOPIXEL) { + // Special case for Metro M0 where the NeoPixel is also SWCLK + if (MICROPY_HW_NEOPIXEL == &pin_PA30 && DSU->STATUSB.bit.DBGPRES == 1) { + return false; + } return !neopixel_in_use; } #endif @@ -190,15 +230,5 @@ bool common_hal_mcu_pin_is_free(const mcu_pin_obj_t* pin) { } #endif - PortGroup *const port = &PORT->Group[(enum gpio_port)GPIO_PORT(pin->number)]; - uint8_t pin_index = GPIO_PIN(pin->number); - volatile PORT_PINCFG_Type *state = &port->PINCFG[pin_index]; - volatile PORT_PMUX_Type *pmux = &port->PMUX[pin_index / 2]; - - if (pin->number == PIN_PA30 || pin->number == PIN_PA31) { - return state->bit.PMUXEN == 1 && ((pmux->reg >> (4 * pin_index % 2)) & 0xf) == 0x6; - } - - return state->bit.PMUXEN == 0 && state->bit.INEN == 0 && - state->bit.PULLEN == 0 && (port->DIR.reg & (1 << pin_index)) == 0; + return pin_number_is_free(pin->number); } diff --git a/ports/atmel-samd/common-hal/microcontroller/Pin.h b/ports/atmel-samd/common-hal/microcontroller/Pin.h index f798ea300..14887207a 100644 --- a/ports/atmel-samd/common-hal/microcontroller/Pin.h +++ b/ports/atmel-samd/common-hal/microcontroller/Pin.h @@ -45,5 +45,6 @@ void reset_all_pins(void); void reset_pin_number(uint8_t pin_number); void never_reset_pin_number(uint8_t pin_number); void claim_pin(const mcu_pin_obj_t* pin); +bool pin_number_is_free(uint8_t pin_number); #endif // MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_MICROCONTROLLER_PIN_H diff --git a/ports/atmel-samd/common-hal/microcontroller/__init__.c b/ports/atmel-samd/common-hal/microcontroller/__init__.c index 0ca3a0835..d1d0eae8d 100644 --- a/ports/atmel-samd/common-hal/microcontroller/__init__.c +++ b/ports/atmel-samd/common-hal/microcontroller/__init__.c @@ -252,6 +252,18 @@ STATIC const mp_rom_map_elem_t mcu_pin_global_dict_table[] = { #if defined(PIN_PB17) && !defined(IGNORE_PIN_PB17) { MP_ROM_QSTR(MP_QSTR_PB17), MP_ROM_PTR(&pin_PB17) }, #endif +#if defined(PIN_PB18) && !defined(IGNORE_PIN_PB18) + { MP_ROM_QSTR(MP_QSTR_PB18), MP_ROM_PTR(&pin_PB18) }, +#endif +#if defined(PIN_PB19) && !defined(IGNORE_PIN_PB19) + { MP_ROM_QSTR(MP_QSTR_PB19), MP_ROM_PTR(&pin_PB19) }, +#endif +#if defined(PIN_PB20) && !defined(IGNORE_PIN_PB20) + { MP_ROM_QSTR(MP_QSTR_PB20), MP_ROM_PTR(&pin_PB20) }, +#endif +#if defined(PIN_PB21) && !defined(IGNORE_PIN_PB21) + { MP_ROM_QSTR(MP_QSTR_PB21), MP_ROM_PTR(&pin_PB21) }, +#endif #if defined(PIN_PB22) && !defined(IGNORE_PIN_PB22) { MP_ROM_QSTR(MP_QSTR_PB22), MP_ROM_PTR(&pin_PB22) }, #endif diff --git a/ports/atmel-samd/common-hal/pulseio/PWMOut.c b/ports/atmel-samd/common-hal/pulseio/PWMOut.c index 825bdd181..6dcace21f 100644 --- a/ports/atmel-samd/common-hal/pulseio/PWMOut.c +++ b/ports/atmel-samd/common-hal/pulseio/PWMOut.c @@ -31,6 +31,7 @@ #include "common-hal/pulseio/PWMOut.h" #include "shared-bindings/pulseio/PWMOut.h" #include "shared-bindings/microcontroller/Processor.h" +#include "timer_handler.h" #include "atmel_start_pins.h" #include "hal/utils/include/utils_repeat_macro.h" @@ -58,6 +59,26 @@ uint8_t tcc_channels[3]; // Set by pwmout_reset() to {0xf0, 0xfc, 0xfc} initia uint8_t tcc_channels[5]; // Set by pwmout_reset() to {0xc0, 0xf0, 0xf8, 0xfc, 0xfc} initially. #endif +static uint8_t never_reset_tc_or_tcc[TC_INST_NUM + TCC_INST_NUM]; + +void common_hal_pulseio_pwmout_never_reset(pulseio_pwmout_obj_t *self) { + if (self->timer->is_tc) { + never_reset_tc_or_tcc[self->timer->index] += 1; + } else { + never_reset_tc_or_tcc[TC_INST_NUM + self->timer->index] += 1; + } + + never_reset_pin_number(self->pin->number); +} + +void common_hal_pulseio_pwmout_reset_ok(pulseio_pwmout_obj_t *self) { + if (self->timer->is_tc) { + never_reset_tc_or_tcc[self->timer->index] -= 1; + } else { + never_reset_tc_or_tcc[TC_INST_NUM + self->timer->index] -= 1; + } +} + void pwmout_reset(void) { // Reset all timers for (int i = 0; i < TCC_INST_NUM; i++) { @@ -66,6 +87,9 @@ void pwmout_reset(void) { } Tcc *tccs[TCC_INST_NUM] = TCC_INSTS; for (int i = 0; i < TCC_INST_NUM; i++) { + if (never_reset_tc_or_tcc[TC_INST_NUM + i] > 0) { + continue; + } // Disable the module before resetting it. if (tccs[i]->CTRLA.bit.ENABLE == 1) { tccs[i]->CTRLA.bit.ENABLE = 0; @@ -78,9 +102,14 @@ void pwmout_reset(void) { } tcc_channels[i] = mask; tccs[i]->CTRLA.bit.SWRST = 1; + while (tccs[i]->CTRLA.bit.SWRST == 1) { + } } Tc *tcs[TC_INST_NUM] = TC_INSTS; for (int i = 0; i < TC_INST_NUM; i++) { + if (never_reset_tc_or_tcc[i] > 0) { + continue; + } tcs[i]->COUNT16.CTRLA.bit.SWRST = 1; while (tcs[i]->COUNT16.CTRLA.bit.SWRST == 1) { } @@ -99,11 +128,11 @@ bool channel_ok(const pin_timer_t* t) { t->is_tc; } -void common_hal_pulseio_pwmout_construct(pulseio_pwmout_obj_t* self, - const mcu_pin_obj_t* pin, - uint16_t duty, - uint32_t frequency, - bool variable_frequency) { +pwmout_result_t common_hal_pulseio_pwmout_construct(pulseio_pwmout_obj_t* self, + const mcu_pin_obj_t* pin, + uint16_t duty, + uint32_t frequency, + bool variable_frequency) { self->pin = pin; self->variable_frequency = variable_frequency; @@ -113,11 +142,11 @@ void common_hal_pulseio_pwmout_construct(pulseio_pwmout_obj_t* self, && pin->timer[2].index >= TCC_INST_NUM #endif ) { - mp_raise_ValueError(translate("Invalid pin")); + return PWMOUT_INVALID_PIN; } if (frequency == 0 || frequency > 6000000) { - mp_raise_ValueError(translate("Invalid PWM frequency")); + return PWMOUT_INVALID_FREQUENCY; } // Figure out which timer we are using. @@ -184,11 +213,9 @@ void common_hal_pulseio_pwmout_construct(pulseio_pwmout_obj_t* self, if (timer == NULL) { if (found) { - mp_raise_ValueError(translate("All timers for this pin are in use")); - } else { - mp_raise_RuntimeError(translate("All timers in use")); + return PWMOUT_ALL_TIMERS_ON_PIN_IN_USE; } - return; + return PWMOUT_ALL_TIMERS_IN_USE; } uint8_t resolution = 0; @@ -210,6 +237,7 @@ void common_hal_pulseio_pwmout_construct(pulseio_pwmout_obj_t* self, } } + set_timer_handler(timer->is_tc, timer->index, TC_HANDLER_NO_INTERRUPT); // We use the zeroeth clock on either port to go full speed. turn_on_clocks(timer->is_tc, timer->index, 0); @@ -259,6 +287,7 @@ void common_hal_pulseio_pwmout_construct(pulseio_pwmout_obj_t* self, gpio_set_pin_function(pin->number, GPIO_PIN_FUNCTION_E + mux_position); common_hal_pulseio_pwmout_set_duty_cycle(self, duty); + return PWMOUT_OK; } bool common_hal_pulseio_pwmout_deinited(pulseio_pwmout_obj_t* self) { @@ -301,32 +330,29 @@ extern void common_hal_pulseio_pwmout_set_duty_cycle(pulseio_pwmout_obj_t* self, #endif #ifdef SAMD51 Tc* tc = tc_insts[t->index]; - while (tc->COUNT16.SYNCBUSY.bit.CC1 != 0) { - // Wait for a previous value to be written. This can wait up to one period so we do - // other stuff in the meantime. - #ifdef MICROPY_VM_HOOK_LOOP - MICROPY_VM_HOOK_LOOP - #endif - } + while (tc->COUNT16.SYNCBUSY.bit.CC1 != 0) {} tc->COUNT16.CCBUF[1].reg = adjusted_duty; #endif } else { uint32_t adjusted_duty = ((uint64_t) tcc_periods[t->index]) * duty / 0xffff; uint8_t channel = tcc_channel(t); Tcc* tcc = tcc_insts[t->index]; - while ((tcc->SYNCBUSY.vec.CC & (1 << channel)) != 0) { - // Wait for a previous value to be written. This can wait up to one period so we do - // other stuff in the meantime. - #ifdef MICROPY_VM_HOOK_LOOP - MICROPY_VM_HOOK_LOOP - #endif - } + + // Write into the CC buffer register, which will be transferred to the + // CC register on an UPDATE (when period is finished). + // Do clock domain syncing as necessary. + + while (tcc->SYNCBUSY.reg != 0) {} + + // Lock out double-buffering while updating the CCB value. + tcc->CTRLBSET.bit.LUPD = 1; #ifdef SAMD21 tcc->CCB[channel].reg = adjusted_duty; #endif #ifdef SAMD51 tcc->CCBUF[channel].reg = adjusted_duty; #endif + tcc->CTRLBCLR.bit.LUPD = 1; } } @@ -341,7 +367,12 @@ uint16_t common_hal_pulseio_pwmout_get_duty_cycle(pulseio_pwmout_obj_t* self) { Tcc* tcc = tcc_insts[t->index]; uint8_t channel = tcc_channel(t); uint32_t cv = 0; + + while (tcc->SYNCBUSY.bit.CTRLB) {} + #ifdef SAMD21 + // If CCBV (CCB valid) is set, the CCB value hasn't yet been copied + // to the CC value. if ((tcc->STATUS.vec.CCBV & (1 << channel)) != 0) { cv = tcc->CCB[channel].reg; } else { @@ -398,9 +429,7 @@ void common_hal_pulseio_pwmout_set_frequency(pulseio_pwmout_obj_t* self, tc->COUNT16.CC[0].reg = new_top; #endif #ifdef SAMD51 - while (tc->COUNT16.SYNCBUSY.reg != 0) { - /* Wait for sync */ - } + while (tc->COUNT16.SYNCBUSY.reg != 0) {} tc->COUNT16.CCBUF[0].reg = new_top; #endif } else { @@ -411,14 +440,12 @@ void common_hal_pulseio_pwmout_set_frequency(pulseio_pwmout_obj_t* self, tcc->CTRLA.bit.PRESCALER = new_divisor; tcc_set_enable(tcc, true); } + while (tcc->SYNCBUSY.reg != 0) {} tcc_periods[t->index] = new_top; #ifdef SAMD21 tcc->PERB.bit.PERB = new_top; #endif #ifdef SAMD51 - while (tcc->SYNCBUSY.reg != 0) { - /* Wait for sync */ - } tcc->PERBUF.bit.PERBUF = new_top; #endif } diff --git a/ports/atmel-samd/common-hal/pulseio/PulseOut.c b/ports/atmel-samd/common-hal/pulseio/PulseOut.c index 8c9f28eb8..528a5c808 100644 --- a/ports/atmel-samd/common-hal/pulseio/PulseOut.c +++ b/ports/atmel-samd/common-hal/pulseio/PulseOut.c @@ -37,6 +37,7 @@ #include "py/runtime.h" #include "shared-bindings/pulseio/PulseOut.h" #include "supervisor/shared/translate.h" +#include "timer_handler.h" // This timer is shared amongst all PulseOut objects under the assumption that // the code is single threaded. @@ -112,6 +113,7 @@ void common_hal_pulseio_pulseout_construct(pulseio_pulseout_obj_t* self, pulseout_tc_index = index; + set_timer_handler(true, index, TC_HANDLER_PULSEOUT); // We use GCLK0 for SAMD21 and GCLK1 for SAMD51 because they both run at 48mhz making our // math the same across the boards. #ifdef SAMD21 diff --git a/ports/atmel-samd/fatfs_port.c b/ports/atmel-samd/fatfs_port.c index 67c6c9d35..c4ce18c2a 100644 --- a/ports/atmel-samd/fatfs_port.c +++ b/ports/atmel-samd/fatfs_port.c @@ -29,12 +29,20 @@ #include "lib/oofatfs/ff.h" /* FatFs lower layer API */ #include "lib/oofatfs/diskio.h" /* FatFs lower layer API */ #include "lib/timeutils/timeutils.h" + +#if CIRCUITPY_RTC #include "shared-bindings/rtc/RTC.h" +#endif DWORD get_fattime(void) { +#if CIRCUITPY_RTC timeutils_struct_time_t tm; common_hal_rtc_get_time(&tm); - return ((tm.tm_year - 1980) << 25) | (tm.tm_mon << 21) | (tm.tm_mday << 16) | (tm.tm_hour << 11) | (tm.tm_min << 5) | (tm.tm_sec >> 1); +#else + return ((2016 - 1980) << 25) | ((9) << 21) | ((1) << 16) | ((16) << 11) | ((43) << 5) | (35 / 2); +#endif + + } diff --git a/ports/atmel-samd/mpconfigport.h b/ports/atmel-samd/mpconfigport.h index d0ebbfa39..4e15a6c30 100644 --- a/ports/atmel-samd/mpconfigport.h +++ b/ports/atmel-samd/mpconfigport.h @@ -1,168 +1,47 @@ -#include <stdint.h> +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Dan Halbert for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ #ifndef __INCLUDED_MPCONFIGPORT_H #define __INCLUDED_MPCONFIGPORT_H -#define MICROPY_OBJ_REPR (MICROPY_OBJ_REPR_C) - -// options to control how MicroPython is built -#define MICROPY_QSTR_BYTES_IN_HASH (1) -#define MICROPY_ALLOC_PATH_MAX (256) -#define MICROPY_ALLOC_PARSE_CHUNK_INIT (16) -// TODO(tannewt): Reduce this number if we want the REPL to function under 512 -// free bytes. -// #define MICROPY_ALLOC_PARSE_RULE_INIT (64) -#define MICROPY_CAN_OVERRIDE_BUILTINS (1) -#define MICROPY_EMIT_X64 (0) -#define MICROPY_EMIT_THUMB (0) -#define MICROPY_EMIT_INLINE_THUMB (0) -#define MICROPY_COMP_MODULE_CONST (1) -#define MICROPY_COMP_CONST (1) -#define MICROPY_COMP_DOUBLE_TUPLE_ASSIGN (1) -#define MICROPY_COMP_TRIPLE_TUPLE_ASSIGN (1) -#define MICROPY_MEM_STATS (0) -#define MICROPY_DEBUG_PRINTERS (0) -#define MICROPY_ENABLE_GC (1) -#define MICROPY_GC_ALLOC_THRESHOLD (0) -#define MICROPY_REPL_EVENT_DRIVEN (0) -#define MICROPY_HELPER_REPL (1) -#define MICROPY_HELPER_LEXER_UNIX (0) -#define MICROPY_ENABLE_SOURCE_LINE (1) -#define MICROPY_ENABLE_DOC_STRING (0) -//#define MICROPY_ERROR_REPORTING (MICROPY_ERROR_REPORTING_TERSE) -#define MICROPY_ERROR_REPORTING (MICROPY_ERROR_REPORTING_NORMAL) -#define MICROPY_PY_ASYNC_AWAIT (0) -#define MICROPY_PY_BUILTINS_BYTEARRAY (1) -#define MICROPY_PY_BUILTINS_MEMORYVIEW (1) -#define MICROPY_PY_BUILTINS_ENUMERATE (1) -#define MICROPY_PY_BUILTINS_HELP (1) -#define MICROPY_PY_BUILTINS_HELP_MODULES (1) -#define MICROPY_PY_BUILTINS_INPUT (1) -#define MICROPY_PY_BUILTINS_FILTER (1) -#define MICROPY_PY_BUILTINS_SET (1) -#define MICROPY_PY_BUILTINS_SLICE (1) -#define MICROPY_PY_BUILTINS_SLICE_ATTRS (1) -#define MICROPY_PY_ARRAY_SLICE_ASSIGN (1) -#define MICROPY_NONSTANDARD_TYPECODES (0) -#define MICROPY_PY_BUILTINS_PROPERTY (1) -#define MICROPY_PY_BUILTINS_MIN_MAX (1) -#define MICROPY_PY___FILE__ (1) -#define MICROPY_PY_GC (1) -#define MICROPY_PY_ARRAY (1) -#define MICROPY_PY_ATTRTUPLE (1) -#define MICROPY_PY_COLLECTIONS (1) -#define MICROPY_PY_DESCRIPTORS (1) -#define MICROPY_PY_MATH (0) -#define MICROPY_PY_CMATH (0) -#define MICROPY_PY_URANDOM (0) -#define MICROPY_PY_URANDOM_EXTRA_FUNCS (0) -#define MICROPY_PY_STRUCT (0) -#define MICROPY_PY_SYS (1) -#define MICROPY_PY_SYS_MAXSIZE (1) -#define MICROPY_FLOAT_IMPL (MICROPY_FLOAT_IMPL_FLOAT) -#define MICROPY_FLOAT_HIGH_QUALITY_HASH (1) -#define MICROPY_STREAMS_NON_BLOCK (1) - -#ifndef MICROPY_PY_NETWORK -#define MICROPY_PY_NETWORK (0) -#endif - -#ifndef MICROPY_PY_WIZNET5K -#define MICROPY_PY_WIZNET5K (0) -#endif - -#ifndef MICROPY_PY_CC3K -#define MICROPY_PY_CC3K (0) -#endif - -// fatfs configuration used in ffconf.h -#define MICROPY_FATFS_ENABLE_LFN (1) -#define MICROPY_FATFS_LFN_CODE_PAGE (437) /* 1=SFN/ANSI 437=LFN/U.S.(OEM) */ -#define MICROPY_FATFS_USE_LABEL (1) -#define MICROPY_FATFS_RPATH (2) -#define MICROPY_FATFS_VOLUMES (4) -#define MICROPY_FATFS_MULTI_PARTITION (1) -#define MICROPY_FATFS_NUM_PERSISTENT (1) -// Only enable this if you really need it. It allocates a byte cache of this -// size. -// #define MICROPY_FATFS_MAX_SS (4096) - -#define FILESYSTEM_BLOCK_SIZE (512) - -#define MICROPY_VFS (1) -#define MICROPY_VFS_FAT (1) -#define MICROPY_PY_MACHINE (1) -#define MICROPY_REPL_AUTO_INDENT (1) -#define MICROPY_HW_ENABLE_DAC (1) -#define MICROPY_ENABLE_FINALISER (1) -#define MICROPY_USE_INTERNAL_PRINTF (1) -#define MICROPY_PY_SYS_STDFILES (1) -#define MICROPY_PY_IO_FILEIO (1) -#define MICROPY_READER_VFS (1) -#define MICROPY_PERSISTENT_CODE_LOAD (1) -#define MICROPY_PY_BUILTINS_STR_UNICODE (1) - -#define MICROPY_KBD_EXCEPTION (1) - -// type definitions for the specific machine - -#define BYTES_PER_WORD (4) - -#define MICROPY_MAKE_POINTER_CALLABLE(p) ((void*)((mp_uint_t)(p) | 1)) - -#define MICROPY_STACK_CHECK (1) - -// Track stack usage on a debug build. Expose results via ustack module. -#ifdef MICROPY_DEBUG_MODULES -#define MICROPY_MAX_STACK_USAGE (1) -#endif - -// This port is intended to be 32-bit, but unfortunately, int32_t for -// different targets may be defined in different ways - either as int -// or as long. This requires different printf formatting specifiers -// to print such value. So, we avoid int32_t and use int directly. -#define UINT_FMT "%u" -#define INT_FMT "%d" -typedef int mp_int_t; // must be pointer size -typedef unsigned mp_uint_t; // must be pointer size - -typedef long mp_off_t; - -// XXX check we don't need this -#define MICROPY_THREAD_YIELD() - -#define MP_PLAT_PRINT_STRN(str, len) mp_hal_stdout_tx_strn_cooked(str, len) - -#define mp_type_fileio mp_type_vfs_fat_fileio -#define mp_type_textio mp_type_vfs_fat_textio - -#define mp_import_stat mp_vfs_import_stat -#define mp_builtin_open_obj mp_vfs_open_obj - -// extra built in names to add to the global namespace -#define MICROPY_PORT_BUILTINS \ - { MP_OBJ_NEW_QSTR(MP_QSTR_help), (mp_obj_t)&mp_builtin_help_obj }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_input), (mp_obj_t)&mp_builtin_input_obj }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_open), (mp_obj_t)&mp_builtin_open_obj }, - -// board specific definitions -#include "mpconfigboard.h" +// Definitions for which SAMD chip we're using. #include "include/sam.h" #ifdef SAMD21 #define CIRCUITPY_MCU_FAMILY samd21 #define MICROPY_PY_SYS_PLATFORM "Atmel SAMD21" -#define PORT_HEAP_SIZE (16384 + 4096) #define SPI_FLASH_MAX_BAUDRATE 8000000 #define CIRCUITPY_DEFAULT_STACK_SIZE 4096 -#define MICROPY_CPYTHON_COMPAT (0) -#define MICROPY_MODULE_WEAK_LINKS (0) #define MICROPY_PY_BUILTINS_NOTIMPLEMENTED (0) #define MICROPY_PY_COLLECTIONS_ORDEREDDICT (0) #define MICROPY_PY_FUNCTION_ATTRS (0) +// MICROPY_PY_UJSON depends on MICROPY_PY_IO #define MICROPY_PY_IO (0) +#define MICROPY_PY_UJSON (0) #define MICROPY_PY_REVERSE_SPECIAL_METHODS (0) -#define MICROPY_PY_SYS_EXC_INFO (0) #define MICROPY_PY_UERRNO_LIST \ X(EPERM) \ X(ENOENT) \ @@ -180,281 +59,27 @@ typedef long mp_off_t; #ifdef SAMD51 #define CIRCUITPY_MCU_FAMILY samd51 #define MICROPY_PY_SYS_PLATFORM "MicroChip SAMD51" -#define PORT_HEAP_SIZE (0x20000) // 128KiB #define SPI_FLASH_MAX_BAUDRATE 24000000 +// 24kiB stack #define CIRCUITPY_DEFAULT_STACK_SIZE 0x6000 -#define MICROPY_CPYTHON_COMPAT (1) -#define MICROPY_MODULE_WEAK_LINKS (1) #define MICROPY_PY_BUILTINS_NOTIMPLEMENTED (1) #define MICROPY_PY_COLLECTIONS_ORDEREDDICT (1) #define MICROPY_PY_FUNCTION_ATTRS (1) #define MICROPY_PY_IO (1) +#define MICROPY_PY_UJSON (1) #define MICROPY_PY_REVERSE_SPECIAL_METHODS (1) -#define MICROPY_PY_SYS_EXC_INFO (1) // MICROPY_PY_UERRNO_LIST - Use the default #endif -#ifdef LONGINT_IMPL_NONE -#define MICROPY_LONGINT_IMPL (MICROPY_LONGINT_IMPL_NONE) -#endif - -#ifdef LONGINT_IMPL_MPZ -#define MICROPY_LONGINT_IMPL (MICROPY_LONGINT_IMPL_MPZ) -#define MP_SSIZE_MAX (0x7fffffff) -#endif - -#ifdef LONGINT_IMPL_LONGLONG -#define MICROPY_LONGINT_IMPL (MICROPY_LONGINT_IMPL_LONGLONG) -#endif - -// extra built in modules to add to the list of known ones -extern const struct _mp_obj_module_t microcontroller_module; -extern const struct _mp_obj_module_t bitbangio_module; -extern const struct _mp_obj_module_t audioio_module; -extern const struct _mp_obj_module_t audiobusio_module; -extern const struct _mp_obj_module_t analogio_module; -extern const struct _mp_obj_module_t digitalio_module; -extern const struct _mp_obj_module_t displayio_module; -extern const struct _mp_obj_module_t pulseio_module; -extern const struct _mp_obj_module_t busio_module; -extern const struct _mp_obj_module_t board_module; -extern const struct _mp_obj_module_t i2cslave_module; -extern const struct _mp_obj_module_t math_module; -extern const struct _mp_obj_module_t os_module; -extern const struct _mp_obj_module_t random_module; -extern const struct _mp_obj_module_t rotaryio_module; -extern const struct _mp_obj_module_t rtc_module; -extern const struct _mp_obj_module_t samd_module; -extern const struct _mp_obj_module_t storage_module; -extern const struct _mp_obj_module_t struct_module; -extern const struct _mp_obj_module_t time_module; -extern const struct _mp_obj_module_t cpy_nvm_module; -extern const struct _mp_obj_module_t neopixel_write_module; -extern const struct _mp_obj_module_t uheap_module; -extern const struct _mp_obj_module_t ustack_module; -extern const struct _mp_obj_module_t supervisor_module; -extern const struct _mp_obj_module_t gamepad_module; -extern const struct _mp_obj_module_t stage_module; -extern const struct _mp_obj_module_t touchio_module; -extern const struct _mp_obj_module_t usb_hid_module; -extern const struct _mp_obj_module_t network_module; -extern const struct _mp_obj_module_t socket_module; -extern const struct _mp_obj_module_t wiznet_module; - -// Internal flash size dependent settings. -#if BOARD_FLASH_SIZE > 192000 - #define MICROPY_PY_BUILTINS_STR_CENTER (1) - #define MICROPY_PY_BUILTINS_STR_PARTITION (1) - #define MICROPY_PY_BUILTINS_FROZENSET (1) - #define MICROPY_PY_BUILTINS_STR_SPLITLINES (1) - #define MICROPY_PY_BUILTINS_REVERSED (1) - #define MICROPY_PY_UERRNO (1) - #define MICROPY_PY_UERRNO_ERRORCODE (0) - #define MICROPY_PY_URE (1) - #define MICROPY_PY_MICROPYTHON_MEM_INFO (1) - #ifndef MICROPY_PY_FRAMEBUF - #define MICROPY_PY_FRAMEBUF (0) - #endif - - #define MICROPY_BUILTIN_METHOD_CHECK_SELF_ARG (1) - #define MICROPY_PY_ALL_SPECIAL_METHODS (1) - // Scan gamepad every 32ms - #define CIRCUITPY_GAMEPAD_TICKS 0x1f - - #if defined(__SAMD51G19A__) || defined(__SAMD51G18A__) || defined(__SAMR21G18A__) - #define AUDIOBUSIO_MODULE - #else - #define AUDIOBUSIO_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_audiobusio), (mp_obj_t)&audiobusio_module }, - #endif - - #if defined(__SAMR21G18A__) - #define AUDIOIO_MODULE - #else - #define AUDIOIO_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_audioio), (mp_obj_t)&audioio_module }, - #endif - - #ifdef CIRCUITPY_I2CSLAVE - #define I2CSLAVE_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_i2cslave), (mp_obj_t)&i2cslave_module }, - #else - #define I2CSLAVE_MODULE - #endif - - #ifdef CIRCUITPY_DISPLAYIO - #define DISPLAYIO_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_displayio), (mp_obj_t)&displayio_module }, - #else - #define DISPLAYIO_MODULE - #endif - - #if MICROPY_PY_NETWORK - #define NETWORK_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_network), (mp_obj_t)&network_module }, - #define SOCKET_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_socket), (mp_obj_t)&socket_module }, - #if MICROPY_PY_WIZNET5K - #define WIZNET_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_wiznet), (mp_obj_t)&wiznet_module }, - #else - #define WIZNET_MODULE - #endif - #else - #define NETWORK_MODULE - #define SOCKET_MODULE - #define WIZNET_MODULE - #endif - - // (u)json depends, perhaps erroneously, on MICROPY_PY_IO - #if MICROPY_PY_IO - #define JSON_MODULE { MP_ROM_QSTR(MP_QSTR_json), MP_ROM_PTR(&mp_module_ujson) }, - #define MICROPY_PY_UJSON (1) - #else - #define JSON_MODULE - #endif - - - #ifndef EXTRA_BUILTIN_MODULES - #define EXTRA_BUILTIN_MODULES \ - AUDIOIO_MODULE \ - AUDIOBUSIO_MODULE \ - { MP_OBJ_NEW_QSTR(MP_QSTR_bitbangio), (mp_obj_t)&bitbangio_module }, \ - DISPLAYIO_MODULE \ - I2CSLAVE_MODULE \ - NETWORK_MODULE \ - SOCKET_MODULE \ - WIZNET_MODULE \ - JSON_MODULE \ - { MP_OBJ_NEW_QSTR(MP_QSTR_rotaryio), (mp_obj_t)&rotaryio_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_gamepad),(mp_obj_t)&gamepad_module } - #endif - #define EXPRESS_BOARD - -#else - #define MICROPY_PY_BUILTINS_REVERSED (0) - #define MICROPY_PY_MICROPYTHON_MEM_INFO (0) - #define MICROPY_PY_FRAMEBUF (0) - #ifndef EXTRA_BUILTIN_MODULES - #define EXTRA_BUILTIN_MODULES - #endif - - #define MICROPY_PY_BUILTINS_COMPLEX (0) - - #define MICROPY_BUILTIN_METHOD_CHECK_SELF_ARG (0) -#endif - -// Disabled for now. -// { MP_OBJ_NEW_QSTR(MP_QSTR__stage), (mp_obj_t)&stage_module }, - -#ifdef SAMD21 -#define TOUCHIO_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_touchio), (mp_obj_t)&touchio_module }, -#endif -#ifdef SAMD51 -#define TOUCHIO_MODULE -#endif - -// A pIRKey has minimal I/O needs. Remove unneeded modules to make room -// for frozen modules. math is very large and is also removed. -#ifdef PIRKEY_M0 -#define MICROPY_PORT_BUILTIN_MODULES \ - { MP_OBJ_NEW_QSTR(MP_QSTR_board), (mp_obj_t)&board_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_busio), (mp_obj_t)&busio_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_digitalio), (mp_obj_t)&digitalio_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_microcontroller), (mp_obj_t)µcontroller_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_os), (mp_obj_t)&os_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_pulseio), (mp_obj_t)&pulseio_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_random), (mp_obj_t)&random_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_storage), (mp_obj_t)&storage_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_struct), (mp_obj_t)&struct_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_supervisor), (mp_obj_t)&supervisor_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_time), (mp_obj_t)&time_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_usb_hid),(mp_obj_t)&usb_hid_module }, -#elif MICROPY_MODULE_WEAK_LINKS -#define MICROPY_PORT_BUILTIN_MODULES \ - { MP_OBJ_NEW_QSTR(MP_QSTR_analogio), (mp_obj_t)&analogio_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_board), (mp_obj_t)&board_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_busio), (mp_obj_t)&busio_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_digitalio), (mp_obj_t)&digitalio_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_microcontroller), (mp_obj_t)µcontroller_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_neopixel_write),(mp_obj_t)&neopixel_write_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR__os), (mp_obj_t)&os_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_pulseio), (mp_obj_t)&pulseio_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_random), (mp_obj_t)&random_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_rtc), (mp_obj_t)&rtc_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_samd),(mp_obj_t)&samd_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_storage), (mp_obj_t)&storage_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_struct), (mp_obj_t)&struct_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_supervisor), (mp_obj_t)&supervisor_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_math), (mp_obj_t)&math_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR__time), (mp_obj_t)&time_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_usb_hid),(mp_obj_t)&usb_hid_module }, \ - TOUCHIO_MODULE \ - EXTRA_BUILTIN_MODULES - -#define MICROPY_PORT_BUILTIN_MODULE_WEAK_LINKS \ - { MP_ROM_QSTR(MP_QSTR_errno), MP_ROM_PTR(&mp_module_uerrno) }, \ - { MP_ROM_QSTR(MP_QSTR_io), MP_ROM_PTR(&mp_module_io) }, \ - { MP_ROM_QSTR(MP_QSTR_os), MP_ROM_PTR(&os_module) }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_time), (mp_obj_t)&time_module }, \ - -#else -#define MICROPY_PORT_BUILTIN_MODULES \ - { MP_OBJ_NEW_QSTR(MP_QSTR_analogio), (mp_obj_t)&analogio_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_board), (mp_obj_t)&board_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_busio), (mp_obj_t)&busio_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_digitalio), (mp_obj_t)&digitalio_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_microcontroller), (mp_obj_t)µcontroller_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_neopixel_write),(mp_obj_t)&neopixel_write_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_os), (mp_obj_t)&os_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_pulseio), (mp_obj_t)&pulseio_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_random), (mp_obj_t)&random_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_rtc), (mp_obj_t)&rtc_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_samd),(mp_obj_t)&samd_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_storage), (mp_obj_t)&storage_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_struct), (mp_obj_t)&struct_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_supervisor), (mp_obj_t)&supervisor_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_math), (mp_obj_t)&math_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_time), (mp_obj_t)&time_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_usb_hid),(mp_obj_t)&usb_hid_module }, \ - TOUCHIO_MODULE \ - EXTRA_BUILTIN_MODULES -#endif - -#define MICROPY_PORT_BUILTIN_DEBUG_MODULES \ - { MP_OBJ_NEW_QSTR(MP_QSTR_uheap),(mp_obj_t)&uheap_module }, \ - { MP_OBJ_NEW_QSTR(MP_QSTR_ustack),(mp_obj_t)&ustack_module } - -// We need to provide a declaration/definition of alloca() -#include <alloca.h> - -#ifdef __linux__ -#define MICROPY_MIN_USE_STDOUT (1) -#endif - -#ifdef __thumb__ -#define MICROPY_MIN_USE_CORTEX_CPU (1) -#define MICROPY_MIN_USE_SAMD21_MCU (1) -#endif - -#define MP_STATE_PORT MP_STATE_VM +// Turning off audioio, audiobusio, and touchio as necessary +// due to limitations of chips is handled in mpconfigboard.mk #include "peripherals/samd/dma.h" -#include "supervisor/flash_root_pointers.h" -#if MICROPY_PY_NETWORK - #define NETWORK_ROOT_POINTERS mp_obj_list_t mod_network_nic_list; -#else - #define NETWORK_ROOT_POINTERS -#endif +#include "py/circuitpy_mpconfig.h" #define MICROPY_PORT_ROOT_POINTERS \ - const char *readline_hist[8]; \ - vstr_t *repl_line; \ - mp_obj_t playing_audio[AUDIO_DMA_CHANNEL_COUNT]; \ - mp_obj_t rtc_time_source; \ - FLASH_ROOT_POINTERS \ - mp_obj_t gamepad_singleton; \ - NETWORK_ROOT_POINTERS \ - -void run_background_tasks(void); -#define MICROPY_VM_HOOK_LOOP run_background_tasks(); -#define MICROPY_VM_HOOK_RETURN run_background_tasks(); - -#define CIRCUITPY_AUTORELOAD_DELAY_MS 500 -#define CIRCUITPY_BOOT_OUTPUT_FILE "/boot_out.txt" + CIRCUITPY_COMMON_ROOT_POINTERS \ + mp_obj_t playing_audio[AUDIO_DMA_CHANNEL_COUNT]; #endif // __INCLUDED_MPCONFIGPORT_H diff --git a/ports/atmel-samd/mpconfigport.mk b/ports/atmel-samd/mpconfigport.mk index 7db581dd6..bb5e222f0 100644 --- a/ports/atmel-samd/mpconfigport.mk +++ b/ports/atmel-samd/mpconfigport.mk @@ -14,6 +14,11 @@ ifeq ($(LONGINT_IMPL),LONGLONG) MPY_TOOL_LONGINT_IMPL = -mlongint-impl=longlong endif +# Put samd51-only choices here. +ifeq ($(CHIP_FAMILY),samd51) +CIRCUITPY_SAMD = 1 +endif + INTERNAL_LIBM = 1 USB_SERIAL_NUMBER_LENGTH = 32 diff --git a/ports/atmel-samd/mphalport.c b/ports/atmel-samd/mphalport.c index ac5b0fbca..5c34a576a 100644 --- a/ports/atmel-samd/mphalport.c +++ b/ports/atmel-samd/mphalport.c @@ -57,7 +57,8 @@ void mp_hal_delay_ms(mp_uint_t delay) { MICROPY_VM_HOOK_LOOP #endif // Check to see if we've been CTRL-Ced by autoreload or the user. - if(MP_STATE_VM(mp_pending_exception) == MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_kbd_exception))) { + if(MP_STATE_VM(mp_pending_exception) == MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_kbd_exception)) || + MP_STATE_VM(mp_pending_exception) == MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_reload_exception))) { break; } duration = (ticks_ms - start_tick); diff --git a/ports/atmel-samd/peripherals b/ports/atmel-samd/peripherals -Subproject f3bd5b1fd96f2ab0dde5cad61d41e607061ed46 +Subproject 6416828bb6821779d4c62fa3c7d41c95634173c diff --git a/ports/atmel-samd/supervisor/port.c b/ports/atmel-samd/supervisor/port.c index 941838618..f8d830d8b 100644 --- a/ports/atmel-samd/supervisor/port.c +++ b/ports/atmel-samd/supervisor/port.c @@ -60,7 +60,6 @@ #include "samd/external_interrupts.h" #include "samd/dma.h" #include "shared-bindings/rtc/__init__.h" -#include "board_busses.h" #include "reset.h" #include "tick.h" @@ -69,9 +68,10 @@ #include "tusb.h" -#ifdef CIRCUITPY_GAMEPAD_TICKS +#if CIRCUITPY_GAMEPAD #include "shared-module/gamepad/__init__.h" #endif +#include "shared-module/_pew/PewPew.h" extern volatile bool mp_msc_enabled; @@ -165,12 +165,15 @@ safe_mode_t port_init(void) { // Configure millisecond timer initialization. tick_init(); -#ifndef PIRKEY_M0 +#if CIRCUITPY_RTC rtc_init(); #endif init_shared_dma(); + // Reset everything into a known state before board_init. + reset_port(); + // Init the board last so everything else is ready board_init(); @@ -195,39 +198,45 @@ safe_mode_t port_init(void) { void reset_port(void) { reset_sercoms(); -#if defined(EXPRESS_BOARD) && !defined(__SAMR21G18A__) +#if CIRCUITPY_AUDIOIO audio_dma_reset(); audioout_reset(); - #if !defined(__SAMD51G19A__) && !defined(__SAMD51G18A__) +#endif +#if CIRCUITPY_AUDIOBUSIO i2sout_reset(); - #endif //pdmin_reset(); #endif -#ifdef SAMD21 + +#if CIRCUITPY_TOUCHIO touchin_reset(); #endif eic_reset(); +#if CIRCUITPY_PULSEIO pulseout_reset(); pwmout_reset(); +#endif -#ifndef PIRKEY_M0 +#if CIRCUITPY_ANALOGIO analogin_reset(); analogout_reset(); +#endif +#if CIRCUITPY_RTC rtc_reset(); #endif reset_gclks(); -#ifdef CIRCUITPY_GAMEPAD_TICKS +#if CIRCUITPY_GAMEPAD gamepad_reset(); #endif +#if CIRCUITPY_PEW + pew_reset(); +#endif reset_event_system(); reset_all_pins(); - reset_board_busses(); - // Output clocks for debugging. // not supported by SAMD51G; uncomment for SAMD51J or update for 51G // #ifdef SAMD51 @@ -251,14 +260,20 @@ void reset_cpu(void) { reset(); } -extern uint32_t _ebss; -// Place the word to save just after our BSS section that gets blanked. +// Place the word to save 8k from the end of RAM so we and the bootloader don't clobber it. +#ifdef SAMD21 +uint32_t* safe_word = (uint32_t*) (HMCRAMC0_ADDR + HMCRAMC0_SIZE - 0x2000); +#endif +#ifdef SAMD51 +uint32_t* safe_word = (uint32_t*) (HSRAM_ADDR + HSRAM_SIZE - 0x2000); +#endif + void port_set_saved_word(uint32_t value) { - _ebss = value; + *safe_word = value; } uint32_t port_get_saved_word(void) { - return _ebss; + return *safe_word; } /** diff --git a/ports/atmel-samd/timer_handler.c b/ports/atmel-samd/timer_handler.c new file mode 100644 index 000000000..61ab3e6d7 --- /dev/null +++ b/ports/atmel-samd/timer_handler.c @@ -0,0 +1,67 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2017 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include <stdbool.h> +#include <stdint.h> + +#include "timer_handler.h" + +#include "common-hal/pulseio/PulseOut.h" +#include "shared-module/_pew/PewPew.h" +#include "common-hal/frequencyio/FrequencyIn.h" + +static uint8_t tc_handler[TC_INST_NUM]; + +void set_timer_handler(bool is_tc, uint8_t index, uint8_t timer_handler) { + if (is_tc) { + tc_handler[index] = timer_handler; + } +} + +void shared_timer_handler(bool is_tc, uint8_t index) { + // Add calls to interrupt handlers for specific functionality here. + // Make sure to add the handler #define to timer_handler.h + if (is_tc) { + uint8_t handler = tc_handler[index]; + switch(handler) { + case TC_HANDLER_PULSEOUT: + pulseout_interrupt_handler(index); + break; + case TC_HANDLER_PEW: + #if CIRCUITPY_PEW + pewpew_interrupt_handler(index); + #endif + break; + case TC_HANDLER_FREQUENCYIN: + #if CIRCUITPY_FREQUENCYIO + frequencyin_interrupt_handler(index); + #endif + break; + default: + break; + } + } +} diff --git a/ports/atmel-samd/timer_handler.h b/ports/atmel-samd/timer_handler.h new file mode 100644 index 000000000..4a7adb58c --- /dev/null +++ b/ports/atmel-samd/timer_handler.h @@ -0,0 +1,37 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef MICROPY_INCLUDED_ATMEL_SAMD_TIMER_HANDLER_H +#define MICROPY_INCLUDED_ATMEL_SAMD_TIMER_HANDLER_H + +#define TC_HANDLER_NO_INTERRUPT 0x0 +#define TC_HANDLER_PULSEOUT 0x1 +#define TC_HANDLER_PEW 0x2 +#define TC_HANDLER_FREQUENCYIN 0x3 + +void set_timer_handler(bool is_tc, uint8_t index, uint8_t timer_handler); +void shared_timer_handler(bool is_tc, uint8_t index); + +#endif // MICROPY_INCLUDED_ATMEL_SAMD_TIMER_HANDLER_H diff --git a/ports/esp8266/Makefile b/ports/esp8266/Makefile index d38285c91..4f23dfff1 100644 --- a/ports/esp8266/Makefile +++ b/ports/esp8266/Makefile @@ -216,7 +216,8 @@ SRC_QSTR += $(SRC_C) $(SRC_COMMON_HAL_EXPANDED) $(SRC_SHARED_MODULE_EXPANDED) $( # Append any auto-generated sources that are needed by sources listed in SRC_QSTR SRC_QSTR_AUTO_DEPS += -all: $(BUILD)/libaxtls.a $(FWBIN) +all: + @echo "CircuitPython 4.0.0 and later do not support esp8266 boards." CONFVARS_FILE = $(BUILD)/confvars diff --git a/ports/nrf/.gitignore b/ports/nrf/.gitignore index fc9f24b50..cda23c7a9 100644 --- a/ports/nrf/.gitignore +++ b/ports/nrf/.gitignore @@ -1,8 +1,8 @@ # Old Nordic soft devices that don't allow redistribution ######################################################### -bluetooth/s132_nrf52_2.0.1/ +drivers/bluetooth/s132_nrf52_2.0.1/ -!bluetooth/*/*.hex +!drivers/bluetooth/*/*.hex # Build files ##################### diff --git a/ports/nrf/Makefile b/ports/nrf/Makefile index b8d186621..3681ac49e 100755 --- a/ports/nrf/Makefile +++ b/ports/nrf/Makefile @@ -1,3 +1,27 @@ +# This file is part of the MicroPython project, http://micropython.org/ +# +# The MIT License (MIT) +# +# Copyright (c) 2019 Dan Halbert for Adafruit Industries +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + # Select the board to build for. ifeq ($(BOARD),) $(info You must provide a BOARD parameter with 'BOARD=') @@ -11,16 +35,29 @@ else endif CLI_SD := $(SD) - -include boards/$(BOARD)/mpconfigboard.mk - SD_LOWER = $(shell echo $(SD) | tr '[:upper:]' '[:lower:]') # Build directory with SD if it's different from the default. BUILD ?= $(if $(CLI_SD),build-$(BOARD)-$(SD_LOWER),build-$(BOARD)) include ../../py/mkenv.mk --include mpconfigport.mk +# Board-specific +include boards/$(BOARD)/mpconfigboard.mk +# Port-specific +include mpconfigport.mk +# CircuitPython-specific +include $(TOP)/py/circuitpy_mpconfig.mk + +# qstr definitions (must come before including py.mk) +QSTR_DEFS = qstrdefsport.h + +# include py core make definitions +include $(TOP)/py/py.mk + +include $(TOP)/supervisor/supervisor.mk + +# Include make rules and variables common across CircuitPython builds. +include $(TOP)/py/circuitpy_defns.mk ifneq ($(SD), ) include bluetooth/bluetooth_common.mk @@ -28,19 +65,10 @@ endif FROZEN_MPY_DIR = freeze -# include py core make definitions -include ../../py/py.mk - -ifneq ($(MCU_SUB_VARIANT),nrf52840) -USB = FALSE -endif - -include $(TOP)/supervisor/supervisor.mk +CROSS_COMPILE = arm-none-eabi- FATFS_DIR = lib/oofatfs -CROSS_COMPILE = arm-none-eabi- - INC += -I. INC += -I../.. INC += -I$(BUILD) @@ -59,41 +87,51 @@ INC += -I../../lib/mp-readline INC += -I../../lib/tinyusb/src INC += -I../../supervisor/shared/usb +#Debugging/Optimization +ifeq ($(DEBUG), 1) + CFLAGS += -ggdb + # You may want to enable these flags to make setting breakpoints easier. + CFLAGS += -fno-inline -fno-ipa-sra +else + CFLAGS += -Os -DNDEBUG + # TODO: Test with -flto + ### CFLAGS += -flto +endif + + +CFLAGS += $(INC) -Wall -Werror -std=gnu11 -nostdlib $(BASE_CFLAGS) $(CFLAGS_MOD) $(COPT) + +# Undo some warnings. +# nrfx uses undefined preprocessor variables quite casually, so we can't do warning checks for these. +CFLAGS += -Wno-undef +# nrfx does casts that increase alignment requirements. +CFLAGS += -Wno-cast-align + NRF_DEFINES += -DCONFIG_GPIO_AS_PINRESET +CFLAGS += $(NRF_DEFINES) -CFLAGS += -mthumb -mabi=aapcs -fsingle-precision-constant -Wdouble-promotion -CFLAGS += -mtune=cortex-m4 -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -CFLAGS += $(INC) -Wall -Werror -ansi -std=gnu99 -nostdlib $(COPT) $(NRF_DEFINES) $(CFLAGS_MOD) -CFLAGS += -fno-strict-aliasing -CFLAGS += -fstack-usage -fno-builtin -fshort-enums -CFLAGS += -fdata-sections -ffunction-sections +CFLAGS += \ + -mthumb \ + -mabi=aapcs-linux \ + -mfloat-abi=hard \ + -mcpu=cortex-m4 \ + -mfpu=fpv4-sp-d16 + +# TODO: check this CFLAGS += -D__START=main -LDFLAGS = $(CFLAGS) -LDFLAGS += -Xlinker -Map=$(@:.elf=.map) -LDFLAGS += -mthumb -mabi=aapcs -T $(LD_FILE) -L boards/ -LDFLAGS += -Wl,--gc-sections +LDFLAGS = $(CFLAGS) -nostartfiles -fshort-enums -Wl,-nostdlib -Wl,-T,$(LD_FILE) -Wl,-Map=$@.map -Wl,-cref -Wl,-gc-sections -specs=nano.specs +LIBS := -lgcc -lc -# TinyUSB defines -CFLAGS += -DCFG_TUSB_MCU=OPT_MCU_NRF5X -DCFG_TUD_CDC_RX_BUFSIZE=1024 -DCFG_TUD_CDC_TX_BUFSIZE=1024 -DCFG_TUD_MSC_BUFSIZE=4096 +LDFLAGS += -mthumb -mcpu=cortex-m4 -#Debugging/Optimization -ifeq ($(DEBUG), 1) -#ASMFLAGS += -g -gtabs+ -CFLAGS += -O1 -ggdb -LDFLAGS += -O1 -else -CFLAGS += -Os -DNDEBUG -LDFLAGS += -Os +# Use toolchain libm if we're not using our own. +ifndef INTERNAL_LIBM +LIBS += -lm endif -LIBM_FILE_NAME = $(shell $(CC) $(CFLAGS) -print-file-name=libm.a) -LIBC_FILE_NAME = $(shell $(CC) $(CFLAGS) -print-file-name=libc.a) -LIBGCC_FILE_NAME = $(shell $(CC) $(CFLAGS) -print-libgcc-file-name) - -LIBS := -L $(dir $(LIBM_FILE_NAME)) -lm -LIBS += -L $(dir $(LIBC_FILE_NAME)) -lc -LIBS += -L $(dir $(LIBGCC_FILE_NAME)) -lgcc +# TinyUSB defines +CFLAGS += -DCFG_TUSB_MCU=OPT_MCU_NRF5X -DCFG_TUD_CDC_RX_BUFSIZE=1024 -DCFG_TUD_CDC_TX_BUFSIZE=1024 -DCFG_TUD_MSC_BUFSIZE=4096 -DCFG_TUD_MIDI_RX_BUFSIZE=128 -DCFG_TUD_MIDI_TX_BUFSIZE=128 SRC_NRFX = $(addprefix nrfx/,\ drivers/src/nrfx_power.c \ @@ -101,6 +139,7 @@ SRC_NRFX = $(addprefix nrfx/,\ drivers/src/nrfx_timer.c \ drivers/src/nrfx_twim.c \ drivers/src/nrfx_uarte.c \ + drivers/src/nrfx_gpiote.c \ ) ifdef EXTERNAL_FLASH_DEVICES @@ -115,7 +154,6 @@ SRC_C += \ fatfs_port.c \ mphalport.c \ tick.c \ - board_busses.c \ boards/$(BOARD)/board.c \ boards/$(BOARD)/pins.c \ device/$(MCU_VARIANT)/startup_$(MCU_SUB_VARIANT).c \ @@ -139,93 +177,14 @@ SRC_C += \ peripherals/nrf/$(MCU_CHIP)/pins.c \ peripherals/nrf/$(MCU_CHIP)/power.c \ peripherals/nrf/timers.c \ + sd_mutex.c \ supervisor/shared/memory.c - -SRC_COMMON_HAL += \ - analogio/AnalogIn.c \ - analogio/AnalogOut.c \ - analogio/__init__.c \ - board/__init__.c \ - busio/I2C.c \ - busio/SPI.c \ - busio/UART.c \ - busio/__init__.c\ - digitalio/DigitalInOut.c \ - digitalio/__init__.c \ - microcontroller/Pin.c \ - microcontroller/Processor.c \ - microcontroller/__init__.c \ - neopixel_write/__init__.c \ - os/__init__.c \ - pulseio/PWMOut.c \ - pulseio/PulseIn.c \ - pulseio/PulseOut.c \ - pulseio/__init__.c \ - supervisor/Runtime.c \ - supervisor/__init__.c \ - time/__init__.c \ - -ifneq ($(SD), ) -SRC_COMMON_HAL += \ - bleio/__init__.c \ - bleio/Adapter.c \ - bleio/Characteristic.c \ - bleio/Descriptor.c \ - bleio/Device.c \ - bleio/Scanner.c \ - bleio/Service.c \ - bleio/UUID.c -endif - -# These don't have corresponding files in each port but are still located in -# shared-bindings to make it clear what the contents of the modules are. -SRC_BINDINGS_ENUMS = \ - busio/OneWire.c \ - digitalio/Direction.c \ - digitalio/DriveMode.c \ - digitalio/Pull.c \ - microcontroller/RunMode.c \ - help.c \ - math/__init__.c \ - util.c - -ifneq ($(SD), ) -SRC_BINDINGS_ENUMS += \ - bleio/Address.c \ - bleio/AddressType.c \ - bleio/AdvertisementData.c \ - bleio/ScanEntry.c \ - bleio/UUIDType.c -endif - -SRC_SHARED_MODULE = \ - os/__init__.c \ - random/__init__.c \ - struct/__init__.c \ - gamepad/__init__.c \ - gamepad/GamePad.c \ - bitbangio/__init__.c \ - bitbangio/I2C.c \ - bitbangio/OneWire.c \ - bitbangio/SPI.c \ - busio/OneWire.c \ - storage/__init__.c - -# uheap/__init__.c \ - ustack/__init__.c - # USB source files for nrf52840 ifeq ($(MCU_SUB_VARIANT),nrf52840) - SRC_C += \ lib/tinyusb/src/portable/nordic/nrf5x/dcd_nrf5x.c \ lib/tinyusb/src/portable/nordic/nrf5x/hal_nrf5x.c - -SRC_SHARED_MODULE += \ - usb_hid/__init__.c \ - usb_hid/Device.c \ - endif SRC_COMMON_HAL_EXPANDED = $(addprefix shared-bindings/, $(SRC_COMMON_HAL)) \ @@ -242,36 +201,44 @@ FROZEN_MPY_MPY_FILES := $(addprefix $(BUILD)/,$(FROZEN_MPY_PY_FILES:.py=.mpy)) OBJ += $(PY_O) $(SUPERVISOR_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_NRFX:.c=.o)) -OBJ += $(addprefix $(BUILD)/, $(DRIVERS_SRC_C:.c=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_COMMON_HAL_EXPANDED:.c=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_SHARED_MODULE_EXPANDED:.c=.o)) +ifeq ($(INTERNAL_LIBM),1) +OBJ += $(addprefix $(BUILD)/, $(SRC_LIBM:.c=.o)) +endif OBJ += $(addprefix $(BUILD)/, $(SRC_S:.s=.o)) $(BUILD)/$(FATFS_DIR)/ff.o: COPT += -Os $(filter $(PY_BUILD)/../extmod/vfs_fat_%.o, $(PY_O)): COPT += -Os -.phony: all flash sd binary hex +# List of sources for qstr extraction +SRC_QSTR += $(SRC_C) $(SRC_SUPERVISOR) $(SRC_MOD) $(SRC_COMMON_HAL_EXPANDED) $(SRC_SHARED_MODULE_EXPANDED) +# Sources that only hold QSTRs after pre-processing. +SRC_QSTR_PREPROCESSOR += -all: binary hex uf2 -OUTPUT_FILENAME = firmware +all: $(BUILD)/firmware.bin $(BUILD)/firmware.uf2 -## Create binary .bin file from the .out file -binary: $(BUILD)/$(OUTPUT_FILENAME).bin +$(BUILD)/firmware.elf: $(OBJ) + $(STEPECHO) "LINK $@" + $(Q)$(CC) -o $@ $(LDFLAGS) $^ -Wl,--start-group $(LIBS) -Wl,--end-group + $(Q)$(SIZE) $@ | $(PYTHON3) $(TOP)/tools/build_memory_info.py $(LD_FILE) -$(BUILD)/$(OUTPUT_FILENAME).bin: $(BUILD)/$(OUTPUT_FILENAME).elf - $(OBJCOPY) -O binary $< $@ +$(BUILD)/firmware.bin: $(BUILD)/firmware.elf + $(STEPECHO) "Create $@" + $(Q)$(OBJCOPY) -O binary $^ $@ +# $(Q)$(OBJCOPY) -O binary -j .vectors -j .text -j .data $^ $@ -## Create binary .hex file from the .out file -hex: $(BUILD)/$(OUTPUT_FILENAME).hex +$(BUILD)/firmware.hex: $(BUILD)/firmware.elf + $(STEPECHO) "Create $@" + $(Q)$(OBJCOPY) -O ihex $^ $@ +# $(Q)$(OBJCOPY) -O ihex -j .vectors -j .text -j .data $^ $@ + +$(BUILD)/firmware.uf2: $(BUILD)/firmware.hex + $(ECHO) "Create $@" + $(PYTHON3) $(TOP)/tools/uf2/utils/uf2conv.py -f 0xADA52840 -c -o "$(BUILD)/firmware.uf2" $^ -$(BUILD)/$(OUTPUT_FILENAME).hex: $(BUILD)/$(OUTPUT_FILENAME).elf - $(OBJCOPY) -O ihex $< $@ -## Create uf2 file -uf2: $(BUILD)/$(OUTPUT_FILENAME).hex - $(ECHO) "Create $(OUTPUT_FILENAME).uf2" - $(PYTHON2) $(TOP)/tools/uf2/utils/uf2conv.py -f 0xADA52840 -c -o "$(BUILD)/$(OUTPUT_FILENAME).uf2" $^ ##################### # Flash with debugger @@ -281,13 +248,13 @@ FLASHER ?= ifeq ($(FLASHER),) # Also update to bootloader settting to validate application and skip checksum ( app valid = 0x0001, crc = 0x0000 ) -flash: $(BUILD)/$(OUTPUT_FILENAME).hex +flash: $(BUILD)/firmware.hex nrfjprog --program $< --sectorerase -f $(MCU_VARIANT) nrfjprog --erasepage $(BOOT_SETTING_ADDR) -f $(MCU_VARIANT) nrfjprog --memwr $(BOOT_SETTING_ADDR) --val 0x00000001 -f $(MCU_VARIANT) nrfjprog --reset -f $(MCU_VARIANT) -sd: $(BUILD)/$(OUTPUT_FILENAME).hex +sd: $(BUILD)/firmware.hex nrfjprog --eraseall -f $(MCU_VARIANT) nrfjprog --program $(SOFTDEV_HEX) -f $(MCU_VARIANT) nrfjprog --program $< --sectorerase -f $(MCU_VARIANT) @@ -295,13 +262,13 @@ sd: $(BUILD)/$(OUTPUT_FILENAME).hex else ifeq ($(FLASHER), pyocd) -flash: $(BUILD)/$(OUTPUT_FILENAME).hex +flash: $(BUILD)/firmware.hex pyocd-flashtool -t $(MCU_VARIANT) $< --sector_erase #pyocd-tool -t $(MCU_VARIANT) erase $(BOOT_SETTING_ADDR) pyocd-tool -t $(MCU_VARIANT) write32 $(BOOT_SETTING_ADDR) 0x00000001 pyocd-tool -t $(MCU_VARIANT) reset -sd: $(BUILD)/$(OUTPUT_FILENAME).hex +sd: $(BUILD)/firmware.hex pyocd-flashtool -t $(MCU_VARIANT) --chip_erase pyocd-flashtool -t $(MCU_VARIANT) $(SOFTDEV_HEX) pyocd-flashtool -t $(MCU_VARIANT) $< --sector_erase @@ -337,36 +304,13 @@ dfu-flash: $(BUILD)/dfu-package.zip ## Create DFU package file dfu-gen: $(BUILD)/dfu-package.zip -$(BUILD)/dfu-package.zip: $(BUILD)/$(OUTPUT_FILENAME).hex +$(BUILD)/dfu-package.zip: $(BUILD)/firmware.hex $(NRFUTIL) dfu genpkg --sd-req 0xFFFE --dev-type 0x0052 --application $^ $(BUILD)/dfu-package.zip -# You must have $^ here because it deduplicates entries in $(OBJ) -$(BUILD)/$(OUTPUT_FILENAME).elf: $(OBJ) - $(ECHO) "LINK $@" - $(Q)$(CC) $(LDFLAGS) -o $@ $^ -Wl,--start-group $(LIBS) -Wl,--end-group - $(Q)$(SIZE) $@ - -# List of sources for qstr extraction -SRC_QSTR += $(SRC_C) $(SRC_SUPERVISOR) $(SRC_MOD) $(DRIVERS_SRC_C) $(SRC_COMMON_HAL_EXPANDED) $(SRC_SHARED_MODULE_EXPANDED) - -# Append any auto-generated sources that are needed by sources listed in -# SRC_QSTR -SRC_QSTR_AUTO_DEPS += - -AF_FILE = $(MCU_VARIANT)_af.csv -PREFIX_FILE = boards/$(MCU_VARIANT)_prefix.c - -ifneq ($(FROZEN_DIR),) -# To use frozen source modules, put your .py files in a subdirectory (eg scripts/) -# and then invoke make with FROZEN_DIR=scripts (be sure to build from scratch). -CFLAGS += -DMICROPY_MODULE_FROZEN_STR -endif - -ifneq ($(FROZEN_MPY_DIR),) -# To use frozen bytecode, put your .py files in a subdirectory (eg frozen/) and -# then invoke make with FROZEN_MPY_DIR=frozen (be sure to build from scratch). -CFLAGS += -DMICROPY_QSTR_EXTRA_POOL=mp_qstr_frozen_const_pool -CFLAGS += -DMICROPY_MODULE_FROZEN_MPY -endif include $(TOP)/py/mkrules.mk + +# Print out the value of a make variable. +# https://stackoverflow.com/questions/16467718/how-to-print-out-a-variable-in-makefile +print-%: + @echo $* = $($*) diff --git a/ports/nrf/README.md b/ports/nrf/README.md index 11a7b028d..49c9fbe29 100644 --- a/ports/nrf/README.md +++ b/ports/nrf/README.md @@ -22,9 +22,6 @@ This is a port of CircuitPython to the Nordic Semiconductor nRF52 series of chip ## Tested Hardware -* nRF52832 - * [PCA10040](http://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.nrf52%2Fdita%2Fnrf52%2Fdevelopment%2Fnrf52_dev_kit.html) - * [Adafruit Feather nRF52](https://www.adafruit.com/product/3406) * nRF52840 * [PCA10056](http://www.nordicsemi.com/eng/Products/nRF52840-Preview-DK) @@ -36,10 +33,10 @@ the following links: > **NOTE**: These board specific readmes may be more up to date than the generic board-neutral documentation further down. -* Adafruit Feather nRF52: boards/feather_nrf52832/README.md: 512KB Flash, 64KB SRAM -* Adafruit Feather nRF52840: boards/feather_nrf52840_express/README.md: 1MB Flash, 256KB SRAM -* Nordic PCA10056 (uses nRF52840): boards/pca10056/README.md -* MakerDiary NRF52840 MDK: boards/makerdiary_nrf52840_mdk/README.md +* Adafruit Feather nRF52840: `boards/feather_nrf52840_express/README.md`: 1MB Flash, 256KB SRAM +* Nordic PCA10056 (uses nRF52840): `boards/pca10056/README.md` +* MakerDiary nRF52840 MDK: `boards/makerdiary_nrf52840_mdk/README.md` +* MakerDiary nRF52840 MDK USB Dongle: `boards/makerdiary_nrf52840_mdk_usb_dongle/README.md` For all other board targets, see the generic notes below. @@ -77,11 +74,10 @@ Note: further tuning of features to include in bluetooth or even setting up the Target Board (BOARD) | Bluetooth Stack (SD) | Bluetooth Support | Flash Util -------------------------|-------------------------|------------------------|------------------------------- -pca10040 | s132 | Peripheral and Scanner | [Segger](#segger-targets) pca10056 | s140 | Peripheral and Scanner | [Segger](#segger-targets) -feather_nrf52832 | s132 | Peripheral and Scanner | [UART DFU](#dfu-targets) feather_nrf52840_express | s140 | Peripheral and Scanner | UF2 bootloader makerdiary_nrf52840_mdk | s140 | Peripheral and Scanner | pyocd or ARM mbed DAPLink +makerdiary_nrf52840_mdk_usb_dongle | s140 | Peripheral and Scanner | DFU bootloader & nrfutil ## Segger Targets @@ -109,10 +105,10 @@ run follow command to install [adafruit-nrfutil](https://github.com/adafruit/Ada * dfu-gen: Generates a Firmware zip to be used by the DFU flash application. * dfu-flash: Triggers the DFU flash application to upload the firmware from the generated Firmware zip file. -Example on how to generate and flash feather_nrf52832 target: +Example on how to generate and flash feather_nrf52840 target: - make BOARD=feather_nrf52832 SD=s132 - make BOARD=feather_nrf52832 SD=s132 dfu-gen dfu-flash + make BOARD=feather_nrf52840 SD=s140 + make BOARD=feather_nrf52840 SD=s140 dfu-gen dfu-flash ## Bluetooth LE REPL diff --git a/ports/nrf/background.c b/ports/nrf/background.c index f022b5bc9..ea6e846b3 100644 --- a/ports/nrf/background.c +++ b/ports/nrf/background.c @@ -24,15 +24,22 @@ * THE SOFTWARE. */ -#ifdef NRF52840 +#include "py/runtime.h" +#include "supervisor/filesystem.h" #include "supervisor/usb.h" -#endif - #include "supervisor/shared/stack.h" +#ifdef CIRCUITPY_DISPLAYIO +#include "shared-module/displayio/__init__.h" +#endif + void run_background_tasks(void) { - #ifdef NRF52840 - usb_background(); + filesystem_background(); + usb_background(); + + #ifdef CIRCUITPY_DISPLAYIO + displayio_refresh_displays(); #endif + assert_heap_ok(); } diff --git a/ports/nrf/bluetooth/ble_drv.c b/ports/nrf/bluetooth/ble_drv.c index 0b6daf711..f6e575a8c 100644 --- a/ports/nrf/bluetooth/ble_drv.c +++ b/ports/nrf/bluetooth/ble_drv.c @@ -32,49 +32,87 @@ #include "ble_drv.h" #include "nrf_nvic.h" #include "nrf_sdm.h" +#include "nrf_soc.h" +#include "nrfx_power.h" #include "py/misc.h" +#include "py/mpstate.h" nrf_nvic_state_t nrf_nvic_state = { 0 }; +// Flag indicating progress of internal flash operation. +sd_flash_operation_status_t sd_flash_operation_status; + __attribute__((aligned(4))) static uint8_t m_ble_evt_buf[sizeof(ble_evt_t) + (BLE_GATT_ATT_MTU_DEFAULT)]; -typedef struct event_handler { - struct event_handler *next; - void *param; - ble_drv_evt_handler_t func; -} event_handler_t; - -static event_handler_t *m_event_handlers; +void ble_drv_reset() { + // Linked list items will be gc'd. + MP_STATE_VM(ble_drv_evt_handler_entries) = NULL; + sd_flash_operation_status = SD_FLASH_OPERATION_DONE; +} void ble_drv_add_event_handler(ble_drv_evt_handler_t func, void *param) { - event_handler_t *handler = m_new_ll(event_handler_t, 1); - handler->next = NULL; + ble_drv_evt_handler_entry_t *it = MP_STATE_VM(ble_drv_evt_handler_entries); + while (it != NULL) { + // If event handler and its corresponding param are already on the list, don't add again. + if ((it->func == func) && (it->param == param)) { + return; + } + it = it->next; + } + + // Add a new handler to the front of the list + ble_drv_evt_handler_entry_t *handler = m_new_ll(ble_drv_evt_handler_entry_t, 1); + handler->next = MP_STATE_VM(ble_drv_evt_handler_entries); handler->param = param; handler->func = func; - if (m_event_handlers == NULL) { - m_event_handlers = handler; - return; - } + MP_STATE_VM(ble_drv_evt_handler_entries) = handler; +} - event_handler_t *it = m_event_handlers; - while (it->next != NULL) { +void ble_drv_remove_event_handler(ble_drv_evt_handler_t func, void *param) { + ble_drv_evt_handler_entry_t *it = MP_STATE_VM(ble_drv_evt_handler_entries); + ble_drv_evt_handler_entry_t **prev = &MP_STATE_VM(ble_drv_evt_handler_entries); + while (it != NULL) { if ((it->func == func) && (it->param == param)) { - m_free(handler); + // Splice out the matching handler. + *prev = it->next; return; } - + prev = &(it->next); it = it->next; } - - it->next = handler; } +extern void tusb_hal_nrf_power_event (uint32_t event); + void SD_EVT_IRQHandler(void) { uint32_t evt_id; while (sd_evt_get(&evt_id) != NRF_ERROR_NOT_FOUND) { -// sd_evt_handler(evt_id); + switch (evt_id) { + // usb power event + case NRF_EVT_POWER_USB_DETECTED: + case NRF_EVT_POWER_USB_POWER_READY: + case NRF_EVT_POWER_USB_REMOVED: { + int32_t usbevt = (evt_id == NRF_EVT_POWER_USB_DETECTED ) ? NRFX_POWER_USB_EVT_DETECTED: + (evt_id == NRF_EVT_POWER_USB_POWER_READY) ? NRFX_POWER_USB_EVT_READY : + (evt_id == NRF_EVT_POWER_USB_REMOVED ) ? NRFX_POWER_USB_EVT_REMOVED : -1; + + tusb_hal_nrf_power_event(usbevt); + } + break; + + // Set flag indicating that a flash operation has finished. + case NRF_EVT_FLASH_OPERATION_SUCCESS: + sd_flash_operation_status = SD_FLASH_OPERATION_DONE; + break; + case NRF_EVT_FLASH_OPERATION_ERROR: + sd_flash_operation_status = SD_FLASH_OPERATION_ERROR; + break; + + default: + break; + } } while (1) { @@ -88,7 +126,7 @@ void SD_EVT_IRQHandler(void) { break; } - event_handler_t *it = m_event_handlers; + ble_drv_evt_handler_entry_t *it = MP_STATE_VM(ble_drv_evt_handler_entries); while (it != NULL) { it->func((ble_evt_t *)m_ble_evt_buf, it->param); it = it->next; diff --git a/ports/nrf/bluetooth/ble_drv.h b/ports/nrf/bluetooth/ble_drv.h index 0443b41b8..cdb4c9b03 100644 --- a/ports/nrf/bluetooth/ble_drv.h +++ b/ports/nrf/bluetooth/ble_drv.h @@ -43,11 +43,30 @@ #define BLE_CONN_CFG_TAG_CUSTOM 1 #define MSEC_TO_UNITS(TIME, RESOLUTION) (((TIME) * 1000) / (RESOLUTION)) +// 0.625 msecs (625 usecs) +#define ADV_INTERVAL_UNIT_FLOAT_SECS (0.000625) #define UNIT_0_625_MS (625) #define UNIT_10_MS (10000) typedef void (*ble_drv_evt_handler_t)(ble_evt_t*, void*); +typedef enum { + SD_FLASH_OPERATION_DONE, + SD_FLASH_OPERATION_IN_PROGRESS, + SD_FLASH_OPERATION_ERROR, +} sd_flash_operation_status_t; + +// Flag indicating progress of internal flash operation. +extern sd_flash_operation_status_t sd_flash_operation_status; + +typedef struct ble_drv_evt_handler_entry { + struct ble_drv_evt_handler_entry *next; + void *param; + ble_drv_evt_handler_t func; +} ble_drv_evt_handler_entry_t; + +void ble_drv_reset(void); void ble_drv_add_event_handler(ble_drv_evt_handler_t func, void *param); +void ble_drv_remove_event_handler(ble_drv_evt_handler_t func, void *param); #endif // MICROPY_INCLUDED_NRF_BLUETOOTH_BLE_DRV_H diff --git a/ports/nrf/bluetooth/bluetooth_common.mk b/ports/nrf/bluetooth/bluetooth_common.mk index 760955200..67b779c90 100644 --- a/ports/nrf/bluetooth/bluetooth_common.mk +++ b/ports/nrf/bluetooth/bluetooth_common.mk @@ -1,12 +1,4 @@ -ifeq ($(SD), s132) - CFLAGS += -DBLUETOOTH_SD=132 - -ifeq ($(SOFTDEV_VERSION), 2.0.1) - CFLAGS += -DBLE_API_VERSION=2 -else ifeq ($(SOFTDEV_VERSION), 5.0.0) - CFLAGS += -DBLE_API_VERSION=4 -endif -else ifeq ($(SD), s140) +ifeq ($(SD), s140) CFLAGS += -DBLUETOOTH_SD=140 CFLAGS += -DBLE_API_VERSION=4 else @@ -14,6 +6,7 @@ $(error Incorrect softdevice set flag) endif CFLAGS += -DBLUETOOTH_SD_DEBUG=1 +CFLAGS += -DSOFTDEVICE_PRESENT INC += -Ibluetooth/$(SD)_$(MCU_VARIANT)_$(SOFTDEV_VERSION)/$(SD)_$(MCU_VARIANT)_$(SOFTDEV_VERSION)_API/include INC += -Ibluetooth/$(SD)_$(MCU_VARIANT)_$(SOFTDEV_VERSION)/$(SD)_$(MCU_VARIANT)_$(SOFTDEV_VERSION)_API/include/$(MCU_VARIANT) diff --git a/ports/nrf/bluetooth/download_ble_stack.sh b/ports/nrf/bluetooth/download_ble_stack.sh deleted file mode 100755 index 7e35c0680..000000000 --- a/ports/nrf/bluetooth/download_ble_stack.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash - -function download_s132_nrf52_2_0_1 -{ - echo "" - echo "####################################" - echo "### Downloading s132_nrf52_2.0.1 ###" - echo "####################################" - echo "" - - mkdir -p "${1}/s132_nrf52_2.0.1" - cd "${1}/s132_nrf52_2.0.1" - wget https://www.nordicsemi.com/api/sitecore/Products/MedialibraryZipDownload2 --post-data="ids=863031714A574444AADFE444EBE5BA9B|&fileName=DeviceDownload" -O temp.zip - unzip -u temp.zip - unzip -u s132nrf52201.zip - rm temp.zip s132nrf52201.zip - cd - -} - -SCRIPT_DIR="$(cd -P "$(dirname "${BASH_SOURCE[0]}")" && pwd)" - -if [ $# -eq 0 ]; then - echo "No Bluetooth LE stack defined, downloading all." - download_s132_nrf52_2_0_1 "${SCRIPT_DIR}" -else - case $1 in - "s132_nrf52_2_0_1" ) - download_s132_nrf52_2_0_1 "${SCRIPT_DIR}" ;; - esac -fi - -exit 0 diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API-update.diff b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API-update.diff deleted file mode 100644 index f9b5fc8f7..000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API-update.diff +++ /dev/null @@ -1,1550 +0,0 @@ -|-----------------------------------------------------------------------------| -| 2 Mbps PHY Support | -|-----------------------------------------------------------------------------| - -//| -//| Bitfield for PHYs used by PHY commands and events below -//| -+/**@defgroup BLE_GAP_PHYS GAP PHYs -+ * @{ */ -+#define BLE_GAP_PHY_AUTO 0x00 /**< Automatic PHY selection. Refer @ref sd_ble_gap_phy_update for more information.*/ -+#define BLE_GAP_PHY_1MBPS 0x01 /**< 1 Mbps PHY. */ -+#define BLE_GAP_PHY_2MBPS 0x02 /**< 2 Mbps PHY. */ -+#define BLE_GAP_PHY_CODED 0x04 /**< Coded PHY. */ -+ -+/**@} */ - - -//| -//| PHY Update event: Notifies the application that the PHY has been changed, or that a PHY update -//| procedure is requested but the PHY is not changed. -//| -//| PHY Update Request event: Notifies the application that the peer has initiated a PHY Update Procedure. -//| Application must respond to this event with a SD_BLE_GAP_PHY_UPDATE command providing its PHY preferences, -//| otherwise the PHY Update procedure will time out. -//| - enum BLE_GAP_EVTS - { - BLE_GAP_EVT_SEC_REQUEST, /**< Security Request. \n See @ref ble_gap_evt_sec_request_t. */ - BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST, /**< Connection Parameter Update Request. \n Reply with @ref sd_ble_gap_conn_param_update. \n See @ref ble_gap_evt_conn_param_update_request_t. */ - BLE_GAP_EVT_SCAN_REQ_REPORT, /**< Scan request report. \n See @ref ble_gap_evt_scan_req_report_t. */ -- BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST, /**< Data Length Update request. \n Reply with @ref sd_ble_gap_data_length_update.\n See @ref ble_gap_evt_data_length_update_request_t. */ -+ BLE_GAP_EVT_PHY_UPDATE_REQUEST, /**< PHY Update Request. \n Reply with @ref sd_ble_gap_phy_update. \n See @ref ble_gap_evt_phy_update_request_t. */ -+ BLE_GAP_EVT_PHY_UPDATE, /**< PHY Update Procedure is complete. \n See @ref ble_gap_evt_phy_update_t. */ -+ BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST, /**< Data Length Update Request. \n Reply with @ref sd_ble_gap_data_length_update.\n See @ref ble_gap_evt_data_length_update_request_t. */ - BLE_GAP_EVT_DATA_LENGTH_UPDATE, /**< LL Data Channel PDU payload length updated. \n See @ref ble_gap_evt_data_length_update_t. */ - }; - - -+/**@brief PHY preferences for TX and RX -+ * @note tx_phys and rx_phys are bit fields. Multiple bits can be set in them to indicate multiple preferred PHYs for each direction. -+ * @code -+ * p_gap_phys->tx_phys = BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS; -+ * p_gap_phys->rx_phys = BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS; -+ * @endcode -+ * -+ */ -+typedef struct -+{ -+ uint8_t tx_phys; /**< Preferred transmit PHYs, see @ref BLE_GAP_PHYS. */ -+ uint8_t rx_phys; /**< Preferred receive PHYs, see @ref BLE_GAP_PHYS. */ -+} ble_gap_phys_t; -+ - -+/**@brief Event structure for @ref BLE_GAP_EVT_PHY_UPDATE_REQUEST. */ -+typedef struct -+{ -+ ble_gap_phys_t peer_preferred_phys; /**< The PHYs the peer prefers to use. */ -+} ble_gap_evt_phy_update_request_t; -+ -+/**@brief Event Structure for @ref BLE_GAP_EVT_PHY_UPDATE. */ -+typedef struct -+{ -+ uint8_t status; /**< Status of the procedure, see @ref BLE_HCI_STATUS_CODES.*/ -+ uint8_t tx_phy; /**< TX PHY for this connection, see @ref BLE_GAP_PHYS. */ -+ uint8_t rx_phy; /**< RX PHY for this connection, see @ref BLE_GAP_PHYS. */ -+} ble_gap_evt_phy_update_t; - - typedef struct - { - uint16_t conn_handle; /**< Connection Handle on which event occurred. */ - union /**< union alternative identified by evt_id in enclosing struct. */ - { - ble_gap_evt_conn_param_update_request_t conn_param_update_request; /**< Connection Parameter Update Parameters. */ -- ble_gap_evt_scan_req_report_t scan_req_report; /**< Scan Request Report parameters. */ -+ ble_gap_evt_scan_req_report_t scan_req_report; /**< Scan Request Report Parameters. */ -+ ble_gap_evt_phy_update_request_t phy_update_request; /**< PHY Update Request Event Parameters. */ -+ ble_gap_evt_phy_update_t phy_update; /**< PHY Update Parameters. */ - ble_gap_evt_data_length_update_request_t data_length_update_request; /**< Data Length Update Request Event Parameters. */ - ble_gap_evt_data_length_update_t data_length_update; /**< Data Length Update Event Parameters. */ - } params; /**< Event Parameters. */ - } ble_gap_evt_t; - -//| -//| PHY Update command. Use for initiating or responding to a PHY Update Procedure. -//| Either the master or the slave must call this function for the PHY to be changed. -//| - enum BLE_GAP_SVCS - { - SD_BLE_GAP_CONNECT, /**< Connect. */ - SD_BLE_GAP_CONNECT_CANCEL, /**< Cancel ongoing connection procedure. */ - SD_BLE_GAP_RSSI_GET, /**< Get the last RSSI sample. */ -+ SD_BLE_GAP_PHY_UPDATE, /**< Initiate or respond to a PHY Update Procedure. */ - SD_BLE_GAP_DATA_LENGTH_UPDATE, /**< Initiate or respond to a Data Length Update Procedure. */ - }; - - -+/**@brief Initiate or respond to a PHY Update Procedure -+ * -+ * @details This function is used to initiate or respond to a PHY Update Procedure. It will always generate a -+ * @ref BLE_GAP_EVT_PHY_UPDATE event if successfully executed. If @ref ble_gap_phys_t::tx_phys or @ref ble_gap_phys_t::rx_phys -+ * is @ref BLE_GAP_PHY_AUTO, then the stack will select a PHY for the respective direction based on the peer's PHY preferences -+ * and the local stack configuration. If the peer does not support the PHY Update Procedure, then the -+ * resulting @ref BLE_GAP_EVT_PHY_UPDATE event will have a status set to -+ * @ref BLE_HCI_UNSUPPORTED_REMOTE_FEATURE. -+ * If the PHY procedure was rejected by the peer due to a procedure collision, the status will be -+ * @ref BLE_HCI_STATUS_CODE_LMP_ERROR_TRANSACTION_COLLISION or @ref BLE_HCI_DIFFERENT_TRANSACTION_COLLISION. -+ * If the peer responds to the PHY Update procedure with invalid parameters, the status will be @ref BLE_HCI_STATUS_CODE_INVALID_LMP_PARAMETERS. -+ * If the PHY procedure was rejected by the peer for a different reason, the status will contain the reason as specified by the peer. -+ * -+ * @events -+ * @event{@ref BLE_GAP_EVT_PHY_UPDATE, Result of the PHY Update Procedure.} -+ * @endevents -+ * -+ * @mscs -+ * @mmsc{@ref BLE_GAP_CENTRAL_PHY_UPDATE} -+ * @mmsc{@ref BLE_GAP_PERIPHERAL_PHY_UPDATE} -+ * @endmscs -+ * -+ * @param[in] conn_handle Connection handle to indicate the connection for which the PHY Update is requested. -+ * @param[in] p_gap_phys Pointer to PHY structure. -+ * -+ * @retval ::NRF_SUCCESS Successfully requested a PHY Update. -+ * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. -+ * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. -+ * @retval ::NRF_ERROR_INVALID_PARAM Unsupported PHYs supplied to the call. -+ * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. -+ * @retval ::NRF_ERROR_BUSY Procedure is already in progress or not allowed at this time. Process pending events and wait for the pending procedure to complete and retry. -+ * -+ */ -+SVCALL(SD_BLE_GAP_PHY_UPDATE, uint32_t, sd_ble_gap_phy_update(uint16_t conn_handle, ble_gap_phys_t const *p_gap_phys)); -+ - - -//| -//| New BLE HCI status code -//| -+#define BLE_HCI_STATUS_CODE_LMP_ERROR_TRANSACTION_COLLISION 0x23 /**< LMP Error Transaction Collision/LL Procedure Collision. */ - -|-----------------------------------------------------------------------------| -| Connection-Oriented Channels in LE Credit Based Flow Control Mode | -|-----------------------------------------------------------------------------| - -//| -//| New L2CAP specific connection configuration ID -//| - enum BLE_CONN_CFGS - { - BLE_CONN_CFG_GAP = BLE_CONN_CFG_BASE, /**< BLE GAP specific connection configuration. */ - BLE_CONN_CFG_GATTC, /**< BLE GATTC specific connection configuration. */ - BLE_CONN_CFG_GATTS, /**< BLE GATTS specific connection configuration. */ - BLE_CONN_CFG_GATT, /**< BLE GATT specific connection configuration. */ -+ BLE_CONN_CFG_L2CAP, /**< BLE L2CAP specific connection configuration. */ - }; - - -//| -//| New L2CAP originated event -//| - typedef struct - { - ble_evt_hdr_t header; /**< Event header. */ - union - { - ble_common_evt_t common_evt; /**< Common Event, evt_id in BLE_EVT_* series. */ - ble_gap_evt_t gap_evt; /**< GAP originated event, evt_id in BLE_GAP_EVT_* series. */ - ble_gattc_evt_t gattc_evt; /**< GATT client originated event, evt_id in BLE_GATTC_EVT* series. */ - ble_gatts_evt_t gatts_evt; /**< GATT server originated event, evt_id in BLE_GATTS_EVT* series. */ -+ ble_l2cap_evt_t l2cap_evt; /**< L2CAP originated event, evt_id in BLE_L2CAP_EVT* series. */ - } evt; /**< Event union. */ - } ble_evt_t; - - -//| -//| New L2CAP connection configuration -//| - typedef struct - { - uint8_t conn_cfg_tag; /**< The application chosen tag it can use with the @ref sd_ble_gap_adv_start() and @ref sd_ble_gap_connect() - calls to select this configuration when creating a connection. - Must be different for all connection configurations added and not @ref BLE_CONN_CFG_TAG_DEFAULT. */ - union { - ble_gap_conn_cfg_t gap_conn_cfg; /**< GAP connection configuration, cfg_id is @ref BLE_CONN_CFG_GAP. */ - ble_gattc_conn_cfg_t gattc_conn_cfg; /**< GATTC connection configuration, cfg_id is @ref BLE_CONN_CFG_GATTC. */ - ble_gatts_conn_cfg_t gatts_conn_cfg; /**< GATTS connection configuration, cfg_id is @ref BLE_CONN_CFG_GATTS. */ - ble_gatt_conn_cfg_t gatt_conn_cfg; /**< GATT connection configuration, cfg_id is @ref BLE_CONN_CFG_GATT. */ -+ ble_l2cap_conn_cfg_t l2cap_conn_cfg; /**< L2CAP connection configuration, cfg_id is @ref BLE_CONN_CFG_L2CAP. */ - } params; /**< Connection configuration union. */ - } ble_conn_cfg_t; - -//| -//| API additions related to Connection-Oriented Channels -//| -+/**@addtogroup BLE_L2CAP_TERMINOLOGY Terminology -+ * @{ -+ * @details -+ * -+ * L2CAP SDU -+ * - A data unit that the application can send/receive to/from a peer. -+ * -+ * L2CAP PDU -+ * - A data unit that is exchanged between local and remote L2CAP entities. -+ * It consists of L2CAP protocol control information and payload fields. -+ * The payload field can contain an L2CAP SDU or a part of an L2CAP SDU. -+ * -+ * L2CAP MTU -+ * - The maximum length of an L2CAP SDU. -+ * -+ * L2CAP MPS -+ * - The maximum length of an L2CAP PDU payload field. -+ * -+ * Credits -+ * - A value indicating the number of L2CAP PDUs that the receiver of the credit can send to the peer. -+ * @} */ -+ -+/**@addtogroup BLE_L2CAP_ENUMERATIONS Enumerations -+ * @{ */ -+ -+/**@brief L2CAP API SVC numbers. */ -+enum BLE_L2CAP_SVCS -+{ -+ SD_BLE_L2CAP_CH_SETUP = BLE_L2CAP_SVC_BASE, /**< Set up an L2CAP channel. */ -+ SD_BLE_L2CAP_CH_RELEASE, /**< Release an L2CAP channel. */ -+ SD_BLE_L2CAP_CH_RX, /**< Receive an SDU on an L2CAP channel. */ -+ SD_BLE_L2CAP_CH_TX, /**< Transmit an SDU on an L2CAP channel. */ -+ SD_BLE_L2CAP_CH_FLOW_CONTROL, /**< Advanced SDU reception flow control. */ -+}; -+ -+/**@brief L2CAP Event IDs. */ -+enum BLE_L2CAP_EVTS -+{ -+ BLE_L2CAP_EVT_CH_SETUP_REQUEST = BLE_L2CAP_EVT_BASE, /**< L2CAP Channel Setup Request event. -+ \n See @ref ble_l2cap_evt_ch_setup_request_t. */ -+ BLE_L2CAP_EVT_CH_SETUP_REFUSED, /**< L2CAP Channel Setup Refused event. -+ \n See @ref ble_l2cap_evt_ch_setup_refused_t. */ -+ BLE_L2CAP_EVT_CH_SETUP, /**< L2CAP Channel Setup Completed event. -+ \n See @ref ble_l2cap_evt_ch_setup_t. */ -+ BLE_L2CAP_EVT_CH_RELEASED, /**< L2CAP Channel Released event. -+ \n No additional event structure applies. */ -+ BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED, /**< L2CAP Channel SDU data buffer released event. -+ \n See @ref ble_l2cap_evt_ch_sdu_buf_released_t. */ -+ BLE_L2CAP_EVT_CH_CREDIT, /**< L2CAP Channel Credit received. -+ \n See @ref ble_l2cap_evt_ch_credit_t. */ -+ BLE_L2CAP_EVT_CH_RX, /**< L2CAP Channel SDU received. -+ \n See @ref ble_l2cap_evt_ch_rx_t. */ -+ BLE_L2CAP_EVT_CH_TX, /**< L2CAP Channel SDU transmitted. -+ \n See @ref ble_l2cap_evt_ch_tx_t. */ -+}; -+ -+/** @} */ -+ - /**@addtogroup BLE_L2CAP_DEFINES Defines - * @{ */ - -+/**@brief Maximum number of L2CAP channels per connection. */ -+#define BLE_L2CAP_CH_COUNT_MAX (64) -+ -+/**@brief Minimum L2CAP MTU, in bytes. */ -+#define BLE_L2CAP_MTU_MIN (23) -+ -+/**@brief Minimum L2CAP MPS, in bytes. */ -+#define BLE_L2CAP_MPS_MIN (23) -+ -+/**@brief Invalid CID. */ -+#define BLE_L2CAP_CID_INVALID (0x0000) -+ -+/**@brief Default number of credits for @ref sd_ble_l2cap_ch_flow_control. */ -+#define BLE_L2CAP_CREDITS_DEFAULT (1) -+ -+/**@defgroup BLE_L2CAP_CH_SETUP_REFUSED_SRCS L2CAP channel setup refused sources -+ * @{ */ -+#define BLE_L2CAP_CH_SETUP_REFUSED_SRC_LOCAL (0x01) /**< Local. */ -+#define BLE_L2CAP_CH_SETUP_REFUSED_SRC_REMOTE (0x02) /**< Remote. */ -+ /** @} */ -+ -+ /** @defgroup BLE_L2CAP_CH_STATUS_CODES L2CAP channel status codes -+ * @{ */ -+#define BLE_L2CAP_CH_STATUS_CODE_SUCCESS (0x0000) /**< Success. */ -+#define BLE_L2CAP_CH_STATUS_CODE_LE_PSM_NOT_SUPPORTED (0x0002) /**< LE_PSM not supported. */ -+#define BLE_L2CAP_CH_STATUS_CODE_NO_RESOURCES (0x0004) /**< No resources available. */ -+#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_AUTHENTICATION (0x0005) /**< Insufficient authentication. */ -+#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_AUTHORIZATION (0x0006) /**< Insufficient authorization. */ -+#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_ENC_KEY_SIZE (0x0007) /**< Insufficient encryption key size. */ -+#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_ENC (0x0008) /**< Insufficient encryption. */ -+#define BLE_L2CAP_CH_STATUS_CODE_INVALID_SCID (0x0009) /**< Invalid Source CID. */ -+#define BLE_L2CAP_CH_STATUS_CODE_SCID_ALLOCATED (0x000A) /**< Source CID already allocated. */ -+#define BLE_L2CAP_CH_STATUS_CODE_UNACCEPTABLE_PARAMS (0x000B) /**< Unacceptable parameters. */ -+#define BLE_L2CAP_CH_STATUS_CODE_NOT_UNDERSTOOD (0x8000) /**< Command Reject received instead of LE Credit Based Connection Response. */ -+#define BLE_L2CAP_CH_STATUS_CODE_TIMEOUT (0xC000) /**< Operation timed out. */ -+/** @} */ -+ -+/** @} */ -+ -+/**@addtogroup BLE_L2CAP_STRUCTURES Structures -+ * @{ */ -+ -+/** -+ * @brief BLE L2CAP connection configuration parameters, set with @ref sd_ble_cfg_set. -+ * -+ * @note These parameters are set per connection, so all L2CAP channels created on this connection -+ * will have the same parameters. -+ * -+ * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: -+ * - rx_mps is smaller than @ref BLE_L2CAP_MPS_MIN. -+ * - tx_mps is smaller than @ref BLE_L2CAP_MPS_MIN. -+ * - ch_count is greater than @ref BLE_L2CAP_CH_COUNT_MAX. -+ * @retval ::NRF_ERROR_NO_MEM rx_mps or tx_mps is set too high. -+ */ -+typedef struct -+{ -+ uint16_t rx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall -+ be able to receive on L2CAP channels on connections with this -+ configuration. The minimum value is @ref BLE_L2CAP_MPS_MIN. */ -+ uint16_t tx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall -+ be able to transmit on L2CAP channels on connections with this -+ configuration. The minimum value is @ref BLE_L2CAP_MPS_MIN. */ -+ uint8_t rx_queue_size; /**< Number of SDU data buffers that can be queued for reception per -+ L2CAP channel. The minimum value is one. */ -+ uint8_t tx_queue_size; /**< Number of SDU data buffers that can be queued for transmission -+ per L2CAP channel. The minimum value is one. */ -+ uint8_t ch_count; /**< Number of L2CAP channels the application can create per connection -+ with this configuration. The default value is zero, the maximum -+ value is @ref BLE_L2CAP_CH_COUNT_MAX. -+ @note if this parameter is set to zero, all other parameters in -+ @ref ble_l2cap_conn_cfg_t are ignored. */ -+} ble_l2cap_conn_cfg_t; -+ -+/**@brief L2CAP channel RX parameters. */ -+typedef struct -+{ -+ uint16_t rx_mtu; /**< The maximum L2CAP SDU size, in bytes, that L2CAP shall be able to -+ receive on this L2CAP channel. -+ - Must be equal to or greater than @ref BLE_L2CAP_MTU_MIN. */ -+ uint16_t rx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall be -+ able to receive on this L2CAP channel. -+ - Must be equal to or greater than @ref BLE_L2CAP_MPS_MIN. -+ - Must be equal to or less than @ref ble_l2cap_conn_cfg_t::rx_mps. */ -+ ble_data_t sdu_buf; /**< SDU data buffer for reception. -+ - If @ref ble_data_t::p_data is non-NULL, initial credits are -+ issued to the peer. -+ - If @ref ble_data_t::p_data is NULL, no initial credits are -+ issued to the peer. */ -+} ble_l2cap_ch_rx_params_t; -+ -+/**@brief L2CAP channel setup parameters. */ -+typedef struct -+{ -+ ble_l2cap_ch_rx_params_t rx_params; /**< L2CAP channel RX parameters. */ -+ uint16_t le_psm; /**< LE Protocol/Service Multiplexer. Used when requesting -+ setup of an L2CAP channel, ignored otherwise. */ -+ uint16_t status; /**< Status code, see @ref BLE_L2CAP_CH_STATUS_CODES. -+ Used when replying to a setup request of an L2CAP -+ channel, ignored otherwise. */ -+} ble_l2cap_ch_setup_params_t; -+ -+/**@brief L2CAP channel TX parameters. */ -+typedef struct -+{ -+ uint16_t tx_mtu; /**< The maximum L2CAP SDU size, in bytes, that L2CAP is able to -+ transmit on this L2CAP channel. */ -+ uint16_t peer_mps; /**< The maximum L2CAP PDU payload size, in bytes, that the peer is -+ able to receive on this L2CAP channel. */ -+ uint16_t tx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP is able -+ to transmit on this L2CAP channel. This is effective tx_mps, -+ selected by the SoftDevice as -+ MIN( @ref ble_l2cap_ch_tx_params_t::peer_mps, @ref ble_l2cap_conn_cfg_t::tx_mps ) */ -+ uint16_t credits; /**< Initial credits given by the peer. */ -+} ble_l2cap_ch_tx_params_t; -+ -+/**@brief L2CAP Channel Setup Request event. */ -+typedef struct -+{ -+ ble_l2cap_ch_tx_params_t tx_params; /**< L2CAP channel TX parameters. */ -+ uint16_t le_psm; /**< LE Protocol/Service Multiplexer. */ -+} ble_l2cap_evt_ch_setup_request_t; -+ -+/**@brief L2CAP Channel Setup Refused event. */ -+typedef struct -+{ -+ uint8_t source; /**< Source, see @ref BLE_L2CAP_CH_SETUP_REFUSED_SRCS */ -+ uint16_t status; /**< Status code, see @ref BLE_L2CAP_CH_STATUS_CODES */ -+} ble_l2cap_evt_ch_setup_refused_t; -+ -+/**@brief L2CAP Channel Setup Completed event. */ -+typedef struct -+{ -+ ble_l2cap_ch_tx_params_t tx_params; /**< L2CAP channel TX parameters. */ -+} ble_l2cap_evt_ch_setup_t; -+ -+/**@brief L2CAP Channel SDU Data Duffer Released event. */ -+typedef struct -+{ -+ ble_data_t sdu_buf; /**< Returned reception or transmission SDU data buffer. The SoftDevice -+ returns SDU data buffers supplied by the application, which have -+ not yet been returned previously via a @ref BLE_L2CAP_EVT_CH_RX or -+ @ref BLE_L2CAP_EVT_CH_TX event. */ -+} ble_l2cap_evt_ch_sdu_buf_released_t; -+ -+/**@brief L2CAP Channel Credit received event. */ -+typedef struct -+{ -+ uint16_t credits; /**< Additional credits given by the peer. */ -+} ble_l2cap_evt_ch_credit_t; -+ -+/**@brief L2CAP Channel received SDU event. */ -+typedef struct -+{ -+ uint16_t sdu_len; /**< Total SDU length, in bytes. */ -+ ble_data_t sdu_buf; /**< SDU data buffer. -+ @note If there is not enough space in the buffer -+ (sdu_buf.len < sdu_len) then the rest of the SDU will be -+ silently discarded by the SoftDevice. */ -+} ble_l2cap_evt_ch_rx_t; -+ -+/**@brief L2CAP Channel transmitted SDU event. */ -+typedef struct -+{ -+ ble_data_t sdu_buf; /**< SDU data buffer. */ -+} ble_l2cap_evt_ch_tx_t; -+ -+/**@brief L2CAP event structure. */ -+typedef struct -+{ -+ uint16_t conn_handle; /**< Connection Handle on which the event occured. */ -+ uint16_t local_cid; /**< Local Channel ID of the L2CAP channel, or -+ @ref BLE_L2CAP_CID_INVALID if not present. */ -+ union -+ { -+ ble_l2cap_evt_ch_setup_request_t ch_setup_request; /**< L2CAP Channel Setup Request Event Parameters. */ -+ ble_l2cap_evt_ch_setup_refused_t ch_setup_refused; /**< L2CAP Channel Setup Refused Event Parameters. */ -+ ble_l2cap_evt_ch_setup_t ch_setup; /**< L2CAP Channel Setup Completed Event Parameters. */ -+ ble_l2cap_evt_ch_sdu_buf_released_t ch_sdu_buf_released;/**< L2CAP Channel SDU Data Buffer Released Event Parameters. */ -+ ble_l2cap_evt_ch_credit_t credit; /**< L2CAP Channel Credit Received Event Parameters. */ -+ ble_l2cap_evt_ch_rx_t rx; /**< L2CAP Channel SDU Received Event Parameters. */ -+ ble_l2cap_evt_ch_tx_t tx; /**< L2CAP Channel SDU Transmitted Event Parameters. */ -+ } params; /**< Event Parameters. */ -+} ble_l2cap_evt_t; -+ -+/** @} */ -+ -+/**@addtogroup BLE_L2CAP_FUNCTIONS Functions -+ * @{ */ -+ -+/**@brief Set up an L2CAP channel. -+ * -+ * @details This function is used to: -+ * - Request setup of an L2CAP channel: sends an LE Credit Based Connection Request packet to a peer. -+ * - Reply to a setup request of an L2CAP channel (if called in response to a -+ * @ref BLE_L2CAP_EVT_CH_SETUP_REQUEST event): sends an LE Credit Based Connection -+ * Response packet to a peer. -+ * -+ * @note A call to this function will require the application to keep the SDU data buffer alive -+ * until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_RX or -+ * @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event. -+ * -+ * @events -+ * @event{@ref BLE_L2CAP_EVT_CH_SETUP, Setup successful.} -+ * @event{@ref BLE_L2CAP_EVT_CH_SETUP_REFUSED, Setup failed.} -+ * @endevents -+ * -+ * @mscs -+ * @mmsc{@ref BLE_L2CAP_CH_SETUP_MSC} -+ * @endmscs -+ * -+ * @param[in] conn_handle Connection Handle. -+ * @param[in,out] p_local_cid Pointer to a uint16_t containing Local Channel ID of the L2CAP channel: -+ * - As input: @ref BLE_L2CAP_CID_INVALID when requesting setup of an L2CAP -+ * channel or local_cid provided in the @ref BLE_L2CAP_EVT_CH_SETUP_REQUEST -+ * event when replying to a setup request of an L2CAP channel. -+ * - As output: local_cid for this channel. -+ * @param[in] p_params L2CAP channel parameters. -+ * -+ * @retval ::NRF_SUCCESS Successfully queued request or response for transmission. -+ * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. -+ * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. -+ * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. -+ * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. -+ * @retval ::NRF_ERROR_INVALID_LENGTH Supplied higher rx_mps than has been configured on this link. -+ * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (L2CAP channel already set up). -+ * @retval ::NRF_ERROR_NOT_FOUND CID not found. -+ * @retval ::NRF_ERROR_RESOURCES The limit has been reached for available L2CAP channels, -+ * see @ref ble_l2cap_conn_cfg_t::ch_count. -+ */ -+SVCALL(SD_BLE_L2CAP_CH_SETUP, uint32_t, sd_ble_l2cap_ch_setup(uint16_t conn_handle, uint16_t *p_local_cid, ble_l2cap_ch_setup_params_t const *p_params)); -+ -+/**@brief Release an L2CAP channel. -+ * -+ * @details This sends a Disconnection Request packet to a peer. -+ * -+ * @events -+ * @event{@ref BLE_L2CAP_EVT_CH_RELEASED, Release complete.} -+ * @endevents -+ * -+ * @mscs -+ * @mmsc{@ref BLE_L2CAP_CH_RELEASE_MSC} -+ * @endmscs -+ * -+ * @param[in] conn_handle Connection Handle. -+ * @param[in] local_cid Local Channel ID of the L2CAP channel. -+ * -+ * @retval ::NRF_SUCCESS Successfully queued request for transmission. -+ * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. -+ * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is -+ * in progress for the L2CAP channel). -+ * @retval ::NRF_ERROR_NOT_FOUND CID not found. -+ */ -+SVCALL(SD_BLE_L2CAP_CH_RELEASE, uint32_t, sd_ble_l2cap_ch_release(uint16_t conn_handle, uint16_t local_cid)); -+ -+/**@brief Receive an SDU on an L2CAP channel. -+ * -+ * @details This may issue additional credits to the peer using an LE Flow Control Credit packet. -+ * -+ * @note A call to this function will require the application to keep the memory pointed by -+ * @ref ble_data_t::p_data alive until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_RX -+ * or @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event. -+ * -+ * @note The SoftDevice can queue up to @ref ble_l2cap_conn_cfg_t::rx_queue_size SDU data buffers -+ * for reception per L2CAP channel. -+ * -+ * @events -+ * @event{@ref BLE_L2CAP_EVT_CH_RX, The SDU is received.} -+ * @endevents -+ * -+ * @mscs -+ * @mmsc{@ref BLE_L2CAP_CH_RX_MSC} -+ * @endmscs -+ * -+ * @param[in] conn_handle Connection Handle. -+ * @param[in] local_cid Local Channel ID of the L2CAP channel. -+ * @param[in] p_sdu_buf Pointer to the SDU data buffer. -+ * -+ * @retval ::NRF_SUCCESS Buffer accepted. -+ * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. -+ * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. -+ * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is -+ * in progress for an L2CAP channel). -+ * @retval ::NRF_ERROR_NOT_FOUND CID not found. -+ * @retval ::NRF_ERROR_RESOURCES Too many SDU data buffers supplied. Wait for a -+ * @ref BLE_L2CAP_EVT_CH_RX event and retry. -+ */ -+SVCALL(SD_BLE_L2CAP_CH_RX, uint32_t, sd_ble_l2cap_ch_rx(uint16_t conn_handle, uint16_t local_cid, ble_data_t const *p_sdu_buf)); -+ -+/**@brief Transmit an SDU on an L2CAP channel. -+ * -+ * @note A call to this function will require the application to keep the memory pointed by -+ * @ref ble_data_t::p_data alive until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_TX -+ * or @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event. -+ * -+ * @note The SoftDevice can queue up to @ref ble_l2cap_conn_cfg_t::tx_queue_size SDUs for -+ * transmission per L2CAP channel. -+ * -+ * @note The application can keep track of the available credits for transmission by following -+ * the procedure below: -+ * - Store initial credits given by the peer in a variable. -+ * (Initial credits are provided in a @ref BLE_L2CAP_EVT_CH_SETUP event.) -+ * - Decrement the variable, which stores the currently available credits, by -+ * ceiling((@ref ble_data_t::len + 2) / tx_mps) when a call to this function returns -+ * @ref NRF_SUCCESS. (tx_mps is provided in a @ref BLE_L2CAP_EVT_CH_SETUP event.) -+ * - Increment the variable, which stores the currently available credits, by additional -+ * credits given by the peer in a @ref BLE_L2CAP_EVT_CH_CREDIT event. -+ * -+ * @events -+ * @event{@ref BLE_L2CAP_EVT_CH_TX, The SDU is transmitted.} -+ * @endevents -+ * -+ * @mscs -+ * @mmsc{@ref BLE_L2CAP_CH_TX_MSC} -+ * @endmscs -+ * -+ * @param[in] conn_handle Connection Handle. -+ * @param[in] local_cid Local Channel ID of the L2CAP channel. -+ * @param[in] p_sdu_buf Pointer to the SDU data buffer. -+ * -+ * @retval ::NRF_SUCCESS Successfully queued L2CAP SDU for transmission. -+ * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. -+ * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. -+ * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is -+ * in progress for the L2CAP channel). -+ * @retval ::NRF_ERROR_NOT_FOUND CID not found. -+ * @retval ::NRF_ERROR_DATA_SIZE Invalid SDU length supplied, must not be more than -+ * @ref ble_l2cap_ch_tx_params_t::tx_mtu provided in -+ * @ref BLE_L2CAP_EVT_CH_SETUP event. -+ * @retval ::NRF_ERROR_RESOURCES Too many SDUs queued for transmission. Wait for a -+ * @ref BLE_L2CAP_EVT_CH_TX event and retry. -+ */ -+SVCALL(SD_BLE_L2CAP_CH_TX, uint32_t, sd_ble_l2cap_ch_tx(uint16_t conn_handle, uint16_t local_cid, ble_data_t const *p_sdu_buf)); -+ -+/**@brief Advanced SDU reception flow control. -+ * -+ * @details Adjust the way the SoftDevice issues credits to the peer. -+ * This may issue additional credits to the peer using an LE Flow Control Credit packet. -+ * -+ * @mscs -+ * @mmsc{@ref BLE_L2CAP_CH_FLOW_CONTROL_MSC} -+ * @endmscs -+ * -+ * @param[in] conn_handle Connection Handle. -+ * @param[in] local_cid Local Channel ID of the L2CAP channel or @ref BLE_L2CAP_CID_INVALID to set -+ * the value that will be used for newly created channels. -+ * @param[in] credits Number of credits that the SoftDevice will make sure the peer has every -+ * time it starts using a new reception buffer. -+ * - @ref BLE_L2CAP_CREDITS_DEFAULT is the default value the SoftDevice will -+ * use if this function is not called. -+ * - If set to zero, the SoftDevice will stop issuing credits for new reception -+ * buffers the application provides or has provided. SDU reception that is -+ * currently ongoing will be allowed to complete. -+ * @param[out] p_credits NULL or pointer to a uint16_t. If a valid pointer is provided, it will be -+ * written by the SoftDevice with the number of credits that is or will be -+ * available to the peer. If the value written by the SoftDevice is 0 when -+ * credits parameter was set to 0, the peer will not be able to send more -+ * data until more credits are provided by calling this function again with -+ * credits > 0. This parameter is ignored when local_cid is set to @ref -+ * BLE_L2CAP_CID_INVALID. -+ * -+ * @note Application should take care when setting number of credits higher than default value. In -+ * this case the application must make sure that the SoftDevice always has reception buffers -+ * available (see @ref sd_ble_l2cap_ch_rx) for that channel. If the SoftDevice does not have -+ * such buffers available, packets may be NACKed on the Link Layer and all Bluetooth traffic -+ * on the connection handle may be stalled until the SoftDevice again has an available -+ * reception buffer. This applies even if the application has used this call to set the -+ * credits back to default, or zero. -+ * -+ * @retval ::NRF_SUCCESS Flow control parameters accepted. -+ * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. -+ * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. -+ * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is -+ * in progress for an L2CAP channel). -+ * @retval ::NRF_ERROR_NOT_FOUND CID not found. -+ */ -+SVCALL(SD_BLE_L2CAP_CH_FLOW_CONTROL, uint32_t, sd_ble_l2cap_ch_flow_control(uint16_t conn_handle, uint16_t local_cid, uint16_t credits, uint16_t *p_credits)); -+ - - -//| -//| Data buffer provided to/from the application -//| -+/**@brief Data structure. */ -+typedef struct -+{ -+ uint8_t *p_data; /**< Pointer to the data buffer provided to/from the application. */ -+ uint16_t len; /**< Length of the data buffer, in bytes. */ -+} ble_data_t; -+ - - - -|-----------------------------------------------------------------------------| -| Network Privacy | -|-----------------------------------------------------------------------------| - -//| -//| Now supporting both network privacy and device privacy. -//| - #define BLE_GAP_PRIVACY_MODE_OFF 0x00 /**< Device will send and accept its identity address for its own address. */ - #define BLE_GAP_PRIVACY_MODE_DEVICE_PRIVACY 0x01 /**< Device will send and accept only private addresses for its own address. */ -+#define BLE_GAP_PRIVACY_MODE_NETWORK_PRIVACY 0x02 /**< Device will send and accept only private addresses for its own address, -+ and will not accept a peer using identity address as sender address when -+ the peer IRK is exchanged, non-zero and added to the identity list. */ - - --/**@brief Device Privacy. -+/**@brief Privacy. - * - * The privacy feature provides a way for the device to avoid being tracked over a period of time. - * The privacy feature, when enabled, hides the local device identity and replaces it with a private address - * that is automatically refreshed at a specified interval. - * - * If a device still wants to be recognized by other peers, it needs to share it's Identity Resolving Key (IRK). - * With this key, a device can generate a random private address that can only be recognized by peers in possession of that key, - * and devices can establish connections without revealing their real identities. - * -+ * Both network privacy (@ref BLE_GAP_PRIVACY_MODE_NETWORK_PRIVACY) and device privacy (@ref BLE_GAP_PRIVACY_MODE_DEVICE_PRIVACY) -+ * are supported. -+ * - * @note If the device IRK is updated, the new IRK becomes the one to be distributed in all - * bonding procedures performed after @ref sd_ble_gap_privacy_set returns. - * The IRK distributed during bonding procedure is the device IRK that is active when @ref sd_ble_gap_sec_params_reply is called. - */ - typedef struct - { - uint8_t privacy_mode; /**< Privacy mode, see @ref BLE_GAP_PRIVACY_MODES. Default is @ref BLE_GAP_PRIVACY_MODE_OFF. */ - uint8_t private_addr_type; /**< The private address type must be either @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE or @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE. */ - uint16_t private_addr_cycle_s; /**< Private address cycle interval in seconds. Providing an address cycle value of 0 will use the default value defined by @ref BLE_GAP_DEFAULT_PRIVATE_ADDR_CYCLE_INTERVAL_S. */ - ble_gap_irk_t *p_device_irk; /**< When used as input, pointer to IRK structure that will be used as the default IRK. If NULL, the device default IRK will be used. - When used as output, pointer to IRK structure where the current default IRK will be written to. If NULL, this argument is ignored. - By default, the default IRK is used to generate random private resolvable addresses for the local device unless instructed otherwise. */ - } ble_gap_privacy_params_t; - -+#define BLE_UUID_GAP_CHARACTERISTIC_RPA_ONLY 0x2AC9 /**< Resolvable Private Address Only Characteristic. */ - - -//| -//| Improved documentation for sd_ble_gap_privacy_get -//| - /**@brief Get privacy settings. - * -- * @note The privacy settings returned include the current device irk as well. -+ * @note ::ble_gap_privacy_params_t::p_device_irk must be initialized to NULL or a valid address before this function is called. -+ * If it is initialized to a valid address, the address pointed to will contain the current device IRK on return. - * -- * @param[in] p_privacy_params Privacy settings. -+ * @param[in,out] p_privacy_params Privacy settings. - * - * @retval ::NRF_SUCCESS Privacy settings read. - * @retval ::NRF_ERROR_INVALID_ADDR The pointer given for returning the privacy settings may be NULL or invalid. - * Otherwise, the p_device_irk pointer in privacy parameter is an invalid pointer. - */ - SVCALL(SD_BLE_GAP_PRIVACY_GET, uint32_t, sd_ble_gap_privacy_get(ble_gap_privacy_params_t *p_privacy_params)); - -|-----------------------------------------------------------------------------| -| Updates for Bluetooth 5 compliance | -|-----------------------------------------------------------------------------| - -//| -//| BLE_GAP_EVT_TIMEOUT {src: BLE_GAP_TIMEOUT_SRC_SECURITY_REQUEST} replaced with BLE_GAP_EVT_AUTH_STATUS {auth_status: BLE_GAP_SEC_STATUS_TIMEOUT} -//| - /**@defgroup BLE_GAP_TIMEOUT_SOURCES GAP Timeout sources - * @{ */ - #define BLE_GAP_TIMEOUT_SRC_ADVERTISING 0x00 /**< Advertising timeout. */ --#define BLE_GAP_TIMEOUT_SRC_SECURITY_REQUEST 0x01 /**< Security request timeout. */ --#define BLE_GAP_TIMEOUT_SRC_SCAN 0x02 /**< Scanning timeout. */ --#define BLE_GAP_TIMEOUT_SRC_CONN 0x03 /**< Connection timeout. */ --#define BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD 0x04 /**< Authenticated payload timeout. */ -+#define BLE_GAP_TIMEOUT_SRC_SCAN 0x01 /**< Scanning timeout. */ -+#define BLE_GAP_TIMEOUT_SRC_CONN 0x02 /**< Connection timeout. */ -+#define BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD 0x03 /**< Authenticated payload timeout. */ - /**@} */ - - -//| -//| Lowering of the lower limit for advertising interval for non-connectable advertisement. -//| - /**@defgroup BLE_GAP_ADV_INTERVALS GAP Advertising interval max and min - * @{ */ - #define BLE_GAP_ADV_INTERVAL_MIN 0x0020 /**< Minimum Advertising interval in 625 us units, i.e. 20 ms. */ --#define BLE_GAP_ADV_NONCON_INTERVAL_MIN 0x00A0 /**< Minimum Advertising interval in 625 us units for non connectable mode, i.e. 100 ms. */ - #define BLE_GAP_ADV_INTERVAL_MAX 0x4000 /**< Maximum Advertising interval in 625 us units, i.e. 10.24 s. */ - /**@} */ - - -//| -//| Change of definition of LE Security Mode 1 level 4. -//| - /**@brief GAP connection security modes. - * - * Security Mode 0 Level 0: No access permissions at all (this level is not defined by the Bluetooth Core specification).\n - * Security Mode 1 Level 1: No security is needed (aka open link).\n - * Security Mode 1 Level 2: Encrypted link required, MITM protection not necessary.\n - * Security Mode 1 Level 3: MITM protected encrypted link required.\n -- * Security Mode 1 Level 4: LESC MITM protected encrypted link required.\n -+ * Security Mode 1 Level 4: LESC MITM protected encrypted link using a 128-bit strength encryption key required.\n - * Security Mode 2 Level 1: Signing or encryption required, MITM protection not necessary.\n - * Security Mode 2 Level 2: MITM protected signing required, unless link is MITM protected encrypted.\n - */ - typedef struct - { - uint8_t sm : 4; /**< Security Mode (1 or 2), 0 for no permissions at all. */ - uint8_t lv : 4; /**< Level (1, 2, 3 or 4), 0 for no permissions at all. */ - - } ble_gap_conn_sec_mode_t; - -|-----------------------------------------------------------------------------| -| Master boot record | -|-----------------------------------------------------------------------------| - - -//| -//| New API for forwarding all interrupts to a specific address -//| - enum NRF_MBR_COMMANDS - { - SD_MBR_COMMAND_COPY_BL, /**< Copy a new BootLoader. @see sd_mbr_command_copy_bl_t*/ - SD_MBR_COMMAND_COPY_SD, /**< Copy a new SoftDevice. @see ::sd_mbr_command_copy_sd_t*/ - SD_MBR_COMMAND_INIT_SD, /**< Initialize forwarding interrupts to SD, and run reset function in SD*/ - SD_MBR_COMMAND_COMPARE, /**< This command works like memcmp. @see ::sd_mbr_command_compare_t*/ -- SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET, /**< Start forwarding all exception to this address @see ::sd_mbr_command_vector_table_base_set_t*/ -+ SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET, /**< Change the address the MBR starts after a reset @see ::sd_mbr_command_vector_table_base_set_t*/ -+ SD_MBR_COMMAND_RESERVED, -+ SD_MBR_COMMAND_IRQ_FORWARD_ADDRESS_SET, /**< Start forwarding all interrupts to this address @see ::sd_mbr_command_irq_forward_address_set_t*/ - }; - -+/**@brief Sets the base address of the interrupt vector table for interrupts forwarded from the MBR -+ * Unlike sd_mbr_command_vector_table_base_set_t, this function does not reset, and it does not -+ * change where the MBR starts after reset. -+ * -+ * @retval ::NRF_SUCCESS -+ */ -+typedef struct -+{ -+ uint32_t address; /**< The base address of the interrupt vector table for forwarded interrupts.*/ -+} sd_mbr_command_irq_forward_address_set_t; - - typedef struct - { - uint32_t command; /**< type of command to be issued see @ref NRF_MBR_COMMANDS. */ - union - { - sd_mbr_command_copy_sd_t copy_sd; /**< Parameters for copy SoftDevice.*/ - sd_mbr_command_compare_t compare; /**< Parameters for verify.*/ - sd_mbr_command_copy_bl_t copy_bl; /**< Parameters for copy BootLoader. Requires parameter page. */ - sd_mbr_command_vector_table_base_set_t base_set; /**< Parameters for vector table base set. Requires parameter page.*/ -+ sd_mbr_command_irq_forward_address_set_t irq_forward_address_set; /**< Parameters for irq forward address set*/ - } params; - } sd_mbr_command_t; - - -|-----------------------------------------------------------------------------| -| Removal of Compatibility mode 2 option | -|-----------------------------------------------------------------------------| - - enum BLE_GAP_OPTS - { - BLE_GAP_OPT_CH_MAP = BLE_GAP_OPT_BASE, /**< Channel Map. @ref ble_gap_opt_ch_map_t */ - BLE_GAP_OPT_LOCAL_CONN_LATENCY, /**< Local connection latency. @ref ble_gap_opt_local_conn_latency_t */ - BLE_GAP_OPT_PASSKEY, /**< Set passkey. @ref ble_gap_opt_passkey_t */ - BLE_GAP_OPT_SCAN_REQ_REPORT, /**< Scan request report. @ref ble_gap_opt_scan_req_report_t */ - BLE_GAP_OPT_COMPAT_MODE_1, /**< Compatibility mode. @ref ble_gap_opt_compat_mode_1_t */ -- BLE_GAP_OPT_COMPAT_MODE_2, /**< Compatibility mode. @ref ble_gap_opt_compat_mode_2_t */ - BLE_GAP_OPT_AUTH_PAYLOAD_TIMEOUT, /**< Set Authenticated payload timeout. @ref ble_gap_opt_auth_payload_timeout_t */ - BLE_GAP_OPT_SLAVE_LATENCY_DISABLE, /**< Disable slave latency. @ref ble_gap_opt_slave_latency_disable_t */ - }; - - --/**@brief Compatibility mode 2 option. -- * -- * This can be used with @ref sd_ble_opt_set to enable compatibility mode 2. -- * Compatibility mode 2 is disabled by default. -- * -- * @note Compatibility mode 2 enables interoperability with devices that initiate Feature exchange -- * and version exchange procedure in parallel. -- * -- * @retval ::NRF_SUCCESS Set successfully. -- * @retval ::NRF_ERROR_INVALID_PARAM if enable bit is not set to 1. Currently only enabling is supported. -- * @retval ::NRF_ERROR_INVALID_STATE When any role is running while mode 2 is set. -- */ --typedef struct --{ -- uint8_t enable : 1; /**< Enable compatibility mode 2.*/ --} ble_gap_opt_compat_mode_2_t; -- -- - - - /**@brief Option structure for GAP options. */ - typedef union - { - ble_gap_opt_ch_map_t ch_map; /**< Parameters for the Channel Map option. */ - ble_gap_opt_local_conn_latency_t local_conn_latency; /**< Parameters for the Local connection latency option */ - ble_gap_opt_passkey_t passkey; /**< Parameters for the Passkey option.*/ - ble_gap_opt_scan_req_report_t scan_req_report; /**< Parameters for the scan request report option.*/ - ble_gap_opt_compat_mode_1_t compat_mode_1; /**< Parameters for the compatibility mode 1 option.*/ -- ble_gap_opt_compat_mode_2_t compat_mode_2; /**< Parameters for the compatibility mode 2 option.*/ - ble_gap_opt_auth_payload_timeout_t auth_payload_timeout; /**< Parameters for the authenticated payload timeout option.*/ - ble_gap_opt_slave_latency_disable_t slave_latency_disable; /**< Parameters for the Disable slave latency option */ - } ble_gap_opt_t; - /**@} */ - - - -|-----------------------------------------------------------------------------| -| Misc | -|-----------------------------------------------------------------------------| - - -//| -//| Added defines for Authenticated payload timeout -//| -+/**@defgroup BLE_GAP_AUTH_PAYLOAD_TIMEOUT Authenticated payload timeout defines. -+ * @{ */ -+#define BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MAX (48000) /**< Maximum authenticated payload timeout in 10 ms units, i.e. 8 minutes. */ -+#define BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MIN (1) /**< Minimum authenticated payload timeout in 10 ms units, i.e. 10 ms. */ -+/**@} */ - - /**@brief Authenticated payload timeout option. - * -- * This can be used with @ref sd_ble_opt_set to change the Authenticated payload timeout to a value other than the default of 8 minutes. -+ * This can be used with @ref sd_ble_opt_set to change the Authenticated payload timeout to a value other -+ * than the default of @ref BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MAX. - * - * @note The authenticated payload timeout event ::BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD will be generated - * if auth_payload_timeout time has elapsed without receiving a packet with a valid MIC on an encrypted - * link. - * - * @note The LE ping procedure will be initiated before the timer expires to give the peer a chance - * to reset the timer. In addition the stack will try to prioritize running of LE ping over other - * activities to increase chances of finishing LE ping before timer expires. To avoid side-effects - * on other activities, it is recommended to use high timeout values. - * Recommended timeout > 2*(connInterval * (6 + connSlaveLatency)). - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. auth_payload_timeout was outside of allowed range. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter. - */ - typedef struct - { - uint16_t conn_handle; /**< Connection Handle */ -- uint16_t auth_payload_timeout; /**< Requested timeout in 10 ms unit. Maximum is 48 000 (=480 000 ms =8 min). Minimum is 1 (=10 ms). */ -+ uint16_t auth_payload_timeout; /**< Requested timeout in 10 ms unit, see @ref BLE_GAP_AUTH_PAYLOAD_TIMEOUT. */ - } ble_gap_opt_auth_payload_timeout_t; - - -//| -//| APIs not returning NRF_ERROR_BUSY anymore. -//| - /**@brief Start advertising (GAP Discoverable, Connectable modes, Broadcast Procedure). - * - * @note Only one advertiser may be active at any time. - * - * @param[in] p_adv_params Pointer to advertising parameters structure. - * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or @ref - * BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. If - * @ref ble_gap_adv_params_t::type is @ref BLE_GAP_ADV_TYPE_ADV_NONCONN_IND, - * this is ignored. - * - * @retval ::NRF_SUCCESS The BLE stack has started advertising. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_CONN_COUNT The limit of available connections has been reached; connectable advertiser cannot be started. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check the accepted ranges and limits. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid Bluetooth address supplied. - * @retval ::BLE_ERROR_GAP_DISCOVERABLE_WITH_WHITELIST Discoverable mode and whitelist incompatible. -- * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::NRF_ERROR_RESOURCES Not enough BLE role slots available. - * Stop one or more currently active roles (Central, Peripheral or Observer) and try again - */ - SVCALL(SD_BLE_GAP_ADV_START, uint32_t, sd_ble_gap_adv_start(ble_gap_adv_params_t const *p_adv_params, uint8_t conn_cfg_tag)); - - - /**@brief Initiate the GAP Authentication procedure. - * - * @details In the central role, this function will send an SMP Pairing Request (or an SMP Pairing Failed if rejected), - * otherwise in the peripheral role, an SMP Security Request will be sent. - * - * @param[in] conn_handle Connection handle. - * @param[in] p_sec_params Pointer to the @ref ble_gap_sec_params_t structure with the security parameters to be used during the pairing or bonding procedure. - * In the peripheral role, only the bond, mitm, lesc and keypress fields of this structure are used. - * In the central role, this pointer may be NULL to reject a Security Request. - * - * @retval ::NRF_SUCCESS Successfully initiated authentication procedure. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. -- * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::NRF_ERROR_NO_MEM The maximum number of authentication procedures that can run in parallel for the given role is reached. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_NOT_SUPPORTED Setting of sign or link fields in @ref ble_gap_sec_kdist_t not supported. - * @retval ::NRF_ERROR_TIMEOUT A SMP timeout has occurred, and further SMP operations on this link is prohibited. - */ - SVCALL(SD_BLE_GAP_AUTHENTICATE, uint32_t, sd_ble_gap_authenticate(uint16_t conn_handle, ble_gap_sec_params_t const *p_sec_params)); - - - /**@brief Start scanning (GAP Discovery procedure, Observer Procedure). - * - * @param[in] p_scan_params Pointer to scan parameters structure. - * - * @retval ::NRF_SUCCESS Successfully initiated scanning procedure. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. -- * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::NRF_ERROR_RESOURCES Not enough BLE role slots available. - * Stop one or more currently active roles (Central, Peripheral or Broadcaster) and try again - */ - SVCALL(SD_BLE_GAP_SCAN_START, uint32_t, sd_ble_gap_scan_start(ble_gap_scan_params_t const *p_scan_params)); - - - /**@brief Create a connection (GAP Link Establishment). - * - * @note If a scanning procedure is currently in progress it will be automatically stopped when calling this function. - * The scanning procedure will be stopped even if the function returns an error. - * - * @param[in] p_peer_addr Pointer to peer address. If the use_whitelist bit is set in @ref ble_gap_scan_params_t, then this is ignored. -- * If @ref ble_gap_addr_t::addr_id_peer is set then p_peer_addr must be present in the device identity list -- * see @ref sd_ble_gap_device_identities_set. - * @param[in] p_scan_params Pointer to scan parameters structure. - * @param[in] p_conn_params Pointer to desired connection parameters. - * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or @ref - * BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. - * - * @retval ::NRF_SUCCESS Successfully initiated connection procedure. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid parameter(s) pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * - Invalid parameter(s) in p_scan_params or p_conn_params. - * - Use of whitelist requested but whitelist has not been set, see @ref sd_ble_gap_whitelist_set. - * - Peer address was not present in the device identity list, see @ref sd_ble_gap_device_identities_set. - * @retval ::NRF_ERROR_INVALID_STATE The SoftDevice is in an invalid state to perform this operation. This may be due to an - * existing locally initiated connect procedure, which must complete before initiating again. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid Peer address. - * @retval ::NRF_ERROR_CONN_COUNT The limit of available connections has been reached. -- * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. If another connection is being established -- * wait for the corresponding @ref BLE_GAP_EVT_CONNECTED event before calling again. - * @retval ::NRF_ERROR_RESOURCES Not enough BLE role slots available. - * Stop one or more currently active roles (Central, Peripheral or Broadcaster) and try again - */ - SVCALL(SD_BLE_GAP_CONNECT, uint32_t, sd_ble_gap_connect(ble_gap_addr_t const *p_peer_addr, ble_gap_scan_params_t const *p_scan_params, ble_gap_conn_params_t const *p_conn_params, uint8_t conn_cfg_tag)); - - -//| -//| APIs now also returning NRF_ERROR_BUSY. -//| - - /**@brief Provide a user memory block. - * - * @note This call can only be used as a response to a @ref BLE_EVT_USER_MEM_REQUEST event issued to the application. - * - * @param[in] conn_handle Connection handle. - * @param[in] p_block Pointer to a user memory block structure or NULL if memory is managed by the application. - * - * @mscs -- * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_PEER_CANCEL_MSC} -+ * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_PEER_CANCEL_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_NOAUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS Successfully queued a response to the peer. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. -+ * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_LENGTH Invalid user memory block length supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection state or no user memory request pending. - */ - SVCALL(SD_BLE_USER_MEM_REPLY, uint32_t, sd_ble_user_mem_reply(uint16_t conn_handle, ble_user_mem_block_t const *p_block)); - - - /**@brief Reply with GAP security parameters. - * - * @details This function is only used to reply to a @ref BLE_GAP_EVT_SEC_PARAMS_REQUEST, calling it at other times will result in an @ref NRF_ERROR_INVALID_STATE. - * @note If the call returns an error code, the request is still pending, and the reply call may be repeated with corrected parameters. - * - * @param[in] conn_handle Connection handle. - * @param[in] sec_status Security status, see @ref BLE_GAP_SEC_STATUS. - * @param[in] p_sec_params Pointer to a @ref ble_gap_sec_params_t security parameters structure. In the central role this must be set to NULL, as the parameters have - * already been provided during a previous call to @ref sd_ble_gap_authenticate. - * @param[in,out] p_sec_keyset Pointer to a @ref ble_gap_sec_keyset_t security keyset structure. Any keys generated and/or distributed as a result of the ongoing security procedure - * will be stored into the memory referenced by the pointers inside this structure. The keys will be stored and available to the application - * upon reception of a @ref BLE_GAP_EVT_AUTH_STATUS event. - * Note that the SoftDevice expects the application to provide memory for storing the - * peer's keys. So it must be ensured that the relevant pointers inside this structure are not NULL. The pointers to the local key - * can, however, be NULL, in which case, the local key data will not be available to the application upon reception of the - * @ref BLE_GAP_EVT_AUTH_STATUS event. - * - * @retval ::NRF_SUCCESS Successfully accepted security parameter from the application. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. -+ * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_NOT_SUPPORTED Setting of sign or link fields in @ref ble_gap_sec_kdist_t not supported. - */ - SVCALL(SD_BLE_GAP_SEC_PARAMS_REPLY, uint32_t, sd_ble_gap_sec_params_reply(uint16_t conn_handle, uint8_t sec_status, ble_gap_sec_params_t const *p_sec_params, ble_gap_sec_keyset_t const *p_sec_keyset)); - - - /**@brief Respond to a Read/Write authorization request. - * - * @note This call should only be used as a response to a @ref BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST event issued to the application. - * - * @mscs - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC} - * @mmsc{@ref BLE_GATTS_READ_REQ_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_WRITE_REQ_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC} -- * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_PEER_CANCEL_MSC} -+ * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_PEER_CANCEL_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_rw_authorize_reply_params Pointer to a structure with the attribute provided by the application. - * - * @note @ref ble_gatts_authorize_params_t::p_data is ignored when this function is used to respond - * to a @ref BLE_GATTS_AUTHORIZE_TYPE_READ event if @ref ble_gatts_authorize_params_t::update - * is set to 0. - * - * @retval ::NRF_SUCCESS Successfully queued a response to the peer, and in the case of a write operation, Attribute Table updated. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. -+ * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no authorization request pending. - * @retval ::NRF_ERROR_INVALID_PARAM Authorization op invalid, - * handle supplied does not match requested handle, - * or invalid data to be written provided by the application. - */ - SVCALL(SD_BLE_GATTS_RW_AUTHORIZE_REPLY, uint32_t, sd_ble_gatts_rw_authorize_reply(uint16_t conn_handle, ble_gatts_rw_authorize_reply_params_t const *p_rw_authorize_reply_params)); - - - -//| -//| Flag indicating the establishment of an LE Secure Connection -//| - typedef struct - { - uint8_t auth_status; /**< Authentication status, see @ref BLE_GAP_SEC_STATUS. */ - uint8_t error_src : 2; /**< On error, source that caused the failure, see @ref BLE_GAP_SEC_STATUS_SOURCES. */ - uint8_t bonded : 1; /**< Procedure resulted in a bond. */ -+ uint8_t lesc : 1; /**< Procedure resulted in a LE Secure Connection. */ - ble_gap_sec_levels_t sm1_levels; /**< Levels supported in Security Mode 1. */ - ble_gap_sec_levels_t sm2_levels; /**< Levels supported in Security Mode 2. */ - ble_gap_sec_kdist_t kdist_own; /**< Bitmap stating which keys were exchanged (distributed) by the local device. If bonding with LE Secure Connections, the enc bit will be always set. */ - ble_gap_sec_kdist_t kdist_peer; /**< Bitmap stating which keys were exchanged (distributed) by the remote device. If bonding with LE Secure Connections, the enc bit will never be set. */ - } ble_gap_evt_auth_status_t; - -//| -//| Stack will no longer return BUSY on sd_ble_gap_conn_param_update unless the procedure is already in progress. -//| - /**@brief Update connection parameters. - * - * @details In the central role this will initiate a Link Layer connection parameter update procedure, - * otherwise in the peripheral role, this will send the corresponding L2CAP request and wait for - * the central to perform the procedure. In both cases, and regardless of success or failure, the application - * will be informed of the result with a @ref BLE_GAP_EVT_CONN_PARAM_UPDATE event. - * - * @details This function can be used as a central both to reply to a @ref BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST or to start the procedure unrequested. - * - * @param[in] conn_handle Connection handle. - * @param[in] p_conn_params Pointer to desired connection parameters. If NULL is provided on a peripheral role, - * the parameters in the PPCP characteristic of the GAP service will be used instead. - * If NULL is provided on a central role and in response to a @ref BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST, the peripheral request will be rejected - * - * @retval ::NRF_SUCCESS The Connection Update procedure has been started successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check parameter limits and constraints. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. -- * @retval ::NRF_ERROR_BUSY Procedure already in progress or not allowed at this time, process pending events and wait for pending procedures to complete and retry. -+ * @retval ::NRF_ERROR_BUSY Procedure already in progress, wait for pending procedures to complete and retry. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. - */ - SVCALL(SD_BLE_GAP_CONN_PARAM_UPDATE, uint32_t, sd_ble_gap_conn_param_update(uint16_t conn_handle, ble_gap_conn_params_t const *p_conn_params)); - - -//| -//| Renamed Defines and structure member related to clock accuracy -//| --/**@defgroup NRF_CLOCK_LF_XTAL_ACCURACY Clock accuracy -+/**@defgroup NRF_CLOCK_LF_ACCURACY Clock accuracy - * @{ */ - --#define NRF_CLOCK_LF_XTAL_ACCURACY_250_PPM (0) /**< Default: 250 ppm */ --#define NRF_CLOCK_LF_XTAL_ACCURACY_500_PPM (1) /**< 500 ppm */ --#define NRF_CLOCK_LF_XTAL_ACCURACY_150_PPM (2) /**< 150 ppm */ --#define NRF_CLOCK_LF_XTAL_ACCURACY_100_PPM (3) /**< 100 ppm */ --#define NRF_CLOCK_LF_XTAL_ACCURACY_75_PPM (4) /**< 75 ppm */ --#define NRF_CLOCK_LF_XTAL_ACCURACY_50_PPM (5) /**< 50 ppm */ --#define NRF_CLOCK_LF_XTAL_ACCURACY_30_PPM (6) /**< 30 ppm */ --#define NRF_CLOCK_LF_XTAL_ACCURACY_20_PPM (7) /**< 20 ppm */ --#define NRF_CLOCK_LF_XTAL_ACCURACY_10_PPM (8) /**< 10 ppm */ --#define NRF_CLOCK_LF_XTAL_ACCURACY_5_PPM (9) /**< 5 ppm */ --#define NRF_CLOCK_LF_XTAL_ACCURACY_2_PPM (10) /**< 2 ppm */ --#define NRF_CLOCK_LF_XTAL_ACCURACY_1_PPM (11) /**< 1 ppm */ -+#define NRF_CLOCK_LF_ACCURACY_250_PPM (0) /**< Default: 250 ppm */ -+#define NRF_CLOCK_LF_ACCURACY_500_PPM (1) /**< 500 ppm */ -+#define NRF_CLOCK_LF_ACCURACY_150_PPM (2) /**< 150 ppm */ -+#define NRF_CLOCK_LF_ACCURACY_100_PPM (3) /**< 100 ppm */ -+#define NRF_CLOCK_LF_ACCURACY_75_PPM (4) /**< 75 ppm */ -+#define NRF_CLOCK_LF_ACCURACY_50_PPM (5) /**< 50 ppm */ -+#define NRF_CLOCK_LF_ACCURACY_30_PPM (6) /**< 30 ppm */ -+#define NRF_CLOCK_LF_ACCURACY_20_PPM (7) /**< 20 ppm */ -+#define NRF_CLOCK_LF_ACCURACY_10_PPM (8) /**< 10 ppm */ -+#define NRF_CLOCK_LF_ACCURACY_5_PPM (9) /**< 5 ppm */ -+#define NRF_CLOCK_LF_ACCURACY_2_PPM (10) /**< 2 ppm */ -+#define NRF_CLOCK_LF_ACCURACY_1_PPM (11) /**< 1 ppm */ - - - /**@brief Type representing LFCLK oscillator source. */ - typedef struct - { - uint8_t source; /**< LF oscillator clock source, see @ref NRF_CLOCK_LF_SRC. */ - uint8_t rc_ctiv; /**< Only for NRF_CLOCK_LF_SRC_RC: Calibration timer interval in 1/4 second - units (nRF51: 1-64, nRF52: 1-32). - @note To avoid excessive clock drift, 0.5 degrees Celsius is the - maximum temperature change allowed in one calibration timer - interval. The interval should be selected to ensure this. - - @note Must be 0 if source is not NRF_CLOCK_LF_SRC_RC. */ - uint8_t rc_temp_ctiv; /**< Only for NRF_CLOCK_LF_SRC_RC: How often (in number of calibration - intervals) the RC oscillator shall be calibrated if the temperature - hasn't changed. - 0: Always calibrate even if the temperature hasn't changed. - 1: Only calibrate if the temperature has changed (nRF51 only). - 2-33: Check the temperature and only calibrate if it has changed, - however calibration will take place every rc_temp_ctiv - intervals in any case. - - @note Must be 0 if source is not NRF_CLOCK_LF_SRC_RC. - - @note For nRF52, the application must ensure calibration at least once - every 8 seconds to ensure +/-500 ppm clock stability. The - recommended configuration for NRF_CLOCK_LF_SRC_RC on nRF52 is - rc_ctiv=16 and rc_temp_ctiv=2. This will ensure calibration at - least once every 8 seconds and for temperature changes of 0.5 - degrees Celsius every 4 seconds. See the Product Specification - for the nRF52 device being used for more information.*/ -- uint8_t xtal_accuracy; /**< External crystal clock accuracy used in the LL to compute timing -- windows, see @ref NRF_CLOCK_LF_XTAL_ACCURACY. -- -- @note For the NRF_CLOCK_LF_SRC_RC clock source this parameter is ignored. */ -+ uint8_t accuracy; /**< External clock accuracy used in the LL to compute timing -+ windows, see @ref NRF_CLOCK_LF_ACCURACY.*/ - } nrf_clock_lf_cfg_t; - - -//| -//| Removal of references to nRF51 -//| --#ifdef NRF51 -- #define __NRF_NVIC_ISER_COUNT (1) /**< The number of ISER/ICER registers in the NVIC that are used. */ -- -- /**@brief Interrupts used by the SoftDevice. */ -- #define __NRF_NVIC_SD_IRQS_0 ((uint32_t)( \ -- (1U << POWER_CLOCK_IRQn) \ -- | (1U << RADIO_IRQn) \ -- | (1U << RTC0_IRQn) \ -- | (1U << TIMER0_IRQn) \ -- | (1U << RNG_IRQn) \ -- | (1U << ECB_IRQn) \ -- | (1U << CCM_AAR_IRQn) \ -- | (1U << TEMP_IRQn) \ -- | (1U << __NRF_NVIC_NVMC_IRQn) \ -- | (1U << (uint32_t)SWI5_IRQn) \ -- )) -- -- /**@brief Interrupts available for to application. */ -- #define __NRF_NVIC_APP_IRQS_0 (~__NRF_NVIC_SD_IRQS_0) --#endif -- --#ifdef NRF52 - #define __NRF_NVIC_ISER_COUNT (2) /**< The number of ISER/ICER registers in the NVIC that are used. */ - -- /**@brief Interrupts used by the SoftDevice. */ -+/**@brief Interrupts used by the SoftDevice, with IRQn in the range 0-31. */ - #define __NRF_NVIC_SD_IRQS_0 ((uint32_t)( \ - (1U << POWER_CLOCK_IRQn) \ - | (1U << RADIO_IRQn) \ - | (1U << RTC0_IRQn) \ - | (1U << TIMER0_IRQn) \ - | (1U << RNG_IRQn) \ - | (1U << ECB_IRQn) \ - | (1U << CCM_AAR_IRQn) \ - | (1U << TEMP_IRQn) \ - | (1U << __NRF_NVIC_NVMC_IRQn) \ - | (1U << (uint32_t)SWI5_EGU5_IRQn) \ - )) -+ -+/**@brief Interrupts used by the SoftDevice, with IRQn in the range 32-63. */ - #define __NRF_NVIC_SD_IRQS_1 ((uint32_t)0) - -- /**@brief Interrupts available for to application. */ -+/**@brief Interrupts available for to application, with IRQn in the range 0-31. */ - #define __NRF_NVIC_APP_IRQS_0 (~__NRF_NVIC_SD_IRQS_0) -+ -+/**@brief Interrupts available for to application, with IRQn in the range 32-63. */ - #define __NRF_NVIC_APP_IRQS_1 (~__NRF_NVIC_SD_IRQS_1) --#endif -+ - - __STATIC_INLINE uint32_t __sd_nvic_app_accessible_irq(IRQn_Type IRQn) - { - if (IRQn < 32) - { - return ((1UL<<IRQn) & __NRF_NVIC_APP_IRQS_0) != 0; - } --#ifdef NRF52 - else if (IRQn < 64) - { - return ((1UL<<(IRQn-32)) & __NRF_NVIC_APP_IRQS_1) != 0; - } --#endif - else - { - return 1; - } - } - - __STATIC_INLINE uint32_t __sd_nvic_is_app_accessible_priority(uint32_t priority) - { - if(priority >= (1 << __NVIC_PRIO_BITS)) - { - return 0; - } --#ifdef NRF51 -- if( priority == 0 -- || priority == 2 -- ) -- { -- return 0; -- } --#endif --#ifdef NRF52 - if( priority == 0 - || priority == 1 - || priority == 4 - ) - { - return 0; - } --#endif - return 1; - } - - __STATIC_INLINE uint32_t sd_nvic_critical_region_enter(uint8_t * p_is_nested_critical_region) - { - int was_masked = __sd_nvic_irq_disable(); - if (!nrf_nvic_state.__cr_flag) - { - nrf_nvic_state.__cr_flag = 1; - nrf_nvic_state.__irq_masks[0] = ( NVIC->ICER[0] & __NRF_NVIC_APP_IRQS_0 ); - NVIC->ICER[0] = __NRF_NVIC_APP_IRQS_0; -- #ifdef NRF52 - nrf_nvic_state.__irq_masks[1] = ( NVIC->ICER[1] & __NRF_NVIC_APP_IRQS_1 ); - NVIC->ICER[1] = __NRF_NVIC_APP_IRQS_1; -- #endif - *p_is_nested_critical_region = 0; - } - else - { - *p_is_nested_critical_region = 1; - } - if (!was_masked) - { - __sd_nvic_irq_enable(); - } - return NRF_SUCCESS; - } - - __STATIC_INLINE uint32_t sd_nvic_critical_region_exit(uint8_t is_nested_critical_region) - { - if (nrf_nvic_state.__cr_flag && (is_nested_critical_region == 0)) - { - int was_masked = __sd_nvic_irq_disable(); - NVIC->ISER[0] = nrf_nvic_state.__irq_masks[0]; -- #ifdef NRF52 - NVIC->ISER[1] = nrf_nvic_state.__irq_masks[1]; -- #endif - nrf_nvic_state.__cr_flag = 0; - if (!was_masked) - { - __sd_nvic_irq_enable(); - } - } - - return NRF_SUCCESS; - } - --#ifdef NRF51 --#define SD_EVT_IRQn (SWI2_IRQn) /**< SoftDevice Event IRQ number. Used for both protocol events and SoC events. */ --#define SD_EVT_IRQHandler (SWI2_IRQHandler) /**< SoftDevice Event IRQ handler. Used for both protocol events and SoC events. */ --#define RADIO_NOTIFICATION_IRQn (SWI1_IRQn) /**< The radio notification IRQ number. */ --#define RADIO_NOTIFICATION_IRQHandler (SWI1_IRQHandler) /**< The radio notification IRQ handler. */ --#endif --#ifdef NRF52 - #define SD_EVT_IRQn (SWI2_EGU2_IRQn) /**< SoftDevice Event IRQ number. Used for both protocol events and SoC events. */ - #define SD_EVT_IRQHandler (SWI2_EGU2_IRQHandler) /**< SoftDevice Event IRQ handler. Used for both protocol events and SoC events. - The default interrupt priority for this handler is set to 4 */ - #define RADIO_NOTIFICATION_IRQn (SWI1_EGU1_IRQn) /**< The radio notification IRQ number. */ - #define RADIO_NOTIFICATION_IRQHandler (SWI1_EGU1_IRQHandler) /**< The radio notification IRQ handler. - The default interrupt priority for this handler is set to 4 */ --#endif -- - -/**@brief Set bits in the general purpose retention registers (NRF_POWER->GPREGRET*). - * - * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. - * @param[in] gpregret_msk Bits to be set in the GPREGRET register. - * -- * @note nRF51 does only have one general purpose retained register, so gpregret_id must be 0 on nRF51. - * @retval ::NRF_SUCCESS - */ - SVCALL(SD_POWER_GPREGRET_SET, uint32_t, sd_power_gpregret_set(uint32_t gpregret_id, uint32_t gpregret_msk)); - - /**@brief Clear bits in the general purpose retention registers (NRF_POWER->GPREGRET*). - * - * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. - * @param[in] gpregret_msk Bits to be clear in the GPREGRET register. - * -- * @note nRF51 does only have one general purpose retained register, so gpregret_id must be 0 on nRF51. - * @retval ::NRF_SUCCESS - */ - SVCALL(SD_POWER_GPREGRET_CLR, uint32_t, sd_power_gpregret_clr(uint32_t gpregret_id, uint32_t gpregret_msk)); - - /**@brief Get contents of the general purpose retention registers (NRF_POWER->GPREGRET*). - * - * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. - * @param[out] p_gpregret Contents of the GPREGRET register. - * -- * @note nRF51 does only have one general purpose retained register, so gpregret_id must be 0 on nRF51. - * @retval ::NRF_SUCCESS - */ - SVCALL(SD_POWER_GPREGRET_GET, uint32_t, sd_power_gpregret_get(uint32_t gpregret_id, uint32_t *p_gpregret)); - - /**@brief Flash Write - * - * Commands to write a buffer to flash - * - * If the SoftDevice is enabled: - * This call initiates the flash access command, and its completion will be communicated to the - * application with exactly one of the following events: - * - @ref NRF_EVT_FLASH_OPERATION_SUCCESS - The command was successfully completed. - * - @ref NRF_EVT_FLASH_OPERATION_ERROR - The command could not be started. - * - * If the SoftDevice is not enabled no event will be generated, and this call will return @ref NRF_SUCCESS when the - * write has been completed - * - * @note - * - This call takes control over the radio and the CPU during flash erase and write to make sure that - * they will not interfere with the flash access. This means that all interrupts will be blocked --* for a predictable time (depending on the NVMC specification in nRF51 Series Reference Manual -+* for a predictable time (depending on the NVMC specification in the device's Product Specification - * and the command parameters). - * - The data in the p_src buffer should not be modified before the @ref NRF_EVT_FLASH_OPERATION_SUCCESS - * or the @ref NRF_EVT_FLASH_OPERATION_ERROR have been received if the SoftDevice is enabled. - * - * - * @param[in] p_dst Pointer to start of flash location to be written. - * @param[in] p_src Pointer to buffer with data to be written. --* @param[in] size Number of 32-bit words to write. Maximum size is 256 32-bit words for nRF51 and 1024 for nRF52. -+* @param[in] size Number of 32-bit words to write. Maximum size is the number of words in one -+* flash page. See the device's Product Specification for details. - * - * @retval ::NRF_ERROR_INVALID_ADDR Tried to write to a non existing flash address, or p_dst or p_src was unaligned. - * @retval ::NRF_ERROR_BUSY The previous command has not yet completed. - * @retval ::NRF_ERROR_INVALID_LENGTH Size was 0, or higher than the maximum allowed size. - * @retval ::NRF_ERROR_FORBIDDEN Tried to write to or read from protected location. - * @retval ::NRF_SUCCESS The command was accepted. - */ - SVCALL(SD_FLASH_WRITE, uint32_t, sd_flash_write(uint32_t * p_dst, uint32_t const * p_src, uint32_t size)); - - - /**@brief Flash Erase page - * - * Commands to erase a flash page - * If the SoftDevice is enabled: - * This call initiates the flash access command, and its completion will be communicated to the - * application with exactly one of the following events: - * - @ref NRF_EVT_FLASH_OPERATION_SUCCESS - The command was successfully completed. - * - @ref NRF_EVT_FLASH_OPERATION_ERROR - The command could not be started. - * - * If the SoftDevice is not enabled no event will be generated, and this call will return @ref NRF_SUCCESS when the - * erase has been completed - * - * @note - * - This call takes control over the radio and the CPU during flash erase and write to make sure that - * they will not interfere with the flash access. This means that all interrupts will be blocked --* for a predictable time (depending on the NVMC specification in nRF51 Series Reference Manual -+* for a predictable time (depending on the NVMC specification in the device's Product Specification - * and the command parameters). - * - * - * @param[in] page_number Page number of the page to erase - * - * @retval ::NRF_ERROR_INTERNAL If a new session could not be opened due to an internal error. - * @retval ::NRF_ERROR_INVALID_ADDR Tried to erase to a non existing flash page. - * @retval ::NRF_ERROR_BUSY The previous command has not yet completed. - * @retval ::NRF_ERROR_FORBIDDEN Tried to erase a protected page. - * @retval ::NRF_SUCCESS The command was accepted. - */ - SVCALL(SD_FLASH_PAGE_ERASE, uint32_t, sd_flash_page_erase(uint32_t page_number)); - - - /**@brief Flash Protection set - * - * Commands to set the flash protection configuration registers. -- On nRF51 this sets the PROTENSETx registers of the MPU peripheral. -- On nRF52 this sets the CONFIGx registers of the BPROT peripheral. -+ This sets the CONFIGx registers of the BPROT peripheral. - * - * @note To read the values read them directly. They are only write-protected. - * - * @param[in] block_cfg0 Value to be written to the configuration register. - * @param[in] block_cfg1 Value to be written to the configuration register. -- * @param[in] block_cfg2 Value to be written to the configuration register (ignored on nRF51). -- * @param[in] block_cfg3 Value to be written to the configuration register (ignored on nRF51). -+ * @param[in] block_cfg2 Value to be written to the configuration register. -+ * @param[in] block_cfg3 Value to be written to the configuration register. - * - * @retval ::NRF_ERROR_FORBIDDEN Tried to protect the SoftDevice. - * @retval ::NRF_SUCCESS Values successfully written to configuration registers. - */ - - -//| -//| Version information update -//| - /** @brief The major version for the SoftDevice binary distributed with this header file. */ --#define SD_MAJOR_VERSION (4) -+#define SD_MAJOR_VERSION (5) - - - /** @brief The bugfix version for the SoftDevice binary distributed with this header file. */ --#define SD_BUGFIX_VERSION (3) -+#define SD_BUGFIX_VERSION (0) - - -//| -//| SoftDevice unique string related updates -//| -+/** @brief SoftDevice unique string size in bytes. */ -+#define SD_UNIQUE_STR_SIZE 20 -+ - - -+/** @brief Defines the offset for the SoftDevice unique string relative to the SoftDevice base address. -+ * The SD_UNIQUE_STR is stored as an array of uint8_t. The size of array is @ref SD_UNIQUE_STR_SIZE. -+ */ -+#define SD_UNIQUE_STR_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x18) -+ - --/** @brief Defines a macro for retrieving the actual FWID value from a given base address. Use @ref -- * MBR_SIZE as the argument when the SoftDevice is installed just above the MBR (the usual -- * case). */ -+/** @brief Defines a macro for retrieving the actual SoftDevice version from a given base address. -+ * Use @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR -+ * (the usual case). */ - #define SD_VERSION_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_VERSION_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \ - ? (*((uint32_t *) ((baseaddr) + SD_VERSION_OFFSET))) : SDM_INFO_FIELD_INVALID) - -+/** @brief Defines a macro for retrieving the address of SoftDevice unique str based on a given base address. -+ * Use @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR -+ * (the usual case). */ -+#define SD_UNIQUE_STR_ADDR_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_UNIQUE_STR_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \ -+ ? (((uint8_t *) ((baseaddr) + SD_UNIQUE_STR_OFFSET))) : SDM_INFO_FIELD_INVALID) -+ - -//| -//| New defines for timing constraints the application must take into account when using NRF_RADIO_SIGNAL_CALLBACK_ACTION_EXTEND with the Radio Timeslot API. -//| -+/**@brief The maximum processing time to handle a timeslot extension. */ -+#define NRF_RADIO_MAX_EXTENSION_PROCESSING_TIME_US (17) -+ -+/**@brief The latest time before the end of a timeslot the timeslot can be extended. */ -+#define NRF_RADIO_MIN_EXTENSION_MARGIN_US (79) -+ - - enum NRF_RADIO_SIGNAL_CALLBACK_ACTION - { - NRF_RADIO_SIGNAL_CALLBACK_ACTION_NONE, /**< Return without action. */ -- NRF_RADIO_SIGNAL_CALLBACK_ACTION_EXTEND, /**< Request an extension of the current timeslot (maximum execution time for this action is when the extension succeeded). */ -+ NRF_RADIO_SIGNAL_CALLBACK_ACTION_EXTEND, /**< Request an extension of the current -+ timeslot. Maximum execution time for this action: -+ @ref NRF_RADIO_MAX_EXTENSION_PROCESSING_TIME_US. -+ This action must be started at least @ref -+ NRF_RADIO_MIN_EXTENSION_MARGIN_US before -+ the end of the timeslot. */ - NRF_RADIO_SIGNAL_CALLBACK_ACTION_END, /**< End the current radio timeslot. */ - NRF_RADIO_SIGNAL_CALLBACK_ACTION_REQUEST_AND_END /**< Request a new radio timeslot and end the current timeslot. */ - }; -
\ No newline at end of file diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/doc/ble_api.dox b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/doc/ble_api.dox deleted file mode 100644 index e2913931e..000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/doc/ble_api.dox +++ /dev/null @@ -1,3685 +0,0 @@ -/** - * @addtogroup BLE_COMMON - * @{ - * @defgroup BLE_COMMON_MSC Message Sequence Charts - * @{ - * - * @defgroup BLE_COMMON_ENABLE BLE Stack Enable - * @{ - * @msc - * hscale = "1.5"; - * APP,SD; - * |||; - * APP=>SD [label = "sd_softdevice_enable(clock, assertion_handler);"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP rbox APP [label="Set app_ram_base to SoftDevice default from release notes"]; - * |||; - * --- [label = "Configure the BLE stack"]; - * |||; - * APP=>SD [label = "sd_ble_cfg_set(cfg_id, cfg, app_ram_base);"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * ...; - * APP=>SD [label = "sd_ble_cfg_set(cfg_id, cfg, app_ram_base);"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * --- [label = "During development: Determine the region of memory required by the SoftDevice"]; - * --- [label = "Alternative 1: The default app_ram_base is too small for the configuration"]; - * |||; - * APP=>SD [label = "sd_ble_enable(&app_ram_base);"]; - * APP<<SD [label = "NRF_ERROR_NO_MEM"]; - * APP rbox APP [label="app_ram_base filled by the SoftDevice with 0x2000xxxx"]; - * |||; - * APP abox APP [label="App sets 0x2000xxxx as its RAM starting point and rebuilds", textbgcolor="#7fff7f"]; - * |||; - * --- [label = "Alternative 2: The default app_ram_base is large enough for the configuration but - * the app wants to save RAM"]; - * |||; - * APP=>SD [label = "sd_ble_enable(&app_ram_base);"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP rbox APP [label="app_ram_base filled by the SoftDevice with 0x2000yyyy"]; - * |||; - * APP abox APP [label="App sets 0x2000yyyy as its RAM starting point and rebuilds", textbgcolor="#7fff7f"]; - * |||; - * --- [label = "Alternative 3: The default app_ram_base is large enough for the configuration, app - * does not need to save RAM"]; - * |||; - * APP=>SD [label = "sd_ble_enable(&app_ram_base);"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP rbox APP [label="The app doesn't care about the value filled into app_ram_base"]; - * |||; - * --- [label = "After development: The normal BLE Stack Enable sequence"]; - * APP=>SD [label = "sd_softdevice_enable(clock, assertion_handler);"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP rbox APP [label="Set app_ram_base to value determined during development"]; - * |||; - * --- [label = "Configure the BLE stack"]; - * |||; - * APP=>SD [label = "sd_ble_cfg_set(cfg_id, cfg, app_ram_base);"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * ...; - * APP=>SD [label = "sd_ble_cfg_set(cfg_id, cfg, app_ram_base);"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * --- [label = "Enable the BLE stack"]; - * |||; - * APP=>SD [label = "sd_ble_enable(&app_ram_base);"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * @endmsc - * @} - * - * @defgroup BLE_CONN_CFG Connection Configuration - * @{ - * @msc - * hscale = "1.5"; - * APP,SD; - * |||; - * APP=>SD [label = "sd_softdevice_enable(clock, assertion_handler);"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * --- [label = "Configure the connection configurations"]; - * |||; - * APP rbox APP [label=" Configure GAP connection configuration"]; - * APP=>SD [label = "sd_ble_cfg_set(BLE_CONN_CFG_GAP, cfg = {conn_cfg_tag = 1, gap_conn_cfg.conn_count = 1, app_ram_base);"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP rbox APP [label=" Configure GATT connection configuration"]; - * APP=>SD [label = "sd_ble_cfg_set(BLE_CONN_CFG_GATT, cfg = {conn_cfg_tag = 1, gatt_conn_cfg, app_ram_base);"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP rbox APP [label=" Configure GATTC connection configuration"]; - * APP=>SD [label = "sd_ble_cfg_set(BLE_CONN_CFG_GATTC, cfg = {conn_cfg_tag = 1, gattc_conn_cfg, app_ram_base);"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP rbox APP [label=" Configure GATTS connection configuration"]; - * APP=>SD [label = "sd_ble_cfg_set(BLE_CONN_CFG_GATTS, cfg = {conn_cfg_tag = 1, gatts_conn_cfg, app_ram_base);"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP=>SD [label = "sd_ble_enable(&app_ram_base);"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * --- [label = "Establish connection with different connection configurations"]; - * |||; - * APP rbox APP [label="Establish connection with the default connection configuration"]; - * APP=>SD [label = "sd_ble_gap_connect(params, conn_cfg_tag = BLE_CONN_CFG_TAG_DEFAULT);"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP rbox APP [label="Establish connection with connection configuration #1"]; - * APP=>SD [label = "sd_ble_gap_adv_start(params, conn_cfg_tag = 1);"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * --- [label = " No more connections can be established with connection configuration #1"]; - * |||; - * APP note SD [label = "A connection cannot be established if the number of established connections is equal to the connection count of the connection configuration"]; - * |||; - * APP=>SD [label = "sd_ble_gap_connect(params, conn_cfg_tag = 1);"]; - * APP<<SD [label = "NRF_ERROR_CONN_COUNT"]; - * @endmsc - * @} - * @defgroup BLE_COMMON_IRQ_EVT_MSC Interrupt-driven Event Retrieval - * @msc - * hscale = "1.5"; - * APP,SD; - * |||; - * APP=>SD [label = "sd_softdevice_enable(clock, assertion_handler);"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP=>SD [label = "sd_nvic_EnableIRQ(SD_EVT_IRQn)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP rbox SD [label="Application runs and uses SD API"]; - * |||; - * SD rbox SD [label="Event Available for the App"]; - * |||; - * APP<-SD [label = "SD_EVT_IRQn", textcolor="#800080", linecolor="#800080"]; - * APP=>APP [label = "SD_EVT_IRQHandler()"]; - * APP=>SD [label = "sd_ble_evt_get(buffer);"]; - * APP<<SD [label = "{NRF_SUCCESS, event}"]; - * |||; - * @endmsc - * - * @defgroup BLE_COMMON_THREAD_EVT_MSC Thread Mode Event Retrieval - * @msc - * hscale = "1.5"; - * APP,SD; - * |||; - * APP=>SD [label = "sd_softdevice_enable(clock, assertion_handler);"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP=>SD [label = "sd_app_evt_wait(void);"]; - * APP rbox APP [label="App Thread Mode blocked, CPU in low power mode"]; - * |||; - * ...; - * |||; - * SD rbox SD [label="Event Available for the App"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP=>SD [label = "sd_ble_evt_get(buffer);"]; - * APP<<SD [label = "{NRF_SUCCESS, event}"]; - * APP=>SD [label = "sd_app_evt_wait(void);"]; - * APP rbox APP [label="App Thread Mode blocked, CPU in low power mode"]; - * |||; - * ...; - * |||; - * SD rbox SD [label="Event Available for the App"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP=>SD [label = "sd_ble_evt_get(buffer);"]; - * APP<<SD [label = "{NRF_SUCCESS, event}"]; - * APP=>SD [label = "sd_app_evt_wait(void);"]; - * APP rbox APP [label="App Thread Mode blocked, CPU in low power mode"]; - * |||; - * ...; - * |||; - * @endmsc - * - * @} - * @} - */ - -/** - * @addtogroup BLE_GAP - * @{ - * @defgroup BLE_GAP_MSC Message Sequence Charts - * @{ - * @defgroup BLE_GAP_ADV_MSC Advertising - * @msc - * hscale = "1.5"; - * APP,SD,SCANNERS; - * |||; - * APP=>SD [label = "sd_ble_gap_addr_set(peer_addr)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP=>SD [label = "sd_ble_gap_adv_data_set(adv, sr)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP=>SD [label = "sd_ble_gap_adv_start(params)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD->SCANNERS [label = "ADV packet", textcolor="#000080", linecolor="#000080"]; - * SD->SCANNERS [label = "ADV packet", textcolor="#000080", linecolor="#000080"]; - * SD->SCANNERS [label = "ADV packet", textcolor="#000080", linecolor="#000080"]; - * ...; - * SD->SCANNERS [label = "ADV packet", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #1 App Stops Advertisement "]; - * APP=>SD [label = "sd_ble_gap_adv_stop()"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * --- [label = " Variant #2 Advertisement Timeout "]; - * APP<<=SD [label = "BLE_GAP_EVT_TIMEOUT"]; - * @endmsc - * - * @defgroup BLE_GAP_CONN_MSC Peripheral Connection Establishment and Termination - * @msc - * hscale = "1.5"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Start Connectable Advertising"]; - * |||; - * SD<:>CENTRAL [label = "Connection Establishment", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONNECTED"]; - * |||; - * --- [label = " Variant #1 Local Disconnection "]; - * APP=>SD [label = "sd_ble_gap_disconnect(reason)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>CENTRAL [label = "Connection Termination", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_DISCONNECTED {reason}"]; - * |||; - * --- [label = " Variant #2 Remote Disconnection "]; - * SD<:CENTRAL [label = "Connection Termination", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_DISCONNECTED {reason}"]; - * @endmsc - * - * @defgroup BLE_GAP_CPU_MSC Peripheral Connection Parameter Update - * @msc - * hscale = "1.5"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established with conn. params. CP#1"]; - * |||; - * APP=>SD [label = "sd_ble_gap_conn_param_update(CP#2)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>CENTRAL [label = "L2CAP CPU Request", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #1 Central Accepts "]; - * |||; - * SD<:CENTRAL [label = "L2CAP CPU Response: Accepted", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:CENTRAL [label = "Connection Update Start", textcolor="#000080", linecolor="#000080"]; - * SD:>CENTRAL [label = "Connection Update Complete", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_PARAM_UPDATE {CP#2}"]; - * |||; - * --- [label = " Variant #2 Central Rejects "]; - * |||; - * SD<:CENTRAL [label = "L2CAP CPU Response: Rejected", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_PARAM_UPDATE {CP#1}"]; - * --- [label = " Variant #3 Central Ignores "]; - * |||; - * ...; - * |||; - * SD box SD [label="Timeout"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_PARAM_UPDATE {CP#1}"]; - * @endmsc - * - * @defgroup BLE_GAP_RSSI_FILT_MSC RSSI for connections with event filter - * @msc - * hscale = "1.5"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * --- [label = " Variant #1: Trigger event when a new RSSI is available"]; - * |||; - * APP=>SD [label = "sd_ble_gap_rssi_start(conn_handle, 0, 0)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD<-PEER [label = "RSSI Sample", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_RSSI_CHANGED {RSSI#1}"]; - * |||; - * SD<-PEER [label = "RSSI Sample", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_RSSI_CHANGED {RSSI#2}"]; - * |||; - * SD<-PEER [label = "RSSI Sample", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_RSSI_CHANGED {RSSI#3}"]; - * |||; - * APP=>SD [label = "sd_ble_gap_rssi_stop()"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * --- [label = " Variant #2: Only trigger event if RSSI changes by 5 dBm or more."]; - * |||; - * APP=>SD [label = "sd_ble_gap_rssi_start(conn_handle, 0x05, 0x00)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD<-PEER [label = "RSSI Sample=0x00", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_RSSI_CHANGED {RSSI#1}"]; - * |||; - * SD<-PEER [label = "RSSI Sample=0x04", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<-PEER [label = "RSSI Sample=0x03", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<-PEER [label = "RSSI Sample>=0x05", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_RSSI_CHANGED {RSSI#2}"]; - * |||; - * APP=>SD [label = "sd_ble_gap_rssi_stop()"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * --- [label = " Variant #3: Only trigger event if more than 3 RSSI samples have deviated from the last reported RSSI by 5 dBm or more."]; - * |||; - * APP=>SD [label = "sd_ble_gap_rssi_start(conn_handle, 0x05, 0x03)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD<-PEER [label = "RSSI Sample=0x00", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_RSSI_CHANGED {RSSI#1}"]; - * |||; - * SD<-PEER [label = "RSSI Sample=0x04", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<-PEER [label = "RSSI Sample=0x0A", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<-PEER [label = "RSSI Sample>=0x06", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<-PEER [label = "RSSI Sample>=0x09", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<-PEER [label = "RSSI Sample>=0x07", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_RSSI_CHANGED {RSSI#2}"]; - * |||; - * APP=>SD [label = "sd_ble_gap_rssi_stop()"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * @endmsc - * - * @defgroup BLE_GAP_CENTRAL_RSSI_READ_MSC RSSI get sample - * @msc - * hscale = "1.5"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gap_rssi_get(conn_handle, p_rssi)"]; - * APP<<SD [label = "NRF_ERROR_INVALID_STATE"]; - * |||; - * APP=>SD [label = "sd_ble_gap_rssi_start(conn_handle, BLE_GAP_RSSI_THRESHOLD_INVALID, 0x00)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP=>SD [label = "sd_ble_gap_rssi_get(conn_handle, p_rssi)"]; - * APP<<SD [label = "NRF_ERROR_NOT_FOUND"]; - * ...; - * ...; - * APP rbox PEER [label="Connection events"]; - * ...; - * ...; - * |||; - * SD<-PEER [label = "RSSI Sample=0x03 [dBm]", textcolor="#000080", linecolor="#000080"]; - * APP=>SD [label = "sd_ble_gap_rssi_get(conn_handle, p_rssi)"]; - * APP<<SD [label = "NRF_SUCCESS, *p_rssi=0x03 [dBm]"]; - * APP=>SD [label = "sd_ble_gap_rssi_stop()"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_SEC_MSC Peripheral Security Procedures - * @{ - * - * @defgroup BLE_GAP_PERIPH_SEC_REQ_MSC Peripheral Security Request - * @msc - * hscale = "1.5"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gap_authenticate(params)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>CENTRAL [label = "SMP Security Request", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #1 Central initiates Security Establishment "]; - * |||; - * APP rbox CENTRAL [label="Encryption or Pairing/Bonding initiated by Central"]; - * |||; - * --- [label = " Variant #2 Central ignores "]; - * |||; - * ...; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {auth_status: Timeout, error_src: local}"]; - * |||; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_LEGACY_MSC Peripheral Legacy Pairing - * @{ - * - * @defgroup BLE_GAP_PERIPH_PAIRING_JW_MSC Pairing: Just Works - * @msc - * hscale = "2"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: no_bond, no_mitm, no_io_caps}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: no_bond, no_mitm, no_io_caps, p_keyset: NULL)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>CENTRAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD abox CENTRAL [label="Legacy Pairing Phase 2", textbgcolor="#7f7fff"]; - * |||; - * APP rbox CENTRAL [label = "Encrypted with STK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {ENC_NO_MITM}"]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_BONDING_JW_MSC Bonding: Just Works - * @msc - * hscale = "2"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: bond, no_mitm, no_io_caps}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: bond, no_mitm, no_io_caps, p_keyset)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>CENTRAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD abox CENTRAL [label="Legacy Pairing Phase 2", textbgcolor="#7f7fff"]; - * |||; - * APP rbox CENTRAL [label = "Encrypted with STK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {ENC_NO_MITM}"]; - * |||; - * SD abox CENTRAL [label="SMP Pairing Phase 3", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * APP rbox APP [label = "Keys stored in keyset"]; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_BONDING_PK_PERIPH_MSC Bonding: Passkey Entry, Peripheral displays - * @msc - * hscale = "2"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: bond, mitm, keyboard}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: bond, mitm, display, p_keyset)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>CENTRAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PASSKEY_DISPLAY {passkey, match_request=0}"]; - * APP rbox APP [label="Passkey displayed to the user"]; - * |||; - * SD abox CENTRAL [label="Legacy Pairing Phase 2", textbgcolor="#7f7fff"]; - * |||; - * APP rbox CENTRAL [label = "Encrypted with STK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {ENC_MITM}"]; - * |||; - * SD abox CENTRAL [label="SMP Pairing Phase 3", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * APP rbox APP [label = "Keys stored in keyset"]; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_BONDING_PK_CENTRAL_OOB_MSC Bonding: Passkey Entry, User Inputs on Peripheral or OOB - * @msc - * hscale = "2"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: bond, mitm, display}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: bond, mitm, keyboard, p_keyset)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>CENTRAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_KEY_REQUEST {type}"]; - * APP rbox APP [label="User enters Passkey or data received Out Of Band"]; - * APP=>SD [label = "sd_ble_gap_auth_key_reply(passkey or OOB)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD abox CENTRAL [label="Legacy Pairing Phase 2", textbgcolor="#7f7fff"]; - * |||; - * APP rbox CENTRAL [label = "Encrypted with STK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {ENC_MITM}"]; - * |||; - * SD abox CENTRAL [label="SMP Pairing Phase 3", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * APP rbox APP [label = "Keys stored in keyset"]; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_BONDING_STATIC_PK_MSC Bonding: Passkey Entry with static passkey - * @msc - * hscale = "2"; - * APP,SD,CENTRAL; - * |||; - * APP=>SD [label = "sd_ble_opt_set(opt_id = BLE_GAP_OPT_PASSKEY, p_opt->p_passkey=passkey)"]; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: bond, mitm, keyboard}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: bond, mitm, display, p_keyset)"]; - * - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>CENTRAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PASSKEY_DISPLAY {passkey, match_request=0}"]; - * APP rbox APP [label="Passkey displayed to the user"]; - * |||; - * SD abox CENTRAL [label="Legacy Pairing Phase 2", textbgcolor="#7f7fff"]; - * |||; - * APP rbox CENTRAL [label = "Encrypted with STK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {ENC_MITM}"]; - * |||; - * SD abox CENTRAL [label="SMP Pairing Phase 3", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * APP rbox APP [label = "Keys stored in keyset"]; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_PAIRING_CONFIRM_FAIL_MSC Pairing failure: Confirm failed - * This occurs if the random value doesn't match, usually because the user entered a wrong pin - * or out of band data was missing. - * @msc - * hscale = "2"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: mitm, display}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: mitm, keyboard, p_keyset: NULL)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>CENTRAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * SD<:CENTRAL [label = "SMP Pairing Confirm", textcolor="#000080", linecolor="#000080"]; - * SD:>CENTRAL [label = "SMP Pairing Confirm", textcolor="#000080", linecolor="#000080"]; - * SD<:CENTRAL [label = "SMP Pairing Random", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {auth_status: Confirm value, error_src: local}"]; - * SD:>CENTRAL [label = "SMP Pairing failed", textcolor="#000080", linecolor="#000080"]; - * @endmsc - * - * @} - * - * @defgroup BLE_GAP_PERIPH_LESC_MSC Peripheral LESC Pairing - * @{ - * - * @defgroup BLE_GAP_PERIPH_LESC_PAIRING_JW_MSC Pairing: Just Works - * @msc - * hscale = "2"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: lesc, no_bond, no_mitm, no_io_caps}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: lesc, no_bond, no_mitm, no_io_caps, p_pk_own)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>CENTRAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Public Key: PKa", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_LESC_DHKEY_REQUEST {p_peer_pk}"]; - * SD:>CENTRAL [label = "SMP Pairing Public Key: PKb", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP abox APP [label="App starts DHKey calculation"]; - * |||; - * SD abox CENTRAL [label="LESC Authentication Stage 1", textbgcolor="#7f7fff"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing DHKey Check: Ea", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP abox APP [label="App completes DHKey calculation"]; - * APP=>SD [label = "sd_ble_gap_lesc_dhkey_reply(p_dhkey)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>CENTRAL [label = "SMP Pairing DHKey Check: Eb", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP rbox CENTRAL [label = "Encrypted with LTK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {ENC_NO_MITM}"]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_LESC_BONDING_NC_MSC Bonding: Numeric Comparison - * @msc - * hscale = "2"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: lesc, bond, mitm, display(kbd/yesno)}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: lesc, bond, mitm, display(kbd/yesno), keyset with p_pk_own)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>CENTRAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Public Key: PKa", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_LESC_DHKEY_REQUEST {p_peer_pk}"]; - * SD:>CENTRAL [label = "SMP Pairing Public Key: PKb", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP abox APP [label="App starts DHKey calculation"]; - * |||; - * SD abox CENTRAL [label="LESC Authentication Stage 1", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_PASSKEY_DISPLAY {passkey, match_request=1}"]; - * APP rbox APP [label="Passkey displayed to the user, user compares values"]; - * |||; - * --- [label = " Variant #1 User confirms on both sides "]; - * APP=>SD [label = "sd_ble_gap_auth_key_reply(BLE_GAP_AUTH_KEY_TYPE_PASSKEY, NULL)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing DHKey Check: Ea", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP abox APP [label="App completes DHKey calculation"]; - * APP=>SD [label = "sd_ble_gap_lesc_dhkey_reply(p_dhkey)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>CENTRAL [label = "SMP Pairing DHKey Check: Eb", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP rbox CENTRAL [label = "Encrypted with LTK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {LESC_ENC_MITM}"]; - * |||; - * SD abox CENTRAL [label="SMP Pairing Phase 3", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * APP rbox APP [label = "Keys stored in keyset"]; - * --- [label = " Variant #2 User does not confirm locally "]; - * APP=>SD [label = "sd_ble_gap_auth_key_reply(BLE_GAP_AUTH_KEY_TYPE_NONE, NULL)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {auth_status: num comp failure, error_src: local}"]; - * SD:>CENTRAL [label = "SMP Pairing failed", textcolor="#000080", linecolor="#000080"]; - * --- [label = " Variant #3 User does not confirm remotely "]; - * SD<:CENTRAL [label = "SMP Pairing failed", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {auth_status: num comp failure, error_src: remote}"]; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_LESC_BONDING_PKE_PD_MSC Bonding: Passkey Entry, Peripheral Displays - * @msc - * hscale = "2"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: lesc, bond, mitm, keyboard}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: lesc, bond, mitm, display, keyset with p_pk_own)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>CENTRAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_PASSKEY_DISPLAY {passkey, match_request=0}"]; - * APP rbox APP [label="Passkey displayed to the user"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Public Key: PKa", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_LESC_DHKEY_REQUEST {p_peer_pk}"]; - * SD:>CENTRAL [label = "SMP Pairing Public Key: PKb", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP abox APP [label="App starts DHKey calculation"]; - * |||; - * --- [label = " Optional keypresses from peer "]; - * SD<:CENTRAL [label = "Keypress Notification", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_KEY_PRESSED {type}"]; - * APP abox APP [label="App displays keypress"]; - * SD<:CENTRAL [label = "Keypress Notification", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_KEY_PRESSED {type}"]; - * APP abox APP [label="App displays keypress"]; - * |||; - * --- [label = ""]; - * SD abox CENTRAL [label="LESC Authentication Stage 1", textbgcolor="#7f7fff"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing DHKey Check: Ea", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP abox APP [label="App completes DHKey calculation"]; - * APP=>SD [label = "sd_ble_gap_lesc_dhkey_reply(p_dhkey)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>CENTRAL [label = "SMP Pairing DHKey Check: Eb", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP rbox CENTRAL [label = "Encrypted with LTK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {LESC_ENC_MITM}"]; - * |||; - * SD abox CENTRAL [label="SMP Pairing Phase 3", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * APP rbox APP [label = "Keys stored in keyset"]; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC Bonding: Passkey Entry, User Inputs on Peripheral - * @msc - * hscale = "2"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: lesc, bond, mitm, display}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: lesc, bond, mitm, keyboard, keyset with p_pk_own)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>CENTRAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_KEY_REQUEST {passkey}"]; - * APP rbox APP [label="User enters Passkey"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Public Key: PKa", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_LESC_DHKEY_REQUEST {p_peer_pk}"]; - * SD:>CENTRAL [label = "SMP Pairing Public Key: PKb", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP abox APP [label="App starts DHKey calculation"]; - * |||; - * --- [label = " Optional keypresses sent to peer "]; - * APP=>SD [label = "sd_ble_gap_keypress_notify(type)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>CENTRAL [label = "Keypress Notification", textcolor="#000080", linecolor="#000080"]; - * APP=>SD [label = "sd_ble_gap_keypress_notify(type)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>CENTRAL [label = "Keypress Notification", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = ""]; - * APP=>SD [label = "sd_ble_gap_auth_key_reply(passkey)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD abox CENTRAL [label="LESC Authentication Stage 1", textbgcolor="#7f7fff"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing DHKey Check: Ea", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP abox APP [label="App completes DHKey calculation"]; - * APP=>SD [label = "sd_ble_gap_lesc_dhkey_reply(p_dhkey)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>CENTRAL [label = "SMP Pairing DHKey Check: Eb", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP rbox CENTRAL [label = "Encrypted with LTK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {LESC_ENC_MITM}"]; - * |||; - * SD abox CENTRAL [label="SMP Pairing Phase 3", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * APP rbox APP [label = "Keys stored in keyset"]; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_LESC_BONDING_OOB_MSC Bonding: Out of Band - * @msc - * hscale = "2"; - * APP,SD,CENTRAL; - * |||; - * APP=>SD [label = "sd_ble_gap_addr_set(addr)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP=>SD [label = "sd_ble_gap_lesc_oob_data_get(p_pk_own, p_oobd_own)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP abox CENTRAL [label="OOB communication: oobd_own sent and/or oobd_peer received", textbgcolor="silver"]; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: lesc, bond, oob}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: lesc, bond, oob, keyset with p_pk_own)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD:>CENTRAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Public Key: PKa", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_LESC_DHKEY_REQUEST {p_peer_pk, oobd_req=1}"]; - * SD:>CENTRAL [label = "SMP Pairing Public Key: PKb", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP abox APP [label="App starts DHKey calculation"]; - * |||; - * APP=>SD [label = "sd_ble_gap_lesc_oob_data_set(p_oobd_own, p_oobd_peer)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD abox CENTRAL [label="LESC Authentication Stage 1", textbgcolor="#7f7fff"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing DHKey Check: Ea", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP abox APP [label="App completes DHKey calculation"]; - * APP=>SD [label = "sd_ble_gap_lesc_dhkey_reply(p_dhkey)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>CENTRAL [label = "SMP Pairing DHKey Check: Eb", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP rbox CENTRAL [label = "Encrypted with LTK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {LESC_ENC_MITM}"]; - * |||; - * SD abox CENTRAL [label="SMP Pairing Phase 3", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * APP rbox APP [label = "Keys stored in keyset"]; - * @endmsc - * - * @} - * - * @defgroup BLE_GAP_PERIPH_PAIRING_KS_OUT_OF_RANGE_MSC Pairing failure: Keysize out of supported range - * This occurs if the min key size offered by the peer is above 16, or max key size below 7. - * @msc - * hscale = "2"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {auth_status: Invalid params, error_src: local}"]; - * SD:>CENTRAL [label = "SMP Pairing failed", textcolor="#000080", linecolor="#000080"]; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_PAIRING_KS_TOO_SMALL_MSC GAP Failed Pairing: Keysize too small - * This occurs if the max key size offered by the peer is below the min key size specified by - * the app. - * @msc - * hscale = "2"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>CENTRAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * SD<:CENTRAL [label = "SMP Pairing Confirm", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {auth_status: Enc key size, error_src: local}"]; - * SD:>CENTRAL [label = "SMP Pairing failed", textcolor="#000080", linecolor="#000080"]; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_PAIRING_APP_ERROR_MSC Pairing failure: Pairing aborted by the application - * When the application detects that the pairing should not be performed, for example an - * insufficient IO combination, it can use sd_ble_gap_sec_params_reply() to send - * SMP Pairing failed to the peer. - * - * When the stack handles the response from the application it will also validate - * the passkey (SMP_STC_PASSKEY_ENTRY_FAILED). If any error is detected it will be - * reported when sd_ble_gap_sec_params_reply() is called. - * @msc - * hscale = "2"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST"]; - * SD abox APP [label="Stack looks for errors", textbgcolor="#7f7fff"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(<code from application>)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>CENTRAL [label = "SMP Pairing failed", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {auth_status: <code from application>, error_src: local}"]; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_PAIRING_REMOTE_PAIRING_FAIL_MSC Pairing failure: Pairing failed from central - * SMP Pairing Failed may be sent from the central at various times. The application should - * prepare for this and gracefully handle the event. - * @msc - * hscale = "2"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>CENTRAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * SD<:CENTRAL [label = "SMP Pairing Failed", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {auth_status: <remote_reason>, error_src: remote}"]; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_PAIRING_TIMEOUT_MSC Pairing failure: Timeout - * This occurs if the central device doesn't continue the pairing sequence within 30 seconds. - * @msc - * hscale = "2"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>CENTRAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * --- [ label = "Wait 30 sec" ]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {auth_status: Timeout, error_src: local}"]; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_ENC_MSC Peripheral Encryption Establishment using stored keys - * @msc - * hscale = "1.5"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "LL Encryption Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_INFO_REQUEST {addr, ediv, rand}"]; - * |||; - * --- [label = " Variant #1 App Replies with Keys "]; - * |||; - * APP rbox APP [label = "Load Peripheral Keys"]; - * APP=>SD [label = "sd_ble_gap_sec_info_reply(ediv, rand, LTK)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>CENTRAL [label = "LL Encryption Response", textcolor="#000080", linecolor="#000080"]; - * APP rbox CENTRAL [label = "Encrypted with LTK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE"]; - * |||; - * --- [label = " Variant #2 App Replies without Keys "]; - * |||; - * APP=>SD [label = "sd_ble_gap_sec_info_reply(NULL)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>CENTRAL [label = "LL Reject Ind: Pin or Key Missing", textcolor="#000080", linecolor="#000080"]; - * APP rbox CENTRAL [label = "Link is NOT encrypted"]; - * |||; - * --- [label = " Variant #3 App Replies with Incorrect Keys "]; - * |||; - * APP rbox APP [label = "Load Incorrect Peripheral Keys"]; - * APP=>SD [label = "sd_ble_gap_sec_info_reply(ediv, rand, LTK)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>CENTRAL [label = "LL Encryption Response", textcolor="#000080", linecolor="#000080"]; - * SD<:CENTRAL [label = "Connection Termination", textcolor="#000080", linecolor="#000080"]; - * APP rbox CENTRAL [label = "Link Terminated"]; - * APP<<=SD [label = "BLE_GAP_EVT_DISCONNECTED {MIC Failure}"]; - * @endmsc - * @} - * - * - * - * @defgroup BLE_GAP_SCAN_MSC Scanning - * @msc - * hscale = "1.5"; - * APP,SD,ADVERTISERS; - * |||; - * APP=>SD [label = "sd_ble_gap_scan_start(params)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD<-ADVERTISERS [label = "ADV packet", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_ADV_REPORT {bdaddr, rssi, data}"]; - * SD<-ADVERTISERS [label = "ADV packet", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_ADV_REPORT {bdaddr, rssi, data}"]; - * SD<-ADVERTISERS [label = "ADV packet", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_ADV_REPORT {bdaddr, rssi, data}"]; - * ...; - * SD<-ADVERTISERS [label = "ADV packet", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_ADV_REPORT {bdaddr, rssi, data}"]; - * |||; - * --- [label = " Variant #1 App Stops Scanning "]; - * APP=>SD [label = "sd_ble_gap_scan_stop()"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * --- [label = " Variant #2 Scanning Timeout "]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_TIMEOUT {BLE_GAP_TIMEOUT_SRC_SCAN}"]; - * @endmsc - * - * @defgroup BLE_GAP_CENTRAL_CONN_MSC Central Connection Establishment and Termination - * @msc - * hscale = "1.5"; - * APP,SD,PERIPHERAL; - * |||; - * PERIPHERAL rbox PERIPHERAL [label="Peripheral Start Connectable Advertising"]; - * |||; - * APP=>SD [label = "sd_ble_gap_connect(params)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PERIPHERAL [label = "Scanning", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #1 Connection Established "]; - * SD<:>PERIPHERAL [label = "Connection Establishment", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONNECTED"]; - * |||; - * --- [label = " Variant #2 Connection Establishment Cancelled "]; - * APP=>SD [label = "sd_ble_gap_connect_cancel()"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * --- [label = " Variant #3 Connection Timeout "]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_TIMEOUT {BLE_GAP_TIMEOUT_SRC_CONN}"]; - * @endmsc - * - * @defgroup BLE_GAP_CENTRAL_CPU_MSC Central Connection Parameter Update - * @msc - * hscale = "1.5"; - * APP,SD,PERIPHERAL; - * |||; - * APP rbox PERIPHERAL [label="Connection Established with conn. params. CP#1"]; - * |||; - * --- [label = " Unsolicited procedure"]; - * |||; - * APP=>SD [label = "sd_ble_gap_conn_param_update(CP#2)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD:>PERIPHERAL [label = "Connection Update Start", textcolor="#000080", linecolor="#000080"]; - * SD<:PERIPHERAL [label = "Connection Update Complete", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_PARAM_UPDATE {CP#2}"]; - * |||; - * --- [label = " Peripheral Solicited procedure"]; - * |||; - * SD<:PERIPHERAL [label = "L2CAP CPU Request {CP#3}", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST {CP#3}"]; - * |||; - * --- [label = " Variant #1 App Accepts "]; - * APP=>SD [label = "sd_ble_gap_conn_param_update(CP#3)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PERIPHERAL [label = "L2CAP CPU Response: Accepted", textcolor="#000080", linecolor="#000080"]; - * SD:>PERIPHERAL [label = "Connection Update Start", textcolor="#000080", linecolor="#000080"]; - * SD<:PERIPHERAL [label = "Connection Update Complete", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_PARAM_UPDATE {CP#3}"]; - * |||; - * --- [label = " Variant #2 App Rejects "]; - * |||; - * APP=>SD [label = "sd_ble_gap_conn_param_update(NULL)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PERIPHERAL [label = "L2CAP CPU Response: Rejected", textcolor="#000080", linecolor="#000080"]; - * |||; - * @endmsc - * - * @defgroup BLE_GAP_CENTRAL_SEC_MSC Central Security Procedures - * @{ - * - * @defgroup BLE_GAP_CENTRAL_SEC_REQ_MSC Security Request Reception - * @msc - * hscale = "1.5"; - * APP,SD,PERIPHERAL; - * |||; - * APP rbox PERIPHERAL [label="Connection Established"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Security Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_REQUEST {bond, mitm}"]; - * |||; - * --- [label = " Variant #1 Central initiates Security Establishment "]; - * |||; - * APP=>SD [label = "sd_ble_gap_encrypt(ediv, rand, LTK)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP rbox PERIPHERAL [label = "Encrypted with LTK"]; - * |||; - * --- [label = " Variant #2 Central Triggers pairing or bonding "]; - * |||; - * APP=>SD [label = "sd_ble_gap_authenticate(params)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP rbox PERIPHERAL [label = "Pairing procedure"]; - * |||; - * --- [label = " Variant #3 Central rejects the Security Request "]; - * |||; - * APP=>SD [label = "sd_ble_gap_authenticate(NULL)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD:>PERIPHERAL [label = "SMP Pairing Failed: Pairing Not Supported", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {auth_status: Pairing Not Supp, error_src: local}"]; - * |||; - * @endmsc - * - * @defgroup BLE_GAP_CENTRAL_LEGACY_MSC Central Legacy Pairing - * @{ - * - * @defgroup BLE_GAP_CENTRAL_PAIRING_JW_MSC Pairing: Just Works - * @msc - * hscale = "2"; - * APP,SD,PERIPHERAL; - * |||; - * APP rbox PERIPHERAL [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gap_authenticate(no_bond, no_mitm, no_io_caps)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PERIPHERAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: no_bond, no_mitm, no_io_caps}"]; - * |||; - * --- [label = " Variant #1 Central Accepts Peripheral parameters "]; - * |||; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: NULL, p_keyset: NULL)"]; - * |||; - * SD abox PERIPHERAL [label="Legacy Pairing Phase 2", textbgcolor="#7f7fff"]; - * |||; - * APP rbox PERIPHERAL [label = "Encrypted with STK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {ENC_NO_MITM}"]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * |||; - * --- [label = " Variant #2 Central Rejects Peripheral parameters "]; - * |||; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(BLE_GAP_SEC_STATUS_INVALID_PARAMS, own_params: NULL, p_keyset: NULL)"]; - * |||; - * SD:>PERIPHERAL [label = "SMP Pairing Failed", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {FAILURE}"]; - * @endmsc - * - * @defgroup BLE_GAP_CENTRAL_BONDING_JW_MSC Bonding: Just Works - * @msc - * hscale = "2"; - * APP,SD,PERIPHERAL; - * |||; - * APP rbox PERIPHERAL [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gap_authenticate(bond, no_mitm, no_io_caps)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PERIPHERAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: bond, no_mitm, no_io_caps}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: NULL, p_keyset)"]; - * |||; - * SD abox PERIPHERAL [label="Legacy Pairing Phase 2", textbgcolor="#7f7fff"]; - * |||; - * APP rbox PERIPHERAL [label = "Encrypted with STK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {ENC_NO_MITM}"]; - * |||; - * SD abox PERIPHERAL [label="SMP Pairing Phase 3", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * APP rbox APP [label = "Keys stored in keyset"]; - * @endmsc - * - * @defgroup BLE_GAP_CENTRAL_BONDING_PK_PERIPH_MSC Bonding: Passkey Entry, Central displays - * @msc - * hscale = "2"; - * APP,SD,PERIPHERAL; - * |||; - * APP rbox PERIPHERAL [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gap_authenticate(bond, mitm, display)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PERIPHERAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing Response}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: bond, mitm, keyboard}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: NULL, p_keyset)"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_PASSKEY_DISPLAY {passkey, match_request=0}"]; - * APP rbox APP [label="Passkey displayed to the user"]; - * |||; - * SD abox PERIPHERAL [label="Legacy Pairing Phase 2", textbgcolor="#7f7fff"]; - * |||; - * APP rbox PERIPHERAL [label = "Encrypted with STK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {ENC_MITM}"]; - * |||; - * SD abox PERIPHERAL [label="SMP Pairing Phase 3", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * APP rbox APP [label = "Keys stored in keyset"]; - * @endmsc - * - * @defgroup BLE_GAP_CENTRAL_BONDING_PK_PERIPH_OOB_MSC Bonding: Passkey Entry, User Inputs on Central or OOB - * @msc - * hscale = "2"; - * APP,SD,PERIPHERAL; - * |||; - * APP rbox PERIPHERAL [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gap_authenticate(bond, mitm, keyboard)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PERIPHERAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: bond, mitm, display}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: NULL, p_keyset)"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_KEY_REQUEST {type}"]; - * APP rbox APP [label="User enters Passkey or data received Out Of Band"]; - * APP=>SD [label = "sd_ble_gap_auth_key_reply(passkey or OOB)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD abox PERIPHERAL [label="Legacy Pairing Phase 2", textbgcolor="#7f7fff"]; - * |||; - * APP rbox PERIPHERAL [label = "Encrypted with STK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {ENC_MITM}"]; - * |||; - * SD abox PERIPHERAL [label="SMP Pairing Phase 3", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * APP rbox APP [label = "Keys stored in keyset"]; - * @endmsc - * - * @} - * - * @defgroup BLE_GAP_CENTRAL_LESC_MSC Central LESC Pairing - * @{ - * @defgroup BLE_GAP_CENTRAL_LESC_PAIRING_JW_MSC Pairing: Just Works - * @msc - * hscale = "2"; - * APP,SD,PERIPHERAL; - * |||; - * APP rbox PERIPHERAL [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gap_authenticate(lesc, no_bond, no_mitm, no_io_caps)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PERIPHERAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: lesc, no_bond, no_mitm, no_io_caps}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: NULL, p_pk_own)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD:>PERIPHERAL [label = "SMP Pairing Public Key: PKa", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing Public Key: PKb", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_LESC_DHKEY_REQUEST {p_peer_pk}"]; - * |||; - * APP abox APP [label="App starts DHKey calculation"]; - * |||; - * SD abox PERIPHERAL [label="LESC Authentication Stage 1", textbgcolor="#7f7fff"]; - * |||; - * APP abox APP [label="App completes DHKey calculation"]; - * APP=>SD [label = "sd_ble_gap_lesc_dhkey_reply(p_dhkey)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PERIPHERAL [label = "SMP Pairing DHKey Check: Ea", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing DHKey Check: Eb", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP rbox PERIPHERAL [label = "Encrypted with LTK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {ENC_NO_MITM}"]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * @endmsc - * - * @defgroup BLE_GAP_CENTRAL_LESC_BONDING_NC_MSC Bonding: Numeric Comparison - * @msc - * hscale = "2"; - * APP,SD,PERIPHERAL; - * |||; - * APP rbox PERIPHERAL [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gap_authenticate(lesc, bond, mitm, display(kbd/yesno))"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PERIPHERAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: lesc, bond, mitm, display(kbd/yesno)}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: NULL, keyset with p_pk_own)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD:>PERIPHERAL [label = "SMP Pairing Public Key: PKa", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing Public Key: PKb", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_LESC_DHKEY_REQUEST {p_peer_pk}"]; - * |||; - * APP abox APP [label="App starts DHKey calculation"]; - * |||; - * SD abox PERIPHERAL [label="LESC Authentication Stage 1", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_PASSKEY_DISPLAY {passkey, match_request=1}"]; - * APP rbox APP [label="Passkey displayed to the user, user compares values"]; - * |||; - * --- [label = " Variant #1 User confirms on both sides "]; - * APP=>SD [label = "sd_ble_gap_auth_key_reply(BLE_GAP_AUTH_KEY_TYPE_PASSKEY, NULL)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP abox APP [label="App completes DHKey calculation"]; - * APP=>SD [label = "sd_ble_gap_lesc_dhkey_reply(p_dhkey)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PERIPHERAL [label = "SMP Pairing DHKey Check: Ea", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing DHKey Check: Eb", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP rbox PERIPHERAL [label = "Encrypted with LTK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {LESC_ENC_MITM}"]; - * |||; - * SD abox PERIPHERAL [label="SMP Pairing Phase 3", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * APP rbox APP [label = "Keys stored in keyset"]; - * --- [label = " Variant #2 User does not confirm locally "]; - * APP=>SD [label = "sd_ble_gap_auth_key_reply(BLE_GAP_AUTH_KEY_TYPE_NONE, NULL)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {auth_status: num comp failure, error_src: local}"]; - * SD:>PERIPHERAL [label = "SMP Pairing failed", textcolor="#000080", linecolor="#000080"]; - * --- [label = " Variant #3 User does not confirm remotely "]; - * SD<:PERIPHERAL [label = "SMP Pairing failed", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {auth_status: num comp failure, error_src: remote}"]; - * @endmsc - * - * @defgroup BLE_GAP_CENTRAL_LESC_BONDING_PKE_PD_MSC Bonding: Passkey Entry: Central Displays - * @msc - * hscale = "2"; - * APP,SD,PERIPHERAL; - * |||; - * APP rbox PERIPHERAL [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gap_authenticate(lesc, bond, mitm, display)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PERIPHERAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: lesc, bond, mitm, keyboard}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: NULL, keyset with p_pk_own)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_PASSKEY_DISPLAY {passkey, match_request=0}"]; - * APP rbox APP [label="Passkey displayed to the user"]; - * |||; - * SD:>PERIPHERAL [label = "SMP Pairing Public Key: PKa", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing Public Key: PKb", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_LESC_DHKEY_REQUEST {p_peer_pk}"]; - * |||; - * APP abox APP [label="App starts DHKey calculation"]; - * |||; - * --- [label = " Optional keypresses from peer "]; - * SD<:PERIPHERAL [label = "Keypress Notification", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_KEY_PRESSED {type}"]; - * APP abox APP [label="App displays keypress"]; - * SD<:PERIPHERAL [label = "Keypress Notification", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_KEY_PRESSED {type}"]; - * APP abox APP [label="App displays keypress"]; - * |||; - * --- [label = ""]; - * SD abox PERIPHERAL [label="LESC Authentication Stage 1", textbgcolor="#7f7fff"]; - * |||; - * APP abox APP [label="App completes DHKey calculation"]; - * APP=>SD [label = "sd_ble_gap_lesc_dhkey_reply(p_dhkey)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PERIPHERAL [label = "SMP Pairing DHKey Check: Ea", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing DHKey Check: Eb", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP rbox PERIPHERAL [label = "Encrypted with LTK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {LESC_ENC_MITM}"]; - * |||; - * SD abox PERIPHERAL [label="SMP Pairing Phase 3", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * APP rbox APP [label = "Keys stored in keyset"]; - * @endmsc - * - * @defgroup BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC Bonding: Passkey Entry: User Inputs on Central - * @msc - * hscale = "2"; - * APP,SD,PERIPHERAL; - * |||; - * APP rbox PERIPHERAL [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gap_authenticate(lesc, bond, mitm, keyboard)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PERIPHERAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: lesc, bond, mitm, display}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: NULL, keyset with p_pk_own)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_KEY_REQUEST {passkey}"]; - * APP rbox APP [label="User enters Passkey"]; - * |||; - * SD:>PERIPHERAL [label = "SMP Pairing Public Key: PKa", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing Public Key: PKb", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_LESC_DHKEY_REQUEST {p_peer_pk}"]; - * |||; - * APP abox APP [label="App starts DHKey calculation"]; - * |||; - * --- [label = " Optional keypresses sent to peer "]; - * APP=>SD [label = "sd_ble_gap_keypress_notify(type)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PERIPHERAL [label = "Keypress Notification", textcolor="#000080", linecolor="#000080"]; - * APP=>SD [label = "sd_ble_gap_keypress_notify(type)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PERIPHERAL [label = "Keypress Notification", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = ""]; - * APP=>SD [label = "sd_ble_gap_auth_key_reply(passkey)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD abox PERIPHERAL [label="LESC Authentication Stage 1", textbgcolor="#7f7fff"]; - * |||; - * APP abox APP [label="App completes DHKey calculation"]; - * APP=>SD [label = "sd_ble_gap_lesc_dhkey_reply(p_dhkey)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PERIPHERAL [label = "SMP Pairing DHKey Check: Ea", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing DHKey Check: Eb", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP rbox PERIPHERAL [label = "Encrypted with LTK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {LESC_ENC_MITM}"]; - * |||; - * SD abox PERIPHERAL [label="SMP Pairing Phase 3", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * APP rbox APP [label = "Keys stored in keyset"]; - * @endmsc - * - * @defgroup BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC Bonding: Out of Band - * @msc - * hscale = "2"; - * APP,SD,PERIPHERAL; - * |||; - * APP=>SD [label = "sd_ble_gap_addr_set(addr)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP=>SD [label = "sd_ble_gap_lesc_oob_data_get(p_pk_own, p_oobd_own)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP abox PERIPHERAL [label="OOB communication: oobd_own sent and/or oobd_peer received", textbgcolor="silver"]; - * |||; - * APP rbox PERIPHERAL [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gap_authenticate(lesc, bond, oob)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PERIPHERAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: lesc, bond, oob}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: NULL, keyset with p_pk_own)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD:>PERIPHERAL [label = "SMP Pairing Public Key: PKa", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing Public Key: PKb", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_LESC_DHKEY_REQUEST {p_peer_pk, oobd_req=1}"]; - * |||; - * APP abox APP [label="App starts DHKey calculation"]; - * |||; - * APP=>SD [label = "sd_ble_gap_lesc_oob_data_set(p_oobd_own, p_oobd_peer)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD abox PERIPHERAL [label="LESC Authentication Stage 1", textbgcolor="#7f7fff"]; - * |||; - * APP abox APP [label="App completes DHKey calculation"]; - * APP=>SD [label = "sd_ble_gap_lesc_dhkey_reply(p_dhkey)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PERIPHERAL [label = "SMP Pairing DHKey Check: Ea", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing DHKey Check: Eb", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP rbox PERIPHERAL [label = "Encrypted with LTK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {LESC_ENC_MITM}"]; - * |||; - * SD abox PERIPHERAL [label="SMP Pairing Phase 3", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * APP rbox APP [label = "Keys stored in keyset"]; - * @endmsc - * @} - * - * - * @defgroup BLE_GAP_INVALID_SMP_PDU_MSC Unexpected Security Packet Reception - * @msc - * hscale = "1.5"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * APP rbox PEER [label="No pairing in progress"]; - * |||; - * PEER rbox PEER [label="Peer misbehaving"]; - * |||; - * SD<:PEER [label = "SMP Pairing Failed (or other unexpected SMP PDU)", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {PDU_INVALID}"]; - * |||; - * @endmsc - * - * @defgroup BLE_GAP_CENTRAL_ENC_MSC Encryption Establishment using stored keys - * @msc - * hscale = "1.5"; - * APP,SD,PERIPHERAL; - * |||; - * APP rbox PERIPHERAL [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gap_encrypt(ediv, rand, LTK)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD:>PERIPHERAL [label = "LL Encryption Request", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #1 Peripheral replies with keys "]; - * |||; - * PERIPHERAL rbox PERIPHERAL [label = "Peripheral Loads Keys"]; - * SD<:PERIPHERAL [label = "LL Encryption Response", textcolor="#000080", linecolor="#000080"]; - * APP rbox PERIPHERAL [label = "Encrypted with LTK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE"]; - * |||; - * --- [label = " Variant #2 Peripheral keys missing "]; - * |||; - * PERIPHERAL rbox PERIPHERAL [label = "Peripheral Keys Missing"]; - * SD<:PERIPHERAL [label = "LL Reject Ind: Pin or Key Missing", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE"]; - * APP rbox PERIPHERAL [label = "Link is NOT encrypted"]; - * |||; - * --- [label = " Variant #3 Incorrect peripheral keys "]; - * |||; - * PERIPHERAL rbox PERIPHERAL [label = "Peripheral Loads Incorrect Keys"]; - * SD<:PERIPHERAL [label = "LL Encryption Response", textcolor="#000080", linecolor="#000080"]; - * SD:>PERIPHERAL [label = "Connection Termination", textcolor="#000080", linecolor="#000080"]; - * APP rbox PERIPHERAL [label = "Link Terminated"]; - * APP<<=SD [label = "BLE_GAP_EVT_DISCONNECTED {MIC Failure}"]; - * |||; - * @endmsc - * - * @defgroup BLE_GAP_CENTRAL_ENC_AUTH_MUTEX_MSC Central Encryption and Authentication mutual exclusion - * @msc - * hscale = "1.5"; - * APP,SD,PEER; - * |||; - * APP=>SD [label = "sd_ble_gap_encrypt(ediv, rand, LTK)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD:>PEER [label = "Encryption Start", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP note SD [label = " Encryption in progress, authentication disallowed"]; - * |||; - * APP=>SD [label = "sd_ble_gap_authenticate()"]; - * APP<<SD [label = "NRF_ERROR_INVALID_STATE"]; - * |||; - * SD<:PEER [label = "Encryption Complete", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE "]; - * |||; - * APP=>SD [label = "sd_ble_gap_conn_param_update()"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD:>PEER [label = "Connection Update Start", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP=>SD [label = "sd_ble_gap_encrypt(ediv, rand, LTK)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD rbox SD [label="Encryption queued"]; - * |||; - * APP note SD [label = " Encryption queued, authentication disallowed"]; - * |||; - * APP=>SD [label = "sd_ble_gap_authenticate()"]; - * APP<<SD [label = "NRF_ERROR_INVALID_STATE"]; - * |||; - * SD<:PEER [label = "Connection Update Complete", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_PARAM_UPDATE"]; - * |||; - * SD:>PEER [label = "Encryption Start", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "Encryption Complete", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE "]; - * |||; - * APP=>SD [label = "sd_ble_gap_authenticate()"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP note SD [label = " Authentication in progress, encryption disallowed"]; - * |||; - * APP=>SD [label = "sd_ble_gap_encrypt(ediv, rand, LTK)"]; - * APP<<SD [label = "NRF_ERROR_INVALID_STATE"]; - * @endmsc - * @} - * - * @defgroup BLE_GAP_MULTILINK_CPU_MSC Central Connection Parameter Update on multiple links - * @msc - * hscale = "1.5"; - * APP,SD,PERIPHERALS; - * |||; - * APP rbox PERIPHERALS [label="Connection Established with 4 peers, all with conn. params. CP#0"]; - * |||; - * APP note PERIPHERALS [label = " Peripheral solicited procedure on link #2"]; - * |||; - * SD<:PERIPHERALS [label = "L2CAP CPU Request {CP#2}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST {conn_handle_2, CP#3}"]; - * |||; - * APP note PERIPHERALS [label = " Unsolicited procedure on links #3 and #1"]; - * |||; - * APP=>SD [label = "sd_ble_gap_conn_param_update(conn_handle_3, CP#3)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD:>PERIPHERALS [label = "Connection Update Start on link #3", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP=>SD [label = "sd_ble_gap_conn_param_update(conn_handle_1, CP#1)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP note PERIPHERALS [label = " Respond to solicited procedure on link #2"]; - * APP=>SD [label = "sd_ble_gap_conn_param_update(conn_handle_2, CP#2)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PERIPHERALS [label = "L2CAP CPU Response: Accepted", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP note PERIPHERALS [label = " Additional procedure on link #2 fails, since another one is pending"]; - * |||; - * APP=>SD [label = "sd_ble_gap_conn_param_update(conn_handle_2, CP#5)"]; - * APP<<SD [label = "NRF_ERROR_BUSY"]; - * |||; - * APP note PERIPHERALS [label = " Note: the order of execution is not guaranteed"]; - * |||; - * SD<:PERIPHERALS [label = "Connection Update Complete on link #3", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_PARAM_UPDATE {conn_handle_3, CP#3}"]; - * |||; - * SD:>PERIPHERALS [label = "Connection Update Start on link #1", textcolor="#000080", linecolor="#000080"]; - * SD<:PERIPHERALS [label = "Connection Update Complete on link #1", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_PARAM_UPDATE {conn_handle_1, CP#1}"]; - * |||; - * SD:>PERIPHERALS [label = "Connection Update Start on link #2", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP note PERIPHERALS [label = " Peripheral solicited procedure on link #4"]; - * |||; - * SD<:PERIPHERALS [label = "L2CAP CPU Request {CP#4}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST {conn_handle_4, CP#4}"]; - * |||; - * APP=>SD [label = "sd_ble_gap_conn_param_update(conn_handle_4, CP#4)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PERIPHERALS [label = "L2CAP CPU Response: Accepted", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERALS [label = "Connection Update Complete on link #2", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_PARAM_UPDATE {conn_handle_2, CP#2}"]; - * |||; - * SD:>PERIPHERALS [label = "Connection Update Start on link #4", textcolor="#000080", linecolor="#000080"]; - * SD<:PERIPHERALS [label = "Connection Update Complete on link #4", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_PARAM_UPDATE {conn_handle_4, CP#4}"]; - * |||; - * @endmsc - * - * @defgroup BLE_GAP_MULTILINK_CTRL_PROC_MSC Central Control Procedure Serialization on multiple links - * @msc - * hscale = "1.5"; - * APP,SD,PERIPHERALS; - * |||; - * APP rbox PERIPHERALS [label="Connection Established with 4 peers, all with conn. params. CP#0"]; - * |||; - * APP note PERIPHERALS [label = " Peripheral solicited procedure on link #2"]; - * |||; - * SD<:PERIPHERALS [label = "L2CAP CPU Request {CP#2}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST {conn_handle_2, CP#3}"]; - * |||; - * APP note PERIPHERALS [label = " Encryption procedure on link #3"]; - * |||; - * APP=>SD [label = "sd_ble_gap_encrypt(conn_handle_3, LTK#3)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD:>PERIPHERALS [label = "Encryption Start on link #3", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP note PERIPHERALS [label = " Connection Update procedure on link #1"]; - * |||; - * APP=>SD [label = "sd_ble_gap_conn_param_update(conn_handle_1, CP#1)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP note PERIPHERALS [label = " Respond to solicited procedure on link #2"]; - * APP=>SD [label = "sd_ble_gap_conn_param_update(conn_handle_2, CP#2)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PERIPHERALS [label = "L2CAP CPU Response: Accepted", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP note PERIPHERALS [label = " Encryption procedure on link #4"]; - * |||; - * APP=>SD [label = "sd_ble_gap_encrypt(conn_handle_4, LTK#4)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP note PERIPHERALS [label = " Note: the order of execution is not guaranteed, but encryption always has priority"]; - * |||; - * SD<:PERIPHERALS [label = "Encryption Complete on link #3", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {conn_handle_3}"]; - * |||; - * SD:>PERIPHERALS [label = "Encryption Start on link #4", textcolor="#000080", linecolor="#000080"]; - * SD<:PERIPHERALS [label = "Encryption Complete on link #4", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {conn_handle_4}"]; - * |||; - * SD:>PERIPHERALS [label = "Connection Update Start on link #1", textcolor="#000080", linecolor="#000080"]; - * SD<:PERIPHERALS [label = "Connection Update Complete on link #1", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_PARAM_UPDATE {conn_handle_1, CP#1}"]; - * |||; - * SD:>PERIPHERALS [label = "Connection Update Start on link #2", textcolor="#000080", linecolor="#000080"]; - * SD<:PERIPHERALS [label = "Connection Update Complete on link #2", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_PARAM_UPDATE {conn_handle_2, CP#2}"]; - * |||; - * @endmsc - * - * @defgroup BLE_GAP_WL_SHARE_MSC Whitelist Sharing - * @msc - * hscale = "1.5"; - * APP,SD; - * |||; - * APP=>SD [label = "sd_ble_gap_adv_data_set(adv, sr)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP=>SD [label = "sd_ble_gap_whitelist_set(WL#1)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP=>SD [label = "sd_ble_gap_adv_start(fp = CONNREQ)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD rbox SD [label="Advertising with Whitelist #1"]; - * |||; - * APP note APP [label = "Unable to change whitelist while adv in progress"]; - * APP=>SD [label = "sd_ble_gap_whitelist_set(WL#2)"]; - * APP<<SD [label = "BLE_ERROR_GAP_WHITELIST_IN_USE"]; - * |||; - * APP note APP [label = "Scan with the current active whitelist"]; - * APP=>SD [label = "sd_ble_gap_scan_start(use_whitelist = 1)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD rbox SD [label="Advertising and scanning with Whitelist #1"]; - * |||; - * APP=>SD [label = "sd_ble_gap_adv_stop()"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD rbox SD [label="Scanning with Whitelist #1"]; - * |||; - * APP=>SD [label = "sd_ble_gap_scan_stop()"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP=>SD [label = "sd_ble_gap_whitelist_set(WL#2)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP=>SD [label = "sd_ble_gap_scan_start(use_whitelist = 1)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD rbox SD [label="Scanning with Whitelist #2"]; - * |||; - * APP note APP [label = "Connect with the current active whitelist"]; - * APP=>SD [label = "sd_ble_gap_connect(use_whitelist = 1)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD note SD [label = "Scanning is automatically stopped"]; - * SD rbox SD [label="Connecting with Whitelist #2"]; - * |||; - * @endmsc - * - * @defgroup BLE_GAP_PRIVACY_MSC Privacy - * @{ - * - * @defgroup BLE_GAP_PRIVACY_ADV_MSC Private Advertising - * @msc - * hscale = "1.5"; - * APP,SD,SCANNERS; - * |||; - * APP=>SD [label = "sd_ble_gap_addr_set(addr)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP=>SD [label = "sd_ble_gap_adv_data_set(adv, sr)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * --- [label = " Variant #1 Advertise with address resolvable by device IRK "]; - * |||; - * APP=>SD [label = "sd_ble_gap_privacy_set(params: {mode: DEVICE_PRIVACY, private_addr_type: RESOLVABLE } "]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP=>SD [label = "sd_ble_gap_adv_start(params: {p_peer_addr = NULL})"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD->SCANNERS [label = "ADV packet, Addr = Resolvable1", textcolor="#000080", linecolor="#000080"]; - * SD->SCANNERS [label = "ADV packet, Addr = Resolvable1", textcolor="#000080", linecolor="#000080"]; - * SD->SCANNERS [label = "ADV packet, Addr = Resolvable1", textcolor="#000080", linecolor="#000080"]; - * ...; - * SD box SD [label="Private address timeout"]; - * SD->SCANNERS [label = "ADV packet, Addr = Resolvable2", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #2 Advertise with address resolvable by local IRK in device identity list "]; - * |||; - * APP=>SD [label = "sd_ble_gap_privacy_set(params: {mode: DEVICE_PRIVACY, private_addr_type: RESOLVABLE } "]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP=>SD [label = "sd_ble_gap_device_identities_set(pp_id_keys: {{peer_addr1, peer_irk1}}, pp_local_irks: {local_irk1}) "]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP=>SD [label = "sd_ble_gap_adv_start(params: {p_peer_addr = peer_addr1})"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD->SCANNERS [label = "ADV packet, Addr = Resolvable1", textcolor="#000080", linecolor="#000080"]; - * SD->SCANNERS [label = "ADV packet, Addr = Resolvable1", textcolor="#000080", linecolor="#000080"]; - * SD->SCANNERS [label = "ADV packet, Addr = Resolvable1", textcolor="#000080", linecolor="#000080"]; - * ...; - * SD box SD [label="Private address timeout"]; - * SD->SCANNERS [label = "ADV packet, Addr = Resolvable2", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #3 Advertise with non-resolvable address "]; - * |||; - * APP=>SD [label = "sd_ble_gap_privacy_set(params: {mode: DEVICE_PRIVACY, private_addr_type: NON_RESOLVABLE } "]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP=>SD [label = "sd_ble_gap_adv_start(params: {p_peer_addr = NULL})"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD->SCANNERS [label = "ADV packet, Addr = Non-Resolvable1", textcolor="#000080", linecolor="#000080"]; - * SD->SCANNERS [label = "ADV packet, Addr = Non-Resolvable1", textcolor="#000080", linecolor="#000080"]; - * SD->SCANNERS [label = "ADV packet, Addr = Non-Resolvable1", textcolor="#000080", linecolor="#000080"]; - * ...; - * SD box SD [label="Private address timeout"]; - * SD->SCANNERS [label = "ADV packet, Addr = Non-Resolvable2", textcolor="#000080", linecolor="#000080"]; - * @endmsc - * - * @defgroup BLE_GAP_PRIVACY_SCAN_MSC Private Scanning - * @msc - * hscale = "1.5"; - * APP,SD,ADVERTISERS; - * |||; - * APP=>SD [label = "sd_ble_gap_addr_set(addr)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * --- [label = " Variant #1 Active Scan with address resolvable by device IRK "]; - * |||; - * APP=>SD [label = "sd_ble_gap_privacy_set(params: {mode: DEVICE_PRIVACY, private_addr_type: RESOLVABLE } "]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP=>SD [label = "sd_ble_gap_scan_start(params)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * ADVERTISERS->SD [label = "ADV packet", textcolor="#000080", linecolor="#000080"]; - * SD->ADVERTISERS [label = "SCAN REQ packet, Addr = Resolvable", textcolor="#000080", linecolor="#000080"]; - * ADVERTISERS->SD [label = "SCAN RSP packet", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #2 Active Scan with address resolvable by local IRKs "]; - * |||; - * APP=>SD [label = "sd_ble_gap_privacy_set(params: {mode: DEVICE_PRIVACY, private_addr_type: RESOLVABLE } "]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP=>SD [label = "sd_ble_gap_device_identities_set(pp_id_keys: {{peer_addr1, peer_irk1}, {peer_addr2, peer_irk2}}, pp_local_irks: {local_irk1, local_irk2}) "]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP=>SD [label = "sd_ble_gap_scan_start(params)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * ADVERTISERS->SD [label = "ADV packet, Addr = peer_addr1", textcolor="#000080", linecolor="#000080"]; - * SD box ADVERTISERS [label = "peer_addr1 is in the device identity list, respond with an address generated from local_irk1"]; - * SD->ADVERTISERS [label = "SCAN REQ packet, Addr = Resolvable", textcolor="#000080", linecolor="#000080"]; - * ADVERTISERS->SD [label = "SCAN RSP packet, Addr = peer_addr1", textcolor="#000080", linecolor="#000080"]; - * |||; - * ...; - * ADVERTISERS->SD [label = "ADV packet, Addr = Resolvable2", textcolor="#000080", linecolor="#000080"]; - * SD box ADVERTISERS [label = "Resolvable2 resolved to device identity peer_addr2 in the device identity list, respond with an address generated from local_irk2"]; - * SD->ADVERTISERS [label = "SCAN REQ packet, Addr = Resolvable", textcolor="#000080", linecolor="#000080"]; - * ADVERTISERS->SD [label = "SCAN RSP packet, Addr = peer_addr1", textcolor="#000080", linecolor="#000080"]; - * |||; - * ...; - * ADVERTISERS->SD [label = "ADV packet, Addr = peer_addr3", textcolor="#000080", linecolor="#000080"]; - * SD box ADVERTISERS [label = "peer_addr3 is not in the device identity list, respond with an address generated from device_irk"]; - * SD->ADVERTISERS [label = "SCAN REQ packet, Addr = Resolvable", textcolor="#000080", linecolor="#000080"]; - * ADVERTISERS->SD [label = "SCAN RSP packet, Addr = peer_addr1", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #3 Active Scan with non-resolvable address "]; - * |||; - * APP=>SD [label = "sd_ble_gap_privacy_set(params: {mode: DEVICE_PRIVACY, private_addr_type: NON_RESOLVABLE } "]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP=>SD [label = "sd_ble_gap_scan_start(params)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * ADVERTISERS->SD [label = "ADV packet", textcolor="#000080", linecolor="#000080"]; - * SD->ADVERTISERS [label = "SCAN REQ packet, Addr = Non-Resolvable", textcolor="#000080", linecolor="#000080"]; - * ADVERTISERS->SD [label = "SCAN RSP packet", textcolor="#000080", linecolor="#000080"]; - * |||; - * @endmsc - * - * @defgroup BLE_GAP_PRIVACY_SCAN_PRIVATE_SCAN_MSC Scan Private Devices - * @msc - * hscale = "1.5"; - * APP,SD,ADVERTISERS; - * |||; - * APP=>SD [label = "sd_ble_gap_device_identities_set(pp_id_keys: {{peer_addr1, peer_irk1}}, pp_local_irks: NULL) "]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * --- [label = " Variant #1 Scan and resolve private devices "]; - * |||; - * APP=>SD [label = "sd_ble_gap_scan_start(params)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * ADVERTISERS->SD [label = "ADV packet, Addr = Resolvable1", textcolor="#000080", linecolor="#000080"]; - * SD note ADVERTISERS [label="Resolvable1 resolved to device identity peer_addr1"]; - * APP<<=SD [label = "BLE_GAP_EVT_ADV_REPORT {peer_addr1, rssi, data}"]; - * |||; - * ADVERTISERS->SD [label = "ADV packet, Addr = peer_addr2", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_ADV_REPORT {peer_addr2, rssi, data}"]; - * |||; - * --- [label = " Variant #2 Scan and resolve private devices with whitelist "]; - * |||; - * APP=>SD [label = "sd_ble_gap_whitelist_set({peer_addr1, Resolvable2}) "]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP=>SD [label = "sd_ble_gap_scan_start(params)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * ADVERTISERS->SD [label = "ADV packet, Addr = Resolvable1", textcolor="#000080", linecolor="#000080"]; - * SD note ADVERTISERS [label="Resolvable1 resolved to device identity peer_addr1 which is in the whitelist"]; - * APP<<=SD [label = "BLE_GAP_EVT_ADV_REPORT {peer_addr1, rssi, data}"]; - * |||; - * ADVERTISERS->SD [label = "ADV packet, Addr = Resolvable2", textcolor="#000080", linecolor="#000080"]; - * SD note ADVERTISERS [label="Resolvable2 did not resolve to a device identity but is in the whitelist"]; - * APP<<=SD [label = "BLE_GAP_EVT_ADV_REPORT {Resolvable2, rssi, data}"]; - * |||; - * ADVERTISERS->SD [label = "ADV packet, Addr = Resolvable3", textcolor="#000080", linecolor="#000080"]; - * SD note ADVERTISERS [label="Resolvable3 is not in the whitelist, no report generated"]; - * |||; - * --- [label = " Variant #3 Scan directed advertisers and resolve initiator address using device IRK"]; - * |||; - * APP=>SD [label = "sd_ble_gap_scan_start()"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * ADVERTISERS->SD [label = "ADV packet, Advertiser Addr = Resolvable, Initiator Addr = Resolvable", textcolor="#000080", linecolor="#000080"]; - * ADVERTISERS box SD [label = "Advertiser Address resolved using peer_irk1, Initiator address resolved using device_irk"]; - * APP<<=SD [label = "BLE_GAP_EVT_ADV_REPORT {peer_addr: peer_addr1"]; - * |||; - * --- [label = " Variant #4 Scan directed advertisers and resolve initiator address using local IRK in device identity list"]; - * |||; - * APP=>SD [label = "sd_ble_gap_device_identities_set(pp_id_keys: {{peer_addr1, peer_irk1}}, pp_local_irks: local_irk1) "]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP=>SD [label = "sd_ble_gap_scan_start()"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * ADVERTISERS->SD [label = "ADV packet, Advertiser Addr = Resolvable, Initiator Addr = Resolvable", textcolor="#000080", linecolor="#000080"]; - * ADVERTISERS box SD [label = "Advertiser Address resolved using peer_irk1, Initiator address resolved using local_irk1"]; - * APP<<=SD [label = "BLE_GAP_EVT_ADV_REPORT {peer_addr: peer_addr1"]; - * |||; - * --- [label = " Variant #5 Scan directed advertisers with unresolved direct address "]; - * |||; - * APP=>SD [label = "sd_ble_gap_scan_start(params: {adv_dir_report = 1})"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * ADVERTISERS->SD [label = "ADV packet, Advertiser Addr = peer_addr2, Initiator Addr = Resolvable2", textcolor="#000080", linecolor="#000080"]; - * ADVERTISERS box SD [label = "Resolvable2 could not be resolved, report the unresolved direct address"]; - * APP<<=SD [label = "BLE_GAP_EVT_ADV_REPORT {peer_addr: peer_addr2, direct_addr: Resolvable2}"]; - * |||; - * @endmsc - * - * @defgroup BLE_GAP_PRIVACY_ADV_DIR_PRIV_MSC Directed Advertising - * @msc - * hscale = "1.5"; - * APP,SD,INITIATOR; - * |||; - * APP=>SD [label = "sd_ble_gap_addr_set(addr)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * --- [label = " Variant #1 Advertise directed to private peer"]; - * |||; - * APP=>SD [label = "sd_ble_gap_device_identities_set(pp_id_keys: {{peer_addr1, peer_irk1}}, pp_local_irks: NULL) "]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP=>SD [label = "sd_ble_gap_adv_start(params: {p_peer_addr = peer_addr1})"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD box SD [label = "Generate initiator addr from peer_irk1"]; - * SD->INITIATOR[label = "ADV packet, Advertiser Addr = addr, Initiator Addr = Resolvable", textcolor="#000080", linecolor="#000080"]; - * SD->INITIATOR[label = "ADV packet, Advertiser Addr = addr, Initiator Addr = Resolvable", textcolor="#000080", linecolor="#000080"]; - * SD->INITIATOR[label = "ADV packet, Advertiser Addr = addr, Initiator Addr = Resolvable", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #2 Private directed advertising to private peer using device IRK"]; - * |||; - * APP=>SD [label = "sd_ble_gap_device_identities_set(pp_id_keys: {{peer_addr1, peer_irk1}}, pp_local_irks: NULL) "]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP=>SD [label = "sd_ble_gap_privacy_set(params: {mode: DEVICE_PRIVACY, private_addr_type: RESOLVABLE } "]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP=>SD [label = "sd_ble_gap_adv_start(params: {p_peer_addr = peer_addr1})"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD box SD [label = "Generate advertiser address from device_irk Generate initiator address from peer_irk1"]; - * SD->INITIATOR[label = "ADV packet, Advertiser Addr = Resolvable, Initiator Addr = Resolvable", textcolor="#000080", linecolor="#000080"]; - * SD->INITIATOR[label = "ADV packet, Advertiser Addr = Resolvable, Initiator Addr = Resolvable", textcolor="#000080", linecolor="#000080"]; - * SD->INITIATOR[label = "ADV packet, Advertiser Addr = Resolvable, Initiator Addr = Resolvable", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #3 Private directed advertising to private peer using local IRK in device identity list"]; - * |||; - * APP=>SD [label = "sd_ble_gap_device_identities_set(pp_id_keys: {{peer_addr1, peer_irk1}}, pp_local_irks: {{local_irk1}}) "]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP=>SD [label = "sd_ble_gap_privacy_set(params: {mode: DEVICE_PRIVACY, private_addr_type: RESOLVABLE } "]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP=>SD [label = "sd_ble_gap_adv_start(params: {p_peer_addr = peer_addr1})"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD box SD [label = "Generate advertiser address from local_irk1 Generate initiator address from peer_irk1"]; - * SD->INITIATOR[label = "ADV packet, Advertiser Addr = Resolvable, Initiator Addr = Resolvable", textcolor="#000080", linecolor="#000080"]; - * SD->INITIATOR[label = "ADV packet, Advertiser Addr = Resolvable, Initiator Addr = Resolvable", textcolor="#000080", linecolor="#000080"]; - * SD->INITIATOR[label = "ADV packet, Advertiser Addr = Resolvable, Initiator Addr = Resolvable", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #4 Private directed advertising to non-private peer using local IRK in device identity list"]; - * |||; - * APP=>SD [label = "sd_ble_gap_device_identities_set(pp_id_keys: {{peer_addr1, peer_irk=0..0}}, pp_local_irks: {{local_irk1}}) "]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP=>SD [label = "sd_ble_gap_privacy_set(params: {mode: DEVICE_PRIVACY, private_addr_type: RESOLVABLE } "]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP=>SD [label = "sd_ble_gap_adv_start(params: {p_peer_addr = peer_addr1})"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD box SD [label = "Generate advertiser address from local_irk1"]; - * SD->INITIATOR[label = "ADV packet, Advertiser Addr = Resolvable, Initiator Addr = peer_addr1", textcolor="#000080", linecolor="#000080"]; - * SD->INITIATOR[label = "ADV packet, Advertiser Addr = Resolvable, Initiator Addr = peer_addr1", textcolor="#000080", linecolor="#000080"]; - * SD->INITIATOR[label = "ADV packet, Advertiser Addr = Resolvable, Initiator Addr = peer_addr1", textcolor="#000080", linecolor="#000080"]; - * |||; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_CONN_PRIV_MSC Peripheral Connection Establishment with Private Peer - * @msc - * hscale = "1.5"; - * APP,SD,CENTRAL; - * |||; - * APP=>SD [label = "sd_ble_gap_device_identities_set(pp_id_keys: {{peer_addr1, peer_irk1}}, pp_local_irks: NULL) "]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * --- [label = " Variant #1 Peer used resolvable addresses during connection setup "]; - * |||; - * APP rbox CENTRAL [label="Start Connectable Advertising"]; - * |||; - * SD<:>CENTRAL [label = "Connection Establishment", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONNECTED, peer_addr = {peer_addr1, addr_id_peer = 1}"]; - * |||; - * --- [label = " Variant #2 Peer used identity address during connection setup "]; - * |||; - * APP rbox CENTRAL [label="Start Connectable Advertising"]; - * |||; - * SD<:>CENTRAL [label = "Connection Establishment", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONNECTED, peer_addr = {peer_addr1, addr_id_peer = 0}"]; - * |||; - * @endmsc - * - * @defgroup BLE_GAP_CENTRAL_CONN_PRIV_MSC Central Connection Establishment with Private Peer - * @msc - * hscale = "1.5"; - * APP,SD,PERIPHERAL; - * |||; - * APP=>SD [label = "sd_ble_gap_device_identities_set(pp_id_keys: {{peer_addr1, peer_irk1}}, pp_local_irks: NULL) "]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * PERIPHERAL rbox PERIPHERAL [label="Peripheral Start Connectable Advertising"]; - * |||; - * APP=>SD [label = "sd_ble_gap_connect(peer_addr = {peer_addr1, addr_id_peer = 1})"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD:>PERIPHERAL [label = "Scanning", textcolor="#000080", linecolor="#000080"]; - * --- [label = " Variant #1 Peer used resolvable addresses during connection setup "]; - * |||; - * SD<:>PERIPHERAL [label = "Connection Establishment", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONNECTED, peer_addr = {peer_addr1, addr_id_peer = 1}"]; - * |||; - * --- [label = " Variant #2 Peer used identity address during connection setup "]; - * |||; - * SD<:>PERIPHERAL [label = "Connection Establishment", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONNECTED, peer_addr = {peer_addr1, addr_id_peer = 0}"]; - * |||; - * @endmsc - * - * @} - * - * @defgroup BLE_GAP_EVT_PHY_MSC PHY Update Procedure - * @{ - * - * @defgroup BLE_GAP_CENTRAL_PHY_UPDATE Central PHY Update - * @msc - * hscale = "1.5"; - * APP,SD,PERIPHERAL; - * |||; - * APP rbox PERIPHERAL [label="Connection Established. Current TX PHY and RX PHY are both 1Mbit"]; - * |||; - * --- [label = " Variant #1 Initiated by Peripheral - no change in PHY "]; - * SD<=PERIPHERAL [label = "LL_PHY_REQ {tx_phys=2Mbit, rx_phys=2Mbit}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PHY_UPDATE_REQUEST {peer_preferred_phys={tx_phys=2Mbit, rx_phys=2Mbit}}"]; - * APP=>SD [label = "sd_ble_gap_phy_update(conn_handle, {tx_phys=1Mbit, rx_phys=1Mbit})"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD=>PERIPHERAL [label = "LL_PHY_UPDATE_IND - No change", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PHY_UPDATE {status=Success, {tx_phy=1Mbit, rx_phy=1Mbit}}"]; - * |||; - * --- [label = " Variant #2 Initiated by Peripheral - change of PHY required"]; - * SD<=PERIPHERAL [label = "LL_PHY_REQ {tx_phys=2Mbit, rx_phys=2Mbit}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PHY_UPDATE_REQUEST {peer_preferred_phys={tx_phys=2Mbit, rx_phys=2Mbit}}"]; - * APP=>SD [label = "sd_ble_gap_phy_update(conn_handle, {tx_phys=2Mbit, rx_phys=2Mbit})"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD=>PERIPHERAL [label = "LL_PHY_UPDATE_IND {M_TO_S_PHY=2Mbit, S_TO_M_PHY=2Mbit}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PHY_UPDATE {status=Success, {tx_phy=2Mbit, rx_phy=2Mbit}}"]; - * |||; - * --- [label = " Variant #3 Initiated by APP, not supported by peer"]; - * |||; - * APP=>SD [label = "sd_ble_gap_phy_update(conn_handle, {ALL_PHY, ALL_PHY}) "]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD=>PERIPHERAL [label="LL_PHY_REQ", textcolor="#000080", linecolor="#000080"]; - * SD<=PERIPHERAL [label="LL_UNKNOWN_RSP", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label="BLE_GAP_EVT_PHY_UPDATE {Status=Not Supported}"]; - * |||; - * --- [label = " Variant #4 Initiated by APP, change required"]; - * |||; - * APP=>SD [label = "sd_ble_gap_phy_update(conn_handle, {ALL_PHY, ALL_PHY}) "]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD=>PERIPHERAL [label = "LL_PHY_REQ {ALL_PHY, ALL_PHY}", textcolor="#000080", linecolor="#000080"]; - * SD<=PERIPHERAL [label = "LL_PHY_RSP {ALL_PHY, ALL_PHY}", textcolor="#000080", linecolor="#000080"]; - * SD=>PERIPHERAL [label = "LL_PHY_UPDATE_IND {M_TO_S_PHY=2Mbit, S_TO_M_PHY=2Mbit}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PHY_UPDATE {status=Success, {tx_phy=2Mbit, rx_phy=2Mbit}}"]; - * |||; - * --- [label = " Variant #5 Initiated by Peripheral - APP has no preferences for TX direction"]; - * SD<=PERIPHERAL [label = "LL_PHY_REQ {tx_phys=2Mbit, rx_phys=1Mbit}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PHY_UPDATE_REQUEST {peer_preferred_phys={tx_phys=2Mbit, rx_phys=1Mbit}}"]; - * APP=>SD [label = "sd_ble_gap_phy_update(conn_handle, {tx_phys=BLE_GAP_PHY_AUTO, rx_phys=2Mbit})"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD=>PERIPHERAL [label = "LL_PHY_UPDATE_IND {M_TO_S_PHY=1Mbit, S_TO_M_PHY=2Mbit}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PHY_UPDATE {status=Success, {tx_phy=1Mbit, rx_phy=2Mbit}}"]; - * |||; - * --- [label = " Variant #6 Initiated by APP, peer responding with invalid parameters"]; - * |||; - * APP=>SD [label = "sd_ble_gap_phy_update(conn_handle, {ALL_PHY, ALL_PHY}) "]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD=>PERIPHERAL [label="LL_PHY_REQ {ALL_PHY, ALL_PHY}", textcolor="#000080", linecolor="#000080"]; - * SD<=PERIPHERAL [label="LL_PHY_RSP {tx_phys=0x00, rx_phys=0x00}", textcolor="#000080", linecolor="#000080"]; - * SD=>PERIPHERAL [label="LL_UNKNOWN_RSP", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label="BLE_GAP_EVT_PHY_UPDATE {Status=Invalid LMP Parameters}"]; - * |||; - * @endmsc - * - * @defgroup BLE_GAP_PERIPHERAL_PHY_UPDATE Peripheral PHY Update - * @msc - * hscale = "1.5"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established. Current TX PHY and RX PHY are both 1Mbit"]; - * |||; - * --- [label = " Variant #1 Initiated by Central - no change in PHY "]; - * SD<=CENTRAL [label = "LL_PHY_REQ {tx_phys=2Mbit, rx_phys=2Mbit}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PHY_UPDATE_REQUEST {peer_preferred_phys={tx_phys=2Mbit, rx_phys=2Mbit}}"]; - * APP=>SD [label = "sd_ble_gap_phy_update(conn_handle, {tx_phys=1Mbit, rx_phys=1Mbit})"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD=>CENTRAL [label = "LL_PHY_RSP {tx_phys=1Mbit, rx_phys=1Mbit}", textcolor="#000080", linecolor="#000080"]; - * SD<=CENTRAL [label = "LL_PHY_UPDATE_IND - No change", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PHY_UPDATE {status=Success, {tx_phy=1Mbit, rx_phy=1Mbit}}"]; - * |||; - * --- [label = " Variant #2 Initiated by Central - change of PHY required"]; - * SD<=CENTRAL [label = "LL_PHY_REQ {tx_phys=2Mbit, rx_phys=2Mbit}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PHY_UPDATE_REQUEST {peer_preferred_phys={tx_phys=2Mbit, rx_phys=2Mbit}}"]; - * APP=>SD [label = "sd_ble_gap_phy_update(conn_handle, {tx_phys=2Mbit, rx_phys=2Mbit})"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD=>CENTRAL [label = "LL_PHY_RSP {tx_phys=2Mbit, rx_phys=2Mbit}", textcolor="#000080", linecolor="#000080"]; - * SD<=CENTRAL [label = "LL_PHY_UPDATE_IND {M_TO_S_PHY=2Mbit, S_TO_M_PHY=2Mbit}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PHY_UPDATE {status=Success, {tx_phy=2Mbit, rx_phy=2Mbit}}"]; - * |||; - * --- [label = " Variant #3 Initiated by APP, not supported by peer"]; - * |||; - * APP=>SD [label = "sd_ble_gap_phy_update(conn_handle, {ALL_PHY, ALL_PHY}) "]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD=>CENTRAL [label="LL_PHY_REQ", textcolor="#000080", linecolor="#000080"]; - * SD<=CENTRAL [label="LL_UNKNOWN_RSP", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label="BLE_GAP_EVT_PHY_UPDATE {Status=Not Supported}"]; - * |||; - * --- [label = " Variant #4 Initiated by APP, change required"]; - * |||; - * APP=>SD [label = "sd_ble_gap_phy_update(conn_handle, {ALL_PHY, ALL_PHY}) "]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD=>CENTRAL [label="LL_PHY_REQ {ALL_PHY, ALL_PHY}", textcolor="#000080", linecolor="#000080"]; - * SD<=CENTRAL [label="LL_PHY_UPDATE_IND {M_TO_S_PHY=2Mbit, S_TO_M_PHY=2Mbit}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label="BLE_GAP_EVT_PHY_UPDATE {status=Success, {tx_phy=2Mbit, rx_phy=2Mbit}}"]; - * |||; - * --- [label = " Variant #5 Initiated by Central - APP has no preferences for TX direction"]; - * SD<=CENTRAL [label = "LL_PHY_REQ {tx_phys=2Mbit, rx_phys=1Mbit}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PHY_UPDATE_REQUEST {peer_preferred_phys={tx_phys=2Mbit, rx_phys=1Mbit}}"]; - * APP=>SD [label = "sd_ble_gap_phy_update(conn_handle, {tx_phys=BLE_GAP_PHY_AUTO, rx_phys=2Mbit})"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD=>CENTRAL [label = "LL_PHY_RSP {tx_phys=ALL_PHY, rx_phys=2Mbit}", textcolor="#000080", linecolor="#000080"]; - * SD<=CENTRAL [label = "LL_PHY_UPDATE_IND {M_TO_S_PHY=2Mbit, S_TO_M_PHY=1Mbit}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PHY_UPDATE {status=Success, {tx_phy=1Mbit, rx_phy=2Mbit}}"]; - * |||; - * --- [label = " Variant #6 Collision between self-initiated PHY Update and peer initiated Channel Map Update procedures"]; - * APP=>SD [label = "sd_ble_gap_phy_update(conn_handle, {tx_phys=2Mbit, rx_phys=2Mbit})"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD<=CENTRAL [label = "LL_CHANNEL_MAP_IND", textcolor="#000080", linecolor="#000080"]; - * SD=>CENTRAL [label = "LL_PHY_REQ {tx_phys=2Mbit, rx_phys=2Mbit}", textcolor="#000080", linecolor="#000080"]; - * SD<=CENTRAL [label = "LL_REJECT_EXT_IND {ErrorCode=Different Transaction Collision}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PHY_UPDATE {status=Different Transaction Collision, {tx_phy=1Mbit, rx_phy=1Mbit}}"]; - * |||; - * --- [label = " Variant #7 Initiated by APP, peer responding with invalid parameters"]; - * |||; - * APP=>SD [label = "sd_ble_gap_phy_update(conn_handle, {ALL_PHY, ALL_PHY}) "]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD=>CENTRAL [label="LL_PHY_REQ {ALL_PHY, ALL_PHY}", textcolor="#000080", linecolor="#000080"]; - * SD<=CENTRAL [label="LL_PHY_UPDATE_IND {M_TO_S_PHY=(1Mbit|2Mbit), S_TO_M_PHY=(1Mbit|2Mbit)", textcolor="#000080", linecolor="#000080"]; - * SD=>CENTRAL [label="LL_UNKNOWN_RSP", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label="BLE_GAP_EVT_PHY_UPDATE {Status=Invalid LMP Parameters}"]; - * |||; - * @endmsc - * - * @} - - * @defgroup BLE_GAP_DATA_LENGTH_UPDATE_PROCEDURE_MSC Data Length Update Procedure - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * --- [label = " Self initiated, automatic parameters "]; - * |||; - * SD rbox SD [label = "max_tx_octets=27, max_rx_octets=27"]; - * |||; - * ...; - * |||; - * APP=>SD [label = "sd_ble_gap_data_length_update(conn_handle, NULL, NULL)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "LL Length Request {tx=251, rx=251}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "LL Length Response {tx=251, rx=251}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_DATA_LENGTH_UPDATE {.effective_params={.max_tx_octets=251, .max_rx_octets=251, .max_tx_time_us=2120, .max_rx_time_us=2120}}"]; - * |||; - * ...; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * --- [label = " Self initiated, application set parameters "]; - * |||; - * SD rbox SD [label = "max_tx_octets=27, max_rx_octets=27"]; - * |||; - * ...; - * |||; - * APP=>SD [label = "sd_ble_gap_data_length_update(conn_handle, {.max_tx_octets=251, .max_rx_octets=251, .max_tx_time_us=BLE_GAP_DATA_LENGTH_AUTO, .max_rx_time_us=BLE_GAP_DATA_LENGTH_AUTO}, NULL)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "LL Length Request {tx=251, rx=251}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "LL Length Response {tx=251, rx=251}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_DATA_LENGTH_UPDATE {.effective_params={.max_tx_octets=251, .max_rx_octets=251, .max_tx_time_us=2120, .max_rx_time_us=2120}}"]; - * |||; - * ...; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * --- [label = " Peer initiated, automatic parameters "]; - * SD rbox SD [label = "max_tx_octets=27, max_rx_octets=27"]; - * |||; - * ...; - * |||; - * SD<:PEER [label = "LL Length Request {tx=251, rx=251}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST {.peer_params={.max_tx_octets=251, .max_rx_octets=251, .max_tx_time_us=2120, .max_rx_time_us=2120}}"]; - * APP=>SD [label = "sd_ble_gap_data_length_update(conn_handle, NULL, NULL)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "LL Length Response {tx=251, rx=251}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_DATA_LENGTH_UPDATE {.effective_params={.max_tx_octets=251, .max_rx_octets=251, .max_tx_time_us=2120, .max_rx_time_us=2120}}"]; - * |||; - * ...; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * --- [label = " Peer initiated, application set parameters"]; - * SD rbox SD [label = "max_tx_octets=27, max_rx_octets=27"]; - * |||; - * ...; - * |||; - * SD<:PEER [label = "LL Length Request {tx=251, rx=251}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST {.peer_params={.max_tx_octets=251, .max_rx_octets=251, .max_tx_time_us=2120, .max_rx_time_us=2120}}"]; - * APP=>SD [label = "sd_ble_gap_data_length_update(conn_handle, {.max_tx_octets=251, .max_rx_octets=251, .max_tx_time_us=BLE_GAP_DATA_LENGTH_AUTO, .max_rx_time_us=BLE_GAP_DATA_LENGTH_AUTO}, NULL)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "LL Length Response {tx=251, rx=251}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_DATA_LENGTH_UPDATE {.effective_params={.max_tx_octets=251, .max_rx_octets=251, .max_tx_time_us=2120, .max_rx_time_us=2120}}"]; - * |||; - * ...; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * --- [label = " Using the limitation out parameter to adjust Link Layer Data Channel PDU size, memory limited "]; - * |||; - * SD rbox SD [label = "max_tx_octets=27, max_rx_octets=27"]; - * |||; - * ...; - * |||; - * APP=>SD [label = "sd_ble_gap_data_length_update(conn_handle, {.max_tx_octets=251, .max_rx_octets=251, .max_tx_time_us=BLE_GAP_DATA_LENGTH_AUTO, .max_rx_time_us=BLE_GAP_DATA_LENGTH_AUTO}, &limitation)"]; - * APP<<SD [label = "NRF_ERROR_RESOURCES"]; - * APP note SD [label = "limitation = {.tx_payload_limited_octets=51, .rx_payload_limited_octets=51, .tx_rx_time_limited_us=0}"]; - * |||; - * APP=>SD [label = "sd_ble_gap_data_length_update(conn_handle, {.max_tx_octets=200, .max_rx_octets=200, .max_tx_time_us=BLE_GAP_DATA_LENGTH_AUTO, .max_rx_time_us=BLE_GAP_DATA_LENGTH_AUTO}, &limitation)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP note SD [label = "limitation = {.tx_payload_limited_octets=0, .rx_payload_limited_octets=0, .tx_rx_time_limited_us=0}"]; - * SD:>PEER [label = "LL Length Request {tx=200, rx=200}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "LL Length Response {tx=251, rx=251}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_DATA_LENGTH_UPDATE {.effective_params={.max_tx_octets=200, .max_rx_octets=200, .max_tx_time_us=1712, .max_rx_time_us=1712}}"]; - * |||; - * ...; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * --- [label = " Using the limitation out parameter to adjust Link Layer Data Channel PDU size, time limited "]; - * |||; - * SD rbox SD [label = "max_tx_octets=27, max_rx_octets=27"]; - * |||; - * ...; - * |||; - * APP=>SD [label = "sd_ble_gap_data_length_update(conn_handle, {.max_tx_octets=251, .max_rx_octets=251, .max_tx_time_us=BLE_GAP_DATA_LENGTH_AUTO, .max_rx_time_us=BLE_GAP_DATA_LENGTH_AUTO}, &limitation)"]; - * APP<<SD [label = "NRF_ERROR_RESOURCES"]; - * APP note SD [label = "limitation = {.tx_payload_limited_octets=178, .rx_payload_limited_octets=178, .tx_rx_time_limited_us=2836}"]; - * |||; - * APP=>SD [label = "sd_ble_gap_data_length_update(conn_handle, {.max_tx_octets=251-178=73, .max_rx_octets=251-178=73, .max_tx_time_us=BLE_GAP_DATA_LENGTH_AUTO, .max_rx_time_us=BLE_GAP_DATA_LENGTH_AUTO}, &limitation)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "LL Length Request {tx=73, rx=73}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "LL Length Response {tx=251, rx=251}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_DATA_LENGTH_UPDATE {.effective_params={.max_tx_octets=73, .max_rx_octets=73, .max_tx_time_us=696, .max_rx_time_us=696}}"]; - * @endmsc - * @} - * - * @} - * @} - */ - -/** - * @addtogroup BLE_GATTC - * @{ - * @defgroup BLE_GATTC_MSC Message Sequence Charts - * @{ - * @defgroup BLE_GATTC_PRIM_SRVC_DISC_MSC GATTC Primary Service Discovery - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * --- [label = " Variant #1 Discover All Services "]; - * |||; - * APP=>SD [label = "sd_ble_gattc_primary_services_discover(handle, NULL)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Read By Group Type Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Read By Group Type Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP {SUCCESS, services}"]; - * APP=>SD [label = "sd_ble_gattc_primary_services_discover(handle + N, NULL)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Read By Group Type Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Read By Group Type Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP {SUCCESS, services}"]; - * APP=>SD [label = "sd_ble_gattc_primary_services_discover(handle + N + M, NULL)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Read By Group Type Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Error Response: Attribute Not Found", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP {ATTRIBUTE_NOT_FOUND}"]; - * |||; - * --- [label = " Variant #2 Discover a Specific Service "]; - * |||; - * APP=>SD [label = "sd_ble_gattc_primary_services_discover(handle, uuid)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Find By Type Value Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Find By Type Value Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP {SUCCESS, services}"]; - * APP=>SD [label = "sd_ble_gattc_primary_services_discover(handle + N, uuid)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Find By Type Value Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Find By Type Value Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP {SUCCESS, services}"]; - * APP=>SD [label = "sd_ble_gattc_primary_services_discover(handle + N + M, uuid)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Find By Type Value Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Error Response: Attribute Not Found", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP {ATTRIBUTE_NOT_FOUND}"]; - * @endmsc - * - * @defgroup BLE_GATTC_REL_DISC_MSC GATTC Relationship Discovery - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gattc_relationships_discover(handle_range)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Read By Type Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Read By Type Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_REL_DISC_RSP {SUCCESS, includes}"]; - * APP=>SD [label = "sd_ble_gattc_relationships_discover(handle_range + N)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Read By Type Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Read By Type Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_REL_DISC_RSP {SUCCESS, includes}"]; - * APP=>SD [label = "sd_ble_gattc_relationships_discover(handle_range + N + M)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Read By Type Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Error Response: Attribute Not Found", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_REL_DISC_RSP {ATTRIBUTE_NOT_FOUND}"]; - * @endmsc - * - * @defgroup BLE_GATTC_CHAR_DISC_MSC GATTC Characteristic Discovery - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gattc_characteristics_discover(handle_range)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Read By Type Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Read By Type Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_CHAR_DISC_RSP {SUCCESS, chars}"]; - * APP=>SD [label = "sd_ble_gattc_characteristics_discover(handle_range + N)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Read By Type Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Read By Type Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_CHAR_DISC_RSP {SUCCESS, chars}"]; - * APP=>SD [label = "sd_ble_gattc_characteristics_discover(handle_range + N + M)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Read By Type Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Error Response: Attribute Not Found", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_CHAR_DISC_RSP {ATTRIBUTE_NOT_FOUND}"]; - * @endmsc - * - * @defgroup BLE_GATTC_DESC_DISC_MSC GATTC Descriptor Discovery - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gattc_descriptors_discover(handle_range)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Find Information Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Find Information Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_DESC_DISC_RSP {SUCCESS, descs}"]; - * APP=>SD [label = "sd_ble_gattc_descriptors_discover(handle_range + N)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Find Information Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Find Information Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_DESC_DISC_RSP {SUCCESS, descs}"]; - * APP=>SD [label = "sd_ble_gattc_descriptors_discover(handle_range + N + M)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Find Information Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Error Response: Attribute Not Found", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_DESC_DISC_RSP {ATTRIBUTE_NOT_FOUND}"]; - * @endmsc - * - * @defgroup BLE_GATTC_READ_UUID_MSC GATTC Read Characteristic Value by UUID - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gattc_char_value_by_uuid_read(uuid, handle_range)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Read By Type Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Read By Type Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP {SUCCESS, char_values}"]; - * APP=>SD [label = "sd_ble_gattc_char_value_by_uuid_read(uuid, handle_range + N)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Read By Type Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Read By Type Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP {SUCCESS, char_values}"]; - * APP=>SD [label = "sd_ble_gattc_char_value_by_uuid_read(uuid, handle_range + N + M)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Read By Type Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Error Response: Attribute Not Found", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP {ATTRIBUTE_NOT_FOUND}"]; - * @endmsc - * - * @defgroup BLE_GATTC_VALUE_READ_MSC GATTC Characteristic or Descriptor Value Read - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * --- [label = " Variant #1 offset == 0 "]; - * |||; - * APP=>SD [label = "sd_ble_gattc_read(handle, 0)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Read Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Read Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_READ_RSP {SUCCESS, value}"]; - * |||; - * --- [label = " Variant #2 offset != 0 "]; - * |||; - * APP=>SD [label = "sd_ble_gattc_read(handle, offset)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Read Blob Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Read Blob Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_READ_RSP {SUCCESS, value}"]; - * APP=>SD [label = "sd_ble_gattc_read(handle, offset + N)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Read Blob Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Read Blob Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_READ_RSP {SUCCESS, value}"]; - * APP=>SD [label = "sd_ble_gattc_read(handle, offset + N + M + 1)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Read Blob Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Error Response: Invalid Offset", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_READ_RSP {INVALID_OFFSET}"]; - * @endmsc - * - * @defgroup BLE_GATTC_READ_MULT_MSC GATTC Read Multiple Characteristic Values - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * --- [label = " Variant #1 Successful request "]; - * |||; - * APP=>SD [label = "sd_ble_gattc_char_values_read(handles)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Read Multiple Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Read Multiple Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_CHAR_VALS_READ_RSP {SUCCESS, char_values}"]; - * |||; - * --- [label = " Variant #2 Failing request (invalid handle) "]; - * |||; - * APP=>SD [label = "sd_ble_gattc_char_values_read(handles)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Read Multiple Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Error Response: Invalid Handle", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_CHAR_VALS_READ_RSP {INVALID_HANDLE, error_handle=<invalid handle>}"]; - * @endmsc - * - * @defgroup BLE_GATTC_VALUE_WRITE_WITHOUT_RESP_MSC GATTC Characteristic Value Write Without Response - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * --- [label = " Variant #1 App does not keep track of the available queue element count for writes without responses "]; - * APP note PEER [label = " This variant makes it possible for APP to transmit writes without responses without keeping track of the available queue element count. However, successful queuing of writes without responses cannot be guaranteed. "]; - * |||; - * APP=>SD [label = "sd_ble_enable()"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gattc_write(BLE_GATT_OP_WRITE_CMD, handle, value_1)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP=>SD [label = "sd_ble_gattc_write(BLE_GATT_OP_WRITE_CMD, handle, value_2)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP=>SD [label = "sd_ble_gattc_write(BLE_GATT_OP_WRITE_CMD, handle, value_3)"]; - * APP<<SD [label = "NRF_ERROR_RESOURCES"]; - * |||; - * ...; - * |||; - * APP=>SD [label = "sd_ble_gattc_write(BLE_GATT_OP_WRITE_CMD, handle, value_4)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * SD:>PEER [label = "ATT Write Command {value_1}", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "ATT Write Command {value_2}", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "ATT Write Command {value_4}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE {SUCCESS, 3}"]; - * |||; - * --- [label = " Variant #2 App keeps track of the available queue element count for writes without responses "]; - * APP note PEER [label = " This variant makes it possible for APP to know when successful queuing of writes without responses is guaranteed. "]; - * |||; - * APP=>SD [label = "sd_ble_cfg_set(BLE_CONN_CFG_GATTC, gattc_conn_cfg.write_cmd_tx_queue_size = 2)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP=>SD [label = "sd_ble_enable()"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP rbox PEER [label="Connection Established"]; - * APP abox APP [label="available_queue_element_count = 2"]; - * |||; - * APP=>SD [label = "sd_ble_gattc_write(BLE_GATT_OP_WRITE_CMD, handle, value_1)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP abox APP [label="available_queue_element_count--"]; - * APP=>SD [label = "sd_ble_gattc_write(BLE_GATT_OP_WRITE_CMD, handle, value_2)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP abox APP [label="available_queue_element_count--"]; - * APP note APP [label = "available_queue_element_count == 0"]; - * |||; - * SD:>PEER [label = "ATT Write Command {value_1}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE {SUCCESS, 1}"]; - * APP abox APP [label="available_queue_element_count += 1"]; - * APP=>SD [label = "sd_ble_gattc_write(BLE_GATT_OP_WRITE_CMD, handle, value_3)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP abox APP [label="available_queue_element_count--"]; - * APP note APP [label = "available_queue_element_count == 0"]; - * |||; - * SD:>PEER [label = "ATT Write Command {value_2}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE {SUCCESS, 1}"]; - * APP abox APP [label="available_queue_element_count += 1"]; - * APP=>SD [label = "sd_ble_gattc_write(BLE_GATT_OP_WRITE_CMD, handle, value_4)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP abox APP [label="available_queue_element_count--"]; - * APP note APP [label = "available_queue_element_count == 0"]; - * |||; - * SD:>PEER [label = "ATT Write Command {value_3}", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "ATT Write Command {value_4}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE {SUCCESS, 2}"]; - * APP abox APP [label="available_queue_element_count += 2"]; - * @endmsc - * - * @defgroup BLE_GATTC_VALUE_WRITE_MSC GATTC Characteristic or Descriptor Value Write - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gattc_write(BLE_GATT_OP_WRITE_REQ, handle, value)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Write Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Write Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_WRITE_RSP {BLE_GATT_OP_WRITE_REQ, SUCCESS}"]; - * @endmsc - * - * @defgroup BLE_GATTC_VALUE_LONG_WRITE_MSC GATTC Characteristic or Descriptor Value Long Write - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gattc_write(BLE_GATT_OP_PREP_WRITE_REQ, handle, offset_1, value_1)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Prepare Write Request {handle, offset_1, value_1}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Prepare Write Response {handle, offset_1, value_1}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_WRITE_RSP {BLE_GATT_OP_PREP_WRITE_REQ, SUCCESS, value_1}"]; - * |||; - * APP=>SD [label = "sd_ble_gattc_write(BLE_GATT_OP_PREP_WRITE_REQ, handle, offset_2, value_2)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Prepare Write Request {handle, offset_2, value_2}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Prepare Write Response {handle, offset_2, value_2}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_WRITE_RSP {BLE_GATT_OP_PREP_WRITE_REQ, SUCCESS, value_2}"]; - * |||; - * ...; - * |||; - * --- [label = " Variant #1 App executes the Long Write procedure "]; - * |||; - * APP=>SD [label = "sd_ble_gattc_write(BLE_GATT_OP_EXEC_WRITE_REQ, PREPARED_WRITE)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Execute Write Request: flags = 0x01", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_WRITE_RSP {BLE_GATT_OP_EXEC_WRITE_REQ, SUCCESS}"]; - * |||; - * --- [label = " Variant #2 App cancels the Long Write procedure "]; - * |||; - * APP=>SD [label = "sd_ble_gattc_write(BLE_GATT_OP_EXEC_WRITE_REQ, PREPARED_CANCEL)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Execute Write Request: flags = 0x00", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_WRITE_RSP {BLE_GATT_OP_EXEC_WRITE_REQ, SUCCESS}"]; - * @endmsc - * - * @defgroup BLE_GATTC_VALUE_RELIABLE_WRITE_MSC GATTC Characteristic or Descriptor Value Reliable Write - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gattc_write(BLE_GATT_OP_PREP_WRITE_REQ, handle_1, offset, value_1)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Prepare Write Request {handle_1, offset, value_1}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Prepare Write Response {handle_1, offset, value_1}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_WRITE_RSP {BLE_GATT_OP_PREP_WRITE_REQ, SUCCESS, value_1}"]; - * |||; - * APP=>SD [label = "sd_ble_gattc_write(BLE_GATT_OP_PREP_WRITE_REQ, handle_2, offset, value_2)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Prepare Write Request {handle_2, offset, value_2}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Prepare Write Response {handle_2, offset, value_2}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_WRITE_RSP {BLE_GATT_OP_PREP_WRITE_REQ, SUCCESS, value_2}"]; - * |||; - * ...; - * |||; - * --- [label = " Variant #1 App executes the Reliable Write procedure "]; - * |||; - * APP=>SD [label = "sd_ble_gattc_write(BLE_GATT_OP_EXEC_WRITE_REQ, PREPARED_WRITE)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Execute Write Request: flags = 0x01", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_WRITE_RSP {BLE_GATT_OP_EXEC_WRITE_REQ, SUCCESS}"]; - * |||; - * --- [label = " Variant #2 App cancels the Reliable Write procedure "]; - * |||; - * APP=>SD [label = "sd_ble_gattc_write(BLE_GATT_OP_EXEC_WRITE_REQ, PREPARED_CANCEL)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Execute Write Request: flags = 0x00", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_WRITE_RSP {BLE_GATT_OP_EXEC_WRITE_REQ, SUCCESS}"]; - * @endmsc - * - * @defgroup BLE_GATTC_HVI_MSC GATTC Handle Value Indication - * <b> GATTC Handle Value Indication MSC </b> - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * SD<:PEER [label = "ATT Handle Value Indication", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_HVX {INDICATION, data}"]; - * APP=>SD [label = "sd_ble_gattc_hv_confirm(handle)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Handle Value Confirmation", textcolor="#000080", linecolor="#000080"]; - * @endmsc - * - * @defgroup BLE_GATTC_HVN_MSC GATTC Handle Value Notification - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * SD<:PEER [label = "ATT Handle Value Notification", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_HVX {NOTIFICATION, data}"]; - * @endmsc - * - * @defgroup BLE_GATTC_TIMEOUT_MSC GATTC Timeout - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * APP rbox PEER [label="Any GATTC API used"]; - * SD:>PEER [label = "ATT Packet", textcolor="#000080", linecolor="#000080"]; - * APP note PEER [label = "No Response from Peer"]; - * |||; - * ...; - * |||; - * SD box SD [label="Timeout"]; - * APP<<=SD [label = "BLE_GATTC_EVT_TIMEOUT {source}"]; - * APP rbox PEER [label="No additional ATT Traffic Allowed", textbgcolour="#ff7f7f"]; - * APP=>SD [label = "Any API call"]; - * APP<<SD [label = "NRF_ERROR_BUSY"]; - * @endmsc - * - * @defgroup BLE_GATTC_MTU_EXCHANGE GATTC ATT_MTU Exchange - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP=>SD [label = "sd_ble_cfg_set(BLE_CONN_CFG_GATT, gatt_conn_cfg.att_mtu=100)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP=>SD [label = "sd_ble_enable()"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * ...; - * |||; - * APP rbox PEER [label="Connection Established"]; - * SD rbox SD [label="att_mtu=23"]; - * |||; - * APP=>SD [label = "sd_ble_gattc_exchange_mtu_request(conn_handle, client_rx_mtu=80)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Exchange MTU Request {client_rx_mtu=80}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Exchange MTU Response {server_rx_mtu=75}", textcolor="#000080", linecolor="#000080"]; - * SD rbox SD [label="att_mtu=75"]; - * APP<<=SD [label = "BLE_GATTC_EVT_EXCHANGE_MTU_RSP {SUCCESS, server_rx_mtu=75}"]; - * @endmsc - * - * @} - * @} - */ - -/** - * @addtogroup BLE_GATTS - * @{ - * @defgroup BLE_GATTS_MSC Message Sequence Charts - * @{ - * @defgroup BLE_GATTS_ATT_TABLE_POP_MSC GATTS ATT Table Population - * @msc - * hscale = "1.5"; - * APP,SD; - * |||; - * APP=>SD [label = "sd_ble_gatts_service_add(uuid#1)"]; - * APP<<SD [label = "{NRF_SUCCESS, handle_srvc#1}"]; - * APP=>SD [label = "sd_ble_gatts_characteristic_add(handle_srvc#1, char_md, value)"]; - * APP<<SD [label = "{NRF_SUCCESS, handle_char#1, ...}"]; - * APP=>SD [label = "sd_ble_gatts_descriptor_add(handle_char#1, value)"]; - * APP<<SD [label = "{NRF_SUCCESS, handle_desc#1}"]; - * APP=>SD [label = "sd_ble_gatts_descriptor_add(handle_char#1, value)"]; - * APP<<SD [label = "{NRF_SUCCESS, handle_desc#2}"]; - * APP=>SD [label = "sd_ble_gatts_characteristic_add(handle_srvc#1, char_md, value)"]; - * APP<<SD [label = "{NRF_SUCCESS, handle_char#2, ...}"]; - * APP=>SD [label = "sd_ble_gatts_descriptor_add(handle_char#2, value)"]; - * APP<<SD [label = "{NRF_SUCCESS, handle_desc#3}"]; - * APP=>SD [label = "sd_ble_gatts_service_add(uuid#2)"]; - * APP<<SD [label = "{NRF_SUCCESS, handle_srvc#2}"]; - * APP=>SD [label = "sd_ble_gatts_include_add(handle_srvc#2, handle_srvc#1)"]; - * APP<<SD [label = "{NRF_SUCCESS, handle_inc#1}"]; - * |||; - * ...; - * |||; - * @endmsc - * - * @defgroup BLE_GATTS_READ_REQ_NO_AUTH_MSC GATTS Read Request without Authorization - * @msc - * hscale = "1.5"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * SD<:PEER [label = "ATT Read Request", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "ATT Read Response", textcolor="#000080", linecolor="#000080"]; - * @endmsc - * - * @defgroup BLE_GATTS_WRITE_REQ_NO_AUTH_MSC GATTS Write Request without Authorization - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * SD rbox SD [label="Value in ATT Table: current_value"]; - * SD<:PEER [label = "ATT Write Request {peer_value}", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "ATT Write Response", textcolor="#000080", linecolor="#000080"]; - * SD rbox SD [label="Value in ATT Table: peer_value"]; - * APP<<=SD [label = "BLE_GATTS_EVT_WRITE {WRITE_REQ, auth_required=0, peer_value}"]; - * @endmsc - * - * @defgroup BLE_GATTS_WRITE_CMD_NO_AUTH_MSC GATTS Write Command Without Authorization - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * SD rbox SD [label="Value in ATT Table: current_value"]; - * SD<:PEER [label = "ATT Write Command {peer_value}", textcolor="#000080", linecolor="#000080"]; - * SD rbox SD [label="Value in ATT Table: peer_value"]; - * APP<<=SD [label = "BLE_GATTS_EVT_WRITE {WRITE_CMD, auth_required=0, peer_value}"]; - * @endmsc - * - * @defgroup BLE_GATTS_WRITE_CMD_AUTH_MSC GATTS Write Command With Authorization - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * SD rbox SD [label="Value in ATT Table: current_value"]; - * SD<:PEER [label = "ATT Write Command {peer_value}", textcolor="#000080", linecolor="#000080"]; - * SD rbox SD [label="Value in ATT Table: current_value"]; - * APP<<=SD [label = "BLE_GATTS_EVT_WRITE {WRITE_CMD, auth_required=1, peer_value}"]; - * --- [label = " Variant #1 App Authorizes "]; - * APP=>SD [label = "sd_ble_gatts_value_set(peer_value)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD rbox SD [label="Value in ATT Table: peer_value"]; - * --- [label = " Variant #2 App Authorizes but changes value "]; - * APP=>SD [label = "sd_ble_gatts_value_set(app_value)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD rbox SD [label="Value in ATT Table: app_value"]; - * --- [label = " Variant #3 App ignores the incoming operation "]; - * SD rbox SD [label="Value in ATT Table: current_value"]; - * @endmsc - * - * @defgroup BLE_GATTS_READ_REQ_AUTH_MSC GATTS Read Request with Authorization - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * SD rbox SD [label="Value in ATT Table: current_value"]; - * SD<:PEER [label = "ATT Read Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {READ, current_value}"]; - * --- [label = " Variant #1 App Authorizes "]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(SUCCESS, app_value)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD rbox SD [label="Value in ATT Table: app_value"]; - * SD:>PEER [label = "ATT Read Response {app_value}", textcolor="#000080", linecolor="#000080"]; - * --- [label = " Variant #2 App Disallows "]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(READ_NOT_PERMITTED)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Error Response", textcolor="#000080", linecolor="#000080"]; - * @endmsc - * - * @defgroup BLE_GATTS_WRITE_REQ_AUTH_MSC GATTS Write Request with Authorization - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * SD rbox SD [label="Value in ATT Table: current_value"]; - * SD<:PEER [label = "ATT Write Request {peer_value}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, peer_value}"]; - * --- [label = " Variant #1 App Authorizes "]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(SUCCESS, peer_value)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD rbox SD [label="Value in ATT Table: peer_value"]; - * SD:>PEER [label = "ATT Write Response", textcolor="#000080", linecolor="#000080"]; - * --- [label = " Variant #2 App Authorizes but changes value "]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(SUCCESS, app_value)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD rbox SD [label="Value in ATT Table: app_value"]; - * SD:>PEER [label = "ATT Write Response", textcolor="#000080", linecolor="#000080"]; - * --- [label = " Variant #3 App Disallows "]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE_NOT_PERMITTED)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD rbox SD [label="Value in ATT Table: current_value"]; - * SD:>PEER [label = "ATT Error Response", textcolor="#000080", linecolor="#000080"]; - * @endmsc - * - * @defgroup BLE_GATTS_QUEUED_WRITE_BUF_NOAUTH_MSC GATTS Queued Writes: Stack handled, no attributes require authorization - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: current_value_1\nhandle_2: current_value_2"]; - * SD<:PEER [label = "ATT Prepare Write Request {handle_1, offset_1, peer_value_1}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_EVT_USER_MEM_REQUEST {BLE_USER_MEM_TYPE_GATTS_QUEUED_WRITES}"]; - * APP=>SD [label = "sd_ble_user_mem_reply {user_mem_block}"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_1, offset_1, peer_value_1}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Prepare Write Request {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #1 Attribute Values validation passed "]; - * SD<:PEER [label = "ATT Execute Write Request {WRITE}", textcolor="#000080", linecolor="#000080"]; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: peer_value_1\nhandle_2: peer_value_2"]; - * APP<<=SD [label = "BLE_GATTS_EVT_WRITE {EXEC_WRITE_REQ_NOW}"]; - * APP rbox APP [label="App parses the memory it provided"]; - * SD:>PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_EVT_USER_MEM_RELEASE {user_mem_block}"]; - * |||; - * --- [label = " Variant #2 Attribute Values validation failed "]; - * SD<:PEER [label = "ATT Execute Write Request {WRITE}", textcolor="#000080", linecolor="#000080"]; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: current_value_1\nhandle_2: current_value_2"]; - * SD:>PEER [label = "ATT Error Response {Invalid Value Length / Offset}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_EVT_USER_MEM_RELEASE {user_mem_block}"]; - * |||; - * @endmsc - * - * @defgroup BLE_GATTS_QUEUED_WRITE_BUF_AUTH_MSC GATTS Queued Writes: Stack handled, one or more attributes require authorization - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: current_value_1\nhandle_2: current_value_2"]; - * SD<:PEER [label = "ATT Prepare Write Request {handle_1, offset_1, peer_value_1}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_EVT_USER_MEM_REQUEST {BLE_USER_MEM_TYPE_GATTS_QUEUED_WRITES}"]; - * APP=>SD [label = "sd_ble_user_mem_reply {user_mem_block}"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_1, offset_1, peer_value_1}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Prepare Write Request {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, PREP_WRITE_REQ, handle_2, offset_2, peer_value_2}"]; - * |||; - * --- [label = " Variant #1 App Authorizes both Prepare Write and Execute Write"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS)"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Execute Write Request {WRITE}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, EXEC_WRITE_REQ_NOW}"]; - * APP rbox APP [label="App parses the memory it provided"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS)"]; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: peer_value_1\nhandle_2: peer_value_2"]; - * SD:>PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_EVT_USER_MEM_RELEASE {user_mem_block}"]; - * |||; - * --- [label = " Variant #2 App Disallows Prepare Write and Authorizes Execute Write "]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, INSUF_AUTHORIZATION)"]; - * SD:>PEER [label = "ATT Error Response {Insufficient Authorization}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Execute Write Request {WRITE}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, EXEC_WRITE_REQ_NOW}"]; - * APP rbox APP [label="App parses the memory it provided"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS)"]; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: peer_value_1\nhandle_2: current_value_2"]; - * SD:>PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_EVT_USER_MEM_RELEASE {user_mem_block}"]; - * |||; - * --- [label = " Variant #3 App Authorizes Prepare Write and Disallows Execute Write "]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS)"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Execute Write Request {WRITE}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, EXEC_WRITE_REQ_NOW}"]; - * APP rbox APP [label="App parses the memory it provided"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, APP_ERROR_CODE)"]; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: current_value_1\nhandle_2: current_value_2"]; - * SD:>PEER [label = "ATT Error Response {APP_ERROR_CODE}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_EVT_USER_MEM_RELEASE {user_mem_block}"]; - * @endmsc - * - * @defgroup BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC GATTS Queued Writes: App handled, no attributes require authorization - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * APP rbox SD [label="Values in ATT Table:\nhandle_1: current_value_1\nhandle_2: current_value_2"]; - * SD<:PEER [label = "ATT Prepare Write Request {handle_1, offset_1, peer_value_1}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_EVT_USER_MEM_REQUEST {BLE_USER_MEM_TYPE_GATTS_QUEUED_WRITES}"]; - * APP=>SD [label = "sd_ble_user_mem_reply {NULL}"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, PREP_WRITE_REQ, handle_1, offset_1, peer_value_1}"]; - * APP rbox APP [label="App queues {handle_1, offset_1, peer_value_1}"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS, handle_1, offset_1, peer_value_1)"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_1, offset_1, peer_value_1}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Prepare Write Request {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, PREP_WRITE_REQ, handle_2, offset_2, peer_value_2}"]; - * APP rbox APP [label="App queues {handle_2, offset_2, peer_value_2}"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS, handle_2, offset_2, peer_value_2)"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Execute Write Request {WRITE}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, EXEC_WRITE_REQ_NOW}"]; - * |||; - * --- [label = " Variant #1 Attribute values in stack memory (VLOC_STACK), attribute values validation passed "]; - * APP=>SD [label = "sd_ble_gatts_value_set {handle_1, offset_1, peer_value_1}"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP=>SD [label = "sd_ble_gatts_value_set {handle_2, offset_2, peer_value_2}"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: peer_value_1\nhandle_2: peer_value_2"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS)"]; - * SD:>PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #2 Attribute values in user memory (VLOC_USER), attribute values validation passed "]; - * APP rbox APP [label="Application traverses its queue and executes the write operations (memcpy)"]; - * APP rbox APP [label="Values in ATT Table:\nhandle_1: peer_value_1\nhandle_2: peer_value_2"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS)"]; - * SD:>PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #3 Attribute values validation failed "]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, INVALID_OFFSET)"]; - * APP rbox SD [label="Values in ATT Table:\nhandle_1: current_value_1\nhandle_2: current_value_2"]; - * SD:>PEER [label = "ATT Error Response {Invalid Offset}", textcolor="#000080", linecolor="#000080"]; - * @endmsc - * - * @defgroup BLE_GATTS_QUEUED_WRITE_NOBUF_AUTH_MSC GATTS Queued Writes: App handled, one or more attributes require authorization - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * APP rbox APP [label="Values in ATT Table in user memory (VLOC_USER):\nhandle_1: current_value_1\nhandle_2: current_value_2"]; - * SD<:PEER [label = "ATT Prepare Write Request {handle_1, offset_1, peer_value_1}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_EVT_USER_MEM_REQUEST {BLE_USER_MEM_TYPE_GATTS_QUEUED_WRITES}"]; - * APP=>SD [label = "sd_ble_user_mem_reply {NULL}"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, PREP_WRITE_REQ, handle_1, offset_1, peer_value_1}"]; - * APP rbox APP [label="App queues {handle_1, offset_1, peer_value_1}"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS, handle_1, offset_1, peer_value_1)"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_1, offset_1, peer_value_1}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Prepare Write Request {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, PREP_WRITE_REQ, handle_2, offset_2, peer_value_2}"]; - * |||; - * --- [label = " Variant #1 App Authorizes both Prepare Write and Execute Write"]; - * APP rbox APP [label="App queues {handle_2, offset_2, peer_value_2}"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS, handle_2, offset_2, peer_value_2)"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Execute Write Request {WRITE}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, EXEC_WRITE_REQ_NOW}"]; - * APP rbox APP [label="Application traverses its queue and executes the write operations (memcpy)"]; - * APP rbox APP [label="Values in ATT Table:\nhandle_1: peer_value_1\nhandle_2: peer_value_2"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS)"]; - * SD:>PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #2 App Disallows Prepare Write and Authorizes Execute Write "]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, INSUF_AUTHORIZATION)"]; - * SD:>PEER [label = "ATT Error Response {Insufficient Authorization}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Execute Write Request {WRITE}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, EXEC_WRITE_REQ_NOW}"]; - * APP rbox APP [label="Application traverses its queue and executes the write operations (memcpy)"]; - * APP rbox APP [label="Values in ATT Table:\nhandle_1: peer_value_1\nhandle_2: current_value_2"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS)"]; - * SD:>PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #3 App Authorizes Prepare Write and Disallows Execute Write "]; - * APP rbox APP [label="App queues {handle_2, offset_2, peer_value_2}"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS, handle_2, offset_2, peer_value_2)"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Execute Write Request {WRITE}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, EXEC_WRITE_REQ_NOW}"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, APP_ERROR_CODE)"]; - * APP rbox APP [label="Values in ATT Table:\nhandle_1: current_value_1\nhandle_2: current_value_2"]; - * SD:>PEER [label = "ATT Error Response {APP_ERROR_CODE}", textcolor="#000080", linecolor="#000080"]; - * @endmsc - * - * @defgroup BLE_GATTS_QUEUED_WRITE_PEER_CANCEL_MSC GATTS Queued Writes: Peer cancels operation - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: current_value_1\nhandle_2: current_value_2"]; - * SD<:PEER [label = "ATT Prepare Write Request {handle_1, offset_1, peer_value_1}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_EVT_USER_MEM_REQUEST {BLE_USER_MEM_TYPE_GATTS_QUEUED_WRITES}"]; - * |||; - * --- [label = " Variant #1 Stack handled "]; - * APP=>SD [label = "sd_ble_user_mem_reply {user_mem_block}"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_1, offset_1, peer_value_1}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Prepare Write Request {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Execute Write Request {CANCEL}", textcolor="#000080", linecolor="#000080"]; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: current_value_1\nhandle_2: current_value_2"]; - * SD:>PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_EVT_USER_MEM_RELEASE {user_mem_block}"]; - * |||; - * --- [label = " Variant #2 App handled "]; - * APP=>SD [label = "sd_ble_user_mem_reply {NULL}"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, PREP_WRITE_REQ, handle_1, offset_1, peer_value_1}"]; - * APP rbox APP [label="App queues {handle_1, offset_1, peer_value_1}"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS, handle_1, offset_1, peer_value_1)"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_1, offset_1, peer_value_1}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Prepare Write Request {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, PREP_WRITE_REQ, handle_2, offset_2, peer_value_2}"]; - * APP rbox APP [label="App queues {handle_2, offset_2, peer_value_2}"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS, handle_2, offset_2, peer_value_2)"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Execute Write Request {CANCEL}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, EXEC_WRITE_REQ_CANCEL}"]; - * APP rbox APP [label="App erases queue"]; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: current_value_1\nhandle_2: current_value_2"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS)"]; - * SD:>PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * |||; - * @endmsc - * - * @defgroup BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC GATTS Queued Writes: Prepare Queue Full - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: current_value_1\nhandle_2: current_value_2"]; - * SD<:PEER [label = "ATT Prepare Write Request {handle_1, offset_1, peer_value_1}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_EVT_USER_MEM_REQUEST {BLE_USER_MEM_TYPE_GATTS_QUEUED_WRITES}"]; - * |||; - * --- [label = " Variant #1 Stack handled "]; - * APP=>SD [label = "sd_ble_user_mem_reply {user_mem_block}"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_1, offset_1, peer_value_1}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Prepare Write Request {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "ATT Error Response {Prepare Queue Full}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Execute Write Request {WRITE}", textcolor="#000080", linecolor="#000080"]; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: peer_value_1\nhandle_2: current_value_2"]; - * APP<<=SD [label = "BLE_GATTS_EVT_WRITE {EXEC_WRITE_REQ_NOW}"]; - * APP rbox APP [label="App parses the memory it provided"]; - * SD:>PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_EVT_USER_MEM_RELEASE {user_mem_block}"]; - * |||; - * --- [label = " Variant #2 App handled "]; - * APP=>SD [label = "sd_ble_user_mem_reply {NULL}"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, PREP_WRITE_REQ, handle_1, offset_1, peer_value_1}"]; - * APP rbox APP [label="App queues {handle_1, offset_1, peer_value_1}"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS, handle_1, offset_1, peer_value_1)"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_1, offset_1, peer_value_1}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Prepare Write Request {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, PREP_WRITE_REQ, handle_2, offset_2, peer_value_2}"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, PREPARE_QUEUE_FULL)"]; - * SD:>PEER [label = "ATT Error Response {Prepare Queue Full}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Execute Write Request {WRITE}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, EXEC_WRITE_REQ_NOW}"]; - * APP=>SD [label = "sd_ble_gatts_value_set {handle_1, offset_1, peer_value_1}"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS)"]; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: peer_value_1\nhandle_2: current_value_2"]; - * SD:>PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * @endmsc - * - * @defgroup BLE_GATTS_QUEUED_WRITE_EXECUTE_WITHOUT_PREPARE_MSC GATTS Queued Writes: Execute Write without Prepare Write - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: current_value_1\nhandle_2: current_value_2"]; - * |||; - * SD rbox SD [label="No ATT Prepare Write Request has been received by SD"]; - * |||; - * --- [label = " Variant #1 Write cancelled "]; - * SD<:PEER [label = "ATT Execute Write Request {CANCEL}", textcolor="#000080", linecolor="#000080"]; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: current_value_1\nhandle_2: current_value_2"]; - * APP<<=SD [label = "BLE_GATTS_EVT_WRITE {EXEC_WRITE_REQ_CANCEL}"]; - * SD:>PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #2 Write now "]; - * SD<:PEER [label = "ATT Execute Write Request {WRITE}", textcolor="#000080", linecolor="#000080"]; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: current_value_1\nhandle_2: current_value_2"]; - * APP<<=SD [label = "BLE_GATTS_EVT_WRITE {EXEC_WRITE_REQ_NOW}"]; - * SD:>PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * @endmsc - * - * @defgroup BLE_GATTS_MTU_EXCHANGE GATTS ATT_MTU Exchange - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP=>SD [label = "sd_ble_cfg_set(BLE_CONN_CFG_GATT, gatt_conn_cfg.att_mtu=100)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP=>SD [label = "sd_ble_enable()"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * ...; - * |||; - * APP rbox PEER [label="Connection Established"]; - * SD rbox SD [label="att_mtu=23"]; - * |||; - * SD<:PEER [label = "ATT Exchange MTU Request {client_rx_mtu=80}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST {att_mtu=80}"]; - * APP=>SD [label = "sd_ble_gatts_exchange_mtu_reply(conn_handle, server_rx_mtu=75)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Exchange MTU Response {server_rx_mtu=75}", textcolor="#000080", linecolor="#000080"]; - * SD rbox SD [label="att_mtu=75"]; - * @endmsc - * - * @defgroup BLE_GATTS_HVI_MSC GATTS Handle Value Indication - * @msc - * hscale = "1.5"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * APP rbox PEER [label="Indications Enabled in CCCD"]; - * |||; - * SD rbox SD [label="Value in ATT Table: current_value"]; - * APP=>SD [label = "sd_ble_gatts_hvx(INDICATION, app_value)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD rbox SD [label="Value in ATT Table: app_value"]; - * SD:>PEER [label = "ATT Handle Value Indication {app_value}", textcolor="#000080", linecolor="#000080"]; - * --- [label = " Variant #1 Peer Confirms "]; - * SD<:PEER [label = "ATT Handle Value Confirmation", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_HVC"]; - * --- [label = " Variant #2 Peer Ignores "]; - * |||; - * ...; - * |||; - * SD box SD [label="Timeout"]; - * APP<<=SD [label = "BLE_GATTS_EVT_TIMEOUT"]; - * @endmsc - * - * @defgroup BLE_GATTS_HVN_MSC GATTS Handle Value Notification - * @msc - * hscale = "1.5"; - * APP,SD,PEER; - * |||; - * --- [label = " Variant #1 App does not keep track of the available queue element count for notifications "]; - * APP note PEER [label = " This variant makes it possible for APP to transmit notifications without keeping track of the available queue element count. However, successful queuing of notifications cannot be guaranteed. "]; - * |||; - * APP=>SD [label = "sd_ble_enable()"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP rbox PEER [label = "Connection Established"]; - * |||; - * APP rbox PEER [label = "Notifications Enabled in CCCD"]; - * SD note SD [label = "Value in ATT Table: current_value"]; - * |||; - * APP=>SD [label = "sd_ble_gatts_hvx(NOTIFICATION, app_value_1)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD note SD [label="Value in ATT Table: app_value_1"]; - * APP=>SD [label = "sd_ble_gatts_hvx(NOTIFICATION, app_value_2)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD note SD [label="Value in ATT Table: app_value_2"]; - * APP=>SD [label = "sd_ble_gatts_hvx(NOTIFICATION, app_value_3)"]; - * APP<<SD [label = "NRF_ERROR_RESOURCES"]; - * SD note SD [label = "Value in ATT Table: app_value_3"]; - * |||; - * ...; - * |||; - * APP=>SD [label = "sd_ble_gatts_hvx(NOTIFICATION, app_value_4)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD rbox SD [label = "Value in ATT Table: app_value_4"]; - * |||; - * SD:>PEER [label = "ATT Handle Value Notification {app_value_1}", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "ATT Handle Value Notification {app_value_2}", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "ATT Handle Value Notification {app_value_4}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_HVN_TX_COMPLETE {3}"]; - * |||; - * --- [label = " Variant #2 App keeps track of the available queue element count for notifications "]; - * APP note PEER [label = " This variant makes it possible for APP to know when successful queuing of notifications is guaranteed. "]; - * |||; - * APP=>SD [label = "sd_ble_cfg_set(BLE_CONN_CFG_GATTS, gatts_conn_cfg.hvn_tx_queue_size=2)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP=>SD [label = "sd_ble_enable()"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * APP rbox PEER [label = "Connection Established"]; - * APP abox APP [label="available_queue_element_count = 2"]; - * |||; - * APP rbox PEER [label = "Notifications Enabled in CCCD"]; - * SD note SD [label = "Value in ATT Table: current_value"]; - * |||; - * APP=>SD [label = "sd_ble_gatts_hvx(NOTIFICATION, app_value_1)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP abox APP [label="available_queue_element_count--"]; - * APP note APP [label="available_queue_element_count == 1"], SD note SD [label="Value in ATT Table: app_value_1"]; - * APP=>SD [label = "sd_ble_gatts_hvx(NOTIFICATION, app_value_2)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP abox APP [label="available_queue_element_count--"]; - * APP note APP [label="available_queue_element_count == 0"], SD note SD [label="Value in ATT Table: app_value_2"]; - * |||; - * SD:>PEER [label = "ATT Handle Value Notification {app_value_1}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_HVN_TX_COMPLETE {1}"]; - * APP abox APP [label="available_queue_element_count += 1"]; - * APP=>SD [label = "sd_ble_gatts_hvx(NOTIFICATION, app_value_3)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP abox APP [label="available_queue_element_count--"]; - * APP note APP [label="available_queue_element_count == 0"], SD note SD [label="Value in ATT Table: app_value_3"]; - * |||; - * SD:>PEER [label = "ATT Handle Value Notification {app_value_2}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_HVN_TX_COMPLETE {1}"]; - * APP abox APP [label="available_queue_element_count += 1"]; - * APP=>SD [label = "sd_ble_gatts_hvx(NOTIFICATION, app_value_4)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP abox APP [label="available_queue_element_count--"]; - * APP note APP [label="available_queue_element_count == 0"], SD note SD [label="Value in ATT Table: app_value_4"]; - * |||; - * SD:>PEER [label = "ATT Handle Value Notification {app_value_3}", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "ATT Handle Value Notification {app_value_4}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_HVN_TX_COMPLETE {2}"]; - * APP abox APP [label="available_queue_element_count += 2"]; - * @endmsc - * - * @defgroup BLE_GATTS_HVX_DISABLED_MSC GATTS Handle Value Indication or Notification disabled - * @msc - * hscale = "1.5"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * APP rbox PEER [label="Indications and Notifications Disabled in CCCD"]; - * |||; - * SD rbox SD [label="Value in ATT Table: current_value"]; - * APP=>SD [label = "sd_ble_gatts_hvx(INDICATION or NOTIFICATION, app_value)"]; - * APP<<SD [label = "NRF_ERROR_INVALID_STATE"]; - * SD rbox SD [label="Value in ATT Table: current_value"]; - * @endmsc - * - * @defgroup BLE_GATTS_HVX_SYS_ATTRS_MISSING_MSC GATTS Handle Value Indication or Notification with System Attributes Missing - * @msc - * hscale = "1.5"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * APP rbox PEER [label="System Attributes Uninitialized"]; - * |||; - * SD rbox SD [label="Value in ATT Table: current_value"]; - * APP=>SD [label = "sd_ble_gatts_hvx(INDICATION or NOTIFICATION, app_value)"]; - * APP<<SD [label = "BLE_ERROR_GATTS_SYS_ATTR_MISSING"]; - * SD rbox SD [label="Value in ATT Table: current_value"]; - * APP=>SD [label = "sd_ble_gatts_sys_attr_set()"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * |||; - * ...; - * @endmsc - * - * @defgroup BLE_GATTS_SC_MSC GATTS Service Changed - * @msc - * hscale = "1.5"; - * APP,SD,PEER; - * |||; - * APP rbox SD [label="Entries added to the ATT Table between handles N and M"]; - * |||; - * APP rbox PEER [label="Connection Established with a Bonded Peer"]; - * |||; - * APP=>SD [label = "sd_ble_gatts_service_changed(N, M)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Handle Value Indication {N, M}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Handle Value Confirmation", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_SC_CONFIRM"]; - * |||; - * SD rbox PEER [label="Service Discovery"]; - * @endmsc - * - * @defgroup BLE_GATTS_SYS_ATTRS_UNK_PEER_MSC GATTS System Attributes Handling: Unknown Peer - * @msc - * hscale = "1.5"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established with an Unknown Peer"]; - * |||; - * SD<:PEER [label = "ATT Read Request {sys_attr_handle}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_SYS_ATTR_MISSING"]; - * APP=>SD [label = "sd_ble_gatts_sys_attr_set(NULL)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Read Response {sys_attr_value}", textcolor="#000080", linecolor="#000080"]; - * @endmsc - * - * @defgroup BLE_GATTS_SYS_ATTRS_BONDED_PEER_MSC GATTS System Attributes Handling: Bonded Peer - * @msc - * hscale = "1.5"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established with a Bonded Peer"]; - * |||; - * APP rbox PEER [label="ATT Traffic"]; - * |||; - * APP rbox PEER [label="Connection Terminated"]; - * APP<<=SD [label = "BLE_GAP_EVT_DISCONNECTED {reason}"]; - * |||; - * APP=>SD [label = "sd_ble_gatts_sys_attr_get()"]; - * APP<<SD [label = "{NRF_SUCCESS, sys_attr_data}"]; - * APP rbox APP [label="Store System Attributes"]; - * |||; - * APP rbox SD [label="Shut down IC"]; - * |||; - * APP rbox SD [label="Power up IC"]; - * |||; - * APP rbox PEER [label="Connection Established with the Bonded Peer"]; - * SD<:PEER [label = "ATT Read Request {sys_attr_handle}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_SYS_ATTR_MISSING"]; - * APP rbox APP [label="Load System Attributes"]; - * APP=>SD [label = "sd_ble_gatts_sys_attr_set(sys_attr_data)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "ATT Read Response {sys_attr_value}", textcolor="#000080", linecolor="#000080"]; - * @endmsc - * @} - * - * @addtogroup BLE_GATTS_QUEUED_WRITES_USER_MEM User memory layout for Queued Writes - * @{ - * The following table shows the memory layout used by the SoftDevice to queue a Queued Write operation (Prepare Write ATT packet) in user memory: - * - * <table style="border:1px solid black;border-collapse:collapse;"> - * <caption>Queued Write</caption> - * <tr> - * <th style="border:1px solid black;padding:5px;">Parameter</th> - * <th style="border:1px solid black;padding:5px;">Size (octets)</th> - * <th style="border:1px solid black;padding:5px;">Description</th> - * </tr> - * <tr> - * <td style="border:1px solid black;padding:5px;">Handle</td> - * <td style="border:1px solid black;padding:5px;">2</td> - * <td style="border:1px solid black;padding:5px;">Attribute Handle</td> - * </tr> - * <tr> - * <td style="border:1px solid black;padding:5px;">Offset</td> - * <td style="border:1px solid black;padding:5px;">2</td> - * <td style="border:1px solid black;padding:5px;">Value Offset</td> - * </tr> - * <tr> - * <td style="border:1px solid black;padding:5px;">Length</td> - * <td style="border:1px solid black;padding:5px;">2</td> - * <td style="border:1px solid black;padding:5px;">Value Length</td> - * </tr> - * <tr> - * <td style="border:1px solid black;padding:5px;">Value</td> - * <td style="border:1px solid black;padding:5px;">Length</td> - * <td style="border:1px solid black;padding:5px;">Attribute Value</td> - * </tr> - * </table> - * - * The application can parse the array of Queued Write instances at any time, but it is recommended to do so whenever an Execute Write ATT packet - * has been received over the air. See the GATT Server Queued Writes MSCs for more details. - * The array will be terminated by an Queued Write instance with its handle set to @ref BLE_GATT_HANDLE_INVALID. - * @} - */ - - /** - * @addtogroup BLE_GATTS_SYS_ATTRS_FORMAT User memory layout for System Attributes - * @{ - * The following table shows the memory layout used by the SoftDevice to store a - * system attribute. - * - * <table style="border:1px solid black;border-collapse:collapse;"> - * <caption>System Attribute</caption> - * <tr> - * <th style="border:1px solid black;padding:5px;">Parameter</th> - * <th style="border:1px solid black;padding:5px;">Size (octets)</th> - * <th style="border:1px solid black;padding:5px;">Description</th> - * </tr> - * <tr> - * <td style="border:1px solid black;padding:5px;">Handle</td> - * <td style="border:1px solid black;padding:5px;">2</td> - * <td style="border:1px solid black;padding:5px;">Attribute handle</td> - * </tr> - * <tr> - * <td style="border:1px solid black;padding:5px;">Length</td> - * <td style="border:1px solid black;padding:5px;">2</td> - * <td style="border:1px solid black;padding:5px;">Attribute length</td> - * </tr> - * <tr> - * <td style="border:1px solid black;padding:5px;">Data</td> - * <td style="border:1px solid black;padding:5px;">Length</td> - * <td style="border:1px solid black;padding:5px;">Attribute data</td> - * </tr> - * </table> - * - * The application can obtain an array of system attributes by using @c sd_ble_gatts_sys_attr_get(). - * The array is terminated by a CRC-16-CCITT checksum of the data in the array. - * @} - * @} - */ - -/** - * @addtogroup BLE_L2CAP - * @{ - * @defgroup BLE_L2CAP_MSC Message Sequence Charts - * @{ - * @defgroup BLE_L2CAP_CH_SETUP_MSC L2CAP Channel Setup - * @msc - * hscale = "1.5"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * --- [label = " Variant #1 Locally initiated, Establishment success "]; - * APP=>SD [label = "sd_ble_l2cap_ch_setup(conn_handle, local_cid=INVALID, le_psm, rx_mtu, rx_mps, sdu_buf: [len, p_data1])"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "L2CAP LE Credit Based Connection Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "L2CAP LE Credit Based Connection Response: Connection successful", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_SETUP {conn_handle, local_cid, tx_mtu, tx_mps, credits}"]; - * |||; - * APP rbox PEER [label="L2CAP Channel Established"]; - * |||; - * --- [label = " Variant #2 Locally initiated, Establishment failure - PEER refusal "]; - * APP=>SD [label = "sd_ble_l2cap_ch_setup(conn_handle, local_cid=INVALID, le_psm, rx_mtu, rx_mps, sdu_buf: [len, p_data1])"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "L2CAP LE Credit Based Connection Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "L2CAP LE Credit Based Connection Response: Connection refused - no resources available", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED {conn_handle, local_cid, sdu_buf: [len, p_data1]}"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_SETUP_REFUSED {conn_handle, local_cid, source: REMOTE, status: NO_RESOURCES}"]; - * |||; - * APP rbox PEER [label="L2CAP Channel NOT Established"]; - * |||; - * --- [label = " Variant #3 Locally initiated, Establishment failure - PEER does not respond "]; - * APP=>SD [label = "sd_ble_l2cap_ch_setup(conn_handle, local_cid=INVALID, le_psm, rx_mtu, rx_mps, sdu_buf: p_data=NULL)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "L2CAP LE Credit Based Connection Request", textcolor="#000080", linecolor="#000080"]; - * SD abox SD [label="Timeout"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_SETUP_REFUSED {conn_handle, local_cid, source: LOCAL, status: TIMEOUT}"]; - * |||; - * APP rbox PEER [label="L2CAP Channel NOT Established"]; - * |||; - * --- [label = " Variant #4 Remotely initiated, Establishment success "]; - * SD<:PEER [label = "L2CAP LE Credit Based Connection Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_SETUP_REQUEST {conn_handle, local_cid, le_psm, tx_mtu, tx_mps, credits}"]; - * APP=>SD [label = "sd_ble_l2cap_ch_setup(conn_handle, local_cid, rx_mtu, rx_mps, sdu_buf: [len, p_data1], status: SUCCESS)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_SETUP {conn_handle, local_cid, tx_mtu, tx_mps, credits}"]; - * SD:>PEER [label = "L2CAP LE Credit Based Connection Response: Connection successful", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP rbox PEER [label="L2CAP Channel Established"]; - * |||; - * --- [label = " Variant #5 Remotely initiated, Establishment failure - APP refusal "]; - * SD<:PEER [label = "L2CAP LE Credit Based Connection Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_SETUP_REQUEST {conn_handle, local_cid, le_psm, tx_mtu, tx_mps, credits}"]; - * APP=>SD [label = "sd_ble_l2cap_ch_setup(conn_handle, local_cid, status: LE_PSM_NOT_SUPPORTED)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "L2CAP LE Credit Based Connection Response: Connection refused - LE_PSM not supported", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP rbox PEER [label="L2CAP Channel NOT Established"]; - * |||; - * --- [label = " Variant #6 Remotely initiated, Establishment failure - SD refusal "]; - * SD<:PEER [label = "L2CAP LE Credit Based Connection Request", textcolor="#000080", linecolor="#000080"]; - * SD rbox SD [label="The limit of available L2CAP channels has been reached"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_SETUP_REFUSED {conn_handle, local_cid=INVALID, source: LOCAL, status: NO_RESOURCES}"]; - * SD:>PEER [label = "L2CAP LE Credit Based Connection Response: Connection refused - no resources available", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP rbox PEER [label="L2CAP Channel NOT Established"]; - * |||; - * @endmsc - * - * @defgroup BLE_L2CAP_CH_RELEASE_MSC L2CAP Channel Release - * @msc - * hscale = "1.5"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * APP rbox PEER [label="L2CAP Channel Established"]; - * |||; - * --- [label = " Variant #1 Locally initiated, PEER responds "]; - * APP=>SD [label = "sd_ble_l2cap_ch_release(conn_handle, local_cid)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "L2CAP Disconnection Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "L2CAP Disconnection Response", textcolor="#000080", linecolor="#000080"]; - * SD rbox SD [label="SD currently has three SDU data buffers supplied by APP"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED {conn_handle, local_cid, sdu_buf1}"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED {conn_handle, local_cid, sdu_buf2}"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED {conn_handle, local_cid, sdu_buf3}"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_RELEASED {conn_handle, local_cid}"]; - * |||; - * --- [label = " Variant #2 Locally initiated, PEER does not respond "]; - * APP=>SD [label = "sd_ble_l2cap_ch_release(conn_handle, local_cid)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "L2CAP Disconnection Request", textcolor="#000080", linecolor="#000080"]; - * SD abox SD [label="Timeout"]; - * SD rbox SD [label="SD does not currently have SDU data buffers supplied by APP"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_RELEASED {conn_handle, local_cid}"]; - * |||; - * --- [label = " Variant #3 Remotely initiated "]; - * SD<:PEER [label = "L2CAP Disconnection Request", textcolor="#000080", linecolor="#000080"]; - * SD rbox SD [label="SD does not currently have SDU data buffers supplied by APP"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_RELEASED {conn_handle, local_cid}"]; - * SD:>PEER [label = "L2CAP Disconnection Response", textcolor="#000080", linecolor="#000080"]; - * |||; - * @endmsc - * - * @defgroup BLE_L2CAP_CH_TX_MSC L2CAP Channel SDU Transmit - * @msc - * hscale = "1.5"; - * APP,SD,PEER; - * |||; - * --- [label = " Variant #1 App ignores transmit credits, SD will transmit data as soon as possible "]; - * APP rbox PEER [label="L2CAP Channel Established, tx_queue_size=2, tx_mps=100, credits=2"]; - * |||; - * APP=>SD [label = "sd_ble_l2cap_ch_tx(conn_handle, local_cid, p_sdu_buf: [len=140, p_data1])"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP=>SD [label = "sd_ble_l2cap_ch_tx(conn_handle, local_cid, p_sdu_buf: [len=80, p_data2])"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP=>SD [label = "sd_ble_l2cap_ch_tx(conn_handle, local_cid, p_sdu_buf: [len=280, p_data3])"]; - * APP<<SD [label = "NRF_ERROR_RESOURCES"]; - * SD:>PEER [label = "SDU 1, Segment 1", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "SDU 1, Segment 2", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_TX {conn_handle, local_cid, sdu_buf: [len=140, p_data1]}"]; - * APP abox APP [label="App releases memory pointed by p_data1"]; - * SD rbox SD [label="All credits consumed"]; - * APP=>SD [label = "sd_ble_l2cap_ch_tx(conn_handle, local_cid, p_sdu_buf: [len=280, p_data3])"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * ...; - * SD<:PEER [label = "LE Flow Control Credit (credits=2)", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_CREDIT {conn_handle, local_cid, credits=2}"]; - * SD:>PEER [label = "SDU 2, Segment 1", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_TX {conn_handle, local_cid, sdu_buf: [len=80, p_data2]}"]; - * APP abox APP [label="App releases memory pointed by p_data2"]; - * SD:>PEER [label = "SDU 3, Segment 1", textcolor="#000080", linecolor="#000080"]; - * SD rbox SD [label="All credits consumed"]; - * ...; - * SD<:PEER [label = "LE Flow Control Credit (credits=2)", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_CREDIT {conn_handle, local_cid, credits=2}"]; - * SD:>PEER [label = "SDU 3, Segment 2", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "SDU 3, Segment 3", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_TX {conn_handle, local_cid, sdu_buf: [len=280, p_data3]}"]; - * APP abox APP [label="App releases memory pointed by p_data3"]; - * |||; - * --- [label = " Variant #2 App keeps track of transmission credits and transmits only if credits are available "]; - * APP rbox PEER [label="L2CAP Channel Established, tx_queue_size=2, tx_mps=100, credits=2"]; - * APP abox APP [label="available_credits = 2"]; - * |||; - * APP=>SD [label = "sd_ble_l2cap_ch_tx(conn_handle, local_cid, p_sdu_buf: [len=140, p_data1])"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP abox APP [label="available_credits -= ceiling((len+2)/tx_mps)\n// available_credits == 0"]; - * SD:>PEER [label = "SDU 1, Segment 1", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "SDU 1, Segment 2", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_TX {conn_handle, local_cid, sdu_buf: [len=140, p_data1]}"]; - * APP abox APP [label="App releases memory pointed by p_data1"]; - * ...; - * SD<:PEER [label = "LE Flow Control Credit (credits=2)", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_CREDIT {conn_handle, local_cid, credits=2}"]; - * APP abox APP [label="available_credits += 2\n// available_credits == 2"]; - * APP=>SD [label = "sd_ble_l2cap_ch_tx(conn_handle, local_cid, p_sdu_buf: [len=80, p_data2])"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP abox APP [label="available_credits -= ceiling((len+2)/tx_mps)\n// available_credits == 1"]; - * APP=>SD [label = "sd_ble_l2cap_ch_tx(conn_handle, local_cid, p_sdu_buf: [len=280, p_data3])"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * APP abox APP [label="available_credits -= ceiling((len+2)/tx_mps)\n// available_credits == -2"]; - * SD:>PEER [label = "SDU 2, Segment 1", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_TX {conn_handle, local_cid, sdu_buf: [len=80, p_data2]}"]; - * APP abox APP [label="App releases memory pointed by p_data2"]; - * SD:>PEER [label = "SDU 3, Segment 1", textcolor="#000080", linecolor="#000080"]; - * ...; - * SD<:PEER [label = "LE Flow Control Credit (credits=2)", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_CREDIT {conn_handle, local_cid, credits=2}"]; - * APP abox APP [label="available_credits += 2\n// available_credits == 0"]; - * SD:>PEER [label = "SDU 3, Segment 2", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "SDU 3, Segment 3", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_TX {conn_handle, local_cid, sdu_buf: [len=280, p_data3]}"]; - * APP abox APP [label="App releases memory pointed by p_data3"]; - * |||; - * @endmsc - * - * @defgroup BLE_L2CAP_CH_RX_MSC L2CAP Channel SDU Receive - * @msc - * hscale = "1.5"; - * APP,SD,PEER; - * |||; - * APP=>SD [label = "sd_ble_l2cap_ch_setup(rx_mtu=1000, rx_mps=100, sdu_buf: [len=1000, p_data1])"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "L2CAP LE Credit Based Connection Request (Initial Credits=1)", textcolor="#000080", linecolor="#000080"]; - * APP rbox PEER [label="L2CAP Channel Established, rx_queue_size=2, rx_mtu=1000, rx_mps=100"]; - * |||; - * APP=>SD [label = "sd_ble_l2cap_ch_rx(conn_handle, local_cid, p_sdu_buf: [len=1000, p_data2])"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "LE Flow Control Credit (credits=1)", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "SDU 1, Segment 1", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "LE Flow Control Credit (credits=1)", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "SDU 1, Segment 2", textcolor="#000080", linecolor="#000080"]; - * PEER rbox PEER [label="1 credit left"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_RX {conn_handle, local_cid, sdu_len=140, sdu_buf: [len=1000, p_data1]}"]; - * APP abox APP [label="App can process data and release memory pointed by p_data1"]; - * APP=>SD [label = "sd_ble_l2cap_ch_rx(conn_handle, local_cid, p_sdu_buf: [len=1000, p_data3])"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "LE Flow Control Credit (credits=1)", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "SDU 2, Segment 1", textcolor="#000080", linecolor="#000080"]; - * PEER rbox PEER [label="1 credit left"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_RX {conn_handle, local_cid, sdu_len=80, sdu_buf: [len=1000, p_data2]}"]; - * APP abox APP [label="App can process data and release memory pointed by p_data2"]; - * SD<:PEER [label = "SDU 3, Segment 1", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "LE Flow Control Credit (credits=2)", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "SDU 3, Segment 2", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "SDU 3, Segment 3", textcolor="#000080", linecolor="#000080"]; - * PEER rbox PEER [label="All credits consumed"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_RX {conn_handle, local_cid, sdu_len=280, sdu_buf: [len=1000, p_data3]}"]; - * APP abox APP [label="App can process data and release memory pointed by p_data3"]; - * |||; - * @endmsc - * - * @defgroup BLE_L2CAP_CH_FLOW_CONTROL_MSC L2CAP Channel advanced SDU reception flow control - * @msc - * hscale = "1.5"; - * APP,SD,PEER; - * |||; - * APP=>SD [label = "sd_ble_l2cap_ch_setup(rx_mtu=1000, rx_mps=100, sdu_buf: p_data=NULL)"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "L2CAP LE Credit Based Connection Request (Initial Credits=0)", textcolor="#000080", linecolor="#000080"]; - * APP rbox PEER [label="L2CAP Channel Established, rx_queue_size=2, rx_mtu=1000, rx_mps=100"]; - * |||; - * --- [label = " Variant #1 App overwrites number of credits peer should have at the start of a SDU "]; - * APP=>SD [label = "sd_ble_l2cap_ch_flow_control(conn_handle, local_cid, credits=8)"]; - * APP<<SD [label = "{NRF_SUCCESS, *p_credits=0}"]; - * APP=>SD [label = "sd_ble_l2cap_ch_rx(conn_handle, local_cid, p_sdu_buf: [len=1000, p_data1])"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "LE Flow Control Credit (credits=8)", textcolor="#000080", linecolor="#000080"]; - * APP=>SD [label = "sd_ble_l2cap_ch_rx(conn_handle, local_cid, p_sdu_buf: [len=1000, p_data2])"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD<:PEER [label = "SDU 1, Segment 1", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "LE Flow Control Credit (credits=2)", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "SDU 1, Segment 2", textcolor="#000080", linecolor="#000080"]; - * PEER rbox PEER [label="8 credits left"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_RX {conn_handle, local_cid, sdu_len=140, sdu_buf: [len=1000, p_data1]}"]; - * APP abox APP [label="App can process data and release memory pointed by p_data1"]; - * APP=>SD [label = "sd_ble_l2cap_ch_rx(conn_handle, local_cid, p_sdu_buf: [len=1000, p_data3])"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD<:PEER [label = "SDU 2, Segment 1", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "LE Flow Control Credit (credits=1)", textcolor="#000080", linecolor="#000080"]; - * PEER rbox PEER [label="8 credits left"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_RX {conn_handle, local_cid, sdu_len=80, sdu_buf: [len=1000, p_data2]}"]; - * APP abox APP [label="App can process data and release memory pointed by p_data2"]; - * SD<:PEER [label = "SDU 3, Segment 1", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "SDU 3, Segment 2", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "SDU 3, Segment 3", textcolor="#000080", linecolor="#000080"]; - * PEER rbox PEER [label="5 credits left"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_RX {conn_handle, local_cid, sdu_len=280, sdu_buf: [len=1000, p_data3]}"]; - * APP abox APP [label="App can process data and release memory pointed by p_data3"]; - * APP rbox APP [label="Peer has credits remaining so application must provide new reception buffer as soon as possible."]; - * |||; - * --- [label = " Variant #2 App pauses traffic on a L2CAP Channel "]; - * APP=>SD [label = "sd_ble_l2cap_ch_rx(conn_handle, local_cid, p_sdu_buf: [len=1000, p_data1])"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "LE Flow Control Credit (credits=1)", textcolor="#000080", linecolor="#000080"]; - * APP=>SD [label = "sd_ble_l2cap_ch_rx(conn_handle, local_cid, p_sdu_buf: [len=1000, p_data2])"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD:>PEER [label = "LE Flow Control Credit (credits=1)", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "SDU 1, Segment 1", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "LE Flow Control Credit (credits=1)", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "SDU 1, Segment 2", textcolor="#000080", linecolor="#000080"]; - * PEER rbox PEER [label="1 credit left"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_RX {conn_handle, local_cid, sdu_len=140, sdu_buf: [len=1000, p_data1]}"]; - * APP abox APP [label="App can process data and release memory pointed by p_data1"]; - * APP=>SD [label = "sd_ble_l2cap_ch_flow_control(conn_handle, local_cid, credits=0)"]; - * APP<<SD [label = "{NRF_SUCCESS, *p_credits=1}"]; - * APP=>SD [label = "sd_ble_l2cap_ch_rx(conn_handle, local_cid, p_sdu_buf: [len=1000, p_data3])"]; - * APP<<SD [label = "NRF_SUCCESS"]; - * SD<:PEER [label = "SDU 2, Segment 1", textcolor="#000080", linecolor="#000080"]; - * PEER rbox PEER [label="All credits consumed"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_RX {conn_handle, local_cid, sdu_len=80, sdu_buf: [len=1000, p_data2]}"]; - * APP abox APP [label="App can process data and release memory pointed by p_data2"]; - * APP=>SD [label = "sd_ble_l2cap_ch_flow_control(conn_handle, local_cid, credits=0)"]; - * APP<<SD [label = "{NRF_SUCCESS, *p_credits=0}"]; - * ...; - * ...; - * APP=>SD [label = "sd_ble_l2cap_ch_flow_control(conn_handle, local_cid, credits=BLE_L2CAP_CREDITS_DEFAULT)"]; - * APP<<SD [label = "{NRF_SUCCESS, *p_credits=1}"]; - * SD:>PEER [label = "LE Flow Control Credit (credits=1)", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "SDU 3, Segment 1", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "LE Flow Control Credit (credits=2)", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "SDU 3, Segment 2", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "SDU 3, Segment 3", textcolor="#000080", linecolor="#000080"]; - * PEER rbox PEER [label="All credits consumed"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_RX {conn_handle, local_cid, sdu_len=280, sdu_buf: [len=1000, p_data3]}"]; - * APP abox APP [label="App can process data and release memory pointed by p_data3"]; - * |||; - * @endmsc - * @} - * @} - */ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble.h deleted file mode 100644 index 470577b8a..000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble.h +++ /dev/null @@ -1,620 +0,0 @@ -/* - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup BLE_COMMON BLE SoftDevice Common - @{ - @defgroup ble_api Events, type definitions and API calls - @{ - - @brief Module independent events, type definitions and API calls for the BLE SoftDevice. - - */ - -#ifndef BLE_H__ -#define BLE_H__ - -#include "ble_ranges.h" -#include "ble_types.h" -#include "ble_gap.h" -#include "ble_l2cap.h" -#include "ble_gatt.h" -#include "ble_gattc.h" -#include "ble_gatts.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup BLE_COMMON_ENUMERATIONS Enumerations - * @{ */ - -/** - * @brief Common API SVC numbers. - */ -enum BLE_COMMON_SVCS -{ - SD_BLE_ENABLE = BLE_SVC_BASE, /**< Enable and initialize the BLE stack */ - SD_BLE_EVT_GET, /**< Get an event from the pending events queue. */ - SD_BLE_UUID_VS_ADD, /**< Add a Vendor Specific UUID. */ - SD_BLE_UUID_DECODE, /**< Decode UUID bytes. */ - SD_BLE_UUID_ENCODE, /**< Encode UUID bytes. */ - SD_BLE_VERSION_GET, /**< Get the local version information (company ID, Link Layer Version, Link Layer Subversion). */ - SD_BLE_USER_MEM_REPLY, /**< User Memory Reply. */ - SD_BLE_OPT_SET, /**< Set a BLE option. */ - SD_BLE_OPT_GET, /**< Get a BLE option. */ - SD_BLE_CFG_SET, /**< Add a configuration to the BLE stack. */ -}; - -/** - * @brief BLE Module Independent Event IDs. - */ -enum BLE_COMMON_EVTS -{ - BLE_EVT_USER_MEM_REQUEST = BLE_EVT_BASE, /**< User Memory request. @ref ble_evt_user_mem_request_t */ - BLE_EVT_USER_MEM_RELEASE, /**< User Memory release. @ref ble_evt_user_mem_release_t */ -}; - -/**@brief BLE Connection Configuration IDs. - * - * IDs that uniquely identify a connection configuration. - */ -enum BLE_CONN_CFGS -{ - BLE_CONN_CFG_GAP = BLE_CONN_CFG_BASE, /**< BLE GAP specific connection configuration. */ - BLE_CONN_CFG_GATTC, /**< BLE GATTC specific connection configuration. */ - BLE_CONN_CFG_GATTS, /**< BLE GATTS specific connection configuration. */ - BLE_CONN_CFG_GATT, /**< BLE GATT specific connection configuration. */ - BLE_CONN_CFG_L2CAP, /**< BLE L2CAP specific connection configuration. */ -}; - -/**@brief BLE Common Configuration IDs. - * - * IDs that uniquely identify a common configuration. - */ -enum BLE_COMMON_CFGS -{ - BLE_COMMON_CFG_VS_UUID = BLE_CFG_BASE, /**< Vendor specific UUID configuration */ -}; - -/**@brief Common Option IDs. - * IDs that uniquely identify a common option. - */ -enum BLE_COMMON_OPTS -{ - BLE_COMMON_OPT_PA_LNA = BLE_OPT_BASE, /**< PA and LNA options */ - BLE_COMMON_OPT_CONN_EVT_EXT, /**< Extended connection events option */ -}; - -/** @} */ - -/** @addtogroup BLE_COMMON_DEFINES Defines - * @{ */ - -/** @brief Required pointer alignment for BLE Events. -*/ -#define BLE_EVT_PTR_ALIGNMENT 4 - -/** @brief Leaves the maximum of the two arguments. -*/ -#define BLE_MAX(a, b) ((a) < (b) ? (b) : (a)) - -/** @brief Maximum possible length for BLE Events. - * @note The highest value used for @ref ble_gatt_conn_cfg_t::att_mtu in any connection configuration shall be used as a parameter. - * If that value has not been configured for any connections then @ref BLE_GATT_ATT_MTU_DEFAULT must be used instead. -*/ -#define BLE_EVT_LEN_MAX(ATT_MTU) (BLE_MAX( \ - sizeof(ble_evt_t), \ - BLE_MAX( \ - offsetof(ble_evt_t, evt.gattc_evt.params.rel_disc_rsp.includes) + ((ATT_MTU) - 2) / 6 * sizeof(ble_gattc_include_t), \ - offsetof(ble_evt_t, evt.gattc_evt.params.attr_info_disc_rsp.info.attr_info16) + ((ATT_MTU) - 2) / 4 * sizeof(ble_gattc_attr_info16_t) \ - ) \ -)) - -/** @defgroup BLE_USER_MEM_TYPES User Memory Types - * @{ */ -#define BLE_USER_MEM_TYPE_INVALID 0x00 /**< Invalid User Memory Types. */ -#define BLE_USER_MEM_TYPE_GATTS_QUEUED_WRITES 0x01 /**< User Memory for GATTS queued writes. */ -/** @} */ - -/** @defgroup BLE_UUID_VS_COUNTS Vendor Specific UUID counts - * @{ - */ -#define BLE_UUID_VS_COUNT_DEFAULT 10 /**< Default VS UUID count. */ -#define BLE_UUID_VS_COUNT_MAX 254 /**< Maximum VS UUID count. */ -/** @} */ - -/** @defgroup BLE_COMMON_CFG_DEFAULTS Configuration defaults. - * @{ - */ -#define BLE_CONN_CFG_TAG_DEFAULT 0 /**< Default configuration tag, SoftDevice default connection configuration. */ - -/** @} */ - -/** @} */ - -/** @addtogroup BLE_COMMON_STRUCTURES Structures - * @{ */ - -/**@brief User Memory Block. */ -typedef struct -{ - uint8_t *p_mem; /**< Pointer to the start of the user memory block. */ - uint16_t len; /**< Length in bytes of the user memory block. */ -} ble_user_mem_block_t; - -/**@brief Event structure for @ref BLE_EVT_USER_MEM_REQUEST. */ -typedef struct -{ - uint8_t type; /**< User memory type, see @ref BLE_USER_MEM_TYPES. */ -} ble_evt_user_mem_request_t; - -/**@brief Event structure for @ref BLE_EVT_USER_MEM_RELEASE. */ -typedef struct -{ - uint8_t type; /**< User memory type, see @ref BLE_USER_MEM_TYPES. */ - ble_user_mem_block_t mem_block; /**< User memory block */ -} ble_evt_user_mem_release_t; - -/**@brief Event structure for events not associated with a specific function module. */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle on which this event occurred. */ - union - { - ble_evt_user_mem_request_t user_mem_request; /**< User Memory Request Event Parameters. */ - ble_evt_user_mem_release_t user_mem_release; /**< User Memory Release Event Parameters. */ - } params; /**< Event parameter union. */ -} ble_common_evt_t; - -/**@brief BLE Event header. */ -typedef struct -{ - uint16_t evt_id; /**< Value from a BLE_<module>_EVT series. */ - uint16_t evt_len; /**< Length in octets including this header. */ -} ble_evt_hdr_t; - -/**@brief Common BLE Event type, wrapping the module specific event reports. */ -typedef struct -{ - ble_evt_hdr_t header; /**< Event header. */ - union - { - ble_common_evt_t common_evt; /**< Common Event, evt_id in BLE_EVT_* series. */ - ble_gap_evt_t gap_evt; /**< GAP originated event, evt_id in BLE_GAP_EVT_* series. */ - ble_gattc_evt_t gattc_evt; /**< GATT client originated event, evt_id in BLE_GATTC_EVT* series. */ - ble_gatts_evt_t gatts_evt; /**< GATT server originated event, evt_id in BLE_GATTS_EVT* series. */ - ble_l2cap_evt_t l2cap_evt; /**< L2CAP originated event, evt_id in BLE_L2CAP_EVT* series. */ - } evt; /**< Event union. */ -} ble_evt_t; - - -/** - * @brief Version Information. - */ -typedef struct -{ - uint8_t version_number; /**< Link Layer Version number. See https://www.bluetooth.org/en-us/specification/assigned-numbers/link-layer for assigned values. */ - uint16_t company_id; /**< Company ID, Nordic Semiconductor's company ID is 89 (0x0059) (https://www.bluetooth.org/apps/content/Default.aspx?doc_id=49708). */ - uint16_t subversion_number; /**< Link Layer Sub Version number, corresponds to the SoftDevice Config ID or Firmware ID (FWID). */ -} ble_version_t; - -/** - * @brief Configuration parameters for the PA and LNA. - */ -typedef struct -{ - uint8_t enable :1; /**< Enable toggling for this amplifier */ - uint8_t active_high :1; /**< Set the pin to be active high */ - uint8_t gpio_pin :6; /**< The GPIO pin to toggle for this amplifier */ -} ble_pa_lna_cfg_t; - -/** - * @brief PA & LNA GPIO toggle configuration - * - * This option configures the SoftDevice to toggle pins when the radio is active for use with a power amplifier and/or - * a low noise amplifier. - * - * Toggling the pins is achieved by using two PPI channels and a GPIOTE channel. The hardware channel IDs are provided - * by the application and should be regarded as reserved as long as any PA/LNA toggling is enabled. - * - * @note @ref sd_ble_opt_get is not supported for this option. - * @note Setting this option while the radio is in use (i.e. any of the roles are active) may have undefined consequences - * and must be avoided by the application. - */ -typedef struct -{ - ble_pa_lna_cfg_t pa_cfg; /**< Power Amplifier configuration */ - ble_pa_lna_cfg_t lna_cfg; /**< Low Noise Amplifier configuration */ - - uint8_t ppi_ch_id_set; /**< PPI channel used for radio pin setting */ - uint8_t ppi_ch_id_clr; /**< PPI channel used for radio pin clearing */ - uint8_t gpiote_ch_id; /**< GPIOTE channel used for radio pin toggling */ -} ble_common_opt_pa_lna_t; - -/** - * @brief Configuration of extended BLE connection events. - * - * When enabled the SoftDevice will dynamically extend the connection event when possible. - * - * The connection event length is controlled by the connection configuration as set by @ref ble_gap_conn_cfg_t::event_length. - * The connection event can be extended if there is time to send another packet pair before the start of the next connection interval, - * and if there are no conflicts with other BLE roles requesting radio time. - * - * @note @ref sd_ble_opt_get is not supported for this option. - */ -typedef struct -{ - uint8_t enable : 1; /**< Enable extended BLE connection events, disabled by default. */ -} ble_common_opt_conn_evt_ext_t; - -/**@brief Option structure for common options. */ -typedef union -{ - ble_common_opt_pa_lna_t pa_lna; /**< Parameters for controlling PA and LNA pin toggling. */ - ble_common_opt_conn_evt_ext_t conn_evt_ext; /**< Parameters for enabling extended connection events. */ -} ble_common_opt_t; - -/**@brief Common BLE Option type, wrapping the module specific options. */ -typedef union -{ - ble_common_opt_t common_opt; /**< COMMON options, opt_id in @ref BLE_COMMON_OPTS series. */ - ble_gap_opt_t gap_opt; /**< GAP option, opt_id in @ref BLE_GAP_OPTS series. */ -} ble_opt_t; - -/**@brief BLE connection configuration type, wrapping the module specific configurations, set with - * @ref sd_ble_cfg_set. - * - * @note Connection configurations don't have to be set. - * In the case that no configurations has been set, or fewer connection configurations has been set than enabled connections, - * the default connection configuration will be automatically added for the remaining connections. - * When creating connections with the default configuration, @ref BLE_CONN_CFG_TAG_DEFAULT should be used in - * place of @ref ble_conn_cfg_t::conn_cfg_tag. See @ref sd_ble_gap_adv_start() and @ref sd_ble_gap_connect()" - * - * @mscs - * @mmsc{@ref BLE_CONN_CFG} - * @endmscs - - */ -typedef struct -{ - uint8_t conn_cfg_tag; /**< The application chosen tag it can use with the @ref sd_ble_gap_adv_start() and @ref sd_ble_gap_connect() - calls to select this configuration when creating a connection. - Must be different for all connection configurations added and not @ref BLE_CONN_CFG_TAG_DEFAULT. */ - union { - ble_gap_conn_cfg_t gap_conn_cfg; /**< GAP connection configuration, cfg_id is @ref BLE_CONN_CFG_GAP. */ - ble_gattc_conn_cfg_t gattc_conn_cfg; /**< GATTC connection configuration, cfg_id is @ref BLE_CONN_CFG_GATTC. */ - ble_gatts_conn_cfg_t gatts_conn_cfg; /**< GATTS connection configuration, cfg_id is @ref BLE_CONN_CFG_GATTS. */ - ble_gatt_conn_cfg_t gatt_conn_cfg; /**< GATT connection configuration, cfg_id is @ref BLE_CONN_CFG_GATT. */ - ble_l2cap_conn_cfg_t l2cap_conn_cfg; /**< L2CAP connection configuration, cfg_id is @ref BLE_CONN_CFG_L2CAP. */ - } params; /**< Connection configuration union. */ -} ble_conn_cfg_t; - -/** - * @brief Configuration of Vendor Specific UUIDs, set with @ref sd_ble_cfg_set. - * - * @retval ::NRF_ERROR_INVALID_PARAM Too many UUIDs configured. - */ -typedef struct -{ - uint8_t vs_uuid_count; /**< Number of 128-bit Vendor Specific UUID bases to allocate memory for. - Default value is @ref BLE_UUID_VS_COUNT_DEFAULT. Maximum value is - @ref BLE_UUID_VS_COUNT_MAX. */ -} ble_common_cfg_vs_uuid_t; - -/**@brief Common BLE Configuration type, wrapping the common configurations. */ -typedef union -{ - ble_common_cfg_vs_uuid_t vs_uuid_cfg; /**< Vendor specific UUID configuration, cfg_id is @ref BLE_COMMON_CFG_VS_UUID. */ -} ble_common_cfg_t; - -/**@brief BLE Configuration type, wrapping the module specific configurations. */ -typedef union -{ - ble_conn_cfg_t conn_cfg; /**< Connection specific configurations, cfg_id in @ref BLE_CONN_CFGS series. */ - ble_common_cfg_t common_cfg; /**< Global common configurations, cfg_id in @ref BLE_COMMON_CFGS series. */ - ble_gap_cfg_t gap_cfg; /**< Global GAP configurations, cfg_id in @ref BLE_GAP_CFGS series. */ - ble_gatts_cfg_t gatts_cfg; /**< Global GATTS configuration, cfg_id in @ref BLE_GATTS_CFGS series. */ -} ble_cfg_t; - -/** @} */ - -/** @addtogroup BLE_COMMON_FUNCTIONS Functions - * @{ */ - -/**@brief Enable the BLE stack - * - * @param[in, out] p_app_ram_base Pointer to a variable containing the start address of the - * application RAM region (APP_RAM_BASE). On return, this will - * contain the minimum start address of the application RAM region - * required by the SoftDevice for this configuration. - * - * @note The memory requirement for a specific configuration will not increase between SoftDevices - * with the same major version number. - * - * @note The value of *p_app_ram_base when the app has done no custom configuration of the - * SoftDevice, i.e. the app has not called @ref sd_ble_cfg_set before @ref sd_ble_enable, can - * be found in the release notes. - * - * @note At runtime the IC's RAM is split into 2 regions: The SoftDevice RAM region is located - * between 0x20000000 and APP_RAM_BASE-1 and the application's RAM region is located between - * APP_RAM_BASE and the start of the call stack. - * - * @details This call initializes the BLE stack, no BLE related function other than @ref - * sd_ble_cfg_set can be called before this one. - * - * @mscs - * @mmsc{@ref BLE_COMMON_ENABLE} - * @endmscs - * - * @retval ::NRF_SUCCESS The BLE stack has been initialized successfully. - * @retval ::NRF_ERROR_INVALID_STATE The BLE stack had already been initialized and cannot be reinitialized. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid or not sufficiently aligned pointer supplied. - * @retval ::NRF_ERROR_NO_MEM The amount of memory assigned to the SoftDevice by *p_app_ram_base is not - * large enough to fit this configuration's memory requirement. Check *p_app_ram_base - * and set the start address of the application RAM region accordingly. - */ -SVCALL(SD_BLE_ENABLE, uint32_t, sd_ble_enable(uint32_t * p_app_ram_base)); - -/**@brief Add configurations for the BLE stack - * - * @param[in] cfg_id Config ID, see @ref BLE_CONN_CFGS, @ref BLE_COMMON_CFGS, @ref - * BLE_GAP_CFGS or @ref BLE_GATTS_CFGS. - * @param[in] p_cfg Pointer to a ble_cfg_t structure containing the configuration value. - * @param[in] app_ram_base The start address of the application RAM region (APP_RAM_BASE). - * See @ref sd_ble_enable for details about APP_RAM_BASE. - * - * @note The memory requirement for a specific configuration will not increase between SoftDevices - * with the same major version number. - * - * @note If a configuration is set more than once, the last one set is the one that takes effect on - * @ref sd_ble_enable. - * - * @note Any part of the BLE stack that is NOT configured with @ref sd_ble_cfg_set will have default - * configuration. - * - * @note @ref sd_ble_cfg_set may be called at any time when the SoftDevice is enabled (see @ref - * sd_softdevice_enable) while the BLE part of the SoftDevice is not enabled (see @ref - * sd_ble_enable). - * - * @note Error codes for the configurations are described in the configuration structs. - * - * @mscs - * @mmsc{@ref BLE_COMMON_ENABLE} - * @endmscs - * - * @retval ::NRF_SUCCESS The configuration has been added successfully. - * @retval ::NRF_ERROR_INVALID_STATE The BLE stack had already been initialized. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid or not sufficiently aligned pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid cfg_id supplied. - * @retval ::NRF_ERROR_NO_MEM The amount of memory assigned to the SoftDevice by app_ram_base is not - * large enough to fit this configuration's memory requirement. - */ -SVCALL(SD_BLE_CFG_SET, uint32_t, sd_ble_cfg_set(uint32_t cfg_id, ble_cfg_t const * p_cfg, uint32_t app_ram_base)); - -/**@brief Get an event from the pending events queue. - * - * @param[out] p_dest Pointer to buffer to be filled in with an event, or NULL to retrieve the event length. - * This buffer <b>must be aligned to the extend defined by @ref BLE_EVT_PTR_ALIGNMENT</b>. - * The buffer should be interpreted as a @ref ble_evt_t struct. - * @param[in, out] p_len Pointer the length of the buffer, on return it is filled with the event length. - * - * @details This call allows the application to pull a BLE event from the BLE stack. The application is signaled that - * an event is available from the BLE stack by the triggering of the SD_EVT_IRQn interrupt. - * The application is free to choose whether to call this function from thread mode (main context) or directly from the - * Interrupt Service Routine that maps to SD_EVT_IRQn. In any case however, and because the BLE stack runs at a higher - * priority than the application, this function should be called in a loop (until @ref NRF_ERROR_NOT_FOUND is returned) - * every time SD_EVT_IRQn is raised to ensure that all available events are pulled from the BLE stack. Failure to do so - * could potentially leave events in the internal queue without the application being aware of this fact. - * - * Sizing the p_dest buffer is equally important, since the application needs to provide all the memory necessary for the event to - * be copied into application memory. If the buffer provided is not large enough to fit the entire contents of the event, - * @ref NRF_ERROR_DATA_SIZE will be returned and the application can then call again with a larger buffer size. - * The maximum possible event length is defined by @ref BLE_EVT_LEN_MAX. The application may also "peek" the event length - * by providing p_dest as a NULL pointer and inspecting the value of *p_len upon return: - * - * \code - * uint16_t len; - * errcode = sd_ble_evt_get(NULL, &len); - * \endcode - * - * @mscs - * @mmsc{@ref BLE_COMMON_IRQ_EVT_MSC} - * @mmsc{@ref BLE_COMMON_THREAD_EVT_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS Event pulled and stored into the supplied buffer. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid or not sufficiently aligned pointer supplied. - * @retval ::NRF_ERROR_NOT_FOUND No events ready to be pulled. - * @retval ::NRF_ERROR_DATA_SIZE Event ready but could not fit into the supplied buffer. - */ -SVCALL(SD_BLE_EVT_GET, uint32_t, sd_ble_evt_get(uint8_t *p_dest, uint16_t *p_len)); - - -/**@brief Add a Vendor Specific base UUID. - * - * @details This call enables the application to add a vendor specific base UUID to the BLE stack's table, for later - * use with all other modules and APIs. This then allows the application to use the shorter, 24-bit @ref ble_uuid_t - * format when dealing with both 16-bit and 128-bit UUIDs without having to check for lengths and having split code - * paths. This is accomplished by extending the grouping mechanism that the Bluetooth SIG standard base UUID uses - * for all other 128-bit UUIDs. The type field in the @ref ble_uuid_t structure is an index (relative to - * @ref BLE_UUID_TYPE_VENDOR_BEGIN) to the table populated by multiple calls to this function, and the UUID field - * in the same structure contains the 2 bytes at indexes 12 and 13. The number of possible 128-bit UUIDs available to - * the application is therefore the number of Vendor Specific UUIDs added with the help of this function times 65536, - * although restricted to modifying bytes 12 and 13 for each of the entries in the supplied array. - * - * @note Bytes 12 and 13 of the provided UUID will not be used internally, since those are always replaced by - * the 16-bit uuid field in @ref ble_uuid_t. - * - * @note If a UUID is already present in the BLE stack's internal table, the corresponding index will be returned in - * p_uuid_type along with an NRF_SUCCESS error code. - * - * @param[in] p_vs_uuid Pointer to a 16-octet (128-bit) little endian Vendor Specific UUID disregarding - * bytes 12 and 13. - * @param[out] p_uuid_type Pointer to a uint8_t where the type field in @ref ble_uuid_t corresponding to this UUID will be stored. - * - * @retval ::NRF_SUCCESS Successfully added the Vendor Specific UUID. - * @retval ::NRF_ERROR_INVALID_ADDR If p_vs_uuid or p_uuid_type is NULL or invalid. - * @retval ::NRF_ERROR_NO_MEM If there are no more free slots for VS UUIDs. - */ -SVCALL(SD_BLE_UUID_VS_ADD, uint32_t, sd_ble_uuid_vs_add(ble_uuid128_t const *p_vs_uuid, uint8_t *p_uuid_type)); - - -/** @brief Decode little endian raw UUID bytes (16-bit or 128-bit) into a 24 bit @ref ble_uuid_t structure. - * - * @details The raw UUID bytes excluding bytes 12 and 13 (i.e. bytes 0-11 and 14-15) of p_uuid_le are compared - * to the corresponding ones in each entry of the table of vendor specific UUIDs populated with @ref sd_ble_uuid_vs_add - * to look for a match. If there is such a match, bytes 12 and 13 are returned as p_uuid->uuid and the index - * relative to @ref BLE_UUID_TYPE_VENDOR_BEGIN as p_uuid->type. - * - * @note If the UUID length supplied is 2, then the type set by this call will always be @ref BLE_UUID_TYPE_BLE. - * - * @param[in] uuid_le_len Length in bytes of the buffer pointed to by p_uuid_le (must be 2 or 16 bytes). - * @param[in] p_uuid_le Pointer pointing to little endian raw UUID bytes. - * @param[out] p_uuid Pointer to a @ref ble_uuid_t structure to be filled in. - * - * @retval ::NRF_SUCCESS Successfully decoded into the @ref ble_uuid_t structure. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_LENGTH Invalid UUID length. - * @retval ::NRF_ERROR_NOT_FOUND For a 128-bit UUID, no match in the populated table of UUIDs. - */ -SVCALL(SD_BLE_UUID_DECODE, uint32_t, sd_ble_uuid_decode(uint8_t uuid_le_len, uint8_t const *p_uuid_le, ble_uuid_t *p_uuid)); - - -/** @brief Encode a @ref ble_uuid_t structure into little endian raw UUID bytes (16-bit or 128-bit). - * - * @note The pointer to the destination buffer p_uuid_le may be NULL, in which case only the validity and size of p_uuid is computed. - * - * @param[in] p_uuid Pointer to a @ref ble_uuid_t structure that will be encoded into bytes. - * @param[out] p_uuid_le_len Pointer to a uint8_t that will be filled with the encoded length (2 or 16 bytes). - * @param[out] p_uuid_le Pointer to a buffer where the little endian raw UUID bytes (2 or 16) will be stored. - * - * @retval ::NRF_SUCCESS Successfully encoded into the buffer. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid UUID type. - */ -SVCALL(SD_BLE_UUID_ENCODE, uint32_t, sd_ble_uuid_encode(ble_uuid_t const *p_uuid, uint8_t *p_uuid_le_len, uint8_t *p_uuid_le)); - - -/**@brief Get Version Information. - * - * @details This call allows the application to get the BLE stack version information. - * - * @param[out] p_version Pointer to a ble_version_t structure to be filled in. - * - * @retval ::NRF_SUCCESS Version information stored successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY The BLE stack is busy (typically doing a locally-initiated disconnection procedure). - */ -SVCALL(SD_BLE_VERSION_GET, uint32_t, sd_ble_version_get(ble_version_t *p_version)); - - -/**@brief Provide a user memory block. - * - * @note This call can only be used as a response to a @ref BLE_EVT_USER_MEM_REQUEST event issued to the application. - * - * @param[in] conn_handle Connection handle. - * @param[in] p_block Pointer to a user memory block structure or NULL if memory is managed by the application. - * - * @mscs - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_PEER_CANCEL_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_NOAUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS Successfully queued a response to the peer. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_LENGTH Invalid user memory block length supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection state or no user memory request pending. - */ -SVCALL(SD_BLE_USER_MEM_REPLY, uint32_t, sd_ble_user_mem_reply(uint16_t conn_handle, ble_user_mem_block_t const *p_block)); - -/**@brief Set a BLE option. - * - * @details This call allows the application to set the value of an option. - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_BONDING_STATIC_PK_MSC} - * @endmscs - * - * @param[in] opt_id Option ID, see @ref BLE_COMMON_OPTS and @ref BLE_GAP_OPTS. - * @param[in] p_opt Pointer to a ble_opt_t structure containing the option value. - * - * @retval ::NRF_SUCCESS Option set successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check parameter limits and constraints. - * @retval ::NRF_ERROR_INVALID_STATE Unable to set the parameter at this time. - * @retval ::NRF_ERROR_BUSY The BLE stack is busy or the previous procedure has not completed. - */ -SVCALL(SD_BLE_OPT_SET, uint32_t, sd_ble_opt_set(uint32_t opt_id, ble_opt_t const *p_opt)); - - -/**@brief Get a BLE option. - * - * @details This call allows the application to retrieve the value of an option. - * - * @param[in] opt_id Option ID, see @ref BLE_COMMON_OPTS and @ref BLE_GAP_OPTS. - * @param[out] p_opt Pointer to a ble_opt_t structure to be filled in. - * - * @retval ::NRF_SUCCESS Option retrieved successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check parameter limits and constraints. - * @retval ::NRF_ERROR_INVALID_STATE Unable to retrieve the parameter at this time. - * @retval ::NRF_ERROR_BUSY The BLE stack is busy or the previous procedure has not completed. - * @retval ::NRF_ERROR_NOT_SUPPORTED This option is not supported. - * - */ -SVCALL(SD_BLE_OPT_GET, uint32_t, sd_ble_opt_get(uint32_t opt_id, ble_opt_t *p_opt)); - -/** @} */ -#ifdef __cplusplus -} -#endif -#endif /* BLE_H__ */ - -/** - @} - @} -*/ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_err.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_err.h deleted file mode 100644 index 1b0b9d443..000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_err.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup BLE_COMMON - @{ - @addtogroup nrf_error - @{ - @ingroup BLE_COMMON - @} - - @defgroup ble_err General error codes - @{ - - @brief General error code definitions for the BLE API. - - @ingroup BLE_COMMON -*/ -#ifndef NRF_BLE_ERR_H__ -#define NRF_BLE_ERR_H__ - -#include "nrf_error.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* @defgroup BLE_ERRORS Error Codes - * @{ */ -#define BLE_ERROR_NOT_ENABLED (NRF_ERROR_STK_BASE_NUM+0x001) /**< @ref sd_ble_enable has not been called. */ -#define BLE_ERROR_INVALID_CONN_HANDLE (NRF_ERROR_STK_BASE_NUM+0x002) /**< Invalid connection handle. */ -#define BLE_ERROR_INVALID_ATTR_HANDLE (NRF_ERROR_STK_BASE_NUM+0x003) /**< Invalid attribute handle. */ -#define BLE_ERROR_INVALID_ROLE (NRF_ERROR_STK_BASE_NUM+0x004) /**< Invalid role. */ -/** @} */ - - -/** @defgroup BLE_ERROR_SUBRANGES Module specific error code subranges - * @brief Assignment of subranges for module specific error codes. - * @note For specific error codes, see ble_<module>.h or ble_error_<module>.h. - * @{ */ -#define NRF_L2CAP_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x100) /**< L2CAP specific errors. */ -#define NRF_GAP_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x200) /**< GAP specific errors. */ -#define NRF_GATTC_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x300) /**< GATT client specific errors. */ -#define NRF_GATTS_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x400) /**< GATT server specific errors. */ -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif - - -/** - @} - @} -*/ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_gap.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_gap.h deleted file mode 100644 index 13f7721c5..000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_gap.h +++ /dev/null @@ -1,2170 +0,0 @@ -/* - * Copyright (c) 2011 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup BLE_GAP Generic Access Profile (GAP) - @{ - @brief Definitions and prototypes for the GAP interface. - */ - -#ifndef BLE_GAP_H__ -#define BLE_GAP_H__ - - -#include "ble_types.h" -#include "ble_ranges.h" -#include "nrf_svc.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/**@addtogroup BLE_GAP_ENUMERATIONS Enumerations - * @{ */ - -/**@brief GAP API SVC numbers. - */ -enum BLE_GAP_SVCS -{ - SD_BLE_GAP_ADDR_SET = BLE_GAP_SVC_BASE, /**< Set own Bluetooth Address. */ - SD_BLE_GAP_ADDR_GET, /**< Get own Bluetooth Address. */ - SD_BLE_GAP_WHITELIST_SET, /**< Set active whitelist. */ - SD_BLE_GAP_DEVICE_IDENTITIES_SET, /**< Set device identity list. */ - SD_BLE_GAP_PRIVACY_SET, /**< Set Privacy settings*/ - SD_BLE_GAP_PRIVACY_GET, /**< Get Privacy settings*/ - SD_BLE_GAP_ADV_DATA_SET, /**< Set Advertising Data. */ - SD_BLE_GAP_ADV_START, /**< Start Advertising. */ - SD_BLE_GAP_ADV_STOP, /**< Stop Advertising. */ - SD_BLE_GAP_CONN_PARAM_UPDATE, /**< Connection Parameter Update. */ - SD_BLE_GAP_DISCONNECT, /**< Disconnect. */ - SD_BLE_GAP_TX_POWER_SET, /**< Set TX Power. */ - SD_BLE_GAP_APPEARANCE_SET, /**< Set Appearance. */ - SD_BLE_GAP_APPEARANCE_GET, /**< Get Appearance. */ - SD_BLE_GAP_PPCP_SET, /**< Set PPCP. */ - SD_BLE_GAP_PPCP_GET, /**< Get PPCP. */ - SD_BLE_GAP_DEVICE_NAME_SET, /**< Set Device Name. */ - SD_BLE_GAP_DEVICE_NAME_GET, /**< Get Device Name. */ - SD_BLE_GAP_AUTHENTICATE, /**< Initiate Pairing/Bonding. */ - SD_BLE_GAP_SEC_PARAMS_REPLY, /**< Reply with Security Parameters. */ - SD_BLE_GAP_AUTH_KEY_REPLY, /**< Reply with an authentication key. */ - SD_BLE_GAP_LESC_DHKEY_REPLY, /**< Reply with an LE Secure Connections DHKey. */ - SD_BLE_GAP_KEYPRESS_NOTIFY, /**< Notify of a keypress during an authentication procedure. */ - SD_BLE_GAP_LESC_OOB_DATA_GET, /**< Get the local LE Secure Connections OOB data. */ - SD_BLE_GAP_LESC_OOB_DATA_SET, /**< Set the remote LE Secure Connections OOB data. */ - SD_BLE_GAP_ENCRYPT, /**< Initiate encryption procedure. */ - SD_BLE_GAP_SEC_INFO_REPLY, /**< Reply with Security Information. */ - SD_BLE_GAP_CONN_SEC_GET, /**< Obtain connection security level. */ - SD_BLE_GAP_RSSI_START, /**< Start reporting of changes in RSSI. */ - SD_BLE_GAP_RSSI_STOP, /**< Stop reporting of changes in RSSI. */ - SD_BLE_GAP_SCAN_START, /**< Start Scanning. */ - SD_BLE_GAP_SCAN_STOP, /**< Stop Scanning. */ - SD_BLE_GAP_CONNECT, /**< Connect. */ - SD_BLE_GAP_CONNECT_CANCEL, /**< Cancel ongoing connection procedure. */ - SD_BLE_GAP_RSSI_GET, /**< Get the last RSSI sample. */ - SD_BLE_GAP_PHY_UPDATE, /**< Initiate or respond to a PHY Update Procedure. */ - SD_BLE_GAP_DATA_LENGTH_UPDATE, /**< Initiate or respond to a Data Length Update Procedure. */ -}; - -/**@brief GAP Event IDs. - * IDs that uniquely identify an event coming from the stack to the application. - */ -enum BLE_GAP_EVTS -{ - BLE_GAP_EVT_CONNECTED = BLE_GAP_EVT_BASE, /**< Connection established. \n See @ref ble_gap_evt_connected_t. */ - BLE_GAP_EVT_DISCONNECTED, /**< Disconnected from peer. \n See @ref ble_gap_evt_disconnected_t. */ - BLE_GAP_EVT_CONN_PARAM_UPDATE, /**< Connection Parameters updated. \n See @ref ble_gap_evt_conn_param_update_t. */ - BLE_GAP_EVT_SEC_PARAMS_REQUEST, /**< Request to provide security parameters. \n Reply with @ref sd_ble_gap_sec_params_reply. \n See @ref ble_gap_evt_sec_params_request_t. */ - BLE_GAP_EVT_SEC_INFO_REQUEST, /**< Request to provide security information. \n Reply with @ref sd_ble_gap_sec_info_reply. \n See @ref ble_gap_evt_sec_info_request_t. */ - BLE_GAP_EVT_PASSKEY_DISPLAY, /**< Request to display a passkey to the user. \n In LESC Numeric Comparison, reply with @ref sd_ble_gap_auth_key_reply. \n See @ref ble_gap_evt_passkey_display_t. */ - BLE_GAP_EVT_KEY_PRESSED, /**< Notification of a keypress on the remote device.\n See @ref ble_gap_evt_key_pressed_t */ - BLE_GAP_EVT_AUTH_KEY_REQUEST, /**< Request to provide an authentication key. \n Reply with @ref sd_ble_gap_auth_key_reply. \n See @ref ble_gap_evt_auth_key_request_t. */ - BLE_GAP_EVT_LESC_DHKEY_REQUEST, /**< Request to calculate an LE Secure Connections DHKey. \n Reply with @ref sd_ble_gap_lesc_dhkey_reply. \n See @ref ble_gap_evt_lesc_dhkey_request_t */ - BLE_GAP_EVT_AUTH_STATUS, /**< Authentication procedure completed with status. \n See @ref ble_gap_evt_auth_status_t. */ - BLE_GAP_EVT_CONN_SEC_UPDATE, /**< Connection security updated. \n See @ref ble_gap_evt_conn_sec_update_t. */ - BLE_GAP_EVT_TIMEOUT, /**< Timeout expired. \n See @ref ble_gap_evt_timeout_t. */ - BLE_GAP_EVT_RSSI_CHANGED, /**< RSSI report. \n See @ref ble_gap_evt_rssi_changed_t. */ - BLE_GAP_EVT_ADV_REPORT, /**< Advertising report. \n See @ref ble_gap_evt_adv_report_t. */ - BLE_GAP_EVT_SEC_REQUEST, /**< Security Request. \n See @ref ble_gap_evt_sec_request_t. */ - BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST, /**< Connection Parameter Update Request. \n Reply with @ref sd_ble_gap_conn_param_update. \n See @ref ble_gap_evt_conn_param_update_request_t. */ - BLE_GAP_EVT_SCAN_REQ_REPORT, /**< Scan request report. \n See @ref ble_gap_evt_scan_req_report_t. */ - BLE_GAP_EVT_PHY_UPDATE_REQUEST, /**< PHY Update Request. \n Reply with @ref sd_ble_gap_phy_update. \n See @ref ble_gap_evt_phy_update_request_t. */ - BLE_GAP_EVT_PHY_UPDATE, /**< PHY Update Procedure is complete. \n See @ref ble_gap_evt_phy_update_t. */ - BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST, /**< Data Length Update Request. \n Reply with @ref sd_ble_gap_data_length_update.\n See @ref ble_gap_evt_data_length_update_request_t. */ - BLE_GAP_EVT_DATA_LENGTH_UPDATE, /**< LL Data Channel PDU payload length updated. \n See @ref ble_gap_evt_data_length_update_t. */ -}; - -/**@brief GAP Option IDs. - * IDs that uniquely identify a GAP option. - */ -enum BLE_GAP_OPTS -{ - BLE_GAP_OPT_CH_MAP = BLE_GAP_OPT_BASE, /**< Channel Map. @ref ble_gap_opt_ch_map_t */ - BLE_GAP_OPT_LOCAL_CONN_LATENCY, /**< Local connection latency. @ref ble_gap_opt_local_conn_latency_t */ - BLE_GAP_OPT_PASSKEY, /**< Set passkey. @ref ble_gap_opt_passkey_t */ - BLE_GAP_OPT_SCAN_REQ_REPORT, /**< Scan request report. @ref ble_gap_opt_scan_req_report_t */ - BLE_GAP_OPT_COMPAT_MODE_1, /**< Compatibility mode. @ref ble_gap_opt_compat_mode_1_t */ - BLE_GAP_OPT_AUTH_PAYLOAD_TIMEOUT, /**< Set Authenticated payload timeout. @ref ble_gap_opt_auth_payload_timeout_t */ - BLE_GAP_OPT_SLAVE_LATENCY_DISABLE, /**< Disable slave latency. @ref ble_gap_opt_slave_latency_disable_t */ -}; - -/**@brief GAP Configuration IDs. - * - * IDs that uniquely identify a GAP configuration. - */ -enum BLE_GAP_CFGS -{ - BLE_GAP_CFG_ROLE_COUNT = BLE_GAP_CFG_BASE, /**< Role count configuration. */ - BLE_GAP_CFG_DEVICE_NAME, /**< Device name configuration. */ -}; - -/** @} */ - -/**@addtogroup BLE_GAP_DEFINES Defines - * @{ */ - -/**@defgroup BLE_ERRORS_GAP SVC return values specific to GAP - * @{ */ -#define BLE_ERROR_GAP_UUID_LIST_MISMATCH (NRF_GAP_ERR_BASE + 0x000) /**< UUID list does not contain an integral number of UUIDs. */ -#define BLE_ERROR_GAP_DISCOVERABLE_WITH_WHITELIST (NRF_GAP_ERR_BASE + 0x001) /**< Use of Whitelist not permitted with discoverable advertising. */ -#define BLE_ERROR_GAP_INVALID_BLE_ADDR (NRF_GAP_ERR_BASE + 0x002) /**< The upper two bits of the address do not correspond to the specified address type. */ -#define BLE_ERROR_GAP_WHITELIST_IN_USE (NRF_GAP_ERR_BASE + 0x003) /**< Attempt to modify the whitelist while already in use by another operation. */ -#define BLE_ERROR_GAP_DEVICE_IDENTITIES_IN_USE (NRF_GAP_ERR_BASE + 0x004) /**< Attempt to modify the device identity list while already in use by another operation. */ -#define BLE_ERROR_GAP_DEVICE_IDENTITIES_DUPLICATE (NRF_GAP_ERR_BASE + 0x005) /**< The device identity list contains entries with duplicate identity addresses. */ -/**@} */ - - -/**@defgroup BLE_GAP_ROLES GAP Roles - * @note Not explicitly used in peripheral API, but will be relevant for central API. - * @{ */ -#define BLE_GAP_ROLE_INVALID 0x0 /**< Invalid Role. */ -#define BLE_GAP_ROLE_PERIPH 0x1 /**< Peripheral Role. */ -#define BLE_GAP_ROLE_CENTRAL 0x2 /**< Central Role. */ -/**@} */ - - -/**@defgroup BLE_GAP_TIMEOUT_SOURCES GAP Timeout sources - * @{ */ -#define BLE_GAP_TIMEOUT_SRC_ADVERTISING 0x00 /**< Advertising timeout. */ -#define BLE_GAP_TIMEOUT_SRC_SCAN 0x01 /**< Scanning timeout. */ -#define BLE_GAP_TIMEOUT_SRC_CONN 0x02 /**< Connection timeout. */ -#define BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD 0x03 /**< Authenticated payload timeout. */ -/**@} */ - - -/**@defgroup BLE_GAP_ADDR_TYPES GAP Address types - * @{ */ -#define BLE_GAP_ADDR_TYPE_PUBLIC 0x00 /**< Public address. */ -#define BLE_GAP_ADDR_TYPE_RANDOM_STATIC 0x01 /**< Random static address. */ -#define BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE 0x02 /**< Random private resolvable address. */ -#define BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE 0x03 /**< Random private non-resolvable address. */ -/**@} */ - - -/**@brief The default interval in seconds at which a private address is refreshed. */ -#define BLE_GAP_DEFAULT_PRIVATE_ADDR_CYCLE_INTERVAL_S (900) /* 15 minutes. */ -/**@brief The maximum interval in seconds at which a private address can be refreshed. */ -#define BLE_GAP_MAX_PRIVATE_ADDR_CYCLE_INTERVAL_S (41400) /* 11 hours 30 minutes. */ - - -/** @brief BLE address length. */ -#define BLE_GAP_ADDR_LEN (6) - - -/**@defgroup BLE_GAP_PRIVACY_MODES Privacy modes - * @{ */ -#define BLE_GAP_PRIVACY_MODE_OFF 0x00 /**< Device will send and accept its identity address for its own address. */ -#define BLE_GAP_PRIVACY_MODE_DEVICE_PRIVACY 0x01 /**< Device will send and accept only private addresses for its own address. */ -#define BLE_GAP_PRIVACY_MODE_NETWORK_PRIVACY 0x02 /**< Device will send and accept only private addresses for its own address, - and will not accept a peer using identity address as sender address when - the peer IRK is exchanged, non-zero and added to the identity list. */ -/**@} */ - - -/**@defgroup BLE_GAP_AD_TYPE_DEFINITIONS GAP Advertising and Scan Response Data format - * @note Found at https://www.bluetooth.org/Technical/AssignedNumbers/generic_access_profile.htm - * @{ */ -#define BLE_GAP_AD_TYPE_FLAGS 0x01 /**< Flags for discoverability. */ -#define BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_MORE_AVAILABLE 0x02 /**< Partial list of 16 bit service UUIDs. */ -#define BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_COMPLETE 0x03 /**< Complete list of 16 bit service UUIDs. */ -#define BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_MORE_AVAILABLE 0x04 /**< Partial list of 32 bit service UUIDs. */ -#define BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_COMPLETE 0x05 /**< Complete list of 32 bit service UUIDs. */ -#define BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_MORE_AVAILABLE 0x06 /**< Partial list of 128 bit service UUIDs. */ -#define BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_COMPLETE 0x07 /**< Complete list of 128 bit service UUIDs. */ -#define BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME 0x08 /**< Short local device name. */ -#define BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME 0x09 /**< Complete local device name. */ -#define BLE_GAP_AD_TYPE_TX_POWER_LEVEL 0x0A /**< Transmit power level. */ -#define BLE_GAP_AD_TYPE_CLASS_OF_DEVICE 0x0D /**< Class of device. */ -#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_HASH_C 0x0E /**< Simple Pairing Hash C. */ -#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R 0x0F /**< Simple Pairing Randomizer R. */ -#define BLE_GAP_AD_TYPE_SECURITY_MANAGER_TK_VALUE 0x10 /**< Security Manager TK Value. */ -#define BLE_GAP_AD_TYPE_SECURITY_MANAGER_OOB_FLAGS 0x11 /**< Security Manager Out Of Band Flags. */ -#define BLE_GAP_AD_TYPE_SLAVE_CONNECTION_INTERVAL_RANGE 0x12 /**< Slave Connection Interval Range. */ -#define BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_16BIT 0x14 /**< List of 16-bit Service Solicitation UUIDs. */ -#define BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_128BIT 0x15 /**< List of 128-bit Service Solicitation UUIDs. */ -#define BLE_GAP_AD_TYPE_SERVICE_DATA 0x16 /**< Service Data - 16-bit UUID. */ -#define BLE_GAP_AD_TYPE_PUBLIC_TARGET_ADDRESS 0x17 /**< Public Target Address. */ -#define BLE_GAP_AD_TYPE_RANDOM_TARGET_ADDRESS 0x18 /**< Random Target Address. */ -#define BLE_GAP_AD_TYPE_APPEARANCE 0x19 /**< Appearance. */ -#define BLE_GAP_AD_TYPE_ADVERTISING_INTERVAL 0x1A /**< Advertising Interval. */ -#define BLE_GAP_AD_TYPE_LE_BLUETOOTH_DEVICE_ADDRESS 0x1B /**< LE Bluetooth Device Address. */ -#define BLE_GAP_AD_TYPE_LE_ROLE 0x1C /**< LE Role. */ -#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_HASH_C256 0x1D /**< Simple Pairing Hash C-256. */ -#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R256 0x1E /**< Simple Pairing Randomizer R-256. */ -#define BLE_GAP_AD_TYPE_SERVICE_DATA_32BIT_UUID 0x20 /**< Service Data - 32-bit UUID. */ -#define BLE_GAP_AD_TYPE_SERVICE_DATA_128BIT_UUID 0x21 /**< Service Data - 128-bit UUID. */ -#define BLE_GAP_AD_TYPE_LESC_CONFIRMATION_VALUE 0x22 /**< LE Secure Connections Confirmation Value */ -#define BLE_GAP_AD_TYPE_LESC_RANDOM_VALUE 0x23 /**< LE Secure Connections Random Value */ -#define BLE_GAP_AD_TYPE_URI 0x24 /**< URI */ -#define BLE_GAP_AD_TYPE_3D_INFORMATION_DATA 0x3D /**< 3D Information Data. */ -#define BLE_GAP_AD_TYPE_MANUFACTURER_SPECIFIC_DATA 0xFF /**< Manufacturer Specific Data. */ -/**@} */ - - -/**@defgroup BLE_GAP_ADV_FLAGS GAP Advertisement Flags - * @{ */ -#define BLE_GAP_ADV_FLAG_LE_LIMITED_DISC_MODE (0x01) /**< LE Limited Discoverable Mode. */ -#define BLE_GAP_ADV_FLAG_LE_GENERAL_DISC_MODE (0x02) /**< LE General Discoverable Mode. */ -#define BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED (0x04) /**< BR/EDR not supported. */ -#define BLE_GAP_ADV_FLAG_LE_BR_EDR_CONTROLLER (0x08) /**< Simultaneous LE and BR/EDR, Controller. */ -#define BLE_GAP_ADV_FLAG_LE_BR_EDR_HOST (0x10) /**< Simultaneous LE and BR/EDR, Host. */ -#define BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE (BLE_GAP_ADV_FLAG_LE_LIMITED_DISC_MODE | BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED) /**< LE Limited Discoverable Mode, BR/EDR not supported. */ -#define BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE (BLE_GAP_ADV_FLAG_LE_GENERAL_DISC_MODE | BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED) /**< LE General Discoverable Mode, BR/EDR not supported. */ -/**@} */ - - -/**@defgroup BLE_GAP_ADV_INTERVALS GAP Advertising interval max and min - * @{ */ -#define BLE_GAP_ADV_INTERVAL_MIN 0x0020 /**< Minimum Advertising interval in 625 us units, i.e. 20 ms. */ -#define BLE_GAP_ADV_INTERVAL_MAX 0x4000 /**< Maximum Advertising interval in 625 us units, i.e. 10.24 s. */ - /**@} */ - - -/**@defgroup BLE_GAP_SCAN_INTERVALS GAP Scan interval max and min - * @{ */ -#define BLE_GAP_SCAN_INTERVAL_MIN 0x0004 /**< Minimum Scan interval in 625 us units, i.e. 2.5 ms. */ -#define BLE_GAP_SCAN_INTERVAL_MAX 0x4000 /**< Maximum Scan interval in 625 us units, i.e. 10.24 s. */ - /** @} */ - - -/**@defgroup BLE_GAP_SCAN_WINDOW GAP Scan window max and min - * @{ */ -#define BLE_GAP_SCAN_WINDOW_MIN 0x0004 /**< Minimum Scan window in 625 us units, i.e. 2.5 ms. */ -#define BLE_GAP_SCAN_WINDOW_MAX 0x4000 /**< Maximum Scan window in 625 us units, i.e. 10.24 s. */ - /** @} */ - - -/**@defgroup BLE_GAP_SCAN_TIMEOUT GAP Scan timeout max and min - * @{ */ -#define BLE_GAP_SCAN_TIMEOUT_MIN 0x0001 /**< Minimum Scan timeout in seconds. */ -#define BLE_GAP_SCAN_TIMEOUT_MAX 0xFFFF /**< Maximum Scan timeout in seconds. */ - /** @} */ - - -/**@brief Maximum size of advertising data in octets. */ -#define BLE_GAP_ADV_MAX_SIZE (31) - - -/**@defgroup BLE_GAP_ADV_TYPES GAP Advertising types - * @{ */ -#define BLE_GAP_ADV_TYPE_ADV_IND 0x00 /**< Connectable undirected. */ -#define BLE_GAP_ADV_TYPE_ADV_DIRECT_IND 0x01 /**< Connectable directed. */ -#define BLE_GAP_ADV_TYPE_ADV_SCAN_IND 0x02 /**< Scannable undirected. */ -#define BLE_GAP_ADV_TYPE_ADV_NONCONN_IND 0x03 /**< Non connectable undirected. */ -/**@} */ - - -/**@defgroup BLE_GAP_ADV_FILTER_POLICIES GAP Advertising filter policies - * @{ */ -#define BLE_GAP_ADV_FP_ANY 0x00 /**< Allow scan requests and connect requests from any device. */ -#define BLE_GAP_ADV_FP_FILTER_SCANREQ 0x01 /**< Filter scan requests with whitelist. */ -#define BLE_GAP_ADV_FP_FILTER_CONNREQ 0x02 /**< Filter connect requests with whitelist. */ -#define BLE_GAP_ADV_FP_FILTER_BOTH 0x03 /**< Filter both scan and connect requests with whitelist. */ -/**@} */ - - -/**@defgroup BLE_GAP_ADV_TIMEOUT_VALUES GAP Advertising timeout values - * @{ */ -#define BLE_GAP_ADV_TIMEOUT_LIMITED_MAX (180) /**< Maximum advertising time in limited discoverable mode (TGAP(lim_adv_timeout) = 180 s). */ -#define BLE_GAP_ADV_TIMEOUT_GENERAL_UNLIMITED (0) /**< Unlimited advertising in general discoverable mode. */ -/**@} */ - - -/**@defgroup BLE_GAP_DISC_MODES GAP Discovery modes - * @{ */ -#define BLE_GAP_DISC_MODE_NOT_DISCOVERABLE 0x00 /**< Not discoverable discovery Mode. */ -#define BLE_GAP_DISC_MODE_LIMITED 0x01 /**< Limited Discovery Mode. */ -#define BLE_GAP_DISC_MODE_GENERAL 0x02 /**< General Discovery Mode. */ -/**@} */ - - -/**@defgroup BLE_GAP_IO_CAPS GAP IO Capabilities - * @{ */ -#define BLE_GAP_IO_CAPS_DISPLAY_ONLY 0x00 /**< Display Only. */ -#define BLE_GAP_IO_CAPS_DISPLAY_YESNO 0x01 /**< Display and Yes/No entry. */ -#define BLE_GAP_IO_CAPS_KEYBOARD_ONLY 0x02 /**< Keyboard Only. */ -#define BLE_GAP_IO_CAPS_NONE 0x03 /**< No I/O capabilities. */ -#define BLE_GAP_IO_CAPS_KEYBOARD_DISPLAY 0x04 /**< Keyboard and Display. */ -/**@} */ - - -/**@defgroup BLE_GAP_AUTH_KEY_TYPES GAP Authentication Key Types - * @{ */ -#define BLE_GAP_AUTH_KEY_TYPE_NONE 0x00 /**< No key (may be used to reject). */ -#define BLE_GAP_AUTH_KEY_TYPE_PASSKEY 0x01 /**< 6-digit Passkey. */ -#define BLE_GAP_AUTH_KEY_TYPE_OOB 0x02 /**< Out Of Band data. */ -/**@} */ - - -/**@defgroup BLE_GAP_KP_NOT_TYPES GAP Keypress Notification Types - * @{ */ -#define BLE_GAP_KP_NOT_TYPE_PASSKEY_START 0x00 /**< Passkey entry started. */ -#define BLE_GAP_KP_NOT_TYPE_PASSKEY_DIGIT_IN 0x01 /**< Passkey digit entered. */ -#define BLE_GAP_KP_NOT_TYPE_PASSKEY_DIGIT_OUT 0x02 /**< Passkey digit erased. */ -#define BLE_GAP_KP_NOT_TYPE_PASSKEY_CLEAR 0x03 /**< Passkey cleared. */ -#define BLE_GAP_KP_NOT_TYPE_PASSKEY_END 0x04 /**< Passkey entry completed. */ -/**@} */ - - -/**@defgroup BLE_GAP_SEC_STATUS GAP Security status - * @{ */ -#define BLE_GAP_SEC_STATUS_SUCCESS 0x00 /**< Procedure completed with success. */ -#define BLE_GAP_SEC_STATUS_TIMEOUT 0x01 /**< Procedure timed out. */ -#define BLE_GAP_SEC_STATUS_PDU_INVALID 0x02 /**< Invalid PDU received. */ -#define BLE_GAP_SEC_STATUS_RFU_RANGE1_BEGIN 0x03 /**< Reserved for Future Use range #1 begin. */ -#define BLE_GAP_SEC_STATUS_RFU_RANGE1_END 0x80 /**< Reserved for Future Use range #1 end. */ -#define BLE_GAP_SEC_STATUS_PASSKEY_ENTRY_FAILED 0x81 /**< Passkey entry failed (user canceled or other). */ -#define BLE_GAP_SEC_STATUS_OOB_NOT_AVAILABLE 0x82 /**< Out of Band Key not available. */ -#define BLE_GAP_SEC_STATUS_AUTH_REQ 0x83 /**< Authentication requirements not met. */ -#define BLE_GAP_SEC_STATUS_CONFIRM_VALUE 0x84 /**< Confirm value failed. */ -#define BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP 0x85 /**< Pairing not supported. */ -#define BLE_GAP_SEC_STATUS_ENC_KEY_SIZE 0x86 /**< Encryption key size. */ -#define BLE_GAP_SEC_STATUS_SMP_CMD_UNSUPPORTED 0x87 /**< Unsupported SMP command. */ -#define BLE_GAP_SEC_STATUS_UNSPECIFIED 0x88 /**< Unspecified reason. */ -#define BLE_GAP_SEC_STATUS_REPEATED_ATTEMPTS 0x89 /**< Too little time elapsed since last attempt. */ -#define BLE_GAP_SEC_STATUS_INVALID_PARAMS 0x8A /**< Invalid parameters. */ -#define BLE_GAP_SEC_STATUS_DHKEY_FAILURE 0x8B /**< DHKey check failure. */ -#define BLE_GAP_SEC_STATUS_NUM_COMP_FAILURE 0x8C /**< Numeric Comparison failure. */ -#define BLE_GAP_SEC_STATUS_BR_EDR_IN_PROG 0x8D /**< BR/EDR pairing in progress. */ -#define BLE_GAP_SEC_STATUS_X_TRANS_KEY_DISALLOWED 0x8E /**< BR/EDR Link Key cannot be used for LE keys. */ -#define BLE_GAP_SEC_STATUS_RFU_RANGE2_BEGIN 0x8F /**< Reserved for Future Use range #2 begin. */ -#define BLE_GAP_SEC_STATUS_RFU_RANGE2_END 0xFF /**< Reserved for Future Use range #2 end. */ -/**@} */ - - -/**@defgroup BLE_GAP_SEC_STATUS_SOURCES GAP Security status sources - * @{ */ -#define BLE_GAP_SEC_STATUS_SOURCE_LOCAL 0x00 /**< Local failure. */ -#define BLE_GAP_SEC_STATUS_SOURCE_REMOTE 0x01 /**< Remote failure. */ -/**@} */ - - -/**@defgroup BLE_GAP_CP_LIMITS GAP Connection Parameters Limits - * @{ */ -#define BLE_GAP_CP_MIN_CONN_INTVL_NONE 0xFFFF /**< No new minimum connection interval specified in connect parameters. */ -#define BLE_GAP_CP_MIN_CONN_INTVL_MIN 0x0006 /**< Lowest minimum connection interval permitted, in units of 1.25 ms, i.e. 7.5 ms. */ -#define BLE_GAP_CP_MIN_CONN_INTVL_MAX 0x0C80 /**< Highest minimum connection interval permitted, in units of 1.25 ms, i.e. 4 s. */ -#define BLE_GAP_CP_MAX_CONN_INTVL_NONE 0xFFFF /**< No new maximum connection interval specified in connect parameters. */ -#define BLE_GAP_CP_MAX_CONN_INTVL_MIN 0x0006 /**< Lowest maximum connection interval permitted, in units of 1.25 ms, i.e. 7.5 ms. */ -#define BLE_GAP_CP_MAX_CONN_INTVL_MAX 0x0C80 /**< Highest maximum connection interval permitted, in units of 1.25 ms, i.e. 4 s. */ -#define BLE_GAP_CP_SLAVE_LATENCY_MAX 0x01F3 /**< Highest slave latency permitted, in connection events. */ -#define BLE_GAP_CP_CONN_SUP_TIMEOUT_NONE 0xFFFF /**< No new supervision timeout specified in connect parameters. */ -#define BLE_GAP_CP_CONN_SUP_TIMEOUT_MIN 0x000A /**< Lowest supervision timeout permitted, in units of 10 ms, i.e. 100 ms. */ -#define BLE_GAP_CP_CONN_SUP_TIMEOUT_MAX 0x0C80 /**< Highest supervision timeout permitted, in units of 10 ms, i.e. 32 s. */ -/**@} */ - - -/**@defgroup BLE_GAP_DEVNAME GAP device name defines. - * @{ */ -#define BLE_GAP_DEVNAME_DEFAULT "nRF5x" /**< Default device name value. */ -#define BLE_GAP_DEVNAME_DEFAULT_LEN 31 /**< Default number of octets in device name. */ -#define BLE_GAP_DEVNAME_MAX_LEN 248 /**< Maximum number of octets in device name. */ -/**@} */ - - -/**@brief Disable RSSI events for connections */ -#define BLE_GAP_RSSI_THRESHOLD_INVALID 0xFF - -/**@defgroup BLE_GAP_PHYS GAP PHYs - * @{ */ -#define BLE_GAP_PHY_AUTO 0x00 /**< Automatic PHY selection. Refer @ref sd_ble_gap_phy_update for more information.*/ -#define BLE_GAP_PHY_1MBPS 0x01 /**< 1 Mbps PHY. */ -#define BLE_GAP_PHY_2MBPS 0x02 /**< 2 Mbps PHY. */ -#define BLE_GAP_PHY_CODED 0x04 /**< Coded PHY. */ - -/**@} */ - -/**@defgroup BLE_GAP_CONN_SEC_MODE_SET_MACROS GAP attribute security requirement setters - * - * See @ref ble_gap_conn_sec_mode_t. - * @{ */ -/**@brief Set sec_mode pointed to by ptr to have no access rights.*/ -#define BLE_GAP_CONN_SEC_MODE_SET_NO_ACCESS(ptr) do {(ptr)->sm = 0; (ptr)->lv = 0;} while(0) -/**@brief Set sec_mode pointed to by ptr to require no protection, open link.*/ -#define BLE_GAP_CONN_SEC_MODE_SET_OPEN(ptr) do {(ptr)->sm = 1; (ptr)->lv = 1;} while(0) -/**@brief Set sec_mode pointed to by ptr to require encryption, but no MITM protection.*/ -#define BLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM(ptr) do {(ptr)->sm = 1; (ptr)->lv = 2;} while(0) -/**@brief Set sec_mode pointed to by ptr to require encryption and MITM protection.*/ -#define BLE_GAP_CONN_SEC_MODE_SET_ENC_WITH_MITM(ptr) do {(ptr)->sm = 1; (ptr)->lv = 3;} while(0) -/**@brief Set sec_mode pointed to by ptr to require LESC encryption and MITM protection.*/ -#define BLE_GAP_CONN_SEC_MODE_SET_LESC_ENC_WITH_MITM(ptr) do {(ptr)->sm = 1; (ptr)->lv = 4;} while(0) -/**@brief Set sec_mode pointed to by ptr to require signing or encryption, no MITM protection needed.*/ -#define BLE_GAP_CONN_SEC_MODE_SET_SIGNED_NO_MITM(ptr) do {(ptr)->sm = 2; (ptr)->lv = 1;} while(0) -/**@brief Set sec_mode pointed to by ptr to require signing or encryption with MITM protection.*/ -#define BLE_GAP_CONN_SEC_MODE_SET_SIGNED_WITH_MITM(ptr) do {(ptr)->sm = 2; (ptr)->lv = 2;} while(0) -/**@} */ - - -/**@brief GAP Security Random Number Length. */ -#define BLE_GAP_SEC_RAND_LEN 8 - - -/**@brief GAP Security Key Length. */ -#define BLE_GAP_SEC_KEY_LEN 16 - - -/**@brief GAP LE Secure Connections Elliptic Curve Diffie-Hellman P-256 Public Key Length. */ -#define BLE_GAP_LESC_P256_PK_LEN 64 - - -/**@brief GAP LE Secure Connections Elliptic Curve Diffie-Hellman DHKey Length. */ -#define BLE_GAP_LESC_DHKEY_LEN 32 - - -/**@brief GAP Passkey Length. */ -#define BLE_GAP_PASSKEY_LEN 6 - - -/**@brief Maximum amount of addresses in the whitelist. */ -#define BLE_GAP_WHITELIST_ADDR_MAX_COUNT (8) - - -/**@brief Maximum amount of identities in the device identities list. */ -#define BLE_GAP_DEVICE_IDENTITIES_MAX_COUNT (8) - - -/**@brief Default connection count for a configuration. */ -#define BLE_GAP_CONN_COUNT_DEFAULT (1) - - -/**@defgroup BLE_GAP_EVENT_LENGTH GAP event length defines. - * @{ */ -#define BLE_GAP_EVENT_LENGTH_MIN (2) /**< Minimum event length, in 1.25 ms units. */ -#define BLE_GAP_EVENT_LENGTH_DEFAULT (3) /**< Default event length, in 1.25 ms units. */ -/**@} */ - - -/**@defgroup BLE_GAP_ROLE_COUNT GAP concurrent connection count defines. - * @{ */ -#define BLE_GAP_ROLE_COUNT_PERIPH_DEFAULT (1) /**< Default maximum number of connections concurrently acting as peripherals. */ -#define BLE_GAP_ROLE_COUNT_CENTRAL_DEFAULT (3) /**< Default maximum number of connections concurrently acting as centrals. */ -#define BLE_GAP_ROLE_COUNT_CENTRAL_SEC_DEFAULT (1) /**< Default number of SMP instances shared between all connections acting as centrals. */ -#define BLE_GAP_ROLE_COUNT_COMBINED_MAX (20) /**< Maximum supported number of concurrent connections in the peripheral and central roles combined. */ -/**@} */ - - -/**@brief Automatic data length parameter. */ -#define BLE_GAP_DATA_LENGTH_AUTO 0 - -/**@defgroup BLE_GAP_AUTH_PAYLOAD_TIMEOUT Authenticated payload timeout defines. - * @{ */ -#define BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MAX (48000) /**< Maximum authenticated payload timeout in 10 ms units, i.e. 8 minutes. */ -#define BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MIN (1) /**< Minimum authenticated payload timeout in 10 ms units, i.e. 10 ms. */ -/**@} */ - -/**@defgroup GAP_SEC_MODES GAP Security Modes - * @{ */ -#define BLE_GAP_SEC_MODE 0x00 /**< No key (may be used to reject). */ -/**@} */ -/** @} */ - - -/**@addtogroup BLE_GAP_STRUCTURES Structures - * @{ */ - -/**@brief Bluetooth Low Energy address. */ -typedef struct -{ - uint8_t addr_id_peer : 1; /**< Only valid for peer addresses. - Reference to peer in device identities list (as set with @ref sd_ble_gap_device_identities_set) when peer is using privacy. */ - uint8_t addr_type : 7; /**< See @ref BLE_GAP_ADDR_TYPES. */ - uint8_t addr[BLE_GAP_ADDR_LEN]; /**< 48-bit address, LSB format. */ -} ble_gap_addr_t; - - -/**@brief GAP connection parameters. - * - * @note When ble_conn_params_t is received in an event, both min_conn_interval and - * max_conn_interval will be equal to the connection interval set by the central. - * - * @note If both conn_sup_timeout and max_conn_interval are specified, then the following constraint applies: - * conn_sup_timeout * 4 > (1 + slave_latency) * max_conn_interval - * that corresponds to the following Bluetooth Spec requirement: - * The Supervision_Timeout in milliseconds shall be larger than - * (1 + Conn_Latency) * Conn_Interval_Max * 2, where Conn_Interval_Max is given in milliseconds. - */ -typedef struct -{ - uint16_t min_conn_interval; /**< Minimum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/ - uint16_t max_conn_interval; /**< Maximum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/ - uint16_t slave_latency; /**< Slave Latency in number of connection events, see @ref BLE_GAP_CP_LIMITS.*/ - uint16_t conn_sup_timeout; /**< Connection Supervision Timeout in 10 ms units, see @ref BLE_GAP_CP_LIMITS.*/ -} ble_gap_conn_params_t; - - -/**@brief GAP connection security modes. - * - * Security Mode 0 Level 0: No access permissions at all (this level is not defined by the Bluetooth Core specification).\n - * Security Mode 1 Level 1: No security is needed (aka open link).\n - * Security Mode 1 Level 2: Encrypted link required, MITM protection not necessary.\n - * Security Mode 1 Level 3: MITM protected encrypted link required.\n - * Security Mode 1 Level 4: LESC MITM protected encrypted link using a 128-bit strength encryption key required.\n - * Security Mode 2 Level 1: Signing or encryption required, MITM protection not necessary.\n - * Security Mode 2 Level 2: MITM protected signing required, unless link is MITM protected encrypted.\n - */ -typedef struct -{ - uint8_t sm : 4; /**< Security Mode (1 or 2), 0 for no permissions at all. */ - uint8_t lv : 4; /**< Level (1, 2, 3 or 4), 0 for no permissions at all. */ - -} ble_gap_conn_sec_mode_t; - - -/**@brief GAP connection security status.*/ -typedef struct -{ - ble_gap_conn_sec_mode_t sec_mode; /**< Currently active security mode for this connection.*/ - uint8_t encr_key_size; /**< Length of currently active encryption key, 7 to 16 octets (only applicable for bonding procedures). */ -} ble_gap_conn_sec_t; - -/**@brief Identity Resolving Key. */ -typedef struct -{ - uint8_t irk[BLE_GAP_SEC_KEY_LEN]; /**< Array containing IRK. */ -} ble_gap_irk_t; - - -/**@brief Channel mask for RF channels used in advertising. */ -typedef struct -{ - uint8_t ch_37_off : 1; /**< Setting this bit to 1 will turn off advertising on channel 37 */ - uint8_t ch_38_off : 1; /**< Setting this bit to 1 will turn off advertising on channel 38 */ - uint8_t ch_39_off : 1; /**< Setting this bit to 1 will turn off advertising on channel 39 */ -} ble_gap_adv_ch_mask_t; - - -/**@brief GAP advertising parameters. */ -typedef struct -{ - uint8_t type; /**< See @ref BLE_GAP_ADV_TYPES. */ - ble_gap_addr_t const *p_peer_addr; /**< Address of a known peer. - - When privacy is enabled and the local device use @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE addresses, the device identity list is searched for a matching - entry. If the local IRK for that device identity is set, the local IRK for that device will be used to generate the advertiser address field in the advertise packet. - - If type is @ref BLE_GAP_ADV_TYPE_ADV_DIRECT_IND, this must be set to the targeted initiator. If the initiator is in the device identity list, - the peer IRK for that device will be used to generate the initiator address field in the ADV_DIRECT_IND packet. */ - uint8_t fp; /**< Filter Policy, see @ref BLE_GAP_ADV_FILTER_POLICIES. */ - uint16_t interval; /**< Advertising interval between 0x0020 and 0x4000 in 0.625 ms units (20 ms to 10.24 s), see @ref BLE_GAP_ADV_INTERVALS. - - If type equals @ref BLE_GAP_ADV_TYPE_ADV_DIRECT_IND, this parameter must be set to 0 for high duty cycle directed advertising. - - If type equals @ref BLE_GAP_ADV_TYPE_ADV_DIRECT_IND, set @ref BLE_GAP_ADV_INTERVAL_MIN <= interval <= @ref BLE_GAP_ADV_INTERVAL_MAX for low duty cycle advertising.*/ - uint16_t timeout; /**< Advertising timeout between 0x0001 and 0x3FFF in seconds, 0x0000 disables timeout. See also @ref BLE_GAP_ADV_TIMEOUT_VALUES. If type equals @ref BLE_GAP_ADV_TYPE_ADV_DIRECT_IND, this parameter must be set to 0 for High duty cycle directed advertising. */ - ble_gap_adv_ch_mask_t channel_mask; /**< Advertising channel mask. See @ref ble_gap_adv_ch_mask_t. */ -} ble_gap_adv_params_t; - - -/**@brief GAP scanning parameters. */ -typedef struct -{ - uint8_t active : 1; /**< If 1, perform active scanning (scan requests). */ - uint8_t use_whitelist : 1; /**< If 1, filter advertisers using current active whitelist. */ - uint8_t adv_dir_report : 1; /**< If 1, also report directed advertisements where the initiator field is set to a private resolvable address, - even if the address did not resolve to an entry in the device identity list. A report will be generated - even if the peer is not in the whitelist. */ - uint16_t interval; /**< Scan interval between 0x0004 and 0x4000 in 0.625 ms units (2.5 ms to 10.24 s). */ - uint16_t window; /**< Scan window between 0x0004 and 0x4000 in 0.625 ms units (2.5 ms to 10.24 s). */ - uint16_t timeout; /**< Scan timeout between 0x0001 and 0xFFFF in seconds, 0x0000 disables timeout. */ -} ble_gap_scan_params_t; - - -/**@brief Privacy. - * - * The privacy feature provides a way for the device to avoid being tracked over a period of time. - * The privacy feature, when enabled, hides the local device identity and replaces it with a private address - * that is automatically refreshed at a specified interval. - * - * If a device still wants to be recognized by other peers, it needs to share it's Identity Resolving Key (IRK). - * With this key, a device can generate a random private address that can only be recognized by peers in possession of that key, - * and devices can establish connections without revealing their real identities. - * - * Both network privacy (@ref BLE_GAP_PRIVACY_MODE_NETWORK_PRIVACY) and device privacy (@ref BLE_GAP_PRIVACY_MODE_DEVICE_PRIVACY) - * are supported. - * - * @note If the device IRK is updated, the new IRK becomes the one to be distributed in all - * bonding procedures performed after @ref sd_ble_gap_privacy_set returns. - * The IRK distributed during bonding procedure is the device IRK that is active when @ref sd_ble_gap_sec_params_reply is called. - */ -typedef struct -{ - uint8_t privacy_mode; /**< Privacy mode, see @ref BLE_GAP_PRIVACY_MODES. Default is @ref BLE_GAP_PRIVACY_MODE_OFF. */ - uint8_t private_addr_type; /**< The private address type must be either @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE or @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE. */ - uint16_t private_addr_cycle_s; /**< Private address cycle interval in seconds. Providing an address cycle value of 0 will use the default value defined by @ref BLE_GAP_DEFAULT_PRIVATE_ADDR_CYCLE_INTERVAL_S. */ - ble_gap_irk_t *p_device_irk; /**< When used as input, pointer to IRK structure that will be used as the default IRK. If NULL, the device default IRK will be used. - When used as output, pointer to IRK structure where the current default IRK will be written to. If NULL, this argument is ignored. - By default, the default IRK is used to generate random private resolvable addresses for the local device unless instructed otherwise. */ -} ble_gap_privacy_params_t; - - -/**@brief PHY preferences for TX and RX - * @note tx_phys and rx_phys are bit fields. Multiple bits can be set in them to indicate multiple preferred PHYs for each direction. - * @code - * p_gap_phys->tx_phys = BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS; - * p_gap_phys->rx_phys = BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS; - * @endcode - * - */ -typedef struct -{ - uint8_t tx_phys; /**< Preferred transmit PHYs, see @ref BLE_GAP_PHYS. */ - uint8_t rx_phys; /**< Preferred receive PHYs, see @ref BLE_GAP_PHYS. */ -} ble_gap_phys_t; - -/** @brief Keys that can be exchanged during a bonding procedure. */ -typedef struct -{ - uint8_t enc : 1; /**< Long Term Key and Master Identification. */ - uint8_t id : 1; /**< Identity Resolving Key and Identity Address Information. */ - uint8_t sign : 1; /**< Connection Signature Resolving Key. */ - uint8_t link : 1; /**< Derive the Link Key from the LTK. */ -} ble_gap_sec_kdist_t; - - -/**@brief GAP security parameters. */ -typedef struct -{ - uint8_t bond : 1; /**< Perform bonding. */ - uint8_t mitm : 1; /**< Enable Man In The Middle protection. */ - uint8_t lesc : 1; /**< Enable LE Secure Connection pairing. */ - uint8_t keypress : 1; /**< Enable generation of keypress notifications. */ - uint8_t io_caps : 3; /**< IO capabilities, see @ref BLE_GAP_IO_CAPS. */ - uint8_t oob : 1; /**< The OOB data flag. - - In LE legacy pairing, this flag is set if a device has out of band authentication data. - The OOB method is used if both of the devices have out of band authentication data. - - In LE Secure Connections pairing, this flag is set if a device has the peer device's out of band authentication data. - The OOB method is used if at least one device has the peer device's OOB data available. */ - uint8_t min_key_size; /**< Minimum encryption key size in octets between 7 and 16. If 0 then not applicable in this instance. */ - uint8_t max_key_size; /**< Maximum encryption key size in octets between min_key_size and 16. */ - ble_gap_sec_kdist_t kdist_own; /**< Key distribution bitmap: keys that the local device will distribute. */ - ble_gap_sec_kdist_t kdist_peer; /**< Key distribution bitmap: keys that the remote device will distribute. */ -} ble_gap_sec_params_t; - - -/**@brief GAP Encryption Information. */ -typedef struct -{ - uint8_t ltk[BLE_GAP_SEC_KEY_LEN]; /**< Long Term Key. */ - uint8_t lesc : 1; /**< Key generated using LE Secure Connections. */ - uint8_t auth : 1; /**< Authenticated Key. */ - uint8_t ltk_len : 6; /**< LTK length in octets. */ -} ble_gap_enc_info_t; - - -/**@brief GAP Master Identification. */ -typedef struct -{ - uint16_t ediv; /**< Encrypted Diversifier. */ - uint8_t rand[BLE_GAP_SEC_RAND_LEN]; /**< Random Number. */ -} ble_gap_master_id_t; - - -/**@brief GAP Signing Information. */ -typedef struct -{ - uint8_t csrk[BLE_GAP_SEC_KEY_LEN]; /**< Connection Signature Resolving Key. */ -} ble_gap_sign_info_t; - - -/**@brief GAP LE Secure Connections P-256 Public Key. */ -typedef struct -{ - uint8_t pk[BLE_GAP_LESC_P256_PK_LEN]; /**< LE Secure Connections Elliptic Curve Diffie-Hellman P-256 Public Key. Stored in the standard SMP protocol format: {X,Y} both in little-endian. */ -} ble_gap_lesc_p256_pk_t; - - -/**@brief GAP LE Secure Connections DHKey. */ -typedef struct -{ - uint8_t key[BLE_GAP_LESC_DHKEY_LEN]; /**< LE Secure Connections Elliptic Curve Diffie-Hellman Key. Stored in little-endian. */ -} ble_gap_lesc_dhkey_t; - - -/**@brief GAP LE Secure Connections OOB data. */ -typedef struct -{ - ble_gap_addr_t addr; /**< Bluetooth address of the device. */ - uint8_t r[BLE_GAP_SEC_KEY_LEN]; /**< Random Number. */ - uint8_t c[BLE_GAP_SEC_KEY_LEN]; /**< Confirm Value. */ -} ble_gap_lesc_oob_data_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_CONNECTED. */ -typedef struct -{ - ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. If the peer_addr resolved: @ref ble_gap_addr_t::addr_id_peer is set to 1 - and the address is the device's identity address. */ - uint8_t role; /**< BLE role for this connection, see @ref BLE_GAP_ROLES */ - ble_gap_conn_params_t conn_params; /**< GAP Connection Parameters. */ -} ble_gap_evt_connected_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_DISCONNECTED. */ -typedef struct -{ - uint8_t reason; /**< HCI error code, see @ref BLE_HCI_STATUS_CODES. */ -} ble_gap_evt_disconnected_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_CONN_PARAM_UPDATE. */ -typedef struct -{ - ble_gap_conn_params_t conn_params; /**< GAP Connection Parameters. */ -} ble_gap_evt_conn_param_update_t; - -/**@brief Event structure for @ref BLE_GAP_EVT_PHY_UPDATE_REQUEST. */ -typedef struct -{ - ble_gap_phys_t peer_preferred_phys; /**< The PHYs the peer prefers to use. */ -} ble_gap_evt_phy_update_request_t; - -/**@brief Event Structure for @ref BLE_GAP_EVT_PHY_UPDATE. */ -typedef struct -{ - uint8_t status; /**< Status of the procedure, see @ref BLE_HCI_STATUS_CODES.*/ - uint8_t tx_phy; /**< TX PHY for this connection, see @ref BLE_GAP_PHYS. */ - uint8_t rx_phy; /**< RX PHY for this connection, see @ref BLE_GAP_PHYS. */ -} ble_gap_evt_phy_update_t; - -/**@brief Event structure for @ref BLE_GAP_EVT_SEC_PARAMS_REQUEST. */ -typedef struct -{ - ble_gap_sec_params_t peer_params; /**< Initiator Security Parameters. */ -} ble_gap_evt_sec_params_request_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_SEC_INFO_REQUEST. */ -typedef struct -{ - ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. */ - ble_gap_master_id_t master_id; /**< Master Identification for LTK lookup. */ - uint8_t enc_info : 1; /**< If 1, Encryption Information required. */ - uint8_t id_info : 1; /**< If 1, Identity Information required. */ - uint8_t sign_info : 1; /**< If 1, Signing Information required. */ -} ble_gap_evt_sec_info_request_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_PASSKEY_DISPLAY. */ -typedef struct -{ - uint8_t passkey[BLE_GAP_PASSKEY_LEN]; /**< 6-digit passkey in ASCII ('0'-'9' digits only). */ - uint8_t match_request : 1; /**< If 1 requires the application to report the match using @ref sd_ble_gap_auth_key_reply - with either @ref BLE_GAP_AUTH_KEY_TYPE_NONE if there is no match or - @ref BLE_GAP_AUTH_KEY_TYPE_PASSKEY if there is a match. */ -} ble_gap_evt_passkey_display_t; - -/**@brief Event structure for @ref BLE_GAP_EVT_KEY_PRESSED. */ -typedef struct -{ - uint8_t kp_not; /**< Keypress notification type, see @ref BLE_GAP_KP_NOT_TYPES. */ -} ble_gap_evt_key_pressed_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_AUTH_KEY_REQUEST. */ -typedef struct -{ - uint8_t key_type; /**< See @ref BLE_GAP_AUTH_KEY_TYPES. */ -} ble_gap_evt_auth_key_request_t; - -/**@brief Event structure for @ref BLE_GAP_EVT_LESC_DHKEY_REQUEST. */ -typedef struct -{ - ble_gap_lesc_p256_pk_t *p_pk_peer; /**< LE Secure Connections remote P-256 Public Key. This will point to the application-supplied memory - inside the keyset during the call to @ref sd_ble_gap_sec_params_reply. */ - uint8_t oobd_req :1; /**< LESC OOB data required. A call to @ref sd_ble_gap_lesc_oob_data_set is required to complete the procedure. */ -} ble_gap_evt_lesc_dhkey_request_t; - - -/**@brief Security levels supported. - * @note See Bluetooth Specification Version 4.2 Volume 3, Part C, Chapter 10, Section 10.2.1. -*/ -typedef struct -{ - uint8_t lv1 : 1; /**< If 1: Level 1 is supported. */ - uint8_t lv2 : 1; /**< If 1: Level 2 is supported. */ - uint8_t lv3 : 1; /**< If 1: Level 3 is supported. */ - uint8_t lv4 : 1; /**< If 1: Level 4 is supported. */ -} ble_gap_sec_levels_t; - - -/**@brief Encryption Key. */ -typedef struct -{ - ble_gap_enc_info_t enc_info; /**< Encryption Information. */ - ble_gap_master_id_t master_id; /**< Master Identification. */ -} ble_gap_enc_key_t; - - -/**@brief Identity Key. */ -typedef struct -{ - ble_gap_irk_t id_info; /**< Identity Resolving Key. */ - ble_gap_addr_t id_addr_info; /**< Identity Address. */ -} ble_gap_id_key_t; - - -/**@brief Security Keys. */ -typedef struct -{ - ble_gap_enc_key_t *p_enc_key; /**< Encryption Key, or NULL. */ - ble_gap_id_key_t *p_id_key; /**< Identity Key, or NULL. */ - ble_gap_sign_info_t *p_sign_key; /**< Signing Key, or NULL. */ - ble_gap_lesc_p256_pk_t *p_pk; /**< LE Secure Connections P-256 Public Key. When in debug mode the application must use the value defined - in the Core Bluetooth Specification v4.2 Vol.3, Part H, Section 2.3.5.6.1 */ -} ble_gap_sec_keys_t; - - -/**@brief Security key set for both local and peer keys. */ -typedef struct -{ - ble_gap_sec_keys_t keys_own; /**< Keys distributed by the local device. For LE Secure Connections the encryption key will be generated locally and will always be stored if bonding. */ - ble_gap_sec_keys_t keys_peer; /**< Keys distributed by the remote device. For LE Secure Connections, p_enc_key must always be NULL. */ -} ble_gap_sec_keyset_t; - - -/**@brief Data Length Update Procedure parameters. */ -typedef struct -{ - uint16_t max_tx_octets; /**< Maximum number of payload octets that a Controller supports for transmission of a single Link Layer Data Channel PDU. */ - uint16_t max_rx_octets; /**< Maximum number of payload octets that a Controller supports for reception of a single Link Layer Data Channel PDU. */ - uint16_t max_tx_time_us; /**< Maximum time, in microseconds, that a Controller supports for transmission of a single Link Layer Data Channel PDU. */ - uint16_t max_rx_time_us; /**< Maximum time, in microseconds, that a Controller supports for reception of a single Link Layer Data Channel PDU. */ -} ble_gap_data_length_params_t; - - -/**@brief Data Length Update Procedure local limitation. */ -typedef struct -{ - uint16_t tx_payload_limited_octets; /**< If > 0, the requested TX packet length is too long by this many octets. */ - uint16_t rx_payload_limited_octets; /**< If > 0, the requested RX packet length is too long by this many octets. */ - uint16_t tx_rx_time_limited_us; /**< If > 0, the requested combination of TX and RX packet lengths is too long by this many microseconds. */ -} ble_gap_data_length_limitation_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_AUTH_STATUS. */ -typedef struct -{ - uint8_t auth_status; /**< Authentication status, see @ref BLE_GAP_SEC_STATUS. */ - uint8_t error_src : 2; /**< On error, source that caused the failure, see @ref BLE_GAP_SEC_STATUS_SOURCES. */ - uint8_t bonded : 1; /**< Procedure resulted in a bond. */ - uint8_t lesc : 1; /**< Procedure resulted in a LE Secure Connection. */ - ble_gap_sec_levels_t sm1_levels; /**< Levels supported in Security Mode 1. */ - ble_gap_sec_levels_t sm2_levels; /**< Levels supported in Security Mode 2. */ - ble_gap_sec_kdist_t kdist_own; /**< Bitmap stating which keys were exchanged (distributed) by the local device. If bonding with LE Secure Connections, the enc bit will be always set. */ - ble_gap_sec_kdist_t kdist_peer; /**< Bitmap stating which keys were exchanged (distributed) by the remote device. If bonding with LE Secure Connections, the enc bit will never be set. */ -} ble_gap_evt_auth_status_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_CONN_SEC_UPDATE. */ -typedef struct -{ - ble_gap_conn_sec_t conn_sec; /**< Connection security level. */ -} ble_gap_evt_conn_sec_update_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_TIMEOUT. */ -typedef struct -{ - uint8_t src; /**< Source of timeout event, see @ref BLE_GAP_TIMEOUT_SOURCES. */ -} ble_gap_evt_timeout_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_RSSI_CHANGED. */ -typedef struct -{ - int8_t rssi; /**< Received Signal Strength Indication in dBm. */ -} ble_gap_evt_rssi_changed_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_ADV_REPORT. */ -typedef struct -{ - ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. If the peer_addr resolved: @ref ble_gap_addr_t::addr_id_peer is set to 1 - and the address is the device's identity address. */ - ble_gap_addr_t direct_addr; /**< Set when the scanner is unable to resolve the private resolvable address of the initiator - field of a directed advertisement packet and the scanner has been enabled to report this in @ref ble_gap_scan_params_t::adv_dir_report. */ - int8_t rssi; /**< Received Signal Strength Indication in dBm. */ - uint8_t scan_rsp : 1; /**< If 1, the report corresponds to a scan response and the type field may be ignored. */ - uint8_t type : 2; /**< See @ref BLE_GAP_ADV_TYPES. Only valid if the scan_rsp field is 0. */ - uint8_t dlen : 5; /**< Advertising or scan response data length. */ - uint8_t data[BLE_GAP_ADV_MAX_SIZE]; /**< Advertising or scan response data. */ -} ble_gap_evt_adv_report_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_SEC_REQUEST. */ -typedef struct -{ - uint8_t bond : 1; /**< Perform bonding. */ - uint8_t mitm : 1; /**< Man In The Middle protection requested. */ - uint8_t lesc : 1; /**< LE Secure Connections requested. */ - uint8_t keypress : 1; /**< Generation of keypress notifications requested. */ -} ble_gap_evt_sec_request_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST. */ -typedef struct -{ - ble_gap_conn_params_t conn_params; /**< GAP Connection Parameters. */ -} ble_gap_evt_conn_param_update_request_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_SCAN_REQ_REPORT. */ -typedef struct -{ - int8_t rssi; /**< Received Signal Strength Indication in dBm. */ - ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. If the peer_addr resolved: @ref ble_gap_addr_t::addr_id_peer is set to 1 - and the address is the device's identity address. */ -} ble_gap_evt_scan_req_report_t; - -/**@brief Event structure for @ref BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST. */ -typedef struct -{ - ble_gap_data_length_params_t peer_params; /**< Peer data length parameters. */ -} ble_gap_evt_data_length_update_request_t; - -/**@brief Event structure for @ref BLE_GAP_EVT_DATA_LENGTH_UPDATE. */ -typedef struct -{ - ble_gap_data_length_params_t effective_params; /**< The effective data length parameters. */ -} ble_gap_evt_data_length_update_t; - - -/**@brief GAP event structure. */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle on which event occurred. */ - union /**< union alternative identified by evt_id in enclosing struct. */ - { - ble_gap_evt_connected_t connected; /**< Connected Event Parameters. */ - ble_gap_evt_disconnected_t disconnected; /**< Disconnected Event Parameters. */ - ble_gap_evt_conn_param_update_t conn_param_update; /**< Connection Parameter Update Parameters. */ - ble_gap_evt_sec_params_request_t sec_params_request; /**< Security Parameters Request Event Parameters. */ - ble_gap_evt_sec_info_request_t sec_info_request; /**< Security Information Request Event Parameters. */ - ble_gap_evt_passkey_display_t passkey_display; /**< Passkey Display Event Parameters. */ - ble_gap_evt_key_pressed_t key_pressed; /**< Key Pressed Event Parameters. */ - ble_gap_evt_auth_key_request_t auth_key_request; /**< Authentication Key Request Event Parameters. */ - ble_gap_evt_lesc_dhkey_request_t lesc_dhkey_request; /**< LE Secure Connections DHKey calculation request. */ - ble_gap_evt_auth_status_t auth_status; /**< Authentication Status Event Parameters. */ - ble_gap_evt_conn_sec_update_t conn_sec_update; /**< Connection Security Update Event Parameters. */ - ble_gap_evt_timeout_t timeout; /**< Timeout Event Parameters. */ - ble_gap_evt_rssi_changed_t rssi_changed; /**< RSSI Event Parameters. */ - ble_gap_evt_adv_report_t adv_report; /**< Advertising Report Event Parameters. */ - ble_gap_evt_sec_request_t sec_request; /**< Security Request Event Parameters. */ - ble_gap_evt_conn_param_update_request_t conn_param_update_request; /**< Connection Parameter Update Parameters. */ - ble_gap_evt_scan_req_report_t scan_req_report; /**< Scan Request Report Parameters. */ - ble_gap_evt_phy_update_request_t phy_update_request; /**< PHY Update Request Event Parameters. */ - ble_gap_evt_phy_update_t phy_update; /**< PHY Update Parameters. */ - ble_gap_evt_data_length_update_request_t data_length_update_request; /**< Data Length Update Request Event Parameters. */ - ble_gap_evt_data_length_update_t data_length_update; /**< Data Length Update Event Parameters. */ - } params; /**< Event Parameters. */ -} ble_gap_evt_t; - - -/** - * @brief BLE GAP connection configuration parameters, set with @ref sd_ble_cfg_set. - * - * @retval ::NRF_ERROR_CONN_COUNT The connection count for the connection configurations is zero. - * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: - * - The sum of conn_count for all connection configurations combined exceeds UINT8_MAX. - * - The event length is smaller than @ref BLE_GAP_EVENT_LENGTH_MIN. - */ -typedef struct -{ - uint8_t conn_count; /**< The number of concurrent connections the application can create with this configuration. - The default and minimum value is @ref BLE_GAP_CONN_COUNT_DEFAULT. */ - uint16_t event_length; /**< The time set aside for this connection on every connection interval in 1.25 ms units. - The default value is @ref BLE_GAP_EVENT_LENGTH_DEFAULT, the minimum value is @ref BLE_GAP_EVENT_LENGTH_MIN. - The event length and the connection interval are the primary parameters - for setting the throughput of a connection. - See the SoftDevice Specification for details on throughput. */ -} ble_gap_conn_cfg_t; - - -/** - * @brief Configuration of maximum concurrent connections in the different connected roles, set with - * @ref sd_ble_cfg_set. - * - * @retval ::NRF_ERROR_CONN_COUNT The sum of periph_role_count and central_role_count is too - * large. The maximum supported sum of concurrent connections is - * @ref BLE_GAP_ROLE_COUNT_COMBINED_MAX. - * @retval ::NRF_ERROR_INVALID_PARAM central_sec_count is larger than central_role_count. - */ -typedef struct -{ - uint8_t periph_role_count; /**< Maximum number of connections concurrently acting as a peripheral. Default value is @ref BLE_GAP_ROLE_COUNT_PERIPH_DEFAULT. */ - uint8_t central_role_count; /**< Maximum number of connections concurrently acting as a central. Default value is @ref BLE_GAP_ROLE_COUNT_CENTRAL_DEFAULT. */ - uint8_t central_sec_count; /**< Number of SMP instances shared between all connections acting as a central. Default value is @ref BLE_GAP_ROLE_COUNT_CENTRAL_SEC_DEFAULT. */ -} ble_gap_cfg_role_count_t; - - -/** - * @brief Device name and its properties, set with @ref sd_ble_cfg_set. - * - * @note If the device name is not configured, the default device name will be @ref - * BLE_GAP_DEVNAME_DEFAULT, the maximum device name length will be @ref - * BLE_GAP_DEVNAME_DEFAULT_LEN, vloc will be set to @ref BLE_GATTS_VLOC_STACK and the device name - * will have no write access. - * - * @note If @ref max_len is more than @ref BLE_GAP_DEVNAME_DEFAULT_LEN and vloc is set to @ref BLE_GATTS_VLOC_STACK, - * the attribute table size must be increased to have room for the longer device name (see - * @ref sd_ble_cfg_set and @ref ble_gatts_cfg_attr_tab_size_t). - * - * @note If vloc is @ref BLE_GATTS_VLOC_STACK : - * - p_value must point to non-volatile memory (flash) or be NULL. - * - If p_value is NULL, the device name will initially be empty. - * - * @note If vloc is @ref BLE_GATTS_VLOC_USER : - * - p_value cannot be NULL. - * - If the device name is writable, p_value must point to volatile memory (RAM). - * - * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: - * - Invalid device name location (vloc). - * - Invalid device name security mode. - * @retval ::NRF_ERROR_INVALID_LENGTH One or more of the following is true: - * - The device name length is invalid (must be between 0 and @ref BLE_GAP_DEVNAME_MAX_LEN). - * - The device name length is too long for the given Attribute Table. - * @retval ::NRF_ERROR_NOT_SUPPORTED Device name security mode is not supported. - */ -typedef struct -{ - ble_gap_conn_sec_mode_t write_perm; /**< Write permissions. */ - uint8_t vloc:2; /**< Value location, see @ref BLE_GATTS_VLOCS.*/ - uint8_t *p_value; /**< Pointer to where the value (device name) is stored or will be stored. */ - uint16_t current_len; /**< Current length in bytes of the memory pointed to by p_value.*/ - uint16_t max_len; /**< Maximum length in bytes of the memory pointed to by p_value.*/ -} ble_gap_cfg_device_name_t; - - -/**@brief Configuration structure for GAP configurations. */ -typedef union -{ - ble_gap_cfg_role_count_t role_count_cfg; /**< Role count configuration, cfg_id is @ref BLE_GAP_CFG_ROLE_COUNT. */ - ble_gap_cfg_device_name_t device_name_cfg; /**< Device name configuration, cfg_id is @ref BLE_GAP_CFG_DEVICE_NAME. */ -} ble_gap_cfg_t; - - -/**@brief Channel Map option. - * Used with @ref sd_ble_opt_get to get the current channel map - * or @ref sd_ble_opt_set to set a new channel map. When setting the - * channel map, it applies to all current and future connections. When getting the - * current channel map, it applies to a single connection and the connection handle - * must be supplied. - * - * @note Setting the channel map may take some time, depending on connection parameters. - * The time taken may be different for each connection and the get operation will - * return the previous channel map until the new one has taken effect. - * - * @note After setting the channel map, by spec it can not be set again until at least 1 s has passed. - * See Bluetooth Specification Version 4.1 Volume 2, Part E, Section 7.3.46. - * - * @retval ::NRF_SUCCESS Get or set successful. - * @retval ::NRF_ERROR_BUSY Channel map was set again before enough time had passed. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied for get. - * @retval ::NRF_ERROR_NOT_SUPPORTED Returned by sd_ble_opt_set in peripheral-only SoftDevices. - * - */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle (only applicable for get) */ - uint8_t ch_map[5]; /**< Channel Map (37-bit). */ -} ble_gap_opt_ch_map_t; - - -/**@brief Local connection latency option. - * - * Local connection latency is a feature which enables the slave to improve - * current consumption by ignoring the slave latency set by the peer. The - * local connection latency can only be set to a multiple of the slave latency, - * and cannot be longer than half of the supervision timeout. - * - * Used with @ref sd_ble_opt_set to set the local connection latency. The - * @ref sd_ble_opt_get is not supported for this option, but the actual - * local connection latency (unless set to NULL) is set as a return parameter - * when setting the option. - * - * @note The latency set will be truncated down to the closest slave latency event - * multiple, or the nearest multiple before half of the supervision timeout. - * - * @note The local connection latency is disabled by default, and needs to be enabled for new - * connections and whenever the connection is updated. - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_NOT_SUPPORTED Get is not supported. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter. - */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle */ - uint16_t requested_latency; /**< Requested local connection latency. */ - uint16_t * p_actual_latency; /**< Pointer to storage for the actual local connection latency (can be set to NULL to skip return value). */ -} ble_gap_opt_local_conn_latency_t; - -/**@brief Disable slave latency - * - * Used with @ref sd_ble_opt_set to temporarily disable slave latency of a peripheral connection (see @ref ble_gap_conn_params_t::slave_latency). And to re-enable it again. - * When disabled, the peripheral will ignore the slave_latency set by the central. - * - * @note Shall only be called on peripheral links. - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_NOT_SUPPORTED Get is not supported. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter. - */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle */ - uint8_t disable : 1; /**< Set to 1 to disable slave latency. Set to 0 enable it again.*/ -} ble_gap_opt_slave_latency_disable_t; - -/**@brief Passkey Option. - * - * Structure containing the passkey to be used during pairing. This can be used with @ref - * sd_ble_opt_set to make the SoftDevice use a preprogrammed passkey for authentication - * instead of generating a random one. - * - * @note Repeated pairing attempts using the same preprogrammed passkey makes pairing vulnerable to MITM attacks. - * - * @note @ref sd_ble_opt_get is not supported for this option. - * - */ -typedef struct -{ - uint8_t const * p_passkey; /**< Pointer to 6-digit ASCII string (digit 0..9 only, no NULL termination) passkey to be used during pairing. If this is NULL, the SoftDevice will generate a random passkey if required.*/ -} ble_gap_opt_passkey_t; - - -/**@brief Scan request report option. - * - * This can be used with @ref sd_ble_opt_set to make the SoftDevice send - * @ref BLE_GAP_EVT_SCAN_REQ_REPORT events. - * - * @note Due to the limited space reserved for scan request report events, - * not all received scan requests will be reported. - * - * @note If whitelisting is used, only whitelisted requests are reported. - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_INVALID_STATE When advertising is ongoing while the option is set. - */ -typedef struct -{ - uint8_t enable : 1; /**< Enable scan request reports. */ -} ble_gap_opt_scan_req_report_t; - -/**@brief Compatibility mode 1 option. - * - * This can be used with @ref sd_ble_opt_set to enable and disable - * compatibility mode 1. Compatibility mode 1 is disabled by default. - * - * @note Compatibility mode 1 enables interoperability with devices that do not support a value of - * 0 for the WinOffset parameter in the Link Layer CONNECT_IND packet. This applies to a - * limited set of legacy peripheral devices from another vendor. Enabling this compatibility - * mode will only have an effect if the local device will act as a central device and - * initiate a connection to a peripheral device. In that case it may lead to the connection - * creation taking up to one connection interval longer to complete for all connections. - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_INVALID_STATE When connection creation is ongoing while mode 1 is set. - */ -typedef struct -{ - uint8_t enable : 1; /**< Enable compatibility mode 1.*/ -} ble_gap_opt_compat_mode_1_t; - -/**@brief Authenticated payload timeout option. - * - * This can be used with @ref sd_ble_opt_set to change the Authenticated payload timeout to a value other - * than the default of @ref BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MAX. - * - * @note The authenticated payload timeout event ::BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD will be generated - * if auth_payload_timeout time has elapsed without receiving a packet with a valid MIC on an encrypted - * link. - * - * @note The LE ping procedure will be initiated before the timer expires to give the peer a chance - * to reset the timer. In addition the stack will try to prioritize running of LE ping over other - * activities to increase chances of finishing LE ping before timer expires. To avoid side-effects - * on other activities, it is recommended to use high timeout values. - * Recommended timeout > 2*(connInterval * (6 + connSlaveLatency)). - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. auth_payload_timeout was outside of allowed range. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter. - */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle */ - uint16_t auth_payload_timeout; /**< Requested timeout in 10 ms unit, see @ref BLE_GAP_AUTH_PAYLOAD_TIMEOUT. */ -} ble_gap_opt_auth_payload_timeout_t; - - -/**@brief Option structure for GAP options. */ -typedef union -{ - ble_gap_opt_ch_map_t ch_map; /**< Parameters for the Channel Map option. */ - ble_gap_opt_local_conn_latency_t local_conn_latency; /**< Parameters for the Local connection latency option */ - ble_gap_opt_passkey_t passkey; /**< Parameters for the Passkey option.*/ - ble_gap_opt_scan_req_report_t scan_req_report; /**< Parameters for the scan request report option.*/ - ble_gap_opt_compat_mode_1_t compat_mode_1; /**< Parameters for the compatibility mode 1 option.*/ - ble_gap_opt_auth_payload_timeout_t auth_payload_timeout; /**< Parameters for the authenticated payload timeout option.*/ - ble_gap_opt_slave_latency_disable_t slave_latency_disable; /**< Parameters for the Disable slave latency option */ -} ble_gap_opt_t; -/**@} */ - - -/**@addtogroup BLE_GAP_FUNCTIONS Functions - * @{ */ - -/**@brief Set the local Bluetooth identity address. - * - * The local Bluetooth identity address is the address that identifies this device to other peers. - * The address type must be either @ref BLE_GAP_ADDR_TYPE_PUBLIC or @ref BLE_GAP_ADDR_TYPE_RANDOM_STATIC. - * - * @note The identity address cannot be changed while advertising, scanning or creating a connection. - * - * @note This address will be distributed to the peer during bonding. - * If the address changes, the address stored in the peer device will not be valid and the ability to - * reconnect using the old address will be lost. - * - * @note By default the SoftDevice will set an address of type @ref BLE_GAP_ADDR_TYPE_RANDOM_STATIC upon being - * enabled. The address is a random number populated during the IC manufacturing process and remains unchanged - * for the lifetime of each IC. - * - * @mscs - * @mmsc{@ref BLE_GAP_ADV_MSC} - * @endmscs - * - * @param[in] p_addr Pointer to address structure. - * - * @retval ::NRF_SUCCESS Address successfully set. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid address. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::NRF_ERROR_INVALID_STATE The identity address cannot be changed while advertising, - * scanning or creating a connection. - */ -SVCALL(SD_BLE_GAP_ADDR_SET, uint32_t, sd_ble_gap_addr_set(ble_gap_addr_t const *p_addr)); - - -/**@brief Get local Bluetooth identity address. - * - * @note This will always return the identity address irrespective of the privacy settings, - * i.e. the address type will always be either @ref BLE_GAP_ADDR_TYPE_PUBLIC or @ref BLE_GAP_ADDR_TYPE_RANDOM_STATIC. - * - * @param[out] p_addr Pointer to address structure to be filled in. - * - * @retval ::NRF_SUCCESS Address successfully retrieved. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid or NULL pointer supplied. - */ -SVCALL(SD_BLE_GAP_ADDR_GET, uint32_t, sd_ble_gap_addr_get(ble_gap_addr_t *p_addr)); - - -/**@brief Set the active whitelist in the SoftDevice. - * - * @note Only one whitelist can be used at a time and the whitelist is shared between the BLE roles. - * The whitelist cannot be set if a BLE role is using the whitelist. - * - * @note If an address is resolved using the information in the device identity list, then the whitelist - * filter policy applies to the peer identity address and not the resolvable address sent on air. - * - * @mscs - * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} - * @mmsc{@ref BLE_GAP_PRIVACY_SCAN_PRIVATE_SCAN_MSC} - * @endmscs - * - * @param[in] pp_wl_addrs Pointer to a whitelist of peer addresses, if NULL the whitelist will be cleared. - * @param[in] len Length of the whitelist, maximum @ref BLE_GAP_WHITELIST_ADDR_MAX_COUNT. - * - * @retval ::NRF_SUCCESS The whitelist is successfully set/cleared. - * @retval ::NRF_ERROR_INVALID_ADDR The whitelist (or one of its entries) provided is invalid. - * @retval ::BLE_ERROR_GAP_WHITELIST_IN_USE The whitelist is in use by a BLE role and cannot be set or cleared. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid address type is supplied. - * @retval ::NRF_ERROR_DATA_SIZE The given whitelist size is invalid (zero or too large); this can only return when - * pp_wl_addrs is not NULL. - */ -SVCALL(SD_BLE_GAP_WHITELIST_SET, uint32_t, sd_ble_gap_whitelist_set(ble_gap_addr_t const * const * pp_wl_addrs, uint8_t len)); - - -/**@brief Set device identity list. - * - * @note Only one device identity list can be used at a time and the list is shared between the BLE roles. - * The device identity list cannot be set if a BLE role is using the list. - * - * @param[in] pp_id_keys Pointer to an array of peer identity addresses and peer IRKs, if NULL the device identity list will be cleared. - * @param[in] pp_local_irks Pointer to an array of local IRKs. Each entry in the array maps to the entry in pp_id_keys at the same index. - * To fill in the list with the currently set device IRK for all peers, set to NULL. - * @param[in] len Length of the device identity list, maximum @ref BLE_GAP_DEVICE_IDENTITIES_MAX_COUNT. - * - * @mscs - * @mmsc{@ref BLE_GAP_PRIVACY_ADV_MSC} - * @mmsc{@ref BLE_GAP_PRIVACY_SCAN_MSC} - * @mmsc{@ref BLE_GAP_PRIVACY_SCAN_PRIVATE_SCAN_MSC} - * @mmsc{@ref BLE_GAP_PRIVACY_ADV_DIR_PRIV_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_CONN_PRIV_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_CONN_PRIV_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS The device identity list successfully set/cleared. - * @retval ::NRF_ERROR_INVALID_ADDR The device identity list (or one of its entries) provided is invalid. - * This code may be returned if the local IRK list also has an invalid entry. - * @retval ::BLE_ERROR_GAP_DEVICE_IDENTITIES_IN_USE The device identity list is in use and cannot be set or cleared. - * @retval ::BLE_ERROR_GAP_DEVICE_IDENTITIES_DUPLICATE The device identity list contains multiple entries with the same identity address. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid address type is supplied. - * @retval ::NRF_ERROR_DATA_SIZE The given device identity list size invalid (zero or too large); this can - * only return when pp_id_keys is not NULL. - */ -SVCALL(SD_BLE_GAP_DEVICE_IDENTITIES_SET, uint32_t, sd_ble_gap_device_identities_set(ble_gap_id_key_t const * const * pp_id_keys, ble_gap_irk_t const * const * pp_local_irks, uint8_t len)); - - -/**@brief Set privacy settings. - * - * @note Privacy settings cannot be changed while advertising, scanning or creating a connection. - * - * @param[in] p_privacy_params Privacy settings. - * - * @mscs - * @mmsc{@ref BLE_GAP_PRIVACY_ADV_MSC} - * @mmsc{@ref BLE_GAP_PRIVACY_SCAN_MSC} - * @mmsc{@ref BLE_GAP_PRIVACY_ADV_DIR_PRIV_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid address type is supplied. - * @retval ::NRF_ERROR_INVALID_ADDR The pointer to privacy settings is NULL or invalid. - * Otherwise, the p_device_irk pointer in privacy parameter is an invalid pointer. - * @retval ::NRF_ERROR_INVALID_PARAM Out of range parameters are provided. - * @retval ::NRF_ERROR_INVALID_STATE Privacy settings cannot be changed while advertising, scanning - * or creating a connection. - */ -SVCALL(SD_BLE_GAP_PRIVACY_SET, uint32_t, sd_ble_gap_privacy_set(ble_gap_privacy_params_t const *p_privacy_params)); - - -/**@brief Get privacy settings. - * - * @note ::ble_gap_privacy_params_t::p_device_irk must be initialized to NULL or a valid address before this function is called. - * If it is initialized to a valid address, the address pointed to will contain the current device IRK on return. - * - * @param[in,out] p_privacy_params Privacy settings. - * - * @retval ::NRF_SUCCESS Privacy settings read. - * @retval ::NRF_ERROR_INVALID_ADDR The pointer given for returning the privacy settings may be NULL or invalid. - * Otherwise, the p_device_irk pointer in privacy parameter is an invalid pointer. - */ -SVCALL(SD_BLE_GAP_PRIVACY_GET, uint32_t, sd_ble_gap_privacy_get(ble_gap_privacy_params_t *p_privacy_params)); - - -/**@brief Set, clear or update advertising and scan response data. - * - * @note The format of the advertising data will be checked by this call to ensure interoperability. - * Limitations imposed by this API call to the data provided include having a flags data type in the scan response data and - * duplicating the local name in the advertising data and scan response data. - * - * @note To clear the advertising data and set it to a 0-length packet, simply provide a valid pointer (p_data/p_sr_data) with its corresponding - * length (dlen/srdlen) set to 0. - * - * @note The call will fail if p_data and p_sr_data are both NULL since this would have no effect. - * - * @mscs - * @mmsc{@ref BLE_GAP_ADV_MSC} - * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} - * @endmscs - * - * @param[in] p_data Raw data to be placed in advertising packet. If NULL, no changes are made to the current advertising packet data. - * @param[in] dlen Data length for p_data. Max size: @ref BLE_GAP_ADV_MAX_SIZE octets. Should be 0 if p_data is NULL, can be 0 if p_data is not NULL. - * @param[in] p_sr_data Raw data to be placed in scan response packet. If NULL, no changes are made to the current scan response packet data. - * @param[in] srdlen Data length for p_sr_data. Max size: @ref BLE_GAP_ADV_MAX_SIZE octets. Should be 0 if p_sr_data is NULL, can be 0 if p_data is not NULL. - * - * @retval ::NRF_SUCCESS Advertising data successfully updated or cleared. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, both p_data and p_sr_data cannot be NULL. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_FLAGS Invalid combination of advertising flags supplied. - * @retval ::NRF_ERROR_INVALID_DATA Invalid data type(s) supplied, check the advertising data format specification. - * @retval ::NRF_ERROR_INVALID_LENGTH Invalid data length(s) supplied. - * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported data type. - * @retval ::BLE_ERROR_GAP_UUID_LIST_MISMATCH Invalid UUID list supplied. - */ -SVCALL(SD_BLE_GAP_ADV_DATA_SET, uint32_t, sd_ble_gap_adv_data_set(uint8_t const *p_data, uint8_t dlen, uint8_t const *p_sr_data, uint8_t srdlen)); - - -/**@brief Start advertising (GAP Discoverable, Connectable modes, Broadcast Procedure). - * - * @note Only one advertiser may be active at any time. - * - * @events - * @event{@ref BLE_GAP_EVT_CONNECTED, Generated after connection has been established through connectable advertising.} - * @event{@ref BLE_GAP_EVT_TIMEOUT, Advertisement has timed out.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_ADV_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_CONN_PRIV_MSC} - * @mmsc{@ref BLE_GAP_PRIVACY_ADV_DIR_PRIV_MSC} - * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} - * @endmscs - * - * @param[in] p_adv_params Pointer to advertising parameters structure. - * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or @ref - * BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. If - * @ref ble_gap_adv_params_t::type is @ref BLE_GAP_ADV_TYPE_ADV_NONCONN_IND, - * this is ignored. - * - * @retval ::NRF_SUCCESS The BLE stack has started advertising. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_CONN_COUNT The limit of available connections has been reached; connectable advertiser cannot be started. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check the accepted ranges and limits. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid Bluetooth address supplied. - * @retval ::BLE_ERROR_GAP_DISCOVERABLE_WITH_WHITELIST Discoverable mode and whitelist incompatible. - * @retval ::NRF_ERROR_RESOURCES Not enough BLE role slots available. - * Stop one or more currently active roles (Central, Peripheral or Observer) and try again - */ -SVCALL(SD_BLE_GAP_ADV_START, uint32_t, sd_ble_gap_adv_start(ble_gap_adv_params_t const *p_adv_params, uint8_t conn_cfg_tag)); - - -/**@brief Stop advertising (GAP Discoverable, Connectable modes, Broadcast Procedure). - * - * @mscs - * @mmsc{@ref BLE_GAP_ADV_MSC} - * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS The BLE stack has stopped advertising. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation (most probably not in advertising state). - */ -SVCALL(SD_BLE_GAP_ADV_STOP, uint32_t, sd_ble_gap_adv_stop(void)); - - - -/**@brief Update connection parameters. - * - * @details In the central role this will initiate a Link Layer connection parameter update procedure, - * otherwise in the peripheral role, this will send the corresponding L2CAP request and wait for - * the central to perform the procedure. In both cases, and regardless of success or failure, the application - * will be informed of the result with a @ref BLE_GAP_EVT_CONN_PARAM_UPDATE event. - * - * @details This function can be used as a central both to reply to a @ref BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST or to start the procedure unrequested. - * - * @events - * @event{@ref BLE_GAP_EVT_CONN_PARAM_UPDATE, Result of the connection parameter update procedure.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_CPU_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_ENC_AUTH_MUTEX_MSC} - * @mmsc{@ref BLE_GAP_MULTILINK_CPU_MSC} - * @mmsc{@ref BLE_GAP_MULTILINK_CTRL_PROC_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_CPU_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_conn_params Pointer to desired connection parameters. If NULL is provided on a peripheral role, - * the parameters in the PPCP characteristic of the GAP service will be used instead. - * If NULL is provided on a central role and in response to a @ref BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST, the peripheral request will be rejected - * - * @retval ::NRF_SUCCESS The Connection Update procedure has been started successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check parameter limits and constraints. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_BUSY Procedure already in progress, wait for pending procedures to complete and retry. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. - */ -SVCALL(SD_BLE_GAP_CONN_PARAM_UPDATE, uint32_t, sd_ble_gap_conn_param_update(uint16_t conn_handle, ble_gap_conn_params_t const *p_conn_params)); - - -/**@brief Disconnect (GAP Link Termination). - * - * @details This call initiates the disconnection procedure, and its completion will be communicated to the application - * with a @ref BLE_GAP_EVT_DISCONNECTED event. - * - * @events - * @event{@ref BLE_GAP_EVT_DISCONNECTED, Generated when disconnection procedure is complete.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_CONN_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] hci_status_code HCI status code, see @ref BLE_HCI_STATUS_CODES (accepted values are @ref BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION and @ref BLE_HCI_CONN_INTERVAL_UNACCEPTABLE). - * - * @retval ::NRF_SUCCESS The disconnection procedure has been started successfully. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation (disconnection is already in progress). - */ -SVCALL(SD_BLE_GAP_DISCONNECT, uint32_t, sd_ble_gap_disconnect(uint16_t conn_handle, uint8_t hci_status_code)); - - -/**@brief Set the radio's transmit power. - * - * @param[in] tx_power Radio transmit power in dBm (accepted values are -40, -20, -16, -12, -8, -4, 0, 3, and 4 dBm). - * - * @retval ::NRF_SUCCESS Successfully changed the transmit power. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - */ -SVCALL(SD_BLE_GAP_TX_POWER_SET, uint32_t, sd_ble_gap_tx_power_set(int8_t tx_power)); - - -/**@brief Set GAP Appearance value. - * - * @param[in] appearance Appearance (16-bit), see @ref BLE_APPEARANCES. - * - * @retval ::NRF_SUCCESS Appearance value set successfully. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - */ -SVCALL(SD_BLE_GAP_APPEARANCE_SET, uint32_t, sd_ble_gap_appearance_set(uint16_t appearance)); - - -/**@brief Get GAP Appearance value. - * - * @param[out] p_appearance Pointer to appearance (16-bit) to be filled in, see @ref BLE_APPEARANCES. - * - * @retval ::NRF_SUCCESS Appearance value retrieved successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - */ -SVCALL(SD_BLE_GAP_APPEARANCE_GET, uint32_t, sd_ble_gap_appearance_get(uint16_t *p_appearance)); - - -/**@brief Set GAP Peripheral Preferred Connection Parameters. - * - * @param[in] p_conn_params Pointer to a @ref ble_gap_conn_params_t structure with the desired parameters. - * - * @retval ::NRF_SUCCESS Peripheral Preferred Connection Parameters set successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - */ -SVCALL(SD_BLE_GAP_PPCP_SET, uint32_t, sd_ble_gap_ppcp_set(ble_gap_conn_params_t const *p_conn_params)); - - -/**@brief Get GAP Peripheral Preferred Connection Parameters. - * - * @param[out] p_conn_params Pointer to a @ref ble_gap_conn_params_t structure where the parameters will be stored. - * - * @retval ::NRF_SUCCESS Peripheral Preferred Connection Parameters retrieved successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - */ -SVCALL(SD_BLE_GAP_PPCP_GET, uint32_t, sd_ble_gap_ppcp_get(ble_gap_conn_params_t *p_conn_params)); - - -/**@brief Set GAP device name. - * - * @note If the device name is located in application flash memory (see @ref ble_gap_cfg_device_name_t), - * it cannot be changed. Then @ref NRF_ERROR_FORBIDDEN will be returned. - * - * @param[in] p_write_perm Write permissions for the Device Name characteristic, see @ref ble_gap_conn_sec_mode_t. - * @param[in] p_dev_name Pointer to a UTF-8 encoded, <b>non NULL-terminated</b> string. - * @param[in] len Length of the UTF-8, <b>non NULL-terminated</b> string pointed to by p_dev_name in octets (must be smaller or equal than @ref BLE_GAP_DEVNAME_MAX_LEN). - * - * @retval ::NRF_SUCCESS GAP device name and permissions set successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied. - * @retval ::NRF_ERROR_FORBIDDEN Device name is not writable. - */ -SVCALL(SD_BLE_GAP_DEVICE_NAME_SET, uint32_t, sd_ble_gap_device_name_set(ble_gap_conn_sec_mode_t const *p_write_perm, uint8_t const *p_dev_name, uint16_t len)); - - -/**@brief Get GAP device name. - * - * @note If the device name is longer than the size of the supplied buffer, - * p_len will return the complete device name length, - * and not the number of bytes actually returned in p_dev_name. - * The application may use this information to allocate a suitable buffer size. - * - * @param[out] p_dev_name Pointer to an empty buffer where the UTF-8 <b>non NULL-terminated</b> string will be placed. Set to NULL to obtain the complete device name length. - * @param[in,out] p_len Length of the buffer pointed by p_dev_name, complete device name length on output. - * - * @retval ::NRF_SUCCESS GAP device name retrieved successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied. - */ -SVCALL(SD_BLE_GAP_DEVICE_NAME_GET, uint32_t, sd_ble_gap_device_name_get(uint8_t *p_dev_name, uint16_t *p_len)); - - -/**@brief Initiate the GAP Authentication procedure. - * - * @details In the central role, this function will send an SMP Pairing Request (or an SMP Pairing Failed if rejected), - * otherwise in the peripheral role, an SMP Security Request will be sent. - * - * @events - * @event{Depending on the security parameters set and the packet exchanges with the peer\, the following events may be generated:} - * @event{@ref BLE_GAP_EVT_SEC_PARAMS_REQUEST} - * @event{@ref BLE_GAP_EVT_SEC_INFO_REQUEST} - * @event{@ref BLE_GAP_EVT_PASSKEY_DISPLAY} - * @event{@ref BLE_GAP_EVT_KEY_PRESSED} - * @event{@ref BLE_GAP_EVT_AUTH_KEY_REQUEST} - * @event{@ref BLE_GAP_EVT_LESC_DHKEY_REQUEST} - * @event{@ref BLE_GAP_EVT_CONN_SEC_UPDATE} - * @event{@ref BLE_GAP_EVT_AUTH_STATUS} - * @event{@ref BLE_GAP_EVT_TIMEOUT} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_SEC_REQ_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_SEC_REQ_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_ENC_AUTH_MUTEX_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_JW_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_PK_PERIPH_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_PK_PERIPH_OOB_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_NC_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_PD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_sec_params Pointer to the @ref ble_gap_sec_params_t structure with the security parameters to be used during the pairing or bonding procedure. - * In the peripheral role, only the bond, mitm, lesc and keypress fields of this structure are used. - * In the central role, this pointer may be NULL to reject a Security Request. - * - * @retval ::NRF_SUCCESS Successfully initiated authentication procedure. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_NO_MEM The maximum number of authentication procedures that can run in parallel for the given role is reached. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_NOT_SUPPORTED Setting of sign or link fields in @ref ble_gap_sec_kdist_t not supported. - * @retval ::NRF_ERROR_TIMEOUT A SMP timeout has occurred, and further SMP operations on this link is prohibited. - */ -SVCALL(SD_BLE_GAP_AUTHENTICATE, uint32_t, sd_ble_gap_authenticate(uint16_t conn_handle, ble_gap_sec_params_t const *p_sec_params)); - - -/**@brief Reply with GAP security parameters. - * - * @details This function is only used to reply to a @ref BLE_GAP_EVT_SEC_PARAMS_REQUEST, calling it at other times will result in an @ref NRF_ERROR_INVALID_STATE. - * @note If the call returns an error code, the request is still pending, and the reply call may be repeated with corrected parameters. - * - * @events - * @event{This function is used during authentication procedures\, see the list of events in the documentation of @ref sd_ble_gap_authenticate.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_BONDING_JW_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_BONDING_PK_PERIPH_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_BONDING_PK_CENTRAL_OOB_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_BONDING_STATIC_PK_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_CONFIRM_FAIL_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_NC_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_PD_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_OOB_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_KS_TOO_SMALL_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_APP_ERROR_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_REMOTE_PAIRING_FAIL_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_TIMEOUT_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_JW_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_PK_PERIPH_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_PK_PERIPH_OOB_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_NC_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_PD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] sec_status Security status, see @ref BLE_GAP_SEC_STATUS. - * @param[in] p_sec_params Pointer to a @ref ble_gap_sec_params_t security parameters structure. In the central role this must be set to NULL, as the parameters have - * already been provided during a previous call to @ref sd_ble_gap_authenticate. - * @param[in,out] p_sec_keyset Pointer to a @ref ble_gap_sec_keyset_t security keyset structure. Any keys generated and/or distributed as a result of the ongoing security procedure - * will be stored into the memory referenced by the pointers inside this structure. The keys will be stored and available to the application - * upon reception of a @ref BLE_GAP_EVT_AUTH_STATUS event. - * Note that the SoftDevice expects the application to provide memory for storing the - * peer's keys. So it must be ensured that the relevant pointers inside this structure are not NULL. The pointers to the local key - * can, however, be NULL, in which case, the local key data will not be available to the application upon reception of the - * @ref BLE_GAP_EVT_AUTH_STATUS event. - * - * @retval ::NRF_SUCCESS Successfully accepted security parameter from the application. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_NOT_SUPPORTED Setting of sign or link fields in @ref ble_gap_sec_kdist_t not supported. - */ -SVCALL(SD_BLE_GAP_SEC_PARAMS_REPLY, uint32_t, sd_ble_gap_sec_params_reply(uint16_t conn_handle, uint8_t sec_status, ble_gap_sec_params_t const *p_sec_params, ble_gap_sec_keyset_t const *p_sec_keyset)); - - -/**@brief Reply with an authentication key. - * - * @details This function is only used to reply to a @ref BLE_GAP_EVT_AUTH_KEY_REQUEST or a @ref BLE_GAP_EVT_PASSKEY_DISPLAY, calling it at other times will result in an @ref NRF_ERROR_INVALID_STATE. - * @note If the call returns an error code, the request is still pending, and the reply call may be repeated with corrected parameters. - * - * @events - * @event{This function is used during authentication procedures\, see the list of events in the documentation of @ref sd_ble_gap_authenticate.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_BONDING_PK_CENTRAL_OOB_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_NC_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_PK_PERIPH_OOB_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_NC_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] key_type See @ref BLE_GAP_AUTH_KEY_TYPES. - * @param[in] p_key If key type is @ref BLE_GAP_AUTH_KEY_TYPE_NONE, then NULL. - * If key type is @ref BLE_GAP_AUTH_KEY_TYPE_PASSKEY, then a 6-byte ASCII string (digit 0..9 only, no NULL termination) - * or NULL when confirming LE Secure Connections Numeric Comparison. - * If key type is @ref BLE_GAP_AUTH_KEY_TYPE_OOB, then a 16-byte OOB key value in little-endian format. - * - * @retval ::NRF_SUCCESS Authentication key successfully set. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_AUTH_KEY_REPLY, uint32_t, sd_ble_gap_auth_key_reply(uint16_t conn_handle, uint8_t key_type, uint8_t const *p_key)); - -/**@brief Reply with an LE Secure connections DHKey. - * - * @details This function is only used to reply to a @ref BLE_GAP_EVT_LESC_DHKEY_REQUEST, calling it at other times will result in an @ref NRF_ERROR_INVALID_STATE. - * @note If the call returns an error code, the request is still pending, and the reply call may be repeated with corrected parameters. - * - * @events - * @event{This function is used during authentication procedures\, see the list of events in the documentation of @ref sd_ble_gap_authenticate.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_LESC_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_NC_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_PD_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_OOB_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_NC_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_PD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_dhkey LE Secure Connections DHKey. - * - * @retval ::NRF_SUCCESS DHKey successfully set. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_LESC_DHKEY_REPLY, uint32_t, sd_ble_gap_lesc_dhkey_reply(uint16_t conn_handle, ble_gap_lesc_dhkey_t const *p_dhkey)); - -/**@brief Notify the peer of a local keypress. - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] kp_not See @ref BLE_GAP_KP_NOT_TYPES. - * - * @retval ::NRF_SUCCESS Keypress notification successfully queued for transmission. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either not entering a passkey or keypresses have not been enabled by both peers. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_BUSY The BLE stack is busy. Retry at later time. - */ -SVCALL(SD_BLE_GAP_KEYPRESS_NOTIFY, uint32_t, sd_ble_gap_keypress_notify(uint16_t conn_handle, uint8_t kp_not)); - -/**@brief Generate a set of OOB data to send to a peer out of band. - * - * @note The @ref ble_gap_addr_t included in the OOB data returned will be the currently active one (or, if a connection has already been established, - * the one used during connection setup). The application may manually overwrite it with an updated value. - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_OOB_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. Can be BLE_CONN_HANDLE_INVALID if a BLE connection has not been established yet. - * @param[in] p_pk_own LE Secure Connections local P-256 Public Key. - * @param[out] p_oobd_own The OOB data to be sent out of band to a peer. - * - * @retval ::NRF_SUCCESS OOB data successfully generated. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_LESC_OOB_DATA_GET, uint32_t, sd_ble_gap_lesc_oob_data_get(uint16_t conn_handle, ble_gap_lesc_p256_pk_t const *p_pk_own, ble_gap_lesc_oob_data_t *p_oobd_own)); - -/**@brief Provide the OOB data sent/received out of band. - * - * @note An authentication procedure with OOB selected as an algorithm must be in progress when calling this function. - * @note A @ref BLE_GAP_EVT_LESC_DHKEY_REQUEST event with the oobd_req set to 1 must have been received prior to calling this function. - * - * @events - * @event{This function is used during authentication procedures\, see the list of events in the documentation of @ref sd_ble_gap_authenticate.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_OOB_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_oobd_own The OOB data sent out of band to a peer or NULL if the peer has not received OOB data. - * Must correspond to @ref ble_gap_sec_params_t::oob flag in @ref BLE_GAP_EVT_SEC_PARAMS_REQUEST. - * @param[in] p_oobd_peer The OOB data received out of band from a peer or NULL if none received. - * Must correspond to @ref ble_gap_sec_params_t::oob flag in @ref sd_ble_gap_authenticate in the central role - * or @ref sd_ble_gap_sec_params_reply in the peripheral role. - * - * @retval ::NRF_SUCCESS OOB data accepted. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_LESC_OOB_DATA_SET, uint32_t, sd_ble_gap_lesc_oob_data_set(uint16_t conn_handle, ble_gap_lesc_oob_data_t const *p_oobd_own, ble_gap_lesc_oob_data_t const *p_oobd_peer)); - -/**@brief Initiate GAP Encryption procedure. - * - * @details In the central role, this function will initiate the encryption procedure using the encryption information provided. - * - * @events - * @event{@ref BLE_GAP_EVT_CONN_SEC_UPDATE, The connection security has been updated.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_CENTRAL_ENC_AUTH_MUTEX_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_ENC_MSC} - * @mmsc{@ref BLE_GAP_MULTILINK_CTRL_PROC_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_SEC_REQ_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_master_id Pointer to a @ref ble_gap_master_id_t master identification structure. - * @param[in] p_enc_info Pointer to a @ref ble_gap_enc_info_t encryption information structure. - * - * @retval ::NRF_SUCCESS Successfully initiated authentication procedure. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::BLE_ERROR_INVALID_ROLE Operation is not supported in the Peripheral role. - * @retval ::NRF_ERROR_BUSY Procedure already in progress or not allowed at this time, wait for pending procedures to complete and retry. - */ -SVCALL(SD_BLE_GAP_ENCRYPT, uint32_t, sd_ble_gap_encrypt(uint16_t conn_handle, ble_gap_master_id_t const *p_master_id, ble_gap_enc_info_t const *p_enc_info)); - - -/**@brief Reply with GAP security information. - * - * @details This function is only used to reply to a @ref BLE_GAP_EVT_SEC_INFO_REQUEST, calling it at other times will result in @ref NRF_ERROR_INVALID_STATE. - * @note If the call returns an error code, the request is still pending, and the reply call may be repeated with corrected parameters. - * @note Data signing is not yet supported, and p_sign_info must therefore be NULL. - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_ENC_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_enc_info Pointer to a @ref ble_gap_enc_info_t encryption information structure. May be NULL to signal none is available. - * @param[in] p_id_info Pointer to a @ref ble_gap_irk_t identity information structure. May be NULL to signal none is available. - * @param[in] p_sign_info Pointer to a @ref ble_gap_sign_info_t signing information structure. May be NULL to signal none is available. - * - * @retval ::NRF_SUCCESS Successfully accepted security information. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_SEC_INFO_REPLY, uint32_t, sd_ble_gap_sec_info_reply(uint16_t conn_handle, ble_gap_enc_info_t const *p_enc_info, ble_gap_irk_t const *p_id_info, ble_gap_sign_info_t const *p_sign_info)); - - -/**@brief Get the current connection security. - * - * @param[in] conn_handle Connection handle. - * @param[out] p_conn_sec Pointer to a @ref ble_gap_conn_sec_t structure to be filled in. - * - * @retval ::NRF_SUCCESS Current connection security successfully retrieved. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_CONN_SEC_GET, uint32_t, sd_ble_gap_conn_sec_get(uint16_t conn_handle, ble_gap_conn_sec_t *p_conn_sec)); - - -/**@brief Start reporting the received signal strength to the application. - * - * A new event is reported whenever the RSSI value changes, until @ref sd_ble_gap_rssi_stop is called. - * - * @events - * @event{@ref BLE_GAP_EVT_RSSI_CHANGED, New RSSI data available. How often the event is generated is - * dependent on the settings of the <code>threshold_dbm</code> - * and <code>skip_count</code> input parameters.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_CENTRAL_RSSI_READ_MSC} - * @mmsc{@ref BLE_GAP_RSSI_FILT_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] threshold_dbm Minimum change in dBm before triggering the @ref BLE_GAP_EVT_RSSI_CHANGED event. Events are disabled if threshold_dbm equals @ref BLE_GAP_RSSI_THRESHOLD_INVALID. - * @param[in] skip_count Number of RSSI samples with a change of threshold_dbm or more before sending a new @ref BLE_GAP_EVT_RSSI_CHANGED event. - * - * @retval ::NRF_SUCCESS Successfully activated RSSI reporting. - * @retval ::NRF_ERROR_INVALID_STATE Disconnection in progress. Invalid state to perform operation. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_RSSI_START, uint32_t, sd_ble_gap_rssi_start(uint16_t conn_handle, uint8_t threshold_dbm, uint8_t skip_count)); - - -/**@brief Stop reporting the received signal strength. - * - * @note An RSSI change detected before the call but not yet received by the application - * may be reported after @ref sd_ble_gap_rssi_stop has been called. - * - * @mscs - * @mmsc{@ref BLE_GAP_CENTRAL_RSSI_READ_MSC} - * @mmsc{@ref BLE_GAP_RSSI_FILT_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * - * @retval ::NRF_SUCCESS Successfully deactivated RSSI reporting. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_RSSI_STOP, uint32_t, sd_ble_gap_rssi_stop(uint16_t conn_handle)); - - -/**@brief Get the received signal strength for the last connection event. - * - * @ref sd_ble_gap_rssi_start must be called to start reporting RSSI before using this function. @ref NRF_ERROR_NOT_FOUND - * will be returned until RSSI was sampled for the first time after calling @ref sd_ble_gap_rssi_start. - * - * @mscs - * @mmsc{@ref BLE_GAP_CENTRAL_RSSI_READ_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[out] p_rssi Pointer to the location where the RSSI measurement shall be stored. - * - * @retval ::NRF_SUCCESS Successfully read the RSSI. - * @retval ::NRF_ERROR_NOT_FOUND No sample is available. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is not ongoing, or disconnection in progress. - */ -SVCALL(SD_BLE_GAP_RSSI_GET, uint32_t, sd_ble_gap_rssi_get(uint16_t conn_handle, int8_t *p_rssi)); - - -/**@brief Start scanning (GAP Discovery procedure, Observer Procedure). - * - * @events - * @event{@ref BLE_GAP_EVT_ADV_REPORT, An advertising or scan response packet has been received.} - * @event{@ref BLE_GAP_EVT_TIMEOUT, Scanner has timed out.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_SCAN_MSC} - * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} - * @endmscs - * - * @param[in] p_scan_params Pointer to scan parameters structure. - * - * @retval ::NRF_SUCCESS Successfully initiated scanning procedure. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_RESOURCES Not enough BLE role slots available. - * Stop one or more currently active roles (Central, Peripheral or Broadcaster) and try again - */ -SVCALL(SD_BLE_GAP_SCAN_START, uint32_t, sd_ble_gap_scan_start(ble_gap_scan_params_t const *p_scan_params)); - - -/**@brief Stop scanning (GAP Discovery procedure, Observer Procedure). - * - * @mscs - * @mmsc{@ref BLE_GAP_SCAN_MSC} - * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS Successfully stopped scanning procedure. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation (most probably not in scanning state). - */ -SVCALL(SD_BLE_GAP_SCAN_STOP, uint32_t, sd_ble_gap_scan_stop(void)); - - -/**@brief Create a connection (GAP Link Establishment). - * - * @note If a scanning procedure is currently in progress it will be automatically stopped when calling this function. - * The scanning procedure will be stopped even if the function returns an error. - * - * @mscs - * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_CONN_PRIV_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_CONN_MSC} - * @endmscs - * - * @param[in] p_peer_addr Pointer to peer address. If the use_whitelist bit is set in @ref ble_gap_scan_params_t, then this is ignored. - * @param[in] p_scan_params Pointer to scan parameters structure. - * @param[in] p_conn_params Pointer to desired connection parameters. - * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or @ref - * BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. - * - * @retval ::NRF_SUCCESS Successfully initiated connection procedure. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid parameter(s) pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * - Invalid parameter(s) in p_scan_params or p_conn_params. - * - Use of whitelist requested but whitelist has not been set, see @ref sd_ble_gap_whitelist_set. - * - Peer address was not present in the device identity list, see @ref sd_ble_gap_device_identities_set. - * @retval ::NRF_ERROR_INVALID_STATE The SoftDevice is in an invalid state to perform this operation. This may be due to an - * existing locally initiated connect procedure, which must complete before initiating again. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid Peer address. - * @retval ::NRF_ERROR_CONN_COUNT The limit of available connections has been reached. - * @retval ::NRF_ERROR_RESOURCES Not enough BLE role slots available. - * Stop one or more currently active roles (Central, Peripheral or Broadcaster) and try again - */ -SVCALL(SD_BLE_GAP_CONNECT, uint32_t, sd_ble_gap_connect(ble_gap_addr_t const *p_peer_addr, ble_gap_scan_params_t const *p_scan_params, ble_gap_conn_params_t const *p_conn_params, uint8_t conn_cfg_tag)); - - -/**@brief Cancel a connection establishment. - * - * @mscs - * @mmsc{@ref BLE_GAP_CENTRAL_CONN_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS Successfully canceled an ongoing connection procedure. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - */ -SVCALL(SD_BLE_GAP_CONNECT_CANCEL, uint32_t, sd_ble_gap_connect_cancel(void)); - - -/**@brief Initiate or respond to a PHY Update Procedure - * - * @details This function is used to initiate or respond to a PHY Update Procedure. It will always generate a - * @ref BLE_GAP_EVT_PHY_UPDATE event if successfully executed. If @ref ble_gap_phys_t::tx_phys or @ref ble_gap_phys_t::rx_phys - * is @ref BLE_GAP_PHY_AUTO, then the stack will select a PHY for the respective direction based on the peer's PHY preferences - * and the local stack configuration. If the peer does not support the PHY Update Procedure, then the - * resulting @ref BLE_GAP_EVT_PHY_UPDATE event will have a status set to - * @ref BLE_HCI_UNSUPPORTED_REMOTE_FEATURE. - * If the PHY procedure was rejected by the peer due to a procedure collision, the status will be - * @ref BLE_HCI_STATUS_CODE_LMP_ERROR_TRANSACTION_COLLISION or @ref BLE_HCI_DIFFERENT_TRANSACTION_COLLISION. - * If the peer responds to the PHY Update procedure with invalid parameters, the status will be @ref BLE_HCI_STATUS_CODE_INVALID_LMP_PARAMETERS. - * If the PHY procedure was rejected by the peer for a different reason, the status will contain the reason as specified by the peer. - * - * @events - * @event{@ref BLE_GAP_EVT_PHY_UPDATE, Result of the PHY Update Procedure.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_CENTRAL_PHY_UPDATE} - * @mmsc{@ref BLE_GAP_PERIPHERAL_PHY_UPDATE} - * @endmscs - * - * @param[in] conn_handle Connection handle to indicate the connection for which the PHY Update is requested. - * @param[in] p_gap_phys Pointer to PHY structure. - * - * @retval ::NRF_SUCCESS Successfully requested a PHY Update. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Unsupported PHYs supplied to the call. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_BUSY Procedure is already in progress or not allowed at this time. Process pending events and wait for the pending procedure to complete and retry. - * - */ -SVCALL(SD_BLE_GAP_PHY_UPDATE, uint32_t, sd_ble_gap_phy_update(uint16_t conn_handle, ble_gap_phys_t const *p_gap_phys)); - -/**@brief Initiate or respond to a Data Length Update Procedure. - * - * @note Only symmetric input parameters for the Data Length Update is supported. Only @ref - * BLE_GAP_DATA_LENGTH_AUTO for max_tx_time_us and max_rx_time_us is supported. - * - * @note If the application uses @ref BLE_GAP_DATA_LENGTH_AUTO for one or more members of - * p_dl_params, the SoftDevice will choose the highest value supported in current - * configuration and connection parameters. - * - * @param[in] conn_handle Connection handle. - * @param[in] p_dl_params Pointer to local parameters to be used in Data Length Update - * Procedure. Set any member to @ref BLE_GAP_DATA_LENGTH_AUTO to let - * the SoftDevice automatically decide the value for that member. - * Set to NULL to use automatic values for all members. - * @param[out] p_dl_limitation Pointer to limitation to be written when local device does not - * have enough resources to accommodate the requested Data Length - * Update parameters. Ignored if NULL. - * - * @mscs - * @mmsc{@ref BLE_GAP_DATA_LENGTH_UPDATE_PROCEDURE_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS Successfully set Data Length Extension initiation/response parameters. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameters supplied. - * @retval ::NRF_ERROR_NOT_SUPPORTED The requested parameters are not supported by the SoftDevice. - * @retval ::NRF_ERROR_RESOURCES The requested parameters can not be accommodated. Inspect - * p_dl_limitation so see where the limitation is. - * @retval ::NRF_ERROR_BUSY Peer has already initiated a Data Length Update Procedure. Process the - * pending @ref BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST event to respond. - */ -SVCALL(SD_BLE_GAP_DATA_LENGTH_UPDATE, uint32_t, sd_ble_gap_data_length_update(uint16_t conn_handle, ble_gap_data_length_params_t const *p_dl_params, ble_gap_data_length_limitation_t *p_dl_limitation)); - - - -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif // BLE_GAP_H__ - -/** - @} -*/ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_gatt.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_gatt.h deleted file mode 100644 index 4e054cf5c..000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_gatt.h +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright (c) 2013 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup BLE_GATT Generic Attribute Profile (GATT) Common - @{ - @brief Common definitions and prototypes for the GATT interfaces. - */ - -#ifndef BLE_GATT_H__ -#define BLE_GATT_H__ - -#include "ble_types.h" -#include "ble_ranges.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup BLE_GATT_DEFINES Defines - * @{ */ - -/** @brief Default ATT MTU, in bytes. */ -#define BLE_GATT_ATT_MTU_DEFAULT 23 - -/**@brief Invalid Attribute Handle. */ -#define BLE_GATT_HANDLE_INVALID 0x0000 - -/**@brief First Attribute Handle. */ -#define BLE_GATT_HANDLE_START 0x0001 - -/**@brief Last Attribute Handle. */ -#define BLE_GATT_HANDLE_END 0xFFFF - -/** @defgroup BLE_GATT_TIMEOUT_SOURCES GATT Timeout sources - * @{ */ -#define BLE_GATT_TIMEOUT_SRC_PROTOCOL 0x00 /**< ATT Protocol timeout. */ -/** @} */ - -/** @defgroup BLE_GATT_WRITE_OPS GATT Write operations - * @{ */ -#define BLE_GATT_OP_INVALID 0x00 /**< Invalid Operation. */ -#define BLE_GATT_OP_WRITE_REQ 0x01 /**< Write Request. */ -#define BLE_GATT_OP_WRITE_CMD 0x02 /**< Write Command. */ -#define BLE_GATT_OP_SIGN_WRITE_CMD 0x03 /**< Signed Write Command. */ -#define BLE_GATT_OP_PREP_WRITE_REQ 0x04 /**< Prepare Write Request. */ -#define BLE_GATT_OP_EXEC_WRITE_REQ 0x05 /**< Execute Write Request. */ -/** @} */ - -/** @defgroup BLE_GATT_EXEC_WRITE_FLAGS GATT Execute Write flags - * @{ */ -#define BLE_GATT_EXEC_WRITE_FLAG_PREPARED_CANCEL 0x00 /**< Cancel prepared write. */ -#define BLE_GATT_EXEC_WRITE_FLAG_PREPARED_WRITE 0x01 /**< Execute prepared write. */ -/** @} */ - -/** @defgroup BLE_GATT_HVX_TYPES GATT Handle Value operations - * @{ */ -#define BLE_GATT_HVX_INVALID 0x00 /**< Invalid Operation. */ -#define BLE_GATT_HVX_NOTIFICATION 0x01 /**< Handle Value Notification. */ -#define BLE_GATT_HVX_INDICATION 0x02 /**< Handle Value Indication. */ -/** @} */ - -/** @defgroup BLE_GATT_STATUS_CODES GATT Status Codes - * @{ */ -#define BLE_GATT_STATUS_SUCCESS 0x0000 /**< Success. */ -#define BLE_GATT_STATUS_UNKNOWN 0x0001 /**< Unknown or not applicable status. */ -#define BLE_GATT_STATUS_ATTERR_INVALID 0x0100 /**< ATT Error: Invalid Error Code. */ -#define BLE_GATT_STATUS_ATTERR_INVALID_HANDLE 0x0101 /**< ATT Error: Invalid Attribute Handle. */ -#define BLE_GATT_STATUS_ATTERR_READ_NOT_PERMITTED 0x0102 /**< ATT Error: Read not permitted. */ -#define BLE_GATT_STATUS_ATTERR_WRITE_NOT_PERMITTED 0x0103 /**< ATT Error: Write not permitted. */ -#define BLE_GATT_STATUS_ATTERR_INVALID_PDU 0x0104 /**< ATT Error: Used in ATT as Invalid PDU. */ -#define BLE_GATT_STATUS_ATTERR_INSUF_AUTHENTICATION 0x0105 /**< ATT Error: Authenticated link required. */ -#define BLE_GATT_STATUS_ATTERR_REQUEST_NOT_SUPPORTED 0x0106 /**< ATT Error: Used in ATT as Request Not Supported. */ -#define BLE_GATT_STATUS_ATTERR_INVALID_OFFSET 0x0107 /**< ATT Error: Offset specified was past the end of the attribute. */ -#define BLE_GATT_STATUS_ATTERR_INSUF_AUTHORIZATION 0x0108 /**< ATT Error: Used in ATT as Insufficient Authorization. */ -#define BLE_GATT_STATUS_ATTERR_PREPARE_QUEUE_FULL 0x0109 /**< ATT Error: Used in ATT as Prepare Queue Full. */ -#define BLE_GATT_STATUS_ATTERR_ATTRIBUTE_NOT_FOUND 0x010A /**< ATT Error: Used in ATT as Attribute not found. */ -#define BLE_GATT_STATUS_ATTERR_ATTRIBUTE_NOT_LONG 0x010B /**< ATT Error: Attribute cannot be read or written using read/write blob requests. */ -#define BLE_GATT_STATUS_ATTERR_INSUF_ENC_KEY_SIZE 0x010C /**< ATT Error: Encryption key size used is insufficient. */ -#define BLE_GATT_STATUS_ATTERR_INVALID_ATT_VAL_LENGTH 0x010D /**< ATT Error: Invalid value size. */ -#define BLE_GATT_STATUS_ATTERR_UNLIKELY_ERROR 0x010E /**< ATT Error: Very unlikely error. */ -#define BLE_GATT_STATUS_ATTERR_INSUF_ENCRYPTION 0x010F /**< ATT Error: Encrypted link required. */ -#define BLE_GATT_STATUS_ATTERR_UNSUPPORTED_GROUP_TYPE 0x0110 /**< ATT Error: Attribute type is not a supported grouping attribute. */ -#define BLE_GATT_STATUS_ATTERR_INSUF_RESOURCES 0x0111 /**< ATT Error: Encrypted link required. */ -#define BLE_GATT_STATUS_ATTERR_RFU_RANGE1_BEGIN 0x0112 /**< ATT Error: Reserved for Future Use range #1 begin. */ -#define BLE_GATT_STATUS_ATTERR_RFU_RANGE1_END 0x017F /**< ATT Error: Reserved for Future Use range #1 end. */ -#define BLE_GATT_STATUS_ATTERR_APP_BEGIN 0x0180 /**< ATT Error: Application range begin. */ -#define BLE_GATT_STATUS_ATTERR_APP_END 0x019F /**< ATT Error: Application range end. */ -#define BLE_GATT_STATUS_ATTERR_RFU_RANGE2_BEGIN 0x01A0 /**< ATT Error: Reserved for Future Use range #2 begin. */ -#define BLE_GATT_STATUS_ATTERR_RFU_RANGE2_END 0x01DF /**< ATT Error: Reserved for Future Use range #2 end. */ -#define BLE_GATT_STATUS_ATTERR_RFU_RANGE3_BEGIN 0x01E0 /**< ATT Error: Reserved for Future Use range #3 begin. */ -#define BLE_GATT_STATUS_ATTERR_RFU_RANGE3_END 0x01FC /**< ATT Error: Reserved for Future Use range #3 end. */ -#define BLE_GATT_STATUS_ATTERR_CPS_CCCD_CONFIG_ERROR 0x01FD /**< ATT Common Profile and Service Error: Client Characteristic Configuration Descriptor improperly configured. */ -#define BLE_GATT_STATUS_ATTERR_CPS_PROC_ALR_IN_PROG 0x01FE /**< ATT Common Profile and Service Error: Procedure Already in Progress. */ -#define BLE_GATT_STATUS_ATTERR_CPS_OUT_OF_RANGE 0x01FF /**< ATT Common Profile and Service Error: Out Of Range. */ -/** @} */ - - -/** @defgroup BLE_GATT_CPF_FORMATS Characteristic Presentation Formats - * @note Found at http://developer.bluetooth.org/gatt/descriptors/Pages/DescriptorViewer.aspx?u=org.bluetooth.descriptor.gatt.characteristic_presentation_format.xml - * @{ */ -#define BLE_GATT_CPF_FORMAT_RFU 0x00 /**< Reserved For Future Use. */ -#define BLE_GATT_CPF_FORMAT_BOOLEAN 0x01 /**< Boolean. */ -#define BLE_GATT_CPF_FORMAT_2BIT 0x02 /**< Unsigned 2-bit integer. */ -#define BLE_GATT_CPF_FORMAT_NIBBLE 0x03 /**< Unsigned 4-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT8 0x04 /**< Unsigned 8-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT12 0x05 /**< Unsigned 12-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT16 0x06 /**< Unsigned 16-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT24 0x07 /**< Unsigned 24-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT32 0x08 /**< Unsigned 32-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT48 0x09 /**< Unsigned 48-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT64 0x0A /**< Unsigned 64-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT128 0x0B /**< Unsigned 128-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT8 0x0C /**< Signed 2-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT12 0x0D /**< Signed 12-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT16 0x0E /**< Signed 16-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT24 0x0F /**< Signed 24-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT32 0x10 /**< Signed 32-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT48 0x11 /**< Signed 48-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT64 0x12 /**< Signed 64-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT128 0x13 /**< Signed 128-bit integer. */ -#define BLE_GATT_CPF_FORMAT_FLOAT32 0x14 /**< IEEE-754 32-bit floating point. */ -#define BLE_GATT_CPF_FORMAT_FLOAT64 0x15 /**< IEEE-754 64-bit floating point. */ -#define BLE_GATT_CPF_FORMAT_SFLOAT 0x16 /**< IEEE-11073 16-bit SFLOAT. */ -#define BLE_GATT_CPF_FORMAT_FLOAT 0x17 /**< IEEE-11073 32-bit FLOAT. */ -#define BLE_GATT_CPF_FORMAT_DUINT16 0x18 /**< IEEE-20601 format. */ -#define BLE_GATT_CPF_FORMAT_UTF8S 0x19 /**< UTF-8 string. */ -#define BLE_GATT_CPF_FORMAT_UTF16S 0x1A /**< UTF-16 string. */ -#define BLE_GATT_CPF_FORMAT_STRUCT 0x1B /**< Opaque Structure. */ -/** @} */ - -/** @defgroup BLE_GATT_CPF_NAMESPACES GATT Bluetooth Namespaces - * @{ - */ -#define BLE_GATT_CPF_NAMESPACE_BTSIG 0x01 /**< Bluetooth SIG defined Namespace. */ -#define BLE_GATT_CPF_NAMESPACE_DESCRIPTION_UNKNOWN 0x0000 /**< Namespace Description Unknown. */ -/** @} */ - -/** @} */ - -/** @addtogroup BLE_GATT_STRUCTURES Structures - * @{ */ - -/** - * @brief BLE GATT connection configuration parameters, set with @ref sd_ble_cfg_set. - * - * @retval NRF_ERROR_INVALID_PARAM att_mtu is smaller than @ref BLE_GATT_ATT_MTU_DEFAULT. - */ -typedef struct -{ - uint16_t att_mtu; /**< Maximum size of ATT packet the SoftDevice can send or receive. - The default and minimum value is @ref BLE_GATT_ATT_MTU_DEFAULT. - @mscs - @mmsc{@ref BLE_GATTC_MTU_EXCHANGE} - @mmsc{@ref BLE_GATTS_MTU_EXCHANGE} - @endmscs - */ -} ble_gatt_conn_cfg_t; - -/**@brief GATT Characteristic Properties. */ -typedef struct -{ - /* Standard properties */ - uint8_t broadcast :1; /**< Broadcasting of the value permitted. */ - uint8_t read :1; /**< Reading the value permitted. */ - uint8_t write_wo_resp :1; /**< Writing the value with Write Command permitted. */ - uint8_t write :1; /**< Writing the value with Write Request permitted. */ - uint8_t notify :1; /**< Notification of the value permitted. */ - uint8_t indicate :1; /**< Indications of the value permitted. */ - uint8_t auth_signed_wr :1; /**< Writing the value with Signed Write Command permitted. */ -} ble_gatt_char_props_t; - -/**@brief GATT Characteristic Extended Properties. */ -typedef struct -{ - /* Extended properties */ - uint8_t reliable_wr :1; /**< Writing the value with Queued Write operations permitted. */ - uint8_t wr_aux :1; /**< Writing the Characteristic User Description descriptor permitted. */ -} ble_gatt_char_ext_props_t; - -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif // BLE_GATT_H__ - -/** @} */ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_gattc.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_gattc.h deleted file mode 100644 index 191f3a85e..000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_gattc.h +++ /dev/null @@ -1,702 +0,0 @@ -/* - * Copyright (c) 2011 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup BLE_GATTC Generic Attribute Profile (GATT) Client - @{ - @brief Definitions and prototypes for the GATT Client interface. - */ - -#ifndef BLE_GATTC_H__ -#define BLE_GATTC_H__ - -#include "ble_gatt.h" -#include "ble_types.h" -#include "ble_ranges.h" -#include "nrf_svc.h" -#include "nrf_error.h" -#include "nrf.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup BLE_GATTC_ENUMERATIONS Enumerations - * @{ */ - -/**@brief GATTC API SVC numbers. */ -enum BLE_GATTC_SVCS -{ - SD_BLE_GATTC_PRIMARY_SERVICES_DISCOVER = BLE_GATTC_SVC_BASE, /**< Primary Service Discovery. */ - SD_BLE_GATTC_RELATIONSHIPS_DISCOVER, /**< Relationship Discovery. */ - SD_BLE_GATTC_CHARACTERISTICS_DISCOVER, /**< Characteristic Discovery. */ - SD_BLE_GATTC_DESCRIPTORS_DISCOVER, /**< Characteristic Descriptor Discovery. */ - SD_BLE_GATTC_ATTR_INFO_DISCOVER, /**< Attribute Information Discovery. */ - SD_BLE_GATTC_CHAR_VALUE_BY_UUID_READ, /**< Read Characteristic Value by UUID. */ - SD_BLE_GATTC_READ, /**< Generic read. */ - SD_BLE_GATTC_CHAR_VALUES_READ, /**< Read multiple Characteristic Values. */ - SD_BLE_GATTC_WRITE, /**< Generic write. */ - SD_BLE_GATTC_HV_CONFIRM, /**< Handle Value Confirmation. */ - SD_BLE_GATTC_EXCHANGE_MTU_REQUEST, /**< Exchange MTU Request. */ -}; - -/** - * @brief GATT Client Event IDs. - */ -enum BLE_GATTC_EVTS -{ - BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP = BLE_GATTC_EVT_BASE, /**< Primary Service Discovery Response event. \n See @ref ble_gattc_evt_prim_srvc_disc_rsp_t. */ - BLE_GATTC_EVT_REL_DISC_RSP, /**< Relationship Discovery Response event. \n See @ref ble_gattc_evt_rel_disc_rsp_t. */ - BLE_GATTC_EVT_CHAR_DISC_RSP, /**< Characteristic Discovery Response event. \n See @ref ble_gattc_evt_char_disc_rsp_t. */ - BLE_GATTC_EVT_DESC_DISC_RSP, /**< Descriptor Discovery Response event. \n See @ref ble_gattc_evt_desc_disc_rsp_t. */ - BLE_GATTC_EVT_ATTR_INFO_DISC_RSP, /**< Attribute Information Response event. \n See @ref ble_gattc_evt_attr_info_disc_rsp_t. */ - BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP, /**< Read By UUID Response event. \n See @ref ble_gattc_evt_char_val_by_uuid_read_rsp_t. */ - BLE_GATTC_EVT_READ_RSP, /**< Read Response event. \n See @ref ble_gattc_evt_read_rsp_t. */ - BLE_GATTC_EVT_CHAR_VALS_READ_RSP, /**< Read multiple Response event. \n See @ref ble_gattc_evt_char_vals_read_rsp_t. */ - BLE_GATTC_EVT_WRITE_RSP, /**< Write Response event. \n See @ref ble_gattc_evt_write_rsp_t. */ - BLE_GATTC_EVT_HVX, /**< Handle Value Notification or Indication event. \n Confirm indication with @ref sd_ble_gattc_hv_confirm. \n See @ref ble_gattc_evt_hvx_t. */ - BLE_GATTC_EVT_EXCHANGE_MTU_RSP, /**< Exchange MTU Response event. \n See @ref ble_gattc_evt_exchange_mtu_rsp_t. */ - BLE_GATTC_EVT_TIMEOUT, /**< Timeout event. \n See @ref ble_gattc_evt_timeout_t. */ - BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE /**< Write without Response transmission complete. \n See @ref ble_gattc_evt_write_cmd_tx_complete_t. */ -}; - -/** @} */ - -/** @addtogroup BLE_GATTC_DEFINES Defines - * @{ */ - -/** @defgroup BLE_ERRORS_GATTC SVC return values specific to GATTC - * @{ */ -#define BLE_ERROR_GATTC_PROC_NOT_PERMITTED (NRF_GATTC_ERR_BASE + 0x000) /**< Procedure not Permitted. */ -/** @} */ - -/** @defgroup BLE_GATTC_ATTR_INFO_FORMAT Attribute Information Formats - * @{ */ -#define BLE_GATTC_ATTR_INFO_FORMAT_16BIT 1 /**< 16-bit Attribute Information Format. */ -#define BLE_GATTC_ATTR_INFO_FORMAT_128BIT 2 /**< 128-bit Attribute Information Format. */ -/** @} */ - -/** @defgroup BLE_GATTC_DEFAULTS GATT Client defaults - * @{ */ -#define BLE_GATTC_WRITE_CMD_TX_QUEUE_SIZE_DEFAULT 1 /**< Default number of Write without Response that can be queued for transmission. */ -/** @} */ - -/** @} */ - -/** @addtogroup BLE_GATTC_STRUCTURES Structures - * @{ */ - -/** - * @brief BLE GATTC connection configuration parameters, set with @ref sd_ble_cfg_set. - */ -typedef struct -{ - uint8_t write_cmd_tx_queue_size; /**< The guaranteed minimum number of Write without Response that can be queued for transmission. - The default value is @ref BLE_GATTC_WRITE_CMD_TX_QUEUE_SIZE_DEFAULT */ -} ble_gattc_conn_cfg_t; - -/**@brief Operation Handle Range. */ -typedef struct -{ - uint16_t start_handle; /**< Start Handle. */ - uint16_t end_handle; /**< End Handle. */ -} ble_gattc_handle_range_t; - - -/**@brief GATT service. */ -typedef struct -{ - ble_uuid_t uuid; /**< Service UUID. */ - ble_gattc_handle_range_t handle_range; /**< Service Handle Range. */ -} ble_gattc_service_t; - - -/**@brief GATT include. */ -typedef struct -{ - uint16_t handle; /**< Include Handle. */ - ble_gattc_service_t included_srvc; /**< Handle of the included service. */ -} ble_gattc_include_t; - - -/**@brief GATT characteristic. */ -typedef struct -{ - ble_uuid_t uuid; /**< Characteristic UUID. */ - ble_gatt_char_props_t char_props; /**< Characteristic Properties. */ - uint8_t char_ext_props : 1; /**< Extended properties present. */ - uint16_t handle_decl; /**< Handle of the Characteristic Declaration. */ - uint16_t handle_value; /**< Handle of the Characteristic Value. */ -} ble_gattc_char_t; - - -/**@brief GATT descriptor. */ -typedef struct -{ - uint16_t handle; /**< Descriptor Handle. */ - ble_uuid_t uuid; /**< Descriptor UUID. */ -} ble_gattc_desc_t; - - -/**@brief Write Parameters. */ -typedef struct -{ - uint8_t write_op; /**< Write Operation to be performed, see @ref BLE_GATT_WRITE_OPS. */ - uint8_t flags; /**< Flags, see @ref BLE_GATT_EXEC_WRITE_FLAGS. */ - uint16_t handle; /**< Handle to the attribute to be written. */ - uint16_t offset; /**< Offset in bytes. @note For WRITE_CMD and WRITE_REQ, offset must be 0. */ - uint16_t len; /**< Length of data in bytes. */ - uint8_t const *p_value; /**< Pointer to the value data. */ -} ble_gattc_write_params_t; - -/**@brief Attribute Information for 16-bit Attribute UUID. */ -typedef struct -{ - uint16_t handle; /**< Attribute handle. */ - ble_uuid_t uuid; /**< 16-bit Attribute UUID. */ -} ble_gattc_attr_info16_t; - -/**@brief Attribute Information for 128-bit Attribute UUID. */ -typedef struct -{ - uint16_t handle; /**< Attribute handle. */ - ble_uuid128_t uuid; /**< 128-bit Attribute UUID. */ -} ble_gattc_attr_info128_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP. */ -typedef struct -{ - uint16_t count; /**< Service count. */ - ble_gattc_service_t services[1]; /**< Service data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_prim_srvc_disc_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_REL_DISC_RSP. */ -typedef struct -{ - uint16_t count; /**< Include count. */ - ble_gattc_include_t includes[1]; /**< Include data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_rel_disc_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_CHAR_DISC_RSP. */ -typedef struct -{ - uint16_t count; /**< Characteristic count. */ - ble_gattc_char_t chars[1]; /**< Characteristic data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_char_disc_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_DESC_DISC_RSP. */ -typedef struct -{ - uint16_t count; /**< Descriptor count. */ - ble_gattc_desc_t descs[1]; /**< Descriptor data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_desc_disc_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_ATTR_INFO_DISC_RSP. */ -typedef struct -{ - uint16_t count; /**< Attribute count. */ - uint8_t format; /**< Attribute information format, see @ref BLE_GATTC_ATTR_INFO_FORMAT. */ - union { - ble_gattc_attr_info16_t attr_info16[1]; /**< Attribute information for 16-bit Attribute UUID. - @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ - ble_gattc_attr_info128_t attr_info128[1]; /**< Attribute information for 128-bit Attribute UUID. - @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ - } info; /**< Attribute information union. */ -} ble_gattc_evt_attr_info_disc_rsp_t; - -/**@brief GATT read by UUID handle value pair. */ -typedef struct -{ - uint16_t handle; /**< Attribute Handle. */ - uint8_t *p_value; /**< Pointer to the Attribute Value, length is available in @ref ble_gattc_evt_char_val_by_uuid_read_rsp_t::value_len. */ -} ble_gattc_handle_value_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP. */ -typedef struct -{ - uint16_t count; /**< Handle-Value Pair Count. */ - uint16_t value_len; /**< Length of the value in Handle-Value(s) list. */ - uint8_t handle_value[1]; /**< Handle-Value(s) list. To iterate through the list use @ref sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter. - @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_char_val_by_uuid_read_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_READ_RSP. */ -typedef struct -{ - uint16_t handle; /**< Attribute Handle. */ - uint16_t offset; /**< Offset of the attribute data. */ - uint16_t len; /**< Attribute data length. */ - uint8_t data[1]; /**< Attribute data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_read_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_CHAR_VALS_READ_RSP. */ -typedef struct -{ - uint16_t len; /**< Concatenated Attribute values length. */ - uint8_t values[1]; /**< Attribute values. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_char_vals_read_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_WRITE_RSP. */ -typedef struct -{ - uint16_t handle; /**< Attribute Handle. */ - uint8_t write_op; /**< Type of write operation, see @ref BLE_GATT_WRITE_OPS. */ - uint16_t offset; /**< Data offset. */ - uint16_t len; /**< Data length. */ - uint8_t data[1]; /**< Data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_write_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_HVX. */ -typedef struct -{ - uint16_t handle; /**< Handle to which the HVx operation applies. */ - uint8_t type; /**< Indication or Notification, see @ref BLE_GATT_HVX_TYPES. */ - uint16_t len; /**< Attribute data length. */ - uint8_t data[1]; /**< Attribute data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_hvx_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_EXCHANGE_MTU_RSP. */ -typedef struct -{ - uint16_t server_rx_mtu; /**< Server RX MTU size. */ -} ble_gattc_evt_exchange_mtu_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_TIMEOUT. */ -typedef struct -{ - uint8_t src; /**< Timeout source, see @ref BLE_GATT_TIMEOUT_SOURCES. */ -} ble_gattc_evt_timeout_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE. */ -typedef struct -{ - uint8_t count; /**< Number of write without response transmissions completed. */ -} ble_gattc_evt_write_cmd_tx_complete_t; - -/**@brief GATTC event structure. */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle on which event occurred. */ - uint16_t gatt_status; /**< GATT status code for the operation, see @ref BLE_GATT_STATUS_CODES. */ - uint16_t error_handle; /**< In case of error: The handle causing the error. In all other cases @ref BLE_GATT_HANDLE_INVALID. */ - union - { - ble_gattc_evt_prim_srvc_disc_rsp_t prim_srvc_disc_rsp; /**< Primary Service Discovery Response Event Parameters. */ - ble_gattc_evt_rel_disc_rsp_t rel_disc_rsp; /**< Relationship Discovery Response Event Parameters. */ - ble_gattc_evt_char_disc_rsp_t char_disc_rsp; /**< Characteristic Discovery Response Event Parameters. */ - ble_gattc_evt_desc_disc_rsp_t desc_disc_rsp; /**< Descriptor Discovery Response Event Parameters. */ - ble_gattc_evt_char_val_by_uuid_read_rsp_t char_val_by_uuid_read_rsp; /**< Characteristic Value Read by UUID Response Event Parameters. */ - ble_gattc_evt_read_rsp_t read_rsp; /**< Read Response Event Parameters. */ - ble_gattc_evt_char_vals_read_rsp_t char_vals_read_rsp; /**< Characteristic Values Read Response Event Parameters. */ - ble_gattc_evt_write_rsp_t write_rsp; /**< Write Response Event Parameters. */ - ble_gattc_evt_hvx_t hvx; /**< Handle Value Notification/Indication Event Parameters. */ - ble_gattc_evt_exchange_mtu_rsp_t exchange_mtu_rsp; /**< Exchange MTU Response Event Parameters. */ - ble_gattc_evt_timeout_t timeout; /**< Timeout Event Parameters. */ - ble_gattc_evt_attr_info_disc_rsp_t attr_info_disc_rsp; /**< Attribute Information Discovery Event Parameters. */ - ble_gattc_evt_write_cmd_tx_complete_t write_cmd_tx_complete; /**< Write without Response transmission complete Event Parameters. */ - } params; /**< Event Parameters. @note Only valid if @ref gatt_status == @ref BLE_GATT_STATUS_SUCCESS. */ -} ble_gattc_evt_t; -/** @} */ - -/** @addtogroup BLE_GATTC_FUNCTIONS Functions - * @{ */ - -/**@brief Initiate or continue a GATT Primary Service Discovery procedure. - * - * @details This function initiates or resumes a Primary Service discovery procedure, starting from the supplied handle. - * If the last service has not been reached, this function must be called again with an updated start handle value to continue the search. - * - * @note If any of the discovered services have 128-bit UUIDs which are not present in the table provided to ble_vs_uuids_assign, a UUID structure with - * type @ref BLE_UUID_TYPE_UNKNOWN will be received in the corresponding event. - * - * @events - * @event{@ref BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_PRIM_SRVC_DISC_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] start_handle Handle to start searching from. - * @param[in] p_srvc_uuid Pointer to the service UUID to be found. If it is NULL, all primary services will be returned. - * - * @retval ::NRF_SUCCESS Successfully started or resumed the Primary Service Discovery procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - */ -SVCALL(SD_BLE_GATTC_PRIMARY_SERVICES_DISCOVER, uint32_t, sd_ble_gattc_primary_services_discover(uint16_t conn_handle, uint16_t start_handle, ble_uuid_t const *p_srvc_uuid)); - - -/**@brief Initiate or continue a GATT Relationship Discovery procedure. - * - * @details This function initiates or resumes the Find Included Services sub-procedure. If the last included service has not been reached, - * this must be called again with an updated handle range to continue the search. - * - * @events - * @event{@ref BLE_GATTC_EVT_REL_DISC_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_REL_DISC_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_handle_range A pointer to the range of handles of the Service to perform this procedure on. - * - * @retval ::NRF_SUCCESS Successfully started or resumed the Relationship Discovery procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - */ -SVCALL(SD_BLE_GATTC_RELATIONSHIPS_DISCOVER, uint32_t, sd_ble_gattc_relationships_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); - - -/**@brief Initiate or continue a GATT Characteristic Discovery procedure. - * - * @details This function initiates or resumes a Characteristic discovery procedure. If the last Characteristic has not been reached, - * this must be called again with an updated handle range to continue the discovery. - * - * @note If any of the discovered characteristics have 128-bit UUIDs which are not present in the table provided to ble_vs_uuids_assign, a UUID structure with - * type @ref BLE_UUID_TYPE_UNKNOWN will be received in the corresponding event. - * - * @events - * @event{@ref BLE_GATTC_EVT_CHAR_DISC_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_CHAR_DISC_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_handle_range A pointer to the range of handles of the Service to perform this procedure on. - * - * @retval ::NRF_SUCCESS Successfully started or resumed the Characteristic Discovery procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - */ -SVCALL(SD_BLE_GATTC_CHARACTERISTICS_DISCOVER, uint32_t, sd_ble_gattc_characteristics_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); - - -/**@brief Initiate or continue a GATT Characteristic Descriptor Discovery procedure. - * - * @details This function initiates or resumes a Characteristic Descriptor discovery procedure. If the last Descriptor has not been reached, - * this must be called again with an updated handle range to continue the discovery. - * - * @events - * @event{@ref BLE_GATTC_EVT_DESC_DISC_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_DESC_DISC_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_handle_range A pointer to the range of handles of the Characteristic to perform this procedure on. - * - * @retval ::NRF_SUCCESS Successfully started or resumed the Descriptor Discovery procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - */ -SVCALL(SD_BLE_GATTC_DESCRIPTORS_DISCOVER, uint32_t, sd_ble_gattc_descriptors_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); - - -/**@brief Initiate or continue a GATT Read using Characteristic UUID procedure. - * - * @details This function initiates or resumes a Read using Characteristic UUID procedure. If the last Characteristic has not been reached, - * this must be called again with an updated handle range to continue the discovery. - * - * @events - * @event{@ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_READ_UUID_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_uuid Pointer to a Characteristic value UUID to read. - * @param[in] p_handle_range A pointer to the range of handles to perform this procedure on. - * - * @retval ::NRF_SUCCESS Successfully started or resumed the Read using Characteristic UUID procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - */ -SVCALL(SD_BLE_GATTC_CHAR_VALUE_BY_UUID_READ, uint32_t, sd_ble_gattc_char_value_by_uuid_read(uint16_t conn_handle, ble_uuid_t const *p_uuid, ble_gattc_handle_range_t const *p_handle_range)); - - -/**@brief Initiate or continue a GATT Read (Long) Characteristic or Descriptor procedure. - * - * @details This function initiates or resumes a GATT Read (Long) Characteristic or Descriptor procedure. If the Characteristic or Descriptor - * to be read is longer than ATT_MTU - 1, this function must be called multiple times with appropriate offset to read the - * complete value. - * - * @events - * @event{@ref BLE_GATTC_EVT_READ_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_VALUE_READ_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] handle The handle of the attribute to be read. - * @param[in] offset Offset into the attribute value to be read. - * - * @retval ::NRF_SUCCESS Successfully started or resumed the Read (Long) procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - */ -SVCALL(SD_BLE_GATTC_READ, uint32_t, sd_ble_gattc_read(uint16_t conn_handle, uint16_t handle, uint16_t offset)); - - -/**@brief Initiate a GATT Read Multiple Characteristic Values procedure. - * - * @details This function initiates a GATT Read Multiple Characteristic Values procedure. - * - * @events - * @event{@ref BLE_GATTC_EVT_CHAR_VALS_READ_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_READ_MULT_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_handles A pointer to the handle(s) of the attribute(s) to be read. - * @param[in] handle_count The number of handles in p_handles. - * - * @retval ::NRF_SUCCESS Successfully started the Read Multiple Characteristic Values procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - */ -SVCALL(SD_BLE_GATTC_CHAR_VALUES_READ, uint32_t, sd_ble_gattc_char_values_read(uint16_t conn_handle, uint16_t const *p_handles, uint16_t handle_count)); - - -/**@brief Perform a Write (Characteristic Value or Descriptor, with or without response, signed or not, long or reliable) procedure. - * - * @details This function can perform all write procedures described in GATT. - * - * @note Only one write with response procedure can be ongoing per connection at a time. - * If the application tries to write with response while another write with response procedure is ongoing, - * the function call will return @ref NRF_ERROR_BUSY. - * A @ref BLE_GATTC_EVT_WRITE_RSP event will be issued as soon as the write response arrives from the peer. - * - * @note The number of Write without Response that can be queued is configured by @ref ble_gattc_conn_cfg_t::write_cmd_tx_queue_size - * When the queue is full, the function call will return @ref NRF_ERROR_RESOURCES. - * A @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE event will be issued as soon as the transmission of the write without response is complete. - * - * @note The application can keep track of the available queue element count for writes without responses by following the procedure below: - * - Store initial queue element count in a variable. - * - Decrement the variable, which stores the currently available queue element count, by one when a call to this function returns @ref NRF_SUCCESS. - * - Increment the variable, which stores the current available queue element count, by the count variable in @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE event. - * - * @events - * @event{@ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE, Write without response transmission complete.} - * @event{@ref BLE_GATTC_EVT_WRITE_RSP, Write response received from the peer.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_VALUE_WRITE_WITHOUT_RESP_MSC} - * @mmsc{@ref BLE_GATTC_VALUE_WRITE_MSC} - * @mmsc{@ref BLE_GATTC_VALUE_LONG_WRITE_MSC} - * @mmsc{@ref BLE_GATTC_VALUE_RELIABLE_WRITE_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_write_params A pointer to a write parameters structure. - * - * @retval ::NRF_SUCCESS Successfully started the Write procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied. - * @retval ::NRF_ERROR_BUSY For write with response, procedure already in progress. Wait for a @ref BLE_GATTC_EVT_WRITE_RSP event and retry. - * @retval ::NRF_ERROR_RESOURCES Too many writes without responses queued. - * Wait for a @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE event and retry. - */ -SVCALL(SD_BLE_GATTC_WRITE, uint32_t, sd_ble_gattc_write(uint16_t conn_handle, ble_gattc_write_params_t const *p_write_params)); - - -/**@brief Send a Handle Value Confirmation to the GATT Server. - * - * @mscs - * @mmsc{@ref BLE_GATTC_HVI_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] handle The handle of the attribute in the indication. - * - * @retval ::NRF_SUCCESS Successfully queued the Handle Value Confirmation for transmission. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no Indication pending to be confirmed. - * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle. - */ -SVCALL(SD_BLE_GATTC_HV_CONFIRM, uint32_t, sd_ble_gattc_hv_confirm(uint16_t conn_handle, uint16_t handle)); - -/**@brief Discovers information about a range of attributes on a GATT server. - * - * @events - * @event{@ref BLE_GATTC_EVT_ATTR_INFO_DISC_RSP, Generated when information about a range of attributes has been received.} - * @endevents - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_handle_range The range of handles to request information about. - * - * @retval ::NRF_SUCCESS Successfully started an attribute information discovery procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid connection state - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - */ -SVCALL(SD_BLE_GATTC_ATTR_INFO_DISCOVER, uint32_t, sd_ble_gattc_attr_info_discover(uint16_t conn_handle, ble_gattc_handle_range_t const * p_handle_range)); - -/**@brief Start an ATT_MTU exchange by sending an Exchange MTU Request to the server. - * - * @details The SoftDevice sets ATT_MTU to the minimum of: - * - The Client RX MTU value, and - * - The Server RX MTU value from @ref BLE_GATTC_EVT_EXCHANGE_MTU_RSP. - * - * However, the SoftDevice never sets ATT_MTU lower than @ref BLE_GATT_ATT_MTU_DEFAULT. - * - * @events - * @event{@ref BLE_GATTC_EVT_EXCHANGE_MTU_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_MTU_EXCHANGE} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] client_rx_mtu Client RX MTU size. - * - The minimum value is @ref BLE_GATT_ATT_MTU_DEFAULT. - * - The maximum value is @ref ble_gatt_conn_cfg_t::att_mtu in the connection configuration - used for this connection. - * - The value must be equal to Server RX MTU size given in @ref sd_ble_gatts_exchange_mtu_reply - * if an ATT_MTU exchange has already been performed in the other direction. - * - * @retval ::NRF_SUCCESS Successfully sent request to the server. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid connection state or an ATT_MTU exchange was already requested once. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid Client RX MTU size supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - */ -SVCALL(SD_BLE_GATTC_EXCHANGE_MTU_REQUEST, uint32_t, sd_ble_gattc_exchange_mtu_request(uint16_t conn_handle, uint16_t client_rx_mtu)); - -/**@brief Iterate through Handle-Value(s) list in @ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP event. - * - * @param[in] p_gattc_evt Pointer to event buffer containing @ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP event. - * @note If the buffer contains different event, behavior is undefined. - * @param[in,out] p_iter Iterator, points to @ref ble_gattc_handle_value_t structure that will be filled in with - * the next Handle-Value pair in each iteration. If the function returns other than - * @ref NRF_SUCCESS, it will not be changed. - * - To start iteration, initialize the structure to zero. - * - To continue, pass the value from previous iteration. - * - * \code - * ble_gattc_handle_value_t iter; - * memset(&iter, 0, sizeof(ble_gattc_handle_value_t)); - * while (sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter(&ble_evt.evt.gattc_evt, &iter) == NRF_SUCCESS) - * { - * app_handle = iter.handle; - * memcpy(app_value, iter.p_value, ble_evt.evt.gattc_evt.params.char_val_by_uuid_read_rsp.value_len); - * } - * \endcode - * - * @retval ::NRF_SUCCESS Successfully retrieved the next Handle-Value pair. - * @retval ::NRF_ERROR_NOT_FOUND No more Handle-Value pairs available in the list. - */ -__STATIC_INLINE uint32_t sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter(ble_gattc_evt_t *p_gattc_evt, ble_gattc_handle_value_t *p_iter); - -/** @} */ - -#ifndef SUPPRESS_INLINE_IMPLEMENTATION - -__STATIC_INLINE uint32_t sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter(ble_gattc_evt_t *p_gattc_evt, ble_gattc_handle_value_t *p_iter) -{ - uint32_t value_len = p_gattc_evt->params.char_val_by_uuid_read_rsp.value_len; - uint8_t *p_first = p_gattc_evt->params.char_val_by_uuid_read_rsp.handle_value; - uint8_t *p_next = p_iter->p_value ? p_iter->p_value + value_len : p_first; - - if ((p_next - p_first) / (sizeof(uint16_t) + value_len) < p_gattc_evt->params.char_val_by_uuid_read_rsp.count) - { - p_iter->handle = (uint16_t)p_next[1] << 8 | p_next[0]; - p_iter->p_value = p_next + sizeof(uint16_t); - return NRF_SUCCESS; - } - else - { - return NRF_ERROR_NOT_FOUND; - } -} - -#endif /* SUPPRESS_INLINE_IMPLEMENTATION */ - -#ifdef __cplusplus -} -#endif -#endif /* BLE_GATTC_H__ */ - -/** - @} -*/ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_gatts.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_gatts.h deleted file mode 100644 index 5e8615c05..000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_gatts.h +++ /dev/null @@ -1,835 +0,0 @@ -/* - * Copyright (c) 2011 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup BLE_GATTS Generic Attribute Profile (GATT) Server - @{ - @brief Definitions and prototypes for the GATTS interface. - */ - -#ifndef BLE_GATTS_H__ -#define BLE_GATTS_H__ - -#include "ble_types.h" -#include "ble_ranges.h" -#include "ble_l2cap.h" -#include "ble_gap.h" -#include "ble_gatt.h" -#include "nrf_svc.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup BLE_GATTS_ENUMERATIONS Enumerations - * @{ */ - -/** - * @brief GATTS API SVC numbers. - */ -enum BLE_GATTS_SVCS -{ - SD_BLE_GATTS_SERVICE_ADD = BLE_GATTS_SVC_BASE, /**< Add a service. */ - SD_BLE_GATTS_INCLUDE_ADD, /**< Add an included service. */ - SD_BLE_GATTS_CHARACTERISTIC_ADD, /**< Add a characteristic. */ - SD_BLE_GATTS_DESCRIPTOR_ADD, /**< Add a generic attribute. */ - SD_BLE_GATTS_VALUE_SET, /**< Set an attribute value. */ - SD_BLE_GATTS_VALUE_GET, /**< Get an attribute value. */ - SD_BLE_GATTS_HVX, /**< Handle Value Notification or Indication. */ - SD_BLE_GATTS_SERVICE_CHANGED, /**< Perform a Service Changed Indication to one or more peers. */ - SD_BLE_GATTS_RW_AUTHORIZE_REPLY, /**< Reply to an authorization request for a read or write operation on one or more attributes. */ - SD_BLE_GATTS_SYS_ATTR_SET, /**< Set the persistent system attributes for a connection. */ - SD_BLE_GATTS_SYS_ATTR_GET, /**< Retrieve the persistent system attributes. */ - SD_BLE_GATTS_INITIAL_USER_HANDLE_GET, /**< Retrieve the first valid user handle. */ - SD_BLE_GATTS_ATTR_GET, /**< Retrieve the UUID and/or metadata of an attribute. */ - SD_BLE_GATTS_EXCHANGE_MTU_REPLY /**< Reply to Exchange MTU Request. */ -}; - -/** - * @brief GATT Server Event IDs. - */ -enum BLE_GATTS_EVTS -{ - BLE_GATTS_EVT_WRITE = BLE_GATTS_EVT_BASE, /**< Write operation performed. \n See @ref ble_gatts_evt_write_t. */ - BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST, /**< Read/Write Authorization request. \n Reply with @ref sd_ble_gatts_rw_authorize_reply. \n See @ref ble_gatts_evt_rw_authorize_request_t. */ - BLE_GATTS_EVT_SYS_ATTR_MISSING, /**< A persistent system attribute access is pending. \n Respond with @ref sd_ble_gatts_sys_attr_set. \n See @ref ble_gatts_evt_sys_attr_missing_t. */ - BLE_GATTS_EVT_HVC, /**< Handle Value Confirmation. \n See @ref ble_gatts_evt_hvc_t. */ - BLE_GATTS_EVT_SC_CONFIRM, /**< Service Changed Confirmation. \n No additional event structure applies. */ - BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST, /**< Exchange MTU Request. \n Reply with @ref sd_ble_gatts_exchange_mtu_reply. \n See @ref ble_gatts_evt_exchange_mtu_request_t. */ - BLE_GATTS_EVT_TIMEOUT, /**< Peer failed to respond to an ATT request in time. \n See @ref ble_gatts_evt_timeout_t. */ - BLE_GATTS_EVT_HVN_TX_COMPLETE /**< Handle Value Notification transmission complete. \n See @ref ble_gatts_evt_hvn_tx_complete_t. */ -}; - -/**@brief GATTS Configuration IDs. - * - * IDs that uniquely identify a GATTS configuration. - */ -enum BLE_GATTS_CFGS -{ - BLE_GATTS_CFG_SERVICE_CHANGED = BLE_GATTS_CFG_BASE, /**< Service changed configuration. */ - BLE_GATTS_CFG_ATTR_TAB_SIZE, /**< Attribute table size configuration. */ -}; - -/** @} */ - -/** @addtogroup BLE_GATTS_DEFINES Defines - * @{ */ - -/** @defgroup BLE_ERRORS_GATTS SVC return values specific to GATTS - * @{ */ -#define BLE_ERROR_GATTS_INVALID_ATTR_TYPE (NRF_GATTS_ERR_BASE + 0x000) /**< Invalid attribute type. */ -#define BLE_ERROR_GATTS_SYS_ATTR_MISSING (NRF_GATTS_ERR_BASE + 0x001) /**< System Attributes missing. */ -/** @} */ - -/** @defgroup BLE_GATTS_ATTR_LENS_MAX Maximum attribute lengths - * @{ */ -#define BLE_GATTS_FIX_ATTR_LEN_MAX (510) /**< Maximum length for fixed length Attribute Values. */ -#define BLE_GATTS_VAR_ATTR_LEN_MAX (512) /**< Maximum length for variable length Attribute Values. */ -/** @} */ - -/** @defgroup BLE_GATTS_SRVC_TYPES GATT Server Service Types - * @{ */ -#define BLE_GATTS_SRVC_TYPE_INVALID 0x00 /**< Invalid Service Type. */ -#define BLE_GATTS_SRVC_TYPE_PRIMARY 0x01 /**< Primary Service. */ -#define BLE_GATTS_SRVC_TYPE_SECONDARY 0x02 /**< Secondary Type. */ -/** @} */ - - -/** @defgroup BLE_GATTS_ATTR_TYPES GATT Server Attribute Types - * @{ */ -#define BLE_GATTS_ATTR_TYPE_INVALID 0x00 /**< Invalid Attribute Type. */ -#define BLE_GATTS_ATTR_TYPE_PRIM_SRVC_DECL 0x01 /**< Primary Service Declaration. */ -#define BLE_GATTS_ATTR_TYPE_SEC_SRVC_DECL 0x02 /**< Secondary Service Declaration. */ -#define BLE_GATTS_ATTR_TYPE_INC_DECL 0x03 /**< Include Declaration. */ -#define BLE_GATTS_ATTR_TYPE_CHAR_DECL 0x04 /**< Characteristic Declaration. */ -#define BLE_GATTS_ATTR_TYPE_CHAR_VAL 0x05 /**< Characteristic Value. */ -#define BLE_GATTS_ATTR_TYPE_DESC 0x06 /**< Descriptor. */ -#define BLE_GATTS_ATTR_TYPE_OTHER 0x07 /**< Other, non-GATT specific type. */ -/** @} */ - - -/** @defgroup BLE_GATTS_OPS GATT Server Operations - * @{ */ -#define BLE_GATTS_OP_INVALID 0x00 /**< Invalid Operation. */ -#define BLE_GATTS_OP_WRITE_REQ 0x01 /**< Write Request. */ -#define BLE_GATTS_OP_WRITE_CMD 0x02 /**< Write Command. */ -#define BLE_GATTS_OP_SIGN_WRITE_CMD 0x03 /**< Signed Write Command. */ -#define BLE_GATTS_OP_PREP_WRITE_REQ 0x04 /**< Prepare Write Request. */ -#define BLE_GATTS_OP_EXEC_WRITE_REQ_CANCEL 0x05 /**< Execute Write Request: Cancel all prepared writes. */ -#define BLE_GATTS_OP_EXEC_WRITE_REQ_NOW 0x06 /**< Execute Write Request: Immediately execute all prepared writes. */ -/** @} */ - -/** @defgroup BLE_GATTS_VLOCS GATT Value Locations - * @{ */ -#define BLE_GATTS_VLOC_INVALID 0x00 /**< Invalid Location. */ -#define BLE_GATTS_VLOC_STACK 0x01 /**< Attribute Value is located in stack memory, no user memory is required. */ -#define BLE_GATTS_VLOC_USER 0x02 /**< Attribute Value is located in user memory. This requires the user to maintain a valid buffer through the lifetime of the attribute, since the stack - will read and write directly to the memory using the pointer provided in the APIs. There are no alignment requirements for the buffer. */ -/** @} */ - -/** @defgroup BLE_GATTS_AUTHORIZE_TYPES GATT Server Authorization Types - * @{ */ -#define BLE_GATTS_AUTHORIZE_TYPE_INVALID 0x00 /**< Invalid Type. */ -#define BLE_GATTS_AUTHORIZE_TYPE_READ 0x01 /**< Authorize a Read Operation. */ -#define BLE_GATTS_AUTHORIZE_TYPE_WRITE 0x02 /**< Authorize a Write Request Operation. */ -/** @} */ - -/** @defgroup BLE_GATTS_SYS_ATTR_FLAGS System Attribute Flags - * @{ */ -#define BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS (1 << 0) /**< Restrict system attributes to system services only. */ -#define BLE_GATTS_SYS_ATTR_FLAG_USR_SRVCS (1 << 1) /**< Restrict system attributes to user services only. */ -/** @} */ - -/** @defgroup BLE_GATTS_SERVICE_CHANGED Service Changed Inclusion Values - * @{ - */ -#define BLE_GATTS_SERVICE_CHANGED_DEFAULT (1) /**< Default is to include the Service Changed characteristic in the Attribute Table. */ -/** @} */ - -/** @defgroup BLE_GATTS_ATTR_TAB_SIZE Attribute Table size - * @{ - */ -#define BLE_GATTS_ATTR_TAB_SIZE_MIN (248) /**< Minimum Attribute Table size */ -#define BLE_GATTS_ATTR_TAB_SIZE_DEFAULT (1408) /**< Default Attribute Table size. */ -/** @} */ - -/** @defgroup BLE_GATTS_DEFAULTS GATT Server defaults - * @{ - */ -#define BLE_GATTS_HVN_TX_QUEUE_SIZE_DEFAULT 1 /**< Default number of Handle Value Notifications that can be queued for transmission. */ -/** @} */ - -/** @} */ - -/** @addtogroup BLE_GATTS_STRUCTURES Structures - * @{ */ - -/** - * @brief BLE GATTS connection configuration parameters, set with @ref sd_ble_cfg_set. - */ -typedef struct -{ - uint8_t hvn_tx_queue_size; /**< Minimum guaranteed number of Handle Value Notifications that can be queued for transmission. - The default value is @ref BLE_GATTS_HVN_TX_QUEUE_SIZE_DEFAULT */ -} ble_gatts_conn_cfg_t; - -/**@brief Attribute metadata. */ -typedef struct -{ - ble_gap_conn_sec_mode_t read_perm; /**< Read permissions. */ - ble_gap_conn_sec_mode_t write_perm; /**< Write permissions. */ - uint8_t vlen :1; /**< Variable length attribute. */ - uint8_t vloc :2; /**< Value location, see @ref BLE_GATTS_VLOCS.*/ - uint8_t rd_auth :1; /**< Read authorization and value will be requested from the application on every read operation. */ - uint8_t wr_auth :1; /**< Write authorization will be requested from the application on every Write Request operation (but not Write Command). */ -} ble_gatts_attr_md_t; - - -/**@brief GATT Attribute. */ -typedef struct -{ - ble_uuid_t const *p_uuid; /**< Pointer to the attribute UUID. */ - ble_gatts_attr_md_t const *p_attr_md; /**< Pointer to the attribute metadata structure. */ - uint16_t init_len; /**< Initial attribute value length in bytes. */ - uint16_t init_offs; /**< Initial attribute value offset in bytes. If different from zero, the first init_offs bytes of the attribute value will be left uninitialized. */ - uint16_t max_len; /**< Maximum attribute value length in bytes, see @ref BLE_GATTS_ATTR_LENS_MAX for maximum values. */ - uint8_t *p_value; /**< Pointer to the attribute data. Please note that if the @ref BLE_GATTS_VLOC_USER value location is selected in the attribute metadata, this will have to point to a buffer - that remains valid through the lifetime of the attribute. This excludes usage of automatic variables that may go out of scope or any other temporary location. - The stack may access that memory directly without the application's knowledge. For writable characteristics, this value must not be a location in flash memory.*/ -} ble_gatts_attr_t; - -/**@brief GATT Attribute Value. */ -typedef struct -{ - uint16_t len; /**< Length in bytes to be written or read. Length in bytes written or read after successful return.*/ - uint16_t offset; /**< Attribute value offset. */ - uint8_t *p_value; /**< Pointer to where value is stored or will be stored. - If value is stored in user memory, only the attribute length is updated when p_value == NULL. - Set to NULL when reading to obtain the complete length of the attribute value */ -} ble_gatts_value_t; - - -/**@brief GATT Characteristic Presentation Format. */ -typedef struct -{ - uint8_t format; /**< Format of the value, see @ref BLE_GATT_CPF_FORMATS. */ - int8_t exponent; /**< Exponent for integer data types. */ - uint16_t unit; /**< Unit from Bluetooth Assigned Numbers. */ - uint8_t name_space; /**< Namespace from Bluetooth Assigned Numbers, see @ref BLE_GATT_CPF_NAMESPACES. */ - uint16_t desc; /**< Namespace description from Bluetooth Assigned Numbers, see @ref BLE_GATT_CPF_NAMESPACES. */ -} ble_gatts_char_pf_t; - - -/**@brief GATT Characteristic metadata. */ -typedef struct -{ - ble_gatt_char_props_t char_props; /**< Characteristic Properties. */ - ble_gatt_char_ext_props_t char_ext_props; /**< Characteristic Extended Properties. */ - uint8_t const *p_char_user_desc; /**< Pointer to a UTF-8 encoded string (non-NULL terminated), NULL if the descriptor is not required. */ - uint16_t char_user_desc_max_size; /**< The maximum size in bytes of the user description descriptor. */ - uint16_t char_user_desc_size; /**< The size of the user description, must be smaller or equal to char_user_desc_max_size. */ - ble_gatts_char_pf_t const *p_char_pf; /**< Pointer to a presentation format structure or NULL if the CPF descriptor is not required. */ - ble_gatts_attr_md_t const *p_user_desc_md; /**< Attribute metadata for the User Description descriptor, or NULL for default values. */ - ble_gatts_attr_md_t const *p_cccd_md; /**< Attribute metadata for the Client Characteristic Configuration Descriptor, or NULL for default values. */ - ble_gatts_attr_md_t const *p_sccd_md; /**< Attribute metadata for the Server Characteristic Configuration Descriptor, or NULL for default values. */ -} ble_gatts_char_md_t; - - -/**@brief GATT Characteristic Definition Handles. */ -typedef struct -{ - uint16_t value_handle; /**< Handle to the characteristic value. */ - uint16_t user_desc_handle; /**< Handle to the User Description descriptor, or @ref BLE_GATT_HANDLE_INVALID if not present. */ - uint16_t cccd_handle; /**< Handle to the Client Characteristic Configuration Descriptor, or @ref BLE_GATT_HANDLE_INVALID if not present. */ - uint16_t sccd_handle; /**< Handle to the Server Characteristic Configuration Descriptor, or @ref BLE_GATT_HANDLE_INVALID if not present. */ -} ble_gatts_char_handles_t; - - -/**@brief GATT HVx parameters. */ -typedef struct -{ - uint16_t handle; /**< Characteristic Value Handle. */ - uint8_t type; /**< Indication or Notification, see @ref BLE_GATT_HVX_TYPES. */ - uint16_t offset; /**< Offset within the attribute value. */ - uint16_t *p_len; /**< Length in bytes to be written, length in bytes written after successful return. */ - uint8_t const *p_data; /**< Actual data content, use NULL to use the current attribute value. */ -} ble_gatts_hvx_params_t; - -/**@brief GATT Authorization parameters. */ -typedef struct -{ - uint16_t gatt_status; /**< GATT status code for the operation, see @ref BLE_GATT_STATUS_CODES. */ - uint8_t update : 1; /**< If set, data supplied in p_data will be used to update the attribute value. - Please note that for @ref BLE_GATTS_AUTHORIZE_TYPE_WRITE operations this bit must always be set, - as the data to be written needs to be stored and later provided by the application. */ - uint16_t offset; /**< Offset of the attribute value being updated. */ - uint16_t len; /**< Length in bytes of the value in p_data pointer, see @ref BLE_GATTS_ATTR_LENS_MAX. */ - uint8_t const *p_data; /**< Pointer to new value used to update the attribute value. */ -} ble_gatts_authorize_params_t; - -/**@brief GATT Read or Write Authorize Reply parameters. */ -typedef struct -{ - uint8_t type; /**< Type of authorize operation, see @ref BLE_GATTS_AUTHORIZE_TYPES. */ - union { - ble_gatts_authorize_params_t read; /**< Read authorization parameters. */ - ble_gatts_authorize_params_t write; /**< Write authorization parameters. */ - } params; /**< Reply Parameters. */ -} ble_gatts_rw_authorize_reply_params_t; - -/**@brief Service Changed Inclusion configuration parameters, set with @ref sd_ble_cfg_set. */ -typedef struct -{ - uint8_t service_changed : 1; /**< If 1, include the Service Changed characteristic in the Attribute Table. Default is @ref BLE_GATTS_SERVICE_CHANGED_DEFAULT. */ -} ble_gatts_cfg_service_changed_t; - -/**@brief Attribute table size configuration parameters, set with @ref sd_ble_cfg_set. - * - * @retval ::NRF_ERROR_INVALID_LENGTH One or more of the following is true: - * - The specified Attribute Table size is too small. - * The minimum acceptable size is defined by @ref BLE_GATTS_ATTR_TAB_SIZE_MIN. - * - The specified Attribute Table size is not a multiple of 4. - */ -typedef struct -{ - uint32_t attr_tab_size; /**< Attribute table size. Default is @ref BLE_GATTS_ATTR_TAB_SIZE_DEFAULT, minimum is @ref BLE_GATTS_ATTR_TAB_SIZE_MIN. */ -} ble_gatts_cfg_attr_tab_size_t; - -/**@brief Config structure for GATTS configurations. */ -typedef union -{ - ble_gatts_cfg_service_changed_t service_changed; /**< Include service changed characteristic, cfg_id is @ref BLE_GATTS_CFG_SERVICE_CHANGED. */ - ble_gatts_cfg_attr_tab_size_t attr_tab_size; /**< Attribute table size, cfg_id is @ref BLE_GATTS_CFG_ATTR_TAB_SIZE. */ -} ble_gatts_cfg_t; - - -/**@brief Event structure for @ref BLE_GATTS_EVT_WRITE. */ -typedef struct -{ - uint16_t handle; /**< Attribute Handle. */ - ble_uuid_t uuid; /**< Attribute UUID. */ - uint8_t op; /**< Type of write operation, see @ref BLE_GATTS_OPS. */ - uint8_t auth_required; /**< Writing operation deferred due to authorization requirement. Application may use @ref sd_ble_gatts_value_set to finalize the writing operation. */ - uint16_t offset; /**< Offset for the write operation. */ - uint16_t len; /**< Length of the received data. */ - uint8_t data[1]; /**< Received data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gatts_evt_write_t; - -/**@brief Event substructure for authorized read requests, see @ref ble_gatts_evt_rw_authorize_request_t. */ -typedef struct -{ - uint16_t handle; /**< Attribute Handle. */ - ble_uuid_t uuid; /**< Attribute UUID. */ - uint16_t offset; /**< Offset for the read operation. */ -} ble_gatts_evt_read_t; - -/**@brief Event structure for @ref BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST. */ -typedef struct -{ - uint8_t type; /**< Type of authorize operation, see @ref BLE_GATTS_AUTHORIZE_TYPES. */ - union { - ble_gatts_evt_read_t read; /**< Attribute Read Parameters. */ - ble_gatts_evt_write_t write; /**< Attribute Write Parameters. */ - } request; /**< Request Parameters. */ -} ble_gatts_evt_rw_authorize_request_t; - -/**@brief Event structure for @ref BLE_GATTS_EVT_SYS_ATTR_MISSING. */ -typedef struct -{ - uint8_t hint; /**< Hint (currently unused). */ -} ble_gatts_evt_sys_attr_missing_t; - - -/**@brief Event structure for @ref BLE_GATTS_EVT_HVC. */ -typedef struct -{ - uint16_t handle; /**< Attribute Handle. */ -} ble_gatts_evt_hvc_t; - -/**@brief Event structure for @ref BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST. */ -typedef struct -{ - uint16_t client_rx_mtu; /**< Client RX MTU size. */ -} ble_gatts_evt_exchange_mtu_request_t; - -/**@brief Event structure for @ref BLE_GATTS_EVT_TIMEOUT. */ -typedef struct -{ - uint8_t src; /**< Timeout source, see @ref BLE_GATT_TIMEOUT_SOURCES. */ -} ble_gatts_evt_timeout_t; - -/**@brief Event structure for @ref BLE_GATTS_EVT_HVN_TX_COMPLETE. */ -typedef struct -{ - uint8_t count; /**< Number of notification transmissions completed. */ -} ble_gatts_evt_hvn_tx_complete_t; - -/**@brief GATTS event structure. */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle on which the event occurred. */ - union - { - ble_gatts_evt_write_t write; /**< Write Event Parameters. */ - ble_gatts_evt_rw_authorize_request_t authorize_request; /**< Read or Write Authorize Request Parameters. */ - ble_gatts_evt_sys_attr_missing_t sys_attr_missing; /**< System attributes missing. */ - ble_gatts_evt_hvc_t hvc; /**< Handle Value Confirmation Event Parameters. */ - ble_gatts_evt_exchange_mtu_request_t exchange_mtu_request; /**< Exchange MTU Request Event Parameters. */ - ble_gatts_evt_timeout_t timeout; /**< Timeout Event. */ - ble_gatts_evt_hvn_tx_complete_t hvn_tx_complete; /**< Handle Value Notification transmission complete Event Parameters. */ - } params; /**< Event Parameters. */ -} ble_gatts_evt_t; - -/** @} */ - -/** @addtogroup BLE_GATTS_FUNCTIONS Functions - * @{ */ - -/**@brief Add a service declaration to the Attribute Table. - * - * @note Secondary Services are only relevant in the context of the entity that references them, it is therefore forbidden to - * add a secondary service declaration that is not referenced by another service later in the Attribute Table. - * - * @mscs - * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} - * @endmscs - * - * @param[in] type Toggles between primary and secondary services, see @ref BLE_GATTS_SRVC_TYPES. - * @param[in] p_uuid Pointer to service UUID. - * @param[out] p_handle Pointer to a 16-bit word where the assigned handle will be stored. - * - * @retval ::NRF_SUCCESS Successfully added a service declaration. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, Vendor Specific UUIDs need to be present in the table. - * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, certain UUIDs are reserved for the stack. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. - */ -SVCALL(SD_BLE_GATTS_SERVICE_ADD, uint32_t, sd_ble_gatts_service_add(uint8_t type, ble_uuid_t const *p_uuid, uint16_t *p_handle)); - - -/**@brief Add an include declaration to the Attribute Table. - * - * @note It is currently only possible to add an include declaration to the last added service (i.e. only sequential population is supported at this time). - * - * @note The included service must already be present in the Attribute Table prior to this call. - * - * @mscs - * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} - * @endmscs - * - * @param[in] service_handle Handle of the service where the included service is to be placed, if @ref BLE_GATT_HANDLE_INVALID is used, it will be placed sequentially. - * @param[in] inc_srvc_handle Handle of the included service. - * @param[out] p_include_handle Pointer to a 16-bit word where the assigned handle will be stored. - * - * @retval ::NRF_SUCCESS Successfully added an include declaration. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, handle values need to match previously added services. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_NOT_SUPPORTED Feature is not supported, service_handle must be that of the last added service. - * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, self inclusions are not allowed. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. - * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. - */ -SVCALL(SD_BLE_GATTS_INCLUDE_ADD, uint32_t, sd_ble_gatts_include_add(uint16_t service_handle, uint16_t inc_srvc_handle, uint16_t *p_include_handle)); - - -/**@brief Add a characteristic declaration, a characteristic value declaration and optional characteristic descriptor declarations to the Attribute Table. - * - * @note It is currently only possible to add a characteristic to the last added service (i.e. only sequential population is supported at this time). - * - * @note Several restrictions apply to the parameters, such as matching permissions between the user description descriptor and the writable auxiliaries bits, - * readable (no security) and writable (selectable) CCCDs and SCCDs and valid presentation format values. - * - * @note If no metadata is provided for the optional descriptors, their permissions will be derived from the characteristic permissions. - * - * @mscs - * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} - * @endmscs - * - * @param[in] service_handle Handle of the service where the characteristic is to be placed, if @ref BLE_GATT_HANDLE_INVALID is used, it will be placed sequentially. - * @param[in] p_char_md Characteristic metadata. - * @param[in] p_attr_char_value Pointer to the attribute structure corresponding to the characteristic value. - * @param[out] p_handles Pointer to the structure where the assigned handles will be stored. - * - * @retval ::NRF_SUCCESS Successfully added a characteristic. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, service handle, Vendor Specific UUIDs, lengths, and permissions need to adhere to the constraints. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation, a service context is required. - * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, certain UUIDs are reserved for the stack. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied, attribute lengths are restricted by @ref BLE_GATTS_ATTR_LENS_MAX. - */ -SVCALL(SD_BLE_GATTS_CHARACTERISTIC_ADD, uint32_t, sd_ble_gatts_characteristic_add(uint16_t service_handle, ble_gatts_char_md_t const *p_char_md, ble_gatts_attr_t const *p_attr_char_value, ble_gatts_char_handles_t *p_handles)); - - -/**@brief Add a descriptor to the Attribute Table. - * - * @note It is currently only possible to add a descriptor to the last added characteristic (i.e. only sequential population is supported at this time). - * - * @mscs - * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} - * @endmscs - * - * @param[in] char_handle Handle of the characteristic where the descriptor is to be placed, if @ref BLE_GATT_HANDLE_INVALID is used, it will be placed sequentially. - * @param[in] p_attr Pointer to the attribute structure. - * @param[out] p_handle Pointer to a 16-bit word where the assigned handle will be stored. - * - * @retval ::NRF_SUCCESS Successfully added a descriptor. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, characteristic handle, Vendor Specific UUIDs, lengths, and permissions need to adhere to the constraints. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation, a characteristic context is required. - * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, certain UUIDs are reserved for the stack. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied, attribute lengths are restricted by @ref BLE_GATTS_ATTR_LENS_MAX. - */ -SVCALL(SD_BLE_GATTS_DESCRIPTOR_ADD, uint32_t, sd_ble_gatts_descriptor_add(uint16_t char_handle, ble_gatts_attr_t const *p_attr, uint16_t *p_handle)); - -/**@brief Set the value of a given attribute. - * - * @note Values other than system attributes can be set at any time, regardless of whether any active connections exist. - * - * @mscs - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. Ignored if the value does not belong to a system attribute. - * @param[in] handle Attribute handle. - * @param[in,out] p_value Attribute value information. - * - * @retval ::NRF_SUCCESS Successfully set the value of the attribute. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. - * @retval ::NRF_ERROR_FORBIDDEN Forbidden handle supplied, certain attributes are not modifiable by the application. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied, attribute lengths are restricted by @ref BLE_GATTS_ATTR_LENS_MAX. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied on a system attribute. - */ -SVCALL(SD_BLE_GATTS_VALUE_SET, uint32_t, sd_ble_gatts_value_set(uint16_t conn_handle, uint16_t handle, ble_gatts_value_t *p_value)); - -/**@brief Get the value of a given attribute. - * - * @note If the attribute value is longer than the size of the supplied buffer, - * p_len will return the total attribute value length (excluding offset), - * and not the number of bytes actually returned in p_data. - * The application may use this information to allocate a suitable buffer size. - * - * @note When retrieving system attribute values with this function, the connection handle - * may refer to an already disconnected connection. Refer to the documentation of - * @ref sd_ble_gatts_sys_attr_get for further information. - * - * @param[in] conn_handle Connection handle. Ignored if the value does not belong to a system attribute. - * @param[in] handle Attribute handle. - * @param[in,out] p_value Attribute value information. - * - * @retval ::NRF_SUCCESS Successfully retrieved the value of the attribute. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid attribute offset supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied on a system attribute. - * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. - */ -SVCALL(SD_BLE_GATTS_VALUE_GET, uint32_t, sd_ble_gatts_value_get(uint16_t conn_handle, uint16_t handle, ble_gatts_value_t *p_value)); - -/**@brief Notify or Indicate an attribute value. - * - * @details This function checks for the relevant Client Characteristic Configuration descriptor value to verify that the relevant operation - * (notification or indication) has been enabled by the client. It is also able to update the attribute value before issuing the PDU, so that - * the application can atomically perform a value update and a server initiated transaction with a single API call. - * - * @note The local attribute value may be updated even if an outgoing packet is not sent to the peer due to an error during execution. - * The Attribute Table has been updated if one of the following error codes is returned: @ref NRF_ERROR_INVALID_STATE, @ref NRF_ERROR_BUSY, - * @ref NRF_ERROR_FORBIDDEN, @ref BLE_ERROR_GATTS_SYS_ATTR_MISSING and @ref NRF_ERROR_RESOURCES. - * The caller can check whether the value has been updated by looking at the contents of *(p_hvx_params->p_len). - * - * @note Only one indication procedure can be ongoing per connection at a time. - * If the application tries to indicate an attribute value while another indication procedure is ongoing, - * the function call will return @ref NRF_ERROR_BUSY. - * A @ref BLE_GATTS_EVT_HVC event will be issued as soon as the confirmation arrives from the peer. - * - * @note The number of Handle Value Notifications that can be queued is configured by @ref ble_gatts_conn_cfg_t::hvn_tx_queue_size - * When the queue is full, the function call will return @ref NRF_ERROR_RESOURCES. - * A @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event will be issued as soon as the transmission of the notification is complete. - * - * @note The application can keep track of the available queue element count for notifications by following the procedure below: - * - Store initial queue element count in a variable. - * - Decrement the variable, which stores the currently available queue element count, by one when a call to this function returns @ref NRF_SUCCESS. - * - Increment the variable, which stores the current available queue element count, by the count variable in @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event. - * - * @events - * @event{@ref BLE_GATTS_EVT_HVN_TX_COMPLETE, Notification transmission complete.} - * @event{@ref BLE_GATTS_EVT_HVC, Confirmation received from the peer.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTS_HVX_SYS_ATTRS_MISSING_MSC} - * @mmsc{@ref BLE_GATTS_HVN_MSC} - * @mmsc{@ref BLE_GATTS_HVI_MSC} - * @mmsc{@ref BLE_GATTS_HVX_DISABLED_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_hvx_params Pointer to an HVx parameters structure. If the p_data member contains a non-NULL pointer the attribute value will be updated with - * the contents pointed by it before sending the notification or indication. - * - * @retval ::NRF_SUCCESS Successfully queued a notification or indication for transmission, and optionally updated the attribute value. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE One or more of the following is true: - * - Invalid Connection State - * - Notifications and/or indications not enabled in the CCCD - * - An ATT_MTU exchange is ongoing - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle(s) supplied. Only attributes added directly by the application are available to notify and indicate. - * @retval ::BLE_ERROR_GATTS_INVALID_ATTR_TYPE Invalid attribute type(s) supplied, only characteristic values may be notified and indicated. - * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. - * @retval ::NRF_ERROR_FORBIDDEN The connection's current security level is lower than the one required by the write permissions of the CCCD associated with this characteristic. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied. - * @retval ::NRF_ERROR_BUSY For @ref BLE_GATT_HVX_INDICATION Procedure already in progress. Wait for a @ref BLE_GATTS_EVT_HVC event and retry. - * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. - * @retval ::NRF_ERROR_RESOURCES Too many notifications queued. - * Wait for a @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event and retry. - */ -SVCALL(SD_BLE_GATTS_HVX, uint32_t, sd_ble_gatts_hvx(uint16_t conn_handle, ble_gatts_hvx_params_t const *p_hvx_params)); - -/**@brief Indicate the Service Changed attribute value. - * - * @details This call will send a Handle Value Indication to one or more peers connected to inform them that the Attribute - * Table layout has changed. As soon as the peer has confirmed the indication, a @ref BLE_GATTS_EVT_SC_CONFIRM event will - * be issued. - * - * @note Some of the restrictions and limitations that apply to @ref sd_ble_gatts_hvx also apply here. - * - * @events - * @event{@ref BLE_GATTS_EVT_SC_CONFIRM, Confirmation of attribute table change received from peer.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTS_SC_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] start_handle Start of affected attribute handle range. - * @param[in] end_handle End of affected attribute handle range. - * - * @retval ::NRF_SUCCESS Successfully queued the Service Changed indication for transmission. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_NOT_SUPPORTED Service Changed not enabled at initialization. See @ref - * sd_ble_cfg_set and @ref ble_gatts_cfg_service_changed_t. - * @retval ::NRF_ERROR_INVALID_STATE One or more of the following is true: - * - Invalid Connection State - * - Notifications and/or indications not enabled in the CCCD - * - An ATT_MTU exchange is ongoing - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle(s) supplied, handles must be in the range populated by the application. - * @retval ::NRF_ERROR_BUSY Procedure already in progress. - * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. - */ -SVCALL(SD_BLE_GATTS_SERVICE_CHANGED, uint32_t, sd_ble_gatts_service_changed(uint16_t conn_handle, uint16_t start_handle, uint16_t end_handle)); - -/**@brief Respond to a Read/Write authorization request. - * - * @note This call should only be used as a response to a @ref BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST event issued to the application. - * - * @mscs - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC} - * @mmsc{@ref BLE_GATTS_READ_REQ_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_WRITE_REQ_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_PEER_CANCEL_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_rw_authorize_reply_params Pointer to a structure with the attribute provided by the application. - * - * @note @ref ble_gatts_authorize_params_t::p_data is ignored when this function is used to respond - * to a @ref BLE_GATTS_AUTHORIZE_TYPE_READ event if @ref ble_gatts_authorize_params_t::update - * is set to 0. - * - * @retval ::NRF_SUCCESS Successfully queued a response to the peer, and in the case of a write operation, Attribute Table updated. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no authorization request pending. - * @retval ::NRF_ERROR_INVALID_PARAM Authorization op invalid, - * handle supplied does not match requested handle, - * or invalid data to be written provided by the application. - */ -SVCALL(SD_BLE_GATTS_RW_AUTHORIZE_REPLY, uint32_t, sd_ble_gatts_rw_authorize_reply(uint16_t conn_handle, ble_gatts_rw_authorize_reply_params_t const *p_rw_authorize_reply_params)); - - -/**@brief Update persistent system attribute information. - * - * @details Supply information about persistent system attributes to the stack, - * previously obtained using @ref sd_ble_gatts_sys_attr_get. - * This call is only allowed for active connections, and is usually - * made immediately after a connection is established with an known bonded device, - * often as a response to a @ref BLE_GATTS_EVT_SYS_ATTR_MISSING. - * - * p_sysattrs may point directly to the application's stored copy of the system attributes - * obtained using @ref sd_ble_gatts_sys_attr_get. - * If the pointer is NULL, the system attribute info is initialized, assuming that - * the application does not have any previously saved system attribute data for this device. - * - * @note The state of persistent system attributes is reset upon connection establishment and then remembered for its duration. - * - * @note If this call returns with an error code different from @ref NRF_SUCCESS, the storage of persistent system attributes may have been completed only partially. - * This means that the state of the attribute table is undefined, and the application should either provide a new set of attributes using this same call or - * reset the SoftDevice to return to a known state. - * - * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS is used with this function, only the system attributes included in system services will be modified. - * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_USR_SRVCS is used with this function, only the system attributes included in user services will be modified. - * - * @mscs - * @mmsc{@ref BLE_GATTS_HVX_SYS_ATTRS_MISSING_MSC} - * @mmsc{@ref BLE_GATTS_SYS_ATTRS_UNK_PEER_MSC} - * @mmsc{@ref BLE_GATTS_SYS_ATTRS_BONDED_PEER_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_sys_attr_data Pointer to a saved copy of system attributes supplied to the stack, or NULL. - * @param[in] len Size of data pointed by p_sys_attr_data, in octets. - * @param[in] flags Optional additional flags, see @ref BLE_GATTS_SYS_ATTR_FLAGS - * - * @retval ::NRF_SUCCESS Successfully set the system attribute information. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid flags supplied. - * @retval ::NRF_ERROR_INVALID_DATA Invalid data supplied, the data should be exactly the same as retrieved with @ref sd_ble_gatts_sys_attr_get. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. - */ -SVCALL(SD_BLE_GATTS_SYS_ATTR_SET, uint32_t, sd_ble_gatts_sys_attr_set(uint16_t conn_handle, uint8_t const *p_sys_attr_data, uint16_t len, uint32_t flags)); - - -/**@brief Retrieve persistent system attribute information from the stack. - * - * @details This call is used to retrieve information about values to be stored persistently by the application - * during the lifetime of a connection or after it has been terminated. When a new connection is established with the same bonded device, - * the system attribute information retrieved with this function should be restored using using @ref sd_ble_gatts_sys_attr_set. - * If retrieved after disconnection, the data should be read before a new connection established. The connection handle for - * the previous, now disconnected, connection will remain valid until a new one is created to allow this API call to refer to it. - * Connection handles belonging to active connections can be used as well, but care should be taken since the system attributes - * may be written to at any time by the peer during a connection's lifetime. - * - * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS is used with this function, only the system attributes included in system services will be returned. - * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_USR_SRVCS is used with this function, only the system attributes included in user services will be returned. - * - * @mscs - * @mmsc{@ref BLE_GATTS_SYS_ATTRS_BONDED_PEER_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle of the recently terminated connection. - * @param[out] p_sys_attr_data Pointer to a buffer where updated information about system attributes will be filled in. The format of the data is described - * in @ref BLE_GATTS_SYS_ATTRS_FORMAT. NULL can be provided to obtain the length of the data. - * @param[in,out] p_len Size of application buffer if p_sys_attr_data is not NULL. Unconditionally updated to actual length of system attribute data. - * @param[in] flags Optional additional flags, see @ref BLE_GATTS_SYS_ATTR_FLAGS - * - * @retval ::NRF_SUCCESS Successfully retrieved the system attribute information. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid flags supplied. - * @retval ::NRF_ERROR_DATA_SIZE The system attribute information did not fit into the provided buffer. - * @retval ::NRF_ERROR_NOT_FOUND No system attributes found. - */ -SVCALL(SD_BLE_GATTS_SYS_ATTR_GET, uint32_t, sd_ble_gatts_sys_attr_get(uint16_t conn_handle, uint8_t *p_sys_attr_data, uint16_t *p_len, uint32_t flags)); - - -/**@brief Retrieve the first valid user attribute handle. - * - * @param[out] p_handle Pointer to an integer where the handle will be stored. - * - * @retval ::NRF_SUCCESS Successfully retrieved the handle. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - */ -SVCALL(SD_BLE_GATTS_INITIAL_USER_HANDLE_GET, uint32_t, sd_ble_gatts_initial_user_handle_get(uint16_t *p_handle)); - -/**@brief Retrieve the attribute UUID and/or metadata. - * - * @param[in] handle Attribute handle - * @param[out] p_uuid UUID of the attribute. Use NULL to omit this field. - * @param[out] p_md Metadata of the attribute. Use NULL to omit this field. - * - * @retval ::NRF_SUCCESS Successfully retrieved the attribute metadata, - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameters supplied. Returned when both @c p_uuid and @c p_md are NULL. - * @retval ::NRF_ERROR_NOT_FOUND Attribute was not found. - */ -SVCALL(SD_BLE_GATTS_ATTR_GET, uint32_t, sd_ble_gatts_attr_get(uint16_t handle, ble_uuid_t * p_uuid, ble_gatts_attr_md_t * p_md)); - -/**@brief Reply to an ATT_MTU exchange request by sending an Exchange MTU Response to the client. - * - * @details This function is only used to reply to a @ref BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST event. - * - * @details The SoftDevice sets ATT_MTU to the minimum of: - * - The Client RX MTU value from @ref BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST, and - * - The Server RX MTU value. - * - * However, the SoftDevice never sets ATT_MTU lower than @ref BLE_GATT_ATT_MTU_DEFAULT. - * - * @mscs - * @mmsc{@ref BLE_GATTS_MTU_EXCHANGE} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] server_rx_mtu Server RX MTU size. - * - The minimum value is @ref BLE_GATT_ATT_MTU_DEFAULT. - * - The maximum value is @ref ble_gatt_conn_cfg_t::att_mtu in the connection configuration - used for this connection. - * - The value must be equal to Client RX MTU size given in @ref sd_ble_gattc_exchange_mtu_request - * if an ATT_MTU exchange has already been performed in the other direction. - * - * @retval ::NRF_SUCCESS Successfully sent response to the client. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no ATT_MTU exchange request pending. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid Server RX MTU size supplied. - */ -SVCALL(SD_BLE_GATTS_EXCHANGE_MTU_REPLY, uint32_t, sd_ble_gatts_exchange_mtu_reply(uint16_t conn_handle, uint16_t server_rx_mtu)); -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif // BLE_GATTS_H__ - -/** - @} -*/ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_hci.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_hci.h deleted file mode 100644 index f0dde9a03..000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_hci.h +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup BLE_COMMON - @{ -*/ - - -#ifndef BLE_HCI_H__ -#define BLE_HCI_H__ -#ifdef __cplusplus -extern "C" { -#endif - -/** @defgroup BLE_HCI_STATUS_CODES Bluetooth status codes - * @{ */ - -#define BLE_HCI_STATUS_CODE_SUCCESS 0x00 /**< Success. */ -#define BLE_HCI_STATUS_CODE_UNKNOWN_BTLE_COMMAND 0x01 /**< Unknown BLE Command. */ -#define BLE_HCI_STATUS_CODE_UNKNOWN_CONNECTION_IDENTIFIER 0x02 /**< Unknown Connection Identifier. */ -/*0x03 Hardware Failure -0x04 Page Timeout -*/ -#define BLE_HCI_AUTHENTICATION_FAILURE 0x05 /**< Authentication Failure. */ -#define BLE_HCI_STATUS_CODE_PIN_OR_KEY_MISSING 0x06 /**< Pin or Key missing. */ -#define BLE_HCI_MEMORY_CAPACITY_EXCEEDED 0x07 /**< Memory Capacity Exceeded. */ -#define BLE_HCI_CONNECTION_TIMEOUT 0x08 /**< Connection Timeout. */ -/*0x09 Connection Limit Exceeded -0x0A Synchronous Connection Limit To A Device Exceeded -0x0B ACL Connection Already Exists*/ -#define BLE_HCI_STATUS_CODE_COMMAND_DISALLOWED 0x0C /**< Command Disallowed. */ -/*0x0D Connection Rejected due to Limited Resources -0x0E Connection Rejected Due To Security Reasons -0x0F Connection Rejected due to Unacceptable BD_ADDR -0x10 Connection Accept Timeout Exceeded -0x11 Unsupported Feature or Parameter Value*/ -#define BLE_HCI_STATUS_CODE_INVALID_BTLE_COMMAND_PARAMETERS 0x12 /**< Invalid BLE Command Parameters. */ -#define BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION 0x13 /**< Remote User Terminated Connection. */ -#define BLE_HCI_REMOTE_DEV_TERMINATION_DUE_TO_LOW_RESOURCES 0x14 /**< Remote Device Terminated Connection due to low resources.*/ -#define BLE_HCI_REMOTE_DEV_TERMINATION_DUE_TO_POWER_OFF 0x15 /**< Remote Device Terminated Connection due to power off. */ -#define BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION 0x16 /**< Local Host Terminated Connection. */ -/* -0x17 Repeated Attempts -0x18 Pairing Not Allowed -0x19 Unknown LMP PDU -*/ -#define BLE_HCI_UNSUPPORTED_REMOTE_FEATURE 0x1A /**< Unsupported Remote Feature. */ -/* -0x1B SCO Offset Rejected -0x1C SCO Interval Rejected -0x1D SCO Air Mode Rejected*/ -#define BLE_HCI_STATUS_CODE_INVALID_LMP_PARAMETERS 0x1E /**< Invalid LMP Parameters. */ -#define BLE_HCI_STATUS_CODE_UNSPECIFIED_ERROR 0x1F /**< Unspecified Error. */ -/*0x20 Unsupported LMP Parameter Value -0x21 Role Change Not Allowed -*/ -#define BLE_HCI_STATUS_CODE_LMP_RESPONSE_TIMEOUT 0x22 /**< LMP Response Timeout. */ -#define BLE_HCI_STATUS_CODE_LMP_ERROR_TRANSACTION_COLLISION 0x23 /**< LMP Error Transaction Collision/LL Procedure Collision. */ -#define BLE_HCI_STATUS_CODE_LMP_PDU_NOT_ALLOWED 0x24 /**< LMP PDU Not Allowed. */ -/*0x25 Encryption Mode Not Acceptable -0x26 Link Key Can Not be Changed -0x27 Requested QoS Not Supported -*/ -#define BLE_HCI_INSTANT_PASSED 0x28 /**< Instant Passed. */ -#define BLE_HCI_PAIRING_WITH_UNIT_KEY_UNSUPPORTED 0x29 /**< Pairing with Unit Key Unsupported. */ -#define BLE_HCI_DIFFERENT_TRANSACTION_COLLISION 0x2A /**< Different Transaction Collision. */ -/* -0x2B Reserved -0x2C QoS Unacceptable Parameter -0x2D QoS Rejected -0x2E Channel Classification Not Supported -0x2F Insufficient Security -*/ -#define BLE_HCI_PARAMETER_OUT_OF_MANDATORY_RANGE 0x30 /**< Parameter Out Of Mandatory Range. */ -/* -0x31 Reserved -0x32 Role Switch Pending -0x33 Reserved -0x34 Reserved Slot Violation -0x35 Role Switch Failed -0x36 Extended Inquiry Response Too Large -0x37 Secure Simple Pairing Not Supported By Host. -0x38 Host Busy - Pairing -0x39 Connection Rejected due to No Suitable Channel Found*/ -#define BLE_HCI_CONTROLLER_BUSY 0x3A /**< Controller Busy. */ -#define BLE_HCI_CONN_INTERVAL_UNACCEPTABLE 0x3B /**< Connection Interval Unacceptable. */ -#define BLE_HCI_DIRECTED_ADVERTISER_TIMEOUT 0x3C /**< Directed Advertisement Timeout. */ -#define BLE_HCI_CONN_TERMINATED_DUE_TO_MIC_FAILURE 0x3D /**< Connection Terminated due to MIC Failure. */ -#define BLE_HCI_CONN_FAILED_TO_BE_ESTABLISHED 0x3E /**< Connection Failed to be Established. */ - -/** @} */ - - -#ifdef __cplusplus -} -#endif -#endif // BLE_HCI_H__ - -/** @} */ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_l2cap.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_l2cap.h deleted file mode 100644 index 3b53ded09..000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_l2cap.h +++ /dev/null @@ -1,504 +0,0 @@ -/* - * Copyright (c) 2011 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup BLE_L2CAP Logical Link Control and Adaptation Protocol (L2CAP) - @{ - @brief Definitions and prototypes for the L2CAP interface. - */ - -#ifndef BLE_L2CAP_H__ -#define BLE_L2CAP_H__ - -#include "ble_types.h" -#include "ble_ranges.h" -#include "ble_err.h" -#include "nrf_svc.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/**@addtogroup BLE_L2CAP_TERMINOLOGY Terminology - * @{ - * @details - * - * L2CAP SDU - * - A data unit that the application can send/receive to/from a peer. - * - * L2CAP PDU - * - A data unit that is exchanged between local and remote L2CAP entities. - * It consists of L2CAP protocol control information and payload fields. - * The payload field can contain an L2CAP SDU or a part of an L2CAP SDU. - * - * L2CAP MTU - * - The maximum length of an L2CAP SDU. - * - * L2CAP MPS - * - The maximum length of an L2CAP PDU payload field. - * - * Credits - * - A value indicating the number of L2CAP PDUs that the receiver of the credit can send to the peer. - * @} */ - -/**@addtogroup BLE_L2CAP_ENUMERATIONS Enumerations - * @{ */ - -/**@brief L2CAP API SVC numbers. */ -enum BLE_L2CAP_SVCS -{ - SD_BLE_L2CAP_CH_SETUP = BLE_L2CAP_SVC_BASE, /**< Set up an L2CAP channel. */ - SD_BLE_L2CAP_CH_RELEASE, /**< Release an L2CAP channel. */ - SD_BLE_L2CAP_CH_RX, /**< Receive an SDU on an L2CAP channel. */ - SD_BLE_L2CAP_CH_TX, /**< Transmit an SDU on an L2CAP channel. */ - SD_BLE_L2CAP_CH_FLOW_CONTROL, /**< Advanced SDU reception flow control. */ -}; - -/**@brief L2CAP Event IDs. */ -enum BLE_L2CAP_EVTS -{ - BLE_L2CAP_EVT_CH_SETUP_REQUEST = BLE_L2CAP_EVT_BASE, /**< L2CAP Channel Setup Request event. - \n See @ref ble_l2cap_evt_ch_setup_request_t. */ - BLE_L2CAP_EVT_CH_SETUP_REFUSED, /**< L2CAP Channel Setup Refused event. - \n See @ref ble_l2cap_evt_ch_setup_refused_t. */ - BLE_L2CAP_EVT_CH_SETUP, /**< L2CAP Channel Setup Completed event. - \n See @ref ble_l2cap_evt_ch_setup_t. */ - BLE_L2CAP_EVT_CH_RELEASED, /**< L2CAP Channel Released event. - \n No additional event structure applies. */ - BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED, /**< L2CAP Channel SDU data buffer released event. - \n See @ref ble_l2cap_evt_ch_sdu_buf_released_t. */ - BLE_L2CAP_EVT_CH_CREDIT, /**< L2CAP Channel Credit received. - \n See @ref ble_l2cap_evt_ch_credit_t. */ - BLE_L2CAP_EVT_CH_RX, /**< L2CAP Channel SDU received. - \n See @ref ble_l2cap_evt_ch_rx_t. */ - BLE_L2CAP_EVT_CH_TX, /**< L2CAP Channel SDU transmitted. - \n See @ref ble_l2cap_evt_ch_tx_t. */ -}; - -/** @} */ - -/**@addtogroup BLE_L2CAP_DEFINES Defines - * @{ */ - -/**@brief Maximum number of L2CAP channels per connection. */ -#define BLE_L2CAP_CH_COUNT_MAX (64) - -/**@brief Minimum L2CAP MTU, in bytes. */ -#define BLE_L2CAP_MTU_MIN (23) - -/**@brief Minimum L2CAP MPS, in bytes. */ -#define BLE_L2CAP_MPS_MIN (23) - -/**@brief Invalid CID. */ -#define BLE_L2CAP_CID_INVALID (0x0000) - -/**@brief Default number of credits for @ref sd_ble_l2cap_ch_flow_control. */ -#define BLE_L2CAP_CREDITS_DEFAULT (1) - -/**@defgroup BLE_L2CAP_CH_SETUP_REFUSED_SRCS L2CAP channel setup refused sources - * @{ */ -#define BLE_L2CAP_CH_SETUP_REFUSED_SRC_LOCAL (0x01) /**< Local. */ -#define BLE_L2CAP_CH_SETUP_REFUSED_SRC_REMOTE (0x02) /**< Remote. */ - /** @} */ - - /** @defgroup BLE_L2CAP_CH_STATUS_CODES L2CAP channel status codes - * @{ */ -#define BLE_L2CAP_CH_STATUS_CODE_SUCCESS (0x0000) /**< Success. */ -#define BLE_L2CAP_CH_STATUS_CODE_LE_PSM_NOT_SUPPORTED (0x0002) /**< LE_PSM not supported. */ -#define BLE_L2CAP_CH_STATUS_CODE_NO_RESOURCES (0x0004) /**< No resources available. */ -#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_AUTHENTICATION (0x0005) /**< Insufficient authentication. */ -#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_AUTHORIZATION (0x0006) /**< Insufficient authorization. */ -#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_ENC_KEY_SIZE (0x0007) /**< Insufficient encryption key size. */ -#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_ENC (0x0008) /**< Insufficient encryption. */ -#define BLE_L2CAP_CH_STATUS_CODE_INVALID_SCID (0x0009) /**< Invalid Source CID. */ -#define BLE_L2CAP_CH_STATUS_CODE_SCID_ALLOCATED (0x000A) /**< Source CID already allocated. */ -#define BLE_L2CAP_CH_STATUS_CODE_UNACCEPTABLE_PARAMS (0x000B) /**< Unacceptable parameters. */ -#define BLE_L2CAP_CH_STATUS_CODE_NOT_UNDERSTOOD (0x8000) /**< Command Reject received instead of LE Credit Based Connection Response. */ -#define BLE_L2CAP_CH_STATUS_CODE_TIMEOUT (0xC000) /**< Operation timed out. */ -/** @} */ - -/** @} */ - -/**@addtogroup BLE_L2CAP_STRUCTURES Structures - * @{ */ - -/** - * @brief BLE L2CAP connection configuration parameters, set with @ref sd_ble_cfg_set. - * - * @note These parameters are set per connection, so all L2CAP channels created on this connection - * will have the same parameters. - * - * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: - * - rx_mps is smaller than @ref BLE_L2CAP_MPS_MIN. - * - tx_mps is smaller than @ref BLE_L2CAP_MPS_MIN. - * - ch_count is greater than @ref BLE_L2CAP_CH_COUNT_MAX. - * @retval ::NRF_ERROR_NO_MEM rx_mps or tx_mps is set too high. - */ -typedef struct -{ - uint16_t rx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall - be able to receive on L2CAP channels on connections with this - configuration. The minimum value is @ref BLE_L2CAP_MPS_MIN. */ - uint16_t tx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall - be able to transmit on L2CAP channels on connections with this - configuration. The minimum value is @ref BLE_L2CAP_MPS_MIN. */ - uint8_t rx_queue_size; /**< Number of SDU data buffers that can be queued for reception per - L2CAP channel. The minimum value is one. */ - uint8_t tx_queue_size; /**< Number of SDU data buffers that can be queued for transmission - per L2CAP channel. The minimum value is one. */ - uint8_t ch_count; /**< Number of L2CAP channels the application can create per connection - with this configuration. The default value is zero, the maximum - value is @ref BLE_L2CAP_CH_COUNT_MAX. - @note if this parameter is set to zero, all other parameters in - @ref ble_l2cap_conn_cfg_t are ignored. */ -} ble_l2cap_conn_cfg_t; - -/**@brief L2CAP channel RX parameters. */ -typedef struct -{ - uint16_t rx_mtu; /**< The maximum L2CAP SDU size, in bytes, that L2CAP shall be able to - receive on this L2CAP channel. - - Must be equal to or greater than @ref BLE_L2CAP_MTU_MIN. */ - uint16_t rx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall be - able to receive on this L2CAP channel. - - Must be equal to or greater than @ref BLE_L2CAP_MPS_MIN. - - Must be equal to or less than @ref ble_l2cap_conn_cfg_t::rx_mps. */ - ble_data_t sdu_buf; /**< SDU data buffer for reception. - - If @ref ble_data_t::p_data is non-NULL, initial credits are - issued to the peer. - - If @ref ble_data_t::p_data is NULL, no initial credits are - issued to the peer. */ -} ble_l2cap_ch_rx_params_t; - -/**@brief L2CAP channel setup parameters. */ -typedef struct -{ - ble_l2cap_ch_rx_params_t rx_params; /**< L2CAP channel RX parameters. */ - uint16_t le_psm; /**< LE Protocol/Service Multiplexer. Used when requesting - setup of an L2CAP channel, ignored otherwise. */ - uint16_t status; /**< Status code, see @ref BLE_L2CAP_CH_STATUS_CODES. - Used when replying to a setup request of an L2CAP - channel, ignored otherwise. */ -} ble_l2cap_ch_setup_params_t; - -/**@brief L2CAP channel TX parameters. */ -typedef struct -{ - uint16_t tx_mtu; /**< The maximum L2CAP SDU size, in bytes, that L2CAP is able to - transmit on this L2CAP channel. */ - uint16_t peer_mps; /**< The maximum L2CAP PDU payload size, in bytes, that the peer is - able to receive on this L2CAP channel. */ - uint16_t tx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP is able - to transmit on this L2CAP channel. This is effective tx_mps, - selected by the SoftDevice as - MIN( @ref ble_l2cap_ch_tx_params_t::peer_mps, @ref ble_l2cap_conn_cfg_t::tx_mps ) */ - uint16_t credits; /**< Initial credits given by the peer. */ -} ble_l2cap_ch_tx_params_t; - -/**@brief L2CAP Channel Setup Request event. */ -typedef struct -{ - ble_l2cap_ch_tx_params_t tx_params; /**< L2CAP channel TX parameters. */ - uint16_t le_psm; /**< LE Protocol/Service Multiplexer. */ -} ble_l2cap_evt_ch_setup_request_t; - -/**@brief L2CAP Channel Setup Refused event. */ -typedef struct -{ - uint8_t source; /**< Source, see @ref BLE_L2CAP_CH_SETUP_REFUSED_SRCS */ - uint16_t status; /**< Status code, see @ref BLE_L2CAP_CH_STATUS_CODES */ -} ble_l2cap_evt_ch_setup_refused_t; - -/**@brief L2CAP Channel Setup Completed event. */ -typedef struct -{ - ble_l2cap_ch_tx_params_t tx_params; /**< L2CAP channel TX parameters. */ -} ble_l2cap_evt_ch_setup_t; - -/**@brief L2CAP Channel SDU Data Duffer Released event. */ -typedef struct -{ - ble_data_t sdu_buf; /**< Returned reception or transmission SDU data buffer. The SoftDevice - returns SDU data buffers supplied by the application, which have - not yet been returned previously via a @ref BLE_L2CAP_EVT_CH_RX or - @ref BLE_L2CAP_EVT_CH_TX event. */ -} ble_l2cap_evt_ch_sdu_buf_released_t; - -/**@brief L2CAP Channel Credit received event. */ -typedef struct -{ - uint16_t credits; /**< Additional credits given by the peer. */ -} ble_l2cap_evt_ch_credit_t; - -/**@brief L2CAP Channel received SDU event. */ -typedef struct -{ - uint16_t sdu_len; /**< Total SDU length, in bytes. */ - ble_data_t sdu_buf; /**< SDU data buffer. - @note If there is not enough space in the buffer - (sdu_buf.len < sdu_len) then the rest of the SDU will be - silently discarded by the SoftDevice. */ -} ble_l2cap_evt_ch_rx_t; - -/**@brief L2CAP Channel transmitted SDU event. */ -typedef struct -{ - ble_data_t sdu_buf; /**< SDU data buffer. */ -} ble_l2cap_evt_ch_tx_t; - -/**@brief L2CAP event structure. */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle on which the event occured. */ - uint16_t local_cid; /**< Local Channel ID of the L2CAP channel, or - @ref BLE_L2CAP_CID_INVALID if not present. */ - union - { - ble_l2cap_evt_ch_setup_request_t ch_setup_request; /**< L2CAP Channel Setup Request Event Parameters. */ - ble_l2cap_evt_ch_setup_refused_t ch_setup_refused; /**< L2CAP Channel Setup Refused Event Parameters. */ - ble_l2cap_evt_ch_setup_t ch_setup; /**< L2CAP Channel Setup Completed Event Parameters. */ - ble_l2cap_evt_ch_sdu_buf_released_t ch_sdu_buf_released;/**< L2CAP Channel SDU Data Buffer Released Event Parameters. */ - ble_l2cap_evt_ch_credit_t credit; /**< L2CAP Channel Credit Received Event Parameters. */ - ble_l2cap_evt_ch_rx_t rx; /**< L2CAP Channel SDU Received Event Parameters. */ - ble_l2cap_evt_ch_tx_t tx; /**< L2CAP Channel SDU Transmitted Event Parameters. */ - } params; /**< Event Parameters. */ -} ble_l2cap_evt_t; - -/** @} */ - -/**@addtogroup BLE_L2CAP_FUNCTIONS Functions - * @{ */ - -/**@brief Set up an L2CAP channel. - * - * @details This function is used to: - * - Request setup of an L2CAP channel: sends an LE Credit Based Connection Request packet to a peer. - * - Reply to a setup request of an L2CAP channel (if called in response to a - * @ref BLE_L2CAP_EVT_CH_SETUP_REQUEST event): sends an LE Credit Based Connection - * Response packet to a peer. - * - * @note A call to this function will require the application to keep the SDU data buffer alive - * until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_RX or - * @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event. - * - * @events - * @event{@ref BLE_L2CAP_EVT_CH_SETUP, Setup successful.} - * @event{@ref BLE_L2CAP_EVT_CH_SETUP_REFUSED, Setup failed.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_L2CAP_CH_SETUP_MSC} - * @endmscs - * - * @param[in] conn_handle Connection Handle. - * @param[in,out] p_local_cid Pointer to a uint16_t containing Local Channel ID of the L2CAP channel: - * - As input: @ref BLE_L2CAP_CID_INVALID when requesting setup of an L2CAP - * channel or local_cid provided in the @ref BLE_L2CAP_EVT_CH_SETUP_REQUEST - * event when replying to a setup request of an L2CAP channel. - * - As output: local_cid for this channel. - * @param[in] p_params L2CAP channel parameters. - * - * @retval ::NRF_SUCCESS Successfully queued request or response for transmission. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_LENGTH Supplied higher rx_mps than has been configured on this link. - * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (L2CAP channel already set up). - * @retval ::NRF_ERROR_NOT_FOUND CID not found. - * @retval ::NRF_ERROR_RESOURCES The limit has been reached for available L2CAP channels, - * see @ref ble_l2cap_conn_cfg_t::ch_count. - */ -SVCALL(SD_BLE_L2CAP_CH_SETUP, uint32_t, sd_ble_l2cap_ch_setup(uint16_t conn_handle, uint16_t *p_local_cid, ble_l2cap_ch_setup_params_t const *p_params)); - -/**@brief Release an L2CAP channel. - * - * @details This sends a Disconnection Request packet to a peer. - * - * @events - * @event{@ref BLE_L2CAP_EVT_CH_RELEASED, Release complete.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_L2CAP_CH_RELEASE_MSC} - * @endmscs - * - * @param[in] conn_handle Connection Handle. - * @param[in] local_cid Local Channel ID of the L2CAP channel. - * - * @retval ::NRF_SUCCESS Successfully queued request for transmission. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is - * in progress for the L2CAP channel). - * @retval ::NRF_ERROR_NOT_FOUND CID not found. - */ -SVCALL(SD_BLE_L2CAP_CH_RELEASE, uint32_t, sd_ble_l2cap_ch_release(uint16_t conn_handle, uint16_t local_cid)); - -/**@brief Receive an SDU on an L2CAP channel. - * - * @details This may issue additional credits to the peer using an LE Flow Control Credit packet. - * - * @note A call to this function will require the application to keep the memory pointed by - * @ref ble_data_t::p_data alive until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_RX - * or @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event. - * - * @note The SoftDevice can queue up to @ref ble_l2cap_conn_cfg_t::rx_queue_size SDU data buffers - * for reception per L2CAP channel. - * - * @events - * @event{@ref BLE_L2CAP_EVT_CH_RX, The SDU is received.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_L2CAP_CH_RX_MSC} - * @endmscs - * - * @param[in] conn_handle Connection Handle. - * @param[in] local_cid Local Channel ID of the L2CAP channel. - * @param[in] p_sdu_buf Pointer to the SDU data buffer. - * - * @retval ::NRF_SUCCESS Buffer accepted. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is - * in progress for an L2CAP channel). - * @retval ::NRF_ERROR_NOT_FOUND CID not found. - * @retval ::NRF_ERROR_RESOURCES Too many SDU data buffers supplied. Wait for a - * @ref BLE_L2CAP_EVT_CH_RX event and retry. - */ -SVCALL(SD_BLE_L2CAP_CH_RX, uint32_t, sd_ble_l2cap_ch_rx(uint16_t conn_handle, uint16_t local_cid, ble_data_t const *p_sdu_buf)); - -/**@brief Transmit an SDU on an L2CAP channel. - * - * @note A call to this function will require the application to keep the memory pointed by - * @ref ble_data_t::p_data alive until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_TX - * or @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event. - * - * @note The SoftDevice can queue up to @ref ble_l2cap_conn_cfg_t::tx_queue_size SDUs for - * transmission per L2CAP channel. - * - * @note The application can keep track of the available credits for transmission by following - * the procedure below: - * - Store initial credits given by the peer in a variable. - * (Initial credits are provided in a @ref BLE_L2CAP_EVT_CH_SETUP event.) - * - Decrement the variable, which stores the currently available credits, by - * ceiling((@ref ble_data_t::len + 2) / tx_mps) when a call to this function returns - * @ref NRF_SUCCESS. (tx_mps is provided in a @ref BLE_L2CAP_EVT_CH_SETUP event.) - * - Increment the variable, which stores the currently available credits, by additional - * credits given by the peer in a @ref BLE_L2CAP_EVT_CH_CREDIT event. - * - * @events - * @event{@ref BLE_L2CAP_EVT_CH_TX, The SDU is transmitted.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_L2CAP_CH_TX_MSC} - * @endmscs - * - * @param[in] conn_handle Connection Handle. - * @param[in] local_cid Local Channel ID of the L2CAP channel. - * @param[in] p_sdu_buf Pointer to the SDU data buffer. - * - * @retval ::NRF_SUCCESS Successfully queued L2CAP SDU for transmission. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is - * in progress for the L2CAP channel). - * @retval ::NRF_ERROR_NOT_FOUND CID not found. - * @retval ::NRF_ERROR_DATA_SIZE Invalid SDU length supplied, must not be more than - * @ref ble_l2cap_ch_tx_params_t::tx_mtu provided in - * @ref BLE_L2CAP_EVT_CH_SETUP event. - * @retval ::NRF_ERROR_RESOURCES Too many SDUs queued for transmission. Wait for a - * @ref BLE_L2CAP_EVT_CH_TX event and retry. - */ -SVCALL(SD_BLE_L2CAP_CH_TX, uint32_t, sd_ble_l2cap_ch_tx(uint16_t conn_handle, uint16_t local_cid, ble_data_t const *p_sdu_buf)); - -/**@brief Advanced SDU reception flow control. - * - * @details Adjust the way the SoftDevice issues credits to the peer. - * This may issue additional credits to the peer using an LE Flow Control Credit packet. - * - * @mscs - * @mmsc{@ref BLE_L2CAP_CH_FLOW_CONTROL_MSC} - * @endmscs - * - * @param[in] conn_handle Connection Handle. - * @param[in] local_cid Local Channel ID of the L2CAP channel or @ref BLE_L2CAP_CID_INVALID to set - * the value that will be used for newly created channels. - * @param[in] credits Number of credits that the SoftDevice will make sure the peer has every - * time it starts using a new reception buffer. - * - @ref BLE_L2CAP_CREDITS_DEFAULT is the default value the SoftDevice will - * use if this function is not called. - * - If set to zero, the SoftDevice will stop issuing credits for new reception - * buffers the application provides or has provided. SDU reception that is - * currently ongoing will be allowed to complete. - * @param[out] p_credits NULL or pointer to a uint16_t. If a valid pointer is provided, it will be - * written by the SoftDevice with the number of credits that is or will be - * available to the peer. If the value written by the SoftDevice is 0 when - * credits parameter was set to 0, the peer will not be able to send more - * data until more credits are provided by calling this function again with - * credits > 0. This parameter is ignored when local_cid is set to @ref - * BLE_L2CAP_CID_INVALID. - * - * @note Application should take care when setting number of credits higher than default value. In - * this case the application must make sure that the SoftDevice always has reception buffers - * available (see @ref sd_ble_l2cap_ch_rx) for that channel. If the SoftDevice does not have - * such buffers available, packets may be NACKed on the Link Layer and all Bluetooth traffic - * on the connection handle may be stalled until the SoftDevice again has an available - * reception buffer. This applies even if the application has used this call to set the - * credits back to default, or zero. - * - * @retval ::NRF_SUCCESS Flow control parameters accepted. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is - * in progress for an L2CAP channel). - * @retval ::NRF_ERROR_NOT_FOUND CID not found. - */ -SVCALL(SD_BLE_L2CAP_CH_FLOW_CONTROL, uint32_t, sd_ble_l2cap_ch_flow_control(uint16_t conn_handle, uint16_t local_cid, uint16_t credits, uint16_t *p_credits)); - -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif // BLE_L2CAP_H__ - -/** - @} -*/ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_ranges.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_ranges.h deleted file mode 100644 index 5b9d89140..000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_ranges.h +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup BLE_COMMON - @{ - @defgroup ble_ranges Module specific SVC, event and option number subranges - @{ - - @brief Definition of SVC, event and option number subranges for each API module. - - @note - SVCs, event and option numbers are split into subranges for each API module. - Each module receives its entire allocated range of SVC calls, whether implemented or not, - but return BLE_ERROR_NOT_SUPPORTED for unimplemented or undefined calls in its range. - - Note that the symbols BLE_<module>_SVC_LAST is the end of the allocated SVC range, - rather than the last SVC function call actually defined and implemented. - - Specific SVC, event and option values are defined in each module's ble_<module>.h file, - which defines names of each individual SVC code based on the range start value. -*/ - -#ifndef BLE_RANGES_H__ -#define BLE_RANGES_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#define BLE_SVC_BASE 0x60 /**< Common BLE SVC base. */ -#define BLE_SVC_LAST 0x6B /**< Common BLE SVC last. */ - -#define BLE_GAP_SVC_BASE 0x6C /**< GAP BLE SVC base. */ -#define BLE_GAP_SVC_LAST 0x93 /**< GAP BLE SVC last. */ - -#define BLE_GATTC_SVC_BASE 0x94 /**< GATTC BLE SVC base. */ -#define BLE_GATTC_SVC_LAST 0x9F /**< GATTC BLE SVC last. */ - -#define BLE_GATTS_SVC_BASE 0xA0 /**< GATTS BLE SVC base. */ -#define BLE_GATTS_SVC_LAST 0xAF /**< GATTS BLE SVC last. */ - -#define BLE_L2CAP_SVC_BASE 0xB0 /**< L2CAP BLE SVC base. */ -#define BLE_L2CAP_SVC_LAST 0xBF /**< L2CAP BLE SVC last. */ - - -#define BLE_EVT_INVALID 0x00 /**< Invalid BLE Event. */ - -#define BLE_EVT_BASE 0x01 /**< Common BLE Event base. */ -#define BLE_EVT_LAST 0x0F /**< Common BLE Event last. */ - -#define BLE_GAP_EVT_BASE 0x10 /**< GAP BLE Event base. */ -#define BLE_GAP_EVT_LAST 0x2F /**< GAP BLE Event last. */ - -#define BLE_GATTC_EVT_BASE 0x30 /**< GATTC BLE Event base. */ -#define BLE_GATTC_EVT_LAST 0x4F /**< GATTC BLE Event last. */ - -#define BLE_GATTS_EVT_BASE 0x50 /**< GATTS BLE Event base. */ -#define BLE_GATTS_EVT_LAST 0x6F /**< GATTS BLE Event last. */ - -#define BLE_L2CAP_EVT_BASE 0x70 /**< L2CAP BLE Event base. */ -#define BLE_L2CAP_EVT_LAST 0x8F /**< L2CAP BLE Event last. */ - - -#define BLE_OPT_INVALID 0x00 /**< Invalid BLE Option. */ - -#define BLE_OPT_BASE 0x01 /**< Common BLE Option base. */ -#define BLE_OPT_LAST 0x1F /**< Common BLE Option last. */ - -#define BLE_GAP_OPT_BASE 0x20 /**< GAP BLE Option base. */ -#define BLE_GAP_OPT_LAST 0x3F /**< GAP BLE Option last. */ - -#define BLE_GATT_OPT_BASE 0x40 /**< GATT BLE Option base. */ -#define BLE_GATT_OPT_LAST 0x5F /**< GATT BLE Option last. */ - -#define BLE_GATTC_OPT_BASE 0x60 /**< GATTC BLE Option base. */ -#define BLE_GATTC_OPT_LAST 0x7F /**< GATTC BLE Option last. */ - -#define BLE_GATTS_OPT_BASE 0x80 /**< GATTS BLE Option base. */ -#define BLE_GATTS_OPT_LAST 0x9F /**< GATTS BLE Option last. */ - -#define BLE_L2CAP_OPT_BASE 0xA0 /**< L2CAP BLE Option base. */ -#define BLE_L2CAP_OPT_LAST 0xBF /**< L2CAP BLE Option last. */ - - -#define BLE_CFG_INVALID 0x00 /**< Invalid BLE configuration. */ - -#define BLE_CFG_BASE 0x01 /**< Common BLE configuration base. */ -#define BLE_CFG_LAST 0x1F /**< Common BLE configuration last. */ - -#define BLE_CONN_CFG_BASE 0x20 /**< BLE connection configuration base. */ -#define BLE_CONN_CFG_LAST 0x3F /**< BLE connection configuration last. */ - -#define BLE_GAP_CFG_BASE 0x40 /**< GAP BLE configuration base. */ -#define BLE_GAP_CFG_LAST 0x5F /**< GAP BLE configuration last. */ - -#define BLE_GATT_CFG_BASE 0x60 /**< GATT BLE configuration base. */ -#define BLE_GATT_CFG_LAST 0x7F /**< GATT BLE configuration last. */ - -#define BLE_GATTC_CFG_BASE 0x80 /**< GATTC BLE configuration base. */ -#define BLE_GATTC_CFG_LAST 0x9F /**< GATTC BLE configuration last. */ - -#define BLE_GATTS_CFG_BASE 0xA0 /**< GATTS BLE configuration base. */ -#define BLE_GATTS_CFG_LAST 0xBF /**< GATTS BLE configuration last. */ - -#define BLE_L2CAP_CFG_BASE 0xC0 /**< L2CAP BLE configuration base. */ -#define BLE_L2CAP_CFG_LAST 0xDF /**< L2CAP BLE configuration last. */ - - - - - -#ifdef __cplusplus -} -#endif -#endif /* BLE_RANGES_H__ */ - -/** - @} - @} -*/ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_types.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_types.h deleted file mode 100644 index 88c93180c..000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_types.h +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup BLE_COMMON - @{ - @defgroup ble_types Common types and macro definitions - @{ - - @brief Common types and macro definitions for the BLE SoftDevice. - */ - -#ifndef BLE_TYPES_H__ -#define BLE_TYPES_H__ - -#include <stdint.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup BLE_TYPES_DEFINES Defines - * @{ */ - -/** @defgroup BLE_CONN_HANDLES BLE Connection Handles - * @{ */ -#define BLE_CONN_HANDLE_INVALID 0xFFFF /**< Invalid Connection Handle. */ -#define BLE_CONN_HANDLE_ALL 0xFFFE /**< Applies to all Connection Handles. */ -/** @} */ - - -/** @defgroup BLE_UUID_VALUES Assigned Values for BLE UUIDs - * @{ */ -/* Generic UUIDs, applicable to all services */ -#define BLE_UUID_UNKNOWN 0x0000 /**< Reserved UUID. */ -#define BLE_UUID_SERVICE_PRIMARY 0x2800 /**< Primary Service. */ -#define BLE_UUID_SERVICE_SECONDARY 0x2801 /**< Secondary Service. */ -#define BLE_UUID_SERVICE_INCLUDE 0x2802 /**< Include. */ -#define BLE_UUID_CHARACTERISTIC 0x2803 /**< Characteristic. */ -#define BLE_UUID_DESCRIPTOR_CHAR_EXT_PROP 0x2900 /**< Characteristic Extended Properties Descriptor. */ -#define BLE_UUID_DESCRIPTOR_CHAR_USER_DESC 0x2901 /**< Characteristic User Description Descriptor. */ -#define BLE_UUID_DESCRIPTOR_CLIENT_CHAR_CONFIG 0x2902 /**< Client Characteristic Configuration Descriptor. */ -#define BLE_UUID_DESCRIPTOR_SERVER_CHAR_CONFIG 0x2903 /**< Server Characteristic Configuration Descriptor. */ -#define BLE_UUID_DESCRIPTOR_CHAR_PRESENTATION_FORMAT 0x2904 /**< Characteristic Presentation Format Descriptor. */ -#define BLE_UUID_DESCRIPTOR_CHAR_AGGREGATE_FORMAT 0x2905 /**< Characteristic Aggregate Format Descriptor. */ -/* GATT specific UUIDs */ -#define BLE_UUID_GATT 0x1801 /**< Generic Attribute Profile. */ -#define BLE_UUID_GATT_CHARACTERISTIC_SERVICE_CHANGED 0x2A05 /**< Service Changed Characteristic. */ -/* GAP specific UUIDs */ -#define BLE_UUID_GAP 0x1800 /**< Generic Access Profile. */ -#define BLE_UUID_GAP_CHARACTERISTIC_DEVICE_NAME 0x2A00 /**< Device Name Characteristic. */ -#define BLE_UUID_GAP_CHARACTERISTIC_APPEARANCE 0x2A01 /**< Appearance Characteristic. */ -#define BLE_UUID_GAP_CHARACTERISTIC_RECONN_ADDR 0x2A03 /**< Reconnection Address Characteristic. */ -#define BLE_UUID_GAP_CHARACTERISTIC_PPCP 0x2A04 /**< Peripheral Preferred Connection Parameters Characteristic. */ -#define BLE_UUID_GAP_CHARACTERISTIC_CAR 0x2AA6 /**< Central Address Resolution Characteristic. */ -#define BLE_UUID_GAP_CHARACTERISTIC_RPA_ONLY 0x2AC9 /**< Resolvable Private Address Only Characteristic. */ -/** @} */ - - -/** @defgroup BLE_UUID_TYPES Types of UUID - * @{ */ -#define BLE_UUID_TYPE_UNKNOWN 0x00 /**< Invalid UUID type. */ -#define BLE_UUID_TYPE_BLE 0x01 /**< Bluetooth SIG UUID (16-bit). */ -#define BLE_UUID_TYPE_VENDOR_BEGIN 0x02 /**< Vendor UUID types start at this index (128-bit). */ -/** @} */ - - -/** @defgroup BLE_APPEARANCES Bluetooth Appearance values - * @note Retrieved from http://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.gap.appearance.xml - * @{ */ -#define BLE_APPEARANCE_UNKNOWN 0 /**< Unknown. */ -#define BLE_APPEARANCE_GENERIC_PHONE 64 /**< Generic Phone. */ -#define BLE_APPEARANCE_GENERIC_COMPUTER 128 /**< Generic Computer. */ -#define BLE_APPEARANCE_GENERIC_WATCH 192 /**< Generic Watch. */ -#define BLE_APPEARANCE_WATCH_SPORTS_WATCH 193 /**< Watch: Sports Watch. */ -#define BLE_APPEARANCE_GENERIC_CLOCK 256 /**< Generic Clock. */ -#define BLE_APPEARANCE_GENERIC_DISPLAY 320 /**< Generic Display. */ -#define BLE_APPEARANCE_GENERIC_REMOTE_CONTROL 384 /**< Generic Remote Control. */ -#define BLE_APPEARANCE_GENERIC_EYE_GLASSES 448 /**< Generic Eye-glasses. */ -#define BLE_APPEARANCE_GENERIC_TAG 512 /**< Generic Tag. */ -#define BLE_APPEARANCE_GENERIC_KEYRING 576 /**< Generic Keyring. */ -#define BLE_APPEARANCE_GENERIC_MEDIA_PLAYER 640 /**< Generic Media Player. */ -#define BLE_APPEARANCE_GENERIC_BARCODE_SCANNER 704 /**< Generic Barcode Scanner. */ -#define BLE_APPEARANCE_GENERIC_THERMOMETER 768 /**< Generic Thermometer. */ -#define BLE_APPEARANCE_THERMOMETER_EAR 769 /**< Thermometer: Ear. */ -#define BLE_APPEARANCE_GENERIC_HEART_RATE_SENSOR 832 /**< Generic Heart rate Sensor. */ -#define BLE_APPEARANCE_HEART_RATE_SENSOR_HEART_RATE_BELT 833 /**< Heart Rate Sensor: Heart Rate Belt. */ -#define BLE_APPEARANCE_GENERIC_BLOOD_PRESSURE 896 /**< Generic Blood Pressure. */ -#define BLE_APPEARANCE_BLOOD_PRESSURE_ARM 897 /**< Blood Pressure: Arm. */ -#define BLE_APPEARANCE_BLOOD_PRESSURE_WRIST 898 /**< Blood Pressure: Wrist. */ -#define BLE_APPEARANCE_GENERIC_HID 960 /**< Human Interface Device (HID). */ -#define BLE_APPEARANCE_HID_KEYBOARD 961 /**< Keyboard (HID Subtype). */ -#define BLE_APPEARANCE_HID_MOUSE 962 /**< Mouse (HID Subtype). */ -#define BLE_APPEARANCE_HID_JOYSTICK 963 /**< Joystick (HID Subtype). */ -#define BLE_APPEARANCE_HID_GAMEPAD 964 /**< Gamepad (HID Subtype). */ -#define BLE_APPEARANCE_HID_DIGITIZERSUBTYPE 965 /**< Digitizer Tablet (HID Subtype). */ -#define BLE_APPEARANCE_HID_CARD_READER 966 /**< Card Reader (HID Subtype). */ -#define BLE_APPEARANCE_HID_DIGITAL_PEN 967 /**< Digital Pen (HID Subtype). */ -#define BLE_APPEARANCE_HID_BARCODE 968 /**< Barcode Scanner (HID Subtype). */ -#define BLE_APPEARANCE_GENERIC_GLUCOSE_METER 1024 /**< Generic Glucose Meter. */ -#define BLE_APPEARANCE_GENERIC_RUNNING_WALKING_SENSOR 1088 /**< Generic Running Walking Sensor. */ -#define BLE_APPEARANCE_RUNNING_WALKING_SENSOR_IN_SHOE 1089 /**< Running Walking Sensor: In-Shoe. */ -#define BLE_APPEARANCE_RUNNING_WALKING_SENSOR_ON_SHOE 1090 /**< Running Walking Sensor: On-Shoe. */ -#define BLE_APPEARANCE_RUNNING_WALKING_SENSOR_ON_HIP 1091 /**< Running Walking Sensor: On-Hip. */ -#define BLE_APPEARANCE_GENERIC_CYCLING 1152 /**< Generic Cycling. */ -#define BLE_APPEARANCE_CYCLING_CYCLING_COMPUTER 1153 /**< Cycling: Cycling Computer. */ -#define BLE_APPEARANCE_CYCLING_SPEED_SENSOR 1154 /**< Cycling: Speed Sensor. */ -#define BLE_APPEARANCE_CYCLING_CADENCE_SENSOR 1155 /**< Cycling: Cadence Sensor. */ -#define BLE_APPEARANCE_CYCLING_POWER_SENSOR 1156 /**< Cycling: Power Sensor. */ -#define BLE_APPEARANCE_CYCLING_SPEED_CADENCE_SENSOR 1157 /**< Cycling: Speed and Cadence Sensor. */ -#define BLE_APPEARANCE_GENERIC_PULSE_OXIMETER 3136 /**< Generic Pulse Oximeter. */ -#define BLE_APPEARANCE_PULSE_OXIMETER_FINGERTIP 3137 /**< Fingertip (Pulse Oximeter subtype). */ -#define BLE_APPEARANCE_PULSE_OXIMETER_WRIST_WORN 3138 /**< Wrist Worn(Pulse Oximeter subtype). */ -#define BLE_APPEARANCE_GENERIC_WEIGHT_SCALE 3200 /**< Generic Weight Scale. */ -#define BLE_APPEARANCE_GENERIC_OUTDOOR_SPORTS_ACT 5184 /**< Generic Outdoor Sports Activity. */ -#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_DISP 5185 /**< Location Display Device (Outdoor Sports Activity subtype). */ -#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_AND_NAV_DISP 5186 /**< Location and Navigation Display Device (Outdoor Sports Activity subtype). */ -#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_POD 5187 /**< Location Pod (Outdoor Sports Activity subtype). */ -#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_AND_NAV_POD 5188 /**< Location and Navigation Pod (Outdoor Sports Activity subtype). */ -/** @} */ - -/** @brief Set .type and .uuid fields of ble_uuid_struct to specified UUID value. */ -#define BLE_UUID_BLE_ASSIGN(instance, value) do {\ - instance.type = BLE_UUID_TYPE_BLE; \ - instance.uuid = value;} while(0) - -/** @brief Copy type and uuid members from src to dst ble_uuid_t pointer. Both pointers must be valid/non-null. */ -#define BLE_UUID_COPY_PTR(dst, src) do {\ - (dst)->type = (src)->type; \ - (dst)->uuid = (src)->uuid;} while(0) - -/** @brief Copy type and uuid members from src to dst ble_uuid_t struct. */ -#define BLE_UUID_COPY_INST(dst, src) do {\ - (dst).type = (src).type; \ - (dst).uuid = (src).uuid;} while(0) - -/** @brief Compare for equality both type and uuid members of two (valid, non-null) ble_uuid_t pointers. */ -#define BLE_UUID_EQ(p_uuid1, p_uuid2) \ - (((p_uuid1)->type == (p_uuid2)->type) && ((p_uuid1)->uuid == (p_uuid2)->uuid)) - -/** @brief Compare for difference both type and uuid members of two (valid, non-null) ble_uuid_t pointers. */ -#define BLE_UUID_NEQ(p_uuid1, p_uuid2) \ - (((p_uuid1)->type != (p_uuid2)->type) || ((p_uuid1)->uuid != (p_uuid2)->uuid)) - -/** @} */ - -/** @addtogroup BLE_TYPES_STRUCTURES Structures - * @{ */ - -/** @brief 128 bit UUID values. */ -typedef struct -{ - uint8_t uuid128[16]; /**< Little-Endian UUID bytes. */ -} ble_uuid128_t; - -/** @brief Bluetooth Low Energy UUID type, encapsulates both 16-bit and 128-bit UUIDs. */ -typedef struct -{ - uint16_t uuid; /**< 16-bit UUID value or octets 12-13 of 128-bit UUID. */ - uint8_t type; /**< UUID type, see @ref BLE_UUID_TYPES. If type is @ref BLE_UUID_TYPE_UNKNOWN, the value of uuid is undefined. */ -} ble_uuid_t; - -/**@brief Data structure. */ -typedef struct -{ - uint8_t *p_data; /**< Pointer to the data buffer provided to/from the application. */ - uint16_t len; /**< Length of the data buffer, in bytes. */ -} ble_data_t; - -/** @} */ -#ifdef __cplusplus -} -#endif - -#endif /* BLE_TYPES_H__ */ - -/** - @} - @} -*/ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf52/nrf_mbr.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf52/nrf_mbr.h deleted file mode 100644 index c95bb8d4f..000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf52/nrf_mbr.h +++ /dev/null @@ -1,228 +0,0 @@ -/* - * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @defgroup nrf_mbr_api Master Boot Record API - @{ - - @brief APIs for updating SoftDevice and BootLoader - -*/ - -#ifndef NRF_MBR_H__ -#define NRF_MBR_H__ - -#include "nrf_svc.h" -#include <stdint.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup NRF_MBR_DEFINES Defines - * @{ */ - -/**@brief MBR SVC Base number. */ -#define MBR_SVC_BASE (0x18) - -/**@brief Page size in words. */ -#define MBR_PAGE_SIZE_IN_WORDS (1024) - -/** @brief The size that must be reserved for the MBR when a SoftDevice is written to flash. -This is the offset where the first byte of the SoftDevice hex file is written.*/ -#define MBR_SIZE (0x1000) - -/** @} */ - -/** @addtogroup NRF_MBR_ENUMS Enumerations - * @{ */ - -/**@brief nRF Master Boot Record API SVC numbers. */ -enum NRF_MBR_SVCS -{ - SD_MBR_COMMAND = MBR_SVC_BASE, /**< ::sd_mbr_command */ -}; - -/**@brief Possible values for ::sd_mbr_command_t.command */ -enum NRF_MBR_COMMANDS -{ - SD_MBR_COMMAND_COPY_BL, /**< Copy a new BootLoader. @see sd_mbr_command_copy_bl_t*/ - SD_MBR_COMMAND_COPY_SD, /**< Copy a new SoftDevice. @see ::sd_mbr_command_copy_sd_t*/ - SD_MBR_COMMAND_INIT_SD, /**< Initialize forwarding interrupts to SD, and run reset function in SD*/ - SD_MBR_COMMAND_COMPARE, /**< This command works like memcmp. @see ::sd_mbr_command_compare_t*/ - SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET, /**< Change the address the MBR starts after a reset @see ::sd_mbr_command_vector_table_base_set_t*/ - SD_MBR_COMMAND_RESERVED, - SD_MBR_COMMAND_IRQ_FORWARD_ADDRESS_SET, /**< Start forwarding all interrupts to this address @see ::sd_mbr_command_irq_forward_address_set_t*/ -}; - -/** @} */ - -/** @addtogroup NRF_MBR_TYPES Types - * @{ */ - -/**@brief This command copies part of a new SoftDevice - * The destination area is erased before copying. - * If dst is in the middle of a flash page, that whole flash page will be erased. - * If (dst+len) is in the middle of a flash page, that whole flash page will be erased. - * - * The user of this function is responsible for setting the BPROT registers. - * - * @retval ::NRF_SUCCESS indicates that the contents of the memory blocks where copied correctly. - * @retval ::NRF_ERROR_INTERNAL indicates that the contents of the memory blocks where not verified correctly after copying. - */ -typedef struct -{ - uint32_t *src; /**< Pointer to the source of data to be copied.*/ - uint32_t *dst; /**< Pointer to the destination where the content is to be copied.*/ - uint32_t len; /**< Number of 32 bit words to copy. Must be a multiple of @ref MBR_PAGE_SIZE_IN_WORDS words.*/ -} sd_mbr_command_copy_sd_t; - - -/**@brief This command works like memcmp, but takes the length in words. - * - * @retval ::NRF_SUCCESS indicates that the contents of both memory blocks are equal. - * @retval ::NRF_ERROR_NULL indicates that the contents of the memory blocks are not equal. - */ -typedef struct -{ - uint32_t *ptr1; /**< Pointer to block of memory. */ - uint32_t *ptr2; /**< Pointer to block of memory. */ - uint32_t len; /**< Number of 32 bit words to compare.*/ -} sd_mbr_command_compare_t; - - -/**@brief This command copies a new BootLoader. - * With this command, destination of BootLoader is always the address written in NRF_UICR->BOOTADDR. - * - * Destination is erased by this function. - * If (destination+bl_len) is in the middle of a flash page, that whole flash page will be erased. - * - * This function will use PROTENSET to protect the flash that is not intended to be written. - * - * On success, this function will not return. It will start the new BootLoader from reset-vector as normal. - * - * @retval ::NRF_ERROR_INTERNAL indicates an internal error that should not happen. - * @retval ::NRF_ERROR_FORBIDDEN if NRF_UICR->BOOTADDR is not set. - * @retval ::NRF_ERROR_INVALID_LENGTH if parameters attempts to read or write outside flash area. - * @retval ::NRF_ERROR_NO_MEM if no parameter page is provided (see SoftDevice Specification for more info) - */ -typedef struct -{ - uint32_t *bl_src; /**< Pointer to the source of the Bootloader to be be copied.*/ - uint32_t bl_len; /**< Number of 32 bit words to copy for BootLoader. */ -} sd_mbr_command_copy_bl_t; - -/**@brief Change the address the MBR starts after a reset - * - * Once this function has been called, this address is where the MBR will start to forward interrupts to after a reset. - * - * To restore default forwarding this function should be called with @param address set to 0. - * The MBR will then start forwarding to interrupts to the address in NFR_UICR->BOOTADDR or to the SoftDevice if the BOOTADDR is not set. - * - * On success, this function will not return. It will reset the device. - * - * @retval ::NRF_ERROR_INTERNAL indicates an internal error that should not happen. - * @retval ::NRF_ERROR_INVALID_ADDR if parameter address is outside of the flash size. - * @retval ::NRF_ERROR_NO_MEM if no parameter page is provided (see SoftDevice Specification for more info) - */ -typedef struct -{ - uint32_t address; /**< The base address of the interrupt vector table for forwarded interrupts.*/ -} sd_mbr_command_vector_table_base_set_t; - -/**@brief Sets the base address of the interrupt vector table for interrupts forwarded from the MBR - * Unlike sd_mbr_command_vector_table_base_set_t, this function does not reset, and it does not - * change where the MBR starts after reset. - * - * @retval ::NRF_SUCCESS - */ -typedef struct -{ - uint32_t address; /**< The base address of the interrupt vector table for forwarded interrupts.*/ -} sd_mbr_command_irq_forward_address_set_t; - -typedef struct -{ - uint32_t command; /**< type of command to be issued see @ref NRF_MBR_COMMANDS. */ - union - { - sd_mbr_command_copy_sd_t copy_sd; /**< Parameters for copy SoftDevice.*/ - sd_mbr_command_compare_t compare; /**< Parameters for verify.*/ - sd_mbr_command_copy_bl_t copy_bl; /**< Parameters for copy BootLoader. Requires parameter page. */ - sd_mbr_command_vector_table_base_set_t base_set; /**< Parameters for vector table base set. Requires parameter page.*/ - sd_mbr_command_irq_forward_address_set_t irq_forward_address_set; /**< Parameters for irq forward address set*/ - } params; -} sd_mbr_command_t; - -/** @} */ - -/** @addtogroup NRF_MBR_FUNCTIONS Functions - * @{ */ - -/**@brief Issue Master Boot Record commands - * - * Commands used when updating a SoftDevice and bootloader. - * - * The SD_MBR_COMMAND_COPY_BL and SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET requires parameters to be - * retained by the MBR when resetting the IC. This is done in a separate flash page - * provided by the application. The UICR register UICR.NRFFW[1] must be set - * to an address corresponding to a page in the application flash space. This page will be cleared - * by the MBR and used to store the command before reset. When the UICR.NRFFW[1] field is set - * the page it refers to must not be used by the application. If the UICR.NRFFW[1] is set to - * 0xFFFFFFFF (the default) MBR commands which use flash will be unavailable and return - * NRF_ERROR_NO_MEM. - * - * @param[in] param Pointer to a struct describing the command. - * - * @note For return values, see ::sd_mbr_command_copy_sd_t ::sd_mbr_command_copy_bl_t ::sd_mbr_command_compare_t ::sd_mbr_command_vector_table_base_set_t ::sd_mbr_command_irq_forward_address_set_t - * - * @retval NRF_ERROR_NO_MEM if UICR.NRFFW[1] is not set (i.e. is 0xFFFFFFFF). - * @retval NRF_ERROR_INVALID_PARAM if an invalid command is given. -*/ -SVCALL(SD_MBR_COMMAND, uint32_t, sd_mbr_command(sd_mbr_command_t* param)); - -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif // NRF_MBR_H__ - -/** - @} -*/ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_error.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_error.h deleted file mode 100644 index 6badee98e..000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_error.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - /** - @defgroup nrf_error SoftDevice Global Error Codes - @{ - - @brief Global Error definitions -*/ - -/* Header guard */ -#ifndef NRF_ERROR_H__ -#define NRF_ERROR_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/** @defgroup NRF_ERRORS_BASE Error Codes Base number definitions - * @{ */ -#define NRF_ERROR_BASE_NUM (0x0) ///< Global error base -#define NRF_ERROR_SDM_BASE_NUM (0x1000) ///< SDM error base -#define NRF_ERROR_SOC_BASE_NUM (0x2000) ///< SoC error base -#define NRF_ERROR_STK_BASE_NUM (0x3000) ///< STK error base -/** @} */ - -#define NRF_SUCCESS (NRF_ERROR_BASE_NUM + 0) ///< Successful command -#define NRF_ERROR_SVC_HANDLER_MISSING (NRF_ERROR_BASE_NUM + 1) ///< SVC handler is missing -#define NRF_ERROR_SOFTDEVICE_NOT_ENABLED (NRF_ERROR_BASE_NUM + 2) ///< SoftDevice has not been enabled -#define NRF_ERROR_INTERNAL (NRF_ERROR_BASE_NUM + 3) ///< Internal Error -#define NRF_ERROR_NO_MEM (NRF_ERROR_BASE_NUM + 4) ///< No Memory for operation -#define NRF_ERROR_NOT_FOUND (NRF_ERROR_BASE_NUM + 5) ///< Not found -#define NRF_ERROR_NOT_SUPPORTED (NRF_ERROR_BASE_NUM + 6) ///< Not supported -#define NRF_ERROR_INVALID_PARAM (NRF_ERROR_BASE_NUM + 7) ///< Invalid Parameter -#define NRF_ERROR_INVALID_STATE (NRF_ERROR_BASE_NUM + 8) ///< Invalid state, operation disallowed in this state -#define NRF_ERROR_INVALID_LENGTH (NRF_ERROR_BASE_NUM + 9) ///< Invalid Length -#define NRF_ERROR_INVALID_FLAGS (NRF_ERROR_BASE_NUM + 10) ///< Invalid Flags -#define NRF_ERROR_INVALID_DATA (NRF_ERROR_BASE_NUM + 11) ///< Invalid Data -#define NRF_ERROR_DATA_SIZE (NRF_ERROR_BASE_NUM + 12) ///< Invalid Data size -#define NRF_ERROR_TIMEOUT (NRF_ERROR_BASE_NUM + 13) ///< Operation timed out -#define NRF_ERROR_NULL (NRF_ERROR_BASE_NUM + 14) ///< Null Pointer -#define NRF_ERROR_FORBIDDEN (NRF_ERROR_BASE_NUM + 15) ///< Forbidden Operation -#define NRF_ERROR_INVALID_ADDR (NRF_ERROR_BASE_NUM + 16) ///< Bad Memory Address -#define NRF_ERROR_BUSY (NRF_ERROR_BASE_NUM + 17) ///< Busy -#define NRF_ERROR_CONN_COUNT (NRF_ERROR_BASE_NUM + 18) ///< Maximum connection count exceeded. -#define NRF_ERROR_RESOURCES (NRF_ERROR_BASE_NUM + 19) ///< Not enough resources for operation - -#ifdef __cplusplus -} -#endif -#endif // NRF_ERROR_H__ - -/** - @} -*/ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_error_sdm.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_error_sdm.h deleted file mode 100644 index 530959b9d..000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_error_sdm.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - /** - @addtogroup nrf_sdm_api - @{ - @defgroup nrf_sdm_error SoftDevice Manager Error Codes - @{ - - @brief Error definitions for the SDM API -*/ - -/* Header guard */ -#ifndef NRF_ERROR_SDM_H__ -#define NRF_ERROR_SDM_H__ - -#include "nrf_error.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define NRF_ERROR_SDM_LFCLK_SOURCE_UNKNOWN (NRF_ERROR_SDM_BASE_NUM + 0) ///< Unknown LFCLK source. -#define NRF_ERROR_SDM_INCORRECT_INTERRUPT_CONFIGURATION (NRF_ERROR_SDM_BASE_NUM + 1) ///< Incorrect interrupt configuration (can be caused by using illegal priority levels, or having enabled SoftDevice interrupts). -#define NRF_ERROR_SDM_INCORRECT_CLENR0 (NRF_ERROR_SDM_BASE_NUM + 2) ///< Incorrect CLENR0 (can be caused by erroneous SoftDevice flashing). - -#ifdef __cplusplus -} -#endif -#endif // NRF_ERROR_SDM_H__ - -/** - @} - @} -*/ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_error_soc.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_error_soc.h deleted file mode 100644 index 1e784b8db..000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_error_soc.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @addtogroup nrf_soc_api - @{ - @defgroup nrf_soc_error SoC Library Error Codes - @{ - - @brief Error definitions for the SoC library - -*/ - -/* Header guard */ -#ifndef NRF_ERROR_SOC_H__ -#define NRF_ERROR_SOC_H__ - -#include "nrf_error.h" -#ifdef __cplusplus -extern "C" { -#endif - -/* Mutex Errors */ -#define NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN (NRF_ERROR_SOC_BASE_NUM + 0) ///< Mutex already taken - -/* NVIC errors */ -#define NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE (NRF_ERROR_SOC_BASE_NUM + 1) ///< NVIC interrupt not available -#define NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED (NRF_ERROR_SOC_BASE_NUM + 2) ///< NVIC interrupt priority not allowed -#define NRF_ERROR_SOC_NVIC_SHOULD_NOT_RETURN (NRF_ERROR_SOC_BASE_NUM + 3) ///< NVIC should not return - -/* Power errors */ -#define NRF_ERROR_SOC_POWER_MODE_UNKNOWN (NRF_ERROR_SOC_BASE_NUM + 4) ///< Power mode unknown -#define NRF_ERROR_SOC_POWER_POF_THRESHOLD_UNKNOWN (NRF_ERROR_SOC_BASE_NUM + 5) ///< Power POF threshold unknown -#define NRF_ERROR_SOC_POWER_OFF_SHOULD_NOT_RETURN (NRF_ERROR_SOC_BASE_NUM + 6) ///< Power off should not return - -/* Rand errors */ -#define NRF_ERROR_SOC_RAND_NOT_ENOUGH_VALUES (NRF_ERROR_SOC_BASE_NUM + 7) ///< RAND not enough values - -/* PPI errors */ -#define NRF_ERROR_SOC_PPI_INVALID_CHANNEL (NRF_ERROR_SOC_BASE_NUM + 8) ///< Invalid PPI Channel -#define NRF_ERROR_SOC_PPI_INVALID_GROUP (NRF_ERROR_SOC_BASE_NUM + 9) ///< Invalid PPI Group - -#ifdef __cplusplus -} -#endif -#endif // NRF_ERROR_SOC_H__ -/** - @} - @} -*/ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_nvic.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_nvic.h deleted file mode 100644 index 40537b45a..000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_nvic.h +++ /dev/null @@ -1,485 +0,0 @@ -/* - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * @defgroup nrf_nvic_api SoftDevice NVIC API - * @{ - * - * @note In order to use this module, the following code has to be added to a .c file: - * \code - * nrf_nvic_state_t nrf_nvic_state = {0}; - * \endcode - * - * @note Definitions and declarations starting with __ (double underscore) in this header file are - * not intended for direct use by the application. - * - * @brief APIs for the accessing NVIC when using a SoftDevice. - * - */ - -#ifndef NRF_NVIC_H__ -#define NRF_NVIC_H__ - -#include <stdint.h> -#include "nrf.h" - -#include "nrf_error_soc.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/**@addtogroup NRF_NVIC_DEFINES Defines - * @{ */ - -/**@defgroup NRF_NVIC_ISER_DEFINES SoftDevice NVIC internal definitions - * @{ */ - -#define __NRF_NVIC_NVMC_IRQn (30) /**< The peripheral ID of the NVMC. IRQ numbers are used to identify peripherals, but the NVMC doesn't have an IRQ number in the MDK. */ - -#define __NRF_NVIC_ISER_COUNT (2) /**< The number of ISER/ICER registers in the NVIC that are used. */ - -/**@brief Interrupts used by the SoftDevice, with IRQn in the range 0-31. */ -#define __NRF_NVIC_SD_IRQS_0 ((uint32_t)( \ - (1U << POWER_CLOCK_IRQn) \ - | (1U << RADIO_IRQn) \ - | (1U << RTC0_IRQn) \ - | (1U << TIMER0_IRQn) \ - | (1U << RNG_IRQn) \ - | (1U << ECB_IRQn) \ - | (1U << CCM_AAR_IRQn) \ - | (1U << TEMP_IRQn) \ - | (1U << __NRF_NVIC_NVMC_IRQn) \ - | (1U << (uint32_t)SWI5_EGU5_IRQn) \ - )) - -/**@brief Interrupts used by the SoftDevice, with IRQn in the range 32-63. */ -#define __NRF_NVIC_SD_IRQS_1 ((uint32_t)0) - -/**@brief Interrupts available for to application, with IRQn in the range 0-31. */ -#define __NRF_NVIC_APP_IRQS_0 (~__NRF_NVIC_SD_IRQS_0) - -/**@brief Interrupts available for to application, with IRQn in the range 32-63. */ -#define __NRF_NVIC_APP_IRQS_1 (~__NRF_NVIC_SD_IRQS_1) - -/**@} */ - -/**@} */ - -/**@addtogroup NRF_NVIC_VARIABLES Variables - * @{ */ - -/**@brief Type representing the state struct for the SoftDevice NVIC module. */ -typedef struct -{ - uint32_t volatile __irq_masks[__NRF_NVIC_ISER_COUNT]; /**< IRQs enabled by the application in the NVIC. */ - uint32_t volatile __cr_flag; /**< Non-zero if already in a critical region */ -} nrf_nvic_state_t; - -/**@brief Variable keeping the state for the SoftDevice NVIC module. This must be declared in an - * application source file. */ -extern nrf_nvic_state_t nrf_nvic_state; - -/**@} */ - -/**@addtogroup NRF_NVIC_INTERNAL_FUNCTIONS SoftDevice NVIC internal functions - * @{ */ - -/**@brief Disables IRQ interrupts globally, including the SoftDevice's interrupts. - * - * @retval The value of PRIMASK prior to disabling the interrupts. - */ -__STATIC_INLINE int __sd_nvic_irq_disable(void); - -/**@brief Enables IRQ interrupts globally, including the SoftDevice's interrupts. - */ -__STATIC_INLINE void __sd_nvic_irq_enable(void); - -/**@brief Checks if IRQn is available to application - * @param[in] IRQn IRQ to check - * - * @retval 1 (true) if the IRQ to check is available to the application - */ -__STATIC_INLINE uint32_t __sd_nvic_app_accessible_irq(IRQn_Type IRQn); - -/**@brief Checks if priority is available to application - * @param[in] priority priority to check - * - * @retval 1 (true) if the priority to check is available to the application - */ -__STATIC_INLINE uint32_t __sd_nvic_is_app_accessible_priority(uint32_t priority); - -/**@} */ - -/**@addtogroup NRF_NVIC_FUNCTIONS SoftDevice NVIC public functions - * @{ */ - -/**@brief Enable External Interrupt. - * @note Corresponds to NVIC_EnableIRQ in CMSIS. - * - * @pre IRQn is valid and not reserved by the stack. - * - * @param[in] IRQn See the NVIC_EnableIRQ documentation in CMSIS. - * - * @retval ::NRF_SUCCESS The interrupt was enabled. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE The interrupt is not available for the application. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED The interrupt has a priority not available for the application. - */ -__STATIC_INLINE uint32_t sd_nvic_EnableIRQ(IRQn_Type IRQn); - -/**@brief Disable External Interrupt. - * @note Corresponds to NVIC_DisableIRQ in CMSIS. - * - * @pre IRQn is valid and not reserved by the stack. - * - * @param[in] IRQn See the NVIC_DisableIRQ documentation in CMSIS. - * - * @retval ::NRF_SUCCESS The interrupt was disabled. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE The interrupt is not available for the application. - */ -__STATIC_INLINE uint32_t sd_nvic_DisableIRQ(IRQn_Type IRQn); - -/**@brief Get Pending Interrupt. - * @note Corresponds to NVIC_GetPendingIRQ in CMSIS. - * - * @pre IRQn is valid and not reserved by the stack. - * - * @param[in] IRQn See the NVIC_GetPendingIRQ documentation in CMSIS. - * @param[out] p_pending_irq Return value from NVIC_GetPendingIRQ. - * - * @retval ::NRF_SUCCESS The interrupt is available for the application. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application. - */ -__STATIC_INLINE uint32_t sd_nvic_GetPendingIRQ(IRQn_Type IRQn, uint32_t * p_pending_irq); - -/**@brief Set Pending Interrupt. - * @note Corresponds to NVIC_SetPendingIRQ in CMSIS. - * - * @pre IRQn is valid and not reserved by the stack. - * - * @param[in] IRQn See the NVIC_SetPendingIRQ documentation in CMSIS. - * - * @retval ::NRF_SUCCESS The interrupt is set pending. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application. - */ -__STATIC_INLINE uint32_t sd_nvic_SetPendingIRQ(IRQn_Type IRQn); - -/**@brief Clear Pending Interrupt. - * @note Corresponds to NVIC_ClearPendingIRQ in CMSIS. - * - * @pre IRQn is valid and not reserved by the stack. - * - * @param[in] IRQn See the NVIC_ClearPendingIRQ documentation in CMSIS. - * - * @retval ::NRF_SUCCESS The interrupt pending flag is cleared. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application. - */ -__STATIC_INLINE uint32_t sd_nvic_ClearPendingIRQ(IRQn_Type IRQn); - -/**@brief Set Interrupt Priority. - * @note Corresponds to NVIC_SetPriority in CMSIS. - * - * @pre IRQn is valid and not reserved by the stack. - * @pre Priority is valid and not reserved by the stack. - * - * @param[in] IRQn See the NVIC_SetPriority documentation in CMSIS. - * @param[in] priority A valid IRQ priority for use by the application. - * - * @retval ::NRF_SUCCESS The interrupt and priority level is available for the application. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED The interrupt priority is not available for the application. - */ -__STATIC_INLINE uint32_t sd_nvic_SetPriority(IRQn_Type IRQn, uint32_t priority); - -/**@brief Get Interrupt Priority. - * @note Corresponds to NVIC_GetPriority in CMSIS. - * - * @pre IRQn is valid and not reserved by the stack. - * - * @param[in] IRQn See the NVIC_GetPriority documentation in CMSIS. - * @param[out] p_priority Return value from NVIC_GetPriority. - * - * @retval ::NRF_SUCCESS The interrupt priority is returned in p_priority. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE - IRQn is not available for the application. - */ -__STATIC_INLINE uint32_t sd_nvic_GetPriority(IRQn_Type IRQn, uint32_t * p_priority); - -/**@brief System Reset. - * @note Corresponds to NVIC_SystemReset in CMSIS. - * - * @retval ::NRF_ERROR_SOC_NVIC_SHOULD_NOT_RETURN - */ -__STATIC_INLINE uint32_t sd_nvic_SystemReset(void); - -/**@brief Enter critical region. - * - * @post Application interrupts will be disabled. - * @note sd_nvic_critical_region_enter() and ::sd_nvic_critical_region_exit() must be called in matching pairs inside each - * execution context - * @sa sd_nvic_critical_region_exit - * - * @param[out] p_is_nested_critical_region If 1, the application is now in a nested critical region. - * - * @retval ::NRF_SUCCESS - */ -__STATIC_INLINE uint32_t sd_nvic_critical_region_enter(uint8_t * p_is_nested_critical_region); - -/**@brief Exit critical region. - * - * @pre Application has entered a critical region using ::sd_nvic_critical_region_enter. - * @post If not in a nested critical region, the application interrupts will restored to the state before ::sd_nvic_critical_region_enter was called. - * - * @param[in] is_nested_critical_region If this is set to 1, the critical region won't be exited. @sa sd_nvic_critical_region_enter. - * - * @retval ::NRF_SUCCESS - */ -__STATIC_INLINE uint32_t sd_nvic_critical_region_exit(uint8_t is_nested_critical_region); - -/**@} */ - -#ifndef SUPPRESS_INLINE_IMPLEMENTATION - -__STATIC_INLINE int __sd_nvic_irq_disable(void) -{ - int pm = __get_PRIMASK(); - __disable_irq(); - return pm; -} - -__STATIC_INLINE void __sd_nvic_irq_enable(void) -{ - __enable_irq(); -} - -__STATIC_INLINE uint32_t __sd_nvic_app_accessible_irq(IRQn_Type IRQn) -{ - if (IRQn < 32) - { - return ((1UL<<IRQn) & __NRF_NVIC_APP_IRQS_0) != 0; - } - else if (IRQn < 64) - { - return ((1UL<<(IRQn-32)) & __NRF_NVIC_APP_IRQS_1) != 0; - } - else - { - return 1; - } -} - -__STATIC_INLINE uint32_t __sd_nvic_is_app_accessible_priority(uint32_t priority) -{ - if(priority >= (1 << __NVIC_PRIO_BITS)) - { - return 0; - } - if( priority == 0 - || priority == 1 - || priority == 4 - ) - { - return 0; - } - return 1; -} - - -__STATIC_INLINE uint32_t sd_nvic_EnableIRQ(IRQn_Type IRQn) -{ - if (!__sd_nvic_app_accessible_irq(IRQn)) - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; - } - if (!__sd_nvic_is_app_accessible_priority(NVIC_GetPriority(IRQn))) - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED; - } - - if (nrf_nvic_state.__cr_flag) - { - nrf_nvic_state.__irq_masks[(uint32_t)((int32_t)IRQn) >> 5] |= (uint32_t)(1 << ((uint32_t)((int32_t)IRQn) & (uint32_t)0x1F)); - } - else - { - NVIC_EnableIRQ(IRQn); - } - return NRF_SUCCESS; -} - -__STATIC_INLINE uint32_t sd_nvic_DisableIRQ(IRQn_Type IRQn) -{ - if (!__sd_nvic_app_accessible_irq(IRQn)) - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; - } - - if (nrf_nvic_state.__cr_flag) - { - nrf_nvic_state.__irq_masks[(uint32_t)((int32_t)IRQn) >> 5] &= ~(1UL << ((uint32_t)(IRQn) & 0x1F)); - } - else - { - NVIC_DisableIRQ(IRQn); - } - - return NRF_SUCCESS; -} - -__STATIC_INLINE uint32_t sd_nvic_GetPendingIRQ(IRQn_Type IRQn, uint32_t * p_pending_irq) -{ - if (__sd_nvic_app_accessible_irq(IRQn)) - { - *p_pending_irq = NVIC_GetPendingIRQ(IRQn); - return NRF_SUCCESS; - } - else - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; - } -} - -__STATIC_INLINE uint32_t sd_nvic_SetPendingIRQ(IRQn_Type IRQn) -{ - if (__sd_nvic_app_accessible_irq(IRQn)) - { - NVIC_SetPendingIRQ(IRQn); - return NRF_SUCCESS; - } - else - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; - } -} - -__STATIC_INLINE uint32_t sd_nvic_ClearPendingIRQ(IRQn_Type IRQn) -{ - if (__sd_nvic_app_accessible_irq(IRQn)) - { - NVIC_ClearPendingIRQ(IRQn); - return NRF_SUCCESS; - } - else - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; - } -} - -__STATIC_INLINE uint32_t sd_nvic_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if (!__sd_nvic_app_accessible_irq(IRQn)) - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; - } - - if (!__sd_nvic_is_app_accessible_priority(priority)) - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED; - } - - NVIC_SetPriority(IRQn, (uint32_t)priority); - return NRF_SUCCESS; -} - -__STATIC_INLINE uint32_t sd_nvic_GetPriority(IRQn_Type IRQn, uint32_t * p_priority) -{ - if (__sd_nvic_app_accessible_irq(IRQn)) - { - *p_priority = (NVIC_GetPriority(IRQn) & 0xFF); - return NRF_SUCCESS; - } - else - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; - } -} - -__STATIC_INLINE uint32_t sd_nvic_SystemReset(void) -{ - NVIC_SystemReset(); - return NRF_ERROR_SOC_NVIC_SHOULD_NOT_RETURN; -} - -__STATIC_INLINE uint32_t sd_nvic_critical_region_enter(uint8_t * p_is_nested_critical_region) -{ - int was_masked = __sd_nvic_irq_disable(); - if (!nrf_nvic_state.__cr_flag) - { - nrf_nvic_state.__cr_flag = 1; - nrf_nvic_state.__irq_masks[0] = ( NVIC->ICER[0] & __NRF_NVIC_APP_IRQS_0 ); - NVIC->ICER[0] = __NRF_NVIC_APP_IRQS_0; - nrf_nvic_state.__irq_masks[1] = ( NVIC->ICER[1] & __NRF_NVIC_APP_IRQS_1 ); - NVIC->ICER[1] = __NRF_NVIC_APP_IRQS_1; - *p_is_nested_critical_region = 0; - } - else - { - *p_is_nested_critical_region = 1; - } - if (!was_masked) - { - __sd_nvic_irq_enable(); - } - return NRF_SUCCESS; -} - -__STATIC_INLINE uint32_t sd_nvic_critical_region_exit(uint8_t is_nested_critical_region) -{ - if (nrf_nvic_state.__cr_flag && (is_nested_critical_region == 0)) - { - int was_masked = __sd_nvic_irq_disable(); - NVIC->ISER[0] = nrf_nvic_state.__irq_masks[0]; - NVIC->ISER[1] = nrf_nvic_state.__irq_masks[1]; - nrf_nvic_state.__cr_flag = 0; - if (!was_masked) - { - __sd_nvic_irq_enable(); - } - } - - return NRF_SUCCESS; -} - -#endif /* SUPPRESS_INLINE_IMPLEMENTATION */ - -#ifdef __cplusplus -} -#endif - -#endif // NRF_NVIC_H__ - -/**@} */ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_sdm.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_sdm.h deleted file mode 100644 index c41d86d46..000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_sdm.h +++ /dev/null @@ -1,355 +0,0 @@ -/* - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - @defgroup nrf_sdm_api SoftDevice Manager API - @{ - - @brief APIs for SoftDevice management. - -*/ - -#ifndef NRF_SDM_H__ -#define NRF_SDM_H__ - -#include "nrf_svc.h" -#include "nrf.h" -#include "nrf_soc.h" -#include "nrf_error_sdm.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup NRF_SDM_DEFINES Defines - * @{ */ -#ifdef NRFSOC_DOXYGEN -/// Declared in nrf_mbr.h -#define MBR_SIZE 0 -#warning test -#endif - -/** @brief The major version for the SoftDevice binary distributed with this header file. */ -#define SD_MAJOR_VERSION (5) - -/** @brief The minor version for the SoftDevice binary distributed with this header file. */ -#define SD_MINOR_VERSION (0) - -/** @brief The bugfix version for the SoftDevice binary distributed with this header file. */ -#define SD_BUGFIX_VERSION (0) - -/** @brief The full version number for the SoftDevice binary this header file was distributed - * with, as a decimal number in the form Mmmmbbb, where: - * - M is major version (one or more digits) - * - mmm is minor version (three digits) - * - bbb is bugfix version (three digits). */ -#define SD_VERSION (SD_MAJOR_VERSION * 1000000 + SD_MINOR_VERSION * 1000 + SD_BUGFIX_VERSION) - -/** @brief SoftDevice Manager SVC Base number. */ -#define SDM_SVC_BASE 0x10 - -/** @brief SoftDevice unique string size in bytes. */ -#define SD_UNIQUE_STR_SIZE 20 - -/** @brief Invalid info field. Returned when an info field does not exist. */ -#define SDM_INFO_FIELD_INVALID (0) - -/** @brief Defines the SoftDevice Information Structure location (address) as an offset from -the start of the SoftDevice (without MBR)*/ -#define SOFTDEVICE_INFO_STRUCT_OFFSET (0x2000) - -/** @brief Defines the absolute SoftDevice Information Structure location (address) when the - * SoftDevice is installed just above the MBR (the usual case). */ -#define SOFTDEVICE_INFO_STRUCT_ADDRESS (SOFTDEVICE_INFO_STRUCT_OFFSET + MBR_SIZE) - -/** @brief Defines the offset for the SoftDevice Information Structure size value relative to the - * SoftDevice base address. The size value is of type uint8_t. */ -#define SD_INFO_STRUCT_SIZE_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET) - -/** @brief Defines the offset for the SoftDevice size value relative to the SoftDevice base address. - * The size value is of type uint32_t. */ -#define SD_SIZE_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x08) - -/** @brief Defines the offset for FWID value relative to the SoftDevice base address. The FWID value - * is of type uint16_t. */ -#define SD_FWID_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x0C) - -/** @brief Defines the offset for the SoftDevice ID relative to the SoftDevice base address. The ID - * is of type uint32_t. */ -#define SD_ID_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x10) - -/** @brief Defines the offset for the SoftDevice version relative to the SoftDevice base address in - * the same format as @ref SD_VERSION, stored as an uint32_t. */ -#define SD_VERSION_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x14) - -/** @brief Defines the offset for the SoftDevice unique string relative to the SoftDevice base address. - * The SD_UNIQUE_STR is stored as an array of uint8_t. The size of array is @ref SD_UNIQUE_STR_SIZE. - */ -#define SD_UNIQUE_STR_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x18) - -/** @brief Defines a macro for retrieving the actual SoftDevice Information Structure size value - * from a given base address. Use @ref MBR_SIZE as the argument when the SoftDevice is - * installed just above the MBR (the usual case). */ -#define SD_INFO_STRUCT_SIZE_GET(baseaddr) (*((uint8_t *) ((baseaddr) + SD_INFO_STRUCT_SIZE_OFFSET))) - -/** @brief Defines a macro for retrieving the actual SoftDevice size value from a given base - * address. Use @ref MBR_SIZE as the argument when the SoftDevice is installed just above - * the MBR (the usual case). */ -#define SD_SIZE_GET(baseaddr) (*((uint32_t *) ((baseaddr) + SD_SIZE_OFFSET))) - -/** @brief Defines a macro for retrieving the actual FWID value from a given base address. Use @ref - * MBR_SIZE as the argument when the SoftDevice is installed just above the MBR (the usual - * case). */ -#define SD_FWID_GET(baseaddr) (*((uint16_t *) ((baseaddr) + SD_FWID_OFFSET))) - -/** @brief Defines a macro for retrieving the actual SoftDevice ID from a given base address. Use - * @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR (the - * usual case). */ -#define SD_ID_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_ID_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \ - ? (*((uint32_t *) ((baseaddr) + SD_ID_OFFSET))) : SDM_INFO_FIELD_INVALID) - -/** @brief Defines a macro for retrieving the actual SoftDevice version from a given base address. - * Use @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR - * (the usual case). */ -#define SD_VERSION_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_VERSION_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \ - ? (*((uint32_t *) ((baseaddr) + SD_VERSION_OFFSET))) : SDM_INFO_FIELD_INVALID) - -/** @brief Defines a macro for retrieving the address of SoftDevice unique str based on a given base address. - * Use @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR - * (the usual case). */ -#define SD_UNIQUE_STR_ADDR_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_UNIQUE_STR_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \ - ? (((uint8_t *) ((baseaddr) + SD_UNIQUE_STR_OFFSET))) : SDM_INFO_FIELD_INVALID) - -/**@defgroup NRF_FAULT_ID_RANGES Fault ID ranges - * @{ */ -#define NRF_FAULT_ID_SD_RANGE_START 0x00000000 /**< SoftDevice ID range start. */ -#define NRF_FAULT_ID_APP_RANGE_START 0x00001000 /**< Application ID range start. */ -/**@} */ - -/**@defgroup NRF_FAULT_IDS Fault ID types - * @{ */ -#define NRF_FAULT_ID_SD_ASSERT (NRF_FAULT_ID_SD_RANGE_START + 1) /**< SoftDevice assertion. The info parameter is reserved for future used. */ -#define NRF_FAULT_ID_APP_MEMACC (NRF_FAULT_ID_APP_RANGE_START + 1) /**< Application invalid memory access. The info parameter will contain 0x00000000, - in case of SoftDevice RAM access violation. In case of SoftDevice peripheral - register violation the info parameter will contain the sub-region number of - PREGION[0], on whose address range the disallowed write access caused the - memory access fault. */ -/**@} */ - -/** @} */ - -/** @addtogroup NRF_SDM_ENUMS Enumerations - * @{ */ - -/**@brief nRF SoftDevice Manager API SVC numbers. */ -enum NRF_SD_SVCS -{ - SD_SOFTDEVICE_ENABLE = SDM_SVC_BASE, /**< ::sd_softdevice_enable */ - SD_SOFTDEVICE_DISABLE, /**< ::sd_softdevice_disable */ - SD_SOFTDEVICE_IS_ENABLED, /**< ::sd_softdevice_is_enabled */ - SD_SOFTDEVICE_VECTOR_TABLE_BASE_SET, /**< ::sd_softdevice_vector_table_base_set */ - SVC_SDM_LAST /**< Placeholder for last SDM SVC */ -}; - -/** @} */ - -/** @addtogroup NRF_SDM_DEFINES Defines - * @{ */ - -/**@defgroup NRF_CLOCK_LF_ACCURACY Clock accuracy - * @{ */ - -#define NRF_CLOCK_LF_ACCURACY_250_PPM (0) /**< Default: 250 ppm */ -#define NRF_CLOCK_LF_ACCURACY_500_PPM (1) /**< 500 ppm */ -#define NRF_CLOCK_LF_ACCURACY_150_PPM (2) /**< 150 ppm */ -#define NRF_CLOCK_LF_ACCURACY_100_PPM (3) /**< 100 ppm */ -#define NRF_CLOCK_LF_ACCURACY_75_PPM (4) /**< 75 ppm */ -#define NRF_CLOCK_LF_ACCURACY_50_PPM (5) /**< 50 ppm */ -#define NRF_CLOCK_LF_ACCURACY_30_PPM (6) /**< 30 ppm */ -#define NRF_CLOCK_LF_ACCURACY_20_PPM (7) /**< 20 ppm */ -#define NRF_CLOCK_LF_ACCURACY_10_PPM (8) /**< 10 ppm */ -#define NRF_CLOCK_LF_ACCURACY_5_PPM (9) /**< 5 ppm */ -#define NRF_CLOCK_LF_ACCURACY_2_PPM (10) /**< 2 ppm */ -#define NRF_CLOCK_LF_ACCURACY_1_PPM (11) /**< 1 ppm */ - -/** @} */ - -/**@defgroup NRF_CLOCK_LF_SRC Possible LFCLK oscillator sources - * @{ */ - -#define NRF_CLOCK_LF_SRC_RC (0) /**< LFCLK RC oscillator. */ -#define NRF_CLOCK_LF_SRC_XTAL (1) /**< LFCLK crystal oscillator. */ -#define NRF_CLOCK_LF_SRC_SYNTH (2) /**< LFCLK Synthesized from HFCLK. */ - -/** @} */ - -/** @} */ - -/** @addtogroup NRF_SDM_TYPES Types - * @{ */ - -/**@brief Type representing LFCLK oscillator source. */ -typedef struct -{ - uint8_t source; /**< LF oscillator clock source, see @ref NRF_CLOCK_LF_SRC. */ - uint8_t rc_ctiv; /**< Only for NRF_CLOCK_LF_SRC_RC: Calibration timer interval in 1/4 second - units (nRF51: 1-64, nRF52: 1-32). - @note To avoid excessive clock drift, 0.5 degrees Celsius is the - maximum temperature change allowed in one calibration timer - interval. The interval should be selected to ensure this. - - @note Must be 0 if source is not NRF_CLOCK_LF_SRC_RC. */ - uint8_t rc_temp_ctiv; /**< Only for NRF_CLOCK_LF_SRC_RC: How often (in number of calibration - intervals) the RC oscillator shall be calibrated if the temperature - hasn't changed. - 0: Always calibrate even if the temperature hasn't changed. - 1: Only calibrate if the temperature has changed (nRF51 only). - 2-33: Check the temperature and only calibrate if it has changed, - however calibration will take place every rc_temp_ctiv - intervals in any case. - - @note Must be 0 if source is not NRF_CLOCK_LF_SRC_RC. - - @note For nRF52, the application must ensure calibration at least once - every 8 seconds to ensure +/-500 ppm clock stability. The - recommended configuration for NRF_CLOCK_LF_SRC_RC on nRF52 is - rc_ctiv=16 and rc_temp_ctiv=2. This will ensure calibration at - least once every 8 seconds and for temperature changes of 0.5 - degrees Celsius every 4 seconds. See the Product Specification - for the nRF52 device being used for more information.*/ - uint8_t accuracy; /**< External clock accuracy used in the LL to compute timing - windows, see @ref NRF_CLOCK_LF_ACCURACY.*/ -} nrf_clock_lf_cfg_t; - -/**@brief Fault Handler type. - * - * When certain unrecoverable errors occur within the application or SoftDevice the fault handler will be called back. - * The protocol stack will be in an undefined state when this happens and the only way to recover will be to - * perform a reset, using e.g. CMSIS NVIC_SystemReset(). - * If the application returns from the fault handler the SoftDevice will call NVIC_SystemReset(). - * - * @note This callback is executed in HardFault context, thus SVC functions cannot be called from the fault callback. - * - * @param[in] id Fault identifier. See @ref NRF_FAULT_IDS. - * @param[in] pc The program counter of the instruction that triggered the fault. - * @param[in] info Optional additional information regarding the fault. Refer to each Fault identifier for details. - * - * @note When id is set to NRF_FAULT_ID_APP_MEMACC, pc will contain the address of the instruction being executed at the time when - * the fault is detected by the CPU. The CPU program counter may have advanced up to 2 instructions (no branching) after the one that triggered the fault. - */ -typedef void (*nrf_fault_handler_t)(uint32_t id, uint32_t pc, uint32_t info); - -/** @} */ - -/** @addtogroup NRF_SDM_FUNCTIONS Functions - * @{ */ - -/**@brief Enables the SoftDevice and by extension the protocol stack. - * - * @note Some care must be taken if a low frequency clock source is already running when calling this function: - * If the LF clock has a different source then the one currently running, it will be stopped. Then, the new - * clock source will be started. - * - * @note This function has no effect when returning with an error. - * - * @post If return code is ::NRF_SUCCESS - * - SoC library and protocol stack APIs are made available. - * - A portion of RAM will be unavailable (see relevant SDS documentation). - * - Some peripherals will be unavailable or available only through the SoC API (see relevant SDS documentation). - * - Interrupts will not arrive from protected peripherals or interrupts. - * - nrf_nvic_ functions must be used instead of CMSIS NVIC_ functions for reliable usage of the SoftDevice. - * - Interrupt latency may be affected by the SoftDevice (see relevant SDS documentation). - * - Chosen low frequency clock source will be running. - * - * @param p_clock_lf_cfg Low frequency clock source and accuracy. - If NULL the clock will be configured as an RC source with rc_ctiv = 16 and .rc_temp_ctiv = 2 - In the case of XTAL source, the PPM accuracy of the chosen clock source must be greater than or equal to the actual characteristics of your XTAL clock. - * @param fault_handler Callback to be invoked in case of fault, cannot be NULL. - * - * @retval ::NRF_SUCCESS - * @retval ::NRF_ERROR_INVALID_ADDR Invalid or NULL pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE SoftDevice is already enabled, and the clock source and fault handler cannot be updated. - * @retval ::NRF_ERROR_SDM_INCORRECT_INTERRUPT_CONFIGURATION SoftDevice interrupt is already enabled, or an enabled interrupt has an illegal priority level. - * @retval ::NRF_ERROR_SDM_LFCLK_SOURCE_UNKNOWN Unknown low frequency clock source selected. - */ -SVCALL(SD_SOFTDEVICE_ENABLE, uint32_t, sd_softdevice_enable(nrf_clock_lf_cfg_t const * p_clock_lf_cfg, nrf_fault_handler_t fault_handler)); - - -/**@brief Disables the SoftDevice and by extension the protocol stack. - * - * Idempotent function to disable the SoftDevice. - * - * @post SoC library and protocol stack APIs are made unavailable. - * @post All interrupts that was protected by the SoftDevice will be disabled and initialized to priority 0 (highest). - * @post All peripherals used by the SoftDevice will be reset to default values. - * @post All of RAM become available. - * @post All interrupts are forwarded to the application. - * @post LFCLK source chosen in ::sd_softdevice_enable will be left running. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_SOFTDEVICE_DISABLE, uint32_t, sd_softdevice_disable(void)); - -/**@brief Check if the SoftDevice is enabled. - * - * @param[out] p_softdevice_enabled If the SoftDevice is enabled: 1 else 0. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_SOFTDEVICE_IS_ENABLED, uint32_t, sd_softdevice_is_enabled(uint8_t * p_softdevice_enabled)); - -/**@brief Sets the base address of the interrupt vector table for interrupts forwarded from the SoftDevice - * - * This function is only intended to be called when a bootloader is enabled. - * - * @param[in] address The base address of the interrupt vector table for forwarded interrupts. - - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_SOFTDEVICE_VECTOR_TABLE_BASE_SET, uint32_t, sd_softdevice_vector_table_base_set(uint32_t address)); - -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif // NRF_SDM_H__ - -/** - @} -*/ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_soc.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_soc.h deleted file mode 100644 index d7d3c801b..000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_soc.h +++ /dev/null @@ -1,931 +0,0 @@ -/* - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * @defgroup nrf_soc_api SoC Library API - * @{ - * - * @brief APIs for the SoC library. - * - */ - -#ifndef NRF_SOC_H__ -#define NRF_SOC_H__ - -#include <stdint.h> -#include <stdbool.h> -#include "nrf_svc.h" -#include "nrf.h" - -#include "nrf_error_soc.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/**@addtogroup NRF_SOC_DEFINES Defines - * @{ */ - -/**@brief The number of the lowest SVC number reserved for the SoC library. */ -#define SOC_SVC_BASE (0x20) /**< Base value for SVCs that are available when the SoftDevice is disabled. */ -#define SOC_SVC_BASE_NOT_AVAILABLE (0x2B) /**< Base value for SVCs that are not available when the SoftDevice is disabled. */ - -/**@brief Guaranteed time for application to process radio inactive notification. */ -#define NRF_RADIO_NOTIFICATION_INACTIVE_GUARANTEED_TIME_US (62) - -/**@brief The minimum allowed timeslot extension time. */ -#define NRF_RADIO_MINIMUM_TIMESLOT_LENGTH_EXTENSION_TIME_US (200) - -/**@brief The maximum processing time to handle a timeslot extension. */ -#define NRF_RADIO_MAX_EXTENSION_PROCESSING_TIME_US (17) - -/**@brief The latest time before the end of a timeslot the timeslot can be extended. */ -#define NRF_RADIO_MIN_EXTENSION_MARGIN_US (79) - -#define SOC_ECB_KEY_LENGTH (16) /**< ECB key length. */ -#define SOC_ECB_CLEARTEXT_LENGTH (16) /**< ECB cleartext length. */ -#define SOC_ECB_CIPHERTEXT_LENGTH (SOC_ECB_CLEARTEXT_LENGTH) /**< ECB ciphertext length. */ - -#define SD_EVT_IRQn (SWI2_EGU2_IRQn) /**< SoftDevice Event IRQ number. Used for both protocol events and SoC events. */ -#define SD_EVT_IRQHandler (SWI2_EGU2_IRQHandler) /**< SoftDevice Event IRQ handler. Used for both protocol events and SoC events. - The default interrupt priority for this handler is set to 4 */ -#define RADIO_NOTIFICATION_IRQn (SWI1_EGU1_IRQn) /**< The radio notification IRQ number. */ -#define RADIO_NOTIFICATION_IRQHandler (SWI1_EGU1_IRQHandler) /**< The radio notification IRQ handler. - The default interrupt priority for this handler is set to 4 */ -#define NRF_RADIO_LENGTH_MIN_US (100) /**< The shortest allowed radio timeslot, in microseconds. */ -#define NRF_RADIO_LENGTH_MAX_US (100000) /**< The longest allowed radio timeslot, in microseconds. */ - -#define NRF_RADIO_DISTANCE_MAX_US (128000000UL - 1UL) /**< The longest timeslot distance, in microseconds, allowed for the distance parameter (see @ref nrf_radio_request_normal_t) in the request. */ - -#define NRF_RADIO_EARLIEST_TIMEOUT_MAX_US (128000000UL - 1UL) /**< The longest timeout, in microseconds, allowed when requesting the earliest possible timeslot. */ - -#define NRF_RADIO_START_JITTER_US (2) /**< The maximum jitter in @ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START relative to the requested start time. */ - -/**@} */ - -/**@addtogroup NRF_SOC_ENUMS Enumerations - * @{ */ - -/**@brief The SVC numbers used by the SVC functions in the SoC library. */ -enum NRF_SOC_SVCS -{ - SD_PPI_CHANNEL_ENABLE_GET = SOC_SVC_BASE, - SD_PPI_CHANNEL_ENABLE_SET, - SD_PPI_CHANNEL_ENABLE_CLR, - SD_PPI_CHANNEL_ASSIGN, - SD_PPI_GROUP_TASK_ENABLE, - SD_PPI_GROUP_TASK_DISABLE, - SD_PPI_GROUP_ASSIGN, - SD_PPI_GROUP_GET, - SD_FLASH_PAGE_ERASE, - SD_FLASH_WRITE, - SD_FLASH_PROTECT, - SD_MUTEX_NEW = SOC_SVC_BASE_NOT_AVAILABLE, - SD_MUTEX_ACQUIRE, - SD_MUTEX_RELEASE, - SD_RAND_APPLICATION_POOL_CAPACITY_GET, - SD_RAND_APPLICATION_BYTES_AVAILABLE_GET, - SD_RAND_APPLICATION_VECTOR_GET, - SD_POWER_MODE_SET, - SD_POWER_SYSTEM_OFF, - SD_POWER_RESET_REASON_GET, - SD_POWER_RESET_REASON_CLR, - SD_POWER_POF_ENABLE, - SD_POWER_POF_THRESHOLD_SET, - SD_POWER_RAM_POWER_SET, - SD_POWER_RAM_POWER_CLR, - SD_POWER_RAM_POWER_GET, - SD_POWER_GPREGRET_SET, - SD_POWER_GPREGRET_CLR, - SD_POWER_GPREGRET_GET, - SD_POWER_DCDC_MODE_SET, - SD_APP_EVT_WAIT, - SD_CLOCK_HFCLK_REQUEST, - SD_CLOCK_HFCLK_RELEASE, - SD_CLOCK_HFCLK_IS_RUNNING, - SD_RADIO_NOTIFICATION_CFG_SET, - SD_ECB_BLOCK_ENCRYPT, - SD_ECB_BLOCKS_ENCRYPT, - SD_RADIO_SESSION_OPEN, - SD_RADIO_SESSION_CLOSE, - SD_RADIO_REQUEST, - SD_EVT_GET, - SD_TEMP_GET, - SVC_SOC_LAST -}; - -/**@brief Possible values of a ::nrf_mutex_t. */ -enum NRF_MUTEX_VALUES -{ - NRF_MUTEX_FREE, - NRF_MUTEX_TAKEN -}; - -/**@brief Power modes. */ -enum NRF_POWER_MODES -{ - NRF_POWER_MODE_CONSTLAT, /**< Constant latency mode. See power management in the reference manual. */ - NRF_POWER_MODE_LOWPWR /**< Low power mode. See power management in the reference manual. */ -}; - - -/**@brief Power failure thresholds */ -enum NRF_POWER_THRESHOLDS -{ - NRF_POWER_THRESHOLD_V17 = 4UL, /**< 1.7 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V18, /**< 1.8 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V19, /**< 1.9 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V20, /**< 2.0 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V21, /**< 2.1 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V22, /**< 2.2 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V23, /**< 2.3 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V24, /**< 2.4 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V25, /**< 2.5 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V26, /**< 2.6 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V27, /**< 2.7 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V28 /**< 2.8 Volts power failure threshold. */ -}; - - -/**@brief DC/DC converter modes. */ -enum NRF_POWER_DCDC_MODES -{ - NRF_POWER_DCDC_DISABLE, /**< The DCDC is disabled. */ - NRF_POWER_DCDC_ENABLE /**< The DCDC is enabled. */ -}; - -/**@brief Radio notification distances. */ -enum NRF_RADIO_NOTIFICATION_DISTANCES -{ - NRF_RADIO_NOTIFICATION_DISTANCE_NONE = 0, /**< The event does not have a notification. */ - NRF_RADIO_NOTIFICATION_DISTANCE_800US, /**< The distance from the active notification to start of radio activity. */ - NRF_RADIO_NOTIFICATION_DISTANCE_1740US, /**< The distance from the active notification to start of radio activity. */ - NRF_RADIO_NOTIFICATION_DISTANCE_2680US, /**< The distance from the active notification to start of radio activity. */ - NRF_RADIO_NOTIFICATION_DISTANCE_3620US, /**< The distance from the active notification to start of radio activity. */ - NRF_RADIO_NOTIFICATION_DISTANCE_4560US, /**< The distance from the active notification to start of radio activity. */ - NRF_RADIO_NOTIFICATION_DISTANCE_5500US /**< The distance from the active notification to start of radio activity. */ -}; - - -/**@brief Radio notification types. */ -enum NRF_RADIO_NOTIFICATION_TYPES -{ - NRF_RADIO_NOTIFICATION_TYPE_NONE = 0, /**< The event does not have a radio notification signal. */ - NRF_RADIO_NOTIFICATION_TYPE_INT_ON_ACTIVE, /**< Using interrupt for notification when the radio will be enabled. */ - NRF_RADIO_NOTIFICATION_TYPE_INT_ON_INACTIVE, /**< Using interrupt for notification when the radio has been disabled. */ - NRF_RADIO_NOTIFICATION_TYPE_INT_ON_BOTH, /**< Using interrupt for notification both when the radio will be enabled and disabled. */ -}; - -/**@brief The Radio signal callback types. */ -enum NRF_RADIO_CALLBACK_SIGNAL_TYPE -{ - NRF_RADIO_CALLBACK_SIGNAL_TYPE_START, /**< This signal indicates the start of the radio timeslot. */ - NRF_RADIO_CALLBACK_SIGNAL_TYPE_TIMER0, /**< This signal indicates the NRF_TIMER0 interrupt. */ - NRF_RADIO_CALLBACK_SIGNAL_TYPE_RADIO, /**< This signal indicates the NRF_RADIO interrupt. */ - NRF_RADIO_CALLBACK_SIGNAL_TYPE_EXTEND_FAILED, /**< This signal indicates extend action failed. */ - NRF_RADIO_CALLBACK_SIGNAL_TYPE_EXTEND_SUCCEEDED /**< This signal indicates extend action succeeded. */ -}; - -/**@brief The actions requested by the signal callback. - * - * This code gives the SOC instructions about what action to take when the signal callback has - * returned. - */ -enum NRF_RADIO_SIGNAL_CALLBACK_ACTION -{ - NRF_RADIO_SIGNAL_CALLBACK_ACTION_NONE, /**< Return without action. */ - NRF_RADIO_SIGNAL_CALLBACK_ACTION_EXTEND, /**< Request an extension of the current - timeslot. Maximum execution time for this action: - @ref NRF_RADIO_MAX_EXTENSION_PROCESSING_TIME_US. - This action must be started at least @ref - NRF_RADIO_MIN_EXTENSION_MARGIN_US before - the end of the timeslot. */ - NRF_RADIO_SIGNAL_CALLBACK_ACTION_END, /**< End the current radio timeslot. */ - NRF_RADIO_SIGNAL_CALLBACK_ACTION_REQUEST_AND_END /**< Request a new radio timeslot and end the current timeslot. */ -}; - -/**@brief Radio timeslot high frequency clock source configuration. */ -enum NRF_RADIO_HFCLK_CFG -{ - NRF_RADIO_HFCLK_CFG_XTAL_GUARANTEED, /**< The SoftDevice will guarantee that the high frequency clock source is the - external crystal for the whole duration of the timeslot. This should be the - preferred option for events that use the radio or require high timing accuracy. - @note The SoftDevice will automatically turn on and off the external crystal, - at the beginning and end of the timeslot, respectively. The crystal may also - intentionally be left running after the timeslot, in cases where it is needed - by the SoftDevice shortly after the end of the timeslot. */ - NRF_RADIO_HFCLK_CFG_NO_GUARANTEE /**< This configuration allows for earlier and tighter scheduling of timeslots. - The RC oscillator may be the clock source in part or for the whole duration of the timeslot. - The RC oscillator's accuracy must therefore be taken into consideration. - @note If the application will use the radio peripheral in timeslots with this configuration, - it must make sure that the crystal is running and stable before starting the radio. */ -}; - -/**@brief Radio timeslot priorities. */ -enum NRF_RADIO_PRIORITY -{ - NRF_RADIO_PRIORITY_HIGH, /**< High (equal priority as the normal connection priority of the SoftDevice stack(s)). */ - NRF_RADIO_PRIORITY_NORMAL, /**< Normal (equal priority as the priority of secondary activities of the SoftDevice stack(s)). */ -}; - -/**@brief Radio timeslot request type. */ -enum NRF_RADIO_REQUEST_TYPE -{ - NRF_RADIO_REQ_TYPE_EARLIEST, /**< Request radio timeslot as early as possible. This should always be used for the first request in a session. */ - NRF_RADIO_REQ_TYPE_NORMAL /**< Normal radio timeslot request. */ -}; - -/**@brief SoC Events. */ -enum NRF_SOC_EVTS -{ - NRF_EVT_HFCLKSTARTED, /**< Event indicating that the HFCLK has started. */ - NRF_EVT_POWER_FAILURE_WARNING, /**< Event indicating that a power failure warning has occurred. */ - NRF_EVT_FLASH_OPERATION_SUCCESS, /**< Event indicating that the ongoing flash operation has completed successfully. */ - NRF_EVT_FLASH_OPERATION_ERROR, /**< Event indicating that the ongoing flash operation has timed out with an error. */ - NRF_EVT_RADIO_BLOCKED, /**< Event indicating that a radio timeslot was blocked. */ - NRF_EVT_RADIO_CANCELED, /**< Event indicating that a radio timeslot was canceled by SoftDevice. */ - NRF_EVT_RADIO_SIGNAL_CALLBACK_INVALID_RETURN, /**< Event indicating that a radio timeslot signal callback handler return was invalid. */ - NRF_EVT_RADIO_SESSION_IDLE, /**< Event indicating that a radio timeslot session is idle. */ - NRF_EVT_RADIO_SESSION_CLOSED, /**< Event indicating that a radio timeslot session is closed. */ - NRF_EVT_NUMBER_OF_EVTS -}; - -/**@} */ - - -/**@addtogroup NRF_SOC_STRUCTURES Structures - * @{ */ - -/**@brief Represents a mutex for use with the nrf_mutex functions. - * @note Accessing the value directly is not safe, use the mutex functions! - */ -typedef volatile uint8_t nrf_mutex_t; - -/**@brief Parameters for a request for a timeslot as early as possible. */ -typedef struct -{ - uint8_t hfclk; /**< High frequency clock source, see @ref NRF_RADIO_HFCLK_CFG. */ - uint8_t priority; /**< The radio timeslot priority, see @ref NRF_RADIO_PRIORITY. */ - uint32_t length_us; /**< The radio timeslot length (in the range 100 to 100,000] microseconds). */ - uint32_t timeout_us; /**< Longest acceptable delay until the start of the requested timeslot (up to @ref NRF_RADIO_EARLIEST_TIMEOUT_MAX_US microseconds). */ -} nrf_radio_request_earliest_t; - -/**@brief Parameters for a normal radio timeslot request. */ -typedef struct -{ - uint8_t hfclk; /**< High frequency clock source, see @ref NRF_RADIO_HFCLK_CFG. */ - uint8_t priority; /**< The radio timeslot priority, see @ref NRF_RADIO_PRIORITY. */ - uint32_t distance_us; /**< Distance from the start of the previous radio timeslot (up to @ref NRF_RADIO_DISTANCE_MAX_US microseconds). */ - uint32_t length_us; /**< The radio timeslot length (in the range [100..100,000] microseconds). */ -} nrf_radio_request_normal_t; - -/**@brief Radio timeslot request parameters. */ -typedef struct -{ - uint8_t request_type; /**< Type of request, see @ref NRF_RADIO_REQUEST_TYPE. */ - union - { - nrf_radio_request_earliest_t earliest; /**< Parameters for requesting a radio timeslot as early as possible. */ - nrf_radio_request_normal_t normal; /**< Parameters for requesting a normal radio timeslot. */ - } params; /**< Parameter union. */ -} nrf_radio_request_t; - -/**@brief Return parameters of the radio timeslot signal callback. */ -typedef struct -{ - uint8_t callback_action; /**< The action requested by the application when returning from the signal callback, see @ref NRF_RADIO_SIGNAL_CALLBACK_ACTION. */ - union - { - struct - { - nrf_radio_request_t * p_next; /**< The request parameters for the next radio timeslot. */ - } request; /**< Additional parameters for return_code @ref NRF_RADIO_SIGNAL_CALLBACK_ACTION_REQUEST_AND_END. */ - struct - { - uint32_t length_us; /**< Requested extension of the radio timeslot duration (microseconds) (for minimum time see @ref NRF_RADIO_MINIMUM_TIMESLOT_LENGTH_EXTENSION_TIME_US). */ - } extend; /**< Additional parameters for return_code @ref NRF_RADIO_SIGNAL_CALLBACK_ACTION_EXTEND. */ - } params; /**< Parameter union. */ -} nrf_radio_signal_callback_return_param_t; - -/**@brief The radio timeslot signal callback type. - * - * @note In case of invalid return parameters, the radio timeslot will automatically end - * immediately after returning from the signal callback and the - * @ref NRF_EVT_RADIO_SIGNAL_CALLBACK_INVALID_RETURN event will be sent. - * @note The returned struct pointer must remain valid after the signal callback - * function returns. For instance, this means that it must not point to a stack variable. - * - * @param[in] signal_type Type of signal, see @ref NRF_RADIO_CALLBACK_SIGNAL_TYPE. - * - * @return Pointer to structure containing action requested by the application. - */ -typedef nrf_radio_signal_callback_return_param_t * (*nrf_radio_signal_callback_t) (uint8_t signal_type); - -/**@brief AES ECB parameter typedefs */ -typedef uint8_t soc_ecb_key_t[SOC_ECB_KEY_LENGTH]; /**< Encryption key type. */ -typedef uint8_t soc_ecb_cleartext_t[SOC_ECB_CLEARTEXT_LENGTH]; /**< Cleartext data type. */ -typedef uint8_t soc_ecb_ciphertext_t[SOC_ECB_CIPHERTEXT_LENGTH]; /**< Ciphertext data type. */ - -/**@brief AES ECB data structure */ -typedef struct -{ - soc_ecb_key_t key; /**< Encryption key. */ - soc_ecb_cleartext_t cleartext; /**< Cleartext data. */ - soc_ecb_ciphertext_t ciphertext; /**< Ciphertext data. */ -} nrf_ecb_hal_data_t; - -/**@brief AES ECB block. Used to provide multiple blocks in a single call - to @ref sd_ecb_blocks_encrypt.*/ -typedef struct -{ - soc_ecb_key_t const * p_key; /**< Pointer to the Encryption key. */ - soc_ecb_cleartext_t const * p_cleartext; /**< Pointer to the Cleartext data. */ - soc_ecb_ciphertext_t * p_ciphertext; /**< Pointer to the Ciphertext data. */ -} nrf_ecb_hal_data_block_t; - -/**@} */ - -/**@addtogroup NRF_SOC_FUNCTIONS Functions - * @{ */ - -/**@brief Initialize a mutex. - * - * @param[in] p_mutex Pointer to the mutex to initialize. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_MUTEX_NEW, uint32_t, sd_mutex_new(nrf_mutex_t * p_mutex)); - -/**@brief Attempt to acquire a mutex. - * - * @param[in] p_mutex Pointer to the mutex to acquire. - * - * @retval ::NRF_SUCCESS The mutex was successfully acquired. - * @retval ::NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN The mutex could not be acquired. - */ -SVCALL(SD_MUTEX_ACQUIRE, uint32_t, sd_mutex_acquire(nrf_mutex_t * p_mutex)); - -/**@brief Release a mutex. - * - * @param[in] p_mutex Pointer to the mutex to release. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_MUTEX_RELEASE, uint32_t, sd_mutex_release(nrf_mutex_t * p_mutex)); - -/**@brief Query the capacity of the application random pool. - * - * @param[out] p_pool_capacity The capacity of the pool. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_RAND_APPLICATION_POOL_CAPACITY_GET, uint32_t, sd_rand_application_pool_capacity_get(uint8_t * p_pool_capacity)); - -/**@brief Get number of random bytes available to the application. - * - * @param[out] p_bytes_available The number of bytes currently available in the pool. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_RAND_APPLICATION_BYTES_AVAILABLE_GET, uint32_t, sd_rand_application_bytes_available_get(uint8_t * p_bytes_available)); - -/**@brief Get random bytes from the application pool. - * - * @param[out] p_buff Pointer to unit8_t buffer for storing the bytes. - * @param[in] length Number of bytes to take from pool and place in p_buff. - * - * @retval ::NRF_SUCCESS The requested bytes were written to p_buff. - * @retval ::NRF_ERROR_SOC_RAND_NOT_ENOUGH_VALUES No bytes were written to the buffer, because there were not enough bytes available. -*/ -SVCALL(SD_RAND_APPLICATION_VECTOR_GET, uint32_t, sd_rand_application_vector_get(uint8_t * p_buff, uint8_t length)); - -/**@brief Gets the reset reason register. - * - * @param[out] p_reset_reason Contents of the NRF_POWER->RESETREAS register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_RESET_REASON_GET, uint32_t, sd_power_reset_reason_get(uint32_t * p_reset_reason)); - -/**@brief Clears the bits of the reset reason register. - * - * @param[in] reset_reason_clr_msk Contains the bits to clear from the reset reason register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_RESET_REASON_CLR, uint32_t, sd_power_reset_reason_clr(uint32_t reset_reason_clr_msk)); - -/**@brief Sets the power mode when in CPU sleep. - * - * @param[in] power_mode The power mode to use when in CPU sleep, see @ref NRF_POWER_MODES. @sa sd_app_evt_wait - * - * @retval ::NRF_SUCCESS The power mode was set. - * @retval ::NRF_ERROR_SOC_POWER_MODE_UNKNOWN The power mode was unknown. - */ -SVCALL(SD_POWER_MODE_SET, uint32_t, sd_power_mode_set(uint8_t power_mode)); - -/**@brief Puts the chip in System OFF mode. - * - * @retval ::NRF_ERROR_SOC_POWER_OFF_SHOULD_NOT_RETURN - */ -SVCALL(SD_POWER_SYSTEM_OFF, uint32_t, sd_power_system_off(void)); - -/**@brief Enables or disables the power-fail comparator. - * - * Enabling this will give a SoftDevice event (NRF_EVT_POWER_FAILURE_WARNING) when the power failure warning occurs. - * The event can be retrieved with sd_evt_get(); - * - * @param[in] pof_enable True if the power-fail comparator should be enabled, false if it should be disabled. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_POF_ENABLE, uint32_t, sd_power_pof_enable(uint8_t pof_enable)); - -/**@brief Sets the power-fail threshold value. - * - * @param[in] threshold The power-fail threshold value to use, see @ref NRF_POWER_THRESHOLDS. - * - * @retval ::NRF_SUCCESS The power failure threshold was set. - * @retval ::NRF_ERROR_SOC_POWER_POF_THRESHOLD_UNKNOWN The power failure threshold is unknown. - */ -SVCALL(SD_POWER_POF_THRESHOLD_SET, uint32_t, sd_power_pof_threshold_set(uint8_t threshold)); - -/**@brief Writes the NRF_POWER->RAM[index].POWERSET register. - * - * @param[in] index Contains the index in the NRF_POWER->RAM[index].POWERSET register to write to. - * @param[in] ram_powerset Contains the word to write to the NRF_POWER->RAM[index].POWERSET register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_RAM_POWER_SET, uint32_t, sd_power_ram_power_set(uint8_t index, uint32_t ram_powerset)); - -/**@brief Writes the NRF_POWER->RAM[index].POWERCLR register. - * - * @param[in] index Contains the index in the NRF_POWER->RAM[index].POWERCLR register to write to. - * @param[in] ram_powerclr Contains the word to write to the NRF_POWER->RAM[index].POWERCLR register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_RAM_POWER_CLR, uint32_t, sd_power_ram_power_clr(uint8_t index, uint32_t ram_powerclr)); - -/**@brief Get contents of NRF_POWER->RAM[index].POWER register, indicates power status of RAM[index] blocks. - * - * @param[in] index Contains the index in the NRF_POWER->RAM[index].POWER register to read from. - * @param[out] p_ram_power Content of NRF_POWER->RAM[index].POWER register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_RAM_POWER_GET, uint32_t, sd_power_ram_power_get(uint8_t index, uint32_t * p_ram_power)); - -/**@brief Set bits in the general purpose retention registers (NRF_POWER->GPREGRET*). - * - * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. - * @param[in] gpregret_msk Bits to be set in the GPREGRET register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_GPREGRET_SET, uint32_t, sd_power_gpregret_set(uint32_t gpregret_id, uint32_t gpregret_msk)); - -/**@brief Clear bits in the general purpose retention registers (NRF_POWER->GPREGRET*). - * - * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. - * @param[in] gpregret_msk Bits to be clear in the GPREGRET register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_GPREGRET_CLR, uint32_t, sd_power_gpregret_clr(uint32_t gpregret_id, uint32_t gpregret_msk)); - -/**@brief Get contents of the general purpose retention registers (NRF_POWER->GPREGRET*). - * - * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. - * @param[out] p_gpregret Contents of the GPREGRET register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_GPREGRET_GET, uint32_t, sd_power_gpregret_get(uint32_t gpregret_id, uint32_t *p_gpregret)); - -/**@brief Sets the DCDC mode. - * - * Enable or disable the DCDC peripheral. - * - * @param[in] dcdc_mode The mode of the DCDC, see @ref NRF_POWER_DCDC_MODES. - * - * @retval ::NRF_SUCCESS - * @retval ::NRF_ERROR_INVALID_PARAM The DCDC mode is invalid. - */ -SVCALL(SD_POWER_DCDC_MODE_SET, uint32_t, sd_power_dcdc_mode_set(uint8_t dcdc_mode)); - -/**@brief Request the high frequency crystal oscillator. - * - * Will start the high frequency crystal oscillator, the startup time of the crystal varies - * and the ::sd_clock_hfclk_is_running function can be polled to check if it has started. - * - * @see sd_clock_hfclk_is_running - * @see sd_clock_hfclk_release - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_CLOCK_HFCLK_REQUEST, uint32_t, sd_clock_hfclk_request(void)); - -/**@brief Releases the high frequency crystal oscillator. - * - * Will stop the high frequency crystal oscillator, this happens immediately. - * - * @see sd_clock_hfclk_is_running - * @see sd_clock_hfclk_request - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_CLOCK_HFCLK_RELEASE, uint32_t, sd_clock_hfclk_release(void)); - -/**@brief Checks if the high frequency crystal oscillator is running. - * - * @see sd_clock_hfclk_request - * @see sd_clock_hfclk_release - * - * @param[out] p_is_running 1 if the external crystal oscillator is running, 0 if not. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_CLOCK_HFCLK_IS_RUNNING, uint32_t, sd_clock_hfclk_is_running(uint32_t * p_is_running)); - -/**@brief Waits for an application event. - * - * An application event is either an application interrupt or a pended interrupt when the interrupt - * is disabled. - * - * When the application waits for an application event by calling this function, an interrupt that - * is enabled will be taken immediately on pending since this function will wait in thread mode, - * then the execution will return in the application's main thread. - * - * In order to wake up from disabled interrupts, the SEVONPEND flag has to be set in the Cortex-M - * MCU's System Control Register (SCR), CMSIS_SCB. In that case, when a disabled interrupt gets - * pended, this function will return to the application's main thread. - * - * @note The application must ensure that the pended flag is cleared using ::sd_nvic_ClearPendingIRQ - * in order to sleep using this function. This is only necessary for disabled interrupts, as - * the interrupt handler will clear the pending flag automatically for enabled interrupts. - * - * @note If an application interrupt has happened since the last time sd_app_evt_wait was - * called this function will return immediately and not go to sleep. This is to avoid race - * conditions that can occur when a flag is updated in the interrupt handler and processed - * in the main loop. - * - * @post An application interrupt has happened or a interrupt pending flag is set. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_APP_EVT_WAIT, uint32_t, sd_app_evt_wait(void)); - -/**@brief Get PPI channel enable register contents. - * - * @param[out] p_channel_enable The contents of the PPI CHEN register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_CHANNEL_ENABLE_GET, uint32_t, sd_ppi_channel_enable_get(uint32_t * p_channel_enable)); - -/**@brief Set PPI channel enable register. - * - * @param[in] channel_enable_set_msk Mask containing the bits to set in the PPI CHEN register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_CHANNEL_ENABLE_SET, uint32_t, sd_ppi_channel_enable_set(uint32_t channel_enable_set_msk)); - -/**@brief Clear PPI channel enable register. - * - * @param[in] channel_enable_clr_msk Mask containing the bits to clear in the PPI CHEN register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_CHANNEL_ENABLE_CLR, uint32_t, sd_ppi_channel_enable_clr(uint32_t channel_enable_clr_msk)); - -/**@brief Assign endpoints to a PPI channel. - * - * @param[in] channel_num Number of the PPI channel to assign. - * @param[in] evt_endpoint Event endpoint of the PPI channel. - * @param[in] task_endpoint Task endpoint of the PPI channel. - * - * @retval ::NRF_ERROR_SOC_PPI_INVALID_CHANNEL The channel number is invalid. - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_CHANNEL_ASSIGN, uint32_t, sd_ppi_channel_assign(uint8_t channel_num, const volatile void * evt_endpoint, const volatile void * task_endpoint)); - -/**@brief Task to enable a channel group. - * - * @param[in] group_num Number of the channel group. - * - * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_GROUP_TASK_ENABLE, uint32_t, sd_ppi_group_task_enable(uint8_t group_num)); - -/**@brief Task to disable a channel group. - * - * @param[in] group_num Number of the PPI group. - * - * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid. - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_GROUP_TASK_DISABLE, uint32_t, sd_ppi_group_task_disable(uint8_t group_num)); - -/**@brief Assign PPI channels to a channel group. - * - * @param[in] group_num Number of the channel group. - * @param[in] channel_msk Mask of the channels to assign to the group. - * - * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid. - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_GROUP_ASSIGN, uint32_t, sd_ppi_group_assign(uint8_t group_num, uint32_t channel_msk)); - -/**@brief Gets the PPI channels of a channel group. - * - * @param[in] group_num Number of the channel group. - * @param[out] p_channel_msk Mask of the channels assigned to the group. - * - * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid. - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_GROUP_GET, uint32_t, sd_ppi_group_get(uint8_t group_num, uint32_t * p_channel_msk)); - -/**@brief Configures the Radio Notification signal. - * - * @note - * - The notification signal latency depends on the interrupt priority settings of SWI used - * for notification signal. - * - To ensure that the radio notification signal behaves in a consistent way, the radio - * notifications must be configured when there is no protocol stack or other SoftDevice - * activity in progress. It is recommended that the radio notification signal is - * configured directly after the SoftDevice has been enabled. - * - In the period between the ACTIVE signal and the start of the Radio Event, the SoftDevice - * will interrupt the application to do Radio Event preparation. - * - Using the Radio Notification feature may limit the bandwidth, as the SoftDevice may have - * to shorten the connection events to have time for the Radio Notification signals. - * - * @param[in] type Type of notification signal, see @ref NRF_RADIO_NOTIFICATION_TYPES. - * @ref NRF_RADIO_NOTIFICATION_TYPE_NONE shall be used to turn off radio - * notification. Using @ref NRF_RADIO_NOTIFICATION_DISTANCE_NONE is - * recommended (but not required) to be used with - * @ref NRF_RADIO_NOTIFICATION_TYPE_NONE. - * - * @param[in] distance Distance between the notification signal and start of radio activity, see @ref NRF_RADIO_NOTIFICATION_DISTANCES. - * This parameter is ignored when @ref NRF_RADIO_NOTIFICATION_TYPE_NONE or - * @ref NRF_RADIO_NOTIFICATION_TYPE_INT_ON_INACTIVE is used. - * - * @retval ::NRF_ERROR_INVALID_PARAM The group number is invalid. - * @retval ::NRF_ERROR_INVALID_STATE A protocol stack or other SoftDevice is running. Stop all - * running activities and retry. - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_RADIO_NOTIFICATION_CFG_SET, uint32_t, sd_radio_notification_cfg_set(uint8_t type, uint8_t distance)); - -/**@brief Encrypts a block according to the specified parameters. - * - * 128-bit AES encryption. - * - * @note: - * - The application may set the SEVONPEND bit in the SCR to 1 to make the SoftDevice sleep while - * the ECB is running. The SEVONPEND bit should only be cleared (set to 0) from application - * main or low interrupt level. - * - * @param[in, out] p_ecb_data Pointer to the ECB parameters' struct (two input - * parameters and one output parameter). - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_ECB_BLOCK_ENCRYPT, uint32_t, sd_ecb_block_encrypt(nrf_ecb_hal_data_t * p_ecb_data)); - -/**@brief Encrypts multiple data blocks provided as an array of data block structures. - * - * @details: Performs 128-bit AES encryption on multiple data blocks - * - * @note: - * - The application may set the SEVONPEND bit in the SCR to 1 to make the SoftDevice sleep while - * the ECB is running. The SEVONPEND bit should only be cleared (set to 0) from application - * main or low interrupt level. - * - * @param[in] block_count Count of blocks in the p_data_blocks array. - * @param[in,out] p_data_blocks Pointer to the first entry in a contiguous array of - * @ref nrf_ecb_hal_data_block_t structures. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_ECB_BLOCKS_ENCRYPT, uint32_t, sd_ecb_blocks_encrypt(uint8_t block_count, nrf_ecb_hal_data_block_t * p_data_blocks)); - -/**@brief Gets any pending events generated by the SoC API. - * - * The application should keep calling this function to get events, until ::NRF_ERROR_NOT_FOUND is returned. - * - * @param[out] p_evt_id Set to one of the values in @ref NRF_SOC_EVTS, if any events are pending. - * - * @retval ::NRF_SUCCESS An event was pending. The event id is written in the p_evt_id parameter. - * @retval ::NRF_ERROR_NOT_FOUND No pending events. - */ -SVCALL(SD_EVT_GET, uint32_t, sd_evt_get(uint32_t * p_evt_id)); - -/**@brief Get the temperature measured on the chip - * - * This function will block until the temperature measurement is done. - * It takes around 50 us from call to return. - * - * @param[out] p_temp Result of temperature measurement. Die temperature in 0.25 degrees Celsius. - * - * @retval ::NRF_SUCCESS A temperature measurement was done, and the temperature was written to temp - */ -SVCALL(SD_TEMP_GET, uint32_t, sd_temp_get(int32_t * p_temp)); - -/**@brief Flash Write -* -* Commands to write a buffer to flash -* -* If the SoftDevice is enabled: -* This call initiates the flash access command, and its completion will be communicated to the -* application with exactly one of the following events: -* - @ref NRF_EVT_FLASH_OPERATION_SUCCESS - The command was successfully completed. -* - @ref NRF_EVT_FLASH_OPERATION_ERROR - The command could not be started. -* -* If the SoftDevice is not enabled no event will be generated, and this call will return @ref NRF_SUCCESS when the - * write has been completed -* -* @note -* - This call takes control over the radio and the CPU during flash erase and write to make sure that -* they will not interfere with the flash access. This means that all interrupts will be blocked -* for a predictable time (depending on the NVMC specification in the device's Product Specification -* and the command parameters). -* - The data in the p_src buffer should not be modified before the @ref NRF_EVT_FLASH_OPERATION_SUCCESS -* or the @ref NRF_EVT_FLASH_OPERATION_ERROR have been received if the SoftDevice is enabled. -* -* -* @param[in] p_dst Pointer to start of flash location to be written. -* @param[in] p_src Pointer to buffer with data to be written. -* @param[in] size Number of 32-bit words to write. Maximum size is the number of words in one -* flash page. See the device's Product Specification for details. -* -* @retval ::NRF_ERROR_INVALID_ADDR Tried to write to a non existing flash address, or p_dst or p_src was unaligned. -* @retval ::NRF_ERROR_BUSY The previous command has not yet completed. -* @retval ::NRF_ERROR_INVALID_LENGTH Size was 0, or higher than the maximum allowed size. -* @retval ::NRF_ERROR_FORBIDDEN Tried to write to or read from protected location. -* @retval ::NRF_SUCCESS The command was accepted. -*/ -SVCALL(SD_FLASH_WRITE, uint32_t, sd_flash_write(uint32_t * p_dst, uint32_t const * p_src, uint32_t size)); - - -/**@brief Flash Erase page -* -* Commands to erase a flash page -* If the SoftDevice is enabled: -* This call initiates the flash access command, and its completion will be communicated to the -* application with exactly one of the following events: -* - @ref NRF_EVT_FLASH_OPERATION_SUCCESS - The command was successfully completed. -* - @ref NRF_EVT_FLASH_OPERATION_ERROR - The command could not be started. -* -* If the SoftDevice is not enabled no event will be generated, and this call will return @ref NRF_SUCCESS when the -* erase has been completed -* -* @note -* - This call takes control over the radio and the CPU during flash erase and write to make sure that -* they will not interfere with the flash access. This means that all interrupts will be blocked -* for a predictable time (depending on the NVMC specification in the device's Product Specification -* and the command parameters). -* -* -* @param[in] page_number Page number of the page to erase -* -* @retval ::NRF_ERROR_INTERNAL If a new session could not be opened due to an internal error. -* @retval ::NRF_ERROR_INVALID_ADDR Tried to erase to a non existing flash page. -* @retval ::NRF_ERROR_BUSY The previous command has not yet completed. -* @retval ::NRF_ERROR_FORBIDDEN Tried to erase a protected page. -* @retval ::NRF_SUCCESS The command was accepted. -*/ -SVCALL(SD_FLASH_PAGE_ERASE, uint32_t, sd_flash_page_erase(uint32_t page_number)); - - -/**@brief Flash Protection set - * - * Commands to set the flash protection configuration registers. - This sets the CONFIGx registers of the BPROT peripheral. - * - * @note To read the values read them directly. They are only write-protected. - * - * @param[in] block_cfg0 Value to be written to the configuration register. - * @param[in] block_cfg1 Value to be written to the configuration register. - * @param[in] block_cfg2 Value to be written to the configuration register. - * @param[in] block_cfg3 Value to be written to the configuration register. - * - * @retval ::NRF_ERROR_FORBIDDEN Tried to protect the SoftDevice. - * @retval ::NRF_SUCCESS Values successfully written to configuration registers. - */ -SVCALL(SD_FLASH_PROTECT, uint32_t, sd_flash_protect(uint32_t block_cfg0, uint32_t block_cfg1, uint32_t block_cfg2, uint32_t block_cfg3)); - -/**@brief Opens a session for radio timeslot requests. - * - * @note Only one session can be open at a time. - * @note p_radio_signal_callback(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START) will be called when the radio timeslot - * starts. From this point the NRF_RADIO and NRF_TIMER0 peripherals can be freely accessed - * by the application. - * @note p_radio_signal_callback(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_TIMER0) is called whenever the NRF_TIMER0 - * interrupt occurs. - * @note p_radio_signal_callback(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_RADIO) is called whenever the NRF_RADIO - * interrupt occurs. - * @note p_radio_signal_callback() will be called at ARM interrupt priority level 0. This - * implies that none of the sd_* API calls can be used from p_radio_signal_callback(). - * - * @param[in] p_radio_signal_callback The signal callback. - * - * @retval ::NRF_ERROR_INVALID_ADDR p_radio_signal_callback is an invalid function pointer. - * @retval ::NRF_ERROR_BUSY If session cannot be opened. - * @retval ::NRF_ERROR_INTERNAL If a new session could not be opened due to an internal error. - * @retval ::NRF_SUCCESS Otherwise. - */ - SVCALL(SD_RADIO_SESSION_OPEN, uint32_t, sd_radio_session_open(nrf_radio_signal_callback_t p_radio_signal_callback)); - -/**@brief Closes a session for radio timeslot requests. - * - * @note Any current radio timeslot will be finished before the session is closed. - * @note If a radio timeslot is scheduled when the session is closed, it will be canceled. - * @note The application cannot consider the session closed until the @ref NRF_EVT_RADIO_SESSION_CLOSED - * event is received. - * - * @retval ::NRF_ERROR_FORBIDDEN If session not opened. - * @retval ::NRF_ERROR_BUSY If session is currently being closed. - * @retval ::NRF_SUCCESS Otherwise. - */ - SVCALL(SD_RADIO_SESSION_CLOSE, uint32_t, sd_radio_session_close(void)); - -/**@brief Requests a radio timeslot. - * - * @note The request type is determined by p_request->request_type, and can be one of @ref NRF_RADIO_REQ_TYPE_EARLIEST - * and @ref NRF_RADIO_REQ_TYPE_NORMAL. The first request in a session must always be of type @ref NRF_RADIO_REQ_TYPE_EARLIEST. - * @note For a normal request (@ref NRF_RADIO_REQ_TYPE_NORMAL), the start time of a radio timeslot is specified by - * p_request->distance_us and is given relative to the start of the previous timeslot. - * @note A too small p_request->distance_us will lead to a @ref NRF_EVT_RADIO_BLOCKED event. - * @note Timeslots scheduled too close will lead to a @ref NRF_EVT_RADIO_BLOCKED event. - * @note See the SoftDevice Specification for more on radio timeslot scheduling, distances and lengths. - * @note If an opportunity for the first radio timeslot is not found before 100 ms after the call to this - * function, it is not scheduled, and instead a @ref NRF_EVT_RADIO_BLOCKED event is sent. - * The application may then try to schedule the first radio timeslot again. - * @note Successful requests will result in nrf_radio_signal_callback_t(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START). - * Unsuccessful requests will result in a @ref NRF_EVT_RADIO_BLOCKED event, see @ref NRF_SOC_EVTS. - * @note The jitter in the start time of the radio timeslots is +/- @ref NRF_RADIO_START_JITTER_US us. - * @note The nrf_radio_signal_callback_t(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START) call has a latency relative to the - * specified radio timeslot start, but this does not affect the actual start time of the timeslot. - * @note NRF_TIMER0 is reset at the start of the radio timeslot, and is clocked at 1MHz from the high frequency - * (16 MHz) clock source. If p_request->hfclk_force_xtal is true, the high frequency clock is - * guaranteed to be clocked from the external crystal. - * @note The SoftDevice will neither access the NRF_RADIO peripheral nor the NRF_TIMER0 peripheral - * during the radio timeslot. - * - * @param[in] p_request Pointer to the request parameters. - * - * @retval ::NRF_ERROR_FORBIDDEN If session not opened or the session is not IDLE. - * @retval ::NRF_ERROR_INVALID_ADDR If the p_request pointer is invalid. - * @retval ::NRF_ERROR_INVALID_PARAM If the parameters of p_request are not valid. - * @retval ::NRF_SUCCESS Otherwise. - */ - SVCALL(SD_RADIO_REQUEST, uint32_t, sd_radio_request(nrf_radio_request_t const * p_request)); - -/**@} */ - -#ifdef __cplusplus -} -#endif -#endif // NRF_SOC_H__ - -/**@} */ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_svc.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_svc.h deleted file mode 100644 index 292c69298..000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_svc.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef NRF_SVC__ -#define NRF_SVC__ - -#include "stdint.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef SVCALL_AS_NORMAL_FUNCTION -#define SVCALL(number, return_type, signature) return_type signature -#else - -#ifndef SVCALL -#if defined (__CC_ARM) -#define SVCALL(number, return_type, signature) return_type __svc(number) signature -#elif defined (__GNUC__) -#ifdef __cplusplus -#define GCC_CAST_CPP (uint16_t) -#else -#define GCC_CAST_CPP -#endif -#define SVCALL(number, return_type, signature) \ - _Pragma("GCC diagnostic push") \ - _Pragma("GCC diagnostic ignored \"-Wreturn-type\"") \ - __attribute__((naked)) \ - __attribute__((unused)) \ - static return_type signature \ - { \ - __asm( \ - "svc %0\n" \ - "bx r14" : : "I" (GCC_CAST_CPP number) : "r0" \ - ); \ - } \ - _Pragma("GCC diagnostic pop") - -#elif defined (__ICCARM__) -#define PRAGMA(x) _Pragma(#x) -#define SVCALL(number, return_type, signature) \ -PRAGMA(swi_number = (number)) \ - __swi return_type signature; -#else -#define SVCALL(number, return_type, signature) return_type signature -#endif -#endif // SVCALL - -#endif // SVCALL_AS_NORMAL_FUNCTION - -#ifdef __cplusplus -} -#endif -#endif // NRF_SVC__ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_license-agreement.txt b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_license-agreement.txt deleted file mode 100644 index 00c2e54c4..000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_license-agreement.txt +++ /dev/null @@ -1,35 +0,0 @@ -Copyright (c) 2007 - 2017, Nordic Semiconductor ASA -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form, except as embedded into a Nordic - Semiconductor ASA integrated circuit in a product or a software update for - such product, must reproduce the above copyright notice, this list of - conditions and the following disclaimer in the documentation and/or other - materials provided with the distribution. - -3. Neither the name of Nordic Semiconductor ASA nor the names of its - contributors may be used to endorse or promote products derived from this - software without specific prior written permission. - -4. This software, with or without modification, must only be used with a - Nordic Semiconductor ASA integrated circuit. - -5. Any software provided in binary form under this license must not be reverse - engineered, decompiled, modified and/or disassembled. - -THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS -OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_migration-document.pdf b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_migration-document.pdf Binary files differdeleted file mode 100644 index afd9ec7f4..000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_migration-document.pdf +++ /dev/null diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_release-notes.pdf b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_release-notes.pdf Binary files differdeleted file mode 100644 index 0cff6f8c3..000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_release-notes.pdf +++ /dev/null diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_softdevice.hex b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_softdevice.hex deleted file mode 100644 index 65bb38104..000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_softdevice.hex +++ /dev/null @@ -1,8678 +0,0 @@ -:020000040000FA -:1000000000040020E90800007D050000C908000088 -:1000100087050000910500009B050000000000001E -:100020000000000000000000000000000D090000BA -:10003000A505000000000000AF050000B9050000A4 -:10004000C3050000CD050000D7050000E105000054 -:10005000EB050000F5050000FF05000009060000A3 -:10006000130600001D0600002706000031060000F0 -:100070003B060000450600004F0600005906000040 -:10008000630600006D060000770600008106000090 -:100090008B060000950600009F060000A9060000E0 -:1000A000B3060000BD060000C7060000D106000030 -:1000B000DB060000E5060000EF060000F906000080 -:1000C000030700000D0700001707000021070000CC -:1000D0002B070000350700003F070000490700001C -:1000E000530700005D07000067070000710700006C -:1000F0007B070000850700008F07000099070000BC -:10010000A30700001FB500F003F88DE80F001FBD26 -:1001100000F0E0BB1FB56FF00100009040100390AD -:10012000029001904FF010208069000B420900F00E -:100130001F045DF822300120A04083434DF8223097 -:10014000684600F045F91FBDF0B54FF6FF734FF458 -:10015000B4751A466E1E11E0A94201D3344600E080 -:100160000C46091B30F8027B641E3B441A44F9D14B -:100170009CB204EB134394B204EB12420029EBD17E -:1001800098B200EB134002EB124140EA0140F0BD8F -:10019000DE4992B00446D1E90001CDE91001FF2209 -:1001A0004021684600F03CFB94E80F008DE80F000A -:1001B000684610A902E004C841F8042D8842FAD12B -:1001C00010216846FFF7C0FF1090AA208DF8440068 -:1001D000FFF7A0FF00F0F3F84FF01024A069102201 -:1001E0006946803000F002F9A069082210A900F0E9 -:1001F000FDF800F0D8F84FF080510A6949690068AD -:100200004A43824201D8102070470020704710B541 -:10021000D0E900214FF0805002EB8103026944696C -:100220006243934209D84FF01022536903EB8103D4 -:100230000169406941438B4201D9092010BD5069D1 -:10024000401C01D0002010BD0F2010BD70B501680A -:100250000446AF4D4FF01020072952D2DFE801F0DD -:10026000330419293C1E2500D4E902656468294637 -:10027000304600F0CDF82A462146304600F0B6F868 -:10028000AA002146304600F09FFA002800D0032043 -:1002900070BD00F051FB4FF4805007E0201DFFF7C8 -:1002A000AAFF0028F4D100F047FB60682860002016 -:1002B00070BD241D94E80700920000F085FA002824 -:1002C000F6D00E2070BD8069401C12D0201DFFF7B3 -:1002D0009EFF0028F6D109E08069401C09D0201D4E -:1002E000FFF789FF0028EDD1606820B12046FFF7B5 -:1002F0004FFF042070BDFFF70DFF00F060F800F025 -:1003000052F8072070BD10B50C46182802D0012005 -:10031000086010BD2068FFF799FF206010BD4FF006 -:100320001024A069401C05D0A569A66980353079E4 -:10033000AA2808D06069401C2DD060690068401C64 -:1003400029D060692CE010212846FFF7FDFE3168B6 -:1003500081421CD1A16901F18002C03105E030B1B8 -:1003600008CA51F8040D984201D1012000E0002094 -:100370008A42F4D158B1286810B1042803D0FEE7AE -:10038000284600F057F862496868086008E000F005 -:1003900016F800F008F84FF480500168491C01D0AD -:1003A00000F0A4FAFEE7BFF34F8F5A4801685A4A9B -:1003B00001F4E06111430160BFF34F8FFEE74FF09E -:1003C00010208169491C02D0806900F0AEB87047E6 -:1003D000524A01681160121D416811604F4A8168DC -:1003E00010321160111DC068086070472DE9F0419E -:1003F00017460D460646002406E03046296800F000 -:10040000A7F8641C2D1D361DBC42F6D3BDE8F08153 -:1004100070B50C4605464FF4806608E0284600F0AB -:1004200084F8B44205D3A4F5806405F58055002C0A -:10043000F4D170BD4168044609B1012500E00025F2 -:100440004FF010267069A268920000F0BDF9C8B1A3 -:10045000204600F01AF89DB17669A56864684FF4EB -:10046000002084420AD2854208D229463046FFF74E -:10047000CFFF2A4621463046FFF7B8FFFFF79FFF20 -:10048000FFF791FFFFF746FEF8E72DE9FF414FF038 -:100490001024616980680D0B01EB800000F6FF708D -:1004A000010B0020009001900290024603906846E4 -:1004B00001230BE0560902F01F0C50F8267003FAD6 -:1004C0000CFC47EA0C0740F82670521CAA42F1D3F4 -:1004D0000AE04A0901F01F0650F8225003FA06F616 -:1004E000354340F82250491C8029F2D3A169090BF9 -:1004F0004A0901F01F0150F822408B409C4340F80C -:100500002240FFF765FFBDE8FF8100005C090000A5 -:10051000000000200CED00E00400FA050006004099 -:10052000144801680029FCD07047134A0221116069 -:1005300010490B68002BFCD00F4B1B1D186008687E -:100540000028FCD00020106008680028FCD070470C -:10055000094B10B501221A60064A1468002CFCD021 -:10056000016010680028FCD0002018601068002886 -:10057000FCD010BD00E4014004E5014008208F4993 -:1005800009680958084710208C4909680958084724 -:1005900014208A49096809580847182087490968BA -:1005A0000958084730208549096809580847382004 -:1005B00082490968095808473C2080490968095858 -:1005C000084740207D4909680958084744207B496D -:1005D00009680958084748207849096809580847B0 -:1005E0004C20764909680958084750207349096822 -:1005F0000958084754207149096809580847582084 -:100600006E490968095808475C206C49096809580F -:100610000847602069490968095808476420674904 -:100620000968095808476820644909680958084753 -:100630006C20624909680958084770205F490968B9 -:100640000958084774205D49096809580847782007 -:100650005A490968095808477C20584909680958C7 -:10066000084780205549096809580847842053499C -:1006700009680958084788205049096809580847F7 -:100680008C204E4909680958084790204B49096851 -:10069000095808479420494909680958084798208B -:1006A00046490968095808479C204449096809587F -:1006B0000847A0204149096809580847A4203F4934 -:1006C000096809580847A8203C490968095808479B -:1006D000AC203A49096809580847B02037490968E9 -:1006E00009580847B4203549096809580847B8200F -:1006F0003249096809580847BC2030490968095837 -:100700000847C0202D49096809580847C4202B49CB -:10071000096809580847C82028490968095808473E -:10072000CC202649096809580847D0202349096880 -:1007300009580847D4202149096809580847D82092 -:100740001E49096809580847DC201C4909680958EE -:100750000847E0201949096809580847E420174963 -:10076000096809580847E8201449096809580847E2 -:10077000EC201249096809580847F0200F49096818 -:1007800009580847F4200D49096809580847F82016 -:100790000A49096809580847FC20084909680958A6 -:1007A00008475FF480700549096809580847000048 -:1007B00003480449024A034B704700000000002030 -:1007C000680900006809000040EA010310B59B07B2 -:1007D0000FD1042A0DD310C808C9121F9C42F8D0AB -:1007E00020BA19BA884201D9012010BD4FF0FF305C -:1007F00010BD1AB1D30703D0521C07E0002010BD72 -:1008000010F8013B11F8014B1B1B07D110F8013BFD -:1008100011F8014B1B1B01D1921EF1D1184610BDDE -:1008200002F0FF0343EA032242EA024200F005B865 -:100830007047704770474FF000020429C0F01280E3 -:1008400010F0030C00F01B80CCF1040CBCF1020F83 -:1008500018BF00F8012BA8BF20F8022BA1EB0C0158 -:1008600000F00DB85FEAC17C24BF00F8012B00F84E -:10087000012B48BF00F8012B70474FF0000200B574 -:10088000134694469646203922BFA0E80C50A0E8B3 -:100890000C50B1F12001BFF4F7AF090728BFA0E861 -:1008A0000C5048BF0CC05DF804EB890028BF40F82D -:1008B000042B08BF704748BF20F8022B11F0804F6F -:1008C00018BF00F8012B7047014B1B68DB68184705 -:1008D0000000002009480A497047FFF7FBFFFFF7B7 -:1008E00011FC00BD20BFFDE7064B1847064A10600B -:1008F000016881F30888406800470000680900002B -:10090000680900001F030000000000201EF0040F13 -:100910000CBFEFF30881EFF3098188690238007892 -:10092000182803D100E00000074A1047074A126860 -:100930002C3212681047000000B5054B1B68054AB1 -:100940009B58984700BD00000703000000000020EE -:100950005809000004000000001000000000000022 -:0809600000FFFFFF0090D0032F -:10100000E8120020111D0200152F0000831C0200B1 -:10101000152F0000152F0000152F00000000000004 -:10102000000000000000000000000000691D020038 -:10103000152F000000000000152F0000152F0000E4 -:10104000D11D0200D71D0200152F0000152F000032 -:10105000152F0000152F0000152F0000152F000080 -:10106000DD1D0200152F0000152F0000E31D0200FA -:10107000152F0000E91D0200EF1D0200F51D020002 -:10108000152F0000152F0000152F0000152F000050 -:10109000152F0000152F0000152F0000152F000040 -:1010A000152F0000FB1D0200152F0000152F00005A -:1010B000152F0000152F0000152F0000152F000020 -:1010C000011E0200152F0000152F0000152F000033 -:1010D000152F0000152F0000152F0000152F000000 -:1010E000152F0000152F0000152F0000152F0000F0 -:1010F000152F0000152F0000152F0000152F0000E0 -:10110000152F0000152F000000F002F820F0EDFD73 -:101110000AA090E8000C82448344AAF10107DA4552 -:1011200001D120F0E2FDAFF2090EBAE80F0013F092 -:10113000010F18BFFB1A43F0010318471C130200EC -:101140003C1302000A444FF0000C10F8013B13F06E -:10115000070408BF10F8014B1D1108BF10F8015B10 -:10116000641E05D010F8016B641E01F8016BF9D103 -:1011700013F0080F1EBF10F8014BAD1C0C1B09D15A -:101180006D1E58BF01F801CBFAD505E014F8016BCC -:1011900001F8016B6D1EF9D59142D6D3704700005E -:1011A0000023002400250026103A28BF78C1FBD870 -:1011B000520728BF30C148BF0B6070471FB500F011 -:1011C0003DF88DE80F001FBD1EF0040F0CBFEFF3BC -:1011D0000880EFF30980014A104700006F2E0000DD -:1011E0008269034981614FF001001044704700009B -:1011F000F511000001B41EB400B512F0AFFD01B44A -:101200000198864601BC01B01EBD0000F0B4404606 -:10121000494652465B460FB402A0013001B506486C -:10122000004700BF01BC86460FBC804689469246F7 -:101230009B46F0BC704700000911000020F052BD31 -:1012400070B51A4C054609202070A01C00F05FF80C -:101250005920A08029462046BDE8704007F0F1BF24 -:1012600007F0FABF70B50C461149097829B1A0F111 -:101270006001552908D3012013E0602804D06928B3 -:1012800002D043F201000CE020CC0A4E94E80E009C -:1012900006EB8000A0F58050241FD0F8806E284611 -:1012A000B047206070BD012070470000080000209A -:1012B0001C0000204C1E020010B504460021012035 -:1012C00000F03BF800210B2000F037F80421192032 -:1012D00000F033F804210D2000F02FF804210E2037 -:1012E00000F02BF804210F2000F027F80421C84358 -:1012F00000F023F80621162000F01FF80621152023 -:1013000000F01BF82046FFF79BFF002010BD9D2139 -:1013100001807047FFF7A4BF10487047104A10B50E -:1013200014680F4B0F4A08331A60FFF79BFF0C48F5 -:10133000001D046010BD704770474907090E002862 -:1013400006DA00F00F0000F1E02080F8141D70476D -:1013500000F1E02080F800147047000003F900421B -:101360001005024001000001FE48002101604160BB -:10137000018170472DE9F743044692B091464068D9 -:1013800012F0B2FF40B1606812F0B7FF20B9607888 -:1013900000F00300022801D0012000E00020F14EFF -:1013A0004D463072484612F05BFF18B1102015B060 -:1013B000BDE8F0832946012001F029FF0028F6D17D -:1013C00001258DF842504FF4C050ADF84000002286 -:1013D00010A9284606F0FAFB0028E8D18DF8425003 -:1013E0004FF428504FF00008ADF8400047461C214C -:1013F0006846CDF81C8020F018FC9DF81C0008AA57 -:1014000020F00F00401C20F0F00010308DF81C0080 -:1014100020788DF81D0061789DF81E0061F3420070 -:1014200040F001008DF81E009DF800000AA940F070 -:1014300002008DF800002089ADF83000ADF8327060 -:10144000608907AFADF834000B97606810AC0E9060 -:101450000A94684606F0AFF90028A8D1BDF820002C -:1014600030808DF8425042F60120ADF840009DF8E2 -:101470001E0008AA20F00600801C20F001008DF854 -:101480001E000220ADF83000ADF8340013A80E9015 -:101490000AA9684606F08FF9002888D1BDF8200017 -:1014A0007080311D484600F033F9002887D18DF84F -:1014B000425042F6A620ADF840001C216846CDF807 -:1014C0001C8020F0B2FB9DF81C00ADF8345020F0D9 -:1014D0000F00401C20F0F00010308DF81C009DF82B -:1014E0001D0008AA20F0FF008DF81D009DF81E00C9 -:1014F0000AA920F0060040F00100801C8DF81E00B3 -:101500009DF800008DF8445040F002008DF8000076 -:10151000CDE90A4711A80E90ADF83050684606F0A4 -:101520004AF9002899D1BDF82000F08000203EE75C -:101530003EB504460820ADF80000204612F090FEAB -:1015400008B110203EBD2146012001F060FE0028B8 -:10155000F8D12088ADF804006088ADF80600A088B6 -:10156000ADF80800E088ADF80A007E4801AB6A4695 -:101570008088002106F024FDBDF800100829E1D084 -:1015800003203EBD1FB50446002002900820ADF8A0 -:101590000800CDF80CD0204612F062FE10B11020E9 -:1015A00004B010BD6F4802AA81884FF6FF7006F0A4 -:1015B0004EFF0028F4D1BDF80810082901D00320FF -:1015C000EEE7BDF800102180BDF802106180BDF883 -:1015D0000410A180BDF80610E180E1E701B582B0FA -:1015E0000220ADF800005F4802AB6A464088002147 -:1015F00006F0E6FCBDF80010022900D003200EBD65 -:101600001CB5002100910221ADF80010019012F0EC -:101610004DFE08B110201CBD52486A4641884FF665 -:10162000FF7006F014FFBDF800100229F3D003206C -:101630001CBDFEB54B4C06461546207A0F46C0072A -:1016400005D0084612F00CFE18B11020FEBD0F2088 -:10165000FEBDF82D01D90C20FEBD304612F000FE73 -:1016600018BB208801A905F0ECFD0028F4D13078E2 -:101670008DF80500208801A906F081FC0028EBD137 -:1016800000909DF800009DF8051040F002008DF8D4 -:101690000000090703D040F008008DF80000208802 -:1016A000694606F009FC0028D6D1ADF8085020881C -:1016B0003B4602AA002106F083FCBDF80810A942AF -:1016C000CAD00320FEBD7CB50546002000900190E5 -:1016D0000888ADF800000C462846019512F004FE7B -:1016E00018B9204612F0E2FD08B110207CBD15B1FA -:1016F000BDF8000050B11B486A4601884FF6FF70E4 -:1017000006F0A5FEBDF8001021807CBD0C207CBD3C -:1017100030B593B0044600200D460090142101A876 -:1017200020F083FA1C2108A820F07FFA9DF8000021 -:10173000CDF808D020F00F00401C20F0F000103051 -:101740008DF800009DF8010020F0FF008DF80100E9 -:101750009DF8200040F002008DF8200001208DF857 -:10176000460001E0E201002042F60420ADF844000A -:1017700011A801902088ADF83C006088ADF83E00CB -:10178000A088ADF84000E088ADF842009DF8020066 -:1017900006AA20F00600801C20F001008DF802004F -:1017A0000820ADF80C00ADF810000FA8059001A9B5 -:1017B00008A806F000F8002803D1BDF8180028801A -:1017C000002013B030BD0000F0B5007B059F1E4621 -:1017D00014460D46012800D0FFDF0C2030803A204F -:1017E0003880002C08D0287A052806D0287B0128CC -:1017F00000D0FFDF17206081F0BDA889FBE72DE94D -:10180000F04786B0144691F80C900E9A0D46B9F147 -:10181000010F0BD01021007B2E8A8846052807D0A7 -:10182000062833D0FFDF06B0BDE8F0870221F2E7DB -:10183000E8890C2100EB400001EB400018803320C8 -:101840001080002CEFD0E889608100271AE0009614 -:10185000688808F1020301AA696900F07AFF06EBC3 -:101860000800801C07EB470186B204EB4102BDF87B -:10187000040090810DF1060140460E3210F04CFD3F -:101880007F1CBFB26089B842E1D8CCE73420108019 -:10189000E889B9F1010F11D0122148430E301880A8 -:1018A000002CC0D0E88960814846B9F1010F00D012 -:1018B0000220207300270DF1040A1FE00621ECE747 -:1018C0000096688808F1020301AA696900F041FFE7 -:1018D00006EB0800801C86B2B9F1010F12D007EBAD -:1018E000C70004EB4000BDF80410C18110220AF1CA -:1018F0000201103020F000F97F1CBFB26089B842AD -:10190000DED890E707EB470104EB4102BDF8040085 -:10191000D0810AF102014046103210F0FDFCEBE7E5 -:101920002DE9F0470E4688B090F80CC096F80C8070 -:10193000378AF5890C20109902F10C044FF0000A47 -:10194000BCF1030F08D0BCF1040F3ED0BCF1070F6F -:101950007DD0FFDF08B067E705EB850C00EB4C009E -:10196000188031200880002AF4D0A8F1060000F089 -:10197000FF09558125E0182101A820F056F90097AC -:101980007088434601AA716900F0E3FEBDF80400C7 -:101990002080BDF80600E080BDF808002081A21C70 -:1019A0000DF10A01484610F0B7FCB9F1000F00D064 -:1019B00018B184F804A0A4F802A007EB080087B2CD -:1019C0000A346D1EADB2D6D2C4E705EB850C00EB30 -:1019D0004C00188032200880002ABBD0A8F10500F6 -:1019E00000F0FF09558137E000977088434601AA4F -:1019F000716900F0AEFE9DF80600BDF80410E180AC -:101A00002179420860F3000162F34101820862F328 -:101A10008201C20862F3C301020962F304114209A0 -:101A200062F34511820962F386112171C009607168 -:101A3000BDF80700208122460DF10901484610F04B -:101A40006BFC18B184F802A0A4F800A000E007E045 -:101A500007EB080087B20A346D1EADB2C4D279E735 -:101A6000A8F1020084B205FB08F000F10E0CA3F807 -:101A700000C035230B80002AA6D0558194810097A1 -:101A800083B270880E32716900F063FE62E72DE95F -:101A9000F84F1E460A9D0C4681462AB1607A00F531 -:101AA0008070D080E089108199F80C000C274FF0ED -:101AB00000084FF00E0A0D2873D2DFE800F09E07F1 -:101AC0000E1C28303846556A737373002146484609 -:101AD0000095FFF779FEBDE8F88F207B9146082836 -:101AE00002D0032800D0FFDF378030200AE000BF9B -:101AF000A9F80A80EFE7207B9146042800D0FFDF99 -:101B0000378031202880B9F1000FF1D1E3E7207B45 -:101B10009146042800D0FFDF37803220F2E7207B97 -:101B20009146022800D0FFDF37803320EAE7207B90 -:101B30001746022800D0FFDF3420A6F800A0288036 -:101B4000002FC8D0A7F80A80C5E7207B17460428D5 -:101B500000D0FFDF3520A6F800A02880002FBAD0E3 -:101B60004046A7F80A8012E0207B1746052802D0DD -:101B7000062800D0FFDF1020308036202880002F7C -:101B8000A9D0E0897881A7F80E80B9F80E00B88155 -:101B9000A1E7207B9146072800D0FFDF3780372060 -:101BA000B0E72AE04FF0120018804FF0380017001D -:101BB000288090D0E0897881A7F80E80A7F810805F -:101BC00099F80C000A2805D00B2809D00C280DD054 -:101BD000FFDF80E7207B0C2800D0FFDF01200AE038 -:101BE000207B0D2800D0FFDF042004E0207B0E289E -:101BF00000D0FFDF052038736DE7FFDF6BE770B5BE -:101C00000C46054601F076FA20B10078222804D26D -:101C1000082070BD43F2020070BD052128460EF079 -:101C20001DFF206008B1002070BD032070BD2DE9AC -:101C3000FF4784B00027824602970798904689465E -:101C400012300AF0E2F8401D20F00306079828B988 -:101C500007A95046FFF7D3FF002853D1B9F1000F71 -:101C600005D00798017B19BB052504681BE098F88F -:101C70000000092803D00F2812D0FFDF45E00799A4 -:101C800003254868B0B3497B42887143914238D9F3 -:101C90008AB2B3B2011D0EF03AFD0446078002E09D -:101CA000079C042508340CB1208810B1032D28D0DE -:101CB0002BE00798012112300AF0DFF8ADF80C0094 -:101CC000024602AB2946504608F0B1F9070001D19F -:101CD000A01C029007983A461230C8F80400A8F8F1 -:101CE00002A003A94046029B0AF0D4F8C0B107281D -:101CF00014D200E005E0DFE800F0060811110F0A39 -:101D00000C00132026E6002024E6112022E60820FD -:101D100020E643F203001DE607201BE6032019E638 -:101D2000BDF80C002346CDE900702A4650460799BD -:101D300000F035FD57B9032D08D10798B3B2417BA8 -:101D4000406871438AB2011D0EF0F5FCB9F1000F35 -:101D5000D9D0079981F80C90D5E72DE9FE4F91462F -:101D60001A881C468A468046FAB102AB494608F0FA -:101D70005EF9050019D04046A61C27880EF08AFFA0 -:101D80003246072629463B4600960EF049FB20883E -:101D90002346CDE900504A465146404600F0FFFC3C -:101DA000002020800120BDE8FE8F0020FBE710B559 -:101DB00086B01C46AAB104238DF800301388ADF814 -:101DC00008305288ADF80A208A788DF80E200988EC -:101DD000ADF80C1000236A462146FFF728FF06B035 -:101DE00010BD1020FBE770B50D4605210EF036FE44 -:101DF000040000D1FFDF294604F11200BDE8704065 -:101E00000AF024B82DE9F8430D468046002607F075 -:101E1000CCFA0446287812287BD2DFE800F07A5406 -:101E2000543C355632321332323209323232323287 -:101E30002879001FC0B2022801D0102810D114BB8D -:101E4000FFDF35E004B9FFDF052140460EF006FE56 -:101E5000007B032806D004280BD0072828D0FFDFFA -:101E6000072657E02879801FC0B2022820D050B141 -:101E7000F6E72879401FC0B2022819D0102817D0E1 -:101E8000EEE704B9FFDF13E004B9FFDF287901288A -:101E90000ED1172139E0052140460EF0DFFD070085 -:101EA00000D1FFDF07F11201404609F0A6FF2CB177 -:101EB0002A462146404600F05CFC2BE013214046B8 -:101EC00002F0AAFC26E0FFDF24E004B9FFDF0521D1 -:101ED00040460EF0C3FD060000D1FFDF694606F163 -:101EE000120009F094FF060000D0FFDFA98817292F -:101EF00001D2172200E00A46BDF80000824202D952 -:101F0000014602E005E01729C3D3404600F057FC24 -:101F1000CEE7FFDF3046BDE8F883401D20F0030226 -:101F200019B102FB01F0001D00E0002010447047D1 -:101F300013B5009850B100244FEA0D000EF091FB4C -:101F4000002C02D1F84A009911601CBD0124002028 -:101F5000F4E72DE9F0470C461546242120461FF0F2 -:101F600064FE05B9FFDFA87860732888DFF8B8A39E -:101F7000401D20F00301AF788946DAF800000EF02A -:101F80008EFB060000D1FFDF4FF000082660A6F8A8 -:101F9000008077B109FB07F1091D0AD0DAF80000CB -:101FA0000EF07DFB060000D1FFDF6660C6F8008002 -:101FB00001E0C4F80480298804F11200BDE8F0476C -:101FC00009F00DBF2DE9F047804601F112000D46E2 -:101FD000814609F01AFF401DD34F20F003026E7BAB -:101FE0001446296838680EF085FB3EB104FB06F202 -:101FF000121D03D0696838680EF07CFB05200EF0D6 -:10200000D7FC044605200EF0DBFC201A012802D183 -:1020100038680EF039FB49464046BDE8F04709F004 -:10202000F3BE70B5054605210EF018FD040000D181 -:10203000FFDF04F112012846BDE8704009F0DDBE63 -:102040002DE9F04F91B04FF0000BADF834B0ADF882 -:1020500004B047880C4605469246052138460EF0E6 -:10206000FDFC060000D1FFDF24B1A780A4F806B074 -:10207000A4F808B0297809220B20B2EB111F297AA5 -:102080007DD104F110023827C91E4FF00C094FF022 -:10209000010803920F2973D2DFE801F0F4F3F28113 -:1020A00008D48A8FA13DDDF5F0B8B800307B022856 -:1020B00000D0FFDFA88909EBC001ADF80410302182 -:1020C000ADF83410002C25D06081B5F80E900027B3 -:1020D0001DE004EBC708317C88F80E10F189A8F8E0 -:1020E0000C10CDF800906888042304AA296900F038 -:1020F00030FBBDF81010A8F8101009F10400BDF86D -:1021000012107F1C1FFA80F9A8F81210BFB2608964 -:10211000B842DED80FE1307B022800D0FFDFE9892A -:1021200009EBC100ADF804003020ADF83400287B85 -:102130000A90001FC0B20F90002CEBD06181B5F85F -:102140001090002727E000BFCDF8009068886969EB -:1021500003AA0A9B00F0FDFA0A9904EBC70809EBF1 -:1021600001001FFA80F908F10C0204A90F9810F081 -:10217000D3F818B188F80EB0A8F80CB001E0D7E099 -:10218000D4E0BDF80C10A8F81010BDF80E107F1C9C -:10219000A8F81210BFB26089B842D5D8CBE00DA81C -:1021A000009001AB224629463046FFF728FBC2E0EB -:1021B000307B082805D0FFDF03E0307B082800D003 -:1021C000FFDFE8891030ADF804003620ADF83400A8 -:1021D000002C3FD0A9896181F189A18127E0307B62 -:1021E000092800D0FFDFA88900F10C01ADF8041028 -:1021F0003721ADF83410002C2CD06081E889009094 -:10220000AB89688804F10C02296956E0E889392114 -:10221000103080B2ADF80400ADF83410002C74D04A -:10222000A9896181287A10280AD002212173E989BD -:10223000E181288A0090EB8968886969039A3CE00B -:102240000121F3E70DA8009001AB22462946304654 -:10225000FFF766FB6FE0307B0A2800D0FFDF12201B -:10226000ADF80400ADF834704CB3A9896181A4F8CD -:1022700010B0A4F80EB084F80C805CE020E002E01E -:1022800031E039E042E0307B0B2800D0FFDF288AC4 -:10229000ADF834701230ADF8040084B1042121731C -:1022A000A9896181E989E181298A2182688A00906E -:1022B0002B8A688804F11202696900F04AFA3AE050 -:1022C000307B0C2800D0FFDF1220ADF80400ADF801 -:1022D00034703CB305212173A4F80AB0A4F80EB001 -:1022E000A4F810B027E00DA8009001AB22462946C3 -:1022F0003046FFF769FA1EE00DA8009001AB2246B8 -:1023000029463046FFF7C3FB15E036E03B21ADF828 -:102310000400ADF8341084B3A4F80680A4F808B023 -:1023200084F80AB007E0000010000020FFDF02E0A0 -:10233000012919D0FFDFBDF80400AAF800007CB124 -:10234000BDF834002080BDF804006080BDF8340082 -:10235000392805D03B2803D03C2801D086F80CB0A2 -:1023600011B00020BDE8F08F3C21ADF80400ADF8BD -:10237000341014B1697AA172DDE7FFE7AAF8000012 -:10238000EEE72DE9F84356880F46804615460521AD -:1023900030460EF063FB040000D1FFDF12340094DE -:1023A0003B46414630466A6809F02EFFB3E570B5FA -:1023B0000D4605210EF052FB040000D1FFDF294637 -:1023C00004F11200BDE8704009F02CBD70B50D4657 -:1023D00005210EF043FB040000D1FFDF294604F184 -:1023E0001200BDE8704009F050BD70B505460521EA -:1023F0000EF034FB040000D1FFDF04F10803214696 -:102400002846BDE870400422A7E470B505460521C2 -:102410000EF024FB040000D1FFDF2146284623688C -:10242000BDE87040052298E470B5064605210EF01F -:1024300015FB040000D1FFDF04F1120009F0E5FCF8 -:10244000401D20F0030511E0011D00880322431800 -:1024500021463046FFF781FC00280BD0607BABB2F1 -:10246000684382B26068011D0EF09BF96068418884 -:102470000029E9D170BD70B50E46054606F095FFFE -:10248000040000D1FFDF0120207266726580207891 -:1024900020F00F00C01C20F0F00030302070BDE8AC -:1024A000704006F085BF2DE9F0438BB00D46144611 -:1024B000814606A9FFF7A3FB002814D14FF6FF764B -:1024C00001274FF420588CB103208DF80000102014 -:1024D000ADF8100007A8059007AA204604A90FF040 -:1024E0003AFF78B107200BB0BDE8F0830820ADF8C3 -:1024F00008508DF80E708DF80000ADF80A60ADF848 -:102500000C800CE00698A17801742188C1818DF8B7 -:102510000E70ADF80850ADF80C80ADF80A606A4650 -:1025200002214846069BFFF782FBDCE708B5012243 -:102530008DF8022042F60202ADF800200A4603237D -:102540006946FFF734FC08BD08B501228DF802206A -:1025500042F60302ADF800200A4604236946FFF75D -:1025600026FC08BD00B587B079B102228DF80020A5 -:102570000A88ADF808204988ADF80A1000236A4699 -:102580000521FFF754FB07B000BD1020FBE709B1A0 -:1025900007230CE40720704770B588B00D46144639 -:1025A000064606A9FFF72BFB00280ED17CB10620BA -:1025B000ADF808508DF80000ADF80A40069B6A4659 -:1025C0000821DC813046FFF732FB08B070BD0520E2 -:1025D0008DF80000ADF80850F0E700B587B059B1AC -:1025E00007238DF80030ADF80820039100236A46D8 -:1025F0000921FFF71CFBC6E71020C4E770B588B0BF -:102600000C460646002506A9FFF7F9FA0028DCD19A -:1026100006980121123009F030FC9CB1217806297E -:1026200021D2DFE801F0200505160318801E80B2D4 -:10263000C01EE28880B20AB1A3681BB1824203D9EE -:102640000C20C2E71020C0E7042904D0A08850B9AC -:1026500001E00620B9E7012913D0022905D0042999 -:102660001CD005292AD00720AFE709208DF80000EB -:102670006088ADF80800E088ADF80A00A068039013 -:1026800023E00C208DF800006088ADF80800E08899 -:10269000ADF80A00A0680A25039016E00D208DF819 -:1026A00000006088ADF80800A088ADF80A00E08856 -:1026B000ADF80C00A0680B25049006E00E208DF804 -:1026C000000060788DF808000C256A4629463046DF -:1026D000069BFFF7ACFA78E700B587B00F228DF8BC -:1026E0000020ADF8081000236A461946FFF79FFA4C -:1026F00049E700B587B071B102228DF800200A8841 -:10270000ADF808204988ADF80A1000236A46062172 -:10271000FFF78DFA37E7102035E770B586B006462B -:1027200001200D46ADF808108DF800000146002389 -:102730006A463046FFF77BFA040008D12946304646 -:1027400005F058FC0021304605F072FC204606B02A -:1027500070BDF8B51C4615460E46069F0EF088FA69 -:102760002346FF1DBCB231462A4600940DF01FFEE1 -:10277000F8BD10B548800878144620F00F00C01C42 -:1027800020F0F00090300B4608701822214603F12B -:1027900008001FF0F6F9BDE8104006F009BE30B49D -:1027A0001146DDE902423CB1032903D0002330BCCD -:1027B00008F0D3BA0123FAE71A8030BC704770B52D -:1027C0000C460546FFF70FFB2146284605F021FC85 -:1027D0002846BDE87040012105F02ABC4FF0E022F8 -:1027E0004FF400410020C2F88011204908702049B0 -:1027F00090020860704730B51C4D04462878A0420E -:1028000018BF002C02D0002818BFFFDF2878A04294 -:1028100008BF30BD2C701749154A0020ECB1164D89 -:10282000DFF858C0131F012C0DD0022C1CBFFFDF96 -:1028300030BD086003200860CCF800504FF4000061 -:102840001060186030BD086002200860CCF80050AD -:102850004FF040701060186030BD086008604FF0A5 -:102860006070106030BD00B5FFDF00BD18000020B3 -:1028700008F5014000F500402403002014F5004055 -:1028800070B50B2000F0B5F9082000F0B2F9002176 -:102890000B2000F0C4F90021082000F0C0F9EC4C36 -:1028A00001256560A5600020C4F84001C4F844011A -:1028B000C4F848010B2000F0A7F9082000F0A4F9A3 -:1028C0000B2000F08BF9256070BD10B50B2000F0D7 -:1028D00090F9082000F08DF9DD4801214160816008 -:1028E000DC490A68002AFCD10021C0F84011C0F878 -:1028F0004411C0F848110B2000F086F9BDE81040E3 -:10290000082000F081B910B50B2000F07DF9BDE87A -:102910001040082000F078B900B530B1012806D089 -:10292000022806D0FFDF002000BDCB4800BDCB4809 -:1029300000BDCA48001D00BD70B5C9494FF0004038 -:102940000860C84DC00BC5F80803C74800240460E0 -:10295000C5F840410820C43500F04BF9C5F83C41AA -:10296000C248047070BD08B5B94A002128B10128D9 -:1029700011D002281CD0FFDF08BD4FF48030C2F810 -:102980000803C2F84803B3483C300160C2F8401164 -:10299000BDE80840D0E74FF40030C2F80803C2F8A1 -:1029A0004803AC4840300160C2F84411AB480CE029 -:1029B0004FF48020C2F80803C2F84803A548443009 -:1029C0000160C2F84811A548001D0068009008BDCC -:1029D00070B516460D460446022800D9FFDF0022D6 -:1029E0009B48012304F110018B4000EB8401C1F8E6 -:1029F000405526B1C1F84021C0F8043303E0C0F8C7 -:102A00000833C1F84021C0F8443370BD2DE9F041CE -:102A10001C46154630B1012834D0022839D0FFDFDA -:102A2000BDE8F081891E002221F07F411046FFF7AA -:102A3000CFFF012C24D000208C4E8A4F01247070CF -:102A40003C61894900203C3908600220091D08606A -:102A5000854904203039086083483D350560C7F852 -:102A60000042082000F0D0F82004C7F80403082032 -:102A700000F0B4F87A49E007091F08603470CFE726 -:102A80000120D9E7012B02D00022012005E001221C -:102A9000FBE7012B04D000220220BDE8F04197E7BC -:102AA0000122F9E76B480068704770B500F0C7F87D -:102AB000674C0546D4F840010026012809D1D4F816 -:102AC0000803C00305D54FF48030C4F80803C4F8E8 -:102AD0004061D4F8440101280CD1D4F808038003E4 -:102AE00008D54FF40030C4F80803C4F8446101204D -:102AF00010F0F6FBD4F8480101280CD1D4F80803F3 -:102B0000400308D54FF48020C4F80803C4F8486196 -:102B1000022010F0E5FB5648056070BD70B500F06E -:102B20008EF8524D0446287858B1FFF705FF6878B3 -:102B300020B1002085F8010010F0D2FB4C48046061 -:102B400070BD0320F8E74FF0E0214FF40010C1F80A -:102B500000027047152000F057B842490120086173 -:102B6000082000F051B83F494FF47C10C1F8080329 -:102B70000020024601EB8003C3F84025C3F8402142 -:102B8000401CC0B20628F5D37047410A43F60952EB -:102B90005143C0F3080010FB02F000F5807001EB18 -:102BA0005020704710B5430B48F2376463431B0C49 -:102BB0005C020C602F4C03FB04002F4B4CF2F724FB -:102BC00043435B0D13FB04F404EB402000F58070DD -:102BD0004012107008681844086010BD00F01F0211 -:102BE000012191404009800000F1E020C0F800116F -:102BF000704700F01F02012191404009800000F160 -:102C0000E020C0F88011704700F01F0201219140C0 -:102C10004009800000F1E020C0F8801270474907A9 -:102C2000090E002806DA00F00F0000F1E02080F81D -:102C3000141D704700F1E02080F8001470470C4824 -:102C4000001F00680A4A0D49121D116070470000FC -:102C500000B0004004B500404081004044B1004055 -:102C600008F501400080004040850040340000200D -:102C700014050240F7C2FFFF6F0C010001000001C4 -:102C80000A4810B50468094909480831086010F07D -:102C9000BBFB0648001D046010BD0649002008600B -:102CA0004FF0E0210220C1F8800270471005024079 -:102CB00001000001FC1F004010B50D2000F06FF86E -:102CC000C4B26FF0040000F06AF8C0B2844200D0D1 -:102CD000FFDF3A490120086010BD70B50D2000F0FB -:102CE00048F8374C0020C4F800010125C4F804530B -:102CF0000D2000F049F825604FF0E0216014C1F884 -:102D0000000170BD10B50D2000F033F82C480121F2 -:102D100041600021C0F80011BDE810400D2000F016 -:102D200033B8284810B50468264927480831086098 -:102D30002349D1F80001012804D0FFDF2148001DFC -:102D4000046010BD1D48001D00680022C0B2C1F81B -:102D5000002110F074FFF1E710B51948D0F8001108 -:102D60000029FBD0FFF7DDFFBDE810400D2000F08B -:102D70000BB800F01F02012191404009800000F1D2 -:102D8000E020C0F88011704700F01F02012191403F -:102D90004009800000F1E020C0F880127047002850 -:102DA00006DA00F00F0000F1E02090F8140D03E0C7 -:102DB00000F1E02090F800044009704704D500407D -:102DC00000D00040100502400100000110B5202095 -:102DD00000F075F8202000F07DF84449202081F8AB -:102DE0000004434900060860091D42480860FEF7D8 -:102DF00093FA3F49C83108603F48D0F8041341F0C6 -:102E00000101C0F80413D0F8041341F08071C0F838 -:102E10000413364901201C39C1F8000110BD10B55A -:102E2000202000F04CF8324800210160001D0160B4 -:102E30002F4A481EE83A10602F4AC2F808032C4B6C -:102E4000C8331960C2F80001C2F860012B4908605C -:102E5000BDE81040202000F03DB825492848EC3955 -:102E60000860704722492648E8390860704770B505 -:102E70001F4A8069E83A224911601F49D1F8006170 -:102E80000023204D1D4A5C1E1EB1A84206D300211E -:102E90000FE0D1F8606186B1A84209D2C1F80031D3 -:102EA000C1F860311460BDE87040202000F012B815 -:102EB0001168BDE870401EF0E3BEFFDF70BD00F09A -:102EC0001F02012191404009800000F1E020C0F87C -:102ED0008011704700F01F020121914040098000DD -:102EE00000F1E020C0F880127047000020E000E010 -:102EF000000602406413002000000240000402406B -:102F000001000001003002000F4A12680D498A4298 -:102F10000CD118470C4A12680A4B9A4206D101B5E7 -:102F200010F00EFFFFF799FFBDE80140074909685F -:102F30000958084706480749054A064B70470000EC -:102F400000000000BEBAFECAB0000020040000204D -:102F5000E8120020E812002070B50C46054609F082 -:102F6000F0FA21462846BDE870400AF0E2BB10B5F1 -:102F700011F054FBFFF732FC11F0F0F9BDE81040FE -:102F800011F0A2BA01208107086070470120810773 -:102F90004860704712480068C00700D001207047A1 -:102FA0000F48001F0068C00700D0012070470C4880 -:102FB00008300068C00700D0012070470848103072 -:102FC0000068704706490C310A68D20306D50968C3 -:102FD00001F00301814201D10120704700207047B8 -:102FE0000C0400407047704770477047704702F00C -:102FF000FF0343EA032242EA02421EF0F6BD704795 -:103000002CFFFFFFDBE5B151003002009D00FFFF08 -:1030100084000000404B4C0066D342DA82CFB49D5E -:10302000E40AD77E68976592800939FF30B5FF4D75 -:10303000044610280AD0112C06D02846122CC1783C -:1030400006D0132C08D0FFDFEC7030BDFFDFFBE7AC -:103050001129F9D0FFDFF7E71129F5D0FFDFF3E7FA -:1030600070B50FF0E3FA044610F0A0FC201AC4B2C9 -:1030700006200DF09DFC054606200DF0A1FC2E1A41 -:1030800007200DF095FC054607200DF099FCE74957 -:10309000281A3218C87812280DD000231A44132891 -:1030A0000BD0002002440878022808D000201044E9 -:1030B000201AC0B270BD0123F0E70120F2E7012021 -:1030C000F5E7DA4800B58079D849420897B051F859 -:1030D000070F89880CD017228DF80020CDF8020048 -:1030E000ADF806100BA968460AF0B4FF17B000BD92 -:1030F0004422F1E702210DF0B1BC2DE9F04196B078 -:103100001D4690460E460746FFF7F4FF04000BD01D -:103110002078222804D3A07FC0F34010A84206D113 -:10312000082016B0BDE8F08143F20200F9E749201B -:103130008DF80000ADF802703DB101208DF804005B -:103140008DF805608DF8068002E000208DF80400FF -:103150000BA968460AF07EFFA07F65F34510A077B3 -:103160000020DEE730B50446A1F120000D460A2814 -:103170004AD2DFE800F005070C1C2328353A3F440B -:10318000FFDF42E0207820283FD1FFDF3DE0A74865 -:103190000178032939D0C078132836D02078242824 -:1031A00033D0252831D023282FD0FFDF2DE0207801 -:1031B00022282AD0232828D8FFDF26E020782228BA -:1031C00023D0FFDF21E0207822281ED024281CD025 -:1031D00026281AD0272818D0292816D0FFDF14E077 -:1031E0002078252811D0FFDF0FE0207825280CD08B -:1031F000FFDF0AE02078252807D0FFDF05E02078F0 -:10320000282802D0FFDF00E0FFDF257030BD30B599 -:103210000B8840F67B444FF6FF72022801D09342A0 -:1032200004D09D1FA54224D2022802D04D88954289 -:1032300003D04D88AD1FA5421BD24C88A34218D89D -:103240008B88B3F5FA7F14D2022802D0C888904246 -:1032500005D0C88840F677450A38A84209D2C88800 -:10326000904208D0944206D05B1C6343B3EB800FBE -:1032700001DB072030BD002030BD70B514460D467F -:10328000064610F0EDFF60B90DB1A54201D90C2042 -:1032900070BD002409E000BF56F8240010F0E0FFE4 -:1032A00008B1102070BD641CE4B2AC42F4D300201D -:1032B00070BDF0B50024059D10B1A94203D850E0BF -:1032C00009B90020F0BD0920F0BD055DD5B1071991 -:1032D00097F801C0BCF1150F2DD03BDCBCF1150FE8 -:1032E00038D2DFE80CF037122020262628282F2F8E -:1032F000373737373737373737372000025D22BB4C -:10330000641CE4B28C42F9D3DBE7022DDBD1BD783B -:103310001D70072D01D26D0701D40A20F0BD15786C -:1033200045F0010515E0EF43FF0707E0012D07D049 -:1033300010E00620F0BD2F07A7F18057002FF5D031 -:103340003046F0BD1578AF0701D50B20F0BD45F034 -:1033500002051570055D641C2C44E4B28C4202D950 -:10336000B1E74FF448568C42AFD3AAE710B50278C4 -:10337000540809D0012243F20223012C07D0022C69 -:103380000DD0032C13D10FE00020087005E08079E8 -:103390000324B4EB901F0AD10A70002010BD80797D -:1033A000B2EB901F03D1F7E780798009F4D018467B -:1033B00010BD1E4A117C39B1517C022908D0032965 -:1033C00008D043F2022070470146901D01F0FCBC7A -:1033D000032100E0012101700020704738B50C4640 -:1033E0000546694601F0F0FC00280DD19DF800105B -:1033F000207861F34700207055F8010FC4F80100F0 -:10340000A888A4F80500002038BD38B51378E8B1C5 -:1034100002281BD006A46D46246800944C7905EB65 -:103420009414247864F34703137003E0CC01002064 -:103430000302FF0103280ED003F0FE00107008689D -:10344000C2F801008888A2F8050038BD23F0FE0309 -:1034500013700228E9D1D8B240F00100EEE730B590 -:103460000C46097897B0222902D2082017B030BD47 -:1034700028218DF80010ADF80200132A03D03B2A52 -:1034800001D00720F2E78DF804200BA968460AF066 -:10349000E1FD050003D121212046FFF763FE284608 -:1034A000E4E700B597B023218DF80010ADF80200D5 -:1034B0001088ADF804005088ADF80600D088ADF84B -:1034C0000A009088ADF808000020ADF80C00ADF8B7 -:1034D0000E000BA968460AF0BDFD07E600B597B0DF -:1034E0002C22FA4968461EF04CFB0020CDF8030060 -:1034F000ADF80700F648007C022801D0012000E06A -:1035000000208DF809000BA968460AF0A3FD0028E9 -:1035100000D0FFDFEAE52DE9FF470220EC4E8DF8F1 -:1035200004000027B08AADF80600B84643F202094D -:103530004DE001A80DF0FBF9050006D0B08AA8B354 -:10354000A6F81480ADF806803FE0039CA07F010739 -:103550002DD504F124000090A28EBDF8080021466C -:1035600004F1360301F00DFE050005D04D452BD0CA -:10357000112D3DD0FFDF3BE0A07F20F00800A077B9 -:10358000E07F810861F30000C10861F34100E0774A -:1035900094F8210000F01F0084F8200020782828EB -:1035A00027D129212046FFF7DDFD22E015E0400765 -:1035B0000BD5BDF80800214604F10E02FFF771FF9C -:1035C00005000DD04D4510D100257F1CFFB2022013 -:1035D0000DF0EEF9401CB842ABD8052D12D008E032 -:1035E000A07F20F00400A07703E0112D00D0FFDFC2 -:1035F0000025BDF80600B082052D05D0284604B090 -:10360000BDE8F087A6F814800020F8E770B50646FC -:10361000FFF770FD054605F0C8FE040000D1FFDF8E -:103620006680207820F00F00801C20F0F000203011 -:1036300020700620207295F83E006072BDE8704050 -:1036400005F0B6BE2DE9F04786B0040000D1FFDFDB -:1036500020789F4E20F00F00801C20F0F00070308A -:10366000207060680178091F182931D2DFE801F065 -:10367000FD30303053FC300CFCFC40FD3030FD762A -:10368000FDFD3030FDFDFBFA86883046FFF732FD48 -:103690000546304607F05FFAE0B16068807985F84A -:1036A0003E0021212846FFF75DFD3046FEF7B9FCBC -:1036B000304603F0C3FF3146022010F085FDA87F9D -:1036C00020F01000A877FFF726FF002800D0FFDFCA -:1036D00006B095E7207820F0F0002030207006201A -:1036E0002072668060688079607205F061FED8E7BC -:1036F00085882846FFF7FEFC00B9FFDF6068807808 -:10370000012800D0FFDF6068817906B02846BDE857 -:10371000F04707F0FDBD86883046FFF7EBFC05005B -:1037200000D1FFDF05F044FE60683146C088288183 -:1037300060680089688160684089A881022010F073 -:1037400043FD0020A875A87F00F003000228BFD128 -:10375000FFF7E1FE0028BBD0FFDFB9E780783C2807 -:1037600003D0002502280AD000E00125002720B15F -:103770003C2802D0022800D0FFDF17B1B8E00127B3 -:10378000F5E705F015FE1DB1B07801F0DCFAA1E017 -:103790006568B5F804A0A879AD1C012806D0307979 -:1037A000814605F097FB070003D101E0B078F7E709 -:1037B000FFDF0022022150460DF047F9040000D13E -:1037C000FFDF22212046FFF7CDFC2879012800D019 -:1037D0000220A17F804668F30101A177288B208118 -:1037E000688B6081A88BA08184F822908DF8088076 -:1037F000B8680090F86801906A46032150460DF0C1 -:1038000024F900B9FFDFB888ADF81000B8788DF85A -:10381000120004AA052150460DF017F900B9FFDF88 -:10382000B888ADF80C00F8788DF80E0003AA0421D2 -:1038300050460DF00AF900B9FFDF062105F112002C -:1038400001F0EDFA28B36879800700D5FFDF6979C8 -:10385000E07D61F34700E075D5F80600A061688956 -:10386000A08303E05EE057E050E062E0062105F14E -:103870000C0001F0D4FAB0B1B0794108607861F37E -:1038800047006070D6F80700C4F80200B6F80B00D5 -:1038900012E0E07D20F0FE00801CE075D5F81200FB -:1038A000A061E88ADCE7607820F0FE00801C607090 -:1038B000E868C4F80200288AE080B8F1010F09D056 -:1038C000B8F1020F14D0FFDF02E70000CC1F0200A6 -:1038D000CC0100203078032800D0FFDF002108460B -:1038E00010F072FC06B00120BDE8F04701F0FAB913 -:1038F000F078132800D0FFDF0021062010F064FCD0 -:1039000006B01120BDE8F047FFF790BB06B0204697 -:10391000BDE8F04701F0E6BE05F04AFDB07C40F09E -:10392000020004E005F044FDB07C40F00400B074F7 -:10393000CEE606B0BDE8F04705F03ABD2DE9F04708 -:1039400005460078914600270209FF480C463E468E -:10395000012A6DD000234FF6FF71022A69D0072A91 -:1039600009D00A2A71D0FFDFA9F800600CB12780C6 -:103970006680002044E6D5F804C09CF80060142E50 -:103980007DD010DC04F1080204F118080F2E21D0BC -:1039900004DC042E5AD0082E57D10DE0122E6FD021 -:1039A000132EF9D11FE0153E072E4ED2DFE806F0A8 -:1039B000C14D4D099FEAB00012271026BCF8040043 -:1039C00014E11C27092694B3BCF80200A0806868A3 -:1039D00000795AE11B2709264CB30320207268683E -:1039E0004088A080C0E79CF802003C2827D0102720 -:1039F00018260CF1020CD4B1BCF80200A080BCF86F -:103A000018006082BCF818002082BCF81A00A0825E -:103A1000BCF81C00E0829CF805000CF10601FFF7E1 -:103A2000F4FC9CF8040028B10120E0739CE703E05B -:103A3000BFE0DFE00220F8E7A9F8006099E71B2764 -:103A40000926002CF8D023728EE720E11D273726A7 -:103A5000002CF1D0A18069680879491DFFF7D5FCD9 -:103A6000686890F82B00A0756868C0780428E07D2D -:103A700016D020F00100E0756968C97801E06DE0BA -:103A800011E061F34200E07569681F22C97A61F3B1 -:103A9000C700E075696840460C311EF02DF863E7F9 -:103AA00040F00100E7E71D273726002CC4D0A18095 -:103AB0006868411D0079FFF7A8FC696804F10F02EE -:103AC00001F10C00CB7A01461846FFF79EFC6868AE -:103AD000807CA0756868C178E07D61F3420020F0C9 -:103AE000F900E0751F2140461EF09FF83CE72027B3 -:103AF0001026002CA0D0A180686804F10902407A49 -:103B000020726968CB1C88781946FFF77EFC2BE78A -:103B100021270A26002C8FD0BCF80210A1806968EA -:103B200009792172696849796172817C21F0040107 -:103B300057E022270B26002C84D0BCF80400A0807C -:103B40006868807820726868807901F077F960721F -:103B50006868C07901F072F9A07205E72427102681 -:103B6000002CA3D0BCF80200A080686800792081F6 -:103B70006868007A60816868C088A0816868408948 -:103B8000E081F1E623271026002C8FD0BCF802102C -:103B9000A1806968898821816968C98861816968AB -:103BA0000989A18169684989E181817C21F002014B -:103BB00017E0297A012903D0022914D0FFDFD3E6C8 -:103BC0001F271026002C95D06988A180A989218102 -:103BD000E9896181298AA181698AE181817C21F059 -:103BE00001018174C0E6122768881026214601F081 -:103BF00003F9B9E6287A072850D2DFE800F0373D0C -:103C00003D484848040011270926002C94D0B5F8F7 -:103C100002804046FFF76EFA90F822A0A4F80480D4 -:103C2000687A2072042140460CF02AFF05214046A4 -:103C30000CF026FF002140460CF022FF01214046F7 -:103C40000CF01EFF032140460CF01AFF02214046F3 -:103C50000CF016FF062140460CF012FF07214046EB -:103C60000CF00EFF504601F06EF87DE61B2709268A -:103C7000002C8AD0A180E6E61B270926002C84D0E0 -:103C8000A180287A012800D0022020726CE64A46E2 -:103C900021462846BDE8F04701F0AFBEFFDF63E6EE -:103CA00030B5294D97B0E878132802D0082017B016 -:103CB00030BD22208DF800000BA968460AF0CAF931 -:103CC000040002D1287901F03EF80021062010F00E -:103CD0007BFA2046EBE700B51B4897B0C078122866 -:103CE00001D0082016E41E208DF8000000208DF879 -:103CF00002008DF803000BA968460AF0ABF9002812 -:103D0000F0D10021062010F05FFA1120FFF78EF9A4 -:103D10000020E7E710B50C4C96B02078012815D0AC -:103D20001B208DF8000000208DF802000BA96846CA -:103D30000AF090F900280AD10021084610F044FA50 -:103D40002078032805D007E0CC010020082016B019 -:103D500010BDA07800F0F7FF012000F0C3FF0020A5 -:103D6000F5E770B5002538B1022817D0062836D0FF -:103D7000072800D0FFDF70BDFFF7CCFF0028FAD185 -:103D800005F013FB0028F6D0017821F00F01891C03 -:103D900021F0F0012031017005723FE08EB2304613 -:103DA000FFF7A8F9040000D1FFDF20782128E2D036 -:103DB00005F0FBFA60B1017821F00F01891C21F0B8 -:103DC000F00110310170022101724680A57525E0D5 -:103DD00021463046BDE870401322FFF740BBFE4845 -:103DE000C478122C03D0132C04D0FFDF70BDFFF772 -:103DF00072FF01E0FFF754FF0028F7D105F0D5FA74 -:103E00000028F3D0017821F00F01891C21F0F00186 -:103E100020310170122C05D002210172BDE87040E2 -:103E200005F0C6BA0121F8E72DE9F04116460C006D -:103E3000804600D1FFDF307820F00F00801C20F09A -:103E4000F000103030702078012804D0022817D0FC -:103E5000FFDFBDE8F0814046FFF74CF9050000D1D7 -:103E6000FFDF0320A87505F0A3FA94E80F000836D9 -:103E700086E80F00D848817C41F001018174E8E7B1 -:103E80004046FFF737F9050000D1FFDFA1884FF664 -:103E9000FF700027814202D1E288824203D0814232 -:103EA00001D1E08840B105F083FA94E80F000836AC -:103EB00086E80F00AF75CCE7A87D0128C9D178232B -:103EC00000224146022010F0D5F80220A875C0E774 -:103ED00030B5054697B00C46084610F0C1F978BBDE -:103EE00000210120203D072D73D2DFE805F00425D5 -:103EF0004C515A6640000021072010F03BF908B1F0 -:103F00001120D4E624208DF80000D4F80200CDF86A -:103F10000200A0798DF806000BA968460AF09AF80D -:103F2000050057D1002208231146072010F0A2F8FF -:103F300007284FD0FFDF4DE0606810F0D5F908B1D9 -:103F40001020B4E64A208DF800002088ADF8020069 -:103F50006088ADF804000BA968460AF07BF80500FC -:103F600038D1606898B3BDF83010018032E04C2041 -:103F70008DF800002088ADF80200A07800F0010064 -:103F80008DF8040014E0206801F0D5FF054621E01B -:103F90004B2207E08DF802000AE000BF8DF8021006 -:103FA00006E046228DF800202278D207F6D0F1E70D -:103FB0000BA968460AF04EF8E8E738208DF80000B3 -:103FC0002088ADF802006088ADF80400F0E701E059 -:103FD000FFE7072528466AE630B5054697B00C4648 -:103FE000084610F063F908B1102060E6203D072D67 -:103FF00027D2DFE805F00424242426262400208884 -:10400000FFF778F820B10078222804D208204EE685 -:1040100043F202004BE625208DF800002088ADF821 -:1040200002000BA968460AF015F80028DDD1DDF87A -:104030003210C4F802109DF83610A17137E6062040 -:1040400035E6072033E66448801D704738B51621F1 -:1040500061481DF0C8FD012000F044FE1120FEF76C -:10406000E5FF5D4C6846E11D05F0FFF89DF8001086 -:10407000A07961F3470020F00100A07100202074B6 -:104080004FF46170E08102206074FFF71AF800B10C -:10409000FFDFFDF769F901F0E2FA38BD10B50C4613 -:1040A000402120461DF09FFDA07F20F00300A07757 -:1040B000202020700020A07584F8230010BD7047D8 -:1040C0007CB5054610F0CCF808B110207CBD424C00 -:1040D000A11DD4F806000090D4F80A0001902846EB -:1040E000FFF77CF90028F1D1FEF7EBFF0028EDD0B7 -:1040F0000099C4F80610BDF8041061819DF80610FF -:1041000021737CBD10B5044610F0D0F808B1102022 -:1041100010BD314922468879C91D4008FFF775F95D -:10412000002010BD2DE9F0479CB00D4604004FF073 -:10413000000812D00822FFF7A0F800281CD10026A2 -:1041400009E000BF54F8260004A9FFF70FF9002882 -:1041500012D1761CF6B2AE42F4D32F460A2006AD39 -:104160000DF1440A8DF8180026465146284609F0FC -:1041700071FF20B143F203201CB0BDE8F087404638 -:10418000DFF8548088F805002EB300244FF00B09A7 -:104190001DE000BF56F8240005A9FFF7E7F800B1BD -:1041A000FFDF9DF81400A87056F8240050F8011F96 -:1041B000C5F803108088A5F8070085F800905146DF -:1041C000284609F047FF00B1FFDF641CE4B2BC429F -:1041D000E0D388F8057001E0CC0100200020CBE797 -:1041E0002DE9F0479EB01546894604001DD00F46C4 -:1041F00008222946FFF741F8002810D1002612E0D6 -:1042000054F8260005A9103000F0DEFD002806D184 -:104210003FB157F8260010F023F810B110201EB05F -:10422000ABE7761CF6B2AE42EAD30026A5F1010850 -:104230001CE000BF06F1010A0AF0FF0712E000BF10 -:1042400054F82600017C4A0854F827100B7CB2EB86 -:10425000530F05D10622113011311DF021FC78B128 -:104260007F1CFFB2AF42EBD30AF0FF064645E1DB0D -:10427000C8462E4607AD0DF1480924B1012003E0E0 -:1042800043F20520CBE700208DF81E0031208DF889 -:104290001C004946284609F0DDFE38B934208DF867 -:1042A0001C004946284609F0D5FE10B143F204200F -:1042B000B5E77CB300272BE054F82700A91C103089 -:1042C00000F082FD00B1FFDF54F82700102250F803 -:1042D000111FC5F803108088A5F8070054F82710AF -:1042E00005F109001DF008FCB8F1000F16D058F8D0 -:1042F0002710102205F119001DF0FEFB3220287056 -:104300004946284609F0A6FE00B1FFDF7F1CFFB238 -:10431000B742D1D3FFF7E2F8002080E705F119009A -:1043200001F0FDFDEAE770B596B004460FF098FF86 -:1043300018B960680FF0E1FF10B1102016B070BD21 -:1043400060884AF2B811884207D82078FE4D6E4640 -:1043500028B1012806D0022804D00720EEE7FEF796 -:10436000B0FE1AE06078022804D0032802D043F29D -:104370000220E3E7687417208DF80000697C0020B4 -:10438000CDF80200ADF80600022934D003292FD061 -:10439000FFDF0BA9684609F05DFE0028CED16068FA -:1043A00001F0B0FD207870B101208DF80200F01C02 -:1043B00001F0B5FD4E208DF800000BA9684609F00C -:1043C00049FE00B1FFDF20782874FFF787F8608886 -:1043D00098B1E88180B2ADF8020030208DF800007D -:1043E0000BA9684609F036FE00B1FFDF0020A5E703 -:1043F0008DF80700CDE74020FAE74FF46170E8E759 -:1044000010B504460FF052FF20B9606838B10FF0C4 -:104410006BFF08B1102010BD606801F080FDCA4834 -:10442000C1896180417C6170007C2070002010BDDA -:104430002DE9F0419CB0054600208DF864008DF810 -:1044400060008DF830008DF868001E4614468846DE -:1044500028460FF052FF18B920460FF04EFF10B15A -:1044600010201CB0F5E455EA040018D01F270CAB4F -:1044700019AA414628460097FEF71BFF0028F0D1F5 -:104480001AAB18AA314620460097FEF712FF002803 -:10449000E7D19DF86000C00703D00A20E1E70720BC -:1044A000DFE701AF7DB11A208DF804008DF806809A -:1044B00042462946F81C1DF01FFB0DA901A809F072 -:1044C000C9FD0028CDD17CB120208DF804008DF8E5 -:1044D000066032462146F81C1DF00EFB0DA901A80E -:1044E00009F0B8FD0028BCD197499DF8300048700C -:1044F0000020B6E72DE9F0479CB08A464FF000084F -:1045000092A104468DF83480D1E90001CDE919016A -:1045100020460FF0A5FE90B92078012803D16068ED -:104520000FF09EFE58B9884D4FF00109287C40B12C -:10453000687C022805D160680FF0DFFE08B110200A -:104540001AE62878012801D0082015E607200CF08B -:1045500037FA18B9207878B101280DD0FEF780FD20 -:1045600060B1608943F6E172A0F1200191422178A7 -:104570000CD3012904D0B6E01220FDE51320FBE5A1 -:1045800000287DD1A18900297AD109E0012907D02D -:104590006978C90704D0A189002971D0B4296FD8DE -:1045A000217831B1012908D0022904D0032967D12B -:1045B0000AE0002609E0022607E008B9A08908B150 -:1045C000042609E0012607E00326287C50B1687C18 -:1045D000022807D1606828B10DA96068FEF7C6FE01 -:1045E0000028ADD1207A30B1012806D0022806D0AB -:1045F000032878D105E0002704E0012702E0022724 -:1046000000E003270EB1022E0ED16FB16879B8B366 -:104610006878800702D043F20120ADE5022E03D175 -:10462000022F60D0032F5ED0207808B1012806D178 -:10463000504600F06BFB002887D185F802A01820B7 -:104640008DF838006089ADF83A006089ADF83C001B -:104650008DF83E600DF13F00FEF7ABFE00B1FFDFCD -:104660009DF834008DF840002078012806D0287C81 -:1046700068B1687C02280AD1606840B1606800E0D7 -:1046800031E050F8011FCDF84110808802E040462B -:10469000CDF84180ADF845008DF84870A07BC0F39F -:1046A0004002014662F35F01C0F3800041EA8000EE -:1046B00019A9085C8DF84700A8B169460EA809F051 -:1046C000C9FC0028A9D11B208DF838008DF83A903C -:1046D00069460EA809F0BEFC00289ED19DF8010095 -:1046E0001B281CD101E0072046E5052E0CD2DFE88F -:1046F00006F0030308080300A87800F017FB032066 -:1047000000E0022000F0EEFA012E0AD0A08940B1AC -:1047100000228300114610460FF0ACFC08B10320C4 -:104720002AE5002028E52DE9FC4107460D46032631 -:1047300008460FF0E2FD00286CD13846FEF7DAFC9F -:1047400004000CD0207805E0CC0100200706050409 -:1047500003020100222805D20820BDE8FC8143F2B3 -:104760000200FAE7A07F00F0030C2DB12946604655 -:10477000FEF74DFD0600F0D1BCF1010F05D0BCF1F4 -:10478000020F18D0FFDF3046E7E7A07D2946022858 -:1047900001D011B107E01120DFE76846FCF7F2FE17 -:1047A0000028DAD16946384606F075FD0600EAD1E0 -:1047B0000120A075E7E7A07D032803D1FE48807C97 -:1047C000C00701D035B30EE025B1A07F40071FD44C -:1047D000002100E00121384606F07DFD0600D2D11F -:1047E000A075002DCFD02A4621463846FEF759FE47 -:1047F00006461128C7D1A07F4107C4D4296844F8D0 -:104800000E1F6968616040F0040020740026BAE75A -:104810001126B8E71020A0E770B50C460546FEF754 -:1048200069FC010005D022462846BDE87040FEF72D -:1048300016BE43F2020070BD00B597B043218DF85B -:1048400000108DF802000BA9684609F003FC17B0B0 -:1048500000BD0123FEF751BC00231A461946FEF79E -:104860004CBC30B597B004460FF0FAFC10B11020E4 -:1048700017B030BD204600F095FA0028F8D1CE4D93 -:10488000E878112801D00820F2E7FEF7E9FBE0B351 -:104890002078800701D56879C0B31D208DF800000D -:1048A0002078022200F001008DF802006088ADF847 -:1048B0000400A088ADF806002078C0F3400102EAA9 -:1048C000500001438DF8091002A8FEF772FD00B1F7 -:1048D000FFDF0BA9684609F0BDFB0028C8D11E20E8 -:1048E0008DF8000001208DF8020000208DF80300F3 -:1048F0000BA9684609F0AEFB0028B9D1E08800F0AA -:104900006DFA0400B4D1122001E004E005E0FEF7E6 -:104910008DFB2046ACE71320AAE70720A8E72DE986 -:10492000F043A54E074697B0F078994615460C46D9 -:10493000122803D1FFF7CFF9002816D120460FF037 -:104940008FFCE8BB28460FF08BFCC8BB204600F06C -:1049500029FA002809D129460220FEF758FC002830 -:1049600003D1F078112803D0082017B0BDE8F083F8 -:1049700006200CF025F850B12078800701D5707919 -:1049800038B1FEF76DFB022805D21320EDE71220A7 -:10499000EBE70720E9E721208DF800006088ADF8FB -:1049A0000200A088ADF8040020784FF00008C0F3A2 -:1049B00040008DF80600207880071FD4384600E0BC -:1049C00002E00FF04DFC08B11020CEE73878400827 -:1049D00008D0012809D0022807D0032805D043F2C7 -:1049E0000220C2E78DF8078002E001208DF8070061 -:1049F00057F8010F0290B888ADF80C000DF10E00C9 -:104A0000FEF7D7FC08B10320AFE72888ADF8100007 -:104A10006888ADF81200A888ADF81400E888ADF8F1 -:104A20001600ADF81880ADF81A80484600F06EF90F -:104A300000289AD186F804900BA9684609F00AFB71 -:104A4000002892D1307900F071F9E08800F0C6F9C1 -:104A500004008AD11320FEF7E9FA204685E730B535 -:104A6000054697B00C4608460FF020FC08B1102010 -:104A7000FEE62846FEF73EFB38B10178222902D334 -:104A8000807F800604D40820F2E643F20200EFE6BD -:104A900013208DF80000ADF802500BA9684609F00C -:104AA000D9FA0028E4D19DF932107F2901D0217074 -:104AB000DEE60520DCE630B5054697B00C46084634 -:104AC0000FF0CEFB08B11020D2E62846FEF712FB0D -:104AD00020B10078222804D20820C9E643F202005F -:104AE000C6E63548807C400701D51120C0E6207815 -:104AF000800802D16078800801D00720B8E65620EF -:104B00008DF80000ADF8025020788DF80400607830 -:104B10008DF805000BA9684609F09CFAA8E62DE976 -:104B2000F041B0B014460D460646FEF7E3FA070022 -:104B300006D03878222806D2082030B0BDE8F081AF -:104B400043F20200F9E728460FF0D7FB30B94FF0E7 -:104B500000084CB120460FF0C7FB08B11020ECE76D -:104B6000C4F80080A4F804801348807C800701D535 -:104B70001120E2E797F8220004F0ACF98088011DCB -:104B8000FB2901D2001D00E0FB20C0B26A46294685 -:104B900000F0E3F82C22094904A81CF0F2FFBDF84C -:104BA0000200ADF81400BDF80600ADF81600ADF82F -:104BB0001260BDF8000003E0CC010020A01F02003D -:104BC000ADF81800BDF80400ADF81A001AA904A841 -:104BD00009F040FA00B1FFDFBDF86C00ADF8080045 -:104BE000BDF86E00ADF80A00BDF87000BDF8721097 -:104BF000BDF800200844ADF80C0007201B2A9CD308 -:104C0000BDF802101B2998D3FB2A96D8FB2994D80B -:104C100006278A4210D10121104600F05AF8BDF84B -:104C20000410884208D1BDF80200012100F051F8BB -:104C3000BDF80610884201D038467EE7BDF808006E -:104C400028B9BDF80A1011B9BDF80C1029B35DB12F -:104C5000298849B1698839B124B102982060BDF82A -:104C60000C00A080132068E7BDF80010BDF80A20F2 -:104C7000081A80B2ADF80000BDF80210891AADF82C -:104C80000210012100F025F8ADF80400BDF8020083 -:104C9000012100F01EF8ADF806002C226B490FA888 -:104CA0001CF06FFFADF83E60BDF80200ADF84000AB -:104CB000BDF80600ADF84200BDF80000ADF84400B4 -:104CC000BDF80400ADF8460025A90FA809F0C2F907 -:104CD00033E7022903D0C000703080B270478000F3 -:104CE0003C30FAE730B55A4D040008D0012C04D00E -:104CF000022C06D0032C04D0FFDF2C7030BDFFDF68 -:104D0000FBE728780128F8D0FFDFF6E710B5044666 -:104D100004F0E0F830B1407830B1204604F0EEFB0A -:104D2000002010BD072010BD122010BD10B504F0EA -:104D3000D1F8040000D1FFDF607800B9FFDF6078B0 -:104D4000401E607010BD10B504F0C4F8040000D11E -:104D5000FFDF6078401C607010BD10B5144631B1A3 -:104D60000A68226049686160218839B107E02080C3 -:104D700060800121FFF7ADFFA0800DE020806188F9 -:104D800001B96080A08820B920880121FFF7A1FF28 -:104D9000A080E088002804D160880121FFF799FFF6 -:104DA000E08010BD418843F6FD730A1F9A4209D284 -:104DB0008088042806D3B0F5804F03D8884201D8F4 -:104DC00000207047072070470278520804D0012A5B -:104DD00002D043F202207047FEF7C8BA10B548B1BE -:104DE00083000022114606200FF044F9062801D066 -:104DF000032010BD002010BD70B50C0006460DD07C -:104E0000FEF778F9050000D1FFDFA6802889208110 -:104E1000288960816889A081A889E08170BD10B56A -:104E200000231A4603E0845C2343521CD2B28A4218 -:104E3000F9D30BB1002010BD012010BD00B5012831 -:104E400003D0022801D0FFDF002000BDF81F0200C0 -:104E5000CC01002010B504460FF002FA08B1102072 -:104E600010BD2078C0F30210042807D86078072806 -:104E700004D3A178102901D8814201D2072010BDA6 -:104E8000E078410706D421794A0703D4000701D40A -:104E9000080701D5062010BD002010BD10B51378FD -:104EA0005C08C37F64F30003C3771478A40864F339 -:104EB0004103C3771078C309487863F34100487011 -:104EC00013781C090B7864F347130B701378DB0815 -:104ED00063F3000048705078487110BD10B5C47875 -:104EE0000B7864F300030B70C478640864F3410327 -:104EF0000B70C478A40864F382030B70C478E408D0 -:104F000064F3C3030B700379117863F3000111702C -:104F100003795B0863F34101117003799B0863F324 -:104F2000820111700079C00860F3C301117010BDD7 -:104F300070B514460D46064604F037FA80B1017884 -:104F4000182221F00F01891C21F0F001A03100F896 -:104F5000081B21461CF015FEBDE8704004F028BA7D -:104F600029463046BDE870401322FEF778BA10B5E6 -:104F7000FE4C94F8300000280CD104F120014FF6CB -:104F8000FF72A1F110000DF04DF900B1FFDF01201B -:104F900084F8300010BD2DE9F047064608A8894680 -:104FA00090E830041F469046142128461CF03DFE30 -:104FB0000021CAF80010B8F1000F03D0B9F1000FBA -:104FC00003D114E03878C00711D020680FF06EF9D3 -:104FD000F0BBB8F1000F07D12068123028602068BC -:104FE000143068602068A8602168CAF8001038781A -:104FF000800728D560680FF077F948BBB9F1000F3A -:105000002DD0FFF720F80168C6F8C8118188A6F8EE -:10501000CC11807986F8CE01FFF7A9FFDFF84C8329 -:1050200008F12008C5F80C80626862B196F8C801E2 -:1050300006F2C91140081032FEF7E7F91022414686 -:1050400060681CF059FD3878400712D5A06800E070 -:1050500002E00FF02BF950B11020BDE8F087606836 -:105060000028F9D0E8606068C6F8C401EBE7A068E2 -:1050700028610020F1E730B5054608780C4620F09D -:105080000F00401C20F0F0011031217000206070F2 -:1050900095F8230030B104280FD0052811D0062838 -:1050A00014D0FFDF20780121B1EB101F04D295F856 -:1050B000200000F01F00607030BD21F0F0002030B3 -:1050C00002E021F0F00030302070EBE721F0F0003A -:1050D0004030F9E710B510B190F8BD4044B1A34895 -:1050E00090F83540002064B108601060186010BD71 -:1050F00000F1BC040C6000F1E40100F58670116061 -:10510000F4E79A4C34340C60EFE700B58BB007231A -:10511000CDE902128DF801300191944900236431E8 -:105120000591099301468DF8103068460DF052F84C -:10513000002800D0FFDF0BB000BD70B590B0154661 -:105140000C4602220646ADF80820092103AB04F004 -:105150006EFF0490002812D00C208DF8010004206E -:105160008DF8040004F59A74099605948DF818508A -:105170000AA968460DF02EF800B1FFDF012010B03B -:1051800070BD30B597B00C462C251A998DF800509B -:10519000ADF80200B3B11868019058680290ADF8FC -:1051A0000C2010220DF10E001CF0A6FC0BA9684685 -:1051B00008F050FF002803D1A17F41F01001A17732 -:1051C00017B030BD00200190E8E72DE9F047064612 -:1051D000808A8CB080B20D468246FDF78BFF044674 -:1051E000624F3078283FDFF884914FF00008112893 -:1051F00073D2DFE800F072F1350936777E98A7F2B6 -:10520000EFEEEDEC5BECEC00A07F00F0030001287A -:1052100006D0002150460BF021FC050003D101E02F -:105220000121F7E7FFDF99F85C10C90702D0D9F830 -:1052300060000BE0032105F121000EF0E2FCD5F83F -:1052400021004B49B0FBF1F201FB1200C5F821002F -:105250007068A867B068E8672078252800D0FFDF6D -:10526000ECE0A07F00F00300012806D000215046AA -:105270000BF0F4FB060003D101E00121F7E7FFDFAB -:105280003078810702D52178252904D040F001002B -:1052900030700CB0E1E60220287096F820002871EA -:1052A00006F121003136C5E90206F2E7A07F00F0E1 -:1052B0000300012806D0002150460BF0CFFB04006C -:1052C00003D101E00121F7E7FFDF2078C10605D512 -:1052D0001320287041346C60DBE7BEE140F0080029 -:1052E0002070D6E72148082128380EF08AFC0320D8 -:1052F00016E02A208DF8000010220DF102007168DE -:105300001CF0FAFB10220DF11200B1681CF0F4FB46 -:10531000164968462C3908F09DFE00B1FFDF0420D5 -:1053200028706F60B5E7E07FC00600D5FFDF307CF6 -:10533000B28800F001030CB05046BDE8F0470921E7 -:1053400005F00BBD04B9FFDF716821B1102204F133 -:1053500024001CF0D1FB28212046FDF703FFA07F8D -:1053600000F00300022814D104E00000180200201D -:1053700040420F0004F12400002300901A46214609 -:105380005046FFF7FEFE112807D029212046FDF7E1 -:10539000E9FE307A84F820007BE7A07F000700D583 -:1053A000FFDF14F81E0F40F008002070A4F81680EC -:1053B000C4F81880C4F81C806178084661F3820044 -:1053C000410861F3C3006070307AE07061E727E064 -:1053D0003FE17AE051E000E037E0A07F00F0030019 -:1053E000012806D0002150460BF038FB040003D101 -:1053F00001E00121F7E7FFDF022104F189000EF04F -:1054000000FC1020287004F5E4706860B4F889107E -:10541000298204F18000FD496861C5E9029138E7FD -:10542000A07F00F00300012805D0002150460BF0BA -:1054300015FB18B901E00121F8E7FFDF0CB0324697 -:1054400021465046BDE8F04772E504B9FFDF2078F9 -:105450002128A1D93079012803D1E07F40F0100044 -:10546000E077324621465046FFF762FD0CB02046F9 -:10547000BDE8F0472321FDF775BE3279AA8005F11A -:1054800008030921504604F0D2FDE86010B1112054 -:105490002870FEE6A07F00F00300012806D000215E -:1054A00050460BF0DBFA040003D101E00121F7E7DD -:1054B000FFDF04F1660102231022081F0BF03BF905 -:1054C00080F8008031794170E3E6A07F00F00300AE -:1054D000012806D0002150460BF0C0FA050003D188 -:1054E00001E00121F7E7FFDF95F8880000F00300F5 -:1054F000012879D1A07F00F00307E07FC0F34006C8 -:1055000016B1012F04D02BE095F8A400C0072AD0D3 -:10551000D5F8C00118B395F88720017C62F38701A4 -:105520000174E27FD5F8C00162F341010174D5F83E -:10553000C00166F300010174AEB1D5F8C0011022BC -:1055400004F124018C351CF0D7FA287E40F00100CC -:105550002876287820F0010005F88C0900E016B1C3 -:10556000022F04D02CE095F88C00C00726D0D5F887 -:10557000BC1119B395F88720087C62F38700087482 -:10558000E27FD5F8BC1162F341000874D5F8BC1174 -:1055900066F3000008748EB1D5F8BC01102204F146 -:1055A00024018C351CF0A8FA287840F0010005F899 -:1055B000180B287820F0010005F8A409022F44D028 -:1055C0005FF0000000EB400005EBC00090F88C009D -:1055D000800709D595F88000D5F8C421400805F169 -:1055E00081011032FDF711FF05208DF8000095F8BC -:1055F00088006A4600F003008DF8010095F88C10D1 -:105600008DF8021095F8A4008DF80300214650464D -:1056100001F046FA2078252805D0212807D0FFDFA1 -:105620002078222803D922212046FDF79BFDA07F68 -:1056300000F0030001280AD0002150460BF020FAA8 -:1056400000283FF432AEFFDF23E60120BAE7012154 -:10565000F3E7716881F801801BE6FFDF19E670B59A -:105660006A4C0025103C04F85C5F65600CF07FFD1F -:105670006649A1F1100003F02AFE04F82C5C062014 -:10568000607262487C3020615030A0611030E0616F -:1056900070BD70B50D46FDF72DFD040000D1FFDF94 -:1056A0004FF4E87128461CF0C0FA5848543068613D -:1056B00004F124002861A07F00F00300012809D034 -:1056C0005FF0020105F59A700CF052FD002800D041 -:1056D000FFDF70BD0121F5E70A46014602F59A7029 -:1056E0000CF066BD70B5054640689CB0017809298C -:1056F00006D00C2937D00D2933D0FFDF1CB070BD88 -:1057000046883046FDF7F6FC040000D1FFDF207824 -:105710002128F3D0282821D1686802210C3001F01B -:10572000B4F9D8B168680821001D01F0AEF9A8B13C -:105730002D208DF80000ADF80260102204F1240144 -:1057400001A81CF0D9F90BA9684608F083FC00B148 -:10575000FFDF29212046FDF705FDCFE703F028FEF6 -:10576000CCE701218171686886883046FDF7C2FC6C -:10577000040000D1FFDFA07F00F00301022902D165 -:1057800020F01000A077207821280AD0686881795D -:1057900009B1807880B1A07F00F0030002285ED0BC -:1057A000FFDFA07F00F003000228A7D1FDF7B3FEC2 -:1057B0000028A3D0FFDFA1E703F0FAFDE07FC107D7 -:1057C00028D0800705D594F8200000F01F0010288D -:1057D0001ED0052084F82300207829281CD02428F6 -:1057E000DFD1314605200EF0EFFC22212046FDF7E7 -:1057F000B9FCA07F00F0030001282ED00021304624 -:105800000BF03EF90028CCD0FFDFCAE728020020C9 -:105810000620DFE70420DDE7A07F00F00300012879 -:1058200006D0002130460BF019F9050003D101E044 -:105830000121F7E7FFDF25212046FDF793FC0F202C -:105840008DF8580016A905F59A700CF0A8FC0228EE -:10585000A7D00028A5D0FFDFA3E70121CFE703F001 -:10586000A7FD9EE72DE9F0438BB099461546884683 -:105870000646FDF73FFC04004FD0207822284CD389 -:1058800023284AD0E07FC00647D4A07F00F0030061 -:10589000012806D0002130460BF0E0F8070002D0C6 -:1058A0000CE00121F7E7A07F00F00300012805D1FB -:1058B0000121002230460BF0C8F8074601AB02AACE -:1058C00003A93846FFF706FC039800B9FFDF4FB184 -:1058D000039807F59A7787612078222806D0242834 -:1058E00004D007E003990020886103E025212046C9 -:1058F000FDF738FC03980B21417046628580C0E9B2 -:105900000289029901610199416104A90CF062FCCC -:10591000022802D0002800D0FFDF0BB0BDE8F083E2 -:1059200070B586B00546FDF7E5FB017822291CD944 -:10593000807F00F00300012806D0002128460BF0EC -:105940008DF8040030D101E00121F7E7FFDF2BE003 -:10595000B4F8620004F1660630440178427831B14F -:1059600021462846FFF7E9FBB8B906B070BDADF88F -:1059700004200921284602AB04F059FB03900028BB -:10598000F3D011208DF80000694604F59A700CF0F0 -:1059900006FC022801D000B1FFDF022310223146AD -:1059A00004F162000AF0FDFEB4F864000028CFD1D3 -:1059B000DBE710B586B00446FDF79CFB0178222991 -:1059C00019D9807F00F00300012806D0002120466D -:1059D0000BF044F8040003D101E00121F7E7FFDFF9 -:1059E00012208DF80000694604F59A700CF0D7FB80 -:1059F000002800D0FFDF06B010BD2DE9F05F05469E -:105A00000C4600270078904601093E46BA4604F14C -:105A1000080B02297ED0072902D00A2909D142E0C9 -:105A200068680178092905D00C292CD00D292AD0C5 -:105A3000FFDFB2E114271C26002C6CD04088A08028 -:105A4000FDF758FB5FEA000900D1FFDF99F8170066 -:105A50005A46400809F11801FDF7D7FC68688089AB -:105A6000208269684868C4F812008868C4F8160083 -:105A7000A07E20F0060040F00100A07699F81E00FC -:105A800040F040014DE01A270A26002CD5D080882E -:105A9000A080FDF72FFB050000D1FFDF5946284607 -:105AA000FFF7E9FA79E10CB1A88BA080287A0D28DC -:105AB0007ED006DC01287CD0022808D0032804D13F -:105AC00035E00F2876D0102875D0FFDF65E11E275E -:105AD0000926002CB1D0A088FDF70CFB5FEA000975 -:105AE00000D1FFDF287B00F003000128207A1BD0C3 -:105AF00020F001002072297B890861F341002072A7 -:105B0000297BC90861F382002072297B090961F3AE -:105B1000C30001E036E1E9E0207299F81E0040F090 -:105B2000800189F81E1038E140F00100E2E71327F8 -:105B30000D26002CAAD0A088FDF7DCFA8146807FD4 -:105B400000F00300012806D00021A0880AF086FF9B -:105B5000050003D101E00121F7E7FFDF99F81E00FE -:105B600000F00302012A59D0E86F817801F00301A7 -:105B70000129217A54D021F00101217283789B08F8 -:105B800063F3410121728378DB0863F382012172A0 -:105B900083781B0963F3C3012172037863F3061151 -:105BA0002172437863F3C711217284F809A003E0DE -:105BB0005EE0A4E08BE09CE0C178A172012A32D0C3 -:105BC0004279E17A62F30001E1724279520862F3AC -:105BD0004101E1724279920862F38201E1724279F5 -:105BE000D20862F3C301E1720279217B62F3000102 -:105BF00021730279520862F34101217302799208FC -:105C000062F3820121730079C00860F3C30121733C -:105C100099F80000232859D9262168E0A86FA4E745 -:105C200041F00101A9E70279E17A62F30001E17232 -:105C30000279520862F34101E1720279920862F33B -:105C40008201E1720279D20862F3C301E172427902 -:105C5000217B62F3000121734279520862F3410112 -:105C600021734279920862F3820121734079CBE774 -:105C700018271026D4B3A088FDF73CFA8346807F0E -:105C800000F00300012807D00021A0880AF0E6FEFA -:105C90005FEA000903D101E00121F6E7FFDFE868D0 -:105CA000A06099F8000040F0040189F8001099F80C -:105CB0000100800708D5012020739BF800002328ED -:105CC0006BD9272158464FE084F80CA065E01527D2 -:105CD0000F265CB1A088FDF70DFA814606225946D1 -:105CE000E86808F01FFA0120A0739BE03FE04846F7 -:105CF0003AE016270926D4B3287B20724DE0287B92 -:105D000019270E269CB3C4F808A0A4F80CA00128FB -:105D100007D0022805D0032805D0042803D0FFDFD0 -:105D20000DE0207207E0697B042801F00F0141F0CB -:105D3000800121721CD0607A20F003006072A0887C -:105D4000FDF7D8F905460078212826D0232800D071 -:105D5000FFDFA87F00F00300012811D00021A088F8 -:105D60000AF08EFE22212846FDF7FCF915E004E03A -:105D7000607A20F00300401CE0E7A8F8006011E022 -:105D80000121ECE70CB16888A080287A03282BD089 -:105D900004280AD005284BD0FFDFA8F800600CB11A -:105DA000278066800020BDE8F09F15270F26002C75 -:105DB000E3D0A088FDF79EF9807F00F00300012862 -:105DC00006D00021A0880AF049FE050003D101E0B9 -:105DD0000121F7E7FFDFD5F821000622594608F038 -:105DE000A1F984F80EA0D8E717270926002CC4D003 -:105DF000A088FDF77FF98146807F00F0030001282D -:105E000006D00021A0880AF029FE050003D101E098 -:105E10000121F7E7FFDF6878800701D5022000E065 -:105E20000120207299F800002328B6D927215EE7C7 -:105E300019270E26002CA0D0A088FDF75BF95FEA99 -:105E4000000900D1FFDFC4F808A0A4F80CA084F872 -:105E500008A0A07A40F00300A07299F81F1061F327 -:105E60008200A07299F81F10C1F34002114205D0C0 -:105E700099F8201001F01F0110292CD020F0080003 -:105E8000A07299F81F004108607A61F3C300607244 -:105E9000697A01F003010129A5D140F00400607284 -:105EA00099F81E00E97A00F00300012816D0607B03 -:105EB00061F300006073AA7A217B62F30001217311 -:105EC000EA7A520862F341006073A87A400860F3EE -:105ED0004101217361E740F00800D1E7207B61F3C5 -:105EE00000002073AA7A617B62F300016173EA7A91 -:105EF000520862F341002073A87A400860F3410120 -:105F000061734AE710B5FE4C30B10146102204F12E -:105F100020001BF0F1FD012084F8300010BD10B509 -:105F20000446FFF724F8F64920461022BDE8104049 -:105F300020311BF0E1BD70B5F14D06004FF00004BB -:105F400012D00EF08DF908B110240BE00621304676 -:105F500008F0CFF8411C04D02866012085F85C00C9 -:105F600000E00724204670BD0020F7E7007810F01D -:105F70000F0204D0012A05D0022A0CD110E000093A -:105F800009D10AE00009012807D0022805D003281A -:105F900003D0042801D00720704708700020704704 -:105FA0000620704705282AD2DFE800F003070F1704 -:105FB0001F00087820F0FF001EE0087820F00F0096 -:105FC000401C20F0F000103016E0087820F00F00A0 -:105FD000401C20F0F00020300EE0087820F00F0088 -:105FE000401C20F0F000303006E0087820F00F0070 -:105FF000401C20F0F000403008700020704707205F -:1060000070472DE9F041804688B00D4600270846CC -:106010000EF073F9A8B94046FDF76CF8040003D000 -:106020002078222815D104E043F2020008B0BDE830 -:10603000F08145B9A07F010603D500F003000228D6 -:1060400001D01020F2E7A07FC10601D4010702D5DC -:106050000DB10820EAE7E17FC90601D50D20E5E78B -:1060600000F00300022805D125B12846FEF7F2FE14 -:106070000700DBD1A07F00F00300012806D000213B -:1060800040460AF0EBFC060002D00DE00121F7E7E4 -:10609000A07F00F0030001280CD000210022404620 -:1060A0000AF0D3FC060007D0A07F00F0030002280E -:1060B00004D009E00121F1E70420B7E725B12A4621 -:1060C00031462046FEF7EAFE07AB1A4669463046DF -:1060D000FFF700F8009800B9FFDF00990C20487026 -:1060E00006F59A70C1F82480486100200881A07FDD -:1060F00000F00300012828D0EDB302200871301D04 -:1061000088613078400908777078C0F3400048779C -:10611000287800F00102887F62F301008877E27F2F -:1061200062F382008877E27F520862F3C3008877C7 -:10613000727862F304108877A878C87701F1210299 -:1061400028462031FEF7CAFE22E001200871287897 -:1061500000F00102087E62F3010008762A785208F6 -:1061600062F3820008762A78920862F3C300087608 -:106170002A78D20800E007E062F3041008762421B0 -:106180002046FCF7EFFF0BE003200871052008769E -:1061900025212046FCF7E6FFA07F20F08000A077B5 -:1061A00001A900980CF016F8022801D000B1FFDF19 -:1061B00038463BE72DE9FF4F524A0D4699B09A46C3 -:1061C00007CA14AB002783E807001998FCF792FF71 -:1061D000060006D03078262806D008201DB0BDE87D -:1061E000F08F43F20200F9E7B07F00F00309B9F144 -:1061F000010F03D0B9F1020F07D008E03DB91B9899 -:10620000FEF728FE0028E9D101E01B9880BBB07F93 -:1062100000F00300012806D0002119980AF01EFCA6 -:10622000040003D101E00121F7E7FFDF852D28D02D -:1062300007DCF5B1812D1ED0822D1ED0832D08D113 -:106240001DE0862D1FD0882D1FD0892D1FD08A2DAF -:106250001FD00F2020710F281DD003F0A6F8E0B149 -:1062600001208DF83400201D0E902079B8B160E136 -:1062700011E00020EEE70120ECE70220EAE703202E -:10628000E8E70520E6E70620E4E70820E2E7092042 -:10629000E0E70A20DEE70720A0E711209EE7B9F13A -:1062A000010F17D0D4E91E50804602200190012032 -:1062B0000090A87898F80210C0F3C000C1F3C001A4 -:1062C00008405FEA000B63D050460DF0C9FF00287C -:1062D00072D133E0D4E91E850120019002200090A4 -:1062E000214630461B9AFEF7D9FD1B98007800F036 -:1062F0000101A87861F30100A870F17F04E00000BB -:10630000180200202420020061F38200A870F17FAF -:10631000490861F3C300A870617861F30410A870A4 -:106320002078400928706078C0F3400068701B989E -:106330008078E870002068712871BAE7DAF80C00FC -:106340000DF08EFFC0BBDAF81C000DF089FF98BB82 -:10635000DAF80C00A060DAF81C00E06098F80100A0 -:10636000617800F0010041EA4000607098F8021086 -:10637000C0B2C1F30011891E08406070002084F88B -:106380002000009906F1170002290BD001210AE034 -:1063900098F80110607801F00101FD2242EA410104 -:1063A0000840E2E7002104EB810188610199701C3B -:1063B000022902D0012101E028E0002104EB810143 -:1063C0008861A87800F00300012849D198F80200FC -:1063D00000F00300012843D1B9F1010F04D12A1DB7 -:1063E000691D1B98FEF77AFD287998F8041008407B -:1063F0008DF82C00697998F8052011408DF830103F -:1064000008432DD050460DF02BFF08B11020E5E6D3 -:106410000AF1100004F5DE7104F190020490B9F164 -:10642000020F3CD00090CDE9012100210BAB5A4670 -:106430002046FEF7B0FD0028E9D104F5E07104F133 -:10644000A802B9F1010F30D004980090CDE90121E4 -:1064500000210CAB5A462046FEF79DFD0028D6D100 -:106460006078800740D4A87898F80210C0F38000C4 -:10647000C1F38001084337D0297898F8000014AAA6 -:10648000B9F1010F17D032F810204B00DA4012F0AA -:10649000030718D0012F1ED0022F12D11DE0CDF816 -:1064A00000A0CDE901210121C0E7CDF800A0CDE990 -:1064B00001210121CDE732F811204300DA4002F03A -:1064C0000307032F07D0BBF1000F0DD0012906D021 -:1064D000042904D008E00227F5E70127F3E70128A3 -:1064E00001D0042800D10427F07F40F001006BF3B5 -:1064F0004100F077607881074FF003000CD5A07160 -:10650000BBF1000F15D100BF8DF85C0017AA314612 -:10651000199800F0C5FA0CE00221022F18D0012FC3 -:1065200018D0042F22D00020A071F07F20F00100AD -:10653000F07725213046FCF715FE0DA904F59A7079 -:106540000BF02DFE10B1022800D0FFDF002045E641 -:10655000A171D9E7A1710D2104F124001BF065FBA5 -:10656000207840F0020020700420CDE70120A071C7 -:10657000DFE72DE9F04387B09046894604460025C1 -:10658000FCF7B8FD060006D03078272806D0082092 -:1065900007B0BDE8F08343F20200F9E7B07F00F0F6 -:1065A0000300012806D0002120460AF057FA040013 -:1065B00003D101E00121F7E7FFDFA7795FEA0900D6 -:1065C00005D0012821D0B9F1020F26D110E0B8F191 -:1065D000000F22D1012F05D0022F05D0032F05D0A7 -:1065E000FFDF2DE00C252BE0012529E0022527E027 -:1065F00040460DF035FEB0B9032F0ED110224146B2 -:1066000004F121001BF078FA1AE0012F02D0022FCA -:1066100003D104E0B8F1000F12D00720B8E74046DC -:106620000DF01EFE08B11020B2E7102104F1210088 -:106630001BF0D9FA0621404607F05BFDC4F82100A3 -:106640002078252140F0020020703046FCF78AFDBA -:106650002078C10714D020F00100207002208DF8AE -:10666000000004F1210002908DF80450694604F501 -:106670009A700BF094FD022804D018B1FFDF01E0FE -:1066800084F82050002083E730B587B00D460446DB -:10669000FCF730FD88B1807F00F0030001280FD0A7 -:1066A000002120460AF0DAF904000ED028460DF049 -:1066B000D7FD38B1102007B030BD43F20200FAE731 -:1066C0000121EEE72078400701D40820F3E72946AE -:1066D00004F14100202205461BF00EFA207840F01C -:1066E0001000207001070FD520F008002070132043 -:1066F0008DF80000694604F59A7001950BF04FFD86 -:10670000022801D000B1FFDF0020D4E770B50D46AC -:106710000646FCF7EFFC18B1017827291FD102E0EB -:1067200043F2020070BD807F00F00300012806D014 -:10673000002130460AF092F9040003D101E0012162 -:10674000F7E7FFDFA079022809D16078C00706D0FB -:106750002A4621463046FEF7F0FC10B10FE0082033 -:1067600070BDB4F864000E280BD204F16601022358 -:106770001022081F09F0DFFF012101704570002081 -:1067800070BD112070BD70B5064686B014460D462A -:1067900008460DF065FD18B920460DF087FD10B1D3 -:1067A000102006B070BDA6F57F40FF380ED03046F1 -:1067B000FCF7A0FC38B1417822464B08811C1846F2 -:1067C000FCF723FE07E043F20200EAE72046FDF76C -:1067D00099FC0028E5D11021E01D0DF012FAE21D10 -:1067E00029466846FEF791FC102204F11700019932 -:1067F0001BF082F90020D4E72DE9F041044686B071 -:1068000015468846002708460DF077FD18B928463A -:106810000DF073FD10B1102006B008E42046FCF71F -:1068200069FC060003D03078272818D102E043F233 -:106830000200F1E7B07F00F00300012806D000213C -:1068400020460AF00BF9040003D101E00121F7E72B -:10685000FFDF2078400702D56078800701D4082048 -:10686000DAE7B07F00F00300012818D0D4E91E0158 -:10687000407800B1B5B1487810B1B8F1000F11D02F -:10688000C5B1EA1D6846E168FEF73FFC102205F13C -:10689000170001991BF004F930B104270AE0D4E98C -:1068A0001E10E5E70720B7E71022E91D04F13100CB -:1068B0001BF022F9B8F1000F06D0102208F10701F1 -:1068C00004F121001BF018F92078252140F0020086 -:1068D00020703046FCF746FC2078C10716D020F027 -:1068E0000100207002208DF8000004F121000290C8 -:1068F000103003908DF80470694604F59A700BF01F -:106900004EFC022804D018B1FFDF01E084F82070AB -:10691000002081E7F8B515460E460746FCF7EAFB6E -:10692000040004D02078222804D00820F8BD43F2C7 -:106930000200F8BDA07F00F00300022802D043F25D -:106940000400F8BD30460DF08BFC18B928460DF058 -:1069500087FC08B11020F8BD00953288B31C214691 -:106960003846FEF70EFC112814D00028F3D1297CFC -:106970004A08E17F62F30001E1772A7C62F341017A -:10698000E177297C890884F82010A17F21F080011B -:10699000A177F8BDA17F0907FBD4D6F80200C4F89F -:1069A0003600D6F80600C4F83A003088A0861022D7 -:1069B000294604F124001BF09FF8287C4108E07F61 -:1069C00061F38200E077297C61F3C300E077287CE3 -:1069D000800884F82100A07F40F00800A077002004 -:1069E000D3E770B596B00D46064613B1072016B032 -:1069F00070BDFCF77FFB040007D02078222802D36B -:106A0000A07F400604D40820F1E743F20200EEE73D -:106A1000C5B12D208DF80000ADF802601022294686 -:106A200001A81BF069F8287C4108E07F61F30000B1 -:106A3000E077297C61F34100E077287C800884F8C6 -:106A4000200004E02E208DF80000ADF802600BA9B4 -:106A5000684607F0FFFAA17F21F04001A177C6E761 -:106A600070B50D46FCF746FB040005D028460DF036 -:106A70001DFC20B1102070BD43F2020070BD2946FC -:106A80002046FEF7F8FA002070BD04E010F8012B54 -:106A90000AB100207047491E89B2F7D20120704721 -:106AA00070B51546064602F080FC040000D1FFDFF9 -:106AB000207820F00F00801C20F0F00020302070A3 -:106AC00066802868A060BDE8704002F071BC0000DC -:106AD00018B18178012938D101E010207047018870 -:106AE00042F60112881A914231D018DC42F60102B6 -:106AF000A1EB020091422AD00CDC41B3B1F5C05F9A -:106B000025D06FF4C050081821D0A0F57060FF3870 -:106B10001BD11CE001281AD002280AD117E0B0F5D9 -:106B2000807F14D008DC012811D002280FD0032860 -:106B30000DD0FF2809D10AE0B0F5817F07D0A0F57C -:106B40008070033803D0012801D0002070470F2047 -:106B500070470B2826D008DC1BD2DFE800F01C2091 -:106B600025251A25292325271E0011281CD008DCDD -:106B70000C2817D00D281DD00F2815D0102808D1AB -:106B800010E0822809D0842810D0852810D08728CA -:106B900012D003207047002070470520704743F251 -:106BA00003007047072070470F207047042070478C -:106BB000062070470C20704743F20200704738B53A -:106BC0000C46050041D06946FFF7D0F9002819D1DD -:106BD0009DF80010607861F3020060706946681CDF -:106BE000FFF7C4F900280DD19DF80010607861F31B -:106BF000C5006070A978C1F34101012903D00229C1 -:106C000005D0072038BD217821F0200102E021784D -:106C100041F020012170410704D0A978C90861F32F -:106C200086106070607810F0380F07D0A9780909D5 -:106C300061F3C710607010F0380F02D16078400621 -:106C400003D5207840F040002070002038BD70B59A -:106C500004460020088015466068FFF7B0FF002852 -:106C600016D12089A189884211D860688078C00730 -:106C70000AD0B1F5007F0AD840F20120B1FBF0F252 -:106C800000FB1210288007E0B1F5FF7F01D90C202E -:106C900070BD01F201212980002070BD10B504787B -:106CA000137864F3000313700478640864F34103F9 -:106CB00013700478A40864F3820313700478E40862 -:106CC00064F3C30313700478240964F3041313708A -:106CD0000478640964F3451313700078800960F345 -:106CE0008613137031B10878C10701D1800701D52F -:106CF000012000E0002060F3C713137010BD42783C -:106D0000530702D002F0070306E012F0380F02D05A -:106D1000C2F3C20300E001234A7863F302024A701F -:106D2000407810F0380F02D0C0F3C20005E04307EE -:106D300002D000F0070000E0012060F3C5024A70B5 -:106D400070472DE9F04F95B00D00804615D0B8F191 -:106D5000000F16D0122128461AF045FF4FF6FF7B90 -:106D600005AA0121584606F0C0FF002426463746F2 -:106D70004FF420596FF4205A75E0102015B0BDE88B -:106D8000F08F0720FAE700BF9DF81E0001280AD106 -:106D9000BDF81C0048450BD010EB0A000AD00128B2 -:106DA0000CD002280CD0042C0ED0052C0FD10DE0F5 -:106DB000012400E00224BDF81A6008E0032406E084 -:106DC0000424BDF81A7002E0052400E00624BDF892 -:106DD0001A10414547D12C74BEB34FF0000810AAD9 -:106DE0004FF0070ACDE90282CDE900A80DF13C0978 -:106DF0001023CDF8109042463146584607F028F847 -:106E000008BBBDF83C002A46C0B210A90BF084FABA -:106E1000C8B9AE81CFB1CDE900A80DF1080C0AAE1A -:106E200040468CE84102132300223946584607F0B9 -:106E30000FF840B9BDF83C00F11CC01EC0B22A1DBD -:106E40000BF06AFA10B1032098E70AE0BDF82900B8 -:106E5000E881062C05D19DF81E00A872BDF81C0023 -:106E6000288100208AE705A806F04BFF00288BD078 -:106E7000FFF76FFE82E72DE9F0471C46DDE9097850 -:106E8000DDF8209015460E00824600D1FFDF0CB1E0 -:106E9000208818B1D5B11120BDE8F087022D01D0AE -:106EA000012100E0002106F1140005F003FEA8F81E -:106EB000000002463B462946504603F0B8F8C9F8A0 -:106EC000000008B9A41C3C600020E5E71320E3E7BC -:106ED000F0B41446DDE904528DB1002314B1022C44 -:106EE00009D101E0012306E00D7CEE0703D025F077 -:106EF000010501230D742146F0BC03F02EBF1A805A -:106F0000F0BC70472DE9FE4F91461A881C468A4610 -:106F10008046FAB102AB494603F089F8050019D062 -:106F20004046A61C278809F0B5FE324607262946AA -:106F30003B46009609F074FA20882346CDE90050BC -:106F40004A4651464046FFF7C3FF002020800120FB -:106F5000BDE8FE8F0020FBE72DE9F04786B09146A3 -:106F6000DDE90E460F46824603AA05A904A8109D36 -:106F70008DE807009846324621465046FFF77BFFD2 -:106F8000049909B1012200E000222A70002817D1DB -:106F9000F84A03AB1060059A009104F11400CDE9A2 -:106FA00001204A463946504606F048F990B1082873 -:106FB0000ED2DFE800F00407040D0D090B0B0020D2 -:106FC00006B069E71120FBE70720F9E70820F7E79B -:106FD0000320F5E7BDF80C100498CDE90001434605 -:106FE000324621465046FFF773FFE8E72DE9F043AC -:106FF00089B00D46DDE9108781461C4616461421EE -:1070000003A81AF012FE012002218DF810108DF84D -:107010000C008DF81170ADF8146064B1A278D2073D -:1070200009D08DF81600E088ADF81A00A088ADF8F8 -:107030001800A068079008A80095CDE90110424605 -:1070400003A948466B68FFF787FF09B0BDE8F083E6 -:10705000F0B58BB0002406460694079407270894E1 -:1070600005A80994019400970294CDE903400D46C8 -:1070700010232246304606F0EBFE78B90AA806A98E -:10708000019400970294CDE90310BDF8143000225A -:107090002946304606F0B2FC002801D0FFF759FD22 -:1070A0000BB0F0BD06F052BB2DE9FC410C4680460A -:1070B000002602F07AF9054620780D287ED2DFE816 -:1070C00000F0BC0713B325BD49496383AF959B000E -:1070D000A848006820B1417841F010014170ADE04E -:1070E000404602F092F9A9E00421404609F0B6FCBE -:1070F000070000D1FFDF07F11401404605F06EFCE8 -:10710000A5BB13214046FDF787FB97E004214046CD -:1071100009F0A4FC070000D1FFDFE088ADF8000013 -:107120000020B8819DF80000010704D5C00602D5F3 -:10713000A088B88105E09DF8010040067ED5A088B2 -:10714000F88105B9FFDF22462946404601F068FC78 -:10715000022673E0E188ADF800109DF801100906E1 -:107160000FD5072803D006280AD00AE024E004211E -:10717000404609F073FC060000D1FFDFA088F081D3 -:107180000226CDB9FFDF17E00421404609F066FC76 -:10719000070000D1FFDF07F1140006F00EFB90F0AE -:1071A000010F02D1E079000648D5387C022640F074 -:1071B0000200387405B9FFDF224600E03DE02946B1 -:1071C000404601F02DFC39E00421404609F046FC20 -:1071D000017C002D01F00206C1F340016171017CC8 -:1071E00021F002010174E7D1FFDFE5E7022601216A -:1071F000404602F045F921E00421404609F02EFC0A -:107200000546606800902089ADF8040001226946B7 -:10721000404602F056F9287C20F0020028740DE068 -:10722000002DC9D1FFDFC7E7022600214046FBF74A -:10723000CDF8002DC0D1FFDFBEE7FFDF3046BDE84F -:10724000FC813EB50C0009D001466B4601AA002026 -:1072500006F080FE20B1FFF77CFC3EBD10203EBD55 -:1072600000202080A0709DF8050002A900F0070012 -:10727000FEF798FE50B99DF8080020709DF80500B3 -:1072800002A9C0F3C200FEF78DFE08B103203EBD87 -:107290009DF8080060709DF80500C109A07861F3B1 -:1072A0000410A0709DF80510890961F3C300A07057 -:1072B0009DF80410890601D5022100E0012161F347 -:1072C00042009DF8001061F30000A07000203EBD58 -:1072D00070B5144606460D4651EA040005D075B156 -:1072E00008460DF001F878B901E0072070BD294685 -:1072F000304606F090FE10B1BDE8704029E454B16C -:1073000020460CF0F1FF08B1102070BD2146304638 -:10731000BDE8704095E7002070BD2DE9FC5F0C468C -:1073200090460546002701780822007A3E46B2EBD7 -:10733000111F7DD104F10A0100910A31821E4FF024 -:10734000020A04F1080B0191092A72D2DFE802F067 -:10735000EDE005F528287BAACE006888042109F015 -:107360007DFB060000D1FFDFB08928B15227072638 -:10737000C3E000001403002051271026002C7DD00C -:107380006888A0800120A071A88900220099FFF7D9 -:107390009FFF002873D1A8892081288AE081D1E04D -:1073A000B5F81290072824D1E87B000621D5512793 -:1073B00009F1140086B2002CE1D0A88900220099BE -:1073C000FFF786FF00285AD16888A08084F806A0BD -:1073D000A88920810120A073288A2082A4F8129015 -:1073E000A88A009068884B46A969019A01F0F5FACD -:1073F000A8E0502709F1120086B2002C3ED0A889DF -:1074000000225946FFF764FF002838D16888A08021 -:10741000A889E080287A072813D002202073288AC0 -:10742000E081E87BC0096073A4F81090A88A01E0AD -:1074300085E082E0009068884B4604F11202A96959 -:10744000D4E70120EAE7B5F81290512709F11400BA -:1074500086B2002C66D06888042109F0FFFA8346C2 -:107460006888A080A88900220099FFF731FF0028D2 -:107470006ED184F806A0A889208101E052E067E07F -:107480000420A073288A2082A4F81290A88A009071 -:1074900068884B46A969019A01F09FFAA989ABF85F -:1074A0000E104FE06888FBF725FE07466888042128 -:1074B00009F0D4FA064607B9FFDF06B9FFDF687B9B -:1074C000C00702D05127142601E0502712264CB3E2 -:1074D0006888A080502F06D084F806A0287B5946E3 -:1074E00001F08BFA2EE0287BA11DF9E7FE49A8895F -:1074F0004989814205D1542706269CB16888A0801D -:1075000020E053270BE06888A080A889E08019E07C -:107510006888042109F0A2FA00B9FFDF5527082680 -:10752000002CF0D1A8F8006011E056270726002CA7 -:10753000F8D06888A080002013E0FFDF02E0012877 -:1075400008D0FFDFA8F800600CB12780668000201B -:10755000BDE8FC9F57270726002CE3D06888A08051 -:10756000687AA071EEE7401D20F0030009B14143A5 -:10757000091D01EB4000704713B5DB4A0020107174 -:10758000009848B10024684609F06BF8002C02D13D -:10759000D64A009911601CBD01240020F4E770B5A3 -:1075A0000D46064686B014465C2128461AF03DFB7F -:1075B00004B9FFDFA0786874A2782188284601F01A -:1075C00046FA0020A881E881228805F1140130469E -:1075D00005F0E9F96A460121304606F086FB19E01C -:1075E0009DF80300000715D5BDF806103046FFF7DB -:1075F0002FFD9DF80300BDF8061040F010008DF837 -:107600000300BDF80300ADF81400FF233046059ACF -:1076100006F0CCFC684606F074FB0028E0D006B00B -:1076200070BD10B50C4601F1140005F0F3F90146E8 -:10763000627C2046BDE8104001F03EBA70B50546B8 -:10764000042109F00BFA040000D1FFDF04F114015A -:107650000C46284605F0C2F921462846BDE8704090 -:1076600005F0C3B970B58AB00C460646FBF742FD7B -:10767000050014D02878222827D30CB1A08890B117 -:1076800001208DF80C0003208DF8100000208DF8EB -:10769000110054B1A088ADF81800206807E043F24B -:1076A00002000AB070BD0920FBE7ADF81800059094 -:1076B0000421304609F0D2F9040000D1FFDF04F1C3 -:1076C000140005F0BEF9C00601D40820E9E701F076 -:1076D0006CFE60B108A802210094CDE9011095F874 -:1076E000232003A930466368FFF736FCD9E7112051 -:1076F000D7E72DE9F04FB2F802A0834689B01546CE -:1077000089465046FBF7F6FC07460421504609F02F -:10771000A5F90026044605964FF002080696ADF836 -:107720001C6007B9FFDF04B9FFDF4146504603F094 -:107730007CFE60B907AA06A905A88DE807004246A5 -:10774000214650466368FFF796FB00B1FFDF6648AD -:1077500007AB0660DDE9051204F11400CDF80090D6 -:10776000CDE90320CDE9013197F823205946504651 -:107770006B6805F0AFF906000AD0022E04D0032E84 -:1077800014D0042E00D0FFDF09B03046BDE8F08FE2 -:10779000BDF81C000028F7D00599CDE9001042463D -:1077A000214650466368FFF793FBEDE7687840F0A9 -:1077B00008006870E8E72DE9F04F9BB004464FF0F1 -:1077C00000084948ADF85480ADF83080ADF85080DD -:1077D000A0F80880ADF81480ADF81880ADF82080CE -:1077E000ADF81C80007916460D464746012808D0A2 -:1077F000022806D0032804D0042802D008201BB099 -:10780000C4E720460CF02CFDD0BB28460CF028FD28 -:10781000B0BB60680CF071FD90BB606848B16089D6 -:107820002189884202D8B1F5007F01D90C20E6E712 -:1078300080460BAA06A92846FFF709FA0028DED1E0 -:1078400068688078C0F34100022808D19DF81900CB -:1078500010F0380F03D028690CF046FD80B905A957 -:107860002069FFF7ACF90028C9D1206950B16078D0 -:1078700080079DF8150000F0380002D5C0B301E084 -:1078800011E0A8BB9DF8140080060ED59DF81500E8 -:1078900010F0380F03D060680CF026FD18B960684E -:1078A0000CF02BFD08B11020A9E707A96069FFF7CC -:1078B00086F90028A3D1606940B19DF81D0000F051 -:1078C000070101293FD110F0380F3CD008A9A06969 -:1078D000FFF775F9002892D19DF81C00800632D47C -:1078E0009DF82000800604E014030020140000200E -:1078F00029E028D4A06940B19DF8210000F00701DB -:10790000012920D110F0380F1DD0E06818B100789F -:10791000C8B11C2817D20EAA611C2046FFF7BEF979 -:107920000120B94660F30F27BA4607468DF84E008E -:1079300042F60300ADF84C000DF13B0217A9286890 -:107940000AF009FD08B1072059E79DF85C0016A967 -:10795000CDF80090C01CCDE9019100F0FF0B002391 -:107960000BF20122514613A806F002F9F0BBBDF854 -:1079700058000990FE482A8929690092CDE9011032 -:107980006B89BDF82C202868069906F0F1F80100F3 -:107990007ED120784FF0020AC10601D480062BD593 -:1079A000ADF80C90606950B907A906A8FFF7A7F9D0 -:1079B0009DF81D0020F00700401C8DF81D009DF86B -:1079C0001C008DF84E7040F0C8008DF81C0042F687 -:1079D0000210ADF84C000CA903AACDF800A0CDE927 -:1079E0000121002340F2032213A800E01EE00799C2 -:1079F00006F0BEF801004BD1DD484D4608385B4625 -:107A00000089ADF839000EA8CDE90290CDF80490B8 -:107A1000CDF810904FF007090022CDF80090BDF886 -:107A200058104FF6FF7005F0E9FF10B1FFF791F81D -:107A3000E5E69DF83800000625D52946012060F3CB -:107A40000F218DF84E704FF42450ADF84C00ADF876 -:107A5000105062789DF81000002362F300008DF84A -:107A600010006278CDF800A0520862F341008DF852 -:107A7000100004AACDE9012540F2032213A806F064 -:107A800077F8010004D1606888B32069A8B900E0E4 -:107A900086E005A906A8FFF732F96078800706D4CA -:107AA0009DF8150020F038008DF8150005E09DF8D0 -:107AB000140040F040008DF814008DF84E7042F62E -:107AC0000110ADF84C00208940F20121B0FBF1F229 -:107AD00001FB1202606814ABCDF80080CDE9010310 -:107AE000002313A8059906F043F8010058D1207827 -:107AF000C00729D0ADF80C50A06950B908A906A854 -:107B0000FFF7FDF89DF8210020F00700401C8DF8DC -:107B100021009DF820008DF84E7040F040008DF857 -:107B2000200042F60310ADF84C0015A903AACDF8C9 -:107B300000A0CDE90121002340F2032213A80899F7 -:107B400006F016F801002BD1E06868B32946012041 -:107B500060F30F218DF84E7042F60410ADF84C0022 -:107B6000E068002302788DF8602040788DF861008D -:107B7000E06818AA4088ADF86200E06800798DF8E6 -:107B80006400E068C088ADF86500CDF80090CDE9EC -:107B900001254FF4027213A805F0EAFF010003D09B -:107BA000099800F0B5FF2AE67148032108380171F1 -:107BB00056B100893080BDF850007080BDF83000AB -:107BC000B080BDF85400F080002018E670B50125A3 -:107BD0008AB016460B46012802D0022816D104E0CE -:107BE0008DF80E504FF4205003E08DF80E5042F601 -:107BF0000100ADF80C005BB10024601C60F30F24A1 -:107C000004AA08A918460AF0A6FB18B1072048E5FF -:107C1000102046E504A99DF820205548CDE9002113 -:107C2000801E02900023214603A802F2012205F0E3 -:107C30009FFF10B1FEF78DFF33E54D4808380EB1B8 -:107C4000C1883180057100202BE5F0B593B007465F -:107C500001268DF83E6041F60100ADF83C0012AA05 -:107C60000FA93046FFF7B2FF002848D1404C00254D -:107C7000083CE7B31C2102A819F0D7FF9DF80800C3 -:107C80008DF83E6040F020008DF8080042F6052097 -:107C9000ADF83C000E959DF83A00119520F00600D5 -:107CA000801C8DF83A009DF838006A4620F0FF00ED -:107CB0008DF838009DF8390009A920F0FF008DF8F3 -:107CC00039000420ADF82C00ADF830000EA80A9061 -:107CD00011A80D900FA80990ADF82E5002A8FFF73B -:107CE0006AFD00280BD1BDF80000608100E008E0CB -:107CF000BDF80400A081401CE0812571002013B074 -:107D0000F0BD6581A581BDF84800F4E72DE9F74F86 -:107D10001749A0B00024083917940A79A146012A0E -:107D200004D0022A02D0082023B02FE5CA8882425C -:107D300001D00620F8E721988A46824201D1072027 -:107D4000F2E701202146ADF848004FF6FF7860F3D6 -:107D50000F21ADF84A808DF86E0042F6020B0691B5 -:107D60008DF87240ADF86CB0ADF870401CA901E020 -:107D70001C0300201391ADF8508012A805F0E5FF18 -:107D800000252E462F460DAB072212A9404605F0CE -:107D9000DFFF78B182285DD195B38EB3ADF8645022 -:107DA000ADF866609DF85E008DF8144019AC0128AE -:107DB00064D06BE09DF83A001FB3012859D1BDF89B -:107DC000381059451FD118A809A901940294CDE98A -:107DD000031007200090BDF8361010230022404603 -:107DE00006F036F8B0BBBDF86000042801D00628C4 -:107DF0004AD1BDF82410219881423AD10F2093E74F -:107E00003AE0012835D1BDF83800B0F5205F03D045 -:107E100042F6010188422CD1BAF80600BDF83610AE -:107E2000884201D1012700E0002705B19EB12198C9 -:107E300081421ED118A809AA01940294CDE9032019 -:107E4000072000900D4610230022404606F000F85F -:107E500000B902E02DE04E460BE0BDF860000228BC -:107E600001D0102810D1C0B217AA09A90AF054FAFB -:107E700050B9BDF8369086E7052055E705A917A843 -:107E8000221D0AF068FA08B103204DE79DF814009E -:107E90000023001DC2B28DF8142022980092CDE973 -:107EA00001401BA8069905F063FE10B902228AF86A -:107EB0000420FEF74EFE37E710B50B46401E88B093 -:107EC00084B205AA00211846FEF7E8FE00200DF155 -:107ED000080C06AA05A901908CE80700072000906D -:107EE0000123002221464FF6FF7005F087FD04466E -:107EF000BDF81800012800D0FFDF2046FEF729FE5C -:107F000008B010BDF0B5F94F044687B038790E4679 -:107F1000032804D0042802D0082007B0F0BD04AA2A -:107F200003A92046FEF793FE0500F6D1606880782D -:107F3000C0F3410002280AD19DF80D0010F0380F5F -:107F400005D020690CF0D0F908B11020E5E72089B0 -:107F500005AA21698DE807006389BDF81020206813 -:107F6000039905F005FE10B1FEF7F3FDD5E716B154 -:107F7000BDF814003080042038712846CDE7F8B5EC -:107F80000C0006460BD001464FF6FF7500236A46EB -:107F9000284605F0DFFF20B1FEF7DBFDF8BD10201D -:107FA000F8BD69462046FEF70AFE0028F8D1A07801 -:107FB000314600F001032846009A05F0F7FFEBE791 -:107FC00030B587B0144600220DF1080C05AD0192C2 -:107FD0008CE82C00072200920A46014623884FF6BF -:107FE000FF7005F00BFDBDF814102180FEF7B1FD08 -:107FF00007B030BD70B50D46042108F02FFD040018 -:1080000000D1FFDF294604F11400BDE8704004F000 -:1080100011BD70B50D46042108F020FD040000D10B -:10802000FFDF294604F11400BDE8704004F025BDCF -:1080300070B50D46042108F011FD040000D1FFDFEA -:10804000294604F11400BDE8704004F03DBD70B550 -:108050000546042108F002FD040000D1FFDF21469F -:1080600028462368BDE870400122FEF74BBF70B57B -:108070000646042108F0F2FC040000D1FFDF04F101 -:10808000140004F0C7FC401D20F0030511E0011DA1 -:1080900000880022431821463046FEF733FF0028AF -:1080A0000BD0607CABB2684382B2A068011D08F0BF -:1080B00078FBA06841880029E9D170BD70B50546FC -:1080C000042108F0CBFC040000D1FFDF2146284644 -:1080D0006368BDE870400222FEF714BF70B50E461B -:1080E000054601F062F9040000D1FFDF0120207293 -:1080F00066726580207820F00F00001D20F0F000EF -:1081000040302070BDE8704001F052B910B504460F -:10811000012900D0FFDF2046BDE810400121FAF719 -:1081200055B92DE9F04F97B04FF0000A0C00834687 -:10813000ADF818A0D04619D0E06830B1A068A8B159 -:108140000188ADF81810A0F800A05846FAF7D2FF41 -:10815000070043F2020967D03878222862D304214D -:10816000584608F07BFC050005D103E0102017B04D -:10817000BDE8F08FFFDF05F1140004F04BFC401D5B -:1081800020F00306A078012803D0022801D00720A0 -:10819000EDE7208878B1401C81B209AA584605F065 -:1081A000A4FD09A805F0ADFD9DF82E204FF4505117 -:1081B000012A0DD102E043F20300D8E7BDF82C20DC -:1081C000A2F52453023B03D1822801D0A0B901E0DB -:1081D0000846CCE7E068B0B1CDE902A0072006AAC6 -:1081E000CDF804A000900492A2882188BDF8183030 -:1081F000584605F003FC10B1FEF7ABFCB7E7A168E9 -:10820000BDF8180008809DF82700C00602D543F28B -:108210000140ACE70D9838B1A1780078012905D06C -:1082200080071AD40820A2E74846A0E7C007F9D083 -:1082300002208DF83C00A8684FF00009A0B1697CCD -:108240004288714391420FD98AB2B3B2011D08F03E -:108250005EFA8046A0F800A006E003208DF83C00FE -:10826000D5F800804FF001099DF8280010F0380F74 -:1082700000D1FFDF9DF828001D49C0F3C20008446B -:1082800097F8231010F8010C884201D90F206EE7EF -:108290002088ADF8400014A90095CDE9019143462E -:1082A00007220FA95846FEF757FE002885D19DF8F2 -:1082B000500050B9A078012807D1687CB3B2704350 -:1082C00082B2A868011D08F036FA00204FE770B5A9 -:1082D000064615460C460846FEF7FAFB002809D16B -:1082E0002A4621463046BDE870406FE41403002062 -:1082F0002E20020070BD09E570B51E4614460D0023 -:1083000009D044B1616831B138B1F849C9888142B6 -:1083100003D0072070BD102070BD2068FEF7D8FB89 -:108320000028F9D1324621462846BDE87040FFF7C3 -:1083300042BA70B515460C0006D038B1EB49098930 -:10834000814203D0072070BD102070BD2068FEF769 -:10835000BFFB0028F9D129462046BDE87040D1E591 -:1083600070B5064686B00D46144610460BF09EFFCB -:10837000D0BB60680BF0C1FFB0BBA6F57F40FF38F3 -:1083800003D03046FAF7B6FE80B128466946FEF7BC -:10839000D8FC00280CD19DF810100F2008293CD2E1 -:1083A000DFE801F008060606060A0A0843F20200A2 -:1083B00006B070BD0320FBE79DF80210012908D12B -:1083C000BDF80010B1F5C05FF2D06FF4C052D142D9 -:1083D000EED09DF8061001290DD1BDF80410A1F5CD -:1083E0002851062907D200E028E0DFE801F0030366 -:1083F00004030303DCE79DF80A1001290ED1BDF840 -:108400000810B1F5245FD3D0A1F524510239CFD0A3 -:108410000129CDD0022901D1CAE7FFDF606878B910 -:10842000002305AA2946304605F094FD10B1FEF759 -:1084300090FBBDE79DF81400800601D41020B7E73B -:108440006188224628466368FFF7BAFDB0E72DE948 -:10845000F043814687B08846144610460BF026FF4D -:1084600018B1102007B0BDE8F083002306AA4146EA -:10847000484605F06FFD10B1FEF76BFBF2E79DF883 -:108480001800C00602D543F20140EBE7002507279C -:1084900005A8019500970295CDE9035062884FF633 -:1084A000FF734146484605F0D3FC060013D16068CF -:1084B0000BF0FCFE60B960680195CDE902500097B1 -:1084C0000495238862884146484605F0C1FC06466B -:1084D000BDF8140020803046CEE739B1834B0A88BE -:1084E0009B899A4202D843F20300704719E610B5FF -:1084F00086B07E4C0423ADF81430638943B1A4895F -:108500008C4201D2914205D943F2030006B010BD5E -:108510000620FBE7ADF81010002100910191ADF8A5 -:10852000003002218DF8021005A9029104A90391DF -:10853000ADF812206946FFF7F4FDE7E72DE9FC47A7 -:1085400081460E4608460BF08BFE88BB4846FAF77C -:10855000D1FD5FEA00080AD098F80000222829D34C -:108560000421484608F07AFA070005D103E043F2F7 -:108570000200BDE8FC87FFDF07F1140004F061FA98 -:1085800005463078012803D0022804D00720F0E700 -:10859000A8070FD502E015F0340F0BD0B079341DC9 -:1085A000C00709D0E08838B1A0680BF059FE18B1B7 -:1085B0001020DEE70820DCE732782088002628B388 -:1085C000A0F201130721112B18D20CD2DFE803F01F -:1085D0000B090D0B1D0B121D100B0B1D1D1D1D0B73 -:1085E0001D00022A11D10846C3E7012AFBD00CE086 -:1085F000EA0600E0AA06002AF5DA06E0A0F5C07255 -:108600001F2A02D97D3A022AEDD8C6B200F0CDFE6B -:1086100050B198F82300CDE90006FA89234639467F -:108620004846FEF7E3FCA4E71120A2E72DE9F04F4E -:108630008BB01F4615460C4683460026FAF75AFDB6 -:1086400028B10078222805D208200BB090E543F22B -:108650000200FAE7B80801D00720F6E7032F00D19F -:1086600000274FF6FF79CCB1022D72D320460BF0D4 -:1086700044FE30B904EB0508A8F101000BF03DFE03 -:1086800008B11020E1E7AD1EAAB22146484605F028 -:108690005AFD38F8021C88425BD1ADB21349B807C5 -:1086A00002D58889401C00E001201FFA80F8F807F5 -:1086B00001D08F8900E04F4605AA4146584605F093 -:1086C00014FB4FF0070A4FF00009D4B3204608E02E -:1086D000408810283DD8361D304486B2AE4238D28C -:1086E000A01902884245F3D353E000001403002090 -:1086F0009DF8170002074CD594B304EB0608361D0D -:10870000B8F80230B6B2102B23D89A19AA4220D852 -:10871000B8F8002091421CD1C0061CD5CDE900A9B3 -:108720000DF1080C0AAAA11948468CE80700B8F810 -:1087300000100022584605F061F920B1FEF709FA51 -:1087400083E726E005E0B8F80200BDF8281088426B -:1087500001D00B2079E7B8F80200304486B207E078 -:10876000FFE7C00604D55846FEF772FC002889D101 -:108770009DF81700BDF81A1020F010008DF81700B2 -:10878000BDF81700ADF80000FF235846009A05F029 -:108790000DFC05A805F0B5FA18B9BDF81A10B942D4 -:1087A000A6D90421584608F059F9040000D1FFDF8A -:1087B000A2895AB1CDE900A94D4600232146584669 -:1087C000FEF714FC0028BBD1A5813EE700203CE762 -:1087D0002DE9FF4F8BB01E4617000D464FF00004E9 -:1087E00012D0B00802D007200FB0C1E4032E00D190 -:1087F00000265DB108460BF077FD28B93888691E60 -:1088000008440BF071FD08B11020EDE7C64AB0072F -:1088100001D5D18900E00121F0074FF6FF7802D0A1 -:10882000D089401E00E0404686B206AA0B9805F0AB -:108830005CFA4FF000094FF0070B0DF1140A38E015 -:108840009DF81B00000734D5CDF80490CDF800B09A -:10885000CDF80890CDE9039A434600220B9805F025 -:10886000F7FA60BB05B3BDF814103A882144281903 -:10887000091D8A4230D3BDF81E2020F8022BBDF816 -:10888000142020F8022BCDE900B9CDE90290CDF8F3 -:1088900010A0BDF81E10BDF8143000220B9805F092 -:1088A000D7FA08B103209FE7BDF814002044001D4B -:1088B00084B206A805F025FA20B1822806D0FEF77A -:1088C00048F991E7BDF81E10B142B9D934B17DB174 -:1088D0003888A11C884203D20C2085E7052083E755 -:1088E00022462946404605F02EFC01462819018003 -:1088F000A41C3C80002077E710B504460BF0D6FCA2 -:1089000008B1102010BD8848C0892080002010BD0B -:10891000F0B58BB00D460646142103A819F085F971 -:1089200001208DF80C008DF8100000208DF811004A -:10893000ADF814503046FAF7DDFB48B10078222834 -:1089400012D30421304608F089F8040005D103E071 -:1089500043F202000BB0F0BDFFDF04F11400074644 -:1089600004F06FF8400601D40820F3E7207C0221D0 -:1089700040F00100207409A80094CDE901100722FD -:1089800003A930466368FEF7E7FA20B1217C21F0A5 -:1089900001012174DEE729463046F9F708FD08A9F0 -:1089A000384604F03DF800B1FFDFBDF82040172C39 -:1089B00001D2172000E02046A84201D92C4602E04F -:1089C000172C00D2172421463046FFF722FB214600 -:1089D0003046F9F708FA0020BCE7F8B51C46154602 -:1089E0000E46069F08F044F92346FF1DBCB23146EF -:1089F0002A46009407F0DBFCF8BD70B50C4605462E -:108A00000E21204619F0EFF8002020802DB1012D15 -:108A100001D0FFDF70BD062000E00520A07170BD11 -:108A200010B548800878134620F00F00001D20F094 -:108A3000F00080300C4608701422194604F108003A -:108A400019F09FF800F0B4FC3748046010BD2DE920 -:108A5000F047DFF8D890491D064621F0030117467C -:108A60000C46D9F8000007F01AFE050000D1FFDF20 -:108A70004FF000083560A5F800802146D9F80000C5 -:108A800007F00DFE050000D1FFDF7560A5F800803E -:108A90007FB104FB07F1091D0BD0D9F8000007F0E6 -:108AA000FEFD040000D1FFDFB460C4F80080BDE823 -:108AB000F087C6F80880FAE72DE9F0411746491D0E -:108AC00021F00302194D064601681446286807F094 -:108AD00011FE22467168286807F00CFE3FB104FBC6 -:108AE00007F2121D03D0B168286807F003FE0420C6 -:108AF00007F05EFF0446042007F062FF201A0128F9 -:108B000004D12868BDE8F04107F0BEBDBDE8F081A2 -:108B100010B50C4605F0B5F800B1FFDF2046BDE802 -:108B20001040FEF716B800001403002014000020C7 -:108B300010B50C460246817B808819B1518981426B -:108B400000D908462080D18800F0C5FF032800D353 -:108B50000320C1B22088BDE8104000F0B1BF10B5BD -:108B60000C460246817B808819B11189814200D967 -:108B700008462080D18800F0AEFF022800D30220F2 -:108B8000C1B2208800F09CFF401CC0B210BD2DE98E -:108B9000F04F0C00F84999B08146D1E90201CDE9C6 -:108BA0000C0109F10300F54E20F003010091357E20 -:108BB00005F1010504D1E8B209F054FB00B1FFDF73 -:108BC00000984FF0000B00EB0510C01C20F00301D3 -:108BD00000915CB9707A327A81F800B01044C2B268 -:108BE000B08B80B204F0D5FE00B1FFDF0098F169D0 -:108BF000084400902146684600F02CFF0098C01CF5 -:108C000020F003000090737A327AB17A04B1002028 -:108C100007F016FE0099084400902146684600F0CF -:108C20006EFF00273D46B24696F801800CE02846CC -:108C300000F0F3FE064681788088F9F76EF97178C6 -:108C40006D1C00FB0177EDB24545F0D10098C01CCA -:108C500020F00300009004B100203946F9F768F9CC -:108C600000990027084400903D469AF801800CE0E6 -:108C7000284600F0D2FE0646C1788088FEF773FCD5 -:108C800071786D1C00FB0177EDB24545F0D100987D -:108C9000C01C20F00300009004B100203946FEF70C -:108CA0006BFC00994FF000080844009045469AF884 -:108CB00001700EE0284600F0B0FE0646807B30B121 -:108CC00006F1080001F0F9FE727800FB02886D1CC5 -:108CD000EDB2BD42EED10098C01C20F00300009020 -:108CE00004B10020414601F0ECFE00990844C01D8B -:108CF00020F007000090E4BBA24AA1491160111DB9 -:108D0000401E086001222C219F4807F062FCFAF700 -:108D10002EF99E484178806805F09CFB42208DF832 -:108D200004009A480C30C0788DF8060010B1012874 -:108D300004D005E001208DF8060001E08DF806B0B2 -:108D400001A806F0C5FE10B10EA805F042FC0021F6 -:108D50001E22084603F03CF8FBF778F987480CAA76 -:108D600000210C30F8F706FB00B1FFDF9AF819007C -:108D700000E015E0FEF769FF00B1FFDF7F484FF428 -:108D8000F671443018F051FF7C480421443080F8DB -:108D9000E91180F8EA11062180F8EB110321017135 -:108DA000009919B0A1EB0900BDE8F08F70B5734CC4 -:108DB00006464434207804EB4015E078083590B935 -:108DC000A01990F8E80100280ED0A0780F2800D351 -:108DD000FFDF2021284618F028FF687866F302009C -:108DE00068700120E070284670BD2DE9F04105460D -:108DF0000C4600270078052190463E46B1EB101F37 -:108E000000D0FFDF287A58B101280FD0FFDF00BF64 -:108E1000A8F800600CB1278066800020BDE8F081D2 -:108E20000127092674B16888A08008E0022714266B -:108E300044B16888A0802869E060A88A2082287BE5 -:108E40002072E5E7A8F80060E7E710B54F4C6068CE -:108E5000C11D21F00701814200D0FFDF47480121F9 -:108E60000022017042700172032343728172027307 -:108E7000052282821F22C282417345A202610A2218 -:108E8000027641764FF4B061C1616168416010BD06 -:108E900030B53E4C1568636810339D4202D2042001 -:108EA000136030BD354B5D785A6802EB05121070C7 -:108EB00051700320D080172090800120D0709070D6 -:108EC000002090735878401C5870606810306060C3 -:108ED000002030BD70B5064628480024457807E0DC -:108EE000204600F09AFD0178B14204D0641CE4B23F -:108EF000AC42F5D1002070BDF7B5064608780C46A7 -:108F000008B3FFF7E7FF0546202E08D0232E17D021 -:108F1000212E41D0222E3FD0242E2BD114E000F060 -:108F200087FD0DB1697800E00021401A81B2A07878 -:108F30000144FF291ED830B1A08802282CD219E0A4 -:108F40006088172828D215E0227A2AB36188172969 -:108F500010D3A08817280DD3A3795BB1E3794BB167 -:108F6000402A07D84FF6FB72914201D8904213D99C -:108F70000420FEBD0720FEBD342002003004002086 -:108F80000000002000060240600600201C000020B7 -:108F90006E5246357800000065B9207802AA01219A -:108FA000FFF776FF0028E6D12078FFF793FF050052 -:108FB00000D1FFDF203E052E18D2DFE806F0030BBC -:108FC0000E081100A0786870A088E8800FE0608823 -:108FD000A8800CE0A078A87009E0A078E87006E00E -:108FE00054F8020FA8606068E86000E0FFDF00202E -:108FF000C1E700B597B053218DF8001000780BA998 -:1090000000F001008DF80200684605F023F817B063 -:1090100000BD00B5017897B001F001018DF8021094 -:10902000417801F001018DF803100178C1F340018E -:109030008DF804104178C1F340018DF805100178D6 -:1090400089088DF80610417889088DF80710817815 -:109050008DF80810C1788DF8091000798DF80A0094 -:109060004D208DF800000BA9684604F0F3FFCEE711 -:109070002DE9F04FDFF8F883FE4C97B000271BE096 -:10908000012000F07FFD0120FFF790FE0546FA4821 -:1090900007F0C8FA686000B9FFDF686805F027F8D4 -:1090A000A0B12846FAF7CEFA284600F071FD18B9AB -:1090B000F148696807F0BFFA94F9E9010428DFDA9A -:1090C000022007F075FC06460025AAE0EA48696818 -:1090D00007F0B1FAF4E7B8F802104046491C89B22B -:1090E000A8F80210B14201D3002141800221B8F852 -:1090F000020007F0B3FC00286BD0B8F8020054213E -:109100008DF80010ADF802000BA9684604F0A2FF2C -:1091100000B1FFDF9DF8300010F0010F0FD0B8F85C -:10912000020007F0B7FD5FEA000900D1FFDF484603 -:1091300006F0A3FF18B1B8F8020002F065F9B8F81C -:10914000020007F095FD5FEA000900D1FFDF484605 -:1091500006F08CFFE8BB0321B8F8020007F07EFCA4 -:109160005FEA000B48D1FFDF46E000BFDBF81000EC -:1091700010B10078FF2849D0022000F003FD022042 -:10918000FFF714FE8246484607F0A2F8CAF804002A -:1091900000B9FFDFDAF8040007F07CF90021009045 -:1091A0000170B8F802105046AAF8021001F032FE21 -:1091B000484607F071F900B9FFDF504600F0E8FCBF -:1091C00018B99AF80100000704D50098CBF81000F0 -:1091D00012E024E0DBF8100038B10178491C11F0EE -:1091E000FF01017008D1FFDF06E00022114648466A -:1091F00000F011FC00B9FFDF94F9EA01022805DB59 -:10920000B8F8020001F0CAFD0028AFD194F9E901D5 -:10921000042804DB484607F0B5F900B101276D1CAE -:10922000EDB2B54204D294F9EA010228BFF653AF79 -:10923000002F7FF423AF17B00320BDE8F04F00F0FC -:10924000A1BC10B58A4CA0600868E060AFF2DF10E6 -:1092500002F031FD607010BD864800214438017075 -:109260008348017085494160704730B505464FF02D -:1092700080500C46D0F8A41097B0491C05D1D0F806 -:10928000A810C9430904090C08D050F8A01F01F028 -:10929000010129704168216080680EE02B208DF863 -:1092A00000000BA9684604F0D5FE00B1FFDF0120E5 -:1092B00028700C982060BDF83400A0802878002821 -:1092C00003D0607940F0C000607117B030BDF0B5D8 -:1092D0004FF080540746D4F8800097B00D462B26F7 -:1092E000401C0BD1D4F88400401C07D1D4F888006E -:1092F000401C03D1D4F88C00401C0BD0D4F8800063 -:109300003860D4F884007860D4F88800B860D4F865 -:109310008C0016E08DF82C6069460BA804F09AFECC -:1093200000B1FFDF01983860029878608DF82C60FA -:1093300069460BA804F08EFE00B1FFDF0198B8600B -:109340000298F860D4F89000401C0BD1D4F8940037 -:10935000401C07D1D4F89800401C03D1D4F89C00DD -:10936000401C08D054F8900F286060686860A068BE -:10937000A860E06816E08DF800600BA9684604F06C -:1093800069FE00B1FFDF0C9828600D9868608DF8C9 -:1093900000600BA9684604F05DFE00B1FFDF0C9889 -:1093A000A8600D98E86017B0F0BD32480079FDE480 -:1093B00070B5304CE07830B3207804EB4010407A40 -:1093C00000F00700204490F9E801002800DCFFDFEE -:1093D0002078002504EB4010407A00F007000119C6 -:1093E00091F8E801401E81F8E8012078401CC0B2E5 -:1093F00020700F2800D12570A078401CA0700AF0C2 -:109400001BFBE57070BDFFDF70BD3EB50546032157 -:1094100007F024FB0446284607F02AFC054604B959 -:10942000FFDF206918B10078FF2800D1FFDF01AA13 -:109430006946284600F0EFFA60B9FFDF0AE0002233 -:1094400002A9284600F0E7FA00B9FFDF9DF80800FE -:1094500000B1FFDF9DF80000411E8DF80010EED234 -:1094600020690199884201D1002020613EBD0000A1 -:109470001C000020740400206006002068130020F7 -:1094800070B50546A0F57F400C46FF3800D1FFDFE0 -:10949000012C01D0FFDF70BDFFF787FF040000D172 -:1094A000FFDF207820F00F00401D20F0F00050304A -:1094B000207065800020207201202073BDE870407C -:1094C00076E72DE9F04116460D460746FFF76DFF9A -:1094D000040000D1FFDF207820F00F00401D20F0B5 -:1094E000F0005030207067800120207228682061D1 -:1094F000A888A0822673BDE8F04159E730B599B03D -:10950000FFF7E8FC040000D1FFDF0CA92046FFF7BD -:109510000FFB05460BA92046FFF721FB0146522011 -:109520008DF80000BDF830008DF80250001DADF838 -:109530000400BDF82C008DF80310001DADF80600E6 -:10954000E088ADF808000DA9684604F083FD002806 -:1095500000D0FFDF19B030BD2DE9F047DFF80094EF -:109560000546002799F8000010B10820BDE8F087F3 -:1095700028460AF09BFE08B11020F7E7F94C207846 -:1095800008B9FFF762FC607A217A0844C6B200F09D -:109590004FFAB04207D2301AC1B22A460020FFF774 -:1095A00077FC0700E2D1D9F804004E46C01C20F039 -:1095B0000300C9F8040000F05EFB716800EB0108CD -:1095C00001214046FFF7E3FA0646296840448842F5 -:1095D00002D8B6F5803F15D328600020FFF77AFC4B -:1095E00005000DD005F11300D9F8041020F0030098 -:1095F0004E46884200D0FFDF6078401E6070756084 -:109600000420B3E700214046FFF7C1FA0446A64212 -:1096100000D0FFDF04EB0801C9F8041029604FF601 -:10962000FF71A9F80210012189F8001038469DE762 -:109630002DE9F0410446CA4817460D46007810B19E -:109640000820BDE8F08108460AF00AFE08B11020A3 -:10965000F7E7C44E307808B9FFF7F7FB601E1E2805 -:1096600007D8012C3FD12878FE283CD8307600203E -:10967000E7E7A4F120001F2805D8E0B23A462946C2 -:10968000BDE8F04138E4A4F140004FF000081F2885 -:1096900021D8402C02D0412C25D117E068782978B8 -:1096A0004418A97881421ED8FF2C08D808F0BEFFC4 -:1096B00007460AF07BF9381A801EA04201DA122010 -:1096C000BFE728883081A878B07224E02846BDE83A -:1096D000F04100F085BAA4F1A0001F2803D8A02C07 -:1096E00003D0A12C06D00720ABE7287800F00100BA -:1096F000707610E029680920F829A2D38A07A0D142 -:10970000727B02F00302012A04D1F28AD73293B2AB -:109710008B4296D8F161404693E72DE9F0478146A8 -:109720000E4608460AF0C2FD48B948460AF0DCFD7C -:1097300028B909F1030020F00301494501D01020A8 -:1097400014E788484FF0000A4430817869B14178C5 -:10975000804600EB41140834378832460021204609 -:1097600000F024FA050004D027E0A6F800A00520A8 -:10977000FCE6B9F1000F24D03088B84201D90C259D -:109780001FE0607800F00705284600F0FBF908EBC1 -:109790000507324697F8E8014946401C87F8E8017A -:1097A000204607F5F47700F001FA05463878401EA8 -:1097B0003870032000F0E6F92DB10C2D01D0A6F889 -:1097C00000A02846D2E66078654F00F00701012925 -:1097D00023D002290CD0032932D0FFDF98F80110E2 -:1097E0004046491CC9B288F801100F2933D034E033 -:1097F000616821B1000702D46088FFF706FE98F87F -:10980000EA014646012802D1787802F073FA96F907 -:10981000EA010428E2DBFFDFE0E7616811B15248AA -:1098200006F009FF98F8E9014646032802D1787846 -:1098300002F060FA96F9E9010428CFDBFFDFCDE7FB -:10984000C00602D56088FFF7E0FD98F9EB01062815 -:10985000C4DBFFDFC2E780F801A08178491E817078 -:10986000617801F0070101EB080090F8E811491C4C -:1098700080F8E811A5E770B50D4604460AF0F0FC43 -:1098800018B928460AF012FD08B1102070BD29460B -:109890002046BDE8704008F01CBD70B50446154672 -:1098A0000E4608460AF0DCFC18B928460AF0FEFC11 -:1098B00008B1102070BD022C03D0102C01D009205B -:1098C00070BD2A463146204608F026FD0028F7D014 -:1098D000052070BD70B514460D4606460AF0C0FC62 -:1098E00038B928460AF0E2FC18B920460AF0FCFC18 -:1098F00008B1102070BD22462946304608F02BFDE5 -:109900000028F7D0072070BD10B596B004460AF0C5 -:10991000CDFC10B1102016B010BD0F208DF8000046 -:109920000BA9684604F096FB0028F4D19DF834009A -:109930002070BDF836006080BDF83800A08000209F -:10994000E9E770B505460C4608460AF0CDFC20B99B -:1099500074B120680AF0AAFC40B1102070BD00006C -:109960001C0000203004002060060020A08828B1E0 -:1099700021462846BDE87040FDF774BE0920EDE79A -:1099800070B504460D4608460AF06AFC30B9601E00 -:109990001E2814D828460AF063FC08B11020DDE721 -:1099A000022C01D90720D9E704B9FFDFE64800EB14 -:1099B000840050F8041C2846BDE870400847A4F114 -:1099C00020001F28EED829462046BDE87040FAF74F -:1099D0007FBA70B504460D4608460AF067FC30B9F8 -:1099E000601E1E280DD828460AF03AFC08B1102047 -:1099F000B4E7012C01D0022C01D10620AEE70720EC -:109A0000ACE7A4F120001F28F9D829462046BDE87C -:109A10007040FAF7E1BA06F0E4BA30B5CB4D04462F -:109A20006878A04200D8FFDF686800EB041030BD02 -:109A300070B5C64800252C46467807E02046FFF75B -:109A4000ECFF4078641C2844C5B2E4B2B442F5D1BE -:109A5000284683E72DE9F0410C46064600F043F91D -:109A600007463068C01C20F0030232601CBBB748B8 -:109A70003B46092120300AF0CDFA002408E0092CE9 -:109A800011D2DFE804F005070509090B05050700F9 -:109A9000AF4804E0AF4802E0AF4800E0AF480AF04A -:109AA000D9FA054600E0FFDFA54200D0FFDF641CC5 -:109AB000E4B2092CE3D3306800EB07103060C0E556 -:109AC000021D5143452900D245210844C01CB0FB6A -:109AD000F2F0C0B2704700B597B055228DF8002063 -:109AE000001DADF80200ADF804100BA9684604F0A3 -:109AF000B1FA00B1FFDFBDF8300017B000BD2DE9AD -:109B0000FC5F064691484FF000088B4647464446A6 -:109B100090F8019022E02046FFF77FFF050000D17A -:109B2000FFDF687869463844C7B22846FFF700F877 -:109B3000824601A92846FFF712F80346BDF8040043 -:109B40005246001D81B2BDF80000001D80B206F033 -:109B5000DBFF6A78641C00FB0288E4B24C45DAD172 -:109B60003068C01C20F003003060BBF1000F00D053 -:109B700000204246394606F0D5FF3168084430607F -:109B8000BDE8FC9F7149443108710020C8707047DE -:109B90006E494431CA782AB10A7801EB4211083182 -:109BA000814201D001207047002070472DE9F0412B -:109BB00006460078154600F00F0400201080601E55 -:109BC0000F46052800D3FFDF5F482A46103000EB20 -:109BD0008400394650F8043C3046BDE8F04118474F -:109BE00038B50446407800F00300012803D002286D -:109BF0000BD0072038BD606858B10AF07EFBD0B9A1 -:109C000060680AF071FB20B915E060680AF028FB73 -:109C100088B969462046FCF7A9F90028EAD160789E -:109C200000F00300022808D19DF8000028B1606808 -:109C30000AF05AFB08B1102038BD6189F8290DD807 -:109C4000208988420AD8607800F003023F48012A40 -:109C500006D1D731C26989B28A4201D2092038BD02 -:109C600094E80E0000F10C0585E80E000AB9002109 -:109C70008182002038BD2DE9F05F4FF000093348A4 -:109C8000C8464F464E464D46CB464C4690F801A03E -:109C900011E02046FFF7C1FE4178827809F1010901 -:109CA000884412FB0177C27812FB0166807B10FBAF -:109CB0000155641CE4B25445EBD10BEB890000EB79 -:109CC000C80000EB870000EB860000EBC5011F48D1 -:109CD000027A01EBC201427A807A01EBC20101EB08 -:109CE000C000BDE8F09F2DE9F047DFF86090002547 -:109CF0002C4699F8092099F8081099F801700A443F -:109D0000D6B299F80A20114401F0FF0808E0204675 -:109D1000FFF783FE817B407811FB0055641CE4B2A1 -:109D2000BC42F4D199F80800401C3044304440440F -:109D3000401C0EB1012100E0002108444419FF2C11 -:109D400000D9FFDFE0B211E434200200300400202B -:109D5000633D00008DAB0000592F00003120010051 -:109D60002DE9F041074614468846084601F02EFDCD -:109D7000064608EB88001C22796802EBC0000D182B -:109D8000688C58B14146384601F028FD0146786894 -:109D90000078C200082305F120000CE0E88CA8B18F -:109DA0004146384601F021FD014678680823407895 -:109DB000C20005F1240006F0F4FC38B1062121723E -:109DC0006681D0E90010C4E9031009E02878092869 -:109DD0000BD00520207266816868E0600020287042 -:109DE0002046BDE8F04101F0E7BC07202072668103 -:109DF000F4E72DE9F04116460D460746406801EBB1 -:109E000085011C2202EBC1014418204601F00FFD20 -:109E100040B10021708865F30F2160F31F410820D5 -:109E20000AF0D2F909202070324629463846BDE8AA -:109E3000F04195E72DE9F0410E46074600241C212C -:109E4000F07816E004EB8403726801EBC303D25C84 -:109E50006AB1FFF7AAFA050000D1FFDF6F802A463A -:109E600021463046FFF7C5FF0120BDE8F081641CA4 -:109E7000E4B2A042E6D80020F7E770B50646002419 -:109E80001C21C0780AE000BF04EB8403726801EB78 -:109E9000C303D5182A782AB1641CE4B2A042F3D8CF -:109EA000402070BD2821284617F09DFE70688089EB -:109EB0002881204670BD70B5034600201C25DC7843 -:109EC0000DE000BF00EB80065A6805EBC606324481 -:109ED000167816B1128A8A4204D0401CC0B284425D -:109EE000F0D8402070BDF0B5044600201C26E5786F -:109EF0000EE000BF00EB8007636806EBC7073B443A -:109F00001F788F4202D15B78934204D0401CC0B2CC -:109F10008542EFD84020F0BD0078032801D0002012 -:109F20007047012070470078022801D00020704758 -:109F3000012070470078072801D0002070470120D9 -:109F400070472DE9F041064688461078F1781546AD -:109F5000884200D3FFDF2C781C27641CF078E4B221 -:109F6000A04201D8201AC4B204EB8401706807EB48 -:109F7000C1010844017821B14146884708B12C70DD -:109F800073E72878A042E8D1402028706DE770B5CB -:109F900014460B880122A240134207D113430B80C1 -:109FA00001230A22011D06F0C6FB047070BD2DE9D5 -:109FB000FF4F81B00878DDE90E7B9A4691460E4648 -:109FC00040072CD4019806F065FE040000D1FFDFA5 -:109FD00007F1040820461FFA88F105F0A9FE0500E4 -:109FE00000D1FFDF204629466A4606F092F9009824 -:109FF000A0F80370A0F805A0284606F04BFA0178F7 -:10A0000069F306016BF3C711017020461FFA88F14E -:10A0100005F0DEFE00B9FFDF019804F07CF906EBE5 -:10A020000900017F491C017705B0BDE8F08F2DE9DB -:10A03000F84F0E469A4691460746032106F00EFD5C -:10A040000446008DDFF8B085002518B198F80000AF -:10A05000B0421ED1384606F01DFE070000D1FFDFDA -:10A0600009F10401384689B205F062FE050010D0FE -:10A07000384629466A4606F04CF9009800210A46FF -:10A080000180817004F00AFA0098C01DCAF800002F -:10A0900021E098F80000B04216D104F1260734F808 -:10A0A000341F012000FA06F911EA090F00D0FFDF82 -:10A0B0002088012340EA090020800A22391D384601 -:10A0C00006F054FB067006E0324604F1340104F158 -:10A0D0002600FFF75CFF0A2188F800102846BDE83B -:10A0E000F88FFEB514460D46064602AB0C2206213B -:10A0F000FFF79DFF002826D00299687812220A7087 -:10A10000801C487008224A80A87020888880608857 -:10A11000C880A0880881E088488100240C20CDE90F -:10A1200000040523062229463046FFF740FF21465A -:10A1300066F31F41F0230022012009F09BFF68789D -:10A14000801C68700120FEBDFEB514460D46062237 -:10A15000064602AB1146FFF76AFF002812D0029BA9 -:10A16000132000211870A8785870022058809C8015 -:10A170000620CDE900010246052329463046FFF7B7 -:10A1800016FF0120FEBD2DE9FE430C46804644E04B -:10A1900002AB0E2207214046FFF749FF002841D0BD -:10A1A00060681C2267788678BF1C06EB860102EB8C -:10A1B000C101451802981421017047700A2141809D -:10A1C000698A0181E98A4181A9888180A98981817F -:10A1D000304601F0FBFA029905230722C8806F7010 -:10A1E0000420287000250E20CDE9000521464046B8 -:10A1F000FFF7DDFE294666F30F2168F31F41F023C8 -:10A200000022082009F036FF6078FC49801C60704D -:10A2100062682046921CFFF794FE606880784028B0 -:10A22000B6D10120BDE8FE83FEB50D46064638E0F6 -:10A2300002AB0E2207213046FFF7F9FE002835D089 -:10A2400068681C23C17801EB810203EBC202841809 -:10A25000029815220270627842700A224280A28916 -:10A260004281A2888281084601F0B0FA0146029834 -:10A270008180618AC180E18A0181A088B8B1002013 -:10A28000207000210E20CDE9000105230722294678 -:10A290003046FFF78CFE6A68D9492846D21CFFF782 -:10A2A00050FE6868C0784028C2D10120FEBD06205B -:10A2B000E6E72DE9FE430C46814644E0204601F0E6 -:10A2C000A0FAD0B302AB082207214846FFF7AFFE41 -:10A2D0000028A7D060681C2265780679AD1C06EBC3 -:10A2E000860102EBC10147180298B7F810800621D9 -:10A2F0000170457004214180304601F067FA014643 -:10A30000029805230722C180A0F804807D700820F0 -:10A3100038700025CDE9000521464846FFF747FE85 -:10A32000294666F30F2169F31F41F023002208201C -:10A3300009F0A0FE6078801C60706268B149204618 -:10A34000121DFFF7FEFD606801794029B6D101209A -:10A3500068E72DE9F34F83B00E4680E0304601F008 -:10A3600050FA002875D071681C2091F8068008EB1F -:10A37000880200EBC2000C184146304601F035FA65 -:10A380000146A078C30070684078C20004F1240040 -:10A3900006F023FA07468088E18B401A80B2002538 -:10A3A00081B3AA46218B814200D8084681460246E5 -:10A3B00002AB07210398FFF73AFE010028D0BAF15B -:10A3C000000F03D0029AB888022510808B46E28BDA -:10A3D0003968A9EB05001FFA80FA0A440398009235 -:10A3E00006F058FCED1D009A59465346009506F0BC -:10A3F00017F8E08B504480B2E083B988884209D1D5 -:10A40000012508E0FFE7801C4FF0010A80B2C9E790 -:10A41000002009E60025CDE90095238A0722314670 -:10A420000398FFF7C4FDE089401EE0818DB1A0785C -:10A43000401CA0707068F178427811FB02F1CAB23A -:10A44000816901230E3006F076F980F80080002043 -:10A45000E08372686C493046921DFFF772FD7068A8 -:10A46000817940297FF47AAF0120DDE570B5064699 -:10A4700048680D4614468179402910D104EB8401C7 -:10A480001C2202EBC101084401F0F2F9002806D0B9 -:10A490006868294684713046BDE8704059E770BD50 -:10A4A000FEB50C460746002645E0204601F0A9F916 -:10A4B000D8B360681C22417901EB810102EBC10134 -:10A4C0004518688900B9FFDF02AB0822072138462A -:10A4D000FFF7ADFD002833D00299607816220A708C -:10A4E000801C4870042048806068407901F06EF953 -:10A4F000014602980523072281806989C1800820CE -:10A50000CDE9000621463846FFF751FD6078801CF2 -:10A510006070A88969890844B0F5803F00D3FFDFE7 -:10A52000A88969890844A8816E81626837492046F4 -:10A53000521DFFF706FD606841794029B5D1012021 -:10A54000FEBD30B5438C458BC3F3C704002345B132 -:10A55000838B641EED1AC38A6D1E1D4495FBF3F3B5 -:10A56000E4B22CB1008918B1A04200D820460344BF -:10A570004FF6FF70834200D3034613800C7030BD4A -:10A580002DE9FC41074616460D46486802EB860158 -:10A590001C2202EBC101441801AA69462046FFF7BC -:10A5A000D0FFA1896389BDF80420C81880B2824217 -:10A5B0001FD001280AD99DF800C0BCF1000F03D0BC -:10A5C000B4F808C0844501D8002B12D0501A00D529 -:10A5D000002060816868407940280AD1204601F057 -:10A5E0003DF9002805D06868294646713846FFF7CE -:10A5F00057FFBDE8FC8100002C000020199F0000DF -:10A60000279F0000359F000071B800005DB8000072 -:10A610002DE9FE4F8946804615465088032106F0F5 -:10A620001DFA8346B8F80200402801D2402000E01D -:10A63000403880B282460146584601F0E2F80028D0 -:10A640007ED00AEB8A001C22DBF8041002EBC0006B -:10A650000C18204601F0EBF8002877D1B8F800007C -:10A66000E18A88423CD8A189D1B348456ED1002601 -:10A670005146584601F0B2F8218C0F18608B48B94A -:10A68000B9F1020F62D3B8F804006083618A88428E -:10A6900026D80226A9EB06001FFA80F9B888A28BFB -:10A6A000801A002814DD4946814500DA084683B245 -:10A6B00068886968029139680A44CDE9003206F079 -:10A6C000D7FADDE90121F61D009B009605F06FFE2B -:10A6D000A18B01EB090080B2A083618B884207D96E -:10A6E000688803B052465946BDE8F04F01F0DDB826 -:10A6F0001FD14FF009002872B8F802006881D7E92D -:10A700000001C5E90401608BA881284601F054F8D6 -:10A710005146584601F062F80146DBF80400082370 -:10A720000078C20004F1200006F03BF80020A0836E -:10A730006083A0890AF0FF02401EA081688800E0C3 -:10A7400004E003B05946BDE8F04F19E7BDE8FE8FBD -:10A750002DE9F041064615460F461C46184609F0FD -:10A760007FFD18B9206809F0A1FD08B1102007E4A9 -:10A770007168688C0978B0EBC10F01D3132005E430 -:10A780003946304601F02AF80146706808230078FF -:10A79000C20005F1200005F0CEFFD4E90012C0E9A7 -:10A7A00000120020E3E710B50446032106F056F935 -:10A7B0000146007800F00300012804D08A8A204670 -:10A7C000BDE81040C0E42046BDE8104001F114028D -:10A7D00087E470B50446032106F040F905460146BA -:10A7E0002046FFF766FD002816D029462046FFF7D1 -:10A7F00057FE002810D029462046FFF715FD0028F7 -:10A800000AD029462046FFF7BEFC002804D029467E -:10A810002046BDE870409CE570BD2DE9F0410C4636 -:10A8200080461EE0E178427811FB02F1CAB28169EC -:10A8300001230E3005F0B5FF077860681C22C1794E -:10A84000491EC17107EB8701606802EBC101461820 -:10A850003946204600F0D5FF18B1304600F0E0FF41 -:10A8600020B16068C1790029DCD180E7FEF79DFD49 -:10A87000050000D1FFDF0A202872384600F0A6FF4D -:10A8800068813946204600F0B0FF01466068082321 -:10A890004078C20006F1240005F083FFD0E90010E3 -:10A8A000C5E90310A5F80280284600F085FFB078BE -:10A8B00000B9FFDFB078401EB07058E770B50C46A5 -:10A8C0000546032106F0CAF801464068C2792244D1 -:10A8D000C2712846BDE870409FE72DE9FE4F8246D1 -:10A8E000507814460F464FF0000800284FD001283A -:10A8F00007D0022822D0FFDF2068B8606068F860C7 -:10A9000024E702AB0E2208215046FFF790FB0028F7 -:10A91000F2D00298152105230170217841700A2197 -:10A920004180C0F80480C0F80880A0F80C806288DC -:10A9300082810E20CDE90008082221E0A678304669 -:10A9400000F044FF054606EB86012C22786802EBF6 -:10A95000C1010822465A02AB11465046FFF767FB79 -:10A960000028C9D002980721017021784170042184 -:10A97000418008218580C680CDE9001805230A465C -:10A9800039465046FFF713FB87F80880DEE6A678C5 -:10A99000022516B1022E13D0FFDF2A1D914602AB0D -:10A9A00008215046FFF743FB0028A5D0029801215B -:10A9B000022E0170217841704580868002D005E02A -:10A9C0000625EAE7A188C180E1880181CDE90098E8 -:10A9D0000523082239465046D4E710B50446032122 -:10A9E00006F03CF8014600F108022046BDE81040A0 -:10A9F00073E72DE9F05F0C4601281DD0957992F898 -:10AA00000480567905EB85011F2202EBC10121F07C -:10AA1000030B08EB060111FB05F14FF6FF7202EA8A -:10AA2000C10909F1030115FB0611F94F21F0031AC1 -:10AA300040B101283DD124E06168E57891F80080BB -:10AA40004E78DFE75946786805F029FE606000B966 -:10AA5000FFDF5946606817F0E8F8E57051467868FE -:10AA600005F01DFE6168486100B9FFDF606842695A -:10AA700002EB09018161606880F8008060684670BF -:10AA800017E0606852464169786805F033FE5A461F -:10AA90006168786805F02EFE032005F089FF044602 -:10AAA000032005F08DFF201A012802D1786805F0F7 -:10AAB000EBFD0BEB0A00BDE8F09F024600210220EF -:10AAC00097E713B5009858B10024684605F0C9FD12 -:10AAD000CF490A22002C0A7001D1009A4A601CBD9D -:10AAE00001240020F2E770B50C46154638212046B7 -:10AAF00017F09BF8012666700A2104F11C0017F07C -:10AB000094F805B9FFDF297A207861F301002070FD -:10AB1000A879002817D02A4621460020FFF769FFB0 -:10AB20006168402088706168C870616808716168F8 -:10AB300048716168887161682888088161686888DF -:10AB400048816068868170BDC878002802D00022E4 -:10AB500001204EE7704770B50546002165F31F419F -:10AB6000012009F031FB0321284605F077FF04009E -:10AB700000D1FFDF21462846FFF75CF9002804D00A -:10AB8000207840F010002070012070BD2DE9FF41B9 -:10AB900080460E460F0CFEF708FC050007D06F80BC -:10ABA0000321384605F05AFF040008D106E004B03E -:10ABB0003846BDE8F0411321F9F72EBEFFDFB8F1AA -:10ABC000010F05D0B8F1080F18D0FFDFBDE8FF81F5 -:10ABD00020782A4620F0080020700020ADF80200FE -:10ABE00002208DF800004FF6FF70ADF80400ADF8BC -:10ABF000060069463846F9F717F9E7E7C6F3072173 -:10AC000001EB81021C23606803EBC202805C042814 -:10AC100003D008280AD0FFDFD8E7012000904FF4C6 -:10AC200040432A46204600F009FECFE704B02A46FA -:10AC30002046BDE8F041FFF7DCB82DE9F05F0027C2 -:10AC4000B0F80A9090460C4605463E46B9F1400FD2 -:10AC500001D2402001E0A9F140001FFA80FA287AD1 -:10AC6000C01E08286BD2DFE800F00D04192058360A -:10AC70003C4772271026002C6CD0D5E90301C4E9AB -:10AC800002015CE070271226002C63D00A2205F135 -:10AC90000C0104F1080016F074FF50E071270C2637 -:10ACA000002C57D0E868A06049E0742710269CB3B8 -:10ACB000D5E90301C4E902016888032105F0CEFE4D -:10ACC0008346FEF772FB024668885080514658461C -:10ACD000FFF746F833E075270A26ECB1A8892081F2 -:10ACE0002DE076271426BCB105F10C0004F1080311 -:10ACF00007C883E8070022E07727102664B1D5E96A -:10AD00000301C4E902016888032105F0A7FE01469A -:10AD10006888FFF782FD12E01CE073270826CCB19B -:10AD20006888032105F09AFE01460078C00606D522 -:10AD30006888FFF77FF810B96888F8F767FCA8F80B -:10AD400000602CB12780A4F8069066806888A080F7 -:10AD50000020B0E6A8F80060FAE72DE9FC410C46B7 -:10AD60001E4617468046032105F078FE05460A2C4C -:10AD70000AD2DFE804F005050505050509090907FC -:10AD8000042303E0062301E0FFDF0023CDE9007682 -:10AD9000224629464046FFF70AF92AE438B5054617 -:10ADA000A0F57F40FF3830D0284605F061FF040051 -:10ADB00000D1FFDF204605F08BFA002815D00146B0 -:10ADC0006A46204605F0A5FA00980321B0F8054030 -:10ADD000284605F043FE0546052C03D0402C05D23D -:10ADE000402404E0007A80B1002038BD403CA4B289 -:10ADF000214600F006FD40B1686804EB84013E2264 -:10AE000002EBC101405A0028EFD0012038BD0000FC -:10AE10002C0000202DE9F04F044689B0408805F051 -:10AE200027FF050000D1FFDF06AA2846616800F071 -:10AE3000C1FC069D001F81B235F8032F6B888A4242 -:10AE400005D1042B0AD0052B1DD0062B15D0224688 -:10AE50002846FFF7DDFB09B0BDE8F08F16462D1D33 -:10AE6000224629463046F7F78CFA0828F3D12246C5 -:10AE700029463046FCF73DFCEDE76088291D6368F4 -:10AE8000FAF7F0FCE7E717466088032105F0E6FDD6 -:10AE90004FF000088DF804800646ADF80680042FB8 -:10AEA000D9D36A79002AD6D028794FF6FF794FF0A6 -:10AEB0001C0A13282CD008DC012878D0062847D09B -:10AEC000072875D0122874D106E0142872D01528EE -:10AED00071D016286DD1ACE10C2F6AD1307800F01A -:10AEE0000301012965D040F0080030706879B07026 -:10AEF00001208DF804002889ADF808006889ADF8B4 -:10AF00000A00A889ADF80C00E889ADF80E0019E038 -:10AF1000B07890429FD1307801079CD5062F9AD106 -:10AF200020F0080030706088414660F31F41012026 -:10AF300009F04AF902208DF80400ADF8089028893C -:10AF4000ADF80A006088224601A9F8F76DFF82E794 -:10AF5000082F80D12F89B5F80A90402F01D24020C8 -:10AF600001E0A7F1400080B280460146304600F083 -:10AF700048FC08B3716808EB88002C2202EBC00083 -:10AF8000095A4945E3D1FE4807AAD0E90210CDE9A4 -:10AF9000071068798DF81C0008F0FF058DF81E5029 -:10AFA00060883146FFF799FC2246294639E0B6E031 -:10AFB00014E03CE039E0E6E0F148D0E90010CDE9EA -:10AFC00007106879ADF820708DF81C00ADF822905C -:10AFD000608807AA3146FFF780FC3CE7082FB6D10E -:10AFE0006889B5F80880402801D2402000E0403848 -:10AFF00087B23946304600F004FC0028A7D007EBA2 -:10B00000870271680AEBC2000844028A42459ED159 -:10B01000017808299BD140786979884297D1F9B2A3 -:10B0200022463046FEF7E5FE15E70E2F07D0CDF895 -:10B030001C80CDF8208068798DF81C00C8E76989EC -:10B04000EF898B46B5F80C903046FEF734FFABF134 -:10B050004001402901D309204AE0B9F1170F01D37B -:10B06000172F01D20B2043E040280ED000EB8002C6 -:10B0700071680AEBC20008440178012903D14078C5 -:10B0800069798842A9D00A2032E03046FEF7F5FE01 -:10B09000014640282BD001EB810372680AEBC30004 -:10B0A00002EB0008012288F800206A7988F8012064 -:10B0B00070682A894089B84200D938462D8A03230E -:10B0C0002372A282E7812082A4F80C906582084650 -:10B0D00000F07CFB6081A8F81490A8F81870A8F81C -:10B0E0000E50A8F810B0204600F066FBB3E604202E -:10B0F00005212172A4F80A80E08101212173A04971 -:10B10000D1E90421CDE9072169798DF81C10ADF84A -:10B110001E00608807AA3146FFF7DFFBE3E7062F32 -:10B12000E4D3B078904215D13078010712D520F0E1 -:10B13000080030706088414660F31F41012009F02B -:10B1400043F802208DF804002889ADF80800ADF816 -:10B150000A90F7E604213046FEF7C5FE0546402872 -:10B16000C4D002208303009022462946304600F0D6 -:10B1700065FB4146608865F30F2160F31F4108209D -:10B1800009F022F867E60E2FB0D104213046FEF711 -:10B19000AAFE81464028A9D04146608869F30F2164 -:10B1A00060F31F41082009F00FF8288A0790E8890A -:10B1B00000907068AF894089B84200D9384683460C -:10B1C000B5F80A8028890590484600F0FFFA6081AA -:10B1D000079840B10220079B00902246494630461E -:10B1E00000F02CFB37E6B8F1170F1ED3172F1CD336 -:10B1F0000420207200986082E781A4F810B0A4F8BF -:10B200000C8009EB890271680AEBC2000D180099E5 -:10B210000598A5F81480A5F818B0E9812882204681 -:10B2200000F0CAFA0620287015E601200B230090D2 -:10B23000D3E7082FA6D129893046FEF73CFE074602 -:10B2400040289FD007EB870271680AEBC2000844D0 -:10B25000804600F0ECFA002894D16D89B8F80E0011 -:10B260002844B0F5803F05D360883A46314600F067 -:10B270001CFBF0E5002D85D0A8F80E0060883A464A -:10B280003146FFF7F3F808202072384600F09EFAA6 -:10B290006081A58127E770B50D460646032105F0BC -:10B2A000DDFB040004D02078000704D5112070BD18 -:10B2B00043F2020070BD2A4621463046FEF711FFD8 -:10B2C00018B9286860616868A061207840F00800BB -:10B2D0002070002070BD70B50D460646032105F0B4 -:10B2E000BDFB040004D02078000704D4082070BD02 -:10B2F00043F2020070BD2A4621463046FEF724FF85 -:10B3000000B9A582207820F008002070002070BDD0 -:10B310002DE9F04F0E4691B08046032105F09EFBCB -:10B320000446404605F0B6FC07460020079008900A -:10B330000990ADF830000A9002900390049004B98F -:10B34000FFDF0DF1080917BBFFDF20E038460BA92E -:10B35000002204F046FE9DF82C0000F07F050A2D27 -:10B3600000D3FFDF6019017F491E01779DF82C0093 -:10B3700000060CD52A460CA907A8FEF708FE01E036 -:10B380005C20020019F80510491C09F80510761E0A -:10B39000F6B2DBD204F13400FC4D04F1260BDFF8E9 -:10B3A000F0A304F12A07069010E05846069900F031 -:10B3B0006EFA064628700A2800D3FFDF5AF82610D6 -:10B3C00040468847E08CC05DB04202D0208D002806 -:10B3D000EBD10A202870EE4D4E4628350EE00CA920 -:10B3E00007A800F054FA0446375D55F8240000B968 -:10B3F000FFDF55F82420394640469047BDF81E002F -:10B400000028ECD111B027E510B5032105F026FB8B -:10B41000040000D1FFDF0A2104F11C0016F005FC36 -:10B42000207840F00400207010BD10B50C460321B8 -:10B4300005F014FB01190A7F01211AB9808EA14081 -:10B44000084000D0012010BD2DE9F84F894615466F -:10B450008246032105F002FB070004D0284608F0CD -:10B46000FFFE40B903E043F20200BDE8F88F484612 -:10B4700008F01CFF08B11020F7E7786828B1698848 -:10B480000089814201D90920EFE7B9F800001C24A6 -:10B4900018B1402809D2402008E03846FEF7EDFCFC -:10B4A0008046402819D11320DFE7403880B280461B -:10B4B0000146384600F0A5F948B108EB88007968E4 -:10B4C00004EBC000085C012803D00820CDE705206C -:10B4D000CBE7FDF76AFF06000BD008EB8800796820 -:10B4E00004EBC0000C18B9F8000020B1E88910B1D5 -:10B4F00013E01120B9E72888172802D36888172895 -:10B5000001D20720B1E7686838B12B1D22464146B9 -:10B510003846FFF71DF90028A7D104F10C0269464F -:10B520002046FFF70EF8288860826888E082B9F824 -:10B53000000030B102202070E889A080E889A0B125 -:10B540002BE003202070A889A080786881784029AA -:10B5500005D180F8028039465046FEF714FE404679 -:10B5600000F034F9A9F8000021E07868218B4089C7 -:10B57000884200D908462083A6F802A00420307231 -:10B58000B9F800007081E0897082F181208B3082EF -:10B59000A08AB081304600F00FF97868C178402960 -:10B5A00005D180F8038039465046FEF73DFE002065 -:10B5B0005BE770B50D460646032105F04FFA04001F -:10B5C00003D0402D04D2402503E043F2020070BDB9 -:10B5D000403DADB2294600F014F958B105EB8501A4 -:10B5E0001C22606802EBC101084400F020F918B188 -:10B5F000082070BD052070BD2A462146304600F067 -:10B6000054F9002070BD2DE9F0410D4616468046E4 -:10B61000032105F023FA0446402D01D2402500E025 -:10B62000403DADB28CB1294600F0EBF880B105EB9E -:10B6300085011C22606802EBC1014718384600F002 -:10B64000F6F838B10820BDE8F08143F20200FAE7CD -:10B650000520F8E733463A4629462046FFF778F8B2 -:10B660000028F0D1EAB221464046FEF789FF0020CB -:10B67000E9E72DE9F0410D4616468046032105F025 -:10B68000EDF90446402D01D2402500E0403DAFB227 -:10B6900024B1304608F0E4FD38B902E043F202007C -:10B6A000D1E7306808F0DCFD08B11020CBE739465F -:10B6B000204600F0A6F860B107EB87011C22606805 -:10B6C00002EBC1014518284600F0B1F818B1082076 -:10B6D000B9E70520B7E7B088A98A884201D90C20CC -:10B6E000B1E76168E88C4978B0EBC10F01D3132052 -:10B6F000A9E73946204600F078F80146606808233B -:10B700004078C20005F1240005F015F8D6E90012D2 -:10B71000C0E90012FAB221464046FEF7A7FE00201B -:10B7200091E72DE9F0470D461F46904681460321DB -:10B7300005F094F90446402D01D2402001E0A5F126 -:10B74000400086B23CB14DB1384608F0CDFD50B155 -:10B750001020BDE8F08743F20200FAE76068C8B144 -:10B76000A0F80C8024E03146204600F04AF888B169 -:10B7700006EB86011C22606802EBC10145182846D1 -:10B7800000F055F840B10820E3E700002C0000204D -:10B79000742002000520DCE7A5F80880F2B22146FB -:10B7A0004846FEF7EDFE1FB1A88969890844388034 -:10B7B0000020CEE704F0ADBD017821F00F01491C57 -:10B7C00021F0F00110310170FDF7F2BD10B5044613 -:10B7D000402800D9FFDF4034A0B210BD4068426964 -:10B7E0000078484302EBC0007047C2784068037895 -:10B7F00012FB03F24378406901FB032100EBC10017 -:10B800007047C2788A4209D9406801EB81011C2245 -:10B8100002EBC101405C08B1012070470020704775 -:10B820000078062801D90120704700207047007871 -:10B83000062801D00120704700207047F0B401EBCA -:10B8400081061C27446807EBC6063444049D052680 -:10B850002670E3802571F0BCFEF782BA10B54189ED -:10B8600011B1FFF7DDFF08B1002010BD012010BDB0 -:10B8700010B5C18C8278B1EBC20F04D9C18911B166 -:10B88000FFF7CEFF08B1002010BD012010BD10B59C -:10B890000C4601230A22011D04F083FF0078218851 -:10B8A000012282409143218010BDF0B402EB820559 -:10B8B0001C264C6806EBC505072363554B681C79AD -:10B8C000402C03D11A71F0BCFEF7F3BCF0BC7047FA -:10B8D00010B5EFF3108000F0010472B6E94841782A -:10B8E000491C41704078012801D1F7F74BFB002C2F -:10B8F00000D162B610BD70B5E24CE07848B90125C0 -:10B90000E570FFF7E5FFF7F745FB20B1002008F0F1 -:10B910009AF8002070BD4FF080406571C0F8045364 -:10B92000F7E770B5EFF3108000F0010572B6D54C63 -:10B93000607800B9FFDF6078401E6070607808B9F9 -:10B94000F7F724FB002D00D162B670BDCD4810B5CD -:10B95000C17821B100214171C170FFF7E2FF0020E1 -:10B9600010BD10B50446F7F715FBC649C978084065 -:10B9700000D001202060002010BD2DE9F05FDFF82D -:10B9800004934278817889F80620002689F8071008 -:10B99000074689F808600078354620B101280FD0A5 -:10B9A00002280FD0FFDFF7F702FB98B1F7F706FB8D -:10B9B000B0420FD13046F7F705FB0028FAD047E038 -:10B9C0000126F0E7FFF784FFF7F7E4FA0028FBD041 -:10B9D0000226E8E701208407E060C4F80451AA4980 -:10B9E0000E600107D1F84412A74AC1F34231243254 -:10B9F0001160A549343108604FF0020BC4F804B35C -:10BA0000A060DFF888A2DAF80010C94341F3001102 -:10BA100001F10108DAF8001041F01001CAF8001035 -:10BA200000E020BFD4F804010028FAD03046F7F730 -:10BA3000C9FA0028FAD0B8F1000F05D1DAF80010E1 -:10BA400021F01001CAF80010C4F808B3C4F804517A -:10BA500099F807004C4670B1387860B9F7F79AFA50 -:10BA6000074608F09FF96FF0004117B1C4E90310D1 -:10BA700001E0C4E9030116B12571BDE8F09F01277B -:10BA8000BE0727714FF01908C6F80883B761C6F8DA -:10BA90000051C6F80C51C6F81051F7F77BFA10B1F7 -:10BAA000A770376100E02770FFF712FF7649A07991 -:10BAB00020310860C6F80483DFE770B5050000D1C7 -:10BAC000FFDF4FF080424FF0FF30C2F80803002143 -:10BAD000C2F80011C2F80411C2F80C11C2F810111A -:10BAE000684C6170F7F75CFA10B10120E07060708B -:10BAF0002846BDE8704040E72DE9F05F6448D0F883 -:10BB000000B0634A6349083211608406D4F8080122 -:10BB100010B14FF0010801E04FF00008D4F8000127 -:10BB200000B101208146D4F8040108B1012600E0EB -:10BB30000026D4F80C0100B101208246D4F810018F -:10BB400008B1012700E0002748EA090126EA0100C0 -:10BB500020EA0A00B84300D0FFDF0025B8F1000F4B -:10BB600004D0C4F80851012007F06DFF5FEA090016 -:10BB7000DFF810814FF0010913D0C4F8005198F894 -:10BB8000050020B188F80550002007F05CFF98F808 -:10BB9000000030B1F7F7FEF918B188F80290C4F848 -:10BBA00010900EB1C4F80451BAF1000F0CD0C4F8D3 -:10BBB0000C5198F80200464600B9FFDFB5703570A9 -:10BBC000C4F81490FFF7ADFE37B1C4F8105198F8DF -:10BBD000040008B100F020F82D49091DC1F800B09B -:10BBE0004BE770B5274DE87808B9F7F7CFF9012092 -:10BBF0008407A061A87850B1D4F80C0120B90020C6 -:10BC0000F7F7E0F90028F7D10020C4F80C014FF055 -:10BC1000FF30C4F8080370BD2DE9F041194C4FF016 -:10BC200080470125E079F0B1012803D0217A401E38 -:10BC3000814218DAF7F7AEF9064608F0B3F8E17971 -:10BC4000012902D9217A491C21720EB1216900E033 -:10BC5000E168411A022902DA11F1020F0BDC0EB180 -:10BC6000206100E0E060FFF733FEF7F793F928B1B9 -:10BC70003D61A57003E07D61BDE8F0812570002085 -:10BC80002072F9E7380000201805004010ED00E0B0 -:10BC900010050240010000014FF0E0214FF000705C -:10BCA000C1F88001C1F88002384B802283F800245B -:10BCB000C1F80001704700B502460420344903E092 -:10BCC00001EBC0031B792BB1401EC0B2F8D2FFDFDD -:10BCD000FF2000BD41F8302001EBC00100224A7175 -:10BCE0008A7101220A7100BD294A002102EBC000BD -:10BCF0000171704710B50446042800D3FFDF2448C3 -:10BD000000EBC4042079012800D0FFDF6079A1791D -:10BD1000401CC0B2814200D060714FF0E0214FF072 -:10BD20000070C1F8000210BD2DE9F0411948056806 -:10BD300018491948083108601448042690F800048E -:10BD4000134F4009154C042818D0FFDF16E0217866 -:10BD500007EBC1000279012A08D1427983799A421E -:10BD600004D04279827157F8310080472078401C16 -:10BD7000C0B22070042801D300202070761EF6B2D5 -:10BD8000E5D20448001D0560BDE8F08119E000E03F -:10BD90009006002010050240010000014C00002028 -:10BDA000F8B51D46DDE906470E000AD004F072FF23 -:10BDB0002346FF1DBCB231462A46009404F030FBF6 -:10BDC000F8BDD0192246194615F096FE2046F8BD5A -:10BDD000F84B586019721A80C90015F026BF70B56B -:10BDE0000D460446102115F0FEFE258117206081C6 -:10BDF000A07B40F00A00A07370BD4FF6FF720A806E -:10BE00000146032008F0E0B9704700897047827B43 -:10BE1000D30701D1920703D480890880002070479E -:10BE200005207047827B920700D5818170470146CB -:10BE30000020098847F2FE12114200D00120DD499E -:10BE4000497A002901D040F00800704700B5034648 -:10BE5000807BC00701D0052000BD59811846FFF73F -:10BE6000E6FFC00703D0987B40F004009873987BEE -:10BE700040F001009873002000BD827B520700D57E -:10BE800009B14089704717207047827B61F3C30274 -:10BE9000827370472DE9F04F0E46017804464FF04B -:10BEA000010B0BFA01F047F2FF1100EA010961688A -:10BEB0004FF6FF7887B008881D469646404506D065 -:10BEC000B9F1000F07D047F2FE12104203D0012053 -:10BED00007B0BDE8F08F40EA090008804FF0000A83 -:10BEE00095B185F800A022780027052003210223C0 -:10BEF000102A6FD2DFE802F06E0D2C35546F768079 -:10BF000054CBC79CCFFEFDFC20780B28EBD004203F -:10BF1000DEE762682089937B9B077DD5172851D384 -:10BF200013898342FBD39289172A01D3824249D1D4 -:10BF30002A7822F03F02921C2A70A5F80100318075 -:10BF4000616888816068817B21F00201817342E130 -:10BF5000042129702189A5F801106189A5F8031031 -:10BF60008FE0208A3188C01D1FFA80F84145D6D362 -:10BF7000062028702089A5F801006089A5F8030033 -:10BF8000A089A5F805000721208ACDE90001608875 -:10BF90002A4671466369FFF703FFA6F800801AE19D -:10BFA000082A10D0082129702189A5F8011061897B -:10BFB000A5F8031030806A1D694604F10C0006F0F4 -:10BFC000CAF910B1CCE01021EDE730889DF80010DF -:10BFD000084456E00EE10A2028702089A5F80100E7 -:10BFE0003180B2E00C2129702189A5F80110618906 -:10BFF000A5F803103080A8E0218933880BEB4102BB -:10C000001FFA82FA534576D3BAF1050F73D30E2285 -:10C010002A7008EA410100E07FE0CDE9001B60885A -:10C020002A467146E368FFF7BBFEA6F800A0D2E0FF -:10C030006048417A002970D0491E41724068217AD7 -:10C04000E26800EBC105D046A9882868D2F800C094 -:10C050000844A0F1080140F808CC506848608DF809 -:10C0600000308DF801A028680290A888ADF804007F -:10C0700060886946F5F7C6FEA5F80480002E01D059 -:10C0800040463080A7E0287840F080022A70287867 -:10C0900040F040022A7060893288C01C1FFA80F884 -:10C0A00042455DD3287820F03F0012302870228965 -:10C0B000A5F801206089CDE9000160882A46714613 -:10C0C000E368FFF76DFEA6F80080287841063CD5AE -:10C0D00000065ED58DF800B08DF801A03188CDE95D -:10C0E000025A091DADF804100420DFF8C88003E0EF -:10C0F00059E04FE02DE033E0049098F808008DF807 -:10C10000140060886946F5F77DFE074630880C30DC -:10C110003080022F02D0E7B36FE048E09DF8142092 -:10C12000D8F8041098F80830404601EBC2019A4252 -:10C1300016D28A88A2B9427A521C88F809200D606A -:10C1400030888880A6F800A057E061682089888040 -:10C1500041E0A1893288491D1FFA81F8424501D288 -:10C1600004274AE029782A4621F03F011631297038 -:10C170002189A5F801106189A5F80310A189CDE9ED -:10C180000010608871462369FFF70AFEA6F8008058 -:10C19000DBE720E0287820F03F0018302870207A74 -:10C1A0006870338017E060680188090404D40527AB -:10C1B00023E00000B0060020C0882189884201D019 -:10C1C00006271AE01E202870A6F800B060680188D3 -:10C1D00021F400410180B9F1000F0ED0DF486188E1 -:10C1E000002200888300032007F044FF6168207864 -:10C1F000887007E0A6F800A003276068018821EA9C -:10C2000009010180384663E62DE9F04F87B01746F3 -:10C21000109C0D0083461E461AD03078C10703D00B -:10C2200000F03F00192801D9012100E0002120463B -:10C23000FFF723FEA8420BD32088A0F57F41FF39EA -:10C2400006D03078410601D4000603D508203FE629 -:10C2500007203DE600208DF800008DF801003078C1 -:10C260006B1E00F03F0C0122A81E4FF0050A4FF094 -:10C27000020999B2BCF1200F76D2DFE80CF08C10E5 -:10C28000755F7569758D759E75B875BD75CB75D7FC -:10C2900075E4757575F475F275F175F0758C052D8D -:10C2A00079D104208DF80000A0788DF80400708802 -:10C2B000ADF8060030798DF80100707800F03F008D -:10C2C0000C2829D00ADCA0F10200092863D2DFE89B -:10C2D00000F0126215621A621D622000122824D03A -:10C2E00004DC0E281BD01028DAD11BE016281FD042 -:10C2F0001828D5D11FE02078800701E0207840077A -:10C30000002848DAF1E020780007F9E72078C00635 -:10C31000F6E720788006F3E720784006F0E72078FB -:10C320000006EDE72088C005EAE72088C004E7E7BB -:10C3300020888004E4E720884004E1E72078800733 -:10C3400029D5032D27D18DF800A0B6F8010083E090 -:10C35000217849071FD5062D1DD381B27078012899 -:10C3600003D0022817D102E0CCE0022000E0102028 -:10C3700006228DF8002072788DF80420801CB1FB15 -:10C38000F0F2ADF8062092B242438A4203D10397FD -:10C39000ADF80890A9E07BE02078000778D5072168 -:10C3A00098B28DF800108108ADF80410B0EB810F41 -:10C3B0006ED10297ADF8062097E02178C90667D5BF -:10C3C000022D65D381B208208DF800007078022814 -:10C3D0005ED300BFB1FBF0F28DF80400ADF806208B -:10C3E00092B242438A4253D1ADF808907CE0207863 -:10C3F00080064DD5092003E02078400648D50A2064 -:10C400008DF80000A088ADF80400ADF80610ADF876 -:10C41000082069E02078000672D50B20ADF80410E2 -:10C420008DF80000ADF8062002975EE02188C9056E -:10C4300066D5022D64D381B20C208DF8000070788F -:10C4400004285DD3C6E72088C00459D5012D57D1F3 -:10C450000D208DF80000A088ADF8040045E021E033 -:10C4600026E016E0FFE72088800449D5052D47D354 -:10C470000E208DF80000A088ADF80400B6F8030087 -:10C480006D1FADF80850ADF80600ADF80AA02BE01E -:10C4900036E02088400433D5012D31D10F208DF8AE -:10C4A000000022E0208800042AD4B6F80100E080D1 -:10C4B000A07B000724D5032D22D3307800F03F0065 -:10C4C0001B2819D011208DF80000208840F400406E -:10C4D000A4F80000B6F80100ADF80400ED1E03203A -:10C4E000ADF80650ADF80800039769465846F5F7D1 -:10C4F00089FC050008D016E010208DF80000E9E75F -:10C50000072510E008250EE0307800F03F001B28DA -:10C5100009D01D2807D05946032007F055FE208872 -:10C5200000F400402080A07B400708D52046FFF79C -:10C530007EFCC00703D1A07B20F00400A073284636 -:10C54000C6E400B587B0032805D18DF8000088B295 -:10C550006946F5F757FC07B000BD0000B0060020A3 -:10C56000F8B51D46DDE906470E000AD004F092FB3F -:10C570002346FF1DBCB231462A46009403F050FF0B -:10C58000F8BDD0192246194615F0B6FA2046F8BD76 -:10C590002DE9FF4F8DB09B46DDE91B57DDF87CA0F0 -:10C5A0000C46082B05D0E06901F00CF950B11020C1 -:10C5B000D2E02888092140F0100028808AF8001075 -:10C5C000022617E0E16901208871E2694FF42051E9 -:10C5D0009180E1698872E06942F601010181E069B8 -:10C5E000002181732888112140F0200028808AF8DA -:10C5F0000010042638780A900A2038704FF002099B -:10C6000004F118004D460C9001F09FFBB04681E00C -:10C61000BBF1100F0ED1022D0CD0A9EB0800801C2D -:10C6200080B20221CDE9001005AB52461E990D984B -:10C63000FFF796FFBDF816101A98814203D9F74804 -:10C6400000790F9004E003D10A9808B138702FE008 -:10C650004FF00201CDE900190DF1160352461E9963 -:10C660000D98FFF77DFF1D980088401B801B83B24B -:10C67000C6F1FF00984200D203461E990BA8D9B11B -:10C680005FF00002DDF878C0CDE9032009EB060178 -:10C6900089B2CDE901C10F980090BDF816100022B3 -:10C6A0000D9801F0D5FB387070B1C0B2832807D067 -:10C6B000BDF8160020833AE00AEB09018A19E1E788 -:10C6C000022011B0BDE8F08FBDF82C00811901F0F7 -:10C6D000FF08022D0DD09AF80120424506D1BDF881 -:10C6E0002010814207D0B8F1FF0F04D09AF80180E2 -:10C6F0001FE08AF80180C94800680178052902D145 -:10C70000BDF81610818009EB08001FFA80F905EBCF -:10C71000080085B2DDE90C1005AB0F9A01F018FB9B -:10C7200028B91D980088411B4145BFF671AF022D05 -:10C7300013D0BBF1100F0CD1A9EB0800801C81B203 -:10C740000220CDE9000105AB52461E990D98FFF776 -:10C7500007FF1D980580002038700020B1E72DE903 -:10C76000F8439C46089E13460027B26B9AB3491FB4 -:10C770008CB2F18FA1F57F45FF3D05D05518AD88EE -:10C780002944891D8DB200E000252919B6F83C80A6 -:10C790000831414520D82A44BCF8011022F8021B78 -:10C7A000BCF8031022F8021B984622F8024B91466F -:10C7B00004F05EFA4FF00C0C41464A462346CDF891 -:10C7C00000C003F0F4FDF587B16B00202944A41DDF -:10C7D0002144088003E001E0092700E08327384670 -:10C7E000BDE8F88310B50B88848F9C420CD9846B0C -:10C7F000E018048844B1848824F40044A41D234430 -:10C800000B801060002010BD822010BD2DE9F04784 -:10C810008AB00025904689468246ADF81850072711 -:10C820004BE0059806888088000446D4A8F800608C -:10C8300007A8019500970295CDE903504FF40073C6 -:10C8400000223146504601F003FB04003CD1BDF804 -:10C850001800ADF82000059804888188B44216D1EC -:10C860000A0414D401950295039521F40041009720 -:10C87000049541F4804342882146504601F0BEF8B9 -:10C8800004000BD10598818841F40041818005AAFC -:10C8900008A94846FFF7A6FF0400DCD000970598DA -:10C8A00002950195039504950188BDF81C3000227E -:10C8B000504601F0A3F8822C06D105AA06A94846E5 -:10C8C000FFF790FF0400ACD0ADF8185004E00598D5 -:10C8D000818821F40041818005AA06A94846FFF716 -:10C8E00081FF0028F3D0822C03D020460AB0BDE897 -:10C8F000F0870020FAE710B50C46896B86B051B17D -:10C900000C218DF80010A18FADF80810A16B0191DA -:10C910006946FAF7C9FB00204FF6FF71A063E18773 -:10C92000A08706B010BD2DE9F0410D460746896B82 -:10C930000020069E1446002911D0012B0FD132464B -:10C9400029463846FFF762FF002808D1002C06D0A0 -:10C95000324629463846BDE8F04100F042BFBDE806 -:10C96000F0812DE9FC411446DDE9087C0E46DDE945 -:10C970000A15521DBCF800E092B2964502D207207B -:10C98000BDE8FC81ACF8002017222A70A5F80160F0 -:10C99000A5F803300522CDE900423B462A46FFF7C1 -:10C9A000DFFD0020ECE770B50C4615464821204617 -:10C9B00015F03BF904F1080044F81C0F00204FF675 -:10C9C000FF71E06161842084A5841720E08494F8DD -:10C9D0002A0040F00A0084F82A0070BD4FF6FF726A -:10C9E0000A800146042007F0EFBB30B585B00C4645 -:10C9F0000546FFF780FFA18E284629B101218DF859 -:10CA000000106946FAF750FB0020E0622063606383 -:10CA100005B030BDB0F84000704700005000002065 -:10CA200090F84620920703D4408808800020F3E75E -:10CA30000620F1E790F846209207EDD5A0F84410C3 -:10CA4000EAE70146002009880A0700D5012011F015 -:10CA5000F00F01D040F00200CA0501D540F00400FB -:10CA60008A0501D540F010004A0501D540F02000AC -:10CA70000905D1D540F04000CEE700B5034690F857 -:10CA80004600C00701D0062000BDA3F8421018469A -:10CA9000FFF7D7FF10F0760F05D093F8460040F06F -:10CAA000040083F8460013F8460F40F001001870A8 -:10CAB000002000BD90F84620520700D511B1B0F813 -:10CAC0004200A9E71720A7E710F8462F61F3C30239 -:10CAD0000270A1E72DE9FF4F9BB00E00DDE92B347A -:10CAE000DDE92978289D25D02878C10703D000F0FA -:10CAF0003F00192801D9012100E000212046FFF75D -:10CB0000D9FFB04216D3287841060FD400F03F0178 -:10CB10001E2909D0218811F47F6F0BD13A884AB1C0 -:10CB2000A1F57F42FF3A05D0010606D500F03F008F -:10CB3000122802D004201FB0C4E5FC491D984FF014 -:10CB4000000A08718DF818A08DF830A00CAA0A60B0 -:10CB5000ADF81CA0ADF824A02978994601F03F0259 -:10CB6000701F5B1C04F1180CD3464FF0030ECDF878 -:10CB700028C01F2A7ED2DFE802F07D7D107D227D55 -:10CB8000AE7DF77DF67DF57DF47DF77DF37D7D7DD2 -:10CB9000F27DF17D7D7D7D7DF00094F84610B5F845 -:10CBA0000100890767D5032E65D14FF40061ADF808 -:10CBB000241060808DF830E0ADF83400E9E2052EF5 -:10CBC000F2D1B5F801002083ADF81C00B5F80310D0 -:10CBD0006183002870D088426ED884F80AB0A4F827 -:10CBE00008B04FF6FF7020840A9801F0AEF80520D7 -:10CBF00089F8000002208346029011AB1D9A0A9921 -:10CC00001B9801F0A5F820B15EE000BF8DF8180078 -:10CC1000FEE29DF84A00012804D0022089F80100B4 -:10CC2000102003E0012089F8010002200390002277 -:10CC300004A912A805F08FFBE8BB9DF8101003981B -:10CC400088423ED13A88891CA2EB0B00884238DB2F -:10CC500002990220CDE900010DF146034A46414602 -:10CC60001B98FFF77DFC02980BF1020B801C81B230 -:10CC700017AA01E0ACE2B1E0029104A912A805F004 -:10CC80006AFB02999DF81000CDE9000117AB4A46F6 -:10CC900041461B98FFF764FC9DF8100011AB0BEBAD -:10CCA00000011FFA81FB02991D9A084480B202908C -:10CCB0000A991B9801E004E091E001F049F800288E -:10CCC000B5D0BBF1020F03D10A208DF818005DE248 -:10CCD000A7F800B05AE2CDF80CB0072E7ED3B5F815 -:10CCE00001002083ADF81C00B5F803206283002802 -:10CCF00075D0904273D84FF0010B84F80AB0B5F8A4 -:10CD0000050020810020A073E06900F05BFD80B980 -:10CD1000E16942F6010081F806B0E2694FF4205162 -:10CD20009180E16981F80AB0E1690881E169002038 -:10CD30008873F01F20841E984FF0070B6062A4F8E0 -:10CD400022B00A9801F001F889F800B0012083466A -:10CD500004900020ADF846002AE026E2B0E147E169 -:10CD6000EDE01FE2B0E088E04FE000BFBBF1010F53 -:10CD700015D0E0698079012803D1BDF84400ADF8F1 -:10CD80000E0004990420CDE9000103AB4A46414658 -:10CD90001B98FFF7E5FB0498001D80B20490BDF8D6 -:10CDA0004600ADF80C00ADF80E0005981FFA80FBA8 -:10CDB00011AB1D9A0A991B9800F0CAFF28B939884F -:10CDC0000BF1040005908142D0D2BBF1010F3FF47A -:10CDD0001BAFE0698079012808D001E098E023E0EA -:10CDE000BDF84410A1F57F40FF3803D1BDF84400E1 -:10CDF000ADF80E0004990420CDE9000103AB4A46CA -:10CE000041461B98FFF7ACFB62E7072E01D0152EB9 -:10CE10007ED1B5F801102183ADF81C10B5F80320C0 -:10CE2000628309B1914201D90120EFE60121A1728B -:10CE3000A4F808B084F80EB0052E07D0C0B2691D62 -:10CE4000E26905F069FA00287FF4DEAE4FF6FF7064 -:10CE5000208401A806AA09A9CDF800B080E88603BD -:10CE60002878214600F03F031D9A1B98FFF790FB9E -:10CE70008246208BADF81C0088E10120032EC7D12B -:10CE80004021ADF82410B5F801102183ADF81C1035 -:10CE90000AAAB8F1000F00D00023CDE902030492E2 -:10CEA0001D98CDF80480009038880022401E83B27F -:10CEB0001B9800F0CDFF8DF8180050BB0B2189F8AE -:10CEC0000010BDF8280038E04FF0010C052E9FD16E -:10CED0008020ADF82400B5F801102183B5F80300D7 -:10CEE0002084ADF81C10B0F5007F01D907208DE635 -:10CEF00040F47C42228412A8B8F1000F00D0002335 -:10CF0000CDE90330CDE9018C1D980090388801E00F -:10CF10009CE007E0401E83B21B9800F099FF8DF85B -:10CF2000180028B18328A7D10220C7E050000020B4 -:10CF30000D2189F80010BDF84800401C25E1C80902 -:10CF400000EB40020EEB8200B04203D948067DD5CB -:10CF500058461AE1B5F80110ADF81C102A785206AF -:10CF600008D506228DF830202A78120605D58DF8CE -:10CF700030B02FE107228DF830200323CDE9023BAA -:10CF8000DDF878C0CDF810B01D9AA6EB000800922D -:10CF9000CDF804C01FFA88F300221B9800F02EFD84 -:10CFA0008DF818008DF830B0297849060DD5208805 -:10CFB000C00506D5208BBDF81C10884201D1C4F8ED -:10CFC00024B058468DF818B0DFE0832801D14FF027 -:10CFD000020A4FF48070ADF82400BDF81C002083D5 -:10CFE000A4F820801E986062032060841321C9E0A9 -:10CFF000052E2BD3B5F80110ADF81C10A28F32B35B -:10D00000A2F57F43FE3B29D008228DF8302005236E -:10D01000CDE9023BDDF878C0CDF810B01D9A80B2A2 -:10D02000CDF804C040F400430092B5F803201B98EB -:10D0300000F0E4FC4FF400718DF818008DF830B06A -:10D04000ADF82410832813D010B301E0DBE005E035 -:10D05000A08FA0F57F41FE3907D0D9E00B228DF8D3 -:10D0600030204FF6FE72A287D1E7A4F83CB0CFE0A3 -:10D0700000942B4631461E9A1B98FFF770FB8DF8E3 -:10D08000180008B183284BD1BDF81C0020834BE762 -:10D0900000942B4631461E9A1B98FFF760FB8DF8D3 -:10D0A0001800E8BBE18FA06B0844831D8DE888035E -:10D0B0004388828801881B98FFF753FC824665E00D -:10D0C00095F80180022E6FD15FEA080002D0B8F116 -:10D0D000010F7FD109208DF8300007A800908DF84E -:10D0E00034804346002221461B98FFF71CFC8DF834 -:10D0F00036008DF837B050B9B8F1010F11D0B8F142 -:10D10000000F04D1A08FA0F57F41FF3909D0A08F77 -:10D1100038B14FF480608DF830B0ADF824000EE0E7 -:10D1200034E00CA91B98F9F7BFFF82464FF48060EA -:10D130008DF830B0ADF82400BAF1020F06D0FB48EC -:10D140000068C07928B18DF8180027E0A4F818808D -:10D1500042E0BAF1000F03D081208DF818003BE0C7 -:10D1600007A800904346012221461B98FFF7DBFBEE -:10D170008DF8180021461B98FFF7BDFB9DF818009D -:10D1800020B9192189F80010012038809DF830005D -:10D1900020B10CA91B98F9F787FF8246BAF1000F5E -:10D1A00033D019E0062031E514E02078000711D5CE -:10D1B000012E0FD10A208DF83000E088ADF8340040 -:10D1C00004201B9907F000F80820ADF824007FE543 -:10D1D000480618D54FF0040A2088BDF824100843EB -:10D1E0002080BDF8240080050BD5A18FA1F57F40DC -:10D1F000FE3806D11E98E06228982063A6864FF07C -:10D20000030A504697E4042000E59DF8180078B121 -:10D21000012089F80000297889F80110BDF81C1058 -:10D22000A9F802109DF8180089F80400052038803C -:10D230002088BDF8241088432080E2E72DE9FF4FC5 -:10D240008846087895B0012181404FF20900249C5E -:10D250000140ADF820102088DDF88890A0F57F42CD -:10D260004FF0000AFF3A02D029B1000703D5012090 -:10D2700019B0BDE8F08F239E4FF0000B0EA886F882 -:10D2800000B018995D460988ADF83410A7498DF8AB -:10D290001CB0179A0A718DF838B0086098F8000031 -:10D2A00001283BD0022809D003286FD1307820F024 -:10D2B0003F001D303070B8F80400E08098F800108E -:10D2C0000320022904D1317821F03F011B31317054 -:10D2D00094F84610090759D505ABB9F1000F13D0E2 -:10D2E000002102AA82E80B000720CDE90009BDF861 -:10D2F0003400B8F80410C01E83B20022159800F064 -:10D30000A7FD0028D1D101E0F11CEAE7B8F804003C -:10D31000A6F80100BDF81400C01C04E198F805103F -:10D320008DF81C1098F80400012806D04FF4007AFC -:10D3300002282CD00328B8D16BE12188B8F8080066 -:10D3400011F40061ADF8201020D017281CD3B4F8D8 -:10D350004010814218D3B4F84410172901D38142F8 -:10D3600012D1317821F03F01C91C3170A6F80100BB -:10D370000321ADF83410A4F8440094F8460020F0DE -:10D38000020084F8460064E105257DE176E120880D -:10D3900008F1080700F4FE60ADF8200010F0F00F6F -:10D3A0001BD010F0C00F03D03888228B9042EBD1F5 -:10D3B00099B9B878C00710D0B9680720CDE902B193 -:10D3C000CDF804B00090CDF810B0FB88BA88398849 -:10D3D000159800F013FB0028D6D12398BDF8201033 -:10D3E000401C80294ED006DC10290DD020290BD0FE -:10D3F000402987D124E0B1F5807F70D051456DD0B0 -:10D40000B1F5806F97D1DDE0C80601D5082000E0B6 -:10D41000102082460DA907AA0520CDE902218DF82A -:10D420003800ADF83CB0CDE9049608A93888CDE9BC -:10D4300000015346072221461598FFF7A9F8A7E0F7 -:10D440009DF81C2001214FF00A0A002A9BD105AB50 -:10D45000B9F1000F00D00020CDE902100720CDE97E -:10D460000009BDF834000493401E83B2218B0022D2 -:10D47000159800F0EDFC8DF81C000B203070BDF805 -:10D48000140020E09DF81C2001214FF00C0A002A16 -:10D4900022D113ABB9F1000F00D00020CDE902106A -:10D4A0000720CDE900090493BDF83400228C401E0A -:10D4B00083B2218B159800F0CBFC8DF81C000D2059 -:10D4C0003070BDF84C00401CADF8340005208DF8DC -:10D4D0003800208BADF83C00BBE000E028E0388845 -:10D4E000218B88427FF450AF9DF81C004FF0120A48 -:10D4F00000281AD1606A98B1B878C0073FF444AFE9 -:10D50000BA680720CDE902B2CDF804B00090CDF89A -:10D5100010B0FB88BA88159800F070FA8DF81C00DE -:10D52000132030700120ADF8340092E0500000204C -:10D530003988208B8142D5D19DF81C004FF0160A06 -:10D540000028A06B08D0E0B34FF6FF7000215F46C3 -:10D55000ADF808B0019027E068B1B978C907C1D12A -:10D56000E18F0DAB0844821D03968DE80C024388C1 -:10D570008288018809E0B878C007BFD0BA680DABCF -:10D5800003968DE80C02BB88FA881598FFF7E9F935 -:10D5900005005ED0072D72D076E0019005AA02A9A1 -:10D5A0002046FFF71FF90146E28FBDF808008242CE -:10D5B00001D00029F1D0E08FA16B084407800198C9 -:10D5C000E08746E09DF81C004FF0180A40B1208B20 -:10D5D000C8B13888208321461598FFF78CF938E0C8 -:10D5E00004F118000090237E012221461598FFF7D0 -:10D5F0009AF98DF81C000028EDD119203070012017 -:10D60000ADF83400E7E7052521461598FFF773F9D3 -:10D610003AE0208800F40070ADF8200050452DD18C -:10D62000A08FA0F57F41FE3901D006252CE0D8F867 -:10D6300008004FF0160A48B1A063B8F80C10A18793 -:10D640004FF6FF71E187A0F800B002E04FF6FF70DF -:10D65000A087BDF8200030F47F611AD07823002223 -:10D660000420159906F006FD98F800002071208826 -:10D67000BDF82010084320800EE000E00725208838 -:10D68000BDF8201088432080208810F47F6F1CD0C4 -:10D690003AE02188814321809DF8380020B10EA90D -:10D6A0001598F9F701FD05469DF81C000028EBD000 -:10D6B00086F801A001203070208B70809DF81C003E -:10D6C00030710520ADF83400DEE7A18EE1B1189885 -:10D6D0000DAB0088ADF834002398CDE90304CDE903 -:10D6E0000139206B0090E36A179A1598FFF7F2F959 -:10D6F000054601208DF838000EA91598F9F7D4FCDD -:10D7000000B10546A4F834B094F8460040070AD5A5 -:10D710002046FFF796F910F0760F04D114F8460F63 -:10D7200020F0040020701898BDF8341001802846BD -:10D730009EE500B585B0042806D102208DF80000D2 -:10D7400088B26946F9F7B0FC05B000BD10B5384C99 -:10D750000B782268012B02D0022B2AD111E013781A -:10D760000BB1052B01D10423137023688A889A809A -:10D770002268CB88D38022680B8913814989518123 -:10D780000DE08B8893802268CB88D38022680B8938 -:10D7900013814B8953818B899381096911612168B8 -:10D7A000F9F782FC226800210228117003D00028BA -:10D7B00000D0812010BD832010BD806B002800D0D8 -:10D7C000012070478178012909D10088B0F5205FD8 -:10D7D00003D042F60101884201D1002070470720A2 -:10D7E0007047F0B587B0002415460E460746ADF8E1 -:10D7F000144010E0069801882980811DCDE902417E -:10D800000721019404940091838842880188384656 -:10D8100000F0F4F830B906AA05A93046FEF7E2FF99 -:10D820000028E7D0822800D1002007B0F0BD00001A -:10D830005000002010B58B7883B102789A4205D150 -:10D840000B885BB102E08B79091D4BB18B789A4252 -:10D85000F9D1B0F801300C88A342F4D1002010BDFA -:10D86000812010BD072826D012B1012A27D103E05C -:10D87000497801F0070102E04978C1F3C2010529A6 -:10D880001DD2DFE801F00318080C12000AB10320D2 -:10D8900070470220704704280DD250B10DE00528D2 -:10D8A00009D2801E022808D303E0062803D00328EB -:10D8B00003D005207047002070470F20704781205B -:10D8C0007047C0B282060BD4000607D5FE48807AA6 -:10D8D0004143C01D01EBD00080B27047084670473D -:10D8E0000020704770B513880B800B781C0625D577 -:10D8F000F54CA47A844204D843F01000087000204C -:10D9000070BD956800F0070605EBD0052D78F54051 -:10D9100065F304130B701378D17803F0030341EA25 -:10D92000032140F20123B1FBF3F503FB15119268CB -:10D93000E41D00FB012000EBD40070BD906870BDB9 -:10D9400037B51446BDF8041011809DF804100A067E -:10D950001ED5C1F30013DC49A568897A814208D835 -:10D96000FE2811D1C91DC9085A422846F5F73FFBC8 -:10D970000AE005EBD00100F0070201250878954088 -:10D98000A843934018430870207820F010002070BE -:10D990003EBD2DE9F0410746C81C0E4620F00300AD -:10D9A000B04202D08620BDE8F081C74D0020344649 -:10D9B0002E60AF802881AA72E8801AE0E988491CAD -:10D9C000E980810614D4E17800F0030041EA0020E8 -:10D9D00040F20121B0FBF1F201FB12012068FFF7D8 -:10D9E00070FF2989084480B22881381A3044A06029 -:10D9F0000C3420784107E1D40020D4E72DE9FF4F13 -:10DA000089B01646DDE9168A0F46994623F440454B -:10DA1000084600F00DFB04000FD0099802F0E6FF65 -:10DA20000290207800060AD5A748817A02988142A0 -:10DA300005D887200DB0BDE8F08F0120FAE7224617 -:10DA400001A90298FFF74EFF834600208DF80C00D5 -:10DA50004046B8F1070F1AD001222146FFF702FF16 -:10DA60000028E7D12078400611D502208DF80C005F -:10DA7000ADF81070BDF80400ADF81200ADF81460F8 -:10DA80001898ADF81650CDF81CA0ADF818005FEA54 -:10DA9000094004D500252E46A84601270CE0217830 -:10DAA000E07801F0030140EA012040F20121B0FBDF -:10DAB000F1F2804601FB12875FEA494009D5B8457B -:10DAC00007D1A178207901F0030140EA0120B0429A -:10DAD00001D3BE4201D90720ACE7A8191FFA80F98B -:10DAE000B94501D90D20A5E79DF80C0028B103A97F -:10DAF0000998F9F7D7FA00289CD1B84507D1A07842 -:10DB00004FEA192161F30100A07084F804901A987B -:10DB100000B10580199850EA0A0027D0199830B151 -:10DB20000BEB06002A46199913F0E6FF0EE00BEB0B -:10DB300006085746189E099803F09AF82B46F61DDA -:10DB4000B5B239464246009502F031FC224601A9A1 -:10DB50000298FFF7C7FE9DF80400224620F010004F -:10DB60008DF80400DDE90110FFF7EAFE002061E70F -:10DB70002DE9FF4FDFF8509182461746B9F806109D -:10DB8000D9F8000001EB410100EB810440F20120D3 -:10DB9000B2FBF0F185B000FB11764D46DDF84C800C -:10DBA00031460698FFF78DFE29682A898B46611A4F -:10DBB0000C3101441144AB8889B28B4202D88420D5 -:10DBC00009B038E70699CDB2290603D5A90601D5D3 -:10DBD0008520F5E7B9F806C00CF1010C1FFA8CFCA2 -:10DBE000A9F806C0149909B1A1F800C0A90602D588 -:10DBF000C4F8088007E0104480B2A9F80800191A98 -:10DC000001EB0B00A0602246FE200699FFF798FE6C -:10DC1000E77026712078390A61F30100320AA17891 -:10DC200040F0040062F30101A17020709AF8020034 -:10DC30006071BAF80000E08000262673280602D53D -:10DC400099F80A7000E00127A80601D54FF00008F6 -:10DC50004D4600244FF007090FE0CDE90268019618 -:10DC6000CDF800900496E9882046129B089AFFF7A9 -:10DC7000C5FE0028A4D1641CE4B2BC42EDD3002050 -:10DC80009EE72DE9F047804600F0D2F9070005D065 -:10DC9000002644460C4D40F2012919E00120BDE860 -:10DCA000F087204600F0C4F90278C17802F0030240 -:10DCB00041EA0222B2FBF9F309FB13210068FFF7E6 -:10DCC00000FE304486B201E0BC060020641CA4B211 -:10DCD000E988601E8142E4DCA8F10100E88028891F -:10DCE000801B288100203870D9E710B5144631B167 -:10DCF000491E218002F07AFEA070002010BD012094 -:10DD000010BD10B5D24904460088CA88904201D39C -:10DD1000822010BD096800EB400001EB80025079C1 -:10DD2000A072D08820819178107901F0030140EA37 -:10DD30000120A081A078E11CFFF7D4FD206120889C -:10DD4000401C2080E080002010BD0121018270472E -:10DD50002DE9FF4F85B04FF6FF788246A3F800808B -:10DD600048681F460D4680788DF806004868008890 -:10DD7000ADF8040000208DF80A00088A0C88A04243 -:10DD800000D304462C8241E0288A401C2882701D62 -:10DD90006968FFF74FFDB8BB3988414501D1601E66 -:10DDA00038806888A04236D3B178307901F0030119 -:10DDB00040EA012901A9701DFFF73CFD20BB29891C -:10DDC00041452CD0002231460798FFF74BFDD8B9CA -:10DDD0002989494518D1E9680391B5F80AC0D6F8F0 -:10DDE00008B05046CDF800C002F042FFDDF800C098 -:10DDF0005A460CF1070C1FFA8CFC4B460399CDF8E0 -:10DE000000C002F097FA50B1641CA4B2204600F0A2 -:10DE10000FF90600B8D1641E2C828220D0E67C80E7 -:10DE20007079B871F088B8803178F07801F003012A -:10DE300040EA01207881A7F80C90504602F0D6FD08 -:10DE4000324607F10801FFF74DFD38610020B7E6C3 -:10DE50002DE9FF4F87B081461C469246DDF860B041 -:10DE6000DDF85480089800F0E3F805000CD048462F -:10DE700002F0BCFD2978090608D57549897A8142E6 -:10DE800004D887200BB0D6E50120FBE7CAF30906CA -:10DE90002A4601A9FFF726FD0746149807281CD03B -:10DEA00000222946FFF7DEFC0028EBD12878400647 -:10DEB00013D501208DF808000898ADF80C00BDF8C6 -:10DEC0000400ADF80E00ADF81060ADF8124002A9E4 -:10DED0004846F9F7E7F80028D4D12978E87801F026 -:10DEE000030140EA0121AA78287902F0030240EAFE -:10DEF0000220564507D0B1F5007F04D9611E81424A -:10DF000001DD0B20BEE7864201D90720BAE7801B5E -:10DF100085B2A54200D92546BBF1000F01D0ABF870 -:10DF20000050179818B1B9192A4613F0E5FDB8F159 -:10DF3000000F0DD03E4448464446169F02F0AAFE0C -:10DF40002146FF1DBCB232462B46009402F068FA0F -:10DF5000002097E72DE9F04107461D461646084682 -:10DF600000F066F804000BD0384602F03FFD21783F -:10DF7000090607D53649897A814203D8872012E5F8 -:10DF8000012010E522463146FFF7ACFC65B121784F -:10DF9000E07801F0030140EA0120B0F5007F01D8EC -:10DFA000012000E0002028700020FCE42DE9F04171 -:10DFB00007461D461646084600F03AF804000BD006 -:10DFC000384602F013FD2178090607D52049897AE1 -:10DFD000814203D88720E6E40120E4E4224631466A -:10DFE000FFF7AEFCFF2D14D02178E07801F003029A -:10DFF00040EA022040F20122B0FBF2F302FB1300E0 -:10E0000015B900F2012080B2E070000A60F301014E -:10E0100021700020C7E410B50C4600F009F828B1C3 -:10E02000C18821804079A070002010BD012010BD62 -:10E030000749CA88824209D340B1096800EB400011 -:10E040006FF00B0202EB800008447047002070471D -:10E05000BC06002010B50C4601F03AFD80B3204606 -:10E0600000F0B7FA68B32278102A09D0112A07D035 -:10E07000022A05D0032A03D0162A2ED0FFDF1DE086 -:10E08000A0781E282BD00EDC0C2824D008DC092810 -:10E0900027D2DFE800F013261726261E1E1A1C00C2 -:10E0A00012281ED11BE0302819D01ADDA0F13A0049 -:10E0B000032816D2DFE800F011150B00002010BD78 -:10E0C00013E010E043F20200F9E70420F7E70D2027 -:10E0D000F5E70F20F3E70820F1E71120EFE707202D -:10E0E000EDE70320EBE7FFDFE8E7FFDFE6E700F01F -:10E0F00070BA70B50346002002466FF02F050EE09F -:10E100009C5CA4F130060A2E02D34FF0FF3070BDA4 -:10E1100000EB800005EB4000521C2044D2B28A4242 -:10E12000EED370BD30B50A240AE0B0FBF4F304FB73 -:10E1300013008D18303005F8010C521E1846D2B26B -:10E14000002AF2D130BD30B500234FF6FF7510E044 -:10E15000040A44EA002084B2C85C6040C0F303149F -:10E16000604005EA00344440E0B25B1C84EA4010A1 -:10E170009BB29342ECD330BD10B50AF0FFF90428EE -:10E1800003D00AF0FBF9052802D108F0A0FC28B959 -:10E190000BF056FB20B107F047FB08B1012010BD82 -:10E1A000002010BD0178406819B190F8721059B97B -:10E1B00001E001F017BD90F8041129B190F80401B5 -:10E1C000042801D0012070470020704770B50C462C -:10E1D0000546062102F042FC606008B1002006E01E -:10E1E0000721284602F03AFC606018B10120207037 -:10E1F000002070BD022070BD2DE9FC470C4606468C -:10E200006946FFF7E3FF00287DD19DF8000050B17B -:10E2100007F09CFAB0427CD0214630460EF0A1F9BE -:10E22000002873D12DE008F065F9B04271D0214685 -:10E2300030460CF041FC002868D1019D95F8C800DB -:10E2400022E0012000E00020804695F835004FF0E4 -:10E25000010A4FF00009F0B195F8360080071AD591 -:10E2600084F8019084F800A084F80290A68095F8C4 -:10E270003710A171298F2181698F618185F83590CF -:10E2800044E0019D95F8040158350028DBD1A87EB3 -:10E290000028D8D0D5E7304602F0FCFC070000D1BA -:10E2A000FFDF384601F051FE40B184F801900E21A5 -:10E2B0002170A680E08084F802A027E0304602F0BA -:10E2C000D7FC070000D1FFDFB8F1000F21D038469E -:10E2D00001F0CCFEB8B19DF8000038B90198D0F833 -:10E2E000F0004188B14201D180F80090304607F03B -:10E2F000C3F884F801900B21217084F80290A68065 -:10E30000E97EA17100E004E085F81A900120BDE8E3 -:10E31000FC870020FBE71CB56946FFF757FF00B1FB -:10E32000FFDF684601F06CFCF94900208968A1F81C -:10E33000CA001CBD2DE9FC4104460E46062002F031 -:10E3400037FB0546072002F033FB2844C7B20025FF -:10E35000A8463E4417E02088401C80B22080B0428E -:10E3600002D34046A4F8008080B2B84204D3B04241 -:10E3700002D20020BDE8FC816946FFF727FF002894 -:10E38000F8D06D1CEDB2AE42E5D84FF6FF7020809C -:10E390001220EFE738B54FF6FF70ADF800000DE042 -:10E3A0000621BDF8000002F06BFB04460721BDF812 -:10E3B000000002F065FB0CB100B1FFDF00216846F0 -:10E3C000FFF7B8FF0028EBD038BD2DE9F047D1A109 -:10E3D0000F79D1F8008007F0BDF810F003F8CF4CAA -:10E3E0004FF004091020A4F8389060874FF6FF76AC -:10E3F000A4F85460A4F85660002584F8315004F85D -:10E400002E5BC6492570A5713E39A573C1F87B8086 -:10E4100081F87F707B31481E0CF029FD25751B208B -:10E42000E0824FF4A47121836083A1830321A1774B -:10E4300084F81F9020846084B848A1843E38057019 -:10E440004680B3480C300570B448103805704680DB -:10E45000BDE8F08770B5AE4C0D466060217006F0E7 -:10E46000F3FFFFF797FFFFF7B0FF207809F031FDCA -:10E4700008F02EF9217860680CF00CFC20780FF081 -:10E4800011FA28460AF071FE07F06AF921786068EF -:10E490000EF068F9BDE870400FF0A4BF10B501247C -:10E4A0000AB1002010BD21B1012903D0002420466B -:10E4B00010BD022111F0C6FBF9E72DE9F047040079 -:10E4C00000D1FFDF954D002695F8310058B16670F8 -:10E4D0001620207095F83200A07095F83300E07097 -:10E4E00085F8316068E0287840B12C22A91C2046CC -:10E4F00013F002FB102020702E705DE095F82E00C6 -:10E5000060B10120E07095F82F00A07095F8300000 -:10E5100060701120207085F82E604DE07F48022148 -:10E5200056308246FFF706FF00B1FFDFB5F8569080 -:10E53000062002F03DFA0746072002F039FA384477 -:10E54000C7B2781C00F0FF08B5F85600B84212D1E7 -:10E55000204607F04BFF50BB95F8340070B366704F -:10E56000132020702021A01C13F03DFB0220A0707E -:10E5700085F8346020E040451AD1204607F09CF829 -:10E58000E0B12078132817D1A0783C2814D1A088B6 -:10E59000072102F063FA050000D1FFDF288806F0AA -:10E5A0006BFFA088072102F06BFA00B1FFDF03E0E8 -:10E5B0002146FFF721FE08B1012049E7022150461C -:10E5C000FFF7B8FE18B9B5F856104945BCD1002080 -:10E5D0003EE772E710B5514C207828B10A21BDE81A -:10E5E0001040102001F0A1BAFFF7C6FD08B10C20C1 -:10E5F00002E00FF042FF00202071012060710A212B -:10E60000E170207010BD70B5444D0446287828B1E3 -:10E61000BDE870403221102001F087BA207818B18F -:10E62000012801D0122010E001F090FA20B110F082 -:10E630006EF808B10C2008E0207801F057FA04F1D8 -:10E640001703E21D611C0FF06FFF28710120687134 -:10E650003221E970287070BD70B5304C05462078C5 -:10E6600028B1BDE870400B21102001F05EBA287877 -:10E6700018B1012801D012200EE0FFF77DFD08B18E -:10E680000C2009E0287801F031FA691C0FF0BCFE7B -:10E6900008B1002000E007202071012060710B21EB -:10E6A000E170207070BD10B51C4C217829B130216B -:10E6B000BDE81040102001F038BA008810F02AF8A8 -:10E6C000302110B10020207100E021710120607123 -:10E6D000E170207010BD70B5104C0546207828B14F -:10E6E000BDE870403121102001F01FBA01F02EFA70 -:10E6F00008B10C2005E0287800F0010010F004F8C3 -:10E7000000202071012060713121E170207070BD06 -:10E7100058000020FFFFFFFF1F0000000607002039 -:10E7200010B5FB4C207828B13421BDE810401020F2 -:10E7300001F0FBB901F00AFA20B10FF0E8FF08B1CF -:10E740000C2002E00FF044FF0020207101206071D6 -:10E750003421E170207010BDED48017819B10F210E -:10E76000102001F0E2B900210171102181700F2108 -:10E77000C170FF2181714FF6FF710181E549496840 -:10E780000A7882728A8882814988C1810121417117 -:10E790000170704710B5DE4C207828B12B21BDE800 -:10E7A0001040102001F0C1B90821A01D05F029FA80 -:10E7B00000202071012060712B21E170207010BDBC -:10E7C00070B5D34C217829B1BDE8704043211020A9 -:10E7D00001F0ABB990F90000042816D0032814D03A -:10E7E00098B1011D11D010F1080F0ED010F10C0FCF -:10E7F0000BD010F1100F08D010F1140F05D010F14C -:10E80000280F02D01220207103E0002506F020F826 -:10E8100025714320E07001206071207077E710B50A -:10E82000BB4C217829B12A21BDE81040102001F00D -:10E830007CB9A31D012200F1100110F03AFE002066 -:10E8400020711020A0702A20E070012060712070DB -:10E8500010BD70B5AE4C0546207828B1BDE87040BB -:10E860004621102001F061B909F088FE052804D086 -:10E87000284609F01BFB002000E00C20207101203D -:10E8800060714621E170207041E770B5A04C0546EB -:10E89000207828B1BDE870404421102001F045B92E -:10E8A00001F054F938B10C2020710120607144212D -:10E8B000E17020702BE72946002006F04CFE002076 -:10E8C000F2E770B5924C0546207828B1BDE870405B -:10E8D0004221102001F029B909F091FB50B10AF052 -:10E8E000A2FF38B128780AF064FC287808F026F9ED -:10E8F000002000E00C202071012060714221E170B5 -:10E90000207004E770B5824C0546207828B1BDE838 -:10E9100070401721102001F008B901F017F938B143 -:10E920000C202071012060711721E1702070EEE64B -:10E930002946012006F00FFE0020F2E738B5744D9D -:10E940000446287828B1BDE838404D21102001F058 -:10E95000ECB8A079E179884213D021791F2910D829 -:10E9600061791F290DD80022114612F0C7FA40B96B -:10E970000022E079114612F0C1FA10B9207A072876 -:10E9800001D9122012E04FF6FF70ADF800000AF036 -:10E9900057FF90B909F0F2FD78B900216846FFF7FA -:10E9A000C9FC50B1204605F070FE002028710120FE -:10E9B00068714D21E970287038BD0C20F6E72DE90B -:10E9C000FC47534C054694F82E0020B12821112015 -:10E9D00001F0ABF89BE4282084F83000012184F892 -:10E9E0002E10A8784FF000091A2825D00EDC162822 -:10E9F00031D2DFE800F0303030303021303030308C -:10EA00003030303030303030302121212A2822D0AF -:10EA10000BDCA0F11E000C281DD2DFE800F01C1C4E -:10EA20001C1C1C1C1C1C1C1C1C0D3A38042812D25B -:10EA3000DFE800F0110211022888B0F5706F0AD2E9 -:10EA40001F20884684F82F0028886946FFF7BEFB00 -:10EA500018B1022019E0122017E09DF80000019F74 -:10EA6000002806D007F5B377019E05D106F1ED0623 -:10EA700004E007F1EC07F7E706F267166846FFF7D0 -:10EA800091FB08B1387818B10C2084F82F003EE4CF -:10EA900087F80080A878307084F82F90684601F0DD -:10EAA000AFF834E47CB51A4C0546207820B1252116 -:10EAB000102001F03AF87CBD28886946FFF786FBF4 -:10EAC000020013484FF00001A0F13E000DD00222D9 -:10EAD000227140F8461F0171E1801020A0702520AE -:10EAE000E0700120607120707CBD019A134658329D -:10EAF00082F83E109E68C0F846601E7B80F84A602F -:10EB000092F83E60002EF3D12888E080E5E700000F -:10EB1000060700205800002010B540B10478406876 -:10EB200013B1B0F8480003E0B0F84A0000E0FB2061 -:10EB30001B2908D3814206D8B2F5A47F03D340F63F -:10EB40004800824201D9122010BD002010BD2DE9DD -:10EB5000FC41FA4D0446287828B1BDE8FC4150211B -:10EB6000102000F0E2BF4FF0010885F805801F215A -:10EB700029711021A9705021E9702188E98085F858 -:10EB8000008020886946FFF721FB08B102200DE0D4 -:10EB90002289E18801236846FFF7BEFF30B9A288C9 -:10EBA000618800236846FFF7B7FF10B12871BDE800 -:10EBB000FC819DF800103A20019E002749B186F89B -:10EBC0008981019991F8C81106F5C476B9B1287107 -:10EBD00013E086F8FD80019991F82011FC36002998 -:10EBE000F5D12F71E08870802089B0806088F08036 -:10EBF000A0883081012201990CE07770D7E72F714E -:10EC0000E08870802089B0806088F080A0883081A2 -:10EC100001990022304610F091FD86F80080ECE763 -:10EC200070B5C64D044686B0287830B106B0512183 -:10EC3000BDE87040102000F078BF01206871002608 -:10EC40002E711021A9705121E9702870208803A924 -:10EC5000FFF7BCFA18B10220287106B057E59DF8FD -:10EC60000C0040B100220499E088B1F84830984285 -:10EC700003D9C01A02E00122F5E70020E88063888A -:10EC8000B1F84A00834201D9181A00E00020288117 -:10EC9000009601960296E088ADF802002089ADF852 -:10ECA00004006088ADF80600A088ADF8080068464A -:10ECB00010F044FD2089BDF80410401A6881A08836 -:10ECC000BDF80810401AA881E088BDF80210401A6B -:10ECD000E988884200DC0846E8806088BDF80610B4 -:10ECE000401A2989884200DC08462881B5E770B5BA -:10ECF000924D0446287828B1BDE870403E2110208E -:10ED000000F013BF00F022FF20B10FF000FD08B1AA -:10ED10000C2008E0E2792078611C0FF07BFE08B13E -:10ED2000002000E002202871012068713E21E97076 -:10ED30002870ECE47CB5814C05461F2084F82F0038 -:10ED400028886946FFF742FA18B1022084F82F009C -:10ED50007CBDAA7802B90322EB7803B903239DF89E -:10ED600000603A2501210020002E019E06D086F881 -:10ED70009311019E96F8DC6146BB1FE086F80711EF -:10ED8000019E96F82C613EB9019E96F806611EB967 -:10ED9000019E96F87B6016B184F82F500AE0019D21 -:10EDA00085F80611019981F80821019981F8093146 -:10EDB00084F82F00019981F807017CBD019E96F827 -:10EDC00092611EB9019E96F87B6016B184F82F50AF -:10EDD0000AE0019D85F89211019981F89421019929 -:10EDE00081F8953184F82F00019981F893017CBD59 -:10EDF000524930B491F82E2022B1562130BC112056 -:10EE000000F093BE562281F83020012281F82E2096 -:10EE10008378DA0802D1C278D40801D0122004E045 -:10EE20005B0701D4520704D5112081F82F0030BCB4 -:10EE3000704730BC7EE770B5404C0546207828B15D -:10EE4000BDE870401D21102000F06FBE1F20207112 -:10EE5000012060711D21E170207009F08FFB0428F2 -:10EE60000BD0052809D0A9791220012907D031B18A -:10EE7000022904D0032929D101E00C2026E02978B9 -:10EE800009B1012922D1E97929B1012903D0022947 -:10EE900001D003291AD1698843F6FD720B1F302077 -:10EEA000934213D2AB881B1F93420FD22187A888AD -:10EEB0006087A87907F065FDE87907F0D0FD28782C -:10EEC000012805D00120002107F0F8FD20711EE483 -:10EED0000220F8E770B5194C217829B1BDE87040DF -:10EEE0001E21102000F021BE1F212171012161711E -:10EEF0001E22E270217002781221012A00D01AB974 -:10EF0000407818B1012801D0217187E40025012A39 -:10EF100009D009F033FB0C26052802D008F008FFC1 -:10EF200088B126717AE407F022FD48B107F031FD7F -:10EF3000618F208F09F070F803E0000006070020C1 -:10EF4000122020716AE4257168E42DE9F047F94C3C -:10EF500007469246B4F84400B7F84A200E4690425D -:10EF600000D31046804697F85210104600F0D4FDAA -:10EF7000B4F84610814200D208460546A146B4F8CE -:10EF80004840B7F84800844200D3044697F851102F -:10EF900000F0C2FDB9F84A10814200D208464FF491 -:10EFA000A4721B2C01D0904204D1B8F11B0F0DD0DC -:10EFB00095420BD0A6F8068035817480B080524609 -:10EFC0003946304610F0BAFB01203070BDE8F087BA -:10EFD0002DE9F04786B00546AFF6C800D0E90090AD -:10EFE000D44E804696F82E0028B12121112000F041 -:10EFF0009CFD06B0EAE71F2086F82F00212086F846 -:10F0000030004FF0010A86F82EA0284600F007FED7 -:10F01000002811D109F0B2FA05280CD009F0AEFA97 -:10F02000042808D096F8340028B907F063FAA0F550 -:10F030007F41FF3901D00C20AAE0BE4801AA3E382A -:10F040000190BD480290BB4806211038039004A8E7 -:10F0500001F0D4FC04007DD003210FF0DAFFB6F8F4 -:10F060004E00A4F84800B6F85000A4F84A0096F8FC -:10F070004D00009096F84C30B6F85020B6F84E107F -:10F08000208801F07EFD00B1FFDF208806F0F3F953 -:10F09000218804F10E0000F068FDA8A004F1120719 -:10F0A000006800900321684604F033FD00206946A3 -:10F0B0000A5C3A54401CC0B20328F9D3288A608005 -:10F0C000688AA080A88AE08094F8522094F85110B1 -:10F0D000B6F8520009F01DF80146A062204609F07A -:10F0E00038F8002784F85E7084F85F70687900F063 -:10F0F000FDFC6076D5F80600C4F81A006889E08344 -:10F10000C4F8089084F80C8084F8F8A0012204F177 -:10F11000FC012046FFF719FF8DF8007001216846B9 -:10F1200004F0F7FC9DF8000000F00701C0F3C102F5 -:10F130001144C0F3401008448DF80000401D2076B3 -:10F14000092801D208302076002120460FF061FF07 -:10F15000287B00E010E007F014FC69792879AA1DEB -:10F1600007F0E5FB50B107F014FC69792879AA1D76 -:10F1700007F080FC78B118E0092009E0208806F04B -:10F180007BF92088062101F07BFC00B1FFDF122013 -:10F1900086F82F002DE72146032007F08FFC20B9C9 -:10F1A0006A882988204608F0C0FE86F82F000028CB -:10F1B000F0D0208806F060F92088062101F060FC7C -:10F1C0000028E7D0FFDF14E738B55A4C207820B18B -:10F1D0002221102000F0A9FC38BD1F20207101253C -:10F1E00065712220E070257094F8340018BB09F096 -:10F1F000C5F9052805D007F07DF9A0F57F41FF3955 -:10F2000019D000202071684608F055FF0028E3D18E -:10F210000098008806F030F900980621008801F077 -:10F220002FFC00B1FFDF444884F834500C380078DC -:10F23000FCF760FD38BD0C20207138BD2DE9F04190 -:10F240003C4D044695F82E0028B1BDE8F04123213D -:10F25000112000F06ABC1F2085F82F00232085F8BC -:10F260003000012085F82E00618840F67B438A1F1C -:10F2700030209A4252D2A288961F9E424ED291428C -:10F280004CD8E188B1F5FA7F48D2218940F677461B -:10F29000A1F10A03B34241D2B1EBD20F3ED9618949 -:10F2A000A28991423AD84FF000082088062101F047 -:10F2B000D5FB06004FF0020707D000F093FC20B109 -:10F2C000D6F8F000017841B903E085F82F70BDE869 -:10F2D000F081D6F83C11097809B13A201EE00521E9 -:10F2E0008171D6F8F0004146A0F80880D6F8F020E9 -:10F2F000A0885081D6F8F020E0889081D6F8F020E0 -:10F300002089D081D6F8F000028943899A4204D836 -:10F310008279082A01D89A4203D3122085F82F0057 -:10F32000D5E722884280D6F8F000077085F82F10C4 -:10F33000CDE7000006070020640000201122330002 -:10F34000FEB5F84C0646207820B12421102000F0AC -:10F35000ECFBFEBD012565712420E0702570304670 -:10F3600010F042F808B1002000E0122020710028BF -:10F37000EFD1EC4884F83C503E38316840F87B1FB0 -:10F3800031790171002684F83C606946062001F05D -:10F39000F0FA00B1FFDF684601F0C9FA60B9BDF8C4 -:10F3A0000470029880F8F850684601F0C0FA18B965 -:10F3B000BDF80400B842F4D12671FEBD2DE9F0413C -:10F3C000D84D064695F82E0028B1BDE8F0412C2115 -:10F3D000112000F0AABB1F2085F82F002C2085F8F3 -:10F3E0003000012085F82E003088062101F036FB20 -:10F3F000040007D000F0F6FB20B1D4F8F010087834 -:10F4000030B901E0022026E0D4F83C01007808B1D0 -:10F410003A2020E094200027005D10F0010F19D061 -:10F42000D6F802004860D6F80600886054F8F00F5D -:10F43000718910228181206806F10C010E3012F0D2 -:10F440005BFB21680320087021683088488085F8BC -:10F450002F703CE70C2085F82F0038E72DE9F041AC -:10F46000B04D04460C26287828B1BDE8F04118219B -:10F47000102000F05ABB0AF0E3F9012730BB607995 -:10F48000032824D8A179012921D8A17B03291ED8DA -:10F49000617BE1B107291AD82179052917D2DFE864 -:10F4A00001F0030C030303002288202A0FD3618894 -:10F4B0008A420CD8B1F5804F09D806F0D6F92079E8 -:10F4C00085F83600204606F098FA064600E0122637 -:10F4D0002E716F711820E8702F70F8E610B5914CFE -:10F4E000217829B11A21BDE81040102000F01DBB81 -:10F4F00001781F2902D91220207106E00021217114 -:10F500000278411C104606F0FCFA012060711A21B5 -:10F51000E170207010BD10B5824C217829B12021F6 -:10F52000BDE81040102000F000BB01781F2902D96F -:10F530001220207106E0002121710278411C104642 -:10F5400006F0CEFA012060712021E170207010BD1C -:10F550002DE9FC41734C217829B1BDE8FC411B2108 -:10F56000102000F0E2BA012767710C2121710078A8 -:10F5700000261225012802D0002866D167E006F097 -:10F5800024F900285ED006F056F900285AD00AF077 -:10F5900057F900286CD106F06FF994F8360050B195 -:10F5A000012808D0042806D0002009F005FE00B18B -:10F5B000FFDF26715CE006F0C9F8A0F57F41FF3956 -:10F5C00056D10022072101A801F018FA05004FD0FA -:10F5D00055480321856028460FF0E2FB284606F0D7 -:10F5E000BAFBB4F84E00A5F84800B4F85000A5F8EE -:10F5F0004A00B4F8520001214C3409F016FF0146CC -:10F60000A8620022284608F0CEFF6078009014F827 -:10F61000043B288834F8022934F84E1901F0B1FA75 -:10F6200000B1FFDF288805F026FF284609F0C4FD59 -:10F6300000B1FFDF2671002205F5C4712846FFF7EF -:10F6400084FC15E006F0C1F890B1257110E008F0D7 -:10F65000A7FF054609F0E8FC50B9267145B1288896 -:10F6600005F00AFF2888072101F00AFA00B1FFDF40 -:10F670001B20E0702770BDE8FC812DE9F041294C8A -:10F680000646207828B1BDE8F0412D21102000F079 -:10F690004CBA3088072101F0E1F905004FF001076D -:10F6A00020D095F8690140B995F86400142801D07C -:10F6B000152802D195F8AA0150B10C202071102014 -:10F6C000A0702D20E0703088E08067712770FEE523 -:10F6D0001022B11C05F5B57012F00EFA85F86971AB -:10F6E0000020EBE70220E9E770B50E4C05462078D4 -:10F6F00028B1BDE870402E21102000F016BA2888ED -:10F70000072101F0ABF90221A0B190F869212AB9D3 -:10F7100090F86420142A09D0152A07D00C202071F3 -:10F7200009E00000060700205800002080F8691159 -:10F730000020F4E721711020A0702E20E0702888AE -:10F74000E08001206071207070BD2DE9FC47FD4C08 -:10F750000646207828B13821102000F0E6F9BDE8EF -:10F76000FC8770884BF68032122190420AD848B14B -:10F770004FF0000830886946FEF728FD20B10220CE -:10F78000207110E021710EE0019800F15809851CEC -:10F790002F887288394648460FF0BCFA2888B8424C -:10F7A000F6D184F80480012060713821E170207066 -:10F7B000D5E77CB5E34C0546207820B149211020DF -:10F7C00000F0B3F97CBD28886946FEF7FFFC38B12C -:10F7D00002202071012060714921E17020707CBD00 -:10F7E00001987F22014680F8602080F86120002285 -:10F7F00080F86220A87801F82C0FE8784870287902 -:10F8000088702271E6E71CB5CE4C217821B15421D5 -:10F81000102000F08AF91CBD00886946FEF7D6FC6E -:10F8200048B102202071012060715421E170102143 -:10F83000A17020701CBD019890F8720000B10120E9 -:10F8400000212171A071EEE71CB5BE4C217821B1D9 -:10F850001321102000F069F91CBD00886946FEF7ED -:10F86000B5FC08B1022005E0019890F82C100129A0 -:10F8700002D00C20207106E0602100222271095C78 -:10F8800021720088E080012060711321E170102155 -:10F89000A17020701CBD2DE9F041AA4C05462078CE -:10F8A00028B1BDE8F0414A21102000F03EB9288877 -:10F8B000072101F0D3F8012358B382886D88C688E8 -:10F8C000418803EB4207BD4217D342F210777E43D3 -:10F8D000BF107943B6FBF1F1491E89B24FF4FA76B5 -:10F8E000B14200D931468D4200D22946491C521CF2 -:10F8F000B1FBF2F15143491E8AB290F8961101B959 -:10F900000284E2800020207163714A20E07023703D -:10F91000DDE40220F7E770B58A4C0546207828B16F -:10F92000BDE870404C21102000F0FFB82888072166 -:10F9300001F094F890B1A97811F0010180F8D71086 -:10F9400004D090F8D51009B109F08AFD002020718B -:10F95000012060714C21E170207070BD0220F6E73B -:10F9600078490A781AB15221102000F0DEB80278E6 -:10F970009AB142788AB142881B2A0ED382881B2A08 -:10F980000BD3C288022A08D36E4A0368423242F877 -:10F990000A3F40685060002000E0122008710120FA -:10F9A00048715222CA700870704770B5654C0546A0 -:10F9B000207828B1BDE870405321102000F0B5B880 -:10F9C000287800F0010008F0A1FB287800F0010081 -:10F9D00009F0F7FC00202071012060715321E170D3 -:10F9E000207070BD70B5574D0646287828B1BDE827 -:10F9F00070405521102000F098B8012270881146FF -:10FA000008F087FB04467088012109F00EFD84424E -:10FA100000D204463088012100F06FF8064601212B -:10FA2000002000F06AF8304401219630844206D963 -:10FA300000F19601201AB0FBF1F0401C81B2E98080 -:10FA400000202871012068715521E970287070BD6F -:10FA500070B53C4D0446287828B1BDE870404E2171 -:10FA6000102000F062B800F071F808B10C200DE031 -:10FA7000601C0EF0A5FF207800F0010005F0F8FEF4 -:10FA8000207800F0010006F080FF0020287101209E -:10FA900068714E21E970287070BD70B5294C05461B -:10FAA000207828B1BDE870404B21102000F03DB80F -:10FAB00009F0C6FE08B10C2003E0287806F031F802 -:10FAC00000202071012060714B21E170207070BD19 -:10FAD00010B50178572907D21B4A52F8211019B1E5 -:10FAE000801C8847012010BD002010BD18B10228DD -:10FAF00001D0012070470020704710B5012904D0C3 -:10FB0000022905D0FFDF204610BDC000503001E0C3 -:10FB100080002C3084B2F6E7022903D0C000703098 -:10FB200080B2704780003C30FAE7064A92F83130E4 -:10FB3000002B06D182F8320082F83310012082F8BF -:10FB40003100704706070020C420020010B508F0FD -:10FB500015FD042807D008F011FD052803D009F091 -:10FB60006FFE002800D0012010BD2DE9FE430025C6 -:10FB70000F4680460A260421404604F042F84046DB -:10FB80000FF00EFC062000F013FF044615E0694656 -:10FB9000062000F0EEFE0AE0BDF80400B84206D0F0 -:10FBA0000298042241460E3011F07AFF50B16846A7 -:10FBB00000F0BDFE0500EFD0641E002C06DD002D18 -:10FBC000E5D005E040460FF0F4FBF5E705B9FFDFAF -:10FBD000D8F800000FF0A8F8761E01D00028CAD08F -:10FBE000BDE8FE8390F8721041B990F8C81029B1B1 -:10FBF00090F8C800042801D00120A2E70020A0E767 -:10FC0000017801299DD1416891F8D520002A98D02A -:10FC1000002281F8D520406809F022BC91E710B598 -:10FC2000038843F6FD711A1F8A4223D24288141FAB -:10FC30008C421FD29A421DD8C28940F67B43911F45 -:10FC4000994217D2018A8C1F9C4213D28A4211D842 -:10FC5000428AB2F5FA7F0DD2828A40F67744A2F149 -:10FC60000A03A34206D2B2EBD10F03D9C18A028B99 -:10FC7000914201D9302010BD017911B1012910D173 -:10FC800007E0417929B1012903D0022901D00329D4 -:10FC900007D1007B38B1012805D0022803D0032802 -:10FCA00001D0122010BD002010BD00000844083013 -:10FCB000424301F14A00104480B27047F0B51D463E -:10FCC0000446A818059B083000FB03F205F14A0022 -:10FCD000104486B2B14238BFFFDF0027276067605B -:10FCE000A760E76027616761A761E76127624FF658 -:10FCF000FF706762A082A6F1280080B265776080FD -:10FD0000B0F5004F88BFFFDF608805F13C018842F5 -:10FD100038BFFFDF6088401B3C3880B220801B2842 -:10FD200038BF1B202080A777F0BD816188617047B4 -:10FD30002DE9F04F0D46C188044600F128080089DE -:10FD400021F4004320F4004221F4004620F400474F -:10FD50004FF0010A4FF000099A4208D100F4004028 -:10FD600001F4004188421CBF0020BDE8F08FB7427B -:10FD70000BD9617FB81B401A083885421BDC08EBA1 -:10FD800006000021058041801EE06088617F801BA5 -:10FD9000401AB0F1080B0ED4BBF11B0FB8BFFFDF48 -:10FDA0005D45D4BF29461FFA8BF1681A0204120C74 -:10FDB00018BFBA4204DD84F817900020BDE8F08F28 -:10FDC00008EB06000180428084F817A0BDE8F08FA0 -:10FDD0002DE9F041044600F12802C08820F40043D8 -:10FDE000E07D002808BFBDE8F081D0180288438874 -:10FDF00013448B423CBF0020BDE8F08100279142B4 -:10FE00009CBF0180478013D9891A0D042D0C4580B1 -:10FE10000ED0E088A61D20F40040854288BFFFDF99 -:10FE200030884FF4004121EA0000284330800AE086 -:10FE3000627F008802F108031044083081B26288B2 -:10FE4000A01D00F0A8FBE7750120BDE8F08130B4EB -:10FE5000B0F804C0C488034600F128052CF4004023 -:10FE60002844A44503D10020188230BC7047B3F861 -:10FE70000CC00488A44509D34088ACEB040CA0EB6B -:10FE80000C0084B20CEB0500C01E06E0A4EB0C04D1 -:10FE90005D7FA4B2AC446044401DB1F800C0A445ED -:10FEA00088BF0C80B3F80CC0BCF1000F0CBF4FF042 -:10FEB000010C4FF0000C82F800C00988198230BC98 -:10FEC00070472DE9F041044600F12801808820F4B4 -:10FED00000404518208A002808BFBDE8F081A089AD -:10FEE00010B9A069807F2871A089218A084480B256 -:10FEF000A08129886A881144814238BFFFDF2888A1 -:10FF00006D88A2894119002791421AD175B1A08844 -:10FF1000261D20F40040A84238BFFFDF30884FF490 -:10FF2000004121EA00002843308009E0627F10444C -:10FF3000083081B202F108036288201D00F02BFB1B -:10FF4000A78127820120BDE8F0812DE9F047418992 -:10FF5000B0F804800027044600F1280A414518BF84 -:10FF60004FF400493AD000BF21F400405044468885 -:10FF70006EB1608904F10A0520F40040B04238BF38 -:10FF8000FFDF288829EA00003043288021E0637FD2 -:10FF9000008803F1080C18446389083023F40045F5 -:10FFA0006288284480B204F10A0190420BD2121AEE -:10FFB00092B20CF11B0C62452CBF03F4004229EAFB -:10FFC000030004D204E0801A80B229EA030210433D -:10FFD0000880781C618987B24145C5D13846BDE8A3 -:10FFE000F0872DE9F047B0F808800B46044600F191 -:10FFF0002801B0F80A90808828F4004C01EB0C0529 -:020000040001F9 -:10000000804504BF0020BDE8F087002A1CBF681DA2 -:10001000106023B1627F691D184611F06DFD2F88B5 -:100020006D888DB1E81987B2208904F1080620F4A3 -:100030000040A84238BFFFDF30884FF4004121EA7A -:100040000000284330800AE0607F6288C1190831CF -:1000500000F1080389B204F1080000F09CFAC845D9 -:1000600004BF208960813846BDE8F0878188C08858 -:1000700081420CBF012000207047018980888142A5 -:100080000CBF01200020704730B48488C28800F182 -:10009000280324F4004C22F40041634494421BD012 -:1000A0008289048A15191C885A88A3189D4216D380 -:1000B00012B18A4210D212E0437F0CF1080C1A19D7 -:1000C0006244408892B2801A80B22333984201D2AF -:1000D00011B104E08A4202D130BC0020704730BC2C -:1000E000012070472DE9F007B0F806C0048900F13F -:1000F000280702462CF400457E1924F400492CF40C -:10010000004A002024F400434FF00108D1450AD1F1 -:1001100004F400440CF4004C644504D05082BDE863 -:10012000F00700207047AB4208D992F81DC05B1B56 -:10013000A3EB0C03A3F10804002308E0B2F802C00B -:10014000547FACEB050CACEB040CACF10804002CB8 -:10015000E4DBB2F80EC0BCF1000F0DD0B6F800C061 -:1001600075884DB15B1B10778B42D7DBD089384443 -:10017000A0EB0C00C01E09E0A4EB0C0410778C422D -:1001800008DB507FD38918443044401D5182BDE8BC -:10019000F00770478B42A8BF82F81C80E6DABDE703 -:1001A0002DE9F05F044600F1280AC088934620F448 -:1001B00000400AEB0005608A894608B1484502D232 -:1001C0000020BDE8F09FE08980B1B5F800806E881E -:1001D00008EB0601884218BFFFDF207F4FF00007C1 -:1001E00050EA060108D0002840D04AE04FF000084D -:1001F000A17F46462971F0E7E08948B1617F01445B -:100200004819B4F81F10A0F8051094F82110C17116 -:10021000E18908EB09004944E18128806F80BBF146 -:10022000000F19D0607F298800F1080301440831CC -:1002300089B26288A01D00F0AEF9E781A07F401C62 -:10024000A077A07D00281CBFE088A082A7756782E8 -:10025000E7750120BDE8F09F607FE18908442844EC -:10026000B0F80510A4F81F10C0792EE0E089B4F8AA -:100270001F105044A0EB080020F8031D94F8211033 -:10028000817006EB090086B2E089BBF1000F48449B -:10029000E081A5F800806E800ED0E088A51D20F4D6 -:1002A0000040B04238BFFFDF28884FF4004121EA08 -:1002B000000030432880C0E7E0895044A0EB0800EC -:1002C00030F8031DA4F81F10807884F82100BEE7E1 -:1002D000818800F1280221F4004C6244B0F814C077 -:1002E000C388614518BF99420FD0818969B9806977 -:1002F00068B101898388994209D021F400412830EE -:10030000084411790079884201D1002070471046D5 -:10031000704700F12803407F01F1050C6044106034 -:100320000888002804BFD81E10600888498808443F -:1003300080B270472DE9F04115460A4600F12806C3 -:100340001C46407F531D0344108857880699002897 -:100350001CBFC01C80B226D088429CBF081A80B245 -:1003600013D9401AA042A8BF20461FFA80F8581897 -:100370004246294611F094FB002818BFBDE8F081E1 -:100380004544A4EB080084B2002001198F423CBF11 -:100390004FF0FF30BDE8F081304422462946BDE8E9 -:1003A000F04111F07DBBFA1C97B2F61ED4E72DE99F -:1003B000F04100F128071D46407F4B1D03441646BF -:1003C00008880024B1F80280069A00281CBFC01CCF -:1003D00080B21FD090429CBF101A80B20DD9801AF3 -:1003E000A842A8BF284684B299182246304611F088 -:1003F00083FB281B85B2264400204119414506D8BD -:1004000039182A46304611F077FB601984B220462D -:10041000BDE8F08108F103011FFA81F8FF1ED9E75A -:100420002DE9F04116460A4600F128071D46407F97 -:10043000531D034410880024B2F802800699002856 -:100440001CBFC01C80B21FD088429CBF081A80B25B -:100450000DD9401AA842A8BF284684B2581822468F -:10046000314611F049FB281B85B226440020411972 -:10047000414506D838442A46314611F03DFB601903 -:1004800084B22046BDE8F08108F103021FFA82F829 -:10049000FF1ED9E7401D704770B5044600F12801E2 -:1004A000C288808820F400431944904208D0A28971 -:1004B000002A04BF228A002A02D1A28A904201D1D6 -:1004C000002070BDB1F800C04D8885B1261D20F414 -:1004D0000040A84238BFFFDF30884FF4004121EAD6 -:1004E00000002843308000202082012070BD607F02 -:1004F0000CF1080100F10803084481B26288201D54 -:1005000000F049F8EFE70021C18101774182C17510 -:100510008175704703881380C289002A04BF0020B8 -:100520007047C28800F1280322F400421A440A608E -:10053000C089704710B50446808AA0F57F41FF3915 -:1005400018BFFFDFE088A082E089002818BF0120E3 -:10055000A07510BD4FF6FF71818200218175704733 -:1005600010B50446808AA0F57F41FF3908BFFFDF40 -:10057000A07D28B9A088A18A884204BF002010BDB0 -:10058000012010BD8188828A914205BF807D0028AC -:1005900000200120704710B4B0F800C02CF40044D3 -:1005A000214489B24FF4004491420AD2521A92B2C5 -:1005B0001B339A422CBF0CF4004224EA0C0104D2F3 -:1005C00004E0891A89B224EA0C021143018010BCAC -:1005D000704770B516464FF6FC72C91C01EA020559 -:1005E000D8B10446C01C20F00301A14200D0FFDFB7 -:1005F000201D012108E00246284401D2034600E004 -:100600000023491CC9B21360B142F4D916B104F1F8 -:10061000040001E04FF00000206005FB06F000F14F -:10062000040070BD024600201168002902D008466F -:1006300009681160704702680A60016070474FF6F0 -:10064000FC73C91C1940101A001F90FBF1F0C0B2D6 -:1006500070474FF6FC73C91C1940001D01FB0200D6 -:10066000704770B50C00054609D0082C00D2FFDF9A -:100670001DB1A1B2286800F044F8201D70BD0DB175 -:1006800000202860002070BD0021026803E09388EC -:100690001268194489B2002AF9D100F032B870B555 -:1006A00000260D460446082900D2FFDF206808B95D -:1006B0001EE0044620688188A94202D00168002912 -:1006C000F7D181880646A94201D100680DE005F105 -:1006D000080293B20022994209D32844491B0260C0 -:1006E00081802168096821600160206000E00026A7 -:1006F000304670BD00230B608A8002680A6001608A -:10070000704700234360021D018102607047F0B50D -:100710000F460188408815460C181E46AC4200D38F -:10072000641B3044A84200D9FFDFA019A84200D9B9 -:10073000FFDF3819F0BD2DE9F041884606460188F3 -:10074000408815460C181F46AC4200D3641B384441 -:10075000A84200D9FFDFE019A84200D9FFDF708866 -:100760003844708008EB0400BDE8F0812DE9F041C9 -:10077000054600881E461746841B8846BC4200D3A7 -:100780003C442C8068883044B84200D9FFDFA0196F -:10079000B84200D9FFDF68883044688008EB040065 -:1007A000E2E72DE9F04106881D460446701980B243 -:1007B000174688462080B84201D3C01B208060883D -:1007C000A84200D2FFDF7019B84200D9FFDF60886D -:1007D000401B608008EB0600C6E730B50D46018877 -:1007E000CC18944200D3A41A4088984200D8FFDF66 -:1007F000281930BD2DE9F041C14D04469046A87836 -:100800000E46A04200D8FFDF05EB8607B86A50F815 -:10081000240000B1FFDFB868FFF704FF05000CD02B -:10082000B86A082E40F8245000D3FFDFB54842468E -:10083000294650F82630204698472846BDE8F081E2 -:100840002DE9F0471E460400074602EB06009146DC -:100850008A46C5B227D000218846FF2800D9FFDF8D -:10086000E01C20F00300A04200D0FFDFB24500D919 -:10087000FFDFA34880F800A080F801908570C57064 -:10088000057145718671DFF87CA280F8079000261B -:100890000AF1400A8146FF1C27F003000746B8F121 -:1008A000000F03D005E04FF00101D5E709EB860109 -:1008B00088603AF8161019F8062001D04FF00000B1 -:1008C000FFF787FE761CF6B20744082EE3D3FF1C21 -:1008D00027F003002A460646B8F1000F0DD000208D -:1008E0000221FFF776FE4346002130440F46C846FA -:1008F000C01C20F003021BB110E0C9F84800EFE76C -:1009000008EB81060020B26206E000BFD6F828C0DE -:100910004CF82070401CC0B2A842F7D3491CC9B2A1 -:1009200002EB85000829E3D3001BBDE8F08710B572 -:10093000044603F0BBFC08B1102010BD2078704ABB -:10094000618802EB800092780EE0836A53F82130D0 -:1009500043B14A1C6280A180806A50F82100A060E7 -:10096000002010BD491C89B28A42EED86180052062 -:1009700010BD70B505460C46084603F097FC08B15B -:10098000102070BD082D01D3072070BD25700020F8 -:10099000608070BD0EB56946FFF7EBFF00B1FFDF69 -:1009A0006846FFF7C4FF08B100200EBD01200EBD50 -:1009B00010B50446082800D3FFDF5148005D10BD84 -:1009C0003EB5054600246946FFF7D3FF18B1FFDFA7 -:1009D00001E0641CE4B26846FFF7A9FF0028F8D0E4 -:1009E0002846FFF7E5FF001BC0B23EBD44498978A9 -:1009F000814201D9C0B27047FF2070472DE9F04114 -:100A000090460C460546062901D0072C10D13C4FD4 -:100A1000B86CFFF707FE02004FF6FF7604D0022104 -:100A2000B86CFFF70CFE00E030462880B04201D1E0 -:100A3000002003E742462146FFF7DCFE040002D116 -:100A4000288800F04FF82046F8E6A0F57F43FF3BEA -:100A500001D0082901D300207047CBE6A0F57F42E2 -:100A6000FF3A0BD0082909D2254A9378834205D949 -:100A700002EB8101896A51F820007047002070471D -:100A80002DE9F04105460C46A5F57F4143F20200F1 -:100A9000FF3902D0082C01D30720CFE618494FF0C8 -:100AA00000088A78AA42F8D901EB8406B26A52F8A3 -:100AB0002570002FF1D013483946203050F82420FB -:100AC00028469047B16A062C41F8258001D0072CB2 -:100AD00002D1284600F006F83946B068FFF7ABFDB2 -:100AE0000020ABE610B5064CC2B20221A06CFFF7A5 -:100AF000B0FD0146A06CBDE81040FFF79CBD0000B2 -:100B0000600700202022020070B50E461D461146E7 -:100B100000F0D4F804462946304600F0D8F82044C6 -:100B2000001D70BD2DE9F04190460D4604004FF0C8 -:100B3000000610D00027E01C20F00300A04200D0E7 -:100B4000FFDFDDB141460020FFF78BFD0C3000EBED -:100B5000850617B112E00127EDE7614F04F10C00A3 -:100B6000A9003C602572606000EB85002060606831 -:100B700011F05BF841463868FFF773FD3046BDE879 -:100B8000F0812DE9FF4F564C804681B020689A468F -:100B9000934600B9FFDF2068027A424503D94168D5 -:100BA00051F8280020B143F2020005B0BDE8F08FF3 -:100BB0005146029800F082F886B258460E9900F02D -:100BC00086F885B27019001D87B22068A1463946A3 -:100BD0000068FFF764FD04001FD067802580294668 -:100BE000201D0E9D07465A4601230095FFF766F823 -:100BF0002088314638440123029ACDF800A0FFF73F -:100C00005DF82088C1193846FFF78FF8D9F8000041 -:100C10004168002041F82840C7E70420C5E770B5C7 -:100C20002F4C0546206800B9FFDF2068017AA942F1 -:100C30000ED9426852F8251051B1002342F82530F0 -:100C40004A880068FFF756FD216800200A7A08E00C -:100C500043F2020070BD4B6853F8203033B9401C9A -:100C6000C0B28242F7D80868FFF70EFD002070BDC1 -:100C700070B51B4E05460024306800B9FFDF3068B0 -:100C8000017AA94204D9406850F8250000B1041D3A -:100C9000204670BD70B5124E05460024306800B97C -:100CA000FFDF3068017AA94206D9406850F8251064 -:100CB00011B131F8040B4418204670BD10B50A4636 -:100CC0000121FEF7F3FFC01C20F0030010BD10B59A -:100CD0000A460121FEF7EAFFC01C20F0030010BD08 -:100CE0006C00002070B5044600780E46012813D031 -:100CF000072802D00B2813D10EE0A068616905789F -:100D0000052003F061FA052D0AD078230022052082 -:100D1000616903F0AFF903E00520616903F054FA5B -:100D200031462046BDE8704001F0A8B910B500F189 -:100D30003902C3799478411D64F003042340C371E0 -:100D4000DB070DD04B79547923404B710B79127925 -:100D500013400B718278C9788A4200D9817010BD26 -:100D600000224A710A71F5E74178012900D00C216F -:100D7000017070472DE9F74F88B000208C698DF81D -:100D800004000878012617460D464FF007094FF07A -:100D9000110A4FF00A0B292876D2DFE810F029005B -:100DA000D20215032D036F037E039903C703DC03EF -:100DB0000604330457047004AE04BF04E204EA04DA -:100DC0000A052C0557057A05A605C605D605F605BC -:100DD000F805050637065906AD06EA06EC061B07B8 -:100DE0003B074407550792071B08410808080D08F0 -:100DF00014B120781E2829D0D5F808805FEA0800B1 -:100E000042D001208DF80400686A02228DF8082083 -:100E100006908DF809B0286A0390A8880028EFD0C2 -:100E200098F8001091B10F2910D27DD2DFE801F0BF -:100E30007C134BDCFEFDFCFBFAF9F8089EF7F6008C -:100E4000022821D124B120780C2801D00026F9E312 -:100E50008DF80420B3E10520696A03F0B5F9A8888C -:100E60000728EED1204601F003F9022809D02046D8 -:100E700001F0FEF8032808D9204601F0F9F8072808 -:100E800003D20120207005E003E2002CB8D02078C6 -:100E90000128D6D198F80400C11F0A2903D300BF46 -:100EA00085F81CB04CE2A070D8F80010A163B8F827 -:100EB0000410A18798F8060084F83E0001202870ED -:100EC0000320207046E00728BBD1002C98D0207862 -:100ED0000D28B6D198F8031094F83B20C1F3C00058 -:100EE000C2F3C002104201D0062000E007208907AB -:100EF00007D198F805100142D2D198F806100142A6 -:100F0000CED194F83D2098F8051020EA0202114253 -:100F1000C6D194F83E2098F8061090430142BFD104 -:100F200098F80400C11F00E008E20A29B8D2617FE6 -:100F3000814201D906209AE3D8F800106160B8F820 -:100F40000410218198F80600A072012028700E205C -:100F5000207003208DF80400686A069004F13900BF -:100F60000290601D039017300490DBE0412890D17F -:100F7000204601F07DF8042802D1E078C00704D1B2 -:100F8000204601F075F80F289ED1A88CD5F80C806A -:100F900080B24FF04009666AFFF76AFE32460826C3 -:100FA00041464B460096FFF702FA0D208DF80400EB -:100FB000686A0690606A0290002101A8FFF792FE1D -:100FC0002078042808D0A07F48B1012807D0032842 -:100FD00008D0102020709CE005202070CEE184F81D -:100FE00000A033E71220F5E71128C0D1204601F018 -:100FF0003FF8042802D1E078C00719D0204601F05C -:1010000037F8062805D1E078C00711D1A07F022863 -:101010000ED0204601F02CF8112808E0B3E083E060 -:1010200072E156E136E109E1EAE0D0E017E09ED155 -:10103000102208F1010104F1480010F05DFD607814 -:10104000012809D012202070E078C00765D0A07F69 -:1010500090B301285DD060E084F8009059E0112839 -:1010600085D1204601F004F8082804D0204600F07D -:10107000FFFF132888D12869D0B16869C0B104F195 -:101080007800102208F10101064610F035FD2078A5 -:10109000082812D014202070E078C0070FD0A07F5D -:1010A000022818D06178022912D0032831D034E008 -:1010B00000208DF80400ECE02BE00920EBE70B208A -:1010C0002870296901204870206CC1E9010662E29C -:1010D00008B101287AD10B202870296981F8019084 -:1010E000606A4860206AC1E9020648E2206CE27842 -:1010F0000068C2F34402521ED04000F0010040F0EC -:10110000800000E000200874E06A48614CE2064676 -:10111000FEE3042028700520BAE185F800B08DF8C0 -:1011200004B08EE33946F4E31128C4D1204600F020 -:101130009FFF0A2802D1E078C00704D1204600F0C2 -:1011400097FF1528B7D1102208F1010104F14800DA -:1011500010F0D2FC20780A2810D01620207012201F -:10116000287029690920487004F15800486020302F -:1011700088601038C860206C086184E30B20207000 -:10118000B9E22870FEE3022895D1204600F070FFF6 -:10119000042804D3204600F06BFF082809D320461A -:1011A00000F066FF0E2886D3204600F061FF12286B -:1011B0006FD2A07F0228B8D110208DF80400686A91 -:1011C000069098F801008DF80800F6E33DE2022849 -:1011D000ABD1204600F04CFF00285AD0204600F04A -:1011E00047FF0128F9D0204600F042FF0C28F4D038 -:1011F00004208DF8080098F801008DF809005AE7DE -:101200001128FCD1002CFAD020781728F7D161786A -:10121000E06A022910D0002101EB4101182606EBFB -:10122000C1011022405808F1010110F065FC0520B1 -:10123000696A00F010FF1DE10121EDE70B28DED106 -:10124000002CDCD020781828D9D16178E06A0229F6 -:101250001BD0002101EB4101102202EBC1014158DA -:10126000B8F8010008806078E16A02280FD00020F9 -:1012700000EB4002142000EBC2000958404650F831 -:10128000032F0A604068486039E00121E2E701204D -:10129000EEE7A1E11128B2D1002CB0D020781928B6 -:1012A000ADD16078E16A022811D0002000EB400245 -:1012B0001C2000EBC2001022085808F1010110F0B8 -:1012C0001BFC0520696A00F0C6FE1A20D4E001204C -:1012D000ECE7082893D1002C91D020781A288ED1E1 -:1012E000E06A98F80120017862F347010170E16A31 -:1012F000D8F8022041F8012FB8F8060088800520B0 -:10130000696A00F0A8FE3CE3112898D1002C98D01F -:1013100020781B2893D16178E06A02290CD0002143 -:1013200001EB4101202202EBC1011022405808F1DB -:10133000010110F0E1FBE2E70121F1E785F81C90E3 -:10134000EFE338780128A6D11C2204F11C0079684B -:1013500010F017FCE079C10894F83B0001EAD001D5 -:10136000E07861F30000E070217F09B1297733E173 -:10137000217803290AD0C0073FF42DAE032028703E -:101380008DF804B0686A06904120B1E3607FA178CF -:1013900088423FF6CFAD02262671E179204621F042 -:1013A000E001E171617A21F0F0016172A17A21F02E -:1013B000F001A172FFF7BAFC2E708DF804B0686AD4 -:1013C00006908DF80890ADE638781128CFD18DF8C9 -:1013D0000490696A0691916800208DF814000391C9 -:1013E000ADF8089008466168016021898180A17A82 -:1013F000817104202070E0E238781128B7D18DF88F -:101400000490686A0690381D02AB07C883E807009D -:101410004120ADF8080000208DF8140008460C218A -:101420000170A88CCA4680B2FE684FF04009D4F81B -:101430002080FFF72FFC3146082642464B46009697 -:10144000FEF7EEFF002101A8FFF74CFCE07820F04A -:101450003E00801CE0702078052801D00F200BE0B2 -:10146000A07F20B1012802D0032803D03DE184F8F9 -:1014700000A04EE62670E9E42070E7E438780328FF -:10148000A4D178680168A1664068E06605202870EC -:101490008DF80400686A069044E63878032895D1F0 -:1014A00078680168216740686067206C68B9A07F30 -:1014B00028B1012803D0062028700420E8E785F829 -:1014C0000090FE4820646064F9E385F80090F6E33C -:1014D0003878022892D1387900287CD1A07F022860 -:1014E0000BD00328F1D1607801280BD0A07994F8B3 -:1014F0003A1001280AD0F1480BE0B86800286BD0F8 -:10150000206411E0A17994F83A00F2E7B868002865 -:10151000F5D02064E078C00701D0012901D0E74868 -:1015200002E0F8680028EAD06064CEE78DF804B0E5 -:10153000696A0691E1785846C90709D0617802299D -:1015400003D1A17F29B1012903D0A17F032900D0B4 -:101550000820287064E33878112891D1B86828628F -:1015600009202870E0782969C0070DD081F8019022 -:10157000206A4860606A886004F16800C860A07FE3 -:1015800002287FF4BFADB1E501204870206C4860AF -:1015900004F16800886004F13800C860201D08610B -:1015A000206B4861606B88612AE2E1783878C9076E -:1015B00001D0062100E00A2188428BD1207807283B -:1015C0001DD084F800A000BF8DF80490686A0690D2 -:1015D000286A039001E0CAE08DE20024ADF808A07B -:1015E0008DF81440032100F8011B5168102210F0FF -:1015F00083FA002101A8FFF775FB2C6226E408207E -:101600002070E1E738781128A7D18DF80490686A36 -:1016100006909068039000208DF814000398ADF8B0 -:1016200008A0042100F8011B102204F1680110F049 -:1016300063FA002101A8FFF755FB2078092802D0A2 -:10164000132019E73CE384F800B016E0E17838781D -:10165000C90701D0062100E00A218842ADD110223D -:1016600004F14800796810F01BFA10B104202877C3 -:10167000EAE3207809283FF4EEAC0C2081E5E0781D -:10168000C10738D0A17F012902D002291BD02EE04A -:101690000D202870296981F801B06078012809D0EF -:1016A000206A4860606A886004F16800C860103091 -:1016B000086129E5606A4860206A886004F1780062 -:1016C000C8601038F4E7C0F3440114290FD24FF07A -:1016D000006101EBB0104FEAB060E0706078012863 -:1016E00003D010202070042057E10620C4E6607863 -:1016F00001283FF476AC0E2043E538780928ADD1B7 -:1017000085F800B00F208DF80400686A06905068D4 -:101710000290002101A8FFF7E5FAE8E7E078C007AA -:101720000AD0A07F012803D10F202870042036E1C1 -:10173000102028700E2032E115202870296902201F -:101740004870206C48606078012805D004F178006A -:1017500088601038C86053E104F168008860103078 -:10176000F8E738780228CAD138790028E0D02877FD -:1017700068E338781328FBD185F800A02969082090 -:10178000487078684860607801280DD004F16800DE -:1017900088601030C860206B0861606B486104F19C -:1017A00058008861A06A22E004F17800886010384F -:1017B000F0E738780728DBD16078012801D01320C2 -:1017C00029E2A178A06A0844C1F1100110F00BFAD7 -:1017D0001220287029690920487004F158004860D7 -:1017E000203088601038C860206C086144E0C8610F -:1017F000E06A086204E138780828B9D1102204F1BF -:101800004800796810F04CF908B10B202FE72078D8 -:101810000B2812D02046FFF789FAA178A06A084465 -:10182000C1F1100110F0DFF91620287008208DF8A2 -:101830000400686A0690002072E0132028708DF87A -:1018400004B0686A06908DF808A06BE43878112817 -:101850008ED1B86828621420287029690920487040 -:1018600004F158004860103088601030C860606C27 -:1018700008616078012806D004F139004861206BC6 -:101880008861606BB3E7601D4861606B8861206BA5 -:10189000ADE7387808288ED18DF80490686A0690F4 -:1018A000286A00260D210390ADF808A08DF8146079 -:1018B00000F8011B1022796802E000007423020086 -:1018C00010F01AF9002101A8FFF70CFA2E626078D7 -:1018D000012801D01520CFE51620287008208DF8AA -:1018E0000400686A029606901BE038780B2884D1C1 -:1018F000162028706078022802D12046FFF716FAD9 -:10190000A17878680844C1F1100110F06CF901E089 -:1019100083E215E008208DF80400686A0690786874 -:101920000290A0788DF80C004DE538780F288FD103 -:10193000E079C00773D01720287009202FE01146E6 -:1019400001A8FFF7CFF9FFF7E2BB38781028A2D142 -:101950001422391D04F11C0010F013F9E16A208DE6 -:10196000A1F80900E16AA078C871E179E26A01F0A2 -:1019700003011172E16A627A0A73E16AA07A81F85E -:10198000240000E09BE1242078E6192043E1387828 -:101990001128ACD1B86828621A20287005208DF86B -:1019A0000400686A0690CAE7387803289FD16078F7 -:1019B000E16A022802D0012001E05CE2002000EB95 -:1019C0004002142000EBC2027B688A58196811603B -:1019D000596851601B212970D5E9041205234B7009 -:1019E000636A4B606678E36A022E01D0012600E04C -:1019F000002606EB460600EBC6001858C1E90202B5 -:101A0000686A4862089800F050FB9CE738780E2816 -:101A100071D16078E26A022802D0012001E0ADE1D4 -:101A2000002000EB4001102000EBC1000223105801 -:101A3000093279680EF01EFB1C20287029690420E9 -:101A40004870206A4860E06A09308860FB4881E697 -:101A500038780D284FD16178E06A022901D0012140 -:101A600000E0002101EB4101182606EBC101A2783C -:101A70004058796810F040F86078E16A022801D097 -:101A8000012000E0002000EB400206EBC200B0465F -:101A90000858A1780844C1F1100110F0A4F88DF89D -:101AA0000490686A0690286A00260390ADF808A0A2 -:101AB0008DF81460062101706178E26A022901D074 -:101AC000012100E0002101EB410308EBC301401CB0 -:101AD0005158102210F010F8002101A8FFF702F968 -:101AE0001D202E6228708DF804B0686A06900B20C5 -:101AF0008DF8080067E481E0387811287ED18DF8F0 -:101B00000490686A0690B86803900B20ADF808004E -:101B1000039880F800906278E16A022A02D00122DC -:101B200001E091E1002202EB4202102303EBC2022A -:101B300089580988A0F801106178E26A022901D069 -:101B4000012100E0002101EB4103142101EBC3015D -:101B500051580A6840F8032F4968416056E0272031 -:101B6000287001208DF814002DE424202870002016 -:101B70009FE01F204FE0387811283FD18DF8049066 -:101B8000686A0690B868039000208DF814000398E6 -:101B9000ADF808A0082606706178E26A022901D033 -:101BA000012100E0002101EB41031C2101EBC301F5 -:101BB000401C515810220FF09FFF002101A8FFF791 -:101BC00091F8202028708DF804B0686A06908DF88E -:101BD000086061E43878112810D18DF80490686AA3 -:101BE0000690B86803900820ADF808000398092112 -:101BF0000170E16909784908417000E094E0E16909 -:101C000051F8012FC0F802208988C18020781D2852 -:101C1000ABD1A4E7222028708DF804B0686A069042 -:101C20008DF808A08BE6387811287DD1B868286235 -:101C300023202870296904204870206A4860E06ADF -:101C4000093088607E4885E538780D286CD1617848 -:101C5000E06A022901D0012100E0002101EB4101ED -:101C6000202606EBC1011022405879680FF044FF8E -:101C70008DF80490686A0690286A0390ADF808A071 -:101C800080F800B06278E16A022A01D0012200E007 -:101C9000002202EB420206EBC202401C89581022CD -:101CA0000FF02AFF0020286221781D29B1D02421BD -:101CB00029708DF81400002101A8FFF713F80326FE -:101CC000DFE0E078C00702D04FF0060C01E04FF0F3 -:101CD000070C6078022809D04FF0000000EB0401E7 -:101CE00001F1090105D04FF0010004E04FF00100BF -:101CF000F4E74FF000000B78204413EA0C030B705C -:101D000010F8092F02EA0C02027004D14FF01C0CEB -:101D100084F800C092B394F801C0BCF1010F00D068 -:101D2000E3B990F800C000E053E05FEACC7804D05B -:101D30002CF00106067018260EE05FEA8C7804D5B8 -:101D40002CF0020606701E2606E05FEA4C7805D5E8 -:101D50002CF00406067021262E70032694F801C08C -:101D6000BCF1020F00D0DAB991F800C05FEACC787C -:101D700005D02CF001060E7017210FE01AE05FEA83 -:101D80008C7804D52CF002060E70192106E05FEA6B -:101D90004C7805D52CF004060E701B21217000260E -:101DA0000078D0BBCAB3C3BB1D20207035E03878A3 -:101DB000122847D1282061E42078012842D00C283D -:101DC00040D02046FEF7D0FF0B208DF80400686A53 -:101DD000069037E038784FF02608112805D01220F9 -:101DE0001070032685F800804BE08DF80490686A37 -:101DF0000690B86803900220ADF8080001208DF825 -:101E00001400039805210170297F4170114601A833 -:101E1000FEF768FF064685F80080012E12D030E0FC -:101E200001208DF80400686A069003208DF80800F0 -:101E3000287F8DF809000020287716E06C23020027 -:101E400070220200287F80B11E202070252028707B -:101E50008DF804B0686A069002208DF808003946B3 -:101E600001A8FEF73FFF06460BE00CB1FE202070F4 -:101E70009DF8040028B1002101A8FEF733FFFEF70A -:101E8000E5BF0BB03046BDE8F08FF0B587B00C462B -:101E90004E6900218DF804100120257803460227A1 -:101EA0004FF0070C85B1012D50D0022D36D1FE2008 -:101EB00030708DF80030606A059003208DF80400C2 -:101EC000207E8DF8050060E02179012922D00229C9 -:101ED00029D0032924D0042920D1B17F02291DD182 -:101EE00031780D1F042D04D30A3D032D01D31E2983 -:101EF00014D12189022911D38DF80470237020890F -:101F00009DF80410884217D20A208DF80000606AFC -:101F1000059057E070780128EED0052007B0F0BD9D -:101F20001E203070E8E771780229F6D131780C294B -:101F3000F4D18DF804C0E1E71120083402F8040B55 -:101F400094E80B0082E80B000320E7E71578112DD9 -:101F5000E4D18DF800C0656A0595956802958DF805 -:101F6000101094F804E0BEF1010F13D0BEF1020F7F -:101F70002DD0BEF1030F1CD0BEF1040FCED1ADF8B1 -:101F800004700E202870207E687000216846FEF7DD -:101F9000A9FE0CE0ADF804700B202870207E002113 -:101FA00000F01F0068706846FEF79CFE3770002046 -:101FB000B4E7ADF804708DF8103005202870207E4D -:101FC0006870277011466846FEF78CFEA6E7ADF8EC -:101FD00004C02B70207F6870607F00F00100A87043 -:101FE000A07F00F01F00E870E27F2A71C0071CD0BC -:101FF00094F8200000F00700687194F8210000F0C8 -:102000000700A87100216846FEF76CFE2868B063DF -:10201000A888B087A87986F83E00A06940787077D4 -:102020002879B0700D203070C1E7A9716971E9E7B6 -:1020300000B587B005280CD101208DF800008DF87F -:102040000400002005918DF8050001466846FEF762 -:1020500049FE07B000BD70B50C46054602F0B4F865 -:1020600021462846BDE870407823002202F002B8DD -:1020700008B1007870470C207047000070B50C0064 -:1020800005784FF000010CD021702146F3F79DF840 -:1020900072482178405D884201D1032070BD022042 -:1020A00070BDF3F792F8002070BD027B032A05D0C3 -:1020B00000220A704B780B2B02D003E004207047FB -:1020C0000A770A62027B9300521C0273C1500320FC -:1020D0007047F0B587B00F4605460124287B05EB15 -:1020E000800050F8046C7078411E0C290AD25B49BC -:1020F0003A46123101EB8000314650F8043C284644 -:10210000984704460CB1012C11D1287B401E10F0D9 -:10211000FF00287301D00324E0E70C208DF80000B5 -:10212000706A0590002101966846FFF7A7FF032C0F -:10213000D4D007B02046F0BD70B515460A46044617 -:1021400029461046FFF7C5FF064674B12078FE28E1 -:102150000BD1207E30B100202870294604F10C00FC -:10216000FFF7B7FF2046FEF7FFFD304670BD704712 -:1021700070B50E46044688210FF057FD0225012E4A -:1021800003D0022E04D0052070BD0120607000E055 -:1021900065702046FEF7E8FDA577002070BD28B1E8 -:1021A000027E1AB10A4600F10C01C5E70120704712 -:1021B00010B5044686B0052002F006F82078FE2807 -:1021C00006D000208DF8000069462046FFF7E7FFA3 -:1021D00006B010BD7FB50E4600218DF80C10417879 -:1021E0000B2903D00C2903D0002405E0846900E00A -:1021F00044690CB1217E91B16D4601462846FFF736 -:1022000054FF032809D1324629462046FFF794FFA0 -:102210009DF80C10002900D0042004B070BD04F11A -:102220000C05EAE710B590B00C4607900B48042166 -:10223000801E08900A488DF8191009900F9269467F -:1022400006A8FFF7C7FF002805D1102220460199F4 -:102250000FF052FC002010B010BD000076220200EA -:102260006C23020070B50D46040011D085B1210128 -:1022700028460FF0B8FC10224E4928460FF03CFCCF -:102280004C4801210838018044804560002070BD21 -:10229000012070BD70B5474E00240546083E10E091 -:1022A0007068AA7B00EB0410817B914208D1C17B4E -:1022B000EA7B914204D10C2229460FF0F1FB30B1A8 -:1022C000641C30888442EBDB4FF0FF3070BD204649 -:1022D00070BD70B50D46060006D02DB1FFF7DAFFD0 -:1022E000002803DB401C14E0102070BD314C083C7A -:1022F00020886288411C914201D9042070BD616828 -:10230000102201EB001031460FF0F6FB2088401C34 -:1023100020802870002070BD70B514460D0018D0C4 -:10232000BCB10021A170022802D0102811D105E013 -:10233000288870B10121A170108008E02846FFF7BD -:10234000A9FF002805DB401CA070A8892080002080 -:1023500070BD012070BD70B5054614460E000BD04F -:1023600000203070A878012808D005D91149A1F1C2 -:1023700008010A8890420AD9012070BD24B128784A -:1023800020702888000A5070022008700FE064B1A5 -:102390004968102201EB0011204610390FF0ACFB08 -:1023A000287820732888000A60731020307000207D -:1023B00070BD0000780000202DE9F04190460C46E9 -:1023C00007460025FE48072F00EB881607D2DFE8F6 -:1023D00007F00707070704040400012500E0FFDFFA -:1023E00006F81470002D13D0F548803000EB8801FA -:1023F00091F82700202803D006EB4000447001E04C -:1024000081F8264006EB44022020507081F82740D6 -:10241000BDE8F081F0B51F4614460E460546202A59 -:1024200000D1FFDFE649E648803100EB871C0CEB6A -:10243000440001EB8702202E07D00CEB46014078C8 -:102440004B784870184620210AE092F825304078F1 -:1024500082F82500F6E701460CEB41000570407854 -:10246000A142F8D192F82740202C03D00CEB440471 -:10247000637001E082F826300CEB41042023637086 -:1024800082F82710F0BD30B50D46CE4B441900221E -:10249000181A72EB020100D2FFDFCB48854200DD43 -:1024A000FFDFC9484042854200DAFFDFC548401CD3 -:1024B000844207DA002C01DB204630BDC148401CB5 -:1024C000201830BDBF48C043FAE710B50446016884 -:1024D000407ABE4A52F82020114450B102200844EC -:1024E00020F07F40F0F751FB94F90810BDE8104050 -:1024F000C9E70420F3E72DE9F047B14E803696F89E -:102500002D50DFF8BC9206EB850090F8264034E0B1 -:1025100009EB85174FF0070817F81400012806D0BB -:1025200004282ED005282ED0062800D0FFDF01F089 -:10253000E5F8014607EB4400427806EB850080F899 -:10254000262090F82720A24202D1202280F82720BE -:10255000084601F0DEF82A4621460120FFF72CFF4D -:102560009B48414600EB041002682046904796F8CD -:102570002D5006EB850090F82640202CC8D1BDE8F0 -:10258000F087022000E003208046D0E710B58C4C95 -:102590002021803484F8251084F8261084F8271030 -:1025A000002084F8280084F82D0084F82E10411EA5 -:1025B000A16044F8100B2074607420736073A073E2 -:1025C0008449E07720750870487000217C4A103CEF -:1025D00002F81100491CC9B22029F9D30120F0F7F3 -:1025E000C2F90020F0F7BFF9012084F82200F9F7C2 -:1025F00053FB7948F9F75FFB764CA41E20707748AF -:10260000F9F759FB6070BDE81040F0F739B910B523 -:10261000F0F75BF96F4CA41E2078F9F765FB607842 -:10262000F9F762FBBDE8104001F0A0B82020704728 -:102630002DE9F34F624E0025803606EB810A89B002 -:102640009AF82500202822D0691E02916049009541 -:1026500001EB00108146D0E90112C0680391CDE979 -:102660000420B08BADF81C00B07F8DF81E009DF8E3 -:102670001500C8B10227554951F820400399E219C5 -:10268000114421F07F41019184B102210FE001202A -:10269000F0F769F90020F0F766F9F0F734F901F086 -:1026A00065F886F82F508AE00427E4E700218DF8CA -:1026B0001810022801D001281BD1039839190144B0 -:1026C0000998081A20F07F4033280BD903208DF891 -:1026D00015000398C4F13201401A20F07F403224E3 -:1026E00003900CE096F8240018B9F0F753FC00288A -:1026F0004DD0322C03D214B101F02CF801E001F0DE -:1027000035F8344A107820B393465278039B121B55 -:1027100000219DF81840984601281BD0032819D0A5 -:102720005FF000008DF81E00002A04DD981A039067 -:1027300001208DF818009DF81C0000B102210398BB -:10274000274A20F07F40039003AB099801F01AF864 -:1027500010B110E00120E5E79DF81D0018B99BF8C5 -:102760000000032812D08DF81C50CDF80C808DF895 -:1027700018408DF81E509DF8180058B10398012399 -:10278000C11900221846F0F741F906E000200BB00D -:10279000BDE8F08F0120F0F7E6F899F90C2001234D -:1027A00000200199F0F732F9012086F82F008AF80D -:1027B000285003482022694680300FF0E2F911E0EA -:1027C000AC090020FF7F841E0020A107B822020070 -:1027D000AC0700208A000020233F0100F7240100FD -:1027E000FFFF3F000120D2E72DE9F05FDFF84084D2 -:1027F000064608EB860090F82550202D1FD0A8F142 -:1028000080002C4600EB8617A0F50079DFF824B491 -:1028100005E0A24607EB4A004478202C0AD0F0F7E6 -:1028200041F909EB04135A4601211B1D00F0AAFFD0 -:102830000028EED0AC4202D0334652461EE0FE489D -:1028400008B1AFF30080F0F72DF998F82F206AB1A6 -:10285000D8F80C20411C891A0902CA1701EB126131 -:102860000912002902DD0020BDE8F09F3146FFF784 -:10287000DFFE08B10120F7E733462A462021042075 -:10288000FFF7C8FDEFE72DE9F041E94C2569F0F7C6 -:1028900009F9401B0002C11700EB1160001200D4BF -:1028A000FFDF94F8220000B1FFDF012784F82270D7 -:1028B00094F82E00202800D1FFDF94F82E6020200D -:1028C00084F82E00002584F82F5084F8205084F8D6 -:1028D0002150DA4825600078022833D0032831D00F -:1028E00000202077A068401C05D04FF0FF30A0608A -:1028F0000120F0F738F80020F0F735F8F0F733F959 -:10290000F0F72BF9EFF7FFFF0EF094FBCC480560D2 -:1029100005604FF0E0214FF40040B846C1F8800256 -:10292000F0F7BBF994F82D703846FFF75DFF0028EB -:10293000FAD0BF48803800EB871010F81600022844 -:1029400002D006E00120CCE73A4631460620FFF7E8 -:1029500033FD84F8238004EB870090F826002028BC -:1029600004D0B648801E4078F9F7C4F9207F0028CB -:1029700003D0F0F7E8F82577657749E50146AC48DC -:1029800010B590F82D200024803800EB821000BF95 -:1029900010F814302BB1641CE4B2202CF8D32020A2 -:1029A00010BDA84800EB0410016021460120FFF78C -:1029B00003FD204610BD10B5012801D0032800D129 -:1029C00071B39B4A92F82D30994C0022803C04EB65 -:1029D000831300BF13F812400CB1082010BD521C25 -:1029E000D2B2202AF6D3954A48B1022807D0072947 -:1029F00016D2DFE801F01506080A0C0E10000021BF -:102A00000AE01B2108E03A2106E0582104E0772182 -:102A100002E0962100E0B52151701070002010BD39 -:102A2000072010BD854810B54078F0F7AEF880B2A9 -:102A300010BD10B5202811D27D4991F82D30A1F19B -:102A4000800202EB831414F810303BB191F82D3062 -:102A500002EB831212F81020012A01D0002010BDD1 -:102A600091F82D2001460020FFF7A6FC012010BDA3 -:102A700010B5F0F717F8BDE81040F0F786B82DE96B -:102A8000F0410E466A4F01782025803F0C4607EB47 -:102A9000831303E0254603EB45046478944202D097 -:102AA000202CF7D108E0202C06D0A14206D103EB60 -:102AB00041014978017007E00020A9E403EB4400DC -:102AC00003EB4501407848705F4F7EB127B100218C -:102AD00040F2DA30AFF300803078A04206D127B15F -:102AE000002140F2DD30AFF30080357027B10021C6 -:102AF00040F2E230AFF30080012089E410B5426873 -:102B00000B689A1A1202D41702EB1462121216D42E -:102B1000497A91B1427A82B94C4A006852F8211040 -:102B2000126819441044001D891C081A0002C117BC -:102B300000EB11600012322801DB012010BD0020E3 -:102B400010BD2DE9F047814639483E4E00EB81002B -:102B5000984690F825402020107006F50070154624 -:102B600000EB81170BE000BF06EB04104946001D87 -:102B7000FFF7C4FF28B107EB44002C704478202CE9 -:102B8000F2D1297888F8001013E000BF06EB041595 -:102B9000291D4846FFF7B2FF68B988F80040A97BB5 -:102BA00099F80A00814201D80020E8E407EB4400CC -:102BB0004478202CEAD10120E1E42DE9FC410E46C5 -:102BC000074600241F4D08E09DF8000005EB0010AB -:102BD0008168384600F0EAFD01246B4601AA3146BF -:102BE0003846FFF7AEFF0028EED02046BDE8FC8156 -:102BF00070B504460E4801258038A54300EB8411CA -:102C000000EB851040220EF077FF0F4E26B1002119 -:102C100040F25C40AFF30080054800EB850100EB1B -:102C20008400D0F82500C1F82500AEB100210FE0E6 -:102C30002C0A0020FFFF3F00000000008A00002057 -:102C400000F50040AC07002000000000B8220200A0 -:102C50004FF48C60AFF30080284670BD2DE9FC4135 -:102C60008446FF481546089C00EB85170E4617F86A -:102C70001400012803D0022801D00020B6E70B463B -:102C8000F84A0121604600F07DFDA8B101AB6A461B -:102C900029463046FFF755FF70B1F1489DF80420F2 -:102CA0009DF80010803000EB85068A4208D02B4644 -:102CB0000520FFF7AFFB0BE02A462146042014E075 -:102CC000202903D007EB4100407801E096F8250069 -:102CD00007EB440148709DF80000202809D007EB5D -:102CE000400044702A4621460320FFF765FB01207F -:102CF0007CE706F8254F0120F070F3E7DA4901EB95 -:102D00000010001DFFF7E1BB7CB51D4613460446CD -:102D10000E4600F1080221461846EFF743FF94F9EA -:102D200008000F2804DD1F3820722068401C206036 -:102D300096B10220CD4951F8261046182068694600 -:102D4000801B20F07F40206094F908002844C01CBC -:102D50001F2803DA012009E00420EBE701AAEFF7BE -:102D600021FF9DF8040010B10098401C00900099CC -:102D7000206831440844C01C20F07F4060607CBD66 -:102D80002DE9FE430C460646097860799072207959 -:102D900098461546507241B1B148803090F82E10D7 -:102DA00020290AD00069401D0BE0D4E902232179D3 -:102DB00003B02846BDE8F043A6E7AD484178701D52 -:102DC000084420F07F47217900222846A368FFF7B6 -:102DD0009BFF3946284600F0E9FCD4E9023221790C -:102DE0006846FFF791FF41462846019CFFF7E5FE44 -:102DF0002B4622460021304600F0C4FC002803D1B7 -:102E00003146284600F0D2FCBDE8FE832DE9FE4F96 -:102E1000814600F087FC38B15FF0000799F80000A8 -:102E200020B10020BDE8FE8F0127F7E78C4D914CC3 -:102E30004FF0000A803524B1002140F2D340AFF3B7 -:102E4000008095F82D8085F823A0002624B100216C -:102E50004FF49B60AFF300801FB94046FFF7C8FEF8 -:102E6000804624B100214FF49C60AFF30080EFF75F -:102E700019FE43466A464946FFF782FF24B1002106 -:102E800040F2E640AFF3008095F82E0020280CD0E9 -:102E900029690098401A0002C21700EB1260001264 -:102EA00003D5684600F082FC012624B100214FF4CE -:102EB0009E60AFF3008095F823000028BBD124B1B9 -:102EC000002140F2F640AFF30080EFF7EBFD6B46D8 -:102ED000644A002100F056FC0028A3D027B94146DF -:102EE0006846FFF76AFE064326B16846FFF7EDFA2B -:102EF000C9F8080024B1002140F20950AFF3008066 -:102F000001208FE72DE9FF5F8A46814600F00AFC29 -:102F1000534C803410B39AF80000002710B10128F8 -:102F200000D0FFDF534D25B1002140F27F50AFF3B9 -:102F300000800120A84600905FEA080604D0002126 -:102F400040F28750AFF30080009800F0E2FB94F865 -:102F50002D50002084F8230067B119E094F82E006A -:102F60000127202800D1FFDF9AF800000028D9D0DF -:102F7000FFDFD7E72846FFF73BFE054626B10021D5 -:102F800040F29150AFF3008094F823000028D3D191 -:102F900026B1002140F29B50AFF30080EFF782FD95 -:102FA00083462B4601AA5146FFF7EAFE5FEA060870 -:102FB00004D0002140F2A250AFF300803B462A46E5 -:102FC00001A95846CDF80090FFF748FE064604EBED -:102FD000850090F828B0B8F1000F04D0002140F22D -:102FE000A950AFF3008000F089FB0090B8F1000F0A -:102FF00004D0002140F2AF50AFF3008094F82300DA -:10300000002899D1B8F1000F04D0002140F2B75048 -:10301000AFF3008014490DF1040C01EB09109CE89A -:103020000E0000F1040080E80E002EB35FEA0806EF -:1030300004D0002140F2C450AFF300803BEA070007 -:1030400020D094F82E0020281CD126B1002140F277 -:10305000C950AFF300802846FFF7C6FB90B90CE0DB -:10306000AC090020FFFF3F00AC070020B82202009F -:103070008A0000200000000010E09AF80000D8B399 -:10308000012849D0B8F1000F04D0002140F2E650E9 -:10309000AFF30080284600F02AFB01265FEA08050E -:1030A00004D0002140F2EF50AFF30080009800F010 -:1030B00030FB25B1002140F2F350AFF300808EB118 -:1030C00094F82D0004EB800090F82600202809D009 -:1030D00025B1002140F2FA50AFF30080F948407862 -:1030E000F8F708FE25B1002140F2FF50AFF3008051 -:1030F00004B03046BDE8F09FFFE7B8F1000F04D000 -:10310000002140F2D150AFF3008094F82D204946C1 -:103110000420FFF751F9C0E7002E3FF40DAF002166 -:1031200040F2DC50AFF3008006E72DE9F84FE64DA2 -:10313000814695F82D004FF00008E44C4FF0010B4C -:10314000474624B1002140F20D60AFF3008058469D -:1031500000F0DFFA85F8237024B1002140F21260FC -:10316000AFF3008095F82D00FFF742FD064695F875 -:10317000230028B1002CE4D000214FF4C3604BE0C1 -:1031800024B1002140F21C60AFF30080CE488038AB -:1031900000EB861111F81900032856D1334605EBD0 -:1031A000830A4A469AF82500904201D1012000E0A6 -:1031B000002000900AF125000021FFF760FC014685 -:1031C0000098014203D001228AF82820AF77E1B3AA -:1031D00024B1002140F22160AFF30080324649461D -:1031E0000120FFF7E9F89AF828A024B1002140F265 -:1031F0002C60AFF3008000F081FA834624B10021F7 -:1032000040F23160AFF3008095F8230038B1002C14 -:1032100097D0002140F23560AFF3008091E7BAF11A -:10322000000F07D095F82E00202803D13046FFF775 -:10323000DBFAE0B124B1002140F24960AFF3008035 -:10324000304600F054FA4FF0010824B1002140F25A -:103250005260AFF30080584600F05BFA24B10021C1 -:1032600040F25660AFF300804046BDE8F88F002C76 -:10327000F1D0002140F24460AFF30080E6E7002087 -:10328000EFF74ABB0120EFF747BB8E480078704745 -:103290002DE9F0418C4C94F82E0020281FD194F891 -:1032A0002D6004EB860797F82550202D00D1FFDF15 -:1032B0008549803901EB861000EB4500407807F81E -:1032C000250F0120F87084F82300294684F82E5039 -:1032D000324602202234FFF76FF8002020700CE401 -:1032E0002DE9F0417A4E784C012538B1012821D0E2 -:1032F000022879D003287DD0FFDFF0E700F02AFA1A -:10330000FFF7C6FF207E00B1FFDF84F821500020C8 -:10331000EFF729FBA168481C04D0012300221846BE -:10332000EFF774FB14F82E0F217806EB01110A68F1 -:10333000012154E0FFF7ACFF0120EFF714FB94F8F4 -:10334000210050B1A068401C07D014F82E0F21783E -:1033500006EB01110A68062141E0207EDFF8648156 -:10336000002708F10208012803D002281ED0FFDF41 -:10337000B5E7A777EFF7E7FB98F80000032801D13E -:1033800065772577607D534951F8200094F8201027 -:1033900051B948B161680123091A00221846EFF7B4 -:1033A00035FB022020769AE7277698E784F82050AC -:1033B00000F0D0F9A07F50B198F8010061680123B6 -:1033C000091A00221846EFF721FB257600E0277640 -:1033D00014F82E0F217806EB01110A680021BDE8D0 -:1033E000F041104700E005E036480078BDE8F041C4 -:1033F000F8F780BCFFF74CFF14F82E0F217806EB8E -:1034000001110A680521EAE710B52F4C94F82E0047 -:10341000202800D1FFDF14F82E0F21782C4A02EB70 -:1034200001110A68BDE81040042110477CB5264C04 -:10343000054694F82E00202800D1FFDFA068401C2C -:1034400000D0FFDF94F82E00214901AA01EB001003 -:10345000694690F90C002844EFF7A4FB9DF904009D -:103460000F2801DD012000E0002000990844616878 -:10347000084420F07F41A16094F82100002807D083 -:1034800002B00123BDE8704000221846EFF7BEBA33 -:103490007CBD30B5104A0B1A541CB3EB940F1FD3EC -:1034A000451AB5EB940F1BD3934203D9101A431856 -:1034B0005B1C15E0954211D9511A0844401C434247 -:1034C0000EE00000880000202C0A00200000000010 -:1034D000AC070020B8220200FF7F841EFFDF00231C -:1034E000184630BD0123002201460220EFF78EBAB4 -:1034F0000220EFF738BAEFF7D5BA2DE9FC47B14C07 -:10350000054694F82E00202800D1FFDF642D58D303 -:10351000AD4A0021521B71EB010052D394F82E20CA -:10352000A0462046DFF8A49290F82D7009EB021413 -:10353000D8F8000001AA28446946EFF733FB9DF94B -:103540000400002802DD0098401C0090A06800994B -:1035500062684618B21A22F07F42B2F5800F30D26C -:1035600008EB8702444692F82520202A0AD009EB6E -:1035700002125268101A0002C21700EB1260001209 -:1035800088421EDBA068401C10D0EFF78BFAA168C0 -:10359000081A0002C11700EB11600012022810DDAA -:1035A0000120EFF7E0F94FF0FF30A06020682844D9 -:1035B000206026F07F402061012084F82300BDE8D0 -:1035C000FC870020FBE72DE9F0477E4C074694F886 -:1035D0002D00A4F1800606EB801010F8170000B94A -:1035E000FFDF94F82D50A046794C24B1002140F61D -:1035F0006500AFF3008040F6710940F67A0A06EBE9 -:10360000851600BF16F81700012818D0042810D01E -:1036100005280ED006280CD01CB100214846AFF377 -:10362000008020BF002CEDD000215046AFF3008079 -:10363000E8E72A4639460120FEF7BEFEF2E74FF0E2 -:10364000010A4FF00009454624B1002140F68100EF -:10365000AFF30080504600F05CF885F8239024B169 -:10366000002140F68600AFF3008095F82D00FFF7AB -:10367000BFFA064695F8230028B1002CE4D00021BB -:1036800040F68C001FE024B100214FF40960AFF335 -:10369000008005EB860000F1270133463A462630CC -:1036A000FFF7EDF924B1002140F69400AFF300805C -:1036B00000F024F8824695F8230038B1002CC3D0DE -:1036C000002140F69A00AFF30080BDE785F82D6039 -:1036D000012085F82300504600F01BF8002C04D090 -:1036E000002140F6A700AFF30080BDE8F087354920 -:1036F00081F82D00012081F82300704710B535486E -:1037000008B1AFF30080EFF3108000F0010072B653 -:1037100010BD10B5002804D12F4808B1AFF30080C8 -:1037200062B610BD2D480068C005C00D10D010381D -:1037300040B2002806DA00F00F0000F1E02090F817 -:10374000140D03E000F1E02090F8000440097047F8 -:103750000820704710B51B4C94F82400002804D1B1 -:10376000F8F7B6F8012084F8240010BD10B5154C08 -:1037700094F82400002804D0F8F7D3F8002084F847 -:10378000240010BD10B51C685B68241A181A24F0B8 -:103790007F4420F07F40A14206D8B4F5800F03D2C9 -:1037A000904201D8012010BD002010BDD0E90032A8 -:1037B000D21A21F07F43114421F07F41C0E900314A -:1037C000704700002C0A0020FF1FA107AC07002053 -:1037D00000000000000000000000000004ED00E018 -:1037E000F0B5734AD2F80032724D002401212E78D0 -:1037F00056B9714E3460704F03263F1D3E606E4FC8 -:1038000004260C373E602970C2F80042D160116076 -:10381000694C4834D16425688542FBD35160D1603E -:10382000C2F80032F0BD2DE9F041044680074FF0A8 -:1038300000054FF0010604D560480560066024F0DD -:103840000204E0044FF0FF3705D55D484660C0F83C -:10385000087324F48054600003D55A48056024F0AE -:103860008044E0050FD55248C0F80052C0F80873F4 -:1038700051490D60091D0D604F4A04210C32116041 -:10388000066124F48074A00409D54F484660C0F84E -:103890000052C0F808734D48056024F40054C4F386 -:1038A0008030C4F3C031884200D0FFDF14F4404FB1 -:1038B00014D047484660C0F8087346488660C0F890 -:1038C0000052C0F8087344490D600A1D16608660F6 -:1038D000C0F808730D60166024F4404420050AD532 -:1038E0003E4846608660C0F80873C0F848733C489C -:1038F000056024F400640DF077FB3A48044200D0E0 -:10390000FFDFBDE8F08170B5202500224FEA0203F9 -:1039100020FA02F1C90719D051B201F01F060124A3 -:10392000B4404E09B60006F1E026C6F88041C6F85C -:103930008042002906DA01F00F0101F1E02181F84F -:10394000143D03E001F1E02181F80034521CAA4249 -:10395000DED370BD70B5174C0D466060FFF763FF96 -:103960006068FFF7D0FF2846F8F7A7F80CF05EFF75 -:1039700000F0ABF80DF038FB0DF083FAF8F78CF996 -:10398000BDE870400DF000B810B50A4C6068FFF754 -:103990004AFF6068FFF7B7FF0DF026FBF8F721F943 -:1039A0000020606010BD0348406870470A207047DF -:1039B000008000408C00002004850040FC1F004077 -:1039C00000C0004004E5014000D0004004D50040A4 -:1039D00000E0004000F0004000F5004000B0004072 -:1039E00008B50040FEFF0FFD70B522490A680AB312 -:1039F0000022154601244B685B1C4B60092B00D349 -:103A00004D600E7904FA06F30E681E420FD0EFF3F4 -:103A1000108212F0010272B600D001220C689C43A1 -:103A20000C6002B962B649680160002070BD521C8A -:103A3000092AE0D3052070BD4FF0E0214FF480004B -:103A4000C1F800027047EFF3108111F0010F72B658 -:103A50004FF0010202FA00F20648036842EA03024C -:103A6000026000D162B6E7E70248002101604160D0 -:103A70007047000094000020AD4911F8410F4978CB -:103A8000884201D3401A02E0C1F141010844C0B2AA -:103A90007047A749433111F8410F4978884201D353 -:103AA000401A02E0C1F141010844C0B27047A04988 -:103AB000863111F8410F4978884201D3401A02E05B -:103AC000C1F141010844C0B270479A4910B5802045 -:103AD00081F8000496490020433101F8410F4870F5 -:103AE000934901F8410F48709149863101F8410F1F -:103AF000487091480DF00EF98F48401C0DF00AF9FE -:103B0000EFF7DAF8BDE8104000F006B94020704742 -:103B1000B2E770B50C4605460026FFF7ADFF844AB4 -:103B2000A04214D30021641EE4B20FD392F84200E5 -:103B3000105C05F8010B92F84200401CC0B282F8FC -:103B400042004128EFD182F84210ECE7012600F054 -:103B5000E3F8304670BD402070479AE770B50C46D8 -:103B600005460026FFF795FF714A4332A04214D361 -:103B70000021641EE4B20FD392F84200105C05F8F5 -:103B8000010B92F84200401CC0B282F8420041286A -:103B9000EFD182F84210ECE7012600F0BDF8304684 -:103BA00070BD402101700020704710B50446FFF73A -:103BB0007EFF2070002010BD70B50C460546FFF753 -:103BC00076FF5B4A8632A04215D30021641EE4B220 -:103BD0000FD392F84200105C05F8010B92F84200F6 -:103BE000401CC0B282F842004128EFD182F8421056 -:103BF000ECE7002401E042F2070400F08DF82046D3 -:103C000070BD70B50C460546412900D9FFDF4B4811 -:103C10000068103840B200F066F8C6B20D2000F01F -:103C200062F8C0B2864203D2FFDF01E0EFF794F8FA -:103C300021462846FFF76DFF0028F7D070BD2DE91B -:103C4000F0413D4F0025064617F10407412257F881 -:103C5000254094F8421094F8410000F053F888B3DE -:103C60006D1CEDB2032DF1D331484122433090F861 -:103C7000421090F8410000F045F8002831D02C485F -:103C8000412290F8421090F8410000F03BF80028E3 -:103C900027D027484122863090F8421090F8410002 -:103CA00000F030F800281CD0EFF72CF822480DF077 -:103CB00039F8B0F5005F00D0FFDFBDE8F0411E48E5 -:103CC0000DF046B894F84100265494F84100401C89 -:103CD000C0B284F841004128C6D1002084F84100D8 -:103CE000C2E7BDE8F081002806DA00F00F0000F11D -:103CF000E02090F8140D03E000F1E02090F80004BB -:103D000040097047401C884204D0904200D109B15C -:103D1000002070470120704710B507480DF002F8E9 -:103D2000002803D1BDE81040EEF7D7BF10BD00005A -:103D30005C0A00200DE000E09C00002004ED00E0A3 -:103D4000164908784A78401CC0B2904205D0144BFE -:103D500001221A60BFF34F8F087070472DE9F041C0 -:103D60000E4C4FF0E02600BFEFF77CF820BF40BFBD -:103D700020BF677820786070D6F80052EDF7CCFA53 -:103D8000854305D1D6F8040210B92078B842EBD0AB -:103D9000EFF763F80020BDE8F0810000AC000020E0 -:103DA000180502402DE9F041012528034FF0E021DC -:103DB0000026C1F880011E4CC4F800610C2000F000 -:103DC0002CF81C4801680268C94341F3001142F015 -:103DD00010020260C4F804532560491C00E020BFB3 -:103DE000D4F80021002AFAD019B9016821F0100195 -:103DF0000160114807686560C4F80853C4F80061A1 -:103E00000C2000F00AF83846BDE8F08110B50446F1 -:103E1000FFF7C8FF2060002010BD00F01F02012145 -:103E200091404009800000F1E020C0F88012704706 -:103E300000C0004010ED00E008C500402DE9F0474B -:103E4000FF4C0646FF21A06800EB06121170217896 -:103E5000FF2910D04FF0080909EB011109EB0617F3 -:103E60004158C05900F0F4F9002807DDA168207816 -:103E700001EB061108702670BDE8F08794F8008009 -:103E800045460DE0A06809EB05114158C05900F006 -:103E9000DFF9002806DCA068A84600EB08100578CA -:103EA000FF2DEFD1A06800EB061100EB08100D709C -:103EB0000670E1E7F0B5E24B0446002001259A6860 -:103EC0000C269B780CE000BF05EB0017D75DA742DE -:103ED00004D106EB0017D7598F4204D0401CC0B262 -:103EE0008342F1D8FF20F0BD70B5FFF704FBD44C3E -:103EF00008252278A16805EB0212895800F0A8F97C -:103F0000012808DD2178A06805EB01114058BDE8C3 -:103F10007040FFF7E7BAFFF7B8F9BDE87040F7F770 -:103F2000E9BE2DE9F041C64C2578FFF7E4FAFF2DF4 -:103F30006ED04FF00808A26808EB0516915900F002 -:103F400087F90228A06801DD80595DE000EB0511CA -:103F500009782170022101EB0511425C5AB1521E11 -:103F60004254815901F5800121F07F418151284659 -:103F7000FFF764FF34E00423012203EB051302EB97 -:103F8000051250F803C0875CBCF1000F10D0BCF5DF -:103F9000007F10D9CCF3080250F806C00CEB423C6D -:103FA0002CF07F4C40F806C0C3589A1A520A09E018 -:103FB000FF2181540AE0825902EB4C3222F07F4209 -:103FC0008251002242542846FFF738FF0C21A06896 -:103FD00001EB05114158E06850F82720384690471A -:103FE0002078FF2814D0FFF786FA2278A16808EB22 -:103FF00002124546895800F02BF9012893DD2178FB -:10400000A06805EB01114058BDE8F041FFF76ABA1E -:10401000BDE8F081F0B51D4614460E460746FF2B5D -:1040200000D3FFDFA00700D0FFDF8548FF2100227B -:10403000C0E90247C5700671017042708270104677 -:10404000012204E002EB0013401CE154C0B2A8427C -:10405000F8D3F0BD70B57A4C064665782079854274 -:1040600000D3FFDFE06840F825606078401C607096 -:10407000284670BD2DE9FF5F1D468B460746FF248D -:10408000FFF739FADFF8B891064699F80100B8420F -:1040900000D8FFDF00214FF001084FF00C0A99F81B -:1040A0000220D9F808000EE008EB0113C35CFF2BD7 -:1040B0000ED0BB4205D10AEB011350F803C0DC451A -:1040C0000CD0491CC9B28A42EED8FF2C02D00DE0B8 -:1040D0000C46F6E799F803108A4203D1FF2004B09A -:1040E000BDE8F09F1446521C89F8022008EB041129 -:1040F0000AEB0412475440F802B00421029B00224C -:10410000012B01EB04110CD040F801204FF4007892 -:1041100008234FF0020C454513D9E905C90D02D01B -:1041200002E04550F2E7414606EB413203EB04134F -:1041300022F07F42C250691A0CEB0412490A8154E2 -:104140000BE005B9012506EB453103EB041321F023 -:104150007F41C1500CEB0411425499F800502046A5 -:10416000FFF76CFE99F80000A84201D0FFF7BCFEF3 -:104170003846B4E770B50C460546FFF7BCF906466D -:1041800021462846FFF796FE0446FF281AD02C4DFC -:10419000082101EB0411A8684158304600F058F896 -:1041A00000F58050C11700EBD14040130221AA68EE -:1041B00001EB0411515C09B100EB4120002800DC47 -:1041C000012070BD002070BD2DE9F0478846814672 -:1041D000FFF770FE0746FF281BD0194D2E78A86800 -:1041E0003146344605E0BC4206D0264600EB0612B6 -:1041F0001478FF2CF7D10CE0FF2C0AD0A6420CD18A -:1042000000EB011000782870FF2804D0FFF76CFE47 -:1042100003E0002030E6FFF76BF941464846FFF720 -:10422000A9FF0123A968024603EB0413FF20C85429 -:10423000A878401EB84200D1A87001EB041001E03C -:10424000280B002001EB061100780870104613E6D9 -:10425000081A0002C11700EB11600012704700003D -:1042600070B50446A0F500002D4EB0F1786F02D273 -:104270003444A4F500042B48844201D2012500E017 -:10428000002500F043F848B125B9B44204D32648CC -:10429000006808E0012070BD002070BD002DF9D13C -:1042A000B442F9D321488442F6D2F3E710B504466C -:1042B000A0F50000B0F1786F03D219480444A4F5CA -:1042C000000400F023F84FF0804130B11648006838 -:1042D00004E08C4204D2012003E014488442F8D266 -:1042E000002080F0010010BD10B520B1FFF7DEFF07 -:1042F00008B1012010BD002010BD10B520B1FFF79E -:10430000AFFF08B1012010BD002010BD08480949C9 -:104310000068884201D101207047002070470000EA -:1043200000000020003002002000002008000020D3 -:10433000B0000020BEBAFECA0548064A0168914294 -:1043400001D100210160044901200860704700008C -:10435000B0000020BEBAFECA40E50140534800212B -:104360000170417010218170704770B50546164686 -:104370000C460220EEF73FFA4C49012008704C49E8 -:10438000F01E08604B480560001F046070BD10B54A -:104390000220EEF730FA4549012008704648002116 -:1043A000C0F80011C0F80411C0F8081143494FF4D7 -:1043B0000000086010BD3D480178C9B1404A4FF483 -:1043C000000111603C49D1F800310022002B1CBFD4 -:1043D000D1F80431002B02D0D1F8081111B142708C -:1043E000102103E001214170364909688170027093 -:1043F0000020EEF700BA2D480178002904BF40786C -:1044000070472D48D0F80011002904BF02207047E2 -:10441000D0F8001100291CBFD0F80411002905D0E4 -:10442000D0F80801002804BF012070470020704721 -:104430001E4800B50278204B4078C821491EC9B2F9 -:1044400082B1D3F800C1BCF1000F10D0D3F8000145 -:1044500000281CBFD3F8040100280BD0D3F80801B2 -:1044600050B107E0022802D0012805D002E000295F -:10447000E4D1FFDF002000BD012000BD0B48017822 -:10448000002904BF807870470B48D0F8001100293C -:104490001CBFD0F80411002902D0D0F8080108B1DF -:1044A0001020704707480068C0B27047B400002071 -:1044B00010F5004008F5004000F0004004F5014010 -:1044C00008F5014000F400404C48002101704170A3 -:1044D000704770B5064614460D460120EEF78BF97D -:1044E00047480660001D0460001D056070BD70B582 -:1044F000424A012540EA01411570424A41F080716B -:104500001160414C0026C4F80461404A4FF04071EC -:104510001160002802BFC4F80052256070BD012858 -:1045200018BFFFDFC4F8006225604FF00070384903 -:10453000086070BD3148017879B1344A4FF040715C -:1045400011603149D1F804210021002A08BF4170CF -:1045500002D0304A1268427001700020EEF74BB969 -:1045600026480178002904BF407870472648D0F8D3 -:104570000401002808BF704726480068C0B2704791 -:10458000002808BF704730B51C480078002808BFD5 -:10459000FFDF1D48D0F80411002918BF30BD0224E8 -:1045A000C0F80443DFF870C0DCF80010C1F3001558 -:1045B000DCF8001041F01001CCF80010D0F8041124 -:1045C000002904BF4FF400414FF0E02207D100BFA3 -:1045D000C2F8801220BFD0F80431002BF8D02DB9DA -:1045E000DCF8001021F01001CCF80010C0F80843EE -:1045F00030BD05490120886070470000B7000020E9 -:1046000008F5004004F5004000F0004008F50140C6 -:1046100004F5014000F4004010ED00E070B5FF4CDF -:1046200000250120657025706572A572E07284F81E -:104630002150A56204F1380065630CF06BFB002883 -:1046400018BFFFDFA577F6480DF0F6FBF5494FF0F0 -:10465000FF300860091D0860091D0D60091D086014 -:10466000091D0D60091D0860091D0860091D08600D -:10467000091D0860091D0860091D0860091D086002 -:10468000091D0860091D086070BD30B4E349026867 -:10469000DFF898C34A6142688A61007A08770A7D28 -:1046A000E14BACF1040401204AB10A7E00FA02F2A7 -:1046B0001A608D7D002D0CBF2260CCF800204A7D51 -:1046C000002A04BF30BC70474A7E90401860C97D04 -:1046D00000290CBF2060CCF8000030BC7047D549E1 -:1046E000D3480860091DD4480860704710B50446D7 -:1046F000012908BF002105D002291ABFFFDF0021D0 -:104700004FF0807141F48470CA4940F48010086011 -:10471000E0B240F44030091D40F000700860C74826 -:10472000D0F80001002818BFFFDF10BD01202DE9DF -:10473000F04102254FF0E0270026C7F88051C0491C -:104740000E600860BF490A6822F0770242F08802D2 -:1047500042F000420A60091D0A6822F47F4242F4D6 -:10476000B0520A60AD4CB84965770D60B84AB74998 -:104770001160121FB7491160B74A40F25B611160C6 -:10478000121F40F203111160111F0860B34903208A -:104790000860B3499620086094F91E000CF06AFD89 -:1047A000607F002814BF4FF4C020AE48AE490860B7 -:1047B000AF49AE480860091FAE480860C7F880528C -:1047C0009E491020C1F8040384F82D60BDE8F081F3 -:1047D000A948016821F0010141F080710160704732 -:1047E0008E4A0368C2F802308088D0801172704708 -:1047F0008A4890F821007047884A517010707047BD -:10480000F0B50546800000F1804000F580508B88AF -:10481000C0F820360B78D1F8011043EA0121C0F826 -:10482000001605F10800012707FA00F6934C002A4C -:1048300004BF2068B04304D0012A18BFFFDF2068FE -:1048400030432060206807FA05F108432060F0BD7E -:1048500010B504460CF00EFD7048847710BD6F480B -:1048600090F82E0070476D4890F830007047844AE9 -:10487000C1781160006883490002086070472528EC -:1048800008BF02210ED0262808BF1A210AD02728E7 -:1048900008BF502106D00A2894BF0422062202EB4A -:1048A0004001C9B2784A116078490860704770B415 -:1048B0005A4B93F80AC0BCF1010F21D0BCF1020F92 -:1048C0001CBF70BC70475C7D002C04BF70BC70477F -:1048D0004FF47A74BCF1010F6D4E16D0DD7D93F864 -:1048E00019C0002D18BF0125012908BF292121D099 -:1048F000022A08BF674E06F2E141B1FBF4F119E06C -:104900001C7D002CE4D170BC70479D7D93F818C0CD -:10491000002D18BF0125012947D0022A06BF5E4E8F -:104920004FF47A714FF4C861314401F5FA7100BF58 -:10493000B1FBF4F1491F0844584908605849002068 -:10494000C1F84C014FEA0C2085F0010140EA01500A -:1049500040F00311187F820002F1804202F5C0424C -:10496000C2F810154F4901EB8001987EC20002F198 -:10497000804202F5F832C2F81415DFF82CC1C2F8F3 -:1049800010C5DA7ED30003F1804303F5F833C3F892 -:1049900014153849C3F81015012101FA00F09140AF -:1049A00008434249086070BC7047022A14BF4FF4A4 -:1049B000C8614FF47A7149F6FC621144B8E72DE9F9 -:1049C000F0411E4D0746032014468846C5F80002F4 -:1049D000124E707F002814BF4FF4C0202148334985 -:1049E000086040460CF094FC20460CF071FC01205D -:1049F00017B1012F60D062E02D4B19685A06022CC6 -:104A0000D2F8202314BFC2F30622C2F3066221F4B7 -:104A1000FE4141EA02211960B0724BE0380B0020E0 -:104A20004C0B0020000E0040180500500C050050F3 -:104A3000060102001415004025000302001000408A -:104A4000FC1F00403C1700406015004044800040BF -:104A50009CF5014028110040381500401015004019 -:104A6000441500400000040408F501404080004067 -:104A7000A4F501401011004074170040401600409A -:104A8000241500401C150040081500405415004036 -:104A9000A224020004360200683602004C85004061 -:104AA00000800040006000404C81004004F501405F -:104AB00088150040286002E00221B1726860F9495F -:104AC000C864F948006822464146BDE8F041EEE678 -:104AD0002DE9F0418846F549074603201546C1F8FF -:104AE0000002F34C607F002814BF4FF4C020F1484F -:104AF000F14E306040460CF00BFC28460CF0E8FB11 -:104B000017B1012F19D021E0EC490A684806022D9F -:104B1000D0F8200314BFC0F30620C0F3066022F4CF -:104B2000FE4242EA002008600120A072606B40F45F -:104B3000801060634FF4801007E00220A072606B69 -:104B400040F4001060634FF4001030602A46414684 -:104B5000BDE8F0410020AAE62DE9FF4FD34C824684 -:104B6000002681B003208946C4F80002D04D687F3A -:104B7000002814BF4FF4C020CE48CF4F38600398B0 -:104B80000CF0C6FB04980CF0A3FBCD494FF00108D4 -:104B9000BAF1000F03D0BAF1010F32D03BE0C74B9E -:104BA00004981A684FF0805C0228DCF8200314BFD8 -:104BB000C0F30620C0F3066022F4FE4242EA002061 -:104BC00018600C6095F82D00012806D0022818BF47 -:104BD000FFDF0CD085F80A801DE0DDE9031395F8AE -:104BE0002C2048460CF0E6FBA96A4618F2E7DDE9FE -:104BF000031295F82C3048460CF097FBA96A46182A -:104C0000E8E7B048086095F82D00012818BFFFDFDD -:104C100020D00220A872AC480660AD49AB480860BD -:104C2000686B40F400206863D4F800924FF0100ADB -:104C3000C4F808A30025C4F80052A6484FF4802BFE -:104C4000C0F800B0FF208DF80000C4F81051C4F87F -:104C500010800EE0DDE9031395F82C2096200CF06F -:104C600087FBA96A4618D4E79DF80000401E8DF81E -:104C700000009DF8000018B1D4F810010028F3D00E -:104C80009DF80000002808BFFFDFC4F80051C4F8F9 -:104C90000C51C4F81051C4F80451C4F81451C4F8AC -:104CA0001851C4F828518C4800680090C4F800924C -:104CB000C7F800B0C4F804A34FF400203860794866 -:104CC000C0F84C8078480068B04228BFFFDF30460B -:104CD000DDE9031205B0BDE8F04FE8E52DE9F8473E -:104CE000724CD4F8000220F00309D4F804034FF00A -:104CF000100AC0F30018C4F808A30026C4F8006224 -:104D00006B4D687F002814BF4FF4C020694871497B -:104D10000860A87A0127012802D0022803D014E0F5 -:104D2000287D10B911E0687D78B1A87EEA7E07FA87 -:104D300000F007FA02F210430860287F800000F1BB -:104D4000804000F5C040C0F81065FF208DF80000DD -:104D5000C4F81061276104E09DF80000401E8DF842 -:104D600000009DF8000018B1D4F810010028F3D01D -:104D70009DF80000002808BFFFDFC4F81061C4F8E8 -:104D800028616E72AE72EF72C4F80092B8F1000F33 -:104D900018BFC4F804A3BDE8F88700684F4920F0A5 -:104DA0007F40086070474FF0E0200221C0F880117A -:104DB000C0F8801270474FF0E0210220C1F80001D6 -:104DC000704747490870704710B546480BF0AAFF76 -:104DD000002818BFFFDF10BD42480BF0B9BF4249A1 -:104DE0000860704730B5324C0546A06AA84228BF1B -:104DF000FFDF012020732561607F40B128442061DE -:104E00002A48D0F8001241F04001C0F800122549AC -:104E10000020C1F84401354920690860606B2649CB -:104E200040F4800060634FF48000086030BD70B5CE -:104E30001F4C0546022020730CF057FA024694F8E6 -:104E40002C1028460CF0E0FA2061617F41B1084443 -:104E500020611648D0F8001241F04001C0F800125D -:104E600010490020C1F844012169A06A08441F4983 -:104E7000086070BD17494FF4800008600C48416B12 -:104E800021F480014163002101737047054801212D -:104E90004160C1600021C0F8441114480160044819 -:104EA00081627047008000404C8500400010004047 -:104EB000380B00200000040404F501408815004070 -:104EC000ACF5014004100040488500404881004096 -:104ED000A8F5014008F50140181100403C150040BC -:104EE000B9000020700B00200415004044850040EC -:104EF000FE4940204877FE490860FE48D0F800127D -:104F000041F04001C0F800127047FA48D0F8001292 -:104F100021F04001C0F80012F549022008607047F6 -:104F2000F448D0F8001221F01001C0F8001201215D -:104F300081617047EF480021C0F81C11D0F80012C1 -:104F400041F01001C0F800127047EA4981B0D1F871 -:104F50001C21012A1EBF002001B07047E64A1268DA -:104F600002F07F02524202700020C1F81C01E348A7 -:104F700000680090012001B0704730B50C00054674 -:104F800008BFFFDF14F0010F1CBF012CFFDF002D55 -:104F90000CBF01200220D54901284872CC72D549A6 -:104FA00004BFD1F8000240F0040007D0022807BF78 -:104FB000D1F8000240F00800FFDF30BDC1F8000268 -:104FC00030BD70B5C94C0023E17A11F0020F18BF53 -:104FD00010F0040F16D111F0100F1CBF94F82F2001 -:104FE000002A02D094F8312062B111F0080F1CBFE2 -:104FF00094F82020002A05D111F0040F03D094F872 -:10500000211001B9012394F809C00122B949BCF16A -:10501000000F06D000F00200184312D0BDE8704027 -:105020005CE6607F002814BF4FF4C020B448B54B45 -:105030001860D1F8000220F00300C1F80002E2720B -:1050400070BD00252846BCF1010F0BD0BCF1020F4A -:1050500018BFFFDF16D0A06A01222844BDE87040C7 -:10506000002124E4D1F8003223F00403C1F8003217 -:105070006072E272A27201231A46002196200CF09F -:1050800054F90FE0D1F8003223F00803C1F80032E0 -:105090006072E2720220A07201231A46002196205B -:1050A0000CF066F90546D6E72DE9F84F964FD7F88C -:1050B0004C218E4C93494FF00108A07A0026CAB1CA -:1050C000012802D0022803D014E0227D12B911E099 -:1050D000627D7AB1A27EE37E08FA02F208FA03F357 -:1050E0001A430A60227F920002F1804202F5C04218 -:1050F000C2F81065626B0A606663217B29B1D7F83C -:105100004411012908BF012200D00022794DD5F8B1 -:10511000101101290CBF40210021012805BFD5F83D -:105120000C31012B002320231943012805BFD5F89A -:105130000431012B002310230B437449022804BFC0 -:10514000D1F800C0BCF1010F07D1D5F80CC1BCF1FA -:10515000010F08BF4FF0080C01D04FF0000C4CEAD3 -:105160000303022804BF0968002905D1D5F80C11F2 -:10517000012908BF042100D000211943022803D1CE -:10518000002A18BF022200D100221143022804BFC6 -:10519000D5F80401012805D1D7F84401012818BF2A -:1051A000012000D1002040EA01095948016811F0AE -:1051B000FF0F03D0D5F81411012900D0002184F885 -:1051C0002E10006810F0FF0F03D0D5F81801012849 -:1051D00000D0002084F82F004E48006884F830008A -:1051E00043480068402803D1FFF705F9012800D0A3 -:1051F000002084F83100C5F80061C5F80C61C5F8DD -:105200001061C5F80461C5F81461C5F81861C5F8E6 -:105210002861414800680090C7F844613F48006831 -:105220004D46DFF8FC900090D9F800106162607F75 -:1052300000281CBF081A60623A480068A0620CF09F -:1052400054F884F82C00A07ADFF8DCA084F82D0054 -:1052500002280CD1607850B1DAF8001009780840C3 -:10526000217831EA000008BF84F8208001D084F85A -:105270002060DFF8B88015F0010F15D098F8001005 -:105280002B4A4908606A52F8211088470121294AAF -:1052900098F80030A06A52F82320904798F8000050 -:1052A00010F0010F0BD01FE015F0200F18BF0221E6 -:1052B000EDD115F0020F18BF0021E8D1EEE7DAF8C2 -:1052C0000000062200F10901A01C0CF0E9FB40B926 -:1052D000207ADAF800100978B0EBD11F08BF01205E -:1052E00000D0002084F82100284625E0380B00205B -:1052F0006015004000100040481500401C1100409F -:105300000000040408F50140008000400014004043 -:105310004016004010140040181100404481004025 -:10532000448500404085004004150040B90000203D -:10533000D022020008230200FFF743FE15F0020FFF -:1053400005D03D4898F8001050F82100804715F02E -:105350000C0F07D0394898F8001050F82110C5F309 -:10536000C000884715F0200F05D0354898F8001088 -:1053700050F82100804798F80000022805D105F078 -:105380006E00402806D101F0DDFB98F800000428EB -:1053900028BFFFDFA07A022818BFBDE8F88F207B66 -:1053A000002808BFBDE8F88FC7F84461022815D06F -:1053B000012818BFFFDFA16A2069884298BFFFDF7C -:1053C000D4F81000C9F80000606B1E4940F480005A -:1053D00060634FF480000860BDE8F88F2169A06A1F -:1053E0000844EFE7012804BF28207047022804BFC3 -:1053F0001820704700B5FFDF282000BD012804BF3A -:1054000041F6A4707047022804BF41F2883070470B -:1054100000B5FFDF41F6A47000BD012804BF41F2D2 -:10542000D4707047022804BF41F20400704700B5F1 -:10543000FFDF41F2D47000BDD8220200E822020052 -:10544000F822020004F5014010B53F480AF0F7FBCE -:1054500000213D480AF022FC01213B480AF0F2FB02 -:105460003A49002081F822004FF6FF7088843849BD -:105470000880488010BD704734498A8C824218BF2A -:105480007047002081F822004FF6FF708884704733 -:105490002D49016070472E49088070472B498A8C3E -:1054A000A2F57F43FF3B03D000210160084670470F -:1054B00091F822202549012A1ABF0160012000200D -:1054C0007047224901F1220091F82220012A04BFED -:1054D00000207047012202701D4800888884104611 -:1054E00070471B49488070471849194B8A8C5B8864 -:1054F0009A4206D191F82220002A1EBF01600120A5 -:105500007047002070471148114A818C528891429F -:1055100009D14FF6FF71818410F8221F19B10021C3 -:10552000017001207047002070470848084A818CAC -:105530005288914205D190F8220000281CBF00201B -:1055400070470120704700009A0B0020740B002068 -:10555000BA0000207047574A012340B1012818BF04 -:105560007047137008689060888890817047537006 -:105570000868C2F802008888D08070474D4A10B190 -:10558000012807D00EE0507860B1D2F80200086020 -:10559000D08804E0107828B19068086090898880ED -:1055A0000120704700207047424910B1012803D004 -:1055B00006E0487810B903E0087808B10120704788 -:1055C0000020704730B58DB00C4605460D2104A86B -:1055D0000CF02BFBE0788DF81F0020798DF81E0071 -:1055E00060798DF81D002868009068680190A868AF -:1055F0000290E868039068460BF0B2F920789DF8B5 -:105600002F1088420CD160789DF82E10884207D167 -:10561000A0789DF82D10884202BF01200DB030BD4A -:1056200000200DB030BD30B50C4605468DB04FF0B2 -:10563000030104F1030012B1FEF790FA01E0FEF756 -:10564000E0FA60790D2120F0C00040F04000607168 -:1056500004A80CF0EAFAE0788DF81F0020798DF8A4 -:105660001E0060798DF81D00286800906868019020 -:10567000A8680290E868039068460BF071F99DF8FD -:105680002F0020709DF82E0060709DF82D00A070F6 -:105690000DB030BD10B5002904464FF0060102D010 -:1056A000FEF75CFA01E0FEF7ACFA607920F0C0008A -:1056B000607110BDBE00002070B5FA4E044696F829 -:1056C00092000025012828D096F88C00012833D0BC -:1056D00096F86A0001281CBF002070BD6570132079 -:1056E0002070202206F16C01A01C0CF005FA0120AC -:1056F000A07186F86A50B6F86E10A6F88E10EA49C6 -:1057000049684A7B86F8902086F88C000888FBF769 -:10571000AFFAFAF71FFF012070BD657019202070E5 -:10572000D6F89300C4F80200D6F89700C4F8060033 -:1057300086F89250012070BD657006202070D6F862 -:105740008E00C4F8020086F88C50E4E7D54890F843 -:105750006A10002914BFB0F86E004FF6FF70704752 -:1057600070B5D14800250570017800291CBFFFDF06 -:1057700070BDCC4C84F8625084F8635084F8645057 -:1057800084F8655084F85E5084F8605084F8565070 -:1057900084F8365084F867507F21817094F8660051 -:1057A00028B1FFF7B2FBFEF706FE84F8665084F8D6 -:1057B0006A5084F88C5084F89250BC480AF0D6F8AD -:1057C000BDE87040BA480AF0D1B8B64890F8620017 -:1057D0007047B44900B591F8580091F85710C0F3DC -:1057E0008002C0F340031A4400F001001044052970 -:1057F00010D2DFE801F00B070B030900AD4931F8C7 -:10580000100000BDAC4800BDAC4900E0AC4931F827 -:10581000100000BDFFDF002000BDA24840F2712152 -:10582000B0F85A00484370479E4890F86800002836 -:1058300018BF0120704710B59A4C207A022818BF73 -:10584000032808D1207C04F1110108F071FF082819 -:105850001CBF012010BD207A002816BF022800209E -:105860000120BDE81040FFF79FBE8E4908727047C7 -:105870008C4981F8600070472DE9F041894C82B075 -:10588000207A002816BF022800200120607204F14F -:105890000A01FFF773FE207A022816BF03280121B0 -:1058A000002184F85F10082084F85D00607A0126EA -:1058B000002504F10A02012804BF527912F0C00F3A -:1058C0000AD004F10A02012804D1507900F0C00086 -:1058D000402801D0002000E0012084F85E0029B9B2 -:1058E00094F85700012818BF042806D1207C04F141 -:1058F000110108F01DFF84F85D002560FDF7B8F880 -:1059000060604FF0000894F85D0008F02DFF074636 -:1059100094F85F00002818BF002F04D010213846EB -:1059200009F093FD68B194F8600000281CBF94F85A -:105930005E0000281DD0607A04F10A0101280ED013 -:1059400012E06672424604F10A013846FFF76BFE28 -:1059500094F85D1004F10A0008F0FEFF09E04879B0 -:1059600000F0C000402840D0294604F10A00FFF7AB -:1059700091FE04F10A014D480AF01EF8617A4B4885 -:105980000AF03FF804F10A0149480AF015F8617A73 -:1059900047480AF036F894F8570001281EBF04283B -:1059A00002B0BDE8F081002594F85D0008F0E5FE46 -:1059B000040004BF02B0BDE8F081102109F045FDEC -:1059C00000281CBF02B0BDE8F0812A466946204687 -:1059D000FFF729FE6946354809F0FCFF01213348ED -:1059E0000AF01CF802B0BDE8F08108F0EEFF424674 -:1059F00004F10A01FFF717FEBBE770B5294C417BA4 -:105A000084F85810017984F8571001290CBF00223E -:105A10000288A4F85A20827B84F868208279002AC0 -:105A200016BF022A002201222274D0F80720C4F8EF -:105A30001120B0F80B00A4F8150094F856000125C9 -:105A4000002818BF84F8635094F83600002818BF67 -:105A500084F8645005293AD2DFE801F0030C1E34C3 -:105A60000C000021114809F084FF01210F4809F0C2 -:105A7000BFFF2DE001210D4809F07BFF04F111016A -:105A80000A4809F0A7FF217C084809F0C7FF012157 -:105A9000064809F0ADFF1BE00621044809F069FF44 -:105AA00016E00000BC0B0020CC000020580C0020A9 -:105AB000800C002028230200D0891300302302002C -:105AC000202302000221FE4809F053FF00E0FFDF1F -:105AD0000421FC4809F04DFF84F86250002070BD9D -:105AE00070B5F94C0546002084F864002A4604F19C -:105AF00017000CF001F884F83650012084F8640097 -:105B000070BD10B5F04C002284F8632084F8560074 -:105B1000024604F137000BF0EFFF012084F8630028 -:105B200010BDE94981F8670070472DE9F041E74E63 -:105B300082B0307808BBE44C94F86200E8B1FFF71B -:105B400043F9002584F8615075702846FFF739F94C -:105B5000FEF7ECFDFEF7C3FDDD48FEF788FEDD48ED -:105B6000FFF71BF994F85800002610F0010F08D039 -:105B70002520FEF784FE012612E002B00C20BDE8CD -:105B8000F08110F0020F04D02620FEF778FE0226E6 -:105B900006E010F0040F03D02720FEF770FE042665 -:105BA000FEF79DFD84F85C60FFF705F900210122F6 -:105BB0000846FEF78DFF0F210520FEF71DFE94F825 -:105BC0005E00002804BF94F85F00002805D194F817 -:105BD0005700012818BF042874D1FCF749FF064676 -:105BE00031466068FDF755FCBB4990FBF1F701FBBE -:105BF000170041423046FCF746FC6060206838449C -:105C0000206008F092FD2168884274D8C4E90056EB -:105C10004FF0010894F85D0008F0A6FD064694F8E0 -:105C20005F000127002818BF002E04D01021304645 -:105C300009F00BFC68B194F8600000281CBF94F8D0 -:105C40005E0000281DD0617A04F10A0001290ED0FF -:105C500012E03A46677204F10A013046FFF7E3FCAE -:105C600094F85D1004F10A0008F076FE09E040792E -:105C700000F0C00040281DD0414604F10A00FFF7A3 -:105C800009FD04F10A018E4809F096FE617A8C48FC -:105C900009F0B7FE04F10A018A4809F08DFE617A25 -:105CA000884809F0AEFE94F85700012818BF042870 -:105CB00021D108E008F089FE3A4604F10A01FFF715 -:105CC000B2FCDEE717E0012794F85D0008F055FD0F -:105CD000060010D0102109F0B8FB60B93A466946B9 -:105CE0003046FFF7A0FC6946754809F073FE0121B4 -:105CF000734809F093FE617A04F10A00FEF770FD23 -:105D000094F8570001281EBF042894F86300002867 -:105D100008D094F8562004F13701694809F09CFE38 -:105D200084F8635094F8640040B194F8362004F18C -:105D30001701644809F0BCFE84F8645008F069FD5E -:105D4000664808F0FAFD84F86600FFF745F802B0EF -:105D50000020BDE8F0815D494860704770B55A4C3D -:105D600006002BD094F8581094F85C20002521EA06 -:105D7000020010F0010F04D02520FEF780FD012560 -:105D800015E011F0020F02D012F0020F06D011F050 -:105D9000040F0CD012F0040F05D008E02620FEF707 -:105DA0006EFD022503E02720FEF769FD0425FEF7BE -:105DB00096FC94F85C00284384F85C0094F8610039 -:105DC00040B194F85700012808BFFFDFBDE87040DC -:105DD00000F0BFBA36B1002201234FF4967110468D -:105DE000FEF7BAFE3648FEF7FAFF94F8570005288A -:105DF00009D2DFE800F0030303090300012108468C -:105E0000FFF7BBF800E0FFDF94F8580094F85C104F -:105E100030EA01014FF0010002D02C49087070BD3A -:105E200094F85710012912BF84F86100002184F80A -:105E30005C10F2E710B5FEF7C7FF2448007840B9C0 -:105E4000214890F8620020B10020FFF787FF002072 -:105E500010BDFFF71BF8FFF70DF8FEF73FFFFEF749 -:105E6000A2FFFEF7B9FF0C2010BD184901204870B1 -:105E70007047154981F86500704770B5002503F03B -:105E8000A3FA48B1114E3078012809D0022801D078 -:105E9000032842D0FFDF70BDBDE8704000F059BA62 -:105EA000094C94F85700032837D094F8660018B1CD -:105EB000FEF76DFAFFF71CF80848FEF790FF0FE0B9 -:105EC000580C0020800C0020BC0B0020CC000020CF -:105ED0001B2302001823020040420F00A80C0020E0 -:105EE0009620FEF7A4FF94F85700012818BF042855 -:105EF0000AD094F86800012814BF0328102545F043 -:105F00000E010020FFF739F894F86700012808BF58 -:105F1000FFF710F80220307070BDBDE8704001201E -:105F20001CE770B5FE4DFF4C95F86700012817D0AF -:105F300095F8660018B1FEF7E8FFFEF73CFA03F0AB -:105F400043FAB8B12078022818BFFFDF0120FFF71D -:105F500005FF207800281EBF20780128FFDF70BDD4 -:105F6000F148FEF7F2FF002804BF7F20A070FEF783 -:105F7000D7FFDDE7BDE8704000F0EBB92DE9F05F39 -:105F800007464FF00009FEF76AFCE64E824630787D -:105F9000022818BFFFDFE24D7F2495F86700012833 -:105FA00030D0E24809F004FD83464FF0FF08002F8F -:105FB00000F0E480DD4809F00EFE002800F0DE80ED -:105FC000FEF716FC002800F0D98095F86600D74F40 -:105FD00068B108F003FC8046FF2808D00146F81C91 -:105FE00008F0EBFB404608F004FC40EA0A0A584679 -:105FF0004FF0000B062880F0C180DFE800F0BFBF43 -:10600000BF0CBF69C848FEF7A0FF002808BFB470E6 -:10601000FEF786FFC5E795F85700012818BF04284A -:1060200070D0BAF1000F18D195F86800002818BF99 -:10603000022867D13878F91CC0F3801008F078FB8B -:10604000824608F0DAFC40B1504608F096FB20B1D9 -:10605000102109F0FAF9002854D095F867000128BA -:1060600004BF95F89200002805D0B148FEF7B7FEAE -:106070000320307084E0012085F89200B8F1FF0F12 -:106080000FD005F19402511E404608F07FFB002816 -:1060900008BFFFDF95F8930040F0020085F89300F9 -:1060A0000CE03878C0F3801085F89300D5F8EF0045 -:1060B000C5F89400B5F8F300A5F89800B07805F19C -:1060C0009A077F2808BFFFDFB0783870B470CCE73C -:1060D0003878297CC0F38010884209D1062205F166 -:1060E0001101F81C0BF0DCFC002808BF012000D0D7 -:1060F0000020B8F1FF0F06D0C0B995F85D0040450B -:106100001AD113E03AE0B8B13878F91CC0F3801026 -:1061100008F00EFB044608F070FC38B1204608F089 -:106120002CFB18B1102109F090F928B195F857000F -:10613000012818BF04281DD095F85700F0B9BAF10E -:10614000000F17D195F86800002818BF012815D155 -:106150003878F91CC0F3801008F0EAFA044608F019 -:106160004CFC38B1204608F008FB18B1102109F0AA -:106170006CF918B195F865002C46D8B14FF00109BB -:1061800095F8660018B1FEF7C0FEFEF714F9B9F1F4 -:10619000000F1CBF0120FFF7E1FD307800281ABF77 -:1061A00030780128BDE8F09F3078032818BFFFDF62 -:1061B000BDE8F09F7068D4F8FB10C0F80E10B4F87A -:1061C000FF10418294F801110175B97D4175B7F84E -:1061D0001710C182B7F819104180B7F81B108180E1 -:1061E000B7F81D10C180534908300BF02AFE97F80C -:1061F000240000F01F017068017697F82410490907 -:1062000080F864113A78417BC2F340121140417327 -:1062100094F86A00002818BFFFDF84F86CB0D6F845 -:1062200004A0BAF80000A4F86E00BAF80200A4F8BE -:106230008400BAF80400A4F88600BAF80600A4F8AE -:1062400088009AF8640184F88A0094F85F0048B1E5 -:10625000607A04F10A01012804D1487900F0C000F5 -:10626000402835D094F8600040B1607A04F10A010A -:10627000012804BF487910F0C00F29D0C4F878B0C5 -:10628000A4F87CB03878B8F1FF0FC0F380108AF81A -:106290001900D4F8EF00CAF81A00B4F8F310AAF8FD -:1062A0001E101CD0C4F87E00BAF81E00A4F88200AC -:1062B00004F17202511E404608F068FA002808BF37 -:1062C000FFDF94F8710040F0020084F8710015E0DF -:1062D000D4F80A00A067E089A4F87C00D2E7164849 -:1062E0000BF0A6FD9AF8190084F87100DAF81A008C -:1062F000C4F87200BAF81E00A4F87600012084F8F1 -:106300006A0070680088FAF7B3FCFAF713F986F8A8 -:1063100000B0FEF7BBFDFEF7ADFDFEF7DFFC0DE0C4 -:10632000BC0B0020CC000020CE000020A80C0020D8 -:10633000800C0020C70C00203A0C0020FEF733FD33 -:10634000FEF74AFD012003F09CF919E7012203F052 -:1063500048BA70B5FEF79AFDFEF78CFDFEF7BEFC5D -:10636000FEF721FD1F4C002694F8660028B1FEF7C9 -:10637000CCFDFEF720F884F866601B4D2E70FEF70A -:106380002BFD94F85700012804D0BDE87040002090 -:1063900003F077B9022003F074F994F86A0000283A -:1063A00018BFFFDF6878002808BF70BD207C84F824 -:1063B0007100D4F81100C4F87200B4F81500A4F804 -:1063C00076003C2084F86C0068680188A4F86E10A0 -:1063D000012184F86A100088FAF74AFCFAF7AAF853 -:1063E0006E7070BDBC0B0020CC0000202DE9F04188 -:1063F000FF4F044600207978FE4D4FF00108064615 -:1064000011B1012923D007E095F85310002918BFD6 -:1064100087F8018000D0012079782B2211FB02F14E -:10642000294491F82820104318D02A22A01C293191 -:106430000BF062FB66700420207084F8028078788C -:106440002B2110FB01F0284480F8286023E095F808 -:106450002810002918BF7E70DDD1DDE795F87E0099 -:10646000E0B1D5F87F00C4F80200D5F88300C4F885 -:106470000600D5F88700C4F80A00D5F88B00C4F8E8 -:106480000E0095F88F00A07466701220207084F8BA -:10649000028085F87E600120BDE8F08195F8220039 -:1064A00001281ED0287801281CBF0020BDE8F081FB -:1064B0006670132020702022A91CA01C0BF01CFB6E -:1064C000A6712E70A888A884D5F89C00417B85F819 -:1064D000261085F822800088FAF7CAFBFAF73AF806 -:1064E000D9E7667006202070686AC4F8020085F853 -:1064F0002260D0E7BF480178002914BF80884FF69A -:10650000FF7070472DE9F041BA4C064694F8280018 -:10651000002818BFBDE8F081304609F049FA01466D -:1065200001250020072937D2DFE801F00A040736E9 -:106530003636090084F82A5009E0032000E00220E2 -:1065400084F82A0004F13301304609F09BFA84F8FC -:10655000320094F8AF0018B1FDF74DFF01281FD0AD -:10656000304609F057FA84F82B0004F12C0130462C -:1065700009F029FA9E4E04F1520730787F2808BFAF -:10658000FFDF307838707F20307084F82850BDE805 -:10659000F041032001F005BF84F83200BDE8F0812E -:1065A000FDF76CFF04F12C02511E08F0EFF80028F3 -:1065B00008BFFFDF94F82B1041F0020184F82B1084 -:1065C000D8E710B5002001F0F6FD8A4CA8B1FEF71F -:1065D000F2FB012200211046FEF7F1F904F1BC00A4 -:1065E000FEF7FDFBD4F8B400FEF7FCFB94F8A00026 -:1065F000032818BF02281FD022E0FEF747FCFEF751 -:1066000039FCFEF76BFBFEF7CEFB94F8AF0030B120 -:10661000FEF77BFCFDF7CFFE002084F8AF000120E1 -:1066200084F8B800022084F8B200FEF7D5FBBDE87C -:106630001040002001F0B5BE01210020FEF79DFCB6 -:10664000FEF778FC94F8AF0018B1FDF7A0FEFEF756 -:106650004FFC032084F8B20010BD66490028B1F851 -:10666000BA202CD0FF2A0BD24FF6FF7000EA42006E -:10667000A1F8BA00FF2888BFFF2001D9A1F8BA000D -:106680005B484268012A12BF002A0D224260D243B1 -:10669000C2EBC20303EB021291F8B930DB4303EB08 -:1066A000830CCCEB83131A444260900CB1F8BA20EF -:1066B000B0FBF2F302FB130081F8B9007047012A26 -:1066C000DED95008A1F8BA0008BF0120D8D1D5E71B -:1066D00070B5484C002584F8B250012684F8B260A9 -:1066E00094F8B20002281BBF94F8B20001280020E1 -:1066F000FFDF18BF70BD2B2101FB004181F828503E -:10670000401CC0B20228F6D3257084F8225094F8B9 -:10671000AF0028B1FEF7F9FBFDF74DFE84F8AF504E -:1067200084F8AE5084F89B60324884F8A05084F816 -:10673000B15040F2011120F8981F817070BD2DE911 -:10674000F0412C4C05460C2794F8B20001281FBFDD -:1067500094F8B20002280C20BDE8F081FEF734FB6B -:10676000FDF7E4FFFDF7BBFF94F898000126002831 -:1067700001BF94F89900002894F89A00002874D07A -:1067800094F8A000032802D0022805D008E00521D3 -:10679000194800F0DEFE03E00321174800F0D9FE9F -:1067A00094F8AC00002804BF94F8AD00002847D04E -:1067B000FCF75EF907463946D4F8A800FCF769FEF5 -:1067C0000E4990FBF1F801FB180041423846FBF7F7 -:1067D0005AFEC4F8A800D4F8A4004044C4F8A400A9 -:1067E00007F0A3FFD4F8A410884229D8002007E0BE -:1067F000D4000020D00C0020B40D002040420F0037 -:10680000C4E9290794F8AD0000281CBF012008F056 -:10681000AFF8012194F8AE0000281CBF94F8AC003A -:1068200000280DD094F8910004F19202012804D1BF -:10683000507900F0C00040280ED01046FEF72AFF25 -:1068400094F8911004F19200FDF7CAFF94F8B20099 -:106850000027012818D112E008F0B7F8324604F1F9 -:106860009201FEF7E0FEEBE7FFE794F8B2000228A2 -:1068700004BF84F8B2600C2006D1BDE8F08184F832 -:10688000B860022084F8B20094F89B0080B108F050 -:1068900018F8FE4808F051F884F8AF00FC48C4F836 -:1068A000B450FEF77AFAFEF797FA3846BDE8F08161 -:1068B00007F0AFFFEDE770B5FEF786FAF54C94F8F8 -:1068C000B200022803D0FEF787FA0C2070BD012029 -:1068D00084F8B900A4F8BA000220FEF772FAEE4874 -:1068E000FDF7C5FFED4B002004F1980294F8B110BC -:1068F000491CA3FB015C4FEA5C0CACEB8C0C6144C3 -:10690000C9B284F8B110895C012907D0401CC0B21B -:106910000328EBD3FFF755FE002070BD94F8B100BB -:10692000DF49085CFDF7ABFFFDF7D9FEF2E710B5D4 -:10693000D84C94F89030022B14BF032B00280BD1B5 -:1069400000291ABF022901200020114607F0F0FE9D -:1069500008281CBF012010BD94F89000002816BF25 -:10696000022800200120BDE81040FEF71DBEC948E6 -:1069700090F89000002816BF022800200120FEF7A2 -:1069800013BEC44981F890007047C24981F8AE0037 -:10699000704770B5BF4C94F89000002816BF0228CD -:1069A0000020012084F8910004F19201FEF7E6FD39 -:1069B00094F89000022816BF03280121002184F8D2 -:1069C000AD1094F89100002504F19202012804BF53 -:1069D000527912F0C00F0AD004F19202012804D1BA -:1069E000507900F0C000402801D0002000E00120D4 -:1069F00084F8AC00002804BF002970BDC4F8A4507E -:106A0000FCF736F8C4F8A80094F8AD0000281CBFC5 -:106A1000002007F0ADFF002694F8AE0000281ABF52 -:106A200094F8AC00002870BD94F8910004F1920134 -:106A3000012804D1487900F0C000402806D029463A -:106A400004F19200BDE87040FEF724BE07F0BDFFE0 -:106A5000324604F19201BDE87040FEF7E4BD002823 -:106A600016BF0228012200228A4981F89B2081F862 -:106A7000A100704770B5874D0C4600280CBF01215E -:106A8000002185F89B1085F8A2004FF0080085F8DA -:106A9000A3000BD1002C1ABF022C012000201146AC -:106AA00007F046FE85F8A300082801D0002070BD3D -:106AB000022C14BF032C1220F8D170BD754A032894 -:106AC00008BFC2F89C1082F8A000002070477149EE -:106AD00091F8A000032804D0012818BF022807D08D -:106AE00004E091F8A200012808BF70470020704719 -:106AF00091F8A100012814BF03280120F6D17047A6 -:106B000010B5FEF7C3F9FEF7B5F9FEF7E7F8FEF7A3 -:106B10004AF9604C94F8AF0030B1FEF7F6F9FDF792 -:106B20004AFC002084F8AF00012084F8B80002205D -:106B300084F8B200FEF750F9002010BD554981F8E5 -:106B4000B300704710B5FEF7A1F9FEF793F9FEF711 -:106B5000C5F8FEF728F94F4C94F8AF0030B1FEF7B6 -:106B6000D4F9FDF728FC002084F8AF00012084F858 -:106B7000B800022084F8B200FEF72EF9BDE81040FC -:106B8000002001F00EBC2DE9F84F424CFF217F2779 -:106B9000444E84F8B0104FF00008002800F0DC826A -:106BA00004F1BC0008F0E7FF30B904F1BC0009F0C3 -:106BB00002F8002800F0D08294F8B200334D052886 -:106BC00080F0C782DFE800F0F1F1F103F0002F4818 -:106BD00008F0EEFEB07094F89B0030B9FDF73FFE70 -:106BE000002808BF4FF0000801D04FF0010894F8CA -:106BF000AF0078B107F0F2FD84F8B0000146FF283D -:106C00000CD0E81C07F0D9FD94F8B00007F0F1FDB6 -:106C100040EA080894F8B000FF2812D107F081FE7E -:106C200084F8B00094F89B1059B1082809D128784D -:106C3000E91CC0F3801007F07BFD082818BF4FF057 -:106C40000008B078072880F0C781DFE800F04BB873 -:106C500004FCFCFC300094F8AF0018B1FEF755F9C5 -:106C6000FDF7A9FB0F48FEF770F9002808BF377041 -:106C7000FEF756F9B8F1000F00F0598194F8A00022 -:106C8000012818BF022840F052810DE08C0D002031 -:106C900038230200D00C00203E230200ABAAAAAA8F -:106CA0003B230200D4000020FEF718F868E094F8B7 -:106CB000AF0018B1FEF729F9FDF77DFBFE48FEF79E -:106CC00044F9002808BF3770FEF72AF9B8F1000F21 -:106CD00000F02D8194F8A00002284AD001284FD05E -:106CE00000F025B994F8AF0018B1FEF70EF9FDF7E2 -:106CF00062FBF148FEF729F9002808BF3770FEF75C -:106D00000FF9B8F1000F00F0128194F8A0000228EA -:106D10002FD0012834D003281CBFFFDFBDE8F88F37 -:106D2000E978D4F89C00827E91421BD12979C27EF9 -:106D3000914217D16979027F914213D1A979427F9B -:106D400091420FD1E979827F91420BD1297AC27F9A -:106D5000914207D12978427EC1F38011914208BF48 -:106D6000012100D0002194F8A220012A0ED0E9B11F -:106D7000D9E0D248FFF7C6FBBDE8F84F00F002BBF0 -:106D8000CE48FFF7BFFBBDE8F84F1AE4002974D1E5 -:106D900000F11A01C94808F016FEC84808F03AFE8A -:106DA000D4F89C104876BEE024E1D2E194F8A30028 -:106DB00008287DD094F8B01081425ED0B7E094F8F6 -:106DC000AF0018B1FEF7A1F8FDF7F5FABA48FEF7E3 -:106DD000BCF8002808BF3770FEF7A2F894F8AD00A1 -:106DE00000280CBF4FF0010B4FF0000B4FF00009D3 -:106DF0002878C10905F1090007D0407900F0C000EA -:106E0000402808BF4FF0010A01D04FF0000A94F863 -:106E1000A000032806D194F89B00002818BF94F81E -:106E2000A30001D194F8B00007F09EFC009088B157 -:106E3000102108F00AFB002818BF4FF0010BBAF12F -:106E4000000F07D000E0C7E005F109010098FEF748 -:106E5000B9FB814694F8A00003280FD0FDF73EFF50 -:106E6000B8F1000F69D0FDF7C3FC50EA090064D007 -:106E70009248FFF747FB00F041B954E0D4F89C007A -:106E8000E978827E91421DD12979C27E914219D141 -:106E90006979027F914215D1A979427F914211D13E -:106EA000E979827F91420DD1297AC27F914200E037 -:106EB0003DE007D12978407EC1F38011814208BFAF -:106EC000012500D0002594F8B000082805D094F8DA -:106ED000A310884208BF012600D00026B9F1000F98 -:106EE00005D1BBF1000F04D0FDF782FC08B10121F0 -:106EF00000E00021B8F1000F09D094F8A2000128A9 -:106F000003D020B955EA060001D0012000E000209E -:106F100001420CD094F8A200012804BF002DD4F83F -:106F20009C003FF435AFBDE8F84F00F08ABAFDF79A -:106F3000D5FEBDE8F84FFFF744BB94F8A100032845 -:106F400018BF02287ED1BAF1000F7BD0B9F1000F33 -:106F500078D1DFF8688194F87E00002872D101258D -:106F600084F8805094F8AF0018B1FDF744FA012876 -:106F700021D0404608F04EFD84F8810004F18201E2 -:106F8000404608F020FD404608F051FD84F8880096 -:106F900004F18901404608F024FD307804F18F089F -:106FA0007F2808BFFFDF307888F80000377084F84A -:106FB0007E500320A0E0FDF761FA04F18202511E29 -:106FC00007F0E4FB002808BFFFDF94F8810040F0E1 -:106FD000020084F88100D6E794F8AF0018B1FDF7FD -:106FE00094FFFDF7E8F93448FDF7AFFF00286CD1B6 -:106FF0003770CAE0314808F0DBFCB0703048E978FF -:10700000427A91421CD12979827A914218D16979C8 -:10701000C27A914214D1A979027B914210D1E979C7 -:10702000427B91420CD1297A827B914208D1297806 -:107030000078C1F38011B1EBD01F08BF012500D04B -:10704000002500E042E0FDF749FEB07804286BD14E -:10705000D5B31948FDF779FF002808BF3770FDF751 -:107060005FFF94F8B80000281CBF0020FFF7F5FA76 -:107070004FF0010884F8B880104D94F8530028BBF5 -:10708000042084F8550094F8AF00A5F1910918B1D7 -:10709000FDF7B1F9012835D0284608F0BBFC0949B5 -:1070A00081F8560009F12C01284608F08CFC00BF3D -:1070B00004F15E0128460AE0D40000208C0D002077 -:1070C000B40D0020D00C00202EE05EE016E008F0A9 -:1070D00005FD84F85D001F2884BF1F2084F85D0033 -:1070E00004F17D0530787F2808BFFFDF30782870F5 -:1070F000377084F85380042001F053F9BDE8F84F4D -:10710000FFF75FBAFDF7BAF909F12C02511E07F03B -:107110003DFB002808BFFFDFFE4890F8560040F016 -:10712000020089F82B00C3E7FB48FDF70EFF00289B -:1071300008BF3770FDF7F4FE94F8B800002804BFCC -:107140000120FFF78AFA84F8B880BDE8F84FFFF70E -:1071500038BAFFDFBDE8F88F94F8B200052828BFE1 -:10716000BDE8F88FDFE800F0030303041900F1E73E -:1071700094F8AF0018B1FDF7C8FEFDF71CF9E6481A -:10718000FDF7E3FE00283FF433AFFDF7C9FEFDF73E -:10719000A5FDBDE8F84FFFF714BADF48FDF7D5FEAF -:1071A000002808BF3770FDF7BBFE94F8B800002830 -:1071B00004BF0120FFF751FA84F8B880FDF78EFD77 -:1071C000BDE8F84FFFF7FDB970B5D24C94F8B200A6 -:1071D000072878D2DFE800F08D8D8D8D8D041000AA -:1071E000CE48FDF7FCFDFDF7A5FE9620FDF71FFE3E -:1071F000042084F8B20070BDFDF748FEFDF73AFEAA -:10720000FDF76CFDFDF7CFFD012584F8B850022095 -:1072100084F8B200FDF7E0FD2078002818BFFFDFFA -:107220000026A670D4F89C000188A1804188618363 -:107230008188A183C088E08384F8206094F8AD1031 -:10724000B74849B10178C21CC1F3801121B151790D -:1072500001F0C00140292ED094F8AE1041B110F8D1 -:10726000031BC1F3801119B1407910F0C00F22D077 -:10727000AC480AF0DDFD00BF94F8AF0018B1FDF78F -:10728000BAF8012820D0D4F89C00417EE171D0F8F2 -:107290001A10A160C08BA081666126832570D4F886 -:1072A0009C000088F9F7E4FCF9F744F9BDE8704068 -:1072B000022001F076B8D4F8E700C4F80E00B4F864 -:1072C000EB006082D8E714E0FDF7D8F804F108027B -:1072D000E11D07F05BFA002808BFFFDFE07940F00E -:1072E0000200E071D4F8BF006061B4F8C3002083ED -:1072F000D4E7FFDF70BD70B5864C94F8B20000256E -:10730000052828BF70BDDFE800F03939391B0300BC -:107310008148FDF71AFE10B97F497F200870FDF7FC -:10732000FFFD94F8B800002804BF0120FFF795F98D -:1073300084F8B850FDF7D2FCBDE87040FFF741B9C2 -:10734000FDF7A4FDFDF796FDFDF7C8FCFDF72BFD4D -:1073500094F8AF0028B1FDF7D8FDFDF72CF884F8BC -:10736000AF50012084F8B800022084F8B200FDF785 -:1073700033FDBDE87040002001F013B870BD01225C -:1073800001F0E1B870B5012000F015FF614CC8B103 -:1073900004F1E401A1F1280008F04CFB04F1E4063B -:1073A00094F89110304608F02CFB04F1920130461D -:1073B00008F002FB94F8AD00C0B394F8A0000328D5 -:1073C0001FD025E0FDF762FDFDF754FDFDF786FCBB -:1073D000FDF7E9FC94F8AF0030B1FDF796FDFCF73E -:1073E000EAFF002084F8AF00012084F8B8000220F2 -:1073F00084F8B200FDF7F0FCBDE87040002000F01A -:10740000D0BF94F89B00002818BF94F8A30001D1C6 -:1074100094F8B00007F0DBFA050007D001213046F0 -:1074200008F0EFFA2946304608F0C6FA3C48FDF766 -:10743000D6FC01210846FDF7A0FD052084F8B20026 -:1074400070BD70B5022000F0B6FE324C68B301206A -:1074500000F0A7FF04F1E401A1F1280008F0EAFA26 -:10746000D4F89C00417B04F1E40008F0C1FAD4F8A0 -:107470009C0004F1BC0204F1E4061278417BC2F3E3 -:1074800040121140417394F89110304608F0B9FA57 -:1074900004F19201304608F08FFA94F8AD00B8B3C9 -:1074A00094F8A00003281FD025E0FDF7EFFCFDF7BE -:1074B000E1FCFDF713FCFDF776FC94F8AF0030B16A -:1074C000FDF723FDFCF777FF002084F8AF000120D3 -:1074D00084F8B800022084F8B200FDF77DFCBDE816 -:1074E0007040002000F05DBF94F89B00002818BF9A -:1074F00094F8A30001D194F8B00007F068FA0500F1 -:1075000014D00121304608F07CFA294630460BE0C1 -:107510000CE00000D00C0020D40000208C0D0020D6 -:10752000B40D0020DE0C002008F046FAD4F89C00D0 -:10753000C18A324808F0FEFAD4F89C00417D2F48F9 -:1075400008F0FCFA2D48FDF74AFC062084F8B2004A -:1075500070BD70B50C46054608F008FA032C47D0FC -:10756000052C18BF70BD0521284608F002FA244CEE -:10757000D4F89C0000F10E01284608F0C5FAD4F8B2 -:107580009C0000F11201284608F0C2FAD4F89C00D1 -:10759000417D284608F0D2FAD4F89C00C18A2846DA -:1075A00008F0C8FAD4F89C004188284608F0B6FADA -:1075B000D4F89C008188284608F0B4FAD4F89C00DE -:1075C000C188284608F0B2FAD4F89C0000F10801FE -:1075D000284608F0CDFAD4F89C00017E284608F031 -:1075E000AFFA94F8B3102846BDE8704008F0B2BA7C -:1075F0002846BDE87040032108F0BBB9B40D002057 -:10760000D00C00202DE9FF4F06460C46488881B07B -:1076100040F2E24148430090E08A002500FB01FB74 -:1076200094F8630091460D2818BF0C281ED0252819 -:107630001EBF94F8640025284FF0000A16D0049865 -:1076400018B10121204603F029FB94F8510094F869 -:10765000528094F8C810074659B1012958D0022920 -:107660003DD0032918BFFFDF52D0A6E04FF0010A3A -:10767000E5E7B9F1000F08BFFFDFFE4D686800289D -:1076800008BFFFDF94F85100FDF7C7FE00F2E731B5 -:107690004FF47A70B1FBF0F0696800EB010994F8DF -:1076A0005100FDF7BAFE94F85110022907BFF249C4 -:1076B0004FF47A72F1494FF4C8621144084400F261 -:1076C000E7314FF47A70B1FBF0F040F2E241081A72 -:1076D0002969584449440844051D012015E0E5483E -:1076E000A9F101014068084308BFFFDFE448B9F190 -:1076F000000F006800EB0B0506D0DE48406800F282 -:107700002230A84288BFFFDF032084F8C80053E07E -:1077100094F86310009D25291CBF94F86410252956 -:1077200036D1B4F85810B4F8EA20891A491C09B2C5 -:1077300000292DDB94F8E81009B30F4694F8E910FE -:10774000002918BF8846022807BFCB484FF47A713A -:10775000CA484FF4C8610144022F07BFC6484FF41E -:107760007A72C6484FF4C8621044814208D9081A98 -:1077700000F5FA714FF47A70B1FBF0F0054407E0C0 -:10778000401A00F5FA714FF47A70B1FBF0F02D1A3F -:10779000B9F1000F10D0DFF8DC92D9F8040020B95D -:1077A000B9F80200002818BFFFDFD9F8040000F282 -:1077B0002230A84288BFFFDF05B9FFDF2946D4F891 -:1077C000CC00FAF760FEC4F8CC00B0600020307046 -:1077D0004FF0010986F80490204603F04CFBAAF113 -:1077E0000101084208BF86F8059006D094F8C80049 -:1077F00001280CBF0220032070714046D4F824B049 -:10780000FDF7FCFD0146022F07BF9B484FF47A723B -:107810009A484FF4C8621044084400F23F614FF4A4 -:107820007A70B1FBF0F0584400F5C970F06004982C -:1078300030EA0A0004BF05B0BDE8F08F29463046A3 -:1078400007F010FF87B2204603F015FBB8420FD8AF -:10785000074686F8059005FB07F1D4F8CC00FAF747 -:1078600012FEB0602946304607F0FCFE384487B26D -:107870003946204603F012FAB068C4F8CC0005B0CF -:10788000BDE8F08F2DE9F04304467E4885B00D46F3 -:1078900090F80004DFF8F091400999F800144909C4 -:1078A000884218BFFFDFDFF8CC81002708F13C06D3 -:1078B000082D80F0FA80DFE805F0045B656560F86C -:1078C000F894202C28BFFFDF36F814000621F9F7C2 -:1078D000C5F8050008BFFFDF202C28BFFFDF36F802 -:1078E00014002988884218BFFFDF95F8C8000028D7 -:1078F00008BFFFDF284602F0BCFEC8F80470A8F8F5 -:10790000027029460020C8F8107007F0EFFE00F161 -:107910009804686AA04218D995F85200FDF76EFDE8 -:1079200095F85110022907BF53494FF47A72534911 -:107930004FF4C862114408444FF47A7100F23F607A -:10794000B0FBF1F1686A0844071B29460020C8F81B -:10795000087007F0CBFE698840F2E242514398304C -:10796000081AA0F22230C8F80C0005B0BDE8F08378 -:1079700005B0BDE8F04303F05DB805B0BDE8F043E5 -:10798000FDF792BB99F8140D4049400991F8001495 -:107990004909884218BFFFDF202C28BFFFDF36F8D7 -:1079A00014000621F9F75AF8050008BFFFDF202C64 -:1079B00028BFFFDF36F814002988884218BFFFDF90 -:1079C0000022012329466846FFF71CFE95F8D200E5 -:1079D0006946FBF797FA002808BFFFDF05B0BDE84E -:1079E000F083202C28BFFFDF36F814000621F9F7BA -:1079F00035F8050008BFFFDF202C28BFFFDF36F871 -:107A000014002988884218BFFFDF95F8C8000428B1 -:107A100018BFFFDF85F8C87095F8D2404FF6FF79A0 -:107A2000202C28BFFFDF26F8149095F8D200FBF732 -:107A300000F8002808BFFFDF202085F8D200D5F825 -:107A4000D800002804BFD5F8D400C8F8140008D026 -:107A5000D5E937121144826911448161D5E93501B4 -:107A6000C860D5F8D40000281CBFD5F8D810016133 -:107A700014D10EE0DC0D002068360200A2240200C2 -:107A8000E000002001E000E00BE000E019E000E091 -:107A90000BE0D5F8D800002818BF8761FC480078B3 -:107AA00005B0BDE8F043F4F725B9FFDF05B0BDE848 -:107AB000F0832DE9F047F74D0746E88B6C68401CD2 -:107AC000E88328784FF00008002808BFFFDF07D0C0 -:107AD000DFF8C4A3042814D0052818BFFFDF40D066 -:107AE00021462869FAF7CFFCB86087F800800120AA -:107AF0003871A86800F5B370F860287804287CD144 -:107B000085E00029ECD02E69DAF8141039B38946E3 -:107B1000C9680029FBD1B9F1000F20D099F8000005 -:107B2000002808BFFFDFD9F81410D9F80400014479 -:107B30003046FBF7AEFC002807DA211A4A1E92FBFA -:107B4000F4F202FB0406214604E090FBF4F202FB8F -:107B5000140621468E4288BFFFDF3446C0E7444604 -:107B6000BEE70029BCD0D5F81890B9F1000F08BFC6 -:107B7000FFDF0026D9F8DC10DAF814403046721E18 -:107B80005CB1A069884228BF824284BF0246264673 -:107B90002046E468002CF4D106B9064609F1C80471 -:107BA000C9F8D860002E04BFC4F80C80CAF814408D -:107BB00005D0F068F460E060002818BF0461D4F8D4 -:107BC0001090C4F81880B9F1000F0ED0D9F8180041 -:107BD00048B1D4F814A0504538BFFFDFD9F81800D9 -:107BE000A0EB0A00A061C9F81880002E08BFC5F8F4 -:107BF000208009D03078002800E00DE008BFFFDFCA -:107C0000716970680844286240F6B83468E7E88B08 -:107C10000A2838BF032000D302207871E88B01289E -:107C200006D93846696807F01DFDE98B0844E883EA -:107C3000B8682861BDE8F0872DE9F0418046974893 -:107C400084B00E4690F80004954F410997F800045F -:107C50004009814218BFFFDF01210025082E8D4C0D -:107C600062D2DFE806F0041A35353061614D617388 -:107C70002173607800281CBF04B0BDE8F0818648FD -:107C8000456005612573A068C138FEF758FD0028DE -:107C900018BFFFDF04B0BDE8F081607850B1207BF1 -:107CA000002808BFFEF72CFF657304B0BDE8F04163 -:107CB000FAF7E9BDA173FEF7FEFD002818BFFFDF4C -:107CC00004B0BDE8F08104B0BDE8F041FDF7ECB9C7 -:107CD00097F8140D7349400991F800144909884236 -:107CE00018BFFFDF00216846FFF7E3FE6946404604 -:107CF000FBF708F9002808BFFFDF04B0BDE8F081FA -:107D00002078052818BFFFDF207F002808BFFFDF8D -:107D100025772570207DFAF78CFE002808BFFFDF4D -:107D2000257504B0BDE8F081FFDF04B0BDE8F08147 -:107D30002DE9F041574C0026207804281FBF2078F9 -:107D400005280C20BDE8F08101206070607B0025D3 -:107D5000A8B1EFF3108010F0010F72B60CBF00272E -:107D60000127607B00281CBFA07B002805D0FEF700 -:107D7000C7FE6573A573FAF786FD2FB903E0207D72 -:107D8000FBF7D3F900E062B6207DFBF71CFC207FF7 -:107D900028B125772078052818BFFFDF0C266570ED -:107DA0002570207DFAF745FE002808BFFFDF257506 -:107DB0003046BDE8F0812DE9F04F364883B00078B9 -:107DC000002818BFFFF7B4FF0120DFF8CC8088F847 -:107DD000000069460620F8F7CCFD002818BFFFDF39 -:107DE00000274FF6FF7934E0029800281CBF90F876 -:107DF000C81000292DD0008848451CBFDFF8A8A076 -:107E00004FF0200B3BD00621F8F728FE040008BFF6 -:107E1000FFDF94F8D200FBF7D6FB84F8C87094F823 -:107E2000D2504FF6FF76202D28BFFFDF2AF81560CD -:107E300094F8D200FAF7FDFD002808BFFFDF84F8B0 -:107E4000D2B069460620F8F794FD002818BFFFDF7E -:107E500010E06846F8F76BFD0028C5D00FE00298E7 -:107E600000281CBF90F8C810002903D0008848459E -:107E7000C9D104E06846F8F75AFD0028EFD088F829 -:107E80000070C8F8147003B00020BDE8F08F000047 -:107E9000DC000020F40D0020DC0D002001E000E0FB -:107EA0000BE000E019E000E0180E002010B50078AB -:107EB000F84C60B101280CBF40F6C410FFDF06D0BB -:107EC000A06841F66A01884228BFFFDF10BDA060AC -:107ED000F6E710B5EF4C00232070EF4803704370B5 -:107EE000037703734373837320218361017518380B -:107EF00043703A3010214FF6FF72428020F8042F71 -:107F0000491EFAD1180008BFA36005D0002B0EBF90 -:107F1000FFDF40F6C410A060A06841F66A01884205 -:107F200028BFFFDFBDE8104045E72DE9F043DA4CFC -:107F3000054685B0207816460F4600281EBF0C2047 -:107F400005B0BDE8F08395F8519095F85200D5F84A -:107F50002480FDF753FAB9F1020F07BFCF494FF460 -:107F60007A72CF494FF4C862114408444FF47A79C9 -:107F700000F23F60B0FBF9F0404400F22230C5F857 -:107F8000DC00A56195F8C800002818BFFFDF40F2AB -:107F90007120784360600120FDF730FA00F2E7308D -:107FA000B0FBF9F040F2712106FB0100A0606168AE -:107FB000A1F2F621884298BF01460020A160B9498C -:107FC00008610521217060702077E083B648FAF7D8 -:107FD000D5FC2075202808BFFFDFFAF749FD206196 -:107FE00001216846FFF765FD207D6946FAF78AFFA3 -:107FF000002808BFFFDF002005B0BDE8F083A648D9 -:10800000007800281CBF0020704710B50620F8F744 -:10801000C1FC80F0010010BD30B59F4C85B02278C6 -:10802000002A1EBF0C2005B030BD0D4640F2712164 -:10803000484360600120FDF7E1F94FF47A7100F2E6 -:10804000E730B0FBF1F040F2712105FB0100A060C8 -:108050006168A1F2F621884298BF01460020A16024 -:10806000607004212170E0838F48FAF787FC207547 -:10807000202808BFFFDF8B48406938B10146C0683F -:108080000028FBD111B1FAF7F3FC05E0FAF7F0FC98 -:1080900040F6B831FAF7F7F9206101216846FFF799 -:1080A00008FD207D6946FAF72DFF002808BFFFDF95 -:1080B000002005B030BD70B5774CA1690160FFF7B5 -:1080C00037FE002300BBA169D1F8D8205AB1D1E90D -:1080D00037C5AC449569AC44C2F818C0D1E9352C19 -:1080E000CCF80C2005E0DFF8BCC1D1F8D420CCF8E6 -:1080F0001420D1F8D420D1F8D810002A18BF11616B -:1081000002D1002918BF8B61A36170BD6549487019 -:10811000704770B540F2E24300FB03F510460C4691 -:10812000FDF76CF9022C07BF5C494FF47A725C4989 -:108130004FF4C862114408444FF47A7100F23F6072 -:10814000B0FBF1F000F2223085428CBF281A0020EB -:1081500070BD70B50D4606460146002007F0C6FA10 -:10816000044696F85200FDF749F996F85110022995 -:1081700007BF4A494FF47A7249494FF4C862114423 -:1081800008444FF47A7100F23F60B0FBF1F071885F -:1081900040F271225143C0EB4100A0F22230A542CF -:1081A00034BF21462946814203D2A5422CBF28462E -:1081B0002046706270BD3B4910B54968002801F146 -:1081C000980408BF04F5BC7409D0012808BF04F561 -:1081D000317404D0022814BFFFDF04F5B0742E48B8 -:1081E0008068A0428CBF0120002010BD10B52D4C2E -:1081F000607828B1D4E90201626807F05BFAA060F8 -:10820000D4E9010188429CBF2078002814BF0020D7 -:10821000012010BD04222DE9F043204FDFF88080BB -:1082200085B04FF47A79052980F0B980DFE801F054 -:108230000A2B033E890080F8C82005B0BDE8F04352 -:10824000FAF721BB044617480078002818BF84F8C5 -:10825000C82004D005B0BDE8F043FAF714BB0122F2 -:10826000002321466846FFF7CDF994F8D20069460D -:10827000FAF748FE002808BFFFDFB4F85800401C9A -:10828000A4F85800E6E7032180F8C81005B0BDE85F -:10829000F0830000DC000020F40D002068360200AE -:1082A000A2240200DC0D0020397C01000446408835 -:1082B00040F2E2414843B3490860D4F8F000214657 -:1082C0000089E082D4F8F00080796075D4F8F0007D -:1082D00040896080D4F8F0008089A080D4F8F00054 -:1082E000C089E0800020A66A07F000FA054694F8ED -:1082F0005200FDF783F894F8511002290EBF4FF495 -:108300007A7147464FF4C8613944084400F23F602F -:10831000B0FBF9F1608840F271225043C1EB40009C -:10832000A0F22230AE4234BF29463146814203D208 -:10833000AE422CBF304628466062022084F8C80056 -:10834000A4E706460146856A002007F0CFF90446F7 -:1083500096F85200FDF752F896F8511002290EBF18 -:108360004FF47A7147464FF4C8613944084400F22B -:108370003F60B0FBF9F0718840F271225143C0EBCD -:108380004100A0F22230A54234BF21462946814255 -:1083900003D2A5422CBF28462046706276E7FFDF55 -:1083A00074E72DE9F041DFF8E0810025774C98F87B -:1083B000001084B0052880F0C180DFE800F00316CB -:1083C0006DB9B900E5830846F3F794FC607800289E -:1083D00073D100216846FFF76CFB207D6946FAF7F0 -:1083E00091FD002808BFFFDF67E00120FDF706F8D8 -:1083F0006749684E08444FF47A71B0FBF1F0216987 -:10840000726840F2E2431144081AA16900F2DE608A -:108410004A88C83102FB03F772698A4208BF002507 -:1084200014D0216AFBF735F8002807DA391A4A1EFA -:1084300092FBF7F202FB0705394604E090FBF7F2E6 -:1084400002FB170539468D4288BFFFDFD8F80800C8 -:10845000854208D2A06940F271224188C1824A4314 -:1084600005EB420505E040F2E240B5FBF0F0A16902 -:10847000C882A06905214175C08A6FF41C71484308 -:1084800005EB400040F635413061B0EB410F28BFAD -:10849000FFDF04B0BDE8F081E5830846F3F72AFC6E -:1084A00001202077A0692169C0F8CC1080F8C8505D -:1084B0002178052918BFFFDF06D0FAF7E4F96573C4 -:1084C000A57304B0BDE8F081002808BFFFDFA069F4 -:1084D00090F8C800002818BFFFDFA06990F8D2000C -:1084E000202818BFFFDF2C48FAF748FAA169064692 -:1084F000202881F8D2000F8828BFFFDF274820F806 -:108500001670A06990F8D200202808BFFFDF002372 -:1085100001226846A169FFF775F8A069694690F8DD -:10852000D200FAF7EFFC002808BFFFDFA561C4E71F -:1085300004B00846BDE8F041F3F7DCBBFFDF04B050 -:10854000BDE8F081704770B5124D0446002912BF96 -:108550000129686070BD02291CBFFFDF70BD6888FB -:10856000401C68801046FCF758FF4FF47A7100F207 -:10857000E730B0FBF1F0201A686070BD0348007866 -:1085800070470000E0000020DC000020F40D002017 -:10859000C92E0200DC0D002085780100180E002095 -:1085A000FE48406870472DE9F0410D4606460146F9 -:1085B0001746012007F09AF8044696F85200FCF797 -:1085C0001DFF96F8521002290CBFF549F5490844E1 -:1085D0004FF47A7100F2E140B0FBF1F0718840F2A3 -:1085E00071225143C0EB4100C01BA0F55970A54258 -:1085F00034BF21462946814203D2A5422CBF2846DA -:1086000020467062BDE8F0812DE9FF4F8FB004462F -:1086100090F85200DDF8709098460B9049EA0800F7 -:108620000C9094F86400002617460D280CBF01201A -:1086300000200890B8F1000F04BF94F8040103284B -:1086400071D1089800286ED0B4F87C01B8426AD184 -:10865000D4F80C01C4F8F800608840F2E2414843C5 -:10866000C4F8FC00B4F85201B4F8DE100844C4F8B1 -:108670000001204604F00DFDB4F88001E08294F87A -:108680007E016075B4F882016080B4F88401A08036 -:10869000B4F88601C549E080C348097894F864318C -:1086A000628830F8111030F81300D4F828A008447C -:1086B0000004000C4FF0000105D000FB02F1BC48A3 -:1086C000B1FBF0F0411C1FFA81FB2146012007F0AD -:1086D0000DF8054694F85200FCF790FE94F85210FD -:1086E00002290CBFAE49AF49084400F2E1414FF402 -:1086F0007A70B1FBF0F1608840F271225043C1EB17 -:108700004000A0EB0B00A0F55970AA4534BF2946E4 -:108710005146814203D2AA452CBF5046284660628A -:10872000022084F80401D4E956ABB4F8DE000390CB -:10873000B4F85001D4F84C110691B8F1000F03D0F1 -:1087400094F8181149B17FE004F1D8010091743117 -:10875000099104F59C75091D07E004F596710091D7 -:10876000091D099104F58E75091D0A91B4F8581078 -:10877000381A791A09B200B20491002805DAD4F83F -:108780004801069001200C90084694F80411002935 -:108790005ED0012900F0668102297DD0032918BF2F -:1087A000FFDF00F0A98131460698F9F76CFE0999C0 -:1087B00008600A9801210780002028702971099813 -:1087C0000068A8607948D0E90520824287BF009AF6 -:1087D0001060009802600098626A0068104400F21D -:1087E0008310E8606971B4F8C800C01B00B20028AB -:1087F000C4BF032068710898002800F0F181B9F126 -:10880000000F18D0B4F8F020002A0CBF0020B4F8F4 -:10881000F200A4F8F20094F8F430401C584390425F -:1088200009D26879401E002805DD6971B4F8F200AC -:10883000401CA4F8F200B8F1000F00F0F58194F8A4 -:108840001801002800F0EC8113B00220BDE8F08F81 -:10885000BAF1000F08BFFFDFE08A40F27121484300 -:10886000490001EB400210980021002806D000FBCF -:1088700002F14F48B1FBF0F000F10101C4F808111A -:10888000608840F2E24100FB01F210994FF00000D5 -:1088900008D001FB02F100E042E04548B1FBF0F0F6 -:1088A00000F10100C4F80C010AF101064FF00100CB -:1088B000FCF7A4FD3F494FF47A7B0844B0FBFBF082 -:1088C000E18A40F271225143C0EB4101D4F8080122 -:1088D0000190091A314401F2C246607D510010FB3B -:1088E00001F00C900120FCF789FD33490844B0FBEE -:1088F000FBF1019801EB40010C9801EB000B01200A -:10890000FCF770FD584400F1620128484161816123 -:10891000A6EB0A00401EB0F53D7F38BFFFDF42E7FF -:10892000E28A40F271215143D4F8FC00109A00EB26 -:1089300041010020002A06D01D4802FB01F2B2FBD3 -:10894000F0F000F10100C4F80801628840F2E2434F -:1089500002FB03FC109B4FF0000206D0144A03FBFD -:108960000CF3B3FBF2F202F10102C4F80C21039AFA -:108970009AB9B9F1000F38D094F85200FCF73EFDD7 -:10898000014694F8520002280CBF054A054A1144DA -:1089900001F2E1424FF47A7110E026E0580E002017 -:1089A00004360200A224020042230200E800002054 -:1089B00040420F007D2A020083290200B2FBF1F140 -:1089C000D4F80821E38A114440F2712CD4F8FC2039 -:1089D00003FB0CF302EB4302561AFCF703FDABEB6F -:1089E00000003044A0F1200600E00E1AD4F8002167 -:1089F000D4F8F810D4F8080101FB020B607D40F2B6 -:108A0000E24110FB01F00C9094F852A05046FCF7A4 -:108A1000F5FC0146BAF1020F0CBFF948F9480844C9 -:108A200000F2E1414FF47A70B1FBF0F000EB4B0142 -:108A30000C9801EB000B5046FCF7D4FC584400F1B5 -:108A40006001F14840F2712341616288D4F80C1151 -:108A50005A43C1EB4201A1F213318161012084F834 -:108A60000401A0E6628840F27123D4F80C115A4345 -:108A7000C1EB420202FB00F6DDE903020244D4F836 -:108A80000001D4F8F8C0121AD4F80831521E0CFBB9 -:108A9000003002FB010B607D40F2E24110FB01F06F -:108AA0000C9094F852000190FCF7A8FC0146019844 -:108AB000022814BFD348D248084400F2E1414FF4E1 -:108AC0007A70B1FBF0F000EB4B010C9801EB000B5E -:108AD0000198FCF787FC584400F16001CA48B9F1DD -:108AE000000F4161A6F2133181613FF45CAEBAF12F -:108AF000000F08BFFFDF56E6628840F27123D4F80A -:108B00000C115A43C1EB420101FB00F694F86300DB -:108B100025281CBF94F8640025280AD1B4F87C01EC -:108B2000381A00B2002804DB94F87F01002818BF2F -:108B30000B900C9828B1039880B3BBF1000F18BFBD -:108B4000FFDFDDE903010144D4F80C0101FB00FA69 -:108B50000B98FCF753FC01460B9802280CBFA84861 -:108B6000A848084400F2E1414FF47A70B1FBF0F0FC -:108B700000EB4A0A0B98FCF735FC504400F1600109 -:108B8000A14840F2712341616288D4F80C115A4324 -:108B9000C1EB4201A1F21331816104E6FFE7BBF1B1 -:108BA000000F14BFBAF1000FFFDF0B98FCF726FC93 -:108BB0000B9902290CBF92499249084400F2E14105 -:108BC0004FF47A70B1FBF0F0361A94F85200FCF7CB -:108BD00009FCABEB00003044A0F12006B1E700BF78 -:108BE000B9F1000F7FF40EAE94F8040100283FF4B1 -:108BF00022AE618840F27122D4F80C015143C0EBDF -:108C00004101284606F02EFD0004000C3FF413AE8F -:108C10001D99002918BF0880012013B0BDE8F08F0E -:108C200094F85401FAF781FA94F854012946FAF7B6 -:108C300069F900281CBF88F0010084F819010020A0 -:108C400013B0BDE8F08F2DE9F04F704C804683B033 -:108C500020788A4600256C4E4FF00209032804BF95 -:108C6000207B40457CD1606830612078032818BFA4 -:108C7000FFDF0327BAF1080F70D2DFE80AF0040E15 -:108C80001B1B166F6F6A6562FCF74FFF002818BF49 -:108C9000FFDFB77003B0BDE8F08FFDF7CBF8002819 -:108CA00018BFFFDF03B0BDE8F08F03B0BDE8F04FA1 -:108CB000FCF7FAB927752574E07A012658B14FF40C -:108CC0007A71A069F9F7DFFBA061002104F11000BF -:108CD00006F0C8FC1AE001216846FAF71AFF9DF871 -:108CE000000042F210710002B0FBF1F201FB12052C -:108CF000FCF793FD05442946A069F9F7C4FBA06180 -:108D0000294604F1100006F0ADFC461C208C411CE5 -:108D10000A293CBF30442084606830B1208C401C5C -:108D20000A2828BF84F8159000D26775607A002859 -:108D30001CBF03B0BDE8F08F207B04F11001FAF7EF -:108D4000E1F8002808BFFFDF03B0BDE8F08F07E0BF -:108D500004E0207BF9F76DFE2570F5E7FFDFF3E710 -:108D6000B8F1200F28BFFFDF294F072137F818007F -:108D7000F7F774FE040008BFFFDFB8F1200F28BF2B -:108D8000FFDF37F818002188884218BFFFDF4FF057 -:108D900001083461BAF1080F80F04481DFE80AF07D -:108DA000049AA2A29DEEEEEDC4F85851F580C4F8E5 -:108DB0005C5194F8190138B9F9F75AFED4F8241126 -:108DC000FAF767FB002825DCB4F81611B4F8580050 -:108DD000814206D1B4F8CC10081AA4F8CE0020467F -:108DE00005E0081AA4F8CE00B4F816112046A4F83D -:108DF0005810D4F84011C4F82411C0F8481127E0E5 -:108E000004360200A2240200E8000020580E0020D0 -:108E1000800E0020B4F81411B4F85800081AA4F811 -:108E2000CE00B4F814112046A4F85810D4F8241138 -:108E3000C4F84011C4F84811D4F82C11C4F8D81063 -:108E4000D4F83011C4F84C11B4F83411A4F850110E -:108E500003F0D7FFF9F7E6FD94F852A00746504615 -:108E6000FCF7CCFABAF1020F0CBFFE49FE490844E8 -:108E70004FF47A7100F2E140B0FBF1F1D4F80C014B -:108E800040F27122014460885043C1EB4000A0F1E0 -:108E9000300AB72F98BFB7272146012006F026FCDD -:108EA0003844AAEB0000A0F21937A246214601205F -:108EB00006F01CFCDAF824109C30814288BF0D1AA1 -:108EC000F760BD4228BF3D46B56084F8188186F83A -:108ED000029039E704F0DBF801E0FCF7E5F884F8EC -:108EE000188131E7F9F7C4FDD4F84821014610464E -:108EF000FAF7CFFA48B1628840F27123D4F80C1126 -:108F00005A43C1EB4201B0FBF1F094F864100D2913 -:108F10000FD0B4F85810B4F816210B189A42AEBF0F -:108F2000501C401C0844A4F8160194F81A0178B9A2 -:108F300005E0B4F81601401CA4F8160108E0B4F8E6 -:108F40001601B4F8CC10884204BF401CA4F81601E6 -:108F5000B4F85201DFF81493401CA4F85201B4F89D -:108F60007E00B4F87C100DF1080B401AB4F85810CC -:108F7000401E08441FFA80FA17E045E052E03078BE -:108F8000002339F81000CDE9005B94F8641139F83A -:108F90001110084481B22046FFF736FB00283FF449 -:108FA000D3AE012818BFFFDF26D0B4F81621AAEBF4 -:108FB000020000B20028E2DA082084F8730084F886 -:108FC0007280204603F0D2FB84F8045194F8545187 -:108FD0004FF6FF78202D00D3FFDF27F8158094F897 -:108FE0005401F9F726FD202084F85401307903B0AC -:108FF000BDE8F04FF2F77EBEB4F81601BDF80810D8 -:109000000844A4F81601D0E794F80401042818BF16 -:10901000FFDF84F8045194F854514FF6FF78202D67 -:10902000DBD3D9E7FFDF8FE610B5914C207850B144 -:1090300001206072FCF71DFF2078032805D0207AFC -:10904000002808BF10BD0C2010BD207BFAF76DF87A -:10905000207BFAF7B8FA207BF9F7EBFC002808BF71 -:10906000FFDF0020207010BD2DE9F04F804F83B04E -:10907000387801244FF0000840B17C720120FCF7E1 -:10908000F8FE3878032818BF387A0DD0DFF8E4915D -:1090900089F8034069460720F7F76BFC002818BFE2 -:1090A000FFDF4FF6FF7440E0387BFAF73EF8387B7D -:1090B000FAF789FA387BF9F7BCFC002808BFFFDF14 -:1090C00087F80080E2E7029800281CBF90F804119E -:1090D00000292AD00088A0421CBFDFF89CA14FF0D5 -:1090E000200B3AD00721F7F7B9FC040008BFFFDFD7 -:1090F00094F85401FAF767FA84F8048194F854510B -:109100004FF6FF76202D28BFFFDF2AF8156094F870 -:109110005401F9F78EFC84F854B169460720F7F73B -:1091200028FC002818BFFFDF12E06846F7F7FFFBB6 -:109130000028C8D011E0029800281CBF90F8041144 -:10914000002905D00088A0F57F41FF39CAD104E08D -:109150006846F7F7ECFB0028EDD089F8038087F824 -:109160000B8003B00020BDE8F08F70B50446434883 -:1091700090F80004424D400995F8001449098842CE -:1091800018BFFFDF95F8140D40093E4991F800140F -:109190004909884218BFFFDF3649002001220C71BF -:1091A00088700A704870C87031490870BDE8704016 -:1091B0005AE73049087070472DE9F8432C4C0646B1 -:1091C0002078002875D13048F9F7D8FB2073202883 -:1091D0006FD0032766602770002565722572AEB1D7 -:1091E000012106F1F400FAF70CFD0620F7F7E0FB89 -:1091F00080460720F7F7DCFB96F8F4104044B1FBFB -:10920000F0F200FB1210401C86F8F400F9F70AFC9B -:109210001E49091838BF40F2F65000F59D7086B21D -:10922000FCF7D7FAE061FCF7F8FA4FF0010878B3E1 -:1092300084F80A8001216846FAF76BFC9DF800006B -:1092400042F210710002B0FBF1F201FB1200064481 -:10925000F9F70EFC3146F9F716F9A0612775677525 -:10926000257416E004360200A22402004223020004 -:10927000580E0020E8000020800E002001E000E0F1 -:109280000BE000E019E000E0478C01000AFAFFFF64 -:1092900012E0207B04F11001F9F734FE002808BF2A -:1092A000FFDF25840020FCF7E4FD0020BDE8F88303 -:1092B000FFE70C20BDE8F883F9F7DAFB3146F9F750 -:1092C000E2F8A061A57284F80B80C7E72DE9F047AA -:1092D00082B00026044680F80461A0F85061DFF8EF -:1092E00000944288FD4FD0F8288099F8000094F847 -:1092F000641137F8100037F8111008440104090C04 -:10930000304605D001FB02F0F649B0FBF1F0401CFD -:109310001FFA80FA2146012006F0E8F9054694F884 -:109320005200FCF76BF894F8521002290CBFEE497A -:10933000EE4908444FF47A7100F2E140B0FBF1F1DC -:10934000608840F271225043C1EB4000A0EB0A005C -:10935000A0F55970A84534BF29464146814203D241 -:10936000A8452CBF4046284660620096019699F8B1 -:10937000000094F86411002337F8100037F811103A -:109380001A46084481B22046FFF73EF9002818BF6C -:10939000FFDFC4F800610120C4F8F86084F804011C -:1093A000A4F81661A4F8146184F81A61B4F858009E -:1093B000401EA4F85800A4F8526102B00020BDE895 -:1093C000F087C74948707047C94810B5417A0124F1 -:1093D000002918BF002408D1C17A31B1406AC549BB -:1093E000884284BF0024FCF740FD204610BD70B5C4 -:1093F000BB4C0546E088401CE080D4E9020162785D -:10940000D5F85861002A1CBF324606F053F9A06017 -:10941000864208D895F80401012804D0E078002895 -:1094200004BF012070BD002070BD70B50D4640F234 -:10943000E24100FB01F42846FBF7E0FF022D0CBFE0 -:10944000A949AA4908444FF47A7100F2E140B0FBFF -:10945000F1F000F54D7084428CBF201A002070BDE1 -:109460002DE9F04383B00026044680F8186190F897 -:10947000D600002807BF94F80401032803B0BDE814 -:10948000F083F9F7F5FAD4F8482101461046FAF7C7 -:1094900000F80028DCBF03B0BDE8F083628840F22A -:1094A0007123D4F80C115A43C1EB4201B0FBF1F027 -:1094B000411CB4F858000144A4F81411B4F8CC10BD -:1094C000B4F81421891A09B20029DCBF03B0BDE841 -:1094D000F083012184F81A11B4F87E10B4F87C20CE -:1094E0007E4F891A491E084485B2DFF8F4810DF1D8 -:1094F00008091EE098F8000037F81000CDE900696F -:10950000B4F8142194F86411012337F811100844B9 -:1095100081B22046FFF778F8002804BF03B0BDE809 -:10952000F08301280FD0022812BFFFDF03B0BDE88F -:10953000F083B4F81401281A00B20028BCBF03B0AD -:10954000BDE8F083D6E7B4F81401BDF8081008446C -:10955000A4F81401EDE7F0B5DFF884C104265F4BF1 -:109560009CF80020002583B006297DD2DFE801F0B9 -:10957000073C03191941044680F8046107E00446DA -:109580009CF80300002818BF84F804610BD0F9F799 -:109590007AF9A4F85251B4F85800A4F8160184F8E6 -:1095A0001A5103B0F0BD33F8120094F804210121E0 -:1095B000032A13BF94F80421C4F80051C4F8F850EA -:1095C000012AE4D1CDE9001594F86411B4F8CC2057 -:1095D00033F811100023084481B22046FFF714F835 -:1095E000002818BFFFDFD2E7032180F8041103B081 -:1095F000F0BD0446B0F802C0866A90F8640133F802 -:10960000121033F8100008440104090C4FF0000058 -:1096100005D001FB0CF03349B0FBF1F0401C87B2E0 -:109620002146012006F062F8054694F85200FBF747 -:10963000E5FE94F8521002290CBF2B492B4908442F -:109640004FF47A7100F2E140B0FBF1F0618840F232 -:1096500071225143C0EB4100C01BA0F55970AE42CE -:1096600034BF2946314600E008E0814203D2AE42D1 -:109670002CBF30462846606203B0F0BDFFDF03B068 -:10968000F0BD2DE9F8431A4C0327154EE27AA17A72 -:1096900042F21079002550B1012843D002281CBFA6 -:1096A000FFDFBDE8F8834FF000081AB95EE04FF025 -:1096B00000080AB1E5722EE051B101216846FAF7BF -:1096C0004DFA9DF800000002B0FBF9F109FB11080A -:1096D000FCF7A3F800EB0801A0690DE042230200AB -:1096E000E800002040420F0004360200A2240200DD -:1096F000580E0020DB821300F8F7C5FEA061257428 -:109700006775607A30B9207B04F11001F9F7FAFB34 -:1097100000284BD02584F9F7B6F83079BDE8F84336 -:10972000F2F7E8BAE572A7692570012020720021DE -:10973000606805F035FB6068C0F84871217B80F8EF -:109740005411616AC0F84C71C0F8581190F8545126 -:109750000788202D28BFFFDF3C4820F8157060687F -:10976000FFF7B4FD002818BFFFDFD4E751B1012196 -:109770006846FAF7F3F99DF800000002B0FBF9F132 -:1097800009FB1108FCF749F800EB0801A069F8F79C -:109790007AFEA06125746775607A0028BAD1207BB3 -:1097A00004F11001F9F7AEFB0028B3D1FFDFB1E7F8 -:1097B00070B5274CA178022906BFE188002970BD49 -:1097C0002569C5F85C0195F85200FBF70BFED5F84A -:1097D0005C11081AA1680144A160E1680844E060D6 -:1097E00070BD70B505461A488378022B06BF006924 -:1097F00000F5AC74174C002904BF256070BD012929 -:1098000008BF681E0DD002291CBFFFDF70BD1046C7 -:10981000FBF703FE4FF47A7100F2E140B0FBF1F088 -:10982000281A206070BD0C48007800281CBF00205A -:10983000704710B50720F7F7ADF880F0010010BDB4 -:1098400005480078002818BF01207047800E0020CE -:10985000E80000207C0E0020580E0020F8490C285B -:10986000896881F8C3001ABF13281828704700229E -:1098700011280FD0072808BF704715280AD00128E3 -:109880001ABF002802287047A1F88220012081F821 -:1098900086007047A1F88820704770B5E84CA16831 -:1098A0000A88A1F8362181F8340191F85100012885 -:1098B00008BF012508D0022808BF022504D00428CB -:1098C00016BF08280325FFDFA06880F8385190F8FC -:1098D0005200012808BF012508D0022808BF022530 -:1098E00004D0042816BF08280325FFDFA068012143 -:1098F00080F8395180F83211002180F80611E078A3 -:10990000BDE87040F2F7F6B9F0B4CD48806890F841 -:109910004E30478EC68E458FB0F84010C28FB0F8DB -:1099200042C0022B1FD08D4238BF294601866245B6 -:1099300028BF62468286018FB0F84430994238BF12 -:109940000B464386818FB0F84640A14238BF0C4693 -:10995000C486BB4228BF1F464786B44228BF26465E -:10996000C686F0BC7047038E9D4228BF1D46838E7D -:109970009A4228BF1A46A94298BF0D4605869445CB -:1099800098BF62468286002180F84E10D3E7AC4A29 -:10999000012992681BD0002302290FD0032921D06E -:1099A00028B301282ED0032818BF704792F863000F -:1099B00013281CBF1628182805D1704792F8C30039 -:1099C000002808BF7047D2F8F0000370704792F883 -:1099D000C300012808BF7047D2F8F4000178491E7F -:1099E0000170704792F8C3000328ECD17047D2F899 -:1099F000F000B2F858108288891A09B20029A8BF6D -:109A000003707047B2F85800B2F8FA10401A00B26A -:109A10000028E1DA70472DE9F04100260327884C41 -:109A20000125A0B1206906F0CCF9A16881F8C20037 -:109A300005FA00F010F4000F08BFFFDFA06880F8FF -:109A40006370A0F8826080F88650BDE8F081A0685D -:109A50000023194690F86420583005F0A2FD002834 -:109A600004BF6570BDE8F0816078002818BFBDE8CC -:109A7000F081206906F0A5F9A16881F8C10081F89C -:109A80006470A1F8886081F88A50BDE8F08170B5F3 -:109A90006B4C84B0207910F0010F04BF04B070BD8E -:109AA000206900230521C578A06890F8632058300C -:109AB00005F077FD002818BF022D0FD00B2D18BF21 -:109AC000042D0BD0052D18BF062D07D00D2D18BF66 -:109AD000112D03D0607840F0080060706078002895 -:109AE0001CBF04B070BD2069C078801E162880F0AD -:109AF0005283DFE800F00BFBA7C5FA26FBF9FB9ABF -:109B0000F8FCFBFBFBE3F6F5F4F3F2F1A0680023AD -:109B1000012190F86620583005F043FD002840F000 -:109B2000B583206906F0A8F9A16881F8EE00072046 -:109B300081F86600002081F88A0081F8860000F034 -:109B4000A5BBA0680921002390F86320583005F0D8 -:109B500028FD20B1206906F0DFF9122814D0A06892 -:109B60000A21002390F86320583005F01AFD20B137 -:109B7000206906F0D1F9142821D0206906F0CCF92B -:109B8000162840F0838342E0A0680125002390F866 -:109B900063200921583005F004FD002808BF6570D6 -:109BA00000F074836078002840F07083A16881F829 -:109BB0007A0081F8860081F8630000F067BBA06836 -:109BC0000021012580F86310A0F8821080F886102B -:109BD0000421FEF71FFBA06890F84E10012900F049 -:109BE0007C820288A0F81621028EA0F81821828EAD -:109BF000A0F81A21428E00F58671A0F81C21C08EB3 -:109C000048820D72E078F2F775F800F03FBBA0686B -:109C100090F86310202940F03983002180F8631008 -:109C200080F886101A2000F02FBBA06890F863100F -:109C30000F292AD1002180F8681012213AE0000093 -:109C400004010020A06890F8631013291DD1D0F8FA -:109C5000F01000884988814218BFFFDFA068D0F863 -:109C6000F00000F12601206906F033F9A06800F148 -:109C7000BC01206906F035F91620A16800F064B92E -:109C8000A26892F86300162802D0022000F064BA9D -:109C9000D2F8F00002F1A80300F11E0100220E30FC -:109CA00005F007FCA0680021C0E92611012180F819 -:109CB0006810182180F8631000F0E8BA206906F0F7 -:109CC000B0F9032840F0E282206906F0AEF900BF47 -:109CD00001F022FC00F0DABA8DE202E2AEE152E1DC -:109CE0001EE135E103E050E0C4E004E0D5E1206985 -:109CF00006F00EF9ECE7A06890F863101B29C4D1B8 -:109D0000002580F88B5080F88650D0F8F01000883D -:109D10004988814218BFFFDFA068D0F8F0100D70AD -:109D2000D0F83C110A78002A18BFFFDF40F0F3801A -:109D300090F88C207AB180F88C500288CA80D0F8D4 -:109D40003C110D71D0F83C210D211170D0F83C214F -:109D50000188518010E00288CA80D0F83C110D7152 -:109D6000D0F83C2101211172D0F83C210C21117056 -:109D7000D0F83C21018851800088F6F779FFF6F78A -:109D8000D9FBE078F1F7B6FFC5E0A06800231946DB -:109D900090F86420583005F004FC50B9A068002306 -:109DA000082190F86320583005F0FBFB002800F0F4 -:109DB00027826078002840F06982A06890F88E00C1 -:109DC00010F0020F17D1206906F098F8A16881F809 -:109DD0008F00206906F094F8A168A1F8900020692E -:109DE00006F091F8A168A1F8920091F88E0040F079 -:109DF000020081F88E00A06890F88E1011F0010F1B -:109E000012D190F8642000231946583005F0C9FBA0 -:109E1000002808BFFFDF0121A06880F8641080F8E7 -:109E20008A100021A0F88810A06890F8631001291A -:109E300007D1002180F8631080F88610E078F1F7F0 -:109E400059FFA168D1F8F000098842888A4204BF0E -:109E50000178042940F01A8200250570E078F1F7B6 -:109E600049FFA06890F86310002908BF80F8865069 -:109E700000F00CBAA0680023072190F86320583046 -:109E800005F08FFB002800F0BB816078002840F0CF -:109E9000FD8102A9206906F079F8A0689DF80820E4 -:109EA000002590F89410114001F02F0180F89410D3 -:109EB00090F895109DF80920114001F0410180F8BB -:109EC000951080F88650D0F8F010008849888142BB -:109ED00018BFFFDFA068D0F8F0100D70D0F83C116B -:109EE0000A78002A18BFFFDF15D10288CA80D0F88F -:109EF0003C110D71D0F83C11029A8A60039ACA6035 -:109F0000D0F83C21072111700188D0F83C01418034 -:109F1000E078F1F7EFFEA06880F8635000F0B6B982 -:109F2000A0680023092190F86320583005F039FB20 -:109F3000002800F065816078002840F0A781A168C2 -:109F400081F87A0081F8860081F8630000F09EB9FC -:109F5000A0680023194690F86420583005F021FBD2 -:109F6000002800F04D816078002840F08F81A068C3 -:109F70000021A0F88810012180F88A10022180F8C1 -:109F8000641000F083B9A0680023194690F864209B -:109F9000583005F006FB00287ED0206905F0E0FF70 -:109FA00000287AD0206905F0D7FFA16808872069CA -:109FB00005F0CEFFA1684887206905F0CFFFA168B2 -:109FC0008887206905F0C6FFA168C88791F86300FB -:109FD0001D2813BF91F84E00012081F84E00012882 -:109FE00007D091F8FD00002804BF91F8FC0000287C -:109FF00003D01F2081F8640017E01E2081F8640060 -:10A000000A88A1F822210A8FA1F824214A8FA1F8F9 -:10A0100026218A8F01F58670A1F82821C98FC18376 -:10A0200001210175E078F1F765FEA0680021A0F834 -:10A030008810012180F88A1000F028B9A068002358 -:10A040000A2190F86320583005F0ABFA20B320695C -:10A0500005F086FFA8B1206905F07EFFA16808879A -:10A06000206905F075FFA1684887206905F076FF33 -:10A07000A1688887206905F06DFFA168C887FFF790 -:10A0800043FCA068002180F8861080F8631004214A -:10A09000FEF7C0F8A06801E01AE07CE090F84E10EE -:10A0A00001291AD00288A0F81621028EA0F81821E2 -:10A0B000828EA0F81A21428E00F58671A0F81C212C -:10A0C000C08E488201200872E078F1F713FEDDE0CF -:10A0D000607840F001006070D8E0022180F84E10F6 -:10A0E000D4E0A0680023194690F86420583005F0A9 -:10A0F00058FA80B3A06890F86300242812BF25287E -:10A10000607840F0200027D06846FBF7EDF9002882 -:10A1100008BF002105D0009805F053FE8DF8080017 -:10A1200002A9A06801AB162290F8630005F001FCBB -:10A13000A0B1A0689DF80420162180F8E42080F8E2 -:10A14000E5101A2180F86410012180F88A1000219E -:10A15000A0F888109AE053E0607097E0206905F05D -:10A1600022FFC0B1206905F018FFA16800F00700C8 -:10A1700081F84F00206905F014FF00F00701A06886 -:10A1800080F8501090F80721002A04BF90F80621AB -:10A19000002A04D024E00020FFF73DFC76E090F890 -:10A1A0004F3090F852C000F151029C4501BF127827 -:10A1B0008A42012180F87B1012D00288A0F82E215B -:10A1C00090F84F2000F5867180F8302190F850000B -:10A1D00081F82500012081F82000E078F1F78AFD60 -:10A1E000A068222180F86410012180F88A100021E3 -:10A1F000A0F888104AE0A06890F86300202801D0F9 -:10A200000120A9E7206905F0D8FEC0B3206905F058 -:10A21000C4FE00F0070060F30705206905F0C1FEE9 -:10A2200000F0070060F30F25A2680120002682F8E5 -:10A230008600A2F88260242082F86300D2F8080128 -:10A24000B2F851202946ADF8002005F020FB9DF81A -:10A250000020C1B28A4207BFA16881F8E860A26805 -:10A2600082F8E8109DF80110C0F30720814219BF61 -:10A27000A16881F8E900A06880F8E96006E0FFE7DE -:10A280000120FFF7C8FB1E20FFF707FBA068D0E9FD -:10A2900028134A1C43F10001C0E9282104B070BD15 -:10A2A0002DE9F047FE4D04464FF00007687808435B -:10A2B0006870287910F0200F2846806818BFA0F831 -:10A2C0007C7004D1B0F87C10491CA0F87C1090F888 -:10A2D0006910012639B990F863200023062158300F -:10A2E00005F05FF958B3A88810F4006F07D0A8688C -:10A2F00090F86910002918BFA0F874701FD1A868E1 -:10A30000B0F87410491C89B2A0F87410B0F8762027 -:10A310008A422CBF511A00218288521D8A4228BFCE -:10A3200080F87A60B0F87410B0F87620914206D3C5 -:10A33000A0F8747080F81261E878F1F7DBFC2879F6 -:10A3400010F0600F08D0A86890F8671021B980F865 -:10A3500067600121FDF75EFF4FF00808002C56D121 -:10A360006878002851D1287910F0040F0DD0A86822 -:10A3700090F86300032808BFFFDFA86890F8661014 -:10A38000072904BF2E7080F8667001F015F928794E -:10A3900010F0080F19D06878B8B9A868002190F8B3 -:10A3A000C300FFF7F4FAA86890F8C300FF2808BFBD -:10A3B000FFDFFF21A86880F8C31090F86610082915 -:10A3C00003D10221297080F86670FFF760FBA8783E -:10A3D00010F0080F16D0A8680023052190F863201C -:10A3E000583005F0DEF850B185F80180A868D0F843 -:10A3F0003C1108780C2808BF0020087002E00020FB -:10A4000003F04DFDA86801F010F800F06CFDA8689D -:10A41000A14600F1580490F8EC0030B9A27B00236B -:10A420000121204605F0BDF810B1208D401C20858B -:10A430003D21B9F1000F18D12878022808BF162055 -:10A440000ED0012804BFA86890F8EE0008D0687804 -:10A45000E8B110F0140F1CBF1E20E07602D005E01A -:10A46000E07603E010F0080F02D0E176A67641E036 -:10A4700010F0030F03D02A20E076A6763AE010F021 -:10A48000200F08BFFFDF2320E076A67632E094F8A5 -:10A490002E0028B1608D411C6185A18D884213D2A8 -:10A4A00094F8320028B1208E411C2186A18D88426B -:10A4B0000AD2218DE08C814203D3AA6892F8EC2065 -:10A4C00012B9A28D914203D32220E076A67611E044 -:10A4D000E17B31B1A18C814228BF84F81B80C5D2B9 -:10A4E00006E0A08C062803D33E20E076A67601E0A5 -:10A4F000A07EA0B1E7722773E7730221A868FDF779 -:10A5000089FEA86890F8C310012904D1D0F8F4009E -:10A510000178491E0170E878F1F7ECFB03E00021B7 -:10A52000A868FDF777FEBDE8F047FAF7ECBF5C4995 -:10A530004A788B781A430ED101280AD0087910F096 -:10A54000040F04D0886890F86600072803D0012023 -:10A550007047FDF74BBE0020704770B5504C064663 -:10A560000D46A0883043A08016F0020F04D016F0EC -:10A57000010F18BFFFDFE56016F0010F18BF25615E -:10A5800016F0020F12D0284605F01BFC062802D058 -:10A590000B282ED00AE0A06890F86310182905D186 -:10A5A0000021C0E92811012180F8691016F0800F00 -:10A5B0001CBF0820A07016F4806F08BF70BDA06893 -:10A5C000B0F8581080880844801D86B2284605F0EF -:10A5D000F8FB012804BFA068A0F8FA6015D028464F -:10A5E00005F0EFFB68B1284605F0EBFB182823D0F7 -:10A5F0000BE0A06890F86310122908BF0021D5D1A4 -:10A60000D2E7A068D0F8F0008680284605F0D9FB94 -:10A6100001281DD0284605F0D4FB08B3284605F0D4 -:10A62000D0FB182818BF70BDA068B0F8EA10284603 -:10A63000BDE8704005F0D3BCA06890F8E810002990 -:10A6400002BF90F8E91000290026A0F8EA60DCE7D4 -:10A65000A068B0F8FA102846BDE8704005F003BCC9 -:10A66000A068D0F8F00081882846BDE8704005F069 -:10A67000CABBF0B50A4C85B00026A060A680667003 -:10A68000A670054626700088FAF705FFA0680088C6 -:10A69000FAF727FFB5F8D000A168401C82B201E0AC -:10A6A0000401002001F1580004F085FD002818BFC6 -:10A6B000FFDF95F8640025280AD1B5F85810B5F8E1 -:10A6C000EA00081A00B20028A4BF6078002804D06D -:10A6D00095F8630025283BD119E0A06890F8E810B0 -:10A6E000002908BF90F8511080F8511090F8E91037 -:10A6F000002908BF90F8521080F852100020FFF790 -:10A70000CCF885F86460A16881F87B6020E0B5F83A -:10A710005810B5F8EA00081A00B20028A4BF607803 -:10A72000002815D1A06890F8E810002908BF90F81B -:10A73000511080F8511090F8E910002908BF90F8E6 -:10A74000521080F852100020FFF7A7F885F86360D8 -:10A75000A5F8D060A06890F8861039B1B0F88210E2 -:10A76000B0F88420914224BF05B0F0BD90F88A1063 -:10A7700039B1B0F88810B0F88420914224BF05B0F8 -:10A78000F0BDB0F88020B0F87E108A4224BF05B03A -:10A79000F0BD90F867208AB3B0F87C208A4224BFCD -:10A7A00005B0F0BD90F8C370FF2F00F02A81684615 -:10A7B000FAF774FE002808BFFFDF009805F03FFAA3 -:10A7C0000321009805F052FA0098017821F0100159 -:10A7D0000170394605F0C7FA192F80F0E780DFE8ED -:10A7E00007F02A22144EE5E5E61B7CE5E6E66CE57B -:10A7F000E5E5E5D8E6E6869FB8E5C500B0F87C104B -:10A80000062924BF05B0F0BDCCE7A06890F8ED1094 -:10A81000009805F02FFBCAE0A06890F8C4100098DB -:10A8200005F078FBC3E0A068D0F8F400411C009864 -:10A8300005F011FBBBE0A068D0F8F000817900982A -:10A8400005F0DDFAA068D0F8F0000189009805F065 -:10A85000CFFAA068D0F8F0004189009805F0B3FA6B -:10A86000A068D0F8F0008189009805F0B3FAA068DC -:10A87000D0F8F000C189009805F0B3FA97E0A0681D -:10A88000D0F8F000011D009805F0F8FAA068D0F8A3 -:10A89000F00000F10C01009805F0FAFAA068D0F879 -:10A8A000F00000F11E01009805F0F8FAA06800F130 -:10A8B000B801009805F000FB79E060690178009824 -:10A8C00005F012FB60698188009805F00FFB606954 -:10A8D0004188009805F00EFB69E0FE49D1E90001CE -:10A8E000CDE9020102A9009805F018FB5FE0A0681D -:10A8F000B0F84410009805F01BFBA068B0F84610B3 -:10A90000009805F019FBA068B0F84010009805F019 -:10A9100017FBA068B0F84210009805F015FB46E060 -:10A92000A068B0F84010009805F00AFBA068B0F8E5 -:10A930004210009805F008FBA068B0F84410009899 -:10A9400005F0F6FAA068B0F84610009805F0F4FAA1 -:10A950002DE0A06890F80811009805F01CFBA06895 -:10A9600090F80911009805F01AFB20E0A06890F813 -:10A97000E80004F087FF0146009805F028FBA06876 -:10A9800090F8E90004F07EFF0146009805F023FBF3 -:10A990000DE0A06890F8E510009805F040FBA06875 -:10A9A00090F8E410009805F03EFB00E0FFDFFAF7B6 -:10A9B00088FD002808BFFFDF009F384605F001FA38 -:10A9C000012809D0384605F0FCF960B1384605F099 -:10A9D000F8F918280FD014E0A068B0F8FA1038463B -:10A9E00005F041FA0DE0A068D0F8F0008188384603 -:10A9F00005F009FA05E0A068B0F8EA10384605F05D -:10AA0000EEFAB5480090B54BB54A2946304603F0FA -:10AA100081F9A0680023052190F86320583004F0E4 -:10AA2000C0FD002804BF05B0F0BD05B0BDE8F04092 -:10AA300002F041BFAB48806890F8861029B1B0F8A9 -:10AA40008210B0F8842091421AD290F88A1029B16D -:10AA5000B0F88810B0F88420914211D2B0F880206C -:10AA6000B0F87E108A420BD290F86720B0F87C00D4 -:10AA700022B1884204D200BF03F0ECB90628FBD310 -:10AA8000002001460CE470B50C46064615464FF40E -:10AA9000A071204607F0C9F82680002D08BFFFDF0F -:10AAA0002868C4F8F0006868C4F8F400A868C4F81E -:10AAB0003C0170BDF6F7B3B82DE9F0410D460746ED -:10AAC0000621F5F7CBFF040008BFBDE8F081D4F8FC -:10AAD0003C110026087858B14A8821888A4207D15B -:10AAE000082810D00D281FD00C2835D0072850D0AA -:10AAF00094F8120100285ED06E700F20287084F840 -:10AB000012616F8042E06E7008202870D4F83C011A -:10AB10004168C5F802108168C5F80610808968810F -:10AB2000D4F83C01067031E00846F6F7A1F8074674 -:10AB3000F5F716FDB8B96E700D202870D4F83C01F9 -:10AB40004068C5F80200D4F83C0106703846F5F7B5 -:10AB500001FD0120BDE8F0810846F6F789F80746B7 -:10AB6000F5F7FEFC10B10020BDE8F0816E700C20FE -:10AB70002870D4F83C014168C5F802100089E880CB -:10AB8000D4F83C0106703846F5F7E4FC0120BDE836 -:10AB9000F0816E7007202870D4F83C01416882680B -:10ABA000C068C5F80210C5F80620C5F80A00D4F838 -:10ABB0003C010670EAE794F81401C8B16E701420E5 -:10ABC000287094F814010028E0D000BF84F81461C4 -:10ABD000D4F81601C5F80200D4F81A01C5F8060029 -:10ABE000B4F81E01688194F814010028EED1CDE775 -:10ABF00094F8200180B16E701A20287084F82061CA -:10AC0000D4F82201C5F80200D4F82601C5F80600E0 -:10AC1000B4F82A016881B9E794F82C0148B16E7044 -:10AC20001B20287084F82C61D4F82E01C5F802008E -:10AC3000ACE794F80C0190B16E701820287094F86D -:10AC40000C010028A2D000BF84F80C61D4F80E01DA -:10AC5000C5F8020094F80C010028F5D196E794F8A5 -:10AC60003201002808BFBDE8F0816E701520287001 -:10AC700094F83201002889D084F83261D4F8340184 -:10AC8000C5F80200B4F83801E88094F832010028D1 -:10AC9000F2D17BE7134A5061D17070472DE9F0473C -:10ACA0000446481E85B238BFBDE8F08704F10808A5 -:10ACB0000126DFF830904FF0080A0027B4F8D000E2 -:10ACC000401CA4F8D000B4F87C00401CA4F87C0020 -:10ACD0000AE000005C230200A1A201002FA50100F0 -:10ACE0005BA501000401002094F8690040B994F8C4 -:10ACF00063200023062104F1580004F052FCD8B16F -:10AD0000B4F87400401C80B2A4F87400B4F8761053 -:10AD100081422CBF0A1A0022A3885B1D934228BFE0 -:10AD200084F87A60884207D3A4F8747084F81261BA -:10AD300099F80300F0F7DEFF94F8860020B1B4F82C -:10AD40008200401CA4F8820094F88A0020B1B4F874 -:10AD50008800401CA4F8880094F8EC0040B994F8EE -:10AD600066200023012104F1580004F01AFC20B1F0 -:10AD7000B4F88000401CA4F8800094F863000C280C -:10AD800002D00D2820D067E0B4F85800411CB4F878 -:10AD9000FA00814260D1D4F8F400411C404607F02B -:10ADA00050F80221204604F034F9D4F8F400007879 -:10ADB000002808BFFFDF0121FF20FEF7E8FD84F82F -:10ADC000637084F8966047E0B4F85800411CD4F8EA -:10ADD000F000808881423FD1D4F83C0101780029FD -:10ADE00018BFFFDF22D12188C180D4F8F00041894B -:10ADF000D4F83C010181D4F8F0008189D4F83C01F9 -:10AE00004181D4F8F000C189D4F83C018181D4F8A3 -:10AE10003C010771D4F83C0180F800A0D4F83C0153 -:10AE20002188418099F80300F0F764FF0121204652 -:10AE300004F0EFF803212046FDF7ECF9D9F80800FB -:10AE4000D0F8F0000078022818BFFFDF0221FF20B1 -:10AE5000FEF79DFD84F86370B4F85800401C691E2D -:10AE6000A4F858008DB2BFF429AFBDE8F087FE4AC0 -:10AE7000C2E90601704770B50446B0F87C0094F84A -:10AE80006710002908BFC0F1020503D0B4F87E1096 -:10AE9000081A051F94F87A0040B194F86320002343 -:10AEA000092104F1580004F07CFBA0B1B4F87460EF -:10AEB00094F8690058B994F863200023062104F13E -:10AEC000580004F06EFB002808BF284603D0B4F8F1 -:10AED0007600801B001F8542C8BF0546002DD4BFE9 -:10AEE0000020A8B270BDF0B5DF4C83B0A06890F828 -:10AEF000C310FF2907BF6178002903B0F0BD90F8A7 -:10AF0000662000230121583004F04BFB00281CBFB1 -:10AF100003B0F0BDA06890F8EC1029B103B0022096 -:10AF2000BDE8F040FEF79ABC90F863200023194674 -:10AF3000583004F036FB48B1A06890F87A0028B188 -:10AF400003B01220BDE8F040FEF788BCA0680025E1 -:10AF500090F86320122A23D004DC032A47D0112A58 -:10AF600024D003E0182A3CD0242A4CD0002304210A -:10AF7000583004F016FB00281CBF03B0F0BDD4F815 -:10AF800008C0022701269CF864001A2800F01E81E0 -:10AF900041DC012873D002287FD0032863D03EE033 -:10AFA00003B00B20BDE8F040FEF758BCF8F7D5FD24 -:10AFB0000C283CBF03B0F0BDA0680821D0F8F00019 -:10AFC0001E30F8F7CBFD28B1A0680421B830F8F79F -:10AFD000C5FD00B9FFDF03B00320BDE8F040FEF778 -:10AFE0003DBC03B00620BDE8F040FEF737BC90F84A -:10AFF000C21080F8C4100720FEF730FCA06880F86B -:10B00000635003B0F0BD1820FEF728FCA068A0F83C -:10B01000825003B0F0BD1F2847D022287ED0DCF834 -:10B02000F0000178002900F010814088BCF8001081 -:10B03000884274D100239CF8632019460CF1580013 -:10B0400004F0AFFA00286AD0A068D0F8F0100978B0 -:10B05000022972D0032971D0042970D0052908BFB4 -:10B0600008206DD0F1E09CF8C1008CF8C4000720E6 -:10B07000FEF7F4FBA06800F0B0B900E00DE00C2092 -:10B08000FEF7ECFBA068A0F8885090F88E1041F015 -:10B09000010180F88E1000F0A0B91320FEF7DEFB4E -:10B0A000A068A0F8885000F098B99CF8FD0000282E -:10B0B0001CBF03B0F0BD9CF8FC0088B1BCF8FE00DA -:10B0C000ACF84000BCF80001ACF84200BCF802014A -:10B0D000ACF84400BCF80401ACF846008CF8FC5015 -:10B0E000FEF712FC0421A068FDF794F8A06890F820 -:10B0F0004E10012908BF80F84E7016D00288A0F8C3 -:10B100001621028EA0F81821828EA0F81A21428EF4 -:10B1100000F58671A0F81C21C08E01E011E094E0DA -:10B1200048820E72E078F0F7E5FD1520FEF796FBF9 -:10B13000A068A0F8885000F050B94CE051E071E0F0 -:10B1400058E09CF87B0058B18CF8E8508CF8E95036 -:10B150001820FEF783FBA068A0F8885003B0F0BD6C -:10B160009CF8070100281CBF03B0F0BD9CF8060145 -:10B17000002804BF03B0F0BDBCF84F10DCF8080194 -:10B18000ADF80410BCF85110ADF80010019904F0AE -:10B190007EFB9DF80020C1B28A4207BFA16881F8FA -:10B1A000E850A26882F8E8109DF80110C0F307206B -:10B1B000814219BFA16881F8E900A06880F8E950D0 -:10B1C000182003B0BDE8F040FEF748BB1120FEF7A1 -:10B1D00045FBA06801E190F8640004F0D5F9A0BB3C -:10B1E00008E090F8681041B190F86900002808BFA5 -:10B1F000FFDF0A20FEF732FB27E0F8F7AEFC0C2851 -:10B2000023D3A0680821D0F8F0001E30F8F7A6FC80 -:10B2100028B1A0680421B830F8F7A0FC00B9FFDF1E -:10B220000320E7E790F88E0010F0030F0DD10C20FB -:10B23000FEF714FBA068A0F8825080F8866090F8B2 -:10B240008E1041F0010180F88E10A06890F8C310B4 -:10B25000FF291CBF03B0F0BD90F8632000231946FE -:10B26000583004F09EF901E004010020002804BFDA -:10B2700003B0F0BDA06890F8F810E9B3A1690978AF -:10B28000D1BB90F8640004F07FF9A8BBA068B0F8C7 -:10B2900058100A2935D900F108010522E06906F0A5 -:10B2A000FFFB0028A06802BF80F8F85003B0F0BD93 -:10B2B000D0F8F400017869B1411C0522E06906F07C -:10B2C000EFFB00281CBF03B0F0BDA068D0F8F4006D -:10B2D000007830B9A068E169D0F8F400401C06F0AD -:10B2E000B0FDA068D0F8F4000178491C017001207D -:10B2F000FEF7B4FAA06800E003E080F8F85003B06D -:10B30000F0BDA06890F8FC1011B190F8FD1011B3D9 -:10B3100090F80611002904BF03B0F0BD90F80711A2 -:10B3200000291CBF03B0F0BD90F8640004F02CF9B4 -:10B3300000281CBF03B0F0BDA06890F8512090F821 -:10B340000811012A4DD0022A4ED0042A14BF082A1F -:10B3500004294BD05DE0B0F8FE10A0F84010B0F822 -:10B360000011A0F84210B0F80211A0F84410B0F893 -:10B370000411A0F8461080F8FC5090F864001E28D4 -:10B3800005D003B01420BDE8F040FEF767BAFEF721 -:10B39000BBFA0421A068FCF73DFFA06890F84E10AE -:10B3A000012908BF80F84E7013D00288A0F816213A -:10B3B000028EA0F81821828EA0F81A21428E00F584 -:10B3C0008671A0F81C21C08E48820E72E078F0F7DA -:10B3D00091FC1520FEF742FAA06880F8645003B093 -:10B3E000F0BD012915D101E0022912D190F85210C7 -:10B3F00090F80901012907D0022908D0042914BFB7 -:10B40000082904280BD004E0012802D107E0022813 -:10B4100005D003B01620BDE8F040FEF71FBA03B018 -:10B420000020BDE8F040FEF738BA70B5044690F849 -:10B43000630000250C2814D00D2818BF70BDB4F887 -:10B440005800D4F8F010401C8988884218BF70BD9D -:10B45000D4F83C01FE4E0178002918BFFFDF45D12A -:10B4600022E0B4F85800B4F8FA10401C884218BF23 -:10B4700070BDD4F8F400411C04F1080006F0E1FCB2 -:10B480000221204603F0C5FDD4F8F400007800281E -:10B4900008BFFFDF0121FF20FEF779FA84F863502F -:10B4A000012084F8960070BD2188C180D4F8F00096 -:10B4B000D4F83C1140890881D4F8F000D4F83C114C -:10B4C00080894881D4F8F000D4F83C11C089888183 -:10B4D000D4F83C010571D4F83C1108200870D4F868 -:10B4E0003C1120884880F078F0F704FC01212046C8 -:10B4F00003F08FFD03212046FCF78CFEB068D0F8E6 -:10B50000F0000078022818BFFFDF0221FF20FEF7BD -:10B510003EFA84F8635070BD70B5CD4CA16891F8C7 -:10B520006320162A11BF132A91F88C20002A627812 -:10B530001BBF02206070002A70BD81F8C00000258A -:10B5400081F88B5081F88650D1F8F0000988408846 -:10B55000884218BFFFDFA068D0F8F0000078032809 -:10B5600018BFFFDF0321FF20FEF711FAA068D0F813 -:10B570003C110A78002A18BFFFDF19D10288CA805F -:10B58000D0F83C2190F8C0101171D0F83C110D7228 -:10B59000D0F83C210C211170D0F83C210188518059 -:10B5A0000088F5F765FBF4F7C5FFE078F0F7A2FB3C -:10B5B000A06880F8635070BD10B5A54C207910F0DC -:10B5C000020F08BF10BD6078002818BF10BDE068EA -:10B5D000C078192880F06981DFE800F05F4F0D8F97 -:10B5E000F8F8A6223FF86F83B1F8F8F8F8F7E3E02F -:10B5F000F9F5F4F8F300A0680023012190F8662023 -:10B60000583003F0CEFF002818BF10BD0821A068F5 -:10B6100080F86610002180F8861080F88A1010BD2E -:10B62000A0680023194690F86420583003F0B9FF51 -:10B6300018B1A168002081F88A00A068002319468B -:10B6400090F86320583003F0ACFF002808BF10BD0D -:10B650000020A16881F8860010BDA068002319466B -:10B6600090F86320583003F09CFF002808BFFFDFEC -:10B670000420A16881F8630010BDA068002319466A -:10B6800090F86320583003F08CFF002808BFFFDFDC -:10B690000C20A16881F8630010BDA0680023194642 -:10B6A00090F86320583003F07CFF002808BFFFDFCC -:10B6B0000D20A16881F8630010BDA0680023194621 -:10B6C00090F86320583003F06CFF002808BFFFDFBC -:10B6D0000121A06880F88B105FF00F0180F86310E3 -:10B6E00010BDA06890F86300122818BFFFDF012189 -:10B6F000A06880F88C101121F0E7A068002319469B -:10B7000090F86320583003F04CFF28B9A06890F8F7 -:10B710008C00002808BFFFDF0121A06880F88B1093 -:10B72000132180F8631010BDA06890F863001828FA -:10B7300018BFFFDF1B20A16881F8630010BDA0685F -:10B74000D0F8F01003884A889A4204BF0978042987 -:10B7500019D190F8632000231946583003F021FFD7 -:10B76000002808BFFFDFA06890F88E1011F0020FCC -:10B7700004BF012180F8631005D0002180F88610F5 -:10B78000D0F8F0000170A0680023194690F86420FA -:10B79000583003F006FF002808BF10BD0020A16844 -:10B7A00080E0A0680023194690F86320583003F029 -:10B7B000F8FE002808BFFFDF0520A16881F86300BC -:10B7C00010BD30E01FE012E001E067E06DE0A0682E -:10B7D0000023194690F86320583003F0E2FE002859 -:10B7E00008BFFFDF1D20A16881F86300E8E7A068BB -:10B7F0000023194690F86420583003F0D2FE002848 -:10B8000008BFFFDFCAE7A0680023194690F863204D -:10B81000583003F0C6FE002808BFFFDF2020A168D3 -:10B8200081F86300CCE7A06890F8641022291DD04D -:10B8300090F86310242918BFFFDFC1D190F8E810F9 -:10B84000002906BF90F8E9100029252102E0000038 -:10B850000401002018BF80F863107FF4F9AE0021C6 -:10B8600080F863100846FEF718F8F1E690F8E81043 -:10B87000002907BF90F8E9100029252180F86410FD -:10B880008CD1002180F8641080F87B1090F80601BC -:10B8900000281CBF0020FEF700F87FE7A168002009 -:10B8A00081F8640081F88A008AE7FFDF88E70000FA -:10B8B00070B5FC4CE1680A88A1F8E62181F8E40142 -:10B8C00091F85100012808BF012508D0022808BFBF -:10B8D000022504D0042816BF08280325FFDFE068EE -:10B8E00080F8E85190F85200012808BF012508D0DF -:10B8F000022808BF022504D0042816BF0828032503 -:10B90000FFDFE068012180F8E95180F8E2110021B1 -:10B9100080F89211E078BDE87040F0F7EBB9F0B430 -:10B92000E048C06890F84E30478EC68E458FB0F81C -:10B930004010C28FB0F842C0022B1FD08D4238BFDA -:10B9400029460186624528BF62468286018FB0F88B -:10B950004430994238BF0B464386818FB0F8464049 -:10B96000A14238BF0C46C486BB4228BF1F4647864B -:10B97000B44228BF2646C686F0BC7047038E9D425F -:10B9800028BF1D46838E9A4228BF1A46A94298BFF7 -:10B990000D460586944598BF62468286002180F850 -:10B9A0004E10D3E72DE9F04FBE4C83B0207910F054 -:10B9B000010F04BF03B0BDE8F08F606901230521CA -:10B9C000C578E06890F86420583003F0EAFD00285C -:10B9D00018BF022D0BD00A2D18BF0B2D07D0032D39 -:10B9E00018BF062D03D0607840F0080060706078C2 -:10B9F00000281CBF03B0BDE8F08F60690227012654 -:10BA000090F8038000254FF02009B8F1000F1CBF0B -:10BA1000B8F1010FB8F1160F1FD1E06890F863007C -:10BA200003F0B2FDC8B1E16891F86300202814D09A -:10BA3000212808D0B8F1160F0CBF84F80190677068 -:10BA400003B0BDE8F08F262081F86300B8F1160F2F -:10BA500000F0AE822A20FFF72BFFB8F1190F80F01B -:10BA6000E282DFE808F046230DC1FEFEFDFCFBFE8E -:10BA700091B8FAFEFEFEFEF9F8F7F6F5F4FEF300D3 -:10BA8000E0680123194690F86620583003F089FDDC -:10BA9000002840F04D84606904F0EEF9E16881F817 -:10BAA0006801072081F8660000F042BCE0680123CD -:10BAB000002190F86420583003F073FD002800F056 -:10BAC000F083606904F0D3F9E168A1F87C01B1F872 -:10BAD0005820801A00B247F6FE728242A8BF0028A2 -:10BAE0004BDD01F5BF71606904F0B8F90B20E16826 -:10BAF0003FE0E0680123002190F86420583003F013 -:10BB000050FD002800F0CD83606904F083F900281F -:10BB100000F08982606904F07AF9E168A1F87C019B -:10BB2000B1F85820801A00B247F6FE728242A8BFD0 -:10BB3000002822DD606904F064F9E16881F87E0183 -:10BB4000606904F059F9E168A1F88001606904F0C6 -:10BB50003EF9E168A1F88201606904F03FF9E1680B -:10BB6000A1F88401606904F040F9E168A1F8860158 -:10BB70000D2081F8640000F0DBBB282081F8730001 -:10BB800081F8726000F0D4BBE0680123002190F8D6 -:10BB90006420583003F005FD0028E0680CD0A0F8C0 -:10BBA000885090F88A10491C80F88A105FF01001C4 -:10BBB00080F8641000F0BCBB90F8642001230521DC -:10BBC000583003F0EEFC00281CBF0820607040F0E5 -:10BBD000AF8300F066BBE06890F86410112908BFDD -:10BBE000122140F09282E3E7E0680123002190F8FF -:10BBF0006420583003F0D5FC80B9E06890F86420E8 -:10BC0000122A0BD001230521583003F0CAFC00286A -:10BC100018BF082000F0458300F0C7B9E06890F82D -:10BC20008C1031B9A0F8885090F88A10491C80F81F -:10BC30008A1000F1E001606904F037F9E06800F172 -:10BC4000B801606904F03CF9E0680BE01BE2AFE189 -:10BC500059E1F1E0CFE0DBE0EAE23AE0A2E0FFE226 -:10BC600022E072E190F8AA01002818BFFFDFE06827 -:10BC70000188A0F8AC1100F5D771606904F003F9F0 -:10BC8000E06800F5DB71606904F005F9E06880F8B0 -:10BC9000AA61142180F86410E078F0F72BF800F026 -:10BCA00047BB000024010020E06890F864101729C9 -:10BCB00040F02B8290F88A10491E49B280F88A1011 -:10BCC0000029B8BFFFDF1C20E16881F8640000F0A4 -:10BCD0002FBBE06890F8651011F0020F09D090F8C2 -:10BCE000632001230821583003F05BFC002800F09A -:10BCF000D882E06890F88E0010F0020F17D16069CA -:10BD000004F0FCF8E16881F88F00606904F0F8F84D -:10BD1000E168A1F89000606904F0F5F8E168A1F825 -:10BD2000920091F88E0040F0020081F88E00E068E9 -:10BD300090F88E1011F0010F05D0E06890F86310B4 -:10BD400006291CD114E090F8650010F0020F18BF0E -:10BD5000FFDFE06890F8651041F0020180F865109F -:10BD6000A0F8885090F88A10491C80F88A10E4E7FF -:10BD700080F8635080F88650E078EFF7BBFFE0680A -:10BD800090F87A11042940F0D38280F87A51E07853 -:10BD9000EFF7B0FFE06890F86310002940F0C88228 -:10BDA00000F043BAE06890F8650010F0010F7BD115 -:10BDB0006946606904F0B7F8E0689DF8002090F8E3 -:10BDC0009410114001F02F0180F8941090F8951014 -:10BDD0009DF80120114001F0410180F89510A0F874 -:10BDE000885090F88A10491C80F88A1090F86510E5 -:10BDF00041F001011CE0E0680123092190F8632073 -:10BE0000583003F0CEFB002800F04B8200F041BA1E -:10BE1000E06890F8651011F0040F40F04282A0F83D -:10BE2000885090F88A2041F00401521C80F88A2042 -:10BE300080F8651000F07CBAE06890F8650010F0BA -:10BE4000300F31D1606904F08BF800287DD0606933 -:10BE500004F082F8E1680887606904F079F8E16825 -:10BE60004887606904F07AF8E1688887606904F0BF -:10BE700071F8E168C887207910F0020F03D02069BB -:10BE8000C078142811D091F863001D280DD091F8C6 -:10BE90004E0001280BD091F88901002804BF91F8C9 -:10BEA000880100280AD002E074E081F84E6091F821 -:10BEB000650040F0100081F865001AE091F8650017 -:10BEC00040F0200081F865000A88A1F8CA210A8F95 -:10BED000A1F8CC214A8FA1F8CE218A8F01F5CB7031 -:10BEE000A1F8D021C98F818780F83260E078EFF720 -:10BEF00001FFE068A0F8885090F88A10491C80F88B -:10BF00008A1000F015BAE06801230A2190F8632036 -:10BF1000583003F046FBE8B3606904F021F8B8B18B -:10BF2000606904F019F8E1680887606904F010F8A6 -:10BF3000E1684887606904F011F8E1688887606902 -:10BF400004F008F8E168C88700E06CE0FFF7E7FC60 -:10BF5000E068052180F8865080F86350FDF7FBFA11 -:10BF6000E06890F84E10012908BF80F84E7000F08C -:10BF7000DF810288A0F8BE21028EA0F8C021828E47 -:10BF8000A0F8C221428E00F5CB71A0F8C421C08E6A -:10BF9000088600E006E081F82660E078EFF7AAFE68 -:10BFA00000F0C6B9607840F00100607000F0C0B9E0 -:10BFB000E06801230B2190F86420583003F0F1FA77 -:10BFC00020B100BF84F8019000F0B2B9E06801230D -:10BFD000002190F86420583003F0E3FA002800F0C4 -:10BFE0006081E06890F863002528EBD0606903F079 -:10BFF000DAFFC0B1606903F0D4FFE16800F0070028 -:10C0000081F85000606903F0C8FF00F00701E068A4 -:10C0100080F84F1090F89321002A04BF90F89221E5 -:10C02000002A04D022E001F0DEF900F081B990F896 -:10C0300052C090F8503000F151028C4502BF117887 -:10C04000994280F87B6011D000F5CB7180F8DC61FB -:10C050000288A0F8DE2190F84F2080F8E02190F8C7 -:10C06000500081F84B00E078EFF744FEE0682221B1 -:10C0700080F86410A0F8885090F88A10491C80F865 -:10C080008A1000F055B9E06890F8631021290CBFC0 -:10C090004FF001084FF0000890F86410232908BF02 -:10C0A00000F1640705D0B8F1000F18BF00F1630775 -:10C0B0002BD0606903F099FFF0B3D4F81490484690 -:10C0C00003F087FF0090484603F087FF8146E06851 -:10C0D00090F89211002907BF4FF0000BDA4690F854 -:10C0E00094B190F895A1484603F05AFBB0B1E268CC -:10C0F00092F85110814211D019EA0B0F41D0B8F1DA -:10C10000000F08BF012802D008E0677010E1022983 -:10C1100004BF92F8500010EA090F32D0009803F0E3 -:10C120003FFB68B1009803F03BFBE16891F85210C7 -:10C13000884205D0009800E023E010EA0A0F20D0E2 -:10C140006A466169E06803F03AFBD8B3606903F0BE -:10C150004AFFE168A1F87C01B1F85820801A00B2CA -:10C1600047F6FE728242A8BF00284ADD9DF8000013 -:10C1700081F87E019DF8010081F87F01252038704B -:10C1800044E0E06890F8920100281CBF1E20FFF7F1 -:10C190008FFBB8F1000F16D0606903F012FEE16862 -:10C1A00081F8C20006FA00F010F0807F08BFFFDFC0 -:10C1B0000A21E06880F8631090F88600002808BF24 -:10C1C000FFDF0DE010E03D70E16891F88A00401E4D -:10C1D00040B281F88A000028B8BFFFDF01F003F900 -:10C1E000E06880F87B50A3E0E06890F892010028B6 -:10C1F0001CBF0020FFF75CFB3D70E06880F87B50BF -:10C2000004E0282081F8730081F87260E06800F192 -:10C2100064018F4209D190F88A10491E49B280F812 -:10C220008A100029B8BFFFDF82E080F886507FE0E7 -:10C23000606903F0F6FE16287AD1E06890F8630092 -:10C24000212802D0262805D072E0606903F0EDFEB7 -:10C25000FFF72EFBE06880F8635080F8865067E0B7 -:10C26000E06890F863000E2804D1606903F054FE82 -:10C27000122805D0E06890F863001D2818D112E05C -:10C28000E0680123092190F86320583003F089F910 -:10C2900038B1E06880F87A5080F8865080F86350B2 -:10C2A00046E0667044E0606903F036FE142805D06D -:10C2B000E06890F8630021282BD125E0E068052193 -:10C2C00080F8635080F88650FDF745F9E16891F8F1 -:10C2D0004E00012808BF81F84E7029D00A88A1F8C5 -:10C2E000BE210A8EA1F8C0218A8EA1F8C2214A8EF1 -:10C2F00001F5CB70A1F8C421C98E018680F82660B3 -:10C30000E078EFF7F7FC13E0606903F005FE16280C -:10C3100005D0606903F000FE172809D113E0E0683A -:10C3200080F8635080F886505FF01A00FFF7C0FA7B -:10C33000E068D0E928134A1C43F10001C0E9282134 -:10C3400003B0BDE8F08FE06890F864102329EFD1C6 -:10C3500080F8645090F88A10491E49B280F88A101B -:10C360000029B8BFFFDFE06880F87B5090F89201A9 -:10C37000002818BF0020DBD0D8E770B5F84E05467E -:10C380000C46F06890F8C300FF2818BFFFDFF26882 -:10C390000020002C82F8C3501CBFA2F8880070BD9A -:10C3A000A2F88200012082F8860070BD10B584B02A -:10C3B00004466846F9F772F8002808BFFFDF0098C6 -:10C3C00003F03DFC0321009803F050FC0098017835 -:10C3D00021F010010170214603F0C5FCA01E1628B3 -:10C3E00073D2DFE800F00BAA4EABAB13AA5CAAAB8A -:10C3F0001B2CAAAAAAAAABAB31734B8DD848C06834 -:10C4000090F8C410009803F035FD97E0D448C06858 -:10C4100090F8C410009803F07DFD8FE0D04CA06828 -:10C420000178009803F060FDA0688188009803F00F -:10C430005DFDA0684188009803F05CFD7EE0062168 -:10C44000009803F063FD79E0C54CE068B0F8441053 -:10C45000009803F06DFDE068B0F84610009803F016 -:10C460006BFDE068B0F84010009803F069FDE068EB -:10C47000B0F84210009803F067FD5FE0B84CE06848 -:10C4800043E0B74CE06800F1E801009803F01CFDC0 -:10C49000E06800F1BC01009803F020FD4EE00020B0 -:10C4A00002900390AE48C06890F8941001F0F50136 -:10C4B0008DF8081090F8950002A900F041008DF861 -:10C4C0000900009803F05DFD38E036E0A44CE06818 -:10C4D000B0F84010009803F033FDE068B0F8421067 -:10C4E000009803F031FDE068B0F84410009803F0C4 -:10C4F0001FFDE068B0F84610009803F01DFD1DE038 -:10C50000974CE06890F8921159B190F89411009806 -:10C5100003F041FDE06890F89511009803F03FFDAD -:10C520000CE090F85110009803F035FDE06890F8A9 -:10C530005210009803F033FD00E0FFDFF8F7C1FF71 -:10C54000002808BFFFDF04B010BD70B50C460546DB -:10C550004FF4F871204605F068FB258070BDF4F7B4 -:10C560005EBB2DE9F0410D4607460721F4F776FA48 -:10C57000040008BFBDE8F08194F896010026C8B118 -:10C580006E700820287094F8960188B1268484F88B -:10C590009661D4F89801C5F80200D4F89C01C5F85A -:10C5A0000600B4F8A001688194F896010028EDD146 -:10C5B000AE7044E094F8A201002837D094F8A201AC -:10C5C0000C2818D00D2818BFFFDF38D12088F4F7C9 -:10C5D0004FFB0746F3F7C4FFA0B96E700D2028701B -:10C5E00094F8A401A8702088A88084F8A261384635 -:10C5F000F3F7B0FF23E02088F4F73AFB0746F3F7A0 -:10C60000AFFF10B10020BDE8F0816E700C202870E3 -:10C6100094F8A401A8702088A88094F8A801A871B3 -:10C6200084F8A2613846F3F795FF08E094F8DA0140 -:10C6300040B16E700F20287084F8DA616F8001209D -:10C64000BDE8F08194F8AA0180B16E7009202870CD -:10C6500020886880D4F8AE01D4F8B2116860A9606F -:10C66000B4F8B601A88184F8AA61E8E794F8B801A3 -:10C6700040B16E7017202870B4F8BA01688084F851 -:10C68000B861DCE794F8D40188B16E701820287086 -:10C6900094F8D4010028D2D084F8D461D4F8D6011B -:10C6A000C5F8020094F8D4010028F5D1C7E794F842 -:10C6B000BC01C8B16E701420287094F8BC01002829 -:10C6C000BDD000BF84F8BC61D4F8BE01C5F802003B -:10C6D000D4F8C201C5F80600B4F8C601688194F820 -:10C6E000BC010028EED1AAE794F8C80180B16E70B1 -:10C6F0001A20287084F8C861D4F8CA01C5F802006D -:10C70000D4F8CE01C5F80600B4F8D201688196E7E6 -:10C7100094F8DC0140B11B20287084F8DC61D4F867 -:10C72000DE01C5F802008AE794F8E201002808BF9C -:10C73000BDE8F0816E701520287094F8E2010028A1 -:10C740003FF47DAF84F8E261D4F8E401C5F802005B -:10C75000B4F8E801E88094F8E2010028F2D16EE72D -:10C7600024010020FA4A9060D1707047002180F8BF -:10C77000631080F8641080F8671090F8D61011B13B -:10C780000221FCF7E8BE0321FCF7E5BE2DE9F047E6 -:10C79000EF4C81460D46E0680088F4F77BFA06000E -:10C7A00008BFFFDF60782843607020794FF00005F4 -:10C7B00010F0200FE0681CBFA0F87C5080F8DC501F -:10C7C00004D1B0F87C10491CA0F87C10E068012767 -:10C7D00090F8691039B990F8642001230621583087 -:10C7E00002F0DFFE48B3A08810F4006F07D0E068C5 -:10C7F00090F86910002918BFA0F874501DD1E068A6 -:10C80000B0F87410491C89B2A0F87410B0F87630F2 -:10C810008B422CBF5A1A0022B4F806C00CF1050C4A -:10C82000624598BF80F87A70994206D3A0F8745098 -:10C8300080F8DA71E078EFF75DFA20794FF0020ABC -:10C8400010F0600F11D0E06890F8671011B1032963 -:10C8500006D00AE080F867700121FCF77CFE04E056 -:10C8600080F867A00121FCF776FEE06890F8671079 -:10C87000012905D1A18811F4807F18BF80F867A035 -:10C880004FF00808B9F1000F40F03281A18811F48F -:10C89000007F18BFA0F8F05004D1B0F8F020521C6F -:10C8A000A0F8F02011F0080F47D06178002944D19A -:10C8B00090F8C300FF2808BFFFDFFF21E06880F881 -:10C8C000C31090F86410192905D0E06890F863103F -:10C8D00020290FD028E080F88B5090F88A10491E4C -:10C8E00049B280F88A100029B8BFFFDFE06880F8FD -:10C8F0006450EAE790F8640002F046FE80B1E06818 -:10C900002621012380F8631090F864200B21583011 -:10C9100002F047FE002804BF2A20FEF7C9FF03E00B -:10C92000E168212081F86300E06890F8661008292A -:10C9300004BF84F800A080F86650FFF733F8207930 -:10C9400010F0040F09D0607838B9E06890F86610EC -:10C95000072904BF277080F8665000F0C5FB2079D6 -:10C9600010F0100F09D0607838B9E06890F86410C2 -:10C970000B2904BF0C2180F86410A07810F0080F78 -:10C9800011D0E0680123052190F86420583002F0AE -:10C9900008FE28B184F80180E06880F8A25102E026 -:10C9A000002001F07CFA00F03CFD01F06EFA002856 -:10C9B000E06818BFA0F8D05004D1B0F8D010491CDE -:10C9C000A0F8D01001F064FA40B1E16891F8DC0001 -:10C9D00002289CBF401C81F8DC0004D8E06890F875 -:10C9E000DC00022806D9E068A0F8D050A0F8D250A8 -:10C9F00080F8DC50E0680123002190F86420583072 -:10CA000002F0CFFD20B9E06890F864000C2859D1FD -:10CA1000E0680123002190F86320583002F0C1FD46 -:10CA200000284FD0E0680123002190F8662058309C -:10CA300002F0B7FDF0B3E06890F86710022904BF78 -:10CA400090F8DC0000283DD13046F3F70FFB88B3A7 -:10CA5000E06890F8C310FF2934D1B0F8CA1001295A -:10CA600030D980F8D570B0F87E10B0F87C208B1EDD -:10CA70009A42AFBF0121891A491E89B2B0F8D0305D -:10CA8000E28893422FBF0122D21A521C92B29142E5 -:10CA900088BF1146012908BF80F8D55090F8612160 -:10CAA000A2B1B0F8D220B0F8620182422CBF0120BE -:10CAB000801A00E006E03CBF401C80B2814288BF83 -:10CAC000014603E0E068012180F8D550E068B0F845 -:10CAD0005820114489B2A0F8CC1090F86730002B90 -:10CAE00018BF012B5FD0022B1CBF032BFFDF09D027 -:10CAF000A088C0F340200028E06818BFA0F8DE50EE -:10CB00005BD153E090F86630082B23D0B0F87C104E -:10CB1000B0F87E2000268B1C9A4206D3511A891E3B -:10CB20000E04360C1CBF711E8EB290F87A1051B1F3 -:10CB300090F8632001230921583002F032FD0028CB -:10CB400008BF00262BD0E06890F8691099B90AE078 -:10CB500024010020B0F87C30032B24D3B0F87E10E1 -:10CB60001144491C1FE090F864200123062158302D -:10CB700002F017FD78B1E1680020B1F87620B1F835 -:10CB800074108B1C9A4203D3501A801E18BF401E8B -:10CB9000B04238BF86B2002E1CBF701E86B2E0685D -:10CBA000B0F8CC103144A0F8C810A1E7B0F8DE10FE -:10CBB000B0F8CE201144A0F8DE10E06890F86611BD -:10CBC00039B990F8662001231946583002F0E9FC83 -:10CBD00038B1E068B0F88010B0F8CE201144A0F869 -:10CBE0008010E06890F8863033B1B0F88210B0F869 -:10CBF000CE201144A0F8821090F98AC0BCF1000F39 -:10CC000006DDB0F88810B0F8CE201144A0F88810E6 -:10CC10003D22B9F1000F18BF80F873204DD1217863 -:10CC2000022910D0012908BF90F8681143D061781B -:10CC300039B380F8727011F0140F18BF1E210CD098 -:10CC400080F8731055E090F8C410062905BF90F8DD -:10CC5000C3100229162106212DE011F0080F18BF7C -:10CC600080F8732045D111F0200F18BF2321E7D1A0 -:10CC700011F0030F08BFFFDF2A20E16881F873007D -:10CC800033E02BB1B0F88210B0F88420914211D279 -:10CC9000BCF1000F05DDB0F88810B0F88420914297 -:10CCA00008D2B0F88020B0F87E108A4208D390F8FD -:10CCB00066212AB1222180F8731080F8727018E082 -:10CCC00090F867203AB1B0F87C208A4228BF80F8FB -:10CCD0007380F2D209E0B0F87C10062905D33E211A -:10CCE00080F8731080F8727003E0E06890F87210BA -:10CCF00079B1E06880F8635080F8645080F867503C -:10CD000090F8D610002914BF02210321FCF723FC60 -:10CD100002E00021FCF71FFCE06880F8D650BDE877 -:10CD2000F047F8F7F0BBF949024648788B7818438A -:10CD30000ED10846C0684AB1097911F0080F03D036 -:10CD400090F86600082803D001207047FCF74FBB1D -:10CD5000002070472DE9F041EC4C05460E46A088B6 -:10CD60002843A08015F0020F04D015F0010F18BF62 -:10CD7000FFDF266115F0010F4FF000084FF00107AB -:10CD80001CD03046666103F01CF8062802D00B2840 -:10CD90000BD013E0E06890F8641017290ED1002141 -:10CDA000C0E9261180F8687008E0E06890F8641027 -:10CDB000112904BF80F8688080F88C7015F0020F8C -:10CDC00018D02069C078052802D00B280BD011E0BC -:10CDD000E06890F8641015290CD10021C0E92811F1 -:10CDE00080F8697006E0E06890F86410102908BFC8 -:10CDF00080F8698015F0800F1CBF0820A070BDE886 -:10CE0000F0812DE9F84FC14C00254FF00108A580B5 -:10CE10006570A5702570E06068F30709074680F823 -:10CE2000D6800088F3F736FF5FEA000A08BFFFDF0D -:10CE3000E0680088F8F72FFBE0680088F8F751FBFE -:10CE4000E068B0F8CA1071B190F8C310FF290FD193 -:10CE500090F8661191B190F8662001231946583078 -:10CE600002F09FFB98B1E06890F8C300FF2805D05E -:10CE7000E06890F8C30000BFFFF798FAD4F80CC040 -:10CE80009CF8D700002818BFE5801ED10FE0E068AD -:10CE9000A0F8805090F8671180F8C410002102209B -:10CEA000FFF76BFAE06880F8D5500220E4E79CF8C1 -:10CEB000960138B9BCF82000BCF80410884288BF3D -:10CEC000E08002D8BCF80400E080BCF8CE00401E30 -:10CED00086B2BCF8D0003044ACF8D0009CF8D40046 -:10CEE00000281CBFACF8D2508CF8D45004D1BCF848 -:10CEF000D2003044ACF8D200BCF87C003044ACF82E -:10CF00007C009CF8690040B99CF86420012306214C -:10CF10000CF1580002F045FB28B1E068B0F874103D -:10CF20003144A0F87410E068B0F8CA1001299CBF21 -:10CF3000491CA0F8CA10002E18BF80F8DC5090F8E9 -:10CF4000D510A1B1B0F8D000E18888420FD2504688 -:10CF5000F3F78CF858B1E06890F8611139B1B0F886 -:10CF6000D210B0F86201814228BF00F094FFE2685D -:10CF700082F8D55092F864000B2818BF0C2817D1FE -:10CF8000B2F85810B2F87C31C91A09B200290FDB87 -:10CF900002F5BF7102F1080004F053FF0221E068BE -:10CFA00001F0FEFEE06880F8645080F8968048E06A -:10CFB000252824D1B2F85800B2F87C11401A00B2EA -:10CFC00000281CDB92F8921192F87E01002808BF1D -:10CFD00092F8510082F8510092F87F01002808BFB2 -:10CFE00092F8520082F8520000291CBF0020FEF780 -:10CFF0005FFCE06880F8645080F87B5021E092F894 -:10D00000630025281DD1B2F85800B2F87C11401AEF -:10D0100000B2002815DB92F87E01002808BF92F8C4 -:10D02000510082F8510092F87F01002808BF92F861 -:10D03000520082F852000020FEF73AFCE06880F8C7 -:10D040006350E16801F15800B1F8CE2002F0B3F866 -:10D05000E06890F86111002918BFA0F8D2502C4860 -:10D0600000902C4B2C4A3946484600F053FEE068AD -:10D070000123052190F86420583002F092FA00282C -:10D0800008BFBDE8F88FBDE8F84F00F014BC00F011 -:10D09000E1BE10B50446B0F882214388B0F884118F -:10D0A000B0F886019A4201BFA3889942E38898426A -:10D0B0000FD02388A4F89A31A4F89C21A4F89E11DB -:10D0C000A4F8A001012084F896011048C078EEF77A -:10D0D00011FE0121204601F063FE002084F8640067 -:10D0E000032084F8670010BD70B5084C207910F05B -:10D0F000020F08BF70BD6078002818BF70BD20699E -:10D10000C178891E162980F06C8107E02401002077 -:10D110008DC7010027CD010055CD0100DFE801F0EA -:10D120000BF969758B1BF942F95BBE80F9F9F9F9C6 -:10D13000FAF7F6F5F4F3E0680123194690F8662053 -:10D14000583002F02EFA002818BF70BD0820E168A0 -:10D1500081F8660070BD02F0DFFEE16891F863209F -:10D160000A2A04BF91F8C220824205D1002081F82A -:10D17000630081F8860070BD91F8650010F0080F1B -:10D1800004BFFFDF70BD20F0080081F8650091F852 -:10D190008A00401E40B281F88A000028A8BF70BDF6 -:10D1A00000F0D8B8E06890F8650010F0010F08BFF3 -:10D1B000FFDFE16891F88A00401E40B281F88A00E2 -:10D1C0000028B8BFFFDFE06890F8651021F001018A -:10D1D00080F8651070BDE06890F86400102818BFF2 -:10D1E000FFDF0121E06880F88B10112180F86410C6 -:10D1F00070BDE06890F86400142818BFFFDF0121BB -:10D20000E06880F88B101521F0E7E06890F8640082 -:10D21000152818BFFFDF1720E16881F8640070BD92 -:10D22000E06890F86400152818BFFFDF1920E16856 -:10D2300081F8640070BDE06890F864001C2818BF95 -:10D24000FFDF0025E06880F88B5090F8A2010028ED -:10D2500018BFFFDFE06890F88C1041B180F88C5067 -:10D260000188A0F8A61180F8A4510D2108E00188DA -:10D27000A0F8A61180F8A451012180F8A8110C2172 -:10D2800080F8A2110088F3F7F3FCF3F753F9E07884 -:10D29000EEF730FDE06880F8645070BDE06890F80B -:10D2A0007A11042915D0E06890F8651011F0020F8A -:10D2B00008BF70BD90F88A10491E49B280F88A10E4 -:10D2C0000029B8BFFFDFE06890F8651021F0020187 -:10D2D0007EE790F8632001230021583002F061F9C5 -:10D2E000002808BFFFDFE06890F88E1011F0020FF1 -:10D2F00007BF062180F86310002180F8861018BF50 -:10D3000080F87A11CFE760E04FE035E024E011E0EB -:10D3100000E066E0E0680123002190F863205830C7 -:10D3200002F03FF9002808BFFFDF0E20E16881F816 -:10D33000630070BDE06890F8651021F0040180F88A -:10D34000651090F88A10491E49B280F88A100029A9 -:10D35000A8BF70BDFFDF70BDE0680123002190F819 -:10D360006320583002F01DF9002808BFFFDF1D20A0 -:10D37000E16881F8630070BDE06890F8650000F036 -:10D380003000102818BFFFDFE06890F8651021F02A -:10D39000100180F8651090F88A10491E49B280F893 -:10D3A0008A100029A8BF70BDD4E7E06801230021DE -:10D3B00090F86320583002F0F4F8002808BFFFDF2F -:10D3C0002020E16881F8630070BDE06890F8640097 -:10D3D00022281CBF0028FFDF2320E16881F86400B9 -:10D3E00070BDFFDF70BD10B5FE4CE16891F86500BF -:10D3F00010F0080F1EBF0120607010BD40F0080043 -:10D4000081F86500606902F0DCFCE16881F8C10028 -:10D410000020A1F8880091F88A00401C81F88A0059 -:10D4200010BD2DE9F041EF4CE06890F8C310FF29E2 -:10D4300006BF61780029BDE8F08190F866200123DD -:10D440001946583002F0ADF8002818BFBDE8F08149 -:10D45000E068002790F8661159B1A0F8807090F844 -:10D46000671180F8C410BDE8F04100210220FEF7EA -:10D4700084BF90F8642001230421583002F091F811 -:10D480005FEA00084FF002054FF001060CD0D4F817 -:10D490000CC09CF8640010287ED014287DD015287C -:10D4A0007CD01C287BD0E1E0E16891F8650010F0A9 -:10D4B000010F05D0BDE8F04101210920FEF75DBF55 -:10D4C00010F0020F0CD001210C20FEF756FFE0688F -:10D4D00090F88E1041F0010180F88E10BDE8F081C7 -:10D4E00010F0040F05D0BDE8F04101211320FEF734 -:10D4F00044BF10F0080F09D091F8C10081F8C400B2 -:10D50000BDE8F04101210720FEF737BF10F0100FF2 -:10D5100002D091F8890120B191F8640022287DD1D0 -:10D520009BE091F8880188B1B1F88A01A1F8400028 -:10D53000B1F88C01A1F84200B1F88E01A1F84400C5 -:10D54000B1F89001A1F8460081F88871FEF7E7F97B -:10D550000521E068FBF7FFFFE06890F84E10012915 -:10D5600008BF80F84E5014D00288A0F8BE21028E69 -:10D57000A0F8C021828EA0F8C221428E00F5CB71A6 -:10D58000A0F8C421C08E088681F82660E078EEF706 -:10D59000B1FB0121152003E006E00BE023E056E09B -:10D5A000BDE8F041FEF7E9BEBDE8F04101210B20E6 -:10D5B000FEF7E3BEF6F7D1FA0C2838BFBDE8F081DC -:10D5C0000821E068E830F6F7C9FA28B1E0680421DC -:10D5D000BC30F6F7C3FA00B9FFDFBDE8F041012126 -:10D5E0000420FEF7CABE9CF86901012817D0022862 -:10D5F00018BFBDE8F0819CF88C0000281CBF0620F5 -:10D600008CF8C4004FF0010114BF02200D20FEF77A -:10D61000B4FEE06880F86971BDE8F08126E09CF80E -:10D62000A201002818BFBDE8F0810CF1A803002278 -:10D630000CF1E0010CF5B57001F03BFF0121052074 -:10D64000FEF79BFEE06880F86971BDE8F081BDE8F7 -:10D65000F04101210620FEF790BE91F87B00C0B991 -:10D6600091F8920110B191F8930190B1E068012313 -:10D67000002190F86320583001F093FFC8B1E068B2 -:10D680000123042190F86420583001F08AFF30B162 -:10D690000FE0BDE8F04101211720FEF76EBEE06803 -:10D6A00090F87A0028B1BDE8F04100211220FEF781 -:10D6B00064BEE06890F863200A2A4DD0B8F1000FEC -:10D6C00018BFBDE8F08101230021583001F069FF47 -:10D6D00048B1E06890F87A11042904BF90F88E00F0 -:10D6E00010F0030F42D0E0680123002190F863207E -:10D6F000583001F056FF002808BFBDE8F081E0680F -:10D7000090F8881111B190F88911E1B390F8921155 -:10D71000002908BFBDE8F08190F89311002918BFD7 -:10D72000BDE8F08190F8642001230B21583001F00E -:10D7300038FF002818BFBDE8F081E06890F851205C -:10D7400090F89411012A71D0022A73D0042A14BFD0 -:10D75000082A042970D082E090F8C21080F8C41022 -:10D76000BDE8F04100210720FEF707BE00210C2094 -:10D77000FEF703FEE06890F88E1041F0010180F89A -:10D780008E10BDE8F081FFE7B0F88A11A0F84010D4 -:10D79000B0F88C11A0F84210B0F88E11A0F8441027 -:10D7A000B0F89011A0F8461080F8887190F86500E4 -:10D7B00010F0200F34D0FEF7B2F80521E068FBF737 -:10D7C000CAFEE06890F84E10012908BF80F84E505C -:10D7D00017D00288A0F8BE21028E00F5CB71A0F808 -:10D7E000C02101E024010020828EA0F8C221428ED7 -:10D7F000A0F8C421C08E088681F82660E078EEF794 -:10D8000079FA01211520FEF7B8FDE06890F865105F -:10D8100021F0200141F0100180F86510BDE8F08191 -:10D82000BDE8F04100211420FEF7A7BD012916D163 -:10D8300002E0FFE7022912D190F8522090F89511EA -:10D84000012A07D0022A08D0042A14BF082A042972 -:10D8500022D004E0012902D11EE002291CD090F858 -:10D86000642001230321583001F09BFE002818BFDB -:10D87000BDE8F081E0680123022190F8642058306F -:10D8800001F08FFE002818BFBDE8F0810021BDE83F -:10D89000F0411620FEF771BDBDE8F0410020FEF713 -:10D8A00007B8000030B5FF4C05462078002818BFA7 -:10D8B000FFDFA57230BDFB49012048727047FA486E -:10D8C00000B502784168406801F1580C91F8633066 -:10D8D00090F85100252B1CBF9CF80CC0BCF1250F03 -:10D8E00017D0202B18BF212B38D0BCF1230F18BF25 -:10D8F00000BD002A08BF00BD91F8942191F8501096 -:10D90000114011F0010F44D0082818BF04284CD052 -:10D910004EE08AB191F87E11002908BF00BD0828A9 -:10D9200018BF042841D0082918BF04293DD0012878 -:10D9300018BF01293CD036E091F8E810002908BF53 -:10D9400000BD082818BF04282FD0082918BF0429B3 -:10D950002BD0012818BF01292AD024E0BCF1230FC5 -:10D96000C7D0002A08BF00BD91F8941111F0010F33 -:10D9700004D0082818BF042817D019E011F0020FAE -:10D9800008BF00BD082818BF04280ED001280FD0FA -:10D9900009E011F0020F08BF00BD082818BF0428D5 -:10D9A00003D0012804D0022000BDFFDF082000BD05 -:10D9B000012000BD2DE9F14FBB4E4FF0010831466B -:10D9C0006FF00E0A4F686FF00D0B97F85210F88E3B -:10D9D00002290CBF0AEB90000BEBD00085B2788EC9 -:10D9E000A84238BF0546AF4C2946606BF2F77AFB78 -:10D9F000DFF8B892E06200281DBF0021A170A0628C -:10DA000084F8028008BFC4F8289030787068014616 -:10DA100000F1580890F86930428E91F85210C08E8B -:10DA200002290CBF0AEB90000BEBD00080B28242BF -:10DA300038BF1046002B1CBF001D80B2F6F756FE03 -:10DA400098F81100002838D008F15001974891E863 -:10DA50000E1000F5027A8AE80E10D8F86010C0F8AF -:10DA60002112D8F86410C0F8251200F58170F7F77C -:10DA7000B6F9307800280CBF0120002080F00101A9 -:10DA80008B480176D8E91212C0E90412C4F8289034 -:10DA90004946A581A0F58372F6F71BFD97F8520061 -:10DAA000012808BF002104D002281ABFFFDF00218F -:10DAB00001210120F6F71BFD04E0A06AF7F78FF9BA -:10DAC000F6F738FD009848B9012297F852309621B0 -:10DAD0001046F7F741F89620F7F7A9F997F82C00C8 -:10DAE000012808BFF7F726FA02202070BDE8F88F5A -:10DAF0002DE9F04FDFF8B08183B0414681464E6892 -:10DB0000A1F11400009096F85D004FF0000A012783 -:10DB100006F15804A1F1380570B3012873D002282A -:10DB200075D0032818BFFFDF7FD0686A082201780C -:10DB300021F008010170A37902EAC302114321F028 -:10DB400004010170E279042303EA8202114321F007 -:10DB50001001017094F805B0286BF2F795FA82462F -:10DB6000F7F7E3FCBBF1020F66D0BBF1010F67D002 -:10DB7000BBF1030F68D06CE0B6F834B0FFF79FFE3E -:10DB8000022819BF6FF00D0000EBDB006FF00E00F4 -:10DB900000EB9B0081B2308E884238BF0146ADF861 -:10DBA0000810A6F84C100098F7F79EFC38B1696A87 -:10DBB000EF70AA694FF48060904703201EE001AA2D -:10DBC00002A9286BF2F743F9686210B194F8331098 -:10DBD00021B10098F7F75CFC6771A6E79DF8041087 -:10DBE00031B9A0F800A080F802A0012102F03EF8AF -:10DBF000BDF80810686A02F01AFA0220607194E712 -:10DC000001E004E011E00098F7F742FC8DE7B6F878 -:10DC10004C00ADF8000001AA6946286BF2F717F92D -:10DC20006862002808BFFFDF7FE70098F7F75CFC19 -:10DC3000002808BFFFDF78E730EA0A0009D106E0D4 -:10DC400030EA0A0005D102E0BAF1000F01D001214B -:10DC500000E00021686A027842EA01110170217C2B -:10DC600000291CBF617901293CD004F150010F4803 -:10DC700091E80E1000F5027A8AE80E10216EC0F8C5 -:10DC80002112616EC0F8251200F58170F7F7A7F830 -:10DC900098F8000000280CBF0121002104480176FB -:10DCA00008E000003C01002074010020C00E0020AC -:10DCB000C8100020D4E91012C0E90412A0F5837145 -:10DCC0006A6AF6F706FC96F85100012808BF0021A1 -:10DCD00004D002281ABFFFDF002101210020F6F73F -:10DCE00006FC03E0F7F77BF8F6F724FCB9F1000F28 -:10DCF00006D196F85130012296210020F6F72CFF2C -:10DD0000AF71686A018829828078A8742F7003B087 -:10DD1000BDE8F08F2DE9F0471E46174681460C46B8 -:10DD2000FE4DDDF82080287828B9002F1CBF002E7A -:10DD3000B8F1000F00D1FFDFC5F82080C5E90E94CF -:10DD4000C5E9067600206872287268712871A8718A -:10DD5000E871F34EE870E881307804F158072088C4 -:10DD6000F2F798FF28632088F2F782FF6863F7F7DD -:10DD70002BF8F6F7DBFC04F11200F7F70EF804F1CC -:10DD80000E00F6F774FD307800280CBF0320012048 -:10DD9000F7F717F8787EF6F772FDF7F70CF830789A -:10DDA0006FF00E056FF00D09002830D0618EE08E07 -:10DDB00094F852407A7C022C0CBF05EB900009EBE2 -:10DDC000D00080B2814238BF0846002A1CBF001D27 -:10DDD00080B22146F6F78AFC3078002831D070688E -:10DDE00090F86001002818BFF6F7F2FC22460021E7 -:10DDF0000120F6F76DFE7068D0F8D800F6F7F2FF54 -:10DE00000120FFF7D7FDBDE8F047F6F7E5BF97F82B -:10DE10001080278EB4F834A0FFF751FD022814BFFC -:10DE200009EBDA0005EB9A0085B2AF4234BF384601 -:10DE30002846B8F1000F1CBF001D80B294F8514075 -:10DE4000C7E7002122460846F6F742FE0120FFF709 -:10DE50004FFED8E7B24810B501783838007831B1B4 -:10DE6000022818BFFFDFBDE81040F6F7ADBF01285C -:10DE700018BFFFDFF7E7A94810B50078022818BFE0 -:10DE8000FFDFBDE8104000F044BAA4488079704735 -:10DE9000A24840797047A1490120C87170472DE917 -:10DEA000F04706009E489D4D4FF0010740684FF037 -:10DEB000000800F15804A86A90F8019018BF012EDC -:10DEC00003D1696B03F0D0FA68706878A0B10128BB -:10DED00031D0022849D003281CBFFFDFBDE8F087FE -:10DEE000012E08BFBDE8F087686BF2F70CFBA87A3B -:10DEF000BDE8F047EDF7FEBE012E08D001224946ED -:10DF0000686BF2F74DF9022E08BFBDE8F087D4E93F -:10DF10001202411C42F10000C4E91210E07901280C -:10DF200003D100BF84F8078000E0E771A87ABDE85C -:10DF3000F047EDF7DFBE012E08D000224946686B9E -:10DF4000F2F72EF9022E08BFBDE8F087D4E91201DE -:10DF5000401C41F10001C4E91201E07901280CBF25 -:10DF600084F80780E771BDE8F087012E06D0686B62 -:10DF7000F2F7C9FA022E08BFBDE8F087D4E9120112 -:10DF8000401C41F10001C4E91201E0790128CCD123 -:10DF9000C8E72DE9F041624F4FF000083846A7F17D -:10DFA00038044068012600F158052078012818BF80 -:10DFB000FFDFA87850B185F80280E670A26941467B -:10DFC000042090473878002818BF2E71606A03211A -:10DFD000007831EA000004BFE878002805D1EE702F -:10DFE000616AE670A269022090470121002000F0DA -:10DFF000B1F918B1BDE8F04100F08BB9BDE8F041CE -:10E000000020D7E42DE9F84F454C83462046A4F183 -:10E0100038054068217800F1580A287800264FF02A -:10E020000109022818BFFFDFE88940F40070E88189 -:10E030002078676800283A48406890F868000090A7 -:10E040003C8EB7F83480FFF73AFC022807BF6FF028 -:10E050000E0000EB98006FF00D0000EBD80080B2CE -:10E06000844238BF2046009900291CBF001D80B2A1 -:10E0700097F85110F6F73AFB9AF81100BBF1000F30 -:10E0800000F0FA80F6F77CFAF6F76AFA90B99AF897 -:10E09000110078B1A86A417861B100789AF8071048 -:10E0A000C0F3C000884205D185F80490BDE8F84F60 -:10E0B00000F02FB9A86A1A4FB0460188A5F81310CE -:10E0C00080786875E88940F02000E8816E713878C2 -:10E0D0007868583000907C6894F82C00012818D19A -:10E0E000F6F71EFF2046009901F023FA88B1387830 -:10E0F000002878680CBF00F5867000F5EA7021886A -:10E1000041800099097A017180F80090A87AEDF7B2 -:10E11000F1FDA86A0078C0F3800003E03C01002014 -:10E12000740100209AF80610884237D03878786851 -:10E1300000F1580490F85D0060B3022848D000BF99 -:10E1400084F80580387840B12079414628B12171A2 -:10E1500085F80390AA6910209047E07898B184F878 -:10E160000380F7F7D0F9002808BFFFDF082085F803 -:10E170000390AA6900219047D4E91002411C42F1A2 -:10E180000000C4E91010A07901280CBF84F80680B3 -:10E1900084F80690E88940F48070E881A86A9AF8CB -:10E1A00007300178C1F3C0029A4252D13A787A68B6 -:10E1B00001F0030102F15804012918BF022935D0EA -:10E1C00003291CBF287A40F0040012D0287240E0D6 -:10E1D000286BF1F776FE002808BFFFDFD4E91002B4 -:10E1E000411C42F10000C4E91010A87AEDF782FD4D -:10E1F000A6E701F05CFDA8B184F80290E9894846E1 -:10E2000041F40061E981A96A85F80390AA69904701 -:10E21000E079012803D100BF84F8078019E084F871 -:10E22000079016E0287A40F01000CFE74078F8B168 -:10E23000E98941F40061E981A97851B9FB28F1D855 -:10E24000687A002808BF4E4603D08020AA690021C2 -:10E2500090475946012000F07DF858B39AF8110014 -:10E26000002818BFBBF1000F1BD0A87868B118E0D8 -:10E27000E0790128D3D1CFE7002818BFF6F7B9F924 -:10E28000E88940F04000E881E3E7A96AAA89487874 -:10E29000904288BF1046C21CE86A03F02DFCE86A71 -:10E2A000A862002E1CBF0020FFF7F9FDBDE8F84F63 -:10E2B00000F02FB8002E1CBF0120FFF7F0FD00205A -:10E2C000FFF716FC9AF81100002818BFBBF1000FE9 -:10E2D0000DD0A87858B9A96AAA894878904288BF11 -:10E2E0001046C21CE86A03F007FCE86AA862002E28 -:10E2F00008BFBDE8F88F0220BDE8F84FCFE5354AEA -:10E300001378526892F851200BB1FBF76ABAFAF70A -:10E310001AB970B52F4900254C68F6F7B7FDF6F726 -:10E32000A9FDF6F7DBFCF6F73EFDF6F703F9F6F785 -:10E3300053FD94F82C00012808BFF6F7F1FD264C98 -:10E340000021A269E0899047226A217A20799047CA -:10E35000257070BD70B5204C0546002908BF012D01 -:10E3600005D16079401CC0B26071012830D8E169E4 -:10E370002846884700282BD0E179184839B1012D6B -:10E3800001BF41780029017811F0100F20D0217AC7 -:10E39000F1B910490978002918BF002102D029439A -:10E3A00004D013E0012D18BF0121F8D10C490978E0 -:10E3B00011F0100F04BF007810F0100F08D0E078B3 -:10E3C00030B9A07810B111F0100F01D0002070BD4D -:10E3D000012070BD740100203C0100204F0100208D -:10E3E0004C01002010B540F2C311F94803F0FBFBCB -:10E3F000FF220821F748E4F7FAFDF74800214170B1 -:10E400004FF46171418010BD2DE9F0410F46064681 -:10E4100000F03FFBEE4C102817D004EBC00191F840 -:10E420004A1111F0010F1CBF0120BDE8F081617895 -:10E4300008291FD2617804EBC000491C61700121DA -:10E4400080F84A110846BDE8F0816178082911D2A8 -:10E450002578681C207004EBC5083868C8F84401AA -:10E46000B888A8F84801102D28BFFFDF88F843615D -:10E470002846DFE70020BDE8F081D5480178491E35 -:10E480004BB2002BB8BF704770B4002500EBC3013E -:10E4900091F84A1111F0010F3BD04278D9B2521EC7 -:10E4A000427000EBC10282F84A5190F802C000228B -:10E4B000BCF1000F0BD9841894F803618E4202D18D -:10E4C000102A26D103E0521CD2B29445F3D8027828 -:10E4D000521ED2B202708A421BD000EBC20200EB85 -:10E4E000C10CD2F84341CCF84341D2F84721CCF8D3 -:10E4F0004721847890F800C00022002C09D98618A2 -:10E5000096F8036166450AD1102A1CBF024482F8BE -:10E510000311591E4BB2002BB8DA70BC7047521C65 -:10E52000D2B29442EBD8F4E72DE9F0471F4690466B -:10E530000E46814600F0ADFAA54C0546102830D0B5 -:10E54000A2780021002A0ED9631893F80331834280 -:10E5500005D110291CBF1220BDE8F08703E0491C3B -:10E56000C9B28A42F0D8082A2FD2102D1CD0A67822 -:10E570001022701CA07004EB061909F1030041463B -:10E5800000F086FF09F183001022394600F080FF79 -:10E59000A019002180F8035180F83B110846BDE81E -:10E5A000F087A278082A10D22578681C207004EB26 -:10E5B000C50A3068CAF84401B088AAF84801102D8D -:10E5C00028BFFFDF8AF84391D1E70720BDE8F08735 -:10E5D00070B47F488178491E4BB2002BBCBF70BC21 -:10E5E000704700BF817803F0FF0C491ECAB28270E9 -:10E5F00050FA83F191F8031194453ED000EB0215D7 -:10E6000000EB0C14D5F80360C4F80360D5F807607C -:10E61000C4F80760D5F80B60C4F80B60D5F80F603C -:10E62000C4F80F60D5F88360C4F88360D5F88760BC -:10E63000C4F88760D5F88B60C4F88B60D5F88F502C -:10E64000C4F88F50851800EB0C0402EB420295F8D9 -:10E6500003610CEB4C0C00EB420284F8036100EB0D -:10E660004C0CD2F80B61CCF80B61B2F80F21ACF86E -:10E670000F2195F83B2184F83B2100EBC10292F871 -:10E680004A2112F0010F33D190F802C00022BCF1F0 -:10E69000000F0BD9841894F803518D4202D1102A2F -:10E6A00026D103E0521CD2B29445F3D80278521E10 -:10E6B000D2B202708A421BD000EBC20200EBC10C46 -:10E6C000D2F84341CCF84341D2F84721CCF8472156 -:10E6D000847890F800C00022002C09D9851895F89C -:10E6E000035165450BD1102A1CBF024482F8031167 -:10E6F000591E4BB2002BBFF675AF70BC7047521C51 -:10E70000D2B29442EAD8F3E73349487070473248AE -:10E710004078704738B14AF2B811884203D82E4980 -:10E72000488001207047002070472B484088704780 -:10E7300010B500F0AEF9102814D0254A014600208B -:10E7400092F802C0BCF1000F0CD9131893F80331F2 -:10E750008B4203D1102818BF10BD03E0401CC0B28B -:10E760008445F2D8082010BD19498A78824286BFB4 -:10E7700001EB001083300020704715498A788242EF -:10E7800086BF01EB0010C01C00207047104B93F8AF -:10E7900002C084459CBF00207047184490F80301D4 -:10E7A00003EBC00090F843310B70D0F844111160B6 -:10E7B000B0F84801908001207047054A114491F853 -:10E7C000032105490A7002684A6080880881704701 -:10E7D000F0100020860100207C01002010B5F5F724 -:10E7E00027FE002804BFFF2010BDBDE81040F5F74C -:10E7F00045BEFE498A7882429CBF0020704708448B -:10E8000090F8030101EBC00090F84A0100F001000C -:10E8100070472DE9F047F54F0026B04638780028BC -:10E8200086BF4FF0080ADFF8C893BDE8F08700BF45 -:10E8300007EBC80505F5A27195F8430100F029F929 -:10E84000102808BF544610D0B978002400290BD9ED -:10E850003A1992F80321824202D1102C05D103E02B -:10E86000621CD4B2A142F3D80824B878A04286BF73 -:10E8700007EB0410C01C002095F84A1111F0010F9D -:10E8800016D050B1082C04D2391991F83B11012946 -:10E8900003D0102100F0D9FD50B109F806403046F0 -:10E8A000731C95F8432105F5A271DEB2F5F7A8FFB8 -:10E8B00008F1010000F0FF0838784045B8D8BDE8FD -:10E8C000F0872DE9F041C94C00263546A078002894 -:10E8D0008CBFC74FBDE8F0816119C0B291F80381C8 -:10E8E000A84286BF04EB0510C01C002091F83B1124 -:10E8F000012903D0102100F0A8FD58B104EBC80095 -:10E90000BD5590F8432100F5A2713046731CDEB26C -:10E91000F5F776FF681CC5B2A078A842DCD8BDE840 -:10E92000F08110B5F5F79BFF002804BF082010BD4B -:10E93000F5F799FFAE49085C10BDAE4910B54978AE -:10E9400041B1AA4B997829B1C21CD81CF5F70DFD2D -:10E95000012010BD002010BDA44A01EB410102EBD3 -:10E9600041010268C1F80B218088A1F80F017047AE -:10E970002DE9F0419D4D07460024A878002898BF56 -:10E98000BDE8F081C0B2A04213D905EB041010F12C -:10E9900083060ED01021304600F057FD48B904EB35 -:10E9A000440005EB400000F20B113A463046F6F702 -:10E9B0003AFE601CC4B2A878A042E3D8BDE8F0815A -:10E9C000014610228C4800F063BD8B48704770B53B -:10E9D000864D0446A878A04206D905EB0410102104 -:10E9E000833000F032FD08B1002070BD04EB44001C -:10E9F00005EB400000F20B1070BD7C498A78824222 -:10EA000006D9084490F83B01002804BF0120704754 -:10EA1000002070472DE9F0410E46074615460621B5 -:10EA2000304600F012FD714C98B1A17871B104F537 -:10EA30009D7011F0010F18BF00F8015FA17849081F -:10EA400004D0457000F8025F491EFAD10120BDE8EC -:10EA5000F0813846314600F01CF8102816D0A37813 -:10EA60000021002B12D9621892F80321824209D1A9 -:10EA7000102918BF082909D0601880F83B510120DF -:10EA8000BDE8F081491CC9B28B42ECD80020BDE83A -:10EA9000F0812DE9F041554D0646002428780F46B7 -:10EAA000002811D905EBC40090F84311B14206D1FA -:10EAB0000622394600F5A27002F0F2FF38B1601C60 -:10EAC000C4B22878A042EDD81020BDE8F0812046DD -:10EAD000BDE8F081454910B44A7801EBC003521EED -:10EAE0004A70002283F84A2191F802C0BCF1000F5D -:10EAF0000DD98B1893F80341844204D1102A1CBF0E -:10EB000010BC704703E0521CD2B29445F1D80A7889 -:10EB1000521ED2B20A70824204BF10BC704701EB91 -:10EB2000C00301EBC202D2F843C1C3F843C1D2F81B -:10EB30004721C3F847218C7891F800C00022002CAF -:10EB40009CBF10BC70478B1893F80331634506D106 -:10EB5000102A1CBF114481F8030110BC7047521CDD -:10EB6000D2B29442EFD810BC704770B41F490D1850 -:10EB70008A78521ED3B28B7095F80321984247D001 -:10EB800001EB001401EB031C00EB4000DCF8036018 -:10EB9000C4F80360DCF80760C4F80760DCF80B60B9 -:10EBA000C4F80B60DCF80F60C4F80F60DCF8836019 -:10EBB000C4F88360DCF88760C4F88760DCF88B6099 -:10EBC000C4F88B60DCF88FC0C4F88FC001EB030C75 -:10EBD00003EB43039CF8034101EB430385F8034136 -:10EBE00001EB4000D3F80B4108E00000F0100020DA -:10EBF000860100207C010020B3120020C0F80B41E8 -:10EC0000B3F80F31A0F80F319CF83B0185F83B01B8 -:10EC100001EBC20090F84A0110F0010F1CBF70BC5C -:10EC2000704700208C78002C0DD90B1893F803C185 -:10EC3000944504D110281CBF70BC704703E0401CF1 -:10EC4000C0B28442F1D80878401EC0B20870904229 -:10EC500004BF70BC704701EBC20301EBC000D0F8E9 -:10EC600043C1C3F843C1D0F84701C3F847018C78CA -:10EC70000B780020002C9CBF70BC704701EB000C8F -:10EC80009CF803C19C4506D110281CBF084480F89D -:10EC9000032170BC7047401CC0B28442EED870BCE7 -:10ECA0007047000010B50A7B02F01F020A730022B1 -:10ECB000C2758B181B7A03F0010C5B0803F001048A -:10ECC000A4445B0803F00104A4445B0803F00104BE -:10ECD000A4445B0803F0010464444FEA530C0CF0B5 -:10ECE000010323444FEA5C0C0CF00104234403EBC2 -:10ECF0005C0300EB020C521C8CF8123090F817C029 -:10ED0000D2B26344C375052AD3D3D8B2252888BFAD -:10ED1000FFDF10BD00238383028401EBC202521E79 -:10ED2000B2FBF1F1C183704770B46FF01F02010CA8 -:10ED300002EA90251F23A1F5AA4054381CBFA1F573 -:10ED4000AA40B0F1550009D0A1F52850AA381EBF3D -:10ED5000A1F52A40B0F1AA00012000D100204FF017 -:10ED6000000C62464FEA0C048CEA0106F643164397 -:10ED7000B6F1FF3F11D005F001064FEA5C0C4CEAFA -:10ED8000C63C03F0010652086D085B08641C42EAA9 -:10ED9000C632162CE8D370BC704770BC0020704798 -:10EDA0002DE9F04701270025044603290FD04FF431 -:10EDB000FA43002972D0012900F0F880022918BF17 -:10EDC000BDE8F0870146BDE8F04758306AE704F136 -:10EDD00058067021304602F028FFB571F571F572C2 -:10EDE0003573B573F573757135767576F52086F8DC -:10EDF0003C00412086F83D00FF2086F86B00A4F817 -:10EE0000C850A4F8CA50A4F8CC50A4F8CE50A4F826 -:10EE1000D050A4F8D25084F8D55084F8D750A4F834 -:10EE2000DE5084F8DC50A4F8F050A4F8F25084F8D6 -:10EE30002C50258484F8517084F852704FF4486047 -:10EE400060801B21218761874FF4A470E087A08731 -:10EE500021866186E086A086A4F84410A4F84600C6 -:10EE6000A4F84010A4F84200A4F84810A4F84A10EE -:10EE7000A4F84C10677384F8885184F8895184F899 -:10EE8000925184F8935184F8615184F8665184F862 -:10EE9000695184F87A51BDE8F087FFE7A4F8DE50A5 -:10EEA00084F8D6506088FE490144B1FBF0F1A4F823 -:10EEB00076104BF68031A4F87810E288A4F87C50E4 -:10EEC000B4F880C0D2000CFB00FCB2FBF0F29CFB5B -:10EED000F0FC521CA4F880C092B202FB00FC04F1CA -:10EEE0005801A4F87E20BCF5C84FC4BF521ECA8486 -:10EEF000B3FBF0F2521C8A8500F5802202F5EE3257 -:10EF0000531EB3FBF0F2CA838B8B03FB00F2B2FB00 -:10EF1000F0F08883214604F15800FFF7C3FED4F8CF -:10EF20000E106FF01F02080C02EA9126A0F5AA410C -:10EF30004FF01F0C54391CBFA0F5AA41B1F1550187 -:10EF40000AD0A0F52851AA391EBFA0F52A41B1F177 -:10EF5000AA014FF0010901D14FF00009002211462A -:10EF60004FEA020382EA00086FEA080848EA01084B -:10EF7000B8F1FF3F16D006F00108520842EAC83245 -:10EF800049080CF0010876085B1C41EAC8314FEAD9 -:10EF90005C0C162BE6D3B9F1000F1CBF84F860514E -:10EFA000BDE8F08784F86071BDE8F087A4F8DE5012 -:10EFB000B4F88221B4F88611B4F802C004F1580004 -:10EFC000A4F87C50B4F88040C90004FB0CF4B1FBF9 -:10EFD000F2F194FBF2F4491C048589B201FB02F4BE -:10EFE000C184B4F5C84FC4BF491EC184B3FBF2F15C -:10EFF000491C8185018C02EBC101491EB1FBF2F174 -:10F00000C183818B01FB0CF1B1FBF2F18183BDE87F -:10F01000F08770B50025044603290DD04FF4FA425D -:10F02000002958D001297DD0022918BF70BD0146A2 -:10F03000BDE87040583035E604F15806702130467E -:10F0400002F0F3FDB571F571F5723573B573F573B3 -:10F05000757135767576F52086F83C00412086F886 -:10F060003D00FF2086F86B00A4F8D050202084F8E3 -:10F07000D20084F8C850C4F8CC50012284F82C5037 -:10F0800084F8512084F852201B20208760874FF499 -:10F09000A471E187A18720866086E186A186A4F815 -:10F0A0004400A4F84610A4F84000A4F84210A4F8C4 -:10F0B0004800A4F84A00A4F84C00627384F8FC509D -:10F0C00084F8FD5084F8065184F8075184F8EC5018 -:10F0D00084F8F85070BD608871490144B1FBF0F1CB -:10F0E000A4F876104BF68031A4F87810E388A4F8E1 -:10F0F0007C50B4F880C0DB000CFB00FCB3FBF0F3E9 -:10F100009CFBF0FC5B1CA4F880C09BB203FB00FCE2 -:10F1100004F15801A4F87E30BCF5C84FC4BF5B1E93 -:10F12000CB8400E017E0B2FBF0F2521C8A8500F5B8 -:10F13000802202F5EE32531EB3FBF0F2CA838B8BB2 -:10F1400003FB00F2B2FBF0F08883214604F1580083 -:10F15000BDE87040A6E5D4F8F030B4F802C004F180 -:10F1600058005989DB89A4F87C50B4F88040DB0052 -:10F1700004FB0CF4B3FBF1F394FBF1F45B1C04858A -:10F180009BB203FB01F4C384B4F5C84FC4BF5B1E3C -:10F19000C384B2FBF1F2521C8285028C01EBC202E5 -:10F1A000521EB2FBF1F2C283828B02FB0CF2B2FB65 -:10F1B000F1F1818370BD2DE9F003C47D0CB1252CE4 -:10F1C00003D9BDE8F00312207047002A02BF0020D7 -:10F1D000BDE8F003704791F80DC01F260123314DA3 -:10F1E0004FF00008BCF1000F7AD0BCF1010F1EBF38 -:10F1F0001F20BDE8F0037047B0F800C00A7C8F7B89 -:10F2000091F80F907A404F7C87EA090742EA07227B -:10F2100082EA0C0C5FF000070CF0FF094FEA1C2C8F -:10F2200099FAA9F99CFAACFC4FEA19694FEA1C6CEF -:10F2300049EA0C2C0CEB0C1C7F1C9444FFB21FFA07 -:10F240008CFC032FE8D38CEA020C164F0022ECFB57 -:10F25000057212096FF0240502FB05C2D2B201EB60 -:10F26000D207027602F007053F7A03FA05F52F422E -:10F2700018BF42767ED104FB0CF2120C521CD2B2A3 -:10F280005FF0000400EB040C9CF812C094453CBFF6 -:10F29000A2EB0C02D2B218D34FF0000C0D1903E010 -:10F2A000FFDB050053E4B36E95F8085003FA0CF742 -:10F2B0003D421CBF521ED2B2002A6AD00CF1010C92 -:10F2C0000CF0FF0CBCF1080FF0D304F1010C0CF0B2 -:10F2D000FF04052CD6D33046BDE8F0037047FFE7A6 -:10F2E00090F818C00C7E474604FB02C2FB4C4FF05E -:10F2F000000CE2FB054C4FEA1C1C6FF024040CFBD5 -:10F300000422D2B201EBD204027602F0070C247A76 -:10F3100003FA0CFC14EA0C0F1FBF42764046BDE80E -:10F32000F003704790F817C0B2FBFCF40CFB1422FA -:10F33000521CD2B25FF0000400EB040C9CF812C027 -:10F3400094453CBFA2EB0C02D2B212D30D194FF080 -:10F35000000C2D7A03FA0CF815EA080F1CBF521E98 -:10F36000D2B27AB10CF1010C0CF0FF0CBCF1080F19 -:10F37000F0D300E010E004F1010C0CF0FF04052CC8 -:10F38000DAD3A8E70CEBC40141763846BDE8F003B8 -:10F3900070470CEBC40141764046BDE8F00370476E -:10F3A000CF4A016812681140CE4A126811430160C9 -:10F3B000704730B4CC49CA4B00244FF0010C0A7896 -:10F3C000521CD2B20A70202A08BF0C700D781A683D -:10F3D0000CFA05F52A42F2D0097802680CFA01F11C -:10F3E0005140016030BC7047017931F01F0113BFFB -:10F3F000002000221146704710B4435C491C03F002 -:10F40000010C5B0803F00104A4445B0803F0010451 -:10F41000A4445B0803F00104A4445B0803F0010466 -:10F42000A4445B0803F001045B08A44403F0010456 -:10F43000A4440CEB53031A44D2B20529DDDB012AA4 -:10F440008CBF0120002010BC704730B40022A1F115 -:10F45000010CBCF1000F11DD431E11F0010F08BFBC -:10F4600013F8012F5C785FEA6C0C07D013F8025F89 -:10F4700022435C782A43BCF1010CF7D1491E5CBFE2 -:10F48000405C0243002A0CBF0120002030BC7047C2 -:10F49000130008BF704710B401EB030CD41A1CF81A -:10F4A00001CC5B1E00F804C013F0FF03F4D110BCC4 -:10F4B0007047F0B58DB0164610251C466A46AC461E -:10F4C00000EB0C03A5EB0C0713F8013CD355ACF192 -:10F4D000010313F0FF0CF3D11546103210208446BF -:10F4E0000B18ACEB000713F8013C401ED35510F08D -:10F4F000FF00F5D1284601F033FA86B1102005F15E -:10F50000200201461318A1EB000C13F8013C401E29 -:10F5100004F80C3010F0FF00F4D10DB0F0BD0898E5 -:10F520002060099860600A98A0600B98E0600DB0B8 -:10F53000F0BD38B505460C466846F5F706FD0028CF -:10F5400008BF38BD9DF90020227294F909100020EF -:10F55000511A48BF494295F82D308B42C8BF38BD7B -:10F56000FF2B08BF38BDA17A491CC9B2A17295F81A -:10F570002E30994203D8617A7F2918BF38BD627254 -:10F580000020A072012038BD0C2818BF0B2806D01F -:10F590000D281CBF2038062884BF0020704701209A -:10F5A00070470C295AD2DFE801F006090E13161B2A -:10F5B000323C4153484E002A52D04FE0072A18BF30 -:10F5C000082A4DD04AE00C2A18BF0B2A48D045E043 -:10F5D0000D2A45D042E0A2F10F000D2840D93DE0B0 -:10F5E00023B1A2F110000C283AD937E0122A18BF33 -:10F5F000112A35D090F8340020B1122A2ED31B2ABC -:10F600002ED92BE0162A29D31B2A29D926E0A2F1CC -:10F610000F01032924D990F83400F8B11C2A1FD90E -:10F620001CE0002B08BF042A18D119E013B1062AE8 -:10F6300016D013E0012A11D112E01D2A1CBF1E2A88 -:10F640001F2A0DD00AE0A2F12000062808D905E003 -:10F6500013B10E2A04D001E0052A01D00020704722 -:10F66000012070472DE9F04187680D460446204689 -:10F67000F3F7CCFB98B1D5B13846A168F3F709FF91 -:10F68000002814DD2844401EB0FBF5F606FB05F10A -:10F690003846F2F7F8FEA0603046BDE8F081F3F797 -:10F6A000E7F94FF4E661F2F7EEFEA060DFE7002035 -:10F6B000BDE8F081904228BF704770B50446101B2A -:10F6C000642838BF642025188D4205D8F3F715FF4C -:10F6D00000281CBF284670BD204670BD53E4B36EA1 -:10F6E00064230200682302008E01002091F851304B -:10F6F0000A8E022B07BF92003C32D200703292B2C7 -:10F700008B8E934238BF1A464B8E91F852C0BCF193 -:10F71000020F07BF9B003C33DB0070339BB2C98EE6 -:10F72000994238BF0B4600280CBF01210021D01898 -:10F730009830002918BF04210844704730B48388EA -:10F74000B0F808C003EB0C049834002A18BF042258 -:10F7500022444C6A944224BF30BC7047121B521C96 -:10F7600052089B1A9BB2ACEB0202838092B20281D8 -:10F7700091F851506FF00E0C6FF00D04022D0CBF7C -:10F780000CEB930304EBD303438091F8521002294E -:10F790000CBF0CEB920104EBD201C18030BC70476E -:10F7A00010F0010F1CBF0120704710F0020F1CBFAA -:10F7B0000220704710F0040018BF082070472DE9A0 -:10F7C000F0410546174688460126084600F001FC30 -:10F7D0000446404600F001FC034610F0010F18BF3C -:10F7E000012008D113F0020F18BF022003D113F03B -:10F7F000040018BF082014F0010F18BF4FF0010CCF -:10F8000021D000BF50EA0C0108BF002613F0030FFF -:10F8100008BF002014F0030F08BF4FF0000C95F84C -:10F820005110814208BF0020387095F85210614590 -:10F8300008BF4FF0000C87F801C0002808BFBCF1DA -:10F84000000F1CD10DE014F0020F18BF4FF0020C96 -:10F85000D8D114F0040F14BF4FF0080C4FF0000C77 -:10F86000D0E7404600F0BFFBB5F85810401A00B290 -:10F8700047F6FE71884201DC002800DC0026304695 -:10F88000BDE8F08101281CBF02280020704718B491 -:10F89000CBB2C1F3072CC1B2C0F30720012B07D0B4 -:10F8A000022B09D0042B08BFBCF1040F23D006E0C3 -:10F8B000BCF1010F03D11EE0BCF1020F1BD00129E6 -:10F8C00006D0022907D0042908BF042813D004E079 -:10F8D000012802D10FE002280DD001EA0C0161F3EA -:10F8E0000702184060F30F22D0B210F0020F18BFC9 -:10F8F00002200BD106E0084003EA0C01084060F347 -:10F900000702EFE710F0010018BF01208DF800009A -:10F91000C2F3072010F0020F18BF022003D110F02D -:10F92000010018BF01208DF80100BDF8000018BCCF -:10F930007047162A10D12A220C2818BF0D280FD084 -:10F940004FF0230C20280DD031B10878012818BFC2 -:10F95000002805D0162805D00020704701207047E8 -:10F960001A70FBE783F800C0F8E70000282102F0D6 -:10F970003AB930B50546007801F00F0220F00F00CB -:10F980001043287007290BD2DFE801F004060406B3 -:10F9900004080400062405E00C2403E0222401E00E -:10F9A0000024FFDF687820F03F002043687030BDFE -:10F9B000007800F00F0070470A68C0F803208988BB -:10F9C000A0F807107047D0F803200A60B0F80700CD -:10F9D000888070470A68C0F809208988A0F80D104F -:10F9E0007047D0F809200A60B0F80D008880704791 -:10F9F0000278202322F0200203EA41111143017012 -:10FA000070470278402322F0400203EA811111433B -:10FA1000017070470078C0F380107047027880232F -:10FA200022F0800203EAC11111430170704700788F -:10FA3000C0097047D0F80320C1F80920B0F80720AA -:10FA4000A1F80D200A7822F080020A70007880095F -:10FA500042EAC0100870704770B515460E4604465D -:10FA60001F2A88BFFFDF2A46314604F1090002F051 -:10FA700043F86078A91D20F03F0001F03F010843E2 -:10FA8000607070BD70B5054640780E4600F03F04CA -:10FA9000062C38BFFFDFA01FC4B21F2C88BF1F2455 -:10FAA000224605F10901304602F026F8204670BDD5 -:10FAB00070B515460E4604461F2A88BFFFDF2A464A -:10FAC000314604F1090002F017F86078A91D20F012 -:10FAD0003F0001F03F010843607070BD70B50546FE -:10FAE00040780E4600F03F04062C38BFFFDFA01F11 -:10FAF000C4B21F2C88BFFFDF224605F10901304642 -:10FB000001F0FAFF204670BD0968C0F80F10704779 -:10FB10000A88A0F813208978417570474176090A50 -:10FB200081767047C176090A017770474177090AE3 -:10FB300081777047C175090A0176704781757047F2 -:10FB400090F8242001F01F0122F01F02114380F8D9 -:10FB500024107047072988BF072190F82420E0234C -:10FB600022F0E00203EA4111114380F824107047AB -:10FB70001F3002F066B94178007801F03F0110F0C3 -:10FB80000F0006D0012808D0022809D006280BD083 -:10FB90000FE0881F1F280AD90BE00C2909D106E0C5 -:10FBA000881F1F2803D904E0881F1F2801D80120BF -:10FBB0007047002070474178007801F03F0100F065 -:10FBC0000F00042805D1062903D325299CBF012055 -:10FBD00070470020704710B4017801F00F0103292D -:10FBE00022D0052925D14478B0F81910B0F81BC0EF -:10FBF000B0F81730827D04F03F04222C19D1062979 -:10FC000017D3B1F5486F98BFBCF5FA7F11D282B116 -:10FC1000082A98BF8A420CD28B429CBFB0F81D00C4 -:10FC2000B0F5486F05D807E0407800F03F000C2899 -:10FC300002D010BC0020704710BC01207047222168 -:10FC400001F0D1BF00B5027801F0030322F00302F6 -:10FC50001A43027000224270012914BF022900BD1C -:10FC6000032912BFFFDF0121417000BD01F0030332 -:10FC700000B5027822F003021A430270002242709B -:10FC8000012914BF022900BD032912BFFFDF012192 -:10FC9000417000BD007800F0030070470278102327 -:10FCA00022F0100203EA01111143017070474178FC -:10FCB000F9B1C078192850D2DFE800F00D10131602 -:10FCC000191C1F2225282B2E31344F4F4F4C373A09 -:10FCD0003D40434649000C2941D042E008293ED02E -:10FCE0003FE002293BD03CE0172938D039E00D290C -:10FCF00035D036E0012932D033E001292FD030E071 -:10FD000002292CD02DE0092929D02AE0092926D062 -:10FD100027E0012923D024E0012920D021E0062971 -:10FD20001DD01EE002291AD01BE0012917D018E0CF -:10FD3000012914D015E0092911D012E009290ED0AB -:10FD40000FE003290BD00CE0032908D009E00529B6 -:10FD500005D006E0032902D003E0FB2901D80120E9 -:10FD600070470020704730B50546C170192924D26C -:10FD7000DFE801F00D0F11131517171119191717D7 -:10FD80001B111921211D171719191D1D1F000C24E6 -:10FD900015E0082413E0022411E017240FE00D24DD -:10FDA0000DE001240BE0092409E0062407E0032408 -:10FDB00005E0052403E0182401E00024FFDF6C7057 -:10FDC00030BDC0787047C171090A01727047B0F840 -:10FDD000070070474172090A81727047B0F8090044 -:10FDE0007047C172090A01737047B0F80B00704781 -:10FDF0004171090A81717047B0F8050070470171BF -:10FE00007047007970474173090A81737047B0F8F1 -:10FE10000D00704730B4B0F80720894DB0F809C024 -:10FE2000B0F805300179941F2D1998BFBCF5FA7F01 -:10FE30000ED269B1082998BF914209D293429FBF5F -:10FE4000B0F80B00B0F5486F012030BC98BF704788 -:10FE5000002030BC7047001D01F0F3BF021D0846B2 -:10FE6000114601F0EEBF4172090A81727047B0F885 -:10FE70000900704701717047007970470A68426055 -:10FE800049688160704742680A60806848607047CE -:10FE90000988818170478089088070470A68C0F8A6 -:10FEA0000E204968C0F812107047D0F80E200A6082 -:10FEB000D0F81200486070470968C0F81610704703 -:10FEC000D0F81600086070470A684260496881608F -:10FED000704742680A608068486070470968C1607E -:10FEE0007047C06808607047017170474171090A26 -:10FEF00081717047C171090A0172704700797047BA -:10FF0000B0F805007047B0F80700704701717047FE -:10FF10000079704701717047007970470A68426044 -:10FF200049688160704742680A608068486070472D -:10FF30000171090A417170478171090AC1717047E5 -:10FF40000172090A417270478172090AC1727047D1 -:10FF500080887047C0887047008970474089704723 -:10FF600001891B2924BF4189B1F5A47F07D381886A -:10FF70001B2921BFC088B0F5A47F01207047002055 -:10FF800070470A68426049688160704742680A6049 -:10FF9000806848607047017170470079704741710F -:10FFA000704740797047017911F0070F1BBF407906 -:10FFB00010F0070F002001207047017911F0070FA2 -:10FFC0001BBF407910F0070F00200120704701711E -:10FFD000704700797047417170474079704781716F -:10FFE000090AC1717047C088704716A282B0D2E971 -:10FFF0000012CDE900120179407901F0070269464B -:020000040002F8 -:100000001DF80220012A07D800F00700085C01282B -:100010009EBF012002B07047002002B070470171FE -:10002000704700797047417170474079704730B52B -:100030000C460546FB2988BFFFDF6C7030BD000011 -:1000400086F3FFFF000101020102020370B50446BE -:10005000C2F11005281901F04FFD15F0FF0108D07D -:10006000491EC9B2802060542046BDE8704001F0AE -:10007000BABD70BD30B505E05B1EDBB2CC5CD55CB3 -:100080006C40C454002BF7D130BD10B5002409E0FA -:100090000B78521E44EA430300F8013B11F8013B80 -:1000A000D2B2DC09002AF3D110BD2DE9F0410C4693 -:1000B00001200978FF4E92B0154602274FF006083E -:1000C0004FF0040C71B101291ED0022945D003293B -:1000D00005D12978042902D105201070002012B022 -:1000E000BDE8F081606850B1CDE9010601202070C3 -:1000F0008DF80080606A05901146684663E02770BD -:1001000085F800C0566026E029780429E7D169689F -:1001100010222069FFF7B9FF6868C07B000606D58A -:10012000E44A2069102310320146FFF7A3FFD4E907 -:1001300004101022FFF7A9FF2069C07B000606D536 -:10014000DC4A6069102310320146FFF793FF2770E5 -:1001500085F800C06E600320C1E729780429BED16C -:10016000A08910280CD9A0F1100080B2A081A1684C -:100170004FF01003014468466A68FFF77BFF18E000 -:1001800004D14FF010032269A16807E0C2B20EA8A3 -:10019000A168FFF75BFF626910230EA90AA8FFF7A9 -:1001A00069FF10230AA968466A68FFF763FF032006 -:1001B000207060680590CDF818D08DF81080606AC6 -:1001C0000990294604A8F1F759FF88E72DE9F04185 -:1001D00007460D4601200B7806213BB1012B04D1C7 -:1001E0001378052B01D11170002079E76C69012685 -:1001F00020226170E8686060686A6062A168287C9B -:100200000870A681A068A968401C01F075FCA0894F -:1002100020222030A081A0686968213001F06CFCA8 -:10022000A08921462030A0812E703846BDE8F041DB -:10023000F1F73BBF2DE9F05F0D46834601200978B9 -:10024000174606464FF00608D1B1DFF868A24FF016 -:100250000009AAF1080A012923D002297ED0032926 -:100260000CD13978052909D179681022E86901F0A3 -:1002700043FC07203870183500207D60BDE8F09FF2 -:100280002C6A8C48202284F8018020306060202075 -:10029000A081686A60626968A06801F02DFC2E7018 -:1002A000D4E039780529E9D12C6A84F80180686A9C -:1002B000606251681022E86901F01EFCE869606024 -:1002C000A0684F4680F80090A681A0684670A0897B -:1002D000401C80B2A081A1680844696951F8012FCF -:1002E000026089888180A089801D80B2A0816969AF -:1002F000A2680978C1F340011154A089401C80B262 -:10030000A081A1680844296951F8012F02608988F9 -:100310008180A089801D80B2A0812969A2680978A6 -:10032000C1F340011154A0891022401C80B2A08169 -:10033000A1680844E96801F0DFFBA08910221030B1 -:1003400080B2A081A1680844A96801F0D5FBA0890A -:10035000103080B2A081A168014400E00DE0DAF81D -:1003600004000860A089001D80B2A081A1680F541C -:10037000A089401CA081022067E03978052992D12C -:1003800051681022A86901F0B7FB2C6A84F801803B -:10039000E8696060686A6062A16881F80090A6817F -:1003A000A0684670A089401C80B2A081A168084462 -:1003B000696951F8012F026089888180A089801DB8 -:1003C00080B2A0816969A2680978C1F34001115423 -:1003D000A089401C80B2A081A1680844296951F815 -:1003E000012F026089888180A089801D80B2A08150 -:1003F0002969A2680978C1F340011154A08910222B -:10040000401C80B2A081A1680844E96801F074FB37 -:10041000A0891022103080B2A081A1680844A96888 -:1004200001F06AFBA089103080B2A081A16801446C -:10043000DAF804000860A089001D80B2A081A168DC -:100440000E54A089401CA0810320287021465846E4 -:10045000BDE8F05FF1F729BE70B50D460646097894 -:10046000012041B1012905D11178052902D10820C7 -:100470001070002070BD2C6A062060706968616091 -:10048000696A6162EA69A16852F8013F0B6092886B -:100490008A80A081E869A1680078C0F34000887173 -:1004A000A089401C80B2A081A1680844A96951F8C4 -:1004B000012F01E074230200026089888180A089F5 -:1004C000801D80B2A081A969A2680978C1F34001AA -:1004D0001154A089401C80B2A081A16808446969B8 -:1004E0000A88028089788170A0891022C01C80B29D -:1004F000A081A1680844296901F0FEFAA0891022B0 -:10050000103080B2A081A1680844E96801F0F4FAD3 -:10051000A0891022103080B2A081A1680844A96887 -:1005200001F0EAFAA08921461030A081012028704C -:100530003046BDE87040F1F7B8BD70B50D460646CF -:100540000978012059B1012908D11178052905D16F -:1005500009201070506800685060002070BD6C6900 -:10056000062010226070E8686060686A606229692D -:10057000A06801F0C1FA1020A081A06820221030EC -:10058000A96801F0B9FAA0892022203080B2A081A8 -:10059000A1680844696801F0AFFAA08921462030BB -:1005A000A081012028703046BDE87040F1F77DBD84 -:1005B00070B50C46012009788EB01546062659B153 -:1005C000012934D0022905D12978042902D10A2031 -:1005D000107000200EB070BD606910236A4600786C -:1005E000C0F340008DF80000A0690078C0F340001F -:1005F0008DF80100E0680168CDF802108188ADF83F -:10060000061080798DF8080020690168CDF809107E -:100610008188ADF80D1080798DF80F006068059025 -:100620000AA80690A168FFF725FD01201DE02978A2 -:100630000429CFD1A06910236A4650F8011F009108 -:100640008088ADF80400606950F8011FCDF80610ED -:100650008088ADF80A0000200390606805900AA821 -:1006600006906968FFF706FD022020708DF8106083 -:10067000606A0990294604A8F1F700FDAAE700B5D1 -:100680000B788BB001204BB1012B05D111780429D7 -:1006900002D10B20107000200BB000BD4868019003 -:1006A00006A80290C86803680693406807908868A7 -:1006B00003680893406809900120087006208DF8AF -:1006C0000000486A059011466846F1F7D7FCE3E759 -:1006D00000B50B788BB0012043B1012BDCD1117830 -:1006E0000429D9D10C2010700020D5E7486801906A -:1006F00006A8029088680368069340680790002067 -:10070000089009900120087006208DF80000486AC2 -:10071000059011466846F1F7B1FCBDE700B50B78CE -:100720008BB0012043B1012BB6D111780429B3D18C -:100730000D2010700020AFE748680590CDF818D064 -:1007400088680088ADF80000C8680088ADF802002D -:1007500000200190029003900120087006208DF87F -:100760001000486A0990114604A8F1F787FC93E746 -:1007700030B403460C7801205CB1012C15D0022C5A -:1007800005D111780C2902D10E201070002030BC48 -:10079000704701200870C868042242704A684260AD -:1007A0000B4A8260921EC2600BE014780D2CEED1D1 -:1007B00002200870C86803244470526842608A6846 -:1007C0008260496A4162014630BC1846F1F76DBC4F -:1007D0006E2302002DE9F0410C4611490D68104AC4 -:1007E000104908321160A0F120012A2901D301200B -:1007F0000CE03E2810D040CC0B4F94E80E0007EBE5 -:100800008000241F50F8807C3046B84720600448A0 -:10081000001D0560BDE8F0812046E0F7E1FCF5E74A -:100820001005024001000001A423020010B5524847 -:1008300000F070FA00B1FFDF4F48401C00F06AFA88 -:10084000002800D0FFDF10BD2DE9F14F4B4ED6F848 -:1008500000B00127484800F065FADFF81C8128B98C -:100860005FF0000708F1010000F072FA444C002527 -:100870004FF0030901206060C4F80051C4F804512E -:10088000009931602060DFF8FCA018E0DAF8000081 -:10089000C00614D50E2000F064F8EFF3108010F0BD -:1008A000010072B600D00120C4F80493D4F80011FE -:1008B00019B9D4F8041101B920BF00B962B6D4F84F -:1008C000000118B9D4F804010028DFD0D4F80401DD -:1008D0000028CFD137B1C6F800B008F1010000F010 -:1008E00021FA11E008F1010000F01CFA0028B9D14A -:1008F000C4F80893C4F80451C4F800510E2000F065 -:1009000030F81D4800F024FA0020BDE8F88F2DE9EA -:10091000F0438DB00D46064600240DF110090DF18F -:10092000200817E004EB4407102255F8271068460A -:1009300001F0E2F805EB870710224846796801F0DC -:10094000DBF86846FFF780FF10224146B86801F0E7 -:10095000D3F8641CB442E5DB0DB00020BDE8F083A1 -:1009600072E700F01F02012191404009800000F170 -:10097000E020C0F8801270478F01002004E500409D -:1009800000E0004010ED00E0D848002101708170C7 -:10099000704770B5D64D01232B60D64B1C68002CD8 -:1009A000FCD0002407E00E6806601E68002EFCD014 -:1009B000001D091D641C9442F5D3002028601868AE -:1009C0000028FCD070BD70B5C84E0446CA4D3078C2 -:1009D000022800D0FFDFAC4200D3FFDF7169C748B7 -:1009E000012903D847F23052944201DD03224271BB -:1009F000491C7161291BC160C0497078F2F782FA05 -:100A0000002800D1FFDF70BD70B5B84C0D4661788D -:100A1000884200D0FFDFB84E082D4ED2DFE805F047 -:100A20004D0421304D4D4D3B2078022800D0FFDF92 -:100A300003202070A078022802D0012804D008E00A -:100A4000A06800F051FD04E004F1080007C8FFF7BA -:100A5000A0FF052020700020A070BDE87040F1F7D5 -:100A600012BFF2F705F801466068F2F712FDB042D6 -:100A700002D2616902290BD30320F2F7E4FF12E0EE -:100A8000F1F7F6FF01466068F2F703FDB042F3D2DA -:100A9000BDE8704097E7207802280AD0052806D0E4 -:100AA000FFDF04202070BDE8704000F014B9022080 -:100AB00000E00320F2F7C7FFF3E7FFDF70BD70B57A -:100AC0000546F1F7D5FF894C60602078012800D0F9 -:100AD000FFDF8A4901200870002008718D60042022 -:100AE00048718548C860022020706078F2F70AFAE1 -:100AF000002800D1FFDF70BD10B57C4CA07808B98C -:100B0000207808B1112010BD7D48F1F737FF6070E3 -:100B10006078202804D0012020700020606110BD82 -:100B2000032010BD0246010B0120B2F5003F02D2A6 -:100B3000884000F071BFB2F5802F03D22039884081 -:100B400000F072BFB2F5C02F03D24039884000F0E8 -:100B500074BFB2F5002F03D26039884000F076BF31 -:100B6000002070472DE9F041144600EB84070E4643 -:100B700005463F1F00F0CBFC4FF080510A695043FF -:100B800006EB8402121FB24201D2012200E00022D1 -:100B90001CB10969B4EB910F02D90920BDE8F081BD -:100BA00058498D4216D3AF4214D3854205D28742AD -:100BB00003D245EA0600800701D01020EEE78E42FE -:100BC00008D33AB92846FFF7ADFF18B93846FFF702 -:100BD000A9FF08B10F20E1E74B484C490068884263 -:100BE00005D0224631462846FFF7D3FE10E0FFF736 -:100BF00083FF0028D2D13D4801218560C0E903640C -:100C000081704FF4A97104FB01F01830FFF757FF12 -:100C10000020C3E770B54FF0805504462869394974 -:100C2000B1FBF0F084420AD300F071FCA04201D87D -:100C3000102070BD28696043FFF774FF08B10F20D2 -:100C400070BD314831490068884204D0286960434A -:100C500000F04AFC0CE0FFF74FFF0028F0D12969B3 -:100C6000224861438160022181702948FFF727FFF4 -:100C7000002070BD2349090BB1EB401F07D940424A -:100C800001EB4011202903D34FF0FF3070470021C2 -:100C900001208840401E704770B505460C46002074 -:100CA000FFF7E8FF28420ED10120FFF7E3FF2042C3 -:100CB00009D10220FFF7DEFF104204D10320FFF725 -:100CC000D9FF184201D00F2070BD21462846BDE84B -:100CD000704000F0C4BE10B5044C6078F1F7A9FE76 -:100CE00000B9FFDF00202070A07010BD940100202B -:100CF00004E5014000E40140105C0C00C412002037 -:100D0000090A020000300200B0000020BEBAFECA8C -:100D10007C5E0100002101700846704701460020FA -:100D200008707047EFF3108101F0010172B602788C -:100D3000012A01D0012200E000220123037001B941 -:100D400062B60AB1002070474FF400507047E9E7DF -:100D5000EFF3108111F0010F72B64FF00002027034 -:100D600000D162B600207047F2E700004C490968E4 -:100D70000160002070474A49086000207047012147 -:100D80008A0720B1012804D042F20400704791671D -:100D900000E0D1670020704742490120086042F21C -:100DA0000600704708B504233E4A1907103230B1D7 -:100DB000C1F80433106840F0010010600BE01068C7 -:100DC00020F001001060C1F808330020C1F80801CC -:100DD000354800680090002008BD011F0B2909D884 -:100DE000304910310A6822F01E0242EA40000860D1 -:100DF0000020704742F205007047000100F180407A -:100E0000C0F8041900207047000100F18040C0F8CC -:100E1000081900207047000100F18040D0F8000957 -:100E2000086000207047012801D9072070471F4A39 -:100E300052F8200002680A4302600020704701282F -:100E400001D907207047194A52F8200002688A43E6 -:100E5000026000207047012801D907207047134A1B -:100E600052F8200000680860002070470200104916 -:100E70004FF0000003D0012A01D0072070470A601C -:100E800070474FF080410020C1F808014FF0E0208A -:100E9000802180F800140121C0F800117047000083 -:100EA0000004004000050040080100404C240200FE -:100EB000780500406249634B0A6863499A420968B1 -:100EC00001D1C1F310010160002070475C495D4B06 -:100ED0000A685D49091D9A4201D1C0F310000860FB -:100EE000002070475649574B0A68574908319A42C3 -:100EF00001D1C0F3100008600020704730B5504B9E -:100F0000504D1C6842F20803AC4202D0142802D2B1 -:100F100003E0112801D3184630BDC3004B481844E4 -:100F2000C0F81015C0F81425002030BD4449454BC9 -:100F30000A6842F209019A4202D0062802D203E06E -:100F4000042801D308467047404A012142F8301076 -:100F5000002070473A493B4B0A6842F209019A4225 -:100F600002D0062802D203E0042801D308467047C5 -:100F7000364A012102EBC00041600020704770B585 -:100F80002F4A304E314C156842F2090304EB8002BF -:100F9000B54204D0062804D2C2F8001807E004289D -:100FA00001D3184670BDC1F31000C2F8000800203C -:100FB00070BD70B5224A234E244C156842F20903D5 -:100FC00004EB8002B54204D0062804D2D2F800080F -:100FD00007E0042801D3184670BDD2F80008C0F31A -:100FE00010000860002070BD174910B5083118487E -:100FF00008601120154A002102EBC003C3F8101548 -:10100000C3F81415401C1428F6D3002006E0042869 -:1010100004D302EB8003C3F8001807E002EB80035F -:10102000D3F80048C4F31004C3F80048401C062855 -:10103000EDD310BD04490648083108607047000030 -:10104000B0000020BEBAFECA00F5014000F0014029 -:101050000000FEFF7D4B1B6803B19847BFF34F8F25 -:101060007B4801687B4A01F4E06111430160BFF3F2 -:101070004F8FFEE710B5EFF3108010F0010F72B63E -:1010800001D0012400E0002400F0D6F850B1E0F7D0 -:1010900041F9F1F7BCFAF2F777FCE1F7C0FE6E49CF -:1010A0000020086004B962B6002010BD70B50C467F -:1010B0000646EFF3108010F0010F72B601D0012543 -:1010C00000E0002500F0B8F818B105B962B60820B4 -:1010D00070BDE0F79BF8E0F71FF9024600204309D6 -:1010E0009B0003F1E02300F01F01D3F80031CB4057 -:1010F000D9071BD0202803D222FA00F1C90722D138 -:1011000041B2002906DA01F00F0101F1E02191F866 -:10111000141D03E001F1E02191F8001449090829A8 -:1011200011D281B101290ED004290CD0401C6428B1 -:10113000D5D3E1F74BFE4849484808602046F3F70D -:101140008FF860B904E005B962B641F2010070BDE4 -:101150003E4804602EB13046F3F7CFF818B11024A2 -:1011600029E03F4E16E03078022802D94FF480542F -:1011700021E007240028707801D0E0B908E0D0B160 -:10118000202818D8B078212815D8012813D001E0DC -:10119000B07880B93349802081F8140DE0F7BCF8AD -:1011A0003146F2F7D7FBF1F7F1F900F0E3F93046F9 -:1011B000E0F782F8044605B962B61CB1FFF75AFFA2 -:1011C000204670BD002070BD10B5044600F034F814 -:1011D00000B101202070002010BD234908600020CC -:1011E000704770B50C4621490D682049204E0831E2 -:1011F0000E60102807D011280CD012280FD0132809 -:1012000011D0012013E0D4E90001FFF74FFF35466C -:1012100020600DE0FFF72EFF0025206008E0206829 -:10122000FFF7D2FF03E0104920680860002020602B -:101230000E48001D056070BD0748084900688842D7 -:1012400001D101207047002070470000AC01002050 -:101250000CED00E00400FA05B0000020BEBAFECAA2 -:10126000542402000BE000E00400002010050240BE -:101270000100000100B5764910F1080F08BFF82001 -:1012800024D014DC10F1280F08BFD8201ED010F194 -:10129000140F08BFEC2019D010F1100F08BFF02078 -:1012A00014D010F10C0F08BFF4200FD00CE010F197 -:1012B000040F08BFFC2009D0002818BF032805D060 -:1012C000042804BF086000BDFFDF00BD086000BD4A -:1012D00000B56049012808BF032004D0022816BFCA -:1012E000FFDF042000BD086000BD5A48016801F01E -:1012F0000F01032904BF01207047006800F00F00B0 -:10130000042804BF0220704700B5FFDF012000BDA4 -:101310005149002808BF086805D0012806BF0868A1 -:1013200040F0010070470860704770B5054601291C -:1013300014D0022A07BF49484FF47A7148484FF445 -:10134000C86144181846F4F759F820444FF47A71EC -:1013500000F27120B0FBF1F0281A70BD022A14BF10 -:101360004FF4C8604FF47A7049F608514418E9E721 -:1013700070B514460546012908BF49F6CA6605D06E -:10138000022B0CBF3748364800F1FA061046F4F736 -:1013900044F8012C0CBF4FF47A714FF4FA71711AB2 -:1013A00008444FF47A7100F28920B0FBF1F0281A5A -:1013B000801E70BD70B51546064601291AD0022B55 -:1013C00007BF26484FF47A7125484FF4C861441886 -:1013D0001046F4F722F8012D0CBF4FF47A714FF448 -:1013E000FA71611A08444FF47A716438B0FBF1F075 -:1013F000301A70BD022B14BF4FF4C8604FF47A70DE -:1014000049F608514418E3E770B505460C46164600 -:101410001046F3F7F3FF05EB4501C1EBC51100EBF7 -:10142000C100012C0CBF4FF47A714FF4FA714518CA -:101430002046F3F7F2FF281A4FF47A7100F60F6096 -:10144000B0FBF1F43046F3F7CDFF2044401D70BDF2 -:101450000C15004010150040501600406836020080 -:10146000A2240200043602002DE9F04184B088462F -:101470000746FEF70FFC05467E786A4601A94046FE -:10148000EFF748F804000ED0012D1EBF032004B072 -:10149000BDE8F08102AA40460199EEF73AFF0298B2 -:1014A000B0F803000AE0022D18D1042E16D3B7F8C5 -:1014B0000300BDF80020011D8A4206D3001D80B242 -:1014C000A119814238BF012004D104B04FF00000BF -:1014D000BDE8F0813CBF04B0BDE8F0814FF00200F0 -:1014E00004B0BDE8F08100000B4A022111600B49F5 -:1014F0000B68002BFCD0084B1B1D186008680028E7 -:10150000FCD00020106008680028FCD070474FF025 -:10151000805040697047000004E5014000E401404C -:1015200002000B464FF00000014620D0012A04D0F3 -:10153000022A04D0032A0DD103E0012002E0022098 -:1015400015E00320072B05D2DFE803F00406080AA4 -:101550000C0E100007207047012108E0022106E070 -:10156000032104E0042102E0052100E00621F1F757 -:1015700022BA0000FC4805218170002101704170F1 -:10158000C17081607047F9490A78012A06D0CA689B -:101590001044C860C8684038F1F748BF8A681044F2 -:1015A00088608868F7E710B5EF4CE078F1F741FA0A -:1015B00000B9FFDF0820F2F746FA0520A0700020EE -:1015C0002070607010BD002819D00378E849E94AFE -:1015D00013B1012B0ED011E00379012B00D06BB9B0 -:1015E00043790BB1012B09D18368643B8B4205D24F -:1015F000C0680EE00379012B02D00BB100207047C8 -:1016000043790BB1012BF9D1C368643B8B42F5D20E -:1016100080689042F2D8012070472DE9F0410446DD -:101620000227F1F72FFE006800B1FFDFCE4D012643 -:101630003CB12078B0B1012805D0022810D0032891 -:1016400013D02E710CE06068C82807D3F1F755FF5E -:1016500020B16068FFF797FF012703E0002701E052 -:1016600000F0CCF93846BDE8F08128780028F7D1A1 -:101670006068FFF7A8FF0028E3D06068DFF8EC821D -:10168000007828B3A878042800D0FFDF0020464661 -:1016900088F8000060680079C8B300203071606885 -:1016A0004079A8B30420707160688168E868F0F739 -:1016B000EAFEB0606068C0685230F0600320A87035 -:1016C000AA49E878F1F71EFC0028C9D1FFDFC7E777 -:1016D000404688F8006061680979D1B10021017144 -:1016E00061684979B9B104214171616889685231F1 -:1016F00081606168C968C160C0689B4C14346060D7 -:10170000F1F7B6F920606E700220A870A8E704E037 -:1017100005E00321E3E70321E6E70120BEE703201C -:10172000C1E72DE9F047904C8846E178884200D027 -:10173000FFDFDFF83492002501278C4E09F11409F0 -:10174000B8F1080F79D2DFE808F0040D2A557E843D -:101750009199A078032803D0A078022800D0FFDF59 -:10176000BDE8F087A078032803D0A078022800D035 -:10177000FFDF0420A0702571207800287AD1FFF7C0 -:1017800002FF3078012806D0B068E06000F07BF9F5 -:101790002061002062E0E078F1F7B0FAF5E7A07888 -:1017A000032803D0A078022800D0FFDF207800288B -:1017B0006FD1A078032816D0F1F75AF901464F46A9 -:1017C000D9F80000F1F765FE00280EDB7968814248 -:1017D0000BDB081AF0606549E078F1F793FB00280D -:1017E000BED1FFDFBCE7042029E00420F2F72BF98B -:1017F000A570B5E7A078032803D0A078022800D010 -:10180000FFDF207888BBA078032817D0F1F730F9E4 -:1018100001464F46D9F80000F1F73BFE0028E4DB13 -:1018200079688142E1DB081AF0605049E078F1F70D -:1018300069FB002894D1FFDF92E740E00520F2F732 -:1018400002F9A7708CE7A078042800D0FFDF0220FF -:1018500004E0A078042800D0FFDF0120A1688847B9 -:10186000FFF7DBFE054630E004E012E0A078042834 -:1018700000D0FFDFBDE8F04700F0C0B8A078042832 -:1018800005D0607810B1A078022800D0FFDF207862 -:1018900010B1BDE8F04786E6207920B10620F2F7C6 -:1018A000D2F82571CDE7607838B13049E078F1F7AA -:1018B00029FB00B9FFDF657052E70720BFE7FFDFB4 -:1018C0004EE73DB1012D03D0FFDF022DF9D147E7EF -:1018D0000420C3E70320C1E770B5050005D0224C02 -:1018E000A078052803D0112070BD102070BD2248BB -:1018F000F1F744F8E070E078202803D0A5600020DC -:10190000A07070BD032070BD174810B5017809B1F3 -:10191000112010BD817805290CD0817801290BD0C8 -:10192000817849B1012101708178012904D0807842 -:1019300010B103E00F2010BDFFF735FE002010BDF1 -:1019400070B5094E0446B07808B101280AD1ACB18F -:101950002046FFF738FE98B12078044D90B1B0785A -:1019600001282AD00F2070BDB0010020D412002021 -:101970003D860100FF1FA107231702001020F2E798 -:101980000720F0E701202870207990B1002028710D -:10199000607980B104206871A0685230A860E06866 -:1019A000E860E8681A4C6060F1F762F82060022095 -:1019B00016E00320EBE70320EDE7002028702079F4 -:1019C000A8B100202871607998B104206871A168DD -:1019D000F068F0F758FDA860E0685230E860032036 -:1019E000B0700C49F078F1F78DFA28B903E00320C4 -:1019F000E8E70320EAE7FFDF0020B4E7044810B57A -:101A00001438006900F037F8BDE81040F0F73BBF2C -:101A1000C4010020D41200201F490968014201D0EE -:101A200001207047002070471B49091D09680142C9 -:101A300001D0012070470020704717491031096814 -:101A4000014201D001207047002070471249143133 -:101A50000968014201D0012070470020704710B58D -:101A60000D4C2060201D01600B4810300260001DED -:101A70000360002010BD09490A6848F202139A4326 -:101A800002430A607047054A116848F2021301EAEE -:101A9000030099431160704700060040C8060240E9 -:101AA00040EA010310B59B070FD1042A0DD310C8DB -:101AB00008C9121F9C42F8D020BA19BA884201D92D -:101AC000012010BD4FF0FF3010BD1AB1D30703D075 -:101AD000521C07E0002010BD10F8013B11F8014B2B -:101AE0001B1B07D110F8013B11F8014B1B1B01D147 -:101AF000921EF1D1184610BD032A40F2308010F03A -:101B0000030C00F0158011F8013BBCF1020F624498 -:101B100098BF11F801CB00F8013B38BF11F8013B29 -:101B2000A2F1040298BF00F801CB38BF00F8013BD6 -:101B300011F0030300F02580083AC0F0088051F846 -:101B4000043B083A51F804CBA0E80810F5E7121D51 -:101B50005CBF51F8043B40F8043BAFF30080D20770 -:101B600024BF11F8013B11F801CB48BF11F8012B3C -:101B700024BF00F8013B00F801CB48BF00F8012B5F -:101B8000704710B5203AC0F00B80B1E81850203AE9 -:101B9000A0E81850B1E81850A0E81850BFF4F5AF0D -:101BA0005FEA027C24BFB1E81850A0E8185044BF97 -:101BB00018C918C0BDE810405FEA827C24BF51F804 -:101BC000043B40F8043B08BF7047D20728BF31F8F8 -:101BD000023B48BF11F8012B28BF20F8023B48BF49 -:101BE00000F8012B70474FF000020429C0F012806A -:101BF00010F0030C00F01B80CCF1040CBCF1020FC0 -:101C000018BF00F8012BA8BF20F8022BA1EB0C0194 -:101C100000F00DB85FEAC17C24BF00F8012B00F88A -:101C2000012B48BF00F8012B70474FF0000200B5B0 -:101C3000134694469646203922BFA0E80C50A0E8EF -:101C40000C50B1F12001BFF4F7AF090728BFA0E89D -:101C50000C5048BF0CC05DF804EB890028BF40F869 -:101C6000042B08BF704748BF20F8022B11F0804FAB -:101C700018BF00F8012B704770477047704700008D -:101C8000FEDF04207146084219D10699124A91429A -:101C900015DC069902394878DF2810D10878FE282B -:101CA00007D0FF280BD14FF001004FF000020B4B83 -:101CB000184741F201000099019A084B1847084B58 -:101CC000002B02D01B68DB6818474FF0FF307146CD -:101CD0004FF00002014B184700300200551002007F -:101CE00004000020184819497047FFF7FBFFDFF791 -:101CF00065FA00BD4FF4805015490968884203D148 -:101D0000144A13605B68184700BD000020BFFDE760 -:101D10004FF480500E490968884210D10E4B186864 -:101D20004FF0FF318842F1D080F308884FF0202136 -:101D3000884204DD0948026802210A43026008481B -:101D4000804708488047FFDFE8120020E8120020A3 -:101D500000000020040000200030020024050040A4 -:101D600039430100F51C020004207146084202D0EC -:101D7000EFF3098101E0EFF3088188690238007808 -:101D8000102813DB20280FDB2B280BDB0A4A1268F4 -:101D90000A4B9A4203D1602804DB094A104702200B -:101DA00008607047074A1047074A1047074A1268F9 -:101DB0002C32126810470000B0000020BEBAFECAE4 -:101DC0001D130000D5070200E311020004000020EB -:101DD0000D4B0E4908470E4B0C4908470D4B0B495C -:101DE00008470D4B094908470C4B084908470C4B5D -:101DF000064908470B4B054908470B4B0349084761 -:101E00000A4B024908470000F9BA0000092F0000F8 -:101E1000812C00001D2B0000AB2A0000232D0000A8 -:101E2000391300006728000029BD0000C911000017 -:101E300000210160818070470021016041600172D2 -:101E400070470A6802600B7903717047599500006A -:101E50001B970000779800009B980000D598000021 -:101E6000099900004399000081990000D39900006E -:101E700031960000A7120000A7120000C140000028 -:101E80000541000025410000E1410000274300001A -:101E90000144000031440000F5440000153D0000FD -:101EA000274700001948000039480000DD150000F0 -:101EB00001160000311500008515000033160000E2 -:101EC000C716000003600000B561000073650000E4 -:101ED000896600000D67000087670000F967000051 -:101EE00015690000E3690000616A000053480000C2 -:101EF0005948000063480000D73C00001F4900001B -:101F0000A13C00005F4A0000B74A00001F4B0000E0 -:101F1000A7120000A7120000A7120000A7240000CB -:101F20002D2500004925000065250000F32600004E -:101F30008F25000099250000DB250000FD2500000D -:101F4000D92600001B270000A7120000CF82000046 -:101F5000F7820000F98200003383000061830000F3 -:101F60004F840000DB840000EF8400003D8500000A -:101F70002D860000D1870000F9880000D172000092 -:101F800011890000A7120000A712000049B4000048 -:101F9000B3B5000007B6000073B6000023B7000019 -:101FA00051000000000000000000000000000000E0 -:101FB0000000000000000000000000000000000021 -:101FC0000000000000000000000000003E000000D3 -:101FD0000000000000000000000000000000000001 -:101FE00000000000000000000000000000000000F1 -:101FF0000000000000000000500000000000000091 -:1020000000000000000000000000000000000000D0 -:1020100000000000000000000000000000000000C0 -:1020200000000000100110013A0200001A02000432 -:102030000506000013900000F38F0000FFFFFFFF74 -:102040000000FFFF3BAC00003D39000041200000D4 -:102050001B730000EB8D0000000000000000020078 -:10206000000000000002000000000000000100006D -:10207000000000006F8000004F800000BD80000065 -:1020800029240000EB2300000B240000A7A7000078 -:10209000D3A70000DBA9000021590000DD8000006B -:1020A000000000000D810000772400000000000007 -:1020B0000000000000000000BDA8000000000000BB -:1020C000B359000000000000000000000000000004 -:1020D0000000000000000000000000000000000000 -:1020E000000000000000000000000000D5E5000036 -:1020F00059E60000000000000000000000000000A1 -:1021000059E700000000000000000000000000008F -:1021100049F800000000000000000000000000007E -:1021200005E900005DF4000000000000DDF400009F -:1021300051F500000000000037EE0000D5EE000071 -:102140000000000017F50000D1EF0000C9F1000009 -:102150003DF2000041F30000A5EA0000000000008D -:1021600000000000BFE90000000000001FE80000C0 -:1021700095E70000BDF300007BF60000E9F60000E3 -:1021800000000000A7E60000D7E6000007E6000018 -:102190000000000021E70000000000000000000037 -:1021A000000000004BF700000000000000000000ED -:1021B000000000000000000000000000EFEC000044 -:1021C000000000000000000000000000C3E8000064 -:1021D000C1E700008BE800000000000053E80000A9 -:1021E0000000000000000000B3F7000097F80000B6 -:1021F0009BFA000017F900003DE9000051FA0000C9 -:10220000000000004FEB000021EC000061F900002D -:10221000ABF9000007F80000E5F90000F1ED00005F -:1022200093560000935600009D400000E7AA00006E -:102230009F750000531F000087AA01004BC50100D5 -:10224000D9560000D9560000BF40000049AB00003D -:1022500023760000C51F0000B5AA01005FC501007C -:10226000D001D001400038005C0024004001F001A2 -:1022700001000000010000000001020304120F1021 -:102280001100000013000000B10502007F060200EB -:10229000D10602001D07020071070200AB00020018 -:1022A000CD01020035020200590402003B05020084 -:1022B000750D01008B1E01000000000006000000EB -:1022C0000A0000003200000073000000B4000000AB -:1022D000B197010045850100235F010077DE010011 -:1022E000F772010077DE01007D5F010005E001006B -:1022F000876B010005E001007B5E010093DF0100B8 -:10230000C971010093DF01004D630100FFE201008C -:102310007F730100FFE20100555555D6BE898E003E -:102320000000A606340DC21300004A03EE05920811 -:10233000000096041409920D555555252627D6BE42 -:10234000898EF401FA00960064004B0032001E00F2 -:1023500014000A00050002000100000025410000F1 -:1023600000000000AAAED7AB15412010000003000A -:10237000656C7462000000000000000000000000B6 -:1023800000000000870000000000000000000000C6 -:1023900000000000BE83605ADB0B376038A5F5AA49 -:1023A0009183886CB50E0200CD0E0200E50E02008E -:1023B000FD0E02002D0F0200550F02007F0F0200DC -:1023C000B30F0200150C0200650B0200990C02000D -:1023D000150D0200250D0200510D0200A33B010066 -:1023E000AB3B0100B93B01007F0D0200990D0200DB -:1023F0006D0D0200770D0200A50D0200DB0D02003D -:10240000FB0D0200090E0200170E0200270E02004B -:102410003F0E0200570E02006D0E02000000000089 -:10242000F7B800004DB9000063B9000021150200A3 -:10243000490802000F090200D91802000919020018 -:1024400041190200E93901000D3E01001C05004060 -:10245000200500400010020078240200080000203F -:10246000C401000044110000A8240200CC01002097 -:102470001C110000A01100000118136813024C2069 -:102480001A010222782720FB349B5F801280021EF3 -:1024900010139F0A1B205C041AE2040128237F0109 -:0824A00002A329091DFB013113 -:00000001FF diff --git a/ports/nrf/board_busses.c b/ports/nrf/board_busses.c deleted file mode 100644 index 6d5cbd041..000000000 --- a/ports/nrf/board_busses.c +++ /dev/null @@ -1,114 +0,0 @@ -/* - * This file is part of the MicroPython project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#include "shared-bindings/busio/I2C.h" -#include "shared-bindings/busio/SPI.h" -#include "shared-bindings/busio/UART.h" - -#include "shared-bindings/microcontroller/Pin.h" -#include "supervisor/shared/translate.h" -#include "nrf/pins.h" -#include "py/mpconfig.h" -#include "py/runtime.h" - -#if !defined(DEFAULT_I2C_BUS_SDA) || !defined(DEFAULT_I2C_BUS_SCL) - STATIC mp_obj_t board_i2c(void) { - mp_raise_NotImplementedError(translate("No default I2C bus")); - return NULL; - } -#else - STATIC mp_obj_t i2c_singleton = NULL; - - STATIC mp_obj_t board_i2c(void) { - - if (i2c_singleton == NULL) { - busio_i2c_obj_t *self = m_new_obj(busio_i2c_obj_t); - self->base.type = &busio_i2c_type; - - assert_pin_free(DEFAULT_I2C_BUS_SDA); - assert_pin_free(DEFAULT_I2C_BUS_SCL); - common_hal_busio_i2c_construct(self, DEFAULT_I2C_BUS_SCL, DEFAULT_I2C_BUS_SDA, 400000, 0); - i2c_singleton = (mp_obj_t)self; - } - return i2c_singleton; - - } -#endif -MP_DEFINE_CONST_FUN_OBJ_0(board_i2c_obj, board_i2c); - -#if !defined(DEFAULT_SPI_BUS_SCK) || !defined(DEFAULT_SPI_BUS_MISO) || !defined(DEFAULT_SPI_BUS_MOSI) - STATIC mp_obj_t board_spi(void) { - mp_raise_NotImplementedError(translate("No default SPI bus")); - return NULL; - } -#else - STATIC mp_obj_t spi_singleton = NULL; - - STATIC mp_obj_t board_spi(void) { - - if (spi_singleton == NULL) { - busio_spi_obj_t *self = m_new_obj(busio_spi_obj_t); - self->base.type = &busio_spi_type; - assert_pin_free(DEFAULT_SPI_BUS_SCK); - assert_pin_free(DEFAULT_SPI_BUS_MOSI); - assert_pin_free(DEFAULT_SPI_BUS_MISO); - const mcu_pin_obj_t* clock = MP_OBJ_TO_PTR(DEFAULT_SPI_BUS_SCK); - const mcu_pin_obj_t* mosi = MP_OBJ_TO_PTR(DEFAULT_SPI_BUS_MOSI); - const mcu_pin_obj_t* miso = MP_OBJ_TO_PTR(DEFAULT_SPI_BUS_MISO); - common_hal_busio_spi_construct(self, clock, mosi, miso); - spi_singleton = (mp_obj_t)self; - } - return spi_singleton; - } -#endif -MP_DEFINE_CONST_FUN_OBJ_0(board_spi_obj, board_spi); - -#if !defined(DEFAULT_UART_BUS_RX) || !defined(DEFAULT_UART_BUS_TX) - STATIC mp_obj_t board_uart(void) { - mp_raise_NotImplementedError(translate("No default UART bus")); - return NULL; - } -#else - STATIC mp_obj_t uart_singleton = NULL; - - STATIC mp_obj_t board_uart(void) { - if (uart_singleton == NULL) { - busio_uart_obj_t *self = m_new_obj(busio_uart_obj_t); - self->base.type = &busio_uart_type; - - assert_pin_free(DEFAULT_UART_BUS_RX); - assert_pin_free(DEFAULT_UART_BUS_TX); - - const mcu_pin_obj_t* rx = MP_OBJ_TO_PTR(DEFAULT_UART_BUS_RX); - const mcu_pin_obj_t* tx = MP_OBJ_TO_PTR(DEFAULT_UART_BUS_TX); - - common_hal_busio_uart_construct(self, tx, rx, 9600, 8, PARITY_NONE, 1, 1000, 64); - uart_singleton = (mp_obj_t)self; - } - return uart_singleton; - } -#endif -MP_DEFINE_CONST_FUN_OBJ_0(board_uart_obj, board_uart); diff --git a/ports/nrf/boards/feather_nrf52832/README.md b/ports/nrf/boards/feather_nrf52832/README.md deleted file mode 100644 index ef910509a..000000000 --- a/ports/nrf/boards/feather_nrf52832/README.md +++ /dev/null @@ -1,192 +0,0 @@ -# Setup - -## Installing CircuitPython submodules - -Before you can build, you will need to run the following commands once, which -will install the submodules that are part of the CircuitPython ecosystem, and -build the `mpy-cross` tool: - -``` -$ cd circuitpython -$ git submodule update --init -$ make -C mpy-cross -``` - -You then need to download the SD and Nordic SDK files via: - -> This script relies on `wget`, which must be available from the command line. - -``` -$ cd ports/nrf -$ ./bluetooth/download_ble_stack.sh -``` - -## Installing `adafruit-nrfutil` - -The Adafruit Bluefruit nRF52 Feather ships with a serial and OTA BLE bootloader -that can be used to flash firmware images over a simple serial connection, -using the on-board USB serial converter. - -run following command to install [adafruit-nrfutil](https://github.com/adafruit/Adafruit_nRF52_nrfutil) from PyPi - - $ pip3 install --user adafruit-nrfutil - -# Building and flashing firmware images - -## Building CircuitPython binaries - -#### REPL over UART (default settings) - -To build a CircuitPython binary with default settings for the -`feather_nrf52832` target enter: - -> **NOTE:** `BOARD=feather_nrf52832` is the default option and isn't stricly required. - -``` -$ make BOARD=feather_nrf52832 V=1 -``` - -#### REPL over BLE UART (AKA 'NUS') - -To build a CircuitPython binary that uses the Nordic UART Service (AKA 'NUS' or -'BLEUART'), modify `/ports/nrf/bluetooth_conf.h` to have the following macro -set to `1` in the `#elif (BLUETOOTH_SD == 132)` section: - -``` -#define MICROPY_PY_BLE_NUS (1) -``` - -... then build as normal, via: - -``` -$ make BOARD=feather52832 V=1 -``` - -You can then connect over BLE UART using an application like Bluefruit LE -Connect, available for Android, iOS and OS X, or any other application that -supports the NUS service and allows you to send the corrent EOL sequence. - -## Flashing binaries with `adafruit-nrfutil` - -### 1. **Update bootloader** to single-bank version - -The Adafruit nRF52 Feather ships, by default, with a **dual-bank** bootloader -that cuts the available flash memory in half in exchange for safer -OTA updates. - -Due to the size of CircuitPython, we must migrate this bootloader to a -**single-bank** version, doubling the amount of flash memory available to us. - -> These commands only need to be run once and will update the SoftDevice and -bootloader from the dual-bank version that ships on Arduino-based Adafruit -Feather52 boards to a single-bank CircuitPython compatible version: - -Firstly clone the [Adafruit_nRF52_Bootloader](https://github.com/adafruit/Adafruit_nRF52_Bootloader.git) and enter its directory - - $ git clone https://github.com/adafruit/Adafruit_nRF52_Bootloader.git - $ cd Adafruit_nRF52_Bootloader - -#### S132 v2.0.1 single-bank (recommended): - -To flash bootloader with s132 v2.0.1 - -``` -$ make BOARD=feather_nrf52832 VERSION=2.0.1 SERIAL=/dev/tty.SLAB_USBtoUART dfu-flash -``` - -#### S132 v5.0.0 (BLE5, experimental): - -To flash bootloader with s132 v5.0.0 - -``` -$ make BOARD=feather52832 VERSION=5.0.0 SERIAL=/dev/tty.SLAB_USBtoUART dfu-flash -``` - -### 2. Generate and flash a CircuitPython DFU .zip package over serial - -The following command will package and flash the CircuitPython binary using the -appropriate bootloader mentionned above. - -This command assumes you have already built a valid circuitpython -image, as described earlier in this readme. - -> The name of the serial port target will vary, depending on your OS. - -``` -$ make BOARD=feather_nrf52832 SERIAL=/dev/tty.SLAB_USBtoUART dfu-gen dfu-flash -``` - -By default, CircuitPython will build with **BLE** support enabled using -`SD=s132` and the `SOFTDEV_VERSION=2.0.1`. If you wish to specify a different -SD family or version you can enter the optional fields as shown below: - -``` -$ make BOARD=feather_nrf52832 SERIAL=/dev/tty.SLAB_USBtoUART SD=s132 SOFTDEV_VERSION=5.0.0 dfu-gen dfu-flash -``` - -## Working with CircuitPython - -### Running local files with `ampy` - -[ampy](https://learn.adafruit.com/micropython-basics-load-files-and-run-code/install-ampy) -is a command-line tool that can be used with the nRF52 Feather to transfer -local python files to the nRF52 for execution, rather than having to enter -the REPL manually, enter paste mode, and paste the code yourself. - -> **IMPORTANT**: You must have `ampy` version **1.0.3** or higher to use `ampy` - with the nRF52. The bootloader on the nRF52 requires a delay between the - HW reset, and the moment when the command sequance is sent to enter raw - mode. This required `-d/--delay` flag was added in release 1.0.3. - - -Save the following file as `test.py`: - -``` -import board -import digitalio -import time - -led = digitalio.DigitalInOut(board.LED2) -led.direction = digitalio.Direction.OUTPUT - -while True: - led.value = True - time.sleep(0.5) - led.value = False - time.sleep(0.5) -``` - -Then run the saved file via ampy, updating the serial port as required: - -``` -$ ampy -p /dev/tty.SLAB_USBtoUART -d 1.5 run test.py -``` - -This should give you blinky at 1 Hz on LED2 (the blue LED on the nRF52 Feather). - -### Uploading files and libraries with `ampy` - -To upload Python files or pre-compiled CircuitPython libraries to the `lib` folder, -run the following commands: - -> In this example **i2c_device.py** is used, which is part of - [Adafruit_CircuitPython_BusDevice](https://github.com/adafruit/Adafruit_CircuitPython_BusDevice) - -``` -$ ampy -p /dev/tty.SLAB_USBtoUART -d 1.5 put i2c_device.py lib/i2c_device.py -``` - -To verify that the file was uploaded correctly, you can check the contents of -the `lib` folder with: - -``` -$ ampy -p /dev/tty.SLAB_USBtoUART -d 1.5 ls /lib -i2c_device.py -``` - -### Suggested libraries - -The following libraries should be installed as a minimum on most new boards: - -- [Adafruit_CircuitPython_BusDevice](https://github.com/adafruit/Adafruit_CircuitPython_BusDevice) -- [Adafruit_CircuitPython_Register](https://github.com/adafruit/Adafruit_CircuitPython_Register/tree/master) diff --git a/ports/nrf/boards/feather_nrf52832/custom_nrf52832_dfu_app_2.0.1.ld b/ports/nrf/boards/feather_nrf52832/custom_nrf52832_dfu_app_2.0.1.ld deleted file mode 100644 index a1c128e37..000000000 --- a/ports/nrf/boards/feather_nrf52832/custom_nrf52832_dfu_app_2.0.1.ld +++ /dev/null @@ -1,44 +0,0 @@ -/* - GNU linker script for NRF52 w/ s132 2.0.1 SoftDevice - - MEMORY MAP - ------------------------------------------------------------------------ - START ADDR END ADDR SIZE DESCRIPTION - ---------- ---------- ------- ----------------------------------------- - 0x0007F000..0x0007FFFF ( 4KB) Bootloader Settings - 0x0007E000..0x0007EFFF ( 4KB) Master Boot Record Params - 0x00074000..0x0007DFFF ( 40KB) Serial + OTA Bootloader - - 0x00073000..0x00073FFF ( 4KB ) Private Config Data (Bonding, Keys, etc.) - 0x00072000..0x00072FFF ( 4KB ) User NVM data - 0x00059000..0x00071FFF (100KB) User Filesystem - - 0x0001C000..0x00058FFF (244KB) Application Code - 0x00001000..0x0001BFFF (108KB) SoftDevice - 0x00000000..0x00000FFF (4KB) Master Boot Record -*/ - -/* Specify the memory areas (S132 2.0.1) */ -MEMORY -{ - FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x080000 /* entire flash, 512 KiB */ - FLASH_ISR (rx) : ORIGIN = 0x0001c000, LENGTH = 0x001000 /* sector 0, 4 KiB */ - FLASH_TEXT (rx) : ORIGIN = 0x0001d000, LENGTH = 0x03C000 /* APP - ISR, 240 KiB */ - FLASH_FATFS (r) : ORIGIN = 0x00059000, LENGTH = 0x019000 /* File system 100KB KB */ - RAM (xrw) : ORIGIN = 0x20003000, LENGTH = 0x0D000 /* 52 KiB, give 8KiB headroom for softdevice */ -} - -/* produce a link error if there is not this amount of RAM for these sections */ -_minimum_stack_size = 2K; -_minimum_heap_size = 0 /*16K Circuit Python use static variable for HEAP */; - -/* top end of the stack */ - -/*_stack_end = ORIGIN(RAM) + LENGTH(RAM);*/ -_estack = ORIGIN(RAM) + LENGTH(RAM); - -/* RAM extents for the garbage collector */ -_ram_end = ORIGIN(RAM) + LENGTH(RAM); -_heap_end = 0x20007000; /* tunable */ - -INCLUDE "boards/common.ld" diff --git a/ports/nrf/boards/feather_nrf52832/custom_nrf52832_dfu_app_5.0.0.ld b/ports/nrf/boards/feather_nrf52832/custom_nrf52832_dfu_app_5.0.0.ld deleted file mode 100644 index f9209bf3d..000000000 --- a/ports/nrf/boards/feather_nrf52832/custom_nrf52832_dfu_app_5.0.0.ld +++ /dev/null @@ -1,44 +0,0 @@ -/* - GNU linker script for NRF52 w/ s132 5.0.0 SoftDevice - - MEMORY MAP - ------------------------------------------------------------------------ - START ADDR END ADDR SIZE DESCRIPTION - ---------- ---------- ------- ----------------------------------------- - 0x0007F000..0x0007FFFF ( 4KB) Bootloader Settings - 0x0007E000..0x0007EFFF ( 4KB) Master Boot Record Params - 0x00074000..0x0007DFFF ( 40KB) Serial + OTA Bootloader - - 0x00073000..0x00073FFF ( 4KB ) Private Config Data (Bonding, Keys, etc.) - 0x00072000..0x00072FFF ( 4KB ) User NVM data - 0x00059000..0x00071FFF ( 100KB) User Filesystem - - 0x00023000..0x00058FFF (216KB) Application Code - 0x00001000..0x00022FFF (136KB) SoftDevice - 0x00000000..0x00000FFF (4KB) Master Boot Record -*/ - -/* Specify the memory areas (S132 5.0.0) */ -MEMORY -{ - FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x080000 /* entire flash, 512 KiB */ - FLASH_ISR (rx) : ORIGIN = 0x00023000, LENGTH = 0x001000 /* sector 0, 4 KiB */ - FLASH_TEXT (rx) : ORIGIN = 0x00024000, LENGTH = 0x036000 /* APP - ISR, 216 KiB */ - FLASH_FATFS (r) : ORIGIN = 0x00059000, LENGTH = 0x019000 /* File system 100KB KB */ - RAM (xrw) : ORIGIN = 0x200039c0, LENGTH = 0x0c640 /* 49.5 KiB, give 8KiB headroom for softdevice */ -} - -/* produce a link error if there is not this amount of RAM for these sections */ -_minimum_stack_size = 2K; -_minimum_heap_size = 0 /*16K Circuit Python use static variable for HEAP */; - -/* top end of the stack */ - -/*_stack_end = ORIGIN(RAM) + LENGTH(RAM);*/ -_estack = ORIGIN(RAM) + LENGTH(RAM); - -/* RAM extents for the garbage collector */ -_ram_end = ORIGIN(RAM) + LENGTH(RAM); -_heap_end = 0x20007000; /* tunable */ - -INCLUDE "boards/common.ld" diff --git a/ports/nrf/boards/feather_nrf52832/examples/ble_scan.py b/ports/nrf/boards/feather_nrf52832/examples/ble_scan.py deleted file mode 100644 index 9cacbe6f4..000000000 --- a/ports/nrf/boards/feather_nrf52832/examples/ble_scan.py +++ /dev/null @@ -1,26 +0,0 @@ -from ubluepy import Scanner, constants - -def display_scan_results(scan_entries): - for e in scan_entries: - print("ADDR: ", e.addr()) - print("TYPE: ", e.addr_type()) - print("RSSI: ", e.rssi()) - - # Parse the contents of the advertising packet - scan = e.getScanData() - if scan: - for s in scan: - # Convert byte array to hex format string - hex = ' '.join('0x%02X' % b for b in s[2]) - # Display enum value and hex string together - print('\t{}: {}'.format(s[1], hex)) - - # Line break between record sets - print("") - -# Scan 1s for advertising devices in range -s = Scanner() -scan_res = s.scan(1000) - -# Display the scan results -display_scan_results(scan_res) diff --git a/ports/nrf/boards/feather_nrf52832/examples/blinky.py b/ports/nrf/boards/feather_nrf52832/examples/blinky.py deleted file mode 100644 index 29cca26d0..000000000 --- a/ports/nrf/boards/feather_nrf52832/examples/blinky.py +++ /dev/null @@ -1,12 +0,0 @@ -import board -import digitalio -import time - -led = digitalio.DigitalInOut(board.LED2) -led.direction = digitalio.Direction.OUTPUT - -while True: - led.value = True - time.sleep(0.5) - led.value = False - time.sleep(0.5) diff --git a/ports/nrf/boards/feather_nrf52832/examples/i2c_scan.py b/ports/nrf/boards/feather_nrf52832/examples/i2c_scan.py deleted file mode 100644 index 8e3ef557d..000000000 --- a/ports/nrf/boards/feather_nrf52832/examples/i2c_scan.py +++ /dev/null @@ -1,20 +0,0 @@ -import board -import busio - -i2c = busio.I2C(board.SCL, board.SDA) -count = 0 - -# Wait for I2C lock -while not i2c.try_lock(): - pass - -# Scan for devices on the I2C bus -print("Scanning I2C bus") -for x in i2c.scan(): - print(hex(x)) - count += 1 - -print("%d device(s) found on I2C bus" % count) - -# Release the I2C bus -i2c.unlock() diff --git a/ports/nrf/boards/feather_nrf52832/examples/pulseio.py b/ports/nrf/boards/feather_nrf52832/examples/pulseio.py deleted file mode 100644 index cdbe16add..000000000 --- a/ports/nrf/boards/feather_nrf52832/examples/pulseio.py +++ /dev/null @@ -1,25 +0,0 @@ -import time -from board import * -from pulseio import * - -# Setup BLUE and RED LEDs as PWM output (default frequency is 500 Hz) -ledb = PWMOut(LED2) -ledr = PWMOut(LED1) - -# Set the BLUE LED to have a duty cycle of 5000 (out of 65535, so ~7.5%) -ledb.duty_cycle = 5000 - -# Setup pin A0 as a standard PWM out @ 50% to test on the oscilloscope. -# You should see a 50% duty cycle waveform at ~500Hz on the scope when you -# connect a probe to pin A0 -a0 = PWMOut(A0) -a0.duty_cycle = int(65535/2) - -# Constantly pulse the RED LED -while True: - for i in range(100): - ledr.duty_cycle = int(i / 100 * 65535) - time.sleep(0.01) - for i in range(100, -1, -1): - ledr.duty_cycle = int(i / 100 * 65535) - time.sleep(0.01) diff --git a/ports/nrf/boards/feather_nrf52832/mpconfigboard.mk b/ports/nrf/boards/feather_nrf52832/mpconfigboard.mk deleted file mode 100644 index 5b1f6e939..000000000 --- a/ports/nrf/boards/feather_nrf52832/mpconfigboard.mk +++ /dev/null @@ -1,13 +0,0 @@ -MCU_SERIES = m4 -MCU_VARIANT = nrf52 -# Historical: nrf52 means nrf52832 -MCU_SUB_VARIANT = nrf52 -MCU_CHIP = nrf52832 -SD ?= s132 -SOFTDEV_VERSION ?= 2.0.1 - -LD_FILE = boards/feather_nrf52832/custom_nrf52832_dfu_app_$(SOFTDEV_VERSION).ld -BOOT_FILE = boards/feather_nrf52832/bootloader/feather52_bootloader_$(SOFTDEV_VERSION)_s132_single - -BOOT_SETTING_ADDR = 0x7F000 -NRF_DEFINES += -DNRF52832_XXAA -DNRF52832 diff --git a/ports/nrf/boards/feather_nrf52832/pins.c b/ports/nrf/boards/feather_nrf52832/pins.c deleted file mode 100644 index 48c57defb..000000000 --- a/ports/nrf/boards/feather_nrf52832/pins.c +++ /dev/null @@ -1,47 +0,0 @@ -#include "shared-bindings/board/__init__.h" - -#include "board_busses.h" - -STATIC const mp_rom_map_elem_t board_module_globals_table[] = { - { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_P0_02) }, - { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_P0_03) }, - { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_P0_04) }, - { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_P0_05) }, - { MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_P0_28) }, - { MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_P0_29) }, - - { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_P0_12) }, - { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_P0_13) }, - { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_P0_14) }, - - { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_P0_08) }, - { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_P0_06) }, - - { MP_ROM_QSTR(MP_QSTR_DFU), MP_ROM_PTR(&pin_P0_20) }, - - { MP_ROM_QSTR(MP_QSTR_NFC1), MP_ROM_PTR(&pin_P0_09) }, - { MP_ROM_QSTR(MP_QSTR_NFC2), MP_ROM_PTR(&pin_P0_10) }, - - { MP_ROM_QSTR(MP_QSTR_D27), MP_ROM_PTR(&pin_P0_27) }, - - { MP_ROM_QSTR(MP_QSTR_D30), MP_ROM_PTR(&pin_P0_30) }, - { MP_ROM_QSTR(MP_QSTR_A6), MP_ROM_PTR(&pin_P0_30) }, - - { MP_ROM_QSTR(MP_QSTR_D31), MP_ROM_PTR(&pin_P0_31) }, - { MP_ROM_QSTR(MP_QSTR_A7), MP_ROM_PTR(&pin_P0_31) }, - { MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_P0_31) }, - - { MP_ROM_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_P0_07) }, - { MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_P0_11) }, - { MP_ROM_QSTR(MP_QSTR_D15), MP_ROM_PTR(&pin_P0_15) }, - { MP_ROM_QSTR(MP_QSTR_D16), MP_ROM_PTR(&pin_P0_16) }, - - { MP_ROM_QSTR(MP_QSTR_L), MP_ROM_PTR(&pin_P0_17) }, - - { MP_ROM_QSTR(MP_QSTR_LED_BLUE), MP_ROM_PTR(&pin_P0_19) }, - - { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_P0_26) }, - { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_P0_25) }, -}; - -MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/nrf/boards/feather_nrf52840_express/mpconfigboard.h b/ports/nrf/boards/feather_nrf52840_express/mpconfigboard.h index da72c085e..eb8be7608 100644 --- a/ports/nrf/boards/feather_nrf52840_express/mpconfigboard.h +++ b/ports/nrf/boards/feather_nrf52840_express/mpconfigboard.h @@ -37,7 +37,7 @@ #define MICROPY_HW_LED_STATUS (&pin_P1_15) -#ifdef QSPI_FLASH_FILESYSTEM +#if QSPI_FLASH_FILESYSTEM #define MICROPY_QSPI_DATA0 NRF_GPIO_PIN_MAP(0, 17) #define MICROPY_QSPI_DATA1 NRF_GPIO_PIN_MAP(0, 22) #define MICROPY_QSPI_DATA2 NRF_GPIO_PIN_MAP(0, 23) @@ -46,7 +46,7 @@ #define MICROPY_QSPI_CS NRF_GPIO_PIN_MAP(0, 20) #endif -#ifdef SPI_FLASH_FILESYSTEM +#if SPI_FLASH_FILESYSTEM #define SPI_FLASH_MOSI_PIN &pin_P0_17 #define SPI_FLASH_MISO_PIN &pin_P0_22 #define SPI_FLASH_SCK_PIN &pin_P0_19 @@ -55,9 +55,6 @@ #define CIRCUITPY_AUTORELOAD_DELAY_MS 500 -// If you change this, then make sure to update the linker scripts as well to -// make sure you don't overwrite code -#define PORT_HEAP_SIZE (128 * 1024) // TODO #define CIRCUITPY_INTERNAL_NVM_SIZE 8192 #define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE) diff --git a/ports/nrf/boards/feather_nrf52840_express/mpconfigboard.mk b/ports/nrf/boards/feather_nrf52840_express/mpconfigboard.mk index 905921a5d..0fef54ef7 100644 --- a/ports/nrf/boards/feather_nrf52840_express/mpconfigboard.mk +++ b/ports/nrf/boards/feather_nrf52840_express/mpconfigboard.mk @@ -16,6 +16,7 @@ ifeq ($(SD),) LD_FILE = boards/nrf52840_1M_256k.ld else LD_FILE = boards/adafruit_$(MCU_SUB_VARIANT)_$(SD_LOWER)_v$(firstword $(subst ., ,$(SOFTDEV_VERSION))).ld + CIRCUITPY_BLEIO = 1 endif NRF_DEFINES += -DNRF52840_XXAA -DNRF52840 diff --git a/ports/nrf/boards/feather_nrf52840_express/pins.c b/ports/nrf/boards/feather_nrf52840_express/pins.c index 56e425374..c6f643761 100644 --- a/ports/nrf/boards/feather_nrf52840_express/pins.c +++ b/ports/nrf/boards/feather_nrf52840_express/pins.c @@ -1,49 +1,55 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" STATIC const mp_rom_map_elem_t board_module_globals_table[] = { - { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_P0_04) }, - { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_P0_05) }, - { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_P0_30) }, - { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_P0_28) }, - { MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_P0_02) }, - { MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_P0_03) }, + { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_P0_04) }, + { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_P0_05) }, + { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_P0_30) }, + { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_P0_28) }, + { MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_P0_02) }, + { MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_P0_03) }, - { MP_ROM_QSTR(MP_QSTR_AREF), MP_ROM_PTR(&pin_P0_31) }, + { MP_ROM_QSTR(MP_QSTR_AREF), MP_ROM_PTR(&pin_P0_31) }, - { MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_P0_29) }, - { MP_ROM_QSTR(MP_QSTR_BATTERY), MP_ROM_PTR(&pin_P0_29) }, + { MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_P0_29) }, + { MP_ROM_QSTR(MP_QSTR_BATTERY), MP_ROM_PTR(&pin_P0_29) }, - { MP_ROM_QSTR(MP_QSTR_SWITCH), MP_ROM_PTR(&pin_P1_02) }, + { MP_ROM_QSTR(MP_QSTR_SWITCH), MP_ROM_PTR(&pin_P1_02) }, - { MP_ROM_QSTR(MP_QSTR_NFC1), MP_ROM_PTR(&pin_P0_09) }, - { MP_ROM_QSTR(MP_QSTR_NFC2), MP_ROM_PTR(&pin_P0_10) }, + { MP_ROM_QSTR(MP_QSTR_NFC1), MP_ROM_PTR(&pin_P0_09) }, + { MP_ROM_QSTR(MP_QSTR_NFC2), MP_ROM_PTR(&pin_P0_10) }, - { MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_P0_10) }, - { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_P1_08) }, - { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_P0_07) }, - { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_P0_26) }, - { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_P0_27) }, - { MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_P0_06) }, - { MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_P0_08) }, - { MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_P1_09) }, + { MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_P0_10) }, + { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_P1_08) }, + { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_P0_07) }, + { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_P0_26) }, + { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_P0_27) }, + { MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_P0_06) }, + { MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_P0_08) }, + { MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_P1_09) }, - { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_P0_16) }, + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_P0_16) }, - { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_P0_14) }, - { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_P0_13) }, - { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_P0_15) }, + { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_P0_14) }, + { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_P0_13) }, + { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_P0_15) }, - { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_P0_25) }, - { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_P0_24) }, + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_P0_25) }, + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_P0_24) }, - { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_P0_11) }, - { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_P0_12) }, + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_P0_11) }, + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_P0_12) }, - { MP_ROM_QSTR(MP_QSTR_L), MP_ROM_PTR(&pin_P1_15) }, - { MP_ROM_QSTR(MP_QSTR_RED_LED), MP_ROM_PTR(&pin_P1_15) }, - { MP_ROM_QSTR(MP_QSTR_BLUE_LED), MP_ROM_PTR(&pin_P1_10) }, + { MP_ROM_QSTR(MP_QSTR_L), MP_ROM_PTR(&pin_P1_15) }, + { MP_ROM_QSTR(MP_QSTR_RED_LED), MP_ROM_PTR(&pin_P1_15) }, + { MP_ROM_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_P1_15) }, + + { MP_ROM_QSTR(MP_QSTR_BLUE_LED), MP_ROM_PTR(&pin_P1_10) }, + + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, }; MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/nrf/boards/makerdiary_nrf52840_mdk/mpconfigboard.h b/ports/nrf/boards/makerdiary_nrf52840_mdk/mpconfigboard.h index 40b6487ec..ed4836494 100644 --- a/ports/nrf/boards/makerdiary_nrf52840_mdk/mpconfigboard.h +++ b/ports/nrf/boards/makerdiary_nrf52840_mdk/mpconfigboard.h @@ -42,9 +42,6 @@ #define CIRCUITPY_AUTORELOAD_DELAY_MS 500 -// If you change this, then make sure to update the linker scripts as well to -// make sure you don't overwrite code -#define PORT_HEAP_SIZE (128 * 1024) // TODO #define CIRCUITPY_INTERNAL_NVM_SIZE 8192 #define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE) diff --git a/ports/nrf/boards/makerdiary_nrf52840_mdk/mpconfigboard.mk b/ports/nrf/boards/makerdiary_nrf52840_mdk/mpconfigboard.mk index 84dff0bc4..abb0f4946 100644 --- a/ports/nrf/boards/makerdiary_nrf52840_mdk/mpconfigboard.mk +++ b/ports/nrf/boards/makerdiary_nrf52840_mdk/mpconfigboard.mk @@ -16,6 +16,7 @@ ifeq ($(SD),) LD_FILE = boards/nrf52840_1M_256k.ld else LD_FILE = boards/adafruit_$(MCU_SUB_VARIANT)_$(SD_LOWER)_v$(firstword $(subst ., ,$(SOFTDEV_VERSION))).ld + CIRCUITPY_BLEIO = 1 endif NRF_DEFINES += -DNRF52840_XXAA -DNRF52840 diff --git a/ports/nrf/boards/makerdiary_nrf52840_mdk/pins.c b/ports/nrf/boards/makerdiary_nrf52840_mdk/pins.c index 27f0c6797..2d24e8597 100644 --- a/ports/nrf/boards/makerdiary_nrf52840_mdk/pins.c +++ b/ports/nrf/boards/makerdiary_nrf52840_mdk/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" STATIC const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_AIN0), MP_ROM_PTR(&pin_P0_02) }, diff --git a/ports/nrf/boards/makerdiary_nrf52840_mdk_usb_dongle/README.md b/ports/nrf/boards/makerdiary_nrf52840_mdk_usb_dongle/README.md new file mode 100644 index 000000000..e3e50f905 --- /dev/null +++ b/ports/nrf/boards/makerdiary_nrf52840_mdk_usb_dongle/README.md @@ -0,0 +1,96 @@ +# MakerDiary NRF52840 MDK USB Dongle + +Refer to [The makerdiary Github repo](https://github.com/makerdiary/nrf52840-mdk-usb-dongle) +or [The nrf52840-mdk-usb-dongle wiki](https://wiki.makerdiary.com/nrf52840-mdk-usb-dongle/) +for more details about the device. + +This is pretty much just the nRF52840 with a useful number of pins exposed for +your pleasure along with one RGB LED and an onboard antenna in a USB stick form +factor with room for headers on the sides. + +Note that all three LEDs on this device are wired through sinks, not sources, +so flip your boolean expectations when dealing with `DigitalInOut` or `PWMOut` +on this device -- +`led.value = True` or `led.duty_cycle = 0xffff` turns the LED off! + +The onboard button is hard wired to the Reset pin so you cannot use it yourself. + +## Installing CircuitPython submodules + +Before you can build, you will need to run the following commands once, which +will install the submodules that are part of the CircuitPython ecosystem, and +build the `mpy-cross` tool: + +``` +$ cd circuitpython +$ git submodule update --init +$ make -C mpy-cross +``` + +## Note about bootloaders + +While most Adafruit devices come with (or can easily be flashed with) an +Adafruit-provided bootloader (supporting niceties like UF2 flashing), this +board comes with one that supports DFU via nrfutil. If you ever need to +restore the DFU bootloader via a SWD debugger, use +[the nRF52 open bootloader hex file](https://github.com/makerdiary/nrf52840-mdk-usb-dongle/tree/master/firmware/open_bootloader). + +## Building and Flashing CircuitPython + +``` +$ cd ports/nrf +``` + +### Build CircuitPython for the MDK USB Dongle + +``` +make BOARD=makerdiary_nrf52840_mdk_usb_dongle SD=s140 V=1 -j4 hex +``` + +This should produce a `build-makerdiary_nrf52840_mdk_usb_dongle-s140/firmware.hex` file. + +### Install nrfutil + +You'll need to have [nrfutil](https://pypi.org/project/nrfutil/) installed as +appropriate for your system. +As of 2019-01, _nrfutil still requires Python 2.7_... ugh! + +### Flash the nRF52 Radio Soft Device + +Build a DFU package from the softdevice hex file and flash it: + +```sh +nrfutil pkg generate --hw-version 52 --sd-req 0x00 --sd-id 0xAE --softdevice bluetooth/s140_nrf52_6.1.0/s140_nrf52_6.1.0_softdevice.hex dfu_sd140-6.1.0.zip +nrfutil dfu usb-serial -pkg dfu_sd140-6.1.0.zip -p /dev/tty.usbmodemABRACADBRA # likely /dev/ttyACM0 on Linux +``` + +Note that the `--sd=id 0xAE` comes from the Nordic nRF52 manual for SoftDevice +6.1.0. When the SoftDevice is changed, read the Nordic manual to find the +correct value and use it on all of the `nrfutil pkg generate` commands. + +`/dev/tty.usbmodem*` is a macOS name. On Linux it'll likely be `/dev/ttyACM*`. On Windows probably a COM port. + +### Flash CircuitPython + +Build a DFU package from the hex application file and flash it: + +``` +nrfutil pkg generate --sd-req 0xAE --application build-makerdiary_nrf52840_mdk_usb_dongle-s140/firmware.hex --hw-version 52 --application-version 1 dfu_circuitpython.zip +nrfutil dfu usb-serial -pkg dfu_circuitpython.zip -p /dev/tty.usbmodemABRACADBRA +``` + +I'm not sure if `--application-version 1` is actually meaningful or required. + +After this, your device should be up and running CircuitPython. When it +resets, you'll see the CIRCUITPY USB filesystem and a new console usb modem +serial port show up. + +``` +Adafruit CircuitPython 4.0.0-alpha.5-139-g10ceb6716 on 2019-01-14; MakerDiary nRF52840 MDK USB Dongle with nRF52840 +>>> +``` + +### TODO items + +* Update the Makefile to do the above DFU .zip building and nrfutil flashing. +* Create a UF2 bootloader for this. It is already a USB stick form factor, it deserves to behave like one. diff --git a/ports/nrf/boards/pca10040/board.c b/ports/nrf/boards/makerdiary_nrf52840_mdk_usb_dongle/board.c index f1a49a74a..4421970ee 100644 --- a/ports/nrf/boards/pca10040/board.c +++ b/ports/nrf/boards/makerdiary_nrf52840_mdk_usb_dongle/board.c @@ -24,11 +24,6 @@ * THE SOFTWARE. */ -#include <string.h> -#include <stdbool.h> - -#include "nrf.h" - #include "boards/board.h" void board_init(void) { diff --git a/ports/nrf/boards/pca10040/mpconfigboard.h b/ports/nrf/boards/makerdiary_nrf52840_mdk_usb_dongle/mpconfigboard.h index 396102832..d4096503d 100644 --- a/ports/nrf/boards/pca10040/mpconfigboard.h +++ b/ports/nrf/boards/makerdiary_nrf52840_mdk_usb_dongle/mpconfigboard.h @@ -25,15 +25,18 @@ * THE SOFTWARE. */ -#define MICROPY_HW_BOARD_NAME "PCA10040" -#define MICROPY_HW_MCU_NAME "nRF52832" -#define MICROPY_PY_SYS_PLATFORM "nRF52-DK" +#include "nrfx/hal/nrf_gpio.h" -#define MICROPY_HW_LED_STATUS (&pin_P0_17) +#define MAKERDIARY_NRF52840_MDK_DONGLE -#define MICROPY_HW_UART_RX NRF_GPIO_PIN_MAP(0, 8) -#define MICROPY_HW_UART_TX NRF_GPIO_PIN_MAP(0, 6) -#define MICROPY_HW_UART_HWFC (0) +#define MICROPY_HW_BOARD_NAME "MakerDiary nRF52840 MDK USB Dongle" +#define MICROPY_HW_MCU_NAME "nRF52840" +#define MICROPY_PY_SYS_PLATFORM "MakerDiary52840MDKDongle" -#define PORT_HEAP_SIZE (32 * 1024) #define CIRCUITPY_AUTORELOAD_DELAY_MS 500 + +// TODO #define CIRCUITPY_INTERNAL_NVM_SIZE 8192 + +#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE) + +#define BOARD_HAS_CRYSTAL 1 // according to the schematic we do diff --git a/ports/nrf/boards/makerdiary_nrf52840_mdk_usb_dongle/mpconfigboard.mk b/ports/nrf/boards/makerdiary_nrf52840_mdk_usb_dongle/mpconfigboard.mk new file mode 100644 index 000000000..82bbc3bd8 --- /dev/null +++ b/ports/nrf/boards/makerdiary_nrf52840_mdk_usb_dongle/mpconfigboard.mk @@ -0,0 +1,23 @@ +USB_VID = 0x239A +USB_PID = 0x802A +USB_PRODUCT = "nRF52840-MDK-Dongle" +USB_MANUFACTURER = "makerdiary" + +MCU_SERIES = m4 +MCU_VARIANT = nrf52 +MCU_SUB_VARIANT = nrf52840 +MCU_CHIP = nrf52840 +SD ?= s140 +SOFTDEV_VERSION ?= 6.1.0 + +BOOT_SETTING_ADDR = 0xFF000 +BOOT_FILE = boards/$(BOARD)/bootloader/$(SOFTDEV_VERSION)/$(BOARD)_bootloader_$(SOFTDEV_VERSION)_s140 + +ifeq ($(SD),) + LD_FILE = boards/nrf52840_1M_256k.ld +else + LD_FILE = boards/adafruit_$(MCU_SUB_VARIANT)_$(SD_LOWER)_v$(firstword $(subst ., ,$(SOFTDEV_VERSION))).ld + CIRCUITPY_BLEIO = 1 +endif + +NRF_DEFINES += -DNRF52840_XXAA -DNRF52840 diff --git a/ports/nrf/boards/makerdiary_nrf52840_mdk_usb_dongle/pins.c b/ports/nrf/boards/makerdiary_nrf52840_mdk_usb_dongle/pins.c new file mode 100644 index 000000000..10490c8cb --- /dev/null +++ b/ports/nrf/boards/makerdiary_nrf52840_mdk_usb_dongle/pins.c @@ -0,0 +1,41 @@ +#include "shared-bindings/board/__init__.h" + +#include "supervisor/shared/board_busses.h" + +STATIC const mp_rom_map_elem_t board_module_globals_table[] = { + { MP_ROM_QSTR(MP_QSTR_AIN0), MP_ROM_PTR(&pin_P0_02) }, + { MP_ROM_QSTR(MP_QSTR_AIN1), MP_ROM_PTR(&pin_P0_03) }, + { MP_ROM_QSTR(MP_QSTR_AIN2), MP_ROM_PTR(&pin_P0_04) }, + { MP_ROM_QSTR(MP_QSTR_AIN3), MP_ROM_PTR(&pin_P0_05) }, + + { MP_ROM_QSTR(MP_QSTR_AREF), MP_ROM_PTR(&pin_P0_04) }, // User must connect manually. + { MP_ROM_QSTR(MP_QSTR_VDIV), MP_ROM_PTR(&pin_P0_05) }, // User must connect manually. + +// Not defining the NFC names until CircuitPython supports NFC. +// { MP_ROM_QSTR(MP_QSTR_NFC1), MP_ROM_PTR(&pin_P0_09) }, +// { MP_ROM_QSTR(MP_QSTR_NFC2), MP_ROM_PTR(&pin_P0_10) }, + + { MP_ROM_QSTR(MP_QSTR_P2), MP_ROM_PTR(&pin_P0_02) }, + { MP_ROM_QSTR(MP_QSTR_P3), MP_ROM_PTR(&pin_P0_03) }, + { MP_ROM_QSTR(MP_QSTR_P4), MP_ROM_PTR(&pin_P0_04) }, + { MP_ROM_QSTR(MP_QSTR_P5), MP_ROM_PTR(&pin_P0_05) }, + { MP_ROM_QSTR(MP_QSTR_P6), MP_ROM_PTR(&pin_P0_06) }, + { MP_ROM_QSTR(MP_QSTR_P7), MP_ROM_PTR(&pin_P0_07) }, + { MP_ROM_QSTR(MP_QSTR_P8), MP_ROM_PTR(&pin_P0_08) }, + { MP_ROM_QSTR(MP_QSTR_P9), MP_ROM_PTR(&pin_P0_09) }, + { MP_ROM_QSTR(MP_QSTR_P10), MP_ROM_PTR(&pin_P0_10) }, + { MP_ROM_QSTR(MP_QSTR_P18), MP_ROM_PTR(&pin_P0_18) }, // !Reset button. + { MP_ROM_QSTR(MP_QSTR_P19), MP_ROM_PTR(&pin_P0_19) }, + { MP_ROM_QSTR(MP_QSTR_P22), MP_ROM_PTR(&pin_P0_22) }, // green led, low is on. + { MP_ROM_QSTR(MP_QSTR_P23), MP_ROM_PTR(&pin_P0_23) }, // red led, low is on. + { MP_ROM_QSTR(MP_QSTR_P24), MP_ROM_PTR(&pin_P0_24) }, // blue led, low is on. + + { MP_ROM_QSTR(MP_QSTR_LED_RED), MP_ROM_PTR(&pin_P0_23) }, // Low is on. + { MP_ROM_QSTR(MP_QSTR_LED_GREEN), MP_ROM_PTR(&pin_P0_22) }, // Low is on. + { MP_ROM_QSTR(MP_QSTR_LED_BLUE), MP_ROM_PTR(&pin_P0_24) }, // Low is on. + + // BUT this is the RESET pin so we can't really use it. + { MP_ROM_QSTR(MP_QSTR_BUTTON), MP_ROM_PTR(&pin_P0_18) }, // Low is pressed. +}; + +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/nrf/boards/nrf52832_512k_64k.ld b/ports/nrf/boards/nrf52832_512k_64k.ld deleted file mode 100644 index 699811ce8..000000000 --- a/ports/nrf/boards/nrf52832_512k_64k.ld +++ /dev/null @@ -1,28 +0,0 @@ -/* - GNU linker script for NRF52832 blank w/ no SoftDevice -*/ - -/* Specify the memory areas */ -MEMORY -{ - FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x080000 /* entire flash, 512 KiB */ - FLASH_ISR (rx) : ORIGIN = 0x00000000, LENGTH = 0x001000 /* sector 0, 4 KiB */ - FLASH_TEXT (rx) : ORIGIN = 0x00001000, LENGTH = 0x066000 /* 408 KiB */ - FLASH_FATFS (r) : ORIGIN = 0x00067000, LENGTH = 0x019000 /* File system 100KB */ - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 0x010000 /* 64 KiB */ -} - -/* produce a link error if there is not this amount of RAM for these sections */ -_minimum_stack_size = 2K; -_minimum_heap_size = 0; - -/* top end of the stack */ - -/*_stack_end = ORIGIN(RAM) + LENGTH(RAM);*/ -_estack = ORIGIN(RAM) + LENGTH(RAM); - -/* RAM extents for the garbage collector */ -_ram_end = ORIGIN(RAM) + LENGTH(RAM); -_heap_end = 0x20008000; /* tunable */ - -INCLUDE "boards/common.ld" diff --git a/ports/nrf/boards/nrf52832_512k_64k_s132_2.0.1.ld b/ports/nrf/boards/nrf52832_512k_64k_s132_2.0.1.ld deleted file mode 100644 index dbff5f987..000000000 --- a/ports/nrf/boards/nrf52832_512k_64k_s132_2.0.1.ld +++ /dev/null @@ -1,28 +0,0 @@ -/* - GNU linker script for NRF52 w/ s132 2.0.1 SoftDevice -*/ - -/* Specify the memory areas */ -MEMORY -{ - FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x080000 /* entire flash, 512 KiB */ - FLASH_ISR (rx) : ORIGIN = 0x0001c000, LENGTH = 0x001000 /* sector 0, 4 KiB */ - FLASH_TEXT (rx) : ORIGIN = 0x0001d000, LENGTH = 0x04A000 /* 296 KiB */ - FLASH_FATFS (r) : ORIGIN = 0x00067000, LENGTH = 0x019000 /* File system 100KB */ - RAM (xrw) : ORIGIN = 0x200039c0, LENGTH = 0x0c640 /* 49.5 KiB, give 8KiB headroom for softdevice */ -} - -/* produce a link error if there is not this amount of RAM for these sections */ -_minimum_stack_size = 2K; -_minimum_heap_size = 0; - -/* top end of the stack */ - -/*_stack_end = ORIGIN(RAM) + LENGTH(RAM);*/ -_estack = ORIGIN(RAM) + LENGTH(RAM); - -/* RAM extents for the garbage collector */ -_ram_end = ORIGIN(RAM) + LENGTH(RAM); -_heap_end = 0x20007000; /* tunable */ - -INCLUDE "boards/common.ld" diff --git a/ports/nrf/boards/nrf52832_512k_64k_s132_5.0.0.ld b/ports/nrf/boards/nrf52832_512k_64k_s132_5.0.0.ld deleted file mode 100644 index 6d5fe63c9..000000000 --- a/ports/nrf/boards/nrf52832_512k_64k_s132_5.0.0.ld +++ /dev/null @@ -1,28 +0,0 @@ -/* - GNU linker script for NRF52 w/ s132 2.0.1 SoftDevice -*/ - -/* Specify the memory areas */ -MEMORY -{ - FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x080000 /* entire flash, 512 KiB */ - FLASH_ISR (rx) : ORIGIN = 0x00023000, LENGTH = 0x001000 /* sector 0, 4 KiB */ - FLASH_TEXT (rx) : ORIGIN = 0x00024000, LENGTH = 0x043000 /* 268 KiB */ - FLASH_FATFS (r) : ORIGIN = 0x00067000, LENGTH = 0x019000 /* File system 100KB */ - RAM (xrw) : ORIGIN = 0x200039c0, LENGTH = 0x0c640 /* 49.5 KiB, give 8KiB headroom for softdevice */ -} - -/* produce a link error if there is not this amount of RAM for these sections */ -_minimum_stack_size = 2K; -_minimum_heap_size = 0; - -/* top end of the stack */ - -/*_stack_end = ORIGIN(RAM) + LENGTH(RAM);*/ -_estack = ORIGIN(RAM) + LENGTH(RAM); - -/* RAM extents for the garbage collector */ -_ram_end = ORIGIN(RAM) + LENGTH(RAM); -_heap_end = 0x20007000; /* tunable */ - -INCLUDE "boards/common.ld" diff --git a/ports/nrf/boards/particle_argon/mpconfigboard.h b/ports/nrf/boards/particle_argon/mpconfigboard.h index bd9a46349..0ee785c31 100644 --- a/ports/nrf/boards/particle_argon/mpconfigboard.h +++ b/ports/nrf/boards/particle_argon/mpconfigboard.h @@ -39,7 +39,7 @@ #define MICROPY_HW_RGB_LED_GREEN (&pin_P0_14) #define MICROPY_HW_RGB_LED_BLUE (&pin_P0_15) -#ifdef QSPI_FLASH_FILESYSTEM +#if QSPI_FLASH_FILESYSTEM #define MICROPY_QSPI_DATA0 NRF_GPIO_PIN_MAP(0, 20) #define MICROPY_QSPI_DATA1 NRF_GPIO_PIN_MAP(0, 21) #define MICROPY_QSPI_DATA2 NRF_GPIO_PIN_MAP(0, 22) @@ -48,7 +48,7 @@ #define MICROPY_QSPI_CS NRF_GPIO_PIN_MAP(0, 17) #endif -#ifdef SPI_FLASH_FILESYSTEM +#if SPI_FLASH_FILESYSTEM #define SPI_FLASH_MOSI_PIN &pin_P0_20 #define SPI_FLASH_MISO_PIN &pin_P0_21 #define SPI_FLASH_SCK_PIN &pin_P0_19 @@ -57,9 +57,6 @@ #define CIRCUITPY_AUTORELOAD_DELAY_MS 500 -// If you change this, then make sure to update the linker scripts as well to -// make sure you don't overwrite code -#define PORT_HEAP_SIZE (128 * 1024) // TODO #define CIRCUITPY_INTERNAL_NVM_SIZE 8192 #define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE) diff --git a/ports/nrf/boards/particle_argon/mpconfigboard.mk b/ports/nrf/boards/particle_argon/mpconfigboard.mk index ee30c2be9..8d3bb2a28 100644 --- a/ports/nrf/boards/particle_argon/mpconfigboard.mk +++ b/ports/nrf/boards/particle_argon/mpconfigboard.mk @@ -16,6 +16,7 @@ ifeq ($(SD),) LD_FILE = boards/nrf52840_1M_256k.ld else LD_FILE = boards/adafruit_$(MCU_SUB_VARIANT)_$(SD_LOWER)_v$(firstword $(subst ., ,$(SOFTDEV_VERSION))).ld + CIRCUITPY_BLEIO = 1 endif NRF_DEFINES += -DNRF52840_XXAA -DNRF52840 diff --git a/ports/nrf/boards/particle_argon/pins.c b/ports/nrf/boards/particle_argon/pins.c index 0457f0aa8..10d547f91 100644 --- a/ports/nrf/boards/particle_argon/pins.c +++ b/ports/nrf/boards/particle_argon/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" STATIC const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_P0_03) }, @@ -61,6 +61,12 @@ STATIC const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_ESP_BOOT_MODE), MP_ROM_PTR(&pin_P0_16) }, { MP_ROM_QSTR(MP_QSTR_ESP_WIFI_EN), MP_ROM_PTR(&pin_P0_24) }, { MP_ROM_QSTR(MP_QSTR_ESP_HOST_WK), MP_ROM_PTR(&pin_P0_07) }, + + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + + }; MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/nrf/boards/particle_boron/mpconfigboard.h b/ports/nrf/boards/particle_boron/mpconfigboard.h index ed675c811..b814fc694 100644 --- a/ports/nrf/boards/particle_boron/mpconfigboard.h +++ b/ports/nrf/boards/particle_boron/mpconfigboard.h @@ -39,7 +39,7 @@ #define MICROPY_HW_RGB_LED_GREEN (&pin_P0_14) #define MICROPY_HW_RGB_LED_BLUE (&pin_P0_15) -#ifdef QSPI_FLASH_FILESYSTEM +#if QSPI_FLASH_FILESYSTEM #define MICROPY_QSPI_DATA0 NRF_GPIO_PIN_MAP(0, 20) #define MICROPY_QSPI_DATA1 NRF_GPIO_PIN_MAP(0, 21) #define MICROPY_QSPI_DATA2 NRF_GPIO_PIN_MAP(0, 22) @@ -48,7 +48,7 @@ #define MICROPY_QSPI_CS NRF_GPIO_PIN_MAP(0, 17) #endif -#ifdef SPI_FLASH_FILESYSTEM +#if SPI_FLASH_FILESYSTEM #define SPI_FLASH_MOSI_PIN &pin_P0_20 #define SPI_FLASH_MISO_PIN &pin_P0_21 #define SPI_FLASH_SCK_PIN &pin_P0_19 @@ -57,9 +57,6 @@ #define CIRCUITPY_AUTORELOAD_DELAY_MS 500 -// If you change this, then make sure to update the linker scripts as well to -// make sure you don't overwrite code -#define PORT_HEAP_SIZE (128 * 1024) // TODO #define CIRCUITPY_INTERNAL_NVM_SIZE 8192 #define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE) diff --git a/ports/nrf/boards/particle_boron/mpconfigboard.mk b/ports/nrf/boards/particle_boron/mpconfigboard.mk index ba6c57b85..801b9613f 100644 --- a/ports/nrf/boards/particle_boron/mpconfigboard.mk +++ b/ports/nrf/boards/particle_boron/mpconfigboard.mk @@ -16,6 +16,7 @@ ifeq ($(SD),) LD_FILE = boards/nrf52840_1M_256k.ld else LD_FILE = boards/adafruit_$(MCU_SUB_VARIANT)_$(SD_LOWER)_v$(firstword $(subst ., ,$(SOFTDEV_VERSION))).ld + CIRCUITPY_BLEIO = 1 endif NRF_DEFINES += -DNRF52840_XXAA -DNRF52840 diff --git a/ports/nrf/boards/particle_boron/pins.c b/ports/nrf/boards/particle_boron/pins.c index 2bff0a2ce..0b827a85a 100644 --- a/ports/nrf/boards/particle_boron/pins.c +++ b/ports/nrf/boards/particle_boron/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" STATIC const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_P0_03) }, @@ -59,6 +59,14 @@ STATIC const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_UBLOX_POWER_MONITOR), MP_ROM_PTR(&pin_P0_02) }, { MP_ROM_QSTR(MP_QSTR_UBLOX_RESET), MP_ROM_PTR(&pin_P0_12) }, { MP_ROM_QSTR(MP_QSTR_UBLOX_POWER_ON), MP_ROM_PTR(&pin_P0_16) }, + + + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + + + }; MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/nrf/boards/particle_xenon/mpconfigboard.h b/ports/nrf/boards/particle_xenon/mpconfigboard.h index 0b119b8bf..41551d2e1 100644 --- a/ports/nrf/boards/particle_xenon/mpconfigboard.h +++ b/ports/nrf/boards/particle_xenon/mpconfigboard.h @@ -39,7 +39,7 @@ #define MICROPY_HW_RGB_LED_GREEN (&pin_P0_14) #define MICROPY_HW_RGB_LED_BLUE (&pin_P0_15) -#ifdef QSPI_FLASH_FILESYSTEM +#if QSPI_FLASH_FILESYSTEM #define MICROPY_QSPI_DATA0 NRF_GPIO_PIN_MAP(0, 20) #define MICROPY_QSPI_DATA1 NRF_GPIO_PIN_MAP(0, 21) #define MICROPY_QSPI_DATA2 NRF_GPIO_PIN_MAP(0, 22) @@ -48,7 +48,7 @@ #define MICROPY_QSPI_CS NRF_GPIO_PIN_MAP(0, 17) #endif -#ifdef SPI_FLASH_FILESYSTEM +#if SPI_FLASH_FILESYSTEM #define SPI_FLASH_MOSI_PIN &pin_P0_20 #define SPI_FLASH_MISO_PIN &pin_P0_21 #define SPI_FLASH_SCK_PIN &pin_P0_19 @@ -57,9 +57,6 @@ #define CIRCUITPY_AUTORELOAD_DELAY_MS 500 -// If you change this, then make sure to update the linker scripts as well to -// make sure you don't overwrite code -#define PORT_HEAP_SIZE (128 * 1024) // TODO #define CIRCUITPY_INTERNAL_NVM_SIZE 8192 #define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE) diff --git a/ports/nrf/boards/particle_xenon/mpconfigboard.mk b/ports/nrf/boards/particle_xenon/mpconfigboard.mk index 5ed0677c7..5cebc423a 100644 --- a/ports/nrf/boards/particle_xenon/mpconfigboard.mk +++ b/ports/nrf/boards/particle_xenon/mpconfigboard.mk @@ -16,6 +16,7 @@ ifeq ($(SD),) LD_FILE = boards/nrf52840_1M_256k.ld else LD_FILE = boards/adafruit_$(MCU_SUB_VARIANT)_$(SD_LOWER)_v$(firstword $(subst ., ,$(SOFTDEV_VERSION))).ld + CIRCUITPY_BLEIO = 1 endif NRF_DEFINES += -DNRF52840_XXAA -DNRF52840 diff --git a/ports/nrf/boards/particle_xenon/pins.c b/ports/nrf/boards/particle_xenon/pins.c index 11a29e927..644face61 100644 --- a/ports/nrf/boards/particle_xenon/pins.c +++ b/ports/nrf/boards/particle_xenon/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" STATIC const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_P0_03) }, @@ -52,6 +52,14 @@ STATIC const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_ANTENNA_EXTERNAL), MP_ROM_PTR(&pin_P0_25) }, { MP_ROM_QSTR(MP_QSTR_ANTENNA_PCB), MP_ROM_PTR(&pin_P0_24) }, + + + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + + + }; MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/nrf/boards/pca10040/mpconfigboard.mk b/ports/nrf/boards/pca10040/mpconfigboard.mk deleted file mode 100644 index ad11b4f7c..000000000 --- a/ports/nrf/boards/pca10040/mpconfigboard.mk +++ /dev/null @@ -1,15 +0,0 @@ -MCU_SERIES = m4 -MCU_VARIANT = nrf52 -# Historical: nrf52 means nrf52832 -MCU_SUB_VARIANT = nrf52 -MCU_CHIP = nrf52832 -SD ?= s132 -SOFTDEV_VERSION ?= 5.0.0 - -ifeq ($(SD),) - LD_FILE = boards/nrf52832_512k_64k.ld -else - LD_FILE = boards/nrf52832_512k_64k_s132_$(SOFTDEV_VERSION).ld -endif - -NRF_DEFINES += -DNRF52832_XXAA -DNRF52832 diff --git a/ports/nrf/boards/pca10040/pins.c b/ports/nrf/boards/pca10040/pins.c deleted file mode 100644 index 95acd8ffd..000000000 --- a/ports/nrf/boards/pca10040/pins.c +++ /dev/null @@ -1,44 +0,0 @@ -#include "shared-bindings/board/__init__.h" - -#include "board_busses.h" - -STATIC const mp_rom_map_elem_t board_module_globals_table[] = { - { MP_ROM_QSTR(MP_QSTR_P0_00), MP_ROM_PTR(&pin_P0_00) }, - { MP_ROM_QSTR(MP_QSTR_P0_01), MP_ROM_PTR(&pin_P0_01) }, - { MP_ROM_QSTR(MP_QSTR_P0_02), MP_ROM_PTR(&pin_P0_02) }, - { MP_ROM_QSTR(MP_QSTR_P0_03), MP_ROM_PTR(&pin_P0_03) }, - { MP_ROM_QSTR(MP_QSTR_P0_04), MP_ROM_PTR(&pin_P0_04) }, - { MP_ROM_QSTR(MP_QSTR_P0_05), MP_ROM_PTR(&pin_P0_05) }, - { MP_ROM_QSTR(MP_QSTR_P0_06), MP_ROM_PTR(&pin_P0_06) }, - { MP_ROM_QSTR(MP_QSTR_P0_07), MP_ROM_PTR(&pin_P0_07) }, - { MP_ROM_QSTR(MP_QSTR_P0_08), MP_ROM_PTR(&pin_P0_08) }, - { MP_ROM_QSTR(MP_QSTR_P0_09), MP_ROM_PTR(&pin_P0_09) }, - { MP_ROM_QSTR(MP_QSTR_P0_10), MP_ROM_PTR(&pin_P0_10) }, - { MP_ROM_QSTR(MP_QSTR_P0_11), MP_ROM_PTR(&pin_P0_11) }, - { MP_ROM_QSTR(MP_QSTR_P0_12), MP_ROM_PTR(&pin_P0_12) }, - { MP_ROM_QSTR(MP_QSTR_P0_13), MP_ROM_PTR(&pin_P0_13) }, - { MP_ROM_QSTR(MP_QSTR_P0_14), MP_ROM_PTR(&pin_P0_14) }, - { MP_ROM_QSTR(MP_QSTR_P0_15), MP_ROM_PTR(&pin_P0_15) }, - { MP_ROM_QSTR(MP_QSTR_P0_16), MP_ROM_PTR(&pin_P0_16) }, - { MP_ROM_QSTR(MP_QSTR_P0_17), MP_ROM_PTR(&pin_P0_17) }, - { MP_ROM_QSTR(MP_QSTR_LED1), MP_ROM_PTR(&pin_P0_17) }, - { MP_ROM_QSTR(MP_QSTR_P0_18), MP_ROM_PTR(&pin_P0_18) }, - { MP_ROM_QSTR(MP_QSTR_LED2), MP_ROM_PTR(&pin_P0_18) }, - { MP_ROM_QSTR(MP_QSTR_P0_19), MP_ROM_PTR(&pin_P0_19) }, - { MP_ROM_QSTR(MP_QSTR_LED3), MP_ROM_PTR(&pin_P0_19) }, - { MP_ROM_QSTR(MP_QSTR_P0_20), MP_ROM_PTR(&pin_P0_20) }, - { MP_ROM_QSTR(MP_QSTR_LED4), MP_ROM_PTR(&pin_P0_20) }, - { MP_ROM_QSTR(MP_QSTR_P0_21), MP_ROM_PTR(&pin_P0_21) }, - { MP_ROM_QSTR(MP_QSTR_P0_22), MP_ROM_PTR(&pin_P0_22) }, - { MP_ROM_QSTR(MP_QSTR_P0_23), MP_ROM_PTR(&pin_P0_23) }, - { MP_ROM_QSTR(MP_QSTR_P0_24), MP_ROM_PTR(&pin_P0_24) }, - { MP_ROM_QSTR(MP_QSTR_P0_25), MP_ROM_PTR(&pin_P0_25) }, - { MP_ROM_QSTR(MP_QSTR_P0_26), MP_ROM_PTR(&pin_P0_26) }, - { MP_ROM_QSTR(MP_QSTR_P0_27), MP_ROM_PTR(&pin_P0_27) }, - { MP_ROM_QSTR(MP_QSTR_P0_28), MP_ROM_PTR(&pin_P0_28) }, - { MP_ROM_QSTR(MP_QSTR_P0_29), MP_ROM_PTR(&pin_P0_29) }, - { MP_ROM_QSTR(MP_QSTR_P0_30), MP_ROM_PTR(&pin_P0_30) }, - { MP_ROM_QSTR(MP_QSTR_P0_31), MP_ROM_PTR(&pin_P0_31) }, -}; - -MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/nrf/boards/pca10056/mpconfigboard.h b/ports/nrf/boards/pca10056/mpconfigboard.h index 8d420721f..48ef7f1c3 100644 --- a/ports/nrf/boards/pca10056/mpconfigboard.h +++ b/ports/nrf/boards/pca10056/mpconfigboard.h @@ -30,7 +30,6 @@ #define MICROPY_HW_MCU_NAME "nRF52840" #define MICROPY_PY_SYS_PLATFORM "nRF52840-DK" -#define PORT_HEAP_SIZE (128 * 1024) #define CIRCUITPY_AUTORELOAD_DELAY_MS 500 #define MICROPY_HW_LED_STATUS (&pin_P0_13) @@ -50,7 +49,7 @@ // Quad mode: If all DATA0 --> DATA3 are valid // Dual mode: If DATA0 and DATA1 are valid while either DATA2 and/or DATA3 are invalid // Single mode: If only DATA0 is valid -#ifdef QSPI_FLASH_FILESYSTEM +#if QSPI_FLASH_FILESYSTEM #define MICROPY_QSPI_DATA0 NRF_GPIO_PIN_MAP(0, 20) #define MICROPY_QSPI_DATA1 NRF_GPIO_PIN_MAP(0, 21) #define MICROPY_QSPI_DATA2 NRF_GPIO_PIN_MAP(0, 22) @@ -59,7 +58,7 @@ #define MICROPY_QSPI_CS NRF_GPIO_PIN_MAP(0, 17) #endif -#ifdef SPI_FLASH_FILESYSTEM +#if SPI_FLASH_FILESYSTEM #define SPI_FLASH_MOSI_PIN &pin_P0_20 #define SPI_FLASH_MISO_PIN &pin_P0_21 #define SPI_FLASH_SCK_PIN &pin_P0_19 diff --git a/ports/nrf/boards/pca10056/mpconfigboard.mk b/ports/nrf/boards/pca10056/mpconfigboard.mk index 49c708cff..723e7976e 100644 --- a/ports/nrf/boards/pca10056/mpconfigboard.mk +++ b/ports/nrf/boards/pca10056/mpconfigboard.mk @@ -16,6 +16,7 @@ ifeq ($(SD),) LD_FILE = boards/nrf52840_1M_256k.ld else LD_FILE = boards/adafruit_$(MCU_SUB_VARIANT)_$(SD_LOWER)_v$(firstword $(subst ., ,$(SOFTDEV_VERSION))).ld + CIRCUITPY_BLEIO = 1 endif NRF_DEFINES += -DNRF52840_XXAA -DNRF52840 diff --git a/ports/nrf/boards/pca10056/pins.c b/ports/nrf/boards/pca10056/pins.c index a57c9d1c9..510b6100e 100644 --- a/ports/nrf/boards/pca10056/pins.c +++ b/ports/nrf/boards/pca10056/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" STATIC const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_P0_00), MP_ROM_PTR(&pin_P0_00) }, diff --git a/ports/nrf/boards/pca10059/mpconfigboard.h b/ports/nrf/boards/pca10059/mpconfigboard.h index 03abd65e8..d5ce21229 100644 --- a/ports/nrf/boards/pca10059/mpconfigboard.h +++ b/ports/nrf/boards/pca10059/mpconfigboard.h @@ -30,5 +30,4 @@ #define MICROPY_HW_LED_STATUS (&pin_P0_06) -#define PORT_HEAP_SIZE (128 * 1024) #define CIRCUITPY_AUTORELOAD_DELAY_MS 500 diff --git a/ports/nrf/boards/pca10059/mpconfigboard.mk b/ports/nrf/boards/pca10059/mpconfigboard.mk index 030c9a823..db9d80668 100644 --- a/ports/nrf/boards/pca10059/mpconfigboard.mk +++ b/ports/nrf/boards/pca10059/mpconfigboard.mk @@ -17,6 +17,7 @@ ifeq ($(SD),) LD_FILE = boards/nrf52840_1M_256k.ld else LD_FILE = boards/adafruit_$(MCU_SUB_VARIANT)_$(SD_LOWER)_v$(firstword $(subst ., ,$(SOFTDEV_VERSION))).ld + CIRCUITPY_BLEIO = 1 endif NRF_DEFINES += -DNRF52840_XXAA -DNRF52840 diff --git a/ports/nrf/boards/pca10059/pins.c b/ports/nrf/boards/pca10059/pins.c index a1916bd04..c43d3a9eb 100644 --- a/ports/nrf/boards/pca10059/pins.c +++ b/ports/nrf/boards/pca10059/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" STATIC const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_P0_02), MP_ROM_PTR(&pin_P0_02) }, diff --git a/ports/nrf/boards/sparkfun_nrf52840_mini/mpconfigboard.h b/ports/nrf/boards/sparkfun_nrf52840_mini/mpconfigboard.h index 353a0ad8f..a5ed69b2b 100644 --- a/ports/nrf/boards/sparkfun_nrf52840_mini/mpconfigboard.h +++ b/ports/nrf/boards/sparkfun_nrf52840_mini/mpconfigboard.h @@ -30,7 +30,6 @@ #define MICROPY_HW_MCU_NAME "nRF52840" #define MICROPY_PY_SYS_PLATFORM "SFE_NRF52840_Mini" -#define PORT_HEAP_SIZE (128 * 1024) #define CIRCUITPY_AUTORELOAD_DELAY_MS 500 #define DEFAULT_I2C_BUS_SCL (&pin_P0_11) @@ -50,7 +49,7 @@ // Quad mode: If all DATA0 --> DATA3 are valid // Dual mode: If DATA0 and DATA1 are valid while either DATA2 and/or DATA3 are invalid // Single mode: If only DATA0 is valid -/*#ifdef QSPI_FLASH_FILESYSTEM +/*#if QSPI_FLASH_FILESYSTEM #define MICROPY_QSPI_DATA0 NRF_GPIO_PIN_MAP(0, 20) #define MICROPY_QSPI_DATA1 NRF_GPIO_PIN_MAP(0, 21) #define MICROPY_QSPI_DATA2 NRF_GPIO_PIN_MAP(0, 22) @@ -59,10 +58,9 @@ #define MICROPY_QSPI_CS NRF_GPIO_PIN_MAP(0, 17) #endif -#ifdef SPI_FLASH_FILESYSTEM +#if SPI_FLASH_FILESYSTEM #define SPI_FLASH_MOSI_PIN &pin_P0_20 #define SPI_FLASH_MISO_PIN &pin_P0_21 #define SPI_FLASH_SCK_PIN &pin_P0_19 #define SPI_FLASH_CS_PIN &pin_P0_17 #endif*/ - diff --git a/ports/nrf/boards/sparkfun_nrf52840_mini/mpconfigboard.mk b/ports/nrf/boards/sparkfun_nrf52840_mini/mpconfigboard.mk index d4819c855..212a85d57 100644 --- a/ports/nrf/boards/sparkfun_nrf52840_mini/mpconfigboard.mk +++ b/ports/nrf/boards/sparkfun_nrf52840_mini/mpconfigboard.mk @@ -16,10 +16,9 @@ ifeq ($(SD),) LD_FILE = boards/nrf52840_1M_256k.ld else LD_FILE = boards/adafruit_$(MCU_SUB_VARIANT)_$(SD_LOWER)_v$(firstword $(subst ., ,$(SOFTDEV_VERSION))).ld + CIRCUITPY_BLEIO = 1 endif NRF_DEFINES += -DNRF52840_XXAA -DNRF52840 -QSPI_FLASH_FILESYSTEM = 0 -EXTERNAL_FLASH_DEVICE_COUNT = 0 -EXTERNAL_FLASH_DEVICES = +INTERNAL_FLASH_FILESYSTEM = 1 diff --git a/ports/nrf/boards/sparkfun_nrf52840_mini/pins.c b/ports/nrf/boards/sparkfun_nrf52840_mini/pins.c index 5c50f55c7..f826ac771 100644 --- a/ports/nrf/boards/sparkfun_nrf52840_mini/pins.c +++ b/ports/nrf/boards/sparkfun_nrf52840_mini/pins.c @@ -1,6 +1,6 @@ #include "shared-bindings/board/__init__.h" -#include "board_busses.h" +#include "supervisor/shared/board_busses.h" STATIC const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_P1_15) }, // D1/TX diff --git a/ports/nrf/common-hal/bleio/Adapter.c b/ports/nrf/common-hal/bleio/Adapter.c index 985e262e4..540659aa1 100644 --- a/ports/nrf/common-hal/bleio/Adapter.c +++ b/ports/nrf/common-hal/bleio/Adapter.c @@ -33,29 +33,22 @@ #include "nrfx_power.h" #include "nrf_nvic.h" #include "nrf_sdm.h" -#include "py/nlr.h" +#include "py/runtime.h" #include "shared-bindings/bleio/Adapter.h" +#include "supervisor/usb.h" + STATIC void softdevice_assert_handler(uint32_t id, uint32_t pc, uint32_t info) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_AssertionError, - translate("Soft device assert, id: 0x%08lX, pc: 0x%08lX"), id, pc)); + mp_raise_msg_varg(&mp_type_AssertionError, + translate("Soft device assert, id: 0x%08lX, pc: 0x%08lX"), id, pc); } STATIC uint32_t ble_stack_enable(void) { nrf_clock_lf_cfg_t clock_config = { .source = NRF_CLOCK_LF_SRC_XTAL, -#if (BLE_API_VERSION == 4) .accuracy = NRF_CLOCK_LF_ACCURACY_20_PPM -#else - .xtal_accuracy = NRF_CLOCK_LF_XTAL_ACCURACY_20_PPM -#endif }; -#if (BLUETOOTH_SD == 140) - // The SD takes over the POWER IRQ and will fail if the IRQ is already in use - nrfx_power_uninit(); -#endif - uint32_t err_code = sd_softdevice_enable(&clock_config, softdevice_assert_handler); if (err_code != NRF_SUCCESS) return err_code; @@ -64,17 +57,10 @@ STATIC uint32_t ble_stack_enable(void) { if (err_code != NRF_SUCCESS) return err_code; - uint32_t app_ram_start; -#if (BLE_API_VERSION == 2) - ble_enable_params_t ble_enable_params = { - .gatts_enable_params.attr_tab_size = BLE_GATTS_ATTR_TAB_SIZE_DEFAULT, - .gap_enable_params.central_conn_count = 1, - .gap_enable_params.periph_conn_count = 1, - }; + // Start with no event handlers, etc. + ble_drv_reset(); - app_ram_start = 0x200039c0; - err_code = sd_ble_enable(&ble_enable_params, &app_ram_start); -#else + uint32_t app_ram_start; app_ram_start = 0x20004000; ble_cfg_t ble_conf; @@ -100,7 +86,6 @@ STATIC uint32_t ble_stack_enable(void) { return err_code; err_code = sd_ble_enable(&app_ram_start); -#endif return err_code; } @@ -115,14 +100,23 @@ void common_hal_bleio_adapter_set_enabled(bool enabled) { uint32_t err_code; if (enabled) { + // The SD takes over the POWER module and will fail if the module is already in use. + // Occurs when USB is initialized previously + nrfx_power_uninit(); + err_code = ble_stack_enable(); + + // Re-init USB hardware + init_usb_hardware(); } else { err_code = sd_softdevice_disable(); + + // Re-init USB hardware + init_usb_hardware(); } if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to change softdevice state, error: 0x%08lX"), err_code)); + mp_raise_OSError_msg(translate("Failed to change softdevice state")); } } @@ -131,8 +125,7 @@ bool common_hal_bleio_adapter_get_enabled(void) { const uint32_t err_code = sd_softdevice_is_enabled(&is_enabled); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to get softdevice state, error: 0x%08lX"), err_code)); + mp_raise_OSError_msg(translate("Failed to get softdevice state")); } return is_enabled; @@ -151,8 +144,7 @@ void common_hal_bleio_adapter_get_address(bleio_address_obj_t *address) { #endif if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to get local address, error: 0x%08lX"), err_code)); + mp_raise_OSError_msg(translate("Failed to get local address")); } address->type = local_address.addr_type; diff --git a/ports/nrf/common-hal/bleio/Broadcaster.c b/ports/nrf/common-hal/bleio/Broadcaster.c new file mode 100644 index 000000000..a70209a7f --- /dev/null +++ b/ports/nrf/common-hal/bleio/Broadcaster.c @@ -0,0 +1,98 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Dan Halbert for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include <string.h> + +#include "ble.h" +#include "ble_drv.h" +#include "ble_hci.h" +#include "nrf_soc.h" +#include "py/runtime.h" + +#include "common-hal/bleio/Broadcaster.h" +#include "shared-bindings/bleio/Adapter.h" +#include "shared-bindings/bleio/Broadcaster.h" + +static uint8_t m_adv_handle = BLE_GAP_ADV_SET_HANDLE_NOT_SET; + +void common_hal_bleio_broadcaster_construct(bleio_broadcaster_obj_t *self, mp_float_t interval) { + common_hal_bleio_adapter_set_enabled(true); // TODO -- Do this somewhere else maybe bleio __init__ + const mp_float_t min = BLE_GAP_ADV_INTERVAL_MIN * ADV_INTERVAL_UNIT_FLOAT_SECS; + const mp_float_t max = BLE_GAP_ADV_INTERVAL_MAX * ADV_INTERVAL_UNIT_FLOAT_SECS; + + if (interval < min || interval > max) { + // Would like to print range using the constants above, but vargs would convert to double. + mp_raise_ValueError(translate("interval not in range 0.0020 to 10.24")); + } + self->interval = interval; +} + + +void common_hal_bleio_broadcaster_start_advertising(bleio_broadcaster_obj_t *self, mp_buffer_info_t *data) { + uint32_t err_code; + + if (data->len >= BLE_GAP_ADV_SET_DATA_SIZE_MAX) { + mp_raise_ValueError(translate("Data too large for advertisement packet")); + } + memcpy(self->adv_data, data->buf, data->len); + + ble_gap_adv_params_t m_adv_params = { + .interval = (uint32_t) (self->interval / ADV_INTERVAL_UNIT_FLOAT_SECS), + .properties.type = BLE_GAP_ADV_TYPE_NONCONNECTABLE_SCANNABLE_UNDIRECTED, + .duration = BLE_GAP_ADV_TIMEOUT_GENERAL_UNLIMITED, + .filter_policy = BLE_GAP_ADV_FP_ANY, + .primary_phy = BLE_GAP_PHY_1MBPS, + }; + + common_hal_bleio_broadcaster_stop_advertising(self); + + const ble_gap_adv_data_t ble_gap_adv_data = { + .adv_data.p_data = self->adv_data, + .adv_data.len = data->len, + }; + + err_code = sd_ble_gap_adv_set_configure(&m_adv_handle, &ble_gap_adv_data, &m_adv_params); + if (err_code == NRF_SUCCESS) { + err_code = sd_ble_gap_adv_start(m_adv_handle, BLE_CONN_CFG_TAG_CUSTOM); + } + + if (err_code != NRF_SUCCESS) { + mp_raise_OSError_msg_varg(translate("Failed to start advertising, err 0x%04x"), err_code); + } +} + +void common_hal_bleio_broadcaster_stop_advertising(bleio_broadcaster_obj_t *self) { + + if (m_adv_handle == BLE_GAP_ADV_SET_HANDLE_NOT_SET) { + return; + } + + const uint32_t err_code = sd_ble_gap_adv_stop(m_adv_handle); + + if ((err_code != NRF_SUCCESS) && (err_code != NRF_ERROR_INVALID_STATE)) { + mp_raise_OSError_msg_varg(translate("Failed to stop advertising, err 0x%04x"), err_code); + } +} diff --git a/ports/nrf/common-hal/bleio/Broadcaster.h b/ports/nrf/common-hal/bleio/Broadcaster.h new file mode 100644 index 000000000..72f93a443 --- /dev/null +++ b/ports/nrf/common-hal/bleio/Broadcaster.h @@ -0,0 +1,47 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Artur Pacholec + * Copyright (c) 2018 Dan Halbert for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_COMMON_HAL_BLEIO_BROADCASTER_H +#define MICROPY_INCLUDED_COMMON_HAL_BLEIO_BROADCASTER_H + +#include "ble.h" + +#include "shared-module/bleio/__init__.h" +#include "shared-module/bleio/Address.h" + +typedef struct { + mp_obj_base_t base; + // In seconds. + mp_float_t interval; + // The advertising data buffer is held by us, not by the SD, so we must + // maintain it and not change it. If we need to change its contents during advertising, + // there are tricks to get the SD to notice (see DevZone - TBS). + uint8_t adv_data[BLE_GAP_ADV_SET_DATA_SIZE_MAX]; + +} bleio_broadcaster_obj_t; + +#endif // MICROPY_INCLUDED_COMMON_HAL_BLEIO_BROADCASTER_H diff --git a/ports/nrf/common-hal/bleio/Characteristic.c b/ports/nrf/common-hal/bleio/Characteristic.c index 246c35005..c9088c2ab 100644 --- a/ports/nrf/common-hal/bleio/Characteristic.c +++ b/ports/nrf/common-hal/bleio/Characteristic.c @@ -30,16 +30,71 @@ #include "ble_drv.h" #include "ble_gatts.h" #include "nrf_soc.h" -#include "py/nlr.h" + +#include "py/runtime.h" +#include "common-hal/bleio/__init__.h" +#include "common-hal/bleio/Characteristic.h" #include "shared-module/bleio/Characteristic.h" -static volatile bleio_characteristic_obj_t *m_read_characteristic; -static volatile uint8_t m_tx_in_progress; -static nrf_mutex_t *m_write_mutex; +STATIC volatile bleio_characteristic_obj_t *m_read_characteristic; +STATIC volatile uint8_t m_tx_in_progress; +// Serialize gattc writes that send a response. This might be done per object? +STATIC nrf_mutex_t *m_write_mutex; + +STATIC uint16_t get_cccd(bleio_characteristic_obj_t *characteristic) { + const uint16_t conn_handle = common_hal_bleio_device_get_conn_handle(characteristic->service->device); + uint16_t cccd; + ble_gatts_value_t value = { + .p_value = (uint8_t*) &cccd, + .len = 2, + }; + + const uint32_t err_code = sd_ble_gatts_value_get(conn_handle, characteristic->cccd_handle, &value); + + + if (err_code == BLE_ERROR_GATTS_SYS_ATTR_MISSING) { + // CCCD is not set, so say that neither Notify nor Indicate is enabled. + cccd = 0; + } else if (err_code != NRF_SUCCESS) { + mp_raise_OSError_msg_varg(translate("Failed to read CCCD value, err 0x%04x"), err_code); + } + + return cccd; +} + +STATIC void gatts_read(bleio_characteristic_obj_t *characteristic) { + // This might be BLE_CONN_HANDLE_INVALID if we're not conected, but that's OK, because + // we can still read and write the local value. + const uint16_t conn_handle = common_hal_bleio_device_get_conn_handle(characteristic->service->device); + + mp_buffer_info_t bufinfo; + ble_gatts_value_t gatts_value = { + .p_value = NULL, + .len = 0, + }; + + // Read once to find out what size buffer we need, then read again to fill buffer. + + uint32_t err_code = sd_ble_gatts_value_get(conn_handle, characteristic->handle, &gatts_value); + if (err_code == NRF_SUCCESS) { + characteristic->value_data = mp_obj_new_bytearray_of_zeros(gatts_value.len); + mp_get_buffer_raise(characteristic->value_data, &bufinfo, MP_BUFFER_WRITE); + gatts_value.p_value = bufinfo.buf; + + // Read again, with the correct size of buffer. + err_code = sd_ble_gatts_value_get(conn_handle, characteristic->handle, &gatts_value); + } + + if (err_code != NRF_SUCCESS) { + mp_raise_OSError_msg_varg(translate("Failed to read gatts value, err 0x%04x"), err_code); + } +} + STATIC void gatts_write(bleio_characteristic_obj_t *characteristic, mp_buffer_info_t *bufinfo) { - bleio_device_obj_t *device = characteristic->service->device; - const uint16_t conn_handle = device->conn_handle; + // This might be BLE_CONN_HANDLE_INVALID if we're not conected, but that's OK, because + // we can still read and write the local value. + const uint16_t conn_handle = common_hal_bleio_device_get_conn_handle(characteristic->service->device); ble_gatts_value_t gatts_value = { .p_value = bufinfo->buf, @@ -48,18 +103,17 @@ STATIC void gatts_write(bleio_characteristic_obj_t *characteristic, mp_buffer_in const uint32_t err_code = sd_ble_gatts_value_set(conn_handle, characteristic->handle, &gatts_value); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to write gatts value, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg_varg(translate("Failed to write gatts value, err 0x%04x"), err_code); } } -STATIC void gatts_notify(bleio_characteristic_obj_t *characteristic, mp_buffer_info_t *bufinfo) { - bleio_device_obj_t *device = characteristic->service->device; +STATIC void gatts_notify_indicate(bleio_characteristic_obj_t *characteristic, mp_buffer_info_t *bufinfo, uint16_t hvx_type) { uint16_t hvx_len = bufinfo->len; ble_gatts_hvx_params_t hvx_params = { .handle = characteristic->handle, - .type = BLE_GATT_HVX_NOTIFICATION, + .type = hvx_type, + .offset = 0, .p_len = &hvx_len, .p_data = bufinfo->buf, }; @@ -70,27 +124,27 @@ STATIC void gatts_notify(bleio_characteristic_obj_t *characteristic, mp_buffer_i #endif } - const uint32_t err_code = sd_ble_gatts_hvx(device->conn_handle, &hvx_params); + const uint16_t conn_handle = common_hal_bleio_device_get_conn_handle(characteristic->service->device); + m_tx_in_progress++; + const uint32_t err_code = sd_ble_gatts_hvx(conn_handle, &hvx_params); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to notify attribute value, status: 0x%08lX"), err_code)); + m_tx_in_progress--; + mp_raise_OSError_msg_varg(translate("Failed to notify or indicate attribute value, err 0x%04x"), err_code); } - m_tx_in_progress += 1; } STATIC void gattc_read(bleio_characteristic_obj_t *characteristic) { - bleio_service_obj_t *service = characteristic->service; - bleio_device_obj_t *device = service->device; + const uint16_t conn_handle = common_hal_bleio_device_get_conn_handle(characteristic->service->device); m_read_characteristic = characteristic; - const uint32_t err_code = sd_ble_gattc_read(device->conn_handle, characteristic->handle, 0); + const uint32_t err_code = sd_ble_gattc_read(conn_handle, characteristic->handle, 0); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to read attribute value, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg_varg(translate("Failed to read attribute value, err 0x%04x"), err_code); } +// while (m_read_characteristic != NULL) { #ifdef MICROPY_VM_HOOK_LOOP MICROPY_VM_HOOK_LOOP @@ -99,7 +153,7 @@ STATIC void gattc_read(bleio_characteristic_obj_t *characteristic) { } STATIC void gattc_write(bleio_characteristic_obj_t *characteristic, mp_buffer_info_t *bufinfo) { - bleio_device_obj_t *device = characteristic->service->device; + const uint16_t conn_handle = common_hal_bleio_device_get_conn_handle(characteristic->service->device); uint32_t err_code; ble_gattc_write_params_t write_params = { @@ -110,20 +164,18 @@ STATIC void gattc_write(bleio_characteristic_obj_t *characteristic, mp_buffer_in .len = bufinfo->len, }; - if (characteristic->props.write_wo_resp) { + if (characteristic->props.write_no_response) { write_params.write_op = BLE_GATT_OP_WRITE_CMD; err_code = sd_mutex_acquire(m_write_mutex); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to acquire mutex, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg_varg(translate("Failed to acquire mutex, err 0x%04x"), err_code); } } - err_code = sd_ble_gattc_write(device->conn_handle, &write_params); + err_code = sd_ble_gattc_write(conn_handle, &write_params); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to write attribute value, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg_varg(translate("Failed to write attribute value, err 0x%04x"), err_code); } while (sd_mutex_acquire(m_write_mutex) == NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN) { @@ -134,58 +186,102 @@ STATIC void gattc_write(bleio_characteristic_obj_t *characteristic, mp_buffer_in err_code = sd_mutex_release(m_write_mutex); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to release mutex, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg_varg(translate("Failed to release mutex, err 0x%04x"), err_code); } } -STATIC void on_ble_evt(ble_evt_t *ble_evt, void *param) { +STATIC void characteristic_on_ble_evt(ble_evt_t *ble_evt, void *param) { switch (ble_evt->header.evt_id) { -#if (BLE_API_VERSION == 4) - case BLE_GATTS_EVT_HVN_TX_COMPLETE: - m_tx_in_progress -= ble_evt->evt.gatts_evt.params.hvn_tx_complete.count; - break; -#else - case BLE_EVT_TX_COMPLETE: - m_tx_in_progress -= ble_evt->evt.common_evt.params.tx_complete.count; - break; -#endif - - case BLE_GATTC_EVT_READ_RSP: - { - ble_gattc_evt_read_rsp_t *response = &ble_evt->evt.gattc_evt.params.read_rsp; - m_read_characteristic->value_data = mp_obj_new_bytearray(response->len, response->data); - m_read_characteristic = NULL; - break; + case BLE_GATTS_EVT_HVN_TX_COMPLETE: + { + uint8_t count = ble_evt->evt.gatts_evt.params.hvn_tx_complete.count; + // Don't underflow the count. + if (count >= m_tx_in_progress) { + m_tx_in_progress = 0; + } else { + m_tx_in_progress -= count; } + break; + } - case BLE_GATTC_EVT_WRITE_RSP: - sd_mutex_release(m_write_mutex); -// m_write_done = true; - break; + case BLE_GATTC_EVT_READ_RSP: + { + ble_gattc_evt_read_rsp_t *response = &ble_evt->evt.gattc_evt.params.read_rsp; + m_read_characteristic->value_data = mp_obj_new_bytearray(response->len, response->data); + // Flag to busy-wait loop that we've read the characteristic. + m_read_characteristic = NULL; + break; } + + case BLE_GATTC_EVT_WRITE_RSP: + // Someone else can write now. + sd_mutex_release(m_write_mutex); + break; + + // For debugging. + default: + // mp_printf(&mp_plat_print, "Unhandled characteristic event: 0x%04x\n", ble_evt->header.evt_id); + break; + } + } -void common_hal_bleio_characteristic_construct(bleio_characteristic_obj_t *self) { - ble_drv_add_event_handler(on_ble_evt, NULL); +void common_hal_bleio_characteristic_construct(bleio_characteristic_obj_t *self, bleio_uuid_obj_t *uuid, bleio_characteristic_properties_t props) { + self->service = NULL; + self->uuid = uuid; + self->value_data = NULL; + self->props = props; + self->handle = BLE_GATT_HANDLE_INVALID; + + ble_drv_add_event_handler(characteristic_on_ble_evt, self); + } -void common_hal_bleio_characteristic_read_value(bleio_characteristic_obj_t *self) { - gattc_read(self); +void common_hal_bleio_characteristic_get_value(bleio_characteristic_obj_t *self) { + switch (common_hal_bleio_device_get_gatt_role(self->service->device)) { + case GATT_ROLE_CLIENT: + gattc_read(self); + break; + + case GATT_ROLE_SERVER: + gatts_read(self); + break; + + default: + mp_raise_RuntimeError(translate("bad GATT role")); + break; + } } -void common_hal_bleio_characteristic_write_value(bleio_characteristic_obj_t *self, mp_buffer_info_t *bufinfo) { - const bleio_device_obj_t *device = self->service->device; +void common_hal_bleio_characteristic_set_value(bleio_characteristic_obj_t *self, mp_buffer_info_t *bufinfo) { + bool sent = false; + uint16_t cccd = 0; - if (device->is_peripheral) { - // TODO: Add indications - if (self->props.notify) { - gatts_notify(self, bufinfo); - } else { + switch (common_hal_bleio_device_get_gatt_role(self->service->device)) { + case GATT_ROLE_SERVER: + if (self->props.notify || self->props.indicate) { + cccd = get_cccd(self); + } + // It's possible that both notify and indicate are set. + if (self->props.notify && (cccd & BLE_GATT_HVX_NOTIFICATION)) { + gatts_notify_indicate(self, bufinfo, BLE_GATT_HVX_NOTIFICATION); + sent = true; + } + if (self->props.indicate && (cccd & BLE_GATT_HVX_INDICATION)) { + gatts_notify_indicate(self, bufinfo, BLE_GATT_HVX_INDICATION); + sent = true; + } + if (!sent) { gatts_write(self, bufinfo); } - } else { + break; + + case GATT_ROLE_CLIENT: gattc_write(self, bufinfo); - } + break; + default: + mp_raise_RuntimeError(translate("bad GATT role")); + break; + } } diff --git a/ports/nrf/common-hal/bleio/Characteristic.h b/ports/nrf/common-hal/bleio/Characteristic.h new file mode 100644 index 000000000..bce1eec1d --- /dev/null +++ b/ports/nrf/common-hal/bleio/Characteristic.h @@ -0,0 +1,46 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Artur Pacholec + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_COMMON_HAL_BLEIO_CHARACTERISTIC_H +#define MICROPY_INCLUDED_COMMON_HAL_BLEIO_CHARACTERISTIC_H + +#include "shared-module/bleio/Characteristic.h" +#include "shared-module/bleio/Service.h" +#include "common-hal/bleio/UUID.h" + +typedef struct { + mp_obj_base_t base; + bleio_service_obj_t *service; + bleio_uuid_obj_t *uuid; + mp_obj_t value_data; + uint16_t handle; + bleio_characteristic_properties_t props; + uint16_t user_desc_handle; + uint16_t cccd_handle; + uint16_t sccd_handle; +} bleio_characteristic_obj_t; + +#endif // MICROPY_INCLUDED_COMMON_HAL_BLEIO_CHARACTERISTIC_H diff --git a/ports/nrf/common-hal/bleio/CharacteristicBuffer.c b/ports/nrf/common-hal/bleio/CharacteristicBuffer.c new file mode 100644 index 000000000..19b3b85ea --- /dev/null +++ b/ports/nrf/common-hal/bleio/CharacteristicBuffer.c @@ -0,0 +1,140 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Dan Halbert for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include <string.h> +#include <stdio.h> + +#include "ble_drv.h" +#include "ble_gatts.h" +#include "nrf_nvic.h" + +#include "lib/utils/interrupt_char.h" +#include "py/runtime.h" +#include "py/stream.h" + +#include "tick.h" + +#include "common-hal/bleio/__init__.h" +#include "common-hal/bleio/CharacteristicBuffer.h" + +STATIC void characteristic_buffer_on_ble_evt(ble_evt_t *ble_evt, void *param) { + bleio_characteristic_buffer_obj_t *self = (bleio_characteristic_buffer_obj_t *) param; + switch (ble_evt->header.evt_id) { + case BLE_GATTS_EVT_WRITE: { + ble_gatts_evt_write_t *evt_write = &ble_evt->evt.gatts_evt.params.write; + // Event handle must match the handle for my characteristic. + if (evt_write->handle == self->characteristic->handle) { + // Push all the data onto the ring buffer. + uint8_t is_nested_critical_region; + sd_nvic_critical_region_enter(&is_nested_critical_region); + for (size_t i = 0; i < evt_write->len; i++) { + ringbuf_put(&self->ringbuf, evt_write->data[i]); + } + sd_nvic_critical_region_exit(is_nested_critical_region); + break; + } + } + } + +} + +// Assumes that timeout and buffer_size have been validated before call. +void common_hal_bleio_characteristic_buffer_construct(bleio_characteristic_buffer_obj_t *self, + bleio_characteristic_obj_t *characteristic, + mp_float_t timeout, + size_t buffer_size) { + + self->characteristic = characteristic; + self->timeout_ms = timeout * 1000; + // This is a macro. + // true means long-lived, so it won't be moved. + ringbuf_alloc(&self->ringbuf, buffer_size, true); + + ble_drv_add_event_handler(characteristic_buffer_on_ble_evt, self); + +} + +int common_hal_bleio_characteristic_buffer_read(bleio_characteristic_buffer_obj_t *self, uint8_t *data, size_t len, int *errcode) { + uint64_t start_ticks = ticks_ms; + + // Wait for all bytes received or timeout + while ( (ringbuf_count(&self->ringbuf) < len) && (ticks_ms - start_ticks < self->timeout_ms) ) { +#ifdef MICROPY_VM_HOOK_LOOP + MICROPY_VM_HOOK_LOOP ; + // Allow user to break out of a timeout with a KeyboardInterrupt. + if ( mp_hal_is_interrupted() ) { + return 0; + } +#endif + } + + // Copy received data. Lock out write interrupt handler while copying. + uint8_t is_nested_critical_region; + sd_nvic_critical_region_enter(&is_nested_critical_region); + + size_t rx_bytes = MIN(ringbuf_count(&self->ringbuf), len); + for ( size_t i = 0; i < rx_bytes; i++ ) { + data[i] = ringbuf_get(&self->ringbuf); + } + + // Writes now OK. + sd_nvic_critical_region_exit(is_nested_critical_region); + + return rx_bytes; +} + +uint32_t common_hal_bleio_characteristic_buffer_rx_characters_available(bleio_characteristic_buffer_obj_t *self) { + uint8_t is_nested_critical_region; + sd_nvic_critical_region_enter(&is_nested_critical_region); + uint16_t count = ringbuf_count(&self->ringbuf); + sd_nvic_critical_region_exit(is_nested_critical_region); + return count; +} + +void common_hal_bleio_characteristic_buffer_clear_rx_buffer(bleio_characteristic_buffer_obj_t *self) { + // prevent conflict with uart irq + uint8_t is_nested_critical_region; + sd_nvic_critical_region_enter(&is_nested_critical_region); + ringbuf_clear(&self->ringbuf); + sd_nvic_critical_region_exit(is_nested_critical_region); +} + +bool common_hal_bleio_characteristic_buffer_deinited(bleio_characteristic_buffer_obj_t *self) { + return self->characteristic == NULL; +} + +void common_hal_bleio_characteristic_buffer_deinit(bleio_characteristic_buffer_obj_t *self) { + if (!common_hal_bleio_characteristic_buffer_deinited(self)) { + ble_drv_remove_event_handler(characteristic_buffer_on_ble_evt, self); + } +} + +bool common_hal_bleio_characteristic_buffer_connected(bleio_characteristic_buffer_obj_t *self) { + return self->characteristic != NULL && + self->characteristic->service != NULL && + self->characteristic->service->device != NULL && + common_hal_bleio_device_get_conn_handle(self->characteristic->service->device) != BLE_CONN_HANDLE_INVALID; +} diff --git a/ports/nrf/common-hal/bleio/CharacteristicBuffer.h b/ports/nrf/common-hal/bleio/CharacteristicBuffer.h new file mode 100644 index 000000000..b36f63fec --- /dev/null +++ b/ports/nrf/common-hal/bleio/CharacteristicBuffer.h @@ -0,0 +1,43 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Artur Pacholec + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_COMMON_HAL_BLEIO_CHARACTERISTICBUFFER_H +#define MICROPY_INCLUDED_COMMON_HAL_BLEIO_CHARACTERISTICBUFFER_H + +#include "nrf_soc.h" + +#include "py/ringbuf.h" +#include "shared-bindings/bleio/Characteristic.h" + +typedef struct { + mp_obj_base_t base; + bleio_characteristic_obj_t *characteristic; + uint32_t timeout_ms; + // Ring buffer storing consecutive incoming values. + ringbuf_t ringbuf; +} bleio_characteristic_buffer_obj_t; + +#endif // MICROPY_INCLUDED_COMMON_HAL_BLEIO_CHARACTERISTICBUFFER_H diff --git a/ports/nrf/common-hal/bleio/Descriptor.c b/ports/nrf/common-hal/bleio/Descriptor.c index 9b61345fa..8282be8f2 100644 --- a/ports/nrf/common-hal/bleio/Descriptor.c +++ b/ports/nrf/common-hal/bleio/Descriptor.c @@ -26,20 +26,17 @@ */ #include "common-hal/bleio/Descriptor.h" +#include "shared-bindings/bleio/UUID.h" void common_hal_bleio_descriptor_construct(bleio_descriptor_obj_t *self, bleio_uuid_obj_t *uuid) { + // TODO: set handle ??? self->uuid = uuid; } -void common_hal_bleio_descriptor_print(bleio_descriptor_obj_t *self, const mp_print_t *print) { - mp_printf(print, "Descriptor(uuid: 0x" HEX2_FMT HEX2_FMT ")", - self->uuid->value[1], self->uuid->value[0]); -} - mp_int_t common_hal_bleio_descriptor_get_handle(bleio_descriptor_obj_t *self) { return self->handle; } -mp_int_t common_hal_bleio_descriptor_get_uuid(bleio_descriptor_obj_t *self) { - return self->uuid->value[0] | (self->uuid->value[1] << 8); +mp_obj_t common_hal_bleio_descriptor_get_uuid(bleio_descriptor_obj_t *self) { + return MP_OBJ_FROM_PTR(self->uuid); } diff --git a/ports/nrf/common-hal/bleio/Device.c b/ports/nrf/common-hal/bleio/Device.c index 2c000ae2e..5f625829e 100644 --- a/ports/nrf/common-hal/bleio/Device.c +++ b/ports/nrf/common-hal/bleio/Device.c @@ -77,8 +77,7 @@ STATIC uint32_t set_advertisement_data(bleio_device_obj_t *device, bool connecta #define ADD_FIELD(field, len) \ do { \ if (byte_pos + (len) > BLE_GAP_ADV_MAX_SIZE) { \ - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, \ - translate("Can not fit data into the advertisment packet"))); \ + mp_raise_ValueError(translate("Data too large for the advertisement packet")); \ } \ adv_data[byte_pos] = (field); \ byte_pos += (len); \ @@ -110,8 +109,7 @@ STATIC uint32_t set_advertisement_data(bleio_device_obj_t *device, bool connecta ADD_FIELD(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE, BLE_AD_TYPE_FLAGS_DATA_SIZE); } else { if (byte_pos + raw_data->len > BLE_GAP_ADV_MAX_SIZE) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Can not fit data into the advertisment packet"))); + mp_raise_ValueError(translate("Data too large for the advertisement packet")); } memcpy(&adv_data[byte_pos], raw_data->buf, raw_data->len); @@ -130,12 +128,13 @@ STATIC uint32_t set_advertisement_data(bleio_device_obj_t *device, bool connecta continue; } - if (service->uuid->type == UUID_TYPE_16BIT) { + switch (common_hal_bleio_uuid_get_size(service->uuid)) { + case 16: has_16bit_services = true; - } - - if (service->uuid->type == UUID_TYPE_128BIT) { + break; + case 128: has_128bit_services = true; + break; } } @@ -152,13 +151,12 @@ STATIC uint32_t set_advertisement_data(bleio_device_obj_t *device, bool connecta const bleio_service_obj_t *service = MP_OBJ_TO_PTR(service_list->items[i]); uint8_t encoded_size = 0; - if ((service->uuid->type != UUID_TYPE_16BIT) || service->is_secondary) { + if (common_hal_bleio_uuid_get_size(service->uuid) != 16 || service->is_secondary) { continue; } ble_uuid_t uuid; - uuid.type = BLE_UUID_TYPE_BLE; - uuid.uuid = service->uuid->value[0] | (service->uuid->value[1] << 8); + bleio_uuid_convert_to_nrf_ble_uuid(service->uuid, &uuid); err_code = sd_ble_uuid_encode(&uuid, &encoded_size, &adv_data[byte_pos]); if (err_code != NRF_SUCCESS) { @@ -185,13 +183,12 @@ STATIC uint32_t set_advertisement_data(bleio_device_obj_t *device, bool connecta const bleio_service_obj_t *service = MP_OBJ_TO_PTR(service_list->items[i]); uint8_t encoded_size = 0; - if ((service->uuid->type != UUID_TYPE_128BIT) || service->is_secondary) { + if (common_hal_bleio_uuid_get_size(service->uuid) != 16 || service->is_secondary) { continue; } ble_uuid_t uuid; - uuid.type = service->uuid->uuid_vs_idx; - uuid.uuid = service->uuid->value[0] | (service->uuid->value[1] << 8); + bleio_uuid_convert_to_nrf_ble_uuid(service->uuid, &uuid); err_code = sd_ble_uuid_encode(&uuid, &encoded_size, &adv_data[byte_pos]); if (err_code != NRF_SUCCESS) { @@ -262,16 +259,16 @@ STATIC bool discover_services(bleio_device_obj_t *device, uint16_t start_handle) uint32_t err_code = sd_ble_gattc_primary_services_discover(device->conn_handle, start_handle, NULL); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to discover serivices, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg(translate("Failed to discover services")); } + // Serialize discovery. err_code = sd_mutex_acquire(m_discovery_mutex); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to acquire mutex, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg(translate("Failed to acquire mutex")); } + // Wait for someone else to release m_discovery_mutex. while (sd_mutex_acquire(m_discovery_mutex) == NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN) { #ifdef MICROPY_VM_HOOK_LOOP MICROPY_VM_HOOK_LOOP @@ -280,8 +277,7 @@ STATIC bool discover_services(bleio_device_obj_t *device, uint16_t start_handle) err_code = sd_mutex_release(m_discovery_mutex); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to release mutex, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg(translate("Failed to release mutex")); } return m_discovery_successful; @@ -303,8 +299,7 @@ STATIC bool discover_characteristics(bleio_device_obj_t *device, bleio_service_o err_code = sd_mutex_acquire(m_discovery_mutex); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to acquire mutex, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg(translate("Failed to acquire mutex")); } while (sd_mutex_acquire(m_discovery_mutex) == NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN) { @@ -315,8 +310,7 @@ STATIC bool discover_characteristics(bleio_device_obj_t *device, bleio_service_o err_code = sd_mutex_release(m_discovery_mutex); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to release mutex, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg(translate("Failed to release mutex")); } return m_discovery_successful; @@ -324,7 +318,7 @@ STATIC bool discover_characteristics(bleio_device_obj_t *device, bleio_service_o STATIC void on_primary_srv_discovery_rsp(ble_gattc_evt_prim_srvc_disc_rsp_t *response, bleio_device_obj_t *device) { for (size_t i = 0; i < response->count; ++i) { - const ble_gattc_service_t *gattc_service = &response->services[i]; + ble_gattc_service_t *gattc_service = &response->services[i]; bleio_service_obj_t *service = m_new_obj(bleio_service_obj_t); service->base.type = &bleio_service_type; @@ -335,10 +329,7 @@ STATIC void on_primary_srv_discovery_rsp(ble_gattc_evt_prim_srvc_disc_rsp_t *res service->handle = gattc_service->handle_range.start_handle; bleio_uuid_obj_t *uuid = m_new_obj(bleio_uuid_obj_t); - uuid->base.type = &bleio_uuid_type; - uuid->type = (gattc_service->uuid.type == BLE_UUID_TYPE_BLE) ? UUID_TYPE_16BIT : UUID_TYPE_128BIT; - uuid->value[0] = gattc_service->uuid.uuid & 0xFF; - uuid->value[1] = gattc_service->uuid.uuid >> 8; + bleio_uuid_construct_from_nrf_ble_uuid(uuid, &gattc_service->uuid); service->uuid = uuid; mp_obj_list_append(device->service_list, service); @@ -350,23 +341,20 @@ STATIC void on_primary_srv_discovery_rsp(ble_gattc_evt_prim_srvc_disc_rsp_t *res const uint32_t err_code = sd_mutex_release(m_discovery_mutex); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to release mutex, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg(translate("Failed to release mutex")); } } STATIC void on_char_discovery_rsp(ble_gattc_evt_char_disc_rsp_t *response, bleio_device_obj_t *device) { for (size_t i = 0; i < response->count; ++i) { - const ble_gattc_char_t *gattc_char = &response->chars[i]; + ble_gattc_char_t *gattc_char = &response->chars[i]; bleio_characteristic_obj_t *characteristic = m_new_obj(bleio_characteristic_obj_t); characteristic->base.type = &bleio_characteristic_type; bleio_uuid_obj_t *uuid = m_new_obj(bleio_uuid_obj_t); uuid->base.type = &bleio_uuid_type; - uuid->type = (gattc_char->uuid.type == BLE_UUID_TYPE_BLE) ? UUID_TYPE_16BIT : UUID_TYPE_128BIT; - uuid->value[0] = gattc_char->uuid.uuid & 0xFF; - uuid->value[1] = gattc_char->uuid.uuid >> 8; + bleio_uuid_construct_from_nrf_ble_uuid(uuid, &gattc_char->uuid); characteristic->uuid = uuid; characteristic->props.broadcast = gattc_char->char_props.broadcast; @@ -374,7 +362,7 @@ STATIC void on_char_discovery_rsp(ble_gattc_evt_char_disc_rsp_t *response, bleio characteristic->props.notify = gattc_char->char_props.notify; characteristic->props.read = gattc_char->char_props.read; characteristic->props.write = gattc_char->char_props.write; - characteristic->props.write_wo_resp = gattc_char->char_props.write_wo_resp; + characteristic->props.write_no_response = gattc_char->char_props.write_wo_resp; characteristic->handle = gattc_char->handle_value; characteristic->service = m_char_discovery_service; @@ -387,8 +375,7 @@ STATIC void on_char_discovery_rsp(ble_gattc_evt_char_disc_rsp_t *response, bleio const uint32_t err_code = sd_mutex_release(m_discovery_mutex); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to release mutex, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg(translate("Failed to release mutex")); } } @@ -399,8 +386,7 @@ STATIC void on_adv_report(ble_gap_evt_adv_report_t *report, bleio_device_obj_t * #if (BLUETOOTH_SD == 140) err_code = sd_ble_gap_scan_start(NULL, &m_scan_buffer); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to continue scanning, status: 0x%0xlX"), err_code)); + mp_raise_OSError_msg(translate("Failed to continue scanning")); } #endif return; @@ -432,8 +418,7 @@ STATIC void on_adv_report(ble_gap_evt_adv_report_t *report, bleio_device_obj_t * #endif if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to connect, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg(translate("Failed to connect:")); } } @@ -491,14 +476,8 @@ STATIC void on_ble_evt(ble_evt_t *ble_evt, void *device_in) { } void common_hal_bleio_device_add_service(bleio_device_obj_t *device, bleio_service_obj_t *service) { - ble_uuid_t uuid = { - .type = BLE_UUID_TYPE_BLE, - .uuid = service->uuid->value[0] | (service->uuid->value[1] << 8) - }; - - if (service->uuid->type == UUID_TYPE_128BIT) { - uuid.type = service->uuid->uuid_vs_idx; - } + ble_uuid_t uuid; + bleio_uuid_convert_to_nrf_ble_uuid(service->uuid, &uuid); uint8_t service_type = BLE_GATTS_SRVC_TYPE_PRIMARY; if (service->is_secondary) { @@ -509,8 +488,7 @@ void common_hal_bleio_device_add_service(bleio_device_obj_t *device, bleio_servi const uint32_t err_code = sd_ble_gatts_service_add(service_type, &uuid, &service->handle); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to add service, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg(translate("Failed to add service")); } const mp_obj_list_t *char_list = MP_OBJ_TO_PTR(service->char_list); @@ -527,8 +505,7 @@ void common_hal_bleio_device_start_advertising(bleio_device_obj_t *device, bool const uint32_t err_code = set_advertisement_data(device, connectable, raw_data); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to start advertisment, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg(translate("Failed to start advertising")); } } @@ -545,8 +522,7 @@ void common_hal_bleio_device_stop_advertising(bleio_device_obj_t *device) { #endif if ((err_code != NRF_SUCCESS) && (err_code != NRF_ERROR_INVALID_STATE)) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to stop advertisment, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg(translate("Failed to stop advertising")); } } @@ -571,8 +547,7 @@ void common_hal_bleio_device_connect(bleio_device_obj_t *device) { #endif if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to start scanning, status: 0x%0xlX"), err_code)); + mp_raise_OSError_msg(translate("Failed to start scanning")); } while (device->conn_handle == BLE_CONN_HANDLE_INVALID) { @@ -588,8 +563,7 @@ void common_hal_bleio_device_connect(bleio_device_obj_t *device) { err_code = sd_mutex_new(m_discovery_mutex); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to create mutex, status: 0x%0xlX"), err_code)); + mp_raise_OSError_msg(translate("Failed to create mutex")); } } diff --git a/ports/nrf/common-hal/bleio/Peripheral.c b/ports/nrf/common-hal/bleio/Peripheral.c new file mode 100644 index 000000000..0a5a8069d --- /dev/null +++ b/ports/nrf/common-hal/bleio/Peripheral.c @@ -0,0 +1,346 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Artur Pacholec + * Copyright (c) 2018 Dan Halbert for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include <string.h> +#include <stdio.h> + +#include "ble.h" +#include "ble_drv.h" +#include "ble_hci.h" +#include "nrf_soc.h" +#include "py/objstr.h" +#include "py/runtime.h" +#include "shared-bindings/bleio/Adapter.h" +#include "shared-bindings/bleio/Characteristic.h" +#include "shared-bindings/bleio/Peripheral.h" +#include "shared-bindings/bleio/Service.h" +#include "shared-bindings/bleio/UUID.h" + +#define BLE_MIN_CONN_INTERVAL MSEC_TO_UNITS(15, UNIT_0_625_MS) +#define BLE_MAX_CONN_INTERVAL MSEC_TO_UNITS(300, UNIT_0_625_MS) +#define BLE_SLAVE_LATENCY 0 +#define BLE_CONN_SUP_TIMEOUT MSEC_TO_UNITS(4000, UNIT_10_MS) + +#define BLE_ADV_LENGTH_FIELD_SIZE 1 +#define BLE_ADV_AD_TYPE_FIELD_SIZE 1 +#define BLE_AD_TYPE_FLAGS_DATA_SIZE 1 + +static uint8_t m_adv_handle = BLE_GAP_ADV_SET_HANDLE_NOT_SET; + +STATIC void check_data_fit(size_t pos, size_t data_len) { + if (pos + data_len >= BLE_GAP_ADV_SET_DATA_SIZE_MAX) { + mp_raise_ValueError(translate("Data too large for advertisement packet")); + } +} + +STATIC uint32_t add_services_to_advertisement(bleio_peripheral_obj_t *self, size_t* adv_data_pos_p, size_t uuid_len) { + uint32_t uuids_total_size = 0; + const mp_obj_list_t *service_list = MP_OBJ_TO_PTR(self->service_list); + uint32_t err_code = NRF_SUCCESS; + + check_data_fit(*adv_data_pos_p, 1 + 1); + + // Remember where length byte is; fill in later when we know the size. + const size_t length_pos = *adv_data_pos_p; + (*adv_data_pos_p)++; + + self->adv_data[(*adv_data_pos_p)++] = (uuid_len == 16) + ? BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_COMPLETE + : BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_COMPLETE; + + for (size_t i = 0; i < service_list->len; ++i) { + const bleio_service_obj_t *service = MP_OBJ_TO_PTR(service_list->items[i]); + uint8_t encoded_size = 0; + + // Skip services of the wrong length and secondary services. + if (common_hal_bleio_uuid_get_size(service->uuid) != uuid_len || service->is_secondary) { + continue; + } + + ble_uuid_t uuid; + bleio_uuid_convert_to_nrf_ble_uuid(service->uuid, &uuid); + + err_code = sd_ble_uuid_encode(&uuid, &encoded_size, &(self->adv_data[*adv_data_pos_p])); + if (err_code != NRF_SUCCESS) { + return err_code; + } + + check_data_fit(*adv_data_pos_p, encoded_size); + uuids_total_size += encoded_size; + (*adv_data_pos_p) += encoded_size; + } + + self->adv_data[length_pos] = 1 + uuids_total_size; // 1 for the field type. + return err_code; +} + + + +// if raw_data is a zero-length buffer, generate an advertising packet that advertises the +// services passed in when this Peripheral was created. +// If raw_data contains some bytes, use those bytes as the advertising packet. +// TODO: Generate the advertising packet in Python, not here. +STATIC uint32_t set_advertisement_data(bleio_peripheral_obj_t *self, bool connectable, mp_buffer_info_t *raw_data) { + common_hal_bleio_adapter_set_enabled(true); + + size_t adv_data_pos = 0; + uint32_t err_code; + + GET_STR_DATA_LEN(self->name, name_data, name_len); + if (name_len > 0) { + ble_gap_conn_sec_mode_t sec_mode; + BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode); + + // We'll add the name after everything else, shortening it if necessary. + err_code = sd_ble_gap_device_name_set(&sec_mode, name_data, name_len); + if (err_code != NRF_SUCCESS) { + return err_code; + } + } + + if (raw_data->len != 0) { + // User-supplied advertising packet. + check_data_fit(adv_data_pos, raw_data->len); + memcpy(&(self->adv_data[adv_data_pos]), raw_data->buf, raw_data->len); + adv_data_pos += raw_data->len; + } else { + // Build up advertising packet. + check_data_fit(adv_data_pos, 1 + 1 + 1); + self->adv_data[adv_data_pos++] = 2; + self->adv_data[adv_data_pos++] = BLE_GAP_AD_TYPE_FLAGS; + self->adv_data[adv_data_pos++] = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE; + + // The 16-bit ids and 128-bit ids are grouped together by length, so find it whether we have + // 16 and/or 128-bit service UUIDs. + + const mp_obj_list_t *service_list = MP_OBJ_TO_PTR(self->service_list); + if (service_list->len > 0) { + bool has_128bit_services = false; + bool has_16bit_services = false; + + for (size_t i = 0; i < service_list->len; ++i) { + const bleio_service_obj_t *service = MP_OBJ_TO_PTR(service_list->items[i]); + + if (service->is_secondary) { + continue; + } + + switch (common_hal_bleio_uuid_get_size(service->uuid)) { + case 16: + has_16bit_services = true; + break; + case 128: + has_128bit_services = true; + break; + } + } + + // Add 16-bit service UUID's in a group, then 128-bit service UUID's. + + if (has_16bit_services) { + err_code = add_services_to_advertisement(self, &adv_data_pos, 16); + if (err_code != NRF_SUCCESS) { + return err_code; + } + } + + if (has_128bit_services) { + err_code = add_services_to_advertisement(self, &adv_data_pos, 128); + if (err_code != NRF_SUCCESS) { + return err_code; + } + } + } + + // Always include TX power. + check_data_fit(adv_data_pos, 1 + 1 + 1); + self->adv_data[adv_data_pos++] = 1 + 1; + self->adv_data[adv_data_pos++] = BLE_GAP_AD_TYPE_TX_POWER_LEVEL; + self->adv_data[adv_data_pos++] = 0; // TODO - allow power level to be set later. + + // We need room for at least a one-character name. + check_data_fit(adv_data_pos, 1 + 1 + 1); + + // How big a name can we fit? + size_t bytes_left = BLE_GAP_ADV_SET_DATA_SIZE_MAX - adv_data_pos - 1 - 1; + size_t partial_name_len = MIN(bytes_left, name_len); + self->adv_data[adv_data_pos++] = 1 + partial_name_len; + self->adv_data[adv_data_pos++] = (partial_name_len == name_len) + ? BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME + : BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME; + memcpy(&(self->adv_data[adv_data_pos]), name_data, partial_name_len); + adv_data_pos += partial_name_len; + } // end of advertising packet construction + + static ble_gap_adv_params_t m_adv_params = { + .interval = MSEC_TO_UNITS(1000, UNIT_0_625_MS), + .properties.type = BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED, + .duration = BLE_GAP_ADV_TIMEOUT_GENERAL_UNLIMITED, + .filter_policy = BLE_GAP_ADV_FP_ANY, + .primary_phy = BLE_GAP_PHY_1MBPS, + }; + + if (!connectable) { + m_adv_params.properties.type = BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED; + } + + common_hal_bleio_peripheral_stop_advertising(self); + + const ble_gap_adv_data_t ble_gap_adv_data = { + .adv_data.p_data = self->adv_data, + .adv_data.len = adv_data_pos, + }; + + err_code = sd_ble_gap_adv_set_configure(&m_adv_handle, &ble_gap_adv_data, &m_adv_params); + if (err_code != NRF_SUCCESS) { + return err_code; + } + + err_code = sd_ble_gap_adv_start(m_adv_handle, BLE_CONN_CFG_TAG_CUSTOM); + + return err_code; +} + +STATIC void peripheral_on_ble_evt(ble_evt_t *ble_evt, void *self_in) { + bleio_peripheral_obj_t *self = (bleio_peripheral_obj_t*)self_in; + + switch (ble_evt->header.evt_id) { + case BLE_GAP_EVT_CONNECTED: { + // Central has connected. + ble_gap_conn_params_t conn_params; + self->conn_handle = ble_evt->evt.gap_evt.conn_handle; + sd_ble_gap_ppcp_get(&conn_params); + sd_ble_gap_conn_param_update(ble_evt->evt.gap_evt.conn_handle, &conn_params); + break; + } + + case BLE_GAP_EVT_DISCONNECTED: + // Central has disconnected. + self->conn_handle = BLE_CONN_HANDLE_INVALID; + break; + + case BLE_GAP_EVT_PHY_UPDATE_REQUEST: { + ble_gap_phys_t const phys = { + .rx_phys = BLE_GAP_PHY_AUTO, + .tx_phys = BLE_GAP_PHY_AUTO, + }; + sd_ble_gap_phy_update(ble_evt->evt.gap_evt.conn_handle, &phys); + break; + } + + case BLE_GAP_EVT_ADV_SET_TERMINATED: + // Someday may handle timeouts or limit reached. + break; + + case BLE_GAP_EVT_SEC_PARAMS_REQUEST: + sd_ble_gap_sec_params_reply(self->conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL); + break; + + case BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST: { + ble_gap_evt_conn_param_update_request_t *request = &ble_evt->evt.gap_evt.params.conn_param_update_request; + sd_ble_gap_conn_param_update(self->conn_handle, &request->conn_params); + break; + } + + case BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST: + sd_ble_gap_data_length_update(self->conn_handle, NULL, NULL); + break; + + case BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST: { + sd_ble_gatts_exchange_mtu_reply(self->conn_handle, BLE_GATT_ATT_MTU_DEFAULT); + break; + } + + case BLE_GATTS_EVT_SYS_ATTR_MISSING: + sd_ble_gatts_sys_attr_set(self->conn_handle, NULL, 0, 0); + break; + + default: + // For debugging. + // mp_printf(&mp_plat_print, "Unhandled peripheral event: 0x%04x\n", ble_evt->header.evt_id); + break; + } +} + + +void common_hal_bleio_peripheral_construct(bleio_peripheral_obj_t *self) { + common_hal_bleio_adapter_set_enabled(true); // TODO -- Do this somewhere else maybe bleio __init__ + + self->gatt_role = GATT_ROLE_SERVER; + self->conn_handle = BLE_CONN_HANDLE_INVALID; + + // Add all the services. + + mp_obj_list_t *service_list = MP_OBJ_TO_PTR(self->service_list); + for (size_t service_idx = 0; service_idx < service_list->len; ++service_idx) { + bleio_service_obj_t *service = MP_OBJ_TO_PTR(service_list->items[service_idx]); + + ble_uuid_t uuid; + bleio_uuid_convert_to_nrf_ble_uuid(service->uuid, &uuid); + + uint8_t service_type = BLE_GATTS_SRVC_TYPE_PRIMARY; + if (service->is_secondary) { + service_type = BLE_GATTS_SRVC_TYPE_SECONDARY; + } + + const uint32_t err_code = sd_ble_gatts_service_add(service_type, &uuid, &service->handle); + if (err_code != NRF_SUCCESS) { + mp_raise_OSError_msg_varg(translate("Failed to add service, err 0x%04x"), err_code); + } + + // Once the service has been registered, its characteristics can be added. + common_hal_bleio_service_add_all_characteristics(service); + } +} + + +bool common_hal_bleio_peripheral_get_connected(bleio_peripheral_obj_t *self) { + return self->conn_handle != BLE_CONN_HANDLE_INVALID; +} + +void common_hal_bleio_peripheral_start_advertising(bleio_peripheral_obj_t *self, bool connectable, mp_buffer_info_t *raw_data) { + if (connectable) { + ble_drv_add_event_handler(peripheral_on_ble_evt, self); + } + + const uint32_t err_code = set_advertisement_data(self, connectable, raw_data); + if (err_code != NRF_SUCCESS) { + mp_raise_OSError_msg_varg(translate("Failed to start advertising, err 0x%04x"), err_code); + } +} + +void common_hal_bleio_peripheral_stop_advertising(bleio_peripheral_obj_t *self) { + + if (m_adv_handle == BLE_GAP_ADV_SET_HANDLE_NOT_SET) + return; + + const uint32_t err_code = sd_ble_gap_adv_stop(m_adv_handle); + + if ((err_code != NRF_SUCCESS) && (err_code != NRF_ERROR_INVALID_STATE)) { + mp_raise_OSError_msg_varg(translate("Failed to stop advertising, err 0x%04x"), err_code); + } +} diff --git a/ports/nrf/common-hal/bleio/Peripheral.h b/ports/nrf/common-hal/bleio/Peripheral.h new file mode 100644 index 000000000..b255fe9f4 --- /dev/null +++ b/ports/nrf/common-hal/bleio/Peripheral.h @@ -0,0 +1,53 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Artur Pacholec + * Copyright (c) 2018 Dan Halbert for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_COMMON_HAL_BLEIO_PERIPHERAL_H +#define MICROPY_INCLUDED_COMMON_HAL_BLEIO_PERIPHERAL_H + +#include <stdbool.h> + +#include "ble.h" + +#include "shared-module/bleio/__init__.h" +#include "shared-module/bleio/Address.h" + +typedef struct { + mp_obj_base_t base; + mp_obj_t name; + gatt_role_t gatt_role; + volatile uint16_t conn_handle; + mp_obj_t service_list; + mp_obj_t notif_handler; + mp_obj_t conn_handler; + // The advertising data buffer is held by us, not by the SD, so we must + // maintain it and not change it. If we need to change its contents during advertising, + // there are tricks to get the SD to notice (see DevZone - TBS). + uint8_t adv_data[BLE_GAP_ADV_SET_DATA_SIZE_MAX]; + +} bleio_peripheral_obj_t; + +#endif // MICROPY_INCLUDED_COMMON_HAL_BLEIO_PERIPHERAL_H diff --git a/ports/nrf/common-hal/bleio/Scanner.c b/ports/nrf/common-hal/bleio/Scanner.c index e56c1860c..d2e19b5f9 100644 --- a/ports/nrf/common-hal/bleio/Scanner.c +++ b/ports/nrf/common-hal/bleio/Scanner.c @@ -30,7 +30,7 @@ #include "ble_drv.h" #include "ble_gap.h" #include "py/mphal.h" -#include "py/nlr.h" +#include "py/runtime.h" #include "shared-bindings/bleio/Adapter.h" #include "shared-bindings/bleio/ScanEntry.h" #include "shared-bindings/bleio/Scanner.h" @@ -72,8 +72,7 @@ STATIC void on_ble_evt(ble_evt_t *ble_evt, void *scanner_in) { #if (BLUETOOTH_SD == 140) const uint32_t err_code = sd_ble_gap_scan_start(NULL, &m_scan_buffer); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to continue scanning, status: 0x%0xlX"), err_code)); + mp_raise_OSError_msg_varg(translate("Failed to continue scanning, err 0x%04x"), err_code); } #endif } @@ -99,8 +98,7 @@ void common_hal_bleio_scanner_scan(bleio_scanner_obj_t *self, mp_int_t timeout) #endif if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to start scanning, status: 0x%0xlX"), err_code)); + mp_raise_OSError_msg_varg(translate("Failed to start scanning, err 0x%04x"), err_code); } if (timeout > 0) { diff --git a/ports/nrf/common-hal/bleio/Service.c b/ports/nrf/common-hal/bleio/Service.c index c17c16904..26a1f1cff 100644 --- a/ports/nrf/common-hal/bleio/Service.c +++ b/ports/nrf/common-hal/bleio/Service.c @@ -26,65 +26,75 @@ #include "ble_drv.h" #include "ble.h" -#include "py/nlr.h" +#include "py/runtime.h" +#include "common-hal/bleio/__init__.h" +#include "common-hal/bleio/Characteristic.h" #include "shared-bindings/bleio/Service.h" #include "shared-bindings/bleio/Adapter.h" -void common_hal_bleio_service_add_characteristic(bleio_service_obj_t *self, bleio_characteristic_obj_t *characteristic) { - ble_gatts_char_md_t char_md = { - .char_props.broadcast = characteristic->props.broadcast, - .char_props.read = characteristic->props.read, - .char_props.write_wo_resp = characteristic->props.write_wo_resp, - .char_props.write = characteristic->props.write, - .char_props.notify = characteristic->props.notify, - .char_props.indicate = characteristic->props.indicate, - }; +void common_hal_bleio_service_construct(bleio_service_obj_t *self) { +} - ble_gatts_attr_md_t cccd_md = { - .vloc = BLE_GATTS_VLOC_STACK, - }; +// Call this after the Service has been added to the Peripheral. +void common_hal_bleio_service_add_all_characteristics(bleio_service_obj_t *self) { + // Add all the characteristics. + const mp_obj_list_t *char_list = MP_OBJ_TO_PTR(self->char_list); + for (size_t char_idx = 0; char_idx < char_list->len; ++char_idx) { + bleio_characteristic_obj_t *characteristic = char_list->items[char_idx]; - if (char_md.char_props.notify || char_md.char_props.indicate) { - BLE_GAP_CONN_SEC_MODE_SET_OPEN(&cccd_md.read_perm); - BLE_GAP_CONN_SEC_MODE_SET_OPEN(&cccd_md.write_perm); + ble_gatts_char_md_t char_md = { + .char_props.broadcast = characteristic->props.broadcast, + .char_props.read = characteristic->props.read, + .char_props.write_wo_resp = characteristic->props.write_no_response, + .char_props.write = characteristic->props.write, + .char_props.notify = characteristic->props.notify, + .char_props.indicate = characteristic->props.indicate, + }; - char_md.p_cccd_md = &cccd_md; - } + ble_gatts_attr_md_t cccd_md = { + .vloc = BLE_GATTS_VLOC_STACK, + }; - ble_uuid_t uuid = { - .type = BLE_UUID_TYPE_BLE, - .uuid = characteristic->uuid->value[0] | (characteristic->uuid->value[1] << 8), - }; + if (char_md.char_props.notify || char_md.char_props.indicate) { + BLE_GAP_CONN_SEC_MODE_SET_OPEN(&cccd_md.read_perm); + BLE_GAP_CONN_SEC_MODE_SET_OPEN(&cccd_md.write_perm); - if (characteristic->uuid->type == UUID_TYPE_128BIT) - uuid.type = characteristic->uuid->uuid_vs_idx; + char_md.p_cccd_md = &cccd_md; + } - ble_gatts_attr_md_t attr_md = { - .vloc = BLE_GATTS_VLOC_STACK, - .vlen = 1, - }; + ble_uuid_t uuid; + bleio_uuid_convert_to_nrf_ble_uuid(characteristic->uuid, &uuid); - BLE_GAP_CONN_SEC_MODE_SET_OPEN(&attr_md.read_perm); - BLE_GAP_CONN_SEC_MODE_SET_OPEN(&attr_md.write_perm); + ble_gatts_attr_md_t attr_md = { + .vloc = BLE_GATTS_VLOC_STACK, + .vlen = 1, + }; - ble_gatts_attr_t attr_char_value = { - .p_uuid = &uuid, - .p_attr_md = &attr_md, - .init_len = sizeof(uint8_t), - .max_len = (BLE_GATT_ATT_MTU_DEFAULT - 3), - }; + BLE_GAP_CONN_SEC_MODE_SET_OPEN(&attr_md.read_perm); + BLE_GAP_CONN_SEC_MODE_SET_OPEN(&attr_md.write_perm); - ble_gatts_char_handles_t handles; + ble_gatts_attr_t attr_char_value = { + .p_uuid = &uuid, + .p_attr_md = &attr_md, + .init_len = sizeof(uint8_t), + .max_len = GATT_MAX_DATA_LENGTH, + }; - uint32_t err_code; - err_code = sd_ble_gatts_characteristic_add(self->handle, &char_md, &attr_char_value, &handles); - if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to add characteristic, status: 0x%08lX"), err_code)); - } + ble_gatts_char_handles_t handles; - characteristic->user_desc_handle = handles.user_desc_handle; - characteristic->cccd_handle = handles.cccd_handle; - characteristic->sccd_handle = handles.sccd_handle; - characteristic->handle = handles.value_handle; + uint32_t err_code; + err_code = sd_ble_gatts_characteristic_add(self->handle, &char_md, &attr_char_value, &handles); + if (err_code != NRF_SUCCESS) { + mp_raise_OSError_msg_varg(translate("Failed to add characteristic, err 0x%04x"), err_code); + } + + if (characteristic->handle != BLE_GATT_HANDLE_INVALID) { + mp_raise_ValueError(translate("Characteristic already in use by another Service.")); + } + + characteristic->user_desc_handle = handles.user_desc_handle; + characteristic->cccd_handle = handles.cccd_handle; + characteristic->sccd_handle = handles.sccd_handle; + characteristic->handle = handles.value_handle; + } } diff --git a/ports/nrf/common-hal/bleio/UUID.c b/ports/nrf/common-hal/bleio/UUID.c index 9a2e101ea..23e643433 100644 --- a/ports/nrf/common-hal/bleio/UUID.c +++ b/ports/nrf/common-hal/bleio/UUID.c @@ -25,100 +25,74 @@ * THE SOFTWARE. */ -#include "ble.h" -#include "ble_drv.h" -#include "common-hal/bleio/UUID.h" -#include "nrf_error.h" -#include "py/objstr.h" +#include <string.h> + #include "py/runtime.h" +#include "common-hal/bleio/UUID.h" #include "shared-bindings/bleio/Adapter.h" -#include "shared-bindings/bleio/UUID.h" -#define UUID_STR_16BIT_LEN 6 -#define UUID_STR_128BIT_LEN 36 +#include "ble.h" +#include "ble_drv.h" +#include "nrf_error.h" -static uint8_t xdigit_8b_value(byte nibble1, byte nibble2) { - return unichar_xdigit_value(nibble1) | - (unichar_xdigit_value(nibble2) << 4); -} +// If uuid128 is NULL, this is a Bluetooth SIG 16-bit UUID. +// If uuid128 is not NULL, it's a 128-bit (16-byte) UUID, with bytes 12 and 13 zero'd out, where +// the 16-bit part goes. Those 16 bits are passed in uuid16. +void common_hal_bleio_uuid_construct(bleio_uuid_obj_t *self, uint32_t uuid16, uint8_t uuid128[]) { + common_hal_bleio_adapter_set_enabled(true); -void common_hal_bleio_uuid_construct(bleio_uuid_obj_t *self, const mp_obj_t *uuid) { - if (MP_OBJ_IS_INT(*uuid)) { - self->type = UUID_TYPE_16BIT; + self->nrf_ble_uuid.uuid = uuid16; + if (uuid128 == NULL) { + self->nrf_ble_uuid.type = BLE_UUID_TYPE_BLE; + } else { + ble_uuid128_t vs_uuid; + memcpy(vs_uuid.uuid128, uuid128, sizeof(vs_uuid.uuid128)); - self->value[1] = (mp_obj_get_int(*uuid) >> 8) & 0xFF; - self->value[0] = (mp_obj_get_int(*uuid) >> 0) & 0xFF; - return; + // Register this vendor-specific UUID. Bytes 12 and 13 will be zero. + const uint32_t err_code = sd_ble_uuid_vs_add(&vs_uuid, &self->nrf_ble_uuid.type); + if (err_code != NRF_SUCCESS) { + mp_raise_OSError_msg_varg(translate("Failed to register Vendor-Specific UUID, err 0x%04x"), err_code); + } } +} - if (MP_OBJ_IS_STR(*uuid)) { - GET_STR_DATA_LEN(*uuid, str_data, str_len); - - if (str_len == UUID_STR_16BIT_LEN) { - self->type = UUID_TYPE_16BIT; - - self->value[0] = xdigit_8b_value(str_data[5], str_data[4]); - self->value[1] = xdigit_8b_value(str_data[3], str_data[2]); - } else if (str_len == UUID_STR_128BIT_LEN) { - self->type = UUID_TYPE_128BIT; - - ble_uuid128_t vs_uuid; - vs_uuid.uuid128[0] = xdigit_8b_value(str_data[35], str_data[34]); - vs_uuid.uuid128[1] = xdigit_8b_value(str_data[33], str_data[32]); - vs_uuid.uuid128[2] = xdigit_8b_value(str_data[31], str_data[30]); - vs_uuid.uuid128[3] = xdigit_8b_value(str_data[29], str_data[28]); - vs_uuid.uuid128[4] = xdigit_8b_value(str_data[27], str_data[26]); - vs_uuid.uuid128[5] = xdigit_8b_value(str_data[25], str_data[24]); - - // 23 '-' - vs_uuid.uuid128[6] = xdigit_8b_value(str_data[22], str_data[21]); - vs_uuid.uuid128[7] = xdigit_8b_value(str_data[20], str_data[19]); - - // 18 '-' - vs_uuid.uuid128[8] = xdigit_8b_value(str_data[17], str_data[16]); - vs_uuid.uuid128[9] = xdigit_8b_value(str_data[15], str_data[14]); - - // 13 '-' - vs_uuid.uuid128[10] = xdigit_8b_value(str_data[12], str_data[11]); - vs_uuid.uuid128[11] = xdigit_8b_value(str_data[10], str_data[9]); - - // 8 '-' - self->value[0] = xdigit_8b_value(str_data[7], str_data[6]); - self->value[1] = xdigit_8b_value(str_data[5], str_data[4]); - - vs_uuid.uuid128[14] = xdigit_8b_value(str_data[3], str_data[2]); - vs_uuid.uuid128[15] = xdigit_8b_value(str_data[1], str_data[0]); - - common_hal_bleio_adapter_set_enabled(true); +uint32_t common_hal_bleio_uuid_get_size(bleio_uuid_obj_t *self) { + return self->nrf_ble_uuid.type == BLE_UUID_TYPE_BLE ? 16 : 128; +} - const uint32_t err_code = sd_ble_uuid_vs_add(&vs_uuid, &self->uuid_vs_idx); - if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to add Vendor Specific UUID, status: 0x%08lX"), err_code)); - } +uint32_t common_hal_bleio_uuid_get_uuid16(bleio_uuid_obj_t *self) { + return self->nrf_ble_uuid.uuid; +} - } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, - translate("Invalid UUID string length"))); - } +// True if uuid128 has been successfully filled in. +bool common_hal_bleio_uuid_get_uuid128(bleio_uuid_obj_t *self, uint8_t uuid128[16]) { + uint8_t length; + const uint32_t err_code = sd_ble_uuid_encode(&self->nrf_ble_uuid, &length, uuid128); - return; + if (err_code != NRF_SUCCESS) { + mp_raise_OSError_msg_varg(translate("Could not decode ble_uuid, err 0x%04x"), err_code); } + // If not 16 bytes, this is not a 128-bit UUID, so return. + return length == 16; +} - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, - translate("Invalid UUID parameter"))); +// Returns 0 if this is a 16-bit UUID, otherwise returns a non-zero index +// into the 128-bit uuid registration table. +uint32_t common_hal_bleio_uuid_get_uuid128_reference(bleio_uuid_obj_t *self) { + return self->nrf_ble_uuid.type == BLE_UUID_TYPE_BLE ? 0 : self->nrf_ble_uuid.type; } -void common_hal_bleio_uuid_print(bleio_uuid_obj_t *self, const mp_print_t *print) { - if (self->type == UUID_TYPE_16BIT) { - mp_printf(print, "UUID(uuid: 0x" HEX2_FMT HEX2_FMT ")", - self->value[1], self->value[0]); - } else { - mp_printf(print, "UUID(uuid: 0x" HEX2_FMT HEX2_FMT ", VS idx: " HEX2_FMT ")", - self->value[1], self->value[0], self->uuid_vs_idx); + +void bleio_uuid_construct_from_nrf_ble_uuid(bleio_uuid_obj_t *self, ble_uuid_t *nrf_ble_uuid) { + if (nrf_ble_uuid->type == BLE_UUID_TYPE_UNKNOWN) { + mp_raise_RuntimeError(translate("Unexpected nrfx uuid type")); } + self->nrf_ble_uuid.uuid = nrf_ble_uuid->uuid; + self->nrf_ble_uuid.type = nrf_ble_uuid->type; } -bleio_uuid_type_t common_hal_bleio_uuid_get_type(bleio_uuid_obj_t *self) { - return self->type; +// Fill in a ble_uuid_t from my values. +void bleio_uuid_convert_to_nrf_ble_uuid(bleio_uuid_obj_t *self, ble_uuid_t *nrf_ble_uuid) { + nrf_ble_uuid->uuid = self->nrf_ble_uuid.uuid; + nrf_ble_uuid->type = self->nrf_ble_uuid.type; } diff --git a/ports/nrf/common-hal/bleio/UUID.h b/ports/nrf/common-hal/bleio/UUID.h index cb0fddcfd..b464093ea 100644 --- a/ports/nrf/common-hal/bleio/UUID.h +++ b/ports/nrf/common-hal/bleio/UUID.h @@ -28,13 +28,21 @@ #ifndef MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_UUID_H #define MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_UUID_H -#include "shared-bindings/bleio/UUIDType.h" +#include "py/obj.h" + +#include "ble.h" typedef struct { mp_obj_base_t base; - bleio_uuid_type_t type; - uint8_t uuid_vs_idx; - uint8_t value[2]; + // Use the native way of storing UUID's: + // - ble_uuid_t.uuid is a 16-bit uuid. + // - ble_uuid_t.type is BLE_UUID_TYPE_BLE if it's a 16-bit Bluetooth SIG UUID. + // or is BLE_UUID_TYPE_VENDOR_BEGIN and higher, which indexes into a table of registered + // 128-bit UUIDs. + ble_uuid_t nrf_ble_uuid; } bleio_uuid_obj_t; +void bleio_uuid_construct_from_nrf_ble_uuid(bleio_uuid_obj_t *self, ble_uuid_t *nrf_uuid); +void bleio_uuid_convert_to_nrf_ble_uuid(bleio_uuid_obj_t *self, ble_uuid_t *nrf_uuid); + #endif // MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_UUID_H diff --git a/ports/nrf/common-hal/bleio/__init__.c b/ports/nrf/common-hal/bleio/__init__.c index 0cc1b7152..cfb701019 100644 --- a/ports/nrf/common-hal/bleio/__init__.c +++ b/ports/nrf/common-hal/bleio/__init__.c @@ -27,6 +27,15 @@ #include "shared-bindings/bleio/__init__.h" #include "shared-bindings/bleio/Adapter.h" +#include "shared-bindings/bleio/Peripheral.h" +#include "common-hal/bleio/__init__.h" + +// Turn off BLE on a reset or reload. +void bleio_reset() { + if (common_hal_bleio_adapter_get_enabled()) { + common_hal_bleio_adapter_set_enabled(false); + } +} // The singleton bleio.Adapter object, bound to bleio.adapter // It currently only has properties and no state @@ -35,3 +44,25 @@ const super_adapter_obj_t common_hal_bleio_adapter_obj = { .type = &bleio_adapter_type, }, }; + +gatt_role_t common_hal_bleio_device_get_gatt_role(mp_obj_t device) { + if (MP_OBJ_IS_TYPE(device, &bleio_peripheral_type)) { + return ((bleio_peripheral_obj_t*) MP_OBJ_TO_PTR(device))->gatt_role; +// Does not exist yet. +// } else if (MP_OBJ_IS_TYPE(device, &bleio_central_type)) { +// return ((bleio_central_obj_t*) MP_OBJ_TO_PTR(device))->gatt_role; + } else { + return GATT_ROLE_NONE; + } +} + +uint16_t common_hal_bleio_device_get_conn_handle(mp_obj_t device) { + if (MP_OBJ_IS_TYPE(device, &bleio_peripheral_type)) { + return ((bleio_peripheral_obj_t*) MP_OBJ_TO_PTR(device))->conn_handle; +// Does not exist yet. +// } else if (MP_OBJ_IS_TYPE(device, &bleio_central_type)) { +// return ((bleio_central_obj_t*) MP_OBJ_TO_PTR(device))->conn_handle; + } else { + return 0; + } +} diff --git a/ports/nrf/common-hal/bleio/__init__.h b/ports/nrf/common-hal/bleio/__init__.h new file mode 100644 index 000000000..9e044f37c --- /dev/null +++ b/ports/nrf/common-hal/bleio/__init__.h @@ -0,0 +1,42 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Dan Halbert for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_COMMON_HAL_BLEIO_INIT_H +#define MICROPY_INCLUDED_COMMON_HAL_BLEIO_INIT_H + +#include "shared-bindings/bleio/__init__.h" +#include "shared-bindings/bleio/Adapter.h" + +#include "shared-module/bleio/__init__.h" + +// We assume variable length data. +// 20 bytes max (23 - 3). +#define GATT_MAX_DATA_LENGTH (BLE_GATT_ATT_MTU_DEFAULT - 3) + +gatt_role_t common_hal_bleio_device_get_gatt_role(mp_obj_t device); +uint16_t common_hal_bleio_device_get_conn_handle(mp_obj_t device); + +#endif // MICROPY_INCLUDED_COMMON_HAL_BLEIO_INIT_H diff --git a/ports/nrf/common-hal/board/__init__.c b/ports/nrf/common-hal/board/__init__.c index 350f2eea5..880033ed6 100644 --- a/ports/nrf/common-hal/board/__init__.c +++ b/ports/nrf/common-hal/board/__init__.c @@ -23,6 +23,3 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ - -// Pins aren't actually defined here. They are in the board specific directory -// such as boards/feather_nrf52832/pins.csv diff --git a/ports/nrf/common-hal/busio/UART.c b/ports/nrf/common-hal/busio/UART.c index 912956369..593914afc 100644 --- a/ports/nrf/common-hal/busio/UART.c +++ b/ports/nrf/common-hal/busio/UART.c @@ -39,8 +39,6 @@ #include "nrfx_uarte.h" #include <string.h> -#ifdef NRF52840_XXAA - // expression to examine, and return value in case of failing #define _VERIFY_ERR(_exp) \ do {\ @@ -50,33 +48,48 @@ }\ }while(0) -static uint32_t get_nrf_baud (uint32_t baudrate); - -static uint16_t ringbuf_count(ringbuf_t *r) -{ - volatile int count = r->iput - r->iget; - if ( count < 0 ) { - count += r->size; - } - - return (uint16_t) count; -} - -static void ringbuf_clear(ringbuf_t *r) -{ - r->iput = r->iget = 0; -} +static nrfx_uarte_t nrfx_uartes[] = { +#if NRFX_CHECK(NRFX_UARTE0_ENABLED) + NRFX_UARTE_INSTANCE(0), +#endif +#if NRFX_CHECK(NRFX_UARTE1_ENABLED) + NRFX_UARTE_INSTANCE(1), +#endif +}; + +static uint32_t get_nrf_baud (uint32_t baudrate) { + + static const struct { + const uint32_t boundary; + nrf_uarte_baudrate_t uarte_baudraute; + } baudrate_map[] = { + { 1200, NRF_UARTE_BAUDRATE_1200 }, + { 2400, NRF_UARTE_BAUDRATE_2400 }, + { 4800, NRF_UARTE_BAUDRATE_4800 }, + { 9600, NRF_UARTE_BAUDRATE_9600 }, + { 14400, NRF_UARTE_BAUDRATE_14400 }, + { 19200, NRF_UARTE_BAUDRATE_19200 }, + { 28800, NRF_UARTE_BAUDRATE_28800 }, + { 38400, NRF_UARTE_BAUDRATE_38400 }, + { 57600, NRF_UARTE_BAUDRATE_57600 }, + { 76800, NRF_UARTE_BAUDRATE_76800 }, + { 115200, NRF_UARTE_BAUDRATE_115200 }, + { 230400, NRF_UARTE_BAUDRATE_230400 }, + { 250000, NRF_UARTE_BAUDRATE_250000 }, + { 460800, NRF_UARTE_BAUDRATE_460800 }, + { 921600, NRF_UARTE_BAUDRATE_921600 }, + { 0, NRF_UARTE_BAUDRATE_1000000 }, + }; -// will overwrite old data -static void ringbuf_put_n(ringbuf_t* r, uint8_t* buf, uint8_t bufsize) -{ - for(uint8_t i=0; i < bufsize; i++) { - if ( ringbuf_put(r, buf[i]) < 0 ) { - // if full overwrite old data - (void) ringbuf_get(r); - ringbuf_put(r, buf[i]); + size_t i = 0; + uint32_t boundary; + do { + boundary = baudrate_map[i].boundary; + if (baudrate <= boundary || boundary == 0) { + return baudrate_map[i].uarte_baudraute; } - } + i++; + } while (true); } static void uart_callback_irq (const nrfx_uarte_event_t * event, void * context) { @@ -87,7 +100,7 @@ static void uart_callback_irq (const nrfx_uarte_event_t * event, void * context) ringbuf_put_n(&self->rbuf, event->data.rxtx.p_data, event->data.rxtx.bytes); // keep receiving - (void) nrfx_uarte_rx(&self->uarte, &self->rx_char, 1); + (void) nrfx_uarte_rx(self->uarte, &self->rx_char, 1); break; case NRFX_UARTE_EVT_TX_DONE: @@ -101,7 +114,7 @@ static void uart_callback_irq (const nrfx_uarte_event_t * event, void * context) ringbuf_put_n(&self->rbuf, event->data.error.rxtx.p_data, event->data.error.rxtx.bytes); // Keep receiving - (void) nrfx_uarte_rx(&self->uarte, &self->rx_char, 1); + (void) nrfx_uarte_rx(self->uarte, &self->rx_char, 1); break; default: @@ -109,11 +122,29 @@ static void uart_callback_irq (const nrfx_uarte_event_t * event, void * context) } } +void uart_reset(void) { + for (size_t i = 0 ; i < MP_ARRAY_SIZE(nrfx_uartes); i++) { + nrf_uarte_disable(nrfx_uartes[i].p_reg); + } +} void common_hal_busio_uart_construct (busio_uart_obj_t *self, const mcu_pin_obj_t * tx, const mcu_pin_obj_t * rx, uint32_t baudrate, uint8_t bits, uart_parity_t parity, uint8_t stop, mp_float_t timeout, uint8_t receiver_buffer_size) { + // Find a free UART peripheral. + self->uarte = NULL; + for (size_t i = 0 ; i < MP_ARRAY_SIZE(nrfx_uartes); i++) { + if ((nrfx_uartes[i].p_reg->ENABLE & UARTE_ENABLE_ENABLE_Msk) == 0) { + self->uarte = &nrfx_uartes[i]; + break; + } + } + + if (self->uarte == NULL) { + mp_raise_ValueError(translate("All UART peripherals are in use")); + } + if ( (tx == mp_const_none) && (rx == mp_const_none) ) { mp_raise_ValueError(translate("tx and rx cannot both be None")); } @@ -138,23 +169,25 @@ void common_hal_busio_uart_construct (busio_uart_obj_t *self, .interrupt_priority = 7 }; - // support only 1 instance for now - self->uarte = (nrfx_uarte_t ) NRFX_UARTE_INSTANCE(0); - nrfx_uarte_uninit(&self->uarte); - _VERIFY_ERR(nrfx_uarte_init(&self->uarte, &config, uart_callback_irq)); + nrfx_uarte_uninit(self->uarte); + _VERIFY_ERR(nrfx_uarte_init(self->uarte, &config, uart_callback_irq)); // Init buffer for rx if ( rx != mp_const_none ) { - self->rbuf.buf = (uint8_t *) gc_alloc(receiver_buffer_size, false, false); + // Initially allocate the UART's buffer in the long-lived part of the + // heap. UARTs are generally long-lived objects, but the "make long- + // lived" machinery is incapable of moving internal pointers like + // self->buffer, so do it manually. (However, as long as internal + // pointers like this are NOT moved, allocating the buffer + // in the long-lived pool is not strictly necessary) + // (This is a macro.) + ringbuf_alloc(&self->rbuf, receiver_buffer_size, true); if ( !self->rbuf.buf ) { - nrfx_uarte_uninit(&self->uarte); + nrfx_uarte_uninit(self->uarte); mp_raise_msg(&mp_type_MemoryError, translate("Failed to allocate RX buffer")); } - self->rbuf.size = receiver_buffer_size; - self->rbuf.iget = self->rbuf.iput = 0; - self->rx_pin_number = rx->number; claim_pin(rx); } @@ -170,7 +203,7 @@ void common_hal_busio_uart_construct (busio_uart_obj_t *self, self->timeout_ms = timeout * 1000; // Initial wait for incoming byte - _VERIFY_ERR(nrfx_uarte_rx(&self->uarte, &self->rx_char, 1)); + _VERIFY_ERR(nrfx_uarte_rx(self->uarte, &self->rx_char, 1)); } bool common_hal_busio_uart_deinited(busio_uart_obj_t *self) { @@ -179,7 +212,7 @@ bool common_hal_busio_uart_deinited(busio_uart_obj_t *self) { void common_hal_busio_uart_deinit(busio_uart_obj_t *self) { if ( !common_hal_busio_uart_deinited(self) ) { - nrfx_uarte_uninit(&self->uarte); + nrfx_uarte_uninit(self->uarte); reset_pin_number(self->tx_pin_number); reset_pin_number(self->rx_pin_number); self->tx_pin_number = NO_PIN; @@ -193,7 +226,7 @@ void common_hal_busio_uart_deinit(busio_uart_obj_t *self) { // Read characters. size_t common_hal_busio_uart_read(busio_uart_obj_t *self, uint8_t *data, size_t len, int *errcode) { - if ( nrf_uarte_rx_pin_get(self->uarte.p_reg) == NRF_UARTE_PSEL_DISCONNECTED ) { + if ( nrf_uarte_rx_pin_get(self->uarte->p_reg) == NRF_UARTE_PSEL_DISCONNECTED ) { mp_raise_ValueError(translate("No RX pin")); } @@ -212,7 +245,7 @@ size_t common_hal_busio_uart_read(busio_uart_obj_t *self, uint8_t *data, size_t } // prevent conflict with uart irq - NVIC_DisableIRQ(nrfx_get_irq_number(self->uarte.p_reg)); + NVIC_DisableIRQ(nrfx_get_irq_number(self->uarte->p_reg)); // copy received data rx_bytes = ringbuf_count(&self->rbuf); @@ -221,14 +254,14 @@ size_t common_hal_busio_uart_read(busio_uart_obj_t *self, uint8_t *data, size_t data[i] = ringbuf_get(&self->rbuf); } - NVIC_EnableIRQ(nrfx_get_irq_number(self->uarte.p_reg)); + NVIC_EnableIRQ(nrfx_get_irq_number(self->uarte->p_reg)); return rx_bytes; } // Write characters. size_t common_hal_busio_uart_write (busio_uart_obj_t *self, const uint8_t *data, size_t len, int *errcode) { - if ( nrf_uarte_tx_pin_get(self->uarte.p_reg) == NRF_UARTE_PSEL_DISCONNECTED ) { + if ( nrf_uarte_tx_pin_get(self->uarte->p_reg) == NRF_UARTE_PSEL_DISCONNECTED ) { mp_raise_ValueError(translate("No TX pin")); } @@ -237,7 +270,7 @@ size_t common_hal_busio_uart_write (busio_uart_obj_t *self, const uint8_t *data, uint64_t start_ticks = ticks_ms; // Wait for on-going transfer to complete - while ( nrfx_uarte_tx_in_progress(&self->uarte) && (ticks_ms - start_ticks < self->timeout_ms) ) { + while ( nrfx_uarte_tx_in_progress(self->uarte) && (ticks_ms - start_ticks < self->timeout_ms) ) { #ifdef MICROPY_VM_HOOK_LOOP MICROPY_VM_HOOK_LOOP #endif @@ -252,15 +285,16 @@ size_t common_hal_busio_uart_write (busio_uart_obj_t *self, const uint8_t *data, // EasyDMA can only access SRAM uint8_t * tx_buf = (uint8_t*) data; if ( !nrfx_is_in_ram(data) ) { + // TODO: If this is not too big, we could allocate it on the stack. tx_buf = (uint8_t *) gc_alloc(len, false, false); memcpy(tx_buf, data, len); } - (*errcode) = nrfx_uarte_tx(&self->uarte, tx_buf, len); + (*errcode) = nrfx_uarte_tx(self->uarte, tx_buf, len); _VERIFY_ERR(*errcode); (*errcode) = 0; - while ( nrfx_uarte_tx_in_progress(&self->uarte) && (ticks_ms - start_ticks < self->timeout_ms) ) { + while ( nrfx_uarte_tx_in_progress(self->uarte) && (ticks_ms - start_ticks < self->timeout_ms) ) { #ifdef MICROPY_VM_HOOK_LOOP MICROPY_VM_HOOK_LOOP #endif @@ -279,7 +313,7 @@ uint32_t common_hal_busio_uart_get_baudrate(busio_uart_obj_t *self) { void common_hal_busio_uart_set_baudrate(busio_uart_obj_t *self, uint32_t baudrate) { self->baudrate = baudrate; - nrf_uarte_baudrate_set(self->uarte.p_reg, get_nrf_baud(baudrate)); + nrf_uarte_baudrate_set(self->uarte->p_reg, get_nrf_baud(baudrate)); } uint32_t common_hal_busio_uart_rx_characters_available(busio_uart_obj_t *self) { @@ -288,116 +322,11 @@ uint32_t common_hal_busio_uart_rx_characters_available(busio_uart_obj_t *self) { void common_hal_busio_uart_clear_rx_buffer(busio_uart_obj_t *self) { // prevent conflict with uart irq - NVIC_DisableIRQ(nrfx_get_irq_number(self->uarte.p_reg)); + NVIC_DisableIRQ(nrfx_get_irq_number(self->uarte->p_reg)); ringbuf_clear(&self->rbuf); - NVIC_EnableIRQ(nrfx_get_irq_number(self->uarte.p_reg)); + NVIC_EnableIRQ(nrfx_get_irq_number(self->uarte->p_reg)); } bool common_hal_busio_uart_ready_to_tx(busio_uart_obj_t *self) { - return !nrfx_uarte_tx_in_progress(&self->uarte); + return !nrfx_uarte_tx_in_progress(self->uarte); } - -static uint32_t get_nrf_baud (uint32_t baudrate) -{ - if ( baudrate <= 1200 ) { - return NRF_UARTE_BAUDRATE_1200; - } - else if ( baudrate <= 2400 ) { - return NRF_UARTE_BAUDRATE_2400; - } - else if ( baudrate <= 4800 ) { - return NRF_UARTE_BAUDRATE_4800; - } - else if ( baudrate <= 9600 ) { - return NRF_UARTE_BAUDRATE_9600; - } - else if ( baudrate <= 14400 ) { - return NRF_UARTE_BAUDRATE_14400; - } - else if ( baudrate <= 19200 ) { - return NRF_UARTE_BAUDRATE_19200; - } - else if ( baudrate <= 28800 ) { - return NRF_UARTE_BAUDRATE_28800; - } - else if ( baudrate <= 38400 ) { - return NRF_UARTE_BAUDRATE_38400; - } - else if ( baudrate <= 57600 ) { - return NRF_UARTE_BAUDRATE_57600; - } - else if ( baudrate <= 76800 ) { - return NRF_UARTE_BAUDRATE_76800; - } - else if ( baudrate <= 115200 ) { - return NRF_UARTE_BAUDRATE_115200; - } - else if ( baudrate <= 230400 ) { - return NRF_UARTE_BAUDRATE_230400; - } - else if ( baudrate <= 250000 ) { - return NRF_UARTE_BAUDRATE_250000; - } - else if ( baudrate <= 460800 ) { - return NRF_UARTE_BAUDRATE_460800; - } - else if ( baudrate <= 921600 ) { - return NRF_UARTE_BAUDRATE_921600; - } - else { - return NRF_UARTE_BAUDRATE_1000000; - } -} - -#else - -void common_hal_busio_uart_construct (busio_uart_obj_t *self, - const mcu_pin_obj_t * tx, const mcu_pin_obj_t * rx, uint32_t baudrate, - uint8_t bits, uart_parity_t parity, uint8_t stop, float timeout, - uint8_t receiver_buffer_size) { - mp_raise_NotImplementedError(translate("busio.UART not available")); -} - -bool common_hal_busio_uart_deinited (busio_uart_obj_t *self) { - mp_raise_NotImplementedError(translate("busio.UART not available")); - return true; -} - -void common_hal_busio_uart_deinit (busio_uart_obj_t *self) { - mp_raise_NotImplementedError(translate("busio.UART not available")); -} - -// Read characters. -size_t common_hal_busio_uart_read (busio_uart_obj_t *self, uint8_t *data, size_t len, int *errcode) { - mp_raise_NotImplementedError(translate("busio.UART not available")); - return 0; -} - -// Write characters. -size_t common_hal_busio_uart_write (busio_uart_obj_t *self, const uint8_t *data, size_t len, int *errcode) { - mp_raise_NotImplementedError(translate("busio.UART not available")); - return 0; -} - -uint32_t common_hal_busio_uart_get_baudrate (busio_uart_obj_t *self) { - mp_raise_NotImplementedError(translate("busio.UART not available")); - return self->baudrate; -} - -void common_hal_busio_uart_set_baudrate (busio_uart_obj_t *self, uint32_t baudrate) { - mp_raise_NotImplementedError(translate("busio.UART not available")); -} - -uint32_t common_hal_busio_uart_rx_characters_available (busio_uart_obj_t *self) { - mp_raise_NotImplementedError(translate("busio.UART not available")); -} - -void common_hal_busio_uart_clear_rx_buffer (busio_uart_obj_t *self) { - -} - -bool common_hal_busio_uart_ready_to_tx (busio_uart_obj_t *self) { - mp_raise_NotImplementedError(translate("busio.UART not available")); - return false; -} -#endif diff --git a/ports/nrf/common-hal/busio/UART.h b/ports/nrf/common-hal/busio/UART.h index a8081dc1e..58432001c 100644 --- a/ports/nrf/common-hal/busio/UART.h +++ b/ports/nrf/common-hal/busio/UART.h @@ -36,7 +36,7 @@ typedef struct { mp_obj_base_t base; - nrfx_uarte_t uarte; + nrfx_uarte_t *uarte; uint32_t baudrate; uint32_t timeout_ms; @@ -48,4 +48,6 @@ typedef struct { uint8_t rx_pin_number; } busio_uart_obj_t; +void uart_reset(void); + #endif // MICROPY_INCLUDED_NRF_COMMON_HAL_BUSIO_UART_H diff --git a/ports/nrf/common-hal/displayio/ParallelBus.c b/ports/nrf/common-hal/displayio/ParallelBus.c new file mode 100644 index 000000000..42231be52 --- /dev/null +++ b/ports/nrf/common-hal/displayio/ParallelBus.c @@ -0,0 +1,140 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "shared-bindings/displayio/ParallelBus.h" + +#include <stdint.h> + +#include "common-hal/microcontroller/Pin.h" +#include "py/runtime.h" +#include "shared-bindings/digitalio/DigitalInOut.h" + +#include "tick.h" + +void common_hal_displayio_parallelbus_construct(displayio_parallelbus_obj_t* self, + const mcu_pin_obj_t* data0, const mcu_pin_obj_t* command, const mcu_pin_obj_t* chip_select, + const mcu_pin_obj_t* write, const mcu_pin_obj_t* read, const mcu_pin_obj_t* reset) { + + uint8_t data_pin = data0->number; + if (data_pin % 8 != 0) { + mp_raise_ValueError(translate("Data 0 pin must be byte aligned")); + } + for (uint8_t i = 0; i < 8; i++) { + if (!pin_number_is_free(data_pin + i)) { + mp_raise_ValueError_varg(translate("Bus pin %d is already in use"), i); + } + } + NRF_GPIO_Type *g; + uint8_t num_pins_in_port; + if (data0->number < P0_PIN_NUM) { + g = NRF_P0; + num_pins_in_port = P0_PIN_NUM; + } else { + g = NRF_P1; + num_pins_in_port = P1_PIN_NUM; + } + g->DIRSET = 0xff << (data_pin % num_pins_in_port); + for (uint8_t i = 0; i < 8; i++) { + g->PIN_CNF[data_pin + i] |= NRF_GPIO_PIN_S0S1 << GPIO_PIN_CNF_DRIVE_Pos; + } + self->bus = ((uint8_t*) &g->OUT) + (data0->number % num_pins_in_port / 8); + + self->command.base.type = &digitalio_digitalinout_type; + common_hal_digitalio_digitalinout_construct(&self->command, command); + common_hal_digitalio_digitalinout_switch_to_output(&self->command, true, DRIVE_MODE_PUSH_PULL); + + self->chip_select.base.type = &digitalio_digitalinout_type; + common_hal_digitalio_digitalinout_construct(&self->chip_select, chip_select); + common_hal_digitalio_digitalinout_switch_to_output(&self->chip_select, true, DRIVE_MODE_PUSH_PULL); + + self->reset.base.type = &digitalio_digitalinout_type; + common_hal_digitalio_digitalinout_construct(&self->reset, reset); + common_hal_digitalio_digitalinout_switch_to_output(&self->reset, true, DRIVE_MODE_PUSH_PULL); + + self->write.base.type = &digitalio_digitalinout_type; + common_hal_digitalio_digitalinout_construct(&self->write, write); + common_hal_digitalio_digitalinout_switch_to_output(&self->write, true, DRIVE_MODE_PUSH_PULL); + + self->read.base.type = &digitalio_digitalinout_type; + common_hal_digitalio_digitalinout_construct(&self->read, read); + common_hal_digitalio_digitalinout_switch_to_output(&self->read, true, DRIVE_MODE_PUSH_PULL); + + self->data0_pin = data_pin; + uint8_t num_pins_in_write_port; + if (data0->number < P0_PIN_NUM) { + self->write_group = NRF_P0; + num_pins_in_write_port = P0_PIN_NUM; + } else { + self->write_group = NRF_P1; + num_pins_in_write_port = P1_PIN_NUM; + } + self->write_mask = 1 << (write->number % num_pins_in_write_port); + + never_reset_pin_number(command->number); + never_reset_pin_number(chip_select->number); + never_reset_pin_number(write->number); + never_reset_pin_number(read->number); + never_reset_pin_number(reset->number); + for (uint8_t i = 0; i < 8; i++) { + never_reset_pin_number(data_pin + i); + } +} + +void common_hal_displayio_parallelbus_deinit(displayio_parallelbus_obj_t* self) { + for (uint8_t i = 0; i < 8; i++) { + reset_pin_number(self->data0_pin + i); + } + + reset_pin_number(self->command.pin->number); + reset_pin_number(self->chip_select.pin->number); + reset_pin_number(self->write.pin->number); + reset_pin_number(self->read.pin->number); + reset_pin_number(self->reset.pin->number); +} + +bool common_hal_displayio_parallelbus_begin_transaction(mp_obj_t obj) { + displayio_parallelbus_obj_t* self = MP_OBJ_TO_PTR(obj); + common_hal_digitalio_digitalinout_set_value(&self->chip_select, false); + return true; +} + +void common_hal_displayio_parallelbus_send(mp_obj_t obj, bool command, uint8_t *data, uint32_t data_length) { + displayio_parallelbus_obj_t* self = MP_OBJ_TO_PTR(obj); + common_hal_digitalio_digitalinout_set_value(&self->command, !command); + uint32_t* clear_write = (uint32_t*) &self->write_group->OUTCLR; + uint32_t* set_write = (uint32_t*) &self->write_group->OUTSET; + uint32_t mask = self->write_mask; + for (uint32_t i = 0; i < data_length; i++) { + *clear_write = mask; + *self->bus = data[i]; + *set_write = mask; + } +} + +void common_hal_displayio_parallelbus_end_transaction(mp_obj_t obj) { + displayio_parallelbus_obj_t* self = MP_OBJ_TO_PTR(obj); + common_hal_digitalio_digitalinout_set_value(&self->chip_select, true); +} diff --git a/ports/nrf/common-hal/displayio/ParallelBus.h b/ports/nrf/common-hal/displayio/ParallelBus.h new file mode 100644 index 000000000..5c10d3d42 --- /dev/null +++ b/ports/nrf/common-hal/displayio/ParallelBus.h @@ -0,0 +1,45 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_NRF_COMMON_HAL_DISPLAYIO_PARALLELBUS_H +#define MICROPY_INCLUDED_NRF_COMMON_HAL_DISPLAYIO_PARALLELBUS_H + +#include "common-hal/digitalio/DigitalInOut.h" + +typedef struct { + mp_obj_base_t base; + uint8_t* bus; + digitalio_digitalinout_obj_t command; + digitalio_digitalinout_obj_t chip_select; + digitalio_digitalinout_obj_t reset; + digitalio_digitalinout_obj_t write; + digitalio_digitalinout_obj_t read; + uint8_t data0_pin; + NRF_GPIO_Type* write_group; + uint32_t write_mask; +} displayio_parallelbus_obj_t; + +#endif // MICROPY_INCLUDED_NRF_COMMON_HAL_DISPLAYIO_PARALLELBUS_H diff --git a/ports/nrf/common-hal/microcontroller/Pin.c b/ports/nrf/common-hal/microcontroller/Pin.c index 02847e150..b9c0ecaca 100644 --- a/ports/nrf/common-hal/microcontroller/Pin.c +++ b/ports/nrf/common-hal/microcontroller/Pin.c @@ -53,7 +53,7 @@ void reset_all_pins(void) { } for (uint32_t pin = 0; pin < NUMBER_OF_PINS; ++pin) { - if (!(never_reset_pins[nrf_pin_port(pin)] & (1 << nrf_relative_pin_number(pin)))) { + if ((never_reset_pins[nrf_pin_port(pin)] & (1 << nrf_relative_pin_number(pin))) != 0) { continue; } nrf_gpio_cfg_default(pin); @@ -142,6 +142,11 @@ void claim_pin(const mcu_pin_obj_t* pin) { #endif } + +bool pin_number_is_free(uint8_t pin_number) { + return !(claimed_pins[nrf_pin_port(pin_number)] & (1 << nrf_relative_pin_number(pin_number))); +} + bool common_hal_mcu_pin_is_free(const mcu_pin_obj_t *pin) { #ifdef MICROPY_HW_NEOPIXEL if (pin == MICROPY_HW_NEOPIXEL) { @@ -163,5 +168,15 @@ bool common_hal_mcu_pin_is_free(const mcu_pin_obj_t *pin) { } #endif - return !(claimed_pins[nrf_pin_port(pin->number)] & (1 << nrf_relative_pin_number(pin->number))); + #ifdef NRF52840 + // If NFC pins are enabled for NFC, don't allow them to be used for GPIO. + if (((NRF_UICR->NFCPINS & UICR_NFCPINS_PROTECT_Msk) == + (UICR_NFCPINS_PROTECT_NFC << UICR_NFCPINS_PROTECT_Pos)) && + (pin->number == 9 || pin->number == 10)) { + return false; + } + #endif + + return pin_number_is_free(pin->number); + } diff --git a/ports/nrf/common-hal/microcontroller/Pin.h b/ports/nrf/common-hal/microcontroller/Pin.h index 61be8bc35..735ed90cc 100644 --- a/ports/nrf/common-hal/microcontroller/Pin.h +++ b/ports/nrf/common-hal/microcontroller/Pin.h @@ -44,6 +44,7 @@ void reset_all_pins(void); // need to store a full pointer. void reset_pin_number(uint8_t pin); void claim_pin(const mcu_pin_obj_t* pin); +bool pin_number_is_free(uint8_t pin_number); void never_reset_pin_number(uint8_t pin_number); // Lower 5 bits of a pin number are the pin number in a port. diff --git a/ports/nrf/common-hal/microcontroller/Processor.c b/ports/nrf/common-hal/microcontroller/Processor.c index e4d9439c9..836020d15 100644 --- a/ports/nrf/common-hal/microcontroller/Processor.c +++ b/ports/nrf/common-hal/microcontroller/Processor.c @@ -45,10 +45,7 @@ float common_hal_mcu_processor_get_temperature(void) { if (sd_en) { uint32_t err_code = sd_temp_get(&temp); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Can not get temperature. status: 0x%02x"), (uint16_t)err_code)); - - return 0; + mp_raise_OSError_msg(translate("Cannot get temperature")); } } #endif diff --git a/ports/nrf/common-hal/neopixel_write/__init__.c b/ports/nrf/common-hal/neopixel_write/__init__.c index c9da436b8..fe2bab999 100644 --- a/ports/nrf/common-hal/neopixel_write/__init__.c +++ b/ports/nrf/common-hal/neopixel_write/__init__.c @@ -65,7 +65,7 @@ // // If there is no device available an alternative cycle-counter // implementation is tried. -// The nRF52832 runs with a fixed clock of 64Mhz. The alternative +// The nRF52840 runs with a fixed clock of 64Mhz. The alternative // implementation is the same as the one used for the Teensy 3.0/1/2 but // with the Nordic SDK HAL & registers syntax. // The number of cycles was hand picked and is guaranteed to be 100% @@ -86,7 +86,7 @@ static NRF_PWM_Type* find_free_pwm (void) { #endif }; - for ( int device = 0; device < ARRAY_SIZE(PWM); device++ ) { + for ( size_t device = 0; device < ARRAY_SIZE(PWM); device++ ) { if ( (PWM[device]->ENABLE == 0) && (PWM[device]->PSEL.OUT[0] & PWM_PSEL_OUT_CONNECT_Msk) && (PWM[device]->PSEL.OUT[1] & PWM_PSEL_OUT_CONNECT_Msk) && (PWM[device]->PSEL.OUT[2] & PWM_PSEL_OUT_CONNECT_Msk) && (PWM[device]->PSEL.OUT[3] & PWM_PSEL_OUT_CONNECT_Msk) ) { @@ -141,7 +141,7 @@ void common_hal_neopixel_write (const digitalio_digitalinout_obj_t* digitalinout for ( uint16_t n = 0; n < numBytes; n++ ) { uint8_t pix = pixels[n]; - for ( uint8_t mask = 0x80, i = 0; mask > 0; mask >>= 1, i++ ) { + for ( uint8_t mask = 0x80; mask > 0; mask >>= 1 ) { pixels_pattern[pos] = (pix & mask) ? MAGIC_T1H : MAGIC_T0H; pos++; } diff --git a/ports/nrf/common-hal/pulseio/PWMOut.c b/ports/nrf/common-hal/pulseio/PWMOut.c index f321f848d..5485a75d0 100644 --- a/ports/nrf/common-hal/pulseio/PWMOut.c +++ b/ports/nrf/common-hal/pulseio/PWMOut.c @@ -55,8 +55,33 @@ STATIC NRF_PWM_Type* pwms[] = { STATIC uint16_t pwm_seq[MP_ARRAY_SIZE(pwms)][CHANNELS_PER_PWM]; +static uint8_t never_reset_pwm[MP_ARRAY_SIZE(pwms)]; + +void common_hal_pulseio_pwmout_never_reset(pulseio_pwmout_obj_t *self) { + for(size_t i=0; i < MP_ARRAY_SIZE(pwms); i++) { + NRF_PWM_Type* pwm = pwms[i]; + if (pwm == self->pwm) { + never_reset_pwm[i] += 1; + } + } + + never_reset_pin_number(self->pin_number); +} + +void common_hal_pulseio_pwmout_reset_ok(pulseio_pwmout_obj_t *self) { + for(size_t i=0; i < MP_ARRAY_SIZE(pwms); i++) { + NRF_PWM_Type* pwm = pwms[i]; + if (pwm == self->pwm) { + never_reset_pwm[i] -= 1; + } + } +} + void pwmout_reset(void) { - for(int i=0; i < MP_ARRAY_SIZE(pwms); i++) { + for(size_t i=0; i < MP_ARRAY_SIZE(pwms); i++) { + if (never_reset_pwm[i] > 0) { + continue; + } NRF_PWM_Type* pwm = pwms[i]; pwm->ENABLE = 0; @@ -104,11 +129,11 @@ bool convert_frequency(uint32_t frequency, uint16_t *countertop, nrf_pwm_clk_t * return false; } -void common_hal_pulseio_pwmout_construct(pulseio_pwmout_obj_t* self, - const mcu_pin_obj_t* pin, - uint16_t duty, - uint32_t frequency, - bool variable_frequency) { +pwmout_result_t common_hal_pulseio_pwmout_construct(pulseio_pwmout_obj_t* self, + const mcu_pin_obj_t* pin, + uint16_t duty, + uint32_t frequency, + bool variable_frequency) { // We don't use the nrfx driver here because we want to dynamically allocate channels // as needed in an already-enabled PWM. @@ -116,7 +141,7 @@ void common_hal_pulseio_pwmout_construct(pulseio_pwmout_obj_t* self, uint16_t countertop; nrf_pwm_clk_t base_clock; if (frequency == 0 || !convert_frequency(frequency, &countertop, &base_clock)) { - mp_raise_ValueError(translate("Invalid PWM frequency")); + return PWMOUT_INVALID_FREQUENCY; } self->pwm = NULL; @@ -158,7 +183,7 @@ void common_hal_pulseio_pwmout_construct(pulseio_pwmout_obj_t* self, } if (self->pwm == NULL) { - mp_raise_ValueError(translate("All PWM peripherals are in use")); + return PWMOUT_ALL_TIMERS_IN_USE; } self->pin_number = pin->number; @@ -183,6 +208,7 @@ void common_hal_pulseio_pwmout_construct(pulseio_pwmout_obj_t* self, nrf_pwm_enable(pwm); common_hal_pulseio_pwmout_set_duty_cycle(self, duty); + return PWMOUT_OK; } bool common_hal_pulseio_pwmout_deinited(pulseio_pwmout_obj_t* self) { diff --git a/ports/nrf/common-hal/pulseio/PulseIn.c b/ports/nrf/common-hal/pulseio/PulseIn.c index 3d6d266af..383966831 100644 --- a/ports/nrf/common-hal/pulseio/PulseIn.c +++ b/ports/nrf/common-hal/pulseio/PulseIn.c @@ -27,6 +27,7 @@ #include "common-hal/pulseio/PulseIn.h" #include <stdint.h> +#include <string.h> #include "py/mpconfig.h" #include "py/gc.h" @@ -35,50 +36,247 @@ #include "shared-bindings/microcontroller/__init__.h" #include "shared-bindings/pulseio/PulseIn.h" +#include "tick.h" +#include "nrfx_gpiote.h" + +// obj array to map pin -> self since nrfx hide the mapping +static pulseio_pulsein_obj_t* _objs[GPIOTE_CH_NUM]; + +// return index of the object in array +static int _find_pulsein_obj(pulseio_pulsein_obj_t* obj) { + for(size_t i = 0; i < NRFX_ARRAY_SIZE(_objs); i++ ) { + if ( _objs[i] == obj) { + return i; + } + } + + return -1; +} + +static void _pulsein_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action) { + // Grab the current time first. + uint32_t current_us; + uint64_t current_ms; + current_tick(¤t_ms, ¤t_us); + + // current_tick gives us the remaining us until the next tick but we want the number since the last ms. + current_us = 1000 - current_us; + + pulseio_pulsein_obj_t* self = NULL; + for(size_t i = 0; i < NRFX_ARRAY_SIZE(_objs); i++ ) { + if ( _objs[i] && _objs[i]->pin == pin ) { + self = _objs[i]; + break; + } + } + if ( !self ) return; + + if (self->first_edge) { + // first pulse is opposite state from idle + bool state = nrf_gpio_pin_read(self->pin); + if ( self->idle_state != state ) { + self->first_edge = false; + } + }else { + uint32_t ms_diff = current_ms - self->last_ms; + uint16_t us_diff = current_us - self->last_us; + uint32_t total_diff = us_diff; + + if (self->last_us > current_us) { + total_diff = 1000 + current_us - self->last_us; + if (ms_diff > 1) { + total_diff += (ms_diff - 1) * 1000; + } + } else { + total_diff += ms_diff * 1000; + } + uint16_t duration = 0xffff; + if (total_diff < duration) { + duration = total_diff; + } + + uint16_t i = (self->start + self->len) % self->maxlen; + self->buffer[i] = duration; + if (self->len < self->maxlen) { + self->len++; + } else { + self->start++; + } + } + + self->last_ms = current_ms; + self->last_us = current_us; +} + void pulsein_reset(void) { + if ( nrfx_gpiote_is_init() ) { + nrfx_gpiote_uninit(); + } + nrfx_gpiote_init(); + memset(_objs, 0, sizeof(_objs)); } void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t* self, const mcu_pin_obj_t* pin, uint16_t maxlen, bool idle_state) { - mp_raise_NotImplementedError(NULL); + int idx = _find_pulsein_obj(NULL); + if ( idx < 0 ) { + mp_raise_NotImplementedError(NULL); + } + _objs[idx] = self; + + self->buffer = (uint16_t *) m_malloc(maxlen * sizeof(uint16_t), false); + if (self->buffer == NULL) { + mp_raise_msg_varg(&mp_type_MemoryError, translate("Failed to allocate RX buffer of %d bytes"), maxlen * sizeof(uint16_t)); + } + + self->pin = pin->number; + self->maxlen = maxlen; + self->idle_state = idle_state; + self->start = 0; + self->len = 0; + self->first_edge = true; + self->paused = false; + self->last_us = 0; + self->last_ms = 0; + + claim_pin(pin); + + nrfx_gpiote_in_config_t cfg = { + .sense = NRF_GPIOTE_POLARITY_TOGGLE, + .pull = NRF_GPIO_PIN_NOPULL, // idle_state ? NRF_GPIO_PIN_PULLDOWN : NRF_GPIO_PIN_PULLUP, + .is_watcher = false, // nrf_gpio_cfg_watcher vs nrf_gpio_cfg_input + .hi_accuracy = true, + .skip_gpio_setup = false + }; + nrfx_gpiote_in_init(self->pin, &cfg, _pulsein_handler); + nrfx_gpiote_in_event_enable(self->pin, true); } bool common_hal_pulseio_pulsein_deinited(pulseio_pulsein_obj_t* self) { - return 1; + return self->pin == NO_PIN; } void common_hal_pulseio_pulsein_deinit(pulseio_pulsein_obj_t* self) { + if (common_hal_pulseio_pulsein_deinited(self)) { + return; + } + + nrfx_gpiote_in_event_disable(self->pin); + nrfx_gpiote_in_uninit(self->pin); + + // mark local array as invalid + int idx = _find_pulsein_obj(self); + if ( idx < 0 ) { + mp_raise_NotImplementedError(NULL); + } + _objs[idx] = NULL; + reset_pin_number(self->pin); + self->pin = NO_PIN; } void common_hal_pulseio_pulsein_pause(pulseio_pulsein_obj_t* self) { - + nrfx_gpiote_in_event_disable(self->pin); + self->paused = true; } void common_hal_pulseio_pulsein_resume(pulseio_pulsein_obj_t* self, uint16_t trigger_duration) { + // Make sure we're paused. + if ( !self->paused ) { + common_hal_pulseio_pulsein_pause(self); + } + + // Send the trigger pulse. + if (trigger_duration > 0) { + nrfx_gpiote_in_uninit(self->pin); + + nrf_gpio_cfg_output(self->pin); + nrf_gpio_pin_write(self->pin, !self->idle_state); + common_hal_mcu_delay_us((uint32_t)trigger_duration); + nrf_gpio_pin_write(self->pin, self->idle_state); + + nrfx_gpiote_in_config_t cfg = { + .sense = NRF_GPIOTE_POLARITY_TOGGLE, + .pull = NRF_GPIO_PIN_NOPULL, // idle_state ? NRF_GPIO_PIN_PULLDOWN : NRF_GPIO_PIN_PULLUP, + .is_watcher = false, // nrf_gpio_cfg_watcher vs nrf_gpio_cfg_input + .hi_accuracy = true, + .skip_gpio_setup = false + }; + nrfx_gpiote_in_init(self->pin, &cfg, _pulsein_handler); + } + + self->first_edge = true; + self->paused = false; + self->last_ms = 0; + self->last_us = 0; + nrfx_gpiote_in_event_enable(self->pin, true); } void common_hal_pulseio_pulsein_clear(pulseio_pulsein_obj_t* self) { + if ( !self->paused ) { + nrfx_gpiote_in_event_disable(self->pin); + } + self->start = 0; + self->len = 0; + + if ( !self->paused ) { + nrfx_gpiote_in_event_enable(self->pin, true); + } +} + +uint16_t common_hal_pulseio_pulsein_get_item(pulseio_pulsein_obj_t* self, int16_t index) { + if ( !self->paused ) { + nrfx_gpiote_in_event_disable(self->pin); + } + + if (index < 0) { + index += self->len; + } + if (index < 0 || index >= self->len) { + if ( !self->paused ) { + nrfx_gpiote_in_event_enable(self->pin, true); + } + mp_raise_IndexError(translate("index out of range")); + } + uint16_t value = self->buffer[(self->start + index) % self->maxlen]; + + if ( !self->paused ) { + nrfx_gpiote_in_event_enable(self->pin, true); + } + + return value; } uint16_t common_hal_pulseio_pulsein_popleft(pulseio_pulsein_obj_t* self) { - return 0; + if (self->len == 0) { + mp_raise_IndexError(translate("pop from an empty PulseIn")); + } + + if ( !self->paused ) { + nrfx_gpiote_in_event_disable(self->pin); + } + + uint16_t value = self->buffer[self->start]; + self->start = (self->start + 1) % self->maxlen; + self->len--; + + if ( !self->paused ) { + nrfx_gpiote_in_event_enable(self->pin, true); + } + + return value; } uint16_t common_hal_pulseio_pulsein_get_maxlen(pulseio_pulsein_obj_t* self) { - return 0xadaf; + return self->maxlen; } bool common_hal_pulseio_pulsein_get_paused(pulseio_pulsein_obj_t* self) { - return false; + return self->paused; } uint16_t common_hal_pulseio_pulsein_get_len(pulseio_pulsein_obj_t* self) { - return 0xadaf; -} - -uint16_t common_hal_pulseio_pulsein_get_item(pulseio_pulsein_obj_t* self, int16_t index) { - return 0xadaf; + return self->len; } diff --git a/ports/nrf/common-hal/pulseio/PulseIn.h b/ports/nrf/common-hal/pulseio/PulseIn.h index 666f5a164..4b2c6eee3 100644 --- a/ports/nrf/common-hal/pulseio/PulseIn.h +++ b/ports/nrf/common-hal/pulseio/PulseIn.h @@ -33,15 +33,19 @@ typedef struct { mp_obj_base_t base; - uint8_t channel; + uint8_t pin; + bool idle_state; + bool paused; + volatile bool first_edge; + uint16_t* buffer; uint16_t maxlen; - bool idle_state; + volatile uint16_t start; volatile uint16_t len; - volatile bool first_edge; - uint16_t ticks_per_ms; + volatile uint16_t last_us; + volatile uint64_t last_ms; } pulseio_pulsein_obj_t; void pulsein_reset(void); diff --git a/ports/nrf/common-hal/rotaryio/IncrementalEncoder.c b/ports/nrf/common-hal/rotaryio/IncrementalEncoder.c new file mode 100644 index 000000000..a0cfd48d5 --- /dev/null +++ b/ports/nrf/common-hal/rotaryio/IncrementalEncoder.c @@ -0,0 +1,116 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Nick Moore for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "common-hal/rotaryio/IncrementalEncoder.h" +#include "nrfx_gpiote.h" + +#include "py/runtime.h" + +#include <stdio.h> + +// obj array to map pin number -> self since nrfx hide the mapping +static rotaryio_incrementalencoder_obj_t *_objs[NUMBER_OF_PINS]; + +static void _intr_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action) { + rotaryio_incrementalencoder_obj_t *self = _objs[pin]; + if (!self) return; + + // reads a state 0 .. 3 *in order*. + uint8_t new_state = nrf_gpio_pin_read(self->pin_a); + new_state = (new_state << 1) + (new_state ^ nrf_gpio_pin_read(self->pin_b)); + + uint8_t change = (new_state - self->state) & 0x03; + if (change == 1) self->quarter++; + else if (change == 3) self->quarter--; + // ignore other state transitions + + self->state = new_state; + + // logic from the atmel-samd port: provides some damping and scales movement + // down by 4:1. + if (self->quarter >= 4) { + self->position++; + self->quarter = 0; + } else if (self->quarter <= -4) { + self->position--; + self->quarter = 0; + } +} + +void common_hal_rotaryio_incrementalencoder_construct(rotaryio_incrementalencoder_obj_t* self, + const mcu_pin_obj_t* pin_a, const mcu_pin_obj_t* pin_b) { + + self->pin_a = pin_a->number; + self->pin_b = pin_b->number; + + _objs[self->pin_a] = self; + _objs[self->pin_b] = self; + + nrfx_gpiote_in_config_t cfg = { + .sense = NRF_GPIOTE_POLARITY_TOGGLE, + .pull = NRF_GPIO_PIN_PULLUP, + .is_watcher = false, + .hi_accuracy = true, + .skip_gpio_setup = false + }; + nrfx_gpiote_in_init(self->pin_a, &cfg, _intr_handler); + nrfx_gpiote_in_init(self->pin_b, &cfg, _intr_handler); + nrfx_gpiote_in_event_enable(self->pin_a, true); + nrfx_gpiote_in_event_enable(self->pin_b, true); + + claim_pin(pin_a); + claim_pin(pin_b); +} + +bool common_hal_rotaryio_incrementalencoder_deinited(rotaryio_incrementalencoder_obj_t* self) { + return self->pin_a == NO_PIN; +} + +void common_hal_rotaryio_incrementalencoder_deinit(rotaryio_incrementalencoder_obj_t* self) { + if (common_hal_rotaryio_incrementalencoder_deinited(self)) { + return; + } + _objs[self->pin_a] = NULL; + _objs[self->pin_b] = NULL; + + nrfx_gpiote_in_event_disable(self->pin_a); + nrfx_gpiote_in_event_disable(self->pin_b); + nrfx_gpiote_in_uninit(self->pin_a); + nrfx_gpiote_in_uninit(self->pin_b); + reset_pin_number(self->pin_a); + reset_pin_number(self->pin_b); + self->pin_a = NO_PIN; + self->pin_b = NO_PIN; +} + +mp_int_t common_hal_rotaryio_incrementalencoder_get_position(rotaryio_incrementalencoder_obj_t* self) { + return self->position; +} + +void common_hal_rotaryio_incrementalencoder_set_position(rotaryio_incrementalencoder_obj_t* self, + mp_int_t new_position) { + self->position = new_position; +} diff --git a/ports/nrf/common-hal/rotaryio/IncrementalEncoder.h b/ports/nrf/common-hal/rotaryio/IncrementalEncoder.h new file mode 100644 index 000000000..1d0fe4183 --- /dev/null +++ b/ports/nrf/common-hal/rotaryio/IncrementalEncoder.h @@ -0,0 +1,46 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_NRF_COMMON_HAL_ROTARYIO_INCREMENTALENCODER_H +#define MICROPY_INCLUDED_NRF_COMMON_HAL_ROTARYIO_INCREMENTALENCODER_H + +#include "common-hal/microcontroller/Pin.h" + +#include "py/obj.h" + +typedef struct { + mp_obj_base_t base; + uint8_t pin_a; + uint8_t pin_b; + uint8_t state; + int8_t quarter; + mp_int_t position; +} rotaryio_incrementalencoder_obj_t; + + +void incrementalencoder_interrupt_handler(uint8_t channel); + +#endif // MICROPY_INCLUDED_NRF_COMMON_HAL_ROTARYIO_INCREMENTALENCODER_H diff --git a/ports/nrf/common-hal/rotaryio/__init__.c b/ports/nrf/common-hal/rotaryio/__init__.c new file mode 100644 index 000000000..0aae79c26 --- /dev/null +++ b/ports/nrf/common-hal/rotaryio/__init__.c @@ -0,0 +1 @@ +// No rotaryio module functions. diff --git a/ports/nrf/common-hal/touchio/TouchIn.c b/ports/nrf/common-hal/touchio/TouchIn.c new file mode 100644 index 000000000..ba50b17b0 --- /dev/null +++ b/ports/nrf/common-hal/touchio/TouchIn.c @@ -0,0 +1,116 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2016 Scott Shawcroft for Adafruit Industries + * Copyright (c) 2018 Nick Moore for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include <string.h> +#include <stdio.h> + +#include "py/nlr.h" +#include "py/mperrno.h" +#include "py/runtime.h" +#include "py/binary.h" +#include "py/mphal.h" +#include "shared-bindings/touchio/TouchIn.h" +#include "supervisor/shared/translate.h" + +#include "nrf.h" + +// This is a capacitive touch sensing routine using a single digital +// pin. The pin should be connected to the sensing pad, and to ground +// via a 1Mohm or thereabout drain resistor. When a reading is taken, +// the pin's capacitance is charged by setting it to a digital output +// 'high' for a few microseconds, and then it is changed to a high +// impedance input. We measure how long it takes to discharge through +// the resistor (around 50us), using a busy-waiting loop, and average +// over N_SAMPLES cycles to reduce the effects of noise. + +#define N_SAMPLES 10 +#define TIMEOUT_TICKS 10000 + +static uint16_t get_raw_reading(touchio_touchin_obj_t *self) { + + uint16_t ticks = 0; + + for (uint16_t i = 0; i < N_SAMPLES; i++) { + // set pad to digital output high for 10us to charge it + + nrf_gpio_cfg_output(self->pin->number); + nrf_gpio_pin_set(self->pin->number); + mp_hal_delay_us(10); + + // set pad back to an input and take some samples + + nrf_gpio_cfg_input(self->pin->number, NRF_GPIO_PIN_NOPULL); + + while(nrf_gpio_pin_read(self->pin->number)) { + if (ticks >= TIMEOUT_TICKS) return TIMEOUT_TICKS; + ticks++; + } + } + return ticks; +} + +void common_hal_touchio_touchin_construct(touchio_touchin_obj_t* self, + const mcu_pin_obj_t *pin) { + self->pin = pin; + claim_pin(pin); + + self->threshold = get_raw_reading(self) * 1.05 + 100; +} + +bool common_hal_touchio_touchin_deinited(touchio_touchin_obj_t* self) { + return self->pin == NULL; +} + +void common_hal_touchio_touchin_deinit(touchio_touchin_obj_t* self) { + if (common_hal_touchio_touchin_deinited(self)) { + return; + } + + reset_pin_number(self->pin->number); + self->pin = NULL; +} + +void touchin_reset() { +} + +bool common_hal_touchio_touchin_get_value(touchio_touchin_obj_t *self) { + uint16_t reading = get_raw_reading(self); + return reading > self->threshold; +} + +uint16_t common_hal_touchio_touchin_get_raw_value(touchio_touchin_obj_t *self) { + return get_raw_reading(self); +} + +uint16_t common_hal_touchio_touchin_get_threshold(touchio_touchin_obj_t *self) { + return self->threshold; +} + +void common_hal_touchio_touchin_set_threshold(touchio_touchin_obj_t *self, + uint16_t new_threshold) { + self->threshold = new_threshold; +} diff --git a/ports/nrf/common-hal/touchio/TouchIn.h b/ports/nrf/common-hal/touchio/TouchIn.h new file mode 100644 index 000000000..121580eac --- /dev/null +++ b/ports/nrf/common-hal/touchio/TouchIn.h @@ -0,0 +1,43 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2016 Scott Shawcroft + * Copyright (c) 2018 Nick Moore for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_NRF_COMMON_HAL_TOUCHIO_TOUCHIN_H +#define MICROPY_INCLUDED_NRF_COMMON_HAL_TOUCHIO_TOUCHIN_H + +#include "common-hal/microcontroller/Pin.h" + +#include "py/obj.h" + +typedef struct { + mp_obj_base_t base; + const mcu_pin_obj_t *pin; + uint16_t threshold; +} touchio_touchin_obj_t; + +void touchin_reset(void); + +#endif // MICROPY_INCLUDED_NRF_COMMON_HAL_TOUCHIO_TOUCHIN_H diff --git a/ports/nrf/common-hal/touchio/__init__.c b/ports/nrf/common-hal/touchio/__init__.c new file mode 100644 index 000000000..d2290447c --- /dev/null +++ b/ports/nrf/common-hal/touchio/__init__.c @@ -0,0 +1 @@ +// No touchio module functions. diff --git a/ports/nrf/mpconfigport.h b/ports/nrf/mpconfigport.h index 25710cea2..1b2d8ea12 100644 --- a/ports/nrf/mpconfigport.h +++ b/ports/nrf/mpconfigport.h @@ -4,6 +4,7 @@ * The MIT License (MIT) * * Copyright (c) 2015 Glenn Ruben Bakke + * Copyright (c) 2019 Dan Halbert for Adafruit Industries * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -27,106 +28,17 @@ #ifndef NRF5_MPCONFIGPORT_H__ #define NRF5_MPCONFIGPORT_H__ -#include <mpconfigboard.h> +#include "ble_drv.h" -// options to control how MicroPython is built -#define MICROPY_ALLOC_PATH_MAX (512) -#define MICROPY_PERSISTENT_CODE_LOAD (1) -#define MICROPY_EMIT_THUMB (0) -#define MICROPY_EMIT_INLINE_THUMB (0) -#define MICROPY_COMP_MODULE_CONST (0) -#define MICROPY_COMP_TRIPLE_TUPLE_ASSIGN (0) -#define MICROPY_READER_VFS (MICROPY_VFS) -#define MICROPY_ENABLE_GC (1) -#define MICROPY_ENABLE_FINALISER (1) -#define MICROPY_STACK_CHECK (0) -#define MICROPY_HELPER_REPL (1) -#define MICROPY_REPL_EMACS_KEYS (0) -#define MICROPY_REPL_AUTO_INDENT (1) -#define MICROPY_ENABLE_SOURCE_LINE (1) -//CP UPDATE: See mpconfigport.h for LONGINT implementation -#define MICROPY_LONGINT_IMPL (MICROPY_LONGINT_IMPL_MPZ) -#define MICROPY_FLOAT_IMPL (MICROPY_FLOAT_IMPL_FLOAT) -#define MICROPY_FLOAT_HIGH_QUALITY_HASH (1) - -#define MICROPY_OPT_COMPUTED_GOTO (0) -#define MICROPY_OPT_CACHE_MAP_LOOKUP_IN_BYTECODE (0) -#define MICROPY_OPT_MPZ_BITWISE (0) - -// fatfs configuration used in ffconf.h -#define MICROPY_FATFS_ENABLE_LFN (1) -#define MICROPY_FATFS_LFN_CODE_PAGE (437) /* 1=SFN/ANSI 437=LFN/U.S.(OEM) */ -#define MICROPY_FATFS_USE_LABEL (1) -#define MICROPY_FATFS_RPATH (2) -#define MICROPY_FATFS_MULTI_PARTITION (1) -#define MICROPY_FATFS_NUM_PERSISTENT (1) - -//#define MICROPY_FATFS_MAX_SS (4096) -#define FILESYSTEM_BLOCK_SIZE (512) - -#define MICROPY_VFS (1) -#define MICROPY_VFS_FAT (MICROPY_VFS) - -// use vfs's functions for import stat and builtin open -#if MICROPY_VFS -#define mp_import_stat mp_vfs_import_stat -#define mp_builtin_open mp_vfs_open -#define mp_builtin_open_obj mp_vfs_open_obj -#endif - -#define MICROPY_CPYTHON_COMPAT (1) -#define MICROPY_STREAMS_NON_BLOCK (1) -#define MICROPY_MODULE_WEAK_LINKS (1) -#define MICROPY_CAN_OVERRIDE_BUILTINS (1) -#define MICROPY_USE_INTERNAL_ERRNO (0) +#define MICROPY_PY_COLLECTIONS_ORDEREDDICT (1) #define MICROPY_PY_FUNCTION_ATTRS (1) -#define MICROPY_PY_BUILTINS_STR_UNICODE (1) -#define MICROPY_PY_BUILTINS_STR_CENTER (1) -#define MICROPY_PY_BUILTINS_STR_PARTITION (1) -#define MICROPY_PY_BUILTINS_STR_SPLITLINES (1) -#define MICROPY_PY_BUILTINS_MEMORYVIEW (1) -#define MICROPY_PY_BUILTINS_FROZENSET (1) -#define MICROPY_PY_BUILTINS_EXECFILE (0) -#define MICROPY_PY_BUILTINS_COMPILE (1) -#define MICROPY_PY_BUILTINS_HELP (1) -#define MICROPY_PY_BUILTINS_HELP_MODULES (1) -#define MICROPY_PY_BUILTINS_INPUT (1) -#define MICROPY_MODULE_BUILTIN_INIT (1) -#define MICROPY_PY_ALL_SPECIAL_METHODS (0) -#define MICROPY_PY_MICROPYTHON_MEM_INFO (1) -#define MICROPY_PY_ARRAY_SLICE_ASSIGN (1) -#define MICROPY_NONSTANDARD_TYPECODES (0) -#define MICROPY_PY_BUILTINS_SLICE_ATTRS (1) -#define MICROPY_PY_SYS_EXIT (1) -#define MICROPY_PY_SYS_MAXSIZE (1) -#define MICROPY_PY_SYS_STDFILES (1) -#define MICROPY_PY_SYS_STDIO_BUFFER (1) -#define MICROPY_PY_COLLECTIONS_ORDEREDDICT (0) -#define MICROPY_PY_MATH_SPECIAL_FUNCTIONS (0) -#define MICROPY_PY_CMATH (0) #define MICROPY_PY_IO (1) -#define MICROPY_PY_IO_FILEIO (1) -#define MICROPY_PY_UERRNO (0) +#define MICROPY_PY_REVERSE_SPECIAL_METHODS (1) +#define MICROPY_PY_SYS_STDIO_BUFFER (1) #define MICROPY_PY_UBINASCII (1) -#define MICROPY_PY_URANDOM (0) -#define MICROPY_PY_URANDOM_EXTRA_FUNCS (0) -#define MICROPY_PY_UCTYPES (0) -#define MICROPY_PY_UZLIB (0) #define MICROPY_PY_UJSON (1) -#define MICROPY_PY_URE (0) -#define MICROPY_PY_UHEAPQ (0) -#define MICROPY_PY_UHASHLIB (1) -#define MICROPY_PY_STRUCT (0) -#define MICROPY_PY_FRAMEBUF (0) - -#define MICROPY_KBD_EXCEPTION (1) - -#define MICROPY_ENABLE_EMERGENCY_EXCEPTION_BUF (1) -#define MICROPY_EMERGENCY_EXCEPTION_BUF_SIZE (0) - -// Scan gamepad every 32ms -#define CIRCUITPY_GAMEPAD_TICKS 0x1f +// TODO this is old BLE stuff #if BLUETOOTH_SD #define MICROPY_PY_BLEIO (1) #define MICROPY_PY_BLE_NUS (0) @@ -136,102 +48,14 @@ #endif #endif +// 24kiB stack +#define CIRCUITPY_DEFAULT_STACK_SIZE 0x6000 -// type definitions for the specific machine - -#define BYTES_PER_WORD (4) - -#define MICROPY_MAKE_POINTER_CALLABLE(p) ((void*)((mp_uint_t)(p) | 1)) - -#define MP_SSIZE_MAX (0x7fffffff) - -#define UINT_FMT "%u" -#define INT_FMT "%d" -#define HEX2_FMT "%02x" - -typedef int mp_int_t; // must be pointer size -typedef unsigned int mp_uint_t; // must be pointer size -typedef long mp_off_t; - -#define MP_PLAT_PRINT_STRN(str, len) mp_hal_stdout_tx_strn_cooked(str, len) -#define mp_type_fileio mp_type_vfs_fat_fileio -#define mp_type_textio mp_type_vfs_fat_textio - -// extra built in modules to add to the list of known ones - -extern const struct _mp_obj_module_t microcontroller_module; -extern const struct _mp_obj_module_t bitbangio_module; -extern const struct _mp_obj_module_t analogio_module; -extern const struct _mp_obj_module_t digitalio_module; -extern const struct _mp_obj_module_t pulseio_module; -extern const struct _mp_obj_module_t busio_module; -extern const struct _mp_obj_module_t board_module; -extern const struct _mp_obj_module_t os_module; -extern const struct _mp_obj_module_t random_module; -extern const struct _mp_obj_module_t storage_module; -extern const struct _mp_obj_module_t struct_module; -extern const struct _mp_obj_module_t time_module; -extern const struct _mp_obj_module_t supervisor_module; -extern const struct _mp_obj_module_t gamepad_module; -extern const struct _mp_obj_module_t neopixel_write_module; -extern const struct _mp_obj_module_t usb_hid_module; -extern const struct _mp_obj_module_t bleio_module; - -#if MICROPY_PY_BLEIO -#define BLEIO_MODULE { MP_ROM_QSTR(MP_QSTR_bleio), MP_ROM_PTR(&bleio_module) }, -#else -#define BLEIO_MODULE -#endif - -#ifdef NRF52840_XXAA -#define USBHID_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_usb_hid), (mp_obj_t)&usb_hid_module }, -#else -#define USBHID_MODULE -#endif - -#define MICROPY_PORT_BUILTIN_MODULES \ - { MP_OBJ_NEW_QSTR (MP_QSTR_board ), (mp_obj_t)&board_module }, \ - { MP_OBJ_NEW_QSTR (MP_QSTR_busio ), (mp_obj_t)&busio_module }, \ - { MP_OBJ_NEW_QSTR (MP_QSTR_analogio ), (mp_obj_t)&analogio_module }, \ - { MP_OBJ_NEW_QSTR (MP_QSTR_digitalio ), (mp_obj_t)&digitalio_module }, \ - { MP_OBJ_NEW_QSTR (MP_QSTR_pulseio ), (mp_obj_t)&pulseio_module }, \ - { MP_OBJ_NEW_QSTR (MP_QSTR_microcontroller ), (mp_obj_t)µcontroller_module }, \ - { MP_OBJ_NEW_QSTR (MP_QSTR_neopixel_write ), (mp_obj_t)&neopixel_write_module }, \ - { MP_OBJ_NEW_QSTR (MP_QSTR_bitbangio ), (mp_obj_t)&bitbangio_module }, \ - { MP_OBJ_NEW_QSTR (MP_QSTR_os ), (mp_obj_t)&os_module }, \ - { MP_OBJ_NEW_QSTR (MP_QSTR_random ), (mp_obj_t)&random_module }, \ - { MP_OBJ_NEW_QSTR (MP_QSTR_storage ), (mp_obj_t)&storage_module }, \ - { MP_OBJ_NEW_QSTR (MP_QSTR_struct ), (mp_obj_t)&struct_module }, \ - { MP_OBJ_NEW_QSTR (MP_QSTR_supervisor ), (mp_obj_t)&supervisor_module }, \ - { MP_OBJ_NEW_QSTR (MP_QSTR_gamepad ), (mp_obj_t)&gamepad_module }, \ - { MP_OBJ_NEW_QSTR (MP_QSTR_time ), (mp_obj_t)&time_module }, \ - { MP_OBJ_NEW_QSTR (MP_QSTR_json ), (mp_obj_t)&mp_module_ujson }, \ - USBHID_MODULE \ - BLEIO_MODULE - -// extra built in names to add to the global namespace -#define MICROPY_PORT_BUILTINS \ - { MP_ROM_QSTR (MP_QSTR_help ), MP_ROM_PTR(&mp_builtin_help_obj) }, \ - { MP_OBJ_NEW_QSTR (MP_QSTR_input ), (mp_obj_t)&mp_builtin_input_obj }, \ - { MP_ROM_QSTR (MP_QSTR_open ), MP_ROM_PTR(&mp_builtin_open_obj) }, \ - -#define MP_STATE_PORT MP_STATE_VM - -#include "supervisor/flash_root_pointers.h" +#include "py/circuitpy_mpconfig.h" #define MICROPY_PORT_ROOT_POINTERS \ - const char *readline_hist[8]; \ - mp_obj_t gamepad_singleton; \ - FLASH_ROOT_POINTERS \ - -// We need to provide a declaration/definition of alloca() -#include <alloca.h> + CIRCUITPY_COMMON_ROOT_POINTERS \ + ble_drv_evt_handler_entry_t* ble_drv_evt_handler_entries; \ -void run_background_tasks(void); -#define MICROPY_VM_HOOK_LOOP run_background_tasks(); -#define MICROPY_VM_HOOK_RETURN run_background_tasks(); -//#define CIRCUITPY_BOOT_OUTPUT_FILE "/boot_out.txt" -#define CIRCUITPY_DEFAULT_STACK_SIZE 4096 - -#endif +#endif // NRF5_MPCONFIGPORT_H__ diff --git a/ports/nrf/mpconfigport.mk b/ports/nrf/mpconfigport.mk index f43e29fce..badfb6735 100644 --- a/ports/nrf/mpconfigport.mk +++ b/ports/nrf/mpconfigport.mk @@ -3,6 +3,32 @@ # This should correspond to the MICROPY_LONGINT_IMPL definition in mpconfigport.h. MPY_TOOL_LONGINT_IMPL = -mlongint-impl=mpz -INTERNAL_LIBM = (1) +INTERNAL_LIBM = 1 USB_SERIAL_NUMBER_LENGTH = 16 + +# All nRF ports have longints. +LONGINT_IMPL = MPZ + +# No DAC, so no regular audio. +CIRCUITPY_AUDIOIO = 0 + +# No I2S yet. +CIRCUITPY_AUDIOBUSIO = 0 + +# No I2CSlave implementation +CIRCUITPY_I2CSLAVE = 0 + +# nvm not yet implemented +CIRCUITPY_NVM = 0 + +# rtc not yet implemented +CIRCUITPY_RTC = 0 + +# frequencyio not yet implemented +CIRCUITPY_FREQUENCYIO = 0 + +# CircuitPython doesn't yet support NFC so force the NFC antenna pins to be GPIO. +# See https://github.com/adafruit/circuitpython/issues/1300 +# Defined here because system_nrf52840.c doesn't #include any of our own include files. +CFLAGS += -DCONFIG_NFCT_PINS_AS_GPIOS diff --git a/ports/nrf/mphalport.c b/ports/nrf/mphalport.c index 73f38bada..ea864e7ce 100644 --- a/ports/nrf/mphalport.c +++ b/ports/nrf/mphalport.c @@ -42,7 +42,8 @@ void mp_hal_delay_ms(mp_uint_t delay) { MICROPY_VM_HOOK_LOOP #endif // Check to see if we've been CTRL-Ced by autoreload or the user. - if(MP_STATE_VM(mp_pending_exception) == MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_kbd_exception))) { + if(MP_STATE_VM(mp_pending_exception) == MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_kbd_exception)) || + MP_STATE_VM(mp_pending_exception) == MP_OBJ_FROM_PTR(&MP_STATE_VM(mp_reload_exception))) { break; } duration = (ticks_ms - start_tick); diff --git a/ports/nrf/nrfx b/ports/nrf/nrfx -Subproject b96950abf27229c2a3b1719d60691321246bfc9 +Subproject 3d268263be2390ab760f75a3da72689ef13031a diff --git a/ports/nrf/nrfx_config.h b/ports/nrf/nrfx_config.h index 1d3085e2b..57a2727aa 100644 --- a/ports/nrf/nrfx_config.h +++ b/ports/nrf/nrfx_config.h @@ -10,9 +10,10 @@ #define NRFX_SPIS_NRF52_ANOMALY_109_WORKAROUND_ENABLED 1 #endif +// NOTE: THIS WORKAROUND CAUSES BLE CODE TO CRASH; tested on 2019-03-11. // Turn on nrfx supported workarounds for errata in Rev1 of nRF52840 #ifdef NRF52840_XXAA - #define NRFX_SPIM3_NRF52840_ANOMALY_198_WORKAROUND_ENABLED 1 +// #define NRFX_SPIM3_NRF52840_ANOMALY_198_WORKAROUND_ENABLED 1 #endif // SPI @@ -25,13 +26,17 @@ // We could write an interrupt handler that checks whether it's // being used for SPI or I2C, but perhaps two I2C's and 1-2 SPI's are good enough for now. -// Enable SPIM2 and SPIM3 (if available) +// Enable SPIM1, SPIM2 and SPIM3 (if available) +// No conflict with TWIM0. +#define NRFX_SPIM1_ENABLED 1 #define NRFX_SPIM2_ENABLED 1 -#ifdef NRF_SPIM3 - #define NRFX_SPIM3_ENABLED 1 -#else - #define NRFX_SPIM3_ENABLED 0 -#endif +// DON'T ENABLE SPIM3 DUE TO ANOMALY WORKAROUND FAILURE (SEE ABOVE). +// #ifdef NRF52840_XXAA +// #define NRFX_SPIM_EXTENDED_ENABLED 1 +// #define NRFX_SPIM3_ENABLED 1 +// #else +// #define NRFX_SPIM3_ENABLED 0 +// #endif #define NRFX_SPIM_DEFAULT_CONFIG_IRQ_PRIORITY 7 @@ -40,10 +45,10 @@ // QSPI #define NRFX_QSPI_ENABLED 1 -// TWI aka. I2C; enable TWIM0 and TWIM1 (no conflict with SPIM choices) +// TWI aka. I2C; enable a single bus: TWIM0 (no conflict with SPIM1 and SPIM2) #define NRFX_TWIM_ENABLED 1 #define NRFX_TWIM0_ENABLED 1 -#define NRFX_TWIM1_ENABLED 1 +//#define NRFX_TWIM1_ENABLED 1 #define NRFX_TWIM_DEFAULT_CONFIG_IRQ_PRIORITY 7 #define NRFX_TWIM_DEFAULT_CONFIG_FREQUENCY NRF_TWIM_FREQ_400K @@ -52,6 +57,7 @@ // UART #define NRFX_UARTE_ENABLED 1 #define NRFX_UARTE0_ENABLED 1 +#define NRFX_UARTE1_ENABLED 1 // PWM #define NRFX_PWM0_ENABLED 1 @@ -84,4 +90,9 @@ #define NRFX_TIMER_DEFAULT_CONFIG_IRQ_PRIORITY 7 +// GPIO interrupt +#define NRFX_GPIOTE_ENABLED 1 +#define NRFX_GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS 1 +#define NRFX_GPIOTE_CONFIG_IRQ_PRIORITY 7 + #endif // NRFX_CONFIG_H__ diff --git a/ports/nrf/peripherals/nrf/nrf52832/pins.c b/ports/nrf/peripherals/nrf/nrf52832/pins.c deleted file mode 100644 index fdfa766ec..000000000 --- a/ports/nrf/peripherals/nrf/nrf52832/pins.c +++ /dev/null @@ -1,65 +0,0 @@ -/* - * This file is part of the MicroPython project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2018 Dan Halbert for Adafruit Industries - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -// DO NOT include this file directly. Use shared-bindings/microcontroller/Pin.h instead to ensure -// that all necessary includes are already included. - -#include "py/obj.h" -#include "py/mphal.h" -#include "nrf/pins.h" - -const mcu_pin_obj_t pin_P0_00 = PIN(P0_00, 0, 0, 0); -const mcu_pin_obj_t pin_P0_01 = PIN(P0_01, 0, 1, 0); -const mcu_pin_obj_t pin_P0_02 = PIN(P0_02, 0, 2, SAADC_CH_PSELP_PSELP_AnalogInput0); -const mcu_pin_obj_t pin_P0_03 = PIN(P0_03, 0, 3, SAADC_CH_PSELP_PSELP_AnalogInput1); -const mcu_pin_obj_t pin_P0_04 = PIN(P0_04, 0, 4, SAADC_CH_PSELP_PSELP_AnalogInput2); -const mcu_pin_obj_t pin_P0_05 = PIN(P0_05, 0, 5, SAADC_CH_PSELP_PSELP_AnalogInput3); -const mcu_pin_obj_t pin_P0_06 = PIN(P0_06, 0, 6, 0); -const mcu_pin_obj_t pin_P0_07 = PIN(P0_07, 0, 7, 0); -const mcu_pin_obj_t pin_P0_08 = PIN(P0_08, 0, 8, 0); -const mcu_pin_obj_t pin_P0_09 = PIN(P0_09, 0, 9, 0); -const mcu_pin_obj_t pin_P0_10 = PIN(P0_10, 0, 10, 0); -const mcu_pin_obj_t pin_P0_11 = PIN(P0_11, 0, 11, 0); -const mcu_pin_obj_t pin_P0_12 = PIN(P0_12, 0, 12, 0); -const mcu_pin_obj_t pin_P0_13 = PIN(P0_13, 0, 13, 0); -const mcu_pin_obj_t pin_P0_14 = PIN(P0_14, 0, 14, 0); -const mcu_pin_obj_t pin_P0_15 = PIN(P0_15, 0, 15, 0); -const mcu_pin_obj_t pin_P0_16 = PIN(P0_16, 0, 16, 0); -const mcu_pin_obj_t pin_P0_17 = PIN(P0_17, 0, 17, 0); -const mcu_pin_obj_t pin_P0_18 = PIN(P0_18, 0, 18, 0); -const mcu_pin_obj_t pin_P0_19 = PIN(P0_19, 0, 19, 0); -const mcu_pin_obj_t pin_P0_20 = PIN(P0_20, 0, 20, 0); -const mcu_pin_obj_t pin_P0_21 = PIN(P0_21, 0, 21, 0); -const mcu_pin_obj_t pin_P0_22 = PIN(P0_22, 0, 22, 0); -const mcu_pin_obj_t pin_P0_23 = PIN(P0_23, 0, 23, 0); -const mcu_pin_obj_t pin_P0_24 = PIN(P0_24, 0, 24, 0); -const mcu_pin_obj_t pin_P0_25 = PIN(P0_25, 0, 25, 0); -const mcu_pin_obj_t pin_P0_26 = PIN(P0_26, 0, 26, 0); -const mcu_pin_obj_t pin_P0_27 = PIN(P0_27, 0, 27, 0); -const mcu_pin_obj_t pin_P0_28 = PIN(P0_28, 0, 28, SAADC_CH_PSELP_PSELP_AnalogInput4); -const mcu_pin_obj_t pin_P0_29 = PIN(P0_29, 0, 29, SAADC_CH_PSELP_PSELP_AnalogInput5); -const mcu_pin_obj_t pin_P0_30 = PIN(P0_30, 0, 30, SAADC_CH_PSELP_PSELP_AnalogInput6); -const mcu_pin_obj_t pin_P0_31 = PIN(P0_31, 0, 31, SAADC_CH_PSELP_PSELP_AnalogInput7); diff --git a/ports/nrf/peripherals/nrf/nrf52832/pins.h b/ports/nrf/peripherals/nrf/nrf52832/pins.h deleted file mode 100644 index f8ef85ad0..000000000 --- a/ports/nrf/peripherals/nrf/nrf52832/pins.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * This file is part of the MicroPython project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2018 by Dan Halbert for Adafruit Industries - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#ifndef MICROPY_INCLUDED_NRF_PERIPHERALS_NRF52832_PINS_H -#define MICROPY_INCLUDED_NRF_PERIPHERALS_NRF52832_PINS_H - -extern const mcu_pin_obj_t pin_P0_00; -extern const mcu_pin_obj_t pin_P0_01; -extern const mcu_pin_obj_t pin_P0_02; -extern const mcu_pin_obj_t pin_P0_03; -extern const mcu_pin_obj_t pin_P0_04; -extern const mcu_pin_obj_t pin_P0_05; -extern const mcu_pin_obj_t pin_P0_06; -extern const mcu_pin_obj_t pin_P0_07; -extern const mcu_pin_obj_t pin_P0_08; -extern const mcu_pin_obj_t pin_P0_09; -extern const mcu_pin_obj_t pin_P0_10; -extern const mcu_pin_obj_t pin_P0_11; -extern const mcu_pin_obj_t pin_P0_12; -extern const mcu_pin_obj_t pin_P0_13; -extern const mcu_pin_obj_t pin_P0_14; -extern const mcu_pin_obj_t pin_P0_15; -extern const mcu_pin_obj_t pin_P0_16; -extern const mcu_pin_obj_t pin_P0_17; -extern const mcu_pin_obj_t pin_P0_18; -extern const mcu_pin_obj_t pin_P0_19; -extern const mcu_pin_obj_t pin_P0_20; -extern const mcu_pin_obj_t pin_P0_21; -extern const mcu_pin_obj_t pin_P0_22; -extern const mcu_pin_obj_t pin_P0_23; -extern const mcu_pin_obj_t pin_P0_24; -extern const mcu_pin_obj_t pin_P0_25; -extern const mcu_pin_obj_t pin_P0_26; -extern const mcu_pin_obj_t pin_P0_27; -extern const mcu_pin_obj_t pin_P0_28; -extern const mcu_pin_obj_t pin_P0_29; -extern const mcu_pin_obj_t pin_P0_30; -extern const mcu_pin_obj_t pin_P0_31; - -#endif // MICROPY_INCLUDED_NRF_PERIPHERALS_NRF52832_PINS_H diff --git a/ports/nrf/peripherals/nrf/pins.h b/ports/nrf/peripherals/nrf/pins.h index 33462d711..3a4c99579 100644 --- a/ports/nrf/peripherals/nrf/pins.h +++ b/ports/nrf/peripherals/nrf/pins.h @@ -56,11 +56,7 @@ extern const mp_obj_type_t mcu_pin_type; // Use illegal pin value to mark unassigned pins. #define NO_PIN 0xff -// Choose based on chip, but not specifically revision (e.g., not NRF52832_XXAA) -#ifdef NRF52832 -#include "nrf52832/pins.h" -#endif - +// Choose based on chip, but not specifically revision (e.g., not NRF52840_XXAA) #ifdef NRF52840 #include "nrf52840/pins.h" #endif diff --git a/ports/nrf/sd_mutex.c b/ports/nrf/sd_mutex.c new file mode 100644 index 000000000..7682ffa62 --- /dev/null +++ b/ports/nrf/sd_mutex.c @@ -0,0 +1,56 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Dan Halbert for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "py/mpconfig.h" +#include "py/runtime.h" +#include "nrf_soc.h" + +void sd_mutex_acquire_check(nrf_mutex_t* p_mutex) { + uint32_t err_code = sd_mutex_acquire(p_mutex); + if (err_code != NRF_SUCCESS) { + mp_raise_OSError_msg_varg(translate("Failed to acquire mutex, err 0x%04x"), err_code); + } +} + +void sd_mutex_acquire_wait(nrf_mutex_t* p_mutex) { + while (sd_mutex_acquire(p_mutex) == NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN) { +#ifdef MICROPY_VM_HOOK_LOOP + MICROPY_VM_HOOK_LOOP +#endif + } +} + +void sd_mutex_acquire_wait_no_vm(nrf_mutex_t* p_mutex) { + while (sd_mutex_acquire(p_mutex) == NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN) { + } +} + +void sd_mutex_release_check(nrf_mutex_t* p_mutex) { + uint32_t err_code = sd_mutex_release(p_mutex); + if (err_code != NRF_SUCCESS) { + mp_raise_OSError_msg_varg(translate("Failed to release mutex, err 0x%04x"), err_code); + } +} diff --git a/ports/nrf/sd_mutex.h b/ports/nrf/sd_mutex.h new file mode 100644 index 000000000..ca4691720 --- /dev/null +++ b/ports/nrf/sd_mutex.h @@ -0,0 +1,46 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Dan Halbert for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_NRF_SD_MUTEX_H +#define MICROPY_INCLUDED_NRF_SD_MUTEX_H + +#include "nrf_soc.h" + +// Helpers for common usage of nrf_mutex. + +// Try to acquire a mutex right now. Raise exception if we can't get it. +void sd_mutex_acquire_check(nrf_mutex_t* p_mutex); + +// Wait for a mutex to become available. Run VM background tasks while waiting. +void sd_mutex_acquire_wait(nrf_mutex_t* p_mutex); + +// Wait for a mutex to become available.. Block VM while waiting. +void sd_mutex_acquire_wait_no_vm(nrf_mutex_t* p_mutex); + +// Release a mutex, and raise exception on error. +void sd_mutex_release_check(nrf_mutex_t* p_mutex); + +#endif // MICROPY_INCLUDED_NRF_SD_MUTEX_H diff --git a/ports/nrf/supervisor/internal_flash.c b/ports/nrf/supervisor/internal_flash.c index a648afa17..273213244 100644 --- a/ports/nrf/supervisor/internal_flash.c +++ b/ports/nrf/supervisor/internal_flash.c @@ -38,6 +38,7 @@ #include "nrf_nvmc.h" #ifdef BLUETOOTH_SD +#include "ble_drv.h" #include "nrf_sdm.h" #endif @@ -70,21 +71,75 @@ uint32_t supervisor_flash_get_block_count(void) { return ((uint32_t) __fatfs_flash_length) / FILESYSTEM_BLOCK_SIZE ; } -// TODO support flashing with SD enabled +#ifdef BLUETOOTH_SD +STATIC void sd_flash_operation_start(void) { + sd_flash_operation_status = SD_FLASH_OPERATION_IN_PROGRESS; +} + +STATIC sd_flash_operation_status_t sd_flash_operation_wait_until_done(void) { + while (sd_flash_operation_status == SD_FLASH_OPERATION_IN_PROGRESS) { + sd_app_evt_wait(); + } + return sd_flash_operation_status; +} +#endif + void supervisor_flash_flush(void) { if (_flash_page_addr == NO_CACHE) return; // Skip if data is the same if (memcmp(_flash_cache, (void *)_flash_page_addr, FL_PAGE_SZ) != 0) { -// _is_flashing = true; - nrf_nvmc_page_erase(_flash_page_addr); - nrf_nvmc_write_words(_flash_page_addr, (uint32_t *)_flash_cache, FL_PAGE_SZ / sizeof(uint32_t)); - } +#ifdef BLUETOOTH_SD + uint8_t sd_en = 0; + (void) sd_softdevice_is_enabled(&sd_en); + + if (sd_en) { + uint32_t err_code; + sd_flash_operation_status_t status; + + sd_flash_operation_start(); + err_code = sd_flash_page_erase(_flash_page_addr / FL_PAGE_SZ); + if (err_code != NRF_SUCCESS) { + mp_raise_OSError_msg_varg(translate("Flash erase failed to start, err 0x%04x"), err_code); + } + status = sd_flash_operation_wait_until_done(); + if (status == SD_FLASH_OPERATION_ERROR) { + mp_raise_OSError_msg(translate("Flash erase failed")); + } + + // Divide a full page into parts, because writing a full page causes an assertion failure. + // See https://devzone.nordicsemi.com/f/nordic-q-a/40088/sd_flash_write-cause-nrf_fault_id_sd_assert/ + const size_t BLOCK_PARTS = 2; + size_t words_to_write = FL_PAGE_SZ / sizeof(uint32_t) / BLOCK_PARTS; + for (size_t i = 0; i < BLOCK_PARTS; i++) { + sd_flash_operation_start(); + err_code = sd_flash_write(((uint32_t *)_flash_page_addr) + i * words_to_write, + (uint32_t *)_flash_cache + i * words_to_write, + words_to_write); + if (err_code != NRF_SUCCESS) { + mp_raise_OSError_msg_varg(translate("Flash write failed to start, err 0x%04x"), err_code); + } + status = sd_flash_operation_wait_until_done(); + if (status == SD_FLASH_OPERATION_ERROR) { + mp_raise_OSError_msg(translate("Flash write failed")); + } + } + } else { +#endif + nrf_nvmc_page_erase(_flash_page_addr); + nrf_nvmc_write_words(_flash_page_addr, (uint32_t *)_flash_cache, FL_PAGE_SZ / sizeof(uint32_t)); +#ifdef BLUETOOTH_SD + } +#endif + + } _flash_page_addr = NO_CACHE; } mp_uint_t supervisor_flash_read_blocks(uint8_t *dest, uint32_t block, uint32_t num_blocks) { + // Must write out anything in cache before trying to read. + supervisor_flash_flush(); uint32_t src = lba2addr(block); memcpy(dest, (uint8_t*) src, FILESYSTEM_BLOCK_SIZE*num_blocks); return 0; // success @@ -101,14 +156,12 @@ mp_uint_t supervisor_flash_write_blocks(const uint8_t *src, uint32_t lba, uint32 if (page_addr != _flash_page_addr) { supervisor_flash_flush(); - // writing previous cached data, skip current data until flashing is done - // tinyusb stack will invoke write_block() with the same parameters later on - // if ( _is_flashing ) return; - _flash_page_addr = page_addr; + // Copy the current contents of the entire page into the cache. memcpy(_flash_cache, (void *)page_addr, FL_PAGE_SZ); } + // Overwrite part or all of the page cache with the src data. memcpy(_flash_cache + (addr & (FL_PAGE_SZ - 1)), src, count * FILESYSTEM_BLOCK_SIZE); // adjust for next run diff --git a/ports/nrf/supervisor/port.c b/ports/nrf/supervisor/port.c index ece5bae29..fd077a46a 100644 --- a/ports/nrf/supervisor/port.c +++ b/ports/nrf/supervisor/port.c @@ -38,10 +38,13 @@ #include "shared-module/gamepad/__init__.h" #include "common-hal/microcontroller/Pin.h" +#include "common-hal/bleio/__init__.h" #include "common-hal/busio/I2C.h" #include "common-hal/busio/SPI.h" +#include "common-hal/busio/UART.h" #include "common-hal/pulseio/PWMOut.h" #include "common-hal/pulseio/PulseOut.h" +#include "common-hal/pulseio/PulseIn.h" #include "tick.h" static void power_warning_handler(void) { @@ -82,10 +85,14 @@ void reset_port(void) { i2c_reset(); spi_reset(); + uart_reset(); pwmout_reset(); pulseout_reset(); + pulsein_reset(); timers_reset(); + bleio_reset(); + reset_all_pins(); } diff --git a/ports/nrf/supervisor/usb.c b/ports/nrf/supervisor/usb.c index a67c9311a..bb9d78101 100644 --- a/ports/nrf/supervisor/usb.c +++ b/ports/nrf/supervisor/usb.c @@ -36,15 +36,18 @@ #include "nrf_soc.h" #endif -/* tinyusb function that handles power event (detected, ready, removed) - * We must call it within SD's SOC event handler, or set it as power event handler if SD is not enabled. - */ +// tinyusb function that handles power event (detected, ready, removed) +// We must call it within SD's SOC event handler, or set it as power event handler if SD is not enabled. extern void tusb_hal_nrf_power_event(uint32_t event); void init_usb_hardware(void) { + // 2 is max priority (0, 1 are reserved for SD) + NVIC_SetPriority(USBD_IRQn, 2); + // USB power may already be ready at this time -> no event generated - // We need to invoke the handler based on the status initially + // We need to invoke the handler based on the status initially for the first call + static bool first_call = true; uint32_t usb_reg; #ifdef SOFTDEVICE_PRESENT @@ -73,11 +76,14 @@ void init_usb_hardware(void) { usb_reg = NRF_POWER->USBREGSTATUS; } - if ( usb_reg & POWER_USBREGSTATUS_VBUSDETECT_Msk ) { - tusb_hal_nrf_power_event(NRFX_POWER_USB_EVT_DETECTED); - } + if ( first_call ) { + first_call = false; + if ( usb_reg & POWER_USBREGSTATUS_VBUSDETECT_Msk ) { + tusb_hal_nrf_power_event(NRFX_POWER_USB_EVT_DETECTED); + } - if ( usb_reg & POWER_USBREGSTATUS_OUTPUTRDY_Msk ) { - tusb_hal_nrf_power_event(NRFX_POWER_USB_EVT_READY); + if ( usb_reg & POWER_USBREGSTATUS_OUTPUTRDY_Msk ) { + tusb_hal_nrf_power_event(NRFX_POWER_USB_EVT_READY); + } } } diff --git a/ports/nrf/tick.c b/ports/nrf/tick.c index cdd329f71..6d8fd13e0 100644 --- a/ports/nrf/tick.c +++ b/ports/nrf/tick.c @@ -27,6 +27,7 @@ #include "tick.h" #include "supervisor/shared/autoreload.h" +#include "supervisor/filesystem.h" #include "shared-module/gamepad/__init__.h" #include "shared-bindings/microcontroller/Processor.h" #include "nrf.h" @@ -39,14 +40,17 @@ void SysTick_Handler(void) { // (every millisecond). ticks_ms += 1; - #ifdef CIRCUITPY_AUTORELOAD_DELAY_MS - autoreload_tick(); - #endif - #ifdef CIRCUITPY_GAMEPAD_TICKS +#if CIRCUITPY_FILESYSTEM_FLUSH_INTERVAL_MS > 0 + filesystem_tick(); +#endif +#ifdef CIRCUITPY_AUTORELOAD_DELAY_MS + autoreload_tick(); +#endif +#ifdef CIRCUITPY_GAMEPAD_TICKS if (!(ticks_ms & CIRCUITPY_GAMEPAD_TICKS)) { gamepad_tick(); } - #endif +#endif } void tick_init() { diff --git a/ports/unix/Makefile b/ports/unix/Makefile index 8775ec11a..7ffa0fd08 100644 --- a/ports/unix/Makefile +++ b/ports/unix/Makefile @@ -149,11 +149,21 @@ SRC_C = \ alloc.c \ coverage.c \ fatfs_port.c \ + supervisor/stub/filesystem.c \ + supervisor/stub/safe_mode.c \ supervisor/stub/serial.c \ supervisor/stub/stack.c \ supervisor/shared/translate.c \ $(SRC_MOD) +PY_EXTMOD_O_BASENAME += \ + extmod/machine_mem.o \ + extmod/machine_pinbase.o \ + extmod/machine_signal.o \ + extmod/machine_pulse.o \ + extmod/machine_i2c.o \ + extmod/machine_spi.o + LIB_SRC_C = $(addprefix lib/,\ $(LIB_SRC_C_EXTRA) \ timeutils/timeutils.c \ @@ -247,7 +257,7 @@ coverage: $(MAKE) \ COPT="-O0" CFLAGS_EXTRA='$(CFLAGS_EXTRA) -DMP_CONFIGFILE="<mpconfigport_coverage.h>" \ -fprofile-arcs -ftest-coverage \ - -Wdouble-promotion -Wformat -Wmissing-declarations -Wmissing-prototypes -Wsign-compare \ + -Wformat -Wmissing-declarations -Wmissing-prototypes -Wsign-compare \ -Wold-style-definition -Wpointer-arith -Wshadow -Wuninitialized -Wunused-parameter \ -DMICROPY_UNIX_COVERAGE' \ LDFLAGS_EXTRA='-fprofile-arcs -ftest-coverage' \ diff --git a/ports/unix/file.c b/ports/unix/file.c index 98ac1b3cc..c0cf6dcc4 100644 --- a/ports/unix/file.c +++ b/ports/unix/file.c @@ -205,9 +205,9 @@ STATIC mp_obj_t fdfile_open(const mp_obj_type_t *type, mp_arg_val_t *args) { return MP_OBJ_FROM_PTR(o); } -STATIC mp_obj_t fdfile_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +STATIC mp_obj_t fdfile_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { mp_arg_val_t arg_vals[FILE_OPEN_NUM_ARGS]; - mp_arg_parse_all_kw_array(n_args, n_kw, args, FILE_OPEN_NUM_ARGS, file_open_args, arg_vals); + mp_arg_parse_all(n_args, args, kw_args, FILE_OPEN_NUM_ARGS, file_open_args, arg_vals); return fdfile_open(type, arg_vals); } diff --git a/ports/unix/modffi.c b/ports/unix/modffi.c index fcbcebc39..03dc9e4ec 100644 --- a/ports/unix/modffi.c +++ b/ports/unix/modffi.c @@ -304,9 +304,9 @@ STATIC mp_obj_t ffimod_addr(mp_obj_t self_in, mp_obj_t symname_in) { } MP_DEFINE_CONST_FUN_OBJ_2(ffimod_addr_obj, ffimod_addr); -STATIC mp_obj_t ffimod_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +STATIC mp_obj_t ffimod_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { (void)n_args; - (void)n_kw; + (void)kw_args; const char *fname = NULL; if (args[0] != mp_const_none) { @@ -481,7 +481,7 @@ STATIC const mp_obj_type_t opaque_type = { */ STATIC mp_obj_t mod_ffi_open(size_t n_args, const mp_obj_t *args) { - return ffimod_make_new(&ffimod_type, n_args, 0, args); + return ffimod_make_new(&ffimod_type, n_args, args, NULL); } MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mod_ffi_open_obj, 1, 2, mod_ffi_open); diff --git a/ports/unix/modusocket.c b/ports/unix/modusocket.c index 9b9869f5b..84e9298fd 100644 --- a/ports/unix/modusocket.c +++ b/ports/unix/modusocket.c @@ -325,9 +325,9 @@ STATIC mp_obj_t socket_makefile(size_t n_args, const mp_obj_t *args) { } STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socket_makefile_obj, 1, 3, socket_makefile); -STATIC mp_obj_t socket_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *args) { +STATIC mp_obj_t socket_make_new(const mp_obj_type_t *type_in, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { (void)type_in; - (void)n_kw; + (void)kw_args; int family = AF_INET; int type = SOCK_STREAM; diff --git a/py/argcheck.c b/py/argcheck.c index 5cc18d6a2..a8df206e2 100644 --- a/py/argcheck.c +++ b/py/argcheck.c @@ -31,13 +31,22 @@ #include "supervisor/shared/translate.h" -void mp_arg_check_num(size_t n_args, size_t n_kw, size_t n_args_min, size_t n_args_max, bool takes_kw) { + +void mp_arg_check_num(size_t n_args, mp_map_t *kw_args, size_t n_args_min, size_t n_args_max, bool takes_kw) { + size_t n_kw = 0; + if (kw_args != NULL) { + n_kw = kw_args->used; + } + mp_arg_check_num_kw_array(n_args, n_kw, n_args_min, n_args_max, takes_kw); +} + +void mp_arg_check_num_kw_array(size_t n_args, size_t n_kw, size_t n_args_min, size_t n_args_max, bool takes_kw) { // NOTE(tannewt): This prevents this function from being optimized away. // Without it, functions can crash when reading invalid args. __asm volatile (""); // TODO maybe take the function name as an argument so we can print nicer error messages - if (n_kw && !takes_kw) { + if (n_kw > 0 && !takes_kw) { #if MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE mp_arg_error_terse_mismatch(); #else diff --git a/py/binary.c b/py/binary.c index ca851c936..9c3a49e8f 100644 --- a/py/binary.c +++ b/py/binary.c @@ -49,7 +49,7 @@ size_t mp_binary_get_size(char struct_type, char val_type, mp_uint_t *palign) { switch (struct_type) { case '<': case '>': switch (val_type) { - case 'b': case 'B': + case 'b': case 'B': case 'x': size = 1; break; case 'h': case 'H': size = 2; break; @@ -79,7 +79,7 @@ size_t mp_binary_get_size(char struct_type, char val_type, mp_uint_t *palign) { // particular (or any) ABI. switch (val_type) { case BYTEARRAY_TYPECODE: - case 'b': case 'B': + case 'b': case 'B': case 'x': align = size = 1; break; case 'h': case 'H': align = alignof(short); @@ -126,6 +126,7 @@ mp_obj_t mp_binary_get_val_array(char typecode, void *p, mp_uint_t index) { break; case BYTEARRAY_TYPECODE: case 'B': + case 'x': // value will be discarded val = ((unsigned char*)p)[index]; break; case 'h': @@ -364,6 +365,8 @@ void mp_binary_set_val_array_from_int(char typecode, void *p, mp_uint_t index, m case 'B': ((unsigned char*)p)[index] = val; break; + case 'x': + ((unsigned char*)p)[index] = 0; case 'h': ((short*)p)[index] = val; break; diff --git a/py/circuitpy_defns.mk b/py/circuitpy_defns.mk new file mode 100644 index 000000000..7a369817a --- /dev/null +++ b/py/circuitpy_defns.mk @@ -0,0 +1,357 @@ +# This file is part of the MicroPython project, http://micropython.org/ +# +# The MIT License (MIT) +# +# Copyright (c) 2019 Dan Halbert for Adafruit Industries +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +# Common Makefile definitions that can be shared across CircuitPython ports. + +### +# Common compile warnings. + +BASE_CFLAGS = \ + -fsingle-precision-constant \ + -fno-strict-aliasing \ + -Wdouble-promotion \ + -Wno-endif-labels \ + -Wstrict-prototypes \ + -Werror-implicit-function-declaration \ + -Wfloat-equal \ + -Wundef \ + -Wshadow \ + -Wwrite-strings \ + -Wsign-compare \ + -Wmissing-format-attribute \ + -Wno-deprecated-declarations \ + -Wnested-externs \ + -Wunreachable-code \ + -Wcast-align \ + -Wno-error=lto-type-mismatch \ + -D__$(CHIP_VARIANT)__ \ + -ffunction-sections \ + -fdata-sections \ + -fshort-enums \ + -DCIRCUITPY_SOFTWARE_SAFE_MODE=0x0ADABEEF \ + -DCIRCUITPY_CANARY_WORD=0xADAF00 \ + -DCIRCUITPY_SAFE_RESTART_WORD=0xDEADBEEF \ + --param max-inline-insns-single=500 + +# Use these flags to debug build times and header includes. +# -ftime-report +# -H + + +### +# Handle frozen modules. + +ifneq ($(FROZEN_DIR),) +# To use frozen source modules, put your .py files in a subdirectory (eg scripts/) +# and then invoke make with FROZEN_DIR=scripts (be sure to build from scratch). +CFLAGS += -DMICROPY_MODULE_FROZEN_STR +CFLAGS += -Wno-error=lto-type-mismatch +endif + +# To use frozen bytecode, put your .py files in a subdirectory (eg frozen/) and +# then invoke make with FROZEN_MPY_DIR=frozen or FROZEN_MPY_DIRS="dir1 dir2" +# (be sure to build from scratch). + +ifneq ($(FROZEN_MPY_DIRS),) +CFLAGS += -DMICROPY_QSTR_EXTRA_POOL=mp_qstr_frozen_const_pool +CFLAGS += -DMICROPY_MODULE_FROZEN_MPY +CFLAGS += -Wno-error=lto-type-mismatch +endif + + +### +# Propagate longint choice from .mk to C. There's no easy string comparison +# in cpp conditionals, so we #define separate names for each. +ifeq ($(LONGINT_IMPL),NONE) +CFLAGS += -DLONGINT_IMPL_NONE +endif + +ifeq ($(LONGINT_IMPL),MPZ) +CFLAGS += -DLONGINT_IMPL_MPZ +endif + +ifeq ($(LONGINT_IMPL),LONGLONG) +CFLAGS += -DLONGINT_IMPL_LONGLONG +endif + + +### +# Select which builtin modules to compile and include. + +ifeq ($(CIRCUITPY_ANALOGIO),1) +SRC_PATTERNS += analogio/% +endif +ifeq ($(CIRCUITPY_AUDIOBUSIO),1) +SRC_PATTERNS += audiobusio/% +endif +ifeq ($(CIRCUITPY_AUDIOIO),1) +SRC_PATTERNS += audioio/% +endif +ifeq ($(CIRCUITPY_BITBANGIO),1) +SRC_PATTERNS += bitbangio/% +endif +ifeq ($(CIRCUITPY_BLEIO),1) +SRC_PATTERNS += bleio/% +endif +ifeq ($(CIRCUITPY_BOARD),1) +SRC_PATTERNS += board/% +endif +ifeq ($(CIRCUITPY_BUSIO),1) +SRC_PATTERNS += busio/% bitbangio/OneWire.% +endif +ifeq ($(CIRCUITPY_DIGITALIO),1) +SRC_PATTERNS += digitalio/% +endif +ifeq ($(CIRCUITPY_DISPLAYIO),1) +SRC_PATTERNS += displayio/% terminalio/% fontio/% +endif +ifeq ($(CIRCUITPY_FREQUENCYIO),1) +SRC_PATTERNS += frequencyio/% +endif +ifeq ($(CIRCUITPY_GAMEPAD),1) +SRC_PATTERNS += gamepad/% +endif +ifeq ($(CIRCUITPY_I2CSLAVE),1) +SRC_PATTERNS += i2cslave/% +endif +ifeq ($(CIRCUITPY_MATH),1) +SRC_PATTERNS += math/% +endif +ifeq ($(CIRCUITPY_MICROCONTROLLER),1) +SRC_PATTERNS += microcontroller/% +endif +ifeq ($(CIRCUITPY_NEOPIXEL_WRITE),1) +SRC_PATTERNS += neopixel_write/% +endif +ifeq ($(CIRCUITPY_NETWORK),1) +SRC_PATTERNS += network/% socket/% +endif +ifeq ($(CIRCUITPY_NVM),1) +SRC_PATTERNS += nvm/% +endif +ifeq ($(CIRCUITPY_OS),1) +SRC_PATTERNS += os/% +endif +ifeq ($(CIRCUITPY_PIXELBUF),1) +SRC_PATTERNS += _pixelbuf/% +endif +ifeq ($(CIRCUITPY_PULSEIO),1) +SRC_PATTERNS += pulseio/% +endif +ifeq ($(CIRCUITPY_RANDOM),1) +SRC_PATTERNS += random/% +endif +ifeq ($(CIRCUITPY_ROTARYIO),1) +SRC_PATTERNS += rotaryio/% +endif +ifeq ($(CIRCUITPY_RTC),1) +SRC_PATTERNS += rtc/% +endif +ifeq ($(CIRCUITPY_SAMD),1) +SRC_PATTERNS += samd/% +endif +ifeq ($(CIRCUITPY_STAGE),1) +SRC_PATTERNS += _stage/% +endif +ifeq ($(CIRCUITPY_STORAGE),1) +SRC_PATTERNS += storage/% +endif +ifeq ($(CIRCUITPY_STRUCT),1) +SRC_PATTERNS += struct/% +endif +ifeq ($(CIRCUITPY_SUPERVISOR),1) +SRC_PATTERNS += supervisor/% +endif +ifeq ($(CIRCUITPY_TIME),1) +SRC_PATTERNS += time/% +endif +ifeq ($(CIRCUITPY_TOUCHIO),1) +SRC_PATTERNS += touchio/% +endif +ifeq ($(CIRCUITPY_UHEAP),1) +SRC_PATTERNS += uheap/% +endif +ifeq ($(CIRCUITPY_USB_HID),1) +SRC_PATTERNS += usb_hid/% +endif +ifeq ($(CIRCUITPY_USB_MIDI),1) +SRC_PATTERNS += usb_midi/% +endif +ifeq ($(CIRCUITPY_USTACK),1) +SRC_PATTERNS += ustack/% +endif +ifeq ($(CIRCUITPY_PEW),1) +SRC_PATTERNS += _pew/% +endif + +# All possible sources are listed here, and are filtered by SRC_PATTERNS. +SRC_COMMON_HAL = \ +$(filter $(SRC_PATTERNS), \ + analogio/AnalogIn.c \ + analogio/AnalogOut.c \ + analogio/__init__.c \ + audiobusio/__init__.c \ + audiobusio/I2SOut.c \ + audiobusio/PDMIn.c \ + audioio/__init__.c \ + audioio/AudioOut.c \ + bleio/__init__.c \ + bleio/Adapter.c \ + bleio/Broadcaster.c \ + bleio/Characteristic.c \ + bleio/CharacteristicBuffer.c \ + bleio/Descriptor.c \ + bleio/Peripheral.c \ + bleio/Scanner.c \ + bleio/Service.c \ + bleio/UUID.c \ + board/__init__.c \ + busio/I2C.c \ + busio/SPI.c \ + busio/UART.c \ + busio/__init__.c \ + digitalio/DigitalInOut.c \ + digitalio/__init__.c \ + displayio/ParallelBus.c \ + frequencyio/__init__.c \ + frequencyio/FrequencyIn.c \ + i2cslave/I2CSlave.c \ + i2cslave/__init__.c \ + microcontroller/Pin.c \ + microcontroller/Processor.c \ + microcontroller/__init__.c \ + neopixel_write/__init__.c \ + nvm/ByteArray.c \ + nvm/__init__.c \ + os/__init__.c \ + pulseio/PWMOut.c \ + pulseio/PulseIn.c \ + pulseio/PulseOut.c \ + pulseio/__init__.c \ + rotaryio/IncrementalEncoder.c \ + rotaryio/__init__.c \ + rtc/RTC.c \ + rtc/__init__.c \ + supervisor/Runtime.c \ + supervisor/__init__.c \ + time/__init__.c \ + touchio/TouchIn.c \ + touchio/__init__.c \ +) + +# These don't have corresponding files in each port but are still located in +# shared-bindings to make it clear what the contents of the modules are. +# All possible sources are listed here, and are filtered by SRC_PATTERNS. +SRC_BINDINGS_ENUMS = \ +$(filter $(SRC_PATTERNS), \ + digitalio/Direction.c \ + digitalio/DriveMode.c \ + digitalio/Pull.c \ + fontio/Glyph.c \ + microcontroller/RunMode.c \ + math/__init__.c \ + supervisor/__init__.c \ +) + +SRC_BINDINGS_ENUMS += \ + help.c \ + util.c + +SRC_BINDINGS_ENUMS += \ +$(filter $(SRC_PATTERNS), \ + bleio/Address.c \ + bleio/AddressType.c \ + bleio/AdvertisementData.c \ + bleio/ScanEntry.c \ +) + +# All possible sources are listed here, and are filtered by SRC_PATTERNS. +SRC_SHARED_MODULE = \ +$(filter $(SRC_PATTERNS), \ + _pixelbuf/PixelBuf.c \ + _pixelbuf/__init__.c \ + _stage/Layer.c \ + _stage/Text.c \ + _stage/__init__.c \ + audioio/__init__.c \ + audioio/Mixer.c \ + audioio/RawSample.c \ + audioio/WaveFile.c \ + bitbangio/I2C.c \ + bitbangio/OneWire.c \ + bitbangio/SPI.c \ + bitbangio/__init__.c \ + busio/OneWire.c \ + displayio/Bitmap.c \ + displayio/ColorConverter.c \ + displayio/Display.c \ + displayio/FourWire.c \ + displayio/Group.c \ + displayio/OnDiskBitmap.c \ + displayio/Palette.c \ + displayio/Shape.c \ + displayio/TileGrid.c \ + displayio/__init__.c \ + fontio/BuiltinFont.c \ + fontio/__init__.c \ + gamepad/GamePad.c \ + gamepad/__init__.c \ + os/__init__.c \ + random/__init__.c \ + socket/__init__.c \ + network/__init__.c \ + storage/__init__.c \ + struct/__init__.c \ + terminalio/Terminal.c \ + terminalio/__init__.c \ + uheap/__init__.c \ + ustack/__init__.c \ + _pew/__init__.c \ + _pew/PewPew.c \ +) + +ifeq ($(INTERNAL_LIBM),1) +SRC_LIBM = \ +$(addprefix lib/,\ + libm/math.c \ + libm/roundf.c \ + libm/fmodf.c \ + libm/nearbyintf.c \ + libm/ef_sqrt.c \ + libm/kf_rem_pio2.c \ + libm/kf_sin.c \ + libm/kf_cos.c \ + libm/kf_tan.c \ + libm/ef_rem_pio2.c \ + libm/sf_sin.c \ + libm/sf_cos.c \ + libm/sf_tan.c \ + libm/sf_frexp.c \ + libm/sf_modf.c \ + libm/sf_ldexp.c \ + libm/asinfacosf.c \ + libm/atanf.c \ + libm/atan2f.c \ + ) +endif diff --git a/py/circuitpy_mpconfig.h b/py/circuitpy_mpconfig.h new file mode 100644 index 000000000..7db60a39c --- /dev/null +++ b/py/circuitpy_mpconfig.h @@ -0,0 +1,603 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Dan Halbert for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +// This file contains settings that are common across CircuitPython ports, to make +// sure that the same feature set and settings are used, such as in atmel-samd +// and nrf. + +#include <stdint.h> + +#ifndef __INCLUDED_MPCONFIG_CIRCUITPY_H +#define __INCLUDED_MPCONFIG_CIRCUITPY_H + +// This is CircuitPython. +#define CIRCUITPY 1 + +// REPR_C encodes qstrs, 31-bit ints, and 30-bit floats in a single 32-bit word. +#define MICROPY_OBJ_REPR (MICROPY_OBJ_REPR_C) + +// options to control how MicroPython is built +// TODO(tannewt): Reduce this number if we want the REPL to function under 512 +// free bytes. +// #define MICROPY_ALLOC_PARSE_RULE_INIT (64) + +// Sorted alphabetically for easy finding. +// +// default is 128; consider raising to reduce fragmentation. +#define MICROPY_ALLOC_PARSE_CHUNK_INIT (16) +// default is 512. +#define MICROPY_ALLOC_PATH_MAX (256) +#define MICROPY_CAN_OVERRIDE_BUILTINS (1) +#define MICROPY_COMP_CONST (1) +#define MICROPY_COMP_DOUBLE_TUPLE_ASSIGN (1) +#define MICROPY_COMP_MODULE_CONST (1) +#define MICROPY_COMP_TRIPLE_TUPLE_ASSIGN (0) +#define MICROPY_DEBUG_PRINTERS (0) +#define MICROPY_EMIT_INLINE_THUMB (0) +#define MICROPY_EMIT_THUMB (0) +#define MICROPY_EMIT_X64 (0) +#define MICROPY_ENABLE_DOC_STRING (0) +#define MICROPY_ENABLE_FINALISER (1) +#define MICROPY_ENABLE_GC (1) +#define MICROPY_ENABLE_SOURCE_LINE (1) +#define MICROPY_ERROR_REPORTING (MICROPY_ERROR_REPORTING_NORMAL) +#define MICROPY_FLOAT_HIGH_QUALITY_HASH (0) +#define MICROPY_FLOAT_IMPL (MICROPY_FLOAT_IMPL_FLOAT) +#define MICROPY_GC_ALLOC_THRESHOLD (0) +#define MICROPY_HELPER_LEXER_UNIX (0) +#define MICROPY_HELPER_REPL (1) +#define MICROPY_KBD_EXCEPTION (1) +#define MICROPY_MEM_STATS (0) +#define MICROPY_NONSTANDARD_TYPECODES (0) +#define MICROPY_PERSISTENT_CODE_LOAD (1) + +#define MICROPY_PY_ARRAY (1) +#define MICROPY_PY_ARRAY_SLICE_ASSIGN (1) +#define MICROPY_PY_ASYNC_AWAIT (0) +#define MICROPY_PY_ATTRTUPLE (1) + +#define MICROPY_PY_BUILTINS_BYTEARRAY (1) +#define MICROPY_PY_BUILTINS_ENUMERATE (1) +#define MICROPY_PY_BUILTINS_FILTER (1) +#define MICROPY_PY_BUILTINS_HELP (1) +#define MICROPY_PY_BUILTINS_HELP_MODULES (1) +#define MICROPY_PY_BUILTINS_INPUT (1) +#define MICROPY_PY_BUILTINS_MEMORYVIEW (1) +#define MICROPY_PY_BUILTINS_MIN_MAX (1) +#define MICROPY_PY_BUILTINS_PROPERTY (1) +#define MICROPY_PY_BUILTINS_REVERSED (1) +#define MICROPY_PY_BUILTINS_SET (1) +#define MICROPY_PY_BUILTINS_SLICE (1) +#define MICROPY_PY_BUILTINS_SLICE_ATTRS (1) +#define MICROPY_PY_BUILTINS_STR_UNICODE (1) + +#define MICROPY_PY_CMATH (0) +#define MICROPY_PY_COLLECTIONS (1) +#define MICROPY_PY_DESCRIPTORS (1) +#define MICROPY_PY_IO_FILEIO (1) +#define MICROPY_PY_GC (1) +// Supplanted by shared-bindings/math +#define MICROPY_PY_MATH (0) +#define MICROPY_PY_MICROPYTHON_MEM_INFO (0) +// Supplanted by shared-bindings/struct +#define MICROPY_PY_STRUCT (0) +#define MICROPY_PY_SYS (1) +#define MICROPY_PY_SYS_MAXSIZE (1) +#define MICROPY_PY_SYS_STDFILES (1) +// Supplanted by shared-bindings/random +#define MICROPY_PY_URANDOM (0) +#define MICROPY_PY_URANDOM_EXTRA_FUNCS (0) +#define MICROPY_PY___FILE__ (1) + +#define MICROPY_QSTR_BYTES_IN_HASH (1) +#define MICROPY_REPL_AUTO_INDENT (1) +#define MICROPY_REPL_EVENT_DRIVEN (0) +#define MICROPY_STACK_CHECK (1) +#define MICROPY_STREAMS_NON_BLOCK (1) +#define MICROPY_USE_INTERNAL_PRINTF (1) + +// fatfs configuration used in ffconf.h +// +// 1 = SFN/ANSI 437=LFN/U.S.(OEM) +#define MICROPY_FATFS_ENABLE_LFN (1) +#define MICROPY_FATFS_LFN_CODE_PAGE (437) +#define MICROPY_FATFS_USE_LABEL (1) +#define MICROPY_FATFS_RPATH (2) +#define MICROPY_FATFS_MULTI_PARTITION (1) + +// Only enable this if you really need it. It allocates a byte cache of this size. +// #define MICROPY_FATFS_MAX_SS (4096) + +#define FILESYSTEM_BLOCK_SIZE (512) + +#define MICROPY_VFS (1) +#define MICROPY_VFS_FAT (MICROPY_VFS) +#define MICROPY_READER_VFS (MICROPY_VFS) + + +// type definitions for the specific machine + +#define BYTES_PER_WORD (4) + +#define MICROPY_MAKE_POINTER_CALLABLE(p) ((void*)((mp_uint_t)(p) | 1)) + +// Track stack usage. Expose results via ustack module. +#define MICROPY_MAX_STACK_USAGE (0) + +// This port is intended to be 32-bit, but unfortunately, int32_t for +// different targets may be defined in different ways - either as int +// or as long. This requires different printf formatting specifiers +// to print such value. So, we avoid int32_t and use int directly. +#define UINT_FMT "%u" +#define INT_FMT "%d" +typedef int mp_int_t; // must be pointer size +typedef unsigned mp_uint_t; // must be pointer size +typedef long mp_off_t; + +#define MP_PLAT_PRINT_STRN(str, len) mp_hal_stdout_tx_strn_cooked(str, len) + +#define mp_type_fileio mp_type_vfs_fat_fileio +#define mp_type_textio mp_type_vfs_fat_textio + +#define mp_import_stat mp_vfs_import_stat +#define mp_builtin_open_obj mp_vfs_open_obj + +// extra built in names to add to the global namespace +#define MICROPY_PORT_BUILTINS \ + { MP_OBJ_NEW_QSTR(MP_QSTR_help), (mp_obj_t)&mp_builtin_help_obj }, \ + { MP_OBJ_NEW_QSTR(MP_QSTR_input), (mp_obj_t)&mp_builtin_input_obj }, \ + { MP_OBJ_NEW_QSTR(MP_QSTR_open), (mp_obj_t)&mp_builtin_open_obj }, + +// board specific definitions +#include "mpconfigboard.h" + +// CIRCUITPY_FULL_BUILD is defined in a *.mk file. + +// Remove some lesser-used functionality to make small builds fit. +#define MICROPY_BUILTIN_METHOD_CHECK_SELF_ARG (CIRCUITPY_FULL_BUILD) +#define MICROPY_CPYTHON_COMPAT (CIRCUITPY_FULL_BUILD) +#define MICROPY_MODULE_WEAK_LINKS (CIRCUITPY_FULL_BUILD) +#define MICROPY_PY_ALL_SPECIAL_METHODS (CIRCUITPY_FULL_BUILD) +#define MICROPY_PY_BUILTINS_COMPLEX (CIRCUITPY_FULL_BUILD) +#define MICROPY_PY_BUILTINS_FROZENSET (CIRCUITPY_FULL_BUILD) +#define MICROPY_PY_BUILTINS_STR_CENTER (CIRCUITPY_FULL_BUILD) +#define MICROPY_PY_BUILTINS_STR_PARTITION (CIRCUITPY_FULL_BUILD) +#define MICROPY_PY_BUILTINS_STR_SPLITLINES (CIRCUITPY_FULL_BUILD) +#define MICROPY_PY_UERRNO (CIRCUITPY_FULL_BUILD) +// Opposite setting is deliberate. +#define MICROPY_PY_UERRNO_ERRORCODE (!CIRCUITPY_FULL_BUILD) +#define MICROPY_PY_URE (CIRCUITPY_FULL_BUILD) +#define MICROPY_PY_URE_MATCH_GROUPS (CIRCUITPY_FULL_BUILD) +#define MICROPY_PY_URE_MATCH_SPAN_START_END (CIRCUITPY_FULL_BUILD) +#define MICROPY_PY_URE_SUB (CIRCUITPY_FULL_BUILD) + +// LONGINT_IMPL_xxx are defined in the Makefile. +// +#ifdef LONGINT_IMPL_NONE +#define MICROPY_LONGINT_IMPL (MICROPY_LONGINT_IMPL_NONE) +#endif + +#ifdef LONGINT_IMPL_MPZ +#define MICROPY_LONGINT_IMPL (MICROPY_LONGINT_IMPL_MPZ) +#define MP_SSIZE_MAX (0x7fffffff) +#endif + +#ifdef LONGINT_IMPL_LONGLONG +#define MICROPY_LONGINT_IMPL (MICROPY_LONGINT_IMPL_LONGLONG) +#define MP_SSIZE_MAX (0x7fffffff) +#endif + + +// These CIRCUITPY_xxx values should all be defined in the *.mk files as being on or off. +// So if any are not defined in *.mk, they'll throw an error here. + +#if CIRCUITPY_ANALOGIO +#define ANALOGIO_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_analogio), (mp_obj_t)&analogio_module }, +extern const struct _mp_obj_module_t analogio_module; +#else +#define ANALOGIO_MODULE +#endif + +#if CIRCUITPY_AUDIOBUSIO +#define AUDIOBUSIO_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_audiobusio), (mp_obj_t)&audiobusio_module }, +extern const struct _mp_obj_module_t audiobusio_module; +#else +#define AUDIOBUSIO_MODULE +#endif + +#if CIRCUITPY_AUDIOIO +#define AUDIOIO_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_audioio), (mp_obj_t)&audioio_module }, +extern const struct _mp_obj_module_t audioio_module; +#else +#define AUDIOIO_MODULE +#endif + +#if CIRCUITPY_BITBANGIO +#define BITBANGIO_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_bitbangio), (mp_obj_t)&bitbangio_module }, +extern const struct _mp_obj_module_t bitbangio_module; +#else +#define BITBANGIO_MODULE +#endif + +#if CIRCUITPY_BLEIO +#define BLEIO_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_bleio), (mp_obj_t)&bleio_module }, +extern const struct _mp_obj_module_t bleio_module; +#else +#define BLEIO_MODULE +#endif + +#if CIRCUITPY_BOARD +#define BOARD_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_board), (mp_obj_t)&board_module }, +extern const struct _mp_obj_module_t board_module; +#else +#define BOARD_MODULE +#endif + +#if CIRCUITPY_BUSIO +extern const struct _mp_obj_module_t busio_module; +#define BUSIO_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_busio), (mp_obj_t)&busio_module }, +#else +#define BUSIO_MODULE +#endif + +#if CIRCUITPY_DIGITALIO +extern const struct _mp_obj_module_t digitalio_module; +#define DIGITALIO_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_digitalio), (mp_obj_t)&digitalio_module }, +#else +#define DIGITALIO_MODULE +#endif + +#if CIRCUITPY_DISPLAYIO +extern const struct _mp_obj_module_t displayio_module; +extern const struct _mp_obj_module_t fontio_module; +extern const struct _mp_obj_module_t terminalio_module; +#define DISPLAYIO_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_displayio), (mp_obj_t)&displayio_module }, +#define FONTIO_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_fontio), (mp_obj_t)&fontio_module }, +#define TERMINALIO_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_terminalio), (mp_obj_t)&terminalio_module }, +#define CIRCUITPY_DISPLAY_LIMIT (3) +#else +#define DISPLAYIO_MODULE +#define FONTIO_MODULE +#define TERMINALIO_MODULE +#define CIRCUITPY_DISPLAY_LIMIT (0) +#endif + +#if CIRCUITPY_FREQUENCYIO +extern const struct _mp_obj_module_t frequencyio_module; +#define FREQUENCYIO_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_frequencyio), (mp_obj_t)&frequencyio_module }, +#else +#define FREQUENCYIO_MODULE +#endif + +#if CIRCUITPY_GAMEPAD +extern const struct _mp_obj_module_t gamepad_module; +// Scan gamepad every 32ms +#define CIRCUITPY_GAMEPAD_TICKS 0x1f +#define GAMEPAD_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_gamepad),(mp_obj_t)&gamepad_module }, +#else +#define GAMEPAD_MODULE +#endif + +#if CIRCUITPY_I2CSLAVE +extern const struct _mp_obj_module_t i2cslave_module; +#define I2CSLAVE_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_i2cslave), (mp_obj_t)&i2cslave_module }, +#else +#define I2CSLAVE_MODULE +#endif + +#if CIRCUITPY_MATH +extern const struct _mp_obj_module_t math_module; +#define MATH_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_math), (mp_obj_t)&math_module }, +#else +#define MATH_MODULE +#endif + +#if CIRCUITPY_MICROCONTROLLER +extern const struct _mp_obj_module_t microcontroller_module; +#define MICROCONTROLLER_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_microcontroller), (mp_obj_t)µcontroller_module }, +#else +#define MICROCONTROLLER_MODULE +#endif + +#if CIRCUITPY_NEOPIXEL_WRITE +extern const struct _mp_obj_module_t neopixel_write_module; +#define NEOPIXEL_WRITE_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_neopixel_write),(mp_obj_t)&neopixel_write_module }, +#else +#define NEOPIXEL_WRITE_MODULE +#endif + +#if CIRCUITPY_NETWORK +extern const struct _mp_obj_module_t network_module; +extern const struct _mp_obj_module_t socket_module; +#define NETWORK_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_network), (mp_obj_t)&network_module }, +#define SOCKET_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_socket), (mp_obj_t)&socket_module }, +#define NETWORK_ROOT_POINTERS mp_obj_list_t mod_network_nic_list; +#if MICROPY_PY_WIZNET5K + extern const struct _mp_obj_module_t wiznet_module; + #define WIZNET_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_wiznet), (mp_obj_t)&wiznet_module }, +#endif +#else +#define NETWORK_MODULE +#define SOCKET_MODULE +#define WIZNET_MODULE +#define NETWORK_ROOT_POINTERS +#endif + +// This is not a top-level module; it's microcontroller.nvm. +#if CIRCUITPY_NVM +extern const struct _mp_obj_module_t nvm_module; +#endif + +#if CIRCUITPY_OS +extern const struct _mp_obj_module_t os_module; +#define OS_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_os), (mp_obj_t)&os_module }, +#define OS_MODULE_ALT_NAME { MP_OBJ_NEW_QSTR(MP_QSTR__os), (mp_obj_t)&os_module }, +#else +#define OS_MODULE +#define OS_MODULE_ALT_NAME +#endif + +#if CIRCUITPY_PIXELBUF +extern const struct _mp_obj_module_t pixelbuf_module; +#define PIXELBUF_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR__pixelbuf),(mp_obj_t)&pixelbuf_module }, +#else +#define PIXELBUF_MODULE +#endif + +#if CIRCUITPY_PULSEIO +extern const struct _mp_obj_module_t pulseio_module; +#define PULSEIO_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_pulseio), (mp_obj_t)&pulseio_module }, +#else +#define PULSEIO_MODULE +#endif + +#if CIRCUITPY_RANDOM +extern const struct _mp_obj_module_t random_module; +#define RANDOM_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_random), (mp_obj_t)&random_module }, +#else +#define RANDOM_MODULE +#endif + +#if CIRCUITPY_ROTARYIO +extern const struct _mp_obj_module_t rotaryio_module; +#define ROTARYIO_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_rotaryio), (mp_obj_t)&rotaryio_module }, +#else +#define ROTARYIO_MODULE +#endif + +#if CIRCUITPY_RTC +extern const struct _mp_obj_module_t rtc_module; +#define RTC_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_rtc), (mp_obj_t)&rtc_module }, +#else +#define RTC_MODULE +#endif + +#if CIRCUITPY_SAMD +extern const struct _mp_obj_module_t samd_module; +#define SAMD_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_samd),(mp_obj_t)&samd_module }, +#else +#define SAMD_MODULE +#endif + +#if CIRCUITPY_STAGE +extern const struct _mp_obj_module_t stage_module; +#define STAGE_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR__stage), (mp_obj_t)&stage_module }, +#else +#define STAGE_MODULE +#endif + +#if CIRCUITPY_STORAGE +extern const struct _mp_obj_module_t storage_module; +#define STORAGE_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_storage), (mp_obj_t)&storage_module }, +#else +#define STORAGE_MODULE +#endif + +#if CIRCUITPY_STRUCT +extern const struct _mp_obj_module_t struct_module; +#define STRUCT_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_struct), (mp_obj_t)&struct_module }, +#else +#define STRUCT_MODULE +#endif + +#if CIRCUITPY_SUPERVISOR +extern const struct _mp_obj_module_t supervisor_module; +#define SUPERVISOR_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_supervisor), (mp_obj_t)&supervisor_module }, +#else +#define SUPERVISOR_MODULE +#endif + +#if CIRCUITPY_TIME +extern const struct _mp_obj_module_t time_module; +#define TIME_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_time), (mp_obj_t)&time_module }, +#define TIME_MODULE_ALT_NAME { MP_OBJ_NEW_QSTR(MP_QSTR__time), (mp_obj_t)&time_module }, +#else +#define TIME_MODULE +#define TIME_MODULE_ALT_NAME +#endif + +#if CIRCUITPY_TOUCHIO +extern const struct _mp_obj_module_t touchio_module; +#define TOUCHIO_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_touchio), (mp_obj_t)&touchio_module }, +#else +#define TOUCHIO_MODULE +#endif + +#if CIRCUITPY_UHEAP +extern const struct _mp_obj_module_t uheap_module; +#define UHEAP_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_uheap),(mp_obj_t)&uheap_module }, +#else +#define UHEAP_MODULE +#endif + +#if CIRCUITPY_USB_HID +extern const struct _mp_obj_module_t usb_hid_module; +#define USB_HID_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_usb_hid),(mp_obj_t)&usb_hid_module }, +#else +#define USB_HID_MODULE +#endif + +#if CIRCUITPY_USB_MIDI +extern const struct _mp_obj_module_t usb_midi_module; +#define USB_MIDI_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_usb_midi),(mp_obj_t)&usb_midi_module }, +#else +#define USB_MIDI_MODULE +#endif + +#if CIRCUITPY_USTACK +extern const struct _mp_obj_module_t ustack_module; +#define USTACK_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR_ustack),(mp_obj_t)&ustack_module }, +#else +#define USTACK_MODULE +#endif + +#if CIRCUITPY_PEW +extern const struct _mp_obj_module_t pew_module; +#define PEW_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR__pew),(mp_obj_t)&pew_module }, +#else +#define PEW_MODULE +#endif + +// These modules are not yet in shared-bindings, but we prefer the non-uxxx names. +#if MICROPY_PY_UERRNO +#define ERRNO_MODULE { MP_ROM_QSTR(MP_QSTR_errno), MP_ROM_PTR(&mp_module_uerrno) }, +#else +#define ERRNO_MODULE +#endif + +#if MICROPY_PY_UJSON +#define JSON_MODULE { MP_ROM_QSTR(MP_QSTR_json), MP_ROM_PTR(&mp_module_ujson) }, +#else +#define JSON_MODULE +#endif + +#if MICROPY_PY_URE +#define RE_MODULE { MP_ROM_QSTR(MP_QSTR_re), MP_ROM_PTR(&mp_module_ure) }, +#else +#define RE_MODULE +#endif + +// Define certain native modules with weak links so they can be replaced with Python +// implementations. This list may grow over time. +#define MICROPY_PORT_BUILTIN_MODULE_WEAK_LINKS \ + OS_MODULE \ + TIME_MODULE \ + +// Native modules that are weak links can be accessed directly +// by prepending their name with an underscore. This list should correspond to +// MICROPY_PORT_BUILTIN_MODULE_WEAK_LINKS, assuming you want the native modules +// to be accessible when overriden. +#define MICROPY_PORT_BUILTIN_MODULE_ALT_NAMES \ + OS_MODULE_ALT_NAME \ + TIME_MODULE_ALT_NAME \ + +// This is an inclusive list that should correspond to the CIRCUITPY_XXX list above, +// including dependencies such as TERMINALIO depending on DISPLAYIO (shown by indentation). +// Some of these definitions will be blank depending on what is turned on and off. +// Some are omitted because they're in MICROPY_PORT_BUILTIN_MODULE_WEAK_LINKS above. +#define MICROPY_PORT_BUILTIN_MODULES_STRONG_LINKS \ + ANALOGIO_MODULE \ + AUDIOBUSIO_MODULE \ + AUDIOIO_MODULE \ + BITBANGIO_MODULE \ + BLEIO_MODULE \ + BOARD_MODULE \ + BUSIO_MODULE \ + DIGITALIO_MODULE \ + DISPLAYIO_MODULE \ + FONTIO_MODULE \ + TERMINALIO_MODULE \ + ERRNO_MODULE \ + FREQUENCYIO_MODULE \ + GAMEPAD_MODULE \ + I2CSLAVE_MODULE \ + JSON_MODULE \ + MATH_MODULE \ + MICROCONTROLLER_MODULE \ + NEOPIXEL_WRITE_MODULE \ + NETWORK_MODULE \ + SOCKET_MODULE \ + WIZNET_MODULE \ + PEW_MODULE \ + PIXELBUF_MODULE \ + PULSEIO_MODULE \ + RANDOM_MODULE \ + RE_MODULE \ + RTC_MODULE \ + SAMD_MODULE \ + STAGE_MODULE \ + STORAGE_MODULE \ + STRUCT_MODULE \ + SUPERVISOR_MODULE \ + TOUCHIO_MODULE \ + UHEAP_MODULE \ + USB_HID_MODULE \ + USB_MIDI_MODULE \ + USTACK_MODULE \ + +// If weak links are enabled, just include strong links in the main list of modules, +// and also include the underscore alternate names. +#if MICROPY_MODULE_WEAK_LINKS +#define MICROPY_PORT_BUILTIN_MODULES \ + MICROPY_PORT_BUILTIN_MODULES_STRONG_LINKS \ + MICROPY_PORT_BUILTIN_MODULE_ALT_NAMES +#else +// If weak links are disabled, included both strong and potentially weak lines +#define MICROPY_PORT_BUILTIN_MODULES \ + MICROPY_PORT_BUILTIN_MODULES_STRONG_LINKS \ + MICROPY_PORT_BUILTIN_MODULE_WEAK_LINKS +#endif + +// We need to provide a declaration/definition of alloca() +#include <alloca.h> + +#define MP_STATE_PORT MP_STATE_VM + +#include "supervisor/flash_root_pointers.h" + +#define CIRCUITPY_COMMON_ROOT_POINTERS \ + const char *readline_hist[8]; \ + vstr_t *repl_line; \ + mp_obj_t rtc_time_source; \ + mp_obj_t gamepad_singleton; \ + mp_obj_t pew_singleton; \ + mp_obj_t terminal_tilegrid_tiles; \ + FLASH_ROOT_POINTERS \ + NETWORK_ROOT_POINTERS \ + +void run_background_tasks(void); + +// TODO: Used in wiznet5k driver, but may not be needed in the long run. +#define MICROPY_THREAD_YIELD() + +#define MICROPY_VM_HOOK_LOOP run_background_tasks(); +#define MICROPY_VM_HOOK_RETURN run_background_tasks(); + +#define CIRCUITPY_AUTORELOAD_DELAY_MS 500 +#define CIRCUITPY_FILESYSTEM_FLUSH_INTERVAL_MS 1000 +#define CIRCUITPY_BOOT_OUTPUT_FILE "/boot_out.txt" + +#endif // __INCLUDED_MPCONFIG_CIRCUITPY_H diff --git a/py/circuitpy_mpconfig.mk b/py/circuitpy_mpconfig.mk new file mode 100644 index 000000000..0df6fff06 --- /dev/null +++ b/py/circuitpy_mpconfig.mk @@ -0,0 +1,230 @@ +# +# This file is part of the MicroPython project, http://micropython.org/ +# +# The MIT License (MIT) +# +# Copyright (c) 2019 Dan Halbert for Adafruit Industries +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + + +# mpconfigboard.mk files can specify: +# CIRCUITPY_FULL_BUILD = 1 (which is the default) +# or +# CIRCUITPY_SMALL_BUILD = 1 +# which is the same as: +# CIRCUITPY_FULL_BUILD = 0 + +ifndef CIRCUITPY_FULL_BUILD +ifeq ($(CIRCUITPY_SMALL_BUILD),1) +CIRCUITPY_FULL_BUILD = 0 +CFLAGS += -DCIRCUITPY_FULL_BUILD=0 +else +CIRCUITPY_FULL_BUILD = 1 +CFLAGS += -DCIRCUITPY_FULL_BUILD=1 +endif +endif + +# All builtin modules are listed below, with default values (0 for off, 1 for on) +# Some are always on, some are always off, and some depend on CIRCUITPY_FULL_BUILD. +# +# *** You can override any of the defaults by defining them in your mpconfigboard.mk. + +ifndef CIRCUITPY_ANALOGIO +CIRCUITPY_ANALOGIO = 1 +endif +CFLAGS += -DCIRCUITPY_ANALOGIO=$(CIRCUITPY_ANALOGIO) + +ifndef CIRCUITPY_AUDIOBUSIO +CIRCUITPY_AUDIOBUSIO = $(CIRCUITPY_FULL_BUILD) +endif +CFLAGS += -DCIRCUITPY_AUDIOBUSIO=$(CIRCUITPY_AUDIOBUSIO) + +ifndef CIRCUITPY_AUDIOIO +CIRCUITPY_AUDIOIO = $(CIRCUITPY_FULL_BUILD) +endif +CFLAGS += -DCIRCUITPY_AUDIOIO=$(CIRCUITPY_AUDIOIO) + +ifndef CIRCUITPY_BITBANGIO +CIRCUITPY_BITBANGIO = $(CIRCUITPY_FULL_BUILD) +endif +CFLAGS += -DCIRCUITPY_BITBANGIO=$(CIRCUITPY_BITBANGIO) + +# Explicitly enabled for boards that support bleio. +ifndef CIRCUITPY_BLEIO +CIRCUITPY_BLEIO = 0 +endif +CFLAGS += -DCIRCUITPY_BLEIO=$(CIRCUITPY_BLEIO) + +ifndef CIRCUITPY_BOARD +CIRCUITPY_BOARD = 1 +endif +CFLAGS += -DCIRCUITPY_BOARD=$(CIRCUITPY_BOARD) + +ifndef CIRCUITPY_BUSIO +CIRCUITPY_BUSIO = 1 +endif +CFLAGS += -DCIRCUITPY_BUSIO=$(CIRCUITPY_BUSIO) + +ifndef CIRCUITPY_DIGITALIO +CIRCUITPY_DIGITALIO = 1 +endif +CFLAGS += -DCIRCUITPY_DIGITALIO=$(CIRCUITPY_DIGITALIO) + +ifndef CIRCUITPY_DISPLAYIO +CIRCUITPY_DISPLAYIO = $(CIRCUITPY_FULL_BUILD) +endif +CFLAGS += -DCIRCUITPY_DISPLAYIO=$(CIRCUITPY_DISPLAYIO) + +ifndef CIRCUITPY_FREQUENCYIO +CIRCUITPY_FREQUENCYIO = 1 +endif +CFLAGS += -DCIRCUITPY_FREQUENCYIO=$(CIRCUITPY_FREQUENCYIO) + +ifndef CIRCUITPY_GAMEPAD +CIRCUITPY_GAMEPAD = $(CIRCUITPY_FULL_BUILD) +endif +CFLAGS += -DCIRCUITPY_GAMEPAD=$(CIRCUITPY_GAMEPAD) + +ifndef CIRCUITPY_I2CSLAVE +CIRCUITPY_I2CSLAVE = $(CIRCUITPY_FULL_BUILD) +endif +CFLAGS += -DCIRCUITPY_I2CSLAVE=$(CIRCUITPY_I2CSLAVE) + +ifndef CIRCUITPY_MATH +CIRCUITPY_MATH = 1 +endif +CFLAGS += -DCIRCUITPY_MATH=$(CIRCUITPY_MATH) + +ifndef CIRCUITPY_MICROCONTROLLER +CIRCUITPY_MICROCONTROLLER = 1 +endif +CFLAGS += -DCIRCUITPY_MICROCONTROLLER=$(CIRCUITPY_MICROCONTROLLER) + +ifndef CIRCUITPY_NEOPIXEL_WRITE +CIRCUITPY_NEOPIXEL_WRITE = 1 +endif +CFLAGS += -DCIRCUITPY_NEOPIXEL_WRITE=$(CIRCUITPY_NEOPIXEL_WRITE) + +# Only certain boards support NETWORK (Ethernet) +ifndef CIRCUITPY_NETWORK +CIRCUITPY_NETWORK = 0 +endif +CFLAGS += -DCIRCUITPY_NETWORK=$(CIRCUITPY_NETWORK) + +ifndef CIRCUITPY_NVM +CIRCUITPY_NVM = 1 +endif +CFLAGS += -DCIRCUITPY_NVM=$(CIRCUITPY_NVM) + +ifndef CIRCUITPY_OS +CIRCUITPY_OS = 1 +endif +CFLAGS += -DCIRCUITPY_OS=$(CIRCUITPY_OS) + +ifndef CIRCUITPY_PIXELBUF +CIRCUITPY_PIXELBUF = $(CIRCUITPY_FULL_BUILD) +endif +CFLAGS += -DCIRCUITPY_PIXELBUF=$(CIRCUITPY_PIXELBUF) + +ifndef CIRCUITPY_PULSEIO +CIRCUITPY_PULSEIO = 1 +endif +CFLAGS += -DCIRCUITPY_PULSEIO=$(CIRCUITPY_PULSEIO) + +ifndef CIRCUITPY_RANDOM +CIRCUITPY_RANDOM = 1 +endif +CFLAGS += -DCIRCUITPY_RANDOM=$(CIRCUITPY_RANDOM) + +ifndef CIRCUITPY_ROTARYIO +CIRCUITPY_ROTARYIO = 1 +endif +CFLAGS += -DCIRCUITPY_ROTARYIO=$(CIRCUITPY_ROTARYIO) + +ifndef CIRCUITPY_RTC +CIRCUITPY_RTC = 1 +endif +CFLAGS += -DCIRCUITPY_RTC=$(CIRCUITPY_RTC) + +# CIRCUITPY_SAMD is handled in the atmel-samd tree. +# Only for SAMD chips. +# Assume not a SAMD build. +ifndef CIRCUITPY_SAMD +CIRCUITPY_SAMD = 0 +endif +CFLAGS += -DCIRCUITPY_SAMD=$(CIRCUITPY_SAMD) + +# Currently always off. +ifndef CIRCUITPY_STAGE +CIRCUITPY_STAGE = 0 +endif +CFLAGS += -DCIRCUITPY_STAGE=$(CIRCUITPY_STAGE) + +ifndef CIRCUITPY_STORAGE +CIRCUITPY_STORAGE = 1 +endif +CFLAGS += -DCIRCUITPY_STORAGE=$(CIRCUITPY_STORAGE) + +ifndef CIRCUITPY_STRUCT +CIRCUITPY_STRUCT = 1 +endif +CFLAGS += -DCIRCUITPY_STRUCT=$(CIRCUITPY_STRUCT) + +ifndef CIRCUITPY_SUPERVISOR +CIRCUITPY_SUPERVISOR = 1 +endif +CFLAGS += -DCIRCUITPY_SUPERVISOR=$(CIRCUITPY_SUPERVISOR) + +ifndef CIRCUITPY_TIME +CIRCUITPY_TIME = 1 +endif +CFLAGS += -DCIRCUITPY_TIME=$(CIRCUITPY_TIME) + +ifndef CIRCUITPY_TOUCHIO +CIRCUITPY_TOUCHIO = 1 +endif +CFLAGS += -DCIRCUITPY_TOUCHIO=$(CIRCUITPY_TOUCHIO) + +# For debugging. +ifndef CIRCUITPY_UHEAP +CIRCUITPY_UHEAP = 0 +endif +CFLAGS += -DCIRCUITPY_UHEAP=$(CIRCUITPY_UHEAP) + +ifndef CIRCUITPY_USB_HID +CIRCUITPY_USB_HID = 1 +endif +CFLAGS += -DCIRCUITPY_USB_HID=$(CIRCUITPY_USB_HID) + +ifndef CIRCUITPY_USB_MIDI +CIRCUITPY_USB_MIDI = 1 +endif +CFLAGS += -DCIRCUITPY_USB_MIDI=$(CIRCUITPY_USB_MIDI) + +ifndef CIRCUITPY_PEW +CIRCUITPY_PEW = 0 +endif +CFLAGS += -DCIRCUITPY_PEW=$(CIRCUITPY_PEW) + +# For debugging. +ifndef CIRCUITPY_USTACK +CIRCUITPY_USTACK = 0 +endif +CFLAGS += -DCIRCUITPY_USTACK=$(CIRCUITPY_USTACK) @@ -31,6 +31,8 @@ #include "py/gc.h" #include "py/runtime.h" +#include "supervisor/shared/safe_mode.h" + #if MICROPY_ENABLE_GC #if MICROPY_DEBUG_VERBOSE // print debugging info @@ -182,6 +184,13 @@ void gc_init(void *start, void *end) { DEBUG_printf(" pool at %p, length " UINT_FMT " bytes, " UINT_FMT " blocks\n", MP_STATE_MEM(gc_pool_start), gc_pool_block_len * BYTES_PER_BLOCK, gc_pool_block_len); } +void gc_deinit(void) { + // Run any finalizers before we stop using the heap. + gc_sweep_all(); + + MP_STATE_MEM(gc_pool_start) = 0; +} + void gc_lock(void) { GC_ENTER(); MP_STATE_MEM(gc_lock_depth)++; @@ -463,6 +472,10 @@ void *gc_alloc(size_t n_bytes, bool has_finaliser, bool long_lived) { return NULL; } + if (MP_STATE_MEM(gc_pool_start) == 0) { + reset_into_safe_mode(GC_ALLOC_OUTSIDE_VM); + } + GC_ENTER(); // check if GC is locked @@ -32,6 +32,7 @@ #include "py/misc.h" void gc_init(void *start, void *end); +void gc_deinit(void); // These lock/unlock functions can be nested. // They can be used to prevent the GC from allocating/freeing. diff --git a/py/gc_long_lived.c b/py/gc_long_lived.c index 3c54de7ed..49bf1fcd7 100755 --- a/py/gc_long_lived.c +++ b/py/gc_long_lived.c @@ -27,6 +27,7 @@ #include "py/emitglue.h" #include "py/gc_long_lived.h" #include "py/gc.h" +#include "py/mpstate.h" mp_obj_fun_bc_t *make_fun_bc_long_lived(mp_obj_fun_bc_t *fun_bc, uint8_t max_depth) { #ifndef MICROPY_ENABLE_GC @@ -88,7 +89,7 @@ mp_obj_dict_t *make_dict_long_lived(mp_obj_dict_t *dict, uint8_t max_depth) { #ifndef MICROPY_ENABLE_GC return dict; #endif - if (dict == NULL || max_depth == 0) { + if (dict == NULL || max_depth == 0 || dict == &MP_STATE_VM(dict_main)) { return dict; } // Don't recurse unnecessarily. Return immediately if we've already seen this dict. diff --git a/py/modbuiltins.c b/py/modbuiltins.c index fc7ec24c7..b4f4fca34 100644 --- a/py/modbuiltins.c +++ b/py/modbuiltins.c @@ -371,10 +371,11 @@ STATIC mp_obj_t mp_builtin_pow(size_t n_args, const mp_obj_t *args) { MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_builtin_pow_obj, 2, 3, mp_builtin_pow); STATIC mp_obj_t mp_builtin_print(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { - enum { ARG_sep, ARG_end, ARG_file }; + enum { ARG_sep, ARG_end, ARG_flush, ARG_file }; static const mp_arg_t allowed_args[] = { { MP_QSTR_sep, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_QSTR(MP_QSTR__space_)} }, { MP_QSTR_end, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_QSTR(MP_QSTR__0x0a_)} }, + { MP_QSTR_flush, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} }, #if MICROPY_PY_IO && MICROPY_PY_SYS_STDFILES { MP_QSTR_file, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_PTR(&mp_sys_stdout_obj)} }, #endif @@ -414,6 +415,9 @@ STATIC mp_obj_t mp_builtin_print(size_t n_args, const mp_obj_t *pos_args, mp_map } #if MICROPY_PY_IO && MICROPY_PY_SYS_STDFILES mp_stream_write_adaptor(print.data, end_data, u.len[1]); + if (u.args[ARG_flush].u_bool) { + mp_stream_flush(MP_OBJ_FROM_PTR(print.data)); + } #else mp_print_strn(&mp_plat_print, end_data, u.len[1], 0, 0, 0); #endif @@ -516,7 +520,7 @@ STATIC mp_obj_t mp_builtin_sorted(size_t n_args, const mp_obj_t *args, mp_map_t if (n_args > 1) { mp_raise_TypeError(translate("must use keyword argument for key function")); } - mp_obj_t self = mp_type_list.make_new(&mp_type_list, 1, 0, args); + mp_obj_t self = mp_type_list.make_new(&mp_type_list, 1, args, NULL); mp_obj_list_sort(1, &self, kwargs); return self; diff --git a/py/modio.c b/py/modio.c index 9b09de96e..d7c1a58a8 100644 --- a/py/modio.c +++ b/py/modio.c @@ -46,11 +46,11 @@ STATIC const mp_obj_type_t mp_type_iobase; STATIC mp_obj_base_t iobase_singleton = {&mp_type_iobase}; -STATIC mp_obj_t iobase_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +STATIC mp_obj_t iobase_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { (void)type; (void)n_args; - (void)n_kw; (void)args; + (void)kw_args; return MP_OBJ_FROM_PTR(&iobase_singleton); } @@ -113,8 +113,8 @@ typedef struct _mp_obj_bufwriter_t { byte buf[0]; } mp_obj_bufwriter_t; -STATIC mp_obj_t bufwriter_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { - mp_arg_check_num(n_args, n_kw, 2, 2, false); +STATIC mp_obj_t bufwriter_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 2, 2, false); size_t alloc = mp_obj_get_int(args[1]); mp_obj_bufwriter_t *o = m_new_obj_var(mp_obj_bufwriter_t, byte, alloc); o->base.type = type; diff --git a/py/modstruct.c b/py/modstruct.c index 3f1b2f8b8..a238d3935 100644 --- a/py/modstruct.c +++ b/py/modstruct.c @@ -97,7 +97,10 @@ STATIC size_t calc_size_items(const char *fmt, size_t *total_sz) { total_cnt += 1; size += cnt; } else { - total_cnt += cnt; + // Pad bytes are skipped and don't get included in the item count. + if (*fmt != 'x') { + total_cnt += cnt; + } mp_uint_t align; size_t sz = mp_binary_get_size(fmt_type, *fmt, &align); while (cnt--) { @@ -166,7 +169,10 @@ STATIC mp_obj_t struct_unpack_from(size_t n_args, const mp_obj_t *args) { } else { while (cnt--) { item = mp_binary_get_val(fmt_type, *fmt, &p); - res->items[i++] = item; + // Pad bytes ('x') are just skipped. + if (*fmt != 'x') { + res->items[i++] = item; + } } } fmt++; @@ -204,7 +210,11 @@ STATIC void struct_pack_into_internal(mp_obj_t fmt_in, byte *p, size_t n_args, c } else { // If we run out of args then we just finish; CPython would raise struct.error while (cnt-- && i < n_args) { - mp_binary_set_val(fmt_type, *fmt, args[i++], &p); + mp_binary_set_val(fmt_type, *fmt, args[i], &p); + // Pad bytes don't have a corresponding argument. + if (*fmt != 'x') { + i++; + } } } fmt++; diff --git a/py/moduerrno.c b/py/moduerrno.c index c1feafaa1..7915603e4 100644 --- a/py/moduerrno.c +++ b/py/moduerrno.c @@ -84,7 +84,11 @@ STATIC const mp_obj_dict_t errorcode_dict = { #endif STATIC const mp_rom_map_elem_t mp_module_uerrno_globals_table[] = { +#if CIRCUITPY + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_errno) }, +#else { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_uerrno) }, +#endif #if MICROPY_PY_UERRNO_ERRORCODE { MP_ROM_QSTR(MP_QSTR_errorcode), MP_ROM_PTR(&errorcode_dict) }, #endif @@ -151,6 +155,7 @@ const char *mp_common_errno_to_str(mp_obj_t errno_val, char *buf, size_t len) { case EEXIST: desc = translate("File exists"); break; case ENODEV: desc = translate("Unsupported operation"); break; case EINVAL: desc = translate("Invalid argument"); break; + case ENOSPC: desc = translate("No space left on device"); break; case EROFS: desc = translate("Read-only filesystem"); break; } if (desc != NULL && desc->length <= len) { diff --git a/py/mpconfig.h b/py/mpconfig.h index a846f6a25..3ec383817 100755 --- a/py/mpconfig.h +++ b/py/mpconfig.h @@ -45,6 +45,11 @@ #include <mpconfigport.h> #endif +// Is this a CircuitPython build? +#ifndef CIRCUITPY +#define CIRCUITPY 0 +#endif + // Any options not explicitly set in mpconfigport.h will get default // values below. @@ -1164,6 +1169,18 @@ typedef double mp_float_t; #define MICROPY_PY_URE (0) #endif +#ifndef MICROPY_PY_URE_MATCH_GROUPS +#define MICROPY_PY_URE_MATCH_GROUPS (0) +#endif + +#ifndef MICROPY_PY_URE_MATCH_SPAN_START_END +#define MICROPY_PY_URE_MATCH_SPAN_START_END (0) +#endif + +#ifndef MICROPY_PY_URE_SUB +#define MICROPY_PY_URE_SUB (0) +#endif + #ifndef MICROPY_PY_UHEAPQ #define MICROPY_PY_UHEAPQ (0) #endif @@ -432,7 +432,7 @@ typedef struct _mp_obj_iter_buf_t { #define MP_OBJ_ITER_BUF_NSLOTS ((sizeof(mp_obj_iter_buf_t) + sizeof(mp_obj_t) - 1) / sizeof(mp_obj_t)) typedef void (*mp_print_fun_t)(const mp_print_t *print, mp_obj_t o, mp_print_kind_t kind); -typedef mp_obj_t (*mp_make_new_fun_t)(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args); +typedef mp_obj_t (*mp_make_new_fun_t)(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args); typedef mp_obj_t (*mp_call_fun_t)(mp_obj_t fun, size_t n_args, size_t n_kw, const mp_obj_t *args); typedef mp_obj_t (*mp_unary_op_fun_t)(mp_unary_op_t op, mp_obj_t); typedef mp_obj_t (*mp_binary_op_fun_t)(mp_binary_op_t op, mp_obj_t, mp_obj_t); @@ -640,6 +640,7 @@ mp_obj_t mp_obj_new_str_via_qstr(const char* data, size_t len); mp_obj_t mp_obj_new_str_from_vstr(const mp_obj_type_t *type, vstr_t *vstr); mp_obj_t mp_obj_new_bytes(const byte* data, size_t len); mp_obj_t mp_obj_new_bytearray(size_t n, void *items); +mp_obj_t mp_obj_new_bytearray_of_zeros(size_t n); mp_obj_t mp_obj_new_bytearray_by_ref(size_t n, void *items); #if MICROPY_PY_BUILTINS_FLOAT mp_obj_t mp_obj_new_int_from_float(mp_float_t val); @@ -670,7 +671,7 @@ mp_obj_t mp_obj_new_memoryview(byte typecode, size_t nitems, void *items); mp_obj_type_t *mp_obj_get_type(mp_const_obj_t o_in); const char *mp_obj_get_type_str(mp_const_obj_t o_in); bool mp_obj_is_subclass_fast(mp_const_obj_t object, mp_const_obj_t classinfo); // arguments should be type objects -mp_obj_t mp_instance_cast_to_native_base(mp_const_obj_t self_in, mp_const_obj_t native_type); +mp_obj_t mp_instance_cast_to_native_base(mp_obj_t self_in, mp_const_obj_t native_type); void mp_obj_print_helper(const mp_print_t *print, mp_obj_t o_in, mp_print_kind_t kind); void mp_obj_print(mp_obj_t o, mp_print_kind_t kind); @@ -719,7 +720,7 @@ void mp_obj_exception_add_traceback(mp_obj_t self_in, qstr file, size_t line, qs void mp_obj_exception_get_traceback(mp_obj_t self_in, size_t *n, size_t **values); mp_obj_t mp_obj_exception_get_traceback_obj(mp_obj_t self_in); mp_obj_t mp_obj_exception_get_value(mp_obj_t self_in); -mp_obj_t mp_obj_exception_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *args); +mp_obj_t mp_obj_exception_make_new(const mp_obj_type_t *type_in, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args); mp_obj_t mp_alloc_emergency_exception_buf(mp_obj_t size_in); void mp_init_emergency_exception_buf(void); @@ -843,6 +844,8 @@ typedef struct { mp_int_t step; } mp_bound_slice_t; +// Compute the new length of a sequence and ensure an exception is thrown on overflow. +size_t mp_seq_multiply_len(size_t item_sz, size_t len); void mp_seq_multiply(const void *items, size_t item_sz, size_t len, size_t times, void *dest); #if MICROPY_PY_BUILTINS_SLICE bool mp_seq_get_fast_slice_indexes(mp_uint_t len, mp_obj_t slice, mp_bound_slice_t *indexes); diff --git a/py/objarray.c b/py/objarray.c index 69ff6f328..9114a63c5 100644 --- a/py/objarray.c +++ b/py/objarray.c @@ -157,9 +157,9 @@ STATIC mp_obj_t array_construct(char typecode, mp_obj_t initializer) { #endif #if MICROPY_PY_ARRAY -STATIC mp_obj_t array_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *args) { +STATIC mp_obj_t array_make_new(const mp_obj_type_t *type_in, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { (void)type_in; - mp_arg_check_num(n_args, n_kw, 1, 2, false); + mp_arg_check_num(n_args, kw_args, 1, 2, false); // get typecode const char *typecode = mp_obj_str_get_str(args[0]); @@ -175,9 +175,9 @@ STATIC mp_obj_t array_make_new(const mp_obj_type_t *type_in, size_t n_args, size #endif #if MICROPY_PY_BUILTINS_BYTEARRAY -STATIC mp_obj_t bytearray_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *args) { +STATIC mp_obj_t bytearray_make_new(const mp_obj_type_t *type_in, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { (void)type_in; - mp_arg_check_num(n_args, n_kw, 0, 1, false); + mp_arg_check_num(n_args, kw_args, 0, 1, false); if (n_args == 0) { // no args: construct an empty bytearray @@ -207,13 +207,13 @@ mp_obj_t mp_obj_new_memoryview(byte typecode, size_t nitems, void *items) { return MP_OBJ_FROM_PTR(self); } -STATIC mp_obj_t memoryview_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *args) { +STATIC mp_obj_t memoryview_make_new(const mp_obj_type_t *type_in, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { (void)type_in; // TODO possibly allow memoryview constructor to take start/stop so that one // can do memoryview(b, 4, 8) instead of memoryview(b)[4:8] (uses less RAM) - mp_arg_check_num(n_args, n_kw, 1, 1, false); + mp_arg_check_num(n_args, kw_args, 1, 1, false); mp_buffer_info_t bufinfo; mp_get_buffer_raise(args[0], &bufinfo, MP_BUFFER_READ); @@ -611,6 +611,12 @@ mp_obj_t mp_obj_new_bytearray(size_t n, void *items) { return MP_OBJ_FROM_PTR(o); } +mp_obj_t mp_obj_new_bytearray_of_zeros(size_t n) { + mp_obj_array_t *o = array_new(BYTEARRAY_TYPECODE, n); + memset(o->items, 0, n); + return MP_OBJ_FROM_PTR(o); +} + // Create bytearray which references specified memory area mp_obj_t mp_obj_new_bytearray_by_ref(size_t n, void *items) { mp_obj_array_t *o = m_new_obj(mp_obj_array_t); diff --git a/py/objbool.c b/py/objbool.c index 5755b188e..cd7d7100c 100644 --- a/py/objbool.c +++ b/py/objbool.c @@ -50,9 +50,9 @@ STATIC void bool_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_ } } -STATIC mp_obj_t bool_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *args) { +STATIC mp_obj_t bool_make_new(const mp_obj_type_t *type_in, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { (void)type_in; - mp_arg_check_num(n_args, n_kw, 0, 1, false); + mp_arg_check_num(n_args, kw_args, 0, 1, false); if (n_args == 0) { return mp_const_false; diff --git a/py/objcomplex.c b/py/objcomplex.c index 3336d7b05..b38e2c5fa 100644 --- a/py/objcomplex.c +++ b/py/objcomplex.c @@ -75,9 +75,9 @@ STATIC void complex_print(const mp_print_t *print, mp_obj_t o_in, mp_print_kind_ } } -STATIC mp_obj_t complex_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *args) { +STATIC mp_obj_t complex_make_new(const mp_obj_type_t *type_in, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { (void)type_in; - mp_arg_check_num(n_args, n_kw, 0, 2, false); + mp_arg_check_num(n_args, kw_args, 0, 2, false); switch (n_args) { case 0: diff --git a/py/objdeque.c b/py/objdeque.c index dd0141831..b2785b5b6 100644 --- a/py/objdeque.c +++ b/py/objdeque.c @@ -44,8 +44,8 @@ typedef struct _mp_obj_deque_t { #define FLAG_CHECK_OVERFLOW 1 } mp_obj_deque_t; -STATIC mp_obj_t deque_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { - mp_arg_check_num(n_args, n_kw, 2, 3, false); +STATIC mp_obj_t deque_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 2, 3, false); /* Initialization from existing sequence is not supported, so an empty tuple must be passed as such. */ diff --git a/py/objdict.c b/py/objdict.c index cd110f1c1..683fcb748 100644 --- a/py/objdict.c +++ b/py/objdict.c @@ -81,7 +81,7 @@ STATIC void dict_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_ } } -STATIC mp_obj_t dict_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +STATIC mp_obj_t dict_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { mp_obj_t dict_out = mp_obj_new_dict(0); mp_obj_dict_t *dict = MP_OBJ_TO_PTR(dict_out); dict->base.type = type; @@ -90,11 +90,12 @@ STATIC mp_obj_t dict_make_new(const mp_obj_type_t *type, size_t n_args, size_t n dict->map.is_ordered = 1; } #endif - if (n_args > 0 || n_kw > 0) { - mp_obj_t args2[2] = {dict_out, args[0]}; // args[0] is always valid, even if it's not a positional arg - mp_map_t kwargs; - mp_map_init_fixed_table(&kwargs, n_kw, args + n_args); - dict_update(n_args + 1, args2, &kwargs); // dict_update will check that n_args + 1 == 1 or 2 + if (n_args > 0 || kw_args != NULL) { + mp_obj_t args2[2] = {dict_out, NULL}; // args[0] is always valid, even if it's not a positional arg + if (n_args > 0) { + args2[1] = args[0]; + } + dict_update(n_args + 1, args2, kw_args); // dict_update will check that n_args + 1 == 1 or 2 } return dict_out; } @@ -328,7 +329,7 @@ STATIC mp_obj_t dict_update(size_t n_args, const mp_obj_t *args, mp_map_t *kwarg mp_obj_dict_t *self = MP_OBJ_TO_PTR(args[0]); mp_ensure_not_fixed(self); - mp_arg_check_num(n_args, kwargs->used, 1, 2, true); + mp_arg_check_num(n_args, kwargs, 1, 2, true); if (n_args == 2) { // given a positional argument diff --git a/py/objenumerate.c b/py/objenumerate.c index 1a9d30f83..818725d85 100644 --- a/py/objenumerate.c +++ b/py/objenumerate.c @@ -39,7 +39,7 @@ typedef struct _mp_obj_enumerate_t { STATIC mp_obj_t enumerate_iternext(mp_obj_t self_in); -STATIC mp_obj_t enumerate_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +STATIC mp_obj_t enumerate_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { #if MICROPY_CPYTHON_COMPAT static const mp_arg_t allowed_args[] = { { MP_QSTR_iterable, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, @@ -50,7 +50,7 @@ STATIC mp_obj_t enumerate_make_new(const mp_obj_type_t *type, size_t n_args, siz struct { mp_arg_val_t iterable, start; } arg_vals; - mp_arg_parse_all_kw_array(n_args, n_kw, args, + mp_arg_parse_all(n_args, args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, (mp_arg_val_t*)&arg_vals); // create enumerate object @@ -59,7 +59,7 @@ STATIC mp_obj_t enumerate_make_new(const mp_obj_type_t *type, size_t n_args, siz o->iter = mp_getiter(arg_vals.iterable.u_obj, NULL); o->cur = arg_vals.start.u_int; #else - (void)n_kw; + (void)kw_args; mp_obj_enumerate_t *o = m_new_obj(mp_obj_enumerate_t); o->base.type = type; o->iter = mp_getiter(args[0], NULL); diff --git a/py/objexcept.c b/py/objexcept.c index c54e5fd4a..0e9255db7 100644 --- a/py/objexcept.c +++ b/py/objexcept.c @@ -130,8 +130,8 @@ void mp_obj_exception_print(const mp_print_t *print, mp_obj_t o_in, mp_print_kin mp_obj_tuple_print(print, MP_OBJ_FROM_PTR(o->args), kind); } -mp_obj_t mp_obj_exception_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { - mp_arg_check_num(n_args, n_kw, 0, MP_OBJ_FUN_ARGS_MAX, false); +mp_obj_t mp_obj_exception_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 0, MP_OBJ_FUN_ARGS_MAX, false); // Try to allocate memory for the exception, with fallback to emergency exception object mp_obj_exception_t *o_exc = m_new_obj_maybe(mp_obj_exception_t); @@ -336,7 +336,7 @@ mp_obj_t mp_obj_new_exception_arg1(const mp_obj_type_t *exc_type, mp_obj_t arg) mp_obj_t mp_obj_new_exception_args(const mp_obj_type_t *exc_type, size_t n_args, const mp_obj_t *args) { assert(exc_type->make_new == mp_obj_exception_make_new); - return exc_type->make_new(exc_type, n_args, 0, args); + return exc_type->make_new(exc_type, n_args, args, NULL); } mp_obj_t mp_obj_new_exception_msg(const mp_obj_type_t *exc_type, const compressed_string_t *msg) { @@ -438,7 +438,7 @@ mp_obj_t mp_obj_new_exception_msg_vlist(const mp_obj_type_t *exc_type, const com o_str->base.type = &mp_type_str; o_str->hash = qstr_compute_hash(o_str->data, o_str->len); mp_obj_t arg = MP_OBJ_FROM_PTR(o_str); - return mp_obj_exception_make_new(exc_type, 1, 0, &arg); + return mp_obj_exception_make_new(exc_type, 1, &arg, NULL); } // return true if the given object is an exception type @@ -607,7 +607,7 @@ STATIC mp_obj_t code_make_new(qstr file, qstr block) { mp_obj_new_bytearray(0, NULL), // co_lnotab }; - return namedtuple_make_new((const mp_obj_type_t*)&code_type_obj, 15, 0, elems); + return namedtuple_make_new((const mp_obj_type_t*)&code_type_obj, 15, elems, NULL); } STATIC const mp_obj_namedtuple_type_t frame_type_obj = { @@ -650,7 +650,7 @@ STATIC mp_obj_t frame_make_new(mp_obj_t f_code, int f_lineno) { mp_const_none, // f_trace }; - return namedtuple_make_new((const mp_obj_type_t*)&frame_type_obj, 8, 0, elems); + return namedtuple_make_new((const mp_obj_type_t*)&frame_type_obj, 8, elems, NULL); } STATIC const mp_obj_namedtuple_type_t traceback_type_obj = { @@ -687,7 +687,7 @@ STATIC mp_obj_t traceback_from_values(size_t *values, mp_obj_t tb_next) { tb_next, }; - return namedtuple_make_new((const mp_obj_type_t*)&traceback_type_obj, 4, 0, elems); + return namedtuple_make_new((const mp_obj_type_t*)&traceback_type_obj, 4, elems, NULL); }; mp_obj_t mp_obj_exception_get_traceback_obj(mp_obj_t self_in) { diff --git a/py/objfilter.c b/py/objfilter.c index cb965d8c3..af95326e6 100644 --- a/py/objfilter.c +++ b/py/objfilter.c @@ -34,8 +34,8 @@ typedef struct _mp_obj_filter_t { mp_obj_t iter; } mp_obj_filter_t; -STATIC mp_obj_t filter_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { - mp_arg_check_num(n_args, n_kw, 2, 2, false); +STATIC mp_obj_t filter_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 2, 2, false); mp_obj_filter_t *o = m_new_obj(mp_obj_filter_t); o->base.type = type; o->fun = args[0]; diff --git a/py/objfloat.c b/py/objfloat.c index c3f47018c..f544ade05 100644 --- a/py/objfloat.c +++ b/py/objfloat.c @@ -133,9 +133,9 @@ STATIC void float_print(const mp_print_t *print, mp_obj_t o_in, mp_print_kind_t } } -STATIC mp_obj_t float_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *args) { +STATIC mp_obj_t float_make_new(const mp_obj_type_t *type_in, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { (void)type_in; - mp_arg_check_num(n_args, n_kw, 0, 1, false); + mp_arg_check_num(n_args, kw_args, 0, 1, false); switch (n_args) { case 0: diff --git a/py/objfun.c b/py/objfun.c index 8c51d92e0..b8364815b 100644 --- a/py/objfun.c +++ b/py/objfun.c @@ -52,7 +52,7 @@ STATIC mp_obj_t fun_builtin_0_call(mp_obj_t self_in, size_t n_args, size_t n_kw, (void)args; assert(MP_OBJ_IS_TYPE(self_in, &mp_type_fun_builtin_0)); mp_obj_fun_builtin_fixed_t *self = MP_OBJ_TO_PTR(self_in); - mp_arg_check_num(n_args, n_kw, 0, 0, false); + mp_arg_check_num_kw_array(n_args, n_kw, 0, 0, false); return self->fun._0(); } @@ -66,7 +66,7 @@ const mp_obj_type_t mp_type_fun_builtin_0 = { STATIC mp_obj_t fun_builtin_1_call(mp_obj_t self_in, size_t n_args, size_t n_kw, const mp_obj_t *args) { assert(MP_OBJ_IS_TYPE(self_in, &mp_type_fun_builtin_1)); mp_obj_fun_builtin_fixed_t *self = MP_OBJ_TO_PTR(self_in); - mp_arg_check_num(n_args, n_kw, 1, 1, false); + mp_arg_check_num_kw_array(n_args, n_kw, 1, 1, false); return self->fun._1(args[0]); } @@ -80,7 +80,7 @@ const mp_obj_type_t mp_type_fun_builtin_1 = { STATIC mp_obj_t fun_builtin_2_call(mp_obj_t self_in, size_t n_args, size_t n_kw, const mp_obj_t *args) { assert(MP_OBJ_IS_TYPE(self_in, &mp_type_fun_builtin_2)); mp_obj_fun_builtin_fixed_t *self = MP_OBJ_TO_PTR(self_in); - mp_arg_check_num(n_args, n_kw, 2, 2, false); + mp_arg_check_num_kw_array(n_args, n_kw, 2, 2, false); return self->fun._2(args[0], args[1]); } @@ -94,7 +94,7 @@ const mp_obj_type_t mp_type_fun_builtin_2 = { STATIC mp_obj_t fun_builtin_3_call(mp_obj_t self_in, size_t n_args, size_t n_kw, const mp_obj_t *args) { assert(MP_OBJ_IS_TYPE(self_in, &mp_type_fun_builtin_3)); mp_obj_fun_builtin_fixed_t *self = MP_OBJ_TO_PTR(self_in); - mp_arg_check_num(n_args, n_kw, 3, 3, false); + mp_arg_check_num_kw_array(n_args, n_kw, 3, 3, false); return self->fun._3(args[0], args[1], args[2]); } @@ -110,7 +110,7 @@ STATIC mp_obj_t fun_builtin_var_call(mp_obj_t self_in, size_t n_args, size_t n_k mp_obj_fun_builtin_var_t *self = MP_OBJ_TO_PTR(self_in); // check number of arguments - mp_arg_check_num(n_args, n_kw, self->n_args_min, self->n_args_max, self->is_kw); + mp_arg_check_num_kw_array(n_args, n_kw, self->n_args_min, self->n_args_max, self->is_kw); if (self->is_kw) { // function allows keywords @@ -436,7 +436,7 @@ typedef mp_uint_t (*viper_fun_4_t)(mp_uint_t, mp_uint_t, mp_uint_t, mp_uint_t); STATIC mp_obj_t fun_viper_call(mp_obj_t self_in, size_t n_args, size_t n_kw, const mp_obj_t *args) { mp_obj_fun_viper_t *self = self_in; - mp_arg_check_num(n_args, n_kw, self->n_args, self->n_args, false); + mp_arg_check_num_kw_array(n_args, n_kw, self->n_args, self->n_args, false); void *fun = MICROPY_MAKE_POINTER_CALLABLE(self->fun_data); diff --git a/py/objint.c b/py/objint.c index 2ac370d17..fd746d331 100644 --- a/py/objint.c +++ b/py/objint.c @@ -42,9 +42,9 @@ #endif // This dispatcher function is expected to be independent of the implementation of long int -STATIC mp_obj_t mp_obj_int_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *args) { +STATIC mp_obj_t mp_obj_int_make_new(const mp_obj_type_t *type_in, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { (void)type_in; - mp_arg_check_num(n_args, n_kw, 0, 2, false); + mp_arg_check_num(n_args, kw_args, 0, 2, false); switch (n_args) { case 0: diff --git a/py/objlist.c b/py/objlist.c index d4f9b0222..16ca4b353 100644 --- a/py/objlist.c +++ b/py/objlist.c @@ -68,9 +68,9 @@ STATIC mp_obj_t list_extend_from_iter(mp_obj_t list, mp_obj_t iterable) { return list; } -STATIC mp_obj_t list_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *args) { +STATIC mp_obj_t list_make_new(const mp_obj_type_t *type_in, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { (void)type_in; - mp_arg_check_num(n_args, n_kw, 0, 1, false); + mp_arg_check_num(n_args, kw_args, 0, 1, false); switch (n_args) { case 0: @@ -126,7 +126,8 @@ STATIC mp_obj_t list_binary_op(mp_binary_op_t op, mp_obj_t lhs, mp_obj_t rhs) { if (n < 0) { n = 0; } - mp_obj_list_t *s = list_new(o->len * n); + size_t new_len = mp_seq_multiply_len(o->len, n); + mp_obj_list_t *s = list_new(new_len); mp_seq_multiply(o->items, sizeof(*o->items), o->len, n, s->items); return MP_OBJ_FROM_PTR(s); } diff --git a/py/objmap.c b/py/objmap.c index 908c61507..cf71f99ee 100644 --- a/py/objmap.c +++ b/py/objmap.c @@ -36,8 +36,8 @@ typedef struct _mp_obj_map_t { mp_obj_t iters[]; } mp_obj_map_t; -STATIC mp_obj_t map_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { - mp_arg_check_num(n_args, n_kw, 2, MP_OBJ_FUN_ARGS_MAX, false); +STATIC mp_obj_t map_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 2, MP_OBJ_FUN_ARGS_MAX, false); mp_obj_map_t *o = m_new_obj_var(mp_obj_map_t, mp_obj_t, n_args - 1); o->base.type = type; o->n_iters = n_args - 1; diff --git a/py/objmodule.c b/py/objmodule.c index 828f556f3..469a95976 100644 --- a/py/objmodule.c +++ b/py/objmodule.c @@ -148,11 +148,16 @@ STATIC const mp_rom_map_elem_t mp_builtin_module_table[] = { { MP_ROM_QSTR(MP_QSTR_array), MP_ROM_PTR(&mp_module_array) }, #endif #if MICROPY_PY_IO +#if CIRCUITPY + { MP_ROM_QSTR(MP_QSTR_io), MP_ROM_PTR(&mp_module_io) }, +#else { MP_ROM_QSTR(MP_QSTR_uio), MP_ROM_PTR(&mp_module_io) }, #endif +#endif #if MICROPY_PY_COLLECTIONS { MP_ROM_QSTR(MP_QSTR_collections), MP_ROM_PTR(&mp_module_collections) }, #endif +// CircuitPython: Now in shared-bindings/, so not defined here. #if MICROPY_PY_STRUCT { MP_ROM_QSTR(MP_QSTR_ustruct), MP_ROM_PTR(&mp_module_ustruct) }, #endif @@ -178,8 +183,13 @@ STATIC const mp_rom_map_elem_t mp_builtin_module_table[] = { // extmod modules #if MICROPY_PY_UERRNO +#if CIRCUITPY +// CircuitPython: Defined in MICROPY_PORT_BUILTIN_MODULES, so not defined here. +// TODO: move to shared-bindings/ +#else { MP_ROM_QSTR(MP_QSTR_uerrno), MP_ROM_PTR(&mp_module_uerrno) }, #endif +#endif #if MICROPY_PY_UCTYPES { MP_ROM_QSTR(MP_QSTR_uctypes), MP_ROM_PTR(&mp_module_uctypes) }, #endif @@ -187,11 +197,21 @@ STATIC const mp_rom_map_elem_t mp_builtin_module_table[] = { { MP_ROM_QSTR(MP_QSTR_uzlib), MP_ROM_PTR(&mp_module_uzlib) }, #endif #if MICROPY_PY_UJSON +#if CIRCUITPY +// CircuitPython: Defined in MICROPY_PORT_BUILTIN_MODULES, so not defined here. +// TODO: move to shared-bindings/ +#else { MP_ROM_QSTR(MP_QSTR_ujson), MP_ROM_PTR(&mp_module_ujson) }, #endif +#endif #if MICROPY_PY_URE +#if CIRCUITPY +// CircuitPython: Defined in MICROPY_PORT_BUILTIN_MODULES, so not defined here. +// TODO: move to shared-bindings/ +#else { MP_ROM_QSTR(MP_QSTR_ure), MP_ROM_PTR(&mp_module_ure) }, #endif +#endif #if MICROPY_PY_UHEAPQ { MP_ROM_QSTR(MP_QSTR_uheapq), MP_ROM_PTR(&mp_module_uheapq) }, #endif diff --git a/py/objnamedtuple.c b/py/objnamedtuple.c index 800991c43..a044fe3ff 100644 --- a/py/objnamedtuple.c +++ b/py/objnamedtuple.c @@ -93,9 +93,13 @@ void namedtuple_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) { } } -mp_obj_t namedtuple_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *args) { +mp_obj_t namedtuple_make_new(const mp_obj_type_t *type_in, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { const mp_obj_namedtuple_type_t *type = (const mp_obj_namedtuple_type_t*)type_in; size_t num_fields = type->n_fields; + size_t n_kw = 0; + if (kw_args != NULL) { + n_kw = kw_args->used; + } if (n_args + n_kw != num_fields) { if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { mp_arg_error_terse_mismatch(); @@ -119,8 +123,8 @@ mp_obj_t namedtuple_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t // Fill in the remaining slots with the keyword args memset(&tuple->items[n_args], 0, sizeof(mp_obj_t) * n_kw); - for (size_t i = n_args; i < n_args + 2 * n_kw; i += 2) { - qstr kw = mp_obj_str_get_qstr(args[i]); + for (size_t i = 0; i < n_kw; i++) { + qstr kw = mp_obj_str_get_qstr(kw_args->table[i].key); size_t id = mp_obj_namedtuple_find_field(type, kw); if (id == (size_t)-1) { if (MICROPY_ERROR_REPORTING == MICROPY_ERROR_REPORTING_TERSE) { @@ -138,7 +142,7 @@ mp_obj_t namedtuple_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t translate("function got multiple values for argument '%q'"), kw); } } - tuple->items[id] = args[i + 1]; + tuple->items[id] = kw_args->table[i].value; } return MP_OBJ_FROM_PTR(tuple); diff --git a/py/objnamedtuple.h b/py/objnamedtuple.h index deac7107b..0ea0d2862 100644 --- a/py/objnamedtuple.h +++ b/py/objnamedtuple.h @@ -51,7 +51,7 @@ void namedtuple_print(const mp_print_t *print, mp_obj_t o_in, mp_print_kind_t ki size_t mp_obj_namedtuple_find_field(const mp_obj_namedtuple_type_t *type, qstr name); void namedtuple_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest); mp_obj_namedtuple_type_t *mp_obj_new_namedtuple_base(size_t n_fields, mp_obj_t *fields); -mp_obj_t namedtuple_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *args); +mp_obj_t namedtuple_make_new(const mp_obj_type_t *type_in, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args); #endif // MICROPY_PY_COLLECTIONS diff --git a/py/objobject.c b/py/objobject.c index fa8c29cff..a42edde3c 100644 --- a/py/objobject.c +++ b/py/objobject.c @@ -35,9 +35,9 @@ typedef struct _mp_obj_object_t { mp_obj_base_t base; } mp_obj_object_t; -STATIC mp_obj_t object_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +STATIC mp_obj_t object_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { (void)args; - mp_arg_check_num(n_args, n_kw, 0, 0, false); + mp_arg_check_num(n_args, kw_args, 0, 0, false); mp_obj_object_t *o = m_new_obj(mp_obj_object_t); o->base.type = type; return MP_OBJ_FROM_PTR(o); diff --git a/py/objproperty.c b/py/objproperty.c index 4aba6c7a1..ddf484af2 100644 --- a/py/objproperty.c +++ b/py/objproperty.c @@ -33,7 +33,7 @@ #if MICROPY_PY_BUILTINS_PROPERTY -STATIC mp_obj_t property_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +STATIC mp_obj_t property_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { enum { ARG_fget, ARG_fset, ARG_fdel, ARG_doc }; static const mp_arg_t allowed_args[] = { { MP_QSTR_, MP_ARG_OBJ, {.u_rom_obj = MP_ROM_PTR(&mp_const_none_obj)} }, @@ -42,7 +42,7 @@ STATIC mp_obj_t property_make_new(const mp_obj_type_t *type, size_t n_args, size { MP_QSTR_doc, MP_ARG_OBJ, {.u_rom_obj = MP_ROM_PTR(&mp_const_none_obj)} }, }; mp_arg_val_t vals[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all_kw_array(n_args, n_kw, args, MP_ARRAY_SIZE(allowed_args), allowed_args, vals); + mp_arg_parse_all(n_args, args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, vals); mp_obj_property_t *o = m_new_obj(mp_obj_property_t); o->base.type = type; diff --git a/py/objrange.c b/py/objrange.c index 33c0d9b11..30d55c56c 100644 --- a/py/objrange.c +++ b/py/objrange.c @@ -91,8 +91,8 @@ STATIC void range_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind } } -STATIC mp_obj_t range_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { - mp_arg_check_num(n_args, n_kw, 1, 3, false); +STATIC mp_obj_t range_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 1, 3, false); mp_obj_range_t *o = m_new_obj(mp_obj_range_t); o->base.type = type; diff --git a/py/objreversed.c b/py/objreversed.c index e498b553d..4937d0818 100644 --- a/py/objreversed.c +++ b/py/objreversed.c @@ -37,8 +37,8 @@ typedef struct _mp_obj_reversed_t { mp_uint_t cur_index; // current index, plus 1; 0=no more, 1=last one (index 0) } mp_obj_reversed_t; -STATIC mp_obj_t reversed_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { - mp_arg_check_num(n_args, n_kw, 1, 1, false); +STATIC mp_obj_t reversed_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 1, 1, false); // check if __reversed__ exists, and if so delegate to it mp_obj_t dest[2]; diff --git a/py/objset.c b/py/objset.c index 00d6eae0e..5d1608c7e 100644 --- a/py/objset.c +++ b/py/objset.c @@ -103,8 +103,8 @@ STATIC void set_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t #endif } -STATIC mp_obj_t set_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { - mp_arg_check_num(n_args, n_kw, 0, 1, false); +STATIC mp_obj_t set_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 0, 1, false); switch (n_args) { case 0: { @@ -299,7 +299,7 @@ STATIC mp_obj_t set_issubset_internal(mp_obj_t self_in, mp_obj_t other_in, bool if (is_set_or_frozenset(self_in)) { self = MP_OBJ_TO_PTR(self_in); } else { - self = MP_OBJ_TO_PTR(set_make_new(&mp_type_set, 1, 0, &self_in)); + self = MP_OBJ_TO_PTR(set_make_new(&mp_type_set, 1, &self_in, NULL)); cleanup_self = true; } @@ -308,7 +308,7 @@ STATIC mp_obj_t set_issubset_internal(mp_obj_t self_in, mp_obj_t other_in, bool if (is_set_or_frozenset(other_in)) { other = MP_OBJ_TO_PTR(other_in); } else { - other = MP_OBJ_TO_PTR(set_make_new(&mp_type_set, 1, 0, &other_in)); + other = MP_OBJ_TO_PTR(set_make_new(&mp_type_set, 1, &other_in, NULL)); cleanup_other = true; } mp_obj_t out = mp_const_true; diff --git a/py/objslice.c b/py/objslice.c index 08f18935b..5a15be55a 100644 --- a/py/objslice.c +++ b/py/objslice.c @@ -130,7 +130,7 @@ STATIC void slice_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) { } STATIC mp_obj_t slice_make_new(const mp_obj_type_t *type, - size_t n_args, size_t n_kw, const mp_obj_t *args); + size_t n_args, const mp_obj_t *args, mp_map_t *kw_args); #endif const mp_obj_type_t mp_type_slice = { @@ -154,12 +154,12 @@ mp_obj_t mp_obj_new_slice(mp_obj_t ostart, mp_obj_t ostop, mp_obj_t ostep) { #if MICROPY_PY_BUILTINS_SLICE_ATTRS STATIC mp_obj_t slice_make_new(const mp_obj_type_t *type, - size_t n_args, size_t n_kw, const mp_obj_t *args) { + size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { if (type != &mp_type_slice) { mp_raise_NotImplementedError(translate("Cannot subclass slice")); } // check number of arguments - mp_arg_check_num(n_args, n_kw, 1, 3, false); + mp_arg_check_num(n_args, kw_args, 1, 3, false); // 1st argument is the pin mp_obj_t start = mp_const_none; diff --git a/py/objstr.c b/py/objstr.c index 621f1b837..ebd11d5cc 100644 --- a/py/objstr.c +++ b/py/objstr.c @@ -132,14 +132,14 @@ STATIC void str_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t } } -mp_obj_t mp_obj_str_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +mp_obj_t mp_obj_str_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { #if MICROPY_CPYTHON_COMPAT - if (n_kw != 0) { + if (kw_args != NULL && kw_args->used != 0) { mp_arg_error_unimpl_kw(); } #endif - mp_arg_check_num(n_args, n_kw, 0, 3, false); + mp_arg_check_num(n_args, kw_args, 0, 3, false); switch (n_args) { case 0: @@ -190,15 +190,15 @@ mp_obj_t mp_obj_str_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_ } } -STATIC mp_obj_t bytes_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *args) { +STATIC mp_obj_t bytes_make_new(const mp_obj_type_t *type_in, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { (void)type_in; #if MICROPY_CPYTHON_COMPAT - if (n_kw != 0) { + if (kw_args != NULL && kw_args->used != 0) { mp_arg_error_unimpl_kw(); } #else - (void)n_kw; + (void)kw_args; #endif if (n_args == 0) { @@ -332,8 +332,9 @@ mp_obj_t mp_obj_str_binary_op(mp_binary_op_t op, mp_obj_t lhs_in, mp_obj_t rhs_i return mp_const_empty_bytes; } } + size_t new_len = mp_seq_multiply_len(lhs_len, n); vstr_t vstr; - vstr_init_len(&vstr, lhs_len * n); + vstr_init_len(&vstr, new_len); mp_seq_multiply(lhs_data, sizeof(*lhs_data), lhs_len, n, vstr.buf); return mp_obj_new_str_from_vstr(lhs_type, &vstr); } @@ -407,6 +408,15 @@ mp_obj_t mp_obj_str_binary_op(mp_binary_op_t op, mp_obj_t lhs_in, mp_obj_t rhs_i #if !MICROPY_PY_BUILTINS_STR_UNICODE // objstrunicode defines own version +size_t str_offset_to_index(const mp_obj_type_t *type, const byte *self_data, size_t self_len, + size_t offset) { + if (offset > self_len) { + mp_raise_ValueError(translate("offset out of bounds")); + } + + return offset; +} + const byte *str_index_to_ptr(const mp_obj_type_t *type, const byte *self_data, size_t self_len, mp_obj_t index, bool is_slice) { size_t index_val = mp_get_index(type, self_len, index, is_slice); @@ -455,7 +465,7 @@ STATIC mp_obj_t str_join(mp_obj_t self_in, mp_obj_t arg) { if (!MP_OBJ_IS_TYPE(arg, &mp_type_list) && !MP_OBJ_IS_TYPE(arg, &mp_type_tuple)) { // arg is not a list nor a tuple, try to convert it to a list // TODO: Try to optimize? - arg = mp_type_list.make_new(&mp_type_list, 1, 0, &arg); + arg = mp_type_list.make_new(&mp_type_list, 1, &arg, NULL); } mp_obj_get_array(arg, &seq_len, &seq_items); @@ -1875,7 +1885,7 @@ STATIC mp_obj_t bytes_decode(size_t n_args, const mp_obj_t *args) { args = new_args; n_args++; } - return mp_obj_str_make_new(&mp_type_str, n_args, 0, args); + return mp_obj_str_make_new(&mp_type_str, n_args, args, NULL); } MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(bytes_decode_obj, 1, 3, bytes_decode); @@ -1888,7 +1898,7 @@ STATIC mp_obj_t str_encode(size_t n_args, const mp_obj_t *args) { args = new_args; n_args++; } - return bytes_make_new(NULL, n_args, 0, args); + return bytes_make_new(NULL, n_args, args, NULL); } MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(str_encode_obj, 1, 3, str_encode); #endif diff --git a/py/objstr.h b/py/objstr.h index 4e55cad09..0efe62a80 100644 --- a/py/objstr.h +++ b/py/objstr.h @@ -61,7 +61,7 @@ const byte *mp_obj_str_get_data_no_check(mp_obj_t self_in, size_t *len); else { str_len = ((mp_obj_str_t*)MP_OBJ_TO_PTR(str_obj_in))->len; str_data = ((mp_obj_str_t*)MP_OBJ_TO_PTR(str_obj_in))->data; } #endif -mp_obj_t mp_obj_str_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *args); +mp_obj_t mp_obj_str_make_new(const mp_obj_type_t *type_in, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args); void mp_str_print_json(const mp_print_t *print, const byte *str_data, size_t str_len); mp_obj_t mp_obj_str_format(size_t n_args, const mp_obj_t *args, mp_map_t *kwargs); mp_obj_t mp_obj_str_split(size_t n_args, const mp_obj_t *args); @@ -71,6 +71,8 @@ mp_obj_t mp_obj_new_str_of_type(const mp_obj_type_t *type, const byte* data, siz mp_obj_t mp_obj_str_binary_op(mp_binary_op_t op, mp_obj_t lhs_in, mp_obj_t rhs_in); mp_int_t mp_obj_str_get_buffer(mp_obj_t self_in, mp_buffer_info_t *bufinfo, mp_uint_t flags); +size_t str_offset_to_index(const mp_obj_type_t *type, const byte *self_data, size_t self_len, + size_t offset); const byte *str_index_to_ptr(const mp_obj_type_t *type, const byte *self_data, size_t self_len, mp_obj_t index, bool is_slice); const byte *find_subbytes(const byte *haystack, size_t hlen, const byte *needle, size_t nlen, int direction); diff --git a/py/objstringio.c b/py/objstringio.c index d21248ad7..d2ca6decd 100644 --- a/py/objstringio.c +++ b/py/objstringio.c @@ -186,8 +186,8 @@ STATIC mp_obj_stringio_t *stringio_new(const mp_obj_type_t *type) { return o; } -STATIC mp_obj_t stringio_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *args) { - (void)n_kw; // TODO check n_kw==0 +STATIC mp_obj_t stringio_make_new(const mp_obj_type_t *type_in, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { + (void)kw_args; // TODO check kw_args->used == 0 mp_uint_t sz = 16; bool initdata = false; diff --git a/py/objstrunicode.c b/py/objstrunicode.c index 03106f987..30000a51e 100644 --- a/py/objstrunicode.c +++ b/py/objstrunicode.c @@ -112,6 +112,26 @@ STATIC mp_obj_t uni_unary_op(mp_unary_op_t op, mp_obj_t self_in) { } } +size_t str_offset_to_index(const mp_obj_type_t *type, const byte *self_data, size_t self_len, + size_t offset) { + if (offset > self_len) { + mp_raise_ValueError(translate("offset out of bounds")); + } + + if (type == &mp_type_bytes) { + return offset; + } + + size_t index_val = 0; + const byte *s = self_data; + for (size_t i = 0; i < offset; i++, s++) { + if (!UTF8_IS_CONT(*s)) { + ++index_val; + } + } + return index_val; +} + // Convert an index into a pointer to its lead byte. Out of bounds indexing will raise IndexError or // be capped to the first/last character of the string, depending on is_slice. const byte *str_index_to_ptr(const mp_obj_type_t *type, const byte *self_data, size_t self_len, diff --git a/py/objtuple.c b/py/objtuple.c index b4f5b1bdf..474f81c1a 100644 --- a/py/objtuple.c +++ b/py/objtuple.c @@ -59,10 +59,10 @@ void mp_obj_tuple_print(const mp_print_t *print, mp_obj_t o_in, mp_print_kind_t } } -STATIC mp_obj_t mp_obj_tuple_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *args) { +STATIC mp_obj_t mp_obj_tuple_make_new(const mp_obj_type_t *type_in, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { (void)type_in; - mp_arg_check_num(n_args, n_kw, 0, 1, false); + mp_arg_check_num(n_args, kw_args, 0, 1, false); switch (n_args) { case 0: @@ -160,7 +160,8 @@ mp_obj_t mp_obj_tuple_binary_op(mp_binary_op_t op, mp_obj_t lhs, mp_obj_t rhs) { if (n <= 0) { return mp_const_empty_tuple; } - mp_obj_tuple_t *s = MP_OBJ_TO_PTR(mp_obj_new_tuple(o->len * n, NULL)); + size_t new_len = mp_seq_multiply_len(o->len, n); + mp_obj_tuple_t *s = MP_OBJ_TO_PTR(mp_obj_new_tuple(new_len, NULL)); mp_seq_multiply(o->items, sizeof(*o->items), o->len, n, s->items); return MP_OBJ_FROM_PTR(s); } diff --git a/py/objtype.c b/py/objtype.c index 95dfc2a15..f205c224e 100644 --- a/py/objtype.c +++ b/py/objtype.c @@ -50,7 +50,7 @@ #define TYPE_FLAG_IS_SUBCLASSED (0x0001) #define TYPE_FLAG_HAS_SPECIAL_ACCESSORS (0x0002) -STATIC mp_obj_t static_class_method_make_new(const mp_obj_type_t *self_in, size_t n_args, size_t n_kw, const mp_obj_t *args); +STATIC mp_obj_t static_class_method_make_new(const mp_obj_type_t *self_in, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args); /******************************************************************************/ // instance object @@ -90,14 +90,14 @@ STATIC int instance_count_native_bases(const mp_obj_type_t *type, const mp_obj_t // This wrapper function is allows a subclass of a native type to call the // __init__() method (corresponding to type->make_new) of the native type. -STATIC mp_obj_t native_base_init_wrapper(size_t n_args, const mp_obj_t *args) { - mp_obj_instance_t *self = MP_OBJ_TO_PTR(args[0]); +STATIC mp_obj_t native_base_init_wrapper(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + mp_obj_instance_t *self = MP_OBJ_TO_PTR(pos_args[0]); const mp_obj_type_t *native_base = NULL; instance_count_native_bases(self->base.type, &native_base); - self->subobj[0] = native_base->make_new(native_base, n_args - 1, 0, args + 1); + self->subobj[0] = native_base->make_new(native_base, n_args - 1, pos_args + 1, kw_args); return mp_const_none; } -STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(native_base_init_wrapper_obj, 1, MP_OBJ_FUN_ARGS_MAX, native_base_init_wrapper); +STATIC MP_DEFINE_CONST_FUN_OBJ_KW(native_base_init_wrapper_obj, 1, native_base_init_wrapper); #if !MICROPY_CPYTHON_COMPAT STATIC @@ -171,6 +171,9 @@ STATIC void mp_obj_class_lookup(struct class_lookup_data *lookup, const mp_obj_ // do a lookup, not a (base) type in which we found the class method. const mp_obj_type_t *org_type = (const mp_obj_type_t*)lookup->obj; mp_convert_member_lookup(MP_OBJ_NULL, org_type, elem->value, lookup->dest); + } else if (MP_OBJ_IS_TYPE(elem->value, &mp_type_property)) { + lookup->dest[0] = elem->value; + return; } else { mp_obj_instance_t *obj = lookup->obj; mp_obj_t obj_obj; @@ -281,7 +284,7 @@ STATIC void instance_print(const mp_print_t *print, mp_obj_t self_in, mp_print_k mp_printf(print, "<%s object at %p>", mp_obj_get_type_str(self_in), self); } -mp_obj_t mp_obj_instance_make_new(const mp_obj_type_t *self, size_t n_args, size_t n_kw, const mp_obj_t *args) { +mp_obj_t mp_obj_instance_make_new(const mp_obj_type_t *self, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { assert(mp_obj_is_instance_type(self)); // look for __new__ function @@ -297,6 +300,10 @@ mp_obj_t mp_obj_instance_make_new(const mp_obj_type_t *self, size_t n_args, size const mp_obj_type_t *native_base = NULL; mp_obj_instance_t *o; + size_t n_kw = 0; + if (kw_args != 0) { + n_kw = kw_args->used; + } if (init_fn[0] == MP_OBJ_NULL || init_fn[0] == MP_OBJ_SENTINEL) { // Either there is no __new__() method defined or there is a native // constructor. In both cases create a blank instance. @@ -315,9 +322,12 @@ mp_obj_t mp_obj_instance_make_new(const mp_obj_type_t *self, size_t n_args, size mp_obj_t args2[1] = {MP_OBJ_FROM_PTR(self)}; new_ret = mp_call_function_n_kw(init_fn[0], 1, 0, args2); } else { + // TODO(tannewt): Could this be on the stack? It's deleted below. mp_obj_t *args2 = m_new(mp_obj_t, 1 + n_args + 2 * n_kw); args2[0] = MP_OBJ_FROM_PTR(self); - memcpy(args2 + 1, args, (n_args + 2 * n_kw) * sizeof(mp_obj_t)); + memcpy(args2 + 1, args, n_args * sizeof(mp_obj_t)); + // copy in kwargs + memcpy(args2 + 1 + n_args, kw_args->table, 2 * n_kw * sizeof(mp_obj_t)); new_ret = mp_call_function_n_kw(init_fn[0], n_args + 1, n_kw, args2); m_del(mp_obj_t, args2, 1 + n_args + 2 * n_kw); } @@ -343,13 +353,16 @@ mp_obj_t mp_obj_instance_make_new(const mp_obj_type_t *self, size_t n_args, size mp_obj_class_lookup(&lookup, self); if (init_fn[0] != MP_OBJ_NULL) { mp_obj_t init_ret; - if (n_args == 0 && n_kw == 0) { + if (n_args == 0 && kw_args == NULL) { init_ret = mp_call_method_n_kw(0, 0, init_fn); } else { + // TODO(tannewt): Could this be on the stack? It's deleted below. mp_obj_t *args2 = m_new(mp_obj_t, 2 + n_args + 2 * n_kw); args2[0] = init_fn[0]; args2[1] = init_fn[1]; - memcpy(args2 + 2, args, (n_args + 2 * n_kw) * sizeof(mp_obj_t)); + // copy in kwargs + memcpy(args2 + 2, args, n_args * sizeof(mp_obj_t)); + memcpy(args2 + 2 + n_args, kw_args->table, 2 * n_kw * sizeof(mp_obj_t)); init_ret = mp_call_method_n_kw(n_args, n_kw, args2); m_del(mp_obj_t, args2, 2 + n_args + 2 * n_kw); } @@ -367,7 +380,7 @@ mp_obj_t mp_obj_instance_make_new(const mp_obj_type_t *self, size_t n_args, size // If the type had a native base that was not explicitly initialised // (constructed) by the Python __init__() method then construct it now. if (native_base != NULL && o->subobj[0] == MP_OBJ_FROM_PTR(&native_base_init_wrapper_obj)) { - o->subobj[0] = native_base->make_new(native_base, n_args, n_kw, args); + o->subobj[0] = native_base->make_new(native_base, n_args, args, kw_args); } return MP_OBJ_FROM_PTR(o); @@ -959,10 +972,10 @@ STATIC void type_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_ mp_printf(print, "<class '%q'>", self->name); } -STATIC mp_obj_t type_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *args) { +STATIC mp_obj_t type_make_new(const mp_obj_type_t *type_in, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { (void)type_in; - mp_arg_check_num(n_args, n_kw, 1, 3, false); + mp_arg_check_num(n_args, kw_args, 1, 3, false); switch (n_args) { case 1: @@ -992,8 +1005,10 @@ STATIC mp_obj_t type_call(mp_obj_t self_in, size_t n_args, size_t n_kw, const mp } } - // make new instance - mp_obj_t o = self->make_new(self, n_args, n_kw, args); + // create a map directly from the given args array and make a new instance + mp_map_t kw_args; + mp_map_init_fixed_table(&kw_args, n_kw, args + n_args); + mp_obj_t o = self->make_new(self, n_args, args, &kw_args); // return new instance return o; @@ -1053,7 +1068,7 @@ STATIC void type_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) { // store attribute mp_map_elem_t *elem = mp_map_lookup(locals_map, MP_OBJ_NEW_QSTR(attr), MP_MAP_LOOKUP_ADD_IF_NOT_FOUND); - elem->value = make_obj_long_lived(dest[1], 10); + elem->value = dest[1]; dest[0] = MP_OBJ_NULL; // indicate success } } @@ -1170,7 +1185,7 @@ mp_obj_t mp_obj_new_type(qstr name, mp_obj_t bases_tuple, mp_obj_t locals_dict) // __new__ slot exists; check if it is a function if (MP_OBJ_IS_FUN(elem->value)) { // __new__ is a function, wrap it in a staticmethod decorator - elem->value = static_class_method_make_new(&mp_type_staticmethod, 1, 0, &elem->value); + elem->value = static_class_method_make_new(&mp_type_staticmethod, 1, &elem->value, NULL); } } @@ -1196,11 +1211,11 @@ STATIC void super_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind mp_print_str(print, ">"); } -STATIC mp_obj_t super_make_new(const mp_obj_type_t *type_in, size_t n_args, size_t n_kw, const mp_obj_t *args) { +STATIC mp_obj_t super_make_new(const mp_obj_type_t *type_in, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { (void)type_in; // 0 arguments are turned into 2 in the compiler // 1 argument is not yet implemented - mp_arg_check_num(n_args, n_kw, 2, 2, false); + mp_arg_check_num(n_args, kw_args, 2, 2, false); if(!MP_OBJ_IS_TYPE(args[0], &mp_type_type)) { mp_raise_TypeError(translate("first argument to super() must be type")); } @@ -1394,11 +1409,14 @@ STATIC mp_obj_t mp_builtin_isinstance(mp_obj_t object, mp_obj_t classinfo) { MP_DEFINE_CONST_FUN_OBJ_2(mp_builtin_isinstance_obj, mp_builtin_isinstance); -mp_obj_t mp_instance_cast_to_native_base(mp_const_obj_t self_in, mp_const_obj_t native_type) { +mp_obj_t mp_instance_cast_to_native_base(mp_obj_t self_in, mp_const_obj_t native_type) { mp_obj_type_t *self_type = mp_obj_get_type(self_in); if (!mp_obj_is_subclass_fast(MP_OBJ_FROM_PTR(self_type), native_type)) { return MP_OBJ_NULL; } + if (MP_OBJ_FROM_PTR(self_type) == native_type) { + return self_in; + } mp_obj_instance_t *self = (mp_obj_instance_t*)MP_OBJ_TO_PTR(self_in); return self->subobj[0]; } @@ -1406,10 +1424,10 @@ mp_obj_t mp_instance_cast_to_native_base(mp_const_obj_t self_in, mp_const_obj_t /******************************************************************************/ // staticmethod and classmethod types (probably should go in a different file) -STATIC mp_obj_t static_class_method_make_new(const mp_obj_type_t *self, size_t n_args, size_t n_kw, const mp_obj_t *args) { +STATIC mp_obj_t static_class_method_make_new(const mp_obj_type_t *self, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { assert(self == &mp_type_staticmethod || self == &mp_type_classmethod); - mp_arg_check_num(n_args, n_kw, 1, 1, false); + mp_arg_check_num(n_args, kw_args, 1, 1, false); mp_obj_static_class_method_t *o = m_new_obj(mp_obj_static_class_method_t); *o = (mp_obj_static_class_method_t){{self}, args[0]}; diff --git a/py/objtype.h b/py/objtype.h index 3fc8c6e1b..13613f01f 100644 --- a/py/objtype.h +++ b/py/objtype.h @@ -49,6 +49,6 @@ mp_obj_t mp_obj_instance_call(mp_obj_t self_in, size_t n_args, size_t n_kw, cons #define mp_obj_is_instance_type(type) ((type)->make_new == mp_obj_instance_make_new) #define mp_obj_is_native_type(type) ((type)->make_new != mp_obj_instance_make_new) // this needs to be exposed for the above macros to work correctly -mp_obj_t mp_obj_instance_make_new(const mp_obj_type_t *self_in, size_t n_args, size_t n_kw, const mp_obj_t *args); +mp_obj_t mp_obj_instance_make_new(const mp_obj_type_t *self_in, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args); #endif // MICROPY_INCLUDED_PY_OBJTYPE_H diff --git a/py/objzip.c b/py/objzip.c index 0183925e3..ce9afd55d 100644 --- a/py/objzip.c +++ b/py/objzip.c @@ -36,8 +36,8 @@ typedef struct _mp_obj_zip_t { mp_obj_t iters[]; } mp_obj_zip_t; -STATIC mp_obj_t zip_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { - mp_arg_check_num(n_args, n_kw, 0, MP_OBJ_FUN_ARGS_MAX, false); +STATIC mp_obj_t zip_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 0, MP_OBJ_FUN_ARGS_MAX, false); mp_obj_zip_t *o = m_new_obj_var(mp_obj_zip_t, mp_obj_t, n_args); o->base.type = type; @@ -233,12 +233,6 @@ PY_EXTMOD_O_BASENAME = \ extmod/moduhashlib.o \ extmod/modubinascii.o \ extmod/virtpin.o \ - extmod/machine_mem.o \ - extmod/machine_pinbase.o \ - extmod/machine_signal.o \ - extmod/machine_pulse.o \ - extmod/machine_i2c.o \ - extmod/machine_spi.o \ extmod/modussl_axtls.o \ extmod/modussl_mbedtls.o \ extmod/modurandom.o \ diff --git a/py/ringbuf.h b/py/ringbuf.h index c62e20e1d..5f82cc096 100644 --- a/py/ringbuf.h +++ b/py/ringbuf.h @@ -26,6 +26,8 @@ #ifndef MICROPY_INCLUDED_PY_RINGBUF_H #define MICROPY_INCLUDED_PY_RINGBUF_H +#include "py/gc.h" + #include <stdint.h> typedef struct _ringbuf_t { @@ -40,9 +42,9 @@ typedef struct _ringbuf_t { // ringbuf_t buf = {buf_array, sizeof(buf_array)}; // Dynamic initialization. This creates root pointer! -#define ringbuf_alloc(r, sz) \ +#define ringbuf_alloc(r, sz, long_lived) \ { \ - (r)->buf = m_new(uint8_t, sz); \ + (r)->buf = gc_alloc(sz, false, long_lived); \ (r)->size = sz; \ (r)->iget = (r)->iput = 0; \ } @@ -71,4 +73,30 @@ static inline int ringbuf_put(ringbuf_t *r, uint8_t v) { return 0; } +static inline uint16_t ringbuf_count(ringbuf_t *r) +{ + volatile int count = r->iput - r->iget; + if ( count < 0 ) { + count += r->size; + } + + return (uint16_t) count; +} + +static inline void ringbuf_clear(ringbuf_t *r) +{ + r->iput = r->iget = 0; +} + +// will overwrite old data +static inline void ringbuf_put_n(ringbuf_t* r, uint8_t* buf, uint8_t bufsize) +{ + for(uint8_t i=0; i < bufsize; i++) { + if ( ringbuf_put(r, buf[i]) < 0 ) { + // if full overwrite old data + (void) ringbuf_get(r); + ringbuf_put(r, buf[i]); + } + } +} #endif // MICROPY_INCLUDED_PY_RINGBUF_H diff --git a/py/runtime.c b/py/runtime.c index 3d7a97f58..060748f1b 100644 --- a/py/runtime.c +++ b/py/runtime.c @@ -131,31 +131,6 @@ void mp_init(void) { sizeof(MP_STATE_VM(fs_user_mount)) - MICROPY_FATFS_NUM_PERSISTENT); #endif - #if MICROPY_VFS - #if MICROPY_FATFS_NUM_PERSISTENT > 0 - // We preserve the last MICROPY_FATFS_NUM_PERSISTENT mounts because newer - // mounts are put at the front of the list. - mp_vfs_mount_t *vfs = MP_STATE_VM(vfs_mount_table); - // Count how many mounts we have. - uint8_t count = 0; - while (vfs != NULL) { - vfs = vfs->next; - count++; - } - // Find the vfs MICROPY_FATFS_NUM_PERSISTENT mounts from the end. - vfs = MP_STATE_VM(vfs_mount_table); - for (uint8_t j = 0; j < count - MICROPY_FATFS_NUM_PERSISTENT; j++) { - vfs = vfs->next; - } - MP_STATE_VM(vfs_mount_table) = vfs; - MP_STATE_VM(vfs_cur) = vfs; - #else - // initialise the VFS sub-system - MP_STATE_VM(vfs_cur) = NULL; - MP_STATE_VM(vfs_mount_table) = NULL; - #endif - #endif - #if MICROPY_PY_THREAD_GIL mp_thread_mutex_init(&MP_STATE_VM(gil_mutex)); #endif @@ -1599,6 +1574,17 @@ NORETURN void mp_raise_OSError(int errno_) { nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(errno_))); } +NORETURN void mp_raise_OSError_msg(const compressed_string_t *msg) { + mp_raise_msg(&mp_type_OSError, msg); +} + +NORETURN void mp_raise_OSError_msg_varg(const compressed_string_t *fmt, ...) { + va_list argptr; + va_start(argptr,fmt); + mp_obj_t exception = mp_obj_new_exception_msg_vlist(&mp_type_OSError, fmt, argptr); + va_end(argptr); + nlr_raise(exception); +} NORETURN void mp_raise_NotImplementedError(const compressed_string_t *msg) { mp_raise_msg(&mp_type_NotImplementedError, msg); diff --git a/py/runtime.h b/py/runtime.h index 9c7ffc02f..e52d3232e 100644 --- a/py/runtime.h +++ b/py/runtime.h @@ -77,8 +77,9 @@ bool mp_sched_schedule(mp_obj_t function, mp_obj_t arg); // extra printing method specifically for mp_obj_t's which are integral type int mp_print_mp_int(const mp_print_t *print, mp_obj_t x, int base, int base_char, int flags, char fill, int width, int prec); -void mp_arg_check_num(size_t n_args, size_t n_kw, size_t n_args_min, size_t n_args_max, bool takes_kw); +void mp_arg_check_num(size_t n_args, mp_map_t *kw_args, size_t n_args_min, size_t n_args_max, bool takes_kw); void mp_arg_parse_all(size_t n_pos, const mp_obj_t *pos, mp_map_t *kws, size_t n_allowed, const mp_arg_t *allowed, mp_arg_val_t *out_vals); +void mp_arg_check_num_kw_array(size_t n_args, size_t n_kw, size_t n_args_min, size_t n_args_max, bool takes_kw); void mp_arg_parse_all_kw_array(size_t n_pos, size_t n_kw, const mp_obj_t *args, size_t n_allowed, const mp_arg_t *allowed, mp_arg_val_t *out_vals); NORETURN void mp_arg_error_terse_mismatch(void); NORETURN void mp_arg_error_unimpl_kw(void); @@ -158,6 +159,8 @@ NORETURN void mp_raise_RuntimeError(const compressed_string_t *msg); NORETURN void mp_raise_ImportError(const compressed_string_t *msg); NORETURN void mp_raise_IndexError(const compressed_string_t *msg); NORETURN void mp_raise_OSError(int errno_); +NORETURN void mp_raise_OSError_msg(const compressed_string_t *msg); +NORETURN void mp_raise_OSError_msg_varg(const compressed_string_t *fmt, ...); NORETURN void mp_raise_NotImplementedError(const compressed_string_t *msg); NORETURN void mp_raise_recursion_depth(void); diff --git a/py/sequence.c b/py/sequence.c index cc31be983..a750e5bac 100644 --- a/py/sequence.c +++ b/py/sequence.c @@ -34,6 +34,15 @@ #define SWAP(type, var1, var2) { type t = var2; var2 = var1; var1 = t; } +// Detect when a multiply causes an overflow. +size_t mp_seq_multiply_len(size_t item_sz, size_t len) { + size_t new_len; + if (__builtin_mul_overflow(item_sz, len, &new_len)) { + mp_raise_msg(&mp_type_OverflowError, translate("small int overflow")); + } + return new_len; +} + // Implements backend of sequence * integer operation. Assumes elements are // memory-adjacent in sequence. void mp_seq_multiply(const void *items, size_t item_sz, size_t len, size_t times, void *dest) { diff --git a/py/stream.c b/py/stream.c index aca9b8460..08c749cc3 100644 --- a/py/stream.c +++ b/py/stream.c @@ -103,7 +103,7 @@ STATIC mp_obj_t stream_read_generic(size_t n_args, const mp_obj_t *args, byte fl // CPython does a readall, but here we silently let negatives through, // and they will cause a MemoryError. mp_int_t sz; - if (n_args == 1 || ((sz = mp_obj_get_int(args[1])) == -1)) { + if (n_args == 1 || args[1] == mp_const_none || ((sz = mp_obj_get_int(args[1])) == -1)) { return stream_readall(args[0]); } @@ -468,16 +468,19 @@ STATIC mp_obj_t stream_tell(mp_obj_t self) { } MP_DEFINE_CONST_FUN_OBJ_1(mp_stream_tell_obj, stream_tell); -STATIC mp_obj_t stream_flush(mp_obj_t self) { +mp_obj_t mp_stream_flush(mp_obj_t self) { const mp_stream_p_t *stream_p = mp_get_stream(self); int error; + if (stream_p->ioctl == NULL) { + mp_raise_OSError(MP_EINVAL); + } mp_uint_t res = stream_p->ioctl(self, MP_STREAM_FLUSH, 0, &error); if (res == MP_STREAM_ERROR) { mp_raise_OSError(error); } return mp_const_none; } -MP_DEFINE_CONST_FUN_OBJ_1(mp_stream_flush_obj, stream_flush); +MP_DEFINE_CONST_FUN_OBJ_1(mp_stream_flush_obj, mp_stream_flush); STATIC mp_obj_t stream_ioctl(size_t n_args, const mp_obj_t *args) { mp_buffer_info_t bufinfo; diff --git a/py/stream.h b/py/stream.h index bcba4f234..03e24c746 100644 --- a/py/stream.h +++ b/py/stream.h @@ -113,6 +113,7 @@ mp_uint_t mp_stream_rw(mp_obj_t stream, void *buf, mp_uint_t size, int *errcode, #define mp_stream_read_exactly(stream, buf, size, err) mp_stream_rw(stream, buf, size, err, MP_STREAM_RW_READ) void mp_stream_write_adaptor(void *self, const char *buf, size_t len); +mp_obj_t mp_stream_flush(mp_obj_t self); #if MICROPY_STREAMS_POSIX_API // Functions with POSIX-compatible signatures diff --git a/shared-bindings/_pew/PewPew.c b/shared-bindings/_pew/PewPew.c new file mode 100644 index 000000000..d7ae0116d --- /dev/null +++ b/shared-bindings/_pew/PewPew.c @@ -0,0 +1,150 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Radomir Dopieralski + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include "py/obj.h" +#include "py/runtime.h" +#include "py/mphal.h" +#include "py/gc.h" +#include "py/mpstate.h" +#include "shared-bindings/digitalio/DigitalInOut.h" +#include "shared-bindings/util.h" +#include "PewPew.h" +#include "shared-module/_pew/PewPew.h" +#include "supervisor/shared/translate.h" + + +//| .. currentmodule:: _pew +//| +//| :class:`PewPew` -- LED matrix and button driver +//| =============================================== +//| +//| This is an internal module to be used by the ``pew.py`` library from +//| https://github.com/pewpew-game/pew-pewpew-standalone-10.x to handle the +//| LED matrix display and buttons on the ``pewpew10`` board. +//| +//| Usage:: +//| +//| This singleton class is instantiated by the ``pew`` library, and +//| used internally by it. All user-visible interactions are done through +//| that library. +//| + +//| .. class:: PewPew(buffer, rows, cols, buttons) +//| +//| Initializes matrix scanning routines. +//| +//| The ``buffer`` is a 64 byte long ``bytearray`` that stores what should +//| be displayed on the matrix. ``rows`` and ``cols`` are both lists of +//| eight ``DigitalInputOutput`` objects that are connected to the matrix +//| rows and columns. ``buttons`` is a ``DigitalInputOutput`` object that +//| is connected to the common side of all buttons (the other sides of the +//| buttons are connected to rows of the matrix). +//| +STATIC mp_obj_t pewpew_make_new(const mp_obj_type_t *type, size_t n_args, + const mp_obj_t *pos_args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 4, 4, true); + enum { ARG_buffer, ARG_rows, ARG_cols, ARG_buttons }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_buffer, MP_ARG_OBJ | MP_ARG_REQUIRED }, + { MP_QSTR_rows, MP_ARG_OBJ | MP_ARG_REQUIRED }, + { MP_QSTR_cols, MP_ARG_OBJ | MP_ARG_REQUIRED }, + { MP_QSTR_buttons, MP_ARG_OBJ | MP_ARG_REQUIRED }, + }; + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), + allowed_args, args); + + mp_buffer_info_t bufinfo; + mp_get_buffer_raise(args[ARG_buffer].u_obj, &bufinfo, MP_BUFFER_READ); + + size_t rows_size = 0; + mp_obj_t *rows; + mp_obj_get_array(args[ARG_rows].u_obj, &rows_size, &rows); + + size_t cols_size = 0; + mp_obj_t *cols; + mp_obj_get_array(args[ARG_cols].u_obj, &cols_size, &cols); + + if (bufinfo.len != rows_size * cols_size) { + mp_raise_ValueError(translate("Incorrect buffer size")); + } + + for (size_t i = 0; i < rows_size; ++i) { + if (!MP_OBJ_IS_TYPE(rows[i], &digitalio_digitalinout_type)) { + mp_raise_TypeError(translate("Row entry must be digitalio.DigitalInOut")); + } + digitalio_digitalinout_obj_t *pin = MP_OBJ_TO_PTR(rows[i]); + raise_error_if_deinited( + common_hal_digitalio_digitalinout_deinited(pin)); + } + + for (size_t i = 0; i < cols_size; ++i) { + if (!MP_OBJ_IS_TYPE(cols[i], &digitalio_digitalinout_type)) { + mp_raise_TypeError(translate("Column entry must be digitalio.DigitalInOut")); + } + digitalio_digitalinout_obj_t *pin = MP_OBJ_TO_PTR(cols[i]); + raise_error_if_deinited( + common_hal_digitalio_digitalinout_deinited(pin)); + } + + if (!MP_OBJ_IS_TYPE(args[ARG_buttons].u_obj, + &digitalio_digitalinout_type)) { + mp_raise_TypeError(translate("buttons must be digitalio.DigitalInOut")); + } + digitalio_digitalinout_obj_t *buttons = MP_OBJ_TO_PTR( + args[ARG_buttons].u_obj); + raise_error_if_deinited( + common_hal_digitalio_digitalinout_deinited(buttons)); + + pew_obj_t *pew = MP_STATE_VM(pew_singleton); + if (!pew) { + pew = m_new_obj(pew_obj_t); + pew->base.type = &pewpew_type; + pew = gc_make_long_lived(pew); + MP_STATE_VM(pew_singleton) = pew; + } + + pew->buffer = bufinfo.buf; + pew->rows = rows; + pew->rows_size = rows_size; + pew->cols = cols; + pew->cols_size = cols_size; + pew->buttons = buttons; + pew->pressed = 0; + pew_init(); + + return MP_OBJ_FROM_PTR(pew); +} + + +STATIC const mp_rom_map_elem_t pewpew_locals_dict_table[] = { +}; +STATIC MP_DEFINE_CONST_DICT(pewpew_locals_dict, pewpew_locals_dict_table); +const mp_obj_type_t pewpew_type = { + { &mp_type_type }, + .name = MP_QSTR_PewPew, + .make_new = pewpew_make_new, + .locals_dict = (mp_obj_dict_t*)&pewpew_locals_dict, +}; diff --git a/shared-bindings/_pew/PewPew.h b/shared-bindings/_pew/PewPew.h new file mode 100644 index 000000000..f76384757 --- /dev/null +++ b/shared-bindings/_pew/PewPew.h @@ -0,0 +1,33 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Radomir Dopieralski + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_PEW_PEWPEW_H +#define MICROPY_INCLUDED_SHARED_BINDINGS_PEW_PEWPEW_H + +extern const mp_obj_type_t pewpew_type; + +#endif // MICROPY_INCLUDED_SHARED_BINDINGS_PEW_PEWPEW_H diff --git a/shared-bindings/_pew/__init__.c b/shared-bindings/_pew/__init__.c new file mode 100644 index 000000000..6c5520ac5 --- /dev/null +++ b/shared-bindings/_pew/__init__.c @@ -0,0 +1,67 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Radomir Dopieralski + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include "py/obj.h" +#include "py/runtime.h" +#include "py/mphal.h" +#include "PewPew.h" +#include "shared-module/_pew/PewPew.h" + +STATIC mp_obj_t get_pressed(void) { + pew_obj_t *pew = MP_STATE_VM(pew_singleton); + if (!pew) { + return mp_const_none; + } + uint8_t pressed = pew->pressed; + pew->pressed = 0; + return mp_obj_new_int(pressed); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_0(get_pressed_obj, get_pressed); + + +//| :mod:`_pew` --- LED matrix driver +//| ================================== +//| +//| .. module:: _pew +//| :synopsis: LED matrix driver +//| :platform: SAMD21 +//| +//| .. toctree:: +//| :maxdepth: 3 +//| +//| PewPew +//| +STATIC const mp_rom_map_elem_t pew_module_globals_table[] = { + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR__pew) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_PewPew), MP_ROM_PTR(&pewpew_type)}, + { MP_OBJ_NEW_QSTR(MP_QSTR_get_pressed), MP_ROM_PTR(&get_pressed_obj)}, +}; +STATIC MP_DEFINE_CONST_DICT(pew_module_globals, + pew_module_globals_table); + +const mp_obj_module_t pew_module = { + .base = { &mp_type_module }, + .globals = (mp_obj_dict_t*)&pew_module_globals, +}; diff --git a/shared-bindings/_pixelbuf/PixelBuf.c b/shared-bindings/_pixelbuf/PixelBuf.c new file mode 100644 index 000000000..7c2766aa3 --- /dev/null +++ b/shared-bindings/_pixelbuf/PixelBuf.c @@ -0,0 +1,477 @@ +/* + * This file is part of the Circuit Python project, https://github.com/adafruit/circuitpython + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Roy Hooper + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "py/obj.h" +#include "py/objarray.h" +#include "py/mphal.h" +#include "py/runtime.h" +#include "py/binary.h" +#include "py/objproperty.h" +#include "py/runtime.h" +#include "py/gc.h" + +#include <string.h> + +#include "PixelBuf.h" +#include "shared-bindings/_pixelbuf/types.h" +#include "../../shared-module/_pixelbuf/PixelBuf.h" +#include "shared-bindings/digitalio/DigitalInOut.h" + +extern const pixelbuf_byteorder_obj_t byteorder_BGR; +extern const mp_obj_type_t pixelbuf_byteorder_type; +extern const int32_t colorwheel(float pos); + +//| .. currentmodule:: pixelbuf +//| +//| :class:`PixelBuf` -- A fast RGB[W] pixel buffer for LED and similar devices +//| =========================================================================== +//| +//| :class:`~_pixelbuf.PixelBuf` implements an RGB[W] bytearray abstraction. +//| +//| .. class:: PixelBuf(size, buf, byteorder=BGR, bpp=3) +//| +//| Create a PixelBuf object of the specified size, byteorder, and bits per pixel. +//| +//| When given a second bytearray (``rawbuf``), changing brightness adjusts the +//| brightness of all members of ``buf``. +//| +//| When only given ``buf``, ``brightness`` applies to the next pixel assignment. +//| +//| When ``dotstar`` is True, and ``bpp`` is 4, the 4th value in a tuple/list +//| is the individual pixel brightness (0-1). Not compatible with RGBW Byteorders. +//| Compatible `ByteOrder` classes are bpp=3, or bpp=4 and has_luminosity=True (g LBGR). +//| +//| :param ~int size: Number of pixelsx +//| :param ~bytearray buf: Bytearray to store pixel data in +//| :param ~_pixelbuf.ByteOrder byteorder: Byte order constant from `_pixelbuf` (also sets the bpp) +//| :param ~float brightness: Brightness (0 to 1.0, default 1.0) +//| :param ~bytearray rawbuf: Bytearray to store raw pixel colors in +//| :param ~int offset: Offset from start of buffer (default 0) +//| :param ~bool dotstar: Dotstar mode (default False) +//| :param ~bool auto_write: Whether to automatically write pixels (Default False) +//| :param ~callable write_function: (optional) Callable to use to send pixels +//| :param ~list write_args: (optional) Tuple or list of args to pass to ``write_function``. The +//| PixelBuf instance is appended after these args. +//| +STATIC mp_obj_t pixelbuf_pixelbuf_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 2, MP_OBJ_FUN_ARGS_MAX, true); + enum { ARG_size, ARG_buf, ARG_byteorder, ARG_brightness, ARG_rawbuf, ARG_offset, ARG_dotstar, + ARG_auto_write, ARG_write_function, ARG_write_args }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_size, MP_ARG_REQUIRED | MP_ARG_INT }, + { MP_QSTR_buf, MP_ARG_REQUIRED | MP_ARG_OBJ }, + { MP_QSTR_byteorder, MP_ARG_OBJ, { .u_obj = mp_const_none } }, + { MP_QSTR_brightness, MP_ARG_OBJ, { .u_obj = mp_const_none } }, + { MP_QSTR_rawbuf, MP_ARG_OBJ, { .u_obj = mp_const_none } }, + { MP_QSTR_offset, MP_ARG_INT, { .u_int = 0 } }, + { MP_QSTR_dotstar, MP_ARG_BOOL, { .u_bool = false } }, + { MP_QSTR_auto_write, MP_ARG_BOOL, {.u_bool = false} }, + { MP_QSTR_write_function, MP_ARG_OBJ, {.u_obj = mp_const_none} }, + { MP_QSTR_write_args, MP_ARG_OBJ, {.u_obj = mp_const_none} }, + }; + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + if (mp_obj_is_subclass_fast(args[ARG_byteorder].u_obj, &pixelbuf_byteorder_type)) + mp_raise_TypeError_varg(translate("byteorder is not an instance of ByteOrder (got a %s)"), mp_obj_get_type_str(args[ARG_byteorder].u_obj)); + + pixelbuf_byteorder_obj_t *byteorder = (args[ARG_byteorder].u_obj == mp_const_none) ? MP_OBJ_FROM_PTR(&byteorder_BGR) : args[ARG_byteorder].u_obj; + + if (byteorder->has_white && args[ARG_dotstar].u_bool) + mp_raise_ValueError_varg(translate("Can not use dotstar with %s"), mp_obj_get_type_str(byteorder)); + + size_t effective_bpp = args[ARG_dotstar].u_bool ? 4 : byteorder->bpp; // Always 4 for DotStar + size_t bytes = args[ARG_size].u_int * effective_bpp; + size_t offset = args[ARG_offset].u_int; + mp_buffer_info_t bufinfo, rawbufinfo; + + mp_get_buffer_raise(args[ARG_buf].u_obj, &bufinfo, MP_BUFFER_READ | MP_BUFFER_WRITE); + bool two_buffers = args[ARG_rawbuf].u_obj != mp_const_none; + if (two_buffers) { + mp_get_buffer_raise(args[ARG_rawbuf].u_obj, &rawbufinfo, MP_BUFFER_READ | MP_BUFFER_WRITE); + if (rawbufinfo.len != bufinfo.len) { + mp_raise_ValueError(translate("rawbuf is not the same size as buf")); + } + } + + if (bytes + offset > bufinfo.len) + mp_raise_ValueError_varg(translate("buf is too small. need %d bytes"), bytes + offset); + + if (!MP_OBJ_IS_TYPE(args[ARG_write_args].u_obj, &mp_type_list) && + !MP_OBJ_IS_TYPE(args[ARG_write_args].u_obj, &mp_type_tuple) && + args[ARG_write_args].u_obj != mp_const_none) + { + mp_raise_ValueError(translate("write_args must be a list, tuple, or None")); + } + + // Validation complete, allocate and populate object. + pixelbuf_pixelbuf_obj_t *self = m_new_obj(pixelbuf_pixelbuf_obj_t); + + self->base.type = &pixelbuf_pixelbuf_type; + self->pixels = args[ARG_size].u_int; + self->bytes = bytes; + self->byteorder = *byteorder; // Copied because we modify for dotstar + self->bytearray = args[ARG_buf].u_obj; + self->two_buffers = two_buffers; + self->rawbytearray = two_buffers ? args[ARG_rawbuf].u_obj : NULL; + self->offset = offset; + self->dotstar_mode = args[ARG_dotstar].u_bool; + self->buf = (uint8_t *)bufinfo.buf + offset; + self->rawbuf = two_buffers ? (uint8_t *)rawbufinfo.buf + offset : NULL; + self->pixel_step = effective_bpp; + self->auto_write = args[ARG_auto_write].u_bool; + + if (self->dotstar_mode) { + // Ensure sane configuration + if (!self->byteorder.has_luminosity) { + self->byteorder.has_luminosity = true; + self->byteorder.byteorder.b += 1; + self->byteorder.byteorder.g += 1; + self->byteorder.byteorder.r += 1; + } + self->byteorder.byteorder.w = 0; + } + + // Show/auto-write callbacks + self->write_function = args[ARG_write_function].u_obj; + mp_obj_t function_args = args[ARG_write_args].u_obj; + mp_obj_t *src_objs = (mp_obj_t *)&mp_const_none_obj; + size_t num_items = 0; + if (function_args != mp_const_none) { + if (MP_OBJ_IS_TYPE(function_args, &mp_type_list)) { + mp_obj_list_t *t = MP_OBJ_TO_PTR(function_args); + num_items = t->len; + src_objs = t->items; + } else { + mp_obj_tuple_t *l = MP_OBJ_TO_PTR(function_args); + num_items = l->len; + src_objs = l->items; + } + } + self->write_function_args = mp_obj_new_tuple(num_items + 1, NULL); + for (size_t i = 0; i < num_items; i++) { + self->write_function_args->items[i] = src_objs[i]; + } + self->write_function_args->items[num_items] = self; + + if (args[ARG_brightness].u_obj == mp_const_none) { + self->brightness = 1.0; + } else { + self->brightness = mp_obj_get_float(args[ARG_brightness].u_obj); + if (self->brightness < 0) + self->brightness = 0; + else if (self->brightness > 1) + self->brightness = 1; + } + + if (self->dotstar_mode) { + // Initialize the buffer with the dotstar start bytes. + // Header and end must be setup by caller + for (uint i = 0; i < self->pixels * 4; i += 4) { + self->buf[i] = DOTSTAR_LED_START_FULL_BRIGHT; + if (two_buffers) { + self->rawbuf[i] = DOTSTAR_LED_START_FULL_BRIGHT; + } + } + } + + return MP_OBJ_FROM_PTR(self); +} + +//| .. attribute:: bpp +//| +//| The number of bytes per pixel in the buffer (read-only) +//| +STATIC mp_obj_t pixelbuf_pixelbuf_obj_get_bpp(mp_obj_t self_in) { + mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type)); + pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in); + return mp_obj_new_int_from_uint(self->byteorder.bpp); +} +MP_DEFINE_CONST_FUN_OBJ_1(pixelbuf_pixelbuf_get_bpp_obj, pixelbuf_pixelbuf_obj_get_bpp); + +const mp_obj_property_t pixelbuf_pixelbuf_bpp_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&pixelbuf_pixelbuf_get_bpp_obj, + (mp_obj_t)&mp_const_none_obj, + (mp_obj_t)&mp_const_none_obj}, +}; + + +//| .. attribute:: brightness +//| +//| Float value between 0 and 1. Output brightness. +//| If the PixelBuf was allocated with two both a buf and a rawbuf, +//| setting this value causes a recomputation of the values in buf. +//| If only a buf was provided, then the brightness only applies to +//| future pixel changes. +//| In DotStar mode +//| +STATIC mp_obj_t pixelbuf_pixelbuf_obj_get_brightness(mp_obj_t self_in) { + mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type)); + pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in); + return mp_obj_new_float(self->brightness); +} +MP_DEFINE_CONST_FUN_OBJ_1(pixelbuf_pixelbuf_get_brightness_obj, pixelbuf_pixelbuf_obj_get_brightness); + + +STATIC mp_obj_t pixelbuf_pixelbuf_obj_set_brightness(mp_obj_t self_in, mp_obj_t value) { + mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type)); + pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in); + self->brightness = mp_obj_float_get(value); + if (self->brightness > 1) + self->brightness = 1; + else if (self->brightness < 0) + self->brightness = 0; + if (self->two_buffers) + pixelbuf_recalculate_brightness(self); + if (self->auto_write) + call_write_function(self); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(pixelbuf_pixelbuf_set_brightness_obj, pixelbuf_pixelbuf_obj_set_brightness); + +const mp_obj_property_t pixelbuf_pixelbuf_brightness_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&pixelbuf_pixelbuf_get_brightness_obj, + (mp_obj_t)&pixelbuf_pixelbuf_set_brightness_obj, + (mp_obj_t)&mp_const_none_obj}, +}; + +void pixelbuf_recalculate_brightness(pixelbuf_pixelbuf_obj_t *self) { + uint8_t *buf = (uint8_t *)self->buf; + uint8_t *rawbuf = (uint8_t *)self->rawbuf; + // Compensate for shifted buffer (bpp=3 dotstar) + for (uint i = 0; i < self->bytes; i++) { + // Don't adjust per-pixel luminance bytes in dotstar mode + if (!self->dotstar_mode || (i % 4 != 0)) + buf[i] = rawbuf[i] * self->brightness; + } +} + +//| .. attribute:: auto_write +//| +//| Whether to automatically write the pixels after each update. +//| +STATIC mp_obj_t pixelbuf_pixelbuf_obj_get_auto_write(mp_obj_t self_in) { + mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type)); + pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in); + return mp_obj_new_bool(self->auto_write); +} +MP_DEFINE_CONST_FUN_OBJ_1(pixelbuf_pixelbuf_get_auto_write_obj, pixelbuf_pixelbuf_obj_get_auto_write); + + +STATIC mp_obj_t pixelbuf_pixelbuf_obj_set_auto_write(mp_obj_t self_in, mp_obj_t value) { + mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type)); + pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in); + self->auto_write = mp_obj_is_true(value); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(pixelbuf_pixelbuf_set_auto_write_obj, pixelbuf_pixelbuf_obj_set_auto_write); + +const mp_obj_property_t pixelbuf_pixelbuf_auto_write_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&pixelbuf_pixelbuf_get_auto_write_obj, + (mp_obj_t)&pixelbuf_pixelbuf_set_auto_write_obj, + (mp_obj_t)&mp_const_none_obj}, +}; + + +//| .. attribute:: buf +//| +//| (read-only) bytearray of pixel data after brightness adjustment. If an offset was provided +//| then this bytearray is the subset of the bytearray passed in that represents the +//| actual pixels. +//| +STATIC mp_obj_t pixelbuf_pixelbuf_obj_get_buf(mp_obj_t self_in) { + mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type)); + pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in); + return mp_obj_new_bytearray_by_ref(self->bytes, self->buf); +} +MP_DEFINE_CONST_FUN_OBJ_1(pixelbuf_pixelbuf_get_buf_obj, pixelbuf_pixelbuf_obj_get_buf); + +const mp_obj_property_t pixelbuf_pixelbuf_buf_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&pixelbuf_pixelbuf_get_buf_obj, + (mp_obj_t)&mp_const_none_obj, + (mp_obj_t)&mp_const_none_obj}, +}; + +//| .. attribute:: byteorder +//| +//| `ByteOrder` class for the buffer (read-only) +//| +STATIC mp_obj_t pixelbuf_pixelbuf_obj_get_byteorder(mp_obj_t self_in) { + mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type)); + pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in); + return &self->byteorder; +} +MP_DEFINE_CONST_FUN_OBJ_1(pixelbuf_pixelbuf_get_byteorder_obj, pixelbuf_pixelbuf_obj_get_byteorder); + +const mp_obj_property_t pixelbuf_pixelbuf_byteorder_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&pixelbuf_pixelbuf_get_byteorder_obj, + (mp_obj_t)&mp_const_none_obj, + (mp_obj_t)&mp_const_none_obj}, +}; + +STATIC mp_obj_t pixelbuf_pixelbuf_unary_op(mp_unary_op_t op, mp_obj_t self_in) { + mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type)); + pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in); + switch (op) { + case MP_UNARY_OP_BOOL: return mp_const_true; + case MP_UNARY_OP_LEN: return MP_OBJ_NEW_SMALL_INT(self->pixels); + default: return MP_OBJ_NULL; // op not supported + } +} + +//| .. method:: show() +//| +//| Call the associated write function to display the pixels. +//| + +STATIC mp_obj_t pixelbuf_pixelbuf_show(mp_obj_t self_in) { + mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type)); + pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in); + call_write_function(self); + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(pixelbuf_pixelbuf_show_obj, pixelbuf_pixelbuf_show); + +void call_write_function(pixelbuf_pixelbuf_obj_t *self) { + // execute function if it's set + if (self->write_function != mp_const_none) { + mp_call_function_n_kw(self->write_function, self->write_function_args->len, 0, self->write_function_args->items); + } +} + + + +//| .. method:: [] +//| +//| Get or set pixels. Supports individual pixels and slices. +//| +STATIC mp_obj_t pixelbuf_pixelbuf_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_obj_t value) { + mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type)); + + if (value == MP_OBJ_NULL) { + // delete item + // slice deletion + return MP_OBJ_NULL; // op not supported + } + + pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in); + if (0) { +#if MICROPY_PY_BUILTINS_SLICE + } else if (MP_OBJ_IS_TYPE(index_in, &mp_type_slice)) { + mp_bound_slice_t slice; + + if (!mp_seq_get_fast_slice_indexes(self->bytes, index_in, &slice)) + mp_raise_NotImplementedError(translate("Only slices with step=1 (aka None) are supported")); + if ((slice.stop * self->pixel_step) > self->bytes) + mp_raise_IndexError(translate("Range out of bounds")); + + if (value == MP_OBJ_SENTINEL) { // Get + size_t len = slice.stop - slice.start; + return pixelbuf_get_pixel_array((uint8_t *) self->buf + slice.start, len, &self->byteorder, self->pixel_step, self->dotstar_mode); + } else { // Set + #if MICROPY_PY_ARRAY_SLICE_ASSIGN + + if (!(MP_OBJ_IS_TYPE(value, &mp_type_list) || MP_OBJ_IS_TYPE(value, &mp_type_tuple))) + mp_raise_ValueError(translate("tuple/list required on RHS")); + + size_t dst_len = slice.stop - slice.start; + + mp_obj_t *src_objs; + size_t num_items; + if (MP_OBJ_IS_TYPE(value, &mp_type_list)) { + mp_obj_list_t *t = MP_OBJ_TO_PTR(value); + num_items = t->len; + src_objs = t->items; + } else { + mp_obj_tuple_t *l = MP_OBJ_TO_PTR(value); + num_items = l->len; + src_objs = l->items; + } + if (num_items != dst_len) + mp_raise_ValueError_varg(translate("Unmatched number of items on RHS (expected %d, got %d)."), + dst_len, num_items); + + for (size_t i = slice.start; i < slice.stop; i++) { + mp_obj_t *item = src_objs[i-slice.start]; + if (MP_OBJ_IS_TYPE(value, &mp_type_list) || MP_OBJ_IS_TYPE(value, &mp_type_tuple) || MP_OBJ_IS_INT(value)) { + pixelbuf_set_pixel(self->buf + (i * self->pixel_step), + self->two_buffers ? self->rawbuf + (i * self->pixel_step) : NULL, + self->brightness, item, &self->byteorder, self->dotstar_mode); + } + } + if (self->auto_write) + call_write_function(self); + return mp_const_none; + #else + return MP_OBJ_NULL; // op not supported + #endif + } +#endif + } else { // Single index rather than slice. + size_t index = mp_get_index(self->base.type, self->pixels, index_in, false); + size_t offset = (index * self->pixel_step); + if (offset > self->bytes) + mp_raise_IndexError(translate("Pixel beyond bounds of buffer")); + + if (value == MP_OBJ_SENTINEL) { // Get + uint8_t *pixelstart = (uint8_t *)(self->two_buffers ? self->rawbuf : self->buf) + offset; + return pixelbuf_get_pixel(pixelstart, &self->byteorder, self->dotstar_mode); + } else { // Store + pixelbuf_set_pixel(self->buf + offset, self->two_buffers ? self->rawbuf + offset : NULL, + self->brightness, value, &self->byteorder, self->dotstar_mode); + if (self->auto_write) + call_write_function(self); + return mp_const_none; + } + } +} + +STATIC const mp_rom_map_elem_t pixelbuf_pixelbuf_locals_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_auto_write), MP_ROM_PTR(&pixelbuf_pixelbuf_auto_write_obj)}, + { MP_ROM_QSTR(MP_QSTR_bpp), MP_ROM_PTR(&pixelbuf_pixelbuf_bpp_obj)}, + { MP_ROM_QSTR(MP_QSTR_brightness), MP_ROM_PTR(&pixelbuf_pixelbuf_brightness_obj)}, + { MP_ROM_QSTR(MP_QSTR_buf), MP_ROM_PTR(&pixelbuf_pixelbuf_buf_obj)}, + { MP_ROM_QSTR(MP_QSTR_byteorder), MP_ROM_PTR(&pixelbuf_pixelbuf_byteorder_obj)}, + { MP_ROM_QSTR(MP_QSTR_show), MP_ROM_PTR(&pixelbuf_pixelbuf_show_obj)}, +}; + +STATIC MP_DEFINE_CONST_DICT(pixelbuf_pixelbuf_locals_dict, pixelbuf_pixelbuf_locals_dict_table); + + +const mp_obj_type_t pixelbuf_pixelbuf_type = { + { &mp_type_type }, + .name = MP_QSTR_PixelBuf, + .subscr = pixelbuf_pixelbuf_subscr, + .make_new = pixelbuf_pixelbuf_make_new, + .unary_op = pixelbuf_pixelbuf_unary_op, + .print = NULL, + .locals_dict = (mp_obj_t)&pixelbuf_pixelbuf_locals_dict, +}; diff --git a/shared-bindings/_pixelbuf/PixelBuf.h b/shared-bindings/_pixelbuf/PixelBuf.h new file mode 100644 index 000000000..0b1e36278 --- /dev/null +++ b/shared-bindings/_pixelbuf/PixelBuf.h @@ -0,0 +1,56 @@ +/* + * This file is part of the Circuit Python project, https://github.com/adafruit/circuitpython + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Roy Hooper + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef CP_SHARED_BINDINGS_PIXELBUF_PIXELBUF_H +#define CP_SHARED_BINDINGS_PIXELBUF_PIXELBUF_H + +#include "shared-bindings/_pixelbuf/types.h" + +const mp_obj_type_t pixelbuf_pixelbuf_type; + +typedef struct { + mp_obj_base_t base; + size_t pixels; + size_t bytes; + size_t pixel_step; + pixelbuf_byteorder_obj_t byteorder; + mp_obj_t bytearray; + mp_obj_t rawbytearray; + mp_float_t brightness; + bool two_buffers; + size_t offset; + bool dotstar_mode; + uint8_t *rawbuf; + uint8_t *buf; + mp_obj_t write_function; + mp_obj_tuple_t *write_function_args; + bool auto_write; +} pixelbuf_pixelbuf_obj_t; + +void pixelbuf_recalculate_brightness(pixelbuf_pixelbuf_obj_t *self); +void call_write_function(pixelbuf_pixelbuf_obj_t *self); + +#endif // CP_SHARED_BINDINGS_PIXELBUF_PIXELBUF_H diff --git a/shared-bindings/_pixelbuf/__init__.c b/shared-bindings/_pixelbuf/__init__.c new file mode 100644 index 000000000..31defc7fb --- /dev/null +++ b/shared-bindings/_pixelbuf/__init__.c @@ -0,0 +1,326 @@ +/* + * This file is part of the Circuit Python project, https://github.com/adafruit/circuitpython + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Roy Hooper + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "py/obj.h" +#include "py/mphal.h" +#include "py/runtime.h" +#include "py/objproperty.h" + +#include "types.h" +#include "__init__.h" + +#include "PixelBuf.h" +#include "../../shared-module/_pixelbuf/PixelBuf.h" + + +//| :mod:`_pixelbuf` --- Fast RGB(W) pixel buffer and helpers +//| =========================================================== + +//| .. module:: _pixelbuf +//| :synopsis: A fast RGB(W) pixel buffer library for like NeoPixel and DotStar. +//| +//| The `_pixelbuf` module provides :py:class:`PixelBuf` and :py:class:`ByteOrder` classes to accelerate +//| RGB(W) strip/matrix manipulation, such as DotStar and Neopixel. +//| + +//| Libraries +//| +//| .. toctree:: +//| :maxdepth: 3 +//| +//| PixelBuf + +//| .. class:: ByteOrder +//| +//| Classes representing byteorders for circuitpython + + +//| .. attribute:: bpp +//| +//| The number of bytes per pixel (read-only) +//| + +//| .. attribute:: has_white +//| +//| Whether the pixel has white (in addition to RGB) +//| + +//| .. attribute:: has_luminosity +//| +//| Whether the pixel has luminosity (in addition to RGB) +//| + +//| .. attribute:: byteorder +//| +//| Tuple of byte order (r, g, b) or (r, g, b, w) or (r, g, b, l) +//| + + +STATIC void pixelbuf_byteorder_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) { + mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_byteorder_type)); + pixelbuf_byteorder_obj_t *self = MP_OBJ_TO_PTR(self_in); + if (dest[0] == MP_OBJ_NULL) { + // load attribute + mp_obj_t val; + if (attr == MP_QSTR_bpp) { + val = MP_OBJ_NEW_SMALL_INT(self->bpp); + } else if (attr == MP_QSTR_has_white) { + val = mp_obj_new_bool(self->has_white); + } else if (attr == MP_QSTR_has_luminosity) { + val = mp_obj_new_bool(self->has_luminosity); + } else if (attr == MP_QSTR_byteorder) { + mp_obj_t items[4]; + uint8_t n = self->bpp; + if (self->has_luminosity || self->has_white) { + n = 4; + } + uint8_t *values = (uint8_t *)&(self->byteorder); + for (uint8_t i=0; i<n; i++) { + items[i] = MP_OBJ_NEW_SMALL_INT(values[i]); + } + val = mp_obj_new_tuple(n, items); + } else { + mp_raise_AttributeError(translate("no such attribute")); + } + dest[0] = val; + } else { + // delete/store attribute (ignored) + dest[0] = MP_OBJ_NULL; + mp_raise_AttributeError(translate("readonly attribute")); + } +} + +STATIC mp_obj_t pixelbuf_byteorder_unary_op(mp_unary_op_t op, mp_obj_t self_in) { + pixelbuf_byteorder_obj_t *self = MP_OBJ_TO_PTR(self_in); + switch (op) { + case MP_UNARY_OP_LEN: return MP_OBJ_NEW_SMALL_INT(self->bpp); + default: return MP_OBJ_NULL; // op not supported + } +} + +const mp_obj_type_t pixelbuf_byteorder_type = { + { &mp_type_type }, + .name = MP_QSTR_ByteOrder, + .print = pixelbuf_byteorder_print, + .unary_op = pixelbuf_byteorder_unary_op, + .attr = pixelbuf_byteorder_attr, +}; + + +// This macro is used to simplify RGB subclass definition +#define PIXELBUF_BYTEORDER(p_name, p_bpp, p_r, p_g, p_b, p_w, p_has_white, p_has_luminosity) \ +const pixelbuf_byteorder_obj_t byteorder_## p_name = { \ + { &pixelbuf_byteorder_type }, \ + .name = MP_QSTR_## p_name, \ + .bpp = p_bpp, \ + .byteorder = { p_r, p_g, p_b, p_w }, \ + .has_white = p_has_white, \ + .has_luminosity = p_has_luminosity, \ +}; + +//| .. function:: wheel(n) +//| +//| C implementation of the common wheel() function found in many examples. +//| Returns the colorwheel RGB value as an integer value for n (usable in :py:class:`PixelBuf`, neopixel, and dotstar). +//| + +STATIC mp_obj_t pixelbuf_wheel(mp_obj_t n) { + return MP_OBJ_NEW_SMALL_INT(colorwheel(MP_OBJ_IS_SMALL_INT(n) ? MP_OBJ_SMALL_INT_VALUE(n) : mp_obj_float_get(n))); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(pixelbuf_wheel_obj, pixelbuf_wheel); + +const int32_t colorwheel(float pos) { + if (pos > 255) { + pos = pos - ((uint32_t)(pos / 256) * 256); + } + if (pos < 85) + return (uint8_t)(pos * 3) << 16 | (uint8_t)(255 - (pos * 3)) << 8; + else if (pos < 170) { + pos -= 85; + return (uint8_t)(255 - (pos * 3)) << 16 | (uint8_t)(pos * 3); + } else { + pos -= 170; + return (uint8_t)(pos * 3) << 8 | (uint8_t)(255 - pos * 3); + } +} + + +/// RGB +//| .. class:: RGB +//| +//| * **order** Red, Green, Blue +//| * **bpp** 3 +PIXELBUF_BYTEORDER(RGB, 3, 0, 1, 2, 3, false, false) +//| .. class:: RBG +//| +//| * **order** Red, Blue, Green +//| * **bpp** 3 +PIXELBUF_BYTEORDER(RBG, 3, 0, 2, 1, 3, false, false) +//| .. class:: GRB +//| +//| * **order** Green, Red, Blue +//| * **bpp** 3 +//| +//| Commonly used by NeoPixel. +PIXELBUF_BYTEORDER(GRB, 3, 1, 0, 2, 3, false, false) +//| .. class:: GBR +//| +//| * **order** Green, Blue, Red +//| * **bpp** 3 +PIXELBUF_BYTEORDER(GBR, 3, 1, 2, 0, 3, false, false) +//| .. class:: BRG +//| +//| * **order** Blue, Red, Green +//| * **bpp** 3 +PIXELBUF_BYTEORDER(BRG, 3, 2, 0, 1, 3, false, false) +//| .. class:: BGR +//| +//| * **order** Blue, Green, Red +//| * **bpp** 3 +//| +//| Commonly used by Dotstar. +PIXELBUF_BYTEORDER(BGR, 3, 2, 1, 0, 3, false, false) + +// RGBW +//| .. class:: RGBW +//| +//| * **order** Red, Green, Blue, White +//| * **bpp** 4 +//| * **has_white** True +PIXELBUF_BYTEORDER(RGBW, 4, 0, 1, 2, 3, true, false) +//| .. class:: RBGW +//| +//| * **order** Red, Blue, Green, White +//| * **bpp** 4 +//| * **has_white** True +PIXELBUF_BYTEORDER(RBGW, 4, 0, 2, 1, 3, true, false) +//| .. class:: GRBW +//| +//| * **order** Green, Red, Blue, White +//| * **bpp** 4 +//| * **has_white** True +//| +//| Commonly used by RGBW NeoPixels. +PIXELBUF_BYTEORDER(GRBW, 4, 1, 0, 2, 3, true, false) +//| .. class:: GBRW +//| +//| * **order** Green, Blue, Red, White +//| * **bpp** 4 +//| * **has_white** True +PIXELBUF_BYTEORDER(GBRW, 4, 1, 2, 0, 3, true, false) +//| .. class:: BRGW +//| +//| * **order** Blue, Red, Green, White +//| * **bpp** 4 +//| * **has_white** True +PIXELBUF_BYTEORDER(BRGW, 4, 2, 0, 1, 3, true, false) +//| .. class:: BGRW +//| +//| * **order** Blue, Green, Red, White +//| * **bpp** 4 +//| * **has_white** True +PIXELBUF_BYTEORDER(BGRW, 4, 2, 1, 0, 3, true, false) + +// Luminosity + RGB (eg for Dotstar) +// Luminosity chosen because the luminosity of a Dotstar at full bright +// burns the eyes like looking at the Sun. +// https://www.thesaurus.com/browse/luminosity?s=t +//| .. class:: LRGB +//| +//| * **order** *Luminosity*, Red, Green, Blue +//| * **bpp** 4 +//| * **has_luminosity** True +PIXELBUF_BYTEORDER(LRGB, 4, 1, 2, 3, 0, false, true) +//| .. class:: LRBG +//| +//| * **order** *Luminosity*, Red, Blue, Green +//| * **bpp** 4 +//| * **has_luminosity** True +PIXELBUF_BYTEORDER(LRBG, 4, 1, 3, 2, 0, false, true) +//| .. class:: LGRB +//| +//| * **order** *Luminosity*, Green, Red, Blue +//| * **bpp** 4 +//| * **has_luminosity** True +PIXELBUF_BYTEORDER(LGRB, 4, 2, 1, 3, 0, false, true) +//| .. class:: LGBR +//| +//| * **order** *Luminosity*, Green, Blue, Red +//| * **bpp** 4 +//| * **has_luminosity** True +PIXELBUF_BYTEORDER(LGBR, 4, 2, 3, 1, 0, false, true) +//| .. class:: LBRG +//| +//| * **order** *Luminosity*, Blue, Red, Green +//| * **bpp** 4 +//| * **has_luminosity** True +PIXELBUF_BYTEORDER(LBRG, 4, 3, 1, 2, 0, false, true) +//| .. class:: LBGR +//| +//| * **order** *Luminosity*, Blue, Green, Red +//| * **bpp** 4 +//| * **has_luminosity** True +//| +//| Actual format commonly used by DotStar (5 bit luninance value) +PIXELBUF_BYTEORDER(LBGR, 4, 3, 2, 1, 0, false, true) + +STATIC const mp_rom_map_elem_t pixelbuf_module_globals_table[] = { + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR__pixelbuf) }, + { MP_ROM_QSTR(MP_QSTR_PixelBuf), MP_ROM_PTR(&pixelbuf_pixelbuf_type) }, + { MP_ROM_QSTR(MP_QSTR_ByteOrder), MP_ROM_PTR(&pixelbuf_byteorder_type) }, + { MP_ROM_QSTR(MP_QSTR_RGB), MP_ROM_PTR(&byteorder_RGB) }, + { MP_ROM_QSTR(MP_QSTR_RBG), MP_ROM_PTR(&byteorder_RBG) }, + { MP_ROM_QSTR(MP_QSTR_GRB), MP_ROM_PTR(&byteorder_GRB) }, + { MP_ROM_QSTR(MP_QSTR_GBR), MP_ROM_PTR(&byteorder_GBR) }, + { MP_ROM_QSTR(MP_QSTR_BRG), MP_ROM_PTR(&byteorder_BRG) }, + { MP_ROM_QSTR(MP_QSTR_BGR), MP_ROM_PTR(&byteorder_BGR) }, + { MP_ROM_QSTR(MP_QSTR_RGBW), MP_ROM_PTR(&byteorder_RGBW) }, + { MP_ROM_QSTR(MP_QSTR_RBGW), MP_ROM_PTR(&byteorder_RBGW) }, + { MP_ROM_QSTR(MP_QSTR_GRBW), MP_ROM_PTR(&byteorder_GRBW) }, + { MP_ROM_QSTR(MP_QSTR_GBRW), MP_ROM_PTR(&byteorder_GBRW) }, + { MP_ROM_QSTR(MP_QSTR_BRGW), MP_ROM_PTR(&byteorder_BRGW) }, + { MP_ROM_QSTR(MP_QSTR_BGRW), MP_ROM_PTR(&byteorder_BGRW) }, + { MP_ROM_QSTR(MP_QSTR_LRGB), MP_ROM_PTR(&byteorder_LRGB) }, + { MP_ROM_QSTR(MP_QSTR_LRBG), MP_ROM_PTR(&byteorder_LRBG) }, + { MP_ROM_QSTR(MP_QSTR_LGRB), MP_ROM_PTR(&byteorder_LGRB) }, + { MP_ROM_QSTR(MP_QSTR_LGBR), MP_ROM_PTR(&byteorder_LGBR) }, + { MP_ROM_QSTR(MP_QSTR_LBRG), MP_ROM_PTR(&byteorder_LBRG) }, + { MP_ROM_QSTR(MP_QSTR_LBGR), MP_ROM_PTR(&byteorder_LBGR) }, + { MP_ROM_QSTR(MP_QSTR_wheel), MP_ROM_PTR(&pixelbuf_wheel_obj) }, +}; + +STATIC MP_DEFINE_CONST_DICT(pixelbuf_module_globals, pixelbuf_module_globals_table); + +STATIC void pixelbuf_byteorder_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { + pixelbuf_byteorder_obj_t *self = MP_OBJ_TO_PTR(self_in); + mp_printf(print, "%q.%q", MP_QSTR__pixelbuf, self->name); + return; +} + +const mp_obj_module_t pixelbuf_module = { + .base = { &mp_type_module }, + .globals = (mp_obj_dict_t*)&pixelbuf_module_globals, +}; diff --git a/shared-bindings/_pixelbuf/__init__.h b/shared-bindings/_pixelbuf/__init__.h new file mode 100644 index 000000000..a62d67c4a --- /dev/null +++ b/shared-bindings/_pixelbuf/__init__.h @@ -0,0 +1,37 @@ +/* + * This file is part of the Circuit Python project, https://github.com/adafruit/circuitpython + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Roy Hooper + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef CP_SHARED_BINDINGS_PIXELBUF_INIT_H +#define CP_SHARED_BINDINGS_PIXELBUF_INIT_H + +#include "common-hal/digitalio/DigitalInOut.h" + +STATIC void pixelbuf_byteorder_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind); +const int32_t colorwheel(float pos); +const mp_obj_type_t pixelbuf_byteorder_type; +extern void common_hal_neopixel_write(const digitalio_digitalinout_obj_t* gpio, uint8_t *pixels, uint32_t numBytes); + +#endif //CP_SHARED_BINDINGS_PIXELBUF_INIT_H diff --git a/shared-bindings/_pixelbuf/types.h b/shared-bindings/_pixelbuf/types.h new file mode 100644 index 000000000..f7d757791 --- /dev/null +++ b/shared-bindings/_pixelbuf/types.h @@ -0,0 +1,48 @@ +/* + * This file is part of the Circuit Python project, https://github.com/adafruit/circuitpython + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Roy Hooper + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef CIRCUITPYTHON_PIXELBUF_TYPES_H +#define CIRCUITPYTHON_PIXELBUF_TYPES_H + +//| :orphan: + +typedef struct { + uint8_t r; + uint8_t g; + uint8_t b; + uint8_t w; +} pixelbuf_rgbw_t; + +typedef struct { + mp_obj_base_t base; + qstr name; + uint8_t bpp; + pixelbuf_rgbw_t byteorder; + bool has_white; + bool has_luminosity; +} pixelbuf_byteorder_obj_t; + +#endif // CIRCUITPYTHON_PIXELBUF_TYPES_H diff --git a/shared-bindings/_stage/Layer.c b/shared-bindings/_stage/Layer.c index a3334f635..12028b131 100644 --- a/shared-bindings/_stage/Layer.c +++ b/shared-bindings/_stage/Layer.c @@ -51,8 +51,8 @@ //| it shouldn't be used on its own. //| STATIC mp_obj_t layer_make_new(const mp_obj_type_t *type, size_t n_args, - size_t n_kw, const mp_obj_t *args) { - mp_arg_check_num(n_args, n_kw, 4, 5, false); + const mp_obj_t *args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 4, 5, false); layer_obj_t *self = m_new_obj(layer_obj_t); self->base.type = type; diff --git a/shared-bindings/_stage/Text.c b/shared-bindings/_stage/Text.c index 7a406271d..49c1d00ca 100644 --- a/shared-bindings/_stage/Text.c +++ b/shared-bindings/_stage/Text.c @@ -51,8 +51,8 @@ //| it shouldn't be used on its own. //| STATIC mp_obj_t text_make_new(const mp_obj_type_t *type, size_t n_args, - size_t n_kw, const mp_obj_t *args) { - mp_arg_check_num(n_args, n_kw, 5, 5, false); + const mp_obj_t *args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 5, 5, false); text_obj_t *self = m_new_obj(text_obj_t); self->base.type = type; diff --git a/shared-bindings/analogio/AnalogIn.c b/shared-bindings/analogio/AnalogIn.c index b5f9d7a4e..116f82a03 100644 --- a/shared-bindings/analogio/AnalogIn.c +++ b/shared-bindings/analogio/AnalogIn.c @@ -58,9 +58,9 @@ //| :param ~microcontroller.Pin pin: the pin to read from //| STATIC mp_obj_t analogio_analogin_make_new(const mp_obj_type_t *type, - mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) { + mp_uint_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { // check number of arguments - mp_arg_check_num(n_args, n_kw, 1, 1, false); + mp_arg_check_num(n_args, kw_args, 1, 1, false); // 1st argument is the pin mp_obj_t pin_obj = args[0]; diff --git a/shared-bindings/analogio/AnalogOut.c b/shared-bindings/analogio/AnalogOut.c index 58ed5b6b2..dcbd7ecfb 100644 --- a/shared-bindings/analogio/AnalogOut.c +++ b/shared-bindings/analogio/AnalogOut.c @@ -58,9 +58,9 @@ //| //| :param ~microcontroller.Pin pin: the pin to output to //| -STATIC mp_obj_t analogio_analogout_make_new(const mp_obj_type_t *type, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) { +STATIC mp_obj_t analogio_analogout_make_new(const mp_obj_type_t *type, mp_uint_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { // check arguments - mp_arg_check_num(n_args, n_kw, 1, MP_OBJ_FUN_ARGS_MAX, true); + mp_arg_check_num(n_args, kw_args, 1, 1, false); assert_pin(args[0], false); const mcu_pin_obj_t *pin = MP_OBJ_TO_PTR(args[0]); diff --git a/shared-bindings/audiobusio/I2SOut.c b/shared-bindings/audiobusio/I2SOut.c index e3eef924d..48424d073 100644 --- a/shared-bindings/audiobusio/I2SOut.c +++ b/shared-bindings/audiobusio/I2SOut.c @@ -93,10 +93,7 @@ //| pass //| print("stopped") //| -STATIC mp_obj_t audiobusio_i2sout_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { - mp_arg_check_num(n_args, n_kw, 3, 4, true); - mp_map_t kw_args; - mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); +STATIC mp_obj_t audiobusio_i2sout_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { enum { ARG_bit_clock, ARG_word_select, ARG_data, ARG_left_justified }; static const mp_arg_t allowed_args[] = { { MP_QSTR_bit_clock, MP_ARG_OBJ | MP_ARG_REQUIRED }, @@ -105,7 +102,7 @@ STATIC mp_obj_t audiobusio_i2sout_make_new(const mp_obj_type_t *type, size_t n_a { MP_QSTR_left_justified, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_bool = false} }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all(n_args, pos_args, &kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); mp_obj_t bit_clock_obj = args[ARG_bit_clock].u_obj; assert_pin(bit_clock_obj, false); diff --git a/shared-bindings/audiobusio/PDMIn.c b/shared-bindings/audiobusio/PDMIn.c index 8bfa4c15b..5dca3fa59 100644 --- a/shared-bindings/audiobusio/PDMIn.c +++ b/shared-bindings/audiobusio/PDMIn.c @@ -87,12 +87,12 @@ //| with audiobusio.PDMIn(board.MICROPHONE_CLOCK, board.MICROPHONE_DATA, sample_rate=16000, bit_depth=16) as mic: //| mic.record(b, len(b)) //| -STATIC mp_obj_t audiobusio_pdmin_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { - enum { ARG_sample_rate, ARG_bit_depth, ARG_mono, ARG_oversample, ARG_startup_delay }; - mp_map_t kw_args; - mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); +STATIC mp_obj_t audiobusio_pdmin_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + enum { ARG_clock_pin, ARG_data_pin, ARG_sample_rate, ARG_bit_depth, ARG_mono, ARG_oversample, ARG_startup_delay }; static const mp_arg_t allowed_args[] = { - { MP_QSTR_sample_rate, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 16000} }, + { MP_QSTR_clock_pin, MP_ARG_REQUIRED | MP_ARG_OBJ }, + { MP_QSTR_data_pin, MP_ARG_REQUIRED | MP_ARG_OBJ }, + { MP_QSTR_sample_rate, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 16000} }, { MP_QSTR_bit_depth, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 8} }, { MP_QSTR_mono, MP_ARG_KW_ONLY | MP_ARG_BOOL,{.u_bool = true} }, { MP_QSTR_oversample, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 64} }, @@ -102,14 +102,14 @@ STATIC mp_obj_t audiobusio_pdmin_make_new(const mp_obj_type_t *type, size_t n_ar static const float STARTUP_DELAY_DEFAULT = 0.110F; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all(n_args - 2, pos_args + 2, &kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); - mp_obj_t clock_pin_obj = pos_args[0]; + mp_obj_t clock_pin_obj = args[ARG_clock_pin].u_obj; assert_pin(clock_pin_obj, false); const mcu_pin_obj_t *clock_pin = MP_OBJ_TO_PTR(clock_pin_obj); assert_pin_free(clock_pin); - mp_obj_t data_pin_obj = pos_args[1]; + mp_obj_t data_pin_obj = args[ARG_data_pin].u_obj; assert_pin(data_pin_obj, false); const mcu_pin_obj_t *data_pin = MP_OBJ_TO_PTR(data_pin_obj); assert_pin_free(data_pin); @@ -129,8 +129,8 @@ STATIC mp_obj_t audiobusio_pdmin_make_new(const mp_obj_type_t *type, size_t n_ar } bool mono = args[ARG_mono].u_bool; - float startup_delay = (args[ARG_startup_delay].u_obj == MP_OBJ_NULL) - ? STARTUP_DELAY_DEFAULT + mp_float_t startup_delay = (args[ARG_startup_delay].u_obj == MP_OBJ_NULL) + ? (mp_float_t)STARTUP_DELAY_DEFAULT : mp_obj_get_float(args[ARG_startup_delay].u_obj); if (startup_delay < 0.0 || startup_delay > 1.0) { mp_raise_ValueError(translate("Microphone startup delay must be in range 0.0 to 1.0")); diff --git a/shared-bindings/audioio/AudioOut.c b/shared-bindings/audioio/AudioOut.c index 94340d62c..9cb98d1f8 100644 --- a/shared-bindings/audioio/AudioOut.c +++ b/shared-bindings/audioio/AudioOut.c @@ -93,10 +93,7 @@ //| pass //| print("stopped") //| -STATIC mp_obj_t audioio_audioout_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { - mp_arg_check_num(n_args, n_kw, 1, 2, true); - mp_map_t kw_args; - mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); +STATIC mp_obj_t audioio_audioout_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { enum { ARG_left_channel, ARG_right_channel, ARG_quiescent_value }; static const mp_arg_t allowed_args[] = { { MP_QSTR_left_channel, MP_ARG_OBJ | MP_ARG_REQUIRED }, @@ -104,7 +101,7 @@ STATIC mp_obj_t audioio_audioout_make_new(const mp_obj_type_t *type, size_t n_ar { MP_QSTR_quiescent_value, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0x8000} }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all(n_args, pos_args, &kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); mp_obj_t left_channel_obj = args[ARG_left_channel].u_obj; assert_pin(left_channel_obj, false); diff --git a/shared-bindings/audioio/Mixer.c b/shared-bindings/audioio/Mixer.c index dc7a12ebc..43ef2c524 100644 --- a/shared-bindings/audioio/Mixer.c +++ b/shared-bindings/audioio/Mixer.c @@ -73,10 +73,7 @@ //| time.sleep(1) //| print("stopped") //| -STATIC mp_obj_t audioio_mixer_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { - mp_arg_check_num(n_args, n_kw, 0, 2, true); - mp_map_t kw_args; - mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); +STATIC mp_obj_t audioio_mixer_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { enum { ARG_voice_count, ARG_buffer_size, ARG_channel_count, ARG_bits_per_sample, ARG_samples_signed, ARG_sample_rate }; static const mp_arg_t allowed_args[] = { { MP_QSTR_voice_count, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 2} }, @@ -87,7 +84,7 @@ STATIC mp_obj_t audioio_mixer_make_new(const mp_obj_type_t *type, size_t n_args, { MP_QSTR_sample_rate, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 8000} }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all(n_args, pos_args, &kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); mp_int_t voice_count = args[ARG_voice_count].u_int; if (voice_count < 1 || voice_count > 255) { diff --git a/shared-bindings/audioio/RawSample.c b/shared-bindings/audioio/RawSample.c index 28b6027c3..7fc896449 100644 --- a/shared-bindings/audioio/RawSample.c +++ b/shared-bindings/audioio/RawSample.c @@ -73,10 +73,7 @@ //| time.sleep(1) //| dac.stop() //| -STATIC mp_obj_t audioio_rawsample_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { - mp_arg_check_num(n_args, n_kw, 1, 2, true); - mp_map_t kw_args; - mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); +STATIC mp_obj_t audioio_rawsample_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { enum { ARG_buffer, ARG_channel_count, ARG_sample_rate }; static const mp_arg_t allowed_args[] = { { MP_QSTR_buffer, MP_ARG_OBJ | MP_ARG_REQUIRED }, @@ -84,7 +81,7 @@ STATIC mp_obj_t audioio_rawsample_make_new(const mp_obj_type_t *type, size_t n_a { MP_QSTR_sample_rate, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 8000} }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all(n_args, pos_args, &kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); audioio_rawsample_obj_t *self = m_new_obj(audioio_rawsample_obj_t); self->base.type = &audioio_rawsample_type; diff --git a/shared-bindings/audioio/WaveFile.c b/shared-bindings/audioio/WaveFile.c index 2d2ef578b..cddeef769 100644 --- a/shared-bindings/audioio/WaveFile.c +++ b/shared-bindings/audioio/WaveFile.c @@ -67,8 +67,8 @@ //| pass //| print("stopped") //| -STATIC mp_obj_t audioio_wavefile_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { - mp_arg_check_num(n_args, n_kw, 1, 1, true); +STATIC mp_obj_t audioio_wavefile_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 1, 1, false); audioio_wavefile_obj_t *self = m_new_obj(audioio_wavefile_obj_t); self->base.type = &audioio_wavefile_type; diff --git a/shared-bindings/bitbangio/I2C.c b/shared-bindings/bitbangio/I2C.c index 7f42153ec..374268e3d 100644 --- a/shared-bindings/bitbangio/I2C.c +++ b/shared-bindings/bitbangio/I2C.c @@ -53,13 +53,7 @@ //| :param int frequency: The clock frequency of the bus //| :param int timeout: The maximum clock stretching timeout in microseconds //| -STATIC mp_obj_t bitbangio_i2c_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { - mp_arg_check_num(n_args, n_kw, 0, MP_OBJ_FUN_ARGS_MAX, true); - bitbangio_i2c_obj_t *self = m_new_obj(bitbangio_i2c_obj_t); - raise_error_if_deinited(shared_module_bitbangio_i2c_deinited(self)); - self->base.type = &bitbangio_i2c_type; - mp_map_t kw_args; - mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); +STATIC mp_obj_t bitbangio_i2c_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { enum { ARG_scl, ARG_sda, ARG_frequency, ARG_timeout }; static const mp_arg_t allowed_args[] = { { MP_QSTR_scl, MP_ARG_REQUIRED | MP_ARG_OBJ }, @@ -68,11 +62,15 @@ STATIC mp_obj_t bitbangio_i2c_make_new(const mp_obj_type_t *type, size_t n_args, { MP_QSTR_timeout, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 255} }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all(n_args, pos_args, &kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); assert_pin(args[ARG_scl].u_obj, false); assert_pin(args[ARG_sda].u_obj, false); const mcu_pin_obj_t* scl = MP_OBJ_TO_PTR(args[ARG_scl].u_obj); const mcu_pin_obj_t* sda = MP_OBJ_TO_PTR(args[ARG_sda].u_obj); + + bitbangio_i2c_obj_t *self = m_new_obj(bitbangio_i2c_obj_t); + raise_error_if_deinited(shared_module_bitbangio_i2c_deinited(self)); + self->base.type = &bitbangio_i2c_type; shared_module_bitbangio_i2c_construct(self, scl, sda, args[ARG_frequency].u_int, args[ARG_timeout].u_int); return (mp_obj_t)self; } diff --git a/shared-bindings/bitbangio/OneWire.c b/shared-bindings/bitbangio/OneWire.c index 608c98100..a3c53d2a5 100644 --- a/shared-bindings/bitbangio/OneWire.c +++ b/shared-bindings/bitbangio/OneWire.c @@ -62,16 +62,13 @@ //| onewire.write_bit(False) //| print(onewire.read_bit()) //| -STATIC mp_obj_t bitbangio_onewire_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { - mp_arg_check_num(n_args, n_kw, 1, MP_OBJ_FUN_ARGS_MAX, true); - mp_map_t kw_args; - mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); +STATIC mp_obj_t bitbangio_onewire_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { enum { ARG_pin }; static const mp_arg_t allowed_args[] = { { MP_QSTR_pin, MP_ARG_REQUIRED | MP_ARG_OBJ }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all(n_args, pos_args, &kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); assert_pin(args[ARG_pin].u_obj, false); const mcu_pin_obj_t* pin = MP_OBJ_TO_PTR(args[ARG_pin].u_obj); assert_pin_free(pin); diff --git a/shared-bindings/bitbangio/SPI.c b/shared-bindings/bitbangio/SPI.c index 5fcfcb120..974ec99e2 100644 --- a/shared-bindings/bitbangio/SPI.c +++ b/shared-bindings/bitbangio/SPI.c @@ -62,12 +62,7 @@ //| // TODO(tannewt): Support LSB SPI. -STATIC mp_obj_t bitbangio_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { - mp_arg_check_num(n_args, n_kw, 0, MP_OBJ_FUN_ARGS_MAX, true); - bitbangio_spi_obj_t *self = m_new_obj(bitbangio_spi_obj_t); - self->base.type = &bitbangio_spi_type; - mp_map_t kw_args; - mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); +STATIC mp_obj_t bitbangio_spi_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { enum { ARG_clock, ARG_MOSI, ARG_MISO, ARG_baudrate, ARG_polarity, ARG_phase, ARG_bits, ARG_firstbit }; static const mp_arg_t allowed_args[] = { { MP_QSTR_clock, MP_ARG_REQUIRED | MP_ARG_OBJ }, @@ -75,13 +70,16 @@ STATIC mp_obj_t bitbangio_spi_make_new(const mp_obj_type_t *type, size_t n_args, { MP_QSTR_MISO, MP_ARG_OBJ, {.u_obj = mp_const_none} }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all(n_args, pos_args, &kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); assert_pin(args[ARG_clock].u_obj, false); assert_pin(args[ARG_MOSI].u_obj, true); assert_pin(args[ARG_MISO].u_obj, true); const mcu_pin_obj_t* clock = MP_OBJ_TO_PTR(args[ARG_clock].u_obj); const mcu_pin_obj_t* mosi = MP_OBJ_TO_PTR(args[ARG_MOSI].u_obj); const mcu_pin_obj_t* miso = MP_OBJ_TO_PTR(args[ARG_MISO].u_obj); + + bitbangio_spi_obj_t *self = m_new_obj(bitbangio_spi_obj_t); + self->base.type = &bitbangio_spi_type; shared_module_bitbangio_spi_construct(self, clock, mosi, miso); return (mp_obj_t)self; } diff --git a/shared-bindings/bleio/Address.c b/shared-bindings/bleio/Address.c index ec23ff207..b7c76b7b2 100644 --- a/shared-bindings/bleio/Address.c +++ b/shared-bindings/bleio/Address.c @@ -33,8 +33,12 @@ #include "shared-bindings/bleio/Address.h" #include "shared-module/bleio/Address.h" -#define ADDRESS_LONG_LEN 17 // XX:XX:XX:XX:XX:XX -#define ADDRESS_SHORT_LEN 12 // XXXXXXXXXXXX +#define ADDRESS_BYTE_LEN 12 + +STATIC uint8_t xdigit_8b_value(byte nibble1, byte nibble2) { + return unichar_xdigit_value(nibble1) | (unichar_xdigit_value(nibble2) << 4); +} + //| .. currentmodule:: bleio //| @@ -49,7 +53,7 @@ //| Create a new Address object encapsulating the address value. //| The value itself can be one of: //| -//| - a `str` value in the format of 'XXXXXXXXXXXX' or 'XX:XX:XX:XX:XX' +//| - a `str` value in the format of 'XXXXXXXXXXXX' or 'XX:XX:XX:XX:XX:XX' (12 hex digits) //| - a `bytes` or `bytearray` containing 6 bytes //| - another Address object //| @@ -65,46 +69,57 @@ //| - `bleio.AddressType.RANDOM_PRIVATE_RESOLVABLE` //| - `bleio.AddressType.RANDOM_PRIVATE_NON_RESOLVABLE` //| -STATIC mp_obj_t bleio_address_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { - mp_arg_check_num(n_args, n_kw, 1, 1, true); - bleio_address_obj_t *self = m_new_obj(bleio_address_obj_t); - self->base.type = &bleio_address_type; - self->type = ADDRESS_PUBLIC; - - mp_map_t kw_args; - mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); - +STATIC mp_obj_t bleio_address_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { enum { ARG_address }; static const mp_arg_t allowed_args[] = { - { ARG_address, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, + { MP_QSTR_address, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all(n_args, pos_args, &kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + bleio_address_obj_t *self = m_new_obj(bleio_address_obj_t); + self->base.type = &bleio_address_type; + self->type = ADDRESS_PUBLIC; const mp_obj_t address = args[ARG_address].u_obj; if (MP_OBJ_IS_STR(address)) { - GET_STR_DATA_LEN(address, str_data, str_len); - const bool is_long = (str_len == ADDRESS_LONG_LEN); - const bool is_short = (str_len == ADDRESS_SHORT_LEN); + GET_STR_DATA_LEN(address, str, str_len); + + size_t value_index = 0; + int str_index = str_len; + bool error = false; + + // Loop until fewer than two characters left. + while (str_index >= 1 && value_index < sizeof(self->value)) { + if (str[str_index] == ':') { + // Skip colon separators. + str_index--; + continue; + } - if (is_long || is_short) { - size_t i = str_len - 1; - for (size_t b = 0; b < BLEIO_ADDRESS_BYTES; ++b) { - self->value[b] = unichar_xdigit_value(str_data[i]) | - unichar_xdigit_value(str_data[i - 1]) << 4; + if (!unichar_isxdigit(str[str_index]) || + !unichar_isxdigit(str[str_index-1])) { + error = true; + break; + } - i -= is_long ? 3 : 2; + self->value[value_index] = xdigit_8b_value(str[str_index], + str[str_index-1]); + value_index += 1; + str_index -= 2; } - } else { - mp_raise_ValueError(translate("Wrong address length")); + // Check for correct number of hex digits and no parsing errors. + if (error || value_index != ADDRESS_BYTE_LEN || str_index != -1) { + mp_raise_ValueError_varg(translate("Address is not %d bytes long or is in wrong format"), + ADDRESS_BYTE_LEN); } } else if (MP_OBJ_IS_TYPE(address, &mp_type_bytearray) || MP_OBJ_IS_TYPE(address, &mp_type_bytes)) { mp_buffer_info_t buf_info; mp_get_buffer_raise(address, &buf_info, MP_BUFFER_READ); if (buf_info.len != BLEIO_ADDRESS_BYTES) { - mp_raise_ValueError(translate("Wrong number of bytes provided")); + mp_raise_ValueError_varg(translate("Address must be %d bytes long"), BLEIO_ADDRESS_BYTES); } for (size_t b = 0; b < BLEIO_ADDRESS_BYTES; ++b) { @@ -123,7 +138,7 @@ STATIC mp_obj_t bleio_address_make_new(const mp_obj_type_t *type, size_t n_args, STATIC void bleio_address_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { bleio_address_obj_t *self = MP_OBJ_TO_PTR(self_in); - mp_printf(print, "Address('"HEX2_FMT":"HEX2_FMT":"HEX2_FMT":"HEX2_FMT":"HEX2_FMT":"HEX2_FMT"')", + mp_printf(print, "Address('%02x:%02x:%02x:%02x:%02x:%02x')", self->value[5], self->value[4], self->value[3], self->value[2], self->value[1], self->value[0]); } diff --git a/shared-bindings/bleio/Broadcaster.c b/shared-bindings/bleio/Broadcaster.c new file mode 100644 index 000000000..209e66490 --- /dev/null +++ b/shared-bindings/bleio/Broadcaster.c @@ -0,0 +1,132 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Dan Halbert for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "ble_drv.h" +#include "py/runtime.h" + +#include "shared-bindings/bleio/Broadcaster.h" + +//| .. currentmodule:: bleio +//| +//| :class:`Broadcaster` -- Broadcast advertising packets. +//| ========================================================= +//| +//| Implement a BLE broadcaster which sends data in advertising packets and does not connect. +//| Used for beacons and other one-way data transmission. +//| +//| Usage:: +//| +//| import bleio +//| import time +//| +//| # Broadcast once a second. +//| broadcaster = bleio.Broadcaster(interval=1) +//| data = 0 +//| # Broadcast a byte of data that's incremented once a minute +//| while True: +//| # data is an entire advertising data packet, starting with flags. +//| broadcaster.start_advertising(data) +//| time.sleep(60) +//| data += 1 +//| +//| .. class:: Broadcaster(interval=1) +//| +//| Create a new Broadcaster object. + +//| :param float interval: how often to broadcast +//| + +STATIC mp_obj_t bleio_broadcaster_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + enum { ARG_interval }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_interval, MP_ARG_OBJ, {.u_obj = MP_OBJ_NEW_SMALL_INT(1)} }, + }; + + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + mp_float_t interval = mp_obj_get_float(args[ARG_interval].u_obj); + + bleio_broadcaster_obj_t *self = m_new_obj(bleio_broadcaster_obj_t); + self->base.type = &bleio_broadcaster_type; + // Do port-specific initialization. interval will be validated. + common_hal_bleio_broadcaster_construct(self, interval); + + return MP_OBJ_FROM_PTR(self); +} + +//| .. method:: start_advertising(data) +//| +//| Start advertising using the given data packet. +//| +//| :param buf data: advertising data packet, starting with advertising data flags (0x01) +//| +STATIC mp_obj_t bleio_broadcaster_start_advertising(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + bleio_broadcaster_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]); + + enum { ARG_data }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_data, MP_ARG_REQUIRED | MP_ARG_OBJ }, + }; + + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + mp_buffer_info_t bufinfo; + mp_get_buffer_raise(args[ARG_data].u_obj, &bufinfo, MP_BUFFER_READ); + + common_hal_bleio_broadcaster_start_advertising(self, &bufinfo); + + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_KW(bleio_broadcaster_start_advertising_obj, 0, bleio_broadcaster_start_advertising); + +//| .. method:: stop_advertising() +//| +//| Stop sending advertising packets. +STATIC mp_obj_t bleio_broadcaster_stop_advertising(mp_obj_t self_in) { + bleio_broadcaster_obj_t *self = MP_OBJ_TO_PTR(self_in); + + common_hal_bleio_broadcaster_stop_advertising(self); + + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_broadcaster_stop_advertising_obj, bleio_broadcaster_stop_advertising); + +STATIC const mp_rom_map_elem_t bleio_broadcaster_locals_dict_table[] = { + // Methods + { MP_ROM_QSTR(MP_QSTR_start_advertising), MP_ROM_PTR(&bleio_broadcaster_start_advertising_obj) }, + { MP_ROM_QSTR(MP_QSTR_stop_advertising), MP_ROM_PTR(&bleio_broadcaster_stop_advertising_obj) }, +}; + +STATIC MP_DEFINE_CONST_DICT(bleio_broadcaster_locals_dict, bleio_broadcaster_locals_dict_table); + +const mp_obj_type_t bleio_broadcaster_type = { + { &mp_type_type }, + .name = MP_QSTR_Broadcaster, + .make_new = bleio_broadcaster_make_new, + .locals_dict = (mp_obj_dict_t*)&bleio_broadcaster_locals_dict +}; diff --git a/shared-bindings/bleio/Broadcaster.h b/shared-bindings/bleio/Broadcaster.h new file mode 100644 index 000000000..8aa125af9 --- /dev/null +++ b/shared-bindings/bleio/Broadcaster.h @@ -0,0 +1,38 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Artur Pacholec + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_BROADCASTER_H +#define MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_BROADCASTER_H + +#include "common-hal/bleio/Broadcaster.h" + +extern const mp_obj_type_t bleio_broadcaster_type; + +extern void common_hal_bleio_broadcaster_construct(bleio_broadcaster_obj_t *self, mp_float_t interval); +extern void common_hal_bleio_broadcaster_start_advertising(bleio_broadcaster_obj_t *self, mp_buffer_info_t *data); +extern void common_hal_bleio_broadcaster_stop_advertising(bleio_broadcaster_obj_t *self); + +#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_BROADCASTER_H diff --git a/shared-bindings/bleio/Characteristic.c b/shared-bindings/bleio/Characteristic.c index 369f3f991..ae83de864 100644 --- a/shared-bindings/bleio/Characteristic.c +++ b/shared-bindings/bleio/Characteristic.c @@ -35,101 +35,67 @@ //| :class:`Characteristic` -- BLE service characteristic //| ========================================================= //| -//| Stores information about a BLE service characteristic and allows to read -//| and write the characteristic's value. +//| Stores information about a BLE service characteristic and allows reading +//| and writing of the characteristic's value. //| - -//| .. class:: Characteristic(uuid) +//| +//| .. class:: Characteristic(uuid, *, broadcast=False, indicate=False, notify=False, read=False, write=False, write_no_response=False) //| //| Create a new Characteristic object identified by the specified UUID. //| //| :param bleio.UUID uuid: The uuid of the characteristic +//| :param bool broadcast: Allowed in advertising packets +//| :param bool indicate: Server will indicate to the client when the value is set and wait for a response +//| :param bool notify: Server will notify the client when the value is set +//| :param bool read: Clients may read this characteristic +//| :param bool write: Clients may write this characteristic; a response will be sent back +//| :param bool write_no_response: Clients may write this characteristic; no response will be sent back //| - -//| .. attribute:: broadcast -//| -//| A `bool` specifying if the characteristic allows broadcasting its value. -//| - -//| .. attribute:: indicate -//| -//| A `bool` specifying if the characteristic allows indicating its value. -//| - -//| .. attribute:: notify -//| -//| A `bool` specifying if the characteristic allows notifying its value. -//| - -//| .. attribute:: read -//| -//| A `bool` specifying if the characteristic allows reading its value. -//| - -//| .. attribute:: uuid -//| -//| The UUID of this characteristic. (read-only) -//| - -//| .. attribute:: value -//| -//| The value of this characteristic. The value can be written to if the `write` property allows it. -//| If the `read` property allows it, the value can be read. If the `notify` property is set, writting -//| to the value will generate a BLE notification. -//| - -//| .. attribute:: write -//| -//| A `bool` specifying if the characteristic allows writting to its value. -//| - -//| .. attribute:: write_no_resp -//| -//| A `bool` specifying if the characteristic allows writting to its value without response. -//| -STATIC void bleio_characteristic_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { - bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in); - - mp_printf(print, "Characteristic(uuid: 0x"HEX2_FMT""HEX2_FMT" handle: 0x" HEX2_FMT ")", - self->uuid->value[1], self->uuid->value[0], self->handle); -} - -STATIC mp_obj_t bleio_characteristic_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { - mp_arg_check_num(n_args, n_kw, 1, 1, true); - bleio_characteristic_obj_t *self = m_new_obj(bleio_characteristic_obj_t); - self->base.type = &bleio_characteristic_type; - self->service = NULL; - self->value_data = NULL; - - mp_map_t kw_args; - mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); - - enum { ARG_uuid }; +STATIC mp_obj_t bleio_characteristic_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + enum { + ARG_uuid, ARG_broadcast, ARG_indicate, ARG_notify, ARG_read, ARG_write, ARG_write_no_response, + }; static const mp_arg_t allowed_args[] = { - { MP_QSTR_uuid, MP_ARG_REQUIRED| MP_ARG_OBJ, {.u_obj = mp_const_none} }, + { MP_QSTR_uuid, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = mp_const_none} }, + { MP_QSTR_broadcast, MP_ARG_KW_ONLY| MP_ARG_BOOL, {.u_bool = false} }, + { MP_QSTR_indicate, MP_ARG_KW_ONLY| MP_ARG_BOOL, {.u_bool = false} }, + { MP_QSTR_notify, MP_ARG_KW_ONLY| MP_ARG_BOOL, {.u_bool = false} }, + { MP_QSTR_read, MP_ARG_KW_ONLY| MP_ARG_BOOL, {.u_bool = false} }, + { MP_QSTR_write, MP_ARG_KW_ONLY| MP_ARG_BOOL, {.u_bool = false} }, + { MP_QSTR_write_no_response, MP_ARG_KW_ONLY| MP_ARG_BOOL, {.u_bool = false} }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all(n_args, pos_args, &kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); const mp_obj_t uuid = args[ARG_uuid].u_obj; - if (uuid == mp_const_none) { - return MP_OBJ_FROM_PTR(self); + if (!MP_OBJ_IS_TYPE(uuid, &bleio_uuid_type)) { + mp_raise_ValueError(translate("Expected a UUID")); } - if (MP_OBJ_IS_TYPE(uuid, &bleio_uuid_type)) { - self->uuid = MP_OBJ_TO_PTR(uuid); - } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, - translate("Invalid UUID parameter"))); - } + bleio_characteristic_obj_t *self = m_new_obj(bleio_characteristic_obj_t); + self->base.type = &bleio_characteristic_type; + self->uuid = MP_OBJ_TO_PTR(uuid); + + bleio_characteristic_properties_t properties; - common_hal_bleio_characteristic_construct(self); + properties.broadcast = args[ARG_broadcast].u_bool; + properties.indicate = args[ARG_indicate].u_bool; + properties.notify = args[ARG_notify].u_bool; + properties.read = args[ARG_read].u_bool; + properties.write = args[ARG_write].u_bool; + properties.write_no_response = args[ARG_write_no_response].u_bool; + + common_hal_bleio_characteristic_construct(self, uuid, properties); return MP_OBJ_FROM_PTR(self); } +//| .. attribute:: broadcast +//| +//| A `bool` specifying if the characteristic allows broadcasting its value. (read-only) +//| STATIC mp_obj_t bleio_characteristic_get_broadcast(mp_obj_t self_in) { bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in); @@ -137,22 +103,17 @@ STATIC mp_obj_t bleio_characteristic_get_broadcast(mp_obj_t self_in) { } STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_characteristic_get_broadcast_obj, bleio_characteristic_get_broadcast); -STATIC mp_obj_t bleio_characteristic_set_broadcast(mp_obj_t self_in, mp_obj_t broadcast_in) { - bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in); - - self->props.broadcast = mp_obj_is_true(broadcast_in); - - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_2(bleio_characteristic_set_broadcast_obj, bleio_characteristic_set_broadcast); - const mp_obj_property_t bleio_characteristic_broadcast_obj = { .base.type = &mp_type_property, .proxy = { (mp_obj_t)&bleio_characteristic_get_broadcast_obj, - (mp_obj_t)&bleio_characteristic_set_broadcast_obj, + (mp_obj_t)&mp_const_none_obj, (mp_obj_t)&mp_const_none_obj }, }; +//| .. attribute:: indicate +//| +//| A `bool` specifying if the characteristic allows indicating its value. (read-only) +//| STATIC mp_obj_t bleio_characteristic_get_indicate(mp_obj_t self_in) { bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in); @@ -160,22 +121,18 @@ STATIC mp_obj_t bleio_characteristic_get_indicate(mp_obj_t self_in) { } STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_characteristic_get_indicate_obj, bleio_characteristic_get_indicate); -STATIC mp_obj_t bleio_characteristic_set_indicate(mp_obj_t self_in, mp_obj_t indicate_in) { - bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in); - - self->props.indicate = mp_obj_is_true(indicate_in); - - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_2(bleio_characteristic_set_indicate_obj, bleio_characteristic_set_indicate); const mp_obj_property_t bleio_characteristic_indicate_obj = { .base.type = &mp_type_property, .proxy = { (mp_obj_t)&bleio_characteristic_get_indicate_obj, - (mp_obj_t)&bleio_characteristic_set_indicate_obj, + (mp_obj_t)&mp_const_none_obj, (mp_obj_t)&mp_const_none_obj }, }; +//| .. attribute:: notify +//| +//| A `bool` specifying if the characteristic allows notifying its value. (read-only) +//| STATIC mp_obj_t bleio_characteristic_get_notify(mp_obj_t self_in) { bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in); @@ -183,22 +140,17 @@ STATIC mp_obj_t bleio_characteristic_get_notify(mp_obj_t self_in) { } STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_characteristic_get_notify_obj, bleio_characteristic_get_notify); -STATIC mp_obj_t bleio_characteristic_set_notify(mp_obj_t self_in, mp_obj_t notify_in) { - bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in); - - self->props.notify = mp_obj_is_true(notify_in); - - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_2(bleio_characteristic_set_notify_obj, bleio_characteristic_set_notify); - const mp_obj_property_t bleio_characteristic_notify_obj = { .base.type = &mp_type_property, .proxy = { (mp_obj_t)&bleio_characteristic_get_notify_obj, - (mp_obj_t)&bleio_characteristic_set_notify_obj, + (mp_obj_t)&mp_const_none_obj, (mp_obj_t)&mp_const_none_obj }, }; +//| .. attribute:: read +//| +//| A `bool` specifying if the characteristic allows reading its value. (read-only) +//| STATIC mp_obj_t bleio_characteristic_get_read(mp_obj_t self_in) { bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in); @@ -206,22 +158,17 @@ STATIC mp_obj_t bleio_characteristic_get_read(mp_obj_t self_in) { } STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_characteristic_get_read_obj, bleio_characteristic_get_read); -STATIC mp_obj_t bleio_characteristic_set_read(mp_obj_t self_in, mp_obj_t read_in) { - bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in); - - self->props.read = mp_obj_is_true(read_in); - - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_2(bleio_characteristic_set_read_obj, bleio_characteristic_set_read); - const mp_obj_property_t bleio_characteristic_read_obj = { .base.type = &mp_type_property, .proxy = { (mp_obj_t)&bleio_characteristic_get_read_obj, - (mp_obj_t)&bleio_characteristic_set_read_obj, + (mp_obj_t)&mp_const_none_obj, (mp_obj_t)&mp_const_none_obj }, }; +//| .. attribute:: write +//| +//| A `bool` specifying if the characteristic allows writing to its value. (read-only) +//| STATIC mp_obj_t bleio_characteristic_get_write(mp_obj_t self_in) { bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in); @@ -229,45 +176,35 @@ STATIC mp_obj_t bleio_characteristic_get_write(mp_obj_t self_in) { } STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_characteristic_get_write_obj, bleio_characteristic_get_write); -STATIC mp_obj_t bleio_characteristic_set_write(mp_obj_t self_in, mp_obj_t write_in) { - bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in); - - self->props.write = mp_obj_is_true(write_in); - - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_2(bleio_characteristic_set_write_obj, bleio_characteristic_set_write); - const mp_obj_property_t bleio_characteristic_write_obj = { .base.type = &mp_type_property, .proxy = { (mp_obj_t)&bleio_characteristic_get_write_obj, - (mp_obj_t)&bleio_characteristic_set_write_obj, + (mp_obj_t)&mp_const_none_obj, (mp_obj_t)&mp_const_none_obj }, }; -STATIC mp_obj_t bleio_characteristic_get_write_wo_resp(mp_obj_t self_in) { - bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in); - - return mp_obj_new_bool(self->props.write_wo_resp); -} -STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_characteristic_get_write_wo_resp_obj, bleio_characteristic_get_write_wo_resp); - -STATIC mp_obj_t bleio_characteristic_set_write_wo_resp(mp_obj_t self_in, mp_obj_t write_wo_resp_in) { +//| .. attribute:: write_no_response +//| +//| A `bool` specifying if the characteristic allows writing to its value without response. (read-only) +//| +STATIC mp_obj_t bleio_characteristic_get_write_no_response(mp_obj_t self_in) { bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in); - self->props.write_wo_resp = mp_obj_is_true(write_wo_resp_in); - - return mp_const_none; + return mp_obj_new_bool(self->props.write_no_response); } -STATIC MP_DEFINE_CONST_FUN_OBJ_2(bleio_characteristic_set_write_wo_resp_obj, bleio_characteristic_set_write_wo_resp); +STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_characteristic_get_write_no_response_obj, bleio_characteristic_get_write_no_response); -const mp_obj_property_t bleio_characteristic_write_wo_resp_obj = { +const mp_obj_property_t bleio_characteristic_write_no_response_obj = { .base.type = &mp_type_property, - .proxy = { (mp_obj_t)&bleio_characteristic_get_write_wo_resp_obj, - (mp_obj_t)&bleio_characteristic_set_write_wo_resp_obj, + .proxy = { (mp_obj_t)&bleio_characteristic_get_write_no_response_obj, + (mp_obj_t)&mp_const_none_obj, (mp_obj_t)&mp_const_none_obj }, }; +//| .. attribute:: uuid +//| +//| The UUID of this characteristic. (read-only) +//| STATIC mp_obj_t bleio_characteristic_get_uuid(mp_obj_t self_in) { bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in); @@ -282,10 +219,16 @@ const mp_obj_property_t bleio_characteristic_uuid_obj = { (mp_obj_t)&mp_const_none_obj }, }; +//| .. attribute:: value +//| +//| The value of this characteristic. The value can be written to if the `write` property allows it. +//| If the `read` property allows it, the value can be read. If the `notify` property is set, writing +//| to the value will generate a BLE notification. +//| STATIC mp_obj_t bleio_characteristic_get_value(mp_obj_t self_in) { bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in); - common_hal_bleio_characteristic_read_value(self); + common_hal_bleio_characteristic_get_value(self); return self->value_data; } @@ -297,7 +240,7 @@ STATIC mp_obj_t bleio_characteristic_set_value(mp_obj_t self_in, mp_obj_t value_ mp_buffer_info_t bufinfo; mp_get_buffer_raise(value_in, &bufinfo, MP_BUFFER_READ); - common_hal_bleio_characteristic_write_value(self, &bufinfo); + common_hal_bleio_characteristic_set_value(self, &bufinfo); return mp_const_none; } @@ -318,7 +261,7 @@ STATIC const mp_rom_map_elem_t bleio_characteristic_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_uuid), MP_ROM_PTR(&bleio_characteristic_uuid_obj) }, { MP_ROM_QSTR(MP_QSTR_value), MP_ROM_PTR(&bleio_characteristic_value_obj) }, { MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&bleio_characteristic_write_obj) }, - { MP_ROM_QSTR(MP_QSTR_write_wo_resp), MP_ROM_PTR(&bleio_characteristic_write_wo_resp_obj) }, + { MP_ROM_QSTR(MP_QSTR_write_no_response), MP_ROM_PTR(&bleio_characteristic_write_no_response_obj) }, }; STATIC MP_DEFINE_CONST_DICT(bleio_characteristic_locals_dict, bleio_characteristic_locals_dict_table); @@ -326,7 +269,6 @@ STATIC MP_DEFINE_CONST_DICT(bleio_characteristic_locals_dict, bleio_characterist const mp_obj_type_t bleio_characteristic_type = { { &mp_type_type }, .name = MP_QSTR_Characteristic, - .print = bleio_characteristic_print, .make_new = bleio_characteristic_make_new, .locals_dict = (mp_obj_dict_t*)&bleio_characteristic_locals_dict }; diff --git a/shared-bindings/bleio/Characteristic.h b/shared-bindings/bleio/Characteristic.h index 0e99e97cc..206cbcd40 100644 --- a/shared-bindings/bleio/Characteristic.h +++ b/shared-bindings/bleio/Characteristic.h @@ -27,12 +27,12 @@ #ifndef MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_CHARACTERISTIC_H #define MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_CHARACTERISTIC_H -#include "shared-module/bleio/Characteristic.h" +#include "common-hal/bleio/Characteristic.h" extern const mp_obj_type_t bleio_characteristic_type; -extern void common_hal_bleio_characteristic_construct(bleio_characteristic_obj_t *self); -extern void common_hal_bleio_characteristic_read_value(bleio_characteristic_obj_t *self); -extern void common_hal_bleio_characteristic_write_value(bleio_characteristic_obj_t *self, mp_buffer_info_t *bufinfo); +extern void common_hal_bleio_characteristic_construct(bleio_characteristic_obj_t *self, bleio_uuid_obj_t *uuid, bleio_characteristic_properties_t props); +extern void common_hal_bleio_characteristic_get_value(bleio_characteristic_obj_t *self); +extern void common_hal_bleio_characteristic_set_value(bleio_characteristic_obj_t *self, mp_buffer_info_t *bufinfo); #endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_CHARACTERISTIC_H diff --git a/shared-bindings/bleio/CharacteristicBuffer.c b/shared-bindings/bleio/CharacteristicBuffer.c new file mode 100644 index 000000000..c368de361 --- /dev/null +++ b/shared-bindings/bleio/CharacteristicBuffer.c @@ -0,0 +1,244 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Dan Halbert for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "py/mperrno.h" +#include "py/ioctl.h" +#include "py/objproperty.h" +#include "py/runtime.h" +#include "py/stream.h" + +#include "shared-bindings/bleio/CharacteristicBuffer.h" +#include "shared-bindings/bleio/UUID.h" +#include "shared-bindings/util.h" + +STATIC void raise_error_if_not_connected(bleio_characteristic_buffer_obj_t *self) { + if (!common_hal_bleio_characteristic_buffer_connected(self)) { + mp_raise_ValueError(translate("Not connected")); + } +} + +//| .. currentmodule:: bleio +//| +//| :class:`CharacteristicBuffer` -- BLE Service incoming values buffer. +//| ===================================================================== +//| +//| Accumulates a Characteristic's incoming values in a FIFO buffer. +//| +//| .. class:: CharacteristicBuffer(Characteristic, *, timeout=1, buffer_size=64) +//| +//| Create a new Characteristic object identified by the specified UUID. +//| +//| :param bleio.Characteristic characteristic: The characteristic to monitor +//| :param int timeout: the timeout in seconds to wait for the first character and between subsequent characters.//| +//| :param int buffer_size: Size of ring buffer that stores incoming data coming from client. +//| Must be >= 1. +//| +STATIC mp_obj_t bleio_characteristic_buffer_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + enum { ARG_characteristic, ARG_timeout, ARG_buffer_size, }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_characteristic, MP_ARG_REQUIRED | MP_ARG_OBJ }, + { MP_QSTR_timeout, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NEW_SMALL_INT(1)} }, + { MP_QSTR_buffer_size, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 64} }, + }; + + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + const mp_obj_t characteristic = args[ARG_characteristic].u_obj; + + mp_float_t timeout = mp_obj_get_float(args[ARG_timeout].u_obj); + if (timeout < 0.0f) { + mp_raise_ValueError(translate("timeout must be >= 0.0")); + } + + const int buffer_size = args[ARG_buffer_size].u_int; + if (buffer_size < 1) { + mp_raise_ValueError_varg(translate("%q must be >= 1"), MP_QSTR_buffer_size); + } + + if (!MP_OBJ_IS_TYPE(characteristic, &bleio_characteristic_type)) { + mp_raise_ValueError(translate("Expected a Characteristic")); + } + + bleio_characteristic_buffer_obj_t *self = m_new_obj(bleio_characteristic_buffer_obj_t); + self->base.type = &bleio_characteristic_buffer_type; + self->characteristic = MP_OBJ_TO_PTR(characteristic); + + common_hal_bleio_characteristic_buffer_construct(self, self->characteristic, timeout, buffer_size); + + return MP_OBJ_FROM_PTR(self); +} + +// These are standard stream methods. Code is in py/stream.c. +// +//| .. method:: read(nbytes=None) +//| +//| Read characters. If ``nbytes`` is specified then read at most that many +//| bytes. Otherwise, read everything that arrives until the connection +//| times out. Providing the number of bytes expected is highly recommended +//| because it will be faster. +//| +//| :return: Data read +//| :rtype: bytes or None +//| +//| .. method:: readinto(buf) +//| +//| Read bytes into the ``buf``. Read at most ``len(buf)`` bytes. +//| +//| :return: number of bytes read and stored into ``buf`` +//| :rtype: int or None (on a non-blocking error) +//| +//| .. method:: readline() +//| +//| Read a line, ending in a newline character. +//| +//| :return: the line read +//| :rtype: int or None +//| + +// These three methods are used by the shared stream methods. +STATIC mp_uint_t bleio_characteristic_buffer_read(mp_obj_t self_in, void *buf_in, mp_uint_t size, int *errcode) { + bleio_characteristic_buffer_obj_t *self = MP_OBJ_TO_PTR(self_in); + raise_error_if_deinited(common_hal_bleio_characteristic_buffer_deinited(self)); + raise_error_if_not_connected(self); + byte *buf = buf_in; + + // make sure we want at least 1 char + if (size == 0) { + return 0; + } + + return common_hal_bleio_characteristic_buffer_read(self, buf, size, errcode); +} + +STATIC mp_uint_t bleio_characteristic_buffer_write(mp_obj_t self_in, const void *buf_in, mp_uint_t size, int *errcode) { + mp_raise_NotImplementedError(translate("CharacteristicBuffer writing not provided")); + return 0; +} + +STATIC mp_uint_t bleio_characteristic_buffer_ioctl(mp_obj_t self_in, mp_uint_t request, mp_uint_t arg, int *errcode) { + bleio_characteristic_buffer_obj_t *self = MP_OBJ_TO_PTR(self_in); + raise_error_if_deinited(common_hal_bleio_characteristic_buffer_deinited(self)); + raise_error_if_not_connected(self); + if (!common_hal_bleio_characteristic_buffer_connected(self)) { + mp_raise_ValueError(translate("Not connected")); + } + mp_uint_t ret; + if (request == MP_IOCTL_POLL) { + mp_uint_t flags = arg; + ret = 0; + if ((flags & MP_IOCTL_POLL_RD) && common_hal_bleio_characteristic_buffer_rx_characters_available(self) > 0) { + ret |= MP_IOCTL_POLL_RD; + } +// No writing provided. +// if ((flags & MP_IOCTL_POLL_WR) && common_hal_busio_uart_ready_to_tx(self)) { +// ret |= MP_IOCTL_POLL_WR; +// } + } else { + *errcode = MP_EINVAL; + ret = MP_STREAM_ERROR; + } + return ret; +} + +//| .. attribute:: in_waiting +//| +//| The number of bytes in the input buffer, available to be read +//| +STATIC mp_obj_t bleio_characteristic_buffer_obj_get_in_waiting(mp_obj_t self_in) { + bleio_characteristic_buffer_obj_t *self = MP_OBJ_TO_PTR(self_in); + raise_error_if_deinited(common_hal_bleio_characteristic_buffer_deinited(self)); + return MP_OBJ_NEW_SMALL_INT(common_hal_bleio_characteristic_buffer_rx_characters_available(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(bleio_characteristic_buffer_get_in_waiting_obj, bleio_characteristic_buffer_obj_get_in_waiting); + +const mp_obj_property_t bleio_characteristic_buffer_in_waiting_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&bleio_characteristic_buffer_get_in_waiting_obj, + (mp_obj_t)&mp_const_none_obj, + (mp_obj_t)&mp_const_none_obj}, +}; + +//| .. method:: reset_input_buffer() +//| +//| Discard any unread characters in the input buffer. +//| +STATIC mp_obj_t bleio_characteristic_buffer_obj_reset_input_buffer(mp_obj_t self_in) { + bleio_characteristic_buffer_obj_t *self = MP_OBJ_TO_PTR(self_in); + raise_error_if_deinited(common_hal_bleio_characteristic_buffer_deinited(self)); + common_hal_bleio_characteristic_buffer_clear_rx_buffer(self); + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_characteristic_buffer_reset_input_buffer_obj, bleio_characteristic_buffer_obj_reset_input_buffer); + +//| .. method:: deinit() +//| +//| Disable permanently. +//| +STATIC mp_obj_t bleio_characteristic_buffer_deinit(mp_obj_t self_in) { + bleio_characteristic_buffer_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_bleio_characteristic_buffer_deinit(self); + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_characteristic_buffer_deinit_obj, bleio_characteristic_buffer_deinit); + +STATIC const mp_rom_map_elem_t bleio_characteristic_buffer_locals_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&bleio_characteristic_buffer_deinit_obj) }, + + // Standard stream methods. + { MP_OBJ_NEW_QSTR(MP_QSTR_read), MP_ROM_PTR(&mp_stream_read_obj) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_readline), MP_ROM_PTR(&mp_stream_unbuffered_readline_obj)}, + { MP_OBJ_NEW_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&mp_stream_readinto_obj) }, + // CharacteristicBuffer is currently read-only. + // { MP_OBJ_NEW_QSTR(MP_QSTR_write), MP_ROM_PTR(&mp_stream_write_obj) }, + + { MP_OBJ_NEW_QSTR(MP_QSTR_reset_input_buffer), MP_ROM_PTR(&bleio_characteristic_buffer_reset_input_buffer_obj) }, + // Properties + { MP_ROM_QSTR(MP_QSTR_in_waiting), MP_ROM_PTR(&bleio_characteristic_buffer_in_waiting_obj) }, + +}; + +STATIC MP_DEFINE_CONST_DICT(bleio_characteristic_buffer_locals_dict, bleio_characteristic_buffer_locals_dict_table); + +STATIC const mp_stream_p_t characteristic_buffer_stream_p = { + .read = bleio_characteristic_buffer_read, + .write = bleio_characteristic_buffer_write, + .ioctl = bleio_characteristic_buffer_ioctl, + .is_text = false, + // Match PySerial when possible, such as disallowing optional length argument for .readinto() + .pyserial_compatibility = true, +}; + + +const mp_obj_type_t bleio_characteristic_buffer_type = { + { &mp_type_type }, + .name = MP_QSTR_CharacteristicBuffer, + .make_new = bleio_characteristic_buffer_make_new, + .getiter = mp_identity_getiter, + .iternext = mp_stream_unbuffered_iter, + .protocol = &characteristic_buffer_stream_p, + .locals_dict = (mp_obj_dict_t*)&bleio_characteristic_buffer_locals_dict +}; diff --git a/shared-bindings/bleio/CharacteristicBuffer.h b/shared-bindings/bleio/CharacteristicBuffer.h new file mode 100644 index 000000000..f25017c19 --- /dev/null +++ b/shared-bindings/bleio/CharacteristicBuffer.h @@ -0,0 +1,42 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Artur Pacholec + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_CHARACTERISTICBUFFER_H +#define MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_CHARACTERISTICBUFFER_H + +#include "common-hal/bleio/CharacteristicBuffer.h" + +extern const mp_obj_type_t bleio_characteristic_buffer_type; + +extern void common_hal_bleio_characteristic_buffer_construct(bleio_characteristic_buffer_obj_t *self, bleio_characteristic_obj_t *characteristic, mp_float_t timeout, size_t buffer_size); +int common_hal_bleio_characteristic_buffer_read(bleio_characteristic_buffer_obj_t *self, uint8_t *data, size_t len, int *errcode); +uint32_t common_hal_bleio_characteristic_buffer_rx_characters_available(bleio_characteristic_buffer_obj_t *self); +void common_hal_bleio_characteristic_buffer_clear_rx_buffer(bleio_characteristic_buffer_obj_t *self); +bool common_hal_bleio_characteristic_buffer_deinited(bleio_characteristic_buffer_obj_t *self); +int common_hal_bleio_characteristic_buffer_deinit(bleio_characteristic_buffer_obj_t *self); +bool common_hal_bleio_characteristic_buffer_connected(bleio_characteristic_buffer_obj_t *self); + +#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_CHARACTERISTICBUFFER_H diff --git a/shared-bindings/bleio/Descriptor.c b/shared-bindings/bleio/Descriptor.c index df32a00e7..b32f4f08e 100644 --- a/shared-bindings/bleio/Descriptor.c +++ b/shared-bindings/bleio/Descriptor.c @@ -48,6 +48,9 @@ enum { DescriptorUuidTimeTriggerSetting = 0x290E, }; +// Work-in-progress: orphaned for now. +//| :orphan: +//| //| .. currentmodule:: bleio //| //| :class:`Descriptor` -- BLE descriptor @@ -61,7 +64,6 @@ enum { //| .. class:: Descriptor(uuid) //| //| Create a new descriptor object with the UUID uuid. -//| The value can be either of type `bleio.UUID` or any value allowed by the `bleio.UUID` constructor. //| .. attribute:: handle //| @@ -72,42 +74,29 @@ enum { //| //| The descriptor uuid. (read-only) //| -STATIC mp_obj_t bleio_descriptor_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { - mp_arg_check_num(n_args, n_kw, 0, 1, true); - bleio_descriptor_obj_t *self = m_new_obj(bleio_descriptor_obj_t); - self->base.type = type; - - mp_map_t kw_args; - mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); - +STATIC mp_obj_t bleio_descriptor_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { enum { ARG_uuid }; static const mp_arg_t allowed_args[] = { - { ARG_uuid, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, + { MP_QSTR_uuid, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all(n_args, pos_args, &kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); const mp_obj_t uuid_arg = args[ARG_uuid].u_obj; - bleio_uuid_obj_t *uuid; - if (MP_OBJ_IS_TYPE(uuid_arg, &bleio_uuid_type)) { - uuid = MP_OBJ_TO_PTR(uuid_arg); - } else { - uuid = MP_OBJ_TO_PTR(bleio_uuid_type.make_new(&bleio_uuid_type, 1, 0, &uuid_arg)); + if (!MP_OBJ_IS_TYPE(uuid_arg, &bleio_uuid_type)) { + mp_raise_ValueError(translate("Expected a UUID")); } + bleio_descriptor_obj_t *self = m_new_obj(bleio_descriptor_obj_t); + self->base.type = type; + bleio_uuid_obj_t *uuid = MP_OBJ_TO_PTR(uuid_arg); common_hal_bleio_descriptor_construct(self, uuid); return MP_OBJ_FROM_PTR(self); } -STATIC void bleio_descriptor_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { - bleio_descriptor_obj_t *self = MP_OBJ_TO_PTR(self_in); - - common_hal_bleio_descriptor_print(self, print); -} - STATIC mp_obj_t bleio_descriptor_get_handle(mp_obj_t self_in) { bleio_descriptor_obj_t *self = MP_OBJ_TO_PTR(self_in); @@ -124,9 +113,7 @@ const mp_obj_property_t bleio_descriptor_handle_obj = { STATIC mp_obj_t bleio_descriptor_get_uuid(mp_obj_t self_in) { bleio_descriptor_obj_t *self = MP_OBJ_TO_PTR(self_in); - const mp_obj_t uuid = mp_obj_new_int(common_hal_bleio_descriptor_get_uuid(self)); - - return bleio_uuid_type.make_new(&bleio_uuid_type, 1, 0, &uuid); + return common_hal_bleio_descriptor_get_uuid(self); } MP_DEFINE_CONST_FUN_OBJ_1(bleio_descriptor_get_uuid_obj, bleio_descriptor_get_uuid); @@ -165,7 +152,6 @@ STATIC MP_DEFINE_CONST_DICT(bleio_descriptor_locals_dict, bleio_descriptor_local const mp_obj_type_t bleio_descriptor_type = { { &mp_type_type }, .name = MP_QSTR_Descriptor, - .print = bleio_descriptor_print, .make_new = bleio_descriptor_make_new, .locals_dict = (mp_obj_dict_t*)&bleio_descriptor_locals_dict }; diff --git a/shared-bindings/bleio/Descriptor.h b/shared-bindings/bleio/Descriptor.h index 85310d304..f47378ee1 100644 --- a/shared-bindings/bleio/Descriptor.h +++ b/shared-bindings/bleio/Descriptor.h @@ -33,8 +33,7 @@ extern const mp_obj_type_t bleio_descriptor_type; extern void common_hal_bleio_descriptor_construct(bleio_descriptor_obj_t *self, bleio_uuid_obj_t *uuid); -extern void common_hal_bleio_descriptor_print(bleio_descriptor_obj_t *self, const mp_print_t *print); extern mp_int_t common_hal_bleio_descriptor_get_handle(bleio_descriptor_obj_t *self); -extern mp_int_t common_hal_bleio_descriptor_get_uuid(bleio_descriptor_obj_t *self); +extern mp_obj_t common_hal_bleio_descriptor_get_uuid(bleio_descriptor_obj_t *self); #endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_DESCRIPTOR_H diff --git a/shared-bindings/bleio/Device.c b/shared-bindings/bleio/Device.c index 94834ef7c..80595ef33 100644 --- a/shared-bindings/bleio/Device.c +++ b/shared-bindings/bleio/Device.c @@ -43,19 +43,25 @@ #include "shared-module/bleio/Device.h" #include "shared-module/bleio/ScanEntry.h" +// Work-in-progress: orphaned for now. +//| :orphan: +//| //| .. currentmodule:: bleio //| //| :class:`Device` -- BLE device //| ========================================================= //| +//| **IGNORE ``Device`` and all its documentation. +//| It is being replaced by `Peripheral` and other classes.** +//| //| Provides access a to BLE device, either in a Peripheral or Central role. //| When a device is created without any parameter passed to the constructor, //| it will be set to the Peripheral role. If a address is passed, the device //| will be a Central. For a Peripheral you can set the `name`, add services -//| via `add_service` and then start and stop advertising via `start_advertising` -//| and `stop_advertising`. For the Central, you can `bleio.Device.connect` and `bleio.Device.disconnect` +//| via `add_service` and then start and stop advertising via `bleio.Device.start_advertising` +//| and `bleio.Device.stop_advertising`. For the Central, you can `bleio.Device.connect` and `bleio.Device.disconnect` //| to the device, once a connection is established, the device's services can -//| be accessed using `services`. +//| be accessed using `bleio.Device.services`. //| //| Usage:: //| @@ -171,7 +177,7 @@ STATIC mp_obj_t bleio_device_make_new(const mp_obj_type_t *type, size_t n_args, enum { ARG_address, ARG_scan_entry }; static const mp_arg_t allowed_args[] = { - { ARG_address, MP_ARG_OBJ, {.u_obj = mp_const_none} }, + { MP_QSTR_address, MP_ARG_OBJ, {.u_obj = mp_const_none} }, { MP_QSTR_scan_entry, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = mp_const_none} }, }; diff --git a/shared-bindings/bleio/Peripheral.c b/shared-bindings/bleio/Peripheral.c new file mode 100644 index 000000000..340485f35 --- /dev/null +++ b/shared-bindings/bleio/Peripheral.c @@ -0,0 +1,246 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2016 Glenn Ruben Bakke + * Copyright (c) 2018 Artur Pacholec + * + * 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 <string.h> +#include <stdio.h> + +#include "ble_drv.h" +#include "py/objarray.h" +#include "py/objproperty.h" +#include "py/objstr.h" +#include "py/runtime.h" + +#include "shared-bindings/bleio/Adapter.h" +#include "shared-bindings/bleio/AddressType.h" +#include "shared-bindings/bleio/Characteristic.h" +#include "shared-bindings/bleio/Peripheral.h" +#include "shared-bindings/bleio/Service.h" +#include "shared-bindings/bleio/UUID.h" +#include "shared-module/bleio/AdvertisementData.h" +#include "shared-module/bleio/ScanEntry.h" + +#include "common-hal/bleio/Peripheral.h" + +// TODO: Add unique MAC address part to name +static const char default_name[] = "CIRCUITPY"; + +//| .. currentmodule:: bleio +//| +//| :class:`Peripheral` -- A BLE peripheral device +//| ========================================================= +//| +//| Implement a BLE peripheral which runs locally. +//| Set up using the supplied services, and then allow advertising to be started and stopped. +//| +//| Usage:: +//| +//| import bleio +//| +//| # Create a Characteristic. +//| chara = bleio.Characteristic(bleio.UUID(0x2919), read=True, notify=True) +//| +//| # Create a Service providing that one Characteristic. +//| serv = bleio.Service(bleio.UUID(0x180f), [chara]) +//| +//| # Create a peripheral and start it up. +//| periph = bleio.Peripheral([service]) +//| periph.start_advertising() +//| +//| while not periph.connected: +//| # Wait for connection. +//| pass +//| +//| .. class:: Peripheral(services, *, name='CIRCUITPY') +//| +//| Create a new Peripheral object. + +//| :param iterable services: the Service objects representing services available from this peripheral. +//| :param str name: The name used when advertising this peripheral +//| + +STATIC mp_obj_t bleio_peripheral_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + enum { ARG_services, ARG_name }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_services, MP_ARG_OBJ, {.u_obj = mp_const_none} }, + { MP_QSTR_name, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = mp_const_none} }, + }; + + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + // If services is not an iterable, an exception will be thrown. + mp_obj_iter_buf_t iter_buf; + mp_obj_t iterable = mp_getiter(args[ARG_services].u_obj, &iter_buf); + mp_obj_t service; + + bleio_peripheral_obj_t *self = m_new_obj(bleio_peripheral_obj_t); + self->base.type = &bleio_peripheral_type; + self->service_list = mp_obj_new_list(0, NULL); + self->notif_handler = mp_const_none; + while ((service = mp_iternext(iterable)) != MP_OBJ_STOP_ITERATION) { + if (!MP_OBJ_IS_TYPE(service, &bleio_service_type)) { + mp_raise_ValueError(translate("services includes an object that is not a Service")); + } + bleio_service_obj_t *service_ptr = MP_OBJ_TO_PTR(service); + service_ptr->device = MP_OBJ_FROM_PTR(self); + mp_obj_list_append(self->service_list, service); + } + + const mp_obj_t name = args[ARG_name].u_obj; + if (name == mp_const_none) { + self->name = mp_obj_new_str(default_name, strlen(default_name)); + } else if (MP_OBJ_IS_STR(name)) { + self->name = name; + } else { + mp_raise_ValueError(translate("name must be a string")); + } + + // Do port-specific initialization. + common_hal_bleio_peripheral_construct(self); + + return MP_OBJ_FROM_PTR(self); +} + +//| .. attribute:: connected +//| +//| True if connected to a BLE Central device. +//| +STATIC mp_obj_t bleio_peripheral_get_connected(mp_obj_t self_in) { + bleio_peripheral_obj_t *self = MP_OBJ_TO_PTR(self_in); + + // Return list as a tuple so user won't be able to change it. + return mp_obj_new_bool(common_hal_bleio_peripheral_get_connected(self)); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_peripheral_get_connected_obj, bleio_peripheral_get_connected); + +const mp_obj_property_t bleio_peripheral_connected_obj = { + .base.type = &mp_type_property, + .proxy = { (mp_obj_t)&bleio_peripheral_get_connected_obj, + (mp_obj_t)&mp_const_none_obj, + (mp_obj_t)&mp_const_none_obj }, +}; + +//| .. attribute:: services +//| +//| A `tuple` of `bleio.Service` that are offered by this peripheral. (read-only) +//| +STATIC mp_obj_t bleio_peripheral_get_services(mp_obj_t self_in) { + bleio_peripheral_obj_t *self = MP_OBJ_TO_PTR(self_in); + // Return list as a tuple so user won't be able to change it. + mp_obj_list_t *service_list = MP_OBJ_TO_PTR(self->service_list); + return mp_obj_new_tuple(service_list->len, service_list->items); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_peripheral_get_services_obj, bleio_peripheral_get_services); + +const mp_obj_property_t bleio_peripheral_services_obj = { + .base.type = &mp_type_property, + .proxy = { (mp_obj_t)&bleio_peripheral_get_services_obj, + (mp_obj_t)&mp_const_none_obj, + (mp_obj_t)&mp_const_none_obj }, +}; + +//| .. attribute:: name +//| +//| The peripheral's name, included when advertising. (read-only) +//| +STATIC mp_obj_t bleio_peripheral_get_name(mp_obj_t self_in) { + bleio_peripheral_obj_t *self = MP_OBJ_TO_PTR(self_in); + + return self->name; +} +MP_DEFINE_CONST_FUN_OBJ_1(bleio_peripheral_get_name_obj, bleio_peripheral_get_name); + +const mp_obj_property_t bleio_peripheral_name_obj = { + .base.type = &mp_type_property, + .proxy = { (mp_obj_t)&bleio_peripheral_get_name_obj, + (mp_obj_t)&mp_const_none_obj, + (mp_obj_t)&mp_const_none_obj }, +}; + +//| .. method:: start_advertising(*, connectable=True, data=None) +//| +//| Starts advertising the peripheral. The peripheral's name and +//| services are included in the advertisement packets. +//| +//| :param bool connectable: If `True` then other devices are allowed to connect to this peripheral. +//| :param buf data: If `None`, advertise the services passed to this Peripheral when it was created. +//| If not `None`, then send the bytes in ``data`` as the advertising packet. +//| +STATIC mp_obj_t bleio_peripheral_start_advertising(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + bleio_peripheral_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]); + + enum { ARG_connectable, ARG_data }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_connectable, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = true} }, + { MP_QSTR_data, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} }, + }; + + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + mp_buffer_info_t bufinfo = { 0 }; + if (args[ARG_data].u_obj != mp_const_none) { + mp_get_buffer_raise(args[ARG_data].u_obj, &bufinfo, MP_BUFFER_READ); + } + + common_hal_bleio_peripheral_start_advertising(self, args[ARG_connectable].u_bool, &bufinfo); + + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_KW(bleio_peripheral_start_advertising_obj, 0, bleio_peripheral_start_advertising); + +//| .. method:: stop_advertising() +//| +//| Stop sending advertising packets. +STATIC mp_obj_t bleio_peripheral_stop_advertising(mp_obj_t self_in) { + bleio_peripheral_obj_t *self = MP_OBJ_TO_PTR(self_in); + + common_hal_bleio_peripheral_stop_advertising(self); + + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_peripheral_stop_advertising_obj, bleio_peripheral_stop_advertising); + +STATIC const mp_rom_map_elem_t bleio_peripheral_locals_dict_table[] = { + // Methods + { MP_ROM_QSTR(MP_QSTR_start_advertising), MP_ROM_PTR(&bleio_peripheral_start_advertising_obj) }, + { MP_ROM_QSTR(MP_QSTR_stop_advertising), MP_ROM_PTR(&bleio_peripheral_stop_advertising_obj) }, + + // Properties + { MP_ROM_QSTR(MP_QSTR_connected), MP_ROM_PTR(&bleio_peripheral_connected_obj) }, + { MP_ROM_QSTR(MP_QSTR_name), MP_ROM_PTR(&bleio_peripheral_name_obj) }, + { MP_ROM_QSTR(MP_QSTR_services), MP_ROM_PTR(&bleio_peripheral_services_obj) }, +}; + +STATIC MP_DEFINE_CONST_DICT(bleio_peripheral_locals_dict, bleio_peripheral_locals_dict_table); + +const mp_obj_type_t bleio_peripheral_type = { + { &mp_type_type }, + .name = MP_QSTR_Peripheral, + .make_new = bleio_peripheral_make_new, + .locals_dict = (mp_obj_dict_t*)&bleio_peripheral_locals_dict +}; diff --git a/shared-bindings/bleio/Peripheral.h b/shared-bindings/bleio/Peripheral.h new file mode 100644 index 000000000..02a5c1ef8 --- /dev/null +++ b/shared-bindings/bleio/Peripheral.h @@ -0,0 +1,40 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Artur Pacholec + * Copyright (c) 2018 Dan Halbert for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_PERIPHERAL_H +#define MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_PERIPHERAL_H + +#include "common-hal/bleio/Peripheral.h" + +extern const mp_obj_type_t bleio_peripheral_type; + +extern void common_hal_bleio_peripheral_construct(bleio_peripheral_obj_t *self); +extern bool common_hal_bleio_peripheral_get_connected(bleio_peripheral_obj_t *self); +extern void common_hal_bleio_peripheral_start_advertising(bleio_peripheral_obj_t *device, bool connectable, mp_buffer_info_t *raw_data); +extern void common_hal_bleio_peripheral_stop_advertising(bleio_peripheral_obj_t *device); + +#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_PERIPHERAL_H diff --git a/shared-bindings/bleio/ScanEntry.c b/shared-bindings/bleio/ScanEntry.c index e452c7267..e6b955078 100644 --- a/shared-bindings/bleio/ScanEntry.c +++ b/shared-bindings/bleio/ScanEntry.c @@ -37,6 +37,9 @@ #include "shared-module/bleio/AdvertisementData.h" #include "shared-module/bleio/ScanEntry.h" +// Work-in-progress: orphaned for now. +//| :orphan: +//| //| .. currentmodule:: bleio //| //| :class:`ScanEntry` -- BLE scan response entry @@ -108,7 +111,7 @@ STATIC mp_obj_t scanentry_get_name(mp_obj_t self_in); STATIC void bleio_scanentry_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { bleio_scanentry_obj_t *self = (bleio_scanentry_obj_t *)self_in; - mp_printf(print, "ScanEntry(address: "HEX2_FMT":"HEX2_FMT":"HEX2_FMT":"HEX2_FMT":"HEX2_FMT":"HEX2_FMT"", + mp_printf(print, "ScanEntry(address: %02x:%02x:%02x:%02x:%02x:%02x", self->address.value[5], self->address.value[4], self->address.value[3], self->address.value[1], self->address.value[1], self->address.value[0]); @@ -248,7 +251,7 @@ STATIC mp_obj_t scanentry_get_service_uuids(mp_obj_t self_in) { mp_obj_t entries = mp_obj_new_list(0, NULL); for (size_t i = 0; i < uuids_len / sizeof(uint16_t); ++i) { const mp_obj_t uuid_int = mp_obj_new_int(uuids[sizeof(uint16_t) * i] | (uuids[sizeof(uint16_t) * i + 1] << 8)); - const mp_obj_t uuid_obj = bleio_uuid_type.make_new(&bleio_uuid_type, 1, 0, &uuid_int); + const mp_obj_t uuid_obj = bleio_uuid_type.make_new(&bleio_uuid_type, 1, &uuid_int, NULL); mp_obj_list_append(entries, uuid_obj); } diff --git a/shared-bindings/bleio/Scanner.c b/shared-bindings/bleio/Scanner.c index 5d19778f6..f5424f706 100644 --- a/shared-bindings/bleio/Scanner.c +++ b/shared-bindings/bleio/Scanner.c @@ -25,12 +25,16 @@ */ #include "py/objproperty.h" +#include "py/runtime.h" #include "shared-bindings/bleio/ScanEntry.h" #include "shared-bindings/bleio/Scanner.h" #define DEFAULT_INTERVAL 100 #define DEFAULT_WINDOW 100 +// Work-in-progress: orphaned for now. +//| :orphan: +//| //| .. currentmodule:: bleio //| //| :class:`Scanner` -- scan for nearby BLE devices @@ -77,7 +81,9 @@ STATIC void bleio_scanner_print(const mp_print_t *print, mp_obj_t self_in, mp_pr mp_printf(print, "Scanner(interval: %d window: %d)", self->interval, self->window); } -STATIC mp_obj_t bleio_scanner_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { +STATIC mp_obj_t bleio_scanner_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *all_args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 0, 0, false); + bleio_scanner_obj_t *self = m_new_obj(bleio_scanner_obj_t); self->base.type = type; diff --git a/shared-bindings/bleio/Service.c b/shared-bindings/bleio/Service.c index 2d09cbc3c..c3be26260 100644 --- a/shared-bindings/bleio/Service.c +++ b/shared-bindings/bleio/Service.c @@ -27,6 +27,7 @@ #include "py/objproperty.h" #include "py/runtime.h" +#include "shared-bindings/bleio/Characteristic.h" #include "shared-bindings/bleio/Service.h" #include "shared-bindings/bleio/UUID.h" @@ -38,97 +39,75 @@ //| Stores information about a BLE service and its characteristics. //| -//| .. class:: Service(uuid, secondary=False) +//| .. class:: Service(uuid, characteristics, *, secondary=False) //| //| Create a new Service object identified by the specified UUID. //| To mark the service as secondary, pass `True` as :py:data:`secondary`. //| //| :param bleio.UUID uuid: The uuid of the service +//| :param iterable characteristics: the Characteristic objects for this service //| :param bool secondary: If the service is a secondary one //| -//| .. method:: add_characteristic(characteristic) -//| -//| Appends the :py:data:`characteristic` to the list of this service's characteristics. -//| -//| :param bleio.Characteristic characteristic: the characteristic to append -//| - -//| .. attribute:: characteristics -//| -//| A `list` of `bleio.Characteristic` that are offered by this service. (read-only) -//| - -//| .. attribute:: uuid -//| -//| The UUID of this service. (read-only) -//| -STATIC void bleio_service_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { - bleio_service_obj_t *self = MP_OBJ_TO_PTR(self_in); - - mp_printf(print, "Service(uuid: 0x"HEX2_FMT""HEX2_FMT")", - self->uuid->value[1], self->uuid->value[0]); -} - -STATIC mp_obj_t bleio_service_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { - mp_arg_check_num(n_args, n_kw, 1, 1, true); - bleio_service_obj_t *self = m_new_obj(bleio_service_obj_t); - self->base.type = &bleio_service_type; - self->device = NULL; - self->char_list = mp_obj_new_list(0, NULL); - self->handle = 0xFFFF; - - mp_map_t kw_args; - mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); - - enum { ARG_uuid, ARG_secondary }; +STATIC mp_obj_t bleio_service_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + enum { ARG_uuid, ARG_characteristics, ARG_secondary }; static const mp_arg_t allowed_args[] = { - { ARG_uuid, MP_ARG_OBJ, {.u_obj = mp_const_none} }, + { MP_QSTR_uuid, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = mp_const_none} }, + { MP_QSTR_characteristics, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = mp_const_none} }, { MP_QSTR_secondary, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all(n_args, pos_args, &kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); - - self->is_secondary = args[ARG_secondary].u_bool; + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); const mp_obj_t uuid = args[ARG_uuid].u_obj; - if (uuid == mp_const_none) { - return MP_OBJ_FROM_PTR(self); - } - - if (MP_OBJ_IS_TYPE(uuid, &bleio_uuid_type)) { - self->uuid = MP_OBJ_TO_PTR(uuid); - } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, - translate("Invalid UUID parameter"))); + if (!MP_OBJ_IS_TYPE(uuid, &bleio_uuid_type)) { + mp_raise_ValueError(translate("Expected a UUID")); } - return MP_OBJ_FROM_PTR(self); -} - -STATIC mp_obj_t bleio_service_add_characteristic(mp_obj_t self_in, mp_obj_t characteristic_in) { - bleio_service_obj_t *self = MP_OBJ_TO_PTR(self_in); - bleio_characteristic_obj_t *characteristic = MP_OBJ_TO_PTR(characteristic_in); - - if (self->uuid->type == UUID_TYPE_128BIT) { - characteristic->uuid->type = UUID_TYPE_128BIT; - characteristic->uuid->uuid_vs_idx = self->uuid->uuid_vs_idx; + bleio_service_obj_t *self = m_new_obj(bleio_service_obj_t); + self->char_list = mp_obj_new_list(0, NULL); + self->base.type = &bleio_service_type; + self->device = mp_const_none; + self->handle = 0xFFFF; + self->is_secondary = args[ARG_secondary].u_bool; + self->uuid = MP_OBJ_TO_PTR(uuid); + + // If characteristics is not an iterable, an exception will be thrown. + mp_obj_iter_buf_t iter_buf; + mp_obj_t iterable = mp_getiter(args[ARG_characteristics].u_obj, &iter_buf); + mp_obj_t characteristic; + + while ((characteristic = mp_iternext(iterable)) != MP_OBJ_STOP_ITERATION) { + if (!MP_OBJ_IS_TYPE(characteristic, &bleio_characteristic_type)) { + mp_raise_ValueError(translate("characteristics includes an object that is not a Characteristic")); + } + bleio_characteristic_obj_t *characteristic_ptr = MP_OBJ_TO_PTR(characteristic); + if (common_hal_bleio_uuid_get_uuid128_reference(uuid) != + common_hal_bleio_uuid_get_uuid128_reference(characteristic_ptr->uuid)) { + // The descriptor base UUID doesn't match the characteristic base UUID. + mp_raise_ValueError(translate("Characteristic UUID doesn't match Service UUID")); + } + characteristic_ptr->service = self; + mp_obj_list_append(self->char_list, characteristic); } - characteristic->service = self; - - mp_obj_list_append(self->char_list, characteristic); + // Do port-specific initialization. + common_hal_bleio_service_construct(self); - return mp_const_none; + return MP_OBJ_FROM_PTR(self); } -STATIC MP_DEFINE_CONST_FUN_OBJ_2(bleio_service_add_characteristic_obj, bleio_service_add_characteristic); +//| .. attribute:: characteristics +//| +//| A `list` of `bleio.Characteristic` that are offered by this service. (read-only) +//| STATIC mp_obj_t bleio_service_get_characteristics(mp_obj_t self_in) { bleio_service_obj_t *self = MP_OBJ_TO_PTR(self_in); - - return self->char_list; + // Return list as a tuple so user won't be able to change it. + mp_obj_list_t *char_list = MP_OBJ_TO_PTR(self->char_list); + return mp_obj_new_tuple(char_list->len, char_list->items); } STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_service_get_characteristics_obj, bleio_service_get_characteristics); @@ -139,6 +118,10 @@ const mp_obj_property_t bleio_service_characteristics_obj = { (mp_obj_t)&mp_const_none_obj }, }; +//| .. attribute:: uuid +//| +//| The UUID of this service. (read-only) +//| STATIC mp_obj_t bleio_service_get_uuid(mp_obj_t self_in) { bleio_service_obj_t *self = MP_OBJ_TO_PTR(self_in); @@ -154,7 +137,6 @@ const mp_obj_property_t bleio_service_uuid_obj = { }; STATIC const mp_rom_map_elem_t bleio_service_locals_dict_table[] = { - { MP_ROM_QSTR(MP_QSTR_add_characteristic), MP_ROM_PTR(&bleio_service_add_characteristic_obj) }, { MP_ROM_QSTR(MP_QSTR_characteristics), MP_ROM_PTR(&bleio_service_characteristics_obj) }, { MP_ROM_QSTR(MP_QSTR_uuid), MP_ROM_PTR(&bleio_service_uuid_obj) }, }; @@ -164,7 +146,6 @@ STATIC MP_DEFINE_CONST_DICT(bleio_service_locals_dict, bleio_service_locals_dict const mp_obj_type_t bleio_service_type = { { &mp_type_type }, .name = MP_QSTR_Service, - .print = bleio_service_print, .make_new = bleio_service_make_new, .locals_dict = (mp_obj_dict_t*)&bleio_service_locals_dict }; diff --git a/shared-bindings/bleio/Service.h b/shared-bindings/bleio/Service.h index 77c751829..389db3b2e 100644 --- a/shared-bindings/bleio/Service.h +++ b/shared-bindings/bleio/Service.h @@ -32,6 +32,7 @@ const mp_obj_type_t bleio_service_type; -extern void common_hal_bleio_service_add_characteristic(bleio_service_obj_t *self, bleio_characteristic_obj_t *characteristic); +extern void common_hal_bleio_service_construct(bleio_service_obj_t *self); +extern void common_hal_bleio_service_add_all_characteristics(bleio_service_obj_t *self); #endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_SERVICE_H diff --git a/shared-bindings/bleio/UUID.c b/shared-bindings/bleio/UUID.c index 7cef9a26f..c6ad9e626 100644 --- a/shared-bindings/bleio/UUID.c +++ b/shared-bindings/bleio/UUID.c @@ -5,6 +5,7 @@ * * Copyright (c) 2017 Glenn Ruben Bakke * Copyright (c) 2018 Artur Pacholec + * Copyright (c) 2018 Dan Halbert for Adafruit Industries * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -25,7 +26,10 @@ * THE SOFTWARE. */ +#include <string.h> + #include "py/objproperty.h" +#include "py/objstr.h" #include "py/runtime.h" #include "shared-bindings/bleio/UUID.h" @@ -34,113 +38,227 @@ //| :class:`UUID` -- BLE UUID //| ========================================================= //| -//| Encapsulates both 16-bit and 128-bit UUIDs. Can be used for services, -//| characteristics, descriptors and more. +//| A 16-bit or 128-bit UUID. Can be used for services, characteristics, descriptors and more. //| -//| .. class:: UUID(uuid) +//| .. class:: UUID(value) //| -//| Create a new UUID object encapsulating the uuid value. -//| The value itself can be one of: +//| Create a new UUID or UUID object encapsulating the uuid value. +//| The value can be one of: //| -//| - a `int` value in range of 0 to 0xFFFF -//| - a `str` value in the format of '0xXXXX' for 16-bit or 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX' for 128-bit +//| - an `int` value in range 0 to 0xFFFF (Bluetooth SIG 16-bit UUID) +//| - a buffer object (bytearray, bytes) of 16 bytes in little-endian order (128-bit UUID) //| -//| :param int/str uuid: The uuid to encapsulate +//| :param int/buffer value: The uuid value to encapsulate //| +STATIC mp_obj_t bleio_uuid_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 1, 1, false); -//| .. method:: __len__() -//| -//| Returns the uuid length in bits -//| -//| This allows you to: -//| -//| uuid = bleio.UUID(0x1801) -//| print(len(uuid)) -//| - -//| .. attribute:: type -//| -//| The UUID type. One of: -//| -//| - `bleio.UUIDType.TYPE_16BIT` -//| - `bleio.UUIDType.TYPE_128BIT` -//| -STATIC mp_obj_t bleio_uuid_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { - mp_arg_check_num(n_args, n_kw, 1, 1, true); bleio_uuid_obj_t *self = m_new_obj(bleio_uuid_obj_t); - self->base.type = &bleio_uuid_type; + self->base.type = type; - mp_map_t kw_args; - mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); + const mp_obj_t value = pos_args[0]; + uint8_t uuid128[16]; - enum { ARG_uuid }; - static const mp_arg_t allowed_args[] = { - { ARG_uuid, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, - }; + if (MP_OBJ_IS_INT(value)) { + mp_int_t uuid16 = mp_obj_get_int(value); + if (uuid16 < 0 || uuid16 > 0xffff) { + mp_raise_ValueError(translate("UUID integer value not in range 0 to 0xffff")); + } - mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all(n_args, pos_args, &kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + // NULL means no 128-bit value. + common_hal_bleio_uuid_construct(self, uuid16, NULL); - const mp_obj_t uuid = args[ARG_uuid].u_obj; + } else { + if (MP_OBJ_IS_STR(value)) { + // 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' + GET_STR_DATA_LEN(value, chars, len); + char hex[32]; + // Validate length, hyphens, and hex digits. + bool good_uuid = + len == 36 && chars[8] == '-' && chars[13] == '-' && chars[18] == '-' && chars[23] == '-'; + if (good_uuid) { + size_t hex_idx = 0; + for (size_t i = 0; i < len; i++) { + if (unichar_isxdigit(chars[i])) { + hex[hex_idx] = chars[i]; + hex_idx++; + } + } + good_uuid = hex_idx == 32; + } + if (!good_uuid) { + mp_raise_ValueError(translate("UUID string not 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'")); + } - common_hal_bleio_uuid_construct(self, &uuid); + size_t hex_idx = 0; + for (int i = 15; i >= 0; i--) { + uuid128[i] = (unichar_xdigit_value(hex[hex_idx]) << 4) | unichar_xdigit_value(hex[hex_idx + 1]); + hex_idx += 2; + } + } else { + // Last possibility is that it's a buf. + mp_buffer_info_t bufinfo; + if (!mp_get_buffer(value, &bufinfo, MP_BUFFER_READ)) { + mp_raise_ValueError(translate("UUID value is not str, int or byte buffer")); + } - return MP_OBJ_FROM_PTR(self); -} + if (bufinfo.len != 16) { + mp_raise_ValueError(translate("Byte buffer must be 16 bytes.")); + } -STATIC mp_obj_t bleio_uuid_unary_op(mp_unary_op_t op, mp_obj_t self_in) { - bleio_uuid_obj_t *self = MP_OBJ_TO_PTR(self_in); + memcpy(uuid128, bufinfo.buf, 16); + } - const bleio_uuid_type_t type = common_hal_bleio_uuid_get_type(self); - const uint8_t len = (type == UUID_TYPE_16BIT) ? 16 : 128; - switch (op) { - case MP_UNARY_OP_BOOL: return mp_obj_new_bool(len != 0); - case MP_UNARY_OP_LEN: return MP_OBJ_NEW_SMALL_INT(len); - default: return MP_OBJ_NULL; // op not supported + // Str and bytes both get constructed the same way here. + uint32_t uuid16 = (uuid128[13] << 8) | uuid128[12]; + uuid128[12] = 0; + uuid128[13] = 0; + common_hal_bleio_uuid_construct(self, uuid16, uuid128); } + + return MP_OBJ_FROM_PTR(self); } -STATIC void bleio_uuid_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { +//| .. attribute:: uuid16 +//| +//| The 16-bit part of the UUID. (read-only) +//| +STATIC mp_obj_t bleio_uuid_get_uuid16(mp_obj_t self_in) { bleio_uuid_obj_t *self = MP_OBJ_TO_PTR(self_in); - - common_hal_bleio_uuid_print(self, print); + return MP_OBJ_NEW_SMALL_INT(common_hal_bleio_uuid_get_uuid16(self)); } -STATIC mp_obj_t bleio_uuid_get_type(mp_obj_t self_in) { +MP_DEFINE_CONST_FUN_OBJ_1(bleio_uuid_get_uuid16_obj, bleio_uuid_get_uuid16); + +const mp_obj_property_t bleio_uuid_uuid16_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&bleio_uuid_get_uuid16_obj, + (mp_obj_t)&mp_const_none_obj, + (mp_obj_t)&mp_const_none_obj}, +}; + +//| .. attribute:: uuid128 +//| +//| The 128-bit value of the UUID, returned as bytes. +//| Raises AttributeError if this is a 16-bit UUID. (read-only) +//| +STATIC mp_obj_t bleio_uuid_get_uuid128(mp_obj_t self_in) { bleio_uuid_obj_t *self = MP_OBJ_TO_PTR(self_in); - const bleio_uuid_type_t type = common_hal_bleio_uuid_get_type(self); - if (type == UUID_TYPE_16BIT) { - return (mp_obj_t)&bleio_uuidtype_16bit_obj; + uint8_t uuid128[16]; + if (!common_hal_bleio_uuid_get_uuid128(self, uuid128)) { + mp_raise_AttributeError(translate("not a 128-bit UUID")); } + return mp_obj_new_bytes(uuid128, 16); +} - if (type == UUID_TYPE_128BIT) { - return (mp_obj_t)&bleio_uuidtype_128bit_obj; - } +MP_DEFINE_CONST_FUN_OBJ_1(bleio_uuid_get_uuid128_obj, bleio_uuid_get_uuid128); + +const mp_obj_property_t bleio_uuid_uuid128_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&bleio_uuid_get_uuid128_obj, + (mp_obj_t)&mp_const_none_obj, + (mp_obj_t)&mp_const_none_obj}, +}; - return (mp_obj_t)&mp_const_none_obj; +//| .. attribute:: size +//| +//| Returns 128 if this UUID represents a 128-bit vendor-specific UUID. +//| Returns 16 if this UUID represents a 16-bit Bluetooth SIG assigned UUID. (read-only) +//| 32-bit UUIDs are not currently supported. +//| +STATIC mp_obj_t bleio_uuid_get_size(mp_obj_t self_in) { + bleio_uuid_obj_t *self = MP_OBJ_TO_PTR(self_in); + return MP_OBJ_NEW_SMALL_INT(common_hal_bleio_uuid_get_size(self)); } -MP_DEFINE_CONST_FUN_OBJ_1(bleio_uuid_get_type_obj, bleio_uuid_get_type); -const mp_obj_property_t bleio_uuid_type_obj = { +MP_DEFINE_CONST_FUN_OBJ_1(bleio_uuid_get_size_obj, bleio_uuid_get_size); + +const mp_obj_property_t bleio_uuid_size_obj = { .base.type = &mp_type_property, - .proxy = {(mp_obj_t)&bleio_uuid_get_type_obj, + .proxy = {(mp_obj_t)&bleio_uuid_get_size_obj, (mp_obj_t)&mp_const_none_obj, (mp_obj_t)&mp_const_none_obj}, }; STATIC const mp_rom_map_elem_t bleio_uuid_locals_dict_table[] = { - { MP_ROM_QSTR(MP_QSTR_type), MP_ROM_PTR(&bleio_uuid_type_obj) }, + { MP_ROM_QSTR(MP_QSTR_uuid16), MP_ROM_PTR(&bleio_uuid_uuid16_obj) }, + { MP_ROM_QSTR(MP_QSTR_uuid128), MP_ROM_PTR(&bleio_uuid_uuid128_obj) }, + { MP_ROM_QSTR(MP_QSTR_size), MP_ROM_PTR(&bleio_uuid_size_obj) }, }; STATIC MP_DEFINE_CONST_DICT(bleio_uuid_locals_dict, bleio_uuid_locals_dict_table); +STATIC mp_obj_t bleio_uuid_unary_op(mp_unary_op_t op, mp_obj_t self_in) { + bleio_uuid_obj_t *self = MP_OBJ_TO_PTR(self_in); + switch (op) { + case MP_UNARY_OP_HASH: + if (common_hal_bleio_uuid_get_size(self) == 16) { + return MP_OBJ_NEW_SMALL_INT(common_hal_bleio_uuid_get_uuid16(self)); + } else { + union { + uint8_t uuid128_bytes[16]; + uint16_t uuid128_uint16[8]; + } uuid128; + common_hal_bleio_uuid_get_uuid128(self, uuid128.uuid128_bytes); + int hash = 0; + for (size_t i = 0; i < MP_ARRAY_SIZE(uuid128.uuid128_uint16); i++) { + hash += uuid128.uuid128_uint16[i]; + } + return MP_OBJ_NEW_SMALL_INT(hash); + } + default: + return MP_OBJ_NULL; // op not supported + } +} + +STATIC mp_obj_t bleio_uuid_binary_op(mp_binary_op_t op, mp_obj_t lhs_in, mp_obj_t rhs_in) { + switch (op) { + // Two UUID's are equal if their uuid16 values and uuid128 references match. + case MP_BINARY_OP_EQUAL: + if (MP_OBJ_IS_TYPE(rhs_in, &bleio_uuid_type)) { + return mp_obj_new_bool( + common_hal_bleio_uuid_get_uuid16(lhs_in) == common_hal_bleio_uuid_get_uuid16(rhs_in) && + common_hal_bleio_uuid_get_uuid128_reference(lhs_in) == + common_hal_bleio_uuid_get_uuid128_reference(rhs_in)); + } else { + return mp_const_false; + } + + default: + return MP_OBJ_NULL; // op not supported + } +} + +void bleio_uuid_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { + bleio_uuid_obj_t *self = MP_OBJ_TO_PTR(self_in); + uint32_t size = common_hal_bleio_uuid_get_size(self); + if (size == 16) { + mp_printf(print, "UUID(0x%04x)", common_hal_bleio_uuid_get_uuid16(self)); + } else { + uint8_t uuid128[16]; + (void) common_hal_bleio_uuid_get_uuid128(self, uuid128); + mp_printf(print, "UUID('" + "%02x%02x%02x%02x-" + "%02x%02x-" + "%02x%02x-" + "%02x%02x-" + "%02x%02x%02x%02x%02x%02x')", + uuid128[15], uuid128[14], uuid128[13], uuid128[12], + uuid128[11], uuid128[10], + uuid128[9], uuid128[8], + uuid128[7], uuid128[6], + uuid128[5], uuid128[4], uuid128[3], uuid128[2], uuid128[1], uuid128[0]); + } +} + const mp_obj_type_t bleio_uuid_type = { { &mp_type_type }, .name = MP_QSTR_UUID, .print = bleio_uuid_print, .make_new = bleio_uuid_make_new, .unary_op = bleio_uuid_unary_op, - .locals_dict = (mp_obj_dict_t*)&bleio_uuid_locals_dict + .binary_op = bleio_uuid_binary_op, + .locals_dict = (mp_obj_dict_t*)&bleio_uuid_locals_dict, }; diff --git a/shared-bindings/bleio/UUID.h b/shared-bindings/bleio/UUID.h index d6fcbac1b..aef2c1e29 100644 --- a/shared-bindings/bleio/UUID.h +++ b/shared-bindings/bleio/UUID.h @@ -28,12 +28,15 @@ #define MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_UUID_H #include "common-hal/bleio/UUID.h" -#include "shared-bindings/bleio/UUIDType.h" + +void bleio_uuid_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind); extern const mp_obj_type_t bleio_uuid_type; -extern void common_hal_bleio_uuid_construct(bleio_uuid_obj_t *self, const mp_obj_t *uuid); -extern void common_hal_bleio_uuid_print(bleio_uuid_obj_t *self, const mp_print_t *print); -extern bleio_uuid_type_t common_hal_bleio_uuid_get_type(bleio_uuid_obj_t *self); +extern void common_hal_bleio_uuid_construct(bleio_uuid_obj_t *self, mp_int_t uuid16, uint8_t uuid128[]); +extern uint32_t common_hal_bleio_uuid_get_uuid16(bleio_uuid_obj_t *self); +extern bool common_hal_bleio_uuid_get_uuid128(bleio_uuid_obj_t *self, uint8_t uuid128[16]); +extern uint32_t common_hal_bleio_uuid_get_uuid128_reference(bleio_uuid_obj_t *self); +extern uint32_t common_hal_bleio_uuid_get_size(bleio_uuid_obj_t *self); #endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_UUID_H diff --git a/shared-bindings/bleio/UUIDType.c b/shared-bindings/bleio/UUIDType.c deleted file mode 100644 index e36d1f06d..000000000 --- a/shared-bindings/bleio/UUIDType.c +++ /dev/null @@ -1,75 +0,0 @@ -/* - * This file is part of the Micro Python project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2018 Artur Pacholec - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#include "shared-bindings/bleio/UUIDType.h" - -//| .. currentmodule:: bleio -//| -//| :class:`UUIDType` -- defines the type of a BLE UUID -//| ============================================================= -//| -//| .. class:: bleio.UUIDType -//| -//| Enum-like class to define the type of a BLE UUID. -//| -//| .. data:: TYPE_16BIT -//| -//| The UUID is 16-bit -//| -//| .. data:: TYPE_128BIT -//| -//| The UUID is 128-bit -//| -const mp_obj_type_t bleio_uuidtype_type; - -const bleio_uuidtype_obj_t bleio_uuidtype_16bit_obj = { - { &bleio_uuidtype_type }, -}; - -const bleio_uuidtype_obj_t bleio_uuidtype_128bit_obj = { - { &bleio_uuidtype_type }, -}; - -STATIC const mp_rom_map_elem_t bleio_uuidtype_locals_dict_table[] = { - { MP_ROM_QSTR(MP_QSTR_TYPE_16BIT), MP_ROM_PTR(&bleio_uuidtype_16bit_obj) }, - { MP_ROM_QSTR(MP_QSTR_TYPE_128BIT), MP_ROM_PTR(&bleio_uuidtype_128bit_obj) }, -}; -STATIC MP_DEFINE_CONST_DICT(bleio_uuidtype_locals_dict, bleio_uuidtype_locals_dict_table); - -STATIC void bleio_uuidtype_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { - qstr type = MP_QSTR_TYPE_128BIT; - if (MP_OBJ_TO_PTR(self_in) == MP_ROM_PTR(&bleio_uuidtype_16bit_obj)) { - type = MP_QSTR_TYPE_16BIT; - } - mp_printf(print, "%q.%q.%q", MP_QSTR_bleio, MP_QSTR_UUIDType, type); -} - -const mp_obj_type_t bleio_uuidtype_type = { - { &mp_type_type }, - .name = MP_QSTR_UUIDType, - .print = bleio_uuidtype_print, - .locals_dict = (mp_obj_t)&bleio_uuidtype_locals_dict, -}; diff --git a/shared-bindings/bleio/__init__.c b/shared-bindings/bleio/__init__.c index 98099422c..7348655ac 100644 --- a/shared-bindings/bleio/__init__.c +++ b/shared-bindings/bleio/__init__.c @@ -29,14 +29,15 @@ #include "shared-bindings/bleio/Address.h" #include "shared-bindings/bleio/AddressType.h" #include "shared-bindings/bleio/AdvertisementData.h" +#include "shared-bindings/bleio/Broadcaster.h" #include "shared-bindings/bleio/Characteristic.h" +#include "shared-bindings/bleio/CharacteristicBuffer.h" #include "shared-bindings/bleio/Descriptor.h" -#include "shared-bindings/bleio/Device.h" +#include "shared-bindings/bleio/Peripheral.h" #include "shared-bindings/bleio/ScanEntry.h" #include "shared-bindings/bleio/Scanner.h" #include "shared-bindings/bleio/Service.h" #include "shared-bindings/bleio/UUID.h" -#include "shared-bindings/bleio/UUIDType.h" //| :mod:`bleio` --- Bluetooth Low Energy functionality //| ================================================================ @@ -56,14 +57,17 @@ //| AddressType //| AdvertisementData //| Adapter +//| Broadcaster //| Characteristic -//| Descriptor -//| Device -//| ScanEntry -//| Scanner +//| CharacteristicBuffer +// Work-in-progress classes are omitted, and marked as :orphan: in their files. +// Descriptor +// Device +//| Peripheral +// ScanEntry +// Scanner //| Service //| UUID -//| UUIDType //| //| .. attribute:: adapter //| @@ -76,11 +80,14 @@ STATIC const mp_rom_map_elem_t bleio_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_bleio) }, { MP_ROM_QSTR(MP_QSTR_Address), MP_ROM_PTR(&bleio_address_type) }, { MP_ROM_QSTR(MP_QSTR_AdvertisementData), MP_ROM_PTR(&bleio_advertisementdata_type) }, + { MP_ROM_QSTR(MP_QSTR_Broadcaster), MP_ROM_PTR(&bleio_broadcaster_type) }, { MP_ROM_QSTR(MP_QSTR_Characteristic), MP_ROM_PTR(&bleio_characteristic_type) }, - { MP_ROM_QSTR(MP_QSTR_Descriptor), MP_ROM_PTR(&bleio_descriptor_type) }, - { MP_ROM_QSTR(MP_QSTR_Device), MP_ROM_PTR(&bleio_device_type) }, - { MP_ROM_QSTR(MP_QSTR_ScanEntry), MP_ROM_PTR(&bleio_scanentry_type) }, - { MP_ROM_QSTR(MP_QSTR_Scanner), MP_ROM_PTR(&bleio_scanner_type) }, + { MP_ROM_QSTR(MP_QSTR_CharacteristicBuffer), MP_ROM_PTR(&bleio_characteristic_buffer_type) }, +// { MP_ROM_QSTR(MP_QSTR_Descriptor), MP_ROM_PTR(&bleio_descriptor_type) }, + { MP_ROM_QSTR(MP_QSTR_Peripheral), MP_ROM_PTR(&bleio_peripheral_type) }, +// Hide work-in-progress. +// { MP_ROM_QSTR(MP_QSTR_ScanEntry), MP_ROM_PTR(&bleio_scanentry_type) }, +// { MP_ROM_QSTR(MP_QSTR_Scanner), MP_ROM_PTR(&bleio_scanner_type) }, { MP_ROM_QSTR(MP_QSTR_Service), MP_ROM_PTR(&bleio_service_type) }, { MP_ROM_QSTR(MP_QSTR_UUID), MP_ROM_PTR(&bleio_uuid_type) }, @@ -89,7 +96,6 @@ STATIC const mp_rom_map_elem_t bleio_module_globals_table[] = { // Enum-like Classes. { MP_ROM_QSTR(MP_QSTR_AddressType), MP_ROM_PTR(&bleio_addresstype_type) }, - { MP_ROM_QSTR(MP_QSTR_UUIDType), MP_ROM_PTR(&bleio_uuidtype_type) }, }; STATIC MP_DEFINE_CONST_DICT(bleio_module_globals, bleio_module_globals_table); diff --git a/shared-bindings/busio/I2C.c b/shared-bindings/busio/I2C.c index 9581f3a3d..e17a72b48 100644 --- a/shared-bindings/busio/I2C.c +++ b/shared-bindings/busio/I2C.c @@ -60,12 +60,9 @@ //| :param int frequency: The clock frequency in Hertz //| :param int timeout: The maximum clock stretching timeut - (used only for bitbangio.I2C; ignored for busio.I2C) //| -STATIC mp_obj_t busio_i2c_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { - mp_arg_check_num(n_args, n_kw, 0, MP_OBJ_FUN_ARGS_MAX, true); +STATIC mp_obj_t busio_i2c_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { busio_i2c_obj_t *self = m_new_obj(busio_i2c_obj_t); self->base.type = &busio_i2c_type; - mp_map_t kw_args; - mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); enum { ARG_scl, ARG_sda, ARG_frequency, ARG_timeout }; static const mp_arg_t allowed_args[] = { { MP_QSTR_scl, MP_ARG_REQUIRED | MP_ARG_OBJ }, @@ -74,7 +71,7 @@ STATIC mp_obj_t busio_i2c_make_new(const mp_obj_type_t *type, size_t n_args, siz { MP_QSTR_timeout, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 255} }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all(n_args, pos_args, &kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); assert_pin(args[ARG_scl].u_obj, false); assert_pin(args[ARG_sda].u_obj, false); const mcu_pin_obj_t* scl = MP_OBJ_TO_PTR(args[ARG_scl].u_obj); @@ -117,7 +114,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(busio_i2c___exit___obj, 4, 4, busio_i static void check_lock(busio_i2c_obj_t *self) { asm(""); if (!common_hal_busio_i2c_has_lock(self)) { - mp_raise_RuntimeError(translate("Function requires lock.")); + mp_raise_RuntimeError(translate("Function requires lock")); } } diff --git a/shared-bindings/busio/OneWire.c b/shared-bindings/busio/OneWire.c index 95fce68f3..ceba4f8ee 100644 --- a/shared-bindings/busio/OneWire.c +++ b/shared-bindings/busio/OneWire.c @@ -62,16 +62,13 @@ //| onewire.write_bit(False) //| print(onewire.read_bit()) //| -STATIC mp_obj_t busio_onewire_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { - mp_arg_check_num(n_args, n_kw, 1, MP_OBJ_FUN_ARGS_MAX, true); - mp_map_t kw_args; - mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); +STATIC mp_obj_t busio_onewire_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { enum { ARG_pin }; static const mp_arg_t allowed_args[] = { { MP_QSTR_pin, MP_ARG_REQUIRED | MP_ARG_OBJ }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all(n_args, pos_args, &kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); assert_pin(args[ARG_pin].u_obj, false); const mcu_pin_obj_t* pin = MP_OBJ_TO_PTR(args[ARG_pin].u_obj); assert_pin_free(pin); diff --git a/shared-bindings/busio/SPI.c b/shared-bindings/busio/SPI.c index d30bbbe06..f690eea18 100644 --- a/shared-bindings/busio/SPI.c +++ b/shared-bindings/busio/SPI.c @@ -71,12 +71,9 @@ //| // TODO(tannewt): Support LSB SPI. -STATIC mp_obj_t busio_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { - mp_arg_check_num(n_args, n_kw, 0, MP_OBJ_FUN_ARGS_MAX, true); +STATIC mp_obj_t busio_spi_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { busio_spi_obj_t *self = m_new_obj(busio_spi_obj_t); self->base.type = &busio_spi_type; - mp_map_t kw_args; - mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); enum { ARG_clock, ARG_MOSI, ARG_MISO }; static const mp_arg_t allowed_args[] = { { MP_QSTR_clock, MP_ARG_REQUIRED | MP_ARG_OBJ }, @@ -84,7 +81,7 @@ STATIC mp_obj_t busio_spi_make_new(const mp_obj_type_t *type, size_t n_args, siz { MP_QSTR_MISO, MP_ARG_OBJ, {.u_obj = mp_const_none} }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all(n_args, pos_args, &kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); assert_pin(args[ARG_clock].u_obj, false); assert_pin(args[ARG_MOSI].u_obj, true); assert_pin(args[ARG_MISO].u_obj, true); @@ -150,8 +147,8 @@ static void check_lock(busio_spi_obj_t *self) { //| speed is not guaranteed to work. 12 MHz is the next available lower speed, and is //| within spec for the SAMD21. //| -//| .. note:: On the nRF52832, these baudrates are available: 125kHz, 250kHz, 1MHz, 2MHz, 4MHz, -//| and 8MHz. On the nRF52840, 16MHz and 32MHz are also available, but only on the first +//| .. note:: On the nRF52840, these baudrates are available: 125kHz, 250kHz, 1MHz, 2MHz, 4MHz, +//| and 8MHz. 16MHz and 32MHz are also available, but only on the first //| `busio.SPI` object you create. Two more ``busio.SPI`` objects can be created, but they are restricted //| to 8MHz maximum. This is a hardware restriction: there is only one high-speed SPI peripheral. //| If you pick a a baudrate other than one of these, the nearest lower diff --git a/shared-bindings/busio/UART.c b/shared-bindings/busio/UART.c index 1cba386d2..b40f3fa03 100644 --- a/shared-bindings/busio/UART.c +++ b/shared-bindings/busio/UART.c @@ -62,23 +62,20 @@ //| //| *New in CircuitPython 4.0:* ``timeout`` has incompatibly changed units from milliseconds to seconds. //| The new upper limit on ``timeout`` is meant to catch mistaken use of milliseconds. - +//| typedef struct { mp_obj_base_t base; } busio_uart_parity_obj_t; extern const busio_uart_parity_obj_t busio_uart_parity_even_obj; extern const busio_uart_parity_obj_t busio_uart_parity_odd_obj; -STATIC mp_obj_t busio_uart_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { - mp_arg_check_num(n_args, n_kw, 0, MP_OBJ_FUN_ARGS_MAX, true); +STATIC mp_obj_t busio_uart_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { // Always initially allocate the UART object within the long-lived heap. // This is needed to avoid crashes with certain UART implementations which // cannot accomodate being moved after creation. (See // https://github.com/adafruit/circuitpython/issues/1056) busio_uart_obj_t *self = m_new_ll_obj(busio_uart_obj_t); self->base.type = &busio_uart_type; - mp_map_t kw_args; - mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); enum { ARG_tx, ARG_rx, ARG_baudrate, ARG_bits, ARG_parity, ARG_stop, ARG_timeout, ARG_receiver_buffer_size}; static const mp_arg_t allowed_args[] = { { MP_QSTR_tx, MP_ARG_REQUIRED | MP_ARG_OBJ }, @@ -91,7 +88,7 @@ STATIC mp_obj_t busio_uart_make_new(const mp_obj_type_t *type, size_t n_args, si { MP_QSTR_receiver_buffer_size, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 64} }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all(n_args, pos_args, &kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); assert_pin(args[ARG_rx].u_obj, true); const mcu_pin_obj_t* rx = MP_OBJ_TO_PTR(args[ARG_rx].u_obj); @@ -119,7 +116,7 @@ STATIC mp_obj_t busio_uart_make_new(const mp_obj_type_t *type, size_t n_args, si } mp_float_t timeout = mp_obj_get_float(args[ARG_timeout].u_obj); - if (timeout > 100.0f) { + if (timeout > (mp_float_t)100.0) { mp_raise_ValueError(translate("timeout >100 (units are now seconds, not msecs)")); } @@ -175,7 +172,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(busio_uart___exit___obj, 4, 4, busio_ //| Read bytes into the ``buf``. Read at most ``len(buf)`` bytes. //| //| :return: number of bytes read and stored into ``buf`` -//| :rtype: bytes or None +//| :rtype: int or None (on a non-blocking error) //| //| *New in CircuitPython 4.0:* No length parameter is permitted. diff --git a/shared-bindings/digitalio/DigitalInOut.c b/shared-bindings/digitalio/DigitalInOut.c index 2a1cd7761..2fcbefe11 100644 --- a/shared-bindings/digitalio/DigitalInOut.c +++ b/shared-bindings/digitalio/DigitalInOut.c @@ -62,8 +62,8 @@ //| :param ~microcontroller.Pin pin: The pin to control //| STATIC mp_obj_t digitalio_digitalinout_make_new(const mp_obj_type_t *type, - mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) { - mp_arg_check_num(n_args, n_kw, 1, 1, true); + mp_uint_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 1, 1, false); digitalio_digitalinout_obj_t *self = m_new_obj(digitalio_digitalinout_obj_t); self->base.type = &digitalio_digitalinout_type; diff --git a/shared-bindings/displayio/Bitmap.c b/shared-bindings/displayio/Bitmap.c index d415127d2..91c17f2d1 100644 --- a/shared-bindings/displayio/Bitmap.c +++ b/shared-bindings/displayio/Bitmap.c @@ -43,8 +43,6 @@ //| //| Stores values of a certain size in a 2D array //| -//| .. warning:: This will likely be changed before 4.0.0. Consider it very experimental. -//| //| .. class:: Bitmap(width, height, value_count) //| //| Create a Bitmap object with the given fixed size. Each pixel stores a value that is used to @@ -55,50 +53,134 @@ //| :param int height: The number of values high //| :param int value_count: The number of possible pixel values. //| -STATIC mp_obj_t displayio_bitmap_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { - mp_arg_check_num(n_args, n_kw, 3, 3, false); +STATIC mp_obj_t displayio_bitmap_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 3, 3, false); uint32_t width = mp_obj_get_int(pos_args[0]); uint32_t height = mp_obj_get_int(pos_args[1]); uint32_t value_count = mp_obj_get_int(pos_args[2]); - uint32_t power_of_two = 1; - while (value_count > (1U << power_of_two)) { - power_of_two <<= 1; + uint32_t bits = 1; + + if (value_count == 0) { + mp_raise_ValueError(translate("value_count must be > 0")); + } + while ((value_count - 1) >> bits) { + if (bits < 8) { + bits <<= 1; + } else { + bits += 8; + } } displayio_bitmap_t *self = m_new_obj(displayio_bitmap_t); self->base.type = &displayio_bitmap_type; - common_hal_displayio_bitmap_construct(self, width, height, power_of_two); + common_hal_displayio_bitmap_construct(self, width, height, bits); return MP_OBJ_FROM_PTR(self); } +//| .. attribute:: width +//| +//| Width of the bitmap. (read only) +//| +STATIC mp_obj_t displayio_bitmap_obj_get_width(mp_obj_t self_in) { + displayio_bitmap_t *self = MP_OBJ_TO_PTR(self_in); + + return MP_OBJ_NEW_SMALL_INT(common_hal_displayio_bitmap_get_width(self)); +} + +MP_DEFINE_CONST_FUN_OBJ_1(displayio_bitmap_get_width_obj, displayio_bitmap_obj_get_width); + +const mp_obj_property_t displayio_bitmap_width_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&displayio_bitmap_get_width_obj, + (mp_obj_t)&mp_const_none_obj, + (mp_obj_t)&mp_const_none_obj}, +}; + +//| .. attribute:: height +//| +//| Height of the bitmap. (read only) +//| +STATIC mp_obj_t displayio_bitmap_obj_get_height(mp_obj_t self_in) { + displayio_bitmap_t *self = MP_OBJ_TO_PTR(self_in); + + return MP_OBJ_NEW_SMALL_INT(common_hal_displayio_bitmap_get_height(self)); +} + +MP_DEFINE_CONST_FUN_OBJ_1(displayio_bitmap_get_height_obj, displayio_bitmap_obj_get_height); +const mp_obj_property_t displayio_bitmap_height_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&displayio_bitmap_get_height_obj, + (mp_obj_t)&mp_const_none_obj, + (mp_obj_t)&mp_const_none_obj}, +}; -//| .. method:: _load_row(y, data) +//| .. method:: __getitem__(index) +//| +//| Returns the value at the given index. The index can either be an x,y tuple or an int equal +//| to ``y * width + x``. +//| +//| This allows you to:: +//| +//| print(bitmap[0,1]) +//| +//| .. method:: __setitem__(index, value) +//| +//| Sets the value at the given index. The index can either be an x,y tuple or an int equal +//| to ``y * width + x``. +//| +//| This allows you to:: //| -//| Loads pre-packed data into the given row. +//| bitmap[0,1] = 3 //| -STATIC mp_obj_t displayio_bitmap_obj__load_row(mp_obj_t self_in, mp_obj_t y_in, mp_obj_t data_in) { +STATIC mp_obj_t bitmap_subscr(mp_obj_t self_in, mp_obj_t index_obj, mp_obj_t value_obj) { + if (value_obj == mp_const_none) { + // delete item + mp_raise_AttributeError(translate("Cannot delete values")); + return mp_const_none; + } + displayio_bitmap_t *self = MP_OBJ_TO_PTR(self_in); - mp_int_t y; - if (!mp_obj_get_int_maybe(y_in, &y)) { - mp_raise_ValueError(translate("y should be an int")); + + if (MP_OBJ_IS_TYPE(index_obj, &mp_type_slice)) { + // TODO(tannewt): Implement subscr after slices support start, stop and step tuples. + mp_raise_NotImplementedError(translate("Slices not supported")); + return mp_const_none; } - mp_buffer_info_t bufinfo; - if (mp_get_buffer(data_in, &bufinfo, MP_BUFFER_READ)) { - if (bufinfo.typecode != 'b' && bufinfo.typecode != 'B' && bufinfo.typecode != BYTEARRAY_TYPECODE) { - mp_raise_ValueError(translate("row buffer must be a bytearray or array of type 'b' or 'B'")); + + uint16_t x = 0; + uint16_t y = 0; + if (MP_OBJ_IS_SMALL_INT(index_obj)) { + mp_int_t i = MP_OBJ_SMALL_INT_VALUE(index_obj); + uint16_t width = common_hal_displayio_bitmap_get_width(self); + x = i % width; + y = i / width; + } else { + mp_obj_t* items; + mp_obj_get_array_fixed_n(index_obj, 2, &items); + x = mp_obj_get_int(items[0]); + y = mp_obj_get_int(items[1]); + if (x >= common_hal_displayio_bitmap_get_width(self) || y >= common_hal_displayio_bitmap_get_height(self)) { + mp_raise_IndexError(translate("pixel coordinates out of bounds")); } - uint8_t* buf = bufinfo.buf; - common_hal_displayio_bitmap_load_row(self, y, buf, bufinfo.len); + } + + if (value_obj == MP_OBJ_SENTINEL) { + // load + return MP_OBJ_NEW_SMALL_INT(common_hal_displayio_bitmap_get_pixel(self, x, y)); } else { - mp_raise_TypeError(translate("row data must be a buffer")); + mp_int_t value = mp_obj_get_int(value_obj); + if (value >= 1 << common_hal_displayio_bitmap_get_bits_per_value(self)) { + mp_raise_ValueError(translate("pixel value requires too many bits")); + } + common_hal_displayio_bitmap_set_pixel(self, x, y, value); } return mp_const_none; } -MP_DEFINE_CONST_FUN_OBJ_3(displayio_bitmap__load_row_obj, displayio_bitmap_obj__load_row); STATIC const mp_rom_map_elem_t displayio_bitmap_locals_dict_table[] = { - { MP_ROM_QSTR(MP_QSTR__load_row), MP_ROM_PTR(&displayio_bitmap__load_row_obj) }, + { MP_ROM_QSTR(MP_QSTR_height), MP_ROM_PTR(&displayio_bitmap_height_obj) }, + { MP_ROM_QSTR(MP_QSTR_width), MP_ROM_PTR(&displayio_bitmap_width_obj) }, }; STATIC MP_DEFINE_CONST_DICT(displayio_bitmap_locals_dict, displayio_bitmap_locals_dict_table); @@ -106,7 +188,6 @@ const mp_obj_type_t displayio_bitmap_type = { { &mp_type_type }, .name = MP_QSTR_Bitmap, .make_new = displayio_bitmap_make_new, - // TODO(tannewt): Implement subscr after slices support start, stop and step tuples. - // .subscr = displayio_bitmap_subscr, + .subscr = bitmap_subscr, .locals_dict = (mp_obj_dict_t*)&displayio_bitmap_locals_dict, }; diff --git a/shared-bindings/displayio/Bitmap.h b/shared-bindings/displayio/Bitmap.h index b736f9459..90694951f 100644 --- a/shared-bindings/displayio/Bitmap.h +++ b/shared-bindings/displayio/Bitmap.h @@ -36,6 +36,10 @@ void common_hal_displayio_bitmap_construct(displayio_bitmap_t *self, uint32_t wi void common_hal_displayio_bitmap_load_row(displayio_bitmap_t *self, uint16_t y, uint8_t* data, uint16_t len); +uint16_t common_hal_displayio_bitmap_get_height(displayio_bitmap_t *self); +uint16_t common_hal_displayio_bitmap_get_width(displayio_bitmap_t *self); +uint32_t common_hal_displayio_bitmap_get_bits_per_value(displayio_bitmap_t *self); +void common_hal_displayio_bitmap_set_pixel(displayio_bitmap_t *bitmap, int16_t x, int16_t y, uint32_t value); uint32_t common_hal_displayio_bitmap_get_pixel(displayio_bitmap_t *bitmap, int16_t x, int16_t y); #endif // MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYIO_BITMAP_H diff --git a/shared-bindings/displayio/ColorConverter.c b/shared-bindings/displayio/ColorConverter.c index 670578888..561883810 100644 --- a/shared-bindings/displayio/ColorConverter.c +++ b/shared-bindings/displayio/ColorConverter.c @@ -43,8 +43,6 @@ //| //| Converts one color format to another. //| -//| .. warning:: This will be changed before 4.0.0. Consider it very experimental. -//| //| .. class:: ColorConverter() //| //| Create a ColorConverter object to convert color formats. Only supports RGB888 to RGB565 @@ -52,8 +50,8 @@ //| // TODO(tannewt): Add support for other color formats. //| -STATIC mp_obj_t displayio_colorconverter_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { - mp_arg_check_num(n_args, n_kw, 0, 0, true); +STATIC mp_obj_t displayio_colorconverter_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 0, 0, false); displayio_colorconverter_t *self = m_new_obj(displayio_colorconverter_t); self->base.type = &displayio_colorconverter_type; diff --git a/shared-bindings/displayio/Display.c b/shared-bindings/displayio/Display.c new file mode 100644 index 000000000..1f46330e8 --- /dev/null +++ b/shared-bindings/displayio/Display.c @@ -0,0 +1,310 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "shared-bindings/displayio/Display.h" + +#include <stdint.h> + +#include "lib/utils/context_manager_helpers.h" +#include "py/binary.h" +#include "py/objproperty.h" +#include "py/runtime.h" +#include "shared-bindings/displayio/Group.h" +#include "shared-bindings/microcontroller/Pin.h" +#include "shared-bindings/util.h" +#include "shared-module/displayio/__init__.h" +#include "supervisor/shared/translate.h" + +//| .. currentmodule:: displayio +//| +//| :class:`Display` -- Manage updating a display over a display bus +//| ========================================================================== +//| +//| This initializes a display and connects it into CircuitPython. Unlike other +//| objects in CircuitPython, Display objects live until `displayio.release_displays()` +//| is called. This is done so that CircuitPython can use the display itself. +//| +//| Most people should not use this class directly. Use a specific display driver instead that will +//| contain the initialization sequence at minimum. +//| +//| .. class:: Display(display_bus, init_sequence, *, width, height, colstart=0, rowstart=0, rotation=0, color_depth=16, set_column_command=0x2a, set_row_command=0x2b, write_ram_command=0x2c, set_vertical_scroll=0, backlight_pin=None) +//| +//| Create a Display object on the given display bus (`displayio.FourWire` or `displayio.ParallelBus`). +//| +//| The ``init_sequence`` is bitpacked to minimize the ram impact. Every command begins with a +//| command byte followed by a byte to determine the parameter count and if a delay is need after. +//| When the top bit of the second byte is 1, the next byte will be the delay time in milliseconds. +//| The remaining 7 bits are the parameter count excluding any delay byte. The third through final +//| bytes are the remaining command parameters. The next byte will begin a new command definition. +//| Here is a portion of ILI9341 init code: +//| +//| .. code-block:: python +//| +//| init_sequence = (b"\xe1\x0f\x00\x0E\x14\x03\x11\x07\x31\xC1\x48\x08\x0F\x0C\x31\x36\x0F" # Set Gamma +//| b"\x11\x80\x78"# Exit Sleep then delay 0x78 (120ms) +//| b"\x29\x80\x78"# Display on then delay 0x78 (120ms) +//| ) +//| display = displayio.Display(display_bus, init_sequence, width=320, height=240) +//| +//| The first command is 0xe1 with 15 (0xf) parameters following. The second and third are 0x11 and +//| 0x29 respectively with delays (0x80) of 120ms (0x78) and no parameters. Multiple byte literals +//| (b"") are merged together on load. The parens are needed to allow byte literals on subsequent +//| lines. +//| +//| The initialization sequence should always leave the display memory access inline with the scan +//| of the display to minimize tearing artifacts. +//| +//| :param displayio.FourWire or displayio.ParallelBus display_bus: The bus that the display is connected to +//| :param buffer init_sequence: Byte-packed initialization sequence. +//| :param int width: Width in pixels +//| :param int height: Height in pixels +//| :param int colstart: The index if the first visible column +//| :param int rowstart: The index if the first visible row +//| :param int rotation: The rotation of the display in degrees clockwise. Must be in 90 degree increments (0, 90, 180, 270) +//| :param int color_depth: The number of bits of color per pixel transmitted. (Some displays +//| support 18 bit but 16 is easier to transmit. The last bit is extrapolated.) +//| :param int set_column_command: Command used to set the start and end columns to update +//| :param int set_row_command: Command used so set the start and end rows to update +//| :param int write_ram_command: Command used to write pixels values into the update region +//| :param int set_vertical_scroll: Command used to set the first row to show +//| :param microcontroller.Pin backlight_pin: Pin connected to the display's backlight +//| +STATIC mp_obj_t displayio_display_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + enum { ARG_display_bus, ARG_init_sequence, ARG_width, ARG_height, ARG_colstart, ARG_rowstart, ARG_rotation, ARG_color_depth, ARG_set_column_command, ARG_set_row_command, ARG_write_ram_command, ARG_set_vertical_scroll, ARG_backlight_pin }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_display_bus, MP_ARG_REQUIRED | MP_ARG_OBJ }, + { MP_QSTR_init_sequence, MP_ARG_REQUIRED | MP_ARG_OBJ }, + { MP_QSTR_width, MP_ARG_INT | MP_ARG_KW_ONLY | MP_ARG_REQUIRED, }, + { MP_QSTR_height, MP_ARG_INT | MP_ARG_KW_ONLY | MP_ARG_REQUIRED, }, + { MP_QSTR_colstart, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0} }, + { MP_QSTR_rowstart, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0} }, + { MP_QSTR_rotation, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0} }, + { MP_QSTR_color_depth, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 16} }, + { MP_QSTR_set_column_command, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0x2a} }, + { MP_QSTR_set_row_command, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0x2b} }, + { MP_QSTR_write_ram_command, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0x2c} }, + { MP_QSTR_set_vertical_scroll, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0x0} }, + { MP_QSTR_backlight_pin, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = mp_const_none} }, + }; + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + mp_obj_t display_bus = args[ARG_display_bus].u_obj; + + mp_buffer_info_t bufinfo; + mp_get_buffer_raise(args[ARG_init_sequence].u_obj, &bufinfo, MP_BUFFER_READ); + + mp_obj_t backlight_pin_obj = args[ARG_backlight_pin].u_obj; + assert_pin(backlight_pin_obj, true); + const mcu_pin_obj_t* backlight_pin = NULL; + if (backlight_pin_obj != NULL && backlight_pin_obj != mp_const_none) { + backlight_pin = MP_OBJ_TO_PTR(backlight_pin_obj); + assert_pin_free(backlight_pin); + } + mp_int_t rotation = args[ARG_rotation].u_int; + if (rotation % 90 != 0) { + mp_raise_ValueError(translate("Display rotation must be in 90 degree increments")); + } + + displayio_display_obj_t *self = NULL; + for (uint8_t i = 0; i < CIRCUITPY_DISPLAY_LIMIT; i++) { + if (displays[i].display.base.type == NULL || + displays[i].display.base.type == &mp_type_NoneType) { + self = &displays[i].display; + break; + } + } + if (self == NULL) { + mp_raise_RuntimeError(translate("Too many displays")); + } + self->base.type = &displayio_display_type; + common_hal_displayio_display_construct(self, + display_bus, args[ARG_width].u_int, args[ARG_height].u_int, args[ARG_colstart].u_int, args[ARG_rowstart].u_int, rotation, + args[ARG_color_depth].u_int, args[ARG_set_column_command].u_int, args[ARG_set_row_command].u_int, + args[ARG_write_ram_command].u_int, + args[ARG_set_vertical_scroll].u_int, + bufinfo.buf, bufinfo.len, MP_OBJ_TO_PTR(backlight_pin)); + + return self; +} + +//| .. method:: show(group) +//| +//| Switches to displaying the given group of layers. When group is None, the default +//| CircuitPython terminal will be shown. +//| +STATIC mp_obj_t displayio_display_obj_show(mp_obj_t self_in, mp_obj_t group_in) { + displayio_display_obj_t *self = MP_OBJ_TO_PTR(self_in); + displayio_group_t* group = NULL; + if (group_in != mp_const_none) { + mp_obj_t native_layer = mp_instance_cast_to_native_base(group_in, &displayio_group_type); + if (native_layer == MP_OBJ_NULL) { + mp_raise_ValueError(translate("Must be a Group subclass.")); + } + group = MP_OBJ_TO_PTR(native_layer); + } + + common_hal_displayio_display_show(self, group); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(displayio_display_show_obj, displayio_display_obj_show); + +//| .. method:: refresh_soon() +//| +//| Queues up a display refresh that happens in the background. +//| +STATIC mp_obj_t displayio_display_obj_refresh_soon(mp_obj_t self_in) { + displayio_display_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_displayio_display_refresh_soon(self); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_1(displayio_display_refresh_soon_obj, displayio_display_obj_refresh_soon); + +//| .. method:: wait_for_frame() +//| +//| Waits until the next frame has been transmitted to the display unless the wait count is +//| behind the rendered frames. In that case, this will return immediately with the wait count. +//| +STATIC mp_obj_t displayio_display_obj_wait_for_frame(mp_obj_t self_in) { + displayio_display_obj_t *self = MP_OBJ_TO_PTR(self_in); + return MP_OBJ_NEW_SMALL_INT(common_hal_displayio_display_wait_for_frame(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(displayio_display_wait_for_frame_obj, displayio_display_obj_wait_for_frame); + +//| .. attribute:: brightness +//| +//| The brightness of the display as a float. 0.0 is off and 1.0 is full brightness. When +//| `auto_brightness` is True this value will change automatically and setting it will have no +//| effect. To control the brightness, auto_brightness must be false. +//| +STATIC mp_obj_t displayio_display_obj_get_brightness(mp_obj_t self_in) { + displayio_display_obj_t *self = MP_OBJ_TO_PTR(self_in); + mp_float_t brightness = common_hal_displayio_display_get_brightness(self); + if (brightness < 0) { + mp_raise_RuntimeError(translate("Brightness not adjustable")); + } + return mp_obj_new_float(brightness); +} +MP_DEFINE_CONST_FUN_OBJ_1(displayio_display_get_brightness_obj, displayio_display_obj_get_brightness); + +STATIC mp_obj_t displayio_display_obj_set_brightness(mp_obj_t self_in, mp_obj_t brightness) { + displayio_display_obj_t *self = MP_OBJ_TO_PTR(self_in); + bool ok = common_hal_displayio_display_set_brightness(self, mp_obj_get_float(brightness)); + if (!ok) { + mp_raise_RuntimeError(translate("Brightness not adjustable")); + } + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(displayio_display_set_brightness_obj, displayio_display_obj_set_brightness); + +const mp_obj_property_t displayio_display_brightness_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&displayio_display_get_brightness_obj, + (mp_obj_t)&displayio_display_set_brightness_obj, + (mp_obj_t)&mp_const_none_obj}, +}; + +//| .. attribute:: auto_brightness +//| +//| True when the display brightness is auto adjusted. +//| +STATIC mp_obj_t displayio_display_obj_get_auto_brightness(mp_obj_t self_in) { + displayio_display_obj_t *self = MP_OBJ_TO_PTR(self_in); + return mp_obj_new_bool(common_hal_displayio_display_get_auto_brightness(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(displayio_display_get_auto_brightness_obj, displayio_display_obj_get_auto_brightness); + +STATIC mp_obj_t displayio_display_obj_set_auto_brightness(mp_obj_t self_in, mp_obj_t auto_brightness) { + displayio_display_obj_t *self = MP_OBJ_TO_PTR(self_in); + + common_hal_displayio_display_set_auto_brightness(self, mp_obj_is_true(auto_brightness)); + + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(displayio_display_set_auto_brightness_obj, displayio_display_obj_set_auto_brightness); + +const mp_obj_property_t displayio_display_auto_brightness_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&displayio_display_get_auto_brightness_obj, + (mp_obj_t)&displayio_display_set_auto_brightness_obj, + (mp_obj_t)&mp_const_none_obj}, +}; + +//| .. attribute:: width +//| +//| Gets the width of the board +//| +//| +STATIC mp_obj_t displayio_display_obj_get_width(mp_obj_t self_in) { + displayio_display_obj_t *self = MP_OBJ_TO_PTR(self_in); + return MP_OBJ_NEW_SMALL_INT(common_hal_displayio_display_get_width(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(displayio_display_get_width_obj, displayio_display_obj_get_width); + +const mp_obj_property_t displayio_display_width_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&displayio_display_get_width_obj, + (mp_obj_t)&mp_const_none_obj, + (mp_obj_t)&mp_const_none_obj}, +}; + +//| .. attribute:: height +//| +//| Gets the height of the board +//| +//| +STATIC mp_obj_t displayio_display_obj_get_height(mp_obj_t self_in) { + displayio_display_obj_t *self = MP_OBJ_TO_PTR(self_in); + return MP_OBJ_NEW_SMALL_INT(common_hal_displayio_display_get_height(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(displayio_display_get_height_obj, displayio_display_obj_get_height); + +const mp_obj_property_t displayio_display_height_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&displayio_display_get_height_obj, + (mp_obj_t)&mp_const_none_obj, + (mp_obj_t)&mp_const_none_obj}, +}; + +STATIC const mp_rom_map_elem_t displayio_display_locals_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_show), MP_ROM_PTR(&displayio_display_show_obj) }, + { MP_ROM_QSTR(MP_QSTR_refresh_soon), MP_ROM_PTR(&displayio_display_refresh_soon_obj) }, + { MP_ROM_QSTR(MP_QSTR_wait_for_frame), MP_ROM_PTR(&displayio_display_wait_for_frame_obj) }, + + { MP_ROM_QSTR(MP_QSTR_brightness), MP_ROM_PTR(&displayio_display_brightness_obj) }, + { MP_ROM_QSTR(MP_QSTR_auto_brightness), MP_ROM_PTR(&displayio_display_auto_brightness_obj) }, + + { MP_ROM_QSTR(MP_QSTR_width), MP_ROM_PTR(&displayio_display_width_obj) }, + { MP_ROM_QSTR(MP_QSTR_height), MP_ROM_PTR(&displayio_display_height_obj) }, +}; +STATIC MP_DEFINE_CONST_DICT(displayio_display_locals_dict, displayio_display_locals_dict_table); + +const mp_obj_type_t displayio_display_type = { + { &mp_type_type }, + .name = MP_QSTR_Display, + .make_new = displayio_display_make_new, + .locals_dict = (mp_obj_dict_t*)&displayio_display_locals_dict, +}; diff --git a/shared-bindings/displayio/Display.h b/shared-bindings/displayio/Display.h new file mode 100644 index 000000000..7d6444a2d --- /dev/null +++ b/shared-bindings/displayio/Display.h @@ -0,0 +1,70 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2017, 2018 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYBUSIO_DISPLAY_H +#define MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYBUSIO_DISPLAY_H + +#include "common-hal/microcontroller/Pin.h" + +#include "shared-module/displayio/Display.h" +#include "shared-module/displayio/Group.h" + +extern const mp_obj_type_t displayio_display_type; + +#define DELAY 0x80 + +void common_hal_displayio_display_construct(displayio_display_obj_t* self, + mp_obj_t bus, uint16_t width, uint16_t height, + int16_t colstart, int16_t rowstart, uint16_t rotation, uint16_t color_depth, + uint8_t set_column_command, uint8_t set_row_command, uint8_t write_ram_command, uint8_t set_vertical_scroll, + uint8_t* init_sequence, uint16_t init_sequence_len, const mcu_pin_obj_t* backlight_pin); + +int32_t common_hal_displayio_display_wait_for_frame(displayio_display_obj_t* self); + +void common_hal_displayio_display_show(displayio_display_obj_t* self, displayio_group_t* root_group); + +void common_hal_displayio_display_refresh_soon(displayio_display_obj_t* self); + +bool displayio_display_begin_transaction(displayio_display_obj_t* self); +void displayio_display_end_transaction(displayio_display_obj_t* self); + +void displayio_display_set_region_to_update(displayio_display_obj_t* self, uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1); +bool displayio_display_frame_queued(displayio_display_obj_t* self); + +bool displayio_display_refresh_queued(displayio_display_obj_t* self); +void displayio_display_finish_refresh(displayio_display_obj_t* self); +void displayio_display_send_pixels(displayio_display_obj_t* self, uint32_t* pixels, uint32_t length); + +bool common_hal_displayio_display_get_auto_brightness(displayio_display_obj_t* self); +void common_hal_displayio_display_set_auto_brightness(displayio_display_obj_t* self, bool auto_brightness); + +uint16_t common_hal_displayio_display_get_width(displayio_display_obj_t* self); +uint16_t common_hal_displayio_display_get_height(displayio_display_obj_t* self); + +mp_float_t common_hal_displayio_display_get_brightness(displayio_display_obj_t* self); +bool common_hal_displayio_display_set_brightness(displayio_display_obj_t* self, mp_float_t brightness); + +#endif // MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYBUSIO_DISPLAY_H diff --git a/shared-bindings/displayio/FourWire.c b/shared-bindings/displayio/FourWire.c index c0d60bd3b..8ffe54be0 100644 --- a/shared-bindings/displayio/FourWire.c +++ b/shared-bindings/displayio/FourWire.c @@ -3,7 +3,7 @@ * * The MIT License (MIT) * - * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries + * Copyright (c) 2018-2019 Scott Shawcroft for Adafruit Industries * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -32,8 +32,10 @@ #include "py/binary.h" #include "py/objproperty.h" #include "py/runtime.h" +#include "shared-bindings/displayio/Group.h" #include "shared-bindings/microcontroller/Pin.h" #include "shared-bindings/util.h" +#include "shared-module/displayio/__init__.h" #include "supervisor/shared/translate.h" //| .. currentmodule:: displayio @@ -44,69 +46,91 @@ //| Manage updating a display over SPI four wire protocol in the background while Python code runs. //| It doesn't handle display initialization. //| -//| .. warning:: This will be changed before 4.0.0. Consider it very experimental. -//| -//| .. class:: FourWire(*, clock, data, command, chip_select, width, height, colstart, rowstart, -//| color_depth, set_column_command, set_row_command, write_ram_command) +//| .. class:: FourWire(spi_bus, *, command, chip_select, reset=None) //| //| Create a FourWire object associated with the given pins. //| -STATIC mp_obj_t displayio_fourwire_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { - mp_raise_NotImplementedError(translate("displayio is a work in progress")); - return mp_const_none; -} - - -//| .. method:: send(command, data) +//| The SPI bus and pins are then in use by the display until `displayio.release_displays()` is +//| called even after a reload. (It does this so CircuitPython can use the display after your code +//| is done.) So, the first time you initialize a display bus in code.py you should call +//| :py:func`displayio.release_displays` first, otherwise it will error after the first code.py run. //| +//| :param busio.SPI spi_bus: The SPI bus that make up the clock and data lines +//| :param microcontroller.Pin command: Data or command pin +//| :param microcontroller.Pin chip_select: Chip select pin +//| :param microcontroller.Pin reset: Reset pin. When None only software reset can be used //| -STATIC mp_obj_t displayio_fourwire_obj_send(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { - mp_raise_NotImplementedError(translate("displayio is a work in progress")); +STATIC mp_obj_t displayio_fourwire_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + enum { ARG_spi_bus, ARG_command, ARG_chip_select, ARG_reset }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_spi_bus, MP_ARG_REQUIRED | MP_ARG_OBJ }, + { MP_QSTR_command, MP_ARG_OBJ | MP_ARG_KW_ONLY | MP_ARG_REQUIRED }, + { MP_QSTR_chip_select, MP_ARG_OBJ | MP_ARG_KW_ONLY | MP_ARG_REQUIRED }, + { MP_QSTR_reset, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = mp_const_none} }, + }; + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); - return mp_const_none; -} -MP_DEFINE_CONST_FUN_OBJ_KW(displayio_fourwire_send_obj, 1, displayio_fourwire_obj_send); + mp_obj_t command = args[ARG_command].u_obj; + mp_obj_t chip_select = args[ARG_chip_select].u_obj; + assert_pin_free(command); + assert_pin_free(chip_select); + mp_obj_t reset = args[ARG_reset].u_obj; + if (reset != mp_const_none) { + assert_pin_free(reset); + } else { + reset = NULL; + } -//| .. method:: show(group) -//| -//| Switches do displaying the given group of elements. -//| -STATIC mp_obj_t displayio_fourwire_obj_show(mp_obj_t self_in, mp_obj_t group_in) { - displayio_fourwire_obj_t *self = MP_OBJ_TO_PTR(self_in); - displayio_group_t* group = MP_OBJ_TO_PTR(group_in); - common_hal_displayio_fourwire_show(self, group); - return mp_const_none; -} -MP_DEFINE_CONST_FUN_OBJ_2(displayio_fourwire_show_obj, displayio_fourwire_obj_show); + displayio_fourwire_obj_t* self = NULL; + mp_obj_t spi = args[ARG_spi_bus].u_obj; + for (uint8_t i = 0; i < CIRCUITPY_DISPLAY_LIMIT; i++) { + if (displays[i].fourwire_bus.base.type == NULL || + displays[i].fourwire_bus.base.type == &mp_type_NoneType) { + self = &displays[i].fourwire_bus; + self->base.type = &displayio_fourwire_type; + break; + } + } + if (self == NULL) { + mp_raise_RuntimeError(translate("Too many display busses")); + } -//| .. method:: refresh_soon() -//| -//| Queues up a display refresh that happens in the background. -//| -STATIC mp_obj_t displayio_fourwire_obj_refresh_soon(mp_obj_t self_in) { - displayio_fourwire_obj_t *self = MP_OBJ_TO_PTR(self_in); - common_hal_displayio_fourwire_refresh_soon(self); - return mp_const_none; + common_hal_displayio_fourwire_construct(self, + MP_OBJ_TO_PTR(spi), command, chip_select, reset); + return self; } -MP_DEFINE_CONST_FUN_OBJ_1(displayio_fourwire_refresh_soon_obj, displayio_fourwire_obj_refresh_soon); -//| .. method:: wait_for_frame() +//| .. method:: send(command, data) //| -//| Waits until the next frame has been transmitted to the display unless the wait count is -//| behind the rendered frames. In that case, this will return immediately with the wait count. +//| Sends the given command value followed by the full set of data. Display state, such as +//| vertical scroll, set via ``send`` may or may not be reset once the code is done. //| -STATIC mp_obj_t displayio_fourwire_obj_wait_for_frame(mp_obj_t self_in) { - displayio_fourwire_obj_t *self = MP_OBJ_TO_PTR(self_in); - return MP_OBJ_NEW_SMALL_INT(common_hal_displayio_fourwire_wait_for_frame(self)); -} -MP_DEFINE_CONST_FUN_OBJ_1(displayio_fourwire_wait_for_frame_obj, displayio_fourwire_obj_wait_for_frame); +STATIC mp_obj_t displayio_fourwire_obj_send(mp_obj_t self, mp_obj_t command_obj, mp_obj_t data_obj) { + mp_int_t command_int = MP_OBJ_SMALL_INT_VALUE(command_obj); + if (!MP_OBJ_IS_SMALL_INT(command_obj) || command_int > 255 || command_int < 0) { + mp_raise_ValueError(translate("Command must be an int between 0 and 255")); + } + uint8_t command = command_int; + mp_buffer_info_t bufinfo; + mp_get_buffer_raise(data_obj, &bufinfo, MP_BUFFER_READ); + + // Wait for display bus to be available. + while (!common_hal_displayio_fourwire_begin_transaction(self)) { +#ifdef MICROPY_VM_HOOK_LOOP + MICROPY_VM_HOOK_LOOP ; +#endif + } + common_hal_displayio_fourwire_send(self, true, &command, 1); + common_hal_displayio_fourwire_send(self, false, ((uint8_t*) bufinfo.buf), bufinfo.len); + common_hal_displayio_fourwire_end_transaction(self); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_3(displayio_fourwire_send_obj, displayio_fourwire_obj_send); STATIC const mp_rom_map_elem_t displayio_fourwire_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_send), MP_ROM_PTR(&displayio_fourwire_send_obj) }, - { MP_ROM_QSTR(MP_QSTR_show), MP_ROM_PTR(&displayio_fourwire_show_obj) }, - { MP_ROM_QSTR(MP_QSTR_refresh_soon), MP_ROM_PTR(&displayio_fourwire_refresh_soon_obj) }, - { MP_ROM_QSTR(MP_QSTR_wait_for_frame), MP_ROM_PTR(&displayio_fourwire_wait_for_frame_obj) }, }; STATIC MP_DEFINE_CONST_DICT(displayio_fourwire_locals_dict, displayio_fourwire_locals_dict_table); diff --git a/shared-bindings/displayio/FourWire.h b/shared-bindings/displayio/FourWire.h index fc51f558d..b8b00372c 100644 --- a/shared-bindings/displayio/FourWire.h +++ b/shared-bindings/displayio/FourWire.h @@ -27,39 +27,24 @@ #ifndef MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYBUSIO_FOURWIRE_H #define MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYBUSIO_FOURWIRE_H -#include "common-hal/displayio/FourWire.h" +#include "shared-module/displayio/FourWire.h" #include "common-hal/microcontroller/Pin.h" #include "shared-module/displayio/Group.h" +#include "supervisor/shared/board_busses.h" extern const mp_obj_type_t displayio_fourwire_type; -// TODO(tannewt): Split this apart into FourWire and a Display object because the dimensions and -// commands are also used for the parallel buses. void common_hal_displayio_fourwire_construct(displayio_fourwire_obj_t* self, - const mcu_pin_obj_t* clock, const mcu_pin_obj_t* data, const mcu_pin_obj_t* command, - const mcu_pin_obj_t* chip_select, const mcu_pin_obj_t* reset, uint16_t width, uint16_t height, - int16_t colstart, int16_t rowstart, uint16_t color_depth, - uint8_t set_column_command, uint8_t set_row_command, uint8_t write_ram_command); + busio_spi_obj_t* spi, const mcu_pin_obj_t* command, + const mcu_pin_obj_t* chip_select, const mcu_pin_obj_t* reset); -int32_t common_hal_displayio_fourwire_wait_for_frame(displayio_fourwire_obj_t* self); +void common_hal_displayio_fourwire_deinit(displayio_fourwire_obj_t* self); -bool common_hal_displayio_fourwire_begin_transaction(displayio_fourwire_obj_t* self); +bool common_hal_displayio_fourwire_begin_transaction(mp_obj_t self); -void common_hal_displayio_fourwire_send(displayio_fourwire_obj_t* self, bool command, uint8_t *data, uint32_t data_length); +void common_hal_displayio_fourwire_send(mp_obj_t self, bool command, uint8_t *data, uint32_t data_length); -void common_hal_displayio_fourwire_end_transaction(displayio_fourwire_obj_t* self); - -void common_hal_displayio_fourwire_show(displayio_fourwire_obj_t* self, displayio_group_t* root_group); - -void common_hal_displayio_fourwire_refresh_soon(displayio_fourwire_obj_t* self); - -void displayio_fourwire_start_region_update(displayio_fourwire_obj_t* self, uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1); -void displayio_fourwire_finish_region_update(displayio_fourwire_obj_t* self); -bool displayio_fourwire_frame_queued(displayio_fourwire_obj_t* self); - -bool displayio_fourwire_refresh_queued(displayio_fourwire_obj_t* self); -void displayio_fourwire_finish_refresh(displayio_fourwire_obj_t* self); -bool displayio_fourwire_send_pixels(displayio_fourwire_obj_t* self, uint32_t* pixels, uint32_t length); +void common_hal_displayio_fourwire_end_transaction(mp_obj_t self); #endif // MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYBUSIO_FOURWIRE_H diff --git a/shared-bindings/displayio/Group.c b/shared-bindings/displayio/Group.c index 98257673b..c7a72891a 100644 --- a/shared-bindings/displayio/Group.c +++ b/shared-bindings/displayio/Group.c @@ -41,60 +41,241 @@ //| //| Manage a group of sprites and groups and how they are inter-related. //| -//| .. warning:: This will be changed before 4.0.0. Consider it very experimental. +//| .. class:: Group(*, max_size=4, scale=1, x=0, y=0) //| -//| .. class:: Group(*, max_size=4) -//| -//| Create a Group of a given size. +//| Create a Group of a given size and scale. Scale is in one dimension. For example, scale=2 +//| leads to a layer's pixel being 2x2 pixels when in the group. //| //| :param int max_size: The maximum group size. +//| :param int scale: Scale of layer pixels in one dimension. +//| :param int x: Initial x position within the parent. +//| :param int y: Initial y position within the parent. //| -STATIC mp_obj_t displayio_group_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { - mp_arg_check_num(n_args, n_kw, 0, 0, true); - mp_map_t kw_args; - mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); - enum { ARG_max_size }; +STATIC mp_obj_t displayio_group_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + enum { ARG_max_size, ARG_scale, ARG_x, ARG_y }; static const mp_arg_t allowed_args[] = { { MP_QSTR_max_size, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 4} }, + { MP_QSTR_scale, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 1} }, + { MP_QSTR_x, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0} }, + { MP_QSTR_y, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0} }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all(n_args, pos_args, &kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); mp_int_t max_size = args[ARG_max_size].u_int; if (max_size < 1) { - mp_raise_ValueError(translate("Group must have size at least 1")); + mp_raise_ValueError_varg(translate("%q must be >= 1"), MP_QSTR_max_size); + } + + mp_int_t scale = args[ARG_scale].u_int; + if (scale < 1) { + mp_raise_ValueError_varg(translate("%q must be >= 1"), MP_QSTR_scale); } displayio_group_t *self = m_new_obj(displayio_group_t); self->base.type = &displayio_group_type; - common_hal_displayio_group_construct(self, max_size); + common_hal_displayio_group_construct(self, max_size, scale, args[ARG_x].u_int, args[ARG_y].u_int); return MP_OBJ_FROM_PTR(self); } +// Helper to ensure we have the native super class instead of a subclass. +static displayio_group_t* native_group(mp_obj_t group_obj) { + mp_obj_t native_group = mp_instance_cast_to_native_base(group_obj, &displayio_group_type); + return MP_OBJ_TO_PTR(native_group); +} + +//| .. attribute:: scale +//| +//| Scales each pixel within the Group in both directions. For example, when scale=2 each pixel +//| will be represented by 2x2 pixels. +//| +STATIC mp_obj_t displayio_group_obj_get_scale(mp_obj_t self_in) { + displayio_group_t *self = native_group(self_in); + return MP_OBJ_NEW_SMALL_INT(common_hal_displayio_group_get_scale(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(displayio_group_get_scale_obj, displayio_group_obj_get_scale); + +STATIC mp_obj_t displayio_group_obj_set_scale(mp_obj_t self_in, mp_obj_t scale_obj) { + displayio_group_t *self = native_group(self_in); + + mp_int_t scale = mp_obj_get_int(scale_obj); + if (scale < 1) { + mp_raise_ValueError_varg(translate("%q must be >= 1"), MP_QSTR_scale); + } + common_hal_displayio_group_set_scale(self, scale); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(displayio_group_set_scale_obj, displayio_group_obj_set_scale); + +const mp_obj_property_t displayio_group_scale_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&displayio_group_get_scale_obj, + (mp_obj_t)&displayio_group_set_scale_obj, + (mp_obj_t)&mp_const_none_obj}, +}; + +//| .. attribute:: x +//| +//| X position of the Group in the parent. +//| +STATIC mp_obj_t displayio_group_obj_get_x(mp_obj_t self_in) { + displayio_group_t *self = native_group(self_in); + return MP_OBJ_NEW_SMALL_INT(common_hal_displayio_group_get_x(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(displayio_group_get_x_obj, displayio_group_obj_get_x); + +STATIC mp_obj_t displayio_group_obj_set_x(mp_obj_t self_in, mp_obj_t x_obj) { + displayio_group_t *self = native_group(self_in); + + mp_int_t x = mp_obj_get_int(x_obj); + common_hal_displayio_group_set_x(self, x); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(displayio_group_set_x_obj, displayio_group_obj_set_x); + +const mp_obj_property_t displayio_group_x_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&displayio_group_get_x_obj, + (mp_obj_t)&displayio_group_set_x_obj, + (mp_obj_t)&mp_const_none_obj}, +}; + +//| .. attribute:: y +//| +//| Y position of the Group in the parent. +//| +STATIC mp_obj_t displayio_group_obj_get_y(mp_obj_t self_in) { + displayio_group_t *self = native_group(self_in); + return MP_OBJ_NEW_SMALL_INT(common_hal_displayio_group_get_y(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(displayio_group_get_y_obj, displayio_group_obj_get_y); + +STATIC mp_obj_t displayio_group_obj_set_y(mp_obj_t self_in, mp_obj_t y_obj) { + displayio_group_t *self = native_group(self_in); + + mp_int_t y = mp_obj_get_int(y_obj); + common_hal_displayio_group_set_y(self, y); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(displayio_group_set_y_obj, displayio_group_obj_set_y); + +const mp_obj_property_t displayio_group_y_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&displayio_group_get_y_obj, + (mp_obj_t)&displayio_group_set_y_obj, + (mp_obj_t)&mp_const_none_obj}, +}; + //| .. method:: append(layer) //| //| Append a layer to the group. It will be drawn above other layers. //| STATIC mp_obj_t displayio_group_obj_append(mp_obj_t self_in, mp_obj_t layer) { - displayio_group_t *self = MP_OBJ_TO_PTR(self_in); - common_hal_displayio_group_append(self, layer); + displayio_group_t *self = native_group(self_in); + common_hal_displayio_group_insert(self, common_hal_displayio_group_get_len(self), layer); return mp_const_none; } MP_DEFINE_CONST_FUN_OBJ_2(displayio_group_append_obj, displayio_group_obj_append); -//| .. method:: pop() +//| .. method:: insert(index, layer) +//| +//| Insert a layer into the group. +//| +STATIC mp_obj_t displayio_group_obj_insert(mp_obj_t self_in, mp_obj_t index_obj, mp_obj_t layer) { + displayio_group_t *self = native_group(self_in); + size_t index = mp_get_index(&displayio_group_type, common_hal_displayio_group_get_len(self), index_obj, false); + common_hal_displayio_group_insert(self, index, layer); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_3(displayio_group_insert_obj, displayio_group_obj_insert); + +//| .. method:: pop(i=-1) +//| +//| Remove the ith item and return it. +//| +STATIC mp_obj_t displayio_group_obj_pop(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + enum { ARG_i }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_i, MP_ARG_INT, {.u_int = -1} }, + }; + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + displayio_group_t *self = native_group(pos_args[0]); + + size_t index = mp_get_index(&displayio_group_type, + common_hal_displayio_group_get_len(self), + MP_OBJ_NEW_SMALL_INT(args[ARG_i].u_int), + false); + return common_hal_displayio_group_pop(self, index); +} +MP_DEFINE_CONST_FUN_OBJ_KW(displayio_group_pop_obj, 1, displayio_group_obj_pop); + +//| .. method:: __len__() +//| +//| Returns the number of layers in a Group +//| +STATIC mp_obj_t group_unary_op(mp_unary_op_t op, mp_obj_t self_in) { + displayio_group_t *self = native_group(self_in); + uint16_t len = common_hal_displayio_group_get_len(self); + switch (op) { + case MP_UNARY_OP_BOOL: return mp_obj_new_bool(len != 0); + case MP_UNARY_OP_LEN: return MP_OBJ_NEW_SMALL_INT(len); + default: return MP_OBJ_NULL; // op not supported + } +} + +//| .. method:: __getitem__(index) +//| +//| Returns the value at the given index. +//| +//| This allows you to:: +//| +//| print(group[0]) +//| +//| .. method:: __setitem__(index, value) +//| +//| Sets the value at the given index. +//| +//| This allows you to:: //| -//| Remove the last item and return it. +//| group[0] = sprite //| -STATIC mp_obj_t displayio_group_obj_pop(mp_obj_t self_in) { - displayio_group_t *self = MP_OBJ_TO_PTR(self_in); - return common_hal_displayio_group_pop(self); +//| .. method:: __delitem__(index) +//| +//| Deletes the value at the given index. +//| +//| This allows you to:: +//| +//| del group[0] +//| +STATIC mp_obj_t group_subscr(mp_obj_t self_in, mp_obj_t index_obj, mp_obj_t value) { + displayio_group_t *self = native_group(self_in); + + if (MP_OBJ_IS_TYPE(index_obj, &mp_type_slice)) { + mp_raise_NotImplementedError(translate("Slices not supported")); + } else { + size_t index = mp_get_index(&displayio_group_type, common_hal_displayio_group_get_len(self), index_obj, false); + + if (value == MP_OBJ_SENTINEL) { + // load + return common_hal_displayio_group_get(self, index); + } else if (value == mp_const_none) { + common_hal_displayio_group_pop(self, index); + } else { + common_hal_displayio_group_set(self, index, value); + } + } + return mp_const_none; } -MP_DEFINE_CONST_FUN_OBJ_1(displayio_group_pop_obj, displayio_group_obj_pop); STATIC const mp_rom_map_elem_t displayio_group_locals_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_scale), MP_ROM_PTR(&displayio_group_scale_obj) }, + { MP_ROM_QSTR(MP_QSTR_x), MP_ROM_PTR(&displayio_group_x_obj) }, + { MP_ROM_QSTR(MP_QSTR_y), MP_ROM_PTR(&displayio_group_y_obj) }, { MP_ROM_QSTR(MP_QSTR_append), MP_ROM_PTR(&displayio_group_append_obj) }, + { MP_ROM_QSTR(MP_QSTR_insert), MP_ROM_PTR(&displayio_group_insert_obj) }, { MP_ROM_QSTR(MP_QSTR_pop), MP_ROM_PTR(&displayio_group_pop_obj) }, }; STATIC MP_DEFINE_CONST_DICT(displayio_group_locals_dict, displayio_group_locals_dict_table); @@ -103,5 +284,7 @@ const mp_obj_type_t displayio_group_type = { { &mp_type_type }, .name = MP_QSTR_Group, .make_new = displayio_group_make_new, + .subscr = group_subscr, + .unary_op = group_unary_op, .locals_dict = (mp_obj_dict_t*)&displayio_group_locals_dict, }; diff --git a/shared-bindings/displayio/Group.h b/shared-bindings/displayio/Group.h index a85098e6d..fa3c32964 100644 --- a/shared-bindings/displayio/Group.h +++ b/shared-bindings/displayio/Group.h @@ -32,8 +32,18 @@ extern const mp_obj_type_t displayio_group_type; -void common_hal_displayio_group_construct(displayio_group_t* self, uint32_t max_size); +void common_hal_displayio_group_construct(displayio_group_t* self, uint32_t max_size, uint32_t scale, mp_int_t x, mp_int_t y); +uint32_t common_hal_displayio_group_get_scale(displayio_group_t* self); +void common_hal_displayio_group_set_scale(displayio_group_t* self, uint32_t scale); +mp_int_t common_hal_displayio_group_get_x(displayio_group_t* self); +void common_hal_displayio_group_set_x(displayio_group_t* self, mp_int_t x); +mp_int_t common_hal_displayio_group_get_y(displayio_group_t* self); +void common_hal_displayio_group_set_y(displayio_group_t* self, mp_int_t y); void common_hal_displayio_group_append(displayio_group_t* self, mp_obj_t layer); -mp_obj_t common_hal_displayio_group_pop(displayio_group_t* self); +void common_hal_displayio_group_insert(displayio_group_t* self, size_t index, mp_obj_t layer); +size_t common_hal_displayio_group_get_len(displayio_group_t* self); +mp_obj_t common_hal_displayio_group_pop(displayio_group_t* self, size_t index); +mp_obj_t common_hal_displayio_group_get(displayio_group_t* self, size_t index); +void common_hal_displayio_group_set(displayio_group_t* self, size_t index, mp_obj_t layer); #endif // MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYIO_GROUP_H diff --git a/shared-bindings/displayio/OnDiskBitmap.c b/shared-bindings/displayio/OnDiskBitmap.c index d3d413da1..bf00ef855 100644 --- a/shared-bindings/displayio/OnDiskBitmap.c +++ b/shared-bindings/displayio/OnDiskBitmap.c @@ -29,7 +29,9 @@ #include <stdint.h> #include "py/runtime.h" +#include "py/objproperty.h" #include "supervisor/shared/translate.h" +#include "shared-bindings/displayio/OnDiskBitmap.h" //| .. currentmodule:: displayio //| @@ -40,8 +42,6 @@ //| much slower pixel load times. These load times may result in frame tearing where only part of //| the image is visible. //| -//| .. warning:: This will likely be changed before 4.0.0. Consider it very experimental. -//| //| It's easiest to use on a board with a built in display such as the `Hallowing M0 Express //| <https://www.adafruit.com/product/3900>`_. //| @@ -52,21 +52,22 @@ //| import time //| import pulseio //| -//| backlight = pulseio.PWMOut(board.TFT_BACKLIGHT) +//| board.DISPLAY.auto_brightness = False +//| board.DISPLAY.brightness = 0 //| splash = displayio.Group() //| board.DISPLAY.show(splash) //| //| with open("/sample.bmp", "rb") as f: //| odb = displayio.OnDiskBitmap(f) -//| face = displayio.Sprite(odb, pixel_shader=displayio.ColorConverter(), position=(0,0)) +//| face = displayio.TileGrid(odb, pixel_shader=displayio.ColorConverter(), position=(0,0)) //| splash.append(face) //| # Wait for the image to load. //| board.DISPLAY.wait_for_frame() //| //| # Fade up the backlight //| for i in range(100): -//| backlight.duty_cycle = i * (2 ** 15) // 100 -//| time.sleep(0.01) +//| board.DISPLAY.brightness = 0.01 * i +//| time.sleep(0.05) //| //| # Wait forever //| while True: @@ -78,8 +79,8 @@ //| //| :param file file: The open bitmap file //| -STATIC mp_obj_t displayio_ondiskbitmap_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { - mp_arg_check_num(n_args, n_kw, 1, 1, false); +STATIC mp_obj_t displayio_ondiskbitmap_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 1, 1, false); if (!MP_OBJ_IS_TYPE(pos_args[0], &mp_type_fileio)) { mp_raise_TypeError(translate("file must be a file opened in byte mode")); @@ -92,7 +93,49 @@ STATIC mp_obj_t displayio_ondiskbitmap_make_new(const mp_obj_type_t *type, size_ return MP_OBJ_FROM_PTR(self); } +//| .. attribute:: width +//| +//| Width of the bitmap. (read only) +//| +STATIC mp_obj_t displayio_ondiskbitmap_obj_get_width(mp_obj_t self_in) { + displayio_ondiskbitmap_t *self = MP_OBJ_TO_PTR(self_in); + + return MP_OBJ_NEW_SMALL_INT(common_hal_displayio_ondiskbitmap_get_width(self)); +} + +MP_DEFINE_CONST_FUN_OBJ_1(displayio_ondiskbitmap_get_width_obj, displayio_ondiskbitmap_obj_get_width); + +const mp_obj_property_t displayio_ondiskbitmap_width_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&displayio_ondiskbitmap_get_width_obj, + (mp_obj_t)&mp_const_none_obj, + (mp_obj_t)&mp_const_none_obj}, + +}; + +//| .. attribute:: height +//| +//| Height of the bitmap. (read only) +//| +STATIC mp_obj_t displayio_ondiskbitmap_obj_get_height(mp_obj_t self_in) { + displayio_ondiskbitmap_t *self = MP_OBJ_TO_PTR(self_in); + + return MP_OBJ_NEW_SMALL_INT(common_hal_displayio_ondiskbitmap_get_height(self)); +} + +MP_DEFINE_CONST_FUN_OBJ_1(displayio_ondiskbitmap_get_height_obj, displayio_ondiskbitmap_obj_get_height); + +const mp_obj_property_t displayio_ondiskbitmap_height_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&displayio_ondiskbitmap_get_height_obj, + (mp_obj_t)&mp_const_none_obj, + (mp_obj_t)&mp_const_none_obj}, + +}; + STATIC const mp_rom_map_elem_t displayio_ondiskbitmap_locals_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_height), MP_ROM_PTR(&displayio_ondiskbitmap_height_obj) }, + { MP_ROM_QSTR(MP_QSTR_width), MP_ROM_PTR(&displayio_ondiskbitmap_width_obj) }, }; STATIC MP_DEFINE_CONST_DICT(displayio_ondiskbitmap_locals_dict, displayio_ondiskbitmap_locals_dict_table); diff --git a/shared-bindings/displayio/OnDiskBitmap.h b/shared-bindings/displayio/OnDiskBitmap.h index ab8b8dcd8..9a6c81f8f 100644 --- a/shared-bindings/displayio/OnDiskBitmap.h +++ b/shared-bindings/displayio/OnDiskBitmap.h @@ -37,4 +37,7 @@ void common_hal_displayio_ondiskbitmap_construct(displayio_ondiskbitmap_t *self, uint32_t common_hal_displayio_ondiskbitmap_get_pixel(displayio_ondiskbitmap_t *bitmap, int16_t x, int16_t y); +uint16_t common_hal_displayio_ondiskbitmap_get_height(displayio_ondiskbitmap_t *self); + +uint16_t common_hal_displayio_ondiskbitmap_get_width(displayio_ondiskbitmap_t *self); #endif // MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYIO_ONDISKBITMAP_H diff --git a/shared-bindings/displayio/Palette.c b/shared-bindings/displayio/Palette.c index 7086d0ab1..799d42bef 100644 --- a/shared-bindings/displayio/Palette.c +++ b/shared-bindings/displayio/Palette.c @@ -44,8 +44,6 @@ //| Map a pixel palette_index to a full color. Colors are transformed to the display's format internally to //| save memory. //| -//| .. warning:: This will be changed before 4.0.0. Consider it very experimental. -//| //| .. class:: Palette(color_count) //| //| Create a Palette object to store a set number of colors. @@ -54,16 +52,13 @@ // TODO(tannewt): Add support for other color formats. // TODO(tannewt): Add support for 8-bit alpha blending. //| -STATIC mp_obj_t displayio_palette_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { - mp_arg_check_num(n_args, n_kw, 1, 1, true); - mp_map_t kw_args; - mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); +STATIC mp_obj_t displayio_palette_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { enum { ARG_color_count }; static const mp_arg_t allowed_args[] = { - { MP_QSTR_color_count, MP_ARG_INT | MP_ARG_REQUIRED }, + { MP_QSTR_color_count, MP_ARG_REQUIRED | MP_ARG_INT }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all(n_args, pos_args, &kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); displayio_palette_t *self = m_new_obj(displayio_palette_t); self->base.type = &displayio_palette_type; diff --git a/shared-bindings/displayio/ParallelBus.c b/shared-bindings/displayio/ParallelBus.c new file mode 100644 index 000000000..00a96d230 --- /dev/null +++ b/shared-bindings/displayio/ParallelBus.c @@ -0,0 +1,147 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "shared-bindings/displayio/ParallelBus.h" + +#include <stdint.h> + +#include "lib/utils/context_manager_helpers.h" +#include "py/binary.h" +#include "py/objproperty.h" +#include "py/runtime.h" +#include "shared-bindings/microcontroller/Pin.h" +#include "shared-bindings/util.h" +#include "shared-module/displayio/__init__.h" +#include "supervisor/shared/translate.h" + +//| .. currentmodule:: displayio +//| +//| :class:`ParallelBus` -- Manage updating a display over 8-bit parallel bus +//| ============================================================================== +//| +//| Manage updating a display over 8-bit parallel bus in the background while Python code runs. This +//| protocol may be refered to as 8080-I Series Parallel Interface in datasheets. It doesn't handle +//| display initialization. +//| +//| .. class:: ParallelBus(*, data0, command, chip_select, write, read, reset) +//| +//| Create a ParallelBus object associated with the given pins. The bus is inferred from data0 +//| by implying the next 7 additional pins on a given GPIO port. +//| +//| The parallel bus and pins are then in use by the display until `displayio.release_displays()` +//| is called even after a reload. (It does this so CircuitPython can use the display after your +//| code is done.) So, the first time you initialize a display bus in code.py you should call +//| :py:func`displayio.release_displays` first, otherwise it will error after the first code.py run. +//| +//| :param microcontroller.Pin data0: The first data pin. The rest are implied +//| :param microcontroller.Pin command: Data or command pin +//| :param microcontroller.Pin chip_select: Chip select pin +//| :param microcontroller.Pin write: Write pin +//| :param microcontroller.Pin read: Read pin +//| :param microcontroller.Pin reset: Reset pin +//| +STATIC mp_obj_t displayio_parallelbus_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + enum { ARG_data0, ARG_command, ARG_chip_select, ARG_write, ARG_read, ARG_reset }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_data0, MP_ARG_OBJ | MP_ARG_KW_ONLY | MP_ARG_REQUIRED }, + { MP_QSTR_command, MP_ARG_OBJ | MP_ARG_KW_ONLY | MP_ARG_REQUIRED }, + { MP_QSTR_chip_select, MP_ARG_OBJ | MP_ARG_KW_ONLY | MP_ARG_REQUIRED }, + { MP_QSTR_write, MP_ARG_OBJ | MP_ARG_KW_ONLY | MP_ARG_REQUIRED }, + { MP_QSTR_read, MP_ARG_OBJ | MP_ARG_KW_ONLY | MP_ARG_REQUIRED }, + { MP_QSTR_reset, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = mp_const_none} }, + }; + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + mp_obj_t data0 = args[ARG_data0].u_obj; + mp_obj_t command = args[ARG_command].u_obj; + mp_obj_t chip_select = args[ARG_chip_select].u_obj; + mp_obj_t write = args[ARG_write].u_obj; + mp_obj_t read = args[ARG_read].u_obj; + mp_obj_t reset = args[ARG_reset].u_obj; + assert_pin_free(data0); + assert_pin_free(command); + assert_pin_free(chip_select); + assert_pin_free(write); + assert_pin_free(read); + assert_pin_free(reset); + + displayio_parallelbus_obj_t* self = NULL; + for (uint8_t i = 0; i < CIRCUITPY_DISPLAY_LIMIT; i++) { + if (displays[i].parallel_bus.base.type== NULL || + displays[i].parallel_bus.base.type == &mp_type_NoneType) { + self = &displays[i].parallel_bus; + self->base.type = &displayio_parallelbus_type; + break; + } + } + if (self == NULL) { + mp_raise_RuntimeError(translate("Too many display busses")); + } + + common_hal_displayio_parallelbus_construct(self, data0, command, chip_select, write, read, reset); + return self; +} + +//| .. method:: send(command, data) +//| +//| Sends the given command value followed by the full set of data. Display state, such as +//| vertical scroll, set via ``send`` may or may not be reset once the code is done. +//| +STATIC mp_obj_t displayio_parallelbus_obj_send(mp_obj_t self, mp_obj_t command_obj, mp_obj_t data_obj) { + mp_int_t command_int = MP_OBJ_SMALL_INT_VALUE(command_obj); + if (!MP_OBJ_IS_SMALL_INT(command_obj) || command_int > 255 || command_int < 0) { + mp_raise_ValueError(translate("Command must be an int between 0 and 255")); + } + uint8_t command = command_int; + mp_buffer_info_t bufinfo; + mp_get_buffer_raise(data_obj, &bufinfo, MP_BUFFER_READ); + + // Wait for display bus to be available. + while (!common_hal_displayio_parallelbus_begin_transaction(self)) { +#ifdef MICROPY_VM_HOOK_LOOP + MICROPY_VM_HOOK_LOOP ; +#endif + } + common_hal_displayio_parallelbus_send(self, true, &command, 1); + common_hal_displayio_parallelbus_send(self, false, ((uint8_t*) bufinfo.buf), bufinfo.len); + common_hal_displayio_parallelbus_end_transaction(self); + + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_3(displayio_parallelbus_send_obj, displayio_parallelbus_obj_send); + +STATIC const mp_rom_map_elem_t displayio_parallelbus_locals_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_send), MP_ROM_PTR(&displayio_parallelbus_send_obj) }, +}; +STATIC MP_DEFINE_CONST_DICT(displayio_parallelbus_locals_dict, displayio_parallelbus_locals_dict_table); + +const mp_obj_type_t displayio_parallelbus_type = { + { &mp_type_type }, + .name = MP_QSTR_ParallelBus, + .make_new = displayio_parallelbus_make_new, + .locals_dict = (mp_obj_dict_t*)&displayio_parallelbus_locals_dict, +}; diff --git a/shared-bindings/displayio/ParallelBus.h b/shared-bindings/displayio/ParallelBus.h new file mode 100644 index 000000000..c4cde5ff5 --- /dev/null +++ b/shared-bindings/displayio/ParallelBus.h @@ -0,0 +1,49 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYBUSIO_PARALLELBUS_H +#define MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYBUSIO_PARALLELBUS_H + +#include "common-hal/displayio/ParallelBus.h" +#include "common-hal/microcontroller/Pin.h" + +#include "shared-module/displayio/Group.h" + +extern const mp_obj_type_t displayio_parallelbus_type; + +void common_hal_displayio_parallelbus_construct(displayio_parallelbus_obj_t* self, + const mcu_pin_obj_t* data0, const mcu_pin_obj_t* command, const mcu_pin_obj_t* chip_select, + const mcu_pin_obj_t* write, const mcu_pin_obj_t* read, const mcu_pin_obj_t* reset); + +void common_hal_displayio_parallelbus_deinit(displayio_parallelbus_obj_t* self); + +bool common_hal_displayio_parallelbus_begin_transaction(mp_obj_t self); + +void common_hal_displayio_parallelbus_send(mp_obj_t self, bool command, uint8_t *data, uint32_t data_length); + +void common_hal_displayio_parallelbus_end_transaction(mp_obj_t self); + +#endif // MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYBUSIO_PARALLELBUS_H diff --git a/shared-bindings/displayio/Shape.c b/shared-bindings/displayio/Shape.c new file mode 100644 index 000000000..faa9472fa --- /dev/null +++ b/shared-bindings/displayio/Shape.c @@ -0,0 +1,123 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "shared-bindings/displayio/Shape.h" + +#include <stdint.h> + +#include "py/binary.h" +#include "py/objproperty.h" +#include "py/runtime.h" +#include "shared-bindings/util.h" +#include "supervisor/shared/translate.h" + +//| .. currentmodule:: displayio +//| +//| :class:`Shape` -- Represents a shape by defining its bounds on each row +//| ========================================================================== +//| +//| Represents any shape made by defining boundaries that may be mirrored. +//| +//| .. warning:: This will likely be changed before 4.0.0. Consider it very experimental. +//| +//| .. class:: Shape(width, height, *, mirror_x=False, mirror_y=False) +//| +//| Create a Shape object with the given fixed size. Each pixel is one bit and is stored by the +//| column boundaries of the shape on each row. Each row's boundary defaults to the full row. +//| +//| :param int width: The number of pixels wide +//| :param int height: The number of pixels high +//| :param bool mirror_x: When true the left boundary is mirrored to the right. +//| :param bool mirror_y: When true the top boundary is mirrored to the bottom. +//| +STATIC mp_obj_t displayio_shape_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + enum { ARG_width, ARG_height, ARG_mirror_x, ARG_mirror_y }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_width, MP_ARG_REQUIRED | MP_ARG_INT }, + { MP_QSTR_height, MP_ARG_REQUIRED | MP_ARG_INT }, + { MP_QSTR_mirror_x, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false} }, + { MP_QSTR_mirror_y, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false} }, + }; + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + mp_int_t width = args[ARG_width].u_int; + if (width < 1) { + mp_raise_ValueError_varg(translate("%q must be >= 1"), MP_QSTR_width); + } + mp_int_t height = args[ARG_height].u_int; + if (height < 1) { + mp_raise_ValueError_varg(translate("%q must be >= 1"), MP_QSTR_height); + } + + displayio_shape_t *self = m_new_obj(displayio_shape_t); + self->base.type = &displayio_shape_type; + common_hal_displayio_shape_construct(self, + width, + height, + args[ARG_mirror_x].u_bool, + args[ARG_mirror_y].u_bool); + + return MP_OBJ_FROM_PTR(self); +} + + +//| .. method:: set_boundary(y, start_x, end_x) +//| +//| Loads pre-packed data into the given row. +//| +STATIC mp_obj_t displayio_shape_obj_set_boundary(size_t n_args, const mp_obj_t *args) { + (void) n_args; + displayio_shape_t *self = MP_OBJ_TO_PTR(args[0]); + mp_int_t y; + if (!mp_obj_get_int_maybe(args[1], &y)) { + mp_raise_ValueError(translate("y should be an int")); + } + mp_int_t start_x; + if (!mp_obj_get_int_maybe(args[2], &start_x)) { + mp_raise_ValueError(translate("start_x should be an int")); + } + mp_int_t end_x; + if (!mp_obj_get_int_maybe(args[3], &end_x)) { + mp_raise_ValueError(translate("end_x should be an int")); + } + common_hal_displayio_shape_set_boundary(self, y, start_x, end_x); + + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(displayio_shape_set_boundary_obj, 4, 4, displayio_shape_obj_set_boundary); + +STATIC const mp_rom_map_elem_t displayio_shape_locals_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_set_boundary), MP_ROM_PTR(&displayio_shape_set_boundary_obj) }, +}; +STATIC MP_DEFINE_CONST_DICT(displayio_shape_locals_dict, displayio_shape_locals_dict_table); + +const mp_obj_type_t displayio_shape_type = { + { &mp_type_type }, + .name = MP_QSTR_Shape, + .make_new = displayio_shape_make_new, + .locals_dict = (mp_obj_dict_t*)&displayio_shape_locals_dict, +}; diff --git a/shared-bindings/displayio/Shape.h b/shared-bindings/displayio/Shape.h new file mode 100644 index 000000000..d08a38782 --- /dev/null +++ b/shared-bindings/displayio/Shape.h @@ -0,0 +1,41 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYIO_SHAPE_H +#define MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYIO_SHAPE_H + +#include "shared-module/displayio/Shape.h" + +extern const mp_obj_type_t displayio_shape_type; + +void common_hal_displayio_shape_construct(displayio_shape_t *self, uint32_t width, + uint32_t height, bool mirror_x, bool mirror_y); + +void common_hal_displayio_shape_set_boundary(displayio_shape_t *self, uint16_t y, uint16_t start_x, + uint16_t end_x); +uint32_t common_hal_displayio_shape_get_pixel(void *shape, int16_t x, int16_t y); + +#endif // MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYIO_SHAPE_H diff --git a/shared-bindings/displayio/Sprite.c b/shared-bindings/displayio/Sprite.c deleted file mode 100644 index 69c1a5896..000000000 --- a/shared-bindings/displayio/Sprite.c +++ /dev/null @@ -1,190 +0,0 @@ -/* - * This file is part of the Micro Python project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#include "shared-bindings/displayio/Sprite.h" - -#include <stdint.h> - -#include "lib/utils/context_manager_helpers.h" -#include "py/binary.h" -#include "py/objproperty.h" -#include "py/runtime.h" -#include "shared-bindings/displayio/Bitmap.h" -#include "shared-bindings/displayio/ColorConverter.h" -#include "shared-bindings/displayio/OnDiskBitmap.h" -#include "shared-bindings/displayio/Palette.h" -#include "supervisor/shared/translate.h" - -void unpack_position(mp_obj_t position_obj, int16_t* x, int16_t* y) { - // TODO(tannewt): Support any value sequence such as bytearray or bytes. - mp_obj_tuple_t *position = MP_OBJ_TO_PTR(position_obj); - if (MP_OBJ_IS_TYPE(position_obj, &mp_type_tuple) && position->len == 2) { - *x = mp_obj_get_int(position->items[0]); - *y = mp_obj_get_int(position->items[1]); - } else if (position != mp_const_none) { - mp_raise_TypeError(translate("position must be 2-tuple")); - } -} - -//| .. currentmodule:: displayio -//| -//| :class:`Sprite` -- A particular copy of an image to display -//| ========================================================================== -//| -//| Position a particular image and pixel_shader combination. Multiple sprites can share bitmaps -//| pixel shaders. -//| -//| .. warning:: This will be changed before 4.0.0. Consider it very experimental. -//| -//| .. class:: Sprite(bitmap, *, pixel_shader, position, width, height) -//| -//| Create a Sprite object. The bitmap is source for 2d pixels. The pixel_shader is used to -//| convert the value and its location to a display native pixel color. This may be a simple color -//| palette lookup, a gradient, a pattern or a color transformer. -//| -//| -STATIC mp_obj_t displayio_sprite_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { - mp_arg_check_num(n_args, n_kw, 1, 4, true); - mp_map_t kw_args; - mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); - enum { ARG_bitmap, ARG_pixel_shader, ARG_position, ARG_width, ARG_height }; - static const mp_arg_t allowed_args[] = { - { MP_QSTR_bitmap, MP_ARG_OBJ | MP_ARG_REQUIRED }, - { MP_QSTR_pixel_shader, MP_ARG_OBJ | MP_ARG_KW_ONLY }, - { MP_QSTR_position, MP_ARG_OBJ | MP_ARG_KW_ONLY }, - { MP_QSTR_width, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = -1} }, - { MP_QSTR_height, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = -1} }, - }; - mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all(n_args, pos_args, &kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); - - mp_obj_t bitmap = args[ARG_bitmap].u_obj; - - uint16_t width; - uint16_t height; - if (MP_OBJ_IS_TYPE(bitmap, &displayio_bitmap_type)) { - displayio_bitmap_t* bmp = MP_OBJ_TO_PTR(bitmap); - width = bmp->width; - height = bmp->height; - } else if (MP_OBJ_IS_TYPE(bitmap, &displayio_ondiskbitmap_type)) { - displayio_ondiskbitmap_t* bmp = MP_OBJ_TO_PTR(bitmap); - width = bmp->width; - height = bmp->height; - } else { - mp_raise_TypeError(translate("unsupported bitmap type")); - } - int16_t x = 0; - int16_t y = 0; - mp_obj_t position_obj = args[ARG_position].u_obj; - unpack_position(position_obj, &x, &y); - - displayio_sprite_t *self = m_new_obj(displayio_sprite_t); - self->base.type = &displayio_sprite_type; - common_hal_displayio_sprite_construct(self, bitmap, args[ARG_pixel_shader].u_obj, - width, height, x, y); - return MP_OBJ_FROM_PTR(self); -} - -//| .. attribute:: position -//| -//| The position of the top-left corner of the sprite. -//| -STATIC mp_obj_t displayio_sprite_obj_get_position(mp_obj_t self_in) { - displayio_sprite_t *self = MP_OBJ_TO_PTR(self_in); - int16_t x; - int16_t y; - common_hal_displayio_sprite_get_position(self, &x, &y); - - mp_obj_t coords[2]; - coords[0] = mp_obj_new_int(x); - coords[1] = mp_obj_new_int(y); - - return mp_obj_new_tuple(2, coords); -} -MP_DEFINE_CONST_FUN_OBJ_1(displayio_sprite_get_position_obj, displayio_sprite_obj_get_position); - -STATIC mp_obj_t displayio_sprite_obj_set_position(mp_obj_t self_in, mp_obj_t value) { - displayio_sprite_t *self = MP_OBJ_TO_PTR(self_in); - - int16_t x = 0; - int16_t y = 0; - unpack_position(value, &x, &y); - - common_hal_displayio_sprite_set_position(self, x, y); - - return mp_const_none; -} -MP_DEFINE_CONST_FUN_OBJ_2(displayio_sprite_set_position_obj, displayio_sprite_obj_set_position); - -const mp_obj_property_t displayio_sprite_position_obj = { - .base.type = &mp_type_property, - .proxy = {(mp_obj_t)&displayio_sprite_get_position_obj, - (mp_obj_t)&displayio_sprite_set_position_obj, - (mp_obj_t)&mp_const_none_obj}, -}; - -//| .. attribute:: pixel_shader -//| -//| The pixel shader of the sprite. -//| -STATIC mp_obj_t displayio_sprite_obj_get_pixel_shader(mp_obj_t self_in) { - displayio_sprite_t *self = MP_OBJ_TO_PTR(self_in); - return common_hal_displayio_sprite_get_pixel_shader(self); -} -MP_DEFINE_CONST_FUN_OBJ_1(displayio_sprite_get_pixel_shader_obj, displayio_sprite_obj_get_pixel_shader); - -STATIC mp_obj_t displayio_sprite_obj_set_pixel_shader(mp_obj_t self_in, mp_obj_t pixel_shader) { - displayio_sprite_t *self = MP_OBJ_TO_PTR(self_in); - if (!MP_OBJ_IS_TYPE(pixel_shader, &displayio_palette_type) && !MP_OBJ_IS_TYPE(pixel_shader, &displayio_colorconverter_type)) { - mp_raise_TypeError(translate("pixel_shader must be displayio.Palette or displayio.ColorConverter")); - } - - common_hal_displayio_sprite_set_pixel_shader(self, pixel_shader); - - return mp_const_none; -} -MP_DEFINE_CONST_FUN_OBJ_2(displayio_sprite_set_pixel_shader_obj, displayio_sprite_obj_set_pixel_shader); - -const mp_obj_property_t displayio_sprite_pixel_shader_obj = { - .base.type = &mp_type_property, - .proxy = {(mp_obj_t)&displayio_sprite_get_pixel_shader_obj, - (mp_obj_t)&displayio_sprite_set_pixel_shader_obj, - (mp_obj_t)&mp_const_none_obj}, -}; - -STATIC const mp_rom_map_elem_t displayio_sprite_locals_dict_table[] = { - // Properties - { MP_ROM_QSTR(MP_QSTR_position), MP_ROM_PTR(&displayio_sprite_position_obj) }, - { MP_ROM_QSTR(MP_QSTR_pixel_shader), MP_ROM_PTR(&displayio_sprite_pixel_shader_obj) }, -}; -STATIC MP_DEFINE_CONST_DICT(displayio_sprite_locals_dict, displayio_sprite_locals_dict_table); - -const mp_obj_type_t displayio_sprite_type = { - { &mp_type_type }, - .name = MP_QSTR_Sprite, - .make_new = displayio_sprite_make_new, - .locals_dict = (mp_obj_dict_t*)&displayio_sprite_locals_dict, -}; diff --git a/shared-bindings/displayio/TileGrid.c b/shared-bindings/displayio/TileGrid.c new file mode 100644 index 000000000..a45feaec4 --- /dev/null +++ b/shared-bindings/displayio/TileGrid.c @@ -0,0 +1,297 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "shared-bindings/displayio/TileGrid.h" + +#include <stdint.h> + +#include "lib/utils/context_manager_helpers.h" +#include "py/binary.h" +#include "py/objproperty.h" +#include "py/runtime.h" +#include "shared-bindings/displayio/Bitmap.h" +#include "shared-bindings/displayio/ColorConverter.h" +#include "shared-bindings/displayio/OnDiskBitmap.h" +#include "shared-bindings/displayio/Palette.h" +#include "shared-bindings/displayio/Shape.h" +#include "supervisor/shared/translate.h" + +//| .. currentmodule:: displayio +//| +//| :class:`TileGrid` -- A grid of tiles sourced out of one bitmap +//| ========================================================================== +//| +//| Position a grid of tiles sourced from a bitmap and pixel_shader combination. Multiple grids +//| can share bitmaps and pixel shaders. +//| +//| A single tile grid is also known as a Sprite. +//| +//| .. class:: TileGrid(bitmap, *, pixel_shader, width=1, height=1, tile_width=None, tile_height=None, default_tile=0, x=0, y=0) +//| +//| Create a TileGrid object. The bitmap is source for 2d pixels. The pixel_shader is used to +//| convert the value and its location to a display native pixel color. This may be a simple color +//| palette lookup, a gradient, a pattern or a color transformer. +//| +//| tile_width and tile_height match the height of the bitmap by default. +//| +//| :param displayio.Bitmap bitmap: The bitmap storing one or more tiles. +//| :param displayio.Palette pixel_shader: The pixel shader that produces colors from values +//| :param int width: Width of the grid in tiles. +//| :param int height: Height of the grid in tiles. +//| :param int tile_width: Width of a single tile in pixels. Defaults to the full Bitmap and must evenly divide into the Bitmap's dimensions. +//| :param int tile_height: Height of a single tile in pixels. Defaults to the full Bitmap and must evenly divide into the Bitmap's dimensions. +//| :param in default_tile: Default tile index to show. +//| :param int x: Initial x position of the left edge within the parent. +//| :param int y: Initial y position of the top edge within the parent. +//| +STATIC mp_obj_t displayio_tilegrid_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + enum { ARG_bitmap, ARG_pixel_shader, ARG_width, ARG_height, ARG_tile_width, ARG_tile_height, ARG_default_tile, ARG_x, ARG_y }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ }, + { MP_QSTR_pixel_shader, MP_ARG_OBJ | MP_ARG_KW_ONLY | MP_ARG_REQUIRED }, + { MP_QSTR_width, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 1} }, + { MP_QSTR_height, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 1} }, + { MP_QSTR_tile_width, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0} }, + { MP_QSTR_tile_height, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0} }, + { MP_QSTR_default_tile, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0} }, + { MP_QSTR_x, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0} }, + { MP_QSTR_y, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0} }, + }; + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + mp_obj_t bitmap = args[ARG_bitmap].u_obj; + + uint16_t bitmap_width; + uint16_t bitmap_height; + mp_obj_t native = mp_instance_cast_to_native_base(bitmap, &displayio_shape_type); + if (native != MP_OBJ_NULL) { + displayio_shape_t* bmp = MP_OBJ_TO_PTR(native); + bitmap_width = bmp->width; + bitmap_height = bmp->height; + } else if (MP_OBJ_IS_TYPE(bitmap, &displayio_bitmap_type)) { + displayio_bitmap_t* bmp = MP_OBJ_TO_PTR(bitmap); + native = bitmap; + bitmap_width = bmp->width; + bitmap_height = bmp->height; + } else if (MP_OBJ_IS_TYPE(bitmap, &displayio_ondiskbitmap_type)) { + displayio_ondiskbitmap_t* bmp = MP_OBJ_TO_PTR(bitmap); + native = bitmap; + bitmap_width = bmp->width; + bitmap_height = bmp->height; + } else { + mp_raise_TypeError(translate("unsupported bitmap type")); + } + uint16_t tile_width = args[ARG_tile_width].u_int; + if (tile_width == 0) { + tile_width = bitmap_width; + } + uint16_t tile_height = args[ARG_tile_height].u_int; + if (tile_height == 0) { + tile_height = bitmap_height; + } + if (bitmap_width % tile_width != 0) { + mp_raise_ValueError(translate("Tile width must exactly divide bitmap width")); + } + if (bitmap_height % tile_height != 0) { + mp_raise_ValueError(translate("Tile height must exactly divide bitmap height")); + } + + int16_t x = args[ARG_x].u_int; + int16_t y = args[ARG_y].u_int; + + displayio_tilegrid_t *self = m_new_obj(displayio_tilegrid_t); + self->base.type = &displayio_tilegrid_type; + common_hal_displayio_tilegrid_construct(self, native, bitmap_width / tile_width, + args[ARG_pixel_shader].u_obj, args[ARG_width].u_int, args[ARG_height].u_int, + tile_width, tile_height, x, y, args[ARG_default_tile].u_int); + return MP_OBJ_FROM_PTR(self); +} + +// Helper to ensure we have the native super class instead of a subclass. +static displayio_tilegrid_t* native_tilegrid(mp_obj_t tilegrid_obj) { + mp_obj_t native_tilegrid = mp_instance_cast_to_native_base(tilegrid_obj, &displayio_tilegrid_type); + return MP_OBJ_TO_PTR(native_tilegrid); +} + +//| .. attribute:: x +//| +//| X position of the left edge in the parent. +//| +STATIC mp_obj_t displayio_tilegrid_obj_get_x(mp_obj_t self_in) { + displayio_tilegrid_t *self = native_tilegrid(self_in); + return MP_OBJ_NEW_SMALL_INT(common_hal_displayio_tilegrid_get_x(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(displayio_tilegrid_get_x_obj, displayio_tilegrid_obj_get_x); + +STATIC mp_obj_t displayio_tilegrid_obj_set_x(mp_obj_t self_in, mp_obj_t x_obj) { + displayio_tilegrid_t *self = native_tilegrid(self_in); + + mp_int_t x = mp_obj_get_int(x_obj); + common_hal_displayio_tilegrid_set_x(self, x); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(displayio_tilegrid_set_x_obj, displayio_tilegrid_obj_set_x); + +const mp_obj_property_t displayio_tilegrid_x_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&displayio_tilegrid_get_x_obj, + (mp_obj_t)&displayio_tilegrid_set_x_obj, + (mp_obj_t)&mp_const_none_obj}, +}; + +//| .. attribute:: y +//| +//| Y position of the top edge in the parent. +//| +STATIC mp_obj_t displayio_tilegrid_obj_get_y(mp_obj_t self_in) { + displayio_tilegrid_t *self = native_tilegrid(self_in); + return MP_OBJ_NEW_SMALL_INT(common_hal_displayio_tilegrid_get_y(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(displayio_tilegrid_get_y_obj, displayio_tilegrid_obj_get_y); + +STATIC mp_obj_t displayio_tilegrid_obj_set_y(mp_obj_t self_in, mp_obj_t y_obj) { + displayio_tilegrid_t *self = native_tilegrid(self_in); + + mp_int_t y = mp_obj_get_int(y_obj); + common_hal_displayio_tilegrid_set_y(self, y); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(displayio_tilegrid_set_y_obj, displayio_tilegrid_obj_set_y); + +const mp_obj_property_t displayio_tilegrid_y_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&displayio_tilegrid_get_y_obj, + (mp_obj_t)&displayio_tilegrid_set_y_obj, + (mp_obj_t)&mp_const_none_obj}, +}; + +//| .. attribute:: pixel_shader +//| +//| The pixel shader of the tilegrid. +//| +STATIC mp_obj_t displayio_tilegrid_obj_get_pixel_shader(mp_obj_t self_in) { + displayio_tilegrid_t *self = native_tilegrid(self_in); + return common_hal_displayio_tilegrid_get_pixel_shader(self); +} +MP_DEFINE_CONST_FUN_OBJ_1(displayio_tilegrid_get_pixel_shader_obj, displayio_tilegrid_obj_get_pixel_shader); + +STATIC mp_obj_t displayio_tilegrid_obj_set_pixel_shader(mp_obj_t self_in, mp_obj_t pixel_shader) { + displayio_tilegrid_t *self = native_tilegrid(self_in); + if (!MP_OBJ_IS_TYPE(pixel_shader, &displayio_palette_type) && !MP_OBJ_IS_TYPE(pixel_shader, &displayio_colorconverter_type)) { + mp_raise_TypeError(translate("pixel_shader must be displayio.Palette or displayio.ColorConverter")); + } + + common_hal_displayio_tilegrid_set_pixel_shader(self, pixel_shader); + + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(displayio_tilegrid_set_pixel_shader_obj, displayio_tilegrid_obj_set_pixel_shader); + +const mp_obj_property_t displayio_tilegrid_pixel_shader_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&displayio_tilegrid_get_pixel_shader_obj, + (mp_obj_t)&displayio_tilegrid_set_pixel_shader_obj, + (mp_obj_t)&mp_const_none_obj}, +}; + +//| .. method:: __getitem__(index) +//| +//| Returns the tile index at the given index. The index can either be an x,y tuple or an int equal +//| to ``y * width + x``. +//| +//| This allows you to:: +//| +//| print(grid[0]) +//| +//| .. method:: __setitem__(index, tile_index) +//| +//| Sets the tile index at the given index. The index can either be an x,y tuple or an int equal +//| to ``y * width + x``. +//| +//| This allows you to:: +//| +//| grid[0] = 10 +//| +//| or:: +//| +//| grid[0,0] = 10 +//| +STATIC mp_obj_t tilegrid_subscr(mp_obj_t self_in, mp_obj_t index_obj, mp_obj_t value_obj) { + displayio_tilegrid_t *self = native_tilegrid(self_in); + + + if (MP_OBJ_IS_TYPE(index_obj, &mp_type_slice)) { + mp_raise_NotImplementedError(translate("Slices not supported")); + } else { + uint16_t x = 0; + uint16_t y = 0; + if (MP_OBJ_IS_SMALL_INT(index_obj)) { + mp_int_t i = MP_OBJ_SMALL_INT_VALUE(index_obj); + uint16_t width = common_hal_displayio_tilegrid_get_width(self); + x = i % width; + y = i / width; + } else { + mp_obj_t* items; + mp_obj_get_array_fixed_n(index_obj, 2, &items); + x = mp_obj_get_int(items[0]); + y = mp_obj_get_int(items[1]); + if (x >= common_hal_displayio_tilegrid_get_width(self) || y >= common_hal_displayio_tilegrid_get_height(self)) { + mp_raise_IndexError(translate("tile index out of bounds")); + } + } + + if (value_obj == MP_OBJ_SENTINEL) { + // load + return MP_OBJ_NEW_SMALL_INT(common_hal_displayio_tilegrid_get_tile(self, x, y)); + } else if (value_obj == mp_const_none) { + return MP_OBJ_NULL; // op not supported + } else { + mp_int_t value = mp_obj_get_int(value_obj); + if (value < 0 || value > 255) { + mp_raise_ValueError(translate("Tile indices must be 0 - 255")); + } + common_hal_displayio_tilegrid_set_tile(self, x, y, value); + } + } + return mp_const_none; +} + +STATIC const mp_rom_map_elem_t displayio_tilegrid_locals_dict_table[] = { + // Properties + { MP_ROM_QSTR(MP_QSTR_x), MP_ROM_PTR(&displayio_tilegrid_x_obj) }, + { MP_ROM_QSTR(MP_QSTR_y), MP_ROM_PTR(&displayio_tilegrid_y_obj) }, + { MP_ROM_QSTR(MP_QSTR_pixel_shader), MP_ROM_PTR(&displayio_tilegrid_pixel_shader_obj) }, +}; +STATIC MP_DEFINE_CONST_DICT(displayio_tilegrid_locals_dict, displayio_tilegrid_locals_dict_table); + +const mp_obj_type_t displayio_tilegrid_type = { + { &mp_type_type }, + .name = MP_QSTR_TileGrid, + .make_new = displayio_tilegrid_make_new, + .subscr = tilegrid_subscr, + .locals_dict = (mp_obj_dict_t*)&displayio_tilegrid_locals_dict, +}; diff --git a/shared-bindings/displayio/TileGrid.h b/shared-bindings/displayio/TileGrid.h new file mode 100644 index 000000000..15a71b53b --- /dev/null +++ b/shared-bindings/displayio/TileGrid.h @@ -0,0 +1,54 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYIO_TILEGRID_H +#define MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYIO_TILEGRID_H + +#include "shared-module/displayio/TileGrid.h" + +extern const mp_obj_type_t displayio_tilegrid_type; + +void common_hal_displayio_tilegrid_construct(displayio_tilegrid_t *self, mp_obj_t bitmap, + uint16_t bitmap_width_in_tiles, mp_obj_t pixel_shader, uint16_t width, uint16_t height, + uint16_t tile_width, uint16_t tile_height, uint16_t x, uint16_t y, uint8_t default_tile); + +mp_int_t common_hal_displayio_tilegrid_get_x(displayio_tilegrid_t *self); +void common_hal_displayio_tilegrid_set_x(displayio_tilegrid_t *self, mp_int_t x); +mp_int_t common_hal_displayio_tilegrid_get_y(displayio_tilegrid_t *self); +void common_hal_displayio_tilegrid_set_y(displayio_tilegrid_t *self, mp_int_t y); +mp_obj_t common_hal_displayio_tilegrid_get_pixel_shader(displayio_tilegrid_t *self); +void common_hal_displayio_tilegrid_set_pixel_shader(displayio_tilegrid_t *self, mp_obj_t pixel_shader); + +uint16_t common_hal_displayio_tilegrid_get_width(displayio_tilegrid_t *self); +uint16_t common_hal_displayio_tilegrid_get_height(displayio_tilegrid_t *self); + +uint8_t common_hal_displayio_tilegrid_get_tile(displayio_tilegrid_t *self, uint16_t x, uint16_t y); +void common_hal_displayio_tilegrid_set_tile(displayio_tilegrid_t *self, uint16_t x, uint16_t y, uint8_t tile_index); + +// Private API for scrolling the TileGrid. +void common_hal_displayio_tilegrid_set_top_left(displayio_tilegrid_t *self, uint16_t x, uint16_t y); + +#endif // MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYIO_TILEGRID_H diff --git a/shared-bindings/displayio/__init__.c b/shared-bindings/displayio/__init__.c index 0610d71f6..44b1e0b07 100644 --- a/shared-bindings/displayio/__init__.c +++ b/shared-bindings/displayio/__init__.c @@ -32,26 +32,24 @@ #include "shared-bindings/displayio/__init__.h" #include "shared-bindings/displayio/Bitmap.h" #include "shared-bindings/displayio/ColorConverter.h" +#include "shared-bindings/displayio/Display.h" #include "shared-bindings/displayio/FourWire.h" #include "shared-bindings/displayio/Group.h" #include "shared-bindings/displayio/OnDiskBitmap.h" #include "shared-bindings/displayio/Palette.h" -#include "shared-bindings/displayio/Sprite.h" +#include "shared-bindings/displayio/ParallelBus.h" +#include "shared-bindings/displayio/Shape.h" +#include "shared-bindings/displayio/TileGrid.h" //| :mod:`displayio` --- Native display driving //| ========================================================================= //| //| .. module:: displayio //| :synopsis: Native helpers for driving displays -//| :platform: SAMD21, SAMD51 +//| :platform: SAMD21, SAMD51, nRF52 //| //| The `displayio` module contains classes to manage display output -//| including synchronizing with refresh rates and partial updating. It does -//| not include display initialization commands. It should live in a Python -//| driver for use when a display is connected to a board. It should also be -//| built into the board init when the board has the display on it. -//| -//| .. warning:: This will be changed before 4.0.0. Consider it very experimental. +//| including synchronizing with refresh rates and partial updating. //| //| Libraries //| @@ -60,25 +58,47 @@ //| //| Bitmap //| ColorConverter +//| Display //| FourWire //| Group //| OnDiskBitmap //| Palette -//| Sprite +//| ParallelBus +//| Shape +//| TileGrid +//| + + +//| .. method:: release_displays() +//| +//| Releases any actively used displays so their busses and pins can be used again. This will also +//| release the builtin display on boards that have one. You will need to reinitialize it yourself +//| afterwards. //| -//| All libraries change hardware state but are never deinit +//| Use this once in your code.py if you initialize a display. Place it right before the +//| initialization so the display is active as long as possible. //| +STATIC mp_obj_t displayio_release_displays(void) { + common_hal_displayio_release_displays(); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_0(displayio_release_displays_obj, displayio_release_displays); STATIC const mp_rom_map_elem_t displayio_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_displayio) }, { MP_ROM_QSTR(MP_QSTR_Bitmap), MP_ROM_PTR(&displayio_bitmap_type) }, { MP_ROM_QSTR(MP_QSTR_ColorConverter), MP_ROM_PTR(&displayio_colorconverter_type) }, + { MP_ROM_QSTR(MP_QSTR_Display), MP_ROM_PTR(&displayio_display_type) }, { MP_ROM_QSTR(MP_QSTR_Group), MP_ROM_PTR(&displayio_group_type) }, { MP_ROM_QSTR(MP_QSTR_OnDiskBitmap), MP_ROM_PTR(&displayio_ondiskbitmap_type) }, { MP_ROM_QSTR(MP_QSTR_Palette), MP_ROM_PTR(&displayio_palette_type) }, - { MP_ROM_QSTR(MP_QSTR_Sprite), MP_ROM_PTR(&displayio_sprite_type) }, + { MP_ROM_QSTR(MP_QSTR_Shape), MP_ROM_PTR(&displayio_shape_type) }, + { MP_ROM_QSTR(MP_QSTR_TileGrid), MP_ROM_PTR(&displayio_tilegrid_type) }, { MP_ROM_QSTR(MP_QSTR_FourWire), MP_ROM_PTR(&displayio_fourwire_type) }, + { MP_ROM_QSTR(MP_QSTR_ParallelBus), MP_ROM_PTR(&displayio_parallelbus_type) }, + + { MP_ROM_QSTR(MP_QSTR_release_displays), MP_ROM_PTR(&displayio_release_displays_obj) }, }; STATIC MP_DEFINE_CONST_DICT(displayio_module_globals, displayio_module_globals_table); diff --git a/shared-bindings/displayio/__init__.h b/shared-bindings/displayio/__init__.h index a6663bf57..427ddb47d 100644 --- a/shared-bindings/displayio/__init__.h +++ b/shared-bindings/displayio/__init__.h @@ -27,8 +27,6 @@ #ifndef MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYIO___INIT___H #define MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYIO___INIT___H -#include "py/obj.h" - -// Nothing now. +void common_hal_displayio_release_displays(void); #endif // MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYIO___INIT___H diff --git a/shared-bindings/fontio/BuiltinFont.c b/shared-bindings/fontio/BuiltinFont.c new file mode 100644 index 000000000..74bc4d29e --- /dev/null +++ b/shared-bindings/fontio/BuiltinFont.c @@ -0,0 +1,110 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "shared-bindings/fontio/BuiltinFont.h" + +#include <stdint.h> + +#include "lib/utils/context_manager_helpers.h" +#include "py/binary.h" +#include "py/objproperty.h" +#include "py/runtime.h" +#include "shared-bindings/microcontroller/Pin.h" +#include "shared-bindings/util.h" +#include "supervisor/shared/translate.h" + +//| .. currentmodule:: fontio +//| +//| :class:`BuiltinFont` -- A font built into CircuitPython +//| ========================================================================================= +//| +//| A font built into CircuitPython. +//| +//| .. class:: BuiltinFont() +//| +//| Creation not supported. Available fonts are defined when CircuitPython is built. See the +//| `Adafruit_CircuitPython_Bitmap_Font <https://github.com/adafruit/Adafruit_CircuitPython_Bitmap_Font>`_ +//| library for dynamically loaded fonts. +//| + +//| .. attribute:: bitmap +//| +//| Bitmap containing all font glyphs starting with ASCII and followed by unicode. Use +//| `get_glyph` in most cases. This is useful for use with `displayio.TileGrid` and +//| `terminalio.Terminal`. +//| +STATIC mp_obj_t fontio_builtinfont_obj_get_bitmap(mp_obj_t self_in) { + fontio_builtinfont_t *self = MP_OBJ_TO_PTR(self_in); + return common_hal_fontio_builtinfont_get_bitmap(self); +} +MP_DEFINE_CONST_FUN_OBJ_1(fontio_builtinfont_get_bitmap_obj, fontio_builtinfont_obj_get_bitmap); + +const mp_obj_property_t fontio_builtinfont_bitmap_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&fontio_builtinfont_get_bitmap_obj, + (mp_obj_t)&mp_const_none_obj, + (mp_obj_t)&mp_const_none_obj}, +}; + +//| .. method:: get_bounding_box() +//| +//| Returns the maximum bounds of all glyphs in the font in a tuple of two values: width, height. +//| +STATIC mp_obj_t fontio_builtinfont_obj_get_bounding_box(mp_obj_t self_in) { + fontio_builtinfont_t *self = MP_OBJ_TO_PTR(self_in); + + return common_hal_fontio_builtinfont_get_bounding_box(self); +} +MP_DEFINE_CONST_FUN_OBJ_1(fontio_builtinfont_get_bounding_box_obj, fontio_builtinfont_obj_get_bounding_box); + + +//| .. method:: get_glyph(codepoint) +//| +//| Returns a `fontio.Glyph` for the given codepoint or None if no glyph is available. +//| +STATIC mp_obj_t fontio_builtinfont_obj_get_glyph(mp_obj_t self_in, mp_obj_t codepoint_obj) { + fontio_builtinfont_t *self = MP_OBJ_TO_PTR(self_in); + + mp_int_t codepoint; + if (!mp_obj_get_int_maybe(codepoint_obj, &codepoint)) { + mp_raise_ValueError_varg(translate("%q should be an int"), MP_QSTR_codepoint); + } + return common_hal_fontio_builtinfont_get_glyph(self, codepoint); +} +MP_DEFINE_CONST_FUN_OBJ_2(fontio_builtinfont_get_glyph_obj, fontio_builtinfont_obj_get_glyph); + +STATIC const mp_rom_map_elem_t fontio_builtinfont_locals_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_bitmap), MP_ROM_PTR(&fontio_builtinfont_bitmap_obj) }, + { MP_ROM_QSTR(MP_QSTR_get_bounding_box), MP_ROM_PTR(&fontio_builtinfont_get_bounding_box_obj) }, + { MP_ROM_QSTR(MP_QSTR_get_glyph), MP_ROM_PTR(&fontio_builtinfont_get_glyph_obj) }, +}; +STATIC MP_DEFINE_CONST_DICT(fontio_builtinfont_locals_dict, fontio_builtinfont_locals_dict_table); + +const mp_obj_type_t fontio_builtinfont_type = { + { &mp_type_type }, + .name = MP_QSTR_BuiltinFont, + .locals_dict = (mp_obj_dict_t*)&fontio_builtinfont_locals_dict, +}; diff --git a/shared-bindings/fontio/BuiltinFont.h b/shared-bindings/fontio/BuiltinFont.h new file mode 100644 index 000000000..e87445e6b --- /dev/null +++ b/shared-bindings/fontio/BuiltinFont.h @@ -0,0 +1,38 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_FONTIO_BUILTINFONT_H +#define MICROPY_INCLUDED_SHARED_BINDINGS_FONTIO_BUILTINFONT_H + +#include "shared-module/fontio/BuiltinFont.h" + +extern const mp_obj_type_t fontio_builtinfont_type; + +mp_obj_t common_hal_fontio_builtinfont_get_bitmap(const fontio_builtinfont_t *self); +mp_obj_t common_hal_fontio_builtinfont_get_bounding_box(const fontio_builtinfont_t *self); +mp_obj_t common_hal_fontio_builtinfont_get_glyph(const fontio_builtinfont_t *self, mp_uint_t codepoint); + +#endif // MICROPY_INCLUDED_SHARED_BINDINGS_FONTIO_BUILTINFONT_H diff --git a/shared-bindings/fontio/Glyph.c b/shared-bindings/fontio/Glyph.c new file mode 100644 index 000000000..80298fd16 --- /dev/null +++ b/shared-bindings/fontio/Glyph.c @@ -0,0 +1,75 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "shared-bindings/fontio/Glyph.h" + +#include <stdint.h> + +//| .. currentmodule:: fontio +//| +//| :class:`Glyph` -- Storage of glyph info +//| ========================================================================== +//| +//| .. class:: Glyph(bitmap, tile_index, width, height, dx, dy, shift_x, shift_y) +//| +//| Named tuple used to capture a single glyph and its attributes. +//| +//| :param fontio.Bitmap bitmap: the bitmap including the glyph +//| :param int tile_index: the tile index within the bitmap +//| :param int width: the width of the glyph's bitmap +//| :param int height: the height of the glyph's bitmap +//| :param int dx: x adjustment to the bitmap's position +//| :param int dy: y adjustment to the bitmap's position +//| :param int shift_x: the x difference to the next glyph +//| :param int shift_y: the y difference to the next glyph +//| +const mp_obj_namedtuple_type_t fontio_glyph_type = { + .base = { + .base = { + .type = &mp_type_type + }, + .name = MP_QSTR_Glyph, + .print = namedtuple_print, + .make_new = namedtuple_make_new, + .unary_op = mp_obj_tuple_unary_op, + .binary_op = mp_obj_tuple_binary_op, + .attr = namedtuple_attr, + .subscr = mp_obj_tuple_subscr, + .getiter = mp_obj_tuple_getiter, + .parent = &mp_type_tuple, + }, + .n_fields = 8, + .fields = { + MP_QSTR_bitmap, + MP_QSTR_tile_index, + MP_QSTR_width, + MP_QSTR_height, + MP_QSTR_dx, + MP_QSTR_dy, + MP_QSTR_shift_x, + MP_QSTR_shift_y + }, +}; diff --git a/shared-bindings/fontio/Glyph.h b/shared-bindings/fontio/Glyph.h new file mode 100644 index 000000000..c58d812dd --- /dev/null +++ b/shared-bindings/fontio/Glyph.h @@ -0,0 +1,34 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_FONTIO_GLYPH_H +#define MICROPY_INCLUDED_SHARED_BINDINGS_FONTIO_GLYPH_H + +#include "py/objnamedtuple.h" + +extern const mp_obj_namedtuple_type_t fontio_glyph_type; + +#endif // MICROPY_INCLUDED_SHARED_BINDINGS_FONTIO_GLYPH_H diff --git a/shared-bindings/fontio/__init__.c b/shared-bindings/fontio/__init__.c new file mode 100644 index 000000000..cd0f5ab0f --- /dev/null +++ b/shared-bindings/fontio/__init__.c @@ -0,0 +1,65 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include <stdint.h> + +#include "py/obj.h" +#include "py/runtime.h" + +#include "shared-bindings/fontio/__init__.h" +#include "shared-bindings/fontio/BuiltinFont.h" +#include "shared-bindings/fontio/Glyph.h" + +//| :mod:`fontio` --- Core font related data structures +//| ========================================================================= +//| +//| .. module:: fontio +//| :synopsis: Core font related data structures +//| :platform: SAMD21, SAMD51, nRF52 +//| +//| The `fontio` module contains classes to store font related information. +//| +//| Libraries +//| +//| .. toctree:: +//| :maxdepth: 3 +//| +//| BuiltinFont +//| Glyph +//| + +STATIC const mp_rom_map_elem_t fontio_module_globals_table[] = { + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_fontio) }, + { MP_ROM_QSTR(MP_QSTR_BuiltinFont), MP_ROM_PTR(&fontio_builtinfont_type) }, + { MP_ROM_QSTR(MP_QSTR_Glyph), MP_ROM_PTR(&fontio_glyph_type) }, +}; + +STATIC MP_DEFINE_CONST_DICT(fontio_module_globals, fontio_module_globals_table); + +const mp_obj_module_t fontio_module = { + .base = { &mp_type_module }, + .globals = (mp_obj_dict_t*)&fontio_module_globals, +}; diff --git a/shared-bindings/fontio/__init__.h b/shared-bindings/fontio/__init__.h new file mode 100644 index 000000000..209919777 --- /dev/null +++ b/shared-bindings/fontio/__init__.h @@ -0,0 +1,31 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_FONTIO___INIT___H +#define MICROPY_INCLUDED_SHARED_BINDINGS_FONTIO___INIT___H + + +#endif // MICROPY_INCLUDED_SHARED_BINDINGS_FONTIO___INIT___H diff --git a/shared-bindings/frequencyio/FrequencyIn.c b/shared-bindings/frequencyio/FrequencyIn.c new file mode 100644 index 000000000..908cb307d --- /dev/null +++ b/shared-bindings/frequencyio/FrequencyIn.c @@ -0,0 +1,241 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Michael Schroeder + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include <stdint.h> + +#include "lib/utils/context_manager_helpers.h" +#include "py/objproperty.h" +#include "py/runtime.h" +#include "py/runtime0.h" +#include "shared-bindings/microcontroller/Pin.h" +#include "shared-bindings/frequencyio/FrequencyIn.h" +#include "shared-bindings/util.h" +#include "supervisor/shared/translate.h" + +//| .. currentmodule:: frequencyio +//| +//| :class:`FrequencyIn` -- Read a frequency signal +//| ======================================================== +//| +//| FrequencyIn is used to measure the frequency, in hertz, of a digital signal +//| on an incoming pin. Accuracy has shown to be within 10%, if not better. It +//| is recommended to utilize an average of multiple samples to smooth out readings. +//| +//| Frequencies below 1KHz are not currently detectable. +//| +//| FrequencyIn will not determine pulse width (use ``PulseIn``). +//| +//| .. class:: FrequencyIn(pin, capture_period=10) +//| +//| Create a FrequencyIn object associated with the given pin. +//| +//| :param ~microcontroller.Pin pin: Pin to read frequency from. +//| :param int capture_period: Keyword argument to set the measurement period, in +//| milliseconds. Default is 10ms; range is 1ms - 500ms. +//| +//| Read the incoming frequency from a pin:: +//| +//| import frequencyio +//| import board +//| +//| frequency = frequencyio.FrequencyIn(board.D11) +//| +//| # Loop while printing the detected frequency +//| while True: +//| print(frequency.value) +//| +//| # Optional clear() will reset the value +//| # to zero. Without this, if the incoming +//| # signal stops, the last reading will remain +//| # as the value. +//| frequency.clear() +//| +STATIC mp_obj_t frequencyio_frequencyin_make_new(const mp_obj_type_t *type, size_t n_args, + const mp_obj_t *pos_args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 1, 1, true); + + frequencyio_frequencyin_obj_t *self = m_new_obj(frequencyio_frequencyin_obj_t); + self->base.type = &frequencyio_frequencyin_type; + enum { ARG_pin, ARG_capture_period }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_pin, MP_ARG_REQUIRED | MP_ARG_OBJ }, + { MP_QSTR_capture_period, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 10} }, + }; + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + assert_pin(args[ARG_pin].u_obj, false); + mcu_pin_obj_t* pin = MP_OBJ_TO_PTR(args[ARG_pin].u_obj); + assert_pin_free(pin); + + const uint16_t capture_period = args[ARG_capture_period].u_int; + + common_hal_frequencyio_frequencyin_construct(self, pin, capture_period); + + return MP_OBJ_FROM_PTR(self); +} + +//| .. method:: deinit() +//| +//| Deinitialises the FrequencyIn and releases any hardware resources for reuse. +//| +STATIC mp_obj_t frequencyio_frequencyin_deinit(mp_obj_t self_in) { + frequencyio_frequencyin_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_frequencyio_frequencyin_deinit(self); + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(frequencyio_frequencyin_deinit_obj, frequencyio_frequencyin_deinit); + +//| .. method:: __enter__() +//| +//| No-op used by Context Managers. +//| +// Provided by context manager helper. + +//| .. method:: __exit__() +//| +//| Automatically deinitializes the hardware when exiting a context. See +//| :ref:`lifetime-and-contextmanagers` for more info. +//| +STATIC mp_obj_t frequencyio_frequencyin_obj___exit__(size_t n_args, const mp_obj_t *args) { + (void)n_args; + common_hal_frequencyio_frequencyin_deinit(args[0]); + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(frequencyio_frequencyin___exit___obj, 4, 4, frequencyio_frequencyin_obj___exit__); + +//| .. method:: pause() +//| +//| Pause frequency capture. +//| +STATIC mp_obj_t frequencyio_frequencyin_obj_pause(mp_obj_t self_in) { + frequencyio_frequencyin_obj_t *self = MP_OBJ_TO_PTR(self_in); + raise_error_if_deinited(common_hal_frequencyio_frequencyin_deinited(self)); + + common_hal_frequencyio_frequencyin_pause(self); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_1(frequencyio_frequencyin_pause_obj, frequencyio_frequencyin_obj_pause); + +//| .. method:: resume() +//| +//| Resumes frequency capture. +//| +STATIC mp_obj_t frequencyio_frequencyin_obj_resume(mp_obj_t self_in) { + frequencyio_frequencyin_obj_t *self = MP_OBJ_TO_PTR(self_in); + raise_error_if_deinited(common_hal_frequencyio_frequencyin_deinited(self)); + + common_hal_frequencyio_frequencyin_resume(self); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_1(frequencyio_frequencyin_resume_obj, frequencyio_frequencyin_obj_resume); + +//| .. method:: clear() +//| +//| Clears the last detected frequency capture value. +//| + +STATIC mp_obj_t frequencyio_frequencyin_obj_clear(mp_obj_t self_in) { + frequencyio_frequencyin_obj_t *self = MP_OBJ_TO_PTR(self_in); + raise_error_if_deinited(common_hal_frequencyio_frequencyin_deinited(self)); + + common_hal_frequencyio_frequencyin_clear(self); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_1(frequencyio_frequencyin_clear_obj, frequencyio_frequencyin_obj_clear); + +//| .. attribute:: capture_period +//| +//| The capture measurement period. Lower incoming frequencies will be measured +//| more accurately with longer capture periods. Higher frequencies are more +//| accurate with shorter capture periods. +//| +//| .. note:: When setting a new ``capture_period``, all previous capture information is +//| cleared with a call to ``clear()``. +//| +STATIC mp_obj_t frequencyio_frequencyin_obj_get_capture_period(mp_obj_t self_in) { + frequencyio_frequencyin_obj_t *self = MP_OBJ_TO_PTR(self_in); + raise_error_if_deinited(common_hal_frequencyio_frequencyin_deinited(self)); + + return MP_OBJ_NEW_SMALL_INT(common_hal_frequencyio_frequencyin_get_capture_period(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(frequencyio_frequency_get_capture_period_obj, frequencyio_frequencyin_obj_get_capture_period); + +STATIC mp_obj_t frequencyio_frequencyin_obj_set_capture_period(mp_obj_t self_in, mp_obj_t capture_period) { + frequencyio_frequencyin_obj_t *self = MP_OBJ_TO_PTR(self_in); + raise_error_if_deinited(common_hal_frequencyio_frequencyin_deinited(self)); + + common_hal_frequencyio_frequencyin_set_capture_period(self, mp_obj_get_int(capture_period)); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(frequencyio_frequency_set_capture_period_obj, frequencyio_frequencyin_obj_set_capture_period); + +const mp_obj_property_t frequencyio_frequencyin_capture_period_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&frequencyio_frequency_get_capture_period_obj, + (mp_obj_t)&frequencyio_frequency_set_capture_period_obj, + (mp_obj_t)&mp_const_none_obj}, +}; + +//| .. method:: __get__(index) +//| +//| Returns the value of the last frequency captured. +//| +STATIC mp_obj_t frequencyio_frequencyin_obj_get_value(mp_obj_t self_in) { + frequencyio_frequencyin_obj_t *self = MP_OBJ_TO_PTR(self_in); + raise_error_if_deinited(common_hal_frequencyio_frequencyin_deinited(self)); + + //return MP_OBJ_NEW_SMALL_INT(common_hal_frequencyio_frequencyin_get_item(self)); + return mp_obj_new_int_from_float(common_hal_frequencyio_frequencyin_get_item(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(frequencyio_frequencyin_get_value_obj, frequencyio_frequencyin_obj_get_value); + +const mp_obj_property_t frequencyio_frequencyin_value_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&frequencyio_frequencyin_get_value_obj, + (mp_obj_t)&mp_const_none_obj, + (mp_obj_t)&mp_const_none_obj}, +}; + +STATIC const mp_rom_map_elem_t frequencyio_frequencyin_locals_dict_table[] = { + // Methods + { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&frequencyio_frequencyin_deinit_obj) }, + { MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&default___enter___obj) }, + { MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&frequencyio_frequencyin___exit___obj) }, + { MP_ROM_QSTR(MP_QSTR_value), MP_ROM_PTR(&frequencyio_frequencyin_value_obj) }, + { MP_ROM_QSTR(MP_QSTR_pause), MP_ROM_PTR(&frequencyio_frequencyin_pause_obj) }, + { MP_ROM_QSTR(MP_QSTR_resume), MP_ROM_PTR(&frequencyio_frequencyin_resume_obj) }, + { MP_ROM_QSTR(MP_QSTR_clear), MP_ROM_PTR(&frequencyio_frequencyin_clear_obj) }, + { MP_ROM_QSTR(MP_QSTR_capture_period), MP_ROM_PTR(&frequencyio_frequencyin_capture_period_obj) }, +}; +STATIC MP_DEFINE_CONST_DICT(frequencyio_frequencyin_locals_dict, frequencyio_frequencyin_locals_dict_table); + +const mp_obj_type_t frequencyio_frequencyin_type = { + { &mp_type_type }, + .name = MP_QSTR_frequencyin, + .make_new = frequencyio_frequencyin_make_new, + .locals_dict = (mp_obj_dict_t*)&frequencyio_frequencyin_locals_dict, +}; diff --git a/shared-bindings/frequencyio/FrequencyIn.h b/shared-bindings/frequencyio/FrequencyIn.h new file mode 100644 index 000000000..dba6c3a66 --- /dev/null +++ b/shared-bindings/frequencyio/FrequencyIn.h @@ -0,0 +1,46 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Michael Schroeder + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_FREQUENCYIO_FREQUENCYIN_H +#define MICROPY_INCLUDED_SHARED_BINDINGS_FREQUENCYIO_FREQUENCYIN_H + +#include "common-hal/microcontroller/Pin.h" +#include "common-hal/frequencyio/FrequencyIn.h" + +extern const mp_obj_type_t frequencyio_frequencyin_type; + +extern void common_hal_frequencyio_frequencyin_construct(frequencyio_frequencyin_obj_t *self, + const mcu_pin_obj_t *pin, uint16_t capture_period); +extern void common_hal_frequencyio_frequencyin_deinit(frequencyio_frequencyin_obj_t *self); +extern bool common_hal_frequencyio_frequencyin_deinited(frequencyio_frequencyin_obj_t *self); +extern void common_hal_frequencyio_frequencyin_pause(frequencyio_frequencyin_obj_t *self); +extern void common_hal_frequencyio_frequencyin_resume(frequencyio_frequencyin_obj_t *self); +extern void common_hal_frequencyio_frequencyin_clear(frequencyio_frequencyin_obj_t *self); +extern uint32_t common_hal_frequencyio_frequencyin_get_item(frequencyio_frequencyin_obj_t *self); +extern uint16_t common_hal_frequencyio_frequencyin_get_capture_period(frequencyio_frequencyin_obj_t *self); +extern void common_hal_frequencyio_frequencyin_set_capture_period(frequencyio_frequencyin_obj_t *self, uint16_t capture_period); + +#endif // MICROPY_INCLUDED_SHARED_BINDINGS_FREQUENCYIO_FREQUENCYIN_H diff --git a/shared-bindings/frequencyio/__init__.c b/shared-bindings/frequencyio/__init__.c new file mode 100644 index 000000000..48a026824 --- /dev/null +++ b/shared-bindings/frequencyio/__init__.c @@ -0,0 +1,89 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Michael Schroeder + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include <stdint.h> + +#include "py/obj.h" +#include "py/runtime.h" + +#include "shared-bindings/microcontroller/Pin.h" +#include "shared-bindings/frequencyio/__init__.h" +#include "shared-bindings/frequencyio/FrequencyIn.h" + +//| :mod:`frequencyio` --- Support for frequency based protocols +//| ============================================================= +//| +//| .. module:: frequencyio +//| :synopsis: Support for frequency based protocols +//| :platform: SAMD51 +//| +//| The `frequencyio` module contains classes to provide access to basic frequency IO. +//| +//| Libraries +//| +//| .. toctree:: +//| :maxdepth: 3 +//| +//| FrequencyIn +//| + +//| .. warning:: This module is not available in SAMD21 builds. See the +//| :ref:`module-support-matrix` for more info. +//| + +//| All classes change hardware state and should be deinitialized when they +//| are no longer needed if the program continues after use. To do so, either +//| call :py:meth:`!deinit` or use a context manager. See +//| :ref:`lifetime-and-contextmanagers` for more info. +//| +//| For example:: +//| +//| import frequencyio +//| import time +//| from board import * +//| +//| frequency = frequencyio.FrequencyIn(D13) +//| frequency.capture_period = 15 +//| time.sleep(0.1) +//| +//| This example will initialize the the device, set +//| :py:data:`~frequencyio.FrequencyIn.capture_period`, and then sleep 0.1 seconds. +//| CircuitPython will automatically turn off FrequencyIn capture when it resets all +//| hardware after program completion. Use ``deinit()`` or a ``with`` statement +//| to do it yourself. +//| + +STATIC const mp_rom_map_elem_t frequencyio_module_globals_table[] = { + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_frequencyio) }, + { MP_ROM_QSTR(MP_QSTR_FrequencyIn), MP_ROM_PTR(&frequencyio_frequencyin_type) }, +}; + +STATIC MP_DEFINE_CONST_DICT(frequencyio_module_globals, frequencyio_module_globals_table); + +const mp_obj_module_t frequencyio_module = { + .base = { &mp_type_module }, + .globals = (mp_obj_dict_t*)&frequencyio_module_globals, +}; diff --git a/shared-bindings/frequencyio/__init__.h b/shared-bindings/frequencyio/__init__.h new file mode 100644 index 000000000..391576594 --- /dev/null +++ b/shared-bindings/frequencyio/__init__.h @@ -0,0 +1,34 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Michael Schroeder + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_FREQUENCYIO___INIT___H +#define MICROPY_INCLUDED_SHARED_BINDINGS_FREQUENCYIO___INIT___H + +#include "py/obj.h" + +// Nothing now. + +#endif // MICROPY_INCLUDED_SHARED_BINDINGS_FREQUENCYIO___INIT___H diff --git a/shared-bindings/gamepad/GamePad.c b/shared-bindings/gamepad/GamePad.c index 21da4fab9..4458c972f 100644 --- a/shared-bindings/gamepad/GamePad.c +++ b/shared-bindings/gamepad/GamePad.c @@ -95,7 +95,7 @@ //| button presses start to be recorded. //| STATIC mp_obj_t gamepad_make_new(const mp_obj_type_t *type, size_t n_args, - size_t n_kw, const mp_obj_t *args) { + const mp_obj_t *args, mp_map_t *kw_args) { if (n_args > 8) { mp_raise_TypeError(translate("too many arguments")); } diff --git a/shared-bindings/i2cslave/I2CSlave.c b/shared-bindings/i2cslave/I2CSlave.c index d2e001e4c..090a53581 100644 --- a/shared-bindings/i2cslave/I2CSlave.c +++ b/shared-bindings/i2cslave/I2CSlave.c @@ -64,12 +64,9 @@ STATIC mp_obj_t mp_obj_new_i2cslave_i2c_slave_request(i2cslave_i2c_slave_obj_t * //| :param tuple addresses: The I2C addresses to respond to (how many is hw dependent). //| :param bool smbus: Use SMBUS timings if the hardware supports it //| -STATIC mp_obj_t i2cslave_i2c_slave_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { - mp_arg_check_num(n_args, n_kw, 0, MP_OBJ_FUN_ARGS_MAX, true); +STATIC mp_obj_t i2cslave_i2c_slave_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { i2cslave_i2c_slave_obj_t *self = m_new_obj(i2cslave_i2c_slave_obj_t); self->base.type = &i2cslave_i2c_slave_type; - mp_map_t kw_args; - mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); enum { ARG_scl, ARG_sda, ARG_addresses, ARG_smbus }; static const mp_arg_t allowed_args[] = { { MP_QSTR_scl, MP_ARG_REQUIRED | MP_ARG_OBJ }, @@ -78,7 +75,7 @@ STATIC mp_obj_t i2cslave_i2c_slave_make_new(const mp_obj_type_t *type, size_t n_ { MP_QSTR_smbus, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all(n_args, pos_args, &kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); assert_pin(args[ARG_scl].u_obj, false); assert_pin(args[ARG_sda].u_obj, false); @@ -247,8 +244,8 @@ const mp_obj_type_t i2cslave_i2c_slave_type = { //| :param bool is_read: I2C Master read request //| :param bool is_restart: Repeated Start Condition //| -STATIC mp_obj_t i2cslave_i2c_slave_request_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { - mp_arg_check_num(n_args, n_kw, 4, 4, false); +STATIC mp_obj_t i2cslave_i2c_slave_request_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 4, 4, false); return mp_obj_new_i2cslave_i2c_slave_request(args[0], mp_obj_get_int(args[1]), mp_obj_is_true(args[2]), mp_obj_is_true(args[3])); } diff --git a/shared-bindings/index.rst b/shared-bindings/index.rst index 44b3492e6..4f2e28702 100644 --- a/shared-bindings/index.rst +++ b/shared-bindings/index.rst @@ -42,6 +42,7 @@ Module Supported Ports `bleio` **nRF** `busio` **All Supported** `digitalio` **All Supported** +`frequencyio` **SAMD51** `gamepad` **SAMD Express, nRF** `hashlib` **ESP8266** `i2cslave` **SAMD Express** @@ -61,4 +62,6 @@ Module Supported Ports `touchio` **SAMD/SAMD Express** `uheap` **Debug (All)** `usb_hid` **SAMD/SAMD Express** +`_pixelbuf` **SAMD Express** +`_stage` **SAMD/SAMD Express** ================= ============================== diff --git a/shared-bindings/network/__init__.c b/shared-bindings/network/__init__.c index 69f8bea60..1067ea549 100644 --- a/shared-bindings/network/__init__.c +++ b/shared-bindings/network/__init__.c @@ -36,7 +36,7 @@ #include "shared-bindings/network/__init__.h" -#if MICROPY_PY_NETWORK +#if CIRCUITPY_NETWORK //| :mod:`network` --- Network Interface Management //| =============================================== @@ -71,4 +71,4 @@ const mp_obj_module_t network_module = { .globals = (mp_obj_dict_t*)&mp_module_network_globals, }; -#endif // MICROPY_PY_NETWORK +#endif // CIRCUITPY_NETWORK diff --git a/shared-bindings/nvm/__init__.c b/shared-bindings/nvm/__init__.c index ef5c7ccb3..811855c09 100644 --- a/shared-bindings/nvm/__init__.c +++ b/shared-bindings/nvm/__init__.c @@ -55,8 +55,7 @@ STATIC const mp_rom_map_elem_t nvm_module_globals_table[] = { STATIC MP_DEFINE_CONST_DICT(nvm_module_globals, nvm_module_globals_table); -// cpy prefix is used to prevent collision with nvm_module global in ASF. -const mp_obj_module_t cpy_nvm_module = { +const mp_obj_module_t nvm_module = { .base = { &mp_type_module }, .globals = (mp_obj_dict_t*)&nvm_module_globals, }; diff --git a/shared-bindings/pulseio/PWMOut.c b/shared-bindings/pulseio/PWMOut.c index 362b8123d..37939a07a 100644 --- a/shared-bindings/pulseio/PWMOut.c +++ b/shared-bindings/pulseio/PWMOut.c @@ -85,32 +85,39 @@ //| pwm.frequency = 880 //| time.sleep(0.1) //| -STATIC mp_obj_t pulseio_pwmout_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { - mp_arg_check_num(n_args, n_kw, 1, MP_OBJ_FUN_ARGS_MAX, true); - mp_obj_t pin_obj = args[0]; - assert_pin(pin_obj, false); - const mcu_pin_obj_t *pin = MP_OBJ_TO_PTR(pin_obj); - assert_pin_free(pin); - - // create PWM object from the given pin - pulseio_pwmout_obj_t *self = m_new_obj(pulseio_pwmout_obj_t); - self->base.type = &pulseio_pwmout_type; - - mp_map_t kw_args; - mp_map_init_fixed_table(&kw_args, n_kw, args + n_args); - enum { ARG_duty_cycle, ARG_frequency, ARG_variable_frequency }; +STATIC mp_obj_t pulseio_pwmout_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { + enum { ARG_pin, ARG_duty_cycle, ARG_frequency, ARG_variable_frequency }; static const mp_arg_t allowed_args[] = { + { MP_QSTR_pin, MP_ARG_REQUIRED | MP_ARG_OBJ, }, { MP_QSTR_duty_cycle, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} }, { MP_QSTR_frequency, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 500} }, { MP_QSTR_variable_frequency, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} }, }; mp_arg_val_t parsed_args[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all(n_args - 1, args + 1, &kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, parsed_args); + mp_arg_parse_all(n_args, args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, parsed_args); + + mp_obj_t pin_obj = parsed_args[ARG_pin].u_obj; + assert_pin(pin_obj, false); + const mcu_pin_obj_t *pin = MP_OBJ_TO_PTR(pin_obj); + assert_pin_free(pin); + uint16_t duty_cycle = parsed_args[ARG_duty_cycle].u_int; uint32_t frequency = parsed_args[ARG_frequency].u_int; - bool variable_frequency = parsed_args[ARG_variable_frequency].u_int; + bool variable_frequency = parsed_args[ARG_variable_frequency].u_bool; - common_hal_pulseio_pwmout_construct(self, pin, duty_cycle, frequency, variable_frequency); + // create PWM object from the given pin + pulseio_pwmout_obj_t *self = m_new_obj(pulseio_pwmout_obj_t); + self->base.type = &pulseio_pwmout_type; + pwmout_result_t result = common_hal_pulseio_pwmout_construct(self, pin, duty_cycle, frequency, variable_frequency); + if (result == PWMOUT_INVALID_PIN) { + mp_raise_ValueError(translate("Invalid pin")); + } else if (result == PWMOUT_INVALID_FREQUENCY) { + mp_raise_ValueError(translate("Invalid PWM frequency")); + } else if (result == PWMOUT_ALL_TIMERS_ON_PIN_IN_USE) { + mp_raise_ValueError(translate("All timers for this pin are in use")); + } else if (result == PWMOUT_ALL_TIMERS_IN_USE) { + mp_raise_RuntimeError(translate("All timers in use")); + } return MP_OBJ_FROM_PTR(self); } diff --git a/shared-bindings/pulseio/PWMOut.h b/shared-bindings/pulseio/PWMOut.h index 0b630816b..c01e0c926 100644 --- a/shared-bindings/pulseio/PWMOut.h +++ b/shared-bindings/pulseio/PWMOut.h @@ -32,7 +32,15 @@ extern const mp_obj_type_t pulseio_pwmout_type; -extern void common_hal_pulseio_pwmout_construct(pulseio_pwmout_obj_t* self, +typedef enum { + PWMOUT_OK, + PWMOUT_INVALID_PIN, + PWMOUT_INVALID_FREQUENCY, + PWMOUT_ALL_TIMERS_ON_PIN_IN_USE, + PWMOUT_ALL_TIMERS_IN_USE +} pwmout_result_t; + +extern pwmout_result_t common_hal_pulseio_pwmout_construct(pulseio_pwmout_obj_t* self, const mcu_pin_obj_t* pin, uint16_t duty, uint32_t frequency, bool variable_frequency); extern void common_hal_pulseio_pwmout_deinit(pulseio_pwmout_obj_t* self); @@ -43,4 +51,8 @@ extern void common_hal_pulseio_pwmout_set_frequency(pulseio_pwmout_obj_t* self, extern uint32_t common_hal_pulseio_pwmout_get_frequency(pulseio_pwmout_obj_t* self); extern bool common_hal_pulseio_pwmout_get_variable_frequency(pulseio_pwmout_obj_t* self); +// This is used by the supervisor to claim PWMOut devices indefinitely. +extern void common_hal_pulseio_pwmout_never_reset(pulseio_pwmout_obj_t *self); +extern void common_hal_pulseio_pwmout_reset_ok(pulseio_pwmout_obj_t *self); + #endif // MICROPY_INCLUDED_SHARED_BINDINGS_PULSEIO_PWMOUT_H diff --git a/shared-bindings/pulseio/PulseIn.c b/shared-bindings/pulseio/PulseIn.c index acf88b9fb..426ac4384 100644 --- a/shared-bindings/pulseio/PulseIn.c +++ b/shared-bindings/pulseio/PulseIn.c @@ -81,10 +81,7 @@ //| # Resume with an 80 microsecond active pulse //| pulses.resume(80) //| -STATIC mp_obj_t pulseio_pulsein_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { - mp_arg_check_num(n_args, n_kw, 1, MP_OBJ_FUN_ARGS_MAX, true); - mp_map_t kw_args; - mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); +STATIC mp_obj_t pulseio_pulsein_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { enum { ARG_pin, ARG_maxlen, ARG_idle_state }; static const mp_arg_t allowed_args[] = { { MP_QSTR_pin, MP_ARG_REQUIRED | MP_ARG_OBJ }, @@ -92,7 +89,7 @@ STATIC mp_obj_t pulseio_pulsein_make_new(const mp_obj_type_t *type, size_t n_arg { MP_QSTR_idle_state, MP_ARG_BOOL, {.u_bool = false} }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all(n_args, pos_args, &kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); assert_pin(args[ARG_pin].u_obj, false); const mcu_pin_obj_t* pin = MP_OBJ_TO_PTR(args[ARG_pin].u_obj); assert_pin_free(pin); @@ -260,7 +257,7 @@ STATIC mp_obj_t pulsein_unary_op(mp_unary_op_t op, mp_obj_t self_in) { } } -//| .. method:: __get__(index) +//| .. method:: __getitem__(index) //| //| Returns the value at the given index or values in slice. //| @@ -280,12 +277,7 @@ STATIC mp_obj_t pulsein_subscr(mp_obj_t self_in, mp_obj_t index_obj, mp_obj_t va if (MP_OBJ_IS_TYPE(index_obj, &mp_type_slice)) { mp_raise_NotImplementedError(translate("Slices not supported")); } else { - uint16_t index = 0; - if (MP_OBJ_IS_SMALL_INT(index_obj)) { - index = MP_OBJ_SMALL_INT_VALUE(index_obj); - } else { - mp_raise_TypeError(translate("index must be int")); - } + size_t index = mp_get_index(&pulseio_pulsein_type, common_hal_pulseio_pulsein_get_len(self), index_obj, false); if (value == MP_OBJ_SENTINEL) { // load return MP_OBJ_NEW_SMALL_INT(common_hal_pulseio_pulsein_get_item(self, index)); diff --git a/shared-bindings/pulseio/PulseOut.c b/shared-bindings/pulseio/PulseOut.c index e9834c12a..493b7e2ff 100644 --- a/shared-bindings/pulseio/PulseOut.c +++ b/shared-bindings/pulseio/PulseOut.c @@ -68,8 +68,8 @@ //| pulses[0] = 200 //| pulse.send(pulses) //| -STATIC mp_obj_t pulseio_pulseout_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { - mp_arg_check_num(n_args, n_kw, 1, 1, true); +STATIC mp_obj_t pulseio_pulseout_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 1, 1, false); mp_obj_t carrier_obj = args[0]; if (!MP_OBJ_IS_TYPE(carrier_obj, &pulseio_pwmout_type)) { diff --git a/shared-bindings/rotaryio/IncrementalEncoder.c b/shared-bindings/rotaryio/IncrementalEncoder.c index 65d4ba98b..5d2264ffc 100644 --- a/shared-bindings/rotaryio/IncrementalEncoder.c +++ b/shared-bindings/rotaryio/IncrementalEncoder.c @@ -64,17 +64,14 @@ //| print(position) //| last_position = position //| -STATIC mp_obj_t rotaryio_incrementalencoder_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { - mp_arg_check_num(n_args, n_kw, 2, 2, true); - mp_map_t kw_args; - mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); +STATIC mp_obj_t rotaryio_incrementalencoder_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { enum { ARG_pin_a, ARG_pin_b }; static const mp_arg_t allowed_args[] = { { MP_QSTR_pin_a, MP_ARG_REQUIRED | MP_ARG_OBJ }, { MP_QSTR_pin_b, MP_ARG_REQUIRED | MP_ARG_OBJ }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all(n_args, pos_args, &kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); assert_pin(args[ARG_pin_a].u_obj, false); const mcu_pin_obj_t* pin_a = MP_OBJ_TO_PTR(args[ARG_pin_a].u_obj); diff --git a/shared-bindings/rtc/RTC.c b/shared-bindings/rtc/RTC.c index a0e9be302..474d4a399 100644 --- a/shared-bindings/rtc/RTC.c +++ b/shared-bindings/rtc/RTC.c @@ -63,9 +63,9 @@ const rtc_rtc_obj_t rtc_rtc_obj = {{&rtc_rtc_type}}; //| //| This class represents the onboard Real Time Clock. It is a singleton and will always return the same instance. //| -STATIC mp_obj_t rtc_rtc_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +STATIC mp_obj_t rtc_rtc_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { // No arguments - mp_arg_check_num(n_args, n_kw, 0, 0, false); + mp_arg_check_num(n_args, kw_args, 0, 0, false); // return constant object return (mp_obj_t)&rtc_rtc_obj; diff --git a/shared-bindings/socket/__init__.c b/shared-bindings/socket/__init__.c index d860c40c8..c59724efc 100644 --- a/shared-bindings/socket/__init__.c +++ b/shared-bindings/socket/__init__.c @@ -39,20 +39,20 @@ //| :mod:`socket` --- TCP, UDP and RAW socket support //| ================================================= -//| +//| //| .. module:: socket //| :synopsis: TCP, UDP and RAW sockets //| :platform: SAMD21, SAMD51 //| //| Create TCP, UDP and RAW sockets for communicating over the Internet. -//| +//| STATIC const mp_obj_type_t socket_type; //| .. currentmodule:: socket //| //| .. class:: socket(family, type, proto, ...) -//| +//| //| Create a new socket //| //| :param ~int family: AF_INET or AF_INET6 @@ -60,8 +60,8 @@ STATIC const mp_obj_type_t socket_type; //| :param ~int proto: IPPROTO_TCP, IPPROTO_UDP or IPPROTO_RAW (ignored) //| -STATIC mp_obj_t socket_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { - mp_arg_check_num(n_args, n_kw, 0, 4, false); +STATIC mp_obj_t socket_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { + mp_arg_check_num(n_args, kw_args, 0, 4, false); // create socket object (not bound to any NIC yet) mod_network_socket_obj_t *s = m_new_obj_with_finaliser(mod_network_socket_obj_t); @@ -240,13 +240,59 @@ STATIC mp_obj_t socket_send(mp_obj_t self_in, mp_obj_t buf_in) { } STATIC MP_DEFINE_CONST_FUN_OBJ_2(socket_send_obj, socket_send); + +// helper function for socket_recv and socket_recv_into to handle common operations of both +STATIC mp_int_t _socket_recv_into(mod_network_socket_obj_t *sock, byte *buf, mp_int_t len) { + int _errno; + mp_int_t ret = sock->nic_type->recv(sock, buf, len, &_errno); + if (ret == -1) { + mp_raise_OSError(_errno); + } + return len; +} + + +//| .. method:: recv_into(buffer[, bufsize]) +//| +//| Reads some bytes from the connected remote address, writing +//| into the provided buffer. If bufsize <= len(buffer) is given, +//| a maximum of bufsize bytes will be read into the buffer. If no +//| valid value is given for bufsize, the default is the length of +//| the given buffer. +//| +//| Suits sockets of type SOCK_STREAM +//| Returns an int of number of bytes read. +//| +//| :param bytearray buffer: buffer to receive into +//| :param int bufsize: optionally, a maximum number of bytes to read. + +STATIC mp_obj_t socket_recv_into(size_t n_args, const mp_obj_t *args) { + mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(args[0]); + if (self->nic == MP_OBJ_NULL) { + // not connected + mp_raise_OSError(MP_ENOTCONN); + } + mp_buffer_info_t bufinfo; + mp_get_buffer_raise(args[1], &bufinfo, MP_BUFFER_WRITE); + mp_int_t len; + if (n_args == 3) { + len = mp_obj_get_int(args[2]); + } + if (n_args == 2 || (size_t) len > bufinfo.len) { + len = bufinfo.len; + } + mp_int_t ret = _socket_recv_into(self, (byte*)bufinfo.buf, len); + return mp_obj_new_int_from_uint(ret); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(socket_recv_into_obj, 2, 3, socket_recv_into); + //| .. method:: recv(bufsize) //| //| Reads some bytes from the connected remote address. //| Suits sockets of type SOCK_STREAM //| Returns a bytes() of length <= bufsize -//| -//| :param ~int bufsize: maximum number of bytes to receive +//| +//| :param ~int bufsize: maximum number of bytes to receive STATIC mp_obj_t socket_recv(mp_obj_t self_in, mp_obj_t len_in) { mod_network_socket_obj_t *self = MP_OBJ_TO_PTR(self_in); @@ -257,11 +303,7 @@ STATIC mp_obj_t socket_recv(mp_obj_t self_in, mp_obj_t len_in) { mp_int_t len = mp_obj_get_int(len_in); vstr_t vstr; vstr_init_len(&vstr, len); - int _errno; - mp_int_t ret = self->nic_type->recv(self, (byte*)vstr.buf, len, &_errno); - if (ret == -1) { - mp_raise_OSError(_errno); - } + mp_int_t ret = _socket_recv_into(self, (byte*)vstr.buf, len); if (ret == 0) { return mp_const_empty_bytes; } @@ -313,7 +355,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_3(socket_sendto_obj, socket_sendto); //| * a bytes() of length <= bufsize //| * a remote_address, which is a tuple of ip address and port number //| -//| :param ~int bufsize: maximum number of bytes to receive +//| :param ~int bufsize: maximum number of bytes to receive //| STATIC mp_obj_t socket_recvfrom(mp_obj_t self_in, mp_obj_t len_in) { @@ -436,6 +478,7 @@ STATIC const mp_rom_map_elem_t socket_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_recv), MP_ROM_PTR(&socket_recv_obj) }, { MP_ROM_QSTR(MP_QSTR_sendto), MP_ROM_PTR(&socket_sendto_obj) }, { MP_ROM_QSTR(MP_QSTR_recvfrom), MP_ROM_PTR(&socket_recvfrom_obj) }, + { MP_ROM_QSTR(MP_QSTR_recv_into), MP_ROM_PTR(&socket_recv_into_obj) }, { MP_ROM_QSTR(MP_QSTR_setsockopt), MP_ROM_PTR(&socket_setsockopt_obj) }, { MP_ROM_QSTR(MP_QSTR_settimeout), MP_ROM_PTR(&socket_settimeout_obj) }, { MP_ROM_QSTR(MP_QSTR_setblocking), MP_ROM_PTR(&socket_setblocking_obj) }, @@ -469,10 +512,10 @@ STATIC const mp_obj_type_t socket_type = { }; //| .. function:: getaddrinfo(host, port) -//| +//| //| Gets the address information for a hostname and port //| -//| Returns the appropriate family, socket type, socket protocol and +//| Returns the appropriate family, socket type, socket protocol and //| address information to call socket.socket() and socket.connect() with, //| as a tuple. //| diff --git a/shared-bindings/storage/__init__.c b/shared-bindings/storage/__init__.c index 3484b9af8..4db3a9fec 100644 --- a/shared-bindings/storage/__init__.c +++ b/shared-bindings/storage/__init__.c @@ -54,10 +54,12 @@ //| //| This is the CircuitPython analog to the UNIX ``mount`` command. //| +//| :param bool readonly: True when the filesystem should be readonly to CircuitPython. +//| mp_obj_t storage_mount(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { enum { ARG_readonly }; static const mp_arg_t allowed_args[] = { - { MP_QSTR_readonly, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_false} }, + { MP_QSTR_readonly, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} }, }; // parse args @@ -77,7 +79,7 @@ mp_obj_t storage_mount(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_arg mp_raise_ValueError(translate("filesystem must provide mount method")); } - common_hal_storage_mount(vfs_obj, mnt_str, mp_obj_is_true(args[ARG_readonly].u_obj)); + common_hal_storage_mount(vfs_obj, mnt_str, args[ARG_readonly].u_bool); return mp_const_none; } @@ -101,14 +103,21 @@ mp_obj_t storage_umount(mp_obj_t mnt_in) { } MP_DEFINE_CONST_FUN_OBJ_1(storage_umount_obj, storage_umount); -//| .. function:: remount(mount_path, readonly=False) +//| .. function:: remount(mount_path, readonly=False, *, disable_concurrent_write_protection=False) //| //| Remounts the given path with new parameters. //| +//| :param bool readonly: True when the filesystem should be readonly to CircuitPython. +//| :param bool disable_concurrent_write_protection: When True, the check that makes sure the +//| underlying filesystem data is written by one computer is disabled. Disabling the protection +//| allows CircuitPython and a host to write to the same filesystem with the risk that the +//| filesystem will be corrupted. +//| mp_obj_t storage_remount(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { - enum { ARG_readonly }; + enum { ARG_readonly, ARG_disable_concurrent_write_protection }; static const mp_arg_t allowed_args[] = { - { MP_QSTR_readonly, MP_ARG_BOOL | MP_ARG_REQUIRED, {.u_bool = false} }, + { MP_QSTR_readonly, MP_ARG_BOOL, {.u_bool = false} }, + { MP_QSTR_disable_concurrent_write_protection, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} }, }; // get the mount point @@ -118,7 +127,7 @@ mp_obj_t storage_remount(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_a mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); - common_hal_storage_remount(mnt_str, args[ARG_readonly].u_bool); + common_hal_storage_remount(mnt_str, args[ARG_readonly].u_bool, args[ARG_disable_concurrent_write_protection].u_bool); return mp_const_none; } diff --git a/shared-bindings/storage/__init__.h b/shared-bindings/storage/__init__.h index 6a0cb9fc7..7851b9e29 100644 --- a/shared-bindings/storage/__init__.h +++ b/shared-bindings/storage/__init__.h @@ -33,7 +33,7 @@ void common_hal_storage_mount(mp_obj_t vfs_obj, const char* path, bool readonly); void common_hal_storage_umount_path(const char* path); void common_hal_storage_umount_object(mp_obj_t vfs_obj); -void common_hal_storage_remount(const char* path, bool readonly); +void common_hal_storage_remount(const char* path, bool readonly, bool disable_concurrent_write_protection); mp_obj_t common_hal_storage_getmount(const char* path); void common_hal_storage_erase_filesystem(void); diff --git a/shared-bindings/struct/__init__.c b/shared-bindings/struct/__init__.c index 093597785..9240a15bb 100644 --- a/shared-bindings/struct/__init__.c +++ b/shared-bindings/struct/__init__.c @@ -51,7 +51,7 @@ //| //| Supported size/byte order prefixes: *@*, *<*, *>*, *!*. //| -//| Supported format codes: *b*, *B*, *h*, *H*, *i*, *I*, *l*, *L*, *q*, *Q*, +//| Supported format codes: *b*, *B*, *x*, *h*, *H*, *i*, *I*, *l*, *L*, *q*, *Q*, //| *s*, *P*, *f*, *d* (the latter 2 depending on the floating-point support). //| @@ -74,7 +74,6 @@ MP_DEFINE_CONST_FUN_OBJ_1(struct_calcsize_obj, struct_calcsize); //| STATIC mp_obj_t struct_pack(size_t n_args, const mp_obj_t *args) { - // TODO: "The arguments must match the values required by the format exactly." mp_int_t size = MP_OBJ_SMALL_INT_VALUE(struct_calcsize(args[0])); vstr_t vstr; vstr_init_len(&vstr, size); @@ -115,49 +114,67 @@ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(struct_pack_into_obj, 3, MP_OBJ_FUN_ARGS_MAX //| .. function:: unpack(fmt, data) //| //| Unpack from the data according to the format string fmt. The return value -//| is a tuple of the unpacked values. +//| is a tuple of the unpacked values. The buffer size must match the size +//| required by the format. //| -//| .. function:: unpack_from(fmt, data, offset) +STATIC mp_obj_t struct_unpack(size_t n_args, const mp_obj_t *args) { + mp_buffer_info_t bufinfo; + mp_get_buffer_raise(args[1], &bufinfo, MP_BUFFER_READ); + byte *p = bufinfo.buf; + byte *end_p = &p[bufinfo.len]; + + // true means check the size must be exactly right. + return MP_OBJ_FROM_PTR(shared_modules_struct_unpack_from(args[0] , p, end_p, true)); +} +MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(struct_unpack_obj, 2, 3, struct_unpack); + +//| .. function:: unpack_from(fmt, data, offset=0) //| //| Unpack from the data starting at offset according to the format string fmt. //| offset may be negative to count from the end of buffer. The return value is -//| a tuple of the unpacked values. +//| a tuple of the unpacked values. The buffer size must be at least as big +//| as the size required by the form. //| -STATIC mp_obj_t struct_unpack_from(size_t n_args, const mp_obj_t *args) { - // unpack requires that the buffer be exactly the right size. - // unpack_from requires that the buffer be "big enough". - // Since we implement unpack and unpack_from using the same function - // we relax the "exact" requirement, and only implement "big enough". +STATIC mp_obj_t struct_unpack_from(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + enum { ARG_format, ARG_buffer, ARG_offset }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_format, MP_ARG_REQUIRED | MP_ARG_OBJ }, + { MP_QSTR_buffer, MP_ARG_REQUIRED | MP_ARG_OBJ }, + { MP_QSTR_offset, MP_ARG_INT, {.u_int = 0} }, + }; + + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + mp_buffer_info_t bufinfo; - mp_get_buffer_raise(args[1], &bufinfo, MP_BUFFER_READ); + mp_get_buffer_raise(args[ARG_buffer].u_obj, &bufinfo, MP_BUFFER_READ); byte *p = bufinfo.buf; byte *end_p = &p[bufinfo.len]; - if (n_args > 2) { - mp_int_t offset = mp_obj_get_int(args[2]); - // offset arg provided + mp_int_t offset = args[ARG_offset].u_int; + if (offset < 0) { + // negative offsets are relative to the end of the buffer + offset = bufinfo.len + offset; if (offset < 0) { - // negative offsets are relative to the end of the buffer - offset = bufinfo.len + offset; - if (offset < 0) { - mp_raise_RuntimeError(translate("buffer too small")); - } + mp_raise_RuntimeError(translate("buffer too small")); } - p += offset; } + p += offset; - return MP_OBJ_FROM_PTR(shared_modules_struct_unpack_from(args[0] , p, end_p)); + // false means the size doesn't have to be exact. struct.unpack_from() only requires + // that be buffer be big enough. + return MP_OBJ_FROM_PTR(shared_modules_struct_unpack_from(args[ARG_format].u_obj, p, end_p, false)); } -MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(struct_unpack_from_obj, 2, 3, struct_unpack_from); +MP_DEFINE_CONST_FUN_OBJ_KW(struct_unpack_from_obj, 0, struct_unpack_from); STATIC const mp_rom_map_elem_t mp_module_struct_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_struct) }, { MP_ROM_QSTR(MP_QSTR_calcsize), MP_ROM_PTR(&struct_calcsize_obj) }, { MP_ROM_QSTR(MP_QSTR_pack), MP_ROM_PTR(&struct_pack_obj) }, { MP_ROM_QSTR(MP_QSTR_pack_into), MP_ROM_PTR(&struct_pack_into_obj) }, - { MP_ROM_QSTR(MP_QSTR_unpack), MP_ROM_PTR(&struct_unpack_from_obj) }, + { MP_ROM_QSTR(MP_QSTR_unpack), MP_ROM_PTR(&struct_unpack_obj) }, { MP_ROM_QSTR(MP_QSTR_unpack_from), MP_ROM_PTR(&struct_unpack_from_obj) }, }; diff --git a/shared-bindings/struct/__init__.h b/shared-bindings/struct/__init__.h index c4e867aaa..a7e72b11c 100644 --- a/shared-bindings/struct/__init__.h +++ b/shared-bindings/struct/__init__.h @@ -29,6 +29,6 @@ void shared_modules_struct_pack_into(mp_obj_t fmt_in, byte *p, byte* end_p, size_t n_args, const mp_obj_t *args); mp_uint_t shared_modules_struct_calcsize(mp_obj_t fmt_in); -mp_obj_tuple_t * shared_modules_struct_unpack_from(mp_obj_t fmt_in, byte *p, byte *end_p); +mp_obj_tuple_t * shared_modules_struct_unpack_from(mp_obj_t fmt_in, byte *p, byte *end_p, bool exact_size); #endif // MICROPY_INCLUDED_SHARED_BINDINGS_RANDOM___INIT___H diff --git a/shared-bindings/supervisor/Runtime.c b/shared-bindings/supervisor/Runtime.c index 5ba2198e1..746dfe5ee 100755 --- a/shared-bindings/supervisor/Runtime.c +++ b/shared-bindings/supervisor/Runtime.c @@ -59,9 +59,6 @@ //| has been established at any point. Will not reset if //| USB is disconnected but power remains (e.g. battery connected) //| -//| Feather52 (nRF52832): Currently returns ``True`` regardless -//| of USB connection status. -//| STATIC mp_obj_t supervisor_get_serial_connected(mp_obj_t self){ if (!common_hal_get_serial_connected()) { diff --git a/shared-bindings/terminalio/Terminal.c b/shared-bindings/terminalio/Terminal.c new file mode 100644 index 000000000..cdde672d3 --- /dev/null +++ b/shared-bindings/terminalio/Terminal.c @@ -0,0 +1,129 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include <stdint.h> + +#include "shared-bindings/terminalio/Terminal.h" +#include "shared-bindings/util.h" + +#include "py/ioctl.h" +#include "py/objproperty.h" +#include "py/objstr.h" +#include "py/runtime.h" +#include "py/stream.h" +#include "shared-bindings/fontio/BuiltinFont.h" +#include "supervisor/shared/translate.h" + + +//| .. currentmodule:: terminalio +//| +//| :class:`Terminal` -- display a character stream with a TileGrid +//| ================================================================ +//| +//| .. class:: Terminal(tilegrid, font) +//| +//| Terminal manages tile indices and cursor position based on VT100 commands. The font should be +//| a `fontio.BuiltinFont` and the TileGrid's bitmap should match the font's bitmap. +//| + +STATIC mp_obj_t terminalio_terminal_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + enum { ARG_tilegrid, ARG_font }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_tilegrid, MP_ARG_REQUIRED | MP_ARG_OBJ }, + { MP_QSTR_font, MP_ARG_REQUIRED | MP_ARG_OBJ }, + }; + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + mp_obj_t tilegrid = args[ARG_tilegrid].u_obj; + if (!MP_OBJ_IS_TYPE(tilegrid, &displayio_tilegrid_type)) { + mp_raise_TypeError_varg(translate("Expected a %q"), displayio_tilegrid_type.name); + } + + mp_obj_t font = args[ARG_font].u_obj; + if (!MP_OBJ_IS_TYPE(font, &fontio_builtinfont_type)) { + mp_raise_TypeError_varg(translate("Expected a %q"), fontio_builtinfont_type.name); + } + terminalio_terminal_obj_t *self = m_new_obj(terminalio_terminal_obj_t); + self->base.type = &terminalio_terminal_type; + common_hal_terminalio_terminal_construct(self, MP_OBJ_TO_PTR(tilegrid), MP_OBJ_TO_PTR(font)); + return MP_OBJ_FROM_PTR(self); +} + +// These are standard stream methods. Code is in py/stream.c. +// +//| .. method:: write(buf) +//| +//| Write the buffer of bytes to the bus. +//| +//| :return: the number of bytes written +//| :rtype: int or None +//| +STATIC mp_uint_t terminalio_terminal_write(mp_obj_t self_in, const void *buf_in, mp_uint_t size, int *errcode) { + terminalio_terminal_obj_t *self = MP_OBJ_TO_PTR(self_in); + const byte *buf = buf_in; + + return common_hal_terminalio_terminal_write(self, buf, size, errcode); +} + +STATIC mp_uint_t terminalio_terminal_ioctl(mp_obj_t self_in, mp_uint_t request, mp_uint_t arg, int *errcode) { + terminalio_terminal_obj_t *self = MP_OBJ_TO_PTR(self_in); + mp_uint_t ret; + if (request == MP_IOCTL_POLL) { + mp_uint_t flags = arg; + ret = 0; + if ((flags & MP_IOCTL_POLL_WR) && common_hal_terminalio_terminal_ready_to_tx(self)) { + ret |= MP_IOCTL_POLL_WR; + } + } else { + *errcode = MP_EINVAL; + ret = MP_STREAM_ERROR; + } + return ret; +} + +STATIC const mp_rom_map_elem_t terminalio_terminal_locals_dict_table[] = { + // Standard stream methods. + { MP_OBJ_NEW_QSTR(MP_QSTR_write), MP_ROM_PTR(&mp_stream_write_obj) }, +}; +STATIC MP_DEFINE_CONST_DICT(terminalio_terminal_locals_dict, terminalio_terminal_locals_dict_table); + +STATIC const mp_stream_p_t terminalio_terminal_stream_p = { + .read = NULL, + .write = terminalio_terminal_write, + .ioctl = terminalio_terminal_ioctl, + .is_text = true, +}; + +const mp_obj_type_t terminalio_terminal_type = { + { &mp_type_type }, + .name = MP_QSTR_Terminal, + .make_new = terminalio_terminal_make_new, + .getiter = mp_identity_getiter, + .iternext = mp_stream_unbuffered_iter, + .protocol = &terminalio_terminal_stream_p, + .locals_dict = (mp_obj_dict_t*)&terminalio_terminal_locals_dict, +}; diff --git a/shared-bindings/displayio/Sprite.h b/shared-bindings/terminalio/Terminal.h index 1944e1d74..7ae0bf1b0 100644 --- a/shared-bindings/displayio/Sprite.h +++ b/shared-bindings/terminalio/Terminal.h @@ -24,20 +24,22 @@ * THE SOFTWARE. */ -#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYIO_SPRITE_H -#define MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYIO_SPRITE_H +#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_TERMINALIO_TERMINAL_H +#define MICROPY_INCLUDED_SHARED_BINDINGS_TERMINALIO_TERMINAL_H -#include "shared-module/displayio/Sprite.h" +#include "shared-module/terminalio/Terminal.h" -extern const mp_obj_type_t displayio_sprite_type; +#include "shared-bindings/displayio/TileGrid.h" -void common_hal_displayio_sprite_construct(displayio_sprite_t *self, mp_obj_t bitmap, - mp_obj_t pixel_shader, uint16_t width, uint16_t height, uint16_t x, uint16_t y); +extern const mp_obj_type_t terminalio_terminal_type; -void common_hal_displayio_sprite_get_position(displayio_sprite_t *self, int16_t* x, int16_t* y); -void common_hal_displayio_sprite_set_position(displayio_sprite_t *self, int16_t x, int16_t y); +extern void common_hal_terminalio_terminal_construct(terminalio_terminal_obj_t *self, + displayio_tilegrid_t* tilegrid, const fontio_builtinfont_t* font); -mp_obj_t common_hal_displayio_sprite_get_pixel_shader(displayio_sprite_t *self); -void common_hal_displayio_sprite_set_pixel_shader(displayio_sprite_t *self, mp_obj_t pixel_shader); +// Write characters. len is in characters NOT bytes! +extern size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, + const uint8_t *data, size_t len, int *errcode); -#endif // MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYIO_SPRITE_H +extern bool common_hal_terminalio_terminal_ready_to_tx(terminalio_terminal_obj_t *self); + +#endif // MICROPY_INCLUDED_SHARED_BINDINGS_TERMINALIO_TERMINAL_H diff --git a/shared-bindings/terminalio/__init__.c b/shared-bindings/terminalio/__init__.c new file mode 100644 index 000000000..a9fe20f30 --- /dev/null +++ b/shared-bindings/terminalio/__init__.c @@ -0,0 +1,67 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include <stdint.h> + +#include "py/obj.h" +#include "py/runtime.h" + +#include "shared-bindings/terminalio/__init__.h" +#include "shared-bindings/terminalio/Terminal.h" +#include "supervisor/shared/display.h" + +#include "py/runtime.h" + +//| :mod:`terminalio` --- Displays text in a TileGrid +//| ================================================= +//| +//| .. module:: terminalio +//| :synopsis: Displays text in a TileGrid +//| +//| The `terminalio` module contains classes to display a character stream on a display. The built +//| in font is available as ``terminalio.FONT``. +//| +//| Libraries +//| +//| .. toctree:: +//| :maxdepth: 3 +//| +//| Terminal +//| +//| +STATIC const mp_rom_map_elem_t terminalio_module_globals_table[] = { + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_terminalio) }, + { MP_ROM_QSTR(MP_QSTR_Terminal), MP_OBJ_FROM_PTR(&terminalio_terminal_type) }, + { MP_ROM_QSTR(MP_QSTR_FONT), MP_ROM_PTR(&supervisor_terminal_font) }, +}; + + +STATIC MP_DEFINE_CONST_DICT(terminalio_module_globals, terminalio_module_globals_table); + +const mp_obj_module_t terminalio_module = { + .base = { &mp_type_module }, + .globals = (mp_obj_dict_t*)&terminalio_module_globals, +}; diff --git a/shared-bindings/terminalio/__init__.h b/shared-bindings/terminalio/__init__.h new file mode 100644 index 000000000..4be14dfc6 --- /dev/null +++ b/shared-bindings/terminalio/__init__.h @@ -0,0 +1,32 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Scott Shawcroft + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_TERMINALIO___INIT___H +#define MICROPY_INCLUDED_SHARED_BINDINGS_TERMINALIO___INIT___H + +// Nothing now. + +#endif // MICROPY_INCLUDED_SHARED_BINDINGS_TERMINALIO___INIT___H diff --git a/shared-bindings/time/__init__.c b/shared-bindings/time/__init__.c index f97ad4a5d..3babe2db4 100644 --- a/shared-bindings/time/__init__.c +++ b/shared-bindings/time/__init__.c @@ -83,8 +83,8 @@ STATIC mp_obj_t time_sleep(mp_obj_t seconds_o) { MP_DEFINE_CONST_FUN_OBJ_1(time_sleep_obj, time_sleep); #if MICROPY_PY_COLLECTIONS -mp_obj_t struct_time_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { - if (n_args != 1) { +mp_obj_t struct_time_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { + if (n_args != 1 || (kw_args != NULL && kw_args->used > 0)) { mp_raise_TypeError(translate("time.struct_time() takes exactly 1 argument")); } if (!MP_OBJ_IS_TYPE(args[0], &mp_type_tuple) || ((mp_obj_tuple_t*) MP_OBJ_TO_PTR(args[0]))->len != 9) { @@ -92,7 +92,7 @@ mp_obj_t struct_time_make_new(const mp_obj_type_t *type, size_t n_args, size_t n } mp_obj_tuple_t* tuple = MP_OBJ_TO_PTR(args[0]); - return namedtuple_make_new(type, 9, 0, tuple->items); + return namedtuple_make_new(type, 9, tuple->items, NULL); } //| .. class:: struct_time((tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, tm_wday, tm_yday, tm_isdst)) @@ -158,7 +158,7 @@ mp_obj_t struct_time_from_tm(timeutils_struct_time_t *tm) { mp_obj_new_int(-1), // tm_isdst is not supported }; - return namedtuple_make_new((const mp_obj_type_t*)&struct_time_type_obj, 9, 0, elems); + return namedtuple_make_new((const mp_obj_type_t*)&struct_time_type_obj, 9, elems, NULL); }; void struct_time_to_tm(mp_obj_t t, timeutils_struct_time_t *tm) { diff --git a/shared-bindings/touchio/TouchIn.c b/shared-bindings/touchio/TouchIn.c index 326b0212e..3b26aca8c 100644 --- a/shared-bindings/touchio/TouchIn.c +++ b/shared-bindings/touchio/TouchIn.c @@ -61,9 +61,9 @@ //| :param ~microcontroller.Pin pin: the pin to read from //| STATIC mp_obj_t touchio_touchin_make_new(const mp_obj_type_t *type, - mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) { + mp_uint_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { // check number of arguments - mp_arg_check_num(n_args, n_kw, 1, 1, false); + mp_arg_check_num(n_args, kw_args, 1, 1, false); // 1st argument is the pin mp_obj_t pin_obj = args[0]; diff --git a/shared-bindings/usb_hid/Device.c b/shared-bindings/usb_hid/Device.c index 21dbc7a2c..b1097fb24 100644 --- a/shared-bindings/usb_hid/Device.c +++ b/shared-bindings/usb_hid/Device.c @@ -45,11 +45,6 @@ //| //| Not currently dynamically supported. //| -STATIC mp_obj_t usb_hid_device_make_new(const mp_obj_type_t *type, - mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) { - return mp_const_none; -} - //| .. method:: send_report(buf) //| //| Send a HID report. @@ -114,6 +109,5 @@ STATIC MP_DEFINE_CONST_DICT(usb_hid_device_locals_dict, usb_hid_device_locals_di const mp_obj_type_t usb_hid_device_type = { { &mp_type_type }, .name = MP_QSTR_Device, - .make_new = usb_hid_device_make_new, .locals_dict = (mp_obj_t)&usb_hid_device_locals_dict, }; diff --git a/shared-bindings/usb_midi/PortIn.c b/shared-bindings/usb_midi/PortIn.c new file mode 100644 index 000000000..356a81d52 --- /dev/null +++ b/shared-bindings/usb_midi/PortIn.c @@ -0,0 +1,123 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include <stdint.h> + +#include "shared-bindings/usb_midi/PortIn.h" +#include "shared-bindings/util.h" + +#include "py/ioctl.h" +#include "py/objproperty.h" +#include "py/runtime.h" +#include "py/stream.h" +#include "supervisor/shared/translate.h" + + +//| .. currentmodule:: usb_midi +//| +//| :class:`PortIn` -- receives midi commands over USB +//| =================================================== +//| +//| .. class:: PortIn() +//| +//| You cannot create an instance of `usb_midi.PortIn`. +//| +//| PortIn objects are constructed for every corresponding entry in the USB +//| descriptor and added to the ``usb_midi.ports`` tuple. +//| + +// These are standard stream methods. Code is in py/stream.c. +// +//| .. method:: read(nbytes=None) +//| +//| Read characters. If ``nbytes`` is specified then read at most that many +//| bytes. Otherwise, read everything that arrives until the connection +//| times out. Providing the number of bytes expected is highly recommended +//| because it will be faster. +//| +//| :return: Data read +//| :rtype: bytes or None +//| +//| .. method:: readinto(buf, nbytes=None) +//| +//| Read bytes into the ``buf``. If ``nbytes`` is specified then read at most +//| that many bytes. Otherwise, read at most ``len(buf)`` bytes. +//| +//| :return: number of bytes read and stored into ``buf`` +//| :rtype: bytes or None +//| + +// These three methods are used by the shared stream methods. +STATIC mp_uint_t usb_midi_portin_read(mp_obj_t self_in, void *buf_in, mp_uint_t size, int *errcode) { + usb_midi_portin_obj_t *self = MP_OBJ_TO_PTR(self_in); + byte *buf = buf_in; + + // make sure we want at least 1 char + if (size == 0) { + return 0; + } + + return common_hal_usb_midi_portin_read(self, buf, size, errcode); +} + +STATIC mp_uint_t usb_midi_portin_ioctl(mp_obj_t self_in, mp_uint_t request, mp_uint_t arg, int *errcode) { + usb_midi_portin_obj_t *self = MP_OBJ_TO_PTR(self_in); + mp_uint_t ret; + if (request == MP_IOCTL_POLL) { + mp_uint_t flags = arg; + ret = 0; + if ((flags & MP_IOCTL_POLL_RD) && common_hal_usb_midi_portin_bytes_available(self) > 0) { + ret |= MP_IOCTL_POLL_RD; + } + } else { + *errcode = MP_EINVAL; + ret = MP_STREAM_ERROR; + } + return ret; +} + +STATIC const mp_rom_map_elem_t usb_midi_portin_locals_dict_table[] = { + // Standard stream methods. + { MP_OBJ_NEW_QSTR(MP_QSTR_read), MP_ROM_PTR(&mp_stream_read_obj) }, + { MP_OBJ_NEW_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&mp_stream_readinto_obj) }, +}; +STATIC MP_DEFINE_CONST_DICT(usb_midi_portin_locals_dict, usb_midi_portin_locals_dict_table); + +STATIC const mp_stream_p_t usb_midi_portin_stream_p = { + .read = usb_midi_portin_read, + .write = NULL, + .ioctl = usb_midi_portin_ioctl, + .is_text = false, +}; + +const mp_obj_type_t usb_midi_portin_type = { + { &mp_type_type }, + .name = MP_QSTR_PortIn, + .getiter = mp_identity_getiter, + .iternext = mp_stream_unbuffered_iter, + .protocol = &usb_midi_portin_stream_p, + .locals_dict = (mp_obj_dict_t*)&usb_midi_portin_locals_dict, +}; diff --git a/shared-bindings/usb_midi/PortIn.h b/shared-bindings/usb_midi/PortIn.h new file mode 100644 index 000000000..58d017fa0 --- /dev/null +++ b/shared-bindings/usb_midi/PortIn.h @@ -0,0 +1,41 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_USB_MIDI_PORTIN_H +#define MICROPY_INCLUDED_SHARED_BINDINGS_USB_MIDI_PORTIN_H + +#include "shared-module/usb_midi/PortIn.h" + +extern const mp_obj_type_t usb_midi_portin_type; + +// Read characters. +extern size_t common_hal_usb_midi_portin_read(usb_midi_portin_obj_t *self, + uint8_t *data, size_t len, int *errcode); + +extern uint32_t common_hal_usb_midi_portin_bytes_available(usb_midi_portin_obj_t *self); +extern void common_hal_usb_midi_portin_clear_buffer(usb_midi_portin_obj_t *self); + +#endif // MICROPY_INCLUDED_SHARED_BINDINGS_USB_MIDI_PORTIN_H diff --git a/shared-bindings/usb_midi/PortOut.c b/shared-bindings/usb_midi/PortOut.c new file mode 100644 index 000000000..6f4ce6716 --- /dev/null +++ b/shared-bindings/usb_midi/PortOut.c @@ -0,0 +1,105 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include <stdint.h> + +#include "shared-bindings/usb_midi/PortOut.h" +#include "shared-bindings/util.h" + +#include "py/ioctl.h" +#include "py/objproperty.h" +#include "py/runtime.h" +#include "py/stream.h" +#include "supervisor/shared/translate.h" + + +//| .. currentmodule:: usb_midi +//| +//| :class:`PortOut` -- sends midi messages to a computer over USB +//| ============================================================== +//| +//| .. class:: PortOut() +//| +//| You cannot create an instance of `usb_midi.PortOut`. +//| +//| PortOut objects are constructed for every corresponding entry in the USB +//| descriptor and added to the ``usb_midi.ports`` tuple. +//| + +// These are standard stream methods. Code is in py/stream.c. +// +//| .. method:: write(buf) +//| +//| Write the buffer of bytes to the bus. +//| +//| :return: the number of bytes written +//| :rtype: int or None +//| + +STATIC mp_uint_t usb_midi_portout_write(mp_obj_t self_in, const void *buf_in, mp_uint_t size, int *errcode) { + usb_midi_portout_obj_t *self = MP_OBJ_TO_PTR(self_in); + const byte *buf = buf_in; + + return common_hal_usb_midi_portout_write(self, buf, size, errcode); +} + +STATIC mp_uint_t usb_midi_portout_ioctl(mp_obj_t self_in, mp_uint_t request, mp_uint_t arg, int *errcode) { + usb_midi_portout_obj_t *self = MP_OBJ_TO_PTR(self_in); + mp_uint_t ret; + if (request == MP_IOCTL_POLL) { + mp_uint_t flags = arg; + ret = 0; + if ((flags & MP_IOCTL_POLL_WR) && common_hal_usb_midi_portout_ready_to_tx(self)) { + ret |= MP_IOCTL_POLL_WR; + } + } else { + *errcode = MP_EINVAL; + ret = MP_STREAM_ERROR; + } + return ret; +} + +STATIC const mp_rom_map_elem_t usb_midi_portout_locals_dict_table[] = { + // Standard stream methods. + { MP_OBJ_NEW_QSTR(MP_QSTR_write), MP_ROM_PTR(&mp_stream_write_obj) }, +}; +STATIC MP_DEFINE_CONST_DICT(usb_midi_portout_locals_dict, usb_midi_portout_locals_dict_table); + +STATIC const mp_stream_p_t usb_midi_portout_stream_p = { + .read = NULL, + .write = usb_midi_portout_write, + .ioctl = usb_midi_portout_ioctl, + .is_text = false, +}; + +const mp_obj_type_t usb_midi_portout_type = { + { &mp_type_type }, + .name = MP_QSTR_PortOut, + .getiter = mp_identity_getiter, + .iternext = mp_stream_unbuffered_iter, + .protocol = &usb_midi_portout_stream_p, + .locals_dict = (mp_obj_dict_t*)&usb_midi_portout_locals_dict, +}; diff --git a/shared-bindings/usb_midi/PortOut.h b/shared-bindings/usb_midi/PortOut.h new file mode 100644 index 000000000..1eac2fa98 --- /dev/null +++ b/shared-bindings/usb_midi/PortOut.h @@ -0,0 +1,40 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_USB_MIDI_PORTOUT_H +#define MICROPY_INCLUDED_SHARED_BINDINGS_USB_MIDI_PORTOUT_H + +#include "shared-module/usb_midi/PortOut.h" + +extern const mp_obj_type_t usb_midi_portout_type; + +// Write characters. len is in characters NOT bytes! +extern size_t common_hal_usb_midi_portout_write(usb_midi_portout_obj_t *self, + const uint8_t *data, size_t len, int *errcode); + +extern bool common_hal_usb_midi_portout_ready_to_tx(usb_midi_portout_obj_t *self); + +#endif // MICROPY_INCLUDED_SHARED_BINDINGS_USB_MIDI_PORTOUT_H diff --git a/shared-bindings/usb_midi/__init__.c b/shared-bindings/usb_midi/__init__.c new file mode 100644 index 000000000..f57d3631b --- /dev/null +++ b/shared-bindings/usb_midi/__init__.c @@ -0,0 +1,78 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include <stdint.h> + +#include "py/obj.h" +#include "py/runtime.h" + +#include "shared-bindings/usb_midi/__init__.h" +#include "shared-bindings/usb_midi/PortIn.h" +#include "shared-bindings/usb_midi/PortOut.h" + +#include "py/runtime.h" + +//| :mod:`usb_midi` --- MIDI over USB +//| ================================================= +//| +//| .. module:: usb_midi +//| :synopsis: MIDI over USB +//| +//| The `usb_midi` module contains classes to transmit and receive MIDI messages over USB +//| +//| Libraries +//| +//| .. toctree:: +//| :maxdepth: 3 +//| +//| PortIn +//| PortOut +//| +//| +mp_map_elem_t usb_midi_module_globals_table[] = { + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_usb_midi) }, + { MP_ROM_QSTR(MP_QSTR_ports), mp_const_empty_tuple }, + { MP_ROM_QSTR(MP_QSTR_PortIn), MP_OBJ_FROM_PTR(&usb_midi_portin_type) }, + { MP_ROM_QSTR(MP_QSTR_PortOut), MP_OBJ_FROM_PTR(&usb_midi_portout_type) }, +}; + +// This isn't const so we can set ports dynamically. +mp_obj_dict_t usb_midi_module_globals = { + .base = {&mp_type_dict}, + .map = { + .all_keys_are_qstrs = 1, + .is_fixed = 1, + .is_ordered = 1, + .used = MP_ARRAY_SIZE(usb_midi_module_globals_table), + .alloc = MP_ARRAY_SIZE(usb_midi_module_globals_table), + .table = usb_midi_module_globals_table, + }, +}; + +const mp_obj_module_t usb_midi_module = { + .base = { &mp_type_module }, + .globals = (mp_obj_dict_t*)&usb_midi_module_globals, +}; diff --git a/shared-bindings/usb_midi/__init__.h b/shared-bindings/usb_midi/__init__.h new file mode 100644 index 000000000..e81818e04 --- /dev/null +++ b/shared-bindings/usb_midi/__init__.h @@ -0,0 +1,34 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Scott Shawcroft + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_USB_MIDI___INIT___H +#define MICROPY_INCLUDED_SHARED_BINDINGS_USB_MIDI___INIT___H + +#include "py/obj.h" + +extern mp_obj_dict_t usb_midi_module_globals; + +#endif // MICROPY_INCLUDED_SHARED_BINDINGS_USB_MIDI___INIT___H diff --git a/shared-bindings/wiznet/wiznet5k.c b/shared-bindings/wiznet/wiznet5k.c index 4e5fff869..6d43e8992 100644 --- a/shared-bindings/wiznet/wiznet5k.c +++ b/shared-bindings/wiznet/wiznet5k.c @@ -46,22 +46,22 @@ #include "shared-module/wiznet/wiznet5k.h" //| .. currentmodule:: wiznet -//| +//| //| :class:`WIZNET5K` -- wrapper for Wiznet 5500 Ethernet interface //| =============================================================== //| //| .. class:: WIZNET5K(spi, cs, rst) //| //| Create a new WIZNET5500 interface using the specified pins -//| +//| //| :param spi: spi bus to use //| :param cs: pin to use for Chip Select -//| :param rst: pin to sue for Reset +//| :param rst: pin to sue for Reset //| -STATIC mp_obj_t wiznet5k_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +STATIC mp_obj_t wiznet5k_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { // check arguments - mp_arg_check_num(n_args, n_kw, 3, 3, false); + mp_arg_check_num(n_args, kw_args, 3, 3, false); return wiznet5k_create(args[0], args[1], args[2]); } diff --git a/shared-module/_pew/PewPew.c b/shared-module/_pew/PewPew.c new file mode 100644 index 000000000..568dc6425 --- /dev/null +++ b/shared-module/_pew/PewPew.c @@ -0,0 +1,125 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Radomir Dopieralski + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include <stdbool.h> + +#include "py/mpstate.h" +#include "py/runtime.h" +#include "__init__.h" +#include "PewPew.h" + +#include "shared-bindings/digitalio/Pull.h" +#include "shared-bindings/digitalio/DigitalInOut.h" +#include "shared-bindings/util.h" +#include "samd/timers.h" +#include "supervisor/shared/translate.h" +#include "timer_handler.h" + + +static uint8_t pewpew_tc_index = 0xff; + + +void pewpew_interrupt_handler(uint8_t index) { + if (index != pewpew_tc_index) { + return; + } + Tc* tc = tc_insts[index]; + if (!tc->COUNT16.INTFLAG.bit.MC0) { + return; + } + + pew_tick(); + + // Clear the interrupt bit. + tc->COUNT16.INTFLAG.reg = TC_INTFLAG_MC0; +} + +void pew_init() { + pew_obj_t* pew = MP_STATE_VM(pew_singleton); + + common_hal_digitalio_digitalinout_switch_to_input(pew->buttons, PULL_UP); + + for (size_t i = 0; i < pew->rows_size; ++i) { + digitalio_digitalinout_obj_t *pin = MP_OBJ_TO_PTR(pew->rows[i]); + common_hal_digitalio_digitalinout_switch_to_output(pin, false, + DRIVE_MODE_PUSH_PULL); + } + for (size_t i = 0; i < pew->cols_size; ++i) { + digitalio_digitalinout_obj_t *pin = MP_OBJ_TO_PTR(pew->cols[i]); + common_hal_digitalio_digitalinout_switch_to_output(pin, true, + DRIVE_MODE_OPEN_DRAIN); + } + if (pewpew_tc_index == 0xff) { + // Find a spare timer. + uint8_t index = find_free_timer(); + if (index == 0xff) { + mp_raise_RuntimeError(translate("All timers in use")); + } + Tc *tc = tc_insts[index]; + + pewpew_tc_index = index; + set_timer_handler(true, index, TC_HANDLER_PEW); + + // We use GCLK0 for SAMD21 and GCLK1 for SAMD51 because they both run + // at 48mhz making our math the same across the boards. + #ifdef SAMD21 + turn_on_clocks(true, index, 0); + #endif + #ifdef SAMD51 + turn_on_clocks(true, index, 1); + #endif + + + #ifdef SAMD21 + tc->COUNT16.CTRLA.reg = TC_CTRLA_MODE_COUNT16 | + TC_CTRLA_PRESCALER_DIV64 | + TC_CTRLA_WAVEGEN_MFRQ; + #endif + #ifdef SAMD51 + tc_reset(tc); + tc_set_enable(tc, false); + tc->COUNT16.CTRLA.reg = TC_CTRLA_MODE_COUNT16 + | TC_CTRLA_PRESCALER_DIV64; + tc->COUNT16.WAVE.reg = TC_WAVE_WAVEGEN_MFRQ; + #endif + + tc_set_enable(tc, true); + tc->COUNT16.CC[0].reg = 64; + + // Clear our interrupt in case it was set earlier + tc->COUNT16.INTFLAG.reg = TC_INTFLAG_MC0; + tc->COUNT16.INTENSET.reg = TC_INTENSET_MC0; + tc_enable_interrupts(pewpew_tc_index); + } +} + +void pew_reset(void) { + if (pewpew_tc_index != 0xff) { + tc_reset(tc_insts[pewpew_tc_index]); + pewpew_tc_index = 0xff; + } + MP_STATE_VM(pew_singleton) = NULL; +} diff --git a/shared-module/_pew/PewPew.h b/shared-module/_pew/PewPew.h new file mode 100644 index 000000000..da1cae0a2 --- /dev/null +++ b/shared-module/_pew/PewPew.h @@ -0,0 +1,48 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Radomir Dopieralski + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_PEW_PEWPEW_H +#define MICROPY_INCLUDED_PEW_PEWPEW_H + +#include <stdint.h> +#include "shared-bindings/digitalio/DigitalInOut.h" + +typedef struct { + mp_obj_base_t base; + uint8_t* buffer; + mp_obj_t* rows; + mp_obj_t* cols; + digitalio_digitalinout_obj_t *buttons; + uint8_t rows_size; + uint8_t cols_size; + uint8_t pressed; +} pew_obj_t; + +void pew_init(void); +void pewpew_interrupt_handler(uint8_t index); +void pew_reset(void); + +#endif // MICROPY_INCLUDED_PEW_PEWPEW_H diff --git a/shared-module/_pew/__init__.c b/shared-module/_pew/__init__.c new file mode 100644 index 000000000..f3b23c606 --- /dev/null +++ b/shared-module/_pew/__init__.c @@ -0,0 +1,87 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Radomir Dopieralski + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include <stdbool.h> + +#include "py/mpstate.h" +#include "__init__.h" +#include "PewPew.h" + +#include "shared-bindings/digitalio/DigitalInOut.h" + + +void pew_tick(void) { + static uint8_t col = 0; + static uint8_t turn = 0; + static uint8_t pressed = 0; + static uint8_t last_pressed = 0; + digitalio_digitalinout_obj_t *pin; + + pew_obj_t* pew = MP_STATE_VM(pew_singleton); + if (!pew) { return; } + + pin = MP_OBJ_TO_PTR(pew->cols[col]); + ++col; + if (col >= pew->cols_size) { + pew->pressed |= last_pressed & pressed; + last_pressed = pressed; + pressed = 0; + col = 0; + ++turn; + if (turn > 11) { + turn = 0; + } + } + if (!common_hal_digitalio_digitalinout_get_value(pew->buttons)) { + pressed |= 1 << col; + } + common_hal_digitalio_digitalinout_set_value(pin, true); + for (size_t x = 0; x < pew->rows_size; ++x) { + pin = MP_OBJ_TO_PTR(pew->rows[x]); + uint8_t color = pew->buffer[col * (pew->rows_size) + x]; + bool value = false; + switch (color & 0x03) { + case 3: + value = true; + break; + case 2: + if (turn == 2 || turn == 5 || turn == 8 || turn == 11) { + value = true; + } + break; + case 1: + if (turn == 0) { + value = true; + } + break; + case 0: + break; + } + common_hal_digitalio_digitalinout_set_value(pin, value); + } + pin = MP_OBJ_TO_PTR(pew->cols[col]); + common_hal_digitalio_digitalinout_set_value(pin, false); +} diff --git a/shared-module/_pew/__init__.h b/shared-module/_pew/__init__.h new file mode 100644 index 000000000..4f953c610 --- /dev/null +++ b/shared-module/_pew/__init__.h @@ -0,0 +1,32 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Radomir Dopieralski + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_PEW_H +#define MICROPY_INCLUDED_PEW_H + +void pew_tick(void); + +#endif // MICROPY_INCLUDED_PEW_H diff --git a/shared-module/_pixelbuf/PixelBuf.c b/shared-module/_pixelbuf/PixelBuf.c new file mode 100644 index 000000000..d32697239 --- /dev/null +++ b/shared-module/_pixelbuf/PixelBuf.c @@ -0,0 +1,120 @@ +/* + * This file is part of the Circuit Python project, https://github.com/adafruit/circuitpython + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Roy Hooper + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#include "py/obj.h" +#include "py/objarray.h" +#include "py/runtime.h" +#include "PixelBuf.h" +#include <string.h> + +void pixelbuf_set_pixel_int(uint8_t *buf, mp_int_t value, pixelbuf_byteorder_obj_t *byteorder) { + buf[byteorder->byteorder.r] = value >> 16 & 0xff; + buf[byteorder->byteorder.g] = (value >> 8) & 0xff; + buf[byteorder->byteorder.b] = value & 0xff; + if (byteorder->bpp == 4 && byteorder->has_white && + (buf[byteorder->byteorder.r] == buf[byteorder->byteorder.g] && + buf[byteorder->byteorder.r] == buf[byteorder->byteorder.b])) { + buf[byteorder->byteorder.w] = buf[byteorder->byteorder.r]; + buf[byteorder->byteorder.r] = buf[byteorder->byteorder.g] = buf[byteorder->byteorder.b] = 0; + } +} + +void pixelbuf_set_pixel(uint8_t *buf, uint8_t *rawbuf, float brightness, mp_obj_t *item, pixelbuf_byteorder_obj_t *byteorder, bool dotstar) { + if (MP_OBJ_IS_INT(item)) { + uint8_t *target = rawbuf ? rawbuf : buf; + pixelbuf_set_pixel_int(target, mp_obj_get_int_truncated(item), byteorder); + if (dotstar) { + buf[0] = DOTSTAR_LED_START_FULL_BRIGHT; + if (rawbuf) + rawbuf[0] = DOTSTAR_LED_START_FULL_BRIGHT; + } + if (rawbuf) { + buf[byteorder->byteorder.r] = rawbuf[byteorder->byteorder.r] * brightness; + buf[byteorder->byteorder.g] = rawbuf[byteorder->byteorder.g] * brightness; + buf[byteorder->byteorder.b] = rawbuf[byteorder->byteorder.b] * brightness; + } else { + buf[byteorder->byteorder.r] *= brightness; + buf[byteorder->byteorder.g] *= brightness; + buf[byteorder->byteorder.b] *= brightness; + } + } else { + mp_obj_t *items; + size_t len; + mp_obj_get_array(item, &len, &items); + if (len != byteorder->bpp && !dotstar) + mp_raise_ValueError_varg(translate("Expected tuple of length %d, got %d"), byteorder->bpp, len); + + buf[byteorder->byteorder.r] = mp_obj_get_int_truncated(items[PIXEL_R]) * brightness; + buf[byteorder->byteorder.g] = mp_obj_get_int_truncated(items[PIXEL_G]) * brightness; + buf[byteorder->byteorder.b] = mp_obj_get_int_truncated(items[PIXEL_B]) * brightness; + if (rawbuf) { + rawbuf[byteorder->byteorder.r] = mp_obj_get_int_truncated(items[PIXEL_R]); + rawbuf[byteorder->byteorder.g] = mp_obj_get_int_truncated(items[PIXEL_G]); + rawbuf[byteorder->byteorder.b] = mp_obj_get_int_truncated(items[PIXEL_B]); + } + if (len > 3) { + if (dotstar) { + buf[byteorder->byteorder.w] = DOTSTAR_LED_START | DOTSTAR_BRIGHTNESS(mp_obj_get_float(items[PIXEL_W])); + if (rawbuf) + rawbuf[byteorder->byteorder.w] = buf[byteorder->byteorder.w]; + } else { + buf[byteorder->byteorder.w] = mp_obj_get_int_truncated(items[PIXEL_W]) * brightness; + if (rawbuf) + rawbuf[byteorder->byteorder.w] = mp_obj_get_int_truncated(items[PIXEL_W]); + } + } else if (dotstar) { + buf[byteorder->byteorder.w] = DOTSTAR_LED_START_FULL_BRIGHT; + if (rawbuf) + rawbuf[byteorder->byteorder.w] = DOTSTAR_LED_START_FULL_BRIGHT; + } + } +} + +mp_obj_t *pixelbuf_get_pixel_array(uint8_t *buf, uint len, pixelbuf_byteorder_obj_t *byteorder, uint8_t step, bool dotstar) { + mp_obj_t elems[len]; + for (uint i = 0; i < len; i++) { + elems[i] = pixelbuf_get_pixel(buf + (i * step), byteorder, dotstar); + } + return mp_obj_new_tuple(len, elems); +} + +mp_obj_t *pixelbuf_get_pixel(uint8_t *buf, pixelbuf_byteorder_obj_t *byteorder, bool dotstar) { + mp_obj_t elems[byteorder->bpp]; + + elems[0] = mp_obj_new_int(buf[byteorder->byteorder.r]); + elems[1] = mp_obj_new_int(buf[byteorder->byteorder.g]); + elems[2] = mp_obj_new_int(buf[byteorder->byteorder.b]); + if (byteorder->bpp > 3) + { + if (dotstar) + elems[3] = mp_obj_new_float(DOTSTAR_GET_BRIGHTNESS(buf[byteorder->byteorder.w])); + else + elems[3] = mp_obj_new_int(buf[byteorder->byteorder.w]); + } + + return mp_obj_new_tuple(byteorder->bpp, elems); +} diff --git a/shared-module/_pixelbuf/PixelBuf.h b/shared-module/_pixelbuf/PixelBuf.h new file mode 100644 index 000000000..9e115fe0c --- /dev/null +++ b/shared-module/_pixelbuf/PixelBuf.h @@ -0,0 +1,50 @@ +/* + * This file is part of the Circuit Python project, https://github.com/adafruit/circuitpython + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Roy Hooper + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#include "py/obj.h" +#include "py/objarray.h" +#include "../../shared-bindings/_pixelbuf/types.h" + +#ifndef PIXELBUF_SHARED_MODULE_H +#define PIXELBUF_SHARED_MODULE_H + +#define PIXEL_R 0 +#define PIXEL_G 1 +#define PIXEL_B 2 +#define PIXEL_W 3 + +#define DOTSTAR_LED_START 0b11100000 +#define DOTSTAR_BRIGHTNESS(brightness) ((32 - (uint8_t)(32 - brightness * 31)) & 0b00011111) +#define DOTSTAR_GET_BRIGHTNESS(value) ((value & 0b00011111) / 31.0) +#define DOTSTAR_LED_START_FULL_BRIGHT 0xFF + +void pixelbuf_set_pixel(uint8_t *buf, uint8_t *rawbuf, float brightness, mp_obj_t *item, pixelbuf_byteorder_obj_t *byteorder, bool dotstar); +mp_obj_t *pixelbuf_get_pixel(uint8_t *buf, pixelbuf_byteorder_obj_t *byteorder, bool dotstar); +mp_obj_t *pixelbuf_get_pixel_array(uint8_t *buf, uint len, pixelbuf_byteorder_obj_t *byteorder, uint8_t step, bool dotstar); +void pixelbuf_set_pixel_int(uint8_t *buf, mp_int_t value, pixelbuf_byteorder_obj_t *byteorder); + +#endif diff --git a/shared-module/_pixelbuf/__init__.c b/shared-module/_pixelbuf/__init__.c new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/shared-module/_pixelbuf/__init__.c diff --git a/shared-module/bleio/Characteristic.h b/shared-module/bleio/Characteristic.h index 94c43f81e..958837e64 100644 --- a/shared-module/bleio/Characteristic.h +++ b/shared-module/bleio/Characteristic.h @@ -27,26 +27,15 @@ #ifndef MICROPY_INCLUDED_SHARED_MODULE_BLEIO_CHARACTERISTIC_H #define MICROPY_INCLUDED_SHARED_MODULE_BLEIO_CHARACTERISTIC_H -#include "shared-module/bleio/Service.h" -#include "common-hal/bleio/UUID.h" - +// Flags for each characteristic property. Common across ports. typedef struct { - mp_obj_base_t base; - bleio_service_obj_t *service; - bleio_uuid_obj_t *uuid; - mp_obj_t value_data; - uint16_t handle; - struct { bool broadcast : 1; bool read : 1; - bool write_wo_resp : 1; + bool write_no_response : 1; bool write : 1; bool notify : 1; bool indicate : 1; - } props; - uint16_t user_desc_handle; - uint16_t cccd_handle; - uint16_t sccd_handle; -} bleio_characteristic_obj_t; +} bleio_characteristic_properties_t; + #endif // MICROPY_INCLUDED_SHARED_MODULE_BLEIO_CHARACTERISTIC_H diff --git a/shared-module/bleio/Service.h b/shared-module/bleio/Service.h index ff506d3f3..828d4cdc8 100644 --- a/shared-module/bleio/Service.h +++ b/shared-module/bleio/Service.h @@ -28,14 +28,14 @@ #define MICROPY_INCLUDED_SHARED_MODULE_BLEIO_SERVICE_H #include "common-hal/bleio/UUID.h" -#include "shared-module/bleio/Device.h" typedef struct { mp_obj_base_t base; uint16_t handle; bool is_secondary; bleio_uuid_obj_t *uuid; - bleio_device_obj_t *device; + // May be a Peripheral, Central, etc. + mp_obj_t *device; mp_obj_t char_list; uint16_t start_handle; uint16_t end_handle; diff --git a/shared-module/bleio/__init__.h b/shared-module/bleio/__init__.h new file mode 100644 index 000000000..07d148594 --- /dev/null +++ b/shared-module/bleio/__init__.h @@ -0,0 +1,38 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Dan Halbert for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_SHARED_MODULE_BLEIO_INIT_H +#define MICROPY_INCLUDED_SHARED_MODULE_BLEIO_INIT_H + +typedef enum { + GATT_ROLE_NONE, + GATT_ROLE_SERVER, + GATT_ROLE_CLIENT, +} gatt_role_t; + +extern void bleio_reset(void); + +#endif // MICROPY_INCLUDED_SHARED_MODULE_BLEIO_INIT_H diff --git a/shared-module/displayio/Bitmap.c b/shared-module/displayio/Bitmap.c index addc341a7..2b2c70ab6 100644 --- a/shared-module/displayio/Bitmap.c +++ b/shared-module/displayio/Bitmap.c @@ -42,7 +42,7 @@ void common_hal_displayio_bitmap_construct(displayio_bitmap_t *self, uint32_t wi self->width = width; self->height = height; self->data = m_malloc(self->stride * height * sizeof(uint32_t), false); - + self->read_only = false; self->bits_per_value = bits_per_value; if (bits_per_value > 8) { @@ -64,6 +64,18 @@ void common_hal_displayio_bitmap_construct(displayio_bitmap_t *self, uint32_t wi self->bitmask = (1 << bits_per_value) - 1; } +uint16_t common_hal_displayio_bitmap_get_height(displayio_bitmap_t *self) { + return self->height; +} + +uint16_t common_hal_displayio_bitmap_get_width(displayio_bitmap_t *self) { + return self->width; +} + +uint32_t common_hal_displayio_bitmap_get_bits_per_value(displayio_bitmap_t *self) { + return self->bits_per_value; +} + void common_hal_displayio_bitmap_load_row(displayio_bitmap_t *self, uint16_t y, uint8_t* data, uint16_t len) { if (len != self->stride * sizeof(uint32_t)) { mp_raise_ValueError(translate("row must be packed and word aligned")); @@ -85,6 +97,7 @@ void common_hal_displayio_bitmap_load_row(displayio_bitmap_t *self, uint16_t y, row_value++; } } + uint32_t common_hal_displayio_bitmap_get_pixel(displayio_bitmap_t *self, int16_t x, int16_t y) { if (x >= self->width || x < 0 || y >= self->height || y < 0) { return 0; @@ -99,3 +112,21 @@ uint32_t common_hal_displayio_bitmap_get_pixel(displayio_bitmap_t *self, int16_t return self->data[row_start + x * bytes_per_value]; } } + +void common_hal_displayio_bitmap_set_pixel(displayio_bitmap_t *self, int16_t x, int16_t y, uint32_t value) { + if (self->read_only) { + mp_raise_RuntimeError(translate("Read-only object")); + } + int32_t row_start = y * self->stride; + if (self->bits_per_value < 8) { + uint32_t bit_position = (32 - ((x & self->x_mask) + 1) * self->bits_per_value); + uint32_t index = row_start + (x >> self->x_shift); + uint32_t word = self->data[index]; + word &= ~(self->bitmask << bit_position); + word |= (value & self->bitmask) << bit_position; + self->data[index] = word; + } else { + uint32_t bytes_per_value = self->bits_per_value / 8; + self->data[row_start + x * bytes_per_value] = value; + } +} diff --git a/shared-module/displayio/Bitmap.h b/shared-module/displayio/Bitmap.h index 781a4d12a..485b57daf 100644 --- a/shared-module/displayio/Bitmap.h +++ b/shared-module/displayio/Bitmap.h @@ -42,6 +42,7 @@ typedef struct { uint8_t x_shift; uint8_t x_mask; uint16_t bitmask; + bool read_only; } displayio_bitmap_t; #endif // MICROPY_INCLUDED_SHARED_MODULE_DISPLAYIO_BITMAP_H diff --git a/shared-module/displayio/ColorConverter.c b/shared-module/displayio/ColorConverter.c index d20b24c01..3928e115a 100644 --- a/shared-module/displayio/ColorConverter.c +++ b/shared-module/displayio/ColorConverter.c @@ -39,3 +39,11 @@ bool common_hal_displayio_colorconverter_convert(displayio_colorconverter_t *sel *output_color = __builtin_bswap16(packed); return true; } + +// Currently no refresh logic is needed for a ColorConverter. +bool displayio_colorconverter_needs_refresh(displayio_colorconverter_t *self) { + return false; +} + +void displayio_colorconverter_finish_refresh(displayio_colorconverter_t *self) { +} diff --git a/shared-module/displayio/ColorConverter.h b/shared-module/displayio/ColorConverter.h index 62ef2eaab..7f3c1a0a0 100644 --- a/shared-module/displayio/ColorConverter.h +++ b/shared-module/displayio/ColorConverter.h @@ -36,4 +36,7 @@ typedef struct { mp_obj_base_t base; } displayio_colorconverter_t; +bool displayio_colorconverter_needs_refresh(displayio_colorconverter_t *self); +void displayio_colorconverter_finish_refresh(displayio_colorconverter_t *self); + #endif // MICROPY_INCLUDED_SHARED_MODULE_DISPLAYIO_COLORCONVERTER_H diff --git a/shared-module/displayio/Display.c b/shared-module/displayio/Display.c new file mode 100644 index 000000000..0e76a868f --- /dev/null +++ b/shared-module/displayio/Display.c @@ -0,0 +1,269 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "shared-bindings/displayio/Display.h" + +#include "py/runtime.h" +#include "shared-bindings/displayio/FourWire.h" +#include "shared-bindings/displayio/ParallelBus.h" +#include "shared-bindings/microcontroller/Pin.h" +#include "shared-bindings/time/__init__.h" +#include "shared-module/displayio/__init__.h" +#include "supervisor/shared/display.h" + +#include <stdint.h> + +#include "tick.h" + +#define DELAY 0x80 + +void common_hal_displayio_display_construct(displayio_display_obj_t* self, + mp_obj_t bus, uint16_t width, uint16_t height, int16_t colstart, int16_t rowstart, uint16_t rotation, + uint16_t color_depth, uint8_t set_column_command, uint8_t set_row_command, + uint8_t write_ram_command, uint8_t set_vertical_scroll, uint8_t* init_sequence, uint16_t init_sequence_len, + const mcu_pin_obj_t* backlight_pin) { + self->color_depth = color_depth; + self->set_column_command = set_column_command; + self->set_row_command = set_row_command; + self->write_ram_command = write_ram_command; + self->refresh = false; + self->current_group = NULL; + self->colstart = colstart; + self->rowstart = rowstart; + self->auto_brightness = false; + + if (MP_OBJ_IS_TYPE(bus, &displayio_parallelbus_type)) { + self->begin_transaction = common_hal_displayio_parallelbus_begin_transaction; + self->send = common_hal_displayio_parallelbus_send; + self->end_transaction = common_hal_displayio_parallelbus_end_transaction; + } else if (MP_OBJ_IS_TYPE(bus, &displayio_fourwire_type)) { + self->begin_transaction = common_hal_displayio_fourwire_begin_transaction; + self->send = common_hal_displayio_fourwire_send; + self->end_transaction = common_hal_displayio_fourwire_end_transaction; + } else { + mp_raise_ValueError(translate("Unsupported display bus type")); + } + self->bus = bus; + + uint32_t i = 0; + while (!self->begin_transaction(self->bus)) { +#ifdef MICROPY_VM_HOOK_LOOP + MICROPY_VM_HOOK_LOOP ; +#endif + } + while (i < init_sequence_len) { + uint8_t *cmd = init_sequence + i; + uint8_t data_size = *(cmd + 1); + bool delay = (data_size & DELAY) != 0; + data_size &= ~DELAY; + uint8_t *data = cmd + 2; + self->send(self->bus, true, cmd, 1); + self->send(self->bus, false, data, data_size); + uint16_t delay_length_ms = 10; + if (delay) { + data_size++; + delay_length_ms = *(cmd + 1 + data_size); + if (delay_length_ms == 255) { + delay_length_ms = 500; + } + } + common_hal_time_delay_ms(delay_length_ms); + i += 2 + data_size; + } + self->end_transaction(self->bus); + + supervisor_start_terminal(width, height); + + // Set the group after initialization otherwise we may send pixels while we delay in + // initialization. + self->refresh = true; + self->current_group = &circuitpython_splash; + + self->width = width; + self->height = height; + rotation = rotation % 360; + self->mirror_x = false; + self->mirror_y = false; + self->transpose_xy = false; + if (rotation == 0 || rotation == 180) { + if (rotation == 180) { + self->mirror_x = true; + self->mirror_y = true; + } + } else { + self->transpose_xy = true; + if (rotation == 90) { + self->mirror_y = true; + } else { + self->mirror_x = true; + } + } + + // Always set the backlight type in case we're reusing memory. + self->backlight_inout.base.type = &mp_type_NoneType; + if (backlight_pin != NULL && common_hal_mcu_pin_is_free(backlight_pin)) { + pwmout_result_t result = common_hal_pulseio_pwmout_construct(&self->backlight_pwm, backlight_pin, 0, 50000, false); + if (result != PWMOUT_OK) { + self->backlight_inout.base.type = &digitalio_digitalinout_type; + common_hal_digitalio_digitalinout_construct(&self->backlight_inout, backlight_pin); + never_reset_pin_number(backlight_pin->number); + } else { + self->backlight_pwm.base.type = &pulseio_pwmout_type; + common_hal_pulseio_pwmout_never_reset(&self->backlight_pwm); + } + } +} + +void common_hal_displayio_display_show(displayio_display_obj_t* self, displayio_group_t* root_group) { + if (root_group == NULL) { + root_group = &circuitpython_splash; + } + self->current_group = root_group; + common_hal_displayio_display_refresh_soon(self); +} + +void common_hal_displayio_display_refresh_soon(displayio_display_obj_t* self) { + self->refresh = true; +} + +int32_t common_hal_displayio_display_wait_for_frame(displayio_display_obj_t* self) { + uint64_t last_refresh = self->last_refresh; + // Don't try to refresh if we got an exception. + while (last_refresh == self->last_refresh && MP_STATE_VM(mp_pending_exception) == NULL) { + MICROPY_VM_HOOK_LOOP + } + return 0; +} + +bool common_hal_displayio_display_get_auto_brightness(displayio_display_obj_t* self) { + return self->auto_brightness; +} + +uint16_t common_hal_displayio_display_get_width(displayio_display_obj_t* self){ + return self->width; +} + +uint16_t common_hal_displayio_display_get_height(displayio_display_obj_t* self){ + return self->height; +} + +void common_hal_displayio_display_set_auto_brightness(displayio_display_obj_t* self, bool auto_brightness) { + self->auto_brightness = auto_brightness; +} + +mp_float_t common_hal_displayio_display_get_brightness(displayio_display_obj_t* self) { + if (self->backlight_pwm.base.type == &pulseio_pwmout_type) { + uint16_t duty_cycle = common_hal_pulseio_pwmout_get_duty_cycle(&self->backlight_pwm); + return duty_cycle / ((mp_float_t) 0xffff); + } else if (self->backlight_inout.base.type == &digitalio_digitalinout_type) { + if (common_hal_digitalio_digitalinout_get_value(&self->backlight_inout)) { + return 1.0; + } else { + return 0.0; + } + } + return -1.0; +} + +bool common_hal_displayio_display_set_brightness(displayio_display_obj_t* self, mp_float_t brightness) { + self->updating_backlight = true; + bool ok = false; + if (self->backlight_pwm.base.type == &pulseio_pwmout_type) { + common_hal_pulseio_pwmout_set_duty_cycle(&self->backlight_pwm, (uint16_t) (0xffff * brightness)); + ok = true; + } else if (self->backlight_inout.base.type == &digitalio_digitalinout_type) { + common_hal_digitalio_digitalinout_set_value(&self->backlight_inout, brightness > 0.99); + ok = true; + } + self->updating_backlight = false; + return ok; +} + +bool displayio_display_begin_transaction(displayio_display_obj_t* self) { + return self->begin_transaction(self->bus); +} + +void displayio_display_end_transaction(displayio_display_obj_t* self) { + self->end_transaction(self->bus); +} + +void displayio_display_set_region_to_update(displayio_display_obj_t* self, uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { + // TODO(tannewt): Handle displays with single byte bounds. + uint16_t data[2]; + self->send(self->bus, true, &self->set_column_command, 1); + data[0] = __builtin_bswap16(x0 + self->colstart); + data[1] = __builtin_bswap16(x1 - 1 + self->colstart); + self->send(self->bus, false, (uint8_t*) data, 4); + self->send(self->bus, true, &self->set_row_command, 1); + data[0] = __builtin_bswap16(y0 + self->rowstart); + data[1] = __builtin_bswap16(y1 - 1 + self->rowstart); + self->send(self->bus, false, (uint8_t*) data, 4); + self->send(self->bus, true, &self->write_ram_command, 1); +} + +bool displayio_display_frame_queued(displayio_display_obj_t* self) { + // Refresh at ~30 fps. + return (ticks_ms - self->last_refresh) > 32; +} + +bool displayio_display_refresh_queued(displayio_display_obj_t* self) { + return self->refresh || (self->current_group != NULL && displayio_group_needs_refresh(self->current_group)); +} + +void displayio_display_finish_refresh(displayio_display_obj_t* self) { + if (self->current_group != NULL) { + displayio_group_finish_refresh(self->current_group); + } + self->refresh = false; + self->last_refresh = ticks_ms; +} + +void displayio_display_send_pixels(displayio_display_obj_t* self, uint32_t* pixels, uint32_t length) { + self->send(self->bus, false, (uint8_t*) pixels, length * 4); +} + +void displayio_display_update_backlight(displayio_display_obj_t* self) { + if (!self->auto_brightness || self->updating_backlight) { + return; + } + if (ticks_ms - self->last_backlight_refresh < 100) { + return; + } + // TODO(tannewt): Fade the backlight based on it's existing value and a target value. The target + // should account for ambient light when possible. + common_hal_displayio_display_set_brightness(self, 1.0); + + self->last_backlight_refresh = ticks_ms; +} + +void release_display(displayio_display_obj_t* self) { + if (self->backlight_pwm.base.type == &pulseio_pwmout_type) { + common_hal_pulseio_pwmout_reset_ok(&self->backlight_pwm); + common_hal_pulseio_pwmout_deinit(&self->backlight_pwm); + } else if (self->backlight_inout.base.type == &digitalio_digitalinout_type) { + common_hal_digitalio_digitalinout_deinit(&self->backlight_inout); + } +} diff --git a/shared-module/displayio/Display.h b/shared-module/displayio/Display.h new file mode 100644 index 000000000..04da68b63 --- /dev/null +++ b/shared-module/displayio/Display.h @@ -0,0 +1,70 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_SHARED_MODULE_DISPLAYIO_DISPLAY_H +#define MICROPY_INCLUDED_SHARED_MODULE_DISPLAYIO_DISPLAY_H + +#include "shared-bindings/digitalio/DigitalInOut.h" +#include "shared-bindings/displayio/Group.h" +#include "shared-bindings/pulseio/PWMOut.h" + +typedef bool (*display_bus_begin_transaction)(mp_obj_t bus); +typedef void (*display_bus_send)(mp_obj_t bus, bool command, uint8_t *data, uint32_t data_length); +typedef void (*display_bus_end_transaction)(mp_obj_t bus); + +typedef struct { + mp_obj_base_t base; + mp_obj_t bus; + uint16_t width; + uint16_t height; + uint16_t color_depth; + uint8_t set_column_command; + uint8_t set_row_command; + uint8_t write_ram_command; + displayio_group_t *current_group; + bool refresh; + uint64_t last_refresh; + int16_t colstart; + int16_t rowstart; + display_bus_begin_transaction begin_transaction; + display_bus_send send; + display_bus_end_transaction end_transaction; + union { + digitalio_digitalinout_obj_t backlight_inout; + pulseio_pwmout_obj_t backlight_pwm; + }; + uint64_t last_backlight_refresh; + bool auto_brightness:1; + bool updating_backlight:1; + bool mirror_x; + bool mirror_y; + bool transpose_xy; +} displayio_display_obj_t; + +void displayio_display_update_backlight(displayio_display_obj_t* self); +void release_display(displayio_display_obj_t* self); + +#endif // MICROPY_INCLUDED_SHARED_MODULE_DISPLAYIO_DISPLAY_H diff --git a/shared-module/displayio/FourWire.c b/shared-module/displayio/FourWire.c new file mode 100644 index 000000000..9da5c0701 --- /dev/null +++ b/shared-module/displayio/FourWire.c @@ -0,0 +1,89 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "shared-bindings/displayio/FourWire.h" + +#include <stdint.h> + +#include "shared-bindings/busio/SPI.h" +#include "shared-bindings/digitalio/DigitalInOut.h" + +#include "tick.h" + +void common_hal_displayio_fourwire_construct(displayio_fourwire_obj_t* self, + busio_spi_obj_t* spi, const mcu_pin_obj_t* command, + const mcu_pin_obj_t* chip_select, const mcu_pin_obj_t* reset) { + + self->bus = spi; + common_hal_busio_spi_never_reset(self->bus); + + common_hal_digitalio_digitalinout_construct(&self->command, command); + common_hal_digitalio_digitalinout_switch_to_output(&self->command, true, DRIVE_MODE_PUSH_PULL); + common_hal_digitalio_digitalinout_construct(&self->chip_select, chip_select); + common_hal_digitalio_digitalinout_switch_to_output(&self->chip_select, true, DRIVE_MODE_PUSH_PULL); + + if (reset != NULL) { + common_hal_digitalio_digitalinout_construct(&self->reset, reset); + common_hal_digitalio_digitalinout_switch_to_output(&self->reset, true, DRIVE_MODE_PUSH_PULL); + never_reset_pin_number(reset->number); + } + + never_reset_pin_number(command->number); + never_reset_pin_number(chip_select->number); +} + +void common_hal_displayio_fourwire_deinit(displayio_fourwire_obj_t* self) { + if (self->bus == &self->inline_bus) { + common_hal_busio_spi_deinit(self->bus); + } + + reset_pin_number(self->command.pin->number); + reset_pin_number(self->chip_select.pin->number); + reset_pin_number(self->reset.pin->number); +} + +bool common_hal_displayio_fourwire_begin_transaction(mp_obj_t obj) { + displayio_fourwire_obj_t* self = MP_OBJ_TO_PTR(obj); + if (!common_hal_busio_spi_try_lock(self->bus)) { + return false; + } + // TODO(tannewt): Stop hardcoding SPI frequency, polarity and phase. + common_hal_busio_spi_configure(self->bus, 12000000, 0, 0, 8); + common_hal_digitalio_digitalinout_set_value(&self->chip_select, false); + return true; +} + +void common_hal_displayio_fourwire_send(mp_obj_t obj, bool command, uint8_t *data, uint32_t data_length) { + displayio_fourwire_obj_t* self = MP_OBJ_TO_PTR(obj); + common_hal_digitalio_digitalinout_set_value(&self->command, !command); + common_hal_busio_spi_write(self->bus, data, data_length); +} + +void common_hal_displayio_fourwire_end_transaction(mp_obj_t obj) { + displayio_fourwire_obj_t* self = MP_OBJ_TO_PTR(obj); + common_hal_digitalio_digitalinout_set_value(&self->chip_select, true); + common_hal_busio_spi_unlock(self->bus); +} diff --git a/ports/atmel-samd/common-hal/displayio/FourWire.h b/shared-module/displayio/FourWire.h index b99717670..234bcf794 100644 --- a/ports/atmel-samd/common-hal/displayio/FourWire.h +++ b/shared-module/displayio/FourWire.h @@ -33,21 +33,11 @@ typedef struct { mp_obj_base_t base; - busio_spi_obj_t bus; + busio_spi_obj_t* bus; + busio_spi_obj_t inline_bus; digitalio_digitalinout_obj_t command; digitalio_digitalinout_obj_t chip_select; digitalio_digitalinout_obj_t reset; - uint16_t width; - uint16_t height; - uint16_t color_depth; - uint8_t set_column_command; - uint8_t set_row_command; - uint8_t write_ram_command; - displayio_group_t *current_group; - bool refresh; - uint64_t last_refresh; - int16_t colstart; - int16_t rowstart; } displayio_fourwire_obj_t; #endif // MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_DISPLAYIO_FOURWIRE_H diff --git a/shared-module/displayio/Group.c b/shared-module/displayio/Group.c index 655376da0..20182863e 100644 --- a/shared-module/displayio/Group.c +++ b/shared-module/displayio/Group.c @@ -27,52 +27,120 @@ #include "shared-bindings/displayio/Group.h" #include "py/runtime.h" -#include "shared-bindings/displayio/Sprite.h" +#include "shared-bindings/displayio/TileGrid.h" -void common_hal_displayio_group_construct(displayio_group_t* self, uint32_t max_size) { - mp_obj_t* children = m_new(mp_obj_t, max_size); - displayio_group_construct(self, children, max_size); +void common_hal_displayio_group_construct(displayio_group_t* self, uint32_t max_size, uint32_t scale, mp_int_t x, mp_int_t y) { + displayio_group_child_t* children = m_new(displayio_group_child_t, max_size); + displayio_group_construct(self, children, max_size, scale, x, y); } -void common_hal_displayio_group_append(displayio_group_t* self, mp_obj_t layer) { +uint32_t common_hal_displayio_group_get_scale(displayio_group_t* self) { + return self->scale; +} + +void common_hal_displayio_group_set_scale(displayio_group_t* self, uint32_t scale) { + self->needs_refresh = self->scale != scale; + self->scale = scale; +} + +mp_int_t common_hal_displayio_group_get_x(displayio_group_t* self) { + return self->x; +} + +void common_hal_displayio_group_set_x(displayio_group_t* self, mp_int_t x) { + self->needs_refresh = self->x != x; + self->x = x; +} + +mp_int_t common_hal_displayio_group_get_y(displayio_group_t* self) { + return self->y; +} + +void common_hal_displayio_group_set_y(displayio_group_t* self, mp_int_t y) { + self->needs_refresh = self->y != y; + self->y = y; +} + +void common_hal_displayio_group_insert(displayio_group_t* self, size_t index, mp_obj_t layer) { if (self->size == self->max_size) { mp_raise_RuntimeError(translate("Group full")); } - self->children[self->size] = layer; + mp_obj_t native_layer = mp_instance_cast_to_native_base(layer, &displayio_group_type); + if (native_layer == MP_OBJ_NULL) { + native_layer = mp_instance_cast_to_native_base(layer, &displayio_tilegrid_type); + } + if (native_layer == MP_OBJ_NULL) { + mp_raise_ValueError(translate("Layer must be a Group or TileGrid subclass.")); + } + // Shift everything right. + for (size_t i = index; i < self->size; i++) { + self->children[i + 1] = self->children[i]; + } + self->children[index].native = native_layer; + self->children[index].original = layer; self->size++; self->needs_refresh = true; } -mp_obj_t common_hal_displayio_group_pop(displayio_group_t* self) { - if (self->size == 0) { - mp_raise_IndexError(translate("Group empty")); - } +mp_obj_t common_hal_displayio_group_pop(displayio_group_t* self, size_t index) { self->size--; - mp_obj_t item = self->children[self->size]; - self->children[self->size] = NULL; + mp_obj_t item = self->children[index].original; + // Shift everything left. + for (size_t i = index; i < self->size; i++) { + self->children[i] = self->children[i + 1]; + } + self->children[self->size].native = NULL; + self->children[self->size].original = NULL; self->needs_refresh = true; return item; } -void displayio_group_construct(displayio_group_t* self, mp_obj_t* child_array, uint32_t max_size) { - self->x = 0; - self->y = 0; +size_t common_hal_displayio_group_get_len(displayio_group_t* self) { + return self->size; +} + +mp_obj_t common_hal_displayio_group_get(displayio_group_t* self, size_t index) { + return self->children[index].original; +} + +void common_hal_displayio_group_set(displayio_group_t* self, size_t index, mp_obj_t layer) { + mp_obj_t native_layer = mp_instance_cast_to_native_base(layer, &displayio_group_type); + if (native_layer == MP_OBJ_NULL) { + native_layer = mp_instance_cast_to_native_base(layer, &displayio_tilegrid_type); + } + if (native_layer == MP_OBJ_NULL) { + mp_raise_ValueError(translate("Layer must be a Group or TileGrid subclass.")); + } + self->children[index].native = native_layer; + self->children[index].original = layer; + self->needs_refresh = true; +} + +void displayio_group_construct(displayio_group_t* self, displayio_group_child_t* child_array, uint32_t max_size, uint32_t scale, mp_int_t x, mp_int_t y) { + self->x = x; + self->y = y; self->children = child_array; self->max_size = max_size; self->needs_refresh = false; + self->scale = scale; } bool displayio_group_get_pixel(displayio_group_t *self, int16_t x, int16_t y, uint16_t* pixel) { x -= self->x; y -= self->y; + x /= self->scale; + y /= self->scale; for (int32_t i = self->size - 1; i >= 0 ; i--) { - mp_obj_t layer = self->children[i]; - if (MP_OBJ_IS_TYPE(layer, &displayio_sprite_type)) { - if (displayio_sprite_get_pixel(layer, x, y, pixel)) { + mp_obj_t layer = self->children[i].native; + if (MP_OBJ_IS_TYPE(layer, &displayio_tilegrid_type)) { + if (displayio_tilegrid_get_pixel(layer, x, y, pixel)) { + return true; + } + } else if (MP_OBJ_IS_TYPE(layer, &displayio_group_type)) { + if (displayio_group_get_pixel(layer, x, y, pixel)) { return true; } } - // TODO: Tiled layer } return false; } @@ -82,13 +150,16 @@ bool displayio_group_needs_refresh(displayio_group_t *self) { return true; } for (int32_t i = self->size - 1; i >= 0 ; i--) { - mp_obj_t layer = self->children[i]; - if (MP_OBJ_IS_TYPE(layer, &displayio_sprite_type)) { - if (displayio_sprite_needs_refresh(layer)) { + mp_obj_t layer = self->children[i].native; + if (MP_OBJ_IS_TYPE(layer, &displayio_tilegrid_type)) { + if (displayio_tilegrid_needs_refresh(layer)) { + return true; + } + } else if (MP_OBJ_IS_TYPE(layer, &displayio_group_type)) { + if (displayio_group_needs_refresh(layer)) { return true; } } - // TODO: Tiled layer } return false; } @@ -96,10 +167,11 @@ bool displayio_group_needs_refresh(displayio_group_t *self) { void displayio_group_finish_refresh(displayio_group_t *self) { self->needs_refresh = false; for (int32_t i = self->size - 1; i >= 0 ; i--) { - mp_obj_t layer = self->children[i]; - if (MP_OBJ_IS_TYPE(layer, &displayio_sprite_type)) { - displayio_sprite_finish_refresh(layer); + mp_obj_t layer = self->children[i].native; + if (MP_OBJ_IS_TYPE(layer, &displayio_tilegrid_type)) { + displayio_tilegrid_finish_refresh(layer); + } else if (MP_OBJ_IS_TYPE(layer, &displayio_group_type)) { + displayio_group_finish_refresh(layer); } - // TODO: Tiled layer } } diff --git a/shared-module/displayio/Group.h b/shared-module/displayio/Group.h index 272f3114c..7826b9e66 100644 --- a/shared-module/displayio/Group.h +++ b/shared-module/displayio/Group.h @@ -33,20 +33,22 @@ #include "py/obj.h" typedef struct { + mp_obj_t native; + mp_obj_t original; +} displayio_group_child_t; + +typedef struct { mp_obj_base_t base; int16_t x; int16_t y; + uint16_t scale; uint16_t size; uint16_t max_size; - mp_obj_t* children; + displayio_group_child_t* children; bool needs_refresh; } displayio_group_t; - -void common_hal_displayio_group_construct(displayio_group_t* self, uint32_t max_size); -void common_hal_displayio_group_append(displayio_group_t* self, mp_obj_t layer); - -void displayio_group_construct(displayio_group_t* self, mp_obj_t* child_array, uint32_t max_size); +void displayio_group_construct(displayio_group_t* self, displayio_group_child_t* child_array, uint32_t max_size, uint32_t scale, mp_int_t x, mp_int_t y); bool displayio_group_get_pixel(displayio_group_t *group, int16_t x, int16_t y, uint16_t *pixel); bool displayio_group_needs_refresh(displayio_group_t *self); void displayio_group_finish_refresh(displayio_group_t *self); diff --git a/shared-module/displayio/OnDiskBitmap.c b/shared-module/displayio/OnDiskBitmap.c index 6e4a4c6f0..d710bdae0 100644 --- a/shared-module/displayio/OnDiskBitmap.c +++ b/shared-module/displayio/OnDiskBitmap.c @@ -38,13 +38,13 @@ static uint32_t read_word(uint16_t* bmp_header, uint16_t index) { void common_hal_displayio_ondiskbitmap_construct(displayio_ondiskbitmap_t *self, pyb_file_obj_t* file) { // Load the wave self->file = file; - uint16_t bmp_header[24]; + uint16_t bmp_header[69]; f_rewind(&self->file->fp); UINT bytes_read; - if (f_read(&self->file->fp, bmp_header, 48, &bytes_read) != FR_OK) { + if (f_read(&self->file->fp, bmp_header, 138, &bytes_read) != FR_OK) { mp_raise_OSError(MP_EIO); } - if (bytes_read != 48 || + if (bytes_read != 138 || memcmp(bmp_header, "BM", 2) != 0) { mp_raise_ValueError(translate("Invalid BMP file")); } @@ -53,25 +53,68 @@ void common_hal_displayio_ondiskbitmap_construct(displayio_ondiskbitmap_t *self, self->data_offset = read_word(bmp_header, 5); uint32_t header_size = read_word(bmp_header, 7); - uint32_t compression = read_word(bmp_header, 15); - if (!(header_size == 12 || header_size == 40 || header_size == 108 || header_size == 124) || - !(compression == 0)) { - mp_raise_ValueError_varg(translate("Only Windows format, uncompressed BMP supported %d"), header_size); - } - // TODO(tannewt): Support bitfield compressed colors since RGB565 can be produced by the GIMP. uint16_t bits_per_pixel = bmp_header[14]; - if (bits_per_pixel < 24) { - mp_raise_ValueError_varg(translate("Only true color (24 bpp or higher) BMP supported %x"), bits_per_pixel); - } - self->bytes_per_pixel = bits_per_pixel / 8; + uint32_t compression = read_word(bmp_header, 15); + uint32_t number_of_colors = read_word(bmp_header, 23); + + bool indexed = ((bits_per_pixel <= 8) && (number_of_colors != 0)); + self->bitfield_compressed = (compression == 3); + self->bits_per_pixel = bits_per_pixel; self->width = read_word(bmp_header, 9); self->height = read_word(bmp_header, 11); - uint32_t byte_width = self->width * self->bytes_per_pixel; - self->stride = byte_width; - // Rows are word aligned. - if (self->stride % 4 != 0) { - self->stride += 4 - self->stride % 4; + + if (bits_per_pixel == 16){ + if (((header_size >= 56)) || (self->bitfield_compressed)) { + self->r_bitmask = read_word(bmp_header, 27); + self->g_bitmask = read_word(bmp_header, 29); + self->b_bitmask = read_word(bmp_header, 31); + + } else { // no compression or short header means 5:5:5 + self->r_bitmask = 0x7c00; + self->g_bitmask = 0x3e0; + self->b_bitmask = 0x1f; + } + } else if ((indexed) && (self->bits_per_pixel != 1)) { + uint16_t palette_size = number_of_colors * sizeof(uint32_t); + uint16_t palette_offset = 0xe + header_size; + + self->palette_data = m_malloc(palette_size, false); + + f_rewind(&self->file->fp); + f_lseek(&self->file->fp, palette_offset); + + UINT palette_bytes_read; + if (f_read(&self->file->fp, self->palette_data, palette_size, &palette_bytes_read) != FR_OK) { + mp_raise_OSError(MP_EIO); + } + if (palette_bytes_read != palette_size) { + mp_raise_ValueError(translate("Unable to read color palette data")); + } + + + } else if (!(header_size == 12 || header_size == 40 || header_size == 108 || header_size == 124)) { + mp_raise_ValueError_varg(translate("Only Windows format, uncompressed BMP supported: given header size is %d"), header_size); } + + if ((bits_per_pixel == 4 ) || (( bits_per_pixel == 8) && (number_of_colors == 0))) { + mp_raise_ValueError_varg(translate("Only monochrome, indexed 8bpp, and 16bpp or greater BMPs supported: %d bpp given"), bits_per_pixel); + } + + if (self->bits_per_pixel >=8){ + self->stride = (self->width * (bits_per_pixel / 8)); + // Rows are word aligned. + if (self->stride % 4 != 0) { + self->stride += 4 - self->stride % 4; + } + + } else { + uint32_t bit_stride = self->width; + if (bit_stride % 32 != 0) { + bit_stride += 32 - bit_stride % 32; + } + self->stride = (bit_stride / 8); + } + } @@ -80,14 +123,62 @@ uint32_t common_hal_displayio_ondiskbitmap_get_pixel(displayio_ondiskbitmap_t *s if (x < 0 || x >= self->width || y < 0 || y >= self->height) { return 0; } - uint32_t location = self->data_offset + (self->height - y) * self->stride + x * self->bytes_per_pixel; + uint32_t location; + uint8_t bytes_per_pixel = (self->bits_per_pixel / 8) ? (self->bits_per_pixel /8) : 1; + if (self->bits_per_pixel >= 8){ + location = self->data_offset + (self->height - y) * self->stride + x * bytes_per_pixel; + } else { + location = self->data_offset + (self->height - y) * self->stride + x / 8; + } // We don't cache here because the underlying FS caches sectors. f_lseek(&self->file->fp, location); UINT bytes_read; - uint32_t pixel = 0; - uint32_t result = f_read(&self->file->fp, &pixel, self->bytes_per_pixel, &bytes_read); + uint32_t pixel_data = 0; + uint32_t result = f_read(&self->file->fp, &pixel_data, bytes_per_pixel, &bytes_read); if (result == FR_OK) { - return pixel; + uint32_t tmp = 0; + uint8_t red; + uint8_t green; + uint8_t blue; + if (self->bits_per_pixel == 1){ + uint8_t bit_offset = x%8; + tmp = ( pixel_data & (0x80 >> (bit_offset))) >> (7 - bit_offset); + if (tmp == 1) { + return 0x00FFFFFF; + } else { + return 0x00000000; + } + } else if (bytes_per_pixel == 1){ + blue = ((self->palette_data[pixel_data] & 0xFF) >> 0); + red = ((self->palette_data[pixel_data] & 0xFF0000) >> 16); + green = ((self->palette_data[pixel_data] & 0xFF00) >> 8); + tmp = (red << 16 | green << 8 | blue ); + return tmp; + } else if (bytes_per_pixel == 2) { + if (self->g_bitmask == 0x07e0) { // 565 + red =((pixel_data & self->r_bitmask) >>11); + green = ((pixel_data & self->g_bitmask) >>5); + blue = ((pixel_data & self->b_bitmask) >> 0); + } else { // 555 + red =((pixel_data & self->r_bitmask) >>10); + green = ((pixel_data & self->g_bitmask) >>4); + blue = ((pixel_data & self->b_bitmask) >> 0); + } + tmp = (red << 19 | green << 10 | blue << 3); + return tmp; + } else if ((bytes_per_pixel == 4) && (self->bitfield_compressed)) { + return pixel_data & 0x00FFFFFF; + } else { + return pixel_data; + } } return 0; } + +uint16_t common_hal_displayio_ondiskbitmap_get_height(displayio_ondiskbitmap_t *self) { + return self->height; +} + +uint16_t common_hal_displayio_ondiskbitmap_get_width(displayio_ondiskbitmap_t *self) { + return self->width; +} diff --git a/shared-module/displayio/OnDiskBitmap.h b/shared-module/displayio/OnDiskBitmap.h index 31d6c9550..28426f11b 100644 --- a/shared-module/displayio/OnDiskBitmap.h +++ b/shared-module/displayio/OnDiskBitmap.h @@ -40,8 +40,13 @@ typedef struct { uint16_t height; uint16_t data_offset; uint16_t stride; + uint32_t r_bitmask; + uint32_t g_bitmask; + uint32_t b_bitmask; + bool bitfield_compressed; pyb_file_obj_t* file; - uint8_t bytes_per_pixel; + uint8_t bits_per_pixel; + uint32_t* palette_data; } displayio_ondiskbitmap_t; #endif // MICROPY_INCLUDED_SHARED_MODULE_DISPLAYIO_ONDISKBITMAP_H diff --git a/shared-module/displayio/Palette.c b/shared-module/displayio/Palette.c index 5f410d786..e810be875 100644 --- a/shared-module/displayio/Palette.c +++ b/shared-module/displayio/Palette.c @@ -47,9 +47,9 @@ void common_hal_displayio_palette_make_transparent(displayio_palette_t* self, ui void common_hal_displayio_palette_set_color(displayio_palette_t* self, uint32_t palette_index, uint32_t color) { uint32_t shift = (palette_index % 2) * 16; uint32_t masked = self->colors[palette_index / 2] & ~(0xffff << shift); - uint32_t b5 = (color >> 19); + uint32_t r5 = (color >> 19); uint32_t g6 = (color >> 10) & 0x3f; - uint32_t r5 = (color >> 3) & 0x1f; + uint32_t b5 = (color >> 3) & 0x1f; uint32_t packed = r5 << 11 | g6 << 5 | b5; // swap bytes packed = __builtin_bswap16(packed); diff --git a/shared-module/displayio/Palette.h b/shared-module/displayio/Palette.h index 5a5f1d287..3813e8bdd 100644 --- a/shared-module/displayio/Palette.h +++ b/shared-module/displayio/Palette.h @@ -36,7 +36,7 @@ typedef struct { mp_obj_base_t base; uint32_t* opaque; uint32_t* colors; - uint8_t color_count; + uint32_t color_count; bool needs_refresh; } displayio_palette_t; diff --git a/shared-module/displayio/Shape.c b/shared-module/displayio/Shape.c new file mode 100644 index 000000000..ab9ca735b --- /dev/null +++ b/shared-module/displayio/Shape.c @@ -0,0 +1,90 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "shared-bindings/displayio/Shape.h" + +#include <string.h> + +#include "py/runtime.h" + +void common_hal_displayio_shape_construct(displayio_shape_t *self, uint32_t width, + uint32_t height, bool mirror_x, bool mirror_y) { + self->mirror_x = mirror_x; + self->mirror_y = mirror_y; + self->width = width; + if (self->mirror_x) { + width /= 2; + width += self->width % 2 - 1; + } + self->half_width = width; + + self->height = height; + if (self->mirror_y) { + height /= 2; + height += self->height % 2 - 1; + } + self->half_height = height; + + self->data = m_malloc(height * sizeof(uint32_t), false); + for (uint16_t i = 0; i <= height; i++) { + self->data[2 * i] = 0; + self->data[2 * i + 1] = width; + } +} + +void common_hal_displayio_shape_set_boundary(displayio_shape_t *self, uint16_t y, uint16_t start_x, uint16_t end_x) { + if (y < 0 || y >= self->height || (self->mirror_y && y > self->half_height)) { + mp_raise_ValueError(translate("y value out of bounds")); + } + if (start_x < 0 || start_x > self->width || end_x < 0 || end_x > self->width) { + mp_raise_ValueError(translate("x value out of bounds")); + } + uint16_t half_width = self->width / 2 - 1 + self->width % 2; + if (self->mirror_x && (start_x > half_width || end_x > half_width)) { + mp_raise_ValueError_varg(translate("Maximum x value when mirrored is %d"), half_width); + } + self->data[2 * y] = start_x; + self->data[2 * y + 1] = end_x; +} + +uint32_t common_hal_displayio_shape_get_pixel(void *obj, int16_t x, int16_t y) { + displayio_shape_t *self = obj; + if (x >= self->width || x < 0 || y >= self->height || y < 0) { + return 0; + } + if (self->mirror_x && x > self->half_width) { + x = self->width - 1 - x; + } + if (self->mirror_y && y > self->half_height) { + y = self->height - y - 1; + } + uint16_t start_x = self->data[2 * y]; + uint16_t end_x = self->data[2 * y + 1]; + if (x < start_x || x > end_x) { + return 0; + } + return 1; +} diff --git a/shared-bindings/bleio/UUIDType.h b/shared-module/displayio/Shape.h index 87bbf9b53..ca054fe00 100644 --- a/shared-bindings/bleio/UUIDType.h +++ b/shared-module/displayio/Shape.h @@ -3,7 +3,7 @@ * * The MIT License (MIT) * - * Copyright (c) 2018 Artur Pacholec + * Copyright (c) 2019 Scott Shawcroft for Adafruit Industries * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,23 +24,23 @@ * THE SOFTWARE. */ -#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_UUIDTYPE_H -#define MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_UUIDTYPE_H +#ifndef MICROPY_INCLUDED_SHARED_MODULE_DISPLAYIO_SHAPE_H +#define MICROPY_INCLUDED_SHARED_MODULE_DISPLAYIO_SHAPE_H -#include "py/obj.h" - -typedef enum { - UUID_TYPE_16BIT, - UUID_TYPE_128BIT -} bleio_uuid_type_t; +#include <stdbool.h> +#include <stdint.h> -extern const mp_obj_type_t bleio_uuidtype_type; +#include "py/obj.h" typedef struct { mp_obj_base_t base; -} bleio_uuidtype_obj_t; - -extern const bleio_uuidtype_obj_t bleio_uuidtype_16bit_obj; -extern const bleio_uuidtype_obj_t bleio_uuidtype_128bit_obj; + uint16_t width; + uint16_t height; + uint16_t half_width; + uint16_t half_height; + uint16_t* data; + bool mirror_x; + bool mirror_y; +} displayio_shape_t; -#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_UUIDTYPE_H +#endif // MICROPY_INCLUDED_SHARED_MODULE_DISPLAYIO_SHAPE_H diff --git a/shared-module/displayio/Sprite.c b/shared-module/displayio/Sprite.c deleted file mode 100644 index 87600f721..000000000 --- a/shared-module/displayio/Sprite.c +++ /dev/null @@ -1,99 +0,0 @@ -/* - * This file is part of the Micro Python project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#include "shared-bindings/displayio/Sprite.h" - -#include "shared-bindings/displayio/Bitmap.h" -#include "shared-bindings/displayio/ColorConverter.h" -#include "shared-bindings/displayio/OnDiskBitmap.h" -#include "shared-bindings/displayio/Palette.h" - -void common_hal_displayio_sprite_construct(displayio_sprite_t *self, mp_obj_t bitmap, - mp_obj_t pixel_shader, uint16_t width, uint16_t height, uint16_t x, uint16_t y) { - self->width = width; - self->height = height; - self->bitmap = bitmap; - self->pixel_shader = pixel_shader; - self->x = x; - self->y = y; -} - -void common_hal_displayio_sprite_get_position(displayio_sprite_t *self, int16_t* x, int16_t* y) { - *x = self->x; - *y = self->y; -} - -void common_hal_displayio_sprite_set_position(displayio_sprite_t *self, int16_t x, int16_t y) { - self->x = x; - self->y = y; - self->needs_refresh = true; -} - - -mp_obj_t common_hal_displayio_sprite_get_pixel_shader(displayio_sprite_t *self) { - return self->pixel_shader; -} - -void common_hal_displayio_sprite_set_pixel_shader(displayio_sprite_t *self, mp_obj_t pixel_shader) { - self->pixel_shader = pixel_shader; - self->needs_refresh = true; -} - -bool displayio_sprite_get_pixel(displayio_sprite_t *self, int16_t x, int16_t y, uint16_t* pixel) { - x -= self->x; - y -= self->y; - if (y < 0 || y >= self->height || x >= self->width || x < 0) { - return false; - } - uint32_t value = 0; - if (MP_OBJ_IS_TYPE(self->bitmap, &displayio_bitmap_type)) { - value = common_hal_displayio_bitmap_get_pixel(self->bitmap, x, y); - } else if (MP_OBJ_IS_TYPE(self->bitmap, &displayio_ondiskbitmap_type)) { - value = common_hal_displayio_ondiskbitmap_get_pixel(self->bitmap, x, y); - } - - if (self->pixel_shader == mp_const_none) { - *pixel = value; - return true; - } else if (MP_OBJ_IS_TYPE(self->pixel_shader, &displayio_palette_type) && displayio_palette_get_color(self->pixel_shader, value, pixel)) { - return true; - } else if (MP_OBJ_IS_TYPE(self->pixel_shader, &displayio_colorconverter_type) && common_hal_displayio_colorconverter_convert(self->pixel_shader, value, pixel)) { - return true; - } - - return false; -} - -bool displayio_sprite_needs_refresh(displayio_sprite_t *self) { - return self->needs_refresh || displayio_palette_needs_refresh(self->pixel_shader); -} - -void displayio_sprite_finish_refresh(displayio_sprite_t *self) { - self->needs_refresh = false; - displayio_palette_finish_refresh(self->pixel_shader); - // TODO(tannewt): We could double buffer changes to position and move them over here. - // That way they won't change during a refresh and tear. -} diff --git a/shared-module/displayio/TileGrid.c b/shared-module/displayio/TileGrid.c new file mode 100644 index 000000000..3212dfe8b --- /dev/null +++ b/shared-module/displayio/TileGrid.c @@ -0,0 +1,193 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "shared-bindings/displayio/TileGrid.h" + +#include "shared-bindings/displayio/Bitmap.h" +#include "shared-bindings/displayio/ColorConverter.h" +#include "shared-bindings/displayio/OnDiskBitmap.h" +#include "shared-bindings/displayio/Palette.h" +#include "shared-bindings/displayio/Shape.h" + +void common_hal_displayio_tilegrid_construct(displayio_tilegrid_t *self, mp_obj_t bitmap, + uint16_t bitmap_width_in_tiles, + mp_obj_t pixel_shader, uint16_t width, uint16_t height, + uint16_t tile_width, uint16_t tile_height, uint16_t x, uint16_t y, uint8_t default_tile) { + uint32_t total_tiles = width * height; + // Sprites will only have one tile so save a little memory by inlining values in the pointer. + uint8_t inline_tiles = sizeof(uint8_t*); + if (total_tiles <= inline_tiles) { + self->tiles = 0; + // Pack values into the pointer since there are only a few. + for (uint32_t i = 0; i < inline_tiles; i++) { + ((uint8_t*) &self->tiles)[i] = default_tile; + } + self->inline_tiles = true; + } else { + self->tiles = (uint8_t*) m_malloc(total_tiles, false); + for (uint32_t i = 0; i < total_tiles; i++) { + self->tiles[i] = default_tile; + } + self->inline_tiles = false; + } + self->bitmap_width_in_tiles = bitmap_width_in_tiles; + self->width_in_tiles = width; + self->height_in_tiles = height; + self->total_width = width * tile_width; + self->total_height = height * tile_height; + self->tile_width = tile_width; + self->tile_height = tile_height; + self->bitmap = bitmap; + self->pixel_shader = pixel_shader; + self->x = x; + self->y = y; +} + + +mp_int_t common_hal_displayio_tilegrid_get_x(displayio_tilegrid_t *self) { + return self->x; +} +void common_hal_displayio_tilegrid_set_x(displayio_tilegrid_t *self, mp_int_t x) { + self->needs_refresh = self->x != x; + self->x = x; +} +mp_int_t common_hal_displayio_tilegrid_get_y(displayio_tilegrid_t *self) { + return self->y; +} + +void common_hal_displayio_tilegrid_set_y(displayio_tilegrid_t *self, mp_int_t y) { + self->needs_refresh = self->y != y; + self->y = y; +} + +mp_obj_t common_hal_displayio_tilegrid_get_pixel_shader(displayio_tilegrid_t *self) { + return self->pixel_shader; +} + +void common_hal_displayio_tilegrid_set_pixel_shader(displayio_tilegrid_t *self, mp_obj_t pixel_shader) { + self->pixel_shader = pixel_shader; + self->needs_refresh = true; +} + + +uint16_t common_hal_displayio_tilegrid_get_width(displayio_tilegrid_t *self) { + return self->width_in_tiles; +} + +uint16_t common_hal_displayio_tilegrid_get_height(displayio_tilegrid_t *self) { + return self->height_in_tiles; +} + +uint8_t common_hal_displayio_tilegrid_get_tile(displayio_tilegrid_t *self, uint16_t x, uint16_t y) { + uint8_t* tiles = self->tiles; + if (self->inline_tiles) { + tiles = (uint8_t*) &self->tiles; + } + if (tiles == NULL) { + return 0; + } + return tiles[y * self->width_in_tiles + x]; +} + +void common_hal_displayio_tilegrid_set_tile(displayio_tilegrid_t *self, uint16_t x, uint16_t y, uint8_t tile_index) { + uint8_t* tiles = self->tiles; + if (self->inline_tiles) { + tiles = (uint8_t*) &self->tiles; + } + if (tiles == NULL) { + return; + } + tiles[y * self->width_in_tiles + x] = tile_index; + self->needs_refresh = true; +} + + +void common_hal_displayio_tilegrid_set_top_left(displayio_tilegrid_t *self, uint16_t x, uint16_t y) { + self->top_left_x = x; + self->top_left_y = y; +} +bool displayio_tilegrid_get_pixel(displayio_tilegrid_t *self, int16_t x, int16_t y, uint16_t* pixel) { + x -= self->x; + y -= self->y; + if (y < 0 || y >= self->total_height || x >= self->total_width || x < 0) { + return false; + } + + uint8_t* tiles = self->tiles; + if (self->inline_tiles) { + tiles = (uint8_t*) &self->tiles; + } + if (tiles == NULL) { + return false; + } + uint16_t tile_location = ((y / self->tile_height + self->top_left_y) % self->height_in_tiles) * self->width_in_tiles + (x / self->tile_width + self->top_left_x) % self->width_in_tiles; + uint8_t tile = tiles[tile_location]; + uint16_t tile_x = tile_x = (tile % self->bitmap_width_in_tiles) * self->tile_width + x % self->tile_width; + uint16_t tile_y = tile_y = (tile / self->bitmap_width_in_tiles) * self->tile_height + y % self->tile_height; + + uint32_t value = 0; + if (MP_OBJ_IS_TYPE(self->bitmap, &displayio_bitmap_type)) { + value = common_hal_displayio_bitmap_get_pixel(self->bitmap, tile_x, tile_y); + } else if (MP_OBJ_IS_TYPE(self->bitmap, &displayio_shape_type)) { + value = common_hal_displayio_shape_get_pixel(self->bitmap, tile_x, tile_y); + } else if (MP_OBJ_IS_TYPE(self->bitmap, &displayio_ondiskbitmap_type)) { + value = common_hal_displayio_ondiskbitmap_get_pixel(self->bitmap, tile_x, tile_y); + } + + if (self->pixel_shader == mp_const_none) { + *pixel = value; + return true; + } else if (MP_OBJ_IS_TYPE(self->pixel_shader, &displayio_palette_type) && displayio_palette_get_color(self->pixel_shader, value, pixel)) { + return true; + } else if (MP_OBJ_IS_TYPE(self->pixel_shader, &displayio_colorconverter_type) && common_hal_displayio_colorconverter_convert(self->pixel_shader, value, pixel)) { + return true; + } + + return false; +} + +bool displayio_tilegrid_needs_refresh(displayio_tilegrid_t *self) { + if (self->needs_refresh) { + return true; + } else if (MP_OBJ_IS_TYPE(self->pixel_shader, &displayio_palette_type)) { + return displayio_palette_needs_refresh(self->pixel_shader); + } else if (MP_OBJ_IS_TYPE(self->pixel_shader, &displayio_colorconverter_type)) { + return displayio_colorconverter_needs_refresh(self->pixel_shader); + } + + return false; +} + +void displayio_tilegrid_finish_refresh(displayio_tilegrid_t *self) { + self->needs_refresh = false; + if (MP_OBJ_IS_TYPE(self->pixel_shader, &displayio_palette_type)) { + displayio_palette_finish_refresh(self->pixel_shader); + } else if (MP_OBJ_IS_TYPE(self->pixel_shader, &displayio_colorconverter_type)) { + displayio_colorconverter_finish_refresh(self->pixel_shader); + } + // TODO(tannewt): We could double buffer changes to position and move them over here. + // That way they won't change during a refresh and tear. +} diff --git a/shared-module/displayio/TileGrid.h b/shared-module/displayio/TileGrid.h new file mode 100644 index 000000000..59645553d --- /dev/null +++ b/shared-module/displayio/TileGrid.h @@ -0,0 +1,59 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_SHARED_MODULE_DISPLAYIO_TILEGRID_H +#define MICROPY_INCLUDED_SHARED_MODULE_DISPLAYIO_TILEGRID_H + +#include <stdbool.h> +#include <stdint.h> + +#include "py/obj.h" + +typedef struct { + mp_obj_base_t base; + mp_obj_t bitmap; + mp_obj_t pixel_shader; + uint16_t x; + uint16_t y; + uint16_t bitmap_width_in_tiles; + uint16_t width_in_tiles; + uint16_t height_in_tiles; + uint16_t total_width; + uint16_t total_height; + uint16_t tile_width; + uint16_t tile_height; + uint16_t top_left_x; + uint16_t top_left_y; + uint8_t* tiles; + bool needs_refresh; + bool inline_tiles; +} displayio_tilegrid_t; + +bool displayio_tilegrid_get_pixel(displayio_tilegrid_t *self, int16_t x, int16_t y, uint16_t *pixel); +bool displayio_tilegrid_needs_refresh(displayio_tilegrid_t *self); +void displayio_tilegrid_finish_refresh(displayio_tilegrid_t *self); + +#endif // MICROPY_INCLUDED_SHARED_MODULE_DISPLAYIO_TILEGRID_H diff --git a/shared-module/displayio/__init__.c b/shared-module/displayio/__init__.c index df9c2963a..ced5b0fef 100644 --- a/shared-module/displayio/__init__.c +++ b/shared-module/displayio/__init__.c @@ -1,80 +1,216 @@ -#include "shared-bindings/displayio/FourWire.h" -extern displayio_fourwire_obj_t board_display_obj; +#include <string.h> +#include "shared-module/displayio/__init__.h" -void start_region_update(displayio_fourwire_obj_t* display, uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { - // TODO delegate between different display types - displayio_fourwire_start_region_update(display, x0, y0, x1, y1); -} - -void finish_region_update(displayio_fourwire_obj_t* display) { - // TODO delegate between different display types - displayio_fourwire_finish_region_update(display); -} +#include "lib/utils/interrupt_char.h" +#include "py/reload.h" +#include "py/runtime.h" +#include "shared-bindings/displayio/Bitmap.h" +#include "shared-bindings/displayio/Display.h" +#include "shared-bindings/displayio/Group.h" +#include "shared-bindings/displayio/Palette.h" +#include "supervisor/shared/autoreload.h" +#include "supervisor/shared/display.h" +#include "supervisor/memory.h" +#include "supervisor/usb.h" -void finish_refresh(displayio_fourwire_obj_t* display) { - // TODO delegate between different display types - displayio_fourwire_finish_refresh(display); -} +primary_display_t displays[CIRCUITPY_DISPLAY_LIMIT]; -bool frame_queued(displayio_fourwire_obj_t* display) { - // TODO delegate between different display types - return displayio_fourwire_frame_queued(display); +static inline void swap(uint16_t* a, uint16_t* b) { + uint16_t temp = *a; + *a = *b; + *b = temp; } -bool refresh_queued(displayio_fourwire_obj_t* display) { - // TODO delegate between different display types - return displayio_fourwire_refresh_queued(display); -} - -bool send_pixels(displayio_fourwire_obj_t* display, uint32_t* pixels, uint32_t length) { - // TODO delegate between different display types - return displayio_fourwire_send_pixels(display, pixels, length); -} +// Check for recursive calls to displayio_refresh_displays. +bool refresh_displays_in_progress = false; -void displayio_refresh_display(void) { - displayio_fourwire_obj_t* display = &board_display_obj; +void displayio_refresh_displays(void) { + if (mp_hal_is_interrupted()) { + return; + } + if (reload_requested) { + // Reload is about to happen, so don't redisplay. + return; + } - if (!frame_queued(display)) { + if (refresh_displays_in_progress) { + // Don't allow recursive calls to this routine. return; } - if (refresh_queued(display)) { - // We compute the pixels - uint16_t x0 = 0; - uint16_t y0 = 0; - uint16_t x1 = display->width; - uint16_t y1 = display->height; - size_t index = 0; - //size_t row_size = (x1 - x0); - uint16_t buffer_size = 256; - uint32_t buffer[buffer_size / 2]; - start_region_update(display, x0, y0, x1, y1); - for (uint16_t y = y0; y < y1; ++y) { - for (uint16_t x = x0; x < x1; ++x) { - uint16_t* pixel = &(((uint16_t*)buffer)[index]); - *pixel = 0; - if (display->current_group != NULL) { - displayio_group_get_pixel(display->current_group, x, y, pixel); - } + refresh_displays_in_progress = true; + + for (uint8_t i = 0; i < CIRCUITPY_DISPLAY_LIMIT; i++) { + if (displays[i].display.base.type == NULL || displays[i].display.base.type == &mp_type_NoneType) { + // Skip null display. + continue; + } + displayio_display_obj_t* display = &displays[i].display; + displayio_display_update_backlight(display); + + // Time to refresh at specified frame rate? + if (!displayio_display_frame_queued(display)) { + // Too soon. Try next display. + continue; + } + if (displayio_display_refresh_queued(display)) { + // We compute the pixels. r and c are row and column to match the display memory + // structure. x and y match location within the groups. + uint16_t c0 = 0; + uint16_t r0 = 0; + uint16_t c1 = display->width; + uint16_t r1 = display->height; + if (display->transpose_xy) { + swap(&c1, &r1); + } + + if (!displayio_display_begin_transaction(display)) { + // Can't acquire display bus; skip updating this display. Try next display. + continue; + } + displayio_display_set_region_to_update(display, c0, r0, c1, r1); + displayio_display_end_transaction(display); + + uint16_t x0 = 0; + uint16_t x1 = display->width - 1; + uint16_t startx = 0; + int8_t dx = 1; + if (display->mirror_x) { + dx = -1; + startx = x1; + } + uint16_t y0 = 0; + uint16_t y1 = display->height - 1; + uint16_t starty = 0; + int8_t dy = 1; + if (display->mirror_y) { + dy = -1; + starty = y1; + } + + bool transpose = false; + if (display->transpose_xy) { + transpose = true; + int8_t temp_dx = dx; + dx = dy; + dy = temp_dx; + + swap(&starty, &startx); + swap(&x0, &y0); + swap(&x1, &y1); + } + + size_t index = 0; + uint16_t buffer_size = 256; + uint32_t buffer[buffer_size / 2]; + bool skip_this_display = false; + + for (uint16_t y = starty; y0 <= y && y <= y1; y += dy) { + for (uint16_t x = startx; x0 <= x && x <= x1; x += dx) { + uint16_t* pixel = &(((uint16_t*)buffer)[index]); + *pixel = 0; + + if (display->current_group != NULL) { + if (transpose) { + displayio_group_get_pixel(display->current_group, y, x, pixel); + } else { + displayio_group_get_pixel(display->current_group, x, y, pixel); + } + } - index += 1; - // The buffer is full, send it. - if (index >= buffer_size) { - if (!send_pixels(display, buffer, buffer_size / 2)) { - finish_region_update(display); - return; + index += 1; + // The buffer is full, send it. + if (index >= buffer_size) { + if (!displayio_display_begin_transaction(display)) { + // Can't acquire display bus; skip the rest of the data. Try next display. + index = 0; + skip_this_display = true; + break; + } + displayio_display_send_pixels(display, buffer, buffer_size / 2); + displayio_display_end_transaction(display); + // TODO(tannewt): Make refresh displays faster so we don't starve other + // background tasks. + usb_background(); + index = 0; } - index = 0; } } + + if (skip_this_display) { + // Go on to next display. + continue; + } + // Send the remaining data. + if (index) { + if (!displayio_display_begin_transaction(display)) { + // Can't get display bus. Skip the rest of the data. Try next display. + continue; + } + displayio_display_send_pixels(display, buffer, index * 2); + } + displayio_display_end_transaction(display); + } + displayio_display_finish_refresh(display); + } + + // All done. + refresh_displays_in_progress = false; +} + +void common_hal_displayio_release_displays(void) { + for (uint8_t i = 0; i < CIRCUITPY_DISPLAY_LIMIT; i++) { + mp_const_obj_t bus_type = displays[i].fourwire_bus.base.type; + if (bus_type == NULL) { + continue; + } else if (bus_type == &displayio_fourwire_type) { + common_hal_displayio_fourwire_deinit(&displays[i].fourwire_bus); + } else if (bus_type == &displayio_parallelbus_type) { + common_hal_displayio_parallelbus_deinit(&displays[i].parallel_bus); } - // Send the remaining data. - if (index && !send_pixels(display, buffer, index * 2)) { - finish_region_update(display); - return; + displays[i].fourwire_bus.base.type = &mp_type_NoneType; + } + for (uint8_t i = 0; i < CIRCUITPY_DISPLAY_LIMIT; i++) { + release_display(&displays[i].display); + displays[i].display.base.type = &mp_type_NoneType; + } + + supervisor_stop_terminal(); +} + +void reset_displays(void) { + #if CIRCUITPY_DISPLAYIO + // The SPI buses used by FourWires may be allocated on the heap so we need to move them inline. + for (uint8_t i = 0; i < CIRCUITPY_DISPLAY_LIMIT; i++) { + if (displays[i].fourwire_bus.base.type != &displayio_fourwire_type) { + continue; + } + displayio_fourwire_obj_t* fourwire = &displays[i].fourwire_bus; + if (((uint32_t) fourwire->bus) < ((uint32_t) &displays) || + ((uint32_t) fourwire->bus) > ((uint32_t) &displays + CIRCUITPY_DISPLAY_LIMIT)) { + busio_spi_obj_t* original_spi = fourwire->bus; + if (original_spi == board_spi()) { + continue; + } + memcpy(&fourwire->inline_bus, original_spi, sizeof(busio_spi_obj_t)); + fourwire->bus = &fourwire->inline_bus; + // Check for other displays that use the same spi bus and swap them too. + for (uint8_t j = i + 1; j < CIRCUITPY_DISPLAY_LIMIT; j++) { + if (displays[i].fourwire_bus.bus == original_spi) { + displays[i].fourwire_bus.bus = &fourwire->inline_bus; + } + } + } + } + + for (uint8_t i = 0; i < CIRCUITPY_DISPLAY_LIMIT; i++) { + if (displays[i].display.base.type == NULL) { + continue; } - finish_region_update(display); + displayio_display_obj_t* display = &displays[i].display; + display->auto_brightness = true; + common_hal_displayio_display_show(display, &circuitpython_splash); } - finish_refresh(display); + #endif } diff --git a/shared-module/displayio/__init__.h b/shared-module/displayio/__init__.h index 556af430d..5b56ed55c 100644 --- a/shared-module/displayio/__init__.h +++ b/shared-module/displayio/__init__.h @@ -27,6 +27,24 @@ #ifndef MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYIO___INIT___H #define MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYIO___INIT___H -void displayio_refresh_display(void); +#include "shared-bindings/displayio/Display.h" +#include "shared-bindings/displayio/FourWire.h" +#include "shared-bindings/displayio/Group.h" +#include "shared-bindings/displayio/ParallelBus.h" + +typedef struct { + union { + displayio_fourwire_obj_t fourwire_bus; + displayio_parallelbus_obj_t parallel_bus; + }; + displayio_display_obj_t display; +} primary_display_t; + +extern primary_display_t displays[CIRCUITPY_DISPLAY_LIMIT]; + +extern displayio_group_t circuitpython_splash; + +void displayio_refresh_displays(void); +void reset_displays(void); #endif // MICROPY_INCLUDED_SHARED_BINDINGS_DISPLAYIO___INIT___H diff --git a/shared-module/fontio/BuiltinFont.c b/shared-module/fontio/BuiltinFont.c new file mode 100644 index 000000000..58820d524 --- /dev/null +++ b/shared-module/fontio/BuiltinFont.c @@ -0,0 +1,79 @@ +/* + * This file is part of the Micro Python project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "shared-bindings/fontio/BuiltinFont.h" + + +#include "shared-bindings/fontio/Glyph.h" + +#include "py/objnamedtuple.h" + +mp_obj_t common_hal_fontio_builtinfont_get_bitmap(const fontio_builtinfont_t *self) { + return MP_OBJ_FROM_PTR(self->bitmap); +} + +mp_obj_t common_hal_fontio_builtinfont_get_bounding_box(const fontio_builtinfont_t *self) { + mp_obj_t *items = m_new(mp_obj_t, 2); + items[0] = MP_OBJ_NEW_SMALL_INT(self->width); + items[1] = MP_OBJ_NEW_SMALL_INT(self->height); + return mp_obj_new_tuple(2, items); +} + +uint8_t fontio_builtinfont_get_glyph_index(const fontio_builtinfont_t *self, mp_uint_t codepoint) { + if (codepoint >= 0x20 && codepoint <= 0x7e) { + return codepoint - 0x20; + } + // Do a linear search of the mapping for unicode. + const byte* j = self->unicode_characters; + uint8_t k = 0; + while (j < self->unicode_characters + self->unicode_characters_len) { + unichar potential_c = utf8_get_char(j); + j = utf8_next_char(j); + if (codepoint == potential_c) { + return 0x7f - 0x20 + k; + } + k++; + } + return 0xff; +} + +mp_obj_t common_hal_fontio_builtinfont_get_glyph(const fontio_builtinfont_t *self, mp_uint_t codepoint) { + uint8_t glyph_index = fontio_builtinfont_get_glyph_index(self, codepoint); + if (glyph_index == 0xff) { + return mp_const_none; + } + mp_obj_t field_values[8] = { + MP_OBJ_FROM_PTR(self->bitmap), + MP_OBJ_NEW_SMALL_INT(glyph_index), + MP_OBJ_NEW_SMALL_INT(self->width), + MP_OBJ_NEW_SMALL_INT(self->height), + MP_OBJ_NEW_SMALL_INT(0), + MP_OBJ_NEW_SMALL_INT(0), + MP_OBJ_NEW_SMALL_INT(self->width), + MP_OBJ_NEW_SMALL_INT(0) + }; + return namedtuple_make_new((const mp_obj_type_t*) &fontio_glyph_type, 8, field_values, NULL); +} diff --git a/shared-module/displayio/Sprite.h b/shared-module/fontio/BuiltinFont.h index dc368c4b7..30b4ade8c 100644 --- a/shared-module/displayio/Sprite.h +++ b/shared-module/fontio/BuiltinFont.h @@ -24,27 +24,24 @@ * THE SOFTWARE. */ -#ifndef MICROPY_INCLUDED_SHARED_MODULE_DISPLAYIO_SPRITE_H -#define MICROPY_INCLUDED_SHARED_MODULE_DISPLAYIO_SPRITE_H +#ifndef MICROPY_INCLUDED_SHARED_MODULE_FONTIO_BUILTINFONT_H +#define MICROPY_INCLUDED_SHARED_MODULE_FONTIO_BUILTINFONT_H #include <stdbool.h> #include <stdint.h> #include "py/obj.h" +#include "shared-bindings/displayio/Bitmap.h" typedef struct { mp_obj_base_t base; - mp_obj_t bitmap; - mp_obj_t pixel_shader; - uint16_t x; - uint16_t y; - uint16_t width; - uint16_t height; - bool needs_refresh; -} displayio_sprite_t; + const displayio_bitmap_t* bitmap; + uint8_t width; + uint8_t height; + const byte* unicode_characters; + uint16_t unicode_characters_len; +} fontio_builtinfont_t; -bool displayio_sprite_get_pixel(displayio_sprite_t *sprite, int16_t x, int16_t y, uint16_t *pixel); -bool displayio_sprite_needs_refresh(displayio_sprite_t *self); -void displayio_sprite_finish_refresh(displayio_sprite_t *self); +uint8_t fontio_builtinfont_get_glyph_index(const fontio_builtinfont_t *self, mp_uint_t codepoint); -#endif // MICROPY_INCLUDED_SHARED_MODULE_DISPLAYIO_SPRITE_H +#endif // MICROPY_INCLUDED_SHARED_MODULE_FONTIO_BUILTINFONT_H diff --git a/ports/nrf/peripherals/nrf/nrf52832/power.c b/shared-module/fontio/__init__.c index 942524f53..674343c53 100644 --- a/ports/nrf/peripherals/nrf/nrf52832/power.c +++ b/shared-module/fontio/__init__.c @@ -1,9 +1,9 @@ /* - * This file is part of the Micro Python project, http://micropython.org/ + * This file is part of the MicroPython project, http://micropython.org/ * * The MIT License (MIT) * - * Copyright (c) 2018 Dan Halbert for Adafruit Industries + * Copyright (c) 2016 Scott Shawcroft * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,7 +24,4 @@ * THE SOFTWARE. */ -#include "nrfx.h" - -void nrf_peripherals_power_init(void) { -} +// Nothing now. diff --git a/shared-module/storage/__init__.c b/shared-module/storage/__init__.c index f09edd785..215e1356a 100644 --- a/shared-module/storage/__init__.c +++ b/shared-module/storage/__init__.c @@ -143,7 +143,7 @@ mp_obj_t common_hal_storage_getmount(const char *mount_path) { return storage_object_from_path(mount_path); } -void common_hal_storage_remount(const char *mount_path, bool readonly) { +void common_hal_storage_remount(const char *mount_path, bool readonly, bool disable_concurrent_write_protection) { if (strcmp(mount_path, "/") != 0) { mp_raise_OSError(MP_EINVAL); } @@ -156,7 +156,8 @@ void common_hal_storage_remount(const char *mount_path, bool readonly) { } #endif - supervisor_flash_set_usb_writable(readonly); + filesystem_set_internal_writable_by_usb(readonly); + filesystem_set_internal_concurrent_write_protection(!disable_concurrent_write_protection); } void common_hal_storage_erase_filesystem(void) { diff --git a/shared-module/struct/__init__.c b/shared-module/struct/__init__.c index 78c04f07b..245dbbda9 100644 --- a/shared-module/struct/__init__.c +++ b/shared-module/struct/__init__.c @@ -71,45 +71,6 @@ mp_uint_t get_fmt_num(const char **p) { return val; } -void shared_modules_struct_pack_into(mp_obj_t fmt_in, byte *p, byte* end_p, size_t n_args, const mp_obj_t *args) { - const char *fmt = mp_obj_str_get_str(fmt_in); - char fmt_type = get_fmt_type(&fmt); - - size_t i; - for (i = 0; i < n_args;) { - mp_uint_t sz = 1; - if (*fmt == '\0') { - // more arguments given than used by format string; CPython raises struct.error here - mp_raise_RuntimeError(translate("too many arguments provided with the given format")); - } - struct_validate_format(*fmt); - - if (unichar_isdigit(*fmt)) { - sz = get_fmt_num(&fmt); - } - if (p + sz > end_p) { - mp_raise_RuntimeError(translate("buffer too small")); - } - - if (*fmt == 's') { - mp_buffer_info_t bufinfo; - mp_get_buffer_raise(args[i++], &bufinfo, MP_BUFFER_READ); - mp_uint_t to_copy = sz; - if (bufinfo.len < to_copy) { - to_copy = bufinfo.len; - } - memcpy(p, bufinfo.buf, to_copy); - memset(p + to_copy, 0, sz - to_copy); - p += sz; - } else { - while (sz--) { - mp_binary_set_val(fmt_type, *fmt, args[i++], &p); - } - } - fmt++; - } -} - mp_uint_t calcsize_items(const char *fmt) { mp_uint_t cnt = 0; while (*fmt) { @@ -120,7 +81,10 @@ mp_uint_t calcsize_items(const char *fmt) { num = 1; } } - cnt += num; + // Pad bytes are skipped and don't get included in the item count. + if (*fmt != 'x') { + cnt += num; + } fmt++; } return cnt; @@ -155,14 +119,71 @@ mp_uint_t shared_modules_struct_calcsize(mp_obj_t fmt_in) { return size; } +void shared_modules_struct_pack_into(mp_obj_t fmt_in, byte *p, byte* end_p, size_t n_args, const mp_obj_t *args) { + const char *fmt = mp_obj_str_get_str(fmt_in); + char fmt_type = get_fmt_type(&fmt); + const mp_uint_t total_sz = shared_modules_struct_calcsize(fmt_in); + + if (p + total_sz > end_p) { + mp_raise_RuntimeError(translate("buffer too small")); + } + + size_t i; + for (i = 0; i < n_args;) { + mp_uint_t sz = 1; + if (*fmt == '\0') { + // more arguments given than used by format string; CPython raises struct.error here + mp_raise_RuntimeError(translate("too many arguments provided with the given format")); + } + struct_validate_format(*fmt); + + if (unichar_isdigit(*fmt)) { + sz = get_fmt_num(&fmt); + } + + if (*fmt == 's') { + mp_buffer_info_t bufinfo; + mp_get_buffer_raise(args[i++], &bufinfo, MP_BUFFER_READ); + mp_uint_t to_copy = sz; + if (bufinfo.len < to_copy) { + to_copy = bufinfo.len; + } + memcpy(p, bufinfo.buf, to_copy); + memset(p + to_copy, 0, sz - to_copy); + p += sz; + } else { + while (sz--) { + mp_binary_set_val(fmt_type, *fmt, args[i], &p); + // Pad bytes don't have a corresponding argument. + if (*fmt != 'x') { + i++; + } + } + } + fmt++; + } +} -mp_obj_tuple_t * shared_modules_struct_unpack_from(mp_obj_t fmt_in, byte *p, byte *end_p) { +mp_obj_tuple_t * shared_modules_struct_unpack_from(mp_obj_t fmt_in, byte *p, byte *end_p, bool exact_size) { const char *fmt = mp_obj_str_get_str(fmt_in); char fmt_type = get_fmt_type(&fmt); - mp_uint_t num_items = calcsize_items(fmt); + const mp_uint_t num_items = calcsize_items(fmt); + const mp_uint_t total_sz = shared_modules_struct_calcsize(fmt_in); mp_obj_tuple_t *res = MP_OBJ_TO_PTR(mp_obj_new_tuple(num_items, NULL)); + // If exact_size, make sure the buffer is exactly the right size. + // Otherwise just make sure it's big enough. + if (exact_size) { + if (p + total_sz != end_p) { + mp_raise_RuntimeError(translate("buffer size must match format")); + } + } else { + if (p + total_sz > end_p) { + mp_raise_RuntimeError(translate("buffer too small")); + } + } + for (uint i = 0; i < num_items;) { mp_uint_t sz = 1; @@ -171,9 +192,6 @@ mp_obj_tuple_t * shared_modules_struct_unpack_from(mp_obj_t fmt_in, byte *p, byt if (unichar_isdigit(*fmt)) { sz = get_fmt_num(&fmt); } - if (p + sz > end_p) { - mp_raise_RuntimeError(translate("buffer too small")); - } mp_obj_t item; if (*fmt == 's') { item = mp_obj_new_bytes(p, sz); @@ -182,7 +200,10 @@ mp_obj_tuple_t * shared_modules_struct_unpack_from(mp_obj_t fmt_in, byte *p, byt } else { while (sz--) { item = mp_binary_get_val(fmt_type, *fmt, &p); - res->items[i++] = item; + // Pad bytes are not stored. + if (*fmt != 'x') { + res->items[i++] = item; + } } } fmt++; diff --git a/shared-module/terminalio/Terminal.c b/shared-module/terminalio/Terminal.c new file mode 100644 index 000000000..7adf9d032 --- /dev/null +++ b/shared-module/terminalio/Terminal.c @@ -0,0 +1,122 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "shared-module/terminalio/Terminal.h" + +#include "shared-module/fontio/BuiltinFont.h" +#include "shared-bindings/displayio/TileGrid.h" + +void common_hal_terminalio_terminal_construct(terminalio_terminal_obj_t *self, displayio_tilegrid_t* tilegrid, const fontio_builtinfont_t* font) { + self->cursor_x = 0; + self->cursor_y = 0; + self->font = font; + self->tilegrid = tilegrid; + self->first_row = 0; +} + +size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, const byte *data, size_t len, int *errcode) { + const byte* i = data; + uint16_t start_y = self->cursor_y; + while (i < data + len) { + unichar c = utf8_get_char(i); + i = utf8_next_char(i); + // Always handle ASCII. + if (c < 128) { + if (c >= 0x20 && c <= 0x7e) { + uint8_t tile_index = fontio_builtinfont_get_glyph_index(self->font, c); + common_hal_displayio_tilegrid_set_tile(self->tilegrid, self->cursor_x, self->cursor_y, tile_index); + self->cursor_x++; + } else if (c == '\r') { + self->cursor_x = 0; + } else if (c == '\n') { + self->cursor_y++; + // Commands below are used by MicroPython in the REPL + } else if (c == '\b') { + if (self->cursor_x > 0) { + self->cursor_x--; + } + } else if (c == 0x1b) { + if (i[0] == '[') { + if (i[1] == 'K') { + // Clear the rest of the line. + for (uint16_t j = self->cursor_x; j < self->tilegrid->width_in_tiles; j++) { + common_hal_displayio_tilegrid_set_tile(self->tilegrid, j, self->cursor_y, 0); + } + i += 2; + } else { + // Handle commands of the form \x1b[####D + uint16_t n = 0; + uint8_t j = 1; + for (; j < 6; j++) { + if ('0' <= i[j] && i[j] <= '9') { + n = n * 10 + (i[j] - '0'); + } else { + c = i[j]; + break; + } + } + if (c == 'D') { + if (n > self->cursor_x) { + self->cursor_x = 0; + } else { + self->cursor_x -= n; + } + } + i += j + 1; + continue; + } + } + } + } else { + uint8_t tile_index = fontio_builtinfont_get_glyph_index(self->font, c); + if (tile_index != 0xff) { + common_hal_displayio_tilegrid_set_tile(self->tilegrid, self->cursor_x, self->cursor_y, tile_index); + self->cursor_x++; + + } + } + if (self->cursor_x >= self->tilegrid->width_in_tiles) { + self->cursor_y++; + self->cursor_x %= self->tilegrid->width_in_tiles; + } + if (self->cursor_y >= self->tilegrid->height_in_tiles) { + self->cursor_y %= self->tilegrid->height_in_tiles; + } + if (self->cursor_y != start_y) { + // clear the new row + for (uint16_t j = 0; j < self->tilegrid->width_in_tiles; j++) { + common_hal_displayio_tilegrid_set_tile(self->tilegrid, j, self->cursor_y, 0); + start_y = self->cursor_y; + } + common_hal_displayio_tilegrid_set_top_left(self->tilegrid, 0, (start_y + self->tilegrid->height_in_tiles + 1) % self->tilegrid->height_in_tiles); + } + } + return i - data; +} + +bool common_hal_terminalio_terminal_ready_to_tx(terminalio_terminal_obj_t *self) { + return true; +} diff --git a/shared-module/terminalio/Terminal.h b/shared-module/terminalio/Terminal.h new file mode 100644 index 000000000..c31392cc4 --- /dev/null +++ b/shared-module/terminalio/Terminal.h @@ -0,0 +1,46 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef SHARED_MODULE_TERMINALIO_TERMINAL_H +#define SHARED_MODULE_TERMINALIO_TERMINAL_H + +#include <stdint.h> +#include <stdbool.h> + +#include "py/obj.h" +#include "shared-module/fontio/BuiltinFont.h" +#include "shared-module/displayio/TileGrid.h" + +typedef struct { + mp_obj_base_t base; + const fontio_builtinfont_t* font; + uint16_t cursor_x; + uint16_t cursor_y; + displayio_tilegrid_t* tilegrid; + uint16_t first_row; +} terminalio_terminal_obj_t; + +#endif /* SHARED_MODULE_TERMINALIO_TERMINAL_H */ diff --git a/shared-module/terminalio/__init__.c b/shared-module/terminalio/__init__.c new file mode 100644 index 000000000..3f61f4823 --- /dev/null +++ b/shared-module/terminalio/__init__.c @@ -0,0 +1,27 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 hathach for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "shared-bindings/terminalio/__init__.h" diff --git a/shared-module/terminalio/__init__.h b/shared-module/terminalio/__init__.h new file mode 100644 index 000000000..e925dd429 --- /dev/null +++ b/shared-module/terminalio/__init__.h @@ -0,0 +1,30 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef SHARED_MODULE_TERMINALIO___INIT___H +#define SHARED_MODULE_TERMINALIO___INIT___H + +#endif /* SHARED_MODULE_TERMINALIO___INIT___H */ diff --git a/shared-module/usb_midi/PortIn.c b/shared-module/usb_midi/PortIn.c new file mode 100644 index 000000000..31e320baa --- /dev/null +++ b/shared-module/usb_midi/PortIn.c @@ -0,0 +1,37 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "shared-module/usb_midi/PortIn.h" +#include "supervisor/shared/translate.h" +#include "tusb.h" + +size_t common_hal_usb_midi_portin_read(usb_midi_portin_obj_t *self, uint8_t *data, size_t len, int *errcode) { + return tud_midi_read(data, len); +} + +uint32_t common_hal_usb_midi_portin_bytes_available(usb_midi_portin_obj_t *self) { + return tud_midi_available(); +} diff --git a/ports/nrf/board_busses.h b/shared-module/usb_midi/PortIn.h index 2a4bfc3d4..2f72aa4c2 100644 --- a/ports/nrf/board_busses.h +++ b/shared-module/usb_midi/PortIn.h @@ -24,16 +24,16 @@ * THE SOFTWARE. */ -#ifndef MICROPY_INCLUDED_NRF_BOARD_BUSSES_H -#define MICROPY_INCLUDED_NRF_BOARD_BUSSES_H +#ifndef SHARED_MODULE_USB_MIDI_PORTIN_H +#define SHARED_MODULE_USB_MIDI_PORTIN_H -void board_i2c(void); -extern mp_obj_fun_builtin_fixed_t board_i2c_obj; +#include <stdint.h> +#include <stdbool.h> -void board_spi(void); -extern mp_obj_fun_builtin_fixed_t board_spi_obj; +#include "py/obj.h" -void board_uart(void); -extern mp_obj_fun_builtin_fixed_t board_uart_obj; +typedef struct { + mp_obj_base_t base; +} usb_midi_portin_obj_t; -#endif // MICROPY_INCLUDED_NRF_BOARD_BUSSES_H +#endif /* SHARED_MODULE_USB_MIDI_PORTIN_H */ diff --git a/shared-module/usb_midi/PortOut.c b/shared-module/usb_midi/PortOut.c new file mode 100644 index 000000000..99a4fad43 --- /dev/null +++ b/shared-module/usb_midi/PortOut.c @@ -0,0 +1,37 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "shared-module/usb_midi/PortOut.h" +#include "supervisor/shared/translate.h" +#include "tusb.h" + +size_t common_hal_usb_midi_portout_write(usb_midi_portout_obj_t *self, const uint8_t *data, size_t len, int *errcode) { + return tud_midi_write(0, data, len); +} + +bool common_hal_usb_midi_portout_ready_to_tx(usb_midi_portout_obj_t *self) { + return tud_midi_connected(); +} diff --git a/shared-module/usb_midi/PortOut.h b/shared-module/usb_midi/PortOut.h new file mode 100644 index 000000000..6b1b88464 --- /dev/null +++ b/shared-module/usb_midi/PortOut.h @@ -0,0 +1,39 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef SHARED_MODULE_USB_MIDI_PORTOUT_H +#define SHARED_MODULE_USB_MIDI_PORTOUT_H + +#include <stdint.h> +#include <stdbool.h> + +#include "py/obj.h" + +typedef struct { + mp_obj_base_t base; +} usb_midi_portout_obj_t; + +#endif /* SHARED_MODULE_USB_MIDI_PORTOUT_H */ diff --git a/shared-module/usb_midi/__init__.c b/shared-module/usb_midi/__init__.c new file mode 100644 index 000000000..73a314b99 --- /dev/null +++ b/shared-module/usb_midi/__init__.c @@ -0,0 +1,63 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 hathach for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "shared-bindings/usb_midi/__init__.h" + +#include "genhdr/autogen_usb_descriptor.h" +#include "py/obj.h" +#include "py/mphal.h" +#include "py/runtime.h" +#include "py/objtuple.h" +#include "shared-bindings/usb_midi/PortIn.h" +#include "shared-bindings/usb_midi/PortOut.h" +#include "supervisor/memory.h" +#include "tusb.h" + +supervisor_allocation* usb_midi_allocation; + +void usb_midi_init(void) { + // TODO(tannewt): Make this dynamic. + uint16_t tuple_size = align32_size(sizeof(mp_obj_tuple_t) + sizeof(mp_obj_t*) * 2); + uint16_t portin_size = align32_size(sizeof(usb_midi_portin_obj_t)); + uint16_t portout_size = align32_size(sizeof(usb_midi_portout_obj_t)); + + // For each embedded MIDI Jack in the descriptor we create a Port + usb_midi_allocation = allocate_memory(tuple_size + portin_size + portout_size, false); + + mp_obj_tuple_t *ports = (mp_obj_tuple_t *) usb_midi_allocation->ptr; + ports->base.type = &mp_type_tuple; + ports->len = 2; + + usb_midi_portin_obj_t* in = (usb_midi_portin_obj_t *) (usb_midi_allocation->ptr + tuple_size / 4); + in->base.type = &usb_midi_portin_type; + ports->items[0] = MP_OBJ_FROM_PTR(in); + + usb_midi_portout_obj_t* out = (usb_midi_portout_obj_t *) (usb_midi_allocation->ptr + tuple_size / 4 + portin_size / 4); + out->base.type = &usb_midi_portout_type; + ports->items[1] = MP_OBJ_FROM_PTR(out); + + mp_map_lookup(&usb_midi_module_globals.map, MP_ROM_QSTR(MP_QSTR_ports), MP_MAP_LOOKUP)->value = MP_OBJ_FROM_PTR(ports); +} diff --git a/shared-module/usb_midi/__init__.h b/shared-module/usb_midi/__init__.h new file mode 100644 index 000000000..e1ad1fbaf --- /dev/null +++ b/shared-module/usb_midi/__init__.h @@ -0,0 +1,32 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef SHARED_MODULE_USB_MIDI___INIT___H +#define SHARED_MODULE_USB_MIDI___INIT___H + +void usb_midi_init(void); + +#endif /* SHARED_MODULE_USB_MIDI___INIT___H */ diff --git a/supervisor/filesystem.h b/supervisor/filesystem.h index eb9e65c09..c7c951a5e 100644 --- a/supervisor/filesystem.h +++ b/supervisor/filesystem.h @@ -29,9 +29,20 @@ #include <stdbool.h> +#include "extmod/vfs_fat.h" + +extern volatile bool filesystem_flush_requested; + +void filesystem_background(void); +void filesystem_tick(void); void filesystem_init(bool create_allowed, bool force_create); void filesystem_flush(void); -void filesystem_writable_by_python(bool writable); bool filesystem_present(void); +void filesystem_set_internal_writable_by_usb(bool usb_writable); +void filesystem_set_internal_concurrent_write_protection(bool concurrent_write_protection); +void filesystem_set_writable_by_usb(fs_user_mount_t *vfs, bool usb_writable); +void filesystem_set_concurrent_write_protection(fs_user_mount_t *vfs, bool concurrent_write_protection); +bool filesystem_is_writable_by_python(fs_user_mount_t *vfs); +bool filesystem_is_writable_by_usb(fs_user_mount_t *vfs); #endif // MICROPY_INCLUDED_SUPERVISOR_FILESYSTEM_H diff --git a/supervisor/flash.h b/supervisor/flash.h index ae6a44fd0..edf43f4b1 100644 --- a/supervisor/flash.h +++ b/supervisor/flash.h @@ -37,7 +37,6 @@ #include "supervisor/internal_flash.h" #endif -void supervisor_flash_set_usb_writable(bool usb_writable); void supervisor_flash_init(void); uint32_t supervisor_flash_get_block_size(void); uint32_t supervisor_flash_get_block_count(void); diff --git a/supervisor/memory.h b/supervisor/memory.h index 4f8317a2d..f557744ae 100755 --- a/supervisor/memory.h +++ b/supervisor/memory.h @@ -39,6 +39,8 @@ typedef struct { uint32_t length; // in bytes } supervisor_allocation; + + void memory_init(void); void free_memory(supervisor_allocation* allocation); supervisor_allocation* allocate_remaining_memory(void); @@ -48,4 +50,14 @@ supervisor_allocation* allocate_remaining_memory(void); // statically allocated memory. supervisor_allocation* allocate_memory(uint32_t length, bool high_address); +static inline uint16_t align32_size(uint16_t size) { + if (size % 4 != 0) { + return (size & 0xfffc) + 0x4; + } + return size; +} + +// Called after the heap is freed in case the supervisor wants to save some values. +void supervisor_move_memory(void); + #endif // MICROPY_INCLUDED_SUPERVISOR_MEMORY_H diff --git a/supervisor/port.h b/supervisor/port.h index 59898c8e4..1430c6a50 100644 --- a/supervisor/port.h +++ b/supervisor/port.h @@ -29,10 +29,6 @@ #include "py/mpconfig.h" -#ifndef PORT_HEAP_SIZE -#error "Please define PORT_HEAP_SIZE to specify heap size in bytes." -#endif - #include "supervisor/shared/safe_mode.h" // Provided by the linker; diff --git a/supervisor/shared/autoreload.c b/supervisor/shared/autoreload.c index 2a7fd1e9d..14b21902c 100644 --- a/supervisor/shared/autoreload.c +++ b/supervisor/shared/autoreload.c @@ -29,9 +29,10 @@ #include "py/mphal.h" #include "py/reload.h" -volatile uint32_t autoreload_delay_ms = 0; -bool autoreload_enabled = false; +static volatile uint32_t autoreload_delay_ms = 0; +static bool autoreload_enabled = false; static bool autoreload_suspended = false; + volatile bool reload_requested = false; inline void autoreload_tick() { diff --git a/ports/atmel-samd/board_busses.c b/supervisor/shared/board_busses.c index 424c9cc08..d77c4f331 100644 --- a/ports/atmel-samd/board_busses.c +++ b/supervisor/shared/board_busses.c @@ -31,9 +31,12 @@ #include "shared-bindings/microcontroller/Pin.h" #include "supervisor/shared/translate.h" #include "mpconfigboard.h" -#include "samd/pins.h" #include "py/runtime.h" +#ifdef CIRCUITPY_DISPLAYIO +#include "shared-module/displayio/__init__.h" +#endif + #define BOARD_I2C (defined(DEFAULT_I2C_BUS_SDA) && defined(DEFAULT_I2C_BUS_SCL)) #define BOARD_SPI (defined(DEFAULT_SPI_BUS_SCK) && defined(DEFAULT_SPI_BUS_MISO) && defined(DEFAULT_SPI_BUS_MOSI)) #define BOARD_UART (defined(DEFAULT_UART_BUS_RX) && defined(DEFAULT_UART_BUS_TX)) @@ -41,10 +44,10 @@ #if BOARD_I2C STATIC mp_obj_t i2c_singleton = NULL; -STATIC mp_obj_t board_i2c(void) { +mp_obj_t board_i2c(void) { if (i2c_singleton == NULL) { - busio_i2c_obj_t *self = m_new_obj(busio_i2c_obj_t); + busio_i2c_obj_t *self = m_new_ll_obj(busio_i2c_obj_t); self->base.type = &busio_i2c_type; assert_pin_free(DEFAULT_I2C_BUS_SDA); @@ -55,7 +58,7 @@ STATIC mp_obj_t board_i2c(void) { return i2c_singleton; } #else -STATIC mp_obj_t board_i2c(void) { +mp_obj_t board_i2c(void) { mp_raise_NotImplementedError(translate("No default I2C bus")); return NULL; } @@ -63,11 +66,14 @@ STATIC mp_obj_t board_i2c(void) { MP_DEFINE_CONST_FUN_OBJ_0(board_i2c_obj, board_i2c); #if BOARD_SPI +// Statically allocate the SPI object so it can live past the end of the heap and into the next VM. +// That way it can be used by built-in FourWire displays and be accessible through board.SPI(). +STATIC busio_spi_obj_t spi_obj; STATIC mp_obj_t spi_singleton = NULL; -STATIC mp_obj_t board_spi(void) { +mp_obj_t board_spi(void) { if (spi_singleton == NULL) { - busio_spi_obj_t *self = m_new_obj(busio_spi_obj_t); + busio_spi_obj_t *self = &spi_obj; self->base.type = &busio_spi_type; assert_pin_free(DEFAULT_SPI_BUS_SCK); assert_pin_free(DEFAULT_SPI_BUS_MOSI); @@ -81,7 +87,7 @@ STATIC mp_obj_t board_spi(void) { return spi_singleton; } #else -STATIC mp_obj_t board_spi(void) { +mp_obj_t board_spi(void) { mp_raise_NotImplementedError(translate("No default SPI bus")); return NULL; } @@ -91,9 +97,9 @@ MP_DEFINE_CONST_FUN_OBJ_0(board_spi_obj, board_spi); #if BOARD_UART STATIC mp_obj_t uart_singleton = NULL; -STATIC mp_obj_t board_uart(void) { +mp_obj_t board_uart(void) { if (uart_singleton == NULL) { - busio_uart_obj_t *self = m_new_obj(busio_uart_obj_t); + busio_uart_obj_t *self = m_new_ll_obj(busio_uart_obj_t); self->base.type = &busio_uart_type; assert_pin_free(DEFAULT_UART_BUS_RX); @@ -108,7 +114,7 @@ STATIC mp_obj_t board_uart(void) { return uart_singleton; } #else -STATIC mp_obj_t board_uart(void) { +mp_obj_t board_uart(void) { mp_raise_NotImplementedError(translate("No default UART bus")); return NULL; } @@ -121,7 +127,18 @@ void reset_board_busses(void) { i2c_singleton = NULL; #endif #if BOARD_SPI - spi_singleton = NULL; + bool display_using_spi = false; + #ifdef CIRCUITPY_DISPLAYIO + for (uint8_t i = 0; i < CIRCUITPY_DISPLAY_LIMIT; i++) { + if (displays[i].fourwire_bus.bus == spi_singleton) { + display_using_spi = true; + break; + } + } + #endif + if (!display_using_spi) { + spi_singleton = NULL; + } #endif #if BOARD_UART uart_singleton = NULL; diff --git a/ports/atmel-samd/board_busses.h b/supervisor/shared/board_busses.h index 08dd1aae1..0ccb3ba6a 100644 --- a/ports/atmel-samd/board_busses.h +++ b/supervisor/shared/board_busses.h @@ -24,18 +24,20 @@ * THE SOFTWARE. */ -#ifndef MICROPY_INCLUDED_ATMEL_SAMD_BOARD_BUSSES_H -#define MICROPY_INCLUDED_ATMEL_SAMD_BOARD_BUSSES_H +#ifndef MICROPY_INCLUDED_SUPERVISOR_SHARED_BOARD_BUSSES_H +#define MICROPY_INCLUDED_SUPERVISOR_SHARED_BOARD_BUSSES_H -void board_i2c(void); -extern mp_obj_fun_builtin_fixed_t board_i2c_obj; +#include "py/obj.h" -void board_spi(void); -extern mp_obj_fun_builtin_fixed_t board_spi_obj; +mp_obj_t board_i2c(void); +MP_DECLARE_CONST_FUN_OBJ_0(board_i2c_obj); -void board_uart(void); -extern mp_obj_fun_builtin_fixed_t board_uart_obj; +mp_obj_t board_spi(void); +MP_DECLARE_CONST_FUN_OBJ_0(board_spi_obj); + +mp_obj_t board_uart(void); +MP_DECLARE_CONST_FUN_OBJ_0(board_uart_obj); void reset_board_busses(void); -#endif // MICROPY_INCLUDED_ATMEL_SAMD_BOARD_BUSSES_H +#endif // MICROPY_INCLUDED_SUPERVISOR_SHARED_BOARD_BUSSES_H diff --git a/supervisor/shared/display.c b/supervisor/shared/display.c new file mode 100644 index 000000000..e1400426e --- /dev/null +++ b/supervisor/shared/display.c @@ -0,0 +1,189 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "supervisor/shared/display.h" + +#include <string.h> + +#include "py/mpstate.h" +#include "shared-bindings/displayio/Group.h" +#include "shared-bindings/displayio/Palette.h" +#include "shared-bindings/displayio/TileGrid.h" +#include "supervisor/memory.h" + +extern uint32_t blinka_bitmap_data[]; +extern displayio_bitmap_t blinka_bitmap; +extern displayio_group_t circuitpython_splash; + +static supervisor_allocation* tilegrid_tiles = NULL; + +void supervisor_start_terminal(uint16_t width_px, uint16_t height_px) { + displayio_tilegrid_t* grid = &supervisor_terminal_text_grid; + uint16_t width_in_tiles = (width_px - blinka_bitmap.width) / grid->tile_width; + // determine scale based on h + uint8_t scale = 1; + if (width_in_tiles > 80) { + scale = 2; + } + width_in_tiles = (width_px - blinka_bitmap.width * scale) / (grid->tile_width * scale); + uint16_t height_in_tiles = height_px / (grid->tile_height * scale); + circuitpython_splash.scale = scale; + + uint16_t total_tiles = width_in_tiles * height_in_tiles; + + // First try to allocate outside the heap. This will fail when the VM is running. + tilegrid_tiles = allocate_memory(align32_size(total_tiles), false); + uint8_t* tiles; + if (tilegrid_tiles == NULL) { + tiles = m_malloc(total_tiles, true); + MP_STATE_VM(terminal_tilegrid_tiles) = tiles; + } else { + tiles = (uint8_t*) tilegrid_tiles->ptr; + } + + if (tiles == NULL) { + return; + } + + grid->width_in_tiles = width_in_tiles; + grid->height_in_tiles = height_in_tiles; + grid->total_width = width_in_tiles * grid->tile_width; + grid->total_height = height_in_tiles * grid->tile_height; + grid->tiles = tiles; + + supervisor_terminal.cursor_x = 0; + supervisor_terminal.cursor_y = 0; +} + +void supervisor_stop_terminal(void) { + if (tilegrid_tiles != NULL) { + free_memory(tilegrid_tiles); + supervisor_terminal_text_grid.inline_tiles = false; + supervisor_terminal_text_grid.tiles = NULL; + } +} + +void supervisor_display_move_memory(void) { + #if CIRCUITPY_DISPLAYIO + displayio_tilegrid_t* grid = &supervisor_terminal_text_grid; + if (MP_STATE_VM(terminal_tilegrid_tiles) == NULL || grid->tiles != MP_STATE_VM(terminal_tilegrid_tiles)) { + return; + } + uint16_t total_tiles = grid->width_in_tiles * grid->height_in_tiles; + + tilegrid_tiles = allocate_memory(align32_size(total_tiles), false); + if (tilegrid_tiles != NULL) { + memcpy(tilegrid_tiles->ptr, grid->tiles, total_tiles); + grid->tiles = (uint8_t*) tilegrid_tiles->ptr; + } else { + grid->tiles = NULL; + grid->inline_tiles = false; + } + MP_STATE_VM(terminal_tilegrid_tiles) = NULL; + #endif +} + +uint32_t blinka_bitmap_data[32] = { + 0x00000011, 0x11000000, + 0x00000111, 0x53100000, + 0x00000111, 0x56110000, + 0x00000111, 0x11140000, + 0x00000111, 0x20002000, + 0x00000011, 0x13000000, + 0x00000001, 0x11200000, + 0x00000000, 0x11330000, + 0x00000000, 0x01122000, + 0x00001111, 0x44133000, + 0x00032323, 0x24112200, + 0x00111114, 0x44113300, + 0x00323232, 0x34112200, + 0x11111144, 0x44443300, + 0x11111111, 0x11144401, + 0x23232323, 0x21111110 +}; + +displayio_bitmap_t blinka_bitmap = { + .base = {.type = &displayio_bitmap_type }, + .width = 16, + .height = 16, + .data = blinka_bitmap_data, + .stride = 2, + .bits_per_value = 4, + .x_shift = 3, + .x_mask = 0x7, + .bitmask = 0xf, + .read_only = true +}; + +uint32_t blinka_transparency[1] = {0x80000000}; + +// These colors are RGB 565 with the bytes swapped. +uint32_t blinka_colors[8] = {0x78890000, 0x9F86B8FC, 0xffff0D5A, 0x0000f501, + 0x00000000, 0x00000000, 0x00000000, 0x00000000}; + +displayio_palette_t blinka_palette = { + .base = {.type = &displayio_palette_type }, + .opaque = blinka_transparency, + .colors = blinka_colors, + .color_count = 16, + .needs_refresh = false +}; + +displayio_tilegrid_t blinka_sprite = { + .base = {.type = &displayio_tilegrid_type }, + .bitmap = &blinka_bitmap, + .pixel_shader = &blinka_palette, + .x = 0, + .y = 0, + .bitmap_width_in_tiles = 1, + .width_in_tiles = 1, + .height_in_tiles = 1, + .total_width = 16, + .total_height = 16, + .tile_width = 16, + .tile_height = 16, + .top_left_x = 16, + .top_left_y = 16, + .tiles = 0, + .needs_refresh = false, + .inline_tiles = true +}; + +displayio_group_child_t splash_children[2] = { + {&blinka_sprite, &blinka_sprite}, + {&supervisor_terminal_text_grid, &supervisor_terminal_text_grid} +}; + +displayio_group_t circuitpython_splash = { + .base = {.type = &displayio_group_type }, + .x = 0, + .y = 0, + .scale = 2, + .size = 2, + .max_size = 2, + .children = splash_children, + .needs_refresh = true +}; diff --git a/ports/nrf/boards/feather_nrf52832/mpconfigboard.h b/supervisor/shared/display.h index 4959e1ca9..d5faa7777 100644 --- a/ports/nrf/boards/feather_nrf52832/mpconfigboard.h +++ b/supervisor/shared/display.h @@ -3,7 +3,7 @@ * * The MIT License (MIT) * - * Copyright (c) 2017 Glenn Ruben Bakke + * Copyright (c) 2019 Scott Shawcroft for Adafruit Industries * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,24 +24,28 @@ * THE SOFTWARE. */ -#define MICROPY_HW_BOARD_NAME "Bluefruit nRF52 Feather" -#define MICROPY_HW_MCU_NAME "nRF52832" -#define MICROPY_PY_SYS_PLATFORM "nRF52" +#ifndef MICROPY_INCLUDED_SUPERVISOR_SHARED_DISPLAY_H +#define MICROPY_INCLUDED_SUPERVISOR_SHARED_DISPLAY_H -#define MICROPY_HW_LED_STATUS (&pin_P0_17) +#include "shared-bindings/displayio/Bitmap.h" +#include "shared-bindings/displayio/TileGrid.h" +#include "shared-bindings/fontio/BuiltinFont.h" +#include "shared-bindings/terminalio/Terminal.h" -#define MICROPY_HW_UART_RX NRF_GPIO_PIN_MAP(0, 8) -#define MICROPY_HW_UART_TX NRF_GPIO_PIN_MAP(0, 6) +// These are autogenerated resources. -#define PORT_HEAP_SIZE (32 * 1024) -#define CIRCUITPY_AUTORELOAD_DELAY_MS 500 +// This is fixed so it doesn't need to be in RAM. +extern const displayio_bitmap_t supervisor_terminal_font_bitmap; -#define DEFAULT_I2C_BUS_SCL (&pin_P0_26) -#define DEFAULT_I2C_BUS_SDA (&pin_P0_25) +extern const fontio_builtinfont_t supervisor_terminal_font; -#define DEFAULT_SPI_BUS_SCK (&pin_P0_12) -#define DEFAULT_SPI_BUS_MOSI (&pin_P0_13) -#define DEFAULT_SPI_BUS_MISO (&pin_P0_14) +// These will change so they must live in RAM. +extern displayio_tilegrid_t supervisor_terminal_text_grid; +extern terminalio_terminal_obj_t supervisor_terminal; -#define DEFAULT_UART_BUS_RX (&pin_P0_08) -#define DEFAULT_UART_BUS_TX (&pin_P0_06) +void supervisor_start_terminal(uint16_t width_px, uint16_t height_px); +void supervisor_stop_terminal(void); + +void supervisor_display_move_memory(void); + +#endif // MICROPY_INCLUDED_SUPERVISOR_SHARED_DISPLAY_H diff --git a/supervisor/shared/external_flash/devices.h b/supervisor/shared/external_flash/devices.h index b535016a3..5b8f9b298 100644 --- a/supervisor/shared/external_flash/devices.h +++ b/supervisor/shared/external_flash/devices.h @@ -407,4 +407,21 @@ typedef struct { .write_status_register_split = false, \ } +// Settings for the Winbond W25Q32FV 4MiB SPI flash. +// Datasheet:http://www.winbond.com/resource-files/w25q32fv%20revj%2006032016.pdf?__locale=en +#define W25Q32FV {\ + .total_size = (1 << 22), /* 4 MiB */ \ + .start_up_time_us = 5000, \ + .manufacturer_id = 0xef, \ + .memory_type = 0x40, \ + .capacity = 0x16, \ + .max_clock_speed_mhz = 104, \ + .quad_enable_bit_mask = 0x00, \ + .has_sector_protection = false, \ + .supports_fast_read = true, \ + .supports_qspi = false, \ + .supports_qspi_writes = false, \ + .write_status_register_split = false, \ + .single_status_byte = false, \ +} #endif // MICROPY_INCLUDED_ATMEL_SAMD_EXTERNAL_FLASH_DEVICES_H diff --git a/supervisor/shared/filesystem.c b/supervisor/shared/filesystem.c index d968f4798..68c6f4749 100644 --- a/supervisor/shared/filesystem.c +++ b/supervisor/shared/filesystem.c @@ -24,6 +24,8 @@ * THE SOFTWARE. */ +#include "supervisor/filesystem.h" + #include "extmod/vfs_fat.h" #include "lib/oofatfs/ff.h" #include "lib/oofatfs/diskio.h" @@ -35,6 +37,30 @@ static mp_vfs_mount_t _mp_vfs; static fs_user_mount_t _internal_vfs; +static volatile uint32_t filesystem_flush_interval_ms = CIRCUITPY_FILESYSTEM_FLUSH_INTERVAL_MS; +volatile bool filesystem_flush_requested = false; + +void filesystem_background(void) { + if (filesystem_flush_requested) { + filesystem_flush(); + filesystem_flush_requested = false; + } +} + +inline void filesystem_tick(void) { + if (filesystem_flush_interval_ms == 0) { + // 0 means not turned on. + return; + } + if (filesystem_flush_interval_ms == 1) { + filesystem_flush_requested = true; + filesystem_flush_interval_ms = CIRCUITPY_FILESYSTEM_FLUSH_INTERVAL_MS; + } else { + filesystem_flush_interval_ms--; + } +} + + static void make_empty_file(FATFS *fatfs, const char *path) { FIL fp; f_open(fatfs, &fp, path, FA_WRITE | FA_CREATE_ALWAYS); @@ -89,19 +115,47 @@ void filesystem_init(bool create_allowed, bool force_create) { } void filesystem_flush(void) { + // Reset interval before next flush. + filesystem_flush_interval_ms = CIRCUITPY_FILESYSTEM_FLUSH_INTERVAL_MS; supervisor_flash_flush(); } -void filesystem_writable_by_python(bool writable) { +void filesystem_set_internal_writable_by_usb(bool writable) { fs_user_mount_t *vfs = &_internal_vfs; - if (writable) { + filesystem_set_writable_by_usb(vfs, writable); +} + +void filesystem_set_writable_by_usb(fs_user_mount_t *vfs, bool usb_writable) { + if (usb_writable) { vfs->flags |= FSUSER_USB_WRITABLE; } else { vfs->flags &= ~FSUSER_USB_WRITABLE; } } +bool filesystem_is_writable_by_python(fs_user_mount_t *vfs) { + return (vfs->flags & FSUSER_CONCURRENT_WRITE_PROTECTED) == 0 || + (vfs->flags & FSUSER_USB_WRITABLE) == 0; +} + +bool filesystem_is_writable_by_usb(fs_user_mount_t *vfs) { + return (vfs->flags & FSUSER_CONCURRENT_WRITE_PROTECTED) == 0 || + (vfs->flags & FSUSER_USB_WRITABLE) != 0; +} + +void filesystem_set_internal_concurrent_write_protection(bool concurrent_write_protection) { + filesystem_set_concurrent_write_protection(&_internal_vfs, concurrent_write_protection); +} + +void filesystem_set_concurrent_write_protection(fs_user_mount_t *vfs, bool concurrent_write_protection) { + if (concurrent_write_protection) { + vfs->flags |= FSUSER_CONCURRENT_WRITE_PROTECTED; + } else { + vfs->flags &= ~FSUSER_CONCURRENT_WRITE_PROTECTED; + } +} + bool filesystem_present(void) { return true; } diff --git a/supervisor/shared/flash.c b/supervisor/shared/flash.c index c8921aa85..6b1f24b4b 100644 --- a/supervisor/shared/flash.c +++ b/supervisor/shared/flash.c @@ -33,33 +33,13 @@ #define PART1_START_BLOCK (0x1) -void supervisor_flash_set_usb_writable(bool usb_writable) { - mp_vfs_mount_t* current_mount = MP_STATE_VM(vfs_mount_table); - for (uint8_t i = 0; current_mount != NULL; i++) { - if (i == VFS_INDEX) { - break; - } - current_mount = current_mount->next; - } - if (current_mount == NULL) { - return; - } - fs_user_mount_t *vfs = (fs_user_mount_t *) current_mount->obj; - - if (usb_writable) { - vfs->flags |= FSUSER_USB_WRITABLE; - } else { - vfs->flags &= ~FSUSER_USB_WRITABLE; - } -} - // there is a singleton Flash object const mp_obj_type_t supervisor_flash_type; STATIC const mp_obj_base_t supervisor_flash_obj = {&supervisor_flash_type}; -STATIC mp_obj_t supervisor_flash_obj_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +STATIC mp_obj_t supervisor_flash_obj_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) { // check arguments - mp_arg_check_num(n_args, n_kw, 0, 0, false); + mp_arg_check_num(n_args, kw_args, 0, 0, false); // return singleton object return (mp_obj_t)&supervisor_flash_obj; diff --git a/supervisor/shared/memory.c b/supervisor/shared/memory.c index 6c8be3be8..11133415d 100755 --- a/supervisor/shared/memory.c +++ b/supervisor/shared/memory.c @@ -28,6 +28,8 @@ #include <stddef.h> +#include "supervisor/shared/display.h" + #define CIRCUITPY_SUPERVISOR_ALLOC_COUNT 8 static supervisor_allocation allocations[CIRCUITPY_SUPERVISOR_ALLOC_COUNT]; @@ -114,3 +116,7 @@ supervisor_allocation* allocate_memory(uint32_t length, bool high) { alloc->length = length; return alloc; } + +void supervisor_move_memory(void) { + supervisor_display_move_memory(); +} diff --git a/supervisor/shared/rgb_led_status.c b/supervisor/shared/rgb_led_status.c index 186e33ab9..df9fdf8d9 100644 --- a/supervisor/shared/rgb_led_status.c +++ b/supervisor/shared/rgb_led_status.c @@ -197,6 +197,12 @@ uint32_t color_brightness(uint32_t color, uint8_t brightness) { void set_rgb_status_brightness(uint8_t level){ #if defined(MICROPY_HW_NEOPIXEL) || (defined(MICROPY_HW_APA102_MOSI) && defined(MICROPY_HW_APA102_SCK)) rgb_status_brightness = level; + uint32_t current_color = current_status_color; + // Temporarily change the current color global to force the new_status_color call to update the + // LED. Usually duplicate calls of the same color are ignored without regard to brightness + // changes. + current_status_color = 0; + new_status_color(current_color); #endif } diff --git a/supervisor/shared/safe_mode.c b/supervisor/shared/safe_mode.c index c1ce1fc9c..3bb75b897 100644 --- a/supervisor/shared/safe_mode.c +++ b/supervisor/shared/safe_mode.c @@ -105,7 +105,7 @@ void print_safe_mode_message(safe_mode_t reason) { if (reason != NO_SAFE_MODE) { serial_write("\r\n"); serial_write_compressed(translate("You are running in safe mode which means something unanticipated happened.\n")); - if (reason == HARD_CRASH || reason == MICROPY_NLR_JUMP_FAIL || reason == MICROPY_FATAL_ERROR) { + if (reason == HARD_CRASH || reason == MICROPY_NLR_JUMP_FAIL || reason == MICROPY_FATAL_ERROR || reason == GC_ALLOC_OUTSIDE_VM) { serial_write_compressed(translate("Looks like our core CircuitPython code crashed hard. Whoops!\nPlease file an issue at https://github.com/adafruit/circuitpython/issues\n with the contents of your CIRCUITPY drive and this message:\n")); if (reason == HARD_CRASH) { serial_write_compressed(translate("Crash into the HardFault_Handler.\n")); @@ -113,6 +113,8 @@ void print_safe_mode_message(safe_mode_t reason) { serial_write_compressed(translate("MicroPython NLR jump failed. Likely memory corruption.\n")); } else if (reason == MICROPY_FATAL_ERROR) { serial_write_compressed(translate("MicroPython fatal error.\n")); + } else if (reason == GC_ALLOC_OUTSIDE_VM) { + serial_write_compressed(translate("Attempted heap allocation when MicroPython VM not running.\n")); } } else if (reason == BROWNOUT) { serial_write_compressed(translate("The microcontroller's power dipped. Please make sure your power supply provides\nenough power for the whole circuit and press reset (after ejecting CIRCUITPY).\n")); diff --git a/supervisor/shared/safe_mode.h b/supervisor/shared/safe_mode.h index eba2668ac..59480b55b 100644 --- a/supervisor/shared/safe_mode.h +++ b/supervisor/shared/safe_mode.h @@ -35,7 +35,8 @@ typedef enum { HEAP_OVERWRITTEN, MANUAL_SAFE_MODE, MICROPY_NLR_JUMP_FAIL, - MICROPY_FATAL_ERROR + MICROPY_FATAL_ERROR, + GC_ALLOC_OUTSIDE_VM } safe_mode_t; safe_mode_t wait_for_safe_mode_reset(void); diff --git a/supervisor/shared/serial.c b/supervisor/shared/serial.c index c57688ddc..ed210416f 100644 --- a/supervisor/shared/serial.c +++ b/supervisor/shared/serial.c @@ -26,6 +26,10 @@ #include <string.h> +#include "py/mpconfig.h" + +#include "supervisor/shared/display.h" +#include "shared-bindings/terminalio/Terminal.h" #include "supervisor/serial.h" #include "supervisor/usb.h" @@ -48,6 +52,10 @@ bool serial_bytes_available(void) { } void serial_write_substring(const char* text, uint32_t length) { + #if CIRCUITPY_DISPLAYIO + int errcode; + common_hal_terminalio_terminal_write(&supervisor_terminal, (const uint8_t*) text, length, &errcode); + #endif if (!tud_cdc_connected()) { return; } diff --git a/supervisor/shared/usb/tusb_config.h b/supervisor/shared/usb/tusb_config.h index 649c390ac..301805275 100644 --- a/supervisor/shared/usb/tusb_config.h +++ b/supervisor/shared/usb/tusb_config.h @@ -75,6 +75,7 @@ #define CFG_TUD_CDC 1 #define CFG_TUD_MSC 1 #define CFG_TUD_HID 1 +#define CFG_TUD_MIDI 1 #define CFG_TUD_CUSTOM_CLASS 0 /*------------------------------------------------------------------*/ diff --git a/supervisor/shared/usb/usb.c b/supervisor/shared/usb/usb.c index 1aa34e9e6..c77f1e417 100644 --- a/supervisor/shared/usb/usb.c +++ b/supervisor/shared/usb/usb.c @@ -26,6 +26,7 @@ #include "tick.h" #include "shared-bindings/microcontroller/Processor.h" +#include "shared-module/usb_midi/__init__.h" #include "supervisor/port.h" #include "supervisor/usb.h" #include "lib/utils/interrupt_char.h" @@ -42,7 +43,7 @@ void load_serial_number(void) { uint8_t raw_id[COMMON_HAL_MCU_PROCESSOR_UID_LENGTH]; common_hal_mcu_processor_get_uid(raw_id); - const char nibble_to_hex[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + static const char nibble_to_hex[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; for (int i = 0; i < COMMON_HAL_MCU_PROCESSOR_UID_LENGTH; i++) { for (int j = 0; j < 2; j++) { @@ -53,10 +54,8 @@ void load_serial_number(void) { } } -bool _usb_enabled = false; - bool usb_enabled(void) { - return _usb_enabled; + return tusb_inited(); } void usb_init(void) { @@ -64,18 +63,19 @@ void usb_init(void) { load_serial_number(); tusb_init(); - _usb_enabled = true; #if MICROPY_KBD_EXCEPTION // Set Ctrl+C as wanted char, tud_cdc_rx_wanted_cb() callback will be invoked when Ctrl+C is received // This callback always got invoked regardless of mp_interrupt_char value since we only set it once here tud_cdc_set_wanted_char(CHAR_CTRL_C); #endif + + usb_midi_init(); } void usb_background(void) { if (usb_enabled()) { - tusb_task(); + tud_task(); tud_cdc_write_flush(); } } diff --git a/supervisor/shared/usb/usb_msc_flash.c b/supervisor/shared/usb/usb_msc_flash.c index 658aab0d8..f6f0fa9c3 100644 --- a/supervisor/shared/usb/usb_msc_flash.c +++ b/supervisor/shared/usb/usb_msc_flash.c @@ -34,6 +34,7 @@ #include "lib/oofatfs/ff.h" #include "py/mpstate.h" +#include "supervisor/filesystem.h" #include "supervisor/shared/autoreload.h" #define MSC_FLASH_BLOCK_SIZE 512 @@ -148,8 +149,7 @@ bool tud_msc_is_writable_cb(uint8_t lun) { if (vfs == NULL) { return false; } - if (vfs->writeblocks[0] == MP_OBJ_NULL || - (vfs->flags & FSUSER_USB_WRITABLE) == 0) { + if (vfs->writeblocks[0] == MP_OBJ_NULL || !filesystem_is_writable_by_usb(vfs)) { return false; } return true; diff --git a/supervisor/stub/filesystem.c b/supervisor/stub/filesystem.c index 12fe9fb10..1c4a3e12d 100644 --- a/supervisor/stub/filesystem.c +++ b/supervisor/stub/filesystem.c @@ -26,13 +26,17 @@ #include "supervisor/filesystem.h" -void filesystem_init(void) { +void filesystem_init(bool create_allowed, bool force_create) { + (void) create_allowed; + (void) force_create; } void filesystem_flush(void) { } -void filesystem_writable_by_python(bool writable) { +bool filesystem_is_writable_by_python(fs_user_mount_t *vfs) { + (void) vfs; + return true; } bool filesystem_present(void) { diff --git a/supervisor/stub/safe_mode.c b/supervisor/stub/safe_mode.c new file mode 100644 index 000000000..1a792becd --- /dev/null +++ b/supervisor/stub/safe_mode.c @@ -0,0 +1,39 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2019 Scott Shawcroft for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "supervisor/shared/safe_mode.h" + +safe_mode_t wait_for_safe_mode_reset(void) { + return NO_SAFE_MODE; +} + +void reset_into_safe_mode(safe_mode_t reason) { + (void) reason; +} + +void print_safe_mode_message(safe_mode_t reason) { + (void) reason; +} diff --git a/supervisor/supervisor.mk b/supervisor/supervisor.mk index 56ad8a3ba..6815fba57 100644 --- a/supervisor/supervisor.mk +++ b/supervisor/supervisor.mk @@ -2,6 +2,8 @@ SRC_SUPERVISOR = \ main.c \ supervisor/port.c \ supervisor/shared/autoreload.c \ + supervisor/shared/board_busses.c \ + supervisor/shared/display.c \ supervisor/shared/filesystem.c \ supervisor/shared/flash.c \ supervisor/shared/micropython.c \ @@ -15,6 +17,17 @@ ifndef $(NO_USB) NO_USB = $(wildcard supervisor/usb.c) endif +ifneq ($(INTERNAL_FLASH_FILESYSTEM),) + CFLAGS += -DINTERNAL_FLASH_FILESYSTEM=$(INTERNAL_FLASH_FILESYSTEM) +endif +ifneq ($(QSPI_FLASH_FILESYSTEM),) +# EXPRESS_BOARD is obsolete and should be removed when samd-peripherals is updated. + CFLAGS += -DQSPI_FLASH_FILESYSTEM=$(QSPI_FLASH_FILESYSTEM) -DEXPRESS_BOARD +endif +ifneq ($(SPI_FLASH_FILESYSTEM),) +# EXPRESS_BOARD is obsolete and should be removed when samd-peripherals is updated. + CFLAGS += -DSPI_FLASH_FILESYSTEM=$(SPI_FLASH_FILESYSTEM) -DEXPRESS_BOARD +endif # Choose which flash filesystem impl to use. # (Right now INTERNAL_FLASH_FILESYSTEM and SPI_FLASH_FILESYSTEM are mutually exclusive. @@ -25,11 +38,10 @@ ifdef EXTERNAL_FLASH_DEVICES SRC_SUPERVISOR += supervisor/shared/external_flash/external_flash.c ifeq ($(SPI_FLASH_FILESYSTEM),1) - CFLAGS += -DSPI_FLASH_FILESYSTEM SRC_SUPERVISOR += supervisor/shared/external_flash/spi_flash.c + else endif ifeq ($(QSPI_FLASH_FILESYSTEM),1) - CFLAGS += -DQSPI_FLASH_FILESYSTEM SRC_SUPERVISOR += supervisor/qspi_flash.c supervisor/shared/external_flash/qspi_flash.c endif else @@ -49,6 +61,7 @@ else lib/tinyusb/src/class/msc/msc_device.c \ lib/tinyusb/src/class/cdc/cdc_device.c \ lib/tinyusb/src/class/hid/hid_device.c \ + lib/tinyusb/src/class/midi/midi_device.c \ lib/tinyusb/src/tusb.c \ supervisor/shared/serial.c \ supervisor/usb.c \ @@ -57,13 +70,19 @@ else supervisor/shared/usb/usb_msc_flash.c \ shared-bindings/usb_hid/__init__.c \ shared-bindings/usb_hid/Device.c \ + shared-bindings/usb_midi/__init__.c \ + shared-bindings/usb_midi/PortIn.c \ + shared-bindings/usb_midi/PortOut.c \ shared-module/usb_hid/__init__.c \ shared-module/usb_hid/Device.c \ + shared-module/usb_midi/__init__.c \ + shared-module/usb_midi/PortIn.c \ + shared-module/usb_midi/PortOut.c \ $(BUILD)/autogen_usb_descriptor.c CFLAGS += -DUSB_AVAILABLE endif -SUPERVISOR_O = $(addprefix $(BUILD)/, $(SRC_SUPERVISOR:.c=.o)) +SUPERVISOR_O = $(addprefix $(BUILD)/, $(SRC_SUPERVISOR:.c=.o)) $(BUILD)/autogen_display_resources.o $(BUILD)/supervisor/shared/translate.o: $(HEADER_BUILD)/qstrdefs.generated.h @@ -82,3 +101,13 @@ autogen_usb_descriptor.intermediate: ../../tools/gen_usb_descriptor.py Makefile --serial_number_length $(USB_SERIAL_NUMBER_LENGTH)\ --output_c_file $(BUILD)/autogen_usb_descriptor.c\ --output_h_file $(BUILD)/genhdr/autogen_usb_descriptor.h + +CIRCUITPY_DISPLAY_FONT = "../../tools/Tecate-bitmap-fonts/bitmap/terminus-font-4.39/ter-u12n.bdf" + +$(BUILD)/autogen_display_resources.c: ../../tools/gen_display_resources.py $(HEADER_BUILD)/qstrdefs.generated.h Makefile | $(HEADER_BUILD) + $(STEPECHO) "GEN $@" + $(Q)install -d $(BUILD)/genhdr + $(Q)$(PYTHON3) ../../tools/gen_display_resources.py \ + --font $(CIRCUITPY_DISPLAY_FONT) \ + --sample_file $(HEADER_BUILD)/qstrdefs.generated.h \ + --output_c_file $(BUILD)/autogen_display_resources.c diff --git a/tests/extmod/ure1.py b/tests/extmod/ure1.py index 54471ed4f..710720c8b 100644 --- a/tests/extmod/ure1.py +++ b/tests/extmod/ure1.py @@ -28,6 +28,19 @@ try: except IndexError: print("IndexError") +r = re.compile(r"\n") +m = r.match("\n") +print(m.group(0)) +m = r.match("\\") +print(m) +r = re.compile(r"[\n-\r]") +m = r.match("\n") +print(m.group(0)) +r = re.compile(r"[\]]") +m = r.match("]") +print(m.group(0)) +print("===") + r = re.compile("[a-cu-z]") m = r.match("a") print(m.group(0)) diff --git a/tests/extmod/ure_groups.py b/tests/extmod/ure_groups.py new file mode 100644 index 000000000..4fac896d7 --- /dev/null +++ b/tests/extmod/ure_groups.py @@ -0,0 +1,33 @@ +# test match.groups() + +try: + import ure as re +except ImportError: + try: + import re + except ImportError: + print("SKIP") + raise SystemExit + +try: + m = re.match(".", "a") + m.groups +except AttributeError: + print('SKIP') + raise SystemExit + + +m = re.match(r'(([0-9]*)([a-z]*)[0-9]*)','1234hello567') +print(m.groups()) + +m = re.match(r'([0-9]*)(([a-z]*)([0-9]*))','1234hello567') +print(m.groups()) + +# optional group that matches +print(re.match(r'(a)?b(c)', 'abc').groups()) + +# optional group that doesn't match +print(re.match(r'(a)?b(c)', 'bc').groups()) + +# only a single match +print(re.match(r'abc', 'abc').groups()) diff --git a/tests/extmod/ure_span.py b/tests/extmod/ure_span.py new file mode 100644 index 000000000..50f44399c --- /dev/null +++ b/tests/extmod/ure_span.py @@ -0,0 +1,40 @@ +# test match.span(), and nested spans + +try: + import ure as re +except ImportError: + try: + import re + except ImportError: + print("SKIP") + raise SystemExit + +try: + m = re.match(".", "a") + m.span +except AttributeError: + print('SKIP') + raise SystemExit + + +def print_spans(match): + print('----') + try: + i = 0 + while True: + print(match.span(i), match.start(i), match.end(i)) + i += 1 + except IndexError: + pass + +m = re.match(r'(([0-9]*)([a-z]*)[0-9]*)','1234hello567') +print_spans(m) + +m = re.match(r'([0-9]*)(([a-z]*)([0-9]*))','1234hello567') +print_spans(m) + +# optional span that matches +print_spans(re.match(r'(a)?b(c)', 'abc')) + +# optional span that doesn't match +print_spans(re.match(r'(a)?b(c)', 'bc')) diff --git a/tests/extmod/ure_sub.py b/tests/extmod/ure_sub.py new file mode 100644 index 000000000..4aeb8650a --- /dev/null +++ b/tests/extmod/ure_sub.py @@ -0,0 +1,61 @@ +try: + import ure as re +except ImportError: + try: + import re + except ImportError: + print('SKIP') + raise SystemExit + +try: + re.sub +except AttributeError: + print('SKIP') + raise SystemExit + + +def multiply(m): + return str(int(m.group(0)) * 2) + +print(re.sub("\d+", multiply, "10 20 30 40 50")) + +print(re.sub("\d+", lambda m: str(int(m.group(0)) // 2), "10 20 30 40 50")) + +def A(): + return "A" +print(re.sub('a', A(), 'aBCBABCDabcda.')) + +print( + re.sub( + r'def\s+([a-zA-Z_][a-zA-Z_0-9]*)\s*\(\s*\):', + 'static PyObject*\npy_\\1(void){\n return;\n}\n', + '\n\ndef myfunc():\n\ndef myfunc1():\n\ndef myfunc2():' + ) +) + +print( + re.compile( + '(calzino) (blu|bianco|verde) e (scarpa) (blu|bianco|verde)' + ).sub( + r'\g<1> colore \2 con \g<3> colore \4? ...', + 'calzino blu e scarpa verde' + ) +) + +# no matches at all +print(re.sub('a', 'b', 'c')) + +# with maximum substitution count specified +print(re.sub('a', 'b', '1a2a3a', 2)) + +# invalid group +try: + re.sub('(a)', 'b\\2', 'a') +except: + print('invalid group') + +# invalid group with very large number (to test overflow in uPy) +try: + re.sub('(a)', 'b\\199999999999999999999999999999999999999', 'a') +except: + print('invalid group') diff --git a/tests/extmod/ure_sub_unmatched.py b/tests/extmod/ure_sub_unmatched.py new file mode 100644 index 000000000..4795b3196 --- /dev/null +++ b/tests/extmod/ure_sub_unmatched.py @@ -0,0 +1,19 @@ +# test re.sub with unmatched groups, behaviour changed in CPython 3.5 + +try: + import ure as re +except ImportError: + try: + import re + except ImportError: + print('SKIP') + raise SystemExit + +try: + re.sub +except AttributeError: + print('SKIP') + raise SystemExit + +# first group matches, second optional group doesn't so is replaced with a blank +print(re.sub(r'(a)(b)?', r'\2-\1', '1a2')) diff --git a/tests/extmod/ure_sub_unmatched.py.exp b/tests/extmod/ure_sub_unmatched.py.exp new file mode 100644 index 000000000..1e5f0fda0 --- /dev/null +++ b/tests/extmod/ure_sub_unmatched.py.exp @@ -0,0 +1 @@ +1-a2 diff --git a/tools/Tecate-bitmap-fonts b/tools/Tecate-bitmap-fonts new file mode 160000 +Subproject 6f52a7ca0838967cc57e9a44d76c6e1f60e6284 diff --git a/tools/analyze_heap_dump.py b/tools/analyze_heap_dump.py index 31202c23e..b8f2bd011 100755 --- a/tools/analyze_heap_dump.py +++ b/tools/analyze_heap_dump.py @@ -162,7 +162,31 @@ def do_all_the_things(ram_filename, bin_filename, map_filename, print_block_cont def load_pointer(address): return struct.unpack("<I", load(address))[0] - heap_start, heap_size = symbols["heap"] + if "heap" in symbols: + heap_start, heap_size = symbols["heap"] + else: + print("no static heap") + allocations_start, allocations_size = symbols["allocations"] + allocations = load(allocations_start, allocations_size) + first_zero = True + potential_heap = None + # The heap is the last left hand allocated section that should span all the way to the + # right side list. + for address, size in struct.iter_unpack("<II", allocations): + print(address, size) + if address == 0 and first_zero: + first_zero = False + if first_zero: + potential_heap = (address, size) + + if not first_zero and address != 0: + if address != potential_heap[0] + potential_heap[1]: + print("no active heap") + return + else: + heap_start, heap_size = potential_heap + break + print("found heap", heap_start, heap_size) heap = load(heap_start, heap_size) total_byte_len = len(heap) @@ -170,16 +194,18 @@ def do_all_the_things(ram_filename, bin_filename, map_filename, print_block_cont mp_state_ctx = symbols["mp_state_ctx"][0] manual_symbol_map["mp_state_ctx+20"] = "mp_state_ctx.vm.last_pool" last_pool = load_pointer(mp_state_ctx + 20) # (gdb) p &mp_state_ctx.vm.last_pool - manual_symbol_map["mp_state_ctx+104"] = "mp_state_ctx.vm.dict_main.map.table" - dict_main_table = load_pointer(mp_state_ctx + 104) # (gdb) p &mp_state_ctx.vm.dict_main.map.table + manual_symbol_map["mp_state_ctx+108"] = "mp_state_ctx.vm.dict_main.map.table" + dict_main_table = load_pointer(mp_state_ctx + 108) # (gdb) p &mp_state_ctx.vm.dict_main.map.table manual_symbol_map["mp_state_ctx+84"] = "mp_state_ctx.vm.mp_loaded_modules_dict.map.table" imports_table = load_pointer(mp_state_ctx + 84) # (gdb) p &mp_state_ctx.vm.mp_loaded_modules_dict.map.table - manual_symbol_map["mp_state_ctx+120"] = "mp_state_ctx.vm.mp_sys_path_obj.items" - manual_symbol_map["mp_state_ctx+136"] = "mp_state_ctx.vm.mp_sys_argv_obj.items" + manual_symbol_map["mp_state_ctx+124"] = "mp_state_ctx.vm.mp_sys_path_obj.items" + manual_symbol_map["mp_state_ctx+140"] = "mp_state_ctx.vm.mp_sys_argv_obj.items" + manual_symbol_map["mp_state_ctx+96"] = "mp_state_ctx.vm.dict_main" + manual_symbol_map["0x200015e0"] = "mp_state_ctx.vm.dict_main" for i in range(READLINE_HIST_SIZE): - manual_symbol_map["mp_state_ctx+{}".format(144 + i * 4)] = "mp_state_ctx.vm.readline_hist[{}]".format(i) + manual_symbol_map["mp_state_ctx+{}".format(148 + i * 4)] = "mp_state_ctx.vm.readline_hist[{}]".format(i) tuple_type = symbols["mp_type_tuple"][0] type_type = symbols["mp_type_type"][0] @@ -192,6 +218,8 @@ def do_all_the_things(ram_filename, bin_filename, map_filename, print_block_cont dynamic_type = 0x40000000 # placeholder, doesn't match any memory + long_lived_start = load_pointer(mp_state_ctx + 272) # (gdb) p &mp_state_ctx.mem.gc_lowest_long_lived_ptr + type_colors = { dict_type: "red", property_type: "yellow", @@ -252,9 +280,14 @@ def do_all_the_things(ram_filename, bin_filename, map_filename, print_block_cont table = "<<table bgcolor=\"gray\" border=\"1\" cellpadding=\"0\" cellspacing=\"0\"><tr><td colspan=\"4\" port=\"0\" height=\"18\" width=\"80\">0x{:08x}</td></tr>{}</table>>".format(address, rows) ownership_graph.add_node(address, label=table, style="invisible", shape="plaintext") + print("add 0x{:08x}".format(address)) potential_type = None node = ownership_graph.get_node(address) node.attr["height"] = 0.25 * current_allocation + if address >= long_lived_start: + node.attr["fontcolor"] = "hotpink" + else: + node.attr["fontcolor"] = "black" block_data[address] = data for k in range(len(data) // 4): word = struct.unpack_from("<I", data, offset=(k * 4))[0] @@ -270,6 +303,7 @@ def do_all_the_things(ram_filename, bin_filename, map_filename, print_block_cont bgcolor = type_colors[potential_type] elif print_unknown_types: print("unknown type", hex(potential_type)) + node.attr["label"] = "<" + node.attr["label"].replace("\"gray\"", "\"" + bgcolor + "\"") + ">" if potential_type == str_type and k == 3: @@ -285,7 +319,7 @@ def do_all_the_things(ram_filename, bin_filename, map_filename, print_block_cont if k < 4: port = 0 ownership_graph.add_edge(address, word, tailport=str(port)+":_") - #print(" 0x{:08x}".format(word)) + print(" 0x{:08x}".format(word)) if address in qstr_pools: if k > 0: qstr_chunks.append(word) @@ -421,6 +455,7 @@ def do_all_the_things(ram_filename, bin_filename, map_filename, print_block_cont node.attr["label"] = "<<table bgcolor=\"gold\" border=\"1\" cellpadding=\"0\" cellspacing=\"0\"><tr><td colspan=\"2\">0x{:08x}</td></tr>{}</table>>".format(block, rows) for node, degree in ownership_graph.in_degree_iter(): + print(node, degree) if degree == 0: address_bytes = struct.pack("<I", int(node)) location = -1 @@ -434,6 +469,8 @@ def do_all_the_things(ram_filename, bin_filename, map_filename, print_block_cont source = manual_symbol_map[source] if "readline_hist" in source: string_blocks.append(int(node)) + if pointer_location > heap_start + heap_size: + source = "stack " + source ownership_graph.add_edge(source, node) for block in string_blocks: @@ -517,7 +554,11 @@ def do_all_the_things(ram_filename, bin_filename, map_filename, print_block_cont wrapped.append(html.escape(printable_qstrs[i:i+16])) node = ownership_graph.get_node(block) node.attr["label"] = "<<table border=\"1\" cellspacing=\"0\" bgcolor=\"lightsalmon\" width=\"80\"><tr><td height=\"18\" >0x{:08x}</td></tr><tr><td height=\"{}\" >{}</td></tr></table>>".format(block, 18 * (len(wrapped) - 1), "<br/>".join(wrapped)) - node.attr["fontname"] = "FiraCode-Medium" + node.attr["fontname"] = "FiraCode-Bold" + if block >= long_lived_start: + node.attr["fontcolor"] = "hotpink" + else: + node.attr["fontcolor"] = "black" node.attr["fontpath"] = "/Users/tannewt/Library/Fonts/" node.attr["fontsize"] = 8 diff --git a/tools/bitmap_font b/tools/bitmap_font new file mode 160000 +Subproject 62dd78abdd0b823824fe15d1bab0611246145c2 diff --git a/tools/build_board_info.py b/tools/build_board_info.py index 379cf55c4..b09b29eff 100644 --- a/tools/build_board_info.py +++ b/tools/build_board_info.py @@ -12,7 +12,7 @@ from sh.contrib import git sys.path.append("adabot") import adabot.github_requests as github -SUPPORTED_PORTS = ["nrf", "esp8266", "atmel-samd"] +SUPPORTED_PORTS = ["nrf", "atmel-samd"] BIN = ('bin',) UF2 = ('uf2',) @@ -22,7 +22,6 @@ HEX = ('hex',) # Default extensions extension_by_port = { "nrf": UF2, - "esp8266": BIN, "atmel-samd": UF2, } @@ -33,15 +32,12 @@ extension_by_board = { "arduino_zero": BIN, "feather_m0_adalogger": BIN_UF2, "feather_m0_basic": BIN_UF2, - "feather_m0_rfm69": BIN, - "feather_m0_rfm9x": BIN, - - # nrf52832 - "feather_nrf52832": BIN, - "pca10040": BIN, + "feather_m0_rfm69": BIN_UF2, + "feather_m0_rfm9x": BIN_UF2, # nRF52840 dev kits that may not have UF2 bootloaders, "makerdiary_nrf52840_mdk": HEX, + "makerdiary_nrf52840_mdk_usb_dongle": HEX, "pca10056": BIN_UF2, "pca10059": BIN_UF2 } @@ -100,13 +96,25 @@ def get_current_info(): response = response.json() git_info = commit_sha, response["sha"] - return git_info, json.loads(base64.b64decode(response["content"]).decode("utf-8")) + current_list = json.loads(base64.b64decode(response["content"]).decode("utf-8")) + current_info = {} + for info in current_list: + current_info[info["id"]] = info + return git_info, current_info def create_pr(changes, updated, git_info): commit_sha, original_blob_sha = git_info branch_name = "new_release_" + changes["new_release"] - updated = json.dumps(updated, sort_keys=True, indent=4).encode("utf-8") + b"\n" + # Convert the dictionary to a list of boards. Liquid templates only handle arrays. + updated_list = [] + all_ids = sorted(updated.keys()) + for id in all_ids: + info = updated[id] + info["id"] = id + updated_list.append(info) + + updated = json.dumps(updated_list, sort_keys=True, indent=4).encode("utf-8") + b"\n" print(updated.decode("utf-8")) pr_title = "Automated website update for release {}".format(changes["new_release"]) boards = "" @@ -166,7 +174,10 @@ def update_downloads(boards, release): assets = response.json()["assets"] for asset in assets: - boards[asset["name"].split("-")[2]]["download_count"] += asset["download_count"] + board_name = asset["name"].split("-")[2] + if board_name not in boards: + continue + boards[board_name]["download_count"] += asset["download_count"] def print_active_user(): diff --git a/tools/build_release_files.py b/tools/build_release_files.py index 6bf418fe6..37e827eb1 100755 --- a/tools/build_release_files.py +++ b/tools/build_release_files.py @@ -34,6 +34,8 @@ for board in build_boards: board_info = all_boards[board] for language in languages: + bin_directory = "../bin/{board}/{language}".format(board=board, language=language) + os.makedirs(bin_directory, exist_ok=True) start_time = time.monotonic() make_result = subprocess.run("make -C ../ports/" + board_info["port"] + " TRANSLATION=" + language + " BOARD=" + board, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) build_duration = time.monotonic() - start_time diff --git a/tools/fixup_translations.py b/tools/fixup_translations.py new file mode 100644 index 000000000..6db7f1cc5 --- /dev/null +++ b/tools/fixup_translations.py @@ -0,0 +1,85 @@ +# Validate that all entries in the .pot are in every .po. Only the .pot is updated so we can detect +# if a translation was added to the source but isn't in a .po. This ensures translators can grab +# complete files to work on. + +import git +import sys +import polib + +po_filenames = sys.argv[1:] +repo = git.Repo() + +NO_TRANSLATION_WHITELIST = ["ffi_prep_closure_loc"] + +bad_commits = {} +for po_filename in po_filenames: + print("Checking", po_filename) + + commits = repo.iter_commits(paths=po_filename, reverse=True, topo_order=True) + first_translations = None + fixed_ids = set() + for commit in commits: + try: + blob = commit.tree / po_filename + except KeyError: + continue + try: + current_file = polib.pofile(blob.data_stream.read().decode("utf-8")) + except OSError: + print("skipping invalid po in", commit) + continue + if not first_translations: + first_translations = current_file + continue + print(commit.authored_date, commit) + first_translations.metadata = current_file.metadata + first_translations.header = current_file.header + for entry in first_translations: + newer_entry = current_file.find(entry.msgid) + + if newer_entry and entry.msgid == "": + entry.merge(newer_entry) + print(entry) + elif newer_entry and entry.msgstr != newer_entry.msgstr: + if newer_entry.msgstr != "" and (newer_entry.msgstr != entry.msgid or entry.msgid in NO_TRANSLATION_WHITELIST): + entry.merge(newer_entry) + entry.msgstr = newer_entry.msgstr + if "fuzzy" not in newer_entry.flags and "fuzzy" in entry.flags: + entry.flags.remove("fuzzy") + elif entry.msgid not in fixed_ids: + if commit not in bad_commits: + bad_commits[commit] = set() + bad_commits[commit].add(po_filename) + fixed_ids.add(entry.msgid) + #print(entry.msgid, "\"" + entry.msgstr + "\"", "\"" + newer_entry.msgstr + "\"",) + elif newer_entry and newer_entry.flags != entry.flags: + entry.flags = newer_entry.flags + elif newer_entry and newer_entry.obsolete != entry.obsolete: + entry.obsolete = newer_entry.obsolete + elif not newer_entry: + entry.obsolete = True + + # Add new entries to the modified pofile. + for entry in current_file: + old_entry = first_translations.find(entry.msgid, include_obsolete_entries=True) + if old_entry: + continue + first_translations.append(entry) + + # Remove obsolete translations. We can always use this script to revive them from the git history. + to_remove = [] + for entry in first_translations: + if entry.obsolete: + to_remove.append(entry) + + for remove in to_remove: + first_translations.remove(remove) + + first_translations.save(po_filename) + +print() +for commit in bad_commits: + files = bad_commits[commit] + print(commit) + for file in files: + print("\t",file) diff --git a/tools/gen_display_resources.py b/tools/gen_display_resources.py new file mode 100644 index 000000000..82676ef07 --- /dev/null +++ b/tools/gen_display_resources.py @@ -0,0 +1,186 @@ +import argparse + +import os +import struct +import sys + +sys.path.append("bitmap_font") +sys.path.append("../../tools/bitmap_font") + +from adafruit_bitmap_font import bitmap_font + +parser = argparse.ArgumentParser(description='Generate USB descriptors.') +parser.add_argument('--font', type=str, + help='Font path', required=True) +parser.add_argument('--extra_characters', type=str, + help='Unicode string of extra characters') +parser.add_argument('--sample_file', type=argparse.FileType('r'), + help='Text file that includes strings to support.') +parser.add_argument('--output_c_file', type=argparse.FileType('w'), required=True) + +args = parser.parse_args() + +class BitmapStub: + def __init__(self, width, height, color_depth): + self.width = width + self.rows = [b''] * height + + def _load_row(self, y, row): + self.rows[y] = bytes(row) + +f = bitmap_font.load_font(args.font, BitmapStub) +real_bb = [0, 0] + +# Load extra characters from the sample file. +sample_characters = set() +if args.sample_file: + for line in args.sample_file: + # Skip comments because we add additional characters in our huffman comments. + if line.startswith("//"): + continue + for c in line.strip(): + sample_characters.add(c) + +# Merge visible ascii, sample characters and extra characters. +visible_ascii = bytes(range(0x20, 0x7f)).decode("utf-8") +all_characters = visible_ascii +for c in sample_characters: + if c not in all_characters: + all_characters += c +if args.extra_characters: + all_characters.extend(args.extra_characters) +filtered_characters = all_characters + +# Try to pre-load all of the glyphs. Misses will still be slow later. +f.load_glyphs(set(all_characters)) + +# Get each glyph. +for c in all_characters: + g = f.get_glyph(ord(c)) + if not g: + print("Font missing character:", c, ord(c)) + filtered_characters = filtered_characters.replace(c, "") + continue + x, y, dx, dy = g["bounds"] + if g["shift"][1] != 0: + raise RuntimeError("y shift") + real_bb[0] = max(real_bb[0], x - dx) + real_bb[1] = max(real_bb[1], y - dy) + +tile_x, tile_y = real_bb +total_bits = tile_x * len(all_characters) +total_bits += 32 - total_bits % 32 +bytes_per_row = total_bits // 8 +b = bytearray(bytes_per_row * tile_y) + +for x, c in enumerate(filtered_characters): + g = f.get_glyph(ord(c)) + start_bit = x * tile_x + g["bounds"][2] + start_y = (tile_y - 2) - (g["bounds"][1] + g["bounds"][3]) + for y, row in enumerate(g["bitmap"].rows): + for i in range(g["bounds"][0]): + byte = i // 8 + bit = i % 8 + if row[byte] & (1 << (7-bit)) != 0: + overall_bit = start_bit + (start_y + y) * bytes_per_row * 8 + i + b[overall_bit // 8] |= 1 << (7 - (overall_bit % 8)) + + +extra_characters = "" +for c in filtered_characters: + if c not in visible_ascii: + extra_characters += c + +c_file = args.output_c_file + +c_file.write("""\ + +#include "shared-bindings/displayio/Palette.h" +#include "supervisor/shared/display.h" + +""") + +c_file.write("""\ +uint32_t terminal_transparency[1] = {0x00000000}; + +// These colors are RGB 565 with the bytes swapped. +uint32_t terminal_colors[1] = {0xffff0000}; + +displayio_palette_t supervisor_terminal_color = { + .base = {.type = &displayio_palette_type }, + .opaque = terminal_transparency, + .colors = terminal_colors, + .color_count = 2, + .needs_refresh = false +}; +""") + +c_file.write("""\ +displayio_tilegrid_t supervisor_terminal_text_grid = {{ + .base = {{ .type = &displayio_tilegrid_type }}, + .bitmap = (displayio_bitmap_t*) &supervisor_terminal_font_bitmap, + .pixel_shader = &supervisor_terminal_color, + .x = 16, + .y = 0, + .bitmap_width_in_tiles = {0}, + .width_in_tiles = 1, + .height_in_tiles = 1, + .total_width = {1}, + .total_height = {2}, + .tile_width = {1}, + .tile_height = {2}, + .tiles = NULL, + .needs_refresh = false, + .inline_tiles = false +}}; +""".format(len(all_characters), tile_x, tile_y)) + +c_file.write("""\ +const uint32_t font_bitmap_data[{}] = {{ +""".format(bytes_per_row * tile_y // 4)) + +for i, word in enumerate(struct.iter_unpack(">I", b)): + c_file.write("0x{:08x}, ".format(word[0])) + if (i + 1) % (bytes_per_row // 4) == 0: + c_file.write("\n") + +c_file.write("""\ +}; +""") + +c_file.write("""\ +const displayio_bitmap_t supervisor_terminal_font_bitmap = {{ + .base = {{.type = &displayio_bitmap_type }}, + .width = {}, + .height = {}, + .data = (uint32_t*) font_bitmap_data, + .stride = {}, + .bits_per_value = 1, + .x_shift = 5, + .x_mask = 0x1f, + .bitmask = 0x1, + .read_only = true +}}; +""".format(len(all_characters) * tile_x, tile_y, bytes_per_row / 4)) + + +c_file.write("""\ +const fontio_builtinfont_t supervisor_terminal_font = {{ + .base = {{.type = &fontio_builtinfont_type }}, + .bitmap = &supervisor_terminal_font_bitmap, + .width = {}, + .height = {}, + .unicode_characters = (const uint8_t*) "{}", + .unicode_characters_len = {} +}}; +""".format(tile_x, tile_y, extra_characters, len(extra_characters.encode("utf-8")))) + +c_file.write("""\ +terminalio_terminal_obj_t supervisor_terminal = { + .base = { .type = &terminalio_terminal_type }, + .font = &supervisor_terminal_font, + .cursor_x = 0, + .cursor_y = 0, + .tilegrid = &supervisor_terminal_text_grid +}; +""") diff --git a/tools/gen_usb_descriptor.py b/tools/gen_usb_descriptor.py index 2cb06ec2f..10bbf5066 100644 --- a/tools/gen_usb_descriptor.py +++ b/tools/gen_usb_descriptor.py @@ -176,16 +176,33 @@ hid_interfaces = [ ] # Audio! -midi_in_jack = midi.InJackDescriptor( - description="MIDI PC <- CircuitPython internals", +# In and out here are relative to CircuitPython + +# USB OUT -> midi_in_jack_emb -> midi_out_jack_ext -> CircuitPython +midi_in_jack_emb = midi.InJackDescriptor( + description="MIDI PC -> CircuitPython", bJackType=midi.JACK_TYPE_EMBEDDED, - iJack=0) -midi_out_jack = midi.OutJackDescriptor( - description="MIDI PC -> CircuitPython internals", + iJack=StringIndex.index("CircuitPython usb_midi.ports[0]")) +midi_out_jack_ext = midi.OutJackDescriptor( + description="MIDI data out to user code.", + bJackType=midi.JACK_TYPE_EXTERNAL, + input_pins=[(midi_in_jack_emb, 1)], + iJack=0) + +# USB IN <- midi_out_jack_emb <- midi_in_jack_ext <- CircuitPython +midi_in_jack_ext = midi.InJackDescriptor( + description="MIDI data in from user code.", + bJackType=midi.JACK_TYPE_EXTERNAL, + iJack=0) +midi_out_jack_emb = midi.OutJackDescriptor( + description="MIDI PC <- CircuitPython", bJackType=midi.JACK_TYPE_EMBEDDED, - iJack=0) + input_pins=[(midi_in_jack_ext, 1)], + iJack=StringIndex.index("CircuitPython usb_midi.ports[1]")) + + audio_midi_interface = standard.InterfaceDescriptor( - description="All the audio", + description="Midi goodness", bInterfaceClass=audio.AUDIO_CLASS_DEVICE, bInterfaceSubClass=audio.AUDIO_SUBCLASS_MIDI_STREAMING, bInterfaceProtocol=audio.AUDIO_PROTOCOL_V1, @@ -193,26 +210,23 @@ audio_midi_interface = standard.InterfaceDescriptor( subdescriptors=[ midi.Header( jacks_and_elements=[ - midi_in_jack, - midi.InJackDescriptor( - description="MIDI data in from user code.", - bJackType=midi.JACK_TYPE_EXTERNAL, iJack=0), - midi_out_jack, - midi.OutJackDescriptor( - description="MIDI data out to user code.", - bJackType=midi.JACK_TYPE_EXTERNAL, iJack=0), - ] + midi_in_jack_emb, + midi_in_jack_ext, + midi_out_jack_emb, + midi_out_jack_ext + ], ), standard.EndpointDescriptor( - description="MIDI data out", + description="MIDI data out to CircuitPython", bEndpointAddress=0x0 | standard.EndpointDescriptor.DIRECTION_OUT, bmAttributes=standard.EndpointDescriptor.TYPE_BULK), - midi.DataEndpointDescriptor(baAssocJack=[midi_out_jack]), + midi.DataEndpointDescriptor(baAssocJack=[midi_in_jack_emb]), standard.EndpointDescriptor( - description="MIDI data in", + description="MIDI data in from CircuitPython", bEndpointAddress=0x0 | standard.EndpointDescriptor.DIRECTION_IN, - bmAttributes=standard.EndpointDescriptor.TYPE_BULK), - midi.DataEndpointDescriptor(baAssocJack=[midi_in_jack]), + bmAttributes=standard.EndpointDescriptor.TYPE_BULK, + bInterval = 0x0), + midi.DataEndpointDescriptor(baAssocJack=[midi_out_jack_emb]), ]) cs_ac_interface = audio10.AudioControlInterface( @@ -234,12 +248,12 @@ audio_control_interface = standard.InterfaceDescriptor( ]) # Audio streaming interfaces must occur before MIDI ones. -# audio_interfaces = [audio_control_interface] + cs_ac_interface.audio_streaming_interfaces + cs_ac_interface.midi_streaming_interfaces +audio_interfaces = [audio_control_interface] + cs_ac_interface.audio_streaming_interfaces + cs_ac_interface.midi_streaming_interfaces # This will renumber the endpoints to make them unique across descriptors, # and renumber the interfaces in order. But we still need to fix up certain # interface cross-references. -interfaces = util.join_interfaces(cdc_interfaces, msc_interfaces, hid_interfaces) +interfaces = util.join_interfaces(cdc_interfaces, msc_interfaces, hid_interfaces, audio_interfaces) # Now adjust the CDC interface cross-references. @@ -256,21 +270,13 @@ cdc_iad = standard.InterfaceAssociationDescriptor( bFunctionSubClass=cdc.CDC_SUBCLASS_ACM, # Abstract control model bFunctionProtocol=cdc.CDC_PROTOCOL_NONE) -# audio_iad = standard.InterfaceAssociationDescriptor( -# description="Audio IAD", -# bFirstInterface=audio_control_interface.bInterfaceNumber, -# bInterfaceCount=len(audio_interfaces), -# bFunctionClass=audio.AUDIO_CLASS_DEVICE, -# bFunctionSubClass=audio.AUDIO_SUBCLASS_UNKNOWN, -# bFunctionProtocol=audio.AUDIO_PROTOCOL_V1) - - descriptor_list = [] descriptor_list.append(cdc_iad) -# descriptor_list.append(audio_iad) descriptor_list.extend(cdc_interfaces) descriptor_list.extend(msc_interfaces) -# descriptor_list.append(audio_control_interface) +# Only add the control interface because other audio interfaces are managed by it to ensure the +# correct ordering. +descriptor_list.append(audio_control_interface) # Put the CDC IAD just before the CDC interfaces. # There appears to be a bug in the Windows composite USB driver that requests the # HID report descriptor with the wrong interface number if the HID interface is not given diff --git a/tools/usb_descriptor b/tools/usb_descriptor -Subproject 57bf602dac9cba8c4226f764c286cbc60103d67 +Subproject e2e79566a807b7230dddbc53a103c19b2f65e2c |
