diff --git a/docs/library/builtins.rst b/docs/library/builtins.rst index 36a84bc0c5..0061a8cea0 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 e06e070631..f25399844a 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 \n" "Language-Team: LANGUAGE \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 c041ec86c0..977cbca27c 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 \n" "Language-Team: LANGUAGE \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 92bf619563..1c7f51aac1 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 "Can not add Service." -#~ msgstr "Kann den Dienst nicht hinzufügen." - -#~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n" -#~ msgstr "CircuitPython ist abgestürzt. Ups!\n" +#~ msgid "unpack requires a buffer of %d bytes" +#~ msgstr "unpack erfordert einen Puffer von %d Bytes" #~ msgid "Can not apply advertisement data. status: 0x%02x" #~ msgstr "Kann advertisement data nicht anwenden. Status: 0x%02x" -#~ msgid "Cannot apply GAP parameters." -#~ msgstr "Kann GAP Parameter nicht anwenden." +#~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n" +#~ msgstr "CircuitPython ist abgestürzt. Ups!\n" -#~ msgid "Can not encode UUID, to check length." -#~ msgstr "Kann UUID nicht kodieren, um die Länge zu überprüfen." +#~ msgid "Can encode UUID into the advertisement packet." +#~ msgstr "Kann UUID in das advertisement packet kodieren." + +#~ msgid "Invalid Service type" +#~ msgstr "Ungültiger Diensttyp" #~ msgid "Can not query for the device address." #~ msgstr "Kann nicht nach der Geräteadresse suchen." -#~ msgid "Can not apply device name in the stack." -#~ msgstr "Der Gerätename kann nicht im Stack verwendet werden." +#~ msgid "Invalid UUID string length" +#~ msgstr "Ungültige UUID-Stringlänge" #~ msgid "" #~ "enough power for the whole circuit and press reset (after ejecting " @@ -2754,19 +2830,25 @@ msgstr "" #~ "genug Strom für den ganzen Schaltkreis liefert und drücke reset (nach dem " #~ "sicheren Auswerfen von CIRCUITPY.)\n" -#~ msgid "Invalid Service type" -#~ msgstr "Ungültiger Diensttyp" - -#~ msgid "Invalid UUID parameter" -#~ msgstr "Ungültiger UUID-Parameter" +#~ msgid "Can not apply device name in the stack." +#~ msgstr "Der Gerätename kann nicht im Stack verwendet werden." #~ msgid "" #~ "Please file an issue here with the contents of your CIRCUITPY drive:\n" #~ msgstr "" #~ "Bitte erstelle ein issue hier mit dem Inhalt deines CIRCUITPY-speichers:\n" -#~ msgid "Can encode UUID into the advertisement packet." -#~ msgstr "Kann UUID in das advertisement packet kodieren." +#~ msgid "Can not add Characteristic." +#~ msgstr "Kann das Merkmal nicht hinzufügen." -#~ msgid "Invalid UUID string length" -#~ msgstr "Ungültige UUID-Stringlänge" +#~ msgid "Cannot apply GAP parameters." +#~ msgstr "Kann GAP Parameter nicht anwenden." + +#~ msgid "Can not add Service." +#~ msgstr "Kann den Dienst nicht hinzufügen." + +#~ msgid "Can not encode UUID, to check length." +#~ msgstr "Kann UUID nicht kodieren, um die Länge zu überprüfen." + +#~ msgid "Invalid UUID parameter" +#~ msgstr "Ungültiger UUID-Parameter" diff --git a/locale/en_US.po b/locale/en_US.po index d62e9fd206..30fcbafac4 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 446fe7bc5d..f025a49fd1 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 ad9134f8e8..fb392075db 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 \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 4c7fb05020..6a7c235e6d 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 \n" "Language-Team: fr\n" @@ -1977,7 +1977,7 @@ msgstr "l'argument est d'un mauvais type" msgid "argument should be a '%q' not a '%q'" msgstr "l'argument devrait être un(e) '%q', pas '%q'" -#: py/runtime.c:1123 py/runtime.c:1197 +#: py/runtime.c:1123 py/runtime.c:1197 shared-bindings/_pixelbuf/__init__.c:106 msgid "no such attribute" msgstr "pas de tel attribut" @@ -2057,6 +2057,57 @@ msgstr "aucune exception active à relever" msgid "byte code not implemented" msgstr "bytecode non implémenté" +#: shared-bindings/_pixelbuf/PixelBuf.c:99 +#, c-format +msgid "byteorder is not an instance of ByteOrder (got a %s)" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:104 +#, c-format +msgid "Can not use dotstar with %s" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:116 +msgid "rawbuf is not the same size as buf" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:121 +#, c-format +msgid "buf is too small. need %d bytes" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:127 +msgid "write_args must be a list, tuple, or None" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:392 +#, fuzzy +msgid "Only slices with step=1 (aka None) are supported" +msgstr "seuls les slices avec 'step=1' (cad None) sont supportées" + +#: shared-bindings/_pixelbuf/PixelBuf.c:394 +#, fuzzy +msgid "Range out of bounds" +msgstr "adresse hors limites" + +#: shared-bindings/_pixelbuf/PixelBuf.c:403 +msgid "tuple/list required on RHS" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:419 +#, c-format +msgid "Unmatched number of items on RHS (expected %d, got %d)." +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:442 +msgid "Pixel beyond bounds of buffer" +msgstr "" + +#: shared-bindings/_pixelbuf/__init__.c:112 +#, fuzzy +msgid "readonly attribute" +msgstr "attribut illisible" + #: shared-bindings/_stage/Layer.c:71 msgid "graphic must be 2048 bytes long" msgstr "le graphic doit être long de 2048 octets" @@ -2585,6 +2636,11 @@ msgstr "" "L'objet a été désinitialisé et ne peut plus être utilisé. Créez un nouvel " "objet." +#: shared-module/_pixelbuf/PixelBuf.c:69 +#, c-format +msgid "Expected tuple of length %d, got %d" +msgstr "" + #: shared-module/audioio/Mixer.c:47 shared-module/audioio/WaveFile.c:117 msgid "Couldn't allocate first buffer" msgstr "Impossible d'allouer le 1er tampon" @@ -2833,26 +2889,46 @@ msgstr "" "Le bouton 'reset' a été appuyé pendant le démarrage de CircuitPython. " "Appuyer denouveau pour quitter de le mode sans-échec.\n" +#, fuzzy +#~ msgid "palette must be displayio.Palette" +#~ msgstr "la palette doit être une displayio.Palette" + #~ msgid "Invalid UUID string length" #~ msgstr "Longeur de chaîne UUID invalide" #~ msgid "Invalid UUID parameter" #~ msgstr "Paramètre UUID invalide" -#, fuzzy -#~ msgid "palette must be displayio.Palette" -#~ msgstr "la palette doit être une displayio.Palette" - -#, fuzzy -#~ msgid "value_size must be power of two" -#~ msgstr "value_size doit être une puissance de 2" - #~ msgid "Cannot apply GAP parameters." #~ msgstr "Impossible d'appliquer les paramètres GAP" +#~ msgid "Cannot set PPCP parameters." +#~ msgstr "Impossible d'appliquer les paramètres PPCP" + +#~ msgid "" +#~ "enough power for the whole circuit and press reset (after ejecting " +#~ "CIRCUITPY).\n" +#~ msgstr "" +#~ "assez de puissance pour l'ensemble du circuit et appuyez sur " +#~ "'reset' (après avoir éjecter CIRCUITPY).\n" + #~ msgid "Invalid Service type" #~ msgstr "Type de service invalide" +#~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n" +#~ msgstr "" +#~ "Il semblerait que votre code CircuitPython a durement planté. Oups!\n" + +#~ msgid "Can not add Characteristic." +#~ msgstr "Impossible d'ajouter la Characteristic." + +#~ msgid "Can not apply device name in the stack." +#~ msgstr "Impossible d'appliquer le nom de périphérique dans la pile" + +#, fuzzy +#~ msgid "unpack requires a buffer of %d bytes" +#~ msgstr "Echec de l'allocation de %d octets du tampon RX" + #~ msgid "" #~ "Please file an issue here with the contents of your CIRCUITPY drive:\n" #~ msgstr "" @@ -2864,36 +2940,16 @@ msgstr "" #~ msgid "Wrong address length" #~ msgstr "Mauvaise longueur d'adresse" +#, fuzzy +#~ msgid "value_size must be power of two" +#~ msgstr "value_size doit être une puissance de 2" + #, fuzzy #~ msgid "Wrong number of bytes provided" #~ msgstr "mauvais nombre d'octets fourni'" -#~ msgid "Can not apply device name in the stack." -#~ msgstr "Impossible d'appliquer le nom de périphérique dans la pile" - -#~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n" -#~ msgstr "" -#~ "Il semblerait que votre code CircuitPython a durement planté. Oups!\n" - -#~ msgid "" -#~ "enough power for the whole circuit and press reset (after ejecting " -#~ "CIRCUITPY).\n" -#~ msgstr "" -#~ "assez de puissance pour l'ensemble du circuit et appuyez sur " -#~ "'reset' (après avoir éjecter CIRCUITPY).\n" - #~ msgid "Can not add Service." #~ msgstr "Impossible d'ajouter le Service" #~ msgid "Can not query for the device address." #~ msgstr "Impossible d'obtenir l'adresse du périphérique" - -#~ msgid "Can not add Characteristic." -#~ msgstr "Impossible d'ajouter la Characteristic." - -#~ msgid "Cannot set PPCP parameters." -#~ msgstr "Impossible d'appliquer les paramètres PPCP" - -#, fuzzy -#~ msgid "unpack requires a buffer of %d bytes" -#~ msgstr "Echec de l'allocation de %d octets du tampon RX" diff --git a/locale/it_IT.po b/locale/it_IT.po index 8f5fb56848..8147f357fe 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 \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 c0583d8bc9..ab604de4a3 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 not apply device name in the stack." -#~ msgstr "Não é possível aplicar o nome do dispositivo na pilha." - -#~ msgid "Baud rate too high for this SPI peripheral" -#~ msgstr "Taxa de transmissão muito alta para esse periférico SPI" - -#~ msgid "Can not add Characteristic." -#~ msgstr "Não é possível adicionar Característica." - -#~ msgid "Cannot apply GAP parameters." -#~ msgstr "Não é possível aplicar parâmetros GAP." - -#~ msgid "Invalid UUID parameter" -#~ msgstr "Parâmetro UUID inválido" - -#~ msgid "Can not apply advertisement data. status: 0x%02x" -#~ msgstr "Não é possível aplicar dados de anúncio. status: 0x%02x" - #~ msgid "Can encode UUID into the advertisement packet." #~ msgstr "Pode codificar o UUID no pacote de anúncios." -#~ msgid "Cannot set PPCP parameters." -#~ msgstr "Não é possível definir parâmetros PPCP." - #, fuzzy #~ msgid "unpack requires a buffer of %d bytes" #~ msgstr "Falha ao alocar buffer RX de %d bytes" + +#~ msgid "Can not apply advertisement data. status: 0x%02x" +#~ msgstr "Não é possível aplicar dados de anúncio. status: 0x%02x" + +#~ msgid "Can not add Characteristic." +#~ msgstr "Não é possível adicionar Característica." + +#~ msgid "Baud rate too high for this SPI peripheral" +#~ msgstr "Taxa de transmissão muito alta para esse periférico SPI" + +#~ msgid "Can not apply device name in the stack." +#~ msgstr "Não é possível aplicar o nome do dispositivo na pilha." + +#~ msgid "Invalid UUID parameter" +#~ msgstr "Parâmetro UUID inválido" + +#~ msgid "Invalid Service type" +#~ msgstr "Tipo de serviço inválido" + +#~ msgid "Cannot apply GAP parameters." +#~ msgstr "Não é possível aplicar parâmetros GAP." diff --git a/ports/atmel-samd/Makefile b/ports/atmel-samd/Makefile index c8d197b3ef..797369bd61 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 017e66ddff..28c79d6e40 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 b07d63984d..e1e7484d50 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 4f2855d732..687a27df33 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 37f1bdef0b..fea4bc222c 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 ddc262a570..69250626f9 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 c9c45152be..9b93719efd 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 86edc9039f..e9507e3cc9 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 4f23dfff1e..6d63c0d1af 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 bf6c7a5daf..a980076616 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 0000000000..7c2766aa3f --- /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 + +#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 0000000000..0b1e362783 --- /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 0000000000..31defc7fbc --- /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; ibpp); + 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 0000000000..a62d67c4a4 --- /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 0000000000..f7d757791b --- /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 44b3492e67..9641d73d14 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 0000000000..d326972391 --- /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 + +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 0000000000..9e115fe0cf --- /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 0000000000..e69de29bb2