From cbaee74395f32aa67c2620cdbb11533e90af97c2 Mon Sep 17 00:00:00 2001 From: scanner-darkly Date: Mon, 21 Jun 2021 10:13:33 -0700 Subject: [PATCH] various fixes (#270) --- CHANGELOG.md | 5 ++ docs/whats_new.md | 5 ++ module/flash.c | 1 + module/grid.c | 148 ++++++++++++++++++++++++++++----------------- module/main.c | 1 + simulator/tt.c | 3 +- src/match_token.rl | 1 + src/ops/maths.c | 12 ++-- src/ops/op.c | 2 +- src/ops/op_enum.h | 1 + src/ops/telex.c | 1 + src/ops/telex.h | 1 + tests/main.c | 2 +- 13 files changed, 120 insertions(+), 63 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 110dca85..06d90a9a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,11 @@ - **NEW**: live mode dashboard - **NEW**: ops to control live mode: `LIVE.OFF`, `LIVE.VARS`, `LIVE.GRID`, `LIVE.DASH`, `PRINT` - **FIX**: `PN.ROT` parameters are swapped +- **FIX**: better rendering for fine grid faders +- **FIX**: logical operators should treat all non zero values as `true`, not just positive values +- **NEW**: crow ops +- **NEW**: `TI.PRM.CALIB` alias added (was already in the docs) +- **FIX**: `SCENE` would crash if parameter was out of bounds ## v3.2.0 diff --git a/docs/whats_new.md b/docs/whats_new.md index b6a7fc68..7727f707 100644 --- a/docs/whats_new.md +++ b/docs/whats_new.md @@ -36,6 +36,11 @@ - **NEW**: live mode dashboard - **NEW**: ops to control live mode: `LIVE.OFF`, `LIVE.VARS`, `LIVE.GRID`, `LIVE.DASH`, `PRINT` - **FIX**: `PN.ROT` parameters are swapped +- **FIX**: better rendering for fine grid faders +- **FIX**: logical operators should treat all non zero values as `true`, not just positive values +- **NEW**: crow ops +- **NEW**: `TI.PRM.CALIB` alias added (was already in the docs) +- **FIX**: `SCENE` would crash if parameter was out of bounds ## v3.2.0 diff --git a/module/flash.c b/module/flash.c index 1fd99158..a322d08d 100644 --- a/module/flash.c +++ b/module/flash.c @@ -119,6 +119,7 @@ void flash_read(uint8_t preset_no, scene_state_t *scene, char (*text)[SCENE_TEXT_LINES][SCENE_TEXT_CHARS], uint8_t init_pattern, uint8_t init_grid, uint8_t init_i2c_op_address) { + if (preset_no >= SCENE_SLOTS) return; memcpy(ss_scripts_ptr(scene), &f.scenes[preset_no].scripts, // Exclude size of TEMP script as above ss_scripts_size() - sizeof(scene_script_t)); diff --git a/module/grid.c b/module/grid.c index daf81838..e8601cf1 100644 --- a/module/grid.c +++ b/module/grid.c @@ -205,6 +205,7 @@ static void grid_screen_refresh_info(scene_state_t *ss, u8 page, u8 x1, u8 y1, static bool grid_within_area(u8 x, u8 y, grid_common_t *gc); static void grid_fill_area(u8 x, u8 y, u8 w, u8 h, s8 level); static void grid_fill_area_scr(u8 x, u8 y, u8 w, u8 h, s8 level, u8 page); +static u16 calc_fader_level(scene_state_t *ss, u8 i, u8 vert); void grid_set_control_mode(u8 control, u8 mode, scene_state_t *ss) { if (mode == M_LIVE) { @@ -1381,6 +1382,12 @@ bool grid_within_area(u8 x, u8 y, grid_common_t *gc) { y < (gc->y + gc->h); } +u16 calc_fader_level(scene_state_t *ss, u8 i, u8 vert) { + u32 fl = ((GF.value * ((vert ? GFC.h : GFC.w) - 2)) << 5) / GFC.level; + fl = (fl >> 1) + (fl & 1); + return fl; +} + void grid_refresh(scene_state_t *ss) { size_x = monome_size_x(); size_y = monome_size_y(); @@ -1413,69 +1420,85 @@ void grid_refresh(scene_state_t *ss) { grid_fill_area(GFC.x + GF.value + 1, GFC.y, GFC.w - GF.value - 1, GFC.h, GFC.level); break; + case FADER_CH_DOT: + grid_fill_area(GFC.x, GFC.y, GFC.w, GFC.h, GFC.level); + grid_fill_area(GFC.x + GF.value, GFC.y, 1, GFC.h, + GRID_ON_BRIGHTNESS); + break; case FADER_CV_BAR: grid_fill_area(GFC.x, GFC.y, GFC.w, GFC.h - GF.value - 1, GFC.level); grid_fill_area(GFC.x, GFC.y + GFC.h - GF.value - 1, GFC.w, GF.value + 1, GRID_ON_BRIGHTNESS); break; - case FADER_CH_DOT: - grid_fill_area(GFC.x, GFC.y, GFC.w, GFC.h, GFC.level); - grid_fill_area(GFC.x + GF.value, GFC.y, 1, GFC.h, - GRID_ON_BRIGHTNESS); - break; case FADER_CV_DOT: grid_fill_area(GFC.x, GFC.y, GFC.w, GFC.h, GFC.level); grid_fill_area(GFC.x, GFC.y + GFC.h - GF.value - 1, GFC.w, 1, GRID_ON_BRIGHTNESS); break; case FADER_FH_BAR: - fv = (((GFC.w - 2) << 4) * GF.value) / GFC.level; + fv = calc_fader_level(ss, i, 0); ff = fv >> 4; fp = fv & 15; - grid_fill_area(GFC.x, GFC.y, ff + 1, GFC.h, - GRID_ON_BRIGHTNESS); + grid_fill_area(GFC.x + 1, GFC.y, ff, GFC.h, 15); if (fp) grid_fill_area(GFC.x + ff + 1, GFC.y, 1, GFC.h, fp); + + grid_fill_area(GFC.x, GFC.y, 1, GFC.h, GRID_ON_BRIGHTNESS); grid_fill_area(GFC.x + GFC.w - 1, GFC.y, 1, GFC.h, GRID_ON_BRIGHTNESS); break; - case FADER_FV_BAR: - fv = (((GFC.h - 2) << 4) * GF.value) / GFC.level; + case FADER_FH_DOT: + fv = calc_fader_level(ss, i, 0); ff = fv >> 4; fp = fv & 15; - grid_fill_area(GFC.x, GFC.y + GFC.h - ff - 1, GFC.w, ff + 1, - GRID_ON_BRIGHTNESS); - if (fp) - grid_fill_area(GFC.x, GFC.y + GFC.h - ff - 2, GFC.w, 1, - fp); - grid_fill_area(GFC.x, GFC.y, GFC.w, 1, GRID_ON_BRIGHTNESS); - break; - case FADER_FH_DOT: + if (fp) { + if (GFC.w - 1 >= GFC.level) + fp = GRID_ON_BRIGHTNESS; + else if (fp < 3) + fp = 3; + grid_fill_area(GFC.x + ff + 1, GFC.y, 1, GFC.h, + fp < 3 ? 3 : fp); + } + else if (ff) + grid_fill_area(GFC.x + ff, GFC.y, 1, GFC.h, 15); + grid_fill_area(GFC.x, GFC.y, 1, GFC.h, GRID_ON_BRIGHTNESS); grid_fill_area(GFC.x + GFC.w - 1, GFC.y, 1, GFC.h, GRID_ON_BRIGHTNESS); - fv = (((GFC.w - 2) << 4) * GF.value) / GFC.level; + break; + case FADER_FV_BAR: + fv = calc_fader_level(ss, i, 1); ff = fv >> 4; fp = fv & 15; + grid_fill_area(GFC.x, GFC.y + GFC.h - 1 - ff, GFC.w, ff, + 15); if (fp) - grid_fill_area(GFC.x + ff + 1, GFC.y, 1, GFC.h, fp); - else if (ff) - grid_fill_area(GFC.x + ff, GFC.y, 1, GFC.h, - GRID_ON_BRIGHTNESS); - break; - case FADER_FV_DOT: + grid_fill_area(GFC.x, GFC.y + GFC.h - 2 - ff, GFC.w, 1, + fp); + grid_fill_area(GFC.x, GFC.y + GFC.h - 1, GFC.w, 1, GRID_ON_BRIGHTNESS); grid_fill_area(GFC.x, GFC.y, GFC.w, 1, GRID_ON_BRIGHTNESS); - fv = (((GFC.h - 2) << 4) * GF.value) / GFC.level; + break; + case FADER_FV_DOT: + fv = calc_fader_level(ss, i, 1); ff = fv >> 4; fp = fv & 15; - if (fp) + if (fp) { + if (GFC.h - 1 >= GFC.level) + fp = GRID_ON_BRIGHTNESS; + else if (fp < 3) + fp = 3; grid_fill_area(GFC.x, GFC.y + GFC.h - ff - 2, GFC.w, 1, fp); + } else if (ff) grid_fill_area(GFC.x, GFC.y + GFC.h - ff - 1, GFC.w, 1, - GRID_ON_BRIGHTNESS); + 15); + + grid_fill_area(GFC.x, GFC.y + GFC.h - 1, GFC.w, 1, + GRID_ON_BRIGHTNESS); + grid_fill_area(GFC.x, GFC.y, GFC.w, 1, GRID_ON_BRIGHTNESS); break; } } @@ -1692,7 +1715,7 @@ void grid_screen_refresh_led(scene_state_t *ss, u8 full_grid, u8 page, u8 x1, } } - u16 fv, ff, fp; + u32 fv, ff, fp; for (u8 i = 0; i < GRID_FADER_COUNT; i++) { if (GFC.enabled && SG.group[GFC.group].enabled) { switch (GF.type) { @@ -1723,58 +1746,75 @@ void grid_screen_refresh_led(scene_state_t *ss, u8 full_grid, u8 page, u8 x1, GFC.w, 1, GRID_ON_BRIGHTNESS, page); break; case FADER_FH_BAR: - fv = (((GFC.w - 2) << 4) * GF.value) / GFC.level; + fv = calc_fader_level(ss, i, 0); ff = fv >> 4; fp = fv & 15; - grid_fill_area_scr(GFC.x, GFC.y, ff + 1, GFC.h, - GRID_ON_BRIGHTNESS, page); + grid_fill_area_scr(GFC.x + 1, GFC.y, ff, GFC.h, 15, page); if (fp) grid_fill_area_scr(GFC.x + ff + 1, GFC.y, 1, GFC.h, fp, page); + + grid_fill_area_scr(GFC.x, GFC.y, 1, GFC.h, + GRID_ON_BRIGHTNESS, page); grid_fill_area_scr(GFC.x + GFC.w - 1, GFC.y, 1, GFC.h, GRID_ON_BRIGHTNESS, page); break; - case FADER_FV_BAR: - fv = (((GFC.h - 2) << 4) * GF.value) / GFC.level; + case FADER_FH_DOT: + fv = calc_fader_level(ss, i, 0); ff = fv >> 4; fp = fv & 15; - grid_fill_area_scr(GFC.x, GFC.y + GFC.h - ff - 1, GFC.w, - ff + 1, GRID_ON_BRIGHTNESS, page); - if (fp) - grid_fill_area_scr(GFC.x, GFC.y + GFC.h - ff - 2, GFC.w, - 1, fp, page); - grid_fill_area_scr(GFC.x, GFC.y, GFC.w, 1, - GRID_ON_BRIGHTNESS, page); - break; - case FADER_FH_DOT: + if (fp) { + if (GFC.w - 1 >= GFC.level) + fp = GRID_ON_BRIGHTNESS; + else if (fp < 3) + fp = 3; + grid_fill_area_scr(GFC.x + ff + 1, GFC.y, 1, GFC.h, + fp < 3 ? 3 : fp, page); + } + else if (ff) + grid_fill_area_scr(GFC.x + ff, GFC.y, 1, GFC.h, 15, + page); + grid_fill_area_scr(GFC.x, GFC.y, 1, GFC.h, GRID_ON_BRIGHTNESS, page); grid_fill_area_scr(GFC.x + GFC.w - 1, GFC.y, 1, GFC.h, GRID_ON_BRIGHTNESS, page); - fv = (((GFC.w - 2) << 4) * GF.value) / GFC.level; + break; + case FADER_FV_BAR: + fv = calc_fader_level(ss, i, 1); ff = fv >> 4; fp = fv & 15; + grid_fill_area_scr(GFC.x, GFC.y + GFC.h - 1 - ff, GFC.w, ff, + 15, page); if (fp) - grid_fill_area_scr(GFC.x + ff + 1, GFC.y, 1, GFC.h, fp, - page); - else if (ff) - grid_fill_area_scr(GFC.x + ff, GFC.y, 1, GFC.h, - GRID_ON_BRIGHTNESS, page); - break; - case FADER_FV_DOT: + grid_fill_area_scr(GFC.x, GFC.y + GFC.h - 2 - ff, GFC.w, + 1, fp, page); + grid_fill_area_scr(GFC.x, GFC.y + GFC.h - 1, GFC.w, 1, GRID_ON_BRIGHTNESS, page); grid_fill_area_scr(GFC.x, GFC.y, GFC.w, 1, GRID_ON_BRIGHTNESS, page); - fv = (((GFC.h - 2) << 4) * GF.value) / GFC.level; + break; + case FADER_FV_DOT: + fv = calc_fader_level(ss, i, 1); ff = fv >> 4; fp = fv & 15; - if (fp) + if (fp) { + if (GFC.h - 1 >= GFC.level) + fp = GRID_ON_BRIGHTNESS; + else if (fp < 3) + fp = 3; grid_fill_area_scr(GFC.x, GFC.y + GFC.h - ff - 2, GFC.w, 1, fp, page); + } else if (ff) grid_fill_area_scr(GFC.x, GFC.y + GFC.h - ff - 1, GFC.w, - 1, GRID_ON_BRIGHTNESS, page); + 1, 15, page); + + grid_fill_area_scr(GFC.x, GFC.y + GFC.h - 1, GFC.w, 1, + GRID_ON_BRIGHTNESS, page); + grid_fill_area_scr(GFC.x, GFC.y, GFC.w, 1, + GRID_ON_BRIGHTNESS, page); break; } } diff --git a/module/main.c b/module/main.c index 440e7ccd..a5379972 100644 --- a/module/main.c +++ b/module/main.c @@ -1065,6 +1065,7 @@ void tele_ii_rx(uint8_t addr, uint8_t* data, uint8_t l) { } void tele_scene(uint8_t i, uint8_t init_grid, uint8_t init_pattern) { + if (i >= SCENE_SLOTS) return; preset_select = i; flash_read(i, &scene_state, &scene_text, init_pattern, init_grid, 0); set_dash_updated(); diff --git a/simulator/tt.c b/simulator/tt.c index e31c809c..52706e7b 100644 --- a/simulator/tt.c +++ b/simulator/tt.c @@ -83,7 +83,8 @@ void select_dash_screen(uint8_t screen) { } void print_dashboard_value(uint8_t index, int16_t value) { - printf("PRINT_DASHBOARD_VALUE index:%" PRIu8 " value:%" PRId16, index, value); + printf("PRINT_DASHBOARD_VALUE index:%" PRIu8 " value:%" PRId16, index, + value); printf("\n"); } diff --git a/src/match_token.rl b/src/match_token.rl index 5db26312..b0cdd6a6 100644 --- a/src/match_token.rl +++ b/src/match_token.rl @@ -614,6 +614,7 @@ "TI.PRM.N" => { MATCH_OP(E_OP_TI_PRM_N); }; "TI.PRM.SCALE" => { MATCH_OP(E_OP_TI_PRM_SCALE); }; "TI.PRM.MAP" => { MATCH_OP(E_OP_TI_PRM_MAP); }; + "TI.PRM.CALIB" => { MATCH_OP(E_OP_TI_PRM_CALIB); }; "TI.PRM.INIT" => { MATCH_OP(E_OP_TI_PRM_INIT); }; # fader diff --git a/src/ops/maths.c b/src/ops/maths.c index 4ebfd403..270630b8 100644 --- a/src/ops/maths.c +++ b/src/ops/maths.c @@ -838,14 +838,14 @@ static void op_AND_get(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), exec_state_t *NOTUSED(es), command_state_t *cs) { int16_t a = cs_pop(cs); int16_t b = cs_pop(cs); - cs_push(cs, (a > 0) && (b > 0)); + cs_push(cs, a && b); } static void op_OR_get(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), exec_state_t *NOTUSED(es), command_state_t *cs) { int16_t a = cs_pop(cs); int16_t b = cs_pop(cs); - cs_push(cs, (a > 0) || (b > 0)); + cs_push(cs, a || b); } static void op_AND3_get(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), @@ -853,7 +853,7 @@ static void op_AND3_get(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), int16_t a = cs_pop(cs); int16_t b = cs_pop(cs); int16_t c = cs_pop(cs); - cs_push(cs, (a > 0) && (b > 0) && (c > 0)); + cs_push(cs, a && b && c); } static void op_OR3_get(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), @@ -861,7 +861,7 @@ static void op_OR3_get(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), int16_t a = cs_pop(cs); int16_t b = cs_pop(cs); int16_t c = cs_pop(cs); - cs_push(cs, (a > 0) || (b > 0) || (c > 0)); + cs_push(cs, a || b || c); } static void op_AND4_get(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), @@ -870,7 +870,7 @@ static void op_AND4_get(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), int16_t b = cs_pop(cs); int16_t c = cs_pop(cs); int16_t d = cs_pop(cs); - cs_push(cs, (a > 0) && (b > 0) && (c > 0) && (d > 0)); + cs_push(cs, a && b && c && d); } static void op_OR4_get(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), @@ -879,7 +879,7 @@ static void op_OR4_get(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), int16_t b = cs_pop(cs); int16_t c = cs_pop(cs); int16_t d = cs_pop(cs); - cs_push(cs, (a > 0) || (b > 0) || (c > 0) || (d > 0)); + cs_push(cs, a || b || c || d); } static void op_JI_get(const void *NOTUSED(data), scene_state_t *NOTUSED(ss), diff --git a/src/ops/op.c b/src/ops/op.c index 648e1fa8..fd8dbbc8 100644 --- a/src/ops/op.c +++ b/src/ops/op.c @@ -231,7 +231,7 @@ const tele_op_t *tele_ops[E_OP__LENGTH] = { &op_TI_PARAM_INIT, &op_TI_IN_INIT, &op_TI_INIT, &op_TI_PRM, &op_TI_PRM_QT, &op_TI_PRM_N, &op_TI_PRM_SCALE, &op_TI_PRM_MAP, - &op_TI_PRM_INIT, + &op_TI_PRM_CALIB, &op_TI_PRM_INIT, // fader &op_FADER, &op_FADER_SCALE, &op_FADER_CAL_MIN, &op_FADER_CAL_MAX, diff --git a/src/ops/op_enum.h b/src/ops/op_enum.h index d7f6bbf4..dad0ed69 100644 --- a/src/ops/op_enum.h +++ b/src/ops/op_enum.h @@ -601,6 +601,7 @@ typedef enum { E_OP_TI_PRM_N, E_OP_TI_PRM_SCALE, E_OP_TI_PRM_MAP, + E_OP_TI_PRM_CALIB, E_OP_TI_PRM_INIT, E_OP_FADER, E_OP_FADER_SCALE, diff --git a/src/ops/telex.c b/src/ops/telex.c index 682e728c..01791f9e 100644 --- a/src/ops/telex.c +++ b/src/ops/telex.c @@ -349,6 +349,7 @@ const tele_op_t op_TI_PRM_QT = MAKE_ALIAS_OP(TI.PRM.QT , op_TI_ const tele_op_t op_TI_PRM_N = MAKE_ALIAS_OP(TI.PRM.N , op_TI_PARAM_N_get , NULL, 1, true); const tele_op_t op_TI_PRM_SCALE = MAKE_ALIAS_OP(TI.PRM.SCALE , op_TI_PARAM_SCALE_get , NULL, 2, false); const tele_op_t op_TI_PRM_MAP = MAKE_ALIAS_OP(TI.PRM.MAP , op_TI_PARAM_MAP_get , NULL, 3, false); +const tele_op_t op_TI_PRM_CALIB = MAKE_ALIAS_OP(TI.PRM.CALIB , op_TI_PARAM_CALIB_get , NULL, 2, false); const tele_op_t op_TI_PRM_INIT = MAKE_ALIAS_OP(TI.PRM.INIT , op_TI_PARAM_INIT_get , NULL, 1, false); // clang-format on diff --git a/src/ops/telex.h b/src/ops/telex.h index 48569626..e29d8e09 100644 --- a/src/ops/telex.h +++ b/src/ops/telex.h @@ -132,6 +132,7 @@ extern const tele_op_t op_TI_PRM_QT; extern const tele_op_t op_TI_PRM_N; extern const tele_op_t op_TI_PRM_SCALE; extern const tele_op_t op_TI_PRM_MAP; +extern const tele_op_t op_TI_PRM_CALIB; extern const tele_op_t op_TI_PRM_INIT; // helpers diff --git a/tests/main.c b/tests/main.c index ccb4d8b8..3210f2f4 100644 --- a/tests/main.c +++ b/tests/main.c @@ -31,7 +31,7 @@ void tele_kill() {} void tele_mute() {} void tele_vars_updated() {} void tele_profile_script(size_t s) {} -void tele_profile_delay(uint8_t d) {} +void tele_profile_delay(uint8_t d) {} bool tele_get_input_state(uint8_t n) { return false; }