Merge remote-tracking branch 'adafruit/master' into patch-2

This commit is contained in:
Scott Shawcroft 2019-01-22 15:57:59 -08:00
commit 0a3f62d8d4
No known key found for this signature in database
GPG Key ID: FD0EDC4B6C53CA59
29 changed files with 1915 additions and 238 deletions

View File

@ -78,12 +78,12 @@ Not all of these functions and types are turned on in all CircuitPython ports, f
.. classmethod:: from_bytes(bytes, byteorder)
In CircuitPython, `byteorder` parameter must be positional (this is
In CircuitPython, ``byteorder`` parameter must be positional (this is
compatible with CPython).
.. method:: to_bytes(size, byteorder)
In CircuitPython, `byteorder` parameter must be positional (this is
In CircuitPython, ``byteorder`` parameter must be positional (this is
compatible with CPython).
.. function:: isinstance()

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-01-21 21:50-0500\n"
"POT-Creation-Date: 2019-01-22 14:00-0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -1963,7 +1963,7 @@ msgstr ""
msgid "argument should be a '%q' not a '%q'"
msgstr ""
#: py/runtime.c:1123 py/runtime.c:1197
#: py/runtime.c:1123 py/runtime.c:1197 shared-bindings/_pixelbuf/__init__.c:106
msgid "no such attribute"
msgstr ""
@ -2042,6 +2042,54 @@ msgstr ""
msgid "byte code not implemented"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:99
#, c-format
msgid "byteorder is not an instance of ByteOrder (got a %s)"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:104
#, c-format
msgid "Can not use dotstar with %s"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:116
msgid "rawbuf is not the same size as buf"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:121
#, c-format
msgid "buf is too small. need %d bytes"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:127
msgid "write_args must be a list, tuple, or None"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:392
msgid "Only slices with step=1 (aka None) are supported"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:394
msgid "Range out of bounds"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:403
msgid "tuple/list required on RHS"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:419
#, c-format
msgid "Unmatched number of items on RHS (expected %d, got %d)."
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:442
msgid "Pixel beyond bounds of buffer"
msgstr ""
#: shared-bindings/_pixelbuf/__init__.c:112
msgid "readonly attribute"
msgstr ""
#: shared-bindings/_stage/Layer.c:71
msgid "graphic must be 2048 bytes long"
msgstr ""
@ -2535,6 +2583,11 @@ msgid ""
"Object has been deinitialized and can no longer be used. Create a new object."
msgstr ""
#: shared-module/_pixelbuf/PixelBuf.c:69
#, c-format
msgid "Expected tuple of length %d, got %d"
msgstr ""
#: shared-module/audioio/Mixer.c:47 shared-module/audioio/WaveFile.c:117
msgid "Couldn't allocate first buffer"
msgstr ""
@ -2771,12 +2824,8 @@ msgstr ""
#~ msgstr ""
#~ "Silahkan taruh masalah disini dengan isi dari CIRCUITPY drive: anda \n"
#~ msgid "Invalid UUID parameter"
#~ msgstr "Parameter UUID tidak valid"
#~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n"
#~ msgstr ""
#~ "Sepertinya inti kode CircuitPython kita crash dengan sangat keras. Ups!\n"
#~ msgid "Invalid UUID string length"
#~ msgstr "Panjang string UUID tidak valid"
#~ msgid ""
#~ "enough power for the whole circuit and press reset (after ejecting "
@ -2785,8 +2834,12 @@ msgstr ""
#~ "tegangan cukup untuk semua sirkuit dan tekan reset (setelah mencabut "
#~ "CIRCUITPY).\n"
#~ msgid "Invalid UUID string length"
#~ msgstr "Panjang string UUID tidak valid"
#~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n"
#~ msgstr ""
#~ "Sepertinya inti kode CircuitPython kita crash dengan sangat keras. Ups!\n"
#~ msgid "Invalid UUID parameter"
#~ msgstr "Parameter UUID tidak valid"
#, fuzzy
#~ msgid "unpack requires a buffer of %d bytes"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-01-21 21:50-0500\n"
"POT-Creation-Date: 2019-01-22 14:00-0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -1930,7 +1930,7 @@ msgstr ""
msgid "argument should be a '%q' not a '%q'"
msgstr ""
#: py/runtime.c:1123 py/runtime.c:1197
#: py/runtime.c:1123 py/runtime.c:1197 shared-bindings/_pixelbuf/__init__.c:106
msgid "no such attribute"
msgstr ""
@ -2009,6 +2009,54 @@ msgstr ""
msgid "byte code not implemented"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:99
#, c-format
msgid "byteorder is not an instance of ByteOrder (got a %s)"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:104
#, c-format
msgid "Can not use dotstar with %s"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:116
msgid "rawbuf is not the same size as buf"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:121
#, c-format
msgid "buf is too small. need %d bytes"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:127
msgid "write_args must be a list, tuple, or None"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:392
msgid "Only slices with step=1 (aka None) are supported"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:394
msgid "Range out of bounds"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:403
msgid "tuple/list required on RHS"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:419
#, c-format
msgid "Unmatched number of items on RHS (expected %d, got %d)."
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:442
msgid "Pixel beyond bounds of buffer"
msgstr ""
#: shared-bindings/_pixelbuf/__init__.c:112
msgid "readonly attribute"
msgstr ""
#: shared-bindings/_stage/Layer.c:71
msgid "graphic must be 2048 bytes long"
msgstr ""
@ -2497,6 +2545,11 @@ msgid ""
"Object has been deinitialized and can no longer be used. Create a new object."
msgstr ""
#: shared-module/_pixelbuf/PixelBuf.c:69
#, c-format
msgid "Expected tuple of length %d, got %d"
msgstr ""
#: shared-module/audioio/Mixer.c:47 shared-module/audioio/WaveFile.c:117
msgid "Couldn't allocate first buffer"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-01-20 22:46-0500\n"
"POT-Creation-Date: 2019-01-22 15:57-0800\n"
"PO-Revision-Date: 2018-07-27 11:55-0700\n"
"Last-Translator: Sebastian Plamauer\n"
"Language-Team: \n"
@ -338,12 +338,12 @@ msgid "bytes > 8 bits not supported"
msgstr "bytes mit mehr als 8 bits werden nicht unterstützt"
#: ports/atmel-samd/common-hal/busio/UART.c:73
#: ports/nrf/common-hal/busio/UART.c:118
#: ports/nrf/common-hal/busio/UART.c:91
msgid "tx and rx cannot both be None"
msgstr "tx und rx können nicht beide None sein"
#: ports/atmel-samd/common-hal/busio/UART.c:146
#: ports/nrf/common-hal/busio/UART.c:152
#: ports/nrf/common-hal/busio/UART.c:132
msgid "Failed to allocate RX buffer"
msgstr "Konnte keinen RX Buffer allozieren"
@ -352,12 +352,12 @@ msgid "Could not initialize UART"
msgstr "Konnte UART nicht initialisieren"
#: ports/atmel-samd/common-hal/busio/UART.c:241
#: ports/nrf/common-hal/busio/UART.c:197
#: ports/nrf/common-hal/busio/UART.c:174
msgid "No RX pin"
msgstr "Kein RX Pin"
#: ports/atmel-samd/common-hal/busio/UART.c:300
#: ports/nrf/common-hal/busio/UART.c:232
#: ports/nrf/common-hal/busio/UART.c:209
msgid "No TX pin"
msgstr "Kein TX Pin"
@ -490,7 +490,9 @@ msgstr "Minimale PWM Frequenz ist %dHz"
#: ports/esp8266/common-hal/pulseio/PWMOut.c:68
#, c-format
msgid "Multiple PWM frequencies not supported. PWM already set to %dhz."
msgstr "Mehrere PWM Frequenzen werden nicht unterstützt. PWM wurde bereits auf %dHz gesetzt."
msgstr ""
"Mehrere PWM Frequenzen werden nicht unterstützt. PWM wurde bereits auf %dHz "
"gesetzt."
#: ports/esp8266/common-hal/pulseio/PWMOut.c:77 ports/esp8266/machine_pwm.c:70
#, c-format
@ -507,7 +509,8 @@ msgstr "Dateisystem kann nicht wieder gemounted werden."
#: ports/esp8266/common-hal/storage/__init__.c:38
msgid "Use esptool to erase flash and re-upload Python instead"
msgstr "Benutze esptool um den flash zu löschen und stattdessen Python hochzuladen"
msgstr ""
"Benutze esptool um den flash zu löschen und stattdessen Python hochzuladen"
#: ports/esp8266/esp_mphal.c:154
msgid "C-level assert"
@ -563,7 +566,8 @@ msgstr "len muss ein vielfaches von 4 sein"
#: ports/esp8266/modesp.c:274
#, c-format
msgid "memory allocation failed, allocating %u bytes for native code"
msgstr "Speicherallozierung fehlgeschlagen, alloziere %u Bytes für nativen Code"
msgstr ""
"Speicherallozierung fehlgeschlagen, alloziere %u Bytes für nativen Code"
#: ports/esp8266/modesp.c:317
msgid "flash location must be below 1MByte"
@ -712,7 +716,7 @@ msgstr "Kann den Attributwert nicht mitteilen. Status: 0x%04x"
msgid "Failed to read attribute value, err %0x04x"
msgstr "Kann den Attributwert nicht lesen. Status: 0x%04x"
#: ports/nrf/common-hal/bleio/Characteristic.c:172
#: ports/nrf/common-hal/bleio/Characteristic.c:172 ports/nrf/sd_mutex.c:34
#, c-format
msgid "Failed to acquire mutex, err 0x%04x"
msgstr "Mutex konnte nicht akquiriert werden. Status: 0x%04x"
@ -722,7 +726,7 @@ msgstr "Mutex konnte nicht akquiriert werden. Status: 0x%04x"
msgid "Failed to write attribute value, err 0x%04x"
msgstr "Kann den Attributwert nicht schreiben. Status: 0x%04x"
#: ports/nrf/common-hal/bleio/Characteristic.c:189
#: ports/nrf/common-hal/bleio/Characteristic.c:189 ports/nrf/sd_mutex.c:54
#, c-format
msgid "Failed to release mutex, err 0x%04x"
msgstr "Mutex konnte nicht freigegeben werden. Status: 0x%04x"
@ -741,43 +745,43 @@ msgstr "Daten sind zu groß für das advertisement packet"
msgid "Failed to discover services"
msgstr "Es konnten keine Dienste gefunden werden"
#: ports/nrf/common-hal/bleio/Device.c:267
#: ports/nrf/common-hal/bleio/Device.c:300
#: ports/nrf/common-hal/bleio/Device.c:268
#: ports/nrf/common-hal/bleio/Device.c:302
msgid "Failed to acquire mutex"
msgstr "Akquirieren des Mutex gescheitert"
#: ports/nrf/common-hal/bleio/Device.c:278
#: ports/nrf/common-hal/bleio/Device.c:311
#: ports/nrf/common-hal/bleio/Device.c:342
#: ports/nrf/common-hal/bleio/Device.c:376
#: ports/nrf/common-hal/bleio/Device.c:280
#: ports/nrf/common-hal/bleio/Device.c:313
#: ports/nrf/common-hal/bleio/Device.c:344
#: ports/nrf/common-hal/bleio/Device.c:378
msgid "Failed to release mutex"
msgstr "Loslassen des Mutex gescheitert"
#: ports/nrf/common-hal/bleio/Device.c:387
#: ports/nrf/common-hal/bleio/Device.c:389
msgid "Failed to continue scanning"
msgstr "Der Scanvorgang kann nicht fortgesetzt werden"
#: ports/nrf/common-hal/bleio/Device.c:419
#: ports/nrf/common-hal/bleio/Device.c:421
msgid "Failed to connect:"
msgstr "Verbindung fehlgeschlagen:"
#: ports/nrf/common-hal/bleio/Device.c:489
#: ports/nrf/common-hal/bleio/Device.c:491
msgid "Failed to add service"
msgstr "Dienst konnte nicht hinzugefügt werden"
#: ports/nrf/common-hal/bleio/Device.c:506
#: ports/nrf/common-hal/bleio/Device.c:508
msgid "Failed to start advertising"
msgstr "Kann advertisement nicht starten"
#: ports/nrf/common-hal/bleio/Device.c:523
#: ports/nrf/common-hal/bleio/Device.c:525
msgid "Failed to stop advertising"
msgstr "Kann advertisement nicht stoppen"
#: ports/nrf/common-hal/bleio/Device.c:548
#: ports/nrf/common-hal/bleio/Device.c:550
msgid "Failed to start scanning"
msgstr "Der Scanvorgang kann nicht gestartet werden"
#: ports/nrf/common-hal/bleio/Device.c:564
#: ports/nrf/common-hal/bleio/Device.c:566
msgid "Failed to create mutex"
msgstr "Erstellen des Mutex ist fehlgeschlagen"
@ -832,19 +836,19 @@ msgstr "Alle SPI-Peripheriegeräte sind in Benutzung"
msgid "error = 0x%08lX"
msgstr "error = 0x%08lX"
#: ports/nrf/common-hal/busio/UART.c:122
#: ports/nrf/common-hal/busio/UART.c:95
msgid "Invalid buffer size"
msgstr "Ungültige Puffergröße"
#: ports/nrf/common-hal/busio/UART.c:126
#: ports/nrf/common-hal/busio/UART.c:99
msgid "Odd parity is not supported"
msgstr "Ungerade Parität wird nicht unterstützt"
#: ports/nrf/common-hal/busio/UART.c:358 ports/nrf/common-hal/busio/UART.c:362
#: ports/nrf/common-hal/busio/UART.c:367 ports/nrf/common-hal/busio/UART.c:372
#: ports/nrf/common-hal/busio/UART.c:378 ports/nrf/common-hal/busio/UART.c:383
#: ports/nrf/common-hal/busio/UART.c:388 ports/nrf/common-hal/busio/UART.c:392
#: ports/nrf/common-hal/busio/UART.c:400
#: ports/nrf/common-hal/busio/UART.c:335 ports/nrf/common-hal/busio/UART.c:339
#: ports/nrf/common-hal/busio/UART.c:344 ports/nrf/common-hal/busio/UART.c:349
#: ports/nrf/common-hal/busio/UART.c:355 ports/nrf/common-hal/busio/UART.c:360
#: ports/nrf/common-hal/busio/UART.c:365 ports/nrf/common-hal/busio/UART.c:369
#: ports/nrf/common-hal/busio/UART.c:377
msgid "busio.UART not available"
msgstr "Kann busio.UART nicht finden"
@ -974,7 +978,8 @@ msgstr ""
"\n"
"Projektleitfäden findest du auf learn.adafruit.com/category/circuitpython \n"
"\n"
"Um die integrierten Module aufzulisten, führe bitte `help(\"modules\")` aus.\n"
"Um die integrierten Module aufzulisten, führe bitte `help(\"modules\")` "
"aus.\n"
#: py/builtinimport.c:336
msgid "cannot perform relative import"
@ -1200,7 +1205,7 @@ msgid "unsupported Thumb instruction '%s' with %d arguments"
msgstr ""
#: py/emitinlinethumb.c:810
#, still fuzzy, what branch?
#, fuzzy
msgid "branch not in range"
msgstr "Kalibrierung ist außerhalb der Reichweite"
@ -1342,7 +1347,7 @@ msgstr ""
#: py/modstruct.c:148 py/modstruct.c:156 py/modstruct.c:244 py/modstruct.c:254
#: shared-bindings/struct/__init__.c:102 shared-bindings/struct/__init__.c:161
#: shared-module/struct/__init__.c:183
#: shared-module/struct/__init__.c:128 shared-module/struct/__init__.c:183
msgid "buffer too small"
msgstr ""
@ -1940,7 +1945,7 @@ msgstr ""
msgid "argument should be a '%q' not a '%q'"
msgstr ""
#: py/runtime.c:1123 py/runtime.c:1197
#: py/runtime.c:1123 py/runtime.c:1197 shared-bindings/_pixelbuf/__init__.c:106
msgid "no such attribute"
msgstr ""
@ -2019,6 +2024,54 @@ msgstr ""
msgid "byte code not implemented"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:99
#, c-format
msgid "byteorder is not an instance of ByteOrder (got a %s)"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:104
#, c-format
msgid "Can not use dotstar with %s"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:116
msgid "rawbuf is not the same size as buf"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:121
#, c-format
msgid "buf is too small. need %d bytes"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:127
msgid "write_args must be a list, tuple, or None"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:392
msgid "Only slices with step=1 (aka None) are supported"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:394
msgid "Range out of bounds"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:403
msgid "tuple/list required on RHS"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:419
#, c-format
msgid "Unmatched number of items on RHS (expected %d, got %d)."
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:442
msgid "Pixel beyond bounds of buffer"
msgstr ""
#: shared-bindings/_pixelbuf/__init__.c:112
msgid "readonly attribute"
msgstr ""
#: shared-bindings/_stage/Layer.c:71
msgid "graphic must be 2048 bytes long"
msgstr ""
@ -2108,7 +2161,7 @@ msgid "buffer must be a bytes-like object"
msgstr ""
#: shared-bindings/audioio/WaveFile.c:78
#: shared-bindings/displayio/OnDiskBitmap.c:85
#: shared-bindings/displayio/OnDiskBitmap.c:87
msgid "file must be a file opened in byte mode"
msgstr ""
@ -2152,14 +2205,33 @@ msgstr "Die Adresse muss %d Bytes lang sein"
msgid "Expected a UUID"
msgstr "Eine UUID wird erwartet"
#: shared-bindings/bleio/CharacteristicBuffer.c:61
#: shared-bindings/bleio/CharacteristicBuffer.c:39
#, fuzzy
msgid "Not connected"
msgstr "Kann nicht zu AP verbinden"
#: shared-bindings/bleio/CharacteristicBuffer.c:74
#, fuzzy
msgid "timeout must be >= 0.0"
msgstr "bits müssen 8 sein"
#: shared-bindings/bleio/CharacteristicBuffer.c:79
msgid "buffer_size must be >= 1"
msgstr "Puffergröße muss >= 1 sein"
#: shared-bindings/bleio/CharacteristicBuffer.c:65
#: shared-bindings/bleio/CharacteristicBuffer.c:83
msgid "Expected a Characteristic"
msgstr "Erwartet ein Merkmal"
#: shared-bindings/bleio/CharacteristicBuffer.c:138
#, fuzzy
msgid "CharacteristicBuffer writing not provided"
msgstr "Merkmal wird bereits von einem anderen Dienst verwendet."
#: shared-bindings/bleio/CharacteristicBuffer.c:147
msgid "Not connected."
msgstr ""
#: shared-bindings/bleio/Device.c:210
msgid "Can't add services in Central mode"
msgstr ""
@ -2196,15 +2268,19 @@ msgstr ""
msgid "UUID integer value not in range 0 to 0xffff"
msgstr ""
#: shared-bindings/bleio/UUID.c:75
msgid "UUID value is not int or byte buffer"
#: shared-bindings/bleio/UUID.c:91
msgid "UUID string not 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'"
msgstr ""
#: shared-bindings/bleio/UUID.c:79
#: shared-bindings/bleio/UUID.c:103
msgid "UUID value is not str, int or byte buffer"
msgstr ""
#: shared-bindings/bleio/UUID.c:107
msgid "Byte buffer must be 16 bytes."
msgstr "Der Puffer muss 16 Bytes lang sein"
#: shared-bindings/bleio/UUID.c:120
#: shared-bindings/bleio/UUID.c:151
msgid "not a 128-bit UUID"
msgstr ""
@ -2487,6 +2563,11 @@ msgid ""
"Object has been deinitialized and can no longer be used. Create a new object."
msgstr ""
#: shared-module/_pixelbuf/PixelBuf.c:69
#, c-format
msgid "Expected tuple of length %d, got %d"
msgstr ""
#: shared-module/audioio/Mixer.c:47 shared-module/audioio/WaveFile.c:117
msgid "Couldn't allocate first buffer"
msgstr ""
@ -2622,11 +2703,6 @@ msgstr "Kann '/' nicht remounten when USB aktiv ist"
msgid "'S' and 'O' are not supported format types"
msgstr ""
#: shared-module/struct/__init__.c:128
#, c-format
msgid "unpack requires a buffer of %d bytes"
msgstr "unpack erfordert einen Puffer von %d Bytes"
#: shared-module/struct/__init__.c:136
msgid "too many arguments provided with the given format"
msgstr ""
@ -2672,7 +2748,8 @@ msgstr "Zum beenden bitte resette das board ohne "
msgid ""
"You are running in safe mode which means something unanticipated happened.\n"
msgstr ""
"Sie laufen im abgesicherten Modus, was bedeutet, dass etwas Unerwartetes passiert ist.\n"
"Sie laufen im abgesicherten Modus, was bedeutet, dass etwas Unerwartetes "
"passiert ist.\n"
#: supervisor/shared/safe_mode.c:109
msgid ""
@ -2681,7 +2758,8 @@ msgid ""
" with the contents of your CIRCUITPY drive and this message:\n"
msgstr ""
"Sieht aus, als wäre der CircuitPython-Kernel-Code abgestürzt. Uups!\n"
"Bitte melde das Problem unter https://github.com/adafruit/circuitpython/issues\n"
"Bitte melde das Problem unter https://github.com/adafruit/circuitpython/"
"issues\n"
"mit dem Inhalt deines CIRCUITPY-Laufwerks und dieser Nachricht:\n"
#: supervisor/shared/safe_mode.c:111
@ -2705,7 +2783,8 @@ msgid ""
msgstr ""
"Die Stromversorgung des Mikrocontrollers ist eingebrochen. Stelle sicher,\n"
"dass deine Stromversorgung genug Leistung für die gesamte Schaltung zur\n"
"Verfügung stellt und drücke die Reset-Taste (nachdem du das CIRCUITPY-Laufwerk\n"
"Verfügung stellt und drücke die Reset-Taste (nachdem du das CIRCUITPY-"
"Laufwerk\n"
"ausgeworfen hast)\n"
#: supervisor/shared/safe_mode.c:120
@ -2723,29 +2802,26 @@ msgid ""
"exit safe mode.\n"
msgstr ""
#~ msgid "Can not add Characteristic."
#~ msgstr "Kann das Merkmal nicht hinzufügen."
#~ msgid "Can not add Service."
#~ msgstr "Kann den Dienst nicht hinzufügen."
#~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n"
#~ msgstr "CircuitPython ist abgestürzt. Ups!\n"
#~ msgid "unpack requires a buffer of %d bytes"
#~ msgstr "unpack erfordert einen Puffer von %d Bytes"
#~ msgid "Can not apply advertisement data. status: 0x%02x"
#~ msgstr "Kann advertisement data nicht anwenden. Status: 0x%02x"
#~ msgid "Cannot apply GAP parameters."
#~ msgstr "Kann GAP Parameter nicht anwenden."
#~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n"
#~ msgstr "CircuitPython ist abgestürzt. Ups!\n"
#~ msgid "Can not encode UUID, to check length."
#~ msgstr "Kann UUID nicht kodieren, um die Länge zu überprüfen."
#~ msgid "Can encode UUID into the advertisement packet."
#~ msgstr "Kann UUID in das advertisement packet kodieren."
#~ msgid "Invalid Service type"
#~ msgstr "Ungültiger Diensttyp"
#~ msgid "Can not query for the device address."
#~ msgstr "Kann nicht nach der Geräteadresse suchen."
#~ msgid "Can not apply device name in the stack."
#~ msgstr "Der Gerätename kann nicht im Stack verwendet werden."
#~ msgid "Invalid UUID string length"
#~ msgstr "Ungültige UUID-Stringlänge"
#~ msgid ""
#~ "enough power for the whole circuit and press reset (after ejecting "
@ -2754,19 +2830,25 @@ msgstr ""
#~ "genug Strom für den ganzen Schaltkreis liefert und drücke reset (nach dem "
#~ "sicheren Auswerfen von CIRCUITPY.)\n"
#~ msgid "Invalid Service type"
#~ msgstr "Ungültiger Diensttyp"
#~ msgid "Invalid UUID parameter"
#~ msgstr "Ungültiger UUID-Parameter"
#~ msgid "Can not apply device name in the stack."
#~ msgstr "Der Gerätename kann nicht im Stack verwendet werden."
#~ msgid ""
#~ "Please file an issue here with the contents of your CIRCUITPY drive:\n"
#~ msgstr ""
#~ "Bitte erstelle ein issue hier mit dem Inhalt deines CIRCUITPY-speichers:\n"
#~ msgid "Can encode UUID into the advertisement packet."
#~ msgstr "Kann UUID in das advertisement packet kodieren."
#~ msgid "Can not add Characteristic."
#~ msgstr "Kann das Merkmal nicht hinzufügen."
#~ msgid "Invalid UUID string length"
#~ msgstr "Ungültige UUID-Stringlänge"
#~ msgid "Cannot apply GAP parameters."
#~ msgstr "Kann GAP Parameter nicht anwenden."
#~ msgid "Can not add Service."
#~ msgstr "Kann den Dienst nicht hinzufügen."
#~ msgid "Can not encode UUID, to check length."
#~ msgstr "Kann UUID nicht kodieren, um die Länge zu überprüfen."
#~ msgid "Invalid UUID parameter"
#~ msgstr "Ungültiger UUID-Parameter"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-01-21 21:50-0500\n"
"POT-Creation-Date: 2019-01-22 14:00-0800\n"
"PO-Revision-Date: 2018-07-27 11:55-0700\n"
"Last-Translator: \n"
"Language-Team: \n"
@ -1930,7 +1930,7 @@ msgstr ""
msgid "argument should be a '%q' not a '%q'"
msgstr ""
#: py/runtime.c:1123 py/runtime.c:1197
#: py/runtime.c:1123 py/runtime.c:1197 shared-bindings/_pixelbuf/__init__.c:106
msgid "no such attribute"
msgstr ""
@ -2009,6 +2009,54 @@ msgstr ""
msgid "byte code not implemented"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:99
#, c-format
msgid "byteorder is not an instance of ByteOrder (got a %s)"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:104
#, c-format
msgid "Can not use dotstar with %s"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:116
msgid "rawbuf is not the same size as buf"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:121
#, c-format
msgid "buf is too small. need %d bytes"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:127
msgid "write_args must be a list, tuple, or None"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:392
msgid "Only slices with step=1 (aka None) are supported"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:394
msgid "Range out of bounds"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:403
msgid "tuple/list required on RHS"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:419
#, c-format
msgid "Unmatched number of items on RHS (expected %d, got %d)."
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:442
msgid "Pixel beyond bounds of buffer"
msgstr ""
#: shared-bindings/_pixelbuf/__init__.c:112
msgid "readonly attribute"
msgstr ""
#: shared-bindings/_stage/Layer.c:71
msgid "graphic must be 2048 bytes long"
msgstr ""
@ -2497,6 +2545,11 @@ msgid ""
"Object has been deinitialized and can no longer be used. Create a new object."
msgstr ""
#: shared-module/_pixelbuf/PixelBuf.c:69
#, c-format
msgid "Expected tuple of length %d, got %d"
msgstr ""
#: shared-module/audioio/Mixer.c:47 shared-module/audioio/WaveFile.c:117
msgid "Couldn't allocate first buffer"
msgstr ""

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-01-21 21:50-0500\n"
"POT-Creation-Date: 2019-01-22 14:00-0800\n"
"PO-Revision-Date: 2018-08-24 22:56-0500\n"
"Last-Translator: \n"
"Language-Team: \n"
@ -1975,7 +1975,7 @@ msgstr "el argumento tiene un tipo erroneo"
msgid "argument should be a '%q' not a '%q'"
msgstr "argumento deberia ser un '%q' no un '%q'"
#: py/runtime.c:1123 py/runtime.c:1197
#: py/runtime.c:1123 py/runtime.c:1197 shared-bindings/_pixelbuf/__init__.c:106
msgid "no such attribute"
msgstr "no hay tal atributo"
@ -2054,6 +2054,57 @@ msgstr "exception no activa para reraise"
msgid "byte code not implemented"
msgstr "codigo byte no implementado"
#: shared-bindings/_pixelbuf/PixelBuf.c:99
#, c-format
msgid "byteorder is not an instance of ByteOrder (got a %s)"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:104
#, c-format
msgid "Can not use dotstar with %s"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:116
msgid "rawbuf is not the same size as buf"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:121
#, c-format
msgid "buf is too small. need %d bytes"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:127
msgid "write_args must be a list, tuple, or None"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:392
#, fuzzy
msgid "Only slices with step=1 (aka None) are supported"
msgstr "solo se admiten segmentos con step=1 (alias None)"
#: shared-bindings/_pixelbuf/PixelBuf.c:394
#, fuzzy
msgid "Range out of bounds"
msgstr "address fuera de límites"
#: shared-bindings/_pixelbuf/PixelBuf.c:403
msgid "tuple/list required on RHS"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:419
#, c-format
msgid "Unmatched number of items on RHS (expected %d, got %d)."
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:442
msgid "Pixel beyond bounds of buffer"
msgstr ""
#: shared-bindings/_pixelbuf/__init__.c:112
#, fuzzy
msgid "readonly attribute"
msgstr "atributo no legible"
#: shared-bindings/_stage/Layer.c:71
msgid "graphic must be 2048 bytes long"
msgstr "graphic debe ser 2048 bytes de largo"
@ -2557,6 +2608,11 @@ msgstr ""
"El objeto se ha desinicializado y ya no se puede utilizar. Crea un nuevo "
"objeto"
#: shared-module/_pixelbuf/PixelBuf.c:69
#, c-format
msgid "Expected tuple of length %d, got %d"
msgstr ""
#: shared-module/audioio/Mixer.c:47 shared-module/audioio/WaveFile.c:117
msgid "Couldn't allocate first buffer"
msgstr "No se pudo asignar el primer buffer"
@ -2798,22 +2854,24 @@ msgstr ""
"El botón reset fue presionado mientras arrancaba CircuitPython. Presiona "
"otra vez para salir del modo seguro.\n"
#~ msgid "Can not query for the device address."
#~ msgstr "No se puede consultar la dirección del dispositivo."
#~ msgid "Invalid UUID string length"
#~ msgstr "Longitud de string UUID inválida"
#~ msgid "Invalid UUID parameter"
#~ msgstr "Parámetro UUID inválido"
#~ msgid "Can not query for the device address."
#~ msgstr "No se puede consultar la dirección del dispositivo."
#~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n"
#~ msgstr ""
#~ "Parece que nuestro código CircuitPython dejó de funcionar. Whoops!\n"
#~ msgid "Cannot set PPCP parameters."
#~ msgstr "No se pueden establecer los parámetros PPCP."
#~ msgid "Baud rate too high for this SPI peripheral"
#~ msgstr "Baud rate demasiado alto para este periférico SPI"
#~ msgid "Can not encode UUID, to check length."
#~ msgstr "No se puede codificar el UUID, para revisar la longitud."
#~ msgid ""
#~ "enough power for the whole circuit and press reset (after ejecting "
#~ "CIRCUITPY).\n"
@ -2821,6 +2879,19 @@ msgstr ""
#~ "suficiente poder para todo el circuito y presiona reset (después de "
#~ "expulsar CIRCUITPY).\n"
#~ msgid "Cannot apply GAP parameters."
#~ msgstr "No se pueden aplicar los parámetros GAP."
#~ msgid "Invalid Service type"
#~ msgstr "Tipo de Servicio inválido"
#~ msgid "Can not add Service."
#~ msgstr "No se puede agregar el Servicio."
#, fuzzy
#~ msgid "unpack requires a buffer of %d bytes"
#~ msgstr "Falló la asignación del buffer RX de %d bytes"
#~ msgid "Can not apply device name in the stack."
#~ msgstr "No se puede aplicar el nombre del dispositivo en el stack."
@ -2834,30 +2905,15 @@ msgstr ""
#~ msgid "Wrong address length"
#~ msgstr "Longitud de address erronea"
#~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n"
#~ msgstr ""
#~ "Parece que nuestro código CircuitPython dejó de funcionar. Whoops!\n"
#~ msgid "Wrong number of bytes provided"
#~ msgstr "Numero erroneo de bytes dados"
#~ msgid "Can not add Service."
#~ msgstr "No se puede agregar el Servicio."
#~ msgid "Cannot apply GAP parameters."
#~ msgstr "No se pueden aplicar los parámetros GAP."
#~ msgid "Can not encode UUID, to check length."
#~ msgstr "No se puede codificar el UUID, para revisar la longitud."
#~ msgid "Can encode UUID into the advertisement packet."
#~ msgstr "Se puede codificar el UUID en el paquete de anuncio."
#~ msgid "Can not apply advertisement data. status: 0x%02x"
#~ msgstr "No se puede aplicar los datos de anuncio. status: 0x%02x"
#~ msgid "Invalid Service type"
#~ msgstr "Tipo de Servicio inválido"
#~ msgid "Baud rate too high for this SPI peripheral"
#~ msgstr "Baud rate demasiado alto para este periférico SPI"
#, fuzzy
#~ msgid "unpack requires a buffer of %d bytes"
#~ msgstr "Falló la asignación del buffer RX de %d bytes"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-01-21 21:50-0500\n"
"POT-Creation-Date: 2019-01-22 14:00-0800\n"
"PO-Revision-Date: 2018-12-20 22:15-0800\n"
"Last-Translator: Timothy <me@timothygarcia.ca>\n"
"Language-Team: fil\n"
@ -1977,7 +1977,7 @@ msgstr "may maling type ang argument"
msgid "argument should be a '%q' not a '%q'"
msgstr "argument ay dapat na '%q' hindi '%q'"
#: py/runtime.c:1123 py/runtime.c:1197
#: py/runtime.c:1123 py/runtime.c:1197 shared-bindings/_pixelbuf/__init__.c:106
msgid "no such attribute"
msgstr "walang ganoon na attribute"
@ -2056,6 +2056,57 @@ msgstr "walang aktibong exception para i-reraise"
msgid "byte code not implemented"
msgstr "byte code hindi pa implemented"
#: shared-bindings/_pixelbuf/PixelBuf.c:99
#, c-format
msgid "byteorder is not an instance of ByteOrder (got a %s)"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:104
#, c-format
msgid "Can not use dotstar with %s"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:116
msgid "rawbuf is not the same size as buf"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:121
#, c-format
msgid "buf is too small. need %d bytes"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:127
msgid "write_args must be a list, tuple, or None"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:392
#, fuzzy
msgid "Only slices with step=1 (aka None) are supported"
msgstr "ang mga slices lamang na may hakbang = 1 (aka None) ang sinusuportahan"
#: shared-bindings/_pixelbuf/PixelBuf.c:394
#, fuzzy
msgid "Range out of bounds"
msgstr "wala sa sakop ang address"
#: shared-bindings/_pixelbuf/PixelBuf.c:403
msgid "tuple/list required on RHS"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:419
#, c-format
msgid "Unmatched number of items on RHS (expected %d, got %d)."
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:442
msgid "Pixel beyond bounds of buffer"
msgstr ""
#: shared-bindings/_pixelbuf/__init__.c:112
#, fuzzy
msgid "readonly attribute"
msgstr "hindi mabasa ang attribute"
#: shared-bindings/_stage/Layer.c:71
msgid "graphic must be 2048 bytes long"
msgstr "graphic ay dapat 2048 bytes ang haba"
@ -2563,6 +2614,11 @@ msgstr ""
"Object ay deinitialized at hindi na magagamit. Lumikha ng isang bagong "
"Object."
#: shared-module/_pixelbuf/PixelBuf.c:69
#, c-format
msgid "Expected tuple of length %d, got %d"
msgstr ""
#: shared-module/audioio/Mixer.c:47 shared-module/audioio/WaveFile.c:117
msgid "Couldn't allocate first buffer"
msgstr "Hindi ma-iallocate ang first buffer"
@ -2804,22 +2860,25 @@ msgstr ""
"Ang reset button ay pinindot habang nag boot ang CircuitPython. Pindutin "
"ulit para lumabas sa safe mode.\n"
#~ msgid "Can not query for the device address."
#~ msgstr "Hindi maaaring mag-query para sa address ng device."
#~ msgid "Invalid UUID string length"
#~ msgstr "Mali ang UUID string length"
#~ msgid "Invalid UUID parameter"
#~ msgstr "Mali ang UUID parameter"
#~ msgid "Can not query for the device address."
#~ msgstr "Hindi maaaring mag-query para sa address ng device."
#~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n"
#~ msgstr ""
#~ "Mukhang ang core CircuitPython code ay nag-crash ng malakas. Aray!\n"
#~ msgid "Cannot set PPCP parameters."
#~ msgstr "Hindi ma-set ang PPCP parameters."
#, fuzzy
#~ msgid "palette must be displayio.Palette"
#~ msgstr "ang palette ay dapat 32 bytes ang haba"
#~ msgid "Can not encode UUID, to check length."
#~ msgstr "Hindi ma-encode UUID, para suriin ang haba."
#~ msgid ""
#~ "enough power for the whole circuit and press reset (after ejecting "
#~ "CIRCUITPY).\n"
@ -2827,6 +2886,19 @@ msgstr ""
#~ "ay nagbibigay ng sapat na power para sa buong circuit at i-press ang "
#~ "reset (pagkatapos i-eject ang CIRCUITPY).\n"
#~ msgid "Cannot apply GAP parameters."
#~ msgstr "Hindi ma-apply ang GAP parameters."
#~ msgid "Invalid Service type"
#~ msgstr "Mali ang tipo ng serbisyo"
#~ msgid "Can not add Service."
#~ msgstr "Hindi maidaragdag ang serbisyo."
#, fuzzy
#~ msgid "unpack requires a buffer of %d bytes"
#~ msgstr "Nabigong ilaan ang RX buffer ng %d bytes"
#~ msgid "Can not apply device name in the stack."
#~ msgstr "Hindi maaaring ma-aplay ang device name sa stack."
@ -2839,31 +2911,15 @@ msgstr ""
#~ msgid "Wrong address length"
#~ msgstr "Mali ang address length"
#~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n"
#~ msgstr ""
#~ "Mukhang ang core CircuitPython code ay nag-crash ng malakas. Aray!\n"
#~ msgid "Wrong number of bytes provided"
#~ msgstr "Mali ang bilang ng bytes"
#~ msgid "Can not add Service."
#~ msgstr "Hindi maidaragdag ang serbisyo."
#~ msgid "Cannot apply GAP parameters."
#~ msgstr "Hindi ma-apply ang GAP parameters."
#~ msgid "Can not encode UUID, to check length."
#~ msgstr "Hindi ma-encode UUID, para suriin ang haba."
#~ msgid "Can encode UUID into the advertisement packet."
#~ msgstr "Maaring i-encode ang UUID sa advertisement packet."
#~ msgid "Can not apply advertisement data. status: 0x%02x"
#~ msgstr "Hindi ma i-apply ang advertisement data. status: 0x%02x"
#~ msgid "Invalid Service type"
#~ msgstr "Mali ang tipo ng serbisyo"
#, fuzzy
#~ msgid "palette must be displayio.Palette"
#~ msgstr "ang palette ay dapat 32 bytes ang haba"
#, fuzzy
#~ msgid "unpack requires a buffer of %d bytes"
#~ msgstr "Nabigong ilaan ang RX buffer ng %d bytes"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-01-21 21:50-0500\n"
"POT-Creation-Date: 2019-01-22 14:00-0800\n"
"PO-Revision-Date: 2018-12-23 20:05+0100\n"
"Last-Translator: Pierrick Couturier <arofarn@arofarn.info>\n"
"Language-Team: fr\n"
@ -1977,7 +1977,7 @@ msgstr "l'argument est d'un mauvais type"
msgid "argument should be a '%q' not a '%q'"
msgstr "l'argument devrait être un(e) '%q', pas '%q'"
#: py/runtime.c:1123 py/runtime.c:1197
#: py/runtime.c:1123 py/runtime.c:1197 shared-bindings/_pixelbuf/__init__.c:106
msgid "no such attribute"
msgstr "pas de tel attribut"
@ -2057,6 +2057,57 @@ msgstr "aucune exception active à relever"
msgid "byte code not implemented"
msgstr "bytecode non implémenté"
#: shared-bindings/_pixelbuf/PixelBuf.c:99
#, c-format
msgid "byteorder is not an instance of ByteOrder (got a %s)"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:104
#, c-format
msgid "Can not use dotstar with %s"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:116
msgid "rawbuf is not the same size as buf"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:121
#, c-format
msgid "buf is too small. need %d bytes"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:127
msgid "write_args must be a list, tuple, or None"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:392
#, fuzzy
msgid "Only slices with step=1 (aka None) are supported"
msgstr "seuls les slices avec 'step=1' (cad None) sont supportées"
#: shared-bindings/_pixelbuf/PixelBuf.c:394
#, fuzzy
msgid "Range out of bounds"
msgstr "adresse hors limites"
#: shared-bindings/_pixelbuf/PixelBuf.c:403
msgid "tuple/list required on RHS"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:419
#, c-format
msgid "Unmatched number of items on RHS (expected %d, got %d)."
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:442
msgid "Pixel beyond bounds of buffer"
msgstr ""
#: shared-bindings/_pixelbuf/__init__.c:112
#, fuzzy
msgid "readonly attribute"
msgstr "attribut illisible"
#: shared-bindings/_stage/Layer.c:71
msgid "graphic must be 2048 bytes long"
msgstr "le graphic doit être long de 2048 octets"
@ -2585,6 +2636,11 @@ msgstr ""
"L'objet a été désinitialisé et ne peut plus être utilisé. Créez un nouvel "
"objet."
#: shared-module/_pixelbuf/PixelBuf.c:69
#, c-format
msgid "Expected tuple of length %d, got %d"
msgstr ""
#: shared-module/audioio/Mixer.c:47 shared-module/audioio/WaveFile.c:117
msgid "Couldn't allocate first buffer"
msgstr "Impossible d'allouer le 1er tampon"
@ -2833,26 +2889,46 @@ msgstr ""
"Le bouton 'reset' a été appuyé pendant le démarrage de CircuitPython. "
"Appuyer denouveau pour quitter de le mode sans-échec.\n"
#, fuzzy
#~ msgid "palette must be displayio.Palette"
#~ msgstr "la palette doit être une displayio.Palette"
#~ msgid "Invalid UUID string length"
#~ msgstr "Longeur de chaîne UUID invalide"
#~ msgid "Invalid UUID parameter"
#~ msgstr "Paramètre UUID invalide"
#, fuzzy
#~ msgid "palette must be displayio.Palette"
#~ msgstr "la palette doit être une displayio.Palette"
#, fuzzy
#~ msgid "value_size must be power of two"
#~ msgstr "value_size doit être une puissance de 2"
#~ msgid "Cannot apply GAP parameters."
#~ msgstr "Impossible d'appliquer les paramètres GAP"
#~ msgid "Cannot set PPCP parameters."
#~ msgstr "Impossible d'appliquer les paramètres PPCP"
#~ msgid ""
#~ "enough power for the whole circuit and press reset (after ejecting "
#~ "CIRCUITPY).\n"
#~ msgstr ""
#~ "assez de puissance pour l'ensemble du circuit et appuyez sur "
#~ "'reset' (après avoir éjecter CIRCUITPY).\n"
#~ msgid "Invalid Service type"
#~ msgstr "Type de service invalide"
#~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n"
#~ msgstr ""
#~ "Il semblerait que votre code CircuitPython a durement planté. Oups!\n"
#~ msgid "Can not add Characteristic."
#~ msgstr "Impossible d'ajouter la Characteristic."
#~ msgid "Can not apply device name in the stack."
#~ msgstr "Impossible d'appliquer le nom de périphérique dans la pile"
#, fuzzy
#~ msgid "unpack requires a buffer of %d bytes"
#~ msgstr "Echec de l'allocation de %d octets du tampon RX"
#~ msgid ""
#~ "Please file an issue here with the contents of your CIRCUITPY drive:\n"
#~ msgstr ""
@ -2864,36 +2940,16 @@ msgstr ""
#~ msgid "Wrong address length"
#~ msgstr "Mauvaise longueur d'adresse"
#, fuzzy
#~ msgid "value_size must be power of two"
#~ msgstr "value_size doit être une puissance de 2"
#, fuzzy
#~ msgid "Wrong number of bytes provided"
#~ msgstr "mauvais nombre d'octets fourni'"
#~ msgid "Can not apply device name in the stack."
#~ msgstr "Impossible d'appliquer le nom de périphérique dans la pile"
#~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n"
#~ msgstr ""
#~ "Il semblerait que votre code CircuitPython a durement planté. Oups!\n"
#~ msgid ""
#~ "enough power for the whole circuit and press reset (after ejecting "
#~ "CIRCUITPY).\n"
#~ msgstr ""
#~ "assez de puissance pour l'ensemble du circuit et appuyez sur "
#~ "'reset' (après avoir éjecter CIRCUITPY).\n"
#~ msgid "Can not add Service."
#~ msgstr "Impossible d'ajouter le Service"
#~ msgid "Can not query for the device address."
#~ msgstr "Impossible d'obtenir l'adresse du périphérique"
#~ msgid "Can not add Characteristic."
#~ msgstr "Impossible d'ajouter la Characteristic."
#~ msgid "Cannot set PPCP parameters."
#~ msgstr "Impossible d'appliquer les paramètres PPCP"
#, fuzzy
#~ msgid "unpack requires a buffer of %d bytes"
#~ msgstr "Echec de l'allocation de %d octets du tampon RX"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-01-21 21:50-0500\n"
"POT-Creation-Date: 2019-01-22 14:00-0800\n"
"PO-Revision-Date: 2018-10-02 16:27+0200\n"
"Last-Translator: Enrico Paganin <enrico.paganin@mail.com>\n"
"Language-Team: \n"
@ -1973,7 +1973,7 @@ msgstr "il tipo dell'argomento è errato"
msgid "argument should be a '%q' not a '%q'"
msgstr "l'argomento dovrebbe essere un '%q' e non un '%q'"
#: py/runtime.c:1123 py/runtime.c:1197
#: py/runtime.c:1123 py/runtime.c:1197 shared-bindings/_pixelbuf/__init__.c:106
msgid "no such attribute"
msgstr "attributo inesistente"
@ -2052,6 +2052,57 @@ msgstr "nessuna eccezione attiva da rilanciare"
msgid "byte code not implemented"
msgstr "byte code non implementato"
#: shared-bindings/_pixelbuf/PixelBuf.c:99
#, c-format
msgid "byteorder is not an instance of ByteOrder (got a %s)"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:104
#, c-format
msgid "Can not use dotstar with %s"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:116
msgid "rawbuf is not the same size as buf"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:121
#, c-format
msgid "buf is too small. need %d bytes"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:127
msgid "write_args must be a list, tuple, or None"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:392
#, fuzzy
msgid "Only slices with step=1 (aka None) are supported"
msgstr "solo slice con step=1 (aka None) sono supportate"
#: shared-bindings/_pixelbuf/PixelBuf.c:394
#, fuzzy
msgid "Range out of bounds"
msgstr "indirizzo fuori limite"
#: shared-bindings/_pixelbuf/PixelBuf.c:403
msgid "tuple/list required on RHS"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:419
#, c-format
msgid "Unmatched number of items on RHS (expected %d, got %d)."
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:442
msgid "Pixel beyond bounds of buffer"
msgstr ""
#: shared-bindings/_pixelbuf/__init__.c:112
#, fuzzy
msgid "readonly attribute"
msgstr "attributo non leggibile"
#: shared-bindings/_stage/Layer.c:71
msgid "graphic must be 2048 bytes long"
msgstr "graphic deve essere lunga 2048 byte"
@ -2569,6 +2620,11 @@ msgstr ""
"L'oggetto è stato deinizializzato e non può essere più usato. Crea un nuovo "
"oggetto."
#: shared-module/_pixelbuf/PixelBuf.c:69
#, c-format
msgid "Expected tuple of length %d, got %d"
msgstr ""
#: shared-module/audioio/Mixer.c:47 shared-module/audioio/WaveFile.c:117
msgid "Couldn't allocate first buffer"
msgstr "Impossibile allocare il primo buffer"
@ -2802,24 +2858,44 @@ msgid ""
"exit safe mode.\n"
msgstr ""
#~ msgid "Invalid UUID string length"
#~ msgstr "Lunghezza della stringa UUID non valida"
#~ msgid "Invalid UUID parameter"
#~ msgstr "Parametro UUID non valido"
#~ msgid "Invalid Service type"
#~ msgstr "Tipo di servizio non valido"
#~ msgid "Invalid UUID string length"
#~ msgstr "Lunghezza della stringa UUID non valida"
#, fuzzy
#~ msgid "Wrong number of bytes provided"
#~ msgstr "numero di argomenti errato"
#~ msgid "Invalid Service type"
#~ msgstr "Tipo di servizio non valido"
#~ msgid "Cannot set PPCP parameters."
#~ msgstr "Impossibile impostare i parametri PPCP."
#~ msgid "Can not add Characteristic."
#~ msgstr "Non è possibile aggiungere Characteristic."
#~ msgid "Cannot apply GAP parameters."
#~ msgstr "Impossibile applicare i parametri GAP."
#~ msgid "Can not apply advertisement data. status: 0x%02x"
#~ msgstr "Impossible inserire dati advertisement. status: 0x%02x"
#~ msgid "Can not add Service."
#~ msgstr "Non è possibile aggiungere Service."
#~ msgid ""
#~ "enough power for the whole circuit and press reset (after ejecting "
#~ "CIRCUITPY).\n"
#~ msgstr ""
#~ "abbastanza potenza per l'intero circuito e premere reset (dopo aver "
#~ "espulso CIRCUITPY).\n"
#, fuzzy
#~ msgid "unpack requires a buffer of %d bytes"
#~ msgstr "Fallita allocazione del buffer RX di %d byte"
#~ msgid "Can not query for the device address."
#~ msgstr "Non è possibile trovare l'indirizzo del dispositivo."
#~ msgid "Can not encode UUID, to check length."
#~ msgstr "Non è possibile codificare l'UUID, lunghezza da controllare."
@ -2833,33 +2909,13 @@ msgstr ""
#~ msgid "Can encode UUID into the advertisement packet."
#~ msgstr "È possibile codificare l'UUID nel pacchetto di advertisement."
#~ msgid "Can not add Characteristic."
#~ msgstr "Non è possibile aggiungere Characteristic."
#~ msgid "Can not apply device name in the stack."
#~ msgstr "Non è possibile inserire il nome del dipositivo nella lista."
#~ msgid "Can not add Service."
#~ msgstr "Non è possibile aggiungere Service."
#~ msgid "Can not apply advertisement data. status: 0x%02x"
#~ msgstr "Impossible inserire dati advertisement. status: 0x%02x"
#~ msgid "Can not query for the device address."
#~ msgstr "Non è possibile trovare l'indirizzo del dispositivo."
#~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n"
#~ msgstr ""
#~ "Sembra che il codice del core di CircuitPython sia crashato malamente. "
#~ "Whoops!\n"
#~ msgid ""
#~ "enough power for the whole circuit and press reset (after ejecting "
#~ "CIRCUITPY).\n"
#~ msgstr ""
#~ "abbastanza potenza per l'intero circuito e premere reset (dopo aver "
#~ "espulso CIRCUITPY).\n"
#~ msgid "Cannot apply GAP parameters."
#~ msgstr "Impossibile applicare i parametri GAP."
#, fuzzy
#~ msgid "unpack requires a buffer of %d bytes"
#~ msgstr "Fallita allocazione del buffer RX di %d byte"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-01-21 21:50-0500\n"
"POT-Creation-Date: 2019-01-22 14:00-0800\n"
"PO-Revision-Date: 2018-10-02 21:14-0000\n"
"Last-Translator: \n"
"Language-Team: \n"
@ -1948,7 +1948,7 @@ msgstr "argumento tem tipo errado"
msgid "argument should be a '%q' not a '%q'"
msgstr ""
#: py/runtime.c:1123 py/runtime.c:1197
#: py/runtime.c:1123 py/runtime.c:1197 shared-bindings/_pixelbuf/__init__.c:106
msgid "no such attribute"
msgstr ""
@ -2027,6 +2027,55 @@ msgstr ""
msgid "byte code not implemented"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:99
#, c-format
msgid "byteorder is not an instance of ByteOrder (got a %s)"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:104
#, c-format
msgid "Can not use dotstar with %s"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:116
msgid "rawbuf is not the same size as buf"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:121
#, c-format
msgid "buf is too small. need %d bytes"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:127
msgid "write_args must be a list, tuple, or None"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:392
msgid "Only slices with step=1 (aka None) are supported"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:394
msgid "Range out of bounds"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:403
msgid "tuple/list required on RHS"
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:419
#, c-format
msgid "Unmatched number of items on RHS (expected %d, got %d)."
msgstr ""
#: shared-bindings/_pixelbuf/PixelBuf.c:442
msgid "Pixel beyond bounds of buffer"
msgstr ""
#: shared-bindings/_pixelbuf/__init__.c:112
#, fuzzy
msgid "readonly attribute"
msgstr "atributo ilegível"
#: shared-bindings/_stage/Layer.c:71
msgid "graphic must be 2048 bytes long"
msgstr ""
@ -2528,6 +2577,11 @@ msgid ""
msgstr ""
"Objeto foi desinicializado e não pode ser mais usaado. Crie um novo objeto."
#: shared-module/_pixelbuf/PixelBuf.c:69
#, c-format
msgid "Expected tuple of length %d, got %d"
msgstr ""
#: shared-module/audioio/Mixer.c:47 shared-module/audioio/WaveFile.c:117
msgid "Couldn't allocate first buffer"
msgstr "Não pôde alocar primeiro buffer"
@ -2753,36 +2807,36 @@ msgid ""
"exit safe mode.\n"
msgstr ""
#~ msgid "Cannot set PPCP parameters."
#~ msgstr "Não é possível definir parâmetros PPCP."
#~ msgid "Can not query for the device address."
#~ msgstr "Não é possível consultar o endereço do dispositivo."
#~ msgid "Invalid Service type"
#~ msgstr "Tipo de serviço inválido"
#~ msgid "Can not apply device name in the stack."
#~ msgstr "Não é possível aplicar o nome do dispositivo na pilha."
#~ msgid "Baud rate too high for this SPI peripheral"
#~ msgstr "Taxa de transmissão muito alta para esse periférico SPI"
#~ msgid "Can not add Characteristic."
#~ msgstr "Não é possível adicionar Característica."
#~ msgid "Cannot apply GAP parameters."
#~ msgstr "Não é possível aplicar parâmetros GAP."
#~ msgid "Invalid UUID parameter"
#~ msgstr "Parâmetro UUID inválido"
#~ msgid "Can not apply advertisement data. status: 0x%02x"
#~ msgstr "Não é possível aplicar dados de anúncio. status: 0x%02x"
#~ msgid "Can encode UUID into the advertisement packet."
#~ msgstr "Pode codificar o UUID no pacote de anúncios."
#~ msgid "Cannot set PPCP parameters."
#~ msgstr "Não é possível definir parâmetros PPCP."
#, fuzzy
#~ msgid "unpack requires a buffer of %d bytes"
#~ msgstr "Falha ao alocar buffer RX de %d bytes"
#~ msgid "Can not apply advertisement data. status: 0x%02x"
#~ msgstr "Não é possível aplicar dados de anúncio. status: 0x%02x"
#~ msgid "Can not add Characteristic."
#~ msgstr "Não é possível adicionar Característica."
#~ msgid "Baud rate too high for this SPI peripheral"
#~ msgstr "Taxa de transmissão muito alta para esse periférico SPI"
#~ msgid "Can not apply device name in the stack."
#~ msgstr "Não é possível aplicar o nome do dispositivo na pilha."
#~ msgid "Invalid UUID parameter"
#~ msgstr "Parâmetro UUID inválido"
#~ msgid "Invalid Service type"
#~ msgstr "Tipo de serviço inválido"
#~ msgid "Cannot apply GAP parameters."
#~ msgstr "Não é possível aplicar parâmetros GAP."

View File

@ -191,6 +191,10 @@ LDFLAGS += -mthumb -mcpu=cortex-m4
BOOTLOADER_SIZE := 0x4000
endif
ifdef EXCLUDE_PIXELBUF
CFLAGS += -DEXCLUDE_PIXELBUF
endif
SRC_ASF := \
gcc/gcc/startup_$(CHIP_FAMILY).c \
gcc/system_$(CHIP_FAMILY).c \
@ -421,6 +425,11 @@ ifneq ($(CHIP_VARIANT),SAMR21G18A)
audioio/WaveFile.c
endif
ifndef EXCLUDE_PIXELBUF
SRC_SHARED_MODULE += _pixelbuf/__init__.c \
_pixelbuf/PixelBuf.c
endif
# The smallest SAMD51 packages don't have I2S. Everything else does.
ifneq ($(CHIP_VARIANT),SAMD51G18A)
ifneq ($(CHIP_VARIANT),SAMD51G19A)

View File

@ -9,3 +9,5 @@ LONGINT_IMPL = NONE
CHIP_VARIANT = SAMD21G18A
CHIP_FAMILY = samd21
EXCLUDE_PIXELBUF = 1

View File

@ -9,6 +9,8 @@ EXTERNAL_FLASH_DEVICE_COUNT = 2
EXTERNAL_FLASH_DEVICES = "S25FL216K, GD25Q16C"
# Turn off longints for Crickit build to make room for additional frozen libs.
LONGINT_IMPL = NONE
# Disable pixelbuf to save room
EXCLUDE_PIXELBUF = 1
CHIP_VARIANT = SAMD21G18A
CHIP_FAMILY = samd21

View File

@ -9,3 +9,5 @@ LONGINT_IMPL = NONE
CHIP_VARIANT = SAMD21G18A
CHIP_FAMILY = samd21
EXCLUDE_PIXELBUF = 1

View File

@ -9,6 +9,9 @@ EXTERNAL_FLASH_DEVICE_COUNT = 2
EXTERNAL_FLASH_DEVICES = "W25Q64JV_IQ, GD25Q64C"
LONGINT_IMPL = MPZ
# Disable pixelbuf to save room
EXCLUDE_PIXELBUF = 1
CHIP_VARIANT = SAMD21G18A
CHIP_FAMILY = samd21

View File

@ -16,3 +16,5 @@ CFLAGS_INLINE_LIMIT = 45
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_DotStar
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_HID
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_IRRemote
EXCLUDE_PIXELBUF = 1

View File

@ -9,3 +9,5 @@ LONGINT_IMPL = NONE
CHIP_VARIANT = SAMD21E18A
CHIP_FAMILY = samd21
EXCLUDE_PIXELBUF = 1

View File

@ -241,6 +241,9 @@ extern const struct _mp_obj_module_t usb_midi_module;
extern const struct _mp_obj_module_t network_module;
extern const struct _mp_obj_module_t socket_module;
extern const struct _mp_obj_module_t wiznet_module;
#ifndef EXCLUDE_PIXELBUF
extern const struct _mp_obj_module_t pixelbuf_module;
#endif
// Internal flash size dependent settings.
#if BOARD_FLASH_SIZE > 192000
@ -310,6 +313,11 @@ extern const struct _mp_obj_module_t wiznet_module;
#define JSON_MODULE
#endif
#ifndef EXCLUDE_PIXELBUF
#define PIXELBUF_MODULE { MP_OBJ_NEW_QSTR(MP_QSTR__pixelbuf),(mp_obj_t)&pixelbuf_module }
#else
#define PIXELBUF_MODULE
#endif
#ifndef EXTRA_BUILTIN_MODULES
#define EXTRA_BUILTIN_MODULES \
@ -323,7 +331,8 @@ extern const struct _mp_obj_module_t wiznet_module;
WIZNET_MODULE \
JSON_MODULE \
{ MP_OBJ_NEW_QSTR(MP_QSTR_rotaryio), (mp_obj_t)&rotaryio_module }, \
{ MP_OBJ_NEW_QSTR(MP_QSTR_gamepad),(mp_obj_t)&gamepad_module }
{ MP_OBJ_NEW_QSTR(MP_QSTR_gamepad),(mp_obj_t)&gamepad_module }, \
PIXELBUF_MODULE
#endif
#define EXPRESS_BOARD

View File

@ -149,6 +149,11 @@ SRC_SHARED_MODULE = \
random/__init__.c \
struct/__init__.c
ifndef EXCLUDE_PIXELBUF
SRC_SHARED_MODULE += _pixelbuf/__init__.c \
_pixelbuf/PixelBuf.c
endif
SRC_SHARED_MODULE_EXPANDED = $(addprefix shared-bindings/, $(SRC_SHARED_MODULE)) \
$(addprefix shared-module/, $(SRC_SHARED_MODULE))

View File

@ -227,6 +227,12 @@ SRC_SHARED_MODULE = \
displayio/Sprite.c \
storage/__init__.c
ifndef EXCLUDE_PIXELBUF
SRC_SHARED_MODULE += _pixelbuf/__init__.c \
_pixelbuf/PixelBuf.c
endif
# uheap/__init__.c \
ustack/__init__.c

View File

@ -0,0 +1,477 @@
/*
* This file is part of the Circuit Python project, https://github.com/adafruit/circuitpython
*
* The MIT License (MIT)
*
* Copyright (c) 2018 Roy Hooper
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include "py/obj.h"
#include "py/objarray.h"
#include "py/mphal.h"
#include "py/runtime.h"
#include "py/binary.h"
#include "py/objproperty.h"
#include "py/runtime.h"
#include "py/gc.h"
#include <string.h>
#include "PixelBuf.h"
#include "shared-bindings/_pixelbuf/types.h"
#include "../../shared-module/_pixelbuf/PixelBuf.h"
#include "shared-bindings/digitalio/DigitalInOut.h"
extern const pixelbuf_byteorder_obj_t byteorder_BGR;
extern const mp_obj_type_t pixelbuf_byteorder_type;
extern const int32_t colorwheel(float pos);
//| .. currentmodule:: pixelbuf
//|
//| :class:`PixelBuf` -- A fast RGB[W] pixel buffer for LED and similar devices
//| ===========================================================================
//|
//| :class:`~_pixelbuf.PixelBuf` implements an RGB[W] bytearray abstraction.
//|
//| .. class:: PixelBuf(size, buf, byteorder=BGR, bpp=3)
//|
//| Create a PixelBuf object of the specified size, byteorder, and bits per pixel.
//|
//| When given a second bytearray (``rawbuf``), changing brightness adjusts the
//| brightness of all members of ``buf``.
//|
//| When only given ``buf``, ``brightness`` applies to the next pixel assignment.
//|
//| When ``dotstar`` is True, and ``bpp`` is 4, the 4th value in a tuple/list
//| is the individual pixel brightness (0-1). Not compatible with RGBW Byteorders.
//| Compatible `ByteOrder` classes are bpp=3, or bpp=4 and has_luminosity=True (g LBGR).
//|
//| :param ~int size: Number of pixelsx
//| :param ~bytearray buf: Bytearray to store pixel data in
//| :param ~_pixelbuf.ByteOrder byteorder: Byte order constant from `_pixelbuf` (also sets the bpp)
//| :param ~float brightness: Brightness (0 to 1.0, default 1.0)
//| :param ~bytearray rawbuf: Bytearray to store raw pixel colors in
//| :param ~int offset: Offset from start of buffer (default 0)
//| :param ~bool dotstar: Dotstar mode (default False)
//| :param ~bool auto_write: Whether to automatically write pixels (Default False)
//| :param ~callable write_function: (optional) Callable to use to send pixels
//| :param ~list write_args: (optional) Tuple or list of args to pass to ``write_function``. The
//| PixelBuf instance is appended after these args.
//|
STATIC mp_obj_t pixelbuf_pixelbuf_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
mp_arg_check_num(n_args, kw_args, 2, MP_OBJ_FUN_ARGS_MAX, true);
enum { ARG_size, ARG_buf, ARG_byteorder, ARG_brightness, ARG_rawbuf, ARG_offset, ARG_dotstar,
ARG_auto_write, ARG_write_function, ARG_write_args };
static const mp_arg_t allowed_args[] = {
{ MP_QSTR_size, MP_ARG_REQUIRED | MP_ARG_INT },
{ MP_QSTR_buf, MP_ARG_REQUIRED | MP_ARG_OBJ },
{ MP_QSTR_byteorder, MP_ARG_OBJ, { .u_obj = mp_const_none } },
{ MP_QSTR_brightness, MP_ARG_OBJ, { .u_obj = mp_const_none } },
{ MP_QSTR_rawbuf, MP_ARG_OBJ, { .u_obj = mp_const_none } },
{ MP_QSTR_offset, MP_ARG_INT, { .u_int = 0 } },
{ MP_QSTR_dotstar, MP_ARG_BOOL, { .u_bool = false } },
{ MP_QSTR_auto_write, MP_ARG_BOOL, {.u_bool = false} },
{ MP_QSTR_write_function, MP_ARG_OBJ, {.u_obj = mp_const_none} },
{ MP_QSTR_write_args, MP_ARG_OBJ, {.u_obj = mp_const_none} },
};
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
if (mp_obj_is_subclass_fast(args[ARG_byteorder].u_obj, &pixelbuf_byteorder_type))
mp_raise_TypeError_varg(translate("byteorder is not an instance of ByteOrder (got a %s)"), mp_obj_get_type_str(args[ARG_byteorder].u_obj));
pixelbuf_byteorder_obj_t *byteorder = (args[ARG_byteorder].u_obj == mp_const_none) ? MP_OBJ_FROM_PTR(&byteorder_BGR) : args[ARG_byteorder].u_obj;
if (byteorder->has_white && args[ARG_dotstar].u_bool)
mp_raise_ValueError_varg(translate("Can not use dotstar with %s"), mp_obj_get_type_str(byteorder));
size_t effective_bpp = args[ARG_dotstar].u_bool ? 4 : byteorder->bpp; // Always 4 for DotStar
size_t bytes = args[ARG_size].u_int * effective_bpp;
size_t offset = args[ARG_offset].u_int;
mp_buffer_info_t bufinfo, rawbufinfo;
mp_get_buffer_raise(args[ARG_buf].u_obj, &bufinfo, MP_BUFFER_READ | MP_BUFFER_WRITE);
bool two_buffers = args[ARG_rawbuf].u_obj != mp_const_none;
if (two_buffers) {
mp_get_buffer_raise(args[ARG_rawbuf].u_obj, &rawbufinfo, MP_BUFFER_READ | MP_BUFFER_WRITE);
if (rawbufinfo.len != bufinfo.len) {
mp_raise_ValueError(translate("rawbuf is not the same size as buf"));
}
}
if (bytes + offset > bufinfo.len)
mp_raise_ValueError_varg(translate("buf is too small. need %d bytes"), bytes + offset);
if (!MP_OBJ_IS_TYPE(args[ARG_write_args].u_obj, &mp_type_list) &&
!MP_OBJ_IS_TYPE(args[ARG_write_args].u_obj, &mp_type_tuple) &&
args[ARG_write_args].u_obj != mp_const_none)
{
mp_raise_ValueError(translate("write_args must be a list, tuple, or None"));
}
// Validation complete, allocate and populate object.
pixelbuf_pixelbuf_obj_t *self = m_new_obj(pixelbuf_pixelbuf_obj_t);
self->base.type = &pixelbuf_pixelbuf_type;
self->pixels = args[ARG_size].u_int;
self->bytes = bytes;
self->byteorder = *byteorder; // Copied because we modify for dotstar
self->bytearray = args[ARG_buf].u_obj;
self->two_buffers = two_buffers;
self->rawbytearray = two_buffers ? args[ARG_rawbuf].u_obj : NULL;
self->offset = offset;
self->dotstar_mode = args[ARG_dotstar].u_bool;
self->buf = (uint8_t *)bufinfo.buf + offset;
self->rawbuf = two_buffers ? (uint8_t *)rawbufinfo.buf + offset : NULL;
self->pixel_step = effective_bpp;
self->auto_write = args[ARG_auto_write].u_bool;
if (self->dotstar_mode) {
// Ensure sane configuration
if (!self->byteorder.has_luminosity) {
self->byteorder.has_luminosity = true;
self->byteorder.byteorder.b += 1;
self->byteorder.byteorder.g += 1;
self->byteorder.byteorder.r += 1;
}
self->byteorder.byteorder.w = 0;
}
// Show/auto-write callbacks
self->write_function = args[ARG_write_function].u_obj;
mp_obj_t function_args = args[ARG_write_args].u_obj;
mp_obj_t *src_objs = (mp_obj_t *)&mp_const_none_obj;
size_t num_items = 0;
if (function_args != mp_const_none) {
if (MP_OBJ_IS_TYPE(function_args, &mp_type_list)) {
mp_obj_list_t *t = MP_OBJ_TO_PTR(function_args);
num_items = t->len;
src_objs = t->items;
} else {
mp_obj_tuple_t *l = MP_OBJ_TO_PTR(function_args);
num_items = l->len;
src_objs = l->items;
}
}
self->write_function_args = mp_obj_new_tuple(num_items + 1, NULL);
for (size_t i = 0; i < num_items; i++) {
self->write_function_args->items[i] = src_objs[i];
}
self->write_function_args->items[num_items] = self;
if (args[ARG_brightness].u_obj == mp_const_none) {
self->brightness = 1.0;
} else {
self->brightness = mp_obj_get_float(args[ARG_brightness].u_obj);
if (self->brightness < 0)
self->brightness = 0;
else if (self->brightness > 1)
self->brightness = 1;
}
if (self->dotstar_mode) {
// Initialize the buffer with the dotstar start bytes.
// Header and end must be setup by caller
for (uint i = 0; i < self->pixels * 4; i += 4) {
self->buf[i] = DOTSTAR_LED_START_FULL_BRIGHT;
if (two_buffers) {
self->rawbuf[i] = DOTSTAR_LED_START_FULL_BRIGHT;
}
}
}
return MP_OBJ_FROM_PTR(self);
}
//| .. attribute:: bpp
//|
//| The number of bytes per pixel in the buffer (read-only)
//|
STATIC mp_obj_t pixelbuf_pixelbuf_obj_get_bpp(mp_obj_t self_in) {
mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type));
pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in);
return mp_obj_new_int_from_uint(self->byteorder.bpp);
}
MP_DEFINE_CONST_FUN_OBJ_1(pixelbuf_pixelbuf_get_bpp_obj, pixelbuf_pixelbuf_obj_get_bpp);
const mp_obj_property_t pixelbuf_pixelbuf_bpp_obj = {
.base.type = &mp_type_property,
.proxy = {(mp_obj_t)&pixelbuf_pixelbuf_get_bpp_obj,
(mp_obj_t)&mp_const_none_obj,
(mp_obj_t)&mp_const_none_obj},
};
//| .. attribute:: brightness
//|
//| Float value between 0 and 1. Output brightness.
//| If the PixelBuf was allocated with two both a buf and a rawbuf,
//| setting this value causes a recomputation of the values in buf.
//| If only a buf was provided, then the brightness only applies to
//| future pixel changes.
//| In DotStar mode
//|
STATIC mp_obj_t pixelbuf_pixelbuf_obj_get_brightness(mp_obj_t self_in) {
mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type));
pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in);
return mp_obj_new_float(self->brightness);
}
MP_DEFINE_CONST_FUN_OBJ_1(pixelbuf_pixelbuf_get_brightness_obj, pixelbuf_pixelbuf_obj_get_brightness);
STATIC mp_obj_t pixelbuf_pixelbuf_obj_set_brightness(mp_obj_t self_in, mp_obj_t value) {
mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type));
pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in);
self->brightness = mp_obj_float_get(value);
if (self->brightness > 1)
self->brightness = 1;
else if (self->brightness < 0)
self->brightness = 0;
if (self->two_buffers)
pixelbuf_recalculate_brightness(self);
if (self->auto_write)
call_write_function(self);
return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_2(pixelbuf_pixelbuf_set_brightness_obj, pixelbuf_pixelbuf_obj_set_brightness);
const mp_obj_property_t pixelbuf_pixelbuf_brightness_obj = {
.base.type = &mp_type_property,
.proxy = {(mp_obj_t)&pixelbuf_pixelbuf_get_brightness_obj,
(mp_obj_t)&pixelbuf_pixelbuf_set_brightness_obj,
(mp_obj_t)&mp_const_none_obj},
};
void pixelbuf_recalculate_brightness(pixelbuf_pixelbuf_obj_t *self) {
uint8_t *buf = (uint8_t *)self->buf;
uint8_t *rawbuf = (uint8_t *)self->rawbuf;
// Compensate for shifted buffer (bpp=3 dotstar)
for (uint i = 0; i < self->bytes; i++) {
// Don't adjust per-pixel luminance bytes in dotstar mode
if (!self->dotstar_mode || (i % 4 != 0))
buf[i] = rawbuf[i] * self->brightness;
}
}
//| .. attribute:: auto_write
//|
//| Whether to automatically write the pixels after each update.
//|
STATIC mp_obj_t pixelbuf_pixelbuf_obj_get_auto_write(mp_obj_t self_in) {
mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type));
pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in);
return mp_obj_new_bool(self->auto_write);
}
MP_DEFINE_CONST_FUN_OBJ_1(pixelbuf_pixelbuf_get_auto_write_obj, pixelbuf_pixelbuf_obj_get_auto_write);
STATIC mp_obj_t pixelbuf_pixelbuf_obj_set_auto_write(mp_obj_t self_in, mp_obj_t value) {
mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type));
pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in);
self->auto_write = mp_obj_is_true(value);
return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_2(pixelbuf_pixelbuf_set_auto_write_obj, pixelbuf_pixelbuf_obj_set_auto_write);
const mp_obj_property_t pixelbuf_pixelbuf_auto_write_obj = {
.base.type = &mp_type_property,
.proxy = {(mp_obj_t)&pixelbuf_pixelbuf_get_auto_write_obj,
(mp_obj_t)&pixelbuf_pixelbuf_set_auto_write_obj,
(mp_obj_t)&mp_const_none_obj},
};
//| .. attribute:: buf
//|
//| (read-only) bytearray of pixel data after brightness adjustment. If an offset was provided
//| then this bytearray is the subset of the bytearray passed in that represents the
//| actual pixels.
//|
STATIC mp_obj_t pixelbuf_pixelbuf_obj_get_buf(mp_obj_t self_in) {
mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type));
pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in);
return mp_obj_new_bytearray_by_ref(self->bytes, self->buf);
}
MP_DEFINE_CONST_FUN_OBJ_1(pixelbuf_pixelbuf_get_buf_obj, pixelbuf_pixelbuf_obj_get_buf);
const mp_obj_property_t pixelbuf_pixelbuf_buf_obj = {
.base.type = &mp_type_property,
.proxy = {(mp_obj_t)&pixelbuf_pixelbuf_get_buf_obj,
(mp_obj_t)&mp_const_none_obj,
(mp_obj_t)&mp_const_none_obj},
};
//| .. attribute:: byteorder
//|
//| `ByteOrder` class for the buffer (read-only)
//|
STATIC mp_obj_t pixelbuf_pixelbuf_obj_get_byteorder(mp_obj_t self_in) {
mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type));
pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in);
return &self->byteorder;
}
MP_DEFINE_CONST_FUN_OBJ_1(pixelbuf_pixelbuf_get_byteorder_obj, pixelbuf_pixelbuf_obj_get_byteorder);
const mp_obj_property_t pixelbuf_pixelbuf_byteorder_obj = {
.base.type = &mp_type_property,
.proxy = {(mp_obj_t)&pixelbuf_pixelbuf_get_byteorder_obj,
(mp_obj_t)&mp_const_none_obj,
(mp_obj_t)&mp_const_none_obj},
};
STATIC mp_obj_t pixelbuf_pixelbuf_unary_op(mp_unary_op_t op, mp_obj_t self_in) {
mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type));
pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in);
switch (op) {
case MP_UNARY_OP_BOOL: return mp_const_true;
case MP_UNARY_OP_LEN: return MP_OBJ_NEW_SMALL_INT(self->pixels);
default: return MP_OBJ_NULL; // op not supported
}
}
//| .. method:: show()
//|
//| Call the associated write function to display the pixels.
//|
STATIC mp_obj_t pixelbuf_pixelbuf_show(mp_obj_t self_in) {
mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type));
pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in);
call_write_function(self);
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(pixelbuf_pixelbuf_show_obj, pixelbuf_pixelbuf_show);
void call_write_function(pixelbuf_pixelbuf_obj_t *self) {
// execute function if it's set
if (self->write_function != mp_const_none) {
mp_call_function_n_kw(self->write_function, self->write_function_args->len, 0, self->write_function_args->items);
}
}
//| .. method:: []
//|
//| Get or set pixels. Supports individual pixels and slices.
//|
STATIC mp_obj_t pixelbuf_pixelbuf_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_obj_t value) {
mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type));
if (value == MP_OBJ_NULL) {
// delete item
// slice deletion
return MP_OBJ_NULL; // op not supported
}
pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in);
if (0) {
#if MICROPY_PY_BUILTINS_SLICE
} else if (MP_OBJ_IS_TYPE(index_in, &mp_type_slice)) {
mp_bound_slice_t slice;
if (!mp_seq_get_fast_slice_indexes(self->bytes, index_in, &slice))
mp_raise_NotImplementedError(translate("Only slices with step=1 (aka None) are supported"));
if ((slice.stop * self->pixel_step) > self->bytes)
mp_raise_IndexError(translate("Range out of bounds"));
if (value == MP_OBJ_SENTINEL) { // Get
size_t len = slice.stop - slice.start;
return pixelbuf_get_pixel_array((uint8_t *) self->buf + slice.start, len, &self->byteorder, self->pixel_step, self->dotstar_mode);
} else { // Set
#if MICROPY_PY_ARRAY_SLICE_ASSIGN
if (!(MP_OBJ_IS_TYPE(value, &mp_type_list) || MP_OBJ_IS_TYPE(value, &mp_type_tuple)))
mp_raise_ValueError(translate("tuple/list required on RHS"));
size_t dst_len = slice.stop - slice.start;
mp_obj_t *src_objs;
size_t num_items;
if (MP_OBJ_IS_TYPE(value, &mp_type_list)) {
mp_obj_list_t *t = MP_OBJ_TO_PTR(value);
num_items = t->len;
src_objs = t->items;
} else {
mp_obj_tuple_t *l = MP_OBJ_TO_PTR(value);
num_items = l->len;
src_objs = l->items;
}
if (num_items != dst_len)
mp_raise_ValueError_varg(translate("Unmatched number of items on RHS (expected %d, got %d)."),
dst_len, num_items);
for (size_t i = slice.start; i < slice.stop; i++) {
mp_obj_t *item = src_objs[i-slice.start];
if (MP_OBJ_IS_TYPE(value, &mp_type_list) || MP_OBJ_IS_TYPE(value, &mp_type_tuple) || MP_OBJ_IS_INT(value)) {
pixelbuf_set_pixel(self->buf + (i * self->pixel_step),
self->two_buffers ? self->rawbuf + (i * self->pixel_step) : NULL,
self->brightness, item, &self->byteorder, self->dotstar_mode);
}
}
if (self->auto_write)
call_write_function(self);
return mp_const_none;
#else
return MP_OBJ_NULL; // op not supported
#endif
}
#endif
} else { // Single index rather than slice.
size_t index = mp_get_index(self->base.type, self->pixels, index_in, false);
size_t offset = (index * self->pixel_step);
if (offset > self->bytes)
mp_raise_IndexError(translate("Pixel beyond bounds of buffer"));
if (value == MP_OBJ_SENTINEL) { // Get
uint8_t *pixelstart = (uint8_t *)(self->two_buffers ? self->rawbuf : self->buf) + offset;
return pixelbuf_get_pixel(pixelstart, &self->byteorder, self->dotstar_mode);
} else { // Store
pixelbuf_set_pixel(self->buf + offset, self->two_buffers ? self->rawbuf + offset : NULL,
self->brightness, value, &self->byteorder, self->dotstar_mode);
if (self->auto_write)
call_write_function(self);
return mp_const_none;
}
}
}
STATIC const mp_rom_map_elem_t pixelbuf_pixelbuf_locals_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_auto_write), MP_ROM_PTR(&pixelbuf_pixelbuf_auto_write_obj)},
{ MP_ROM_QSTR(MP_QSTR_bpp), MP_ROM_PTR(&pixelbuf_pixelbuf_bpp_obj)},
{ MP_ROM_QSTR(MP_QSTR_brightness), MP_ROM_PTR(&pixelbuf_pixelbuf_brightness_obj)},
{ MP_ROM_QSTR(MP_QSTR_buf), MP_ROM_PTR(&pixelbuf_pixelbuf_buf_obj)},
{ MP_ROM_QSTR(MP_QSTR_byteorder), MP_ROM_PTR(&pixelbuf_pixelbuf_byteorder_obj)},
{ MP_ROM_QSTR(MP_QSTR_show), MP_ROM_PTR(&pixelbuf_pixelbuf_show_obj)},
};
STATIC MP_DEFINE_CONST_DICT(pixelbuf_pixelbuf_locals_dict, pixelbuf_pixelbuf_locals_dict_table);
const mp_obj_type_t pixelbuf_pixelbuf_type = {
{ &mp_type_type },
.name = MP_QSTR_PixelBuf,
.subscr = pixelbuf_pixelbuf_subscr,
.make_new = pixelbuf_pixelbuf_make_new,
.unary_op = pixelbuf_pixelbuf_unary_op,
.print = NULL,
.locals_dict = (mp_obj_t)&pixelbuf_pixelbuf_locals_dict,
};

View File

@ -0,0 +1,56 @@
/*
* This file is part of the Circuit Python project, https://github.com/adafruit/circuitpython
*
* The MIT License (MIT)
*
* Copyright (c) 2018 Roy Hooper
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#ifndef CP_SHARED_BINDINGS_PIXELBUF_PIXELBUF_H
#define CP_SHARED_BINDINGS_PIXELBUF_PIXELBUF_H
#include "shared-bindings/_pixelbuf/types.h"
const mp_obj_type_t pixelbuf_pixelbuf_type;
typedef struct {
mp_obj_base_t base;
size_t pixels;
size_t bytes;
size_t pixel_step;
pixelbuf_byteorder_obj_t byteorder;
mp_obj_t bytearray;
mp_obj_t rawbytearray;
mp_float_t brightness;
bool two_buffers;
size_t offset;
bool dotstar_mode;
uint8_t *rawbuf;
uint8_t *buf;
mp_obj_t write_function;
mp_obj_tuple_t *write_function_args;
bool auto_write;
} pixelbuf_pixelbuf_obj_t;
void pixelbuf_recalculate_brightness(pixelbuf_pixelbuf_obj_t *self);
void call_write_function(pixelbuf_pixelbuf_obj_t *self);
#endif // CP_SHARED_BINDINGS_PIXELBUF_PIXELBUF_H

View File

@ -0,0 +1,326 @@
/*
* This file is part of the Circuit Python project, https://github.com/adafruit/circuitpython
*
* The MIT License (MIT)
*
* Copyright (c) 2018 Roy Hooper
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include "py/obj.h"
#include "py/mphal.h"
#include "py/runtime.h"
#include "py/objproperty.h"
#include "types.h"
#include "__init__.h"
#include "PixelBuf.h"
#include "../../shared-module/_pixelbuf/PixelBuf.h"
//| :mod:`_pixelbuf` --- Fast RGB(W) pixel buffer and helpers
//| ===========================================================
//| .. module:: _pixelbuf
//| :synopsis: A fast RGB(W) pixel buffer library for like NeoPixel and DotStar.
//|
//| The `_pixelbuf` module provides :py:class:`PixelBuf` and :py:class:`ByteOrder` classes to accelerate
//| RGB(W) strip/matrix manipulation, such as DotStar and Neopixel.
//|
//| Libraries
//|
//| .. toctree::
//| :maxdepth: 3
//|
//| PixelBuf
//| .. class:: ByteOrder
//|
//| Classes representing byteorders for circuitpython
//| .. attribute:: bpp
//|
//| The number of bytes per pixel (read-only)
//|
//| .. attribute:: has_white
//|
//| Whether the pixel has white (in addition to RGB)
//|
//| .. attribute:: has_luminosity
//|
//| Whether the pixel has luminosity (in addition to RGB)
//|
//| .. attribute:: byteorder
//|
//| Tuple of byte order (r, g, b) or (r, g, b, w) or (r, g, b, l)
//|
STATIC void pixelbuf_byteorder_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {
mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_byteorder_type));
pixelbuf_byteorder_obj_t *self = MP_OBJ_TO_PTR(self_in);
if (dest[0] == MP_OBJ_NULL) {
// load attribute
mp_obj_t val;
if (attr == MP_QSTR_bpp) {
val = MP_OBJ_NEW_SMALL_INT(self->bpp);
} else if (attr == MP_QSTR_has_white) {
val = mp_obj_new_bool(self->has_white);
} else if (attr == MP_QSTR_has_luminosity) {
val = mp_obj_new_bool(self->has_luminosity);
} else if (attr == MP_QSTR_byteorder) {
mp_obj_t items[4];
uint8_t n = self->bpp;
if (self->has_luminosity || self->has_white) {
n = 4;
}
uint8_t *values = (uint8_t *)&(self->byteorder);
for (uint8_t i=0; i<n; i++) {
items[i] = MP_OBJ_NEW_SMALL_INT(values[i]);
}
val = mp_obj_new_tuple(n, items);
} else {
mp_raise_AttributeError(translate("no such attribute"));
}
dest[0] = val;
} else {
// delete/store attribute (ignored)
dest[0] = MP_OBJ_NULL;
mp_raise_AttributeError(translate("readonly attribute"));
}
}
STATIC mp_obj_t pixelbuf_byteorder_unary_op(mp_unary_op_t op, mp_obj_t self_in) {
pixelbuf_byteorder_obj_t *self = MP_OBJ_TO_PTR(self_in);
switch (op) {
case MP_UNARY_OP_LEN: return MP_OBJ_NEW_SMALL_INT(self->bpp);
default: return MP_OBJ_NULL; // op not supported
}
}
const mp_obj_type_t pixelbuf_byteorder_type = {
{ &mp_type_type },
.name = MP_QSTR_ByteOrder,
.print = pixelbuf_byteorder_print,
.unary_op = pixelbuf_byteorder_unary_op,
.attr = pixelbuf_byteorder_attr,
};
// This macro is used to simplify RGB subclass definition
#define PIXELBUF_BYTEORDER(p_name, p_bpp, p_r, p_g, p_b, p_w, p_has_white, p_has_luminosity) \
const pixelbuf_byteorder_obj_t byteorder_## p_name = { \
{ &pixelbuf_byteorder_type }, \
.name = MP_QSTR_## p_name, \
.bpp = p_bpp, \
.byteorder = { p_r, p_g, p_b, p_w }, \
.has_white = p_has_white, \
.has_luminosity = p_has_luminosity, \
};
//| .. function:: wheel(n)
//|
//| C implementation of the common wheel() function found in many examples.
//| Returns the colorwheel RGB value as an integer value for n (usable in :py:class:`PixelBuf`, neopixel, and dotstar).
//|
STATIC mp_obj_t pixelbuf_wheel(mp_obj_t n) {
return MP_OBJ_NEW_SMALL_INT(colorwheel(MP_OBJ_IS_SMALL_INT(n) ? MP_OBJ_SMALL_INT_VALUE(n) : mp_obj_float_get(n)));
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(pixelbuf_wheel_obj, pixelbuf_wheel);
const int32_t colorwheel(float pos) {
if (pos > 255) {
pos = pos - ((uint32_t)(pos / 256) * 256);
}
if (pos < 85)
return (uint8_t)(pos * 3) << 16 | (uint8_t)(255 - (pos * 3)) << 8;
else if (pos < 170) {
pos -= 85;
return (uint8_t)(255 - (pos * 3)) << 16 | (uint8_t)(pos * 3);
} else {
pos -= 170;
return (uint8_t)(pos * 3) << 8 | (uint8_t)(255 - pos * 3);
}
}
/// RGB
//| .. class:: RGB
//|
//| * **order** Red, Green, Blue
//| * **bpp** 3
PIXELBUF_BYTEORDER(RGB, 3, 0, 1, 2, 3, false, false)
//| .. class:: RBG
//|
//| * **order** Red, Blue, Green
//| * **bpp** 3
PIXELBUF_BYTEORDER(RBG, 3, 0, 2, 1, 3, false, false)
//| .. class:: GRB
//|
//| * **order** Green, Red, Blue
//| * **bpp** 3
//|
//| Commonly used by NeoPixel.
PIXELBUF_BYTEORDER(GRB, 3, 1, 0, 2, 3, false, false)
//| .. class:: GBR
//|
//| * **order** Green, Blue, Red
//| * **bpp** 3
PIXELBUF_BYTEORDER(GBR, 3, 1, 2, 0, 3, false, false)
//| .. class:: BRG
//|
//| * **order** Blue, Red, Green
//| * **bpp** 3
PIXELBUF_BYTEORDER(BRG, 3, 2, 0, 1, 3, false, false)
//| .. class:: BGR
//|
//| * **order** Blue, Green, Red
//| * **bpp** 3
//|
//| Commonly used by Dotstar.
PIXELBUF_BYTEORDER(BGR, 3, 2, 1, 0, 3, false, false)
// RGBW
//| .. class:: RGBW
//|
//| * **order** Red, Green, Blue, White
//| * **bpp** 4
//| * **has_white** True
PIXELBUF_BYTEORDER(RGBW, 4, 0, 1, 2, 3, true, false)
//| .. class:: RBGW
//|
//| * **order** Red, Blue, Green, White
//| * **bpp** 4
//| * **has_white** True
PIXELBUF_BYTEORDER(RBGW, 4, 0, 2, 1, 3, true, false)
//| .. class:: GRBW
//|
//| * **order** Green, Red, Blue, White
//| * **bpp** 4
//| * **has_white** True
//|
//| Commonly used by RGBW NeoPixels.
PIXELBUF_BYTEORDER(GRBW, 4, 1, 0, 2, 3, true, false)
//| .. class:: GBRW
//|
//| * **order** Green, Blue, Red, White
//| * **bpp** 4
//| * **has_white** True
PIXELBUF_BYTEORDER(GBRW, 4, 1, 2, 0, 3, true, false)
//| .. class:: BRGW
//|
//| * **order** Blue, Red, Green, White
//| * **bpp** 4
//| * **has_white** True
PIXELBUF_BYTEORDER(BRGW, 4, 2, 0, 1, 3, true, false)
//| .. class:: BGRW
//|
//| * **order** Blue, Green, Red, White
//| * **bpp** 4
//| * **has_white** True
PIXELBUF_BYTEORDER(BGRW, 4, 2, 1, 0, 3, true, false)
// Luminosity + RGB (eg for Dotstar)
// Luminosity chosen because the luminosity of a Dotstar at full bright
// burns the eyes like looking at the Sun.
// https://www.thesaurus.com/browse/luminosity?s=t
//| .. class:: LRGB
//|
//| * **order** *Luminosity*, Red, Green, Blue
//| * **bpp** 4
//| * **has_luminosity** True
PIXELBUF_BYTEORDER(LRGB, 4, 1, 2, 3, 0, false, true)
//| .. class:: LRBG
//|
//| * **order** *Luminosity*, Red, Blue, Green
//| * **bpp** 4
//| * **has_luminosity** True
PIXELBUF_BYTEORDER(LRBG, 4, 1, 3, 2, 0, false, true)
//| .. class:: LGRB
//|
//| * **order** *Luminosity*, Green, Red, Blue
//| * **bpp** 4
//| * **has_luminosity** True
PIXELBUF_BYTEORDER(LGRB, 4, 2, 1, 3, 0, false, true)
//| .. class:: LGBR
//|
//| * **order** *Luminosity*, Green, Blue, Red
//| * **bpp** 4
//| * **has_luminosity** True
PIXELBUF_BYTEORDER(LGBR, 4, 2, 3, 1, 0, false, true)
//| .. class:: LBRG
//|
//| * **order** *Luminosity*, Blue, Red, Green
//| * **bpp** 4
//| * **has_luminosity** True
PIXELBUF_BYTEORDER(LBRG, 4, 3, 1, 2, 0, false, true)
//| .. class:: LBGR
//|
//| * **order** *Luminosity*, Blue, Green, Red
//| * **bpp** 4
//| * **has_luminosity** True
//|
//| Actual format commonly used by DotStar (5 bit luninance value)
PIXELBUF_BYTEORDER(LBGR, 4, 3, 2, 1, 0, false, true)
STATIC const mp_rom_map_elem_t pixelbuf_module_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR__pixelbuf) },
{ MP_ROM_QSTR(MP_QSTR_PixelBuf), MP_ROM_PTR(&pixelbuf_pixelbuf_type) },
{ MP_ROM_QSTR(MP_QSTR_ByteOrder), MP_ROM_PTR(&pixelbuf_byteorder_type) },
{ MP_ROM_QSTR(MP_QSTR_RGB), MP_ROM_PTR(&byteorder_RGB) },
{ MP_ROM_QSTR(MP_QSTR_RBG), MP_ROM_PTR(&byteorder_RBG) },
{ MP_ROM_QSTR(MP_QSTR_GRB), MP_ROM_PTR(&byteorder_GRB) },
{ MP_ROM_QSTR(MP_QSTR_GBR), MP_ROM_PTR(&byteorder_GBR) },
{ MP_ROM_QSTR(MP_QSTR_BRG), MP_ROM_PTR(&byteorder_BRG) },
{ MP_ROM_QSTR(MP_QSTR_BGR), MP_ROM_PTR(&byteorder_BGR) },
{ MP_ROM_QSTR(MP_QSTR_RGBW), MP_ROM_PTR(&byteorder_RGBW) },
{ MP_ROM_QSTR(MP_QSTR_RBGW), MP_ROM_PTR(&byteorder_RBGW) },
{ MP_ROM_QSTR(MP_QSTR_GRBW), MP_ROM_PTR(&byteorder_GRBW) },
{ MP_ROM_QSTR(MP_QSTR_GBRW), MP_ROM_PTR(&byteorder_GBRW) },
{ MP_ROM_QSTR(MP_QSTR_BRGW), MP_ROM_PTR(&byteorder_BRGW) },
{ MP_ROM_QSTR(MP_QSTR_BGRW), MP_ROM_PTR(&byteorder_BGRW) },
{ MP_ROM_QSTR(MP_QSTR_LRGB), MP_ROM_PTR(&byteorder_LRGB) },
{ MP_ROM_QSTR(MP_QSTR_LRBG), MP_ROM_PTR(&byteorder_LRBG) },
{ MP_ROM_QSTR(MP_QSTR_LGRB), MP_ROM_PTR(&byteorder_LGRB) },
{ MP_ROM_QSTR(MP_QSTR_LGBR), MP_ROM_PTR(&byteorder_LGBR) },
{ MP_ROM_QSTR(MP_QSTR_LBRG), MP_ROM_PTR(&byteorder_LBRG) },
{ MP_ROM_QSTR(MP_QSTR_LBGR), MP_ROM_PTR(&byteorder_LBGR) },
{ MP_ROM_QSTR(MP_QSTR_wheel), MP_ROM_PTR(&pixelbuf_wheel_obj) },
};
STATIC MP_DEFINE_CONST_DICT(pixelbuf_module_globals, pixelbuf_module_globals_table);
STATIC void pixelbuf_byteorder_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
pixelbuf_byteorder_obj_t *self = MP_OBJ_TO_PTR(self_in);
mp_printf(print, "%q.%q", MP_QSTR__pixelbuf, self->name);
return;
}
const mp_obj_module_t pixelbuf_module = {
.base = { &mp_type_module },
.globals = (mp_obj_dict_t*)&pixelbuf_module_globals,
};

View File

@ -0,0 +1,37 @@
/*
* This file is part of the Circuit Python project, https://github.com/adafruit/circuitpython
*
* The MIT License (MIT)
*
* Copyright (c) 2018 Roy Hooper
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#ifndef CP_SHARED_BINDINGS_PIXELBUF_INIT_H
#define CP_SHARED_BINDINGS_PIXELBUF_INIT_H
#include "common-hal/digitalio/DigitalInOut.h"
STATIC void pixelbuf_byteorder_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind);
const int32_t colorwheel(float pos);
const mp_obj_type_t pixelbuf_byteorder_type;
extern void common_hal_neopixel_write(const digitalio_digitalinout_obj_t* gpio, uint8_t *pixels, uint32_t numBytes);
#endif //CP_SHARED_BINDINGS_PIXELBUF_INIT_H

View File

@ -0,0 +1,48 @@
/*
* This file is part of the Circuit Python project, https://github.com/adafruit/circuitpython
*
* The MIT License (MIT)
*
* Copyright (c) 2018 Roy Hooper
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#ifndef CIRCUITPYTHON_PIXELBUF_TYPES_H
#define CIRCUITPYTHON_PIXELBUF_TYPES_H
//| :orphan:
typedef struct {
uint8_t r;
uint8_t g;
uint8_t b;
uint8_t w;
} pixelbuf_rgbw_t;
typedef struct {
mp_obj_base_t base;
qstr name;
uint8_t bpp;
pixelbuf_rgbw_t byteorder;
bool has_white;
bool has_luminosity;
} pixelbuf_byteorder_obj_t;
#endif // CIRCUITPYTHON_PIXELBUF_TYPES_H

View File

@ -61,4 +61,6 @@ Module Supported Ports
`touchio` **SAMD/SAMD Express**
`uheap` **Debug (All)**
`usb_hid` **SAMD/SAMD Express**
`_pixelbuf` **SAMD Express**
`_stage` **SAMD/SAMD Express**
================= ==============================

View File

@ -0,0 +1,120 @@
/*
* This file is part of the Circuit Python project, https://github.com/adafruit/circuitpython
*
* The MIT License (MIT)
*
* Copyright (c) 2018 Roy Hooper
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include "py/obj.h"
#include "py/objarray.h"
#include "py/runtime.h"
#include "PixelBuf.h"
#include <string.h>
void pixelbuf_set_pixel_int(uint8_t *buf, mp_int_t value, pixelbuf_byteorder_obj_t *byteorder) {
buf[byteorder->byteorder.r] = value >> 16 & 0xff;
buf[byteorder->byteorder.g] = (value >> 8) & 0xff;
buf[byteorder->byteorder.b] = value & 0xff;
if (byteorder->bpp == 4 && byteorder->has_white &&
(buf[byteorder->byteorder.r] == buf[byteorder->byteorder.g] &&
buf[byteorder->byteorder.r] == buf[byteorder->byteorder.b])) {
buf[byteorder->byteorder.w] = buf[byteorder->byteorder.r];
buf[byteorder->byteorder.r] = buf[byteorder->byteorder.g] = buf[byteorder->byteorder.b] = 0;
}
}
void pixelbuf_set_pixel(uint8_t *buf, uint8_t *rawbuf, float brightness, mp_obj_t *item, pixelbuf_byteorder_obj_t *byteorder, bool dotstar) {
if (MP_OBJ_IS_INT(item)) {
uint8_t *target = rawbuf ? rawbuf : buf;
pixelbuf_set_pixel_int(target, mp_obj_get_int_truncated(item), byteorder);
if (dotstar) {
buf[0] = DOTSTAR_LED_START_FULL_BRIGHT;
if (rawbuf)
rawbuf[0] = DOTSTAR_LED_START_FULL_BRIGHT;
}
if (rawbuf) {
buf[byteorder->byteorder.r] = rawbuf[byteorder->byteorder.r] * brightness;
buf[byteorder->byteorder.g] = rawbuf[byteorder->byteorder.g] * brightness;
buf[byteorder->byteorder.b] = rawbuf[byteorder->byteorder.b] * brightness;
} else {
buf[byteorder->byteorder.r] *= brightness;
buf[byteorder->byteorder.g] *= brightness;
buf[byteorder->byteorder.b] *= brightness;
}
} else {
mp_obj_t *items;
size_t len;
mp_obj_get_array(item, &len, &items);
if (len != byteorder->bpp && !dotstar)
mp_raise_ValueError_varg(translate("Expected tuple of length %d, got %d"), byteorder->bpp, len);
buf[byteorder->byteorder.r] = mp_obj_get_int_truncated(items[PIXEL_R]) * brightness;
buf[byteorder->byteorder.g] = mp_obj_get_int_truncated(items[PIXEL_G]) * brightness;
buf[byteorder->byteorder.b] = mp_obj_get_int_truncated(items[PIXEL_B]) * brightness;
if (rawbuf) {
rawbuf[byteorder->byteorder.r] = mp_obj_get_int_truncated(items[PIXEL_R]);
rawbuf[byteorder->byteorder.g] = mp_obj_get_int_truncated(items[PIXEL_G]);
rawbuf[byteorder->byteorder.b] = mp_obj_get_int_truncated(items[PIXEL_B]);
}
if (len > 3) {
if (dotstar) {
buf[byteorder->byteorder.w] = DOTSTAR_LED_START | DOTSTAR_BRIGHTNESS(mp_obj_get_float(items[PIXEL_W]));
if (rawbuf)
rawbuf[byteorder->byteorder.w] = buf[byteorder->byteorder.w];
} else {
buf[byteorder->byteorder.w] = mp_obj_get_int_truncated(items[PIXEL_W]) * brightness;
if (rawbuf)
rawbuf[byteorder->byteorder.w] = mp_obj_get_int_truncated(items[PIXEL_W]);
}
} else if (dotstar) {
buf[byteorder->byteorder.w] = DOTSTAR_LED_START_FULL_BRIGHT;
if (rawbuf)
rawbuf[byteorder->byteorder.w] = DOTSTAR_LED_START_FULL_BRIGHT;
}
}
}
mp_obj_t *pixelbuf_get_pixel_array(uint8_t *buf, uint len, pixelbuf_byteorder_obj_t *byteorder, uint8_t step, bool dotstar) {
mp_obj_t elems[len];
for (uint i = 0; i < len; i++) {
elems[i] = pixelbuf_get_pixel(buf + (i * step), byteorder, dotstar);
}
return mp_obj_new_tuple(len, elems);
}
mp_obj_t *pixelbuf_get_pixel(uint8_t *buf, pixelbuf_byteorder_obj_t *byteorder, bool dotstar) {
mp_obj_t elems[byteorder->bpp];
elems[0] = mp_obj_new_int(buf[byteorder->byteorder.r]);
elems[1] = mp_obj_new_int(buf[byteorder->byteorder.g]);
elems[2] = mp_obj_new_int(buf[byteorder->byteorder.b]);
if (byteorder->bpp > 3)
{
if (dotstar)
elems[3] = mp_obj_new_float(DOTSTAR_GET_BRIGHTNESS(buf[byteorder->byteorder.w]));
else
elems[3] = mp_obj_new_int(buf[byteorder->byteorder.w]);
}
return mp_obj_new_tuple(byteorder->bpp, elems);
}

View File

@ -0,0 +1,50 @@
/*
* This file is part of the Circuit Python project, https://github.com/adafruit/circuitpython
*
* The MIT License (MIT)
*
* Copyright (c) 2018 Roy Hooper
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include "py/obj.h"
#include "py/objarray.h"
#include "../../shared-bindings/_pixelbuf/types.h"
#ifndef PIXELBUF_SHARED_MODULE_H
#define PIXELBUF_SHARED_MODULE_H
#define PIXEL_R 0
#define PIXEL_G 1
#define PIXEL_B 2
#define PIXEL_W 3
#define DOTSTAR_LED_START 0b11100000
#define DOTSTAR_BRIGHTNESS(brightness) ((32 - (uint8_t)(32 - brightness * 31)) & 0b00011111)
#define DOTSTAR_GET_BRIGHTNESS(value) ((value & 0b00011111) / 31.0)
#define DOTSTAR_LED_START_FULL_BRIGHT 0xFF
void pixelbuf_set_pixel(uint8_t *buf, uint8_t *rawbuf, float brightness, mp_obj_t *item, pixelbuf_byteorder_obj_t *byteorder, bool dotstar);
mp_obj_t *pixelbuf_get_pixel(uint8_t *buf, pixelbuf_byteorder_obj_t *byteorder, bool dotstar);
mp_obj_t *pixelbuf_get_pixel_array(uint8_t *buf, uint len, pixelbuf_byteorder_obj_t *byteorder, uint8_t step, bool dotstar);
void pixelbuf_set_pixel_int(uint8_t *buf, mp_int_t value, pixelbuf_byteorder_obj_t *byteorder);
#endif

View File