summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Shawcroft <scott@tannewt.org>2019-01-22 15:57:59 -0800
committerScott Shawcroft <scott@tannewt.org>2019-01-22 15:57:59 -0800
commit0a3f62d8d4454522d6f0ce6ae0fef8b737ccc0da (patch)
tree76ce7eb8ebbecf48f1c1beb7018025c36efb4af6
parent603f64d731e051a7b0d08b7d36cefbd56845ce31 (diff)
parentcef6e0895a222541f637184bec3712466fc086f6 (diff)
Merge remote-tracking branch 'adafruit/master' into patch-2
-rw-r--r--docs/library/builtins.rst4
-rw-r--r--locale/ID.po73
-rw-r--r--locale/circuitpython.pot57
-rw-r--r--locale/de_DE.po224
-rw-r--r--locale/en_US.po57
-rw-r--r--locale/es.po112
-rw-r--r--locale/fil.po114
-rw-r--r--locale/fr.po124
-rw-r--r--locale/it_IT.po120
-rw-r--r--locale/pt_BR.po96
-rw-r--r--ports/atmel-samd/Makefile9
-rw-r--r--ports/atmel-samd/boards/arduino_zero/mpconfigboard.mk2
-rw-r--r--ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk2
-rw-r--r--ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.mk2
-rw-r--r--ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.mk3
-rw-r--r--ports/atmel-samd/boards/pirkey_m0/mpconfigboard.mk2
-rw-r--r--ports/atmel-samd/boards/trinket_m0/mpconfigboard.mk2
-rw-r--r--ports/atmel-samd/mpconfigport.h11
-rw-r--r--ports/esp8266/Makefile5
-rwxr-xr-xports/nrf/Makefile6
-rw-r--r--shared-bindings/_pixelbuf/PixelBuf.c477
-rw-r--r--shared-bindings/_pixelbuf/PixelBuf.h56
-rw-r--r--shared-bindings/_pixelbuf/__init__.c326
-rw-r--r--shared-bindings/_pixelbuf/__init__.h37
-rw-r--r--shared-bindings/_pixelbuf/types.h48
-rw-r--r--shared-bindings/index.rst2
-rw-r--r--shared-module/_pixelbuf/PixelBuf.c120
-rw-r--r--shared-module/_pixelbuf/PixelBuf.h50
-rw-r--r--shared-module/_pixelbuf/__init__.c0
29 files changed, 1909 insertions, 232 deletions
diff --git a/docs/library/builtins.rst b/docs/library/builtins.rst
index 36a84bc0c..0061a8cea 100644
--- a/docs/library/builtins.rst
+++ b/docs/library/builtins.rst
@@ -78,12 +78,12 @@ Not all of these functions and types are turned on in all CircuitPython ports, f
.. classmethod:: from_bytes(bytes, byteorder)
- In CircuitPython, `byteorder` parameter must be positional (this is
+ In CircuitPython, ``byteorder`` parameter must be positional (this is
compatible with CPython).
.. method:: to_bytes(size, byteorder)
- In CircuitPython, `byteorder` parameter must be positional (this is
+ In CircuitPython, ``byteorder`` parameter must be positional (this is
compatible with CPython).
.. function:: isinstance()
diff --git a/locale/ID.po b/locale/ID.po
index e06e07063..f25399844 100644
--- a/locale/ID.po
+++ b/locale/ID.po
@@ -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"
diff --git a/locale/circuitpython.pot b/locale/circuitpython.pot
index c041ec86c..977cbca27 100644
--- a/locale/circuitpython.pot
+++ b/locale/circuitpython.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 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 ""
diff --git a/locale/de_DE.po b/locale/de_DE.po
index 92bf61956..1c7f51aac 100644
--- a/locale/de_DE.po
+++ b/locale/de_DE.po
@@ -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 "unpack requires a buffer of %d bytes"
+#~ msgstr "unpack erfordert einen Puffer von %d Bytes"
-#~ msgid "Can not add Service."
-#~ msgstr "Kann den Dienst nicht hinzufügen."
+#~ msgid "Can not apply advertisement data. status: 0x%02x"
+#~ msgstr "Kann advertisement data nicht anwenden. Status: 0x%02x"
#~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n"
#~ msgstr "CircuitPython ist abgestürzt. Ups!\n"
-#~ 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 "Can encode UUID into the advertisement packet."
+#~ msgstr "Kann UUID in das advertisement packet kodieren."
-#~ msgid "Can not encode UUID, to check length."
-#~ msgstr "Kann UUID nicht kodieren, um die Länge zu überprüfen."
+#~ 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"
diff --git a/locale/en_US.po b/locale/en_US.po
index d62e9fd20..30fcbafac 100644
--- a/locale/en_US.po
+++ b/locale/en_US.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 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 ""
diff --git a/locale/es.po b/locale/es.po
index 446fe7bc5..f025a49fd 100644
--- a/locale/es.po
+++ b/locale/es.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 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"
diff --git a/locale/fil.po b/locale/fil.po
index ad9134f8e..fb392075d 100644
--- a/locale/fil.po
+++ b/locale/fil.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 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"
diff --git a/locale/fr.po b/locale/fr.po
index 4c7fb0502..6a7c235e6 100644
--- a/locale/fr.po
+++ b/locale/fr.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 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 ""
@@ -2865,35 +2941,15 @@ msgstr ""
#~ 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"
diff --git a/locale/it_IT.po b/locale/it_IT.po
index 8f5fb5684..8147f357f 100644
--- a/locale/it_IT.po
+++ b/locale/it_IT.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 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"
diff --git a/locale/pt_BR.po b/locale/pt_BR.po
index c0583d8bc..ab604de4a 100644
--- a/locale/pt_BR.po
+++ b/locale/pt_BR.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 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 encode UUID into the advertisement packet."
+#~ msgstr "Pode codificar o UUID no pacote de anúncios."
-#~ msgid "Can not apply device name in the stack."
-#~ msgstr "Não é possível aplicar o nome do dispositivo na pilha."
+#, fuzzy
+#~ msgid "unpack requires a buffer of %d bytes"
+#~ msgstr "Falha ao alocar buffer RX de %d bytes"
-#~ 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 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 "Cannot apply GAP parameters."
-#~ msgstr "Não é possível aplicar parâmetros GAP."
+#~ 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 "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."
+#~ msgid "Invalid Service type"
+#~ msgstr "Tipo de serviço inválido"
-#, fuzzy
-#~ msgid "unpack requires a buffer of %d bytes"
-#~ msgstr "Falha ao alocar buffer RX de %d bytes"
+#~ msgid "Cannot apply GAP parameters."
+#~ msgstr "Não é possível aplicar parâmetros GAP."
diff --git a/ports/atmel-samd/Makefile b/ports/atmel-samd/Makefile
index c8d197b3e..797369bd6 100644
--- a/ports/atmel-samd/Makefile
+++ b/ports/atmel-samd/Makefile
@@ -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)
diff --git a/ports/atmel-samd/boards/arduino_zero/mpconfigboard.mk b/ports/atmel-samd/boards/arduino_zero/mpconfigboard.mk
index 017e66ddf..28c79d6e4 100644
--- a/ports/atmel-samd/boards/arduino_zero/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/arduino_zero/mpconfigboard.mk
@@ -9,3 +9,5 @@ LONGINT_IMPL = NONE
CHIP_VARIANT = SAMD21G18A
CHIP_FAMILY = samd21
+
+EXCLUDE_PIXELBUF = 1
diff --git a/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk b/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk
index b07d63984..e1e7484d5 100644
--- a/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/circuitplayground_express_crickit/mpconfigboard.mk
@@ -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
diff --git a/ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.mk b/ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.mk
index 4f2855d73..687a27df3 100644
--- a/ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/feather_m0_adalogger/mpconfigboard.mk
@@ -9,3 +9,5 @@ LONGINT_IMPL = NONE
CHIP_VARIANT = SAMD21G18A
CHIP_FAMILY = samd21
+
+EXCLUDE_PIXELBUF = 1
diff --git a/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.mk b/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.mk
index 37f1bdef0..fea4bc222 100644
--- a/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.mk
@@ -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
diff --git a/ports/atmel-samd/boards/pirkey_m0/mpconfigboard.mk b/ports/atmel-samd/boards/pirkey_m0/mpconfigboard.mk
index ddc262a57..69250626f 100644
--- a/ports/atmel-samd/boards/pirkey_m0/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/pirkey_m0/mpconfigboard.mk
@@ -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
diff --git a/ports/atmel-samd/boards/trinket_m0/mpconfigboard.mk b/ports/atmel-samd/boards/trinket_m0/mpconfigboard.mk
index c9c45152b..9b93719ef 100644
--- a/ports/atmel-samd/boards/trinket_m0/mpconfigboard.mk
+++ b/ports/atmel-samd/boards/trinket_m0/mpconfigboard.mk
@@ -9,3 +9,5 @@ LONGINT_IMPL = NONE
CHIP_VARIANT = SAMD21E18A
CHIP_FAMILY = samd21
+
+EXCLUDE_PIXELBUF = 1
diff --git a/ports/atmel-samd/mpconfigport.h b/ports/atmel-samd/mpconfigport.h
index 86edc9039..e9507e3cc 100644
--- a/ports/atmel-samd/mpconfigport.h
+++ b/ports/atmel-samd/mpconfigport.h
@@ -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
diff --git a/ports/esp8266/Makefile b/ports/esp8266/Makefile
index 4f23dfff1..6d63c0d1a 100644
--- a/ports/esp8266/Makefile
+++ b/ports/esp8266/Makefile
@@ -148,6 +148,11 @@ SRC_SHARED_MODULE = \
os/__init__.c \
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))
diff --git a/ports/nrf/Makefile b/ports/nrf/Makefile
index bf6c7a5da..a98007661 100755
--- a/ports/nrf/Makefile
+++ b/ports/nrf/Makefile
@@ -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
diff --git a/shared-bindings/_pixelbuf/PixelBuf.c b/shared-bindings/_pixelbuf/PixelBuf.c
new file mode 100644
index 000000000..7c2766aa3
--- /dev/null
+++ b/shared-bindings/_pixelbuf/PixelBuf.c
@@ -0,0 +1,477 @@
+/*
+ * This file is part of the Circuit Python project, https://github.com/adafruit/circuitpython
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2018 Roy Hooper
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "py/obj.h"
+#include "py/objarray.h"
+#include "py/mphal.h"
+#include "py/runtime.h"
+#include "py/binary.h"
+#include "py/objproperty.h"
+#include "py/runtime.h"
+#include "py/gc.h"
+
+#include <string.h>
+
+#include "PixelBuf.h"
+#include "shared-bindings/_pixelbuf/types.h"
+#include "../../shared-module/_pixelbuf/PixelBuf.h"
+#include "shared-bindings/digitalio/DigitalInOut.h"
+
+extern const pixelbuf_byteorder_obj_t byteorder_BGR;
+extern const mp_obj_type_t pixelbuf_byteorder_type;
+extern const int32_t colorwheel(float pos);
+
+//| .. currentmodule:: pixelbuf
+//|
+//| :class:`PixelBuf` -- A fast RGB[W] pixel buffer for LED and similar devices
+//| ===========================================================================
+//|
+//| :class:`~_pixelbuf.PixelBuf` implements an RGB[W] bytearray abstraction.
+//|
+//| .. class:: PixelBuf(size, buf, byteorder=BGR, bpp=3)
+//|
+//| Create a PixelBuf object of the specified size, byteorder, and bits per pixel.
+//|
+//| When given a second bytearray (``rawbuf``), changing brightness adjusts the
+//| brightness of all members of ``buf``.
+//|
+//| When only given ``buf``, ``brightness`` applies to the next pixel assignment.
+//|
+//| When ``dotstar`` is True, and ``bpp`` is 4, the 4th value in a tuple/list
+//| is the individual pixel brightness (0-1). Not compatible with RGBW Byteorders.
+//| Compatible `ByteOrder` classes are bpp=3, or bpp=4 and has_luminosity=True (g LBGR).
+//|
+//| :param ~int size: Number of pixelsx
+//| :param ~bytearray buf: Bytearray to store pixel data in
+//| :param ~_pixelbuf.ByteOrder byteorder: Byte order constant from `_pixelbuf` (also sets the bpp)
+//| :param ~float brightness: Brightness (0 to 1.0, default 1.0)
+//| :param ~bytearray rawbuf: Bytearray to store raw pixel colors in
+//| :param ~int offset: Offset from start of buffer (default 0)
+//| :param ~bool dotstar: Dotstar mode (default False)
+//| :param ~bool auto_write: Whether to automatically write pixels (Default False)
+//| :param ~callable write_function: (optional) Callable to use to send pixels
+//| :param ~list write_args: (optional) Tuple or list of args to pass to ``write_function``. The
+//| PixelBuf instance is appended after these args.
+//|
+STATIC mp_obj_t pixelbuf_pixelbuf_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
+ mp_arg_check_num(n_args, kw_args, 2, MP_OBJ_FUN_ARGS_MAX, true);
+ enum { ARG_size, ARG_buf, ARG_byteorder, ARG_brightness, ARG_rawbuf, ARG_offset, ARG_dotstar,
+ ARG_auto_write, ARG_write_function, ARG_write_args };
+ static const mp_arg_t allowed_args[] = {
+ { MP_QSTR_size, MP_ARG_REQUIRED | MP_ARG_INT },
+ { MP_QSTR_buf, MP_ARG_REQUIRED | MP_ARG_OBJ },
+ { MP_QSTR_byteorder, MP_ARG_OBJ, { .u_obj = mp_const_none } },
+ { MP_QSTR_brightness, MP_ARG_OBJ, { .u_obj = mp_const_none } },
+ { MP_QSTR_rawbuf, MP_ARG_OBJ, { .u_obj = mp_const_none } },
+ { MP_QSTR_offset, MP_ARG_INT, { .u_int = 0 } },
+ { MP_QSTR_dotstar, MP_ARG_BOOL, { .u_bool = false } },
+ { MP_QSTR_auto_write, MP_ARG_BOOL, {.u_bool = false} },
+ { MP_QSTR_write_function, MP_ARG_OBJ, {.u_obj = mp_const_none} },
+ { MP_QSTR_write_args, MP_ARG_OBJ, {.u_obj = mp_const_none} },
+ };
+ mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
+ mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
+
+ if (mp_obj_is_subclass_fast(args[ARG_byteorder].u_obj, &pixelbuf_byteorder_type))
+ mp_raise_TypeError_varg(translate("byteorder is not an instance of ByteOrder (got a %s)"), mp_obj_get_type_str(args[ARG_byteorder].u_obj));
+
+ pixelbuf_byteorder_obj_t *byteorder = (args[ARG_byteorder].u_obj == mp_const_none) ? MP_OBJ_FROM_PTR(&byteorder_BGR) : args[ARG_byteorder].u_obj;
+
+ if (byteorder->has_white && args[ARG_dotstar].u_bool)
+ mp_raise_ValueError_varg(translate("Can not use dotstar with %s"), mp_obj_get_type_str(byteorder));
+
+ size_t effective_bpp = args[ARG_dotstar].u_bool ? 4 : byteorder->bpp; // Always 4 for DotStar
+ size_t bytes = args[ARG_size].u_int * effective_bpp;
+ size_t offset = args[ARG_offset].u_int;
+ mp_buffer_info_t bufinfo, rawbufinfo;
+
+ mp_get_buffer_raise(args[ARG_buf].u_obj, &bufinfo, MP_BUFFER_READ | MP_BUFFER_WRITE);
+ bool two_buffers = args[ARG_rawbuf].u_obj != mp_const_none;
+ if (two_buffers) {
+ mp_get_buffer_raise(args[ARG_rawbuf].u_obj, &rawbufinfo, MP_BUFFER_READ | MP_BUFFER_WRITE);
+ if (rawbufinfo.len != bufinfo.len) {
+ mp_raise_ValueError(translate("rawbuf is not the same size as buf"));
+ }
+ }
+
+ if (bytes + offset > bufinfo.len)
+ mp_raise_ValueError_varg(translate("buf is too small. need %d bytes"), bytes + offset);
+
+ if (!MP_OBJ_IS_TYPE(args[ARG_write_args].u_obj, &mp_type_list) &&
+ !MP_OBJ_IS_TYPE(args[ARG_write_args].u_obj, &mp_type_tuple) &&
+ args[ARG_write_args].u_obj != mp_const_none)
+ {
+ mp_raise_ValueError(translate("write_args must be a list, tuple, or None"));
+ }
+
+ // Validation complete, allocate and populate object.
+ pixelbuf_pixelbuf_obj_t *self = m_new_obj(pixelbuf_pixelbuf_obj_t);
+
+ self->base.type = &pixelbuf_pixelbuf_type;
+ self->pixels = args[ARG_size].u_int;
+ self->bytes = bytes;
+ self->byteorder = *byteorder; // Copied because we modify for dotstar
+ self->bytearray = args[ARG_buf].u_obj;
+ self->two_buffers = two_buffers;
+ self->rawbytearray = two_buffers ? args[ARG_rawbuf].u_obj : NULL;
+ self->offset = offset;
+ self->dotstar_mode = args[ARG_dotstar].u_bool;
+ self->buf = (uint8_t *)bufinfo.buf + offset;
+ self->rawbuf = two_buffers ? (uint8_t *)rawbufinfo.buf + offset : NULL;
+ self->pixel_step = effective_bpp;
+ self->auto_write = args[ARG_auto_write].u_bool;
+
+ if (self->dotstar_mode) {
+ // Ensure sane configuration
+ if (!self->byteorder.has_luminosity) {
+ self->byteorder.has_luminosity = true;
+ self->byteorder.byteorder.b += 1;
+ self->byteorder.byteorder.g += 1;
+ self->byteorder.byteorder.r += 1;
+ }
+ self->byteorder.byteorder.w = 0;
+ }
+
+ // Show/auto-write callbacks
+ self->write_function = args[ARG_write_function].u_obj;
+ mp_obj_t function_args = args[ARG_write_args].u_obj;
+ mp_obj_t *src_objs = (mp_obj_t *)&mp_const_none_obj;
+ size_t num_items = 0;
+ if (function_args != mp_const_none) {
+ if (MP_OBJ_IS_TYPE(function_args, &mp_type_list)) {
+ mp_obj_list_t *t = MP_OBJ_TO_PTR(function_args);
+ num_items = t->len;
+ src_objs = t->items;
+ } else {
+ mp_obj_tuple_t *l = MP_OBJ_TO_PTR(function_args);
+ num_items = l->len;
+ src_objs = l->items;
+ }
+ }
+ self->write_function_args = mp_obj_new_tuple(num_items + 1, NULL);
+ for (size_t i = 0; i < num_items; i++) {
+ self->write_function_args->items[i] = src_objs[i];
+ }
+ self->write_function_args->items[num_items] = self;
+
+ if (args[ARG_brightness].u_obj == mp_const_none) {
+ self->brightness = 1.0;
+ } else {
+ self->brightness = mp_obj_get_float(args[ARG_brightness].u_obj);
+ if (self->brightness < 0)
+ self->brightness = 0;
+ else if (self->brightness > 1)
+ self->brightness = 1;
+ }
+
+ if (self->dotstar_mode) {
+ // Initialize the buffer with the dotstar start bytes.
+ // Header and end must be setup by caller
+ for (uint i = 0; i < self->pixels * 4; i += 4) {
+ self->buf[i] = DOTSTAR_LED_START_FULL_BRIGHT;
+ if (two_buffers) {
+ self->rawbuf[i] = DOTSTAR_LED_START_FULL_BRIGHT;
+ }
+ }
+ }
+
+ return MP_OBJ_FROM_PTR(self);
+}
+
+//| .. attribute:: bpp
+//|
+//| The number of bytes per pixel in the buffer (read-only)
+//|
+STATIC mp_obj_t pixelbuf_pixelbuf_obj_get_bpp(mp_obj_t self_in) {
+ mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type));
+ pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ return mp_obj_new_int_from_uint(self->byteorder.bpp);
+}
+MP_DEFINE_CONST_FUN_OBJ_1(pixelbuf_pixelbuf_get_bpp_obj, pixelbuf_pixelbuf_obj_get_bpp);
+
+const mp_obj_property_t pixelbuf_pixelbuf_bpp_obj = {
+ .base.type = &mp_type_property,
+ .proxy = {(mp_obj_t)&pixelbuf_pixelbuf_get_bpp_obj,
+ (mp_obj_t)&mp_const_none_obj,
+ (mp_obj_t)&mp_const_none_obj},
+};
+
+
+//| .. attribute:: brightness
+//|
+//| Float value between 0 and 1. Output brightness.
+//| If the PixelBuf was allocated with two both a buf and a rawbuf,
+//| setting this value causes a recomputation of the values in buf.
+//| If only a buf was provided, then the brightness only applies to
+//| future pixel changes.
+//| In DotStar mode
+//|
+STATIC mp_obj_t pixelbuf_pixelbuf_obj_get_brightness(mp_obj_t self_in) {
+ mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type));
+ pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ return mp_obj_new_float(self->brightness);
+}
+MP_DEFINE_CONST_FUN_OBJ_1(pixelbuf_pixelbuf_get_brightness_obj, pixelbuf_pixelbuf_obj_get_brightness);
+
+
+STATIC mp_obj_t pixelbuf_pixelbuf_obj_set_brightness(mp_obj_t self_in, mp_obj_t value) {
+ mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type));
+ pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ self->brightness = mp_obj_float_get(value);
+ if (self->brightness > 1)
+ self->brightness = 1;
+ else if (self->brightness < 0)
+ self->brightness = 0;
+ if (self->two_buffers)
+ pixelbuf_recalculate_brightness(self);
+ if (self->auto_write)
+ call_write_function(self);
+ return mp_const_none;
+}
+MP_DEFINE_CONST_FUN_OBJ_2(pixelbuf_pixelbuf_set_brightness_obj, pixelbuf_pixelbuf_obj_set_brightness);
+
+const mp_obj_property_t pixelbuf_pixelbuf_brightness_obj = {
+ .base.type = &mp_type_property,
+ .proxy = {(mp_obj_t)&pixelbuf_pixelbuf_get_brightness_obj,
+ (mp_obj_t)&pixelbuf_pixelbuf_set_brightness_obj,
+ (mp_obj_t)&mp_const_none_obj},
+};
+
+void pixelbuf_recalculate_brightness(pixelbuf_pixelbuf_obj_t *self) {
+ uint8_t *buf = (uint8_t *)self->buf;
+ uint8_t *rawbuf = (uint8_t *)self->rawbuf;
+ // Compensate for shifted buffer (bpp=3 dotstar)
+ for (uint i = 0; i < self->bytes; i++) {
+ // Don't adjust per-pixel luminance bytes in dotstar mode
+ if (!self->dotstar_mode || (i % 4 != 0))
+ buf[i] = rawbuf[i] * self->brightness;
+ }
+}
+
+//| .. attribute:: auto_write
+//|
+//| Whether to automatically write the pixels after each update.
+//|
+STATIC mp_obj_t pixelbuf_pixelbuf_obj_get_auto_write(mp_obj_t self_in) {
+ mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type));
+ pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ return mp_obj_new_bool(self->auto_write);
+}
+MP_DEFINE_CONST_FUN_OBJ_1(pixelbuf_pixelbuf_get_auto_write_obj, pixelbuf_pixelbuf_obj_get_auto_write);
+
+
+STATIC mp_obj_t pixelbuf_pixelbuf_obj_set_auto_write(mp_obj_t self_in, mp_obj_t value) {
+ mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type));
+ pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ self->auto_write = mp_obj_is_true(value);
+ return mp_const_none;
+}
+MP_DEFINE_CONST_FUN_OBJ_2(pixelbuf_pixelbuf_set_auto_write_obj, pixelbuf_pixelbuf_obj_set_auto_write);
+
+const mp_obj_property_t pixelbuf_pixelbuf_auto_write_obj = {
+ .base.type = &mp_type_property,
+ .proxy = {(mp_obj_t)&pixelbuf_pixelbuf_get_auto_write_obj,
+ (mp_obj_t)&pixelbuf_pixelbuf_set_auto_write_obj,
+ (mp_obj_t)&mp_const_none_obj},
+};
+
+
+//| .. attribute:: buf
+//|
+//| (read-only) bytearray of pixel data after brightness adjustment. If an offset was provided
+//| then this bytearray is the subset of the bytearray passed in that represents the
+//| actual pixels.
+//|
+STATIC mp_obj_t pixelbuf_pixelbuf_obj_get_buf(mp_obj_t self_in) {
+ mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type));
+ pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ return mp_obj_new_bytearray_by_ref(self->bytes, self->buf);
+}
+MP_DEFINE_CONST_FUN_OBJ_1(pixelbuf_pixelbuf_get_buf_obj, pixelbuf_pixelbuf_obj_get_buf);
+
+const mp_obj_property_t pixelbuf_pixelbuf_buf_obj = {
+ .base.type = &mp_type_property,
+ .proxy = {(mp_obj_t)&pixelbuf_pixelbuf_get_buf_obj,
+ (mp_obj_t)&mp_const_none_obj,
+ (mp_obj_t)&mp_const_none_obj},
+};
+
+//| .. attribute:: byteorder
+//|
+//| `ByteOrder` class for the buffer (read-only)
+//|
+STATIC mp_obj_t pixelbuf_pixelbuf_obj_get_byteorder(mp_obj_t self_in) {
+ mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type));
+ pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ return &self->byteorder;
+}
+MP_DEFINE_CONST_FUN_OBJ_1(pixelbuf_pixelbuf_get_byteorder_obj, pixelbuf_pixelbuf_obj_get_byteorder);
+
+const mp_obj_property_t pixelbuf_pixelbuf_byteorder_obj = {
+ .base.type = &mp_type_property,
+ .proxy = {(mp_obj_t)&pixelbuf_pixelbuf_get_byteorder_obj,
+ (mp_obj_t)&mp_const_none_obj,
+ (mp_obj_t)&mp_const_none_obj},
+};
+
+STATIC mp_obj_t pixelbuf_pixelbuf_unary_op(mp_unary_op_t op, mp_obj_t self_in) {
+ mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type));
+ pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ switch (op) {
+ case MP_UNARY_OP_BOOL: return mp_const_true;
+ case MP_UNARY_OP_LEN: return MP_OBJ_NEW_SMALL_INT(self->pixels);
+ default: return MP_OBJ_NULL; // op not supported
+ }
+}
+
+//| .. method:: show()
+//|
+//| Call the associated write function to display the pixels.
+//|
+
+STATIC mp_obj_t pixelbuf_pixelbuf_show(mp_obj_t self_in) {
+ mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type));
+ pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ call_write_function(self);
+ return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(pixelbuf_pixelbuf_show_obj, pixelbuf_pixelbuf_show);
+
+void call_write_function(pixelbuf_pixelbuf_obj_t *self) {
+ // execute function if it's set
+ if (self->write_function != mp_const_none) {
+ mp_call_function_n_kw(self->write_function, self->write_function_args->len, 0, self->write_function_args->items);
+ }
+}
+
+
+
+//| .. method:: []
+//|
+//| Get or set pixels. Supports individual pixels and slices.
+//|
+STATIC mp_obj_t pixelbuf_pixelbuf_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_obj_t value) {
+ mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type));
+
+ if (value == MP_OBJ_NULL) {
+ // delete item
+ // slice deletion
+ return MP_OBJ_NULL; // op not supported
+ }
+
+ pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ if (0) {
+#if MICROPY_PY_BUILTINS_SLICE
+ } else if (MP_OBJ_IS_TYPE(index_in, &mp_type_slice)) {
+ mp_bound_slice_t slice;
+
+ if (!mp_seq_get_fast_slice_indexes(self->bytes, index_in, &slice))
+ mp_raise_NotImplementedError(translate("Only slices with step=1 (aka None) are supported"));
+ if ((slice.stop * self->pixel_step) > self->bytes)
+ mp_raise_IndexError(translate("Range out of bounds"));
+
+ if (value == MP_OBJ_SENTINEL) { // Get
+ size_t len = slice.stop - slice.start;
+ return pixelbuf_get_pixel_array((uint8_t *) self->buf + slice.start, len, &self->byteorder, self->pixel_step, self->dotstar_mode);
+ } else { // Set
+ #if MICROPY_PY_ARRAY_SLICE_ASSIGN
+
+ if (!(MP_OBJ_IS_TYPE(value, &mp_type_list) || MP_OBJ_IS_TYPE(value, &mp_type_tuple)))
+ mp_raise_ValueError(translate("tuple/list required on RHS"));
+
+ size_t dst_len = slice.stop - slice.start;
+
+ mp_obj_t *src_objs;
+ size_t num_items;
+ if (MP_OBJ_IS_TYPE(value, &mp_type_list)) {
+ mp_obj_list_t *t = MP_OBJ_TO_PTR(value);
+ num_items = t->len;
+ src_objs = t->items;
+ } else {
+ mp_obj_tuple_t *l = MP_OBJ_TO_PTR(value);
+ num_items = l->len;
+ src_objs = l->items;
+ }
+ if (num_items != dst_len)
+ mp_raise_ValueError_varg(translate("Unmatched number of items on RHS (expected %d, got %d)."),
+ dst_len, num_items);
+
+ for (size_t i = slice.start; i < slice.stop; i++) {
+ mp_obj_t *item = src_objs[i-slice.start];
+ if (MP_OBJ_IS_TYPE(value, &mp_type_list) || MP_OBJ_IS_TYPE(value, &mp_type_tuple) || MP_OBJ_IS_INT(value)) {
+ pixelbuf_set_pixel(self->buf + (i * self->pixel_step),
+ self->two_buffers ? self->rawbuf + (i * self->pixel_step) : NULL,
+ self->brightness, item, &self->byteorder, self->dotstar_mode);
+ }
+ }
+ if (self->auto_write)
+ call_write_function(self);
+ return mp_const_none;
+ #else
+ return MP_OBJ_NULL; // op not supported
+ #endif
+ }
+#endif
+ } else { // Single index rather than slice.
+ size_t index = mp_get_index(self->base.type, self->pixels, index_in, false);
+ size_t offset = (index * self->pixel_step);
+ if (offset > self->bytes)
+ mp_raise_IndexError(translate("Pixel beyond bounds of buffer"));
+
+ if (value == MP_OBJ_SENTINEL) { // Get
+ uint8_t *pixelstart = (uint8_t *)(self->two_buffers ? self->rawbuf : self->buf) + offset;
+ return pixelbuf_get_pixel(pixelstart, &self->byteorder, self->dotstar_mode);
+ } else { // Store
+ pixelbuf_set_pixel(self->buf + offset, self->two_buffers ? self->rawbuf + offset : NULL,
+ self->brightness, value, &self->byteorder, self->dotstar_mode);
+ if (self->auto_write)
+ call_write_function(self);
+ return mp_const_none;
+ }
+ }
+}
+
+STATIC const mp_rom_map_elem_t pixelbuf_pixelbuf_locals_dict_table[] = {
+ { MP_ROM_QSTR(MP_QSTR_auto_write), MP_ROM_PTR(&pixelbuf_pixelbuf_auto_write_obj)},
+ { MP_ROM_QSTR(MP_QSTR_bpp), MP_ROM_PTR(&pixelbuf_pixelbuf_bpp_obj)},
+ { MP_ROM_QSTR(MP_QSTR_brightness), MP_ROM_PTR(&pixelbuf_pixelbuf_brightness_obj)},
+ { MP_ROM_QSTR(MP_QSTR_buf), MP_ROM_PTR(&pixelbuf_pixelbuf_buf_obj)},
+ { MP_ROM_QSTR(MP_QSTR_byteorder), MP_ROM_PTR(&pixelbuf_pixelbuf_byteorder_obj)},
+ { MP_ROM_QSTR(MP_QSTR_show), MP_ROM_PTR(&pixelbuf_pixelbuf_show_obj)},
+};
+
+STATIC MP_DEFINE_CONST_DICT(pixelbuf_pixelbuf_locals_dict, pixelbuf_pixelbuf_locals_dict_table);
+
+
+const mp_obj_type_t pixelbuf_pixelbuf_type = {
+ { &mp_type_type },
+ .name = MP_QSTR_PixelBuf,
+ .subscr = pixelbuf_pixelbuf_subscr,
+ .make_new = pixelbuf_pixelbuf_make_new,
+ .unary_op = pixelbuf_pixelbuf_unary_op,
+ .print = NULL,
+ .locals_dict = (mp_obj_t)&pixelbuf_pixelbuf_locals_dict,
+};
diff --git a/shared-bindings/_pixelbuf/PixelBuf.h b/shared-bindings/_pixelbuf/PixelBuf.h
new file mode 100644
index 000000000..0b1e36278
--- /dev/null
+++ b/shared-bindings/_pixelbuf/PixelBuf.h
@@ -0,0 +1,56 @@
+/*
+ * This file is part of the Circuit Python project, https://github.com/adafruit/circuitpython
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2018 Roy Hooper
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef CP_SHARED_BINDINGS_PIXELBUF_PIXELBUF_H
+#define CP_SHARED_BINDINGS_PIXELBUF_PIXELBUF_H
+
+#include "shared-bindings/_pixelbuf/types.h"
+
+const mp_obj_type_t pixelbuf_pixelbuf_type;
+
+typedef struct {
+ mp_obj_base_t base;
+ size_t pixels;
+ size_t bytes;
+ size_t pixel_step;
+ pixelbuf_byteorder_obj_t byteorder;
+ mp_obj_t bytearray;
+ mp_obj_t rawbytearray;
+ mp_float_t brightness;
+ bool two_buffers;
+ size_t offset;
+ bool dotstar_mode;
+ uint8_t *rawbuf;
+ uint8_t *buf;
+ mp_obj_t write_function;
+ mp_obj_tuple_t *write_function_args;
+ bool auto_write;
+} pixelbuf_pixelbuf_obj_t;
+
+void pixelbuf_recalculate_brightness(pixelbuf_pixelbuf_obj_t *self);
+void call_write_function(pixelbuf_pixelbuf_obj_t *self);
+
+#endif // CP_SHARED_BINDINGS_PIXELBUF_PIXELBUF_H
diff --git a/shared-bindings/_pixelbuf/__init__.c b/shared-bindings/_pixelbuf/__init__.c
new file mode 100644
index 000000000..31defc7fb
--- /dev/null
+++ b/shared-bindings/_pixelbuf/__init__.c
@@ -0,0 +1,326 @@
+/*
+ * This file is part of the Circuit Python project, https://github.com/adafruit/circuitpython
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2018 Roy Hooper
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "py/obj.h"
+#include "py/mphal.h"
+#include "py/runtime.h"
+#include "py/objproperty.h"
+
+#include "types.h"
+#include "__init__.h"
+
+#include "PixelBuf.h"
+#include "../../shared-module/_pixelbuf/PixelBuf.h"
+
+
+//| :mod:`_pixelbuf` --- Fast RGB(W) pixel buffer and helpers
+//| ===========================================================
+
+//| .. module:: _pixelbuf
+//| :synopsis: A fast RGB(W) pixel buffer library for like NeoPixel and DotStar.
+//|
+//| The `_pixelbuf` module provides :py:class:`PixelBuf` and :py:class:`ByteOrder` classes to accelerate
+//| RGB(W) strip/matrix manipulation, such as DotStar and Neopixel.
+//|
+
+//| Libraries
+//|
+//| .. toctree::
+//| :maxdepth: 3
+//|
+//| PixelBuf
+
+//| .. class:: ByteOrder
+//|
+//| Classes representing byteorders for circuitpython
+
+
+//| .. attribute:: bpp
+//|
+//| The number of bytes per pixel (read-only)
+//|
+
+//| .. attribute:: has_white
+//|
+//| Whether the pixel has white (in addition to RGB)
+//|
+
+//| .. attribute:: has_luminosity
+//|
+//| Whether the pixel has luminosity (in addition to RGB)
+//|
+
+//| .. attribute:: byteorder
+//|
+//| Tuple of byte order (r, g, b) or (r, g, b, w) or (r, g, b, l)
+//|
+
+
+STATIC void pixelbuf_byteorder_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {
+ mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_byteorder_type));
+ pixelbuf_byteorder_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ if (dest[0] == MP_OBJ_NULL) {
+ // load attribute
+ mp_obj_t val;
+ if (attr == MP_QSTR_bpp) {
+ val = MP_OBJ_NEW_SMALL_INT(self->bpp);
+ } else if (attr == MP_QSTR_has_white) {
+ val = mp_obj_new_bool(self->has_white);
+ } else if (attr == MP_QSTR_has_luminosity) {
+ val = mp_obj_new_bool(self->has_luminosity);
+ } else if (attr == MP_QSTR_byteorder) {
+ mp_obj_t items[4];
+ uint8_t n = self->bpp;
+ if (self->has_luminosity || self->has_white) {
+ n = 4;
+ }
+ uint8_t *values = (uint8_t *)&(self->byteorder);
+ for (uint8_t i=0; i<n; i++) {
+ items[i] = MP_OBJ_NEW_SMALL_INT(values[i]);
+ }
+ val = mp_obj_new_tuple(n, items);
+ } else {
+ mp_raise_AttributeError(translate("no such attribute"));
+ }
+ dest[0] = val;
+ } else {
+ // delete/store attribute (ignored)
+ dest[0] = MP_OBJ_NULL;
+ mp_raise_AttributeError(translate("readonly attribute"));
+ }
+}
+
+STATIC mp_obj_t pixelbuf_byteorder_unary_op(mp_unary_op_t op, mp_obj_t self_in) {
+ pixelbuf_byteorder_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ switch (op) {
+ case MP_UNARY_OP_LEN: return MP_OBJ_NEW_SMALL_INT(self->bpp);
+ default: return MP_OBJ_NULL; // op not supported
+ }
+}
+
+const mp_obj_type_t pixelbuf_byteorder_type = {
+ { &mp_type_type },
+ .name = MP_QSTR_ByteOrder,
+ .print = pixelbuf_byteorder_print,
+ .unary_op = pixelbuf_byteorder_unary_op,
+ .attr = pixelbuf_byteorder_attr,
+};
+
+
+// This macro is used to simplify RGB subclass definition
+#define PIXELBUF_BYTEORDER(p_name, p_bpp, p_r, p_g, p_b, p_w, p_has_white, p_has_luminosity) \
+const pixelbuf_byteorder_obj_t byteorder_## p_name = { \
+ { &pixelbuf_byteorder_type }, \
+ .name = MP_QSTR_## p_name, \
+ .bpp = p_bpp, \
+ .byteorder = { p_r, p_g, p_b, p_w }, \
+ .has_white = p_has_white, \
+ .has_luminosity = p_has_luminosity, \
+};
+
+//| .. function:: wheel(n)
+//|
+//| C implementation of the common wheel() function found in many examples.
+//| Returns the colorwheel RGB value as an integer value for n (usable in :py:class:`PixelBuf`, neopixel, and dotstar).
+//|
+
+STATIC mp_obj_t pixelbuf_wheel(mp_obj_t n) {
+ return MP_OBJ_NEW_SMALL_INT(colorwheel(MP_OBJ_IS_SMALL_INT(n) ? MP_OBJ_SMALL_INT_VALUE(n) : mp_obj_float_get(n)));
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(pixelbuf_wheel_obj, pixelbuf_wheel);
+
+const int32_t colorwheel(float pos) {
+ if (pos > 255) {
+ pos = pos - ((uint32_t)(pos / 256) * 256);
+ }
+ if (pos < 85)
+ return (uint8_t)(pos * 3) << 16 | (uint8_t)(255 - (pos * 3)) << 8;
+ else if (pos < 170) {
+ pos -= 85;
+ return (uint8_t)(255 - (pos * 3)) << 16 | (uint8_t)(pos * 3);
+ } else {
+ pos -= 170;
+ return (uint8_t)(pos * 3) << 8 | (uint8_t)(255 - pos * 3);
+ }
+}
+
+
+/// RGB
+//| .. class:: RGB
+//|
+//| * **order** Red, Green, Blue
+//| * **bpp** 3
+PIXELBUF_BYTEORDER(RGB, 3, 0, 1, 2, 3, false, false)
+//| .. class:: RBG
+//|
+//| * **order** Red, Blue, Green
+//| * **bpp** 3
+PIXELBUF_BYTEORDER(RBG, 3, 0, 2, 1, 3, false, false)
+//| .. class:: GRB
+//|
+//| * **order** Green, Red, Blue
+//| * **bpp** 3
+//|
+//| Commonly used by NeoPixel.
+PIXELBUF_BYTEORDER(GRB, 3, 1, 0, 2, 3, false, false)
+//| .. class:: GBR
+//|
+//| * **order** Green, Blue, Red
+//| * **bpp** 3
+PIXELBUF_BYTEORDER(GBR, 3, 1, 2, 0, 3, false, false)
+//| .. class:: BRG
+//|
+//| * **order** Blue, Red, Green
+//| * **bpp** 3
+PIXELBUF_BYTEORDER(BRG, 3, 2, 0, 1, 3, false, false)
+//| .. class:: BGR
+//|
+//| * **order** Blue, Green, Red
+//| * **bpp** 3
+//|
+//| Commonly used by Dotstar.
+PIXELBUF_BYTEORDER(BGR, 3, 2, 1, 0, 3, false, false)
+
+// RGBW
+//| .. class:: RGBW
+//|
+//| * **order** Red, Green, Blue, White
+//| * **bpp** 4
+//| * **has_white** True
+PIXELBUF_BYTEORDER(RGBW, 4, 0, 1, 2, 3, true, false)
+//| .. class:: RBGW
+//|
+//| * **order** Red, Blue, Green, White
+//| * **bpp** 4
+//| * **has_white** True
+PIXELBUF_BYTEORDER(RBGW, 4, 0, 2, 1, 3, true, false)
+//| .. class:: GRBW
+//|
+//| * **order** Green, Red, Blue, White
+//| * **bpp** 4
+//| * **has_white** True
+//|
+//| Commonly used by RGBW NeoPixels.
+PIXELBUF_BYTEORDER(GRBW, 4, 1, 0, 2, 3, true, false)
+//| .. class:: GBRW
+//|
+//| * **order** Green, Blue, Red, White
+//| * **bpp** 4
+//| * **has_white** True
+PIXELBUF_BYTEORDER(GBRW, 4, 1, 2, 0, 3, true, false)
+//| .. class:: BRGW
+//|
+//| * **order** Blue, Red, Green, White
+//| * **bpp** 4
+//| * **has_white** True
+PIXELBUF_BYTEORDER(BRGW, 4, 2, 0, 1, 3, true, false)
+//| .. class:: BGRW
+//|
+//| * **order** Blue, Green, Red, White
+//| * **bpp** 4
+//| * **has_white** True
+PIXELBUF_BYTEORDER(BGRW, 4, 2, 1, 0, 3, true, false)
+
+// Luminosity + RGB (eg for Dotstar)
+// Luminosity chosen because the luminosity of a Dotstar at full bright
+// burns the eyes like looking at the Sun.
+// https://www.thesaurus.com/browse/luminosity?s=t
+//| .. class:: LRGB
+//|
+//| * **order** *Luminosity*, Red, Green, Blue
+//| * **bpp** 4
+//| * **has_luminosity** True
+PIXELBUF_BYTEORDER(LRGB, 4, 1, 2, 3, 0, false, true)
+//| .. class:: LRBG
+//|
+//| * **order** *Luminosity*, Red, Blue, Green
+//| * **bpp** 4
+//| * **has_luminosity** True
+PIXELBUF_BYTEORDER(LRBG, 4, 1, 3, 2, 0, false, true)
+//| .. class:: LGRB
+//|
+//| * **order** *Luminosity*, Green, Red, Blue
+//| * **bpp** 4
+//| * **has_luminosity** True
+PIXELBUF_BYTEORDER(LGRB, 4, 2, 1, 3, 0, false, true)
+//| .. class:: LGBR
+//|
+//| * **order** *Luminosity*, Green, Blue, Red
+//| * **bpp** 4
+//| * **has_luminosity** True
+PIXELBUF_BYTEORDER(LGBR, 4, 2, 3, 1, 0, false, true)
+//| .. class:: LBRG
+//|
+//| * **order** *Luminosity*, Blue, Red, Green
+//| * **bpp** 4
+//| * **has_luminosity** True
+PIXELBUF_BYTEORDER(LBRG, 4, 3, 1, 2, 0, false, true)
+//| .. class:: LBGR
+//|
+//| * **order** *Luminosity*, Blue, Green, Red
+//| * **bpp** 4
+//| * **has_luminosity** True
+//|
+//| Actual format commonly used by DotStar (5 bit luninance value)
+PIXELBUF_BYTEORDER(LBGR, 4, 3, 2, 1, 0, false, true)
+
+STATIC const mp_rom_map_elem_t pixelbuf_module_globals_table[] = {
+ { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR__pixelbuf) },
+ { MP_ROM_QSTR(MP_QSTR_PixelBuf), MP_ROM_PTR(&pixelbuf_pixelbuf_type) },
+ { MP_ROM_QSTR(MP_QSTR_ByteOrder), MP_ROM_PTR(&pixelbuf_byteorder_type) },
+ { MP_ROM_QSTR(MP_QSTR_RGB), MP_ROM_PTR(&byteorder_RGB) },
+ { MP_ROM_QSTR(MP_QSTR_RBG), MP_ROM_PTR(&byteorder_RBG) },
+ { MP_ROM_QSTR(MP_QSTR_GRB), MP_ROM_PTR(&byteorder_GRB) },
+ { MP_ROM_QSTR(MP_QSTR_GBR), MP_ROM_PTR(&byteorder_GBR) },
+ { MP_ROM_QSTR(MP_QSTR_BRG), MP_ROM_PTR(&byteorder_BRG) },
+ { MP_ROM_QSTR(MP_QSTR_BGR), MP_ROM_PTR(&byteorder_BGR) },
+ { MP_ROM_QSTR(MP_QSTR_RGBW), MP_ROM_PTR(&byteorder_RGBW) },
+ { MP_ROM_QSTR(MP_QSTR_RBGW), MP_ROM_PTR(&byteorder_RBGW) },
+ { MP_ROM_QSTR(MP_QSTR_GRBW), MP_ROM_PTR(&byteorder_GRBW) },
+ { MP_ROM_QSTR(MP_QSTR_GBRW), MP_ROM_PTR(&byteorder_GBRW) },
+ { MP_ROM_QSTR(MP_QSTR_BRGW), MP_ROM_PTR(&byteorder_BRGW) },
+ { MP_ROM_QSTR(MP_QSTR_BGRW), MP_ROM_PTR(&byteorder_BGRW) },
+ { MP_ROM_QSTR(MP_QSTR_LRGB), MP_ROM_PTR(&byteorder_LRGB) },
+ { MP_ROM_QSTR(MP_QSTR_LRBG), MP_ROM_PTR(&byteorder_LRBG) },
+ { MP_ROM_QSTR(MP_QSTR_LGRB), MP_ROM_PTR(&byteorder_LGRB) },
+ { MP_ROM_QSTR(MP_QSTR_LGBR), MP_ROM_PTR(&byteorder_LGBR) },
+ { MP_ROM_QSTR(MP_QSTR_LBRG), MP_ROM_PTR(&byteorder_LBRG) },
+ { MP_ROM_QSTR(MP_QSTR_LBGR), MP_ROM_PTR(&byteorder_LBGR) },
+ { MP_ROM_QSTR(MP_QSTR_wheel), MP_ROM_PTR(&pixelbuf_wheel_obj) },
+};
+
+STATIC MP_DEFINE_CONST_DICT(pixelbuf_module_globals, pixelbuf_module_globals_table);
+
+STATIC void pixelbuf_byteorder_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
+ pixelbuf_byteorder_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ mp_printf(print, "%q.%q", MP_QSTR__pixelbuf, self->name);
+ return;
+}
+
+const mp_obj_module_t pixelbuf_module = {
+ .base = { &mp_type_module },
+ .globals = (mp_obj_dict_t*)&pixelbuf_module_globals,
+};
diff --git a/shared-bindings/_pixelbuf/__init__.h b/shared-bindings/_pixelbuf/__init__.h
new file mode 100644
index 000000000..a62d67c4a
--- /dev/null
+++ b/shared-bindings/_pixelbuf/__init__.h
@@ -0,0 +1,37 @@
+/*
+ * This file is part of the Circuit Python project, https://github.com/adafruit/circuitpython
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2018 Roy Hooper
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef CP_SHARED_BINDINGS_PIXELBUF_INIT_H
+#define CP_SHARED_BINDINGS_PIXELBUF_INIT_H
+
+#include "common-hal/digitalio/DigitalInOut.h"
+
+STATIC void pixelbuf_byteorder_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind);
+const int32_t colorwheel(float pos);
+const mp_obj_type_t pixelbuf_byteorder_type;
+extern void common_hal_neopixel_write(const digitalio_digitalinout_obj_t* gpio, uint8_t *pixels, uint32_t numBytes);
+
+#endif //CP_SHARED_BINDINGS_PIXELBUF_INIT_H
diff --git a/shared-bindings/_pixelbuf/types.h b/shared-bindings/_pixelbuf/types.h
new file mode 100644
index 000000000..f7d757791
--- /dev/null
+++ b/shared-bindings/_pixelbuf/types.h
@@ -0,0 +1,48 @@
+/*
+ * This file is part of the Circuit Python project, https://github.com/adafruit/circuitpython
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2018 Roy Hooper
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef CIRCUITPYTHON_PIXELBUF_TYPES_H
+#define CIRCUITPYTHON_PIXELBUF_TYPES_H
+
+//| :orphan:
+
+typedef struct {
+ uint8_t r;
+ uint8_t g;
+ uint8_t b;
+ uint8_t w;
+} pixelbuf_rgbw_t;
+
+typedef struct {
+ mp_obj_base_t base;
+ qstr name;
+ uint8_t bpp;
+ pixelbuf_rgbw_t byteorder;
+ bool has_white;
+ bool has_luminosity;
+} pixelbuf_byteorder_obj_t;
+
+#endif // CIRCUITPYTHON_PIXELBUF_TYPES_H
diff --git a/shared-bindings/index.rst b/shared-bindings/index.rst
index 44b3492e6..9641d73d1 100644
--- a/shared-bindings/index.rst
+++ b/shared-bindings/index.rst
@@ -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**
================= ==============================
diff --git a/shared-module/_pixelbuf/PixelBuf.c b/shared-module/_pixelbuf/PixelBuf.c
new file mode 100644
index 000000000..d32697239
--- /dev/null
+++ b/shared-module/_pixelbuf/PixelBuf.c
@@ -0,0 +1,120 @@
+/*
+ * This file is part of the Circuit Python project, https://github.com/adafruit/circuitpython
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2018 Roy Hooper
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+
+#include "py/obj.h"
+#include "py/objarray.h"
+#include "py/runtime.h"
+#include "PixelBuf.h"
+#include <string.h>
+
+void pixelbuf_set_pixel_int(uint8_t *buf, mp_int_t value, pixelbuf_byteorder_obj_t *byteorder) {
+ buf[byteorder->byteorder.r] = value >> 16 & 0xff;
+ buf[byteorder->byteorder.g] = (value >> 8) & 0xff;
+ buf[byteorder->byteorder.b] = value & 0xff;
+ if (byteorder->bpp == 4 && byteorder->has_white &&
+ (buf[byteorder->byteorder.r] == buf[byteorder->byteorder.g] &&
+ buf[byteorder->byteorder.r] == buf[byteorder->byteorder.b])) {
+ buf[byteorder->byteorder.w] = buf[byteorder->byteorder.r];
+ buf[byteorder->byteorder.r] = buf[byteorder->byteorder.g] = buf[byteorder->byteorder.b] = 0;
+ }
+}
+
+void pixelbuf_set_pixel(uint8_t *buf, uint8_t *rawbuf, float brightness, mp_obj_t *item, pixelbuf_byteorder_obj_t *byteorder, bool dotstar) {
+ if (MP_OBJ_IS_INT(item)) {
+ uint8_t *target = rawbuf ? rawbuf : buf;
+ pixelbuf_set_pixel_int(target, mp_obj_get_int_truncated(item), byteorder);
+ if (dotstar) {
+ buf[0] = DOTSTAR_LED_START_FULL_BRIGHT;
+ if (rawbuf)
+ rawbuf[0] = DOTSTAR_LED_START_FULL_BRIGHT;
+ }
+ if (rawbuf) {
+ buf[byteorder->byteorder.r] = rawbuf[byteorder->byteorder.r] * brightness;
+ buf[byteorder->byteorder.g] = rawbuf[byteorder->byteorder.g] * brightness;
+ buf[byteorder->byteorder.b] = rawbuf[byteorder->byteorder.b] * brightness;
+ } else {
+ buf[byteorder->byteorder.r] *= brightness;
+ buf[byteorder->byteorder.g] *= brightness;
+ buf[byteorder->byteorder.b] *= brightness;
+ }
+ } else {
+ mp_obj_t *items;
+ size_t len;
+ mp_obj_get_array(item, &len, &items);
+ if (len != byteorder->bpp && !dotstar)
+ mp_raise_ValueError_varg(translate("Expected tuple of length %d, got %d"), byteorder->bpp, len);
+
+ buf[byteorder->byteorder.r] = mp_obj_get_int_truncated(items[PIXEL_R]) * brightness;
+ buf[byteorder->byteorder.g] = mp_obj_get_int_truncated(items[PIXEL_G]) * brightness;
+ buf[byteorder->byteorder.b] = mp_obj_get_int_truncated(items[PIXEL_B]) * brightness;
+ if (rawbuf) {
+ rawbuf[byteorder->byteorder.r] = mp_obj_get_int_truncated(items[PIXEL_R]);
+ rawbuf[byteorder->byteorder.g] = mp_obj_get_int_truncated(items[PIXEL_G]);
+ rawbuf[byteorder->byteorder.b] = mp_obj_get_int_truncated(items[PIXEL_B]);
+ }
+ if (len > 3) {
+ if (dotstar) {
+ buf[byteorder->byteorder.w] = DOTSTAR_LED_START | DOTSTAR_BRIGHTNESS(mp_obj_get_float(items[PIXEL_W]));
+ if (rawbuf)
+ rawbuf[byteorder->byteorder.w] = buf[byteorder->byteorder.w];
+ } else {
+ buf[byteorder->byteorder.w] = mp_obj_get_int_truncated(items[PIXEL_W]) * brightness;
+ if (rawbuf)
+ rawbuf[byteorder->byteorder.w] = mp_obj_get_int_truncated(items[PIXEL_W]);
+ }
+ } else if (dotstar) {
+ buf[byteorder->byteorder.w] = DOTSTAR_LED_START_FULL_BRIGHT;
+ if (rawbuf)
+ rawbuf[byteorder->byteorder.w] = DOTSTAR_LED_START_FULL_BRIGHT;
+ }
+ }
+}
+
+mp_obj_t *pixelbuf_get_pixel_array(uint8_t *buf, uint len, pixelbuf_byteorder_obj_t *byteorder, uint8_t step, bool dotstar) {
+ mp_obj_t elems[len];
+ for (uint i = 0; i < len; i++) {
+ elems[i] = pixelbuf_get_pixel(buf + (i * step), byteorder, dotstar);
+ }
+ return mp_obj_new_tuple(len, elems);
+}
+
+mp_obj_t *pixelbuf_get_pixel(uint8_t *buf, pixelbuf_byteorder_obj_t *byteorder, bool dotstar) {
+ mp_obj_t elems[byteorder->bpp];
+
+ elems[0] = mp_obj_new_int(buf[byteorder->byteorder.r]);
+ elems[1] = mp_obj_new_int(buf[byteorder->byteorder.g]);
+ elems[2] = mp_obj_new_int(buf[byteorder->byteorder.b]);
+ if (byteorder->bpp > 3)
+ {
+ if (dotstar)
+ elems[3] = mp_obj_new_float(DOTSTAR_GET_BRIGHTNESS(buf[byteorder->byteorder.w]));
+ else
+ elems[3] = mp_obj_new_int(buf[byteorder->byteorder.w]);
+ }
+
+ return mp_obj_new_tuple(byteorder->bpp, elems);
+}
diff --git a/shared-module/_pixelbuf/PixelBuf.h b/shared-module/_pixelbuf/PixelBuf.h
new file mode 100644
index 000000000..9e115fe0c
--- /dev/null
+++ b/shared-module/_pixelbuf/PixelBuf.h
@@ -0,0 +1,50 @@
+/*
+ * This file is part of the Circuit Python project, https://github.com/adafruit/circuitpython
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2018 Roy Hooper
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+
+#include "py/obj.h"
+#include "py/objarray.h"
+#include "../../shared-bindings/_pixelbuf/types.h"
+
+#ifndef PIXELBUF_SHARED_MODULE_H
+#define PIXELBUF_SHARED_MODULE_H
+
+#define PIXEL_R 0
+#define PIXEL_G 1
+#define PIXEL_B 2
+#define PIXEL_W 3
+
+#define DOTSTAR_LED_START 0b11100000
+#define DOTSTAR_BRIGHTNESS(brightness) ((32 - (uint8_t)(32 - brightness * 31)) & 0b00011111)
+#define DOTSTAR_GET_BRIGHTNESS(value) ((value & 0b00011111) / 31.0)
+#define DOTSTAR_LED_START_FULL_BRIGHT 0xFF
+
+void pixelbuf_set_pixel(uint8_t *buf, uint8_t *rawbuf, float brightness, mp_obj_t *item, pixelbuf_byteorder_obj_t *byteorder, bool dotstar);
+mp_obj_t *pixelbuf_get_pixel(uint8_t *buf, pixelbuf_byteorder_obj_t *byteorder, bool dotstar);
+mp_obj_t *pixelbuf_get_pixel_array(uint8_t *buf, uint len, pixelbuf_byteorder_obj_t *byteorder, uint8_t step, bool dotstar);
+void pixelbuf_set_pixel_int(uint8_t *buf, mp_int_t value, pixelbuf_byteorder_obj_t *byteorder);
+
+#endif
diff --git a/shared-module/_pixelbuf/__init__.c b/shared-module/_pixelbuf/__init__.c
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/shared-module/_pixelbuf/__init__.c