From ffe734edf72392743e423b8acda3cc7d75960bd1 Mon Sep 17 00:00:00 2001 From: Roy Hooper Date: Sun, 13 Jan 2019 23:51:13 -0500 Subject: [PATCH 1/7] Fresh combined checkin of _pixelbuf library. --- docs/library/builtins.rst | 4 +- ports/atmel-samd/Makefile | 9 + .../boards/arduino_zero/mpconfigboard.mk | 2 + .../mpconfigboard.mk | 2 + .../feather_m0_adalogger/mpconfigboard.mk | 2 + .../boards/pirkey_m0/mpconfigboard.mk | 2 + .../boards/trinket_m0/mpconfigboard.mk | 2 + ports/atmel-samd/mpconfigport.h | 11 +- ports/esp8266/Makefile | 5 + ports/nrf/Makefile | 8 +- shared-bindings/_pixelbuf/PixelBuf.c | 506 ++++++++++++++++++ shared-bindings/_pixelbuf/PixelBuf.h | 60 +++ shared-bindings/_pixelbuf/__init__.c | 326 +++++++++++ shared-bindings/_pixelbuf/__init__.h | 35 ++ shared-bindings/_pixelbuf/types.h | 48 ++ shared-bindings/index.rst | 2 + shared-module/_pixelbuf/PixelBuf.c | 120 +++++ shared-module/_pixelbuf/PixelBuf.h | 50 ++ shared-module/_pixelbuf/__init__.c | 0 19 files changed, 1190 insertions(+), 4 deletions(-) create mode 100644 shared-bindings/_pixelbuf/PixelBuf.c create mode 100644 shared-bindings/_pixelbuf/PixelBuf.h create mode 100644 shared-bindings/_pixelbuf/__init__.c create mode 100644 shared-bindings/_pixelbuf/__init__.h create mode 100644 shared-bindings/_pixelbuf/types.h create mode 100644 shared-module/_pixelbuf/PixelBuf.c create mode 100644 shared-module/_pixelbuf/PixelBuf.h create mode 100644 shared-module/_pixelbuf/__init__.c 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/ports/atmel-samd/Makefile b/ports/atmel-samd/Makefile index 852de75f39..9244ccc739 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 \ @@ -419,6 +423,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/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 65b8c94c5b..4e3d6073c8 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 @@ -308,6 +311,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 \ @@ -321,7 +329,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 d38285c914..67316b55ae 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 2bc5084754..164cd9abce 100755 --- a/ports/nrf/Makefile +++ b/ports/nrf/Makefile @@ -214,7 +214,13 @@ SRC_SHARED_MODULE = \ bitbangio/OneWire.c \ bitbangio/SPI.c \ busio/OneWire.c \ - storage/__init__.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..545166724f --- /dev/null +++ b/shared-bindings/_pixelbuf/PixelBuf.c @@ -0,0 +1,506 @@ +/* + * 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, size_t n_kw, const mp_obj_t *pos_args) { + mp_arg_check_num(n_args, n_kw, 2, MP_OBJ_FUN_ARGS_MAX, true); + mp_map_t kw_args; + mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); + 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; + } + } +} + +//| .. method:: fill_wheel(start=0, step=1) +//| +//| fill the buffer with a colorwheel starting at offset n, and stepping by step +//| + +STATIC mp_obj_t pixelbuf_pixelbuf_fill_wheel(mp_obj_t self_in, mp_obj_t start, mp_obj_t step) { + mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type)); + pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in); + float i = MP_OBJ_IS_SMALL_INT(start) ? MP_OBJ_SMALL_INT_VALUE(start) : mp_obj_float_get(start); + float incr = MP_OBJ_IS_SMALL_INT(step) ? MP_OBJ_SMALL_INT_VALUE(step) : mp_obj_float_get(step); + + bool auto_write = self->auto_write; + self->auto_write = false; + for (size_t n = 0; n < self->pixels; n++) { + mp_obj_t value = MP_OBJ_NEW_SMALL_INT(colorwheel(i)); + pixelbuf_pixelbuf_subscr(self_in, MP_OBJ_NEW_SMALL_INT(n), value); + i += incr; + } + self->auto_write = auto_write; + if (auto_write) + call_write_function(self); + + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_3(pixelbuf_pixelbuf_fill_wheel_obj, pixelbuf_pixelbuf_fill_wheel); + +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)}, + { MP_ROM_QSTR(MP_QSTR_fill_wheel), MP_ROM_PTR(&pixelbuf_pixelbuf_fill_wheel_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..b35e3ff908 --- /dev/null +++ b/shared-bindings/_pixelbuf/PixelBuf.h @@ -0,0 +1,60 @@ +/* + * 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); + + +#include "common-hal/digitalio/DigitalInOut.h" +extern void common_hal_neopixel_write(const digitalio_digitalinout_obj_t* gpio, uint8_t *pixels, uint32_t numBytes); + +#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..58fccfd91c --- /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 +//| Dotstar and Neopixel manipulation. +//| + +//| 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..5049ea38d2 --- /dev/null +++ b/shared-bindings/_pixelbuf/__init__.h @@ -0,0 +1,35 @@ +/* + * 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 + +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; + +#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 From be9caeb9150df3ff8a30b2e7ab20f32b7fc9b5f7 Mon Sep 17 00:00:00 2001 From: Roy Hooper Date: Sun, 13 Jan 2019 23:52:05 -0500 Subject: [PATCH 2/7] update translations --- locale/ID.po | 71 +++++++++++++++++--- locale/circuitpython.pot | 57 +++++++++++++++- locale/de_DE.po | 91 ++++++++++++++++++++------ locale/en_US.po | 57 +++++++++++++++- locale/es.po | 136 ++++++++++++++++++++++++++++----------- locale/fil.po | 116 ++++++++++++++++++++++++--------- locale/fr.po | 108 +++++++++++++++++++++++-------- locale/it_IT.po | 106 +++++++++++++++++++++++------- locale/pt_BR.po | 108 +++++++++++++++++++++++-------- 9 files changed, 672 insertions(+), 178 deletions(-) diff --git a/locale/ID.po b/locale/ID.po index 952e12d4d3..ec91aad806 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-10 21:32-0500\n" +"POT-Creation-Date: 2019-01-13 23:51-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -1964,7 +1964,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 "" @@ -2043,6 +2043,54 @@ msgstr "" msgid "byte code not implemented" msgstr "" +#: shared-bindings/_pixelbuf/PixelBuf.c:101 +#, c-format +msgid "byteorder is not an instance of ByteOrder (got a %s)" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:106 +#, c-format +msgid "Can not use dotstar with %s" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:118 +msgid "rawbuf is not the same size as buf" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:123 +#, c-format +msgid "buf is too small. need %d bytes" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:129 +msgid "write_args must be a list, tuple, or None" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:394 +msgid "Only slices with step=1 (aka None) are supported" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:396 +msgid "Range out of bounds" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:405 +msgid "tuple/list required on RHS" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:421 +#, c-format +msgid "Unmatched number of items on RHS (expected %d, got %d)." +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:444 +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 "" @@ -2493,6 +2541,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 "" @@ -2688,13 +2741,6 @@ msgstr "" #~ msgid "Invalid UUID string length" #~ msgstr "Panjang string UUID tidak valid" -#~ 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 "" #~ "enough power for the whole circuit and press reset (after ejecting " #~ "CIRCUITPY).\n" @@ -2702,6 +2748,13 @@ msgstr "" #~ "tegangan cukup untuk semua sirkuit dan tekan reset (setelah mencabut " #~ "CIRCUITPY).\n" +#~ 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" + #~ msgid "" #~ "Please file an issue here with the contents of your CIRCUITPY drive:\n" #~ msgstr "" diff --git a/locale/circuitpython.pot b/locale/circuitpython.pot index 5c85d09a80..37b403826a 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-10 21:32-0500\n" +"POT-Creation-Date: 2019-01-13 23:51-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -1931,7 +1931,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 "" @@ -2010,6 +2010,54 @@ msgstr "" msgid "byte code not implemented" msgstr "" +#: shared-bindings/_pixelbuf/PixelBuf.c:101 +#, c-format +msgid "byteorder is not an instance of ByteOrder (got a %s)" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:106 +#, c-format +msgid "Can not use dotstar with %s" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:118 +msgid "rawbuf is not the same size as buf" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:123 +#, c-format +msgid "buf is too small. need %d bytes" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:129 +msgid "write_args must be a list, tuple, or None" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:394 +msgid "Only slices with step=1 (aka None) are supported" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:396 +msgid "Range out of bounds" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:405 +msgid "tuple/list required on RHS" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:421 +#, c-format +msgid "Unmatched number of items on RHS (expected %d, got %d)." +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:444 +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 "" @@ -2457,6 +2505,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 47098b66ac..b8a8a43b65 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-10 21:32-0500\n" +"POT-Creation-Date: 2019-01-13 23:51-0500\n" "PO-Revision-Date: 2018-07-27 11:55-0700\n" "Last-Translator: Sebastian Plamauer\n" "Language-Team: \n" @@ -1960,7 +1960,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 "" @@ -2039,6 +2039,54 @@ msgstr "" msgid "byte code not implemented" msgstr "" +#: shared-bindings/_pixelbuf/PixelBuf.c:101 +#, c-format +msgid "byteorder is not an instance of ByteOrder (got a %s)" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:106 +#, c-format +msgid "Can not use dotstar with %s" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:118 +msgid "rawbuf is not the same size as buf" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:123 +#, c-format +msgid "buf is too small. need %d bytes" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:129 +msgid "write_args must be a list, tuple, or None" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:394 +msgid "Only slices with step=1 (aka None) are supported" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:396 +msgid "Range out of bounds" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:405 +msgid "tuple/list required on RHS" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:421 +#, c-format +msgid "Unmatched number of items on RHS (expected %d, got %d)." +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:444 +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 "" @@ -2494,6 +2542,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 "" @@ -2691,12 +2744,24 @@ msgstr "" #~ msgid "Invalid UUID parameter" #~ msgstr "Ungültiger UUID-Parameter" -#~ msgid "Invalid Service type" -#~ msgstr "Ungültiger Diensttyp" +#~ msgid "Can not add Service." +#~ msgstr "Kann den Dienst nicht hinzufügen." + +#~ msgid "Cannot apply GAP parameters." +#~ msgstr "Kann GAP Parameter nicht anwenden." #~ msgid "Can not apply advertisement data. status: 0x%02x" #~ msgstr "Kann advertisement data nicht anwenden. Status: 0x%02x" +#~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n" +#~ msgstr "CircuitPython ist abgestürzt. Ups!\n" + +#~ msgid "Can not apply device name in the stack." +#~ msgstr "Der Gerätename kann nicht im Stack verwendet werden." + +#~ msgid "Invalid Service type" +#~ msgstr "Ungültiger Diensttyp" + #~ msgid "" #~ "Please file an issue here with the contents of your CIRCUITPY drive:\n" #~ msgstr "" @@ -2705,15 +2770,6 @@ msgstr "" #~ msgid "Can not encode UUID, to check length." #~ msgstr "Kann UUID nicht kodieren, um die Länge zu überprüfen." -#~ msgid "Can not add Characteristic." -#~ msgstr "Kann das Merkmal nicht hinzufügen." - -#~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n" -#~ msgstr "CircuitPython ist abgestürzt. Ups!\n" - -#~ msgid "Cannot apply GAP parameters." -#~ msgstr "Kann GAP Parameter nicht anwenden." - #~ msgid "" #~ "enough power for the whole circuit and press reset (after ejecting " #~ "CIRCUITPY).\n" @@ -2721,14 +2777,11 @@ msgstr "" #~ "genug Strom für den ganzen Schaltkreis liefert und drücke reset (nach dem " #~ "sicheren Auswerfen von CIRCUITPY.)\n" +#~ msgid "Can not add Characteristic." +#~ msgstr "Kann das Merkmal nicht hinzufügen." + #~ msgid "Can encode UUID into the advertisement packet." #~ msgstr "Kann UUID in das advertisement packet kodieren." #~ msgid "Can not query for the device address." #~ msgstr "Kann nicht nach der Geräteadresse suchen." - -#~ msgid "Can not add Service." -#~ msgstr "Kann den Dienst nicht hinzufügen." - -#~ msgid "Can not apply device name in the stack." -#~ msgstr "Der Gerätename kann nicht im Stack verwendet werden." diff --git a/locale/en_US.po b/locale/en_US.po index ee47b08eab..b485fa0785 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-10 21:31-0500\n" +"POT-Creation-Date: 2019-01-13 23:51-0500\n" "PO-Revision-Date: 2018-07-27 11:55-0700\n" "Last-Translator: \n" "Language-Team: \n" @@ -1931,7 +1931,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 "" @@ -2010,6 +2010,54 @@ msgstr "" msgid "byte code not implemented" msgstr "" +#: shared-bindings/_pixelbuf/PixelBuf.c:101 +#, c-format +msgid "byteorder is not an instance of ByteOrder (got a %s)" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:106 +#, c-format +msgid "Can not use dotstar with %s" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:118 +msgid "rawbuf is not the same size as buf" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:123 +#, c-format +msgid "buf is too small. need %d bytes" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:129 +msgid "write_args must be a list, tuple, or None" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:394 +msgid "Only slices with step=1 (aka None) are supported" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:396 +msgid "Range out of bounds" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:405 +msgid "tuple/list required on RHS" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:421 +#, c-format +msgid "Unmatched number of items on RHS (expected %d, got %d)." +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:444 +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 "" @@ -2457,6 +2505,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 1278e92cbd..2dd8e01051 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-10 21:32-0500\n" +"POT-Creation-Date: 2019-01-13 23:51-0500\n" "PO-Revision-Date: 2018-08-24 22:56-0500\n" "Last-Translator: \n" "Language-Team: \n" @@ -1731,7 +1731,9 @@ msgstr "atributos aún no soportados" #: py/objstr.c:1079 msgid "" "can't switch from manual field specification to automatic field numbering" -msgstr "no se puede cambiar de especificación de campo manual a numeración automática de campos" +msgstr "" +"no se puede cambiar de especificación de campo manual a numeración " +"automática de campos" #: py/objstr.c:1171 msgid "invalid format specifier" @@ -1796,7 +1798,8 @@ msgstr "carácter no soportado '%c' (0x%x) en índice %d" #: py/objstr.c:1577 msgid "not all arguments converted during string formatting" -msgstr "no todos los argumentos fueron convertidos durante el formato de string" +msgstr "" +"no todos los argumentos fueron convertidos durante el formato de string" #: py/objstr.c:2102 msgid "can't convert to str implicitly" @@ -1972,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" @@ -2051,6 +2054,57 @@ msgstr "exception no activa para reraise" msgid "byte code not implemented" msgstr "codigo byte no implementado" +#: shared-bindings/_pixelbuf/PixelBuf.c:101 +#, c-format +msgid "byteorder is not an instance of ByteOrder (got a %s)" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:106 +#, c-format +msgid "Can not use dotstar with %s" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:118 +msgid "rawbuf is not the same size as buf" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:123 +#, c-format +msgid "buf is too small. need %d bytes" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:129 +msgid "write_args must be a list, tuple, or None" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:394 +#, 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:396 +#, fuzzy +msgid "Range out of bounds" +msgstr "address fuera de límites" + +#: shared-bindings/_pixelbuf/PixelBuf.c:405 +msgid "tuple/list required on RHS" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:421 +#, c-format +msgid "Unmatched number of items on RHS (expected %d, got %d)." +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:444 +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" @@ -2509,6 +2563,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" @@ -2663,7 +2722,8 @@ msgid "" " with the contents of your CIRCUITPY drive and this message:\n" msgstr "" "Parece que nuestro código de CircuitPython ha fallado con fuerza. Whoops!\n" -"Por favor, crea un issue en https://github.com/adafruit/circuitpython/issues\n" +"Por favor, crea un issue en https://github.com/adafruit/circuitpython/" +"issues\n" " con el contenido de su unidad CIRCUITPY y este mensaje:\n" #: supervisor/shared/safe_mode.c:111 @@ -2688,8 +2748,8 @@ msgid "" msgstr "" "La alimentación del microcontrolador cayó. Por favor asegurate de que tu " "fuente de alimentación provee\n" -"suficiente energia para todo el circuito y presiona el botón de reset (despues" -"de expulsar CIRCUITPY).\n" +"suficiente energia para todo el circuito y presiona el botón de reset " +"(despuesde expulsar CIRCUITPY).\n" #: supervisor/shared/safe_mode.c:120 msgid "" @@ -2705,8 +2765,11 @@ msgid "" "The reset button was pressed while booting CircuitPython. Press again to " "exit safe mode.\n" msgstr "" -"El botón reset fue presionado mientras arrancaba CircuitPython. Presiona otra" -" vez para salir del modo seguro.\n" +"El botón reset fue presionado mientras arrancaba CircuitPython. Presiona " +"otra vez para salir del modo seguro.\n" + +#~ msgid "Wrong address length" +#~ msgstr "Longitud de address erronea" #~ msgid "Invalid UUID string length" #~ msgstr "Longitud de string UUID inválida" @@ -2714,17 +2777,34 @@ msgstr "" #~ msgid "Invalid UUID parameter" #~ msgstr "Parámetro UUID inválido" -#~ msgid "Wrong address length" -#~ msgstr "Longitud de address erronea" +#~ msgid "Cannot apply GAP parameters." +#~ msgstr "No se pueden aplicar los parámetros GAP." + +#~ msgid "Cannot set PPCP parameters." +#~ msgstr "No se pueden establecer los parámetros PPCP." + +#~ msgid "Invalid Service type" +#~ msgstr "Tipo de Servicio inválido" + +#~ msgid "Can encode UUID into the advertisement packet." +#~ msgstr "Se puede codificar el UUID en el paquete de anuncio." #~ msgid "Wrong number of bytes provided" #~ msgstr "Numero erroneo de bytes dados" -#~ msgid "Cannot apply GAP parameters." -#~ msgstr "No se pueden aplicar los parámetros GAP." +#, fuzzy +#~ msgid "" +#~ "Please file an issue here with the contents of your CIRCUITPY drive:\n" +#~ msgstr "" +#~ "Por favor registra un issue en la siguiente URL con el contenidos de tu " +#~ "unidad de almacenamiento CIRCUITPY:\n" -#~ msgid "Can not apply device name in the stack." -#~ msgstr "No se puede aplicar el nombre del dispositivo en el stack." +#~ msgid "" +#~ "enough power for the whole circuit and press reset (after ejecting " +#~ "CIRCUITPY).\n" +#~ msgstr "" +#~ "suficiente poder para todo el circuito y presiona reset (después de " +#~ "expulsar CIRCUITPY).\n" #~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n" #~ msgstr "" @@ -2736,34 +2816,14 @@ msgstr "" #~ msgid "Can not encode UUID, to check length." #~ msgstr "No se puede codificar el UUID, para revisar la longitud." +#~ msgid "Can not apply device name in the stack." +#~ msgstr "No se puede aplicar el nombre del dispositivo en el stack." + #~ msgid "Can not query for the device address." #~ msgstr "No se puede consultar la dirección del dispositivo." -#, fuzzy -#~ msgid "" -#~ "Please file an issue here with the contents of your CIRCUITPY drive:\n" -#~ msgstr "" -#~ "Por favor registra un issue en la siguiente URL con el contenidos de tu " -#~ "unidad de almacenamiento CIRCUITPY:\n" - -#~ msgid "Can encode UUID into the advertisement packet." -#~ msgstr "Se puede codificar el UUID en el paquete de anuncio." - -#~ msgid "Invalid Service type" -#~ msgstr "Tipo de Servicio inválido" - #~ msgid "Can not add Service." #~ msgstr "No se puede agregar el Servicio." #~ msgid "Can not apply advertisement data. status: 0x%02x" #~ msgstr "No se puede aplicar los datos de anuncio. status: 0x%02x" - -#~ msgid "Cannot set PPCP parameters." -#~ msgstr "No se pueden establecer los parámetros PPCP." - -#~ msgid "" -#~ "enough power for the whole circuit and press reset (after ejecting " -#~ "CIRCUITPY).\n" -#~ msgstr "" -#~ "suficiente poder para todo el circuito y presiona reset (después de " -#~ "expulsar CIRCUITPY).\n" diff --git a/locale/fil.po b/locale/fil.po index 5daa673f70..efab7c8be5 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-10 21:32-0500\n" +"POT-Creation-Date: 2019-01-13 23:51-0500\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:101 +#, c-format +msgid "byteorder is not an instance of ByteOrder (got a %s)" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:106 +#, c-format +msgid "Can not use dotstar with %s" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:118 +msgid "rawbuf is not the same size as buf" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:123 +#, c-format +msgid "buf is too small. need %d bytes" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:129 +msgid "write_args must be a list, tuple, or None" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:394 +#, 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:396 +#, fuzzy +msgid "Range out of bounds" +msgstr "wala sa sakop ang address" + +#: shared-bindings/_pixelbuf/PixelBuf.c:405 +msgid "tuple/list required on RHS" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:421 +#, c-format +msgid "Unmatched number of items on RHS (expected %d, got %d)." +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:444 +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" @@ -2518,6 +2569,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" @@ -2718,23 +2774,42 @@ msgstr "" "Ang reset button ay pinindot habang nag boot ang CircuitPython. Pindutin " "ulit para lumabas sa safe mode.\n" +#~ msgid "Wrong address length" +#~ msgstr "Mali ang address length" + #~ msgid "Invalid UUID string length" #~ msgstr "Mali ang UUID string length" #~ msgid "Invalid UUID parameter" #~ msgstr "Mali ang UUID parameter" -#~ msgid "Wrong address length" -#~ msgstr "Mali ang address length" +#~ msgid "Cannot apply GAP parameters." +#~ msgstr "Hindi ma-apply ang GAP parameters." + +#~ msgid "Cannot set PPCP parameters." +#~ msgstr "Hindi ma-set ang PPCP parameters." + +#~ msgid "Invalid Service type" +#~ msgstr "Mali ang tipo ng serbisyo" + +#~ msgid "Can encode UUID into the advertisement packet." +#~ msgstr "Maaring i-encode ang UUID sa advertisement packet." #~ msgid "Wrong number of bytes provided" #~ msgstr "Mali ang bilang ng bytes" -#~ msgid "Cannot apply GAP parameters." -#~ msgstr "Hindi ma-apply ang GAP parameters." +#~ msgid "" +#~ "Please file an issue here with the contents of your CIRCUITPY drive:\n" +#~ msgstr "" +#~ "Mag-file ng isang isyu dito gamit ang mga nilalaman ng iyong CIRCUITPY " +#~ "drive:\n" -#~ msgid "Can not apply device name in the stack." -#~ msgstr "Hindi maaaring ma-aplay ang device name sa stack." +#~ msgid "" +#~ "enough power for the whole circuit and press reset (after ejecting " +#~ "CIRCUITPY).\n" +#~ msgstr "" +#~ "ay nagbibigay ng sapat na power para sa buong circuit at i-press ang " +#~ "reset (pagkatapos i-eject ang CIRCUITPY).\n" #~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n" #~ msgstr "" @@ -2747,33 +2822,14 @@ msgstr "" #~ msgid "Can not encode UUID, to check length." #~ msgstr "Hindi ma-encode UUID, para suriin ang haba." +#~ msgid "Can not apply device name in the stack." +#~ msgstr "Hindi maaaring ma-aplay ang device name sa stack." + #~ msgid "Can not query for the device address." #~ msgstr "Hindi maaaring mag-query para sa address ng device." -#~ msgid "" -#~ "Please file an issue here with the contents of your CIRCUITPY drive:\n" -#~ msgstr "" -#~ "Mag-file ng isang isyu dito gamit ang mga nilalaman ng iyong CIRCUITPY " -#~ "drive:\n" - -#~ msgid "Can encode UUID into the advertisement packet." -#~ msgstr "Maaring i-encode ang UUID sa advertisement packet." - -#~ msgid "Invalid Service type" -#~ msgstr "Mali ang tipo ng serbisyo" - #~ msgid "Can not add Service." #~ msgstr "Hindi maidaragdag ang serbisyo." #~ msgid "Can not apply advertisement data. status: 0x%02x" #~ msgstr "Hindi ma i-apply ang advertisement data. status: 0x%02x" - -#~ msgid "Cannot set PPCP parameters." -#~ msgstr "Hindi ma-set ang PPCP parameters." - -#~ msgid "" -#~ "enough power for the whole circuit and press reset (after ejecting " -#~ "CIRCUITPY).\n" -#~ msgstr "" -#~ "ay nagbibigay ng sapat na power para sa buong circuit at i-press ang " -#~ "reset (pagkatapos i-eject ang CIRCUITPY).\n" diff --git a/locale/fr.po b/locale/fr.po index b27cfeb799..18e50e0840 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-10 21:32-0500\n" +"POT-Creation-Date: 2019-01-13 23:51-0500\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:101 +#, c-format +msgid "byteorder is not an instance of ByteOrder (got a %s)" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:106 +#, c-format +msgid "Can not use dotstar with %s" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:118 +msgid "rawbuf is not the same size as buf" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:123 +#, c-format +msgid "buf is too small. need %d bytes" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:129 +msgid "write_args must be a list, tuple, or None" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:394 +#, 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:396 +#, fuzzy +msgid "Range out of bounds" +msgstr "adresse hors limites" + +#: shared-bindings/_pixelbuf/PixelBuf.c:405 +msgid "tuple/list required on RHS" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:421 +#, c-format +msgid "Unmatched number of items on RHS (expected %d, got %d)." +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:444 +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" @@ -2540,6 +2591,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" @@ -2747,27 +2803,37 @@ msgstr "" "Le bouton 'reset' a été appuyé pendant le démarrage de CircuitPython. " "Appuyer denouveau pour quitter de le mode sans-échec.\n" +#~ msgid "Wrong address length" +#~ msgstr "Mauvaise longueur d'adresse" + #~ msgid "Invalid UUID string length" #~ msgstr "Longeur de chaîne UUID invalide" #~ msgid "Invalid UUID parameter" #~ msgstr "Paramètre UUID invalide" -#~ msgid "Wrong address length" -#~ msgstr "Mauvaise longueur d'adresse" +#~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n" +#~ msgstr "" +#~ "Il semblerait que votre code CircuitPython a durement planté. Oups!\n" + +#~ msgid "Cannot apply GAP parameters." +#~ msgstr "Impossible d'appliquer les paramètres GAP" + +#~ msgid "Can not add Characteristic." +#~ msgstr "Impossible d'ajouter la Characteristic." + +#~ msgid "Can not add Service." +#~ msgstr "Impossible d'ajouter le Service" #, fuzzy #~ msgid "Wrong number of bytes provided" #~ msgstr "mauvais nombre d'octets fourni'" -#~ 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 encode UUID, to check length." +#~ msgstr "Impossible d'encoder l'UUID pour vérifier la longueur." -#~ msgid "" -#~ "Please file an issue here with the contents of your CIRCUITPY drive:\n" -#~ msgstr "" -#~ "SVP, remontez le problème là avec le contenu du lecteur CIRCUITPY:\n" +#~ msgid "Invalid Service type" +#~ msgstr "Type de service invalide" #, fuzzy #~ msgid "value_size must be power of two" @@ -2783,27 +2849,17 @@ msgstr "" #~ "assez de puissance pour l'ensemble du circuit et appuyez sur " #~ "'reset' (après avoir éjecter CIRCUITPY).\n" +#~ msgid "" +#~ "Please file an issue here with the contents of your CIRCUITPY drive:\n" +#~ msgstr "" +#~ "SVP, remontez le problème là avec le contenu du lecteur CIRCUITPY:\n" + #, fuzzy #~ msgid "palette must be displayio.Palette" #~ msgstr "la palette doit être une displayio.Palette" -#~ msgid "Can not encode UUID, to check length." -#~ msgstr "Impossible d'encoder l'UUID pour vérifier la longueur." - -#~ msgid "Can not add Service." -#~ msgstr "Impossible d'ajouter le Service" - -#~ 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" #~ msgid "Can not query for the device address." #~ msgstr "Impossible d'obtenir l'adresse du périphérique" - -#~ msgid "Cannot apply GAP parameters." -#~ msgstr "Impossible d'appliquer les paramètres GAP" - -#~ msgid "Invalid Service type" -#~ msgstr "Type de service invalide" diff --git a/locale/it_IT.po b/locale/it_IT.po index 9b54d5dc9a..10fd1a2c60 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-10 21:32-0500\n" +"POT-Creation-Date: 2019-01-13 23:51-0500\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:101 +#, c-format +msgid "byteorder is not an instance of ByteOrder (got a %s)" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:106 +#, c-format +msgid "Can not use dotstar with %s" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:118 +msgid "rawbuf is not the same size as buf" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:123 +#, c-format +msgid "buf is too small. need %d bytes" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:129 +msgid "write_args must be a list, tuple, or None" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:394 +#, 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:396 +#, fuzzy +msgid "Range out of bounds" +msgstr "indirizzo fuori limite" + +#: shared-bindings/_pixelbuf/PixelBuf.c:405 +msgid "tuple/list required on RHS" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:421 +#, c-format +msgid "Unmatched number of items on RHS (expected %d, got %d)." +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:444 +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" @@ -2524,6 +2575,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" @@ -2716,28 +2772,44 @@ msgid "" "exit safe mode.\n" msgstr "" +#~ msgid "Invalid UUID parameter" +#~ msgstr "Parametro UUID non valido" + #~ 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" #, fuzzy #~ msgid "Wrong number of bytes provided" #~ msgstr "numero di argomenti errato" -#~ msgid "Invalid Service type" -#~ msgstr "Tipo di servizio non valido" - #~ 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" + #~ msgid "" #~ "Please file an issue here with the contents of your CIRCUITPY drive:\n" #~ msgstr "" #~ "Ti preghiamo di compilare una issue con il contenuto del tuo drie " #~ "CIRCUITPY:\n" +#~ msgid "Can not query for the device address." +#~ msgstr "Non è possibile trovare l'indirizzo del dispositivo." + +#~ msgid "Can encode UUID into the advertisement packet." +#~ msgstr "È possibile codificare l'UUID nel pacchetto di advertisement." + #~ msgid "Can not encode UUID, to check length." #~ msgstr "Non è possibile codificare l'UUID, lunghezza da controllare." @@ -2749,27 +2821,11 @@ msgstr "" #~ "Sembra che il codice del core di CircuitPython sia crashato malamente. " #~ "Whoops!\n" -#~ msgid "Cannot set PPCP parameters." -#~ msgstr "Impossibile impostare i parametri PPCP." - #~ msgid "Cannot apply GAP parameters." #~ msgstr "Impossibile applicare i parametri GAP." -#~ 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 "Can encode UUID into the advertisement packet." -#~ msgstr "È possibile codificare l'UUID nel pacchetto di advertisement." - -#~ msgid "Can not query for the device address." -#~ msgstr "Non è possibile trovare l'indirizzo del dispositivo." - -#~ msgid "Can not add Service." -#~ msgstr "Non è possibile aggiungere Service." +#~ msgid "Cannot set PPCP parameters." +#~ msgstr "Impossibile impostare i parametri PPCP." #~ msgid "Can not apply device name in the stack." #~ msgstr "Non è possibile inserire il nome del dipositivo nella lista." diff --git a/locale/pt_BR.po b/locale/pt_BR.po index 85fe90909c..5239e3e51c 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-10 21:32-0500\n" +"POT-Creation-Date: 2019-01-13 23:51-0500\n" "PO-Revision-Date: 2018-10-02 21:14-0000\n" "Last-Translator: \n" "Language-Team: \n" @@ -1949,7 +1949,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 "" @@ -2028,6 +2028,55 @@ msgstr "" msgid "byte code not implemented" msgstr "" +#: shared-bindings/_pixelbuf/PixelBuf.c:101 +#, c-format +msgid "byteorder is not an instance of ByteOrder (got a %s)" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:106 +#, c-format +msgid "Can not use dotstar with %s" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:118 +msgid "rawbuf is not the same size as buf" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:123 +#, c-format +msgid "buf is too small. need %d bytes" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:129 +msgid "write_args must be a list, tuple, or None" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:394 +msgid "Only slices with step=1 (aka None) are supported" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:396 +msgid "Range out of bounds" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:405 +msgid "tuple/list required on RHS" +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:421 +#, c-format +msgid "Unmatched number of items on RHS (expected %d, got %d)." +msgstr "" + +#: shared-bindings/_pixelbuf/PixelBuf.c:444 +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 "" @@ -2484,6 +2533,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" @@ -2670,32 +2724,32 @@ msgid "" "exit safe mode.\n" msgstr "" -#~ msgid "Can not add Characteristic." -#~ msgstr "Não é possível adicionar Característica." - -#~ msgid "Can not query for the device address." -#~ msgstr "Não é possível consultar o endereço do dispositivo." - -#~ msgid "Cannot set PPCP parameters." -#~ msgstr "Não é possível definir parâmetros PPCP." - -#~ msgid "Can encode UUID into the advertisement packet." -#~ msgstr "Pode codificar o UUID no pacote de anúncios." - -#~ 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." - -#~ msgid "Baud rate too high for this SPI peripheral" -#~ msgstr "Taxa de transmissão muito alta para esse periférico SPI" - -#~ msgid "Can not apply device name in the stack." -#~ msgstr "Não é possível aplicar o nome do dispositivo na pilha." +#~ msgid "Invalid UUID parameter" +#~ msgstr "Parâmetro UUID inválido" #~ msgid "Can not apply advertisement data. status: 0x%02x" #~ msgstr "Não é possível aplicar dados de anúncio. status: 0x%02x" -#~ msgid "Invalid UUID parameter" -#~ msgstr "Parâmetro UUID inválido" +#~ msgid "Can not add Characteristic." +#~ msgstr "Não é possível adicionar Característica." + +#~ msgid "Can not apply device name in the stack." +#~ msgstr "Não é possível aplicar o nome do dispositivo na pilha." + +#~ msgid "Invalid Service type" +#~ msgstr "Tipo de serviço inválido" + +#~ msgid "Can encode UUID into the advertisement packet." +#~ msgstr "Pode codificar o UUID no pacote de anúncios." + +#~ msgid "Cannot set PPCP parameters." +#~ msgstr "Não é possível definir parâmetros PPCP." + +#~ msgid "Baud rate too high for this SPI peripheral" +#~ msgstr "Taxa de transmissão muito alta para esse periférico SPI" + +#~ msgid "Can not query for the device address." +#~ msgstr "Não é possível consultar o endereço do dispositivo." + +#~ msgid "Cannot apply GAP parameters." +#~ msgstr "Não é possível aplicar parâmetros GAP." From b82e1d7fcbbb4b637ad960ecb3c4f75d2388123d Mon Sep 17 00:00:00 2001 From: Roy Hooper Date: Sat, 19 Jan 2019 16:54:11 -0500 Subject: [PATCH 3/7] Fix build to work with constructor calling convention. --- shared-bindings/_pixelbuf/PixelBuf.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/shared-bindings/_pixelbuf/PixelBuf.c b/shared-bindings/_pixelbuf/PixelBuf.c index 545166724f..37933fdfff 100644 --- a/shared-bindings/_pixelbuf/PixelBuf.c +++ b/shared-bindings/_pixelbuf/PixelBuf.c @@ -76,10 +76,8 @@ extern const int32_t colorwheel(float pos); //| :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, size_t n_kw, const mp_obj_t *pos_args) { - mp_arg_check_num(n_args, n_kw, 2, MP_OBJ_FUN_ARGS_MAX, true); - mp_map_t kw_args; - mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); +STATIC mp_obj_t 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[] = { @@ -95,7 +93,7 @@ STATIC mp_obj_t pixelbuf_pixelbuf_make_new(const mp_obj_type_t *type, size_t n_a { 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); + 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)); From 79d9c9cd56f718f89e99b449215756e28faf794d Mon Sep 17 00:00:00 2001 From: Roy Hooper Date: Sat, 19 Jan 2019 17:01:31 -0500 Subject: [PATCH 4/7] remove fill_wheel --- shared-bindings/_pixelbuf/PixelBuf.c | 27 --------------------------- 1 file changed, 27 deletions(-) diff --git a/shared-bindings/_pixelbuf/PixelBuf.c b/shared-bindings/_pixelbuf/PixelBuf.c index 37933fdfff..7c2766aa3f 100644 --- a/shared-bindings/_pixelbuf/PixelBuf.c +++ b/shared-bindings/_pixelbuf/PixelBuf.c @@ -454,32 +454,6 @@ STATIC mp_obj_t pixelbuf_pixelbuf_subscr(mp_obj_t self_in, mp_obj_t index_in, mp } } -//| .. method:: fill_wheel(start=0, step=1) -//| -//| fill the buffer with a colorwheel starting at offset n, and stepping by step -//| - -STATIC mp_obj_t pixelbuf_pixelbuf_fill_wheel(mp_obj_t self_in, mp_obj_t start, mp_obj_t step) { - mp_check_self(MP_OBJ_IS_TYPE(self_in, &pixelbuf_pixelbuf_type)); - pixelbuf_pixelbuf_obj_t *self = MP_OBJ_TO_PTR(self_in); - float i = MP_OBJ_IS_SMALL_INT(start) ? MP_OBJ_SMALL_INT_VALUE(start) : mp_obj_float_get(start); - float incr = MP_OBJ_IS_SMALL_INT(step) ? MP_OBJ_SMALL_INT_VALUE(step) : mp_obj_float_get(step); - - bool auto_write = self->auto_write; - self->auto_write = false; - for (size_t n = 0; n < self->pixels; n++) { - mp_obj_t value = MP_OBJ_NEW_SMALL_INT(colorwheel(i)); - pixelbuf_pixelbuf_subscr(self_in, MP_OBJ_NEW_SMALL_INT(n), value); - i += incr; - } - self->auto_write = auto_write; - if (auto_write) - call_write_function(self); - - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_3(pixelbuf_pixelbuf_fill_wheel_obj, pixelbuf_pixelbuf_fill_wheel); - 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)}, @@ -487,7 +461,6 @@ STATIC const mp_rom_map_elem_t pixelbuf_pixelbuf_locals_dict_table[] = { { 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)}, - { MP_ROM_QSTR(MP_QSTR_fill_wheel), MP_ROM_PTR(&pixelbuf_pixelbuf_fill_wheel_obj)}, }; STATIC MP_DEFINE_CONST_DICT(pixelbuf_pixelbuf_locals_dict, pixelbuf_pixelbuf_locals_dict_table); From 8fa81fe00317ec6cda286476b8cea5f0e3dba43a Mon Sep 17 00:00:00 2001 From: Roy Hooper Date: Sat, 19 Jan 2019 17:03:16 -0500 Subject: [PATCH 5/7] move headers to __init__.h --- shared-bindings/_pixelbuf/PixelBuf.h | 4 ---- shared-bindings/_pixelbuf/__init__.h | 4 +++- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/shared-bindings/_pixelbuf/PixelBuf.h b/shared-bindings/_pixelbuf/PixelBuf.h index b35e3ff908..0b1e362783 100644 --- a/shared-bindings/_pixelbuf/PixelBuf.h +++ b/shared-bindings/_pixelbuf/PixelBuf.h @@ -53,8 +53,4 @@ typedef struct { void pixelbuf_recalculate_brightness(pixelbuf_pixelbuf_obj_t *self); void call_write_function(pixelbuf_pixelbuf_obj_t *self); - -#include "common-hal/digitalio/DigitalInOut.h" -extern void common_hal_neopixel_write(const digitalio_digitalinout_obj_t* gpio, uint8_t *pixels, uint32_t numBytes); - #endif // CP_SHARED_BINDINGS_PIXELBUF_PIXELBUF_H diff --git a/shared-bindings/_pixelbuf/__init__.h b/shared-bindings/_pixelbuf/__init__.h index 5049ea38d2..a62d67c4a4 100644 --- a/shared-bindings/_pixelbuf/__init__.h +++ b/shared-bindings/_pixelbuf/__init__.h @@ -27,9 +27,11 @@ #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 From 02266eafd87c410593c4f94c820490023e78eb55 Mon Sep 17 00:00:00 2001 From: Roy Hooper Date: Sat, 19 Jan 2019 17:04:24 -0500 Subject: [PATCH 6/7] adjust comment --- shared-bindings/_pixelbuf/__init__.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared-bindings/_pixelbuf/__init__.c b/shared-bindings/_pixelbuf/__init__.c index 58fccfd91c..31defc7fbc 100644 --- a/shared-bindings/_pixelbuf/__init__.c +++ b/shared-bindings/_pixelbuf/__init__.c @@ -43,7 +43,7 @@ //| :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 -//| Dotstar and Neopixel manipulation. +//| RGB(W) strip/matrix manipulation, such as DotStar and Neopixel. //| //| Libraries From f43379c771fd9e8d95f7c43951b5869ad37224bf Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Tue, 22 Jan 2019 14:38:34 -0800 Subject: [PATCH 7/7] No pixelbuf on Hallowing --- ports/atmel-samd/boards/hallowing_m0_express/mpconfigboard.mk | 3 +++ 1 file changed, 3 insertions(+) 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