From dc8c27d1292673f1610f6440fa0de810018995fe Mon Sep 17 00:00:00 2001 From: Roy Hooper Date: Sun, 6 Oct 2019 22:44:00 -0400 Subject: [PATCH] make dotstar byteorder constants start with P. fix small bugs. --- shared-bindings/_pixelbuf/PixelBuf.c | 46 ++++++++++------------------ shared-bindings/_pixelbuf/PixelBuf.h | 2 -- shared-bindings/_pixelbuf/__init__.c | 12 ++++---- shared-bindings/_pixelbuf/types.h | 2 +- 4 files changed, 24 insertions(+), 38 deletions(-) diff --git a/shared-bindings/_pixelbuf/PixelBuf.c b/shared-bindings/_pixelbuf/PixelBuf.c index cb6fe55673..3a2c88ef61 100644 --- a/shared-bindings/_pixelbuf/PixelBuf.c +++ b/shared-bindings/_pixelbuf/PixelBuf.c @@ -59,12 +59,14 @@ extern const int32_t colorwheel(float pos); //| //| When only given ``buf``, ``brightness`` applies to the next pixel assignment. //| -//| When ``D`` (dotstar mode) is present in the byteorder configuration, the -//| 4th value in a tuple/list is the individual pixel brightness (0-1). +//| When ``P`` (pwm duration) is present as the 4th character of the byteorder +//| string, the 4th value in the tuple/list for a pixel is the individual pixel +//| brightness (0.0-1.0) and will enable a Dotstar compatible 1st byte in the +//| output buffer (``buf``). //| //| :param ~int size: Number of pixelsx //| :param ~bytearray buf: Bytearray in which to store pixel data -//| :param ~str byteorder: Byte order string (such as "BGR" or "BGRD") +//| :param ~str byteorder: Byte order string (such as "BGR" or "DBGR") //| :param ~float brightness: Brightness (0 to 1.0, default 1.0) //| :param ~bytearray rawbuf: Bytearray in which to store raw pixel data (before brightness adjustment) //| :param ~int offset: Offset from start of buffer (default 0) @@ -77,7 +79,7 @@ STATIC mp_obj_t pixelbuf_pixelbuf_make_new(const mp_obj_type_t *type, size_t n_a 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_byteorder, MP_ARG_OBJ, { .u_obj = MP_OBJ_NEW_QSTR(MP_QSTR_BGR) } }, { 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 } }, @@ -92,17 +94,13 @@ STATIC mp_obj_t pixelbuf_pixelbuf_make_new(const mp_obj_type_t *type, size_t n_a if (!MP_OBJ_IS_STR(args[ARG_byteorder].u_obj)) mp_raise_TypeError(translate("byteorder is not a string")); - if (args[ARG_byteorder].u_obj == NULL) - byteorder = "BGR"; - else - byteorder = mp_obj_str_get_data(args[ARG_byteorder].u_obj, &bo_len); - + byteorder = mp_obj_str_get_data(args[ARG_byteorder].u_obj, &bo_len); if (bo_len < 3 || bo_len > 4) mp_raise_ValueError(translate("Invalid byteorder string")); - strncpy(byteorder_details.order, byteorder, sizeof(byteorder_details.order)); + byteorder_details.order = args[ARG_byteorder].u_obj; byteorder_details.bpp = bo_len; - char *dotstar = strchr(byteorder, 'D'); + char *dotstar = strchr(byteorder, 'P'); char *r = strchr(byteorder, 'R'); char *g = strchr(byteorder, 'G'); char *b = strchr(byteorder, 'B'); @@ -117,18 +115,8 @@ STATIC mp_obj_t pixelbuf_pixelbuf_make_new(const mp_obj_type_t *type, size_t n_a byteorder_details.byteorder.b = b - byteorder; byteorder_details.byteorder.w = w ? w - byteorder : 0; // The dotstar brightness byte is always first (as it goes with the pixel start bits) - // if 'D' is found at the end, adjust byte position - // if 'D' is elsewhere, error out - if (dotstar) { - size_t dotstar_pos = dotstar - byteorder; - if (dotstar_pos == 3) { - byteorder_details.byteorder.b += 1; - byteorder_details.byteorder.g += 1; - byteorder_details.byteorder.r += 1; - byteorder_details.byteorder.w = 0; - } else if (dotstar_pos != 0) { - mp_raise_ValueError(translate("Invalid byteorder string")); - } + if (dotstar && byteorder[0] != 'P') { + mp_raise_ValueError(translate("Invalid byteorder string")); } if (byteorder_details.has_white && byteorder_details.is_dotstar) mp_raise_ValueError(translate("Invalid byteorder string")); @@ -178,7 +166,7 @@ STATIC mp_obj_t pixelbuf_pixelbuf_make_new(const mp_obj_type_t *type, size_t n_a if (self->byteorder.is_dotstar) { // Initialize the buffer with the dotstar start bytes. - // Header and end must be setup by caller + // Note: 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) { @@ -268,9 +256,7 @@ void pixelbuf_recalculate_brightness(pixelbuf_pixelbuf_obj_t *self) { mp_obj_t call_show(mp_obj_t self_in) { mp_obj_t dest[2]; mp_load_method(self_in, MP_QSTR_show, dest); - if (dest[0] == MP_OBJ_NULL) - return mp_const_none; - return mp_call_method_self_n_kw(dest[0], self_in, 0, 0, mp_const_none); + return mp_call_method_n_kw(0, 0, dest); } //| .. attribute:: auto_write @@ -324,7 +310,7 @@ const mp_obj_property_t pixelbuf_pixelbuf_buf_obj = { //| STATIC mp_obj_t pixelbuf_pixelbuf_obj_get_byteorder(mp_obj_t self_in) { pixelbuf_pixelbuf_obj_t *self = native_pixelbuf(self_in); - return mp_obj_new_str(self->byteorder.order, strlen(self->byteorder.order)); + return self->byteorder.order; } MP_DEFINE_CONST_FUN_OBJ_1(pixelbuf_pixelbuf_get_byteorder_str, pixelbuf_pixelbuf_obj_get_byteorder); @@ -376,13 +362,15 @@ STATIC mp_obj_t pixelbuf_pixelbuf_subscr(mp_obj_t self_in, mp_obj_t index_in, mp mp_bound_slice_t slice; if (!mp_seq_get_fast_slice_indexes(self->bytes, index_in, &slice)) + // TODO support stepping!!! 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->byteorder.is_dotstar); + uint8_t *readbuf = self->two_buffers ? self->rawbuf : self->buf; + return pixelbuf_get_pixel_array(readbuf + slice.start, len, &self->byteorder, self->pixel_step, self->byteorder.is_dotstar); } else { // Set #if MICROPY_PY_ARRAY_SLICE_ASSIGN diff --git a/shared-bindings/_pixelbuf/PixelBuf.h b/shared-bindings/_pixelbuf/PixelBuf.h index 2a132dda23..aa09e92613 100644 --- a/shared-bindings/_pixelbuf/PixelBuf.h +++ b/shared-bindings/_pixelbuf/PixelBuf.h @@ -44,8 +44,6 @@ typedef struct { size_t offset; 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; diff --git a/shared-bindings/_pixelbuf/__init__.c b/shared-bindings/_pixelbuf/__init__.c index 02d5f49b35..e5cb652672 100644 --- a/shared-bindings/_pixelbuf/__init__.c +++ b/shared-bindings/_pixelbuf/__init__.c @@ -97,12 +97,12 @@ STATIC const mp_rom_map_elem_t pixelbuf_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_GBRW), MP_ROM_QSTR(MP_QSTR_GBRW) }, { MP_ROM_QSTR(MP_QSTR_BRGW), MP_ROM_QSTR(MP_QSTR_BRGW) }, { MP_ROM_QSTR(MP_QSTR_BGRW), MP_ROM_QSTR(MP_QSTR_BGRW) }, - { MP_ROM_QSTR(MP_QSTR_RGBD), MP_ROM_QSTR(MP_QSTR_RGBD) }, - { MP_ROM_QSTR(MP_QSTR_RBGD), MP_ROM_QSTR(MP_QSTR_RBGD) }, - { MP_ROM_QSTR(MP_QSTR_GRBD), MP_ROM_QSTR(MP_QSTR_GRBD) }, - { MP_ROM_QSTR(MP_QSTR_GBRD), MP_ROM_QSTR(MP_QSTR_GBRD) }, - { MP_ROM_QSTR(MP_QSTR_BRGD), MP_ROM_QSTR(MP_QSTR_BRGD) }, - { MP_ROM_QSTR(MP_QSTR_BGRD), MP_ROM_QSTR(MP_QSTR_BGRD) }, + { MP_ROM_QSTR(MP_QSTR_PRGB), MP_ROM_QSTR(MP_QSTR_PRGB) }, + { MP_ROM_QSTR(MP_QSTR_PRBG), MP_ROM_QSTR(MP_QSTR_PRBG) }, + { MP_ROM_QSTR(MP_QSTR_PGRB), MP_ROM_QSTR(MP_QSTR_PGRB) }, + { MP_ROM_QSTR(MP_QSTR_PGBR), MP_ROM_QSTR(MP_QSTR_PGBR) }, + { MP_ROM_QSTR(MP_QSTR_PBRG), MP_ROM_QSTR(MP_QSTR_PBRG) }, + { MP_ROM_QSTR(MP_QSTR_PBGR), MP_ROM_QSTR(MP_QSTR_PBGR) }, { MP_ROM_QSTR(MP_QSTR_wheel), MP_ROM_PTR(&pixelbuf_wheel_obj) }, }; diff --git a/shared-bindings/_pixelbuf/types.h b/shared-bindings/_pixelbuf/types.h index 39e49935fa..f7dc1a1092 100644 --- a/shared-bindings/_pixelbuf/types.h +++ b/shared-bindings/_pixelbuf/types.h @@ -41,7 +41,7 @@ typedef struct { pixelbuf_rgbw_t byteorder; bool has_white; bool is_dotstar; - char order[5]; + mp_obj_t *order; } pixelbuf_byteorder_details_t; #endif // CIRCUITPYTHON_PIXELBUF_TYPES_H