summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoy Hooper <rhooper@toybox.ca>2019-10-06 22:44:00 -0400
committerRoy Hooper <rhooper@toybox.ca>2019-10-06 22:44:00 -0400
commitdc8c27d1292673f1610f6440fa0de810018995fe (patch)
tree59ae6429f387433ae18affad1abc2ee42a1525e6
parent55c688cbebc9f4eac3787591f5349c2f4c25e9e4 (diff)
make dotstar byteorder constants start with P. fix small bugs.
-rw-r--r--shared-bindings/_pixelbuf/PixelBuf.c46
-rw-r--r--shared-bindings/_pixelbuf/PixelBuf.h2
-rw-r--r--shared-bindings/_pixelbuf/__init__.c12
-rw-r--r--shared-bindings/_pixelbuf/types.h2
4 files changed, 24 insertions, 38 deletions
diff --git a/shared-bindings/_pixelbuf/PixelBuf.c b/shared-bindings/_pixelbuf/PixelBuf.c
index cb6fe5567..3a2c88ef6 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 2a132dda2..aa09e9261 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 02d5f49b3..e5cb65267 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 39e49935f..f7dc1a109 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