-
Notifications
You must be signed in to change notification settings - Fork 84
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
DEL.X / DEL.R ops #164
DEL.X / DEL.R ops #164
Changes from all commits
5296d2e
90cea46
1f47cc7
71a9616
e31d306
b50f2d8
f0bfd37
ec7aacf
7beff19
1fd3574
4151cdf
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,41 +4,117 @@ | |
#include "teletype.h" | ||
#include "teletype_io.h" | ||
|
||
static bool delay_common_add(scene_state_t *ss, exec_state_t *es, | ||
int16_t delay_time, | ||
const tele_command_t *post_command); | ||
|
||
static void mod_DEL_func(scene_state_t *ss, exec_state_t *es, | ||
command_state_t *cs, | ||
const tele_command_t *post_command); | ||
|
||
static void op_DEL_CLR_get(const void *data, scene_state_t *ss, | ||
exec_state_t *es, command_state_t *cs); | ||
|
||
static void mod_DEL_X_func(scene_state_t *ss, exec_state_t *es, | ||
command_state_t *cs, | ||
const tele_command_t *post_command); | ||
|
||
static void mod_DEL_R_func(scene_state_t *ss, exec_state_t *es, | ||
command_state_t *cs, | ||
const tele_command_t *post_command); | ||
|
||
const tele_mod_t mod_DEL = MAKE_MOD(DEL, mod_DEL_func, 1); | ||
const tele_op_t op_DEL_CLR = MAKE_GET_OP(DEL.CLR, op_DEL_CLR_get, 0, false); | ||
const tele_mod_t mod_DEL_X = MAKE_MOD(DEL.X, mod_DEL_X_func, 2); | ||
const tele_mod_t mod_DEL_R = MAKE_MOD(DEL.R, mod_DEL_R_func, 2); | ||
|
||
static void mod_DEL_func(scene_state_t *ss, exec_state_t *es, | ||
command_state_t *cs, | ||
const tele_command_t *post_command) { | ||
// common code to queue a delay shared between all delay ops | ||
// NOTE it is the responsibility of the callee to call tele_has_delays | ||
static bool delay_common_add(scene_state_t *ss, exec_state_t *es, | ||
int16_t delay_time, | ||
const tele_command_t *post_command) { | ||
int16_t i = 0; | ||
int16_t a = cs_pop(cs); | ||
|
||
if (a < 1) a = 1; | ||
|
||
// 0 is the magic number for an empty slot. | ||
// Be careful not to set delay.time[i] to 0 before calling this function. | ||
while (ss->delay.time[i] != 0 && i != DELAY_SIZE) i++; | ||
|
||
if (delay_time < 1) delay_time = 1; | ||
|
||
if (i < DELAY_SIZE) { | ||
ss->delay.count++; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. i would add a check here to make sure it doesn't exceed There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ah good catch I can add that in. on the same topic do you think it would be good to move There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. i'd leave it out - the function has a well defined and logical contract (it adds a delay), |
||
ss->delay.time[i] = a; | ||
ss->delay.time[i] = delay_time; | ||
ss->delay.origin_script[i] = es_variables(es)->script_number; | ||
ss->delay.origin_i[i] = es_variables(es)->i; | ||
copy_command(&ss->delay.commands[i], post_command); | ||
tele_has_delays(ss->delay.count > 0); | ||
|
||
return true; | ||
} | ||
|
||
return false; | ||
} | ||
|
||
static void mod_DEL_func(scene_state_t *ss, exec_state_t *es, | ||
command_state_t *cs, | ||
const tele_command_t *post_command) { | ||
int16_t delay_time = cs_pop(cs); | ||
|
||
delay_common_add(ss, es, delay_time, post_command); | ||
tele_has_delays(ss->delay.count > 0); | ||
} | ||
|
||
static void op_DEL_CLR_get(const void *NOTUSED(data), scene_state_t *ss, | ||
exec_state_t *NOTUSED(es), | ||
command_state_t *NOTUSED(cs)) { | ||
clear_delays(ss); | ||
} | ||
|
||
static void mod_DEL_X_func(scene_state_t *ss, exec_state_t *es, | ||
command_state_t *cs, | ||
const tele_command_t *post_command) { | ||
int16_t num_delays = cs_pop(cs); | ||
int16_t delay_time = cs_pop(cs); | ||
int16_t delay_time_next; | ||
|
||
if (delay_time < 1) delay_time = 1; | ||
|
||
// set first delay time to delay time | ||
delay_time_next = delay_time; | ||
|
||
while ( num_delays > 0 && delay_common_add(ss, es, delay_time_next, post_command) ) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. the function call is part of the while check instead of using a separate bool variable. pretty sure this is fine, but I may be missing something. |
||
{ | ||
// increment delay time for next delay | ||
// normalise incremented value to stop negative wrap from increment | ||
delay_time_next += delay_time; | ||
delay_time_next = normalise_value(1, 32767, 1, delay_time_next); | ||
|
||
num_delays--; | ||
} | ||
|
||
tele_has_delays(ss->delay.count > 0); | ||
} | ||
|
||
static void mod_DEL_R_func(scene_state_t *ss, exec_state_t *es, | ||
command_state_t *cs, | ||
const tele_command_t *post_command) { | ||
int16_t num_delays = cs_pop(cs); | ||
int16_t delay_time = cs_pop(cs); | ||
int16_t delay_time_next; | ||
|
||
if (delay_time < 1) delay_time = 1; | ||
|
||
// set first delay time to 1ms to trigger immediately | ||
delay_time_next = 1; | ||
|
||
while ( num_delays > 0 && delay_common_add(ss, es, delay_time_next, post_command) ) | ||
{ | ||
// increment delay time for next delay | ||
// normalise incremented value to stop negative wrap from increment | ||
delay_time_next += delay_time; | ||
delay_time_next = normalise_value(1, 32767, 1, delay_time_next); | ||
|
||
num_delays--; | ||
} | ||
|
||
tele_has_delays(ss->delay.count > 0); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
added a check for the delay time to the common code function. removed the check from the
DEL
op function, but it's still in theDEL.X
andDEL.R
because the wrap check would cause 32ms delays if the delay time param was negative.