Skip to content

Commit

Permalink
various fixes (#270)
Browse files Browse the repository at this point in the history
  • Loading branch information
scanner-darkly committed Jun 21, 2021
1 parent 5e1bf91 commit cbaee74
Show file tree
Hide file tree
Showing 13 changed files with 120 additions and 63 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Expand Up @@ -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

Expand Down
5 changes: 5 additions & 0 deletions docs/whats_new.md
Expand Up @@ -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

Expand Down
1 change: 1 addition & 0 deletions module/flash.c
Expand Up @@ -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));
Expand Down
148 changes: 94 additions & 54 deletions module/grid.c
Expand Up @@ -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) {
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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;
}
}
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
}
}
Expand Down
1 change: 1 addition & 0 deletions module/main.c
Expand Up @@ -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();
Expand Down
3 changes: 2 additions & 1 deletion simulator/tt.c
Expand Up @@ -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");
}

Expand Down
1 change: 1 addition & 0 deletions src/match_token.rl
Expand Up @@ -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
Expand Down
12 changes: 6 additions & 6 deletions src/ops/maths.c
Expand Up @@ -838,30 +838,30 @@ 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),
exec_state_t *NOTUSED(es), command_state_t *cs) {
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),
exec_state_t *NOTUSED(es), command_state_t *cs) {
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),
Expand All @@ -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),
Expand All @@ -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),
Expand Down
2 changes: 1 addition & 1 deletion src/ops/op.c
Expand Up @@ -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,
Expand Down
1 change: 1 addition & 0 deletions src/ops/op_enum.h
Expand Up @@ -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,
Expand Down
1 change: 1 addition & 0 deletions src/ops/telex.c
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions src/ops/telex.h
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion tests/main.c
Expand Up @@ -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;
}
Expand Down

0 comments on commit cbaee74

Please sign in to comment.