Skip to content
Permalink
d88d64ecbb
Go to file
 
 
Cannot retrieve contributors at this time
352 lines (309 sloc) 10.6 KB
#ifndef _STATE_H_
#define _STATE_H_
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include "command.h"
#include "every.h"
#include "scale.h"
#include "turtle.h"
#include "types.h"
#define STACK_SIZE 16
#define CV_COUNT 4
#define Q_LENGTH 64
#define TR_COUNT 4
#define TRIGGER_INPUTS 8
#define DELAY_SIZE 16
#define STACK_OP_SIZE 16
#define PATTERN_COUNT 4
#define PATTERN_LENGTH 64
#define SCRIPT_MAX_COMMANDS 6
#define SCRIPT_COUNT 11
#define EXEC_DEPTH 8
#define WHILE_DEPTH 10000
#define GRID_GROUP_COUNT 64
#define GRID_MAX_DIMENSION 16
#define GRID_BUTTON_COUNT 256
#define GRID_FADER_COUNT 64
#define GRID_XYPAD_COUNT 8
#define LED_DIM -1
#define LED_BRI -2
#define LED_OFF -3
// H - horizontal, V - vertical
// C - coarse, F - fine
// H must be even, V must be odd
#define FADER_CH_BAR 0
#define FADER_CV_BAR 1
#define FADER_CH_DOT 2
#define FADER_CV_DOT 3
#define FADER_COARSE FADER_CV_DOT
#define FADER_FH_BAR 4
#define FADER_FV_BAR 5
#define FADER_FH_DOT 6
#define FADER_FV_DOT 7
#define METRO_MIN_MS 25
#define METRO_MIN_UNSUPPORTED_MS 2
////////////////////////////////////////////////////////////////////////////////
// SCENE STATE /////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// clang-format off
typedef struct {
// Maintaining this order allows for efficient access to the group
// WARNING: DO NOT CHANGE THE ORDER OF VARIABLES a THROUGH t
int16_t a;
int16_t x;
int16_t b;
int16_t y;
int16_t c;
int16_t z;
int16_t d;
int16_t t;
// END WARNING SECTION
int16_t cv[CV_COUNT];
int16_t cv_off[CV_COUNT];
int16_t cv_slew[CV_COUNT];
int16_t drunk;
int16_t drunk_max;
int16_t drunk_min;
int16_t drunk_wrap;
int16_t flip;
int16_t in;
int16_t m;
bool m_act;
bool mutes[TRIGGER_INPUTS]; // TODO: replace with uint8_t bits
int16_t o;
int16_t o_inc;
int16_t o_min;
int16_t o_max;
int16_t o_wrap;
int16_t p_n;
int16_t param;
int16_t q[Q_LENGTH];
int16_t q_n;
int16_t r_min;
int16_t r_max;
int16_t scene;
int64_t time;
uint8_t time_act;
int16_t tr[TR_COUNT];
int16_t tr_pol[TR_COUNT];
int16_t tr_time[TR_COUNT];
scale_data_t in_range;
scale_t in_scale;
scale_data_t param_range;
scale_t param_scale;
} scene_variables_t;
// clang-format on
typedef struct {
int16_t idx;
uint16_t len;
uint16_t wrap;
int16_t start;
int16_t end;
int16_t val[PATTERN_LENGTH];
} scene_pattern_t;
typedef struct {
// TODO add a delay variables struct?
tele_command_t commands[DELAY_SIZE];
int16_t time[DELAY_SIZE];
uint8_t origin_script[DELAY_SIZE];
int16_t origin_i[DELAY_SIZE];
uint8_t count;
} scene_delay_t;
typedef struct {
tele_command_t commands[STACK_OP_SIZE];
uint8_t top;
} scene_stack_op_t;
typedef struct {
uint8_t l;
tele_command_t c[SCRIPT_MAX_COMMANDS];
every_count_t every[SCRIPT_MAX_COMMANDS];
uint32_t last_time;
} scene_script_t;
typedef struct {
u8 enabled;
u8 group;
u8 x, y;
u8 w, h;
s16 level;
s8 script;
} grid_common_t;
typedef struct {
u8 enabled;
s8 script;
s16 fader_min;
s16 fader_max;
} grid_group_t;
typedef struct {
grid_common_t common;
u8 latch;
u8 state;
} grid_button_t;
typedef struct {
grid_common_t common;
u8 type;
u8 value;
u8 slide;
u8 slide_acc;
u8 slide_end;
u8 slide_delta;
u8 slide_dir;
} grid_fader_t;
typedef struct {
grid_common_t common;
u8 value_x;
u8 value_y;
} grid_xypad_t;
typedef struct {
u8 grid_dirty;
u8 scr_dirty;
u8 clear_held;
u8 rotate;
u8 dim;
u8 current_group;
u8 latest_group;
u8 latest_button;
u8 latest_fader;
s8 leds[GRID_MAX_DIMENSION][GRID_MAX_DIMENSION];
grid_group_t group[GRID_GROUP_COUNT];
grid_button_t button[GRID_BUTTON_COUNT];
grid_fader_t fader[GRID_FADER_COUNT];
grid_xypad_t xypad[GRID_XYPAD_COUNT];
} scene_grid_t;
typedef struct {
bool initializing;
scene_variables_t variables;
scene_pattern_t patterns[PATTERN_COUNT];
scene_delay_t delay;
scene_stack_op_t stack_op;
int16_t tr_pulse_timer[TR_COUNT];
scene_script_t scripts[SCRIPT_COUNT];
scene_turtle_t turtle;
bool every_last;
scene_grid_t grid;
cal_data_t cal;
} scene_state_t;
extern void ss_init(scene_state_t *ss);
extern void ss_variables_init(scene_state_t *ss);
extern void ss_patterns_init(scene_state_t *ss);
extern void ss_pattern_init(scene_state_t *ss, size_t pattern_no);
extern void ss_grid_init(scene_state_t *ss);
extern void ss_grid_common_init(grid_common_t *gc);
extern void ss_set_in(scene_state_t *ss, int16_t value);
extern void ss_set_param(scene_state_t *ss, int16_t value);
extern void ss_set_scene(scene_state_t *ss, int16_t value);
extern bool ss_get_mute(scene_state_t *ss, size_t idx);
extern void ss_set_mute(scene_state_t *ss, size_t idx, bool value);
extern int16_t ss_get_pattern_idx(scene_state_t *ss, size_t pattern);
extern void ss_set_pattern_idx(scene_state_t *ss, size_t pattern, int16_t i);
extern int16_t ss_get_pattern_len(scene_state_t *ss, size_t pattern);
extern void ss_set_pattern_len(scene_state_t *ss, size_t pattern, int16_t l);
extern uint16_t ss_get_pattern_wrap(scene_state_t *ss, size_t pattern);
extern void ss_set_pattern_wrap(scene_state_t *ss, size_t pattern,
uint16_t wrap);
extern int16_t ss_get_pattern_start(scene_state_t *ss, size_t pattern);
extern void ss_set_pattern_start(scene_state_t *ss, size_t pattern,
int16_t start);
extern int16_t ss_get_pattern_end(scene_state_t *ss, size_t pattern);
extern void ss_set_pattern_end(scene_state_t *ss, size_t pattern, int16_t end);
extern int16_t ss_get_pattern_val(scene_state_t *ss, size_t pattern,
size_t idx);
extern void ss_set_pattern_val(scene_state_t *ss, size_t pattern, size_t idx,
int16_t val);
extern scene_pattern_t *ss_patterns_ptr(scene_state_t *ss);
extern size_t ss_patterns_size(void);
uint8_t ss_get_script_len(scene_state_t *ss, script_number_t idx);
const tele_command_t *ss_get_script_command(scene_state_t *ss,
script_number_t script_idx,
size_t c_idx);
void ss_copy_script_command(tele_command_t *dest, scene_state_t *ss,
script_number_t script_idx, size_t c_idx);
bool ss_get_script_comment(scene_state_t *ss, script_number_t script_idx,
size_t c_idx);
void ss_set_script_comment(scene_state_t *ss, script_number_t script_idx,
size_t c_idx, uint8_t on);
void ss_toggle_script_comment(scene_state_t *ss, script_number_t script_idx,
size_t c_idx);
void ss_overwrite_script_command(scene_state_t *ss, script_number_t script_idx,
size_t command_idx, const tele_command_t *cmd);
void ss_insert_script_command(scene_state_t *ss, script_number_t script_idx,
size_t command_idx, const tele_command_t *cmd);
void ss_delete_script_command(scene_state_t *ss, script_number_t script_idx,
size_t command_idx);
void ss_clear_script(scene_state_t *ss, size_t script_idx);
scene_script_t *ss_scripts_ptr(scene_state_t *ss);
size_t ss_scripts_size(void);
int16_t ss_get_script_last(scene_state_t *ss, script_number_t idx);
void ss_update_script_last(scene_state_t *ss, script_number_t idx);
every_count_t *ss_get_every(scene_state_t *ss, script_number_t idx,
uint8_t line);
void ss_sync_every(scene_state_t *ss, int16_t count);
bool every_is_now(scene_state_t *ss, every_count_t *e);
bool skip_is_now(scene_state_t *ss, every_count_t *e);
scene_turtle_t *ss_turtle_get(scene_state_t *);
void ss_turtle_set(scene_state_t *, scene_turtle_t *);
int16_t ss_turtle_get_val(scene_state_t *, scene_turtle_t *);
void ss_turtle_set_val(scene_state_t *, scene_turtle_t *, int16_t);
void ss_set_param_scale(scene_state_t *, int16_t, int16_t);
void ss_set_in_scale(scene_state_t *, int16_t, int16_t);
void ss_update_in_scale(scene_state_t *);
void ss_update_param_scale(scene_state_t *);
int16_t ss_get_param(scene_state_t *);
int16_t ss_get_in(scene_state_t *);
int16_t ss_get_in_min(scene_state_t *);
int16_t ss_get_in_max(scene_state_t *);
void ss_set_in_min(scene_state_t *, int16_t);
void ss_set_in_max(scene_state_t *, int16_t);
void ss_reset_in_cal(scene_state_t *);
int16_t ss_get_param_min(scene_state_t *);
int16_t ss_get_param_max(scene_state_t *);
void ss_set_param_min(scene_state_t *, int16_t);
void ss_set_param_max(scene_state_t *, int16_t);
void ss_reset_param_cal(scene_state_t *);
////////////////////////////////////////////////////////////////////////////////
// EXEC STATE //////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
typedef struct {
bool if_else_condition;
int16_t i;
bool while_continue;
uint16_t while_depth;
bool breaking;
script_number_t script_number;
uint8_t line_number;
bool delayed;
} exec_vars_t;
typedef struct {
exec_vars_t variables[EXEC_DEPTH];
uint8_t exec_depth;
bool overflow;
} exec_state_t;
extern void es_init(exec_state_t *es);
extern size_t es_depth(exec_state_t *es);
extern size_t es_push(exec_state_t *es);
extern size_t es_pop(exec_state_t *es);
extern void es_set_script_number(exec_state_t *es, uint8_t script_number);
extern void es_set_line_number(exec_state_t *es, uint8_t line_number);
extern uint8_t es_get_line_number(exec_state_t *es);
extern exec_vars_t *es_variables(exec_state_t *es);
////////////////////////////////////////////////////////////////////////////////
// COMMAND STATE ///////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
typedef struct {
int16_t values[STACK_SIZE];
int16_t top;
} command_state_stack_t;
typedef struct { command_state_stack_t stack; } command_state_t;
extern void cs_init(command_state_t *cs);
extern int16_t cs_stack_size(command_state_t *cs);
// by declaring the following static inline, each compilation unit (i.e. C
// file), gets its own copy of the function
static inline int16_t cs_pop(command_state_t *cs) {
cs->stack.top--;
return cs->stack.values[cs->stack.top];
}
static inline void cs_push(command_state_t *cs, int16_t data) {
cs->stack.values[cs->stack.top] = data;
cs->stack.top++;
}
#endif