Merge branch 'adafruit:main' into add-raspberry-breadstick

This commit is contained in:
Michael Rangen 2023-11-26 18:30:43 -07:00 committed by GitHub
commit 82ebe54f6f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
59 changed files with 34896 additions and 18473 deletions

View File

@ -72,6 +72,7 @@ jobs:
working-directory: tools working-directory: tools
env: env:
BOARDS: ${{ matrix.board }} BOARDS: ${{ matrix.board }}
PULL: ${{ github.event.number }}
- name: Upload artifact - name: Upload artifact
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v3

3
.gitmodules vendored
View File

@ -354,3 +354,6 @@
[submodule "lib/tlsf"] [submodule "lib/tlsf"]
path = lib/tlsf path = lib/tlsf
url = https://github.com/espressif/tlsf.git url = https://github.com/espressif/tlsf.git
[submodule "frozen/CircuitPython_AXP313A"]
path = frozen/CircuitPython_AXP313A
url = https://github.com/bill88t/CircuitPython_AXP313A

@ -0,0 +1 @@
Subproject commit 702d313bd2eaa6895924c7eeda7dea74c4e35c69

File diff suppressed because it is too large Load Diff

View File

@ -72,11 +72,6 @@ msgstr ""
msgid "%%c requires int or char" msgid "%%c requires int or char"
msgstr "" msgstr ""
#: main.c
#, c-format
msgid "%02X"
msgstr ""
#: shared-bindings/rgbmatrix/RGBMatrix.c #: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format #, c-format
msgid "" msgid ""

View File

@ -83,42 +83,12 @@ msgstr " výstup:\n"
msgid "%%c requires int or char" msgid "%%c requires int or char"
msgstr "%%c vyžaduje int nebo char" msgstr "%%c vyžaduje int nebo char"
#: main.c
#, c-format
msgid "%02X"
msgstr "%02X"
#: shared-module/os/getenv.c
#, c-format
msgid "%S"
msgstr ""
#: shared-bindings/rgbmatrix/RGBMatrix.c #: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format #, c-format
msgid "" msgid ""
"%d address pins, %d rgb pins and %d tiles indicate a height of %d, not %d" "%d address pins, %d rgb pins and %d tiles indicate a height of %d, not %d"
msgstr "%d adresní pin, %d rgb pin a %d dlaždice indikuje výšku %d, ne %d" msgstr "%d adresní pin, %d rgb pin a %d dlaždice indikuje výšku %d, ne %d"
#: ports/atmel-samd/common-hal/alarm/__init__.c
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/cxd56/common-hal/analogio/AnalogOut.c ports/cxd56/common-hal/rtc/RTC.c
#: ports/espressif/common-hal/audiobusio/I2SOut.c
#: ports/espressif/common-hal/rtc/RTC.c
#: ports/mimxrt10xx/common-hal/analogio/AnalogOut.c
#: ports/mimxrt10xx/common-hal/rtc/RTC.c ports/nrf/common-hal/alarm/__init__.c
#: ports/nrf/common-hal/analogio/AnalogOut.c
#: ports/nrf/common-hal/audiobusio/I2SOut.c ports/nrf/common-hal/rtc/RTC.c
#: ports/raspberrypi/common-hal/alarm/__init__.c
#: ports/raspberrypi/common-hal/analogio/AnalogOut.c
#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/rtc/RTC.c ports/stm/common-hal/alarm/__init__.c
#: ports/stm/common-hal/canio/Listener.c ports/stm/common-hal/rtc/RTC.c
#: shared-bindings/audiobusio/I2SOut.c shared-bindings/audiobusio/PDMIn.c
#: shared-bindings/keypad/KeyMatrix.c shared-bindings/keypad/Keys.c
#: shared-bindings/keypad/ShiftRegisterKeys.c
msgid "%q"
msgstr "%q"
#: shared-bindings/microcontroller/Pin.c #: shared-bindings/microcontroller/Pin.c
msgid "%q and %q contain duplicate pins" msgid "%q and %q contain duplicate pins"
msgstr "%q a %q obsahují duplicitní piny" msgstr "%q a %q obsahují duplicitní piny"
@ -302,11 +272,6 @@ msgstr "%q[%u] používá extra pin"
msgid "%q[%u] waits on input outside of count" msgid "%q[%u] waits on input outside of count"
msgstr "%q[%u] čeká na vstup mimo rozsah" msgstr "%q[%u] čeká na vstup mimo rozsah"
#: py/runtime.c
#, c-format
msgid "%s"
msgstr ""
#: ports/espressif/common-hal/espidf/__init__.c #: ports/espressif/common-hal/espidf/__init__.c
#, c-format #, c-format
msgid "%s error 0x%x" msgid "%s error 0x%x"
@ -829,7 +794,8 @@ msgstr "Není možné znovu připojit '/', pokud je viditelné pomocí USB."
#: ports/cxd56/common-hal/microcontroller/__init__.c #: ports/cxd56/common-hal/microcontroller/__init__.c
#: ports/mimxrt10xx/common-hal/microcontroller/__init__.c #: ports/mimxrt10xx/common-hal/microcontroller/__init__.c
msgid "Cannot reset into bootloader because no bootloader is present" msgid "Cannot reset into bootloader because no bootloader is present"
msgstr "Reset do bootloaderu není možný, protože žádný bootloader není přítomen" msgstr ""
"Reset do bootloaderu není možný, protože žádný bootloader není přítomen"
#: ports/espressif/common-hal/socketpool/Socket.c #: ports/espressif/common-hal/socketpool/Socket.c
msgid "Cannot set socket options" msgid "Cannot set socket options"
@ -1176,7 +1142,8 @@ msgstr "Alokace heapu při neběžícím VM."
#: supervisor/shared/safe_mode.c #: supervisor/shared/safe_mode.c
msgid "" msgid ""
"Heap was corrupted because the stack was too small. Increase stack size." "Heap was corrupted because the stack was too small. Increase stack size."
msgstr "Heap byl poškozen, protože je stack příliš malý. Navyš velikost stacku." msgstr ""
"Heap byl poškozen, protože je stack příliš malý. Navyš velikost stacku."
#: extmod/vfs_posix_file.c py/objstringio.c #: extmod/vfs_posix_file.c py/objstringio.c
msgid "I/O operation on closed file" msgid "I/O operation on closed file"
@ -1626,7 +1593,8 @@ msgstr "Ok"
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c #: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "Only 8 or 16 bit mono with " #, c-format
msgid "Only 8 or 16 bit mono with %dx oversampling supported."
msgstr "" msgstr ""
#: ports/espressif/common-hal/wifi/__init__.c #: ports/espressif/common-hal/wifi/__init__.c
@ -4433,18 +4401,102 @@ msgstr ""
msgid "zi must be of shape (n_section, 2)" msgid "zi must be of shape (n_section, 2)"
msgstr "" msgstr ""
#~ msgid "Invalid CIRCUITPY_PYSTACK_SIZE\n" #~ msgid ""
#~ msgstr "Špatný CIRCUITPY_PYSTACK_SIZE\n" #~ "\n"
#~ "Code done running. Waiting for reload.\n"
#~ msgid "Unable to allocate the heap." #~ msgstr ""
#~ msgstr "Nelze alokovat heap." #~ "\n"
#~ "Kód byl dokončen. Čekám na opětovné nahrání.\n"
#~ msgid "" #~ msgid ""
#~ "espcamera.Camera requires reserved PSRAM to be configured. See the " #~ "\n"
#~ "documentation for instructions." #~ "Code stopped by auto-reload.\n"
#~ msgstr "" #~ msgstr ""
#~ "espcamera.Camera vyžaduje reservovanou PSRAM. V dokumentaci nalezneš " #~ "\n"
#~ "instrukce." #~ "Program byl zastaven automatickým načtením.\n"
#~ msgid ""
#~ "\n"
#~ "Please file an issue with the contents of your CIRCUITPY drive at \n"
#~ "https://github.com/adafruit/circuitpython/issues\n"
#~ msgstr ""
#~ "\n"
#~ "Prosím vytvořte tiket s obsahem vaší jednotky CIRCUITPY na adrese\n"
#~ "https://github.com/adafruit/circuitpython/issues\n"
#~ msgid ""
#~ "\n"
#~ "To exit, please reset the board without "
#~ msgstr ""
#~ "\n"
#~ "Pro ukončení, prosím resetujte desku bez "
#, c-format
#~ msgid "%02X"
#~ msgstr "%02X"
#~ msgid "%d address pins and %d rgb pins indicate a height of %d, not %d"
#~ msgstr "%d adresní piny a %d rgb piny označují výšku %d, nikoli %d"
#~ msgid "%q"
#~ msgstr "%q"
#~ msgid "%q indices must be integers, not %q"
#~ msgstr "Indexy %q musí být celá čísla, ne %q"
#~ msgid "%q length must be >= 1"
#~ msgstr "%q délka musí být >= 1"
#~ msgid "%q list must be a list"
#~ msgstr "Seznam %q musí být seznam"
#~ msgid "%q must be >= 0"
#~ msgstr "%q musí být >= 0"
#~ msgid "%q must be >= 1"
#~ msgstr "%q musí být > = 1"
#~ msgid "%q must be a string"
#~ msgstr "%q musí být string"
#~ msgid "%q must be a tuple of length 2"
#~ msgstr "%q musí být n-tice délky 2"
#~ msgid "%q must be an int"
#~ msgstr "%q musí být int"
#~ msgid "%q must be between %d and %d"
#~ msgstr "%q musí být mezi %d a %d"
#~ msgid "%q must be of type %q"
#~ msgstr "%q musí být typu %q"
#~ msgid "%q must be of type %q or None"
#~ msgstr "%q musí být typu %q nebo None"
#~ msgid "%q pin invalid"
#~ msgstr "pin %q není platný"
#~ msgid "%q should be an int"
#~ msgstr "%q by měl být int"
#~ msgid "%q with a report ID of 0 must be of length 1"
#~ msgstr "%q s ID 0 musím být délky 1"
#~ msgid "'%q' object cannot assign attribute '%q'"
#~ msgstr "'%q' nemůže přiřadit atribut '%q'"
#~ msgid "'%q' object does not support item assignment"
#~ msgstr "Objekt '%q' nepodporuje přiřazení položek"
#~ msgid "'%q' object does not support item deletion"
#~ msgstr "Objekt '%q' nepodporuje mazání položek"
#~ msgid "'%q' object has no attribute '%q'"
#~ msgstr "Objekt '%q' nemá žádný atribut"
#~ msgid "'%q' object is not subscriptable"
#~ msgstr "Objekt '%q' nelze zapsat"
#~ msgid "'await', 'async for' or 'async with' outside async function" #~ msgid "'await', 'async for' or 'async with' outside async function"
#~ msgstr "'await', 'async for' nebo 'async' je volán mimo async" #~ msgstr "'await', 'async for' nebo 'async' je volán mimo async"
@ -4455,30 +4507,65 @@ msgstr ""
#~ msgid "'continue' outside loop" #~ msgid "'continue' outside loop"
#~ msgstr "'continue' je volán mimo cyklus" #~ msgstr "'continue' je volán mimo cyklus"
#~ msgid "invalid architecture" #~ msgid "'coroutine' object is not an iterator"
#~ msgstr "špatná architektura" #~ msgstr "Objekt 'coroutine' není iterátor"
#~ msgid "__init__() should return None, not '%q'" #~ msgid "64 bit types"
#~ msgstr "__init__() by měl vracet hodnotu None, nikoli '%q'" #~ msgstr "64 bit typy"
#~ msgid "cannot unambiguously get sizeof scalar"
#~ msgstr "velikost scalar nelze jednoznačně určit"
#~ msgid "Bit clock and word select must be sequential pins"
#~ msgstr "Bitové hodiny a výběr slov musí být sekvenční piny"
#~ msgid "ADC2 is being used by WiFi" #~ msgid "ADC2 is being used by WiFi"
#~ msgstr "WiFi používá ADC2" #~ msgstr "WiFi používá ADC2"
#~ msgid "'coroutine' object is not an iterator" #~ msgid "At most %d %q may be specified (not %d)"
#~ msgstr "Objekt 'coroutine' není iterátor" #~ msgstr "Lze zadat maximálně %d %q (nikoli %d)"
#~ msgid "Attempted heap allocation when VM not running."
#~ msgstr "Pokus o alokaci haldy, když neběží VM."
#~ msgid "Bit clock and word select must be sequential pins"
#~ msgstr "Bitové hodiny a výběr slov musí být sekvenční piny"
#~ msgid "Boot device must be first device (interface #0)."
#~ msgstr "Bootovací zařízení musí být první (rozhraní #0)."
#~ msgid "Brightness must be 0-1.0"
#~ msgstr "Jas musí být 0-1,0"
#~ msgid "Buffer is too small" #~ msgid "Buffer is too small"
#~ msgstr "Vyrovnávací paměť je příliš malá" #~ msgstr "Vyrovnávací paměť je příliš malá"
#~ msgid "CircuitPython was unable to allocate the heap."
#~ msgstr "CircuitPython nedokázal alokovat haldu."
#~ msgid "Corrupt .mpy file" #~ msgid "Corrupt .mpy file"
#~ msgstr "Poškozený soubor .mpy" #~ msgstr "Poškozený soubor .mpy"
#~ msgid "Crash into the HardFault_Handler."
#~ msgstr "Pád do HardFault_Handler."
#, c-format
#~ msgid "Error in MIDI stream at position %d"
#~ msgstr "Chyba v MIDI přenosu na pozici %d"
#~ msgid "Expected a %q"
#~ msgstr "Očekává se %q"
#~ msgid "Failed to init wifi"
#~ msgstr "Chyba inicializace WiFi"
#~ msgid "Fatal error."
#~ msgstr "Fatální chyba."
#~ msgid "Firmware image is invalid"
#~ msgstr "Obraz firmwaru je nevalidní"
#~ msgid "Hardware busy, try alternative pins"
#~ msgstr "Hardware je zaneprázdněn, zkuste alternativní piny"
#, c-format
#~ msgid "IV must be %d bytes long"
#~ msgstr "IV musí být dlouhé %d bajtů"
#~ msgid "" #~ msgid ""
#~ "Incompatible .mpy file. Please update all .mpy files. See http://adafru." #~ "Incompatible .mpy file. Please update all .mpy files. See http://adafru."
#~ "it/mpy-update for more info." #~ "it/mpy-update for more info."
@ -4486,8 +4573,18 @@ msgstr ""
#~ "Nekompatibilní soubor .mpy. Aktualizujte prosím všechny soubory .mpy. " #~ "Nekompatibilní soubor .mpy. Aktualizujte prosím všechny soubory .mpy. "
#~ "Další informace naleznete na adrese http://adafru.it/mpy-update." #~ "Další informace naleznete na adrese http://adafru.it/mpy-update."
#~ msgid "Hardware busy, try alternative pins" #~ msgid "Invalid CIRCUITPY_PYSTACK_SIZE\n"
#~ msgstr "Hardware je zaneprázdněn, zkuste alternativní piny" #~ msgstr "Špatný CIRCUITPY_PYSTACK_SIZE\n"
#~ msgid "Invalid memory access."
#~ msgstr "Neplatný přístup k paměti."
#~ msgid "Invalid pins"
#~ msgstr "Neplatné piny"
#, c-format
#~ msgid "Maximum x value when mirrored is %d"
#~ msgstr "Maximální hodnota x při zrcadlení je %d"
#~ msgid "Missing MISO or MOSI Pin" #~ msgid "Missing MISO or MOSI Pin"
#~ msgstr "Chybí pin MISO nebo MOSI" #~ msgstr "Chybí pin MISO nebo MOSI"
@ -4513,150 +4610,28 @@ msgstr ""
#~ msgid "No TX pin" #~ msgid "No TX pin"
#~ msgstr "Žádný TX pin" #~ msgstr "Žádný TX pin"
#~ msgid "Brightness must be 0-1.0"
#~ msgstr "Jas musí být 0-1,0"
#, c-format
#~ msgid "Error in MIDI stream at position %d"
#~ msgstr "Chyba v MIDI přenosu na pozici %d"
#, c-format
#~ msgid "Maximum x value when mirrored is %d"
#~ msgstr "Maximální hodnota x při zrcadlení je %d"
#~ msgid "64 bit types"
#~ msgstr "64 bit typy"
#~ msgid "No key was specified" #~ msgid "No key was specified"
#~ msgstr "Nebyl zadán klíč" #~ msgstr "Nebyl zadán klíč"
#~ msgid "%q pin invalid"
#~ msgstr "pin %q není platný"
#~ msgid ""
#~ "\n"
#~ "Please file an issue with the contents of your CIRCUITPY drive at \n"
#~ "https://github.com/adafruit/circuitpython/issues\n"
#~ msgstr ""
#~ "\n"
#~ "Prosím vytvořte tiket s obsahem vaší jednotky CIRCUITPY na adrese\n"
#~ "https://github.com/adafruit/circuitpython/issues\n"
#~ msgid "Attempted heap allocation when VM not running."
#~ msgstr "Pokus o alokaci haldy, když neběží VM."
#~ msgid "Boot device must be first device (interface #0)."
#~ msgstr "Bootovací zařízení musí být první (rozhraní #0)."
#~ msgid "CircuitPython was unable to allocate the heap."
#~ msgstr "CircuitPython nedokázal alokovat haldu."
#~ msgid "Crash into the HardFault_Handler."
#~ msgstr "Pád do HardFault_Handler."
#~ msgid "Fatal error."
#~ msgstr "Fatální chyba."
#~ msgid "Invalid memory access."
#~ msgstr "Neplatný přístup k paměti."
#~ msgid "%q must be of type %q"
#~ msgstr "%q musí být typu %q"
#~ msgid "%q must be of type %q or None"
#~ msgstr "%q musí být typu %q nebo None"
#~ msgid "Expected a %q"
#~ msgstr "Očekává se %q"
#, c-format
#~ msgid "IV must be %d bytes long"
#~ msgstr "IV musí být dlouhé %d bajtů"
#~ msgid "%q length must be >= 1"
#~ msgstr "%q délka musí být >= 1"
#~ msgid "%q must be a string"
#~ msgstr "%q musí být string"
#~ msgid "%q must be an int"
#~ msgstr "%q musí být int"
#~ msgid "%q with a report ID of 0 must be of length 1"
#~ msgstr "%q s ID 0 musím být délky 1"
#~ msgid "At most %d %q may be specified (not %d)"
#~ msgstr "Lze zadat maximálně %d %q (nikoli %d)"
#~ msgid "Invalid pins"
#~ msgstr "Neplatné piny"
#, c-format #, c-format
#~ msgid "No more than %d HID devices allowed" #~ msgid "No more than %d HID devices allowed"
#~ msgstr "Ne více než %d HID zařízení je povoleno" #~ msgstr "Ne více než %d HID zařízení je povoleno"
#~ msgid "Firmware image is invalid" #~ msgid "Unable to allocate the heap."
#~ msgstr "Obraz firmwaru je nevalidní" #~ msgstr "Nelze alokovat heap."
#~ msgid "%q must be >= 0" #~ msgid "__init__() should return None, not '%q'"
#~ msgstr "%q musí být >= 0" #~ msgstr "__init__() by měl vracet hodnotu None, nikoli '%q'"
#~ msgid "%q must be >= 1" #~ msgid "cannot unambiguously get sizeof scalar"
#~ msgstr "%q musí být > = 1" #~ msgstr "velikost scalar nelze jednoznačně určit"
#~ msgid "Failed to init wifi"
#~ msgstr "Chyba inicializace WiFi"
#~ msgid "%q must be a tuple of length 2"
#~ msgstr "%q musí být n-tice délky 2"
#~ msgid "%q must be between %d and %d"
#~ msgstr "%q musí být mezi %d a %d"
#~ msgid "%q should be an int"
#~ msgstr "%q by měl být int"
#~ msgid "" #~ msgid ""
#~ "\n" #~ "espcamera.Camera requires reserved PSRAM to be configured. See the "
#~ "Code stopped by auto-reload.\n" #~ "documentation for instructions."
#~ msgstr "" #~ msgstr ""
#~ "\n" #~ "espcamera.Camera vyžaduje reservovanou PSRAM. V dokumentaci nalezneš "
#~ "Program byl zastaven automatickým načtením.\n" #~ "instrukce."
#~ msgid "%q list must be a list" #~ msgid "invalid architecture"
#~ msgstr "Seznam %q musí být seznam" #~ msgstr "špatná architektura"
#~ msgid "%q indices must be integers, not %q"
#~ msgstr "Indexy %q musí být celá čísla, ne %q"
#~ msgid "'%q' object cannot assign attribute '%q'"
#~ msgstr "'%q' nemůže přiřadit atribut '%q'"
#~ msgid "'%q' object does not support item assignment"
#~ msgstr "Objekt '%q' nepodporuje přiřazení položek"
#~ msgid "'%q' object does not support item deletion"
#~ msgstr "Objekt '%q' nepodporuje mazání položek"
#~ msgid "'%q' object has no attribute '%q'"
#~ msgstr "Objekt '%q' nemá žádný atribut"
#~ msgid "'%q' object is not subscriptable"
#~ msgstr "Objekt '%q' nelze zapsat"
#~ msgid "%d address pins and %d rgb pins indicate a height of %d, not %d"
#~ msgstr "%d adresní piny a %d rgb piny označují výšku %d, nikoli %d"
#~ msgid ""
#~ "\n"
#~ "Code done running. Waiting for reload.\n"
#~ msgstr ""
#~ "\n"
#~ "Kód byl dokončen. Čekám na opětovné nahrání.\n"
#~ msgid ""
#~ "\n"
#~ "To exit, please reset the board without "
#~ msgstr ""
#~ "\n"
#~ "Pro ukončení, prosím resetujte desku bez "

File diff suppressed because it is too large Load Diff

View File

@ -83,16 +83,6 @@ msgstr " έξοδος:\n"
msgid "%%c requires int or char" msgid "%%c requires int or char"
msgstr "%%c απαιτεί ακέραιο ή χαρακτήρα" msgstr "%%c απαιτεί ακέραιο ή χαρακτήρα"
#: main.c
#, c-format
msgid "%02X"
msgstr "%02X"
#: shared-module/os/getenv.c
#, c-format
msgid "%S"
msgstr ""
#: shared-bindings/rgbmatrix/RGBMatrix.c #: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format #, c-format
msgid "" msgid ""
@ -100,26 +90,6 @@ msgid ""
msgstr "" msgstr ""
"%d pin διεύθυνσης, %d rgb ping και %d πλακίδια αναδεικνύουν ύψος %d, όχι %d" "%d pin διεύθυνσης, %d rgb ping και %d πλακίδια αναδεικνύουν ύψος %d, όχι %d"
#: ports/atmel-samd/common-hal/alarm/__init__.c
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/cxd56/common-hal/analogio/AnalogOut.c ports/cxd56/common-hal/rtc/RTC.c
#: ports/espressif/common-hal/audiobusio/I2SOut.c
#: ports/espressif/common-hal/rtc/RTC.c
#: ports/mimxrt10xx/common-hal/analogio/AnalogOut.c
#: ports/mimxrt10xx/common-hal/rtc/RTC.c ports/nrf/common-hal/alarm/__init__.c
#: ports/nrf/common-hal/analogio/AnalogOut.c
#: ports/nrf/common-hal/audiobusio/I2SOut.c ports/nrf/common-hal/rtc/RTC.c
#: ports/raspberrypi/common-hal/alarm/__init__.c
#: ports/raspberrypi/common-hal/analogio/AnalogOut.c
#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/rtc/RTC.c ports/stm/common-hal/alarm/__init__.c
#: ports/stm/common-hal/canio/Listener.c ports/stm/common-hal/rtc/RTC.c
#: shared-bindings/audiobusio/I2SOut.c shared-bindings/audiobusio/PDMIn.c
#: shared-bindings/keypad/KeyMatrix.c shared-bindings/keypad/Keys.c
#: shared-bindings/keypad/ShiftRegisterKeys.c
msgid "%q"
msgstr "%q"
#: shared-bindings/microcontroller/Pin.c #: shared-bindings/microcontroller/Pin.c
msgid "%q and %q contain duplicate pins" msgid "%q and %q contain duplicate pins"
msgstr "%q και %q περιέχουν διπλότυπα pins" msgstr "%q και %q περιέχουν διπλότυπα pins"
@ -303,11 +273,6 @@ msgstr ""
msgid "%q[%u] waits on input outside of count" msgid "%q[%u] waits on input outside of count"
msgstr "" msgstr ""
#: py/runtime.c
#, c-format
msgid "%s"
msgstr ""
#: ports/espressif/common-hal/espidf/__init__.c #: ports/espressif/common-hal/espidf/__init__.c
#, c-format #, c-format
msgid "%s error 0x%x" msgid "%s error 0x%x"
@ -789,7 +754,8 @@ msgstr "Δεν μπορούν να αλλάξουν οι USB συσκευές τ
#: shared-bindings/_bleio/Adapter.c #: shared-bindings/_bleio/Adapter.c
msgid "Cannot create a new Adapter; use _bleio.adapter;" msgid "Cannot create a new Adapter; use _bleio.adapter;"
msgstr "Δεν μπορεί να δημιουργηθεί νέο Adapter; χρησιμοποιείστε _bleio.adapter;" msgstr ""
"Δεν μπορεί να δημιουργηθεί νέο Adapter; χρησιμοποιείστε _bleio.adapter;"
#: shared-bindings/displayio/Bitmap.c #: shared-bindings/displayio/Bitmap.c
#: shared-bindings/memorymonitor/AllocationSize.c #: shared-bindings/memorymonitor/AllocationSize.c
@ -1628,7 +1594,8 @@ msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c #: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "Only 8 or 16 bit mono with " #, c-format
msgid "Only 8 or 16 bit mono with %dx oversampling supported."
msgstr "" msgstr ""
#: ports/espressif/common-hal/wifi/__init__.c #: ports/espressif/common-hal/wifi/__init__.c
@ -4427,53 +4394,6 @@ msgstr ""
msgid "zi must be of shape (n_section, 2)" msgid "zi must be of shape (n_section, 2)"
msgstr "" msgstr ""
#~ msgid "'await', 'async for' or 'async with' outside async function"
#~ msgstr "'await', 'async for' ή 'async with' εκτός ασύνχρονης συνάρτησης"
#~ msgid "'break' outside loop"
#~ msgstr "'break' εκτός επανάληψης"
#~ msgid "'continue' outside loop"
#~ msgstr "'continue' εκτός επανάληψης"
#~ msgid "Bit clock and word select must be sequential pins"
#~ msgstr "Ρολόι bit και word select πρέπει να είναι διαδοχικά pins"
#~ msgid "ADC2 is being used by WiFi"
#~ msgstr "Το ADC2 χρησιμοποιείται απο το WIFI"
#~ msgid ""
#~ "\n"
#~ "Please file an issue with your program at https://github.com/adafruit/"
#~ "circuitpython/issues."
#~ msgstr ""
#~ "\n"
#~ "Παρακαλώ δημιουργήστε ένα πρόβλημα στο https://github.com/adafruit/"
#~ "circuitpython/issues με το πρόγραμμά σας."
#~ msgid "'coroutine' object is not an iterator"
#~ msgstr ""
#~ "'coroutine' αντικείμενο δεν μπορεί να χρησιμοποιηθεί σαν επαναλήπτης"
#~ msgid "Buffer is too small"
#~ msgstr "Πολύ μικρό buffer"
#~ msgid "Corrupt .mpy file"
#~ msgstr "Κατεστραμένο .mpy αρχείο"
#~ msgid "Cannot transfer without MOSI and MISO pins"
#~ msgstr "Δεν μπορεί να γίνει μεταφορά χωρίς MOSI και MISO pins"
#~ msgid "Brightness must be 0-1.0"
#~ msgstr "Η φωτινότητα πρέπει να είναι μεταξύ 0-1.0"
#, fuzzy
#~ msgid "64 bit types"
#~ msgstr "64 bit τύποι"
#~ msgid "%q pin invalid"
#~ msgstr "%q άκυρο pin"
#~ msgid "" #~ msgid ""
#~ "\n" #~ "\n"
#~ "Please file an issue with the contents of your CIRCUITPY drive at \n" #~ "Please file an issue with the contents of your CIRCUITPY drive at \n"
@ -4484,41 +4404,95 @@ msgstr ""
#~ "στο\n" #~ "στο\n"
#~ "https://github.com/adafruit/circuitpython/issues\n" #~ "https://github.com/adafruit/circuitpython/issues\n"
#~ msgid "Attempted heap allocation when VM not running." #~ msgid ""
#~ msgstr "Προσπάθεια δέσμευσης heap όταν το VM δεν τρέχει." #~ "\n"
#~ "Please file an issue with your program at https://github.com/adafruit/"
#~ "circuitpython/issues."
#~ msgstr ""
#~ "\n"
#~ "Παρακαλώ δημιουργήστε ένα πρόβλημα στο https://github.com/adafruit/"
#~ "circuitpython/issues με το πρόγραμμά σας."
#~ msgid "Boot device must be first device (interface #0)." #, c-format
#~ msgstr "Η συσκευή boot πρέπει να είναι η πρώτη συσκευή (interface #0)." #~ msgid "%02X"
#~ msgstr "%02X"
#~ msgid "CircuitPython was unable to allocate the heap." #~ msgid "%q"
#~ msgstr "Η CircuitPython δεν μπορέσε να δεσμεύσει το heap." #~ msgstr "%q"
#~ msgid "Crash into the HardFault_Handler."
#~ msgstr "Κατέρευσε μέσα στο HardFault_Handler."
#~ msgid "%q must be of type %q"
#~ msgstr "%q πρέπει να είναι τύπου %q"
#~ msgid "%q must be of type %q or None"
#~ msgstr "%q πρέπει να είναι τύπου %q ή None"
#~ msgid "%q length must be >= 1" #~ msgid "%q length must be >= 1"
#~ msgstr "%q μήκος πρέπει να είναι >= 1" #~ msgstr "%q μήκος πρέπει να είναι >= 1"
#~ msgid "%q must be >= 0"
#~ msgstr "%q πρέπει να είναι >= 0"
#~ msgid "%q must be >= 1"
#~ msgstr "%q πρέπει να είναι >= 1"
#~ msgid "%q must be a string" #~ msgid "%q must be a string"
#~ msgstr "%q πρέπει να είναι string" #~ msgstr "%q πρέπει να είναι string"
#~ msgid "%q must be an int" #~ msgid "%q must be an int"
#~ msgstr "%q πρέπει να είναι int" #~ msgstr "%q πρέπει να είναι int"
#~ msgid "%q must be of type %q"
#~ msgstr "%q πρέπει να είναι τύπου %q"
#~ msgid "%q must be of type %q or None"
#~ msgstr "%q πρέπει να είναι τύπου %q ή None"
#~ msgid "%q pin invalid"
#~ msgstr "%q άκυρο pin"
#~ msgid "%q with a report ID of 0 must be of length 1" #~ msgid "%q with a report ID of 0 must be of length 1"
#~ msgstr "%q με ID αναφοράς 0 πρέπει να έχει μήκος 1" #~ msgstr "%q με ID αναφοράς 0 πρέπει να έχει μήκος 1"
#~ msgid "'await', 'async for' or 'async with' outside async function"
#~ msgstr "'await', 'async for' ή 'async with' εκτός ασύνχρονης συνάρτησης"
#~ msgid "'break' outside loop"
#~ msgstr "'break' εκτός επανάληψης"
#~ msgid "'continue' outside loop"
#~ msgstr "'continue' εκτός επανάληψης"
#~ msgid "'coroutine' object is not an iterator"
#~ msgstr ""
#~ "'coroutine' αντικείμενο δεν μπορεί να χρησιμοποιηθεί σαν επαναλήπτης"
#, fuzzy
#~ msgid "64 bit types"
#~ msgstr "64 bit τύποι"
#~ msgid "ADC2 is being used by WiFi"
#~ msgstr "Το ADC2 χρησιμοποιείται απο το WIFI"
#~ msgid "At most %d %q may be specified (not %d)" #~ msgid "At most %d %q may be specified (not %d)"
#~ msgstr "Το πολύ %d %q μπορεί να είναι καθορισμένα (όχι %d)" #~ msgstr "Το πολύ %d %q μπορεί να είναι καθορισμένα (όχι %d)"
#~ msgid "%q must be >= 0" #~ msgid "Attempted heap allocation when VM not running."
#~ msgstr "%q πρέπει να είναι >= 0" #~ msgstr "Προσπάθεια δέσμευσης heap όταν το VM δεν τρέχει."
#~ msgid "%q must be >= 1" #~ msgid "Bit clock and word select must be sequential pins"
#~ msgstr "%q πρέπει να είναι >= 1" #~ msgstr "Ρολόι bit και word select πρέπει να είναι διαδοχικά pins"
#~ msgid "Boot device must be first device (interface #0)."
#~ msgstr "Η συσκευή boot πρέπει να είναι η πρώτη συσκευή (interface #0)."
#~ msgid "Brightness must be 0-1.0"
#~ msgstr "Η φωτινότητα πρέπει να είναι μεταξύ 0-1.0"
#~ msgid "Buffer is too small"
#~ msgstr "Πολύ μικρό buffer"
#~ msgid "Cannot transfer without MOSI and MISO pins"
#~ msgstr "Δεν μπορεί να γίνει μεταφορά χωρίς MOSI και MISO pins"
#~ msgid "CircuitPython was unable to allocate the heap."
#~ msgstr "Η CircuitPython δεν μπορέσε να δεσμεύσει το heap."
#~ msgid "Corrupt .mpy file"
#~ msgstr "Κατεστραμένο .mpy αρχείο"
#~ msgid "Crash into the HardFault_Handler."
#~ msgstr "Κατέρευσε μέσα στο HardFault_Handler."

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -74,42 +74,12 @@ msgstr ""
msgid "%%c requires int or char" msgid "%%c requires int or char"
msgstr "" msgstr ""
#: main.c
#, c-format
msgid "%02X"
msgstr ""
#: shared-module/os/getenv.c
#, c-format
msgid "%S"
msgstr ""
#: shared-bindings/rgbmatrix/RGBMatrix.c #: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format #, c-format
msgid "" msgid ""
"%d address pins, %d rgb pins and %d tiles indicate a height of %d, not %d" "%d address pins, %d rgb pins and %d tiles indicate a height of %d, not %d"
msgstr "" msgstr ""
#: ports/atmel-samd/common-hal/alarm/__init__.c
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/cxd56/common-hal/analogio/AnalogOut.c ports/cxd56/common-hal/rtc/RTC.c
#: ports/espressif/common-hal/audiobusio/I2SOut.c
#: ports/espressif/common-hal/rtc/RTC.c
#: ports/mimxrt10xx/common-hal/analogio/AnalogOut.c
#: ports/mimxrt10xx/common-hal/rtc/RTC.c ports/nrf/common-hal/alarm/__init__.c
#: ports/nrf/common-hal/analogio/AnalogOut.c
#: ports/nrf/common-hal/audiobusio/I2SOut.c ports/nrf/common-hal/rtc/RTC.c
#: ports/raspberrypi/common-hal/alarm/__init__.c
#: ports/raspberrypi/common-hal/analogio/AnalogOut.c
#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/rtc/RTC.c ports/stm/common-hal/alarm/__init__.c
#: ports/stm/common-hal/canio/Listener.c ports/stm/common-hal/rtc/RTC.c
#: shared-bindings/audiobusio/I2SOut.c shared-bindings/audiobusio/PDMIn.c
#: shared-bindings/keypad/KeyMatrix.c shared-bindings/keypad/Keys.c
#: shared-bindings/keypad/ShiftRegisterKeys.c
msgid "%q"
msgstr ""
#: shared-bindings/microcontroller/Pin.c #: shared-bindings/microcontroller/Pin.c
msgid "%q and %q contain duplicate pins" msgid "%q and %q contain duplicate pins"
msgstr "" msgstr ""
@ -293,11 +263,6 @@ msgstr ""
msgid "%q[%u] waits on input outside of count" msgid "%q[%u] waits on input outside of count"
msgstr "" msgstr ""
#: py/runtime.c
#, c-format
msgid "%s"
msgstr ""
#: ports/espressif/common-hal/espidf/__init__.c #: ports/espressif/common-hal/espidf/__init__.c
#, c-format #, c-format
msgid "%s error 0x%x" msgid "%s error 0x%x"
@ -1607,7 +1572,8 @@ msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c #: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "Only 8 or 16 bit mono with " #, c-format
msgid "Only 8 or 16 bit mono with %dx oversampling supported."
msgstr "" msgstr ""
#: ports/espressif/common-hal/wifi/__init__.c #: ports/espressif/common-hal/wifi/__init__.c

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -73,42 +73,12 @@ msgstr " 산출:\n"
msgid "%%c requires int or char" msgid "%%c requires int or char"
msgstr "%%c 전수(int)또는 캐릭터(char)필요합니다" msgstr "%%c 전수(int)또는 캐릭터(char)필요합니다"
#: main.c
#, c-format
msgid "%02X"
msgstr ""
#: shared-module/os/getenv.c
#, c-format
msgid "%S"
msgstr ""
#: shared-bindings/rgbmatrix/RGBMatrix.c #: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format #, c-format
msgid "" msgid ""
"%d address pins, %d rgb pins and %d tiles indicate a height of %d, not %d" "%d address pins, %d rgb pins and %d tiles indicate a height of %d, not %d"
msgstr "" msgstr ""
#: ports/atmel-samd/common-hal/alarm/__init__.c
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/cxd56/common-hal/analogio/AnalogOut.c ports/cxd56/common-hal/rtc/RTC.c
#: ports/espressif/common-hal/audiobusio/I2SOut.c
#: ports/espressif/common-hal/rtc/RTC.c
#: ports/mimxrt10xx/common-hal/analogio/AnalogOut.c
#: ports/mimxrt10xx/common-hal/rtc/RTC.c ports/nrf/common-hal/alarm/__init__.c
#: ports/nrf/common-hal/analogio/AnalogOut.c
#: ports/nrf/common-hal/audiobusio/I2SOut.c ports/nrf/common-hal/rtc/RTC.c
#: ports/raspberrypi/common-hal/alarm/__init__.c
#: ports/raspberrypi/common-hal/analogio/AnalogOut.c
#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/rtc/RTC.c ports/stm/common-hal/alarm/__init__.c
#: ports/stm/common-hal/canio/Listener.c ports/stm/common-hal/rtc/RTC.c
#: shared-bindings/audiobusio/I2SOut.c shared-bindings/audiobusio/PDMIn.c
#: shared-bindings/keypad/KeyMatrix.c shared-bindings/keypad/Keys.c
#: shared-bindings/keypad/ShiftRegisterKeys.c
msgid "%q"
msgstr ""
#: shared-bindings/microcontroller/Pin.c #: shared-bindings/microcontroller/Pin.c
msgid "%q and %q contain duplicate pins" msgid "%q and %q contain duplicate pins"
msgstr "" msgstr ""
@ -292,11 +262,6 @@ msgstr ""
msgid "%q[%u] waits on input outside of count" msgid "%q[%u] waits on input outside of count"
msgstr "" msgstr ""
#: py/runtime.c
#, c-format
msgid "%s"
msgstr ""
#: ports/espressif/common-hal/espidf/__init__.c #: ports/espressif/common-hal/espidf/__init__.c
#, c-format #, c-format
msgid "%s error 0x%x" msgid "%s error 0x%x"
@ -632,8 +597,9 @@ msgstr "자동 재 장전이 꺼져 있습니다\n"
msgid "" msgid ""
"Auto-reload is on. Simply save files over USB to run them or enter REPL to " "Auto-reload is on. Simply save files over USB to run them or enter REPL to "
"disable.\n" "disable.\n"
msgstr "자동 새로 고침이 켜져 있습니다. USB를 통해 파일을 저장하여 실행하십시오. " msgstr ""
"비활성화하려면 REPL을 입력하십시오.\n" "자동 새로 고침이 켜져 있습니다. USB를 통해 파일을 저장하여 실행하십시오. 비활"
"성화하려면 REPL을 입력하십시오.\n"
#: ports/espressif/common-hal/canio/CAN.c #: ports/espressif/common-hal/canio/CAN.c
msgid "Baudrate not supported by peripheral" msgid "Baudrate not supported by peripheral"
@ -1607,7 +1573,8 @@ msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c #: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "Only 8 or 16 bit mono with " #, c-format
msgid "Only 8 or 16 bit mono with %dx oversampling supported."
msgstr "" msgstr ""
#: ports/espressif/common-hal/wifi/__init__.c #: ports/espressif/common-hal/wifi/__init__.c
@ -2148,7 +2115,8 @@ msgstr "UUID문자열이 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'형식이 아닙
#: shared-bindings/_bleio/UUID.c #: shared-bindings/_bleio/UUID.c
msgid "UUID value is not str, int or byte buffer" msgid "UUID value is not str, int or byte buffer"
msgstr "UUID값이 문자열(str), 정수(int) 또는 바이트버퍼가(byte buffer) 아닙니다" msgstr ""
"UUID값이 문자열(str), 정수(int) 또는 바이트버퍼가(byte buffer) 아닙니다"
#: ports/raspberrypi/common-hal/memorymap/AddressRange.c #: ports/raspberrypi/common-hal/memorymap/AddressRange.c
msgid "Unable to access unaligned IO register" msgid "Unable to access unaligned IO register"
@ -4404,20 +4372,12 @@ msgstr ""
msgid "zi must be of shape (n_section, 2)" msgid "zi must be of shape (n_section, 2)"
msgstr "" msgstr ""
#~ msgid "'break' outside loop" #~ msgid ""
#~ msgstr "'break' 는 루프 외부에 있습니다" #~ "\n"
#~ "Code done running. Waiting for reload.\n"
#~ msgid "'continue' outside loop" #~ msgstr ""
#~ msgstr "'continue' 는 루프 외부에 있습니다" #~ "\n"
#~ "실행 완료 코드. 재장전 을 기다리는 중입니다\n"
#~ msgid "invalid format"
#~ msgstr "형식가 유효하지 않습니다"
#~ msgid "Expected a %q"
#~ msgstr "%q 이 예상되었습니다."
#~ msgid "Invalid pins"
#~ msgstr "핀이 유효하지 않습니다"
#~ msgid "%q must be >= 1" #~ msgid "%q must be >= 1"
#~ msgstr "%q 는 >=1이어야합니다" #~ msgstr "%q 는 >=1이어야합니다"
@ -4425,6 +4385,30 @@ msgstr ""
#~ msgid "%q should be an int" #~ msgid "%q should be an int"
#~ msgstr "%q 는 정수(int) 여야합니다" #~ msgstr "%q 는 정수(int) 여야합니다"
#~ msgid "'%s' object does not support item assignment"
#~ msgstr "'%s' 을 지정할 수 없습니다"
#~ msgid "'%s' object does not support item deletion"
#~ msgstr "'%s' 은 삭제할 수 없습니다"
#~ msgid "'%s' object is not an iterator"
#~ msgstr "'%s' 은 수정할 수 없습니다"
#~ msgid "'%s' object is not callable"
#~ msgstr "'%s' 을 검색 할 수 없습니다"
#~ msgid "'%s' object is not iterable"
#~ msgstr "'%s' 은 변경할 수 없습니다"
#~ msgid "'break' outside loop"
#~ msgstr "'break' 는 루프 외부에 있습니다"
#~ msgid "'continue' outside loop"
#~ msgstr "'continue' 는 루프 외부에 있습니다"
#~ msgid "Brightness must be between 0 and 255"
#~ msgstr "밝기는 0에서 255 사이 여야합니다"
#, c-format #, c-format
#~ msgid "Buffer incorrect size. Should be %d bytes." #~ msgid "Buffer incorrect size. Should be %d bytes."
#~ msgstr "잘못된 크기의 버퍼. %d 바이트 여야합니다." #~ msgstr "잘못된 크기의 버퍼. %d 바이트 여야합니다."
@ -4435,12 +4419,48 @@ msgstr ""
#~ msgid "Bytes must be between 0 and 255." #~ msgid "Bytes must be between 0 and 255."
#~ msgstr "바이트는 0에서 255 사이 여야합니다." #~ msgstr "바이트는 0에서 255 사이 여야합니다."
#~ msgid "Can't add services in Central mode"
#~ msgstr "센트랄(중앙) 모드에서는 서비스를 추가 할 수 없습니다"
#~ msgid "Can't advertise in Central mode"
#~ msgstr "센트랄(중앙) 모드로 광고 (브로드 캐스트) 할 수 없습니다"
#~ msgid "Can't change the name in Central mode"
#~ msgstr "센트랄(중앙) 모드에서는 이름을 변경할 수 없습니다"
#~ msgid "Cannot read without MISO pin." #~ msgid "Cannot read without MISO pin."
#~ msgstr "MISO핀이 없으면 읽을 수 없습니다" #~ msgstr "MISO핀이 없으면 읽을 수 없습니다"
#~ msgid "Command must be an int between 0 and 255" #~ msgid "Command must be an int between 0 and 255"
#~ msgstr "명령은 0에서 255 사이의 정수(int) 여야합니다" #~ msgstr "명령은 0에서 255 사이의 정수(int) 여야합니다"
#~ msgid "Data too large for the advertisement packet"
#~ msgstr "광고 (브로드 캐스트) 패킷에 대한 데이터가 너무 큽니다"
#~ msgid "Expected a %q"
#~ msgstr "%q 이 예상되었습니다."
#~ msgid "Expected a Characteristic"
#~ msgstr "특성(Characteristic)이 예상되었습니다."
#~ msgid "Expected a UUID"
#~ msgstr "UUID이 예상되었습니다."
#~ msgid "Failed to add service"
#~ msgstr "서비스를 추가하지 못했습니다"
#~ msgid "Failed to add service, err 0x%04x"
#~ msgstr "서비스를 추가하지 못했습니다., 오류 0x%04x"
#~ msgid "Failed to connect:"
#~ msgstr "연결할 수 없다"
#~ msgid "Failed to continue scanning"
#~ msgstr "스캔을 계속할 수 없습니다"
#~ msgid "Failed to continue scanning, err 0x%04x"
#~ msgstr "스캔을 계속할 수 없습니다, 오류 0x%04x"
#~ msgid "Invalid file" #~ msgid "Invalid file"
#~ msgstr "파일이 유효하지 않습니다" #~ msgstr "파일이 유효하지 않습니다"
@ -4459,81 +4479,29 @@ msgstr ""
#~ msgid "Invalid pin for right channel" #~ msgid "Invalid pin for right channel"
#~ msgstr "오른쪽 채널 핀이 잘못되었습니다" #~ msgstr "오른쪽 채널 핀이 잘못되었습니다"
#~ msgid "Brightness must be between 0 and 255" #~ msgid "Invalid pins"
#~ msgstr "밝기는 0에서 255 사이 여야합니다" #~ msgstr "핀이 유효하지 않습니다"
#~ msgid "integer required"
#~ msgstr "정수가 필요합니다"
#~ msgid "Expected a Characteristic"
#~ msgstr "특성(Characteristic)이 예상되었습니다."
#~ msgid "Expected a UUID"
#~ msgstr "UUID이 예상되었습니다."
#~ msgid "Length must be an int" #~ msgid "Length must be an int"
#~ msgstr "길이는 정수(int) 여야합니다" #~ msgstr "길이는 정수(int) 여야합니다"
#~ msgid "invalid dupterm index"
#~ msgstr "Dupterm index가 유효하지 않습니다"
#~ msgid "bits must be 7, 8 or 9" #~ msgid "bits must be 7, 8 or 9"
#~ msgstr "비트(bits)는 7, 8 또는 9 여야합니다" #~ msgstr "비트(bits)는 7, 8 또는 9 여야합니다"
#~ msgid ""
#~ "\n"
#~ "Code done running. Waiting for reload.\n"
#~ msgstr ""
#~ "\n"
#~ "실행 완료 코드. 재장전 을 기다리는 중입니다\n"
#~ msgid "'%s' object does not support item assignment"
#~ msgstr "'%s' 을 지정할 수 없습니다"
#~ msgid "'%s' object does not support item deletion"
#~ msgstr "'%s' 은 삭제할 수 없습니다"
#~ msgid "'%s' object is not an iterator"
#~ msgstr "'%s' 은 수정할 수 없습니다"
#~ msgid "'%s' object is not callable"
#~ msgstr "'%s' 을 검색 할 수 없습니다"
#~ msgid "'%s' object is not iterable"
#~ msgstr "'%s' 은 변경할 수 없습니다"
#~ msgid "Can't add services in Central mode"
#~ msgstr "센트랄(중앙) 모드에서는 서비스를 추가 할 수 없습니다"
#~ msgid "Can't advertise in Central mode"
#~ msgstr "센트랄(중앙) 모드로 광고 (브로드 캐스트) 할 수 없습니다"
#~ msgid "Can't change the name in Central mode"
#~ msgstr "센트랄(중앙) 모드에서는 이름을 변경할 수 없습니다"
#~ msgid "Data too large for the advertisement packet"
#~ msgstr "광고 (브로드 캐스트) 패킷에 대한 데이터가 너무 큽니다"
#~ msgid "Failed to add service"
#~ msgstr "서비스를 추가하지 못했습니다"
#~ msgid "Failed to add service, err 0x%04x"
#~ msgstr "서비스를 추가하지 못했습니다., 오류 0x%04x"
#~ msgid "Failed to connect:"
#~ msgstr "연결할 수 없다"
#~ msgid "Failed to continue scanning"
#~ msgstr "스캔을 계속할 수 없습니다"
#~ msgid "Failed to continue scanning, err 0x%04x"
#~ msgstr "스캔을 계속할 수 없습니다, 오류 0x%04x"
#~ msgid "bits must be 8" #~ msgid "bits must be 8"
#~ msgstr "비트(bits)는 8이어야합니다" #~ msgstr "비트(bits)는 8이어야합니다"
#~ msgid "integer required"
#~ msgstr "정수가 필요합니다"
#~ msgid "invalid I2C peripheral" #~ msgid "invalid I2C peripheral"
#~ msgstr "ICT주변 기기가 유효하지 않습니다" #~ msgstr "ICT주변 기기가 유효하지 않습니다"
#~ msgid "invalid SPI peripheral" #~ msgid "invalid SPI peripheral"
#~ msgstr "SPI주변 기기가 유효하지 않습니다" #~ msgstr "SPI주변 기기가 유효하지 않습니다"
#~ msgid "invalid dupterm index"
#~ msgstr "Dupterm index가 유효하지 않습니다"
#~ msgid "invalid format"
#~ msgstr "형식가 유효하지 않습니다"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -2,6 +2,10 @@
msgid "en_US" msgid "en_US"
msgstr "" msgstr ""
# This string should never be translated, but for technical reasons it has to appear as an MP_ERROR_TEXT
msgid "%02X"
msgstr ""
# This string should never be translated, but for technical reasons it has to appear as an MP_ERROR_TEXT # This string should never be translated, but for technical reasons it has to appear as an MP_ERROR_TEXT
msgid "%S" msgid "%S"
msgstr "" msgstr ""

View File

@ -78,16 +78,6 @@ msgstr " çıktı:\n"
msgid "%%c requires int or char" msgid "%%c requires int or char"
msgstr "%%c int veya char tipine ihtiyaç duyar" msgstr "%%c int veya char tipine ihtiyaç duyar"
#: main.c
#, c-format
msgid "%02X"
msgstr "%02X"
#: shared-module/os/getenv.c
#, c-format
msgid "%S"
msgstr ""
#: shared-bindings/rgbmatrix/RGBMatrix.c #: shared-bindings/rgbmatrix/RGBMatrix.c
#, c-format #, c-format
msgid "" msgid ""
@ -96,26 +86,6 @@ msgstr ""
"%d adres pinleri, %d RGB pinleri ve %d döşemeleri %d'nin yüksekliği " "%d adres pinleri, %d RGB pinleri ve %d döşemeleri %d'nin yüksekliği "
"gösterir, %d'nin değil" "gösterir, %d'nin değil"
#: ports/atmel-samd/common-hal/alarm/__init__.c
#: ports/atmel-samd/common-hal/audiobusio/I2SOut.c
#: ports/cxd56/common-hal/analogio/AnalogOut.c ports/cxd56/common-hal/rtc/RTC.c
#: ports/espressif/common-hal/audiobusio/I2SOut.c
#: ports/espressif/common-hal/rtc/RTC.c
#: ports/mimxrt10xx/common-hal/analogio/AnalogOut.c
#: ports/mimxrt10xx/common-hal/rtc/RTC.c ports/nrf/common-hal/alarm/__init__.c
#: ports/nrf/common-hal/analogio/AnalogOut.c
#: ports/nrf/common-hal/audiobusio/I2SOut.c ports/nrf/common-hal/rtc/RTC.c
#: ports/raspberrypi/common-hal/alarm/__init__.c
#: ports/raspberrypi/common-hal/analogio/AnalogOut.c
#: ports/raspberrypi/common-hal/audiobusio/I2SOut.c
#: ports/raspberrypi/common-hal/rtc/RTC.c ports/stm/common-hal/alarm/__init__.c
#: ports/stm/common-hal/canio/Listener.c ports/stm/common-hal/rtc/RTC.c
#: shared-bindings/audiobusio/I2SOut.c shared-bindings/audiobusio/PDMIn.c
#: shared-bindings/keypad/KeyMatrix.c shared-bindings/keypad/Keys.c
#: shared-bindings/keypad/ShiftRegisterKeys.c
msgid "%q"
msgstr "%q"
#: shared-bindings/microcontroller/Pin.c #: shared-bindings/microcontroller/Pin.c
msgid "%q and %q contain duplicate pins" msgid "%q and %q contain duplicate pins"
msgstr "%q ve %q yinelenen pinler içeriyor" msgstr "%q ve %q yinelenen pinler içeriyor"
@ -299,11 +269,6 @@ msgstr ""
msgid "%q[%u] waits on input outside of count" msgid "%q[%u] waits on input outside of count"
msgstr "" msgstr ""
#: py/runtime.c
#, c-format
msgid "%s"
msgstr ""
#: ports/espressif/common-hal/espidf/__init__.c #: ports/espressif/common-hal/espidf/__init__.c
#, c-format #, c-format
msgid "%s error 0x%x" msgid "%s error 0x%x"
@ -1621,7 +1586,8 @@ msgstr ""
#: ports/atmel-samd/common-hal/audiobusio/PDMIn.c #: ports/atmel-samd/common-hal/audiobusio/PDMIn.c
#: ports/raspberrypi/common-hal/audiobusio/PDMIn.c #: ports/raspberrypi/common-hal/audiobusio/PDMIn.c
msgid "Only 8 or 16 bit mono with " #, c-format
msgid "Only 8 or 16 bit mono with %dx oversampling supported."
msgstr "" msgstr ""
#: ports/espressif/common-hal/wifi/__init__.c #: ports/espressif/common-hal/wifi/__init__.c
@ -4421,6 +4387,66 @@ msgstr ""
msgid "zi must be of shape (n_section, 2)" msgid "zi must be of shape (n_section, 2)"
msgstr "" msgstr ""
#~ msgid ""
#~ "\n"
#~ "Code stopped by auto-reload.\n"
#~ msgstr ""
#~ "\n"
#~ "Program otomatik yeniden yükleme tarafından sonlandırıldı.\n"
#~ msgid ""
#~ "\n"
#~ "Please file an issue with the contents of your CIRCUITPY drive at \n"
#~ "https://github.com/adafruit/circuitpython/issues\n"
#~ msgstr ""
#~ "\n"
#~ "Lütfen, şu adrese CIRCUITPY sürücünüzün içerikleri ile beraber bir hata/"
#~ "konu kaydı ekleyin\n"
#~ "https://github.com/adafruit/circuitpython/issues\n"
#, c-format
#~ msgid "%02X"
#~ msgstr "%02X"
#~ msgid "%q"
#~ msgstr "%q"
#~ msgid "%q length must be >= 1"
#~ msgstr "%q boyutu >=1 olmalıdır"
#~ msgid "%q must be >= 0"
#~ msgstr "%q >= 0 olmalıdır"
#~ msgid "%q must be >= 1"
#~ msgstr "%q >= 1 olmalıdır"
#~ msgid "%q must be a string"
#~ msgstr "%q bir string olmalıdır"
#~ msgid "%q must be a tuple of length 2"
#~ msgstr "%q, boyutu 2 olan bir tuple olmalıdır"
#~ msgid "%q must be an int"
#~ msgstr "%q bir tam sayı olmalıdır"
#~ msgid "%q must be between %d and %d"
#~ msgstr "%q, %d ile %d arasında olmalıdır"
#~ msgid "%q must be of type %q"
#~ msgstr "%q, %q türünde olmalıdır"
#~ msgid "%q must be of type %q or None"
#~ msgstr "%q, %q ya da None türünde olmalıdır"
#~ msgid "%q pin invalid"
#~ msgstr "%q pini geçersiz"
#~ msgid "%q should be an int"
#~ msgstr "%q bir int olmalıdır"
#~ msgid "%q with a report ID of 0 must be of length 1"
#~ msgstr "Rapor kimliği 0 olan %q, 1 uzunluğunda olmalıdır"
#~ msgid "'await', 'async for' or 'async with' outside async function" #~ msgid "'await', 'async for' or 'async with' outside async function"
#~ msgstr "" #~ msgstr ""
#~ "asenkron fonksiyon dışında kullanılan 'await', 'async for' ya da 'async " #~ "asenkron fonksiyon dışında kullanılan 'await', 'async for' ya da 'async "
@ -4432,24 +4458,103 @@ msgstr ""
#~ msgid "'continue' outside loop" #~ msgid "'continue' outside loop"
#~ msgstr "döngü dışında 'continue'" #~ msgstr "döngü dışında 'continue'"
#~ msgid "Bit clock and word select must be sequential pins" #~ msgid "'coroutine' object is not an iterator"
#~ msgstr "Bit saati ve kelime seçimi pinleri sıralı olmalıdır" #~ msgstr "'coroutine' nesnesi bir iteratör değildir"
#~ msgid "Initialization failed due to lack of memory" #~ msgid "(x,y) integers required"
#~ msgstr "Bellek yetersizliği nedeniyle başlatma başarısız oldu" #~ msgstr "(x, y) integerları gereklidir"
#~ msgid "64 bit types"
#~ msgstr "64 bit tipler"
#~ msgid "ADC2 is being used by WiFi" #~ msgid "ADC2 is being used by WiFi"
#~ msgstr "ADC2, WiFi tarafından kullanılmaktadır" #~ msgstr "ADC2, WiFi tarafından kullanılmaktadır"
#~ msgid "'coroutine' object is not an iterator" #~ msgid "Address type out of range"
#~ msgstr "'coroutine' nesnesi bir iteratör değildir" #~ msgstr "Adres tipi beklenen aralığın dışında"
#~ msgid "All I2C targets are in use"
#~ msgstr "Tüm I2C hedefleri kullanımda"
#~ msgid "AnalogIn not supported on given pin"
#~ msgstr "Verilen pin için AnalogIn desteklenmemektedir"
#~ msgid "AnalogOut functionality not supported"
#~ msgstr "AnalogOut işlevi desteklenmemektedir"
#~ msgid "AnalogOut is only 16 bits. Value must be less than 65536."
#~ msgstr "AnalogOut yalnızca 16 bitlik. Değer 65536'dan küçük olmalıdır."
#~ msgid "AnalogOut not supported on given pin"
#~ msgstr "Verilen pin için AnalogOut desteklenmemektedir"
#~ msgid "At most %d %q may be specified (not %d)"
#~ msgstr "En az %d %q belirtilmeli (%d değil)"
#~ msgid "Attempted heap allocation when VM not running."
#~ msgstr "VM çalışmazken heap'ten alan tahsis edilmeye çalışıldı."
#~ msgid "Bit clock and word select must be sequential pins"
#~ msgstr "Bit saati ve kelime seçimi pinleri sıralı olmalıdır"
#, c-format
#~ msgid "Bit depth must be from 1 to 6 inclusive, not %d"
#~ msgstr "Bit derinliği 1-6 aralığında olmalı, %d değil"
#~ msgid "Boot device must be first device (interface #0)."
#~ msgstr "Önyükleme cihazı ilk cihaz olmalı (arayüz #0)."
#~ msgid "Both buttons were pressed at start up.\n"
#~ msgstr "Başlatma sırasında her iki düğmeye de basıldı.\n"
#~ msgid "Brightness must be 0-1.0"
#~ msgstr "Parlaklık 0-1.0 aralığında olmalı"
#, c-format
#~ msgid "Buffer incorrect size. Should be %d bytes."
#~ msgstr "Geçersiz arabellek boyutu. %d kadar olmalı"
#~ msgid "Buffer is too small" #~ msgid "Buffer is too small"
#~ msgstr "Arabellek çok küçük" #~ msgstr "Arabellek çok küçük"
#~ msgid "Buffer must be at least length 1"
#~ msgstr "Arabellek boyutu en az 1 olmalı"
#~ msgid "Button A was pressed at start up.\n"
#~ msgstr "Başlatma sırasında A düğmesine basıldı.\n"
#~ msgid "Bytes must be between 0 and 255."
#~ msgstr "Baytlar 0-255 aralığında olmalı"
#~ msgid "Cannot transfer without MOSI and MISO pins"
#~ msgstr "MOSI ve MISO pinleri olmadan transfer edilemiyor"
#~ msgid "Corrupt .mpy file" #~ msgid "Corrupt .mpy file"
#~ msgstr "Bozuk .mpy dosyası" #~ msgstr "Bozuk .mpy dosyası"
#, c-format
#~ msgid "Error in MIDI stream at position %d"
#~ msgstr "%d konumundaki MIDI akışında hata"
#~ msgid "Expected a %q"
#~ msgstr "%q bekleniyor"
#~ msgid "Expected a %q or %q"
#~ msgstr "%q yada %q bekleniyor"
#~ msgid "Expected an %q"
#~ msgstr "%q bekleniyor"
#~ msgid "Hardware busy, try alternative pins"
#~ msgstr "Donanım meşgul, alternatif pinleri deneyin"
#~ msgid "I2SOut not available"
#~ msgstr "I2SOut uygundeğil"
#, c-format
#~ msgid "IV must be %d bytes long"
#~ msgstr "IV %d bayt uzunluğunda olmalı"
#~ msgid "" #~ msgid ""
#~ "Incompatible .mpy file. Please update all .mpy files. See http://adafru." #~ "Incompatible .mpy file. Please update all .mpy files. See http://adafru."
#~ "it/mpy-update for more info." #~ "it/mpy-update for more info."
@ -4457,6 +4562,9 @@ msgstr ""
#~ "Uyumsuz .mpy dosyası. Lütfen tüm .mpy dosyalarını güncelleyin. Daha fazla " #~ "Uyumsuz .mpy dosyası. Lütfen tüm .mpy dosyalarını güncelleyin. Daha fazla "
#~ "bilgi için http://adafru.it/mpy-update ." #~ "bilgi için http://adafru.it/mpy-update ."
#~ msgid "Initialization failed due to lack of memory"
#~ msgstr "Bellek yetersizliği nedeniyle başlatma başarısız oldu"
#, c-format #, c-format
#~ msgid "Instruction %d shifts in more bits than pin count" #~ msgid "Instruction %d shifts in more bits than pin count"
#~ msgstr "Komut %d pin sayısından daha fazla bit içe kaydırıyor" #~ msgstr "Komut %d pin sayısından daha fazla bit içe kaydırıyor"
@ -4473,11 +4581,12 @@ msgstr ""
#~ msgid "Instruction %d waits on input outside of count" #~ msgid "Instruction %d waits on input outside of count"
#~ msgstr "Komut %d sayım dışında, girişte bekler" #~ msgstr "Komut %d sayım dışında, girişte bekler"
#~ msgid "Cannot transfer without MOSI and MISO pins" #~ msgid "Invalid memory access."
#~ msgstr "MOSI ve MISO pinleri olmadan transfer edilemiyor" #~ msgstr "Geçersiz bellek erişimi."
#~ msgid "Hardware busy, try alternative pins" #, c-format
#~ msgstr "Donanım meşgul, alternatif pinleri deneyin" #~ msgid "Maximum x value when mirrored is %d"
#~ msgstr "İkizlendiğinde maksimum x değeri %d'dir"
#~ msgid "Missing MISO or MOSI Pin" #~ msgid "Missing MISO or MOSI Pin"
#~ msgstr "Eksik MISO veya MOSI pini" #~ msgstr "Eksik MISO veya MOSI pini"
@ -4502,139 +4611,3 @@ msgstr ""
#~ msgid "No TX pin" #~ msgid "No TX pin"
#~ msgstr "TX pini yok" #~ msgstr "TX pini yok"
#~ msgid "Brightness must be 0-1.0"
#~ msgstr "Parlaklık 0-1.0 aralığında olmalı"
#, c-format
#~ msgid "Error in MIDI stream at position %d"
#~ msgstr "%d konumundaki MIDI akışında hata"
#, c-format
#~ msgid "Maximum x value when mirrored is %d"
#~ msgstr "İkizlendiğinde maksimum x değeri %d'dir"
#~ msgid "I2SOut not available"
#~ msgstr "I2SOut uygundeğil"
#~ msgid "64 bit types"
#~ msgstr "64 bit tipler"
#~ msgid "%q pin invalid"
#~ msgstr "%q pini geçersiz"
#~ msgid ""
#~ "\n"
#~ "Please file an issue with the contents of your CIRCUITPY drive at \n"
#~ "https://github.com/adafruit/circuitpython/issues\n"
#~ msgstr ""
#~ "\n"
#~ "Lütfen, şu adrese CIRCUITPY sürücünüzün içerikleri ile beraber bir hata/"
#~ "konu kaydı ekleyin\n"
#~ "https://github.com/adafruit/circuitpython/issues\n"
#~ msgid "Attempted heap allocation when VM not running."
#~ msgstr "VM çalışmazken heap'ten alan tahsis edilmeye çalışıldı."
#~ msgid "Boot device must be first device (interface #0)."
#~ msgstr "Önyükleme cihazı ilk cihaz olmalı (arayüz #0)."
#~ msgid "Both buttons were pressed at start up.\n"
#~ msgstr "Başlatma sırasında her iki düğmeye de basıldı.\n"
#~ msgid "Button A was pressed at start up.\n"
#~ msgstr "Başlatma sırasında A düğmesine basıldı.\n"
#~ msgid "Invalid memory access."
#~ msgstr "Geçersiz bellek erişimi."
#~ msgid "%q must be of type %q"
#~ msgstr "%q, %q türünde olmalıdır"
#~ msgid "%q must be of type %q or None"
#~ msgstr "%q, %q ya da None türünde olmalıdır"
#~ msgid "Expected a %q"
#~ msgstr "%q bekleniyor"
#~ msgid "Expected a %q or %q"
#~ msgstr "%q yada %q bekleniyor"
#~ msgid "Expected an %q"
#~ msgstr "%q bekleniyor"
#, c-format
#~ msgid "IV must be %d bytes long"
#~ msgstr "IV %d bayt uzunluğunda olmalı"
#~ msgid "%q length must be >= 1"
#~ msgstr "%q boyutu >=1 olmalıdır"
#~ msgid "%q must be a string"
#~ msgstr "%q bir string olmalıdır"
#~ msgid "%q must be an int"
#~ msgstr "%q bir tam sayı olmalıdır"
#~ msgid "%q with a report ID of 0 must be of length 1"
#~ msgstr "Rapor kimliği 0 olan %q, 1 uzunluğunda olmalıdır"
#~ msgid "At most %d %q may be specified (not %d)"
#~ msgstr "En az %d %q belirtilmeli (%d değil)"
#~ msgid "%q must be >= 0"
#~ msgstr "%q >= 0 olmalıdır"
#~ msgid "%q must be >= 1"
#~ msgstr "%q >= 1 olmalıdır"
#~ msgid "All I2C targets are in use"
#~ msgstr "Tüm I2C hedefleri kullanımda"
#~ msgid "%q must be a tuple of length 2"
#~ msgstr "%q, boyutu 2 olan bir tuple olmalıdır"
#~ msgid "%q must be between %d and %d"
#~ msgstr "%q, %d ile %d arasında olmalıdır"
#~ msgid "%q should be an int"
#~ msgstr "%q bir int olmalıdır"
#~ msgid "(x,y) integers required"
#~ msgstr "(x, y) integerları gereklidir"
#~ msgid "Address type out of range"
#~ msgstr "Adres tipi beklenen aralığın dışında"
#~ msgid "AnalogIn not supported on given pin"
#~ msgstr "Verilen pin için AnalogIn desteklenmemektedir"
#~ msgid "AnalogOut functionality not supported"
#~ msgstr "AnalogOut işlevi desteklenmemektedir"
#~ msgid "AnalogOut is only 16 bits. Value must be less than 65536."
#~ msgstr "AnalogOut yalnızca 16 bitlik. Değer 65536'dan küçük olmalıdır."
#~ msgid "AnalogOut not supported on given pin"
#~ msgstr "Verilen pin için AnalogOut desteklenmemektedir"
#, c-format
#~ msgid "Bit depth must be from 1 to 6 inclusive, not %d"
#~ msgstr "Bit derinliği 1-6 aralığında olmalı, %d değil"
#, c-format
#~ msgid "Buffer incorrect size. Should be %d bytes."
#~ msgstr "Geçersiz arabellek boyutu. %d kadar olmalı"
#~ msgid "Buffer must be at least length 1"
#~ msgstr "Arabellek boyutu en az 1 olmalı"
#~ msgid "Bytes must be between 0 and 255."
#~ msgstr "Baytlar 0-255 aralığında olmalı"
#~ msgid ""
#~ "\n"
#~ "Code stopped by auto-reload.\n"
#~ msgstr ""
#~ "\n"
#~ "Program otomatik yeniden yükleme tarafından sonlandırıldı.\n"

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,29 @@
/*
* This file is part of the MicroPython project, http://micropython.org/
*
* The MIT License (MIT)
*
* Copyright (c) 2023 Bill Sideris, independently providing these changes.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include "supervisor/board.h"
// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here.

View File

@ -0,0 +1,45 @@
/*
* This file is part of the MicroPython project, http://micropython.org/
*
* The MIT License (MIT)
*
* Copyright (c) 2023 Bill Sideris, independently providing these changes.
*
* 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.
*/
#define MICROPY_HW_BOARD_NAME "DFRobot FireBeetle 2 ESP32-S3"
#define MICROPY_HW_MCU_NAME "ESP32S3"
#define CIRCUITPY_BOARD_I2C (2)
#define CIRCUITPY_BOARD_I2C_PIN {{.scl = &pin_GPIO2, .sda = &pin_GPIO3}, \
{.scl = &pin_GPIO2, .sda = &pin_GPIO1}}
#define DEFAULT_SPI_BUS_SCK (&pin_GPIO17)
#define DEFAULT_SPI_BUS_MOSI (&pin_GPIO15)
#define DEFAULT_SPI_BUS_MISO (&pin_GPIO16)
#define MICROPY_HW_LED_STATUS (&pin_GPIO21)
#define DEFAULT_UART_BUS_RX (&pin_GPIO44)
#define DEFAULT_UART_BUS_TX (&pin_GPIO43)
#define DOUBLE_TAP_PIN (&pin_GPIO0)
#define CIRCUITPY_I2C_ALLOW_INTERNAL_PULL_UP (1)

View File

@ -0,0 +1,16 @@
USB_VID = 0x3343
USB_PID = 0x83CF
USB_PRODUCT = "Firebeetle 2 ESP32-S3"
USB_MANUFACTURER = "DFRobot"
IDF_TARGET = esp32s3
CIRCUITPY_ESP_FLASH_MODE = qio
CIRCUITPY_ESP_FLASH_FREQ = 80m
CIRCUITPY_ESP_FLASH_SIZE = 16MB
CIRCUITPY_ESP_PSRAM_SIZE = 8MB
CIRCUITPY_ESP_PSRAM_MODE = opi
CIRCUITPY_ESP_PSRAM_FREQ = 120m
FROZEN_MPY_DIRS += $(TOP)/frozen/CircuitPython_AXP313A

View File

@ -0,0 +1,121 @@
#include "py/objtuple.h"
#include "shared-bindings/board/__init__.h"
#include "shared-module/displayio/__init__.h"
CIRCUITPY_BOARD_BUS_SINGLETON(cam_i2c, i2c, 1) // Camera sensor
STATIC const mp_rom_obj_tuple_t camera_data_tuple = {
// The order matters.
// They must be ordered from low to high (Y2, Y3 .. Y9).
// Do not include any of the control pins in here.
{&mp_type_tuple},
8,
{
MP_ROM_PTR(&pin_GPIO39), // Y2
MP_ROM_PTR(&pin_GPIO40), // Y3
MP_ROM_PTR(&pin_GPIO41), // Y4
MP_ROM_PTR(&pin_GPIO4), // Y5
MP_ROM_PTR(&pin_GPIO7), // Y6
MP_ROM_PTR(&pin_GPIO8), // Y7
MP_ROM_PTR(&pin_GPIO46), // Y8
MP_ROM_PTR(&pin_GPIO48) // Y9
}
};
STATIC const mp_rom_map_elem_t board_module_globals_table[] = {
CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS
// Left header, module facing down.
{ MP_ROM_QSTR(MP_QSTR_IO17), MP_ROM_PTR(&pin_GPIO17)},
{ MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_GPIO17)},
{ MP_ROM_QSTR(MP_QSTR_IO15), MP_ROM_PTR(&pin_GPIO15)},
{ MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_GPIO15)},
{ MP_ROM_QSTR(MP_QSTR_IO16), MP_ROM_PTR(&pin_GPIO16)},
{ MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO16)},
{ MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) },
{ MP_ROM_QSTR(MP_QSTR_IO2), MP_ROM_PTR(&pin_GPIO2) },
{ MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO2) },
{ MP_ROM_QSTR(MP_QSTR_IO1), MP_ROM_PTR(&pin_GPIO1) },
{ MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO3) },
// I2C cannot be used when CAM_I2C is in use.
{ MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) },
{ MP_ROM_QSTR(MP_QSTR_IO0), MP_ROM_PTR(&pin_GPIO0) },
{ MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_GPIO0) },
{ MP_ROM_QSTR(MP_QSTR_BOOT), MP_ROM_PTR(&pin_GPIO0) },
{ MP_ROM_QSTR(MP_QSTR_IO9), MP_ROM_PTR(&pin_GPIO9) },
{ MP_ROM_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_GPIO9) },
{ MP_ROM_QSTR(MP_QSTR_IO18), MP_ROM_PTR(&pin_GPIO18)},
{ MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_GPIO18)},
{ MP_ROM_QSTR(MP_QSTR_IO7), MP_ROM_PTR(&pin_GPIO7) },
{ MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_GPIO7) },
{ MP_ROM_QSTR(MP_QSTR_IO38), MP_ROM_PTR(&pin_GPIO38)},
{ MP_ROM_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_GPIO38)},
{ MP_ROM_QSTR(MP_QSTR_IO3), MP_ROM_PTR(&pin_GPIO3) },
{ MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_GPIO3) },
{ MP_ROM_QSTR(MP_QSTR_IO43), MP_ROM_PTR(&pin_GPIO43)},
{ MP_ROM_QSTR(MP_QSTR_TXD), MP_ROM_PTR(&pin_GPIO43)},
{ MP_ROM_QSTR(MP_QSTR_IO44), MP_ROM_PTR(&pin_GPIO44)},
{ MP_ROM_QSTR(MP_QSTR_RXD), MP_ROM_PTR(&pin_GPIO44)},
{ MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj)},
// Right header, module facing down.
{ MP_ROM_QSTR(MP_QSTR_IO47), MP_ROM_PTR(&pin_GPIO47)},
{ MP_ROM_QSTR(MP_QSTR_D14), MP_ROM_PTR(&pin_GPIO47)},
{ MP_ROM_QSTR(MP_QSTR_PWR), MP_ROM_PTR(&pin_GPIO47)},
{ MP_ROM_QSTR(MP_QSTR_IO11), MP_ROM_PTR(&pin_GPIO11)},
{ MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_GPIO11)},
{ MP_ROM_QSTR(MP_QSTR_IO10), MP_ROM_PTR(&pin_GPIO10)},
{ MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_GPIO10)},
{ MP_ROM_QSTR(MP_QSTR_IO8), MP_ROM_PTR(&pin_GPIO8) },
{ MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_GPIO8) },
{ MP_ROM_QSTR(MP_QSTR_IO6), MP_ROM_PTR(&pin_GPIO6) },
{ MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_GPIO6) },
{ MP_ROM_QSTR(MP_QSTR_IO5), MP_ROM_PTR(&pin_GPIO5) },
{ MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_GPIO5) },
{ MP_ROM_QSTR(MP_QSTR_IO21), MP_ROM_PTR(&pin_GPIO21)},
{ MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_GPIO21)},
{ MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO21)},
{ MP_ROM_QSTR(MP_QSTR_IO12), MP_ROM_PTR(&pin_GPIO12)},
{ MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_GPIO12)},
{ MP_ROM_QSTR(MP_QSTR_IO13), MP_ROM_PTR(&pin_GPIO13)},
{ MP_ROM_QSTR(MP_QSTR_IO11), MP_ROM_PTR(&pin_GPIO13)},
{ MP_ROM_QSTR(MP_QSTR_IO14), MP_ROM_PTR(&pin_GPIO14)},
{ MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_GPIO14)},
// Camera data
{ MP_ROM_QSTR(MP_QSTR_CAM_DATA), MP_ROM_PTR(&camera_data_tuple)},
{ MP_ROM_QSTR(MP_QSTR_CAM_VSYNC), MP_ROM_PTR(&pin_GPIO6) },
{ MP_ROM_QSTR(MP_QSTR_CAM_HREF), MP_ROM_PTR(&pin_GPIO42)},
{ MP_ROM_QSTR(MP_QSTR_CAM_PCLK), MP_ROM_PTR(&pin_GPIO5) },
{ MP_ROM_QSTR(MP_QSTR_CAM_XCLK), MP_ROM_PTR(&pin_GPIO45)},
{ MP_ROM_QSTR(MP_QSTR_CAM_I2C), MP_ROM_PTR(&board_cam_i2c_obj)},
};
MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table);

View File

@ -0,0 +1,17 @@
#
# Espressif IoT Development Framework Configuration
#
#
# Component config
#
#
# LWIP
#
CONFIG_LWIP_LOCAL_HOSTNAME="espressif-esp32s3"
CONFIG_OV2640_SUPPORT=y
CONFIG_OV7725_SUPPORT=y
# end of LWIP
# end of Component config
# end of Espressif IoT Development Framework Configuration

View File

@ -1,5 +1,5 @@
USB_VID = 0x239A USB_VID = 0x303A
USB_PID = 0x814A USB_PID = 0x81BF
USB_PRODUCT = "MakerFabs-ESP32-S3-Parallel-TFT-With-Touch-7inch" USB_PRODUCT = "MakerFabs-ESP32-S3-Parallel-TFT-With-Touch-7inch"
USB_MANUFACTURER = "MakerFabs" USB_MANUFACTURER = "MakerFabs"
@ -14,3 +14,13 @@ CIRCUITPY_ESP_PSRAM_MODE = opi
CIRCUITPY_ESP_PSRAM_FREQ = 80m CIRCUITPY_ESP_PSRAM_FREQ = 80m
CIRCUITPY_DOTCLOCKFRAMEBUFFER = 1 CIRCUITPY_DOTCLOCKFRAMEBUFFER = 1
# To build with USB disabled allowing access to I2S pins
#CIRCUITPY_CREATOR_ID = 0x1A000000
#CIRCUITPY_CREATION_ID = 0x005381BF
#CIRCUITPY_USB=0
#CIRCUITPY_BUILD_EXTENSIONS = bin,uf2
#UF2_BOOTLOADER = 1
#CIRCUITPY_WIFI=1
#CIRCUITPY_WEB_WORKFLOW=1
#OPTIMIZATION_FLAGS = -Os

View File

@ -67,20 +67,43 @@ STATIC const mp_rom_map_elem_t timings800_table[] = {
}; };
MP_DEFINE_CONST_DICT(timings800_dict, timings800_table); MP_DEFINE_CONST_DICT(timings800_dict, timings800_table);
STATIC const mp_rom_map_elem_t timings1024_table[] = {
{ MP_ROM_QSTR(MP_QSTR_frequency), MP_ROM_INT(10000000) }, // nominal 16MHz, but display is unstable/tears at that frequency
{ MP_ROM_QSTR(MP_QSTR_width), MP_ROM_INT(1024) },
{ MP_ROM_QSTR(MP_QSTR_height), MP_ROM_INT(600) },
{ MP_ROM_QSTR(MP_QSTR_hsync_pulse_width), MP_ROM_INT(30) },
{ MP_ROM_QSTR(MP_QSTR_hsync_front_porch), MP_ROM_INT(210) },
{ MP_ROM_QSTR(MP_QSTR_hsync_back_porch), MP_ROM_INT(16) },
{ MP_ROM_QSTR(MP_QSTR_hsync_idle_low), MP_ROM_FALSE },
{ MP_ROM_QSTR(MP_QSTR_vsync_pulse_width), MP_ROM_INT(13) },
{ MP_ROM_QSTR(MP_QSTR_vsync_front_porch), MP_ROM_INT(22) },
{ MP_ROM_QSTR(MP_QSTR_vsync_back_porch), MP_ROM_INT(10) },
{ MP_ROM_QSTR(MP_QSTR_vsync_idle_low), MP_ROM_FALSE },
{ MP_ROM_QSTR(MP_QSTR_de_idle_high), MP_ROM_FALSE },
{ MP_ROM_QSTR(MP_QSTR_pclk_active_high), MP_ROM_FALSE },
{ MP_ROM_QSTR(MP_QSTR_pclk_idle_high), MP_ROM_FALSE },
};
MP_DEFINE_CONST_DICT(timings1024_dict, timings1024_table);
STATIC const mp_rom_map_elem_t board_module_globals_table[] = { STATIC const mp_rom_map_elem_t board_module_globals_table[] = {
CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS
{ MP_ROM_QSTR(MP_QSTR_TFT_PINS), MP_ROM_PTR(&tft_pins_dict) }, { MP_ROM_QSTR(MP_QSTR_TFT_PINS), MP_ROM_PTR(&tft_pins_dict) },
{ MP_ROM_QSTR(MP_QSTR_TFT_TIMINGS), MP_ROM_PTR(&timings800_dict) }, { MP_ROM_QSTR(MP_QSTR_TFT_TIMINGS), MP_ROM_PTR(&timings800_dict) },
{ MP_ROM_QSTR(MP_QSTR_TFT_TIMINGS800), MP_ROM_PTR(&timings800_dict) },
{ MP_ROM_QSTR(MP_QSTR_TFT_TIMINGS1024), MP_ROM_PTR(&timings1024_dict) },
{ MP_ROM_QSTR(MP_QSTR_TFT_BACKLIGHT), MP_ROM_PTR(&pin_GPIO10) }, { MP_ROM_QSTR(MP_QSTR_TFT_BACKLIGHT), MP_ROM_PTR(&pin_GPIO10) },
// GPIO pins available on Mabee connector port (also shared with I2S & USB D+/D-) // GPIO pins available on Mabee connector port (also shared with I2S & USB D+/D-)
{ MP_ROM_QSTR(MP_QSTR_GPIO20), MP_ROM_PTR(&pin_GPIO20) }, { MP_ROM_QSTR(MP_QSTR_GPIO20), MP_ROM_PTR(&pin_GPIO20) },
{ MP_ROM_QSTR(MP_QSTR_GPIO19), MP_ROM_PTR(&pin_GPIO19) }, { MP_ROM_QSTR(MP_QSTR_GPIO19), MP_ROM_PTR(&pin_GPIO19) },
// I2S pins are shared with USB D+/D-, these are only useful if USB is disabled
#if CIRCUITPY_USB == 0
{ MP_ROM_QSTR(MP_QSTR_I2S_BIT_CLOCK), MP_ROM_PTR(&pin_GPIO20) }, { MP_ROM_QSTR(MP_QSTR_I2S_BIT_CLOCK), MP_ROM_PTR(&pin_GPIO20) },
{ MP_ROM_QSTR(MP_QSTR_I2S_WORD_SELECT), MP_ROM_PTR(&pin_GPIO2) }, { MP_ROM_QSTR(MP_QSTR_I2S_WORD_SELECT), MP_ROM_PTR(&pin_GPIO2) },
{ MP_ROM_QSTR(MP_QSTR_I2S_DATA), MP_ROM_PTR(&pin_GPIO19) }, { MP_ROM_QSTR(MP_QSTR_I2S_DATA), MP_ROM_PTR(&pin_GPIO19) },
#endif
{ MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO43) }, { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO43) },
{ MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO44) }, { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO44) },
@ -89,16 +112,16 @@ STATIC const mp_rom_map_elem_t board_module_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO17) }, { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO17) },
{ MP_ROM_QSTR(MP_QSTR_TOUCH_RESET), MP_ROM_PTR(&pin_GPIO38) }, { MP_ROM_QSTR(MP_QSTR_TOUCH_RESET), MP_ROM_PTR(&pin_GPIO38) },
{ MP_ROM_QSTR(MP_QSTR_SDIO_CMD), MP_ROM_PTR(&pin_GPIO11) }, // IO10 <> SD_CS is cut at factory (non-placed resistor position R34) and pulled up.
{ MP_ROM_QSTR(MP_QSTR_SDIO_D0), MP_ROM_PTR(&pin_GPIO13) }, // Permanent SDIO 1-bit mode?
{ MP_ROM_QSTR(MP_QSTR_SDIO_CLK), MP_ROM_PTR(&pin_GPIO12) }, // Until SDIO 1-bit mode is support on Espressif ports these pins aren't useful
// { MP_ROM_QSTR(MP_QSTR_SDIO_CMD), MP_ROM_PTR(&pin_GPIO11) },
// { MP_ROM_QSTR(MP_QSTR_SDIO_D0), MP_ROM_PTR(&pin_GPIO13) },
// { MP_ROM_QSTR(MP_QSTR_SDIO_CLK), MP_ROM_PTR(&pin_GPIO12) },
// boot mode button can be used in SW as well // boot mode button can be used in SW as well
{ MP_ROM_QSTR(MP_QSTR_BUTTON), MP_ROM_PTR(&pin_GPIO1) }, { MP_ROM_QSTR(MP_QSTR_BUTTON), MP_ROM_PTR(&pin_GPIO1) },
// IO10 <> SD_CS is cut at factory (non-placed resistor position R34) and pulled up.
// Permanent SDIO 1-bit mode?
{ MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) },
}; };
MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table);

View File

@ -284,15 +284,21 @@ STATIC void _new_connection(uint16_t conn_handle) {
esp_ble_tx_power_set(conn_handle, ESP_PWR_LVL_N0); esp_ble_tx_power_set(conn_handle, ESP_PWR_LVL_N0);
// Find an empty connection. One must always be available because the SD has the same // Find an empty connection. One should always be available because the SD has the same
// total connection limit. // total connection limit.
bleio_connection_internal_t *connection; bleio_connection_internal_t *connection = NULL;
for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) { for (size_t i = 0; i < BLEIO_TOTAL_CONNECTION_COUNT; i++) {
connection = &bleio_connections[i]; connection = &bleio_connections[i];
if (connection->conn_handle == BLEIO_HANDLE_INVALID) { if (connection->conn_handle == BLEIO_HANDLE_INVALID) {
break; break;
} }
} }
// Shouldn't happen, but just return if no connection available.
if (!connection) {
return;
}
connection->conn_handle = conn_handle; connection->conn_handle = conn_handle;
connection->connection_obj = mp_const_none; connection->connection_obj = mp_const_none;
connection->pair_status = PAIR_NOT_PAIRED; connection->pair_status = PAIR_NOT_PAIRED;

View File

@ -50,7 +50,25 @@ void common_hal_bleio_characteristic_construct(bleio_characteristic_obj_t *self,
self->props = props; self->props = props;
self->read_perm = read_perm; self->read_perm = read_perm;
self->write_perm = write_perm; self->write_perm = write_perm;
common_hal_bleio_characteristic_set_value(self, initial_value_bufinfo);
if (initial_value_bufinfo != NULL) {
// Copy the initial value if it's on the heap. Otherwise it's internal and we may not be able
// to allocate.
self->current_value_len = initial_value_bufinfo->len;
if (gc_alloc_possible()) {
if (gc_nbytes(initial_value_bufinfo->buf) > 0) {
uint8_t *initial_value = m_malloc(self->current_value_len);
self->current_value_alloc = self->current_value_len;
memcpy(initial_value, initial_value_bufinfo->buf, self->current_value_len);
self->current_value = initial_value;
} else {
self->current_value_alloc = 0;
self->current_value = initial_value_bufinfo->buf;
}
} else {
self->current_value = initial_value_bufinfo->buf;
}
}
if (gc_alloc_possible()) { if (gc_alloc_possible()) {
self->descriptor_list = mp_obj_new_list(0, NULL); self->descriptor_list = mp_obj_new_list(0, NULL);

View File

@ -63,7 +63,7 @@ int bleio_connection_event_cb(struct ble_gap_event *event, void *connection_in)
connection->pair_status = PAIR_NOT_PAIRED; connection->pair_status = PAIR_NOT_PAIRED;
#if CIRCUITPY_VERBOSE_BLE #if CIRCUITPY_VERBOSE_BLE
mp_printf(&mp_plat_print, "disconnected %02x\n", event->disconnect.reason); mp_printf(&mp_plat_print, "event->disconnect.reason: 0x%x\n", event->disconnect.reason);
#endif #endif
if (connection->connection_obj != mp_const_none) { if (connection->connection_obj != mp_const_none) {
bleio_connection_obj_t *obj = connection->connection_obj; bleio_connection_obj_t *obj = connection->connection_obj;
@ -128,6 +128,7 @@ bool common_hal_bleio_connection_get_connected(bleio_connection_obj_t *self) {
} }
void common_hal_bleio_connection_disconnect(bleio_connection_internal_t *self) { void common_hal_bleio_connection_disconnect(bleio_connection_internal_t *self) {
// Second argument is an HCI reason, not an HS error code.
ble_gap_terminate(self->conn_handle, BLE_ERR_REM_USER_CONN_TERM); ble_gap_terminate(self->conn_handle, BLE_ERR_REM_USER_CONN_TERM);
} }
@ -162,9 +163,9 @@ STATIC int _discovered_service_cb(uint16_t conn_handle,
void *arg) { void *arg) {
bleio_connection_internal_t *self = (bleio_connection_internal_t *)arg; bleio_connection_internal_t *self = (bleio_connection_internal_t *)arg;
if (error->status != BLE_ERR_SUCCESS) { if (error->status != 0) {
// Keep the first error in case it's due to memory. // Keep the first error in case it's due to memory.
if (_last_discovery_status == BLE_ERR_SUCCESS) { if (_last_discovery_status == 0) {
_last_discovery_status = error->status; _last_discovery_status = error->status;
xTaskNotifyGive(discovery_task); xTaskNotifyGive(discovery_task);
} }
@ -173,7 +174,7 @@ STATIC int _discovered_service_cb(uint16_t conn_handle,
// If any of these memory allocations fail, we set _last_discovery_status // If any of these memory allocations fail, we set _last_discovery_status
// and let the process continue. // and let the process continue.
if (_last_discovery_status != BLE_ERR_SUCCESS) { if (_last_discovery_status != 0) {
return 0; return 0;
} }
bleio_service_obj_t *service = mp_obj_malloc(bleio_service_obj_t, &bleio_service_type); bleio_service_obj_t *service = mp_obj_malloc(bleio_service_obj_t, &bleio_service_type);
@ -202,16 +203,17 @@ STATIC int _discovered_characteristic_cb(uint16_t conn_handle,
void *arg) { void *arg) {
bleio_service_obj_t *service = (bleio_service_obj_t *)arg; bleio_service_obj_t *service = (bleio_service_obj_t *)arg;
if (error->status != BLE_ERR_SUCCESS) { if (error->status != 0) {
// Keep the first error in case it's due to memory. // Keep the first error in case it's due to memory.
if (_last_discovery_status == BLE_ERR_SUCCESS) { if (_last_discovery_status == 0) {
_last_discovery_status = error->status; _last_discovery_status = error->status;
xTaskNotifyGive(discovery_task); xTaskNotifyGive(discovery_task);
} }
return 0;
} }
// If any of these memory allocations fail, we set _last_discovery_status // If any of these memory allocations fail, we set _last_discovery_status
// and let the process continue. // and let the process continue.
if (_last_discovery_status != BLE_ERR_SUCCESS) { if (_last_discovery_status != 0) {
return 0; return 0;
} }
@ -232,11 +234,14 @@ STATIC int _discovered_characteristic_cb(uint16_t conn_handle,
((chr->properties & BLE_GATT_CHR_PROP_WRITE_NO_RSP) != 0 ? CHAR_PROP_WRITE_NO_RESPONSE : 0); ((chr->properties & BLE_GATT_CHR_PROP_WRITE_NO_RSP) != 0 ? CHAR_PROP_WRITE_NO_RESPONSE : 0);
// Call common_hal_bleio_characteristic_construct() to initialize some fields and set up evt handler. // Call common_hal_bleio_characteristic_construct() to initialize some fields and set up evt handler.
mp_buffer_info_t mp_const_empty_bytes_bufinfo;
mp_get_buffer_raise(mp_const_empty_bytes, &mp_const_empty_bytes_bufinfo, MP_BUFFER_READ);
common_hal_bleio_characteristic_construct( common_hal_bleio_characteristic_construct(
characteristic, service, chr->val_handle, uuid, characteristic, service, chr->val_handle, uuid,
props, SECURITY_MODE_OPEN, SECURITY_MODE_OPEN, props, SECURITY_MODE_OPEN, SECURITY_MODE_OPEN,
0, false, // max_length, fixed_length: values don't matter for gattc 0, false, // max_length, fixed_length: values don't matter for gattc
mp_const_empty_bytes, &mp_const_empty_bytes_bufinfo,
NULL); NULL);
// Set def_handle directly since it is only used in discovery. // Set def_handle directly since it is only used in discovery.
characteristic->def_handle = chr->def_handle; characteristic->def_handle = chr->def_handle;
@ -253,16 +258,17 @@ STATIC int _discovered_descriptor_cb(uint16_t conn_handle,
void *arg) { void *arg) {
bleio_characteristic_obj_t *characteristic = (bleio_characteristic_obj_t *)arg; bleio_characteristic_obj_t *characteristic = (bleio_characteristic_obj_t *)arg;
if (error->status != BLE_ERR_SUCCESS) { if (error->status != 0) {
// Keep the first error in case it's due to memory. // Keep the first error in case it's due to memory.
if (_last_discovery_status == BLE_ERR_SUCCESS) { if (_last_discovery_status == 0) {
_last_discovery_status = error->status; _last_discovery_status = error->status;
} }
xTaskNotifyGive(discovery_task); xTaskNotifyGive(discovery_task);
return 0;
} }
// If any of these memory allocations fail, we set _last_discovery_status // If any of these memory allocations fail, we set _last_discovery_status
// and let the process continue. // and let the process continue.
if (_last_discovery_status != BLE_ERR_SUCCESS) { if (_last_discovery_status != 0) {
return 0; return 0;
} }
@ -306,7 +312,7 @@ STATIC void discover_remote_services(bleio_connection_internal_t *self, mp_obj_t
discovery_task = xTaskGetCurrentTaskHandle(); discovery_task = xTaskGetCurrentTaskHandle();
if (service_uuids_whitelist == mp_const_none) { if (service_uuids_whitelist == mp_const_none) {
_last_discovery_status = BLE_ERR_SUCCESS; _last_discovery_status = 0;
CHECK_NIMBLE_ERROR(ble_gattc_disc_all_svcs(self->conn_handle, _discovered_service_cb, self)); CHECK_NIMBLE_ERROR(ble_gattc_disc_all_svcs(self->conn_handle, _discovered_service_cb, self));
// Wait for sync. // Wait for sync.
@ -324,7 +330,7 @@ STATIC void discover_remote_services(bleio_connection_internal_t *self, mp_obj_t
} }
bleio_uuid_obj_t *uuid = MP_OBJ_TO_PTR(uuid_obj); bleio_uuid_obj_t *uuid = MP_OBJ_TO_PTR(uuid_obj);
_last_discovery_status = BLE_ERR_SUCCESS; _last_discovery_status = 0;
// Make sure we start with a clean notification state // Make sure we start with a clean notification state
ulTaskNotifyValueClear(discovery_task, 0xffffffff); ulTaskNotifyValueClear(discovery_task, 0xffffffff);
CHECK_NIMBLE_ERROR(ble_gattc_disc_svc_by_uuid(self->conn_handle, &uuid->nimble_ble_uuid.u, CHECK_NIMBLE_ERROR(ble_gattc_disc_svc_by_uuid(self->conn_handle, &uuid->nimble_ble_uuid.u,
@ -340,7 +346,7 @@ STATIC void discover_remote_services(bleio_connection_internal_t *self, mp_obj_t
for (size_t i = 0; i < self->remote_service_list->len; i++) { for (size_t i = 0; i < self->remote_service_list->len; i++) {
bleio_service_obj_t *service = MP_OBJ_TO_PTR(self->remote_service_list->items[i]); bleio_service_obj_t *service = MP_OBJ_TO_PTR(self->remote_service_list->items[i]);
_last_discovery_status = BLE_ERR_SUCCESS; _last_discovery_status = 0;
CHECK_NIMBLE_ERROR(ble_gattc_disc_all_chrs(self->conn_handle, CHECK_NIMBLE_ERROR(ble_gattc_disc_all_chrs(self->conn_handle,
service->start_handle, service->start_handle,
service->end_handle, service->end_handle,
@ -375,7 +381,7 @@ STATIC void discover_remote_services(bleio_connection_internal_t *self, mp_obj_t
continue; continue;
} }
_last_discovery_status = BLE_ERR_SUCCESS; _last_discovery_status = 0;
CHECK_NIMBLE_ERROR(ble_gattc_disc_all_dscs(self->conn_handle, characteristic->handle, CHECK_NIMBLE_ERROR(ble_gattc_disc_all_dscs(self->conn_handle, characteristic->handle,
end_handle, end_handle,
_discovered_descriptor_cb, characteristic)); _discovered_descriptor_cb, characteristic));

View File

@ -112,7 +112,8 @@ void check_nimble_error(int rc, const char *file, size_t line) {
} }
void check_ble_error(int error_code, const char *file, size_t line) { void check_ble_error(int error_code, const char *file, size_t line) {
if (error_code == BLE_ERR_SUCCESS) { // 0 means success. For BLE_HS_* codes, there is no defined "SUCCESS" value.
if (error_code == 0) {
return; return;
} }
switch (error_code) { switch (error_code) {

View File

@ -173,12 +173,15 @@ static const uint64_t pin_mask_reset_forbidden =
GPIO_SEL_23 | GPIO_SEL_23 |
GPIO_SEL_24 | GPIO_SEL_24 |
#endif #endif
#endif // ESP32C6 #endif // ESP32H2
#if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) #if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3)
// Never ever reset pins used to communicate with SPI flash and PSRAM. #if CIRCUITPY_USB
// Never ever reset USB pins.
GPIO_SEL_19 | // USB D- GPIO_SEL_19 | // USB D-
GPIO_SEL_20 | // USB D+ GPIO_SEL_20 | // USB D+
#endif
// Never ever reset pins used to communicate with SPI flash and PSRAM.
#if defined(CONFIG_ESP32_SPIRAM_SUPPORT) || defined(CONFIG_ESP32S2_SPIRAM_SUPPORT) || defined(CONFIG_ESP32S3_SPIRAM_SUPPORT) #if defined(CONFIG_ESP32_SPIRAM_SUPPORT) || defined(CONFIG_ESP32S2_SPIRAM_SUPPORT) || defined(CONFIG_ESP32S3_SPIRAM_SUPPORT)
// Note ESP32-C3 does not have SPIRAM support. // Note ESP32-C3 does not have SPIRAM support.
// Board uses PSRAM, and needs another chip select. // Board uses PSRAM, and needs another chip select.
@ -198,11 +201,6 @@ static const uint64_t pin_mask_reset_forbidden =
GPIO_SEL_36 | // SPIIO7 GPIO_SEL_36 | // SPIIO7
GPIO_SEL_37 | // SPIDQS GPIO_SEL_37 | // SPIDQS
#endif #endif
#if CIRCUITPY_USB
// Never ever reset USB pins.
GPIO_SEL_19 | // USB D-
GPIO_SEL_20 | // USB D+
#endif
#if defined(CONFIG_ESP_CONSOLE_UART_DEFAULT) && CONFIG_ESP_CONSOLE_UART_DEFAULT && CONFIG_ESP_CONSOLE_UART_NUM == 0 #if defined(CONFIG_ESP_CONSOLE_UART_DEFAULT) && CONFIG_ESP_CONSOLE_UART_DEFAULT && CONFIG_ESP_CONSOLE_UART_NUM == 0
// Don't reset/use the IDF UART console. // Don't reset/use the IDF UART console.
GPIO_SEL_43 | // UART TX GPIO_SEL_43 | // UART TX

View File

@ -28,6 +28,9 @@
#ifndef MICROPY_INCLUDED_ESPRESSIF_MPCONFIGPORT_H #ifndef MICROPY_INCLUDED_ESPRESSIF_MPCONFIGPORT_H
#define MICROPY_INCLUDED_ESPRESSIF_MPCONFIGPORT_H #define MICROPY_INCLUDED_ESPRESSIF_MPCONFIGPORT_H
// Enable for debugging.
// #define CIRCUITPY_VERBOSE_BLE (1)
#define MICROPY_NLR_THUMB (0) #define MICROPY_NLR_THUMB (0)
#define MICROPY_USE_INTERNAL_PRINTF (0) #define MICROPY_USE_INTERNAL_PRINTF (0)

View File

@ -54,6 +54,34 @@
#include "genhdr/mpversion.h" #include "genhdr/mpversion.h"
#include "input.h" #include "input.h"
#if defined(MICROPY_UNIX_COVERAGE) // CIRCUITPY-CHANGE
#include "py/objstr.h"
typedef int os_getenv_err_t;
mp_obj_t common_hal_os_getenv(const char *key, mp_obj_t default_);
os_getenv_err_t common_hal_os_getenv_str(const char *key, char *value, size_t value_len);
os_getenv_err_t common_hal_os_getenv_int(const char *key, mp_int_t *value);
STATIC mp_obj_t mod_os_getenv_int(mp_obj_t var_in) {
mp_int_t value;
os_getenv_err_t result = common_hal_os_getenv_int(mp_obj_str_get_str(var_in), &value);
if (result == 0) {
return mp_obj_new_int(value);
}
return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_1(mod_os_getenv_int_obj, mod_os_getenv_int);
STATIC mp_obj_t mod_os_getenv_str(mp_obj_t var_in) {
char buf[4096];
os_getenv_err_t result = common_hal_os_getenv_str(mp_obj_str_get_str(var_in), buf, sizeof(buf));
if (result == 0) {
return mp_obj_new_str_copy(&mp_type_str, (byte *)buf, strlen(buf));
}
return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_1(mod_os_getenv_str_obj, mod_os_getenv_str);
#endif
// Command line options, with their defaults // Command line options, with their defaults
STATIC bool compile_only = false; STATIC bool compile_only = false;
STATIC uint emit_opt = MP_EMIT_OPT_NONE; STATIC uint emit_opt = MP_EMIT_OPT_NONE;
@ -596,6 +624,8 @@ MP_NOINLINE int main_(int argc, char **argv) {
// CIRCUITPY-CHANGE: test native base classes work as needed by CircuitPython libraries. // CIRCUITPY-CHANGE: test native base classes work as needed by CircuitPython libraries.
extern const mp_obj_type_t native_base_class_type; extern const mp_obj_type_t native_base_class_type;
mp_store_global(MP_QSTR_NativeBaseClass, MP_OBJ_FROM_PTR(&native_base_class_type)); mp_store_global(MP_QSTR_NativeBaseClass, MP_OBJ_FROM_PTR(&native_base_class_type));
mp_store_global(MP_QSTR_getenv_int, MP_OBJ_FROM_PTR(&mod_os_getenv_int_obj));
mp_store_global(MP_QSTR_getenv_str, MP_OBJ_FROM_PTR(&mod_os_getenv_str_obj));
} }
#endif #endif

View File

@ -470,7 +470,9 @@ void background_callback_run_all(void);
#error "boot counter requires CIRCUITPY_NVM enabled" #error "boot counter requires CIRCUITPY_NVM enabled"
#endif #endif
#ifndef CIRCUITPY_VERBOSE_BLE
#define CIRCUITPY_VERBOSE_BLE 0 #define CIRCUITPY_VERBOSE_BLE 0
#endif
// Display the Blinka logo in the REPL on displayio displays. // Display the Blinka logo in the REPL on displayio displays.
#ifndef CIRCUITPY_REPL_LOGO #ifndef CIRCUITPY_REPL_LOGO

View File

@ -353,7 +353,8 @@ STATIC mp_obj_t bleio_adapter_start_scan(size_t n_args, const mp_obj_t *pos_args
prefix_bufinfo.len = 0; prefix_bufinfo.len = 0;
if (args[ARG_prefixes].u_obj != MP_OBJ_NULL) { if (args[ARG_prefixes].u_obj != MP_OBJ_NULL) {
mp_get_buffer_raise(args[ARG_prefixes].u_obj, &prefix_bufinfo, MP_BUFFER_READ); mp_get_buffer_raise(args[ARG_prefixes].u_obj, &prefix_bufinfo, MP_BUFFER_READ);
if (gc_nbytes(prefix_bufinfo.buf) == 0) { // An empty buffer may not be on the heap, but that doesn't matter.
if (prefix_bufinfo.len > 0 && gc_nbytes(prefix_bufinfo.buf) == 0) {
mp_raise_ValueError(MP_ERROR_TEXT("Prefix buffer must be on the heap")); mp_raise_ValueError(MP_ERROR_TEXT("Prefix buffer must be on the heap"));
} }
} }

View File

@ -40,11 +40,15 @@ static const mp_arg_t note_properties[] = {
{ MP_QSTR_amplitude, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_ROM_INT(1) } }, { MP_QSTR_amplitude, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_ROM_INT(1) } },
{ MP_QSTR_bend, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_ROM_INT(0) } }, { MP_QSTR_bend, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_ROM_INT(0) } },
{ MP_QSTR_waveform, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_ROM_NONE } }, { MP_QSTR_waveform, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_ROM_NONE } },
{ MP_QSTR_waveform_loop_start, MP_ARG_OBJ, {.u_obj = MP_ROM_INT(0) } },
{ MP_QSTR_waveform_loop_end, MP_ARG_OBJ, {.u_obj = MP_ROM_INT(SYNTHIO_WAVEFORM_SIZE) } },
{ MP_QSTR_envelope, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_ROM_NONE } }, { MP_QSTR_envelope, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_ROM_NONE } },
{ MP_QSTR_filter, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_ROM_NONE } }, { MP_QSTR_filter, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_ROM_NONE } },
{ MP_QSTR_ring_frequency, MP_ARG_OBJ, {.u_obj = MP_ROM_INT(0) } }, { MP_QSTR_ring_frequency, MP_ARG_OBJ, {.u_obj = MP_ROM_INT(0) } },
{ MP_QSTR_ring_bend, MP_ARG_OBJ, {.u_obj = MP_ROM_INT(0) } }, { MP_QSTR_ring_bend, MP_ARG_OBJ, {.u_obj = MP_ROM_INT(0) } },
{ MP_QSTR_ring_waveform, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_ROM_NONE } }, { MP_QSTR_ring_waveform, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_ROM_NONE } },
{ MP_QSTR_ring_waveform_loop_start, MP_ARG_OBJ, {.u_obj = MP_ROM_INT(0) } },
{ MP_QSTR_ring_waveform_loop_end, MP_ARG_OBJ, {.u_obj = MP_ROM_INT(SYNTHIO_WAVEFORM_SIZE) } },
}; };
//| class Note: //| class Note:
//| def __init__( //| def __init__(
@ -53,6 +57,8 @@ static const mp_arg_t note_properties[] = {
//| frequency: float, //| frequency: float,
//| panning: BlockInput = 0.0, //| panning: BlockInput = 0.0,
//| waveform: Optional[ReadableBuffer] = None, //| waveform: Optional[ReadableBuffer] = None,
//| waveform_loop_start: int = 0,
//| waveform_loop_end: int = waveform_max_length,
//| envelope: Optional[Envelope] = None, //| envelope: Optional[Envelope] = None,
//| amplitude: BlockInput = 0.0, //| amplitude: BlockInput = 0.0,
//| bend: BlockInput = 0.0, //| bend: BlockInput = 0.0,
@ -60,6 +66,8 @@ static const mp_arg_t note_properties[] = {
//| ring_frequency: float = 0.0, //| ring_frequency: float = 0.0,
//| ring_bend: float = 0.0, //| ring_bend: float = 0.0,
//| ring_waveform: Optional[ReadableBuffer] = 0.0, //| ring_waveform: Optional[ReadableBuffer] = 0.0,
//| ring_waveform_loop_start: int = 0,
//| ring_waveform_loop_end: int = waveform_max_length,
//| ) -> None: //| ) -> None:
//| """Construct a Note object, with a frequency in Hz, and optional panning, waveform, envelope, tremolo (volume change) and bend (frequency change). //| """Construct a Note object, with a frequency in Hz, and optional panning, waveform, envelope, tremolo (volume change) and bend (frequency change).
//| //|
@ -210,6 +218,53 @@ MP_PROPERTY_GETSET(synthio_note_waveform_obj,
(mp_obj_t)&synthio_note_get_waveform_obj, (mp_obj_t)&synthio_note_get_waveform_obj,
(mp_obj_t)&synthio_note_set_waveform_obj); (mp_obj_t)&synthio_note_set_waveform_obj);
//| waveform_loop_start: int
//| """The sample index of where to begin looping waveform data.
//|
//| Values outside the range ``0`` to ``waveform_max_length-1`` (inclusive) are rejected with a `ValueError`.
//|
//| Values greater than or equal to the actual waveform length are treated as 0."""
STATIC mp_obj_t synthio_note_get_waveform_loop_start(mp_obj_t self_in) {
synthio_note_obj_t *self = MP_OBJ_TO_PTR(self_in);
return mp_obj_new_int(common_hal_synthio_note_get_waveform_loop_start(self));
}
MP_DEFINE_CONST_FUN_OBJ_1(synthio_note_get_waveform_loop_start_obj, synthio_note_get_waveform_loop_start);
STATIC mp_obj_t synthio_note_set_waveform_loop_start(mp_obj_t self_in, mp_obj_t arg) {
synthio_note_obj_t *self = MP_OBJ_TO_PTR(self_in);
common_hal_synthio_note_set_waveform_loop_start(self, mp_obj_get_int(arg));
return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_2(synthio_note_set_waveform_loop_start_obj, synthio_note_set_waveform_loop_start);
MP_PROPERTY_GETSET(synthio_note_waveform_loop_start_obj,
(mp_obj_t)&synthio_note_get_waveform_loop_start_obj,
(mp_obj_t)&synthio_note_set_waveform_loop_start_obj);
//| waveform_loop_end: int
//| """The sample index of where to end looping waveform data.
//|
//| Values outside the range ``1`` to ``waveform_max_length`` (inclusive) are rejected with a `ValueError`.
//|
//| If the value is greater than the actual waveform length, or less than or equal to the loop start, the loop will occur at the end of the waveform.
//|
//| Use the `synthio.waveform_max_length` constant to set the loop point at the end of the wave form, no matter its length."""
//|
STATIC mp_obj_t synthio_note_get_waveform_loop_end(mp_obj_t self_in) {
synthio_note_obj_t *self = MP_OBJ_TO_PTR(self_in);
return mp_obj_new_int(common_hal_synthio_note_get_waveform_loop_end(self));
}
MP_DEFINE_CONST_FUN_OBJ_1(synthio_note_get_waveform_loop_end_obj, synthio_note_get_waveform_loop_end);
STATIC mp_obj_t synthio_note_set_waveform_loop_end(mp_obj_t self_in, mp_obj_t arg) {
synthio_note_obj_t *self = MP_OBJ_TO_PTR(self_in);
common_hal_synthio_note_set_waveform_loop_end(self, mp_obj_get_int(arg));
return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_2(synthio_note_set_waveform_loop_end_obj, synthio_note_set_waveform_loop_end);
MP_PROPERTY_GETSET(synthio_note_waveform_loop_end_obj,
(mp_obj_t)&synthio_note_get_waveform_loop_end_obj,
(mp_obj_t)&synthio_note_set_waveform_loop_end_obj);
//| envelope: Envelope //| envelope: Envelope
//| """The envelope of this note""" //| """The envelope of this note"""
@ -296,6 +351,53 @@ MP_PROPERTY_GETSET(synthio_note_ring_waveform_obj,
(mp_obj_t)&synthio_note_get_ring_waveform_obj, (mp_obj_t)&synthio_note_get_ring_waveform_obj,
(mp_obj_t)&synthio_note_set_ring_waveform_obj); (mp_obj_t)&synthio_note_set_ring_waveform_obj);
//| ring_waveform_loop_start: int
//| """The sample index of where to begin looping waveform data.
//|
//| Values outside the range ``0`` to ``waveform_max_length-1`` (inclusive) are rejected with a `ValueError`.
//|
//| Values greater than or equal to the actual waveform length are treated as 0."""
STATIC mp_obj_t synthio_note_get_ring_waveform_loop_start(mp_obj_t self_in) {
synthio_note_obj_t *self = MP_OBJ_TO_PTR(self_in);
return mp_obj_new_int(common_hal_synthio_note_get_ring_waveform_loop_start(self));
}
MP_DEFINE_CONST_FUN_OBJ_1(synthio_note_get_ring_waveform_loop_start_obj, synthio_note_get_ring_waveform_loop_start);
STATIC mp_obj_t synthio_note_set_ring_waveform_loop_start(mp_obj_t self_in, mp_obj_t arg) {
synthio_note_obj_t *self = MP_OBJ_TO_PTR(self_in);
common_hal_synthio_note_set_ring_waveform_loop_start(self, mp_obj_get_int(arg));
return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_2(synthio_note_set_ring_waveform_loop_start_obj, synthio_note_set_ring_waveform_loop_start);
MP_PROPERTY_GETSET(synthio_note_ring_waveform_loop_start_obj,
(mp_obj_t)&synthio_note_get_ring_waveform_loop_start_obj,
(mp_obj_t)&synthio_note_set_ring_waveform_loop_start_obj);
//| ring_waveform_loop_end: int
//| """The sample index of where to end looping waveform data.
//|
//| Values outside the range ``1`` to ``waveform_max_length`` (inclusive) are rejected with a `ValueError`.
//|
//| If the value is greater than the actual waveform length, or less than or equal to the loop start, the loop will occur at the end of the waveform.
//|
//| Use the `synthio.waveform_max_length` constant to set the loop point at the end of the wave form, no matter its length."""
//|
STATIC mp_obj_t synthio_note_get_ring_waveform_loop_end(mp_obj_t self_in) {
synthio_note_obj_t *self = MP_OBJ_TO_PTR(self_in);
return mp_obj_new_int(common_hal_synthio_note_get_ring_waveform_loop_end(self));
}
MP_DEFINE_CONST_FUN_OBJ_1(synthio_note_get_ring_waveform_loop_end_obj, synthio_note_get_ring_waveform_loop_end);
STATIC mp_obj_t synthio_note_set_ring_waveform_loop_end(mp_obj_t self_in, mp_obj_t arg) {
synthio_note_obj_t *self = MP_OBJ_TO_PTR(self_in);
common_hal_synthio_note_set_ring_waveform_loop_end(self, mp_obj_get_int(arg));
return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_2(synthio_note_set_ring_waveform_loop_end_obj, synthio_note_set_ring_waveform_loop_end);
MP_PROPERTY_GETSET(synthio_note_ring_waveform_loop_end_obj,
(mp_obj_t)&synthio_note_get_ring_waveform_loop_end_obj,
(mp_obj_t)&synthio_note_set_ring_waveform_loop_end_obj);
static void note_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { static void note_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
@ -308,12 +410,16 @@ STATIC const mp_rom_map_elem_t synthio_note_locals_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_filter), MP_ROM_PTR(&synthio_note_filter_obj) }, { MP_ROM_QSTR(MP_QSTR_filter), MP_ROM_PTR(&synthio_note_filter_obj) },
{ MP_ROM_QSTR(MP_QSTR_panning), MP_ROM_PTR(&synthio_note_panning_obj) }, { MP_ROM_QSTR(MP_QSTR_panning), MP_ROM_PTR(&synthio_note_panning_obj) },
{ MP_ROM_QSTR(MP_QSTR_waveform), MP_ROM_PTR(&synthio_note_waveform_obj) }, { MP_ROM_QSTR(MP_QSTR_waveform), MP_ROM_PTR(&synthio_note_waveform_obj) },
{ MP_ROM_QSTR(MP_QSTR_waveform_loop_start), MP_ROM_PTR(&synthio_note_waveform_loop_start_obj) },
{ MP_ROM_QSTR(MP_QSTR_waveform_loop_end), MP_ROM_PTR(&synthio_note_waveform_loop_end_obj) },
{ MP_ROM_QSTR(MP_QSTR_envelope), MP_ROM_PTR(&synthio_note_envelope_obj) }, { MP_ROM_QSTR(MP_QSTR_envelope), MP_ROM_PTR(&synthio_note_envelope_obj) },
{ MP_ROM_QSTR(MP_QSTR_amplitude), MP_ROM_PTR(&synthio_note_amplitude_obj) }, { MP_ROM_QSTR(MP_QSTR_amplitude), MP_ROM_PTR(&synthio_note_amplitude_obj) },
{ MP_ROM_QSTR(MP_QSTR_bend), MP_ROM_PTR(&synthio_note_bend_obj) }, { MP_ROM_QSTR(MP_QSTR_bend), MP_ROM_PTR(&synthio_note_bend_obj) },
{ MP_ROM_QSTR(MP_QSTR_ring_frequency), MP_ROM_PTR(&synthio_note_ring_frequency_obj) }, { MP_ROM_QSTR(MP_QSTR_ring_frequency), MP_ROM_PTR(&synthio_note_ring_frequency_obj) },
{ MP_ROM_QSTR(MP_QSTR_ring_bend), MP_ROM_PTR(&synthio_note_ring_bend_obj) }, { MP_ROM_QSTR(MP_QSTR_ring_bend), MP_ROM_PTR(&synthio_note_ring_bend_obj) },
{ MP_ROM_QSTR(MP_QSTR_ring_waveform), MP_ROM_PTR(&synthio_note_ring_waveform_obj) }, { MP_ROM_QSTR(MP_QSTR_ring_waveform), MP_ROM_PTR(&synthio_note_ring_waveform_obj) },
{ MP_ROM_QSTR(MP_QSTR_ring_waveform_loop_start), MP_ROM_PTR(&synthio_note_ring_waveform_loop_start_obj) },
{ MP_ROM_QSTR(MP_QSTR_ring_waveform_loop_end), MP_ROM_PTR(&synthio_note_ring_waveform_loop_end_obj) },
}; };
STATIC MP_DEFINE_CONST_DICT(synthio_note_locals_dict, synthio_note_locals_dict_table); STATIC MP_DEFINE_CONST_DICT(synthio_note_locals_dict, synthio_note_locals_dict_table);

View File

@ -24,6 +24,12 @@ void common_hal_synthio_note_set_bend(synthio_note_obj_t *self, mp_obj_t value);
mp_obj_t common_hal_synthio_note_get_waveform_obj(synthio_note_obj_t *self); mp_obj_t common_hal_synthio_note_get_waveform_obj(synthio_note_obj_t *self);
void common_hal_synthio_note_set_waveform(synthio_note_obj_t *self, mp_obj_t value); void common_hal_synthio_note_set_waveform(synthio_note_obj_t *self, mp_obj_t value);
mp_int_t common_hal_synthio_note_get_waveform_loop_start(synthio_note_obj_t *self);
void common_hal_synthio_note_set_waveform_loop_start(synthio_note_obj_t *self, mp_int_t value_in);
mp_int_t common_hal_synthio_note_get_waveform_loop_end(synthio_note_obj_t *self);
void common_hal_synthio_note_set_waveform_loop_end(synthio_note_obj_t *self, mp_int_t value_in);
mp_float_t common_hal_synthio_note_get_ring_frequency(synthio_note_obj_t *self); mp_float_t common_hal_synthio_note_get_ring_frequency(synthio_note_obj_t *self);
void common_hal_synthio_note_set_ring_frequency(synthio_note_obj_t *self, mp_float_t value); void common_hal_synthio_note_set_ring_frequency(synthio_note_obj_t *self, mp_float_t value);
@ -33,5 +39,11 @@ void common_hal_synthio_note_set_ring_bend(synthio_note_obj_t *self, mp_obj_t va
mp_obj_t common_hal_synthio_note_get_ring_waveform_obj(synthio_note_obj_t *self); mp_obj_t common_hal_synthio_note_get_ring_waveform_obj(synthio_note_obj_t *self);
void common_hal_synthio_note_set_ring_waveform(synthio_note_obj_t *self, mp_obj_t value); void common_hal_synthio_note_set_ring_waveform(synthio_note_obj_t *self, mp_obj_t value);
mp_int_t common_hal_synthio_note_get_ring_waveform_loop_start(synthio_note_obj_t *self);
void common_hal_synthio_note_set_ring_waveform_loop_start(synthio_note_obj_t *self, mp_int_t value_in);
mp_int_t common_hal_synthio_note_get_ring_waveform_loop_end(synthio_note_obj_t *self);
void common_hal_synthio_note_set_ring_waveform_loop_end(synthio_note_obj_t *self, mp_int_t value_in);
mp_obj_t common_hal_synthio_note_get_envelope_obj(synthio_note_obj_t *self); mp_obj_t common_hal_synthio_note_get_envelope_obj(synthio_note_obj_t *self);
void common_hal_synthio_note_set_envelope(synthio_note_obj_t *self, mp_obj_t value); void common_hal_synthio_note_set_envelope(synthio_note_obj_t *self, mp_obj_t value);

View File

@ -304,6 +304,11 @@ STATIC mp_obj_t voct_to_hz(mp_obj_t arg) {
} }
MP_DEFINE_CONST_FUN_OBJ_1(synthio_voct_to_hz_obj, voct_to_hz); MP_DEFINE_CONST_FUN_OBJ_1(synthio_voct_to_hz_obj, voct_to_hz);
//|
//| waveform_max_length: int
//| """The maximum number of samples permitted in a waveform"""
//|
#if CIRCUITPY_AUDIOCORE_DEBUG #if CIRCUITPY_AUDIOCORE_DEBUG
STATIC mp_obj_t synthio_lfo_tick(size_t n, const mp_obj_t *args) { STATIC mp_obj_t synthio_lfo_tick(size_t n, const mp_obj_t *args) {
shared_bindings_synthio_lfo_tick(48000); shared_bindings_synthio_lfo_tick(48000);
@ -333,6 +338,7 @@ STATIC const mp_rom_map_elem_t synthio_module_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR_Envelope), MP_ROM_PTR(&synthio_envelope_type_obj) }, { MP_ROM_QSTR(MP_QSTR_Envelope), MP_ROM_PTR(&synthio_envelope_type_obj) },
{ MP_ROM_QSTR(MP_QSTR_midi_to_hz), MP_ROM_PTR(&synthio_midi_to_hz_obj) }, { MP_ROM_QSTR(MP_QSTR_midi_to_hz), MP_ROM_PTR(&synthio_midi_to_hz_obj) },
{ MP_ROM_QSTR(MP_QSTR_voct_to_hz), MP_ROM_PTR(&synthio_voct_to_hz_obj) }, { MP_ROM_QSTR(MP_QSTR_voct_to_hz), MP_ROM_PTR(&synthio_voct_to_hz_obj) },
{ MP_ROM_QSTR(MP_QSTR_waveform_max_length), MP_ROM_INT(SYNTHIO_WAVEFORM_SIZE) },
#if CIRCUITPY_AUDIOCORE_DEBUG #if CIRCUITPY_AUDIOCORE_DEBUG
{ MP_ROM_QSTR(MP_QSTR_lfo_tick), MP_ROM_PTR(&synthio_lfo_tick_obj) }, { MP_ROM_QSTR(MP_QSTR_lfo_tick), MP_ROM_PTR(&synthio_lfo_tick_obj) },
#endif #endif

View File

@ -29,6 +29,8 @@
#include "py/objnamedtuple.h" #include "py/objnamedtuple.h"
#include "py/enum.h" #include "py/enum.h"
#define SYNTHIO_WAVEFORM_SIZE 16384
typedef enum { typedef enum {
SYNTHIO_ENVELOPE_STATE_ATTACK, SYNTHIO_ENVELOPE_STATE_DECAY, SYNTHIO_ENVELOPE_STATE_ATTACK, SYNTHIO_ENVELOPE_STATE_DECAY,
SYNTHIO_ENVELOPE_STATE_SUSTAIN, SYNTHIO_ENVELOPE_STATE_RELEASE SYNTHIO_ENVELOPE_STATE_SUSTAIN, SYNTHIO_ENVELOPE_STATE_RELEASE

View File

@ -120,6 +120,24 @@ void common_hal_synthio_note_set_waveform(synthio_note_obj_t *self, mp_obj_t wav
self->waveform_obj = waveform_in; self->waveform_obj = waveform_in;
} }
mp_int_t common_hal_synthio_note_get_waveform_loop_start(synthio_note_obj_t *self) {
return self->waveform_loop_start;
}
void common_hal_synthio_note_set_waveform_loop_start(synthio_note_obj_t *self, mp_int_t value_in) {
mp_int_t val = mp_arg_validate_int_range(value_in, 0, SYNTHIO_WAVEFORM_SIZE - 1, MP_QSTR_waveform_loop_start);
self->waveform_loop_start = val;
}
mp_int_t common_hal_synthio_note_get_waveform_loop_end(synthio_note_obj_t *self) {
return self->waveform_loop_end;
}
void common_hal_synthio_note_set_waveform_loop_end(synthio_note_obj_t *self, mp_int_t value_in) {
mp_int_t val = mp_arg_validate_int_range(value_in, 1, SYNTHIO_WAVEFORM_SIZE, MP_QSTR_waveform_loop_end);
self->waveform_loop_end = val;
}
mp_obj_t common_hal_synthio_note_get_ring_waveform_obj(synthio_note_obj_t *self) { mp_obj_t common_hal_synthio_note_get_ring_waveform_obj(synthio_note_obj_t *self) {
return self->ring_waveform_obj; return self->ring_waveform_obj;
} }
@ -135,6 +153,24 @@ void common_hal_synthio_note_set_ring_waveform(synthio_note_obj_t *self, mp_obj_
self->ring_waveform_obj = ring_waveform_in; self->ring_waveform_obj = ring_waveform_in;
} }
mp_int_t common_hal_synthio_note_get_ring_waveform_loop_start(synthio_note_obj_t *self) {
return self->ring_waveform_loop_start;
}
void common_hal_synthio_note_set_ring_waveform_loop_start(synthio_note_obj_t *self, mp_int_t value_in) {
mp_int_t val = mp_arg_validate_int_range(value_in, 0, SYNTHIO_WAVEFORM_SIZE - 1, MP_QSTR_ring_waveform_loop_start);
self->ring_waveform_loop_start = val;
}
mp_int_t common_hal_synthio_note_get_ring_waveform_loop_end(synthio_note_obj_t *self) {
return self->ring_waveform_loop_end;
}
void common_hal_synthio_note_set_ring_waveform_loop_end(synthio_note_obj_t *self, mp_int_t value_in) {
mp_int_t val = mp_arg_validate_int_range(value_in, 1, SYNTHIO_WAVEFORM_SIZE, MP_QSTR_ring_waveform_loop_end);
self->ring_waveform_loop_end = val;
}
void synthio_note_recalculate(synthio_note_obj_t *self, int32_t sample_rate) { void synthio_note_recalculate(synthio_note_obj_t *self, int32_t sample_rate) {
if (sample_rate == self->sample_rate) { if (sample_rate == self->sample_rate) {
return; return;
@ -178,7 +214,7 @@ STATIC uint32_t pitch_bend(uint32_t frequency_scaled, int32_t bend_value) {
#define ONE MICROPY_FLOAT_CONST(1.) #define ONE MICROPY_FLOAT_CONST(1.)
#define ALMOST_ONE (MICROPY_FLOAT_CONST(32767.) / 32768) #define ALMOST_ONE (MICROPY_FLOAT_CONST(32767.) / 32768)
uint32_t synthio_note_step(synthio_note_obj_t *self, int32_t sample_rate, int16_t dur, uint16_t loudness[2]) { uint32_t synthio_note_step(synthio_note_obj_t *self, int32_t sample_rate, int16_t dur, int16_t loudness[2]) {
int panning = synthio_block_slot_get_scaled(&self->panning, -ALMOST_ONE, ALMOST_ONE); int panning = synthio_block_slot_get_scaled(&self->panning, -ALMOST_ONE, ALMOST_ONE);
int left_panning_scaled, right_panning_scaled; int left_panning_scaled, right_panning_scaled;
if (panning >= 0) { if (panning >= 0) {
@ -189,7 +225,7 @@ uint32_t synthio_note_step(synthio_note_obj_t *self, int32_t sample_rate, int16_
left_panning_scaled = 32767 + panning; left_panning_scaled = 32767 + panning;
} }
int amplitude = synthio_block_slot_get_scaled(&self->amplitude, ZERO, ALMOST_ONE); int amplitude = synthio_block_slot_get_scaled(&self->amplitude, -ALMOST_ONE, ALMOST_ONE);
left_panning_scaled = (left_panning_scaled * amplitude) >> 15; left_panning_scaled = (left_panning_scaled * amplitude) >> 15;
right_panning_scaled = (right_panning_scaled * amplitude) >> 15; right_panning_scaled = (right_panning_scaled * amplitude) >> 15;
loudness[0] = (loudness[0] * left_panning_scaled) >> 15; loudness[0] = (loudness[0] * left_panning_scaled) >> 15;

View File

@ -48,11 +48,13 @@ typedef struct synthio_note_obj {
int32_t ring_frequency_scaled, ring_frequency_bent; int32_t ring_frequency_scaled, ring_frequency_bent;
mp_buffer_info_t waveform_buf; mp_buffer_info_t waveform_buf;
uint32_t waveform_loop_start, waveform_loop_end;
mp_buffer_info_t ring_waveform_buf; mp_buffer_info_t ring_waveform_buf;
uint32_t ring_waveform_loop_start, ring_waveform_loop_end;
synthio_envelope_definition_t envelope_def; synthio_envelope_definition_t envelope_def;
} synthio_note_obj_t; } synthio_note_obj_t;
void synthio_note_recalculate(synthio_note_obj_t *self, int32_t sample_rate); void synthio_note_recalculate(synthio_note_obj_t *self, int32_t sample_rate);
uint32_t synthio_note_step(synthio_note_obj_t *self, int32_t sample_rate, int16_t dur, uint16_t loudness[2]); uint32_t synthio_note_step(synthio_note_obj_t *self, int32_t sample_rate, int16_t dur, int16_t loudness[2]);
void synthio_note_start(synthio_note_obj_t *self, int32_t sample_rate); void synthio_note_start(synthio_note_obj_t *self, int32_t sample_rate);
bool synthio_note_playing(synthio_note_obj_t *self); bool synthio_note_playing(synthio_note_obj_t *self);

View File

@ -172,7 +172,7 @@ int16_t mix_down_sample(int32_t sample) {
return sample; return sample;
} }
static bool synth_note_into_buffer(synthio_synth_t *synth, int chan, int32_t *out_buffer32, int16_t dur, uint16_t loudness[2]) { static bool synth_note_into_buffer(synthio_synth_t *synth, int chan, int32_t *out_buffer32, int16_t dur, int16_t loudness[2]) {
mp_obj_t note_obj = synth->span.note_obj[chan]; mp_obj_t note_obj = synth->span.note_obj[chan];
int32_t sample_rate = synth->sample_rate; int32_t sample_rate = synth->sample_rate;
@ -180,10 +180,12 @@ static bool synth_note_into_buffer(synthio_synth_t *synth, int chan, int32_t *ou
uint32_t dds_rate; uint32_t dds_rate;
const int16_t *waveform = synth->waveform_bufinfo.buf; const int16_t *waveform = synth->waveform_bufinfo.buf;
uint32_t waveform_start = 0;
uint32_t waveform_length = synth->waveform_bufinfo.len; uint32_t waveform_length = synth->waveform_bufinfo.len;
uint32_t ring_dds_rate = 0; uint32_t ring_dds_rate = 0;
const int16_t *ring_waveform = NULL; const int16_t *ring_waveform = NULL;
uint32_t ring_waveform_start = 0;
uint32_t ring_waveform_length = 0; uint32_t ring_waveform_length = 0;
if (mp_obj_is_small_int(note_obj)) { if (mp_obj_is_small_int(note_obj)) {
@ -202,12 +204,24 @@ static bool synth_note_into_buffer(synthio_synth_t *synth, int chan, int32_t *ou
if (note->waveform_buf.buf) { if (note->waveform_buf.buf) {
waveform = note->waveform_buf.buf; waveform = note->waveform_buf.buf;
waveform_length = note->waveform_buf.len; waveform_length = note->waveform_buf.len;
if (note->waveform_loop_start > 0 && note->waveform_loop_start < waveform_length) {
waveform_start = note->waveform_loop_start;
}
if (note->waveform_loop_end > waveform_start && note->waveform_loop_end < waveform_length) {
waveform_length = note->waveform_loop_end;
}
} }
dds_rate = synthio_frequency_convert_scaled_to_dds((uint64_t)frequency_scaled * waveform_length, sample_rate); dds_rate = synthio_frequency_convert_scaled_to_dds((uint64_t)frequency_scaled * (waveform_length - waveform_start), sample_rate);
if (note->ring_frequency_scaled != 0 && note->ring_waveform_buf.buf) { if (note->ring_frequency_scaled != 0 && note->ring_waveform_buf.buf) {
ring_waveform = note->ring_waveform_buf.buf; ring_waveform = note->ring_waveform_buf.buf;
ring_waveform_length = note->ring_waveform_buf.len; ring_waveform_length = note->ring_waveform_buf.len;
ring_dds_rate = synthio_frequency_convert_scaled_to_dds((uint64_t)note->ring_frequency_bent * ring_waveform_length, sample_rate); if (note->ring_waveform_loop_start > 0 && note->ring_waveform_loop_start < ring_waveform_length) {
ring_waveform_start = note->waveform_loop_start;
}
if (note->ring_waveform_loop_end > ring_waveform_start && note->ring_waveform_loop_end < ring_waveform_length) {
ring_waveform_length = note->ring_waveform_loop_end;
}
ring_dds_rate = synthio_frequency_convert_scaled_to_dds((uint64_t)note->ring_frequency_bent * (ring_waveform_length - ring_waveform_start), sample_rate);
uint32_t lim = ring_waveform_length << SYNTHIO_FREQUENCY_SHIFT; uint32_t lim = ring_waveform_length << SYNTHIO_FREQUENCY_SHIFT;
if (ring_dds_rate > lim / sizeof(int16_t)) { if (ring_dds_rate > lim / sizeof(int16_t)) {
ring_dds_rate = 0; // can't ring at that frequency ring_dds_rate = 0; // can't ring at that frequency
@ -215,6 +229,7 @@ static bool synth_note_into_buffer(synthio_synth_t *synth, int chan, int32_t *ou
} }
} }
uint32_t offset = waveform_start << SYNTHIO_FREQUENCY_SHIFT;
uint32_t lim = waveform_length << SYNTHIO_FREQUENCY_SHIFT; uint32_t lim = waveform_length << SYNTHIO_FREQUENCY_SHIFT;
uint32_t accum = synth->accum[chan]; uint32_t accum = synth->accum[chan];
@ -225,7 +240,7 @@ static bool synth_note_into_buffer(synthio_synth_t *synth, int chan, int32_t *ou
// can happen if note waveform gets set mid-note, but the expensive modulo is usually avoided // can happen if note waveform gets set mid-note, but the expensive modulo is usually avoided
if (accum > lim) { if (accum > lim) {
accum %= lim; accum = accum % lim + offset;
} }
// first, fill with waveform // first, fill with waveform
@ -233,7 +248,7 @@ static bool synth_note_into_buffer(synthio_synth_t *synth, int chan, int32_t *ou
accum += dds_rate; accum += dds_rate;
// because dds_rate is low enough, the subtraction is guaranteed to go back into range, no expensive modulo needed // because dds_rate is low enough, the subtraction is guaranteed to go back into range, no expensive modulo needed
if (accum > lim) { if (accum > lim) {
accum -= lim; accum = accum - lim + offset;
} }
int16_t idx = accum >> SYNTHIO_FREQUENCY_SHIFT; int16_t idx = accum >> SYNTHIO_FREQUENCY_SHIFT;
out_buffer32[i] = waveform[idx]; out_buffer32[i] = waveform[idx];
@ -249,18 +264,19 @@ static bool synth_note_into_buffer(synthio_synth_t *synth, int chan, int32_t *ou
// now modulate by ring and accumulate // now modulate by ring and accumulate
accum = synth->ring_accum[chan]; accum = synth->ring_accum[chan];
offset = ring_waveform_start << SYNTHIO_FREQUENCY_SHIFT;
lim = ring_waveform_length << SYNTHIO_FREQUENCY_SHIFT; lim = ring_waveform_length << SYNTHIO_FREQUENCY_SHIFT;
// can happen if note waveform gets set mid-note, but the expensive modulo is usually avoided // can happen if note waveform gets set mid-note, but the expensive modulo is usually avoided
if (accum > lim) { if (accum > lim) {
accum %= lim; accum = accum % lim + offset;
} }
for (uint16_t i = 0; i < dur; i++) { for (uint16_t i = 0; i < dur; i++) {
accum += ring_dds_rate; accum += ring_dds_rate;
// because dds_rate is low enough, the subtraction is guaranteed to go back into range, no expensive modulo needed // because dds_rate is low enough, the subtraction is guaranteed to go back into range, no expensive modulo needed
if (accum > lim) { if (accum > lim) {
accum -= lim; accum = accum - lim + offset;
} }
int16_t idx = accum >> SYNTHIO_FREQUENCY_SHIFT; int16_t idx = accum >> SYNTHIO_FREQUENCY_SHIFT;
int16_t wi = (ring_waveform[idx] * out_buffer32[i]) / 32768; int16_t wi = (ring_waveform[idx] * out_buffer32[i]) / 32768;
@ -282,7 +298,7 @@ STATIC mp_obj_t synthio_synth_get_note_filter(mp_obj_t note_obj) {
return mp_const_none; return mp_const_none;
} }
STATIC void sum_with_loudness(int32_t *out_buffer32, int32_t *tmp_buffer32, uint16_t loudness[2], size_t dur, int synth_chan) { STATIC void sum_with_loudness(int32_t *out_buffer32, int32_t *tmp_buffer32, int16_t loudness[2], size_t dur, int synth_chan) {
if (synth_chan == 1) { if (synth_chan == 1) {
for (size_t i = 0; i < dur; i++) { for (size_t i = 0; i < dur; i++) {
*out_buffer32++ += (*tmp_buffer32++ *loudness[0]) >> 16; *out_buffer32++ += (*tmp_buffer32++ *loudness[0]) >> 16;
@ -328,7 +344,7 @@ void synthio_synth_synthesize(synthio_synth_t *synth, uint8_t **bufptr, uint32_t
continue; continue;
} }
uint16_t loudness[2] = {synth->envelope_state[chan].level, synth->envelope_state[chan].level}; int16_t loudness[2] = {synth->envelope_state[chan].level, synth->envelope_state[chan].level};
if (!synth_note_into_buffer(synth, chan, tmp_buffer32, dur, loudness)) { if (!synth_note_into_buffer(synth, chan, tmp_buffer32, dur, loudness)) {
// for some other reason, such as being above nyquist, note // for some other reason, such as being above nyquist, note
@ -434,7 +450,7 @@ STATIC void parse_common(mp_buffer_info_t *bufinfo, mp_obj_t o, int16_t what, mp
void synthio_synth_parse_waveform(mp_buffer_info_t *bufinfo_waveform, mp_obj_t waveform_obj) { void synthio_synth_parse_waveform(mp_buffer_info_t *bufinfo_waveform, mp_obj_t waveform_obj) {
*bufinfo_waveform = ((mp_buffer_info_t) { .buf = (void *)square_wave, .len = 2 }); *bufinfo_waveform = ((mp_buffer_info_t) { .buf = (void *)square_wave, .len = 2 });
parse_common(bufinfo_waveform, waveform_obj, MP_QSTR_waveform, 16384); parse_common(bufinfo_waveform, waveform_obj, MP_QSTR_waveform, SYNTHIO_WAVEFORM_SIZE);
} }
STATIC int find_channel_with_note(synthio_synth_t *synth, mp_obj_t note) { STATIC int find_channel_with_note(synthio_synth_t *synth, mp_obj_t note) {

View File

@ -82,7 +82,7 @@ for i in range(13):
run_test(f"key{i}", content_good) run_test(f"key{i}", content_good)
run_test(f"K", b"K = 7\r\n") run_test(f"K", b"K = 7\r\n")
print(os.getenv_int("K")) print(getenv_int("K"))
# Test value without trailing newline # Test value without trailing newline
run_test(f"noeol", b"noeol=3") run_test(f"noeol", b"noeol=3")

View File

@ -122,7 +122,7 @@
0.6026482747395835 -1.794703450520833 0.1920551757812494 -5.397351725260417 0.6026482747395835 -1.794703450520833 0.1920551757812494 -5.397351725260417
0.6239809570312501 -1.7520380859375 0.1280571289062498 -5.37601904296875 0.6239809570312501 -1.7520380859375 0.1280571289062498 -5.37601904296875
0.6453136393229166 -1.709372721354167 0.0640590820312501 -5.354686360677084 0.6453136393229166 -1.709372721354167 0.0640590820312501 -5.354686360677084
0.6666463216145831 -1.666707356770834 6.103515625044409e-05 -5.333353678385417 0.6666463216145831 -1.666707356770834 6.103515625044408e-05 -5.333353678385417
0.6879790039062498 -1.6240419921875 -0.06393701171874921 -5.31202099609375 0.6879790039062498 -1.6240419921875 -0.06393701171874921 -5.31202099609375
0.7093116861979163 -1.581376627604167 -0.1279350585937489 -5.290688313802084 0.7093116861979163 -1.581376627604167 -0.1279350585937489 -5.290688313802084
0.7306443684895827 -1.538711263020835 -0.1919331054687481 -5.269355631510417 0.7306443684895827 -1.538711263020835 -0.1919331054687481 -5.269355631510417

View File

@ -3,8 +3,8 @@ from synthnotehelper import *
@synth_test @synth_test
def gen(synth): def gen(synth):
l = LFO(bend_out, offset=0.2, scale=0.8, rate=4, once=True) l = LFO(sine, offset=0.2, scale=0.8, rate=2)
yield [l] yield [l]
n = Note(128, amplitude=l) n = Note(8, amplitude=l)
synth.press(n) synth.press(n)
yield 1 / 4 yield 2

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,10 @@
() ()
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
(Note(frequency=830.6076004423605, panning=0.0, amplitude=1.0, bend=0.0, waveform=None, envelope=None, filter=None, ring_frequency=0.0, ring_bend=0.0, ring_waveform=None),) (Note(frequency=830.6076004423605, panning=0.0, amplitude=1.0, bend=0.0, waveform=None, waveform_loop_start=0, waveform_loop_end=16384, envelope=None, filter=None, ring_frequency=0.0, ring_bend=0.0, ring_waveform=None, ring_waveform_loop_start=0, ring_waveform_loop_end=16384),)
[-16383, -16383, -16383, -16383, 16382, 16382, 16382, 16382, 16382, -16383, -16383, -16383, -16383, -16383, 16382, 16382, 16382, 16382, 16382, -16383, -16383, -16383, -16383, -16383] [-16383, -16383, -16383, -16383, 16382, 16382, 16382, 16382, 16382, -16383, -16383, -16383, -16383, -16383, 16382, 16382, 16382, 16382, 16382, -16383, -16383, -16383, -16383, -16383]
(Note(frequency=830.6076004423605, panning=0.0, amplitude=1.0, bend=0.0, waveform=None, envelope=None, filter=None, ring_frequency=0.0, ring_bend=0.0, ring_waveform=None), Note(frequency=830.6076004423605, panning=0.0, amplitude=1.0, bend=0.0, waveform=None, envelope=None, filter=None, ring_frequency=0.0, ring_bend=0.0, ring_waveform=None)) (Note(frequency=830.6076004423605, panning=0.0, amplitude=1.0, bend=0.0, waveform=None, waveform_loop_start=0, waveform_loop_end=16384, envelope=None, filter=None, ring_frequency=0.0, ring_bend=0.0, ring_waveform=None, ring_waveform_loop_start=0, ring_waveform_loop_end=16384), Note(frequency=830.6076004423605, panning=0.0, amplitude=1.0, bend=0.0, waveform=None, waveform_loop_start=0, waveform_loop_end=16384, envelope=None, filter=None, ring_frequency=0.0, ring_bend=0.0, ring_waveform=None, ring_waveform_loop_start=0, ring_waveform_loop_end=16384))
[-1, -1, -1, -1, -1, -1, -1, -1, 28045, -1, -1, -1, -1, -28046, -1, -1, -1, -1, 28045, -1, -1, -1, -1, -28046] [-1, -1, -1, -1, -1, -1, -1, -1, 28045, -1, -1, -1, -1, -28046, -1, -1, -1, -1, 28045, -1, -1, -1, -1, -28046]
(Note(frequency=830.6076004423605, panning=0.0, amplitude=1.0, bend=0.0, waveform=None, envelope=None, filter=None, ring_frequency=0.0, ring_bend=0.0, ring_waveform=None),) (Note(frequency=830.6076004423605, panning=0.0, amplitude=1.0, bend=0.0, waveform=None, waveform_loop_start=0, waveform_loop_end=16384, envelope=None, filter=None, ring_frequency=0.0, ring_bend=0.0, ring_waveform=None, ring_waveform_loop_start=0, ring_waveform_loop_end=16384),)
[-1, -1, -1, 28045, -1, -1, -1, -1, -1, -1, -1, -1, 28045, -1, -1, -1, -1, -28046, -1, -1, -1, -1, 28045, -1] [-1, -1, -1, 28045, -1, -1, -1, -1, -1, -1, -1, -1, 28045, -1, -1, -1, -1, -28046, -1, -1, -1, -1, 28045, -1]
(-5242, 5241) (-5242, 5241)
(-10485, 10484) (-10485, 10484)

View File

@ -72,29 +72,29 @@
0.3786666666666667 0.9999389657750726 0.07999755859375251 1.423014179150163 0.0 0.8399743652343719 0.999969482421875 0.9599999999999987 0.3942279687500003 0.9199999999999985 0.9199999999999985 0.3786666666666667 0.9999389657750726 0.07999755859375251 1.423014179150163 0.0 0.8399743652343719 0.999969482421875 0.9599999999999987 0.3942279687500003 0.9199999999999985 0.9199999999999985
0.384 0.9999389657750726 0.05333170572916924 1.42187647081577 0.0 0.8933060709635384 0.999969482421875 0.973333333333332 0.3945124045138892 0.9466666666666651 0.9466666666666651 0.384 0.9999389657750726 0.05333170572916924 1.42187647081577 0.0 0.8933060709635384 0.999969482421875 0.973333333333332 0.3945124045138892 0.9466666666666651 0.9466666666666651
0.3893333333333333 0.9999389657750726 0.02666585286458595 1.421307616648573 0.0 0.9466377766927051 0.999969482421875 0.9866666666666653 0.3946546223958336 0.9733333333333317 0.9733333333333317 0.3893333333333333 0.9999389657750726 0.02666585286458595 1.421307616648573 0.0 0.9466377766927051 0.999969482421875 0.9866666666666653 0.3946546223958336 0.9733333333333317 0.9733333333333317
0.3946666666666667 0.9999389657750726 6.103329360485077e-05 1.421306314644712 0.0 0.9999694824218716 0.999969482421875 0.999969482421875 0.3946549479067329 0.999999999999998 0.999999999999998 0.3946666666666667 0.9999389657750726 6.103329360485076e-05 1.421306314644712 0.0 0.9999694824218716 0.999969482421875 0.999969482421875 0.3946549479067329 0.9999999999999984 0.9999999999999984
0.4 0.9999389657750726 6.103329360485077e-05 1.42130501264085 0.999969482421875 0.9466377766927115 0.999969482421875 0.999969482421875 0.3946552734176321 0.02666666666666506 0.02666666666666506 0.4 0.9999389657750726 6.103329360485076e-05 1.42130501264085 0.999969482421875 0.9466377766927115 0.999969482421875 0.999969482421875 0.3946552734176321 0.02666666666666506 0.02666666666666506
0.4053333333333333 0.9999389657750726 6.103329360485077e-05 1.421303710636988 0.999969482421875 0.8933060709635448 0.999969482421875 0.999969482421875 0.3946555989285314 0.05333333333333172 0.05333333333333172 0.4053333333333333 0.9999389657750726 6.103329360485076e-05 1.421303710636988 0.999969482421875 0.8933060709635448 0.999969482421875 0.999969482421875 0.3946555989285314 0.05333333333333172 0.05333333333333172
0.4106666666666666 0.9999389657750726 6.103329360485077e-05 1.421302408633126 0.999969482421875 0.8399743652343782 0.999969482421875 0.999969482421875 0.3946559244394306 0.07999999999999839 0.07999999999999839 0.4106666666666666 0.9999389657750726 6.103329360485076e-05 1.421302408633126 0.999969482421875 0.8399743652343782 0.999969482421875 0.999969482421875 0.3946559244394306 0.07999999999999839 0.07999999999999839
0.416 0.9999389657750726 6.103329360485077e-05 1.421301106629265 0.999969482421875 0.7866426595052117 0.999969482421875 0.999969482421875 0.3946562499503298 0.106666666666665 0.106666666666665 0.416 0.9999389657750726 6.103329360485076e-05 1.421301106629265 0.999969482421875 0.7866426595052117 0.999969482421875 0.999969482421875 0.3946562499503298 0.106666666666665 0.106666666666665
0.4213333333333333 0.9999389657750726 6.103329360485077e-05 1.421299804625403 0.999969482421875 0.7333109537760448 0.999969482421875 0.999969482421875 0.3946565754612291 0.1333333333333317 0.1333333333333317 0.4213333333333333 0.9999389657750726 6.103329360485076e-05 1.421299804625403 0.999969482421875 0.7333109537760448 0.999969482421875 0.999969482421875 0.3946565754612291 0.1333333333333317 0.1333333333333317
0.4266666666666667 0.9999389657750726 6.103329360485077e-05 1.421298502621541 0.999969482421875 0.6799792480468783 0.999969482421875 0.999969482421875 0.3946569009721283 0.1599999999999984 0.1599999999999984 0.4266666666666667 0.9999389657750726 6.103329360485076e-05 1.421298502621541 0.999969482421875 0.6799792480468783 0.999969482421875 0.999969482421875 0.3946569009721283 0.1599999999999984 0.1599999999999984
0.432 0.9999389657750726 6.103329360485077e-05 1.42129720061768 0.999969482421875 0.6266475423177114 0.999969482421875 0.999969482421875 0.3946572264830275 0.1866666666666651 0.1866666666666651 0.432 0.9999389657750726 6.103329360485076e-05 1.42129720061768 0.999969482421875 0.6266475423177114 0.999969482421875 0.999969482421875 0.3946572264830275 0.1866666666666651 0.1866666666666651
0.4373333333333333 0.9999389657750726 6.103329360485077e-05 1.421295898613818 0.999969482421875 0.5733158365885449 0.999969482421875 0.999969482421875 0.3946575519939268 0.2133333333333317 0.2133333333333317 0.4373333333333333 0.9999389657750726 6.103329360485076e-05 1.421295898613818 0.999969482421875 0.5733158365885449 0.999969482421875 0.999969482421875 0.3946575519939268 0.2133333333333317 0.2133333333333317
0.4426666666666667 0.9999389657750726 6.103329360485077e-05 1.421294596609956 0.999969482421875 0.5199841308593781 0.999969482421875 0.999969482421875 0.394657877504826 0.2399999999999984 0.2399999999999984 0.4426666666666667 0.9999389657750726 6.103329360485076e-05 1.421294596609956 0.999969482421875 0.5199841308593781 0.999969482421875 0.999969482421875 0.394657877504826 0.2399999999999984 0.2399999999999984
0.448 0.9999389657750726 6.103329360485077e-05 1.421293294606095 0.999969482421875 0.4666524251302116 0.999969482421875 0.999969482421875 0.3946582030157252 0.2666666666666651 0.2666666666666651 0.448 0.9999389657750726 6.103329360485076e-05 1.421293294606095 0.999969482421875 0.4666524251302116 0.999969482421875 0.999969482421875 0.3946582030157252 0.2666666666666651 0.2666666666666651
0.4533333333333333 0.9999389657750726 6.103329360485077e-05 1.421291992602233 0.999969482421875 0.4133207194010449 0.999969482421875 0.999969482421875 0.3946585285266245 0.2933333333333317 0.2933333333333317 0.4533333333333333 0.9999389657750726 6.103329360485076e-05 1.421291992602233 0.999969482421875 0.4133207194010449 0.999969482421875 0.999969482421875 0.3946585285266245 0.2933333333333317 0.2933333333333317
0.4586666666666667 0.9999389657750726 6.103329360485077e-05 1.421290690598371 0.999969482421875 0.3599890136718782 0.999969482421875 0.999969482421875 0.3946588540375237 0.3199999999999984 0.3199999999999984 0.4586666666666667 0.9999389657750726 6.103329360485076e-05 1.421290690598371 0.999969482421875 0.3599890136718782 0.999969482421875 0.999969482421875 0.3946588540375237 0.3199999999999984 0.3199999999999984
0.4640000000000001 0.9999389657750726 6.103329360485077e-05 1.421289388594509 0.999969482421875 0.3066573079427115 0.999969482421875 0.999969482421875 0.3946591795484229 0.3466666666666651 0.3466666666666651 0.4640000000000001 0.9999389657750726 6.103329360485076e-05 1.421289388594509 0.999969482421875 0.3066573079427115 0.999969482421875 0.999969482421875 0.3946591795484229 0.3466666666666651 0.3466666666666651
0.4693333333333333 0.9999389657750726 6.103329360485077e-05 1.421288086590648 0.999969482421875 0.2533256022135448 0.999969482421875 0.999969482421875 0.3946595050593222 0.3733333333333317 0.3733333333333317 0.4693333333333333 0.9999389657750726 6.103329360485076e-05 1.421288086590648 0.999969482421875 0.2533256022135448 0.999969482421875 0.999969482421875 0.3946595050593222 0.3733333333333317 0.3733333333333317
0.4746666666666667 0.9999389657750726 6.103329360485077e-05 1.421286784586786 0.999969482421875 0.1999938964843782 0.999969482421875 0.999969482421875 0.3946598305702214 0.3999999999999984 0.3999999999999984 0.4746666666666667 0.9999389657750726 6.103329360485076e-05 1.421286784586786 0.999969482421875 0.1999938964843782 0.999969482421875 0.999969482421875 0.3946598305702214 0.3999999999999984 0.3999999999999984
0.48 0.9999389657750726 6.103329360485077e-05 1.421285482582924 0.999969482421875 0.1466621907552115 0.999969482421875 0.999969482421875 0.3946601560811207 0.4266666666666651 0.4266666666666651 0.48 0.9999389657750726 6.103329360485076e-05 1.421285482582924 0.999969482421875 0.1466621907552115 0.999969482421875 0.999969482421875 0.3946601560811207 0.4266666666666651 0.4266666666666651
0.4853333333333333 0.9999389657750726 6.103329360485077e-05 1.421284180579062 0.999969482421875 0.09333048502604482 0.999969482421875 0.999969482421875 0.3946604815920199 0.4533333333333317 0.4533333333333317 0.4853333333333333 0.9999389657750726 6.103329360485076e-05 1.421284180579062 0.999969482421875 0.09333048502604482 0.999969482421875 0.999969482421875 0.3946604815920199 0.4533333333333317 0.4533333333333317
0.4906666666666666 0.9999389657750726 6.103329360485077e-05 1.421282878575201 0.999969482421875 0.03999877929687814 0.999969482421875 0.999969482421875 0.3946608071029191 0.4799999999999985 0.4799999999999985 0.4906666666666666 0.9999389657750726 6.103329360485076e-05 1.421282878575201 0.999969482421875 0.03999877929687814 0.999969482421875 0.999969482421875 0.3946608071029191 0.4799999999999985 0.4799999999999985
0.496 0.9999389657750726 6.103329360485077e-05 1.421281576571339 0.0 0.01333292643228842 0.999969482421875 0.999969482421875 0.3946611326138184 0.506666666666665 0.506666666666665 0.496 0.9999389657750726 6.103329360485076e-05 1.421281576571339 0.0 0.01333292643228842 0.999969482421875 0.999969482421875 0.3946611326138184 0.506666666666665 0.506666666666665
0.5013333333333333 0.9999389657750726 6.103329360485077e-05 1.421280274567477 0.0 0.066664632161455 0.999969482421875 0.999969482421875 0.3946614581247176 0.5333333333333316 0.5333333333333316 0.5013333333333333 0.9999389657750726 6.103329360485076e-05 1.421280274567477 0.0 0.066664632161455 0.999969482421875 0.999969482421875 0.3946614581247176 0.5333333333333316 0.5333333333333316
0.5066666666666667 0.9999389657750726 6.103329360485077e-05 1.421278972563615 0.0 0.1199963378906216 0.999969482421875 0.999969482421875 0.3946617836356168 0.5599999999999983 0.5599999999999983 0.5066666666666667 0.9999389657750726 6.103329360485076e-05 1.421278972563615 0.0 0.1199963378906216 0.999969482421875 0.999969482421875 0.3946617836356168 0.5599999999999983 0.5599999999999983
0.512 0.9999389657750726 6.103329360485077e-05 1.421277670559754 0.0 0.1733280436197881 0.999969482421875 0.999969482421875 0.3946621091465161 0.5866666666666649 0.5866666666666649 0.512 0.9999389657750726 6.103329360485076e-05 1.421277670559754 0.0 0.1733280436197881 0.999969482421875 0.999969482421875 0.3946621091465161 0.5866666666666649 0.5866666666666649
0.5173333333333333 0.9999389657750726 6.103329360485077e-05 1.421276368555892 0.0 0.2266597493489547 0.999969482421875 0.999969482421875 0.3946624346574153 0.6133333333333315 0.6133333333333315 0.5173333333333333 0.9999389657750726 6.103329360485076e-05 1.421276368555892 0.0 0.2266597493489547 0.999969482421875 0.999969482421875 0.3946624346574153 0.6133333333333315 0.6133333333333315
0.5226666666666667 0.9999389657750726 6.103329360485077e-05 1.42127506655203 0.0 0.2799914550781212 0.999969482421875 0.999969482421875 0.3946627601683145 0.6399999999999981 0.6399999999999981 0.5226666666666667 0.9999389657750726 6.103329360485076e-05 1.42127506655203 0.0 0.2799914550781212 0.999969482421875 0.999969482421875 0.3946627601683145 0.6399999999999981 0.6399999999999981
0.528 0.9999389657750726 6.103329360485077e-05 1.421273764548169 0.0 0.3333231608072878 0.999969482421875 0.999969482421875 0.3946630856792138 0.6666666666666647 0.6666666666666647 0.528 0.9999389657750726 6.103329360485076e-05 1.421273764548169 0.0 0.3333231608072878 0.999969482421875 0.999969482421875 0.3946630856792138 0.6666666666666647 0.6666666666666647

View File

@ -180,6 +180,8 @@ def run_micropython(pyb, args, test_file, is_special=False):
"basics/builtin_help.py", "basics/builtin_help.py",
"thread/thread_exc2.py", "thread/thread_exc2.py",
"esp32/partition_ota.py", "esp32/partition_ota.py",
"circuitpython/traceback_test.py", # CIRCUITPY-CHANGE
"circuitpython/traceback_test_chained.py", # CIRCUITPY-CHANGE
) )
had_crash = False had_crash = False
if pyb is None: if pyb is None:
@ -977,6 +979,7 @@ the last matching regex is used:
if args.test_dirs is None: if args.test_dirs is None:
test_dirs = ( test_dirs = (
"basics", "basics",
"circuitpython", # CIRCUITPY-CHANGE
"micropython", "micropython",
"misc", "misc",
"extmod", "extmod",

View File

@ -75,7 +75,20 @@ def get_version_info():
sha = os.environ["GITHUB_SHA"] sha = os.environ["GITHUB_SHA"]
if not version: if not version:
version = "{}-{}".format(date.today().strftime("%Y%m%d"), sha[:7]) # Get branch we are PR'ing into, if any.
branch = os.environ.get("GITHUB_BASE_REF", "").strip().replace("/", "_")
if not branch:
branch = "no-branch"
# Get PR number, if any
pull_request_maybe = os.environ.get("PULL", "")
if pull_request_maybe:
pull_request_maybe = f"-PR{pull_request_maybe}"
date_stamp = date.today().strftime("%Y%m%d")
short_sha = sha[:7]
# Example: 20231121-8.2.x-PR9876-123abcd
version = f"{date_stamp}-{branch}{pull_request_maybe}-{short_sha}"
return sha, version return sha, version

View File

@ -1,8 +1,11 @@
#!/bin/bash #!/bin/bash
set -eo pipefail
# SPDX-FileCopyrightText: 2014 MicroPython & CircuitPython contributors (https://github.com/adafruit/circuitpython/graphs/contributors) # SPDX-FileCopyrightText: 2014 MicroPython & CircuitPython contributors (https://github.com/adafruit/circuitpython/graphs/contributors)
# #
# SPDX-License-Identifier: MIT # SPDX-License-Identifier: MIT
git fetch --tags git fetch --tags
git checkout $(git describe --tags `git rev-list --tags --max-count=1`) latest_tag="$(git describe --tags `git rev-list --tags --max-count=1`)"
git checkout $latest_tag

@ -1 +1 @@
Subproject commit 1421ca7fe72a2b173b08be05f9042b79409e783a Subproject commit 27e322fcdcc6eee0642242638d4f2557efb32559