@@ -60,21 +60,6 @@ static char condition;
static tele_command_t tele_stack[TELE_STACK_SIZE];
static uint8_t tele_stack_top;

volatile update_metro_t update_metro;
volatile update_tr_t update_tr;
volatile update_cv_t update_cv;
volatile update_cv_slew_t update_cv_slew;
volatile update_delay_t update_delay;
volatile update_s_t update_s;
volatile update_cv_off_t update_cv_off;
volatile update_ii_t update_ii;
volatile update_scene_t update_scene;
volatile update_pi_t update_pi;
volatile update_kill_t update_kill;
volatile update_mute_t update_mute;
volatile update_input_t update_input;

volatile run_script_t run_script;

volatile uint8_t input_states[8];

@@ -196,7 +181,7 @@ static void op_M_set(const void *NOTUSED(data), scene_state_t *ss,
int16_t m = cs_pop(cs);
if (m < 10) m = 10;
ss->variables.m = m;
(*update_metro)(m, ss->variables.m_act, 0);
tele_metro(m, ss->variables.m_act, 0);
}

static void op_M_ACT_get(const void *NOTUSED(data), scene_state_t *ss,
@@ -209,7 +194,7 @@ static void op_M_ACT_set(const void *NOTUSED(data), scene_state_t *ss,
int16_t m_act = cs_pop(cs);
if (m_act != 0) m_act = 1;
ss->variables.m_act = m_act;
(*update_metro)(ss->variables.m, m_act, 0);
tele_metro(ss->variables.m, m_act, 0);
}

static void op_P_N_get(const void *NOTUSED(data), scene_state_t *ss,
@@ -261,7 +246,7 @@ static void op_P_I_set(const void *NOTUSED(data), scene_state_t *ss,
tele_patterns[pn].i = tele_patterns[pn].l;
else
tele_patterns[pn].i = a;
(*update_pi)();
tele_pi();
}

static void op_P_HERE_get(const void *NOTUSED(data), scene_state_t *ss,
@@ -292,7 +277,7 @@ static void op_P_NEXT_get(const void *NOTUSED(data), scene_state_t *ss,

cs_push(cs, tele_patterns[pn].v[tele_patterns[pn].i]);

(*update_pi)();
tele_pi();
}

static void op_P_NEXT_set(const void *NOTUSED(data), scene_state_t *ss,
@@ -311,7 +296,7 @@ static void op_P_NEXT_set(const void *NOTUSED(data), scene_state_t *ss,
int16_t a = cs_pop(cs);
tele_patterns[pn].v[tele_patterns[pn].i] = a;

(*update_pi)();
tele_pi();
}

static void op_P_PREV_get(const void *NOTUSED(data), scene_state_t *ss,
@@ -331,7 +316,7 @@ static void op_P_PREV_get(const void *NOTUSED(data), scene_state_t *ss,

cs_push(cs, tele_patterns[pn].v[tele_patterns[pn].i]);

(*update_pi)();
tele_pi();
}

static void op_P_PREV_set(const void *NOTUSED(data), scene_state_t *ss,
@@ -352,7 +337,7 @@ static void op_P_PREV_set(const void *NOTUSED(data), scene_state_t *ss,
int16_t a = cs_pop(cs);
tele_patterns[pn].v[tele_patterns[pn].i] = a;

(*update_pi)();
tele_pi();
}

static void op_P_WRAP_get(const void *NOTUSED(data), scene_state_t *ss,
@@ -524,7 +509,7 @@ static void op_SCENE_set(const void *NOTUSED(data), scene_state_t *ss,
exec_state_t *NOTUSED(es), command_state_t *cs) {
int16_t scene = cs_pop(cs);
ss->variables.scene = scene;
(*update_scene)(scene);
tele_scene(scene);
}

static void op_FLIP_get(const void *NOTUSED(data), scene_state_t *ss,
@@ -579,7 +564,7 @@ static void op_CV_set(const void *NOTUSED(data), scene_state_t *ss,
a = normalise_value(0, CV_COUNT - 1, 0, a - 1);
b = normalise_value(0, 16383, 0, b);
ss->variables.cv[a] = b;
(*update_cv)(a, b, 1);
tele_cv(a, b, 1);
}

static void op_CV_SLEW_get(const void *NOTUSED(data), scene_state_t *ss,
@@ -596,7 +581,7 @@ static void op_CV_SLEW_set(const void *NOTUSED(data), scene_state_t *ss,
a = normalise_value(0, CV_COUNT - 1, 0, a - 1);
b = normalise_value(1, 32767, 0, b); // min slew = 1
ss->variables.cv_slew[a] = b;
(*update_cv_slew)(a, b);
tele_cv_slew(a, b);
}

static void op_CV_OFF_get(const void *NOTUSED(data), scene_state_t *ss,
@@ -612,8 +597,8 @@ static void op_CV_OFF_set(const void *NOTUSED(data), scene_state_t *ss,
int16_t b = cs_pop(cs);
a = normalise_value(0, CV_COUNT - 1, 0, a - 1);
ss->variables.cv_off[a] = b;
(*update_cv_off)(a, b);
(*update_cv)(a, ss->variables.cv[a], 1);
tele_cv_off(a, b);
tele_cv(a, ss->variables.cv[a], 1);
}

static void op_TR_get(const void *NOTUSED(data), scene_state_t *ss,
@@ -629,7 +614,7 @@ static void op_TR_set(const void *NOTUSED(data), scene_state_t *ss,
int16_t b = cs_pop(cs);
a = normalise_value(0, TR_COUNT - 1, 0, a - 1);
ss->variables.tr[a] = b != 0;
(*update_tr)(a, b);
tele_tr(a, b);
}

static void op_TR_POL_get(const void *NOTUSED(data), scene_state_t *ss,
@@ -684,7 +669,7 @@ static void process_delays(uint8_t v) {
process(&delay_c[i]);
delay_t[i] = 0;
delay_count--;
if (delay_count == 0) (*update_delay)(0);
if (delay_count == 0) tele_delay(0);
}
}
}
@@ -696,7 +681,7 @@ static void process_delays(uint8_t v) {
tr_pulse[i] = 0;
scene_state.variables.tr[i] =
scene_state.variables.tr_pol[i] == 0;
(*update_tr)(i, scene_state.variables.tr[i]);
tele_tr(i, scene_state.variables.tr[i]);
}
}
}
@@ -711,8 +696,8 @@ void clear_delays(void) {

tele_stack_top = 0;

(*update_delay)(0);
(*update_s)(0);
tele_delay(0);
tele_s(0);
}


@@ -765,7 +750,7 @@ void mod_DEL(scene_state_t *NOTUSED(ss), exec_state_t *NOTUSED(es),

if (i < TELE_D_SIZE) {
delay_count++;
if (delay_count == 1) (*update_delay)(1);
if (delay_count == 1) tele_delay(1);
delay_t[i] = a;

copy_command(&delay_c[i], sub_command);
@@ -776,7 +761,7 @@ void mod_S(scene_state_t *NOTUSED(ss), exec_state_t *NOTUSED(es),
if (tele_stack_top < TELE_STACK_SIZE) {
copy_command(&tele_stack[tele_stack_top], sub_command);
tele_stack_top++;
if (tele_stack_top == 1) (*update_s)(1);
if (tele_stack_top == 1) tele_s(1);
}
}
void mod_IF(scene_state_t *NOTUSED(ss), exec_state_t *NOTUSED(es),
@@ -1307,7 +1292,7 @@ static void op_TR_TOG(const void *NOTUSED(data), scene_state_t *ss,
ss->variables.tr[a] = 0;
else
ss->variables.tr[a] = 1;
update_tr(a, ss->variables.tr[a]);
tele_tr(a, ss->variables.tr[a]);
}
static void op_N(const void *NOTUSED(data), scene_state_t *NOTUSED(ss),
exec_state_t *NOTUSED(es), command_state_t *cs) {
@@ -1328,20 +1313,20 @@ static void op_S_ALL(const void *NOTUSED(data), scene_state_t *NOTUSED(ss),
for (int16_t i = 0; i < tele_stack_top; i++)
process(&tele_stack[tele_stack_top - i - 1]);
tele_stack_top = 0;
(*update_s)(0);
tele_s(0);
}
static void op_S_POP(const void *NOTUSED(data), scene_state_t *NOTUSED(ss),
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) {
if (tele_stack_top) {
tele_stack_top--;
process(&tele_stack[tele_stack_top]);
if (tele_stack_top == 0) (*update_s)(0);
if (tele_stack_top == 0) tele_s(0);
}
}
static void op_S_CLR(const void *NOTUSED(data), scene_state_t *NOTUSED(ss),
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) {
tele_stack_top = 0;
(*update_s)(0);
tele_s(0);
}
static void op_DEL_CLR(const void *NOTUSED(data), scene_state_t *NOTUSED(ss),
exec_state_t *NOTUSED(es),
@@ -1351,7 +1336,7 @@ static void op_DEL_CLR(const void *NOTUSED(data), scene_state_t *NOTUSED(ss),
static void op_M_RESET(const void *NOTUSED(data), scene_state_t *ss,
exec_state_t *NOTUSED(es),
command_state_t *NOTUSED(cs)) {
(*update_metro)(ss->variables.m, ss->variables.m_act, 1);
tele_metro(ss->variables.m, ss->variables.m_act, 1);
}
static void op_V(const void *NOTUSED(data), scene_state_t *NOTUSED(ss),
exec_state_t *NOTUSED(es), command_state_t *cs) {
@@ -1412,7 +1397,7 @@ static void op_P_set(const void *NOTUSED(data), scene_state_t *ss,
if (a > 63) a = 63;

tele_patterns[pn].v[a] = b;
(*update_pi)();
tele_pi();
}
static void op_P_INS(const void *NOTUSED(data), scene_state_t *ss,
exec_state_t *NOTUSED(es), command_state_t *cs) {
@@ -1438,7 +1423,7 @@ static void op_P_INS(const void *NOTUSED(data), scene_state_t *ss,
}

tele_patterns[pn].v[a] = b;
(*update_pi)();
tele_pi();
}
static void op_P_RM(const void *NOTUSED(data), scene_state_t *ss,
exec_state_t *NOTUSED(es), command_state_t *cs) {
@@ -1466,7 +1451,7 @@ static void op_P_RM(const void *NOTUSED(data), scene_state_t *ss,
}
else
cs_push(cs, 0);
(*update_pi)();
tele_pi();
}
static void op_P_PUSH(const void *NOTUSED(data), scene_state_t *ss,
exec_state_t *NOTUSED(es), command_state_t *cs) {
@@ -1477,7 +1462,7 @@ static void op_P_PUSH(const void *NOTUSED(data), scene_state_t *ss,
if (tele_patterns[pn].l < 64) {
tele_patterns[pn].v[tele_patterns[pn].l] = a;
tele_patterns[pn].l++;
(*update_pi)();
tele_pi();
}
}
static void op_P_POP(const void *NOTUSED(data), scene_state_t *ss,
@@ -1486,7 +1471,7 @@ static void op_P_POP(const void *NOTUSED(data), scene_state_t *ss,
if (tele_patterns[pn].l > 0) {
tele_patterns[pn].l--;
cs_push(cs, tele_patterns[pn].v[tele_patterns[pn].l]);
(*update_pi)();
tele_pi();
}
else
cs_push(cs, 0);
@@ -1535,7 +1520,7 @@ static void op_PN_set(const void *NOTUSED(data), scene_state_t *NOTUSED(ss),
if (b > 63) b = 63;

tele_patterns[a].v[b] = c;
(*update_pi)();
tele_pi();
}
static void op_TR_PULSE(const void *NOTUSED(data), scene_state_t *ss,
exec_state_t *NOTUSED(es), command_state_t *cs) {
@@ -1550,13 +1535,13 @@ static void op_TR_PULSE(const void *NOTUSED(data), scene_state_t *ss,
if (time <= 0) return; // if time <= 0 don't do anything
ss->variables.tr[a] = ss->variables.tr_pol[a];
tr_pulse[a] = time; // set time
update_tr(a, ss->variables.tr[a]);
tele_tr(a, ss->variables.tr[a]);
}
static void op_II(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);
update_ii(a, b);
tele_ii(a, b);
}
static void op_RSH(const void *NOTUSED(data), scene_state_t *NOTUSED(ss),
exec_state_t *NOTUSED(es), command_state_t *cs) {
@@ -1585,7 +1570,7 @@ static void op_CV_SET(const void *NOTUSED(data), scene_state_t *ss,
else if (b > 16383)
b = 16383;
ss->variables.cv[a] = b;
(*update_cv)(a, b, 0);
tele_cv(a, b, 0);
}
static void op_EXP(const void *NOTUSED(data), scene_state_t *NOTUSED(ss),
exec_state_t *NOTUSED(es), command_state_t *cs) {
@@ -1634,26 +1619,26 @@ static void op_JI(const void *NOTUSED(data), scene_state_t *NOTUSED(ss),
static void op_SCRIPT(const void *NOTUSED(data), scene_state_t *NOTUSED(ss),
exec_state_t *NOTUSED(es), command_state_t *cs) {
uint16_t a = cs_pop(cs);
if (a > 0 && a < 9) (*run_script)(a);
if (a > 0 && a < 9) tele_script(a);
}
static void op_KILL(const void *NOTUSED(data), scene_state_t *NOTUSED(ss),
exec_state_t *NOTUSED(es), command_state_t *NOTUSED(cs)) {
clear_delays();
(*update_kill)();
tele_kill();
}
static void op_MUTE(const void *NOTUSED(data), scene_state_t *NOTUSED(ss),
exec_state_t *NOTUSED(es), command_state_t *cs) {
int16_t a;
a = cs_pop(cs);

if (a > 0 && a < 9) { (*update_mute)(a - 1, 0); }
if (a > 0 && a < 9) { tele_mute(a - 1, 0); }
}
static void op_UNMUTE(const void *NOTUSED(data), scene_state_t *NOTUSED(ss),
exec_state_t *NOTUSED(es), command_state_t *cs) {
int16_t a;
a = cs_pop(cs);

if (a > 0 && a < 9) { (*update_mute)(a - 1, 1); }
if (a > 0 && a < 9) { tele_mute(a - 1, 1); }
}
static void op_SCALE(const void *NOTUSED(data), scene_state_t *NOTUSED(ss),
exec_state_t *NOTUSED(es), command_state_t *cs) {
@@ -1675,7 +1660,7 @@ static void op_STATE(const void *NOTUSED(data), scene_state_t *NOTUSED(ss),
else if (a > 7)
a = 7;

(*update_input)(a);
tele_input_state(a);
cs_push(cs, input_states[a]);
}

@@ -3,46 +3,22 @@

#include <stdint.h>

typedef void (*update_metro_t)(int16_t, int16_t, uint8_t);
extern volatile update_metro_t update_metro;

typedef void (*update_tr_t)(uint8_t, int16_t);
extern volatile update_tr_t update_tr;

typedef void (*update_cv_t)(uint8_t, int16_t, uint8_t);
extern volatile update_cv_t update_cv;

typedef void (*update_cv_slew_t)(uint8_t, int16_t);
extern volatile update_cv_slew_t update_cv_slew;

typedef void (*update_delay_t)(uint8_t);
extern volatile update_delay_t update_delay;

typedef void (*update_s_t)(uint8_t);
extern volatile update_s_t update_s;

typedef void (*update_cv_off_t)(uint8_t, int16_t v);
extern volatile update_cv_off_t update_cv_off;

typedef void (*update_ii_t)(uint8_t, int16_t);
extern volatile update_ii_t update_ii;

typedef void (*update_scene_t)(uint8_t);
extern volatile update_scene_t update_scene;

typedef void (*update_pi_t)(void);
extern volatile update_pi_t update_pi;

typedef void (*run_script_t)(uint8_t);
extern volatile run_script_t run_script;

typedef void (*update_kill_t)(void);
extern volatile update_kill_t update_kill;

typedef void (*update_mute_t)(uint8_t, uint8_t);
extern volatile update_mute_t update_mute;

typedef void (*update_input_t)(uint8_t);
extern volatile update_input_t update_input;
// These functions are for interacting with the teletype hardware, each target
// must provide it's own implementation

extern void tele_metro(int16_t, int16_t, uint8_t);
extern void tele_tr(uint8_t i, int16_t v);
extern void tele_cv(uint8_t i, int16_t v, uint8_t s);
extern void tele_cv_slew(uint8_t i, int16_t v);
extern void tele_delay(uint8_t i);
extern void tele_s(uint8_t i);
extern void tele_cv_off(uint8_t i, int16_t v);
extern void tele_ii(uint8_t i, int16_t d);
extern void tele_scene(uint8_t i);
extern void tele_pi(void);
extern void tele_script(uint8_t a);
extern void tele_kill(void);
extern void tele_mute(uint8_t, uint8_t);
extern void tele_input_state(uint8_t);

#endif
@@ -26,21 +26,6 @@ void tele_input_state(uint8_t n) {}
GREATEST_MAIN_DEFS();

int main(int argc, char **argv) {
update_metro = &tele_metro;
update_tr = &tele_tr;
update_cv = &tele_cv;
update_cv_slew = &tele_cv_slew;
update_delay = &tele_delay;
update_s = &tele_s;
update_cv_off = &tele_cv_off;
update_ii = &tele_ii;
update_scene = &tele_scene;
update_pi = &tele_pi;
run_script = &tele_script;
update_kill = &tele_kill;
update_mute = &tele_mute;
update_input = &tele_input_state;

GREATEST_MAIN_BEGIN();

RUN_SUITE(parser_suite);