Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 51 additions & 2 deletions common/src/c/grid_decode.c
Original file line number Diff line number Diff line change
Expand Up @@ -369,9 +369,51 @@ uint8_t grid_decode_pagecount_to_ui(char* header, char* chunk) {
return 0;
}

uint8_t grid_decode_midi_rtm_to_ui(char* header, char* chunk) {

if (!(grid_sys_get_rx_mode(&grid_sys_state, GRID_RX_TYPE_MIDIRTM) & GRID_RX_MODE_HANDLE)) {
return 0;
}

int ret = 1;

grid_lua_semaphore_lock(&grid_lua_state);

lua_State* L = grid_lua_state.L;

lua_getglobal(L, GRID_LUA_DECODE_ORDER);
if (lua_type(L, -1) != LUA_TTABLE) {
goto grid_decode_midi_rtm_to_ui_cleanup;
}

lua_getglobal(L, GRID_LUA_DECODE_RESULT_RTM);
if (lua_type(L, -1) != LUA_TTABLE) {
goto grid_decode_midi_rtm_to_ui_cleanup;
}

size_t result_len = lua_rawlen(L, -1);

lua_pushinteger(L, grid_msg_get_parameter_raw((uint8_t*)chunk, CLASS_MIDIRTM_BYTE));
lua_rawseti(L, -2, result_len + 1);

size_t order_len = lua_rawlen(L, -2);
lua_pushinteger(L, GRID_LUA_DECODE_ORDER_RTM);
lua_rawseti(L, -3, order_len + 1);

ret = 0;

grid_decode_midi_rtm_to_ui_cleanup:

lua_pop(L, lua_gettop(L));
grid_lua_semaphore_release(&grid_lua_state);
return ret;
}

uint8_t grid_decode_midi_to_ui(char* header, char* chunk) {

// return 1;
if (!(grid_sys_get_rx_mode(&grid_sys_state, GRID_RX_TYPE_MIDIVOICE) & GRID_RX_MODE_HANDLE)) {
return 0;
}

int ret = 1;

Expand Down Expand Up @@ -427,6 +469,10 @@ uint8_t grid_decode_midi_to_ui(char* header, char* chunk) {

uint8_t grid_decode_sysex_to_ui(char* header, char* chunk) {

if (!(grid_sys_get_rx_mode(&grid_sys_state, GRID_RX_TYPE_MIDISYSEX) & GRID_RX_MODE_HANDLE)) {
return 0;
}

uint8_t sx = grid_msg_get_parameter_raw((uint8_t*)header, BRC_SX);
uint8_t sy = grid_msg_get_parameter_raw((uint8_t*)header, BRC_SY);

Expand Down Expand Up @@ -1083,7 +1129,9 @@ uint8_t grid_decode_nvmerase_to_ui(char* header, char* chunk) {

uint8_t grid_decode_eventview_to_ui(char* header, char* chunk) {

// return 1;
if (!(grid_sys_get_rx_mode(&grid_sys_state, GRID_RX_TYPE_EVENTVIEW) & GRID_RX_MODE_HANDLE)) {
return 0;
}

uint8_t sx = grid_msg_get_parameter_raw((uint8_t*)header, BRC_SX);
uint8_t sy = grid_msg_get_parameter_raw((uint8_t*)header, BRC_SY);
Expand Down Expand Up @@ -1353,6 +1401,7 @@ struct grid_decoder_collection grid_decoder_to_ui[] = {
{GRID_CLASS_PAGEACTIVE_code, grid_decode_pageactive_to_ui},
{GRID_CLASS_PAGECOUNT_code, grid_decode_pagecount_to_ui},
{GRID_CLASS_MIDI_code, grid_decode_midi_to_ui},
{GRID_CLASS_MIDIRTM_code, grid_decode_midi_rtm_to_ui},
{GRID_CLASS_MIDISYSEX_code, grid_decode_sysex_to_ui},
{GRID_CLASS_IMMEDIATE_code, grid_decode_immediate_to_ui},
{GRID_CLASS_EVALUATE_code, grid_decode_evaluate_to_ui},
Expand Down
30 changes: 17 additions & 13 deletions common/src/c/grid_lua.c
Original file line number Diff line number Diff line change
Expand Up @@ -270,8 +270,14 @@ void grid_lua_decode_clear_results(struct grid_lua_model* lua) {
}
size_t eview_len = lua_rawlen(lua->L, -1);

lua_getglobal(lua->L, GRID_LUA_DECODE_RESULT_RTM);
if (lua_type(lua->L, -1) != LUA_TTABLE) {
goto grid_lua_decode_clear_results_cleanup;
}
size_t rtm_len = lua_rawlen(lua->L, -1);

// If the tables are empty, there are no results to be cleared
if (midi_len == 0 && sysex_len == 0 && eview_len == 0) {
if (midi_len == 0 && sysex_len == 0 && eview_len == 0 && rtm_len == 0) {
goto grid_lua_decode_clear_results_cleanup;
}

Expand Down Expand Up @@ -315,8 +321,14 @@ void grid_lua_decode_process_results(struct grid_lua_model* lua) {
}
size_t eview_len = lua_rawlen(lua->L, -1);

lua_getglobal(lua->L, GRID_LUA_DECODE_RESULT_RTM);
if (lua_type(lua->L, -1) != LUA_TTABLE) {
goto grid_lua_decode_process_results_cleanup;
}
size_t rtm_len = lua_rawlen(lua->L, -1);

// If the tables are empty, there are no results to be processed
if (midi_len == 0 && sysex_len == 0 && eview_len == 0) {
if (midi_len == 0 && sysex_len == 0 && eview_len == 0 && rtm_len == 0) {
goto grid_lua_decode_process_results_cleanup;
}

Expand All @@ -325,10 +337,10 @@ void grid_lua_decode_process_results(struct grid_lua_model* lua) {
}

// Move the processor function below the result tables
lua_insert(lua->L, -4);
lua_insert(lua->L, -5);

// Invoke decode result processor function
if (lua_pcall(lua->L, 3, 0, 0) != LUA_OK) {
if (lua_pcall(lua->L, 4, 0, 0) != LUA_OK) {
grid_lua_clear_stde(lua);
grid_lua_append_stde(lua, lua_tostring(lua->L, -1));
goto grid_lua_decode_process_results_cleanup;
Expand Down Expand Up @@ -510,16 +522,8 @@ void grid_lua_start_vm(struct grid_lua_model* lua, const struct luaL_Reg* lua_li
grid_lua_gc_full_unsafe(lua);

grid_lua_register_functions_unsafe(lua, lua_lib);
grid_lua_ui_init_unsafe(&grid_lua_state, callback);

lua_newtable(lua->L);
lua_setglobal(lua->L, GRID_LUA_DECODE_ORDER);
lua_newtable(lua->L);
lua_setglobal(lua->L, GRID_LUA_DECODE_RESULT_MIDI);
lua_newtable(lua->L);
lua_setglobal(lua->L, GRID_LUA_DECODE_RESULT_SYSEX);
lua_newtable(lua->L);
lua_setglobal(lua->L, GRID_LUA_DECODE_RESULT_EVIEW);
grid_lua_ui_init_unsafe(&grid_lua_state, callback);

grid_lua_semaphore_release(lua);
}
Expand Down
2 changes: 2 additions & 0 deletions common/src/c/grid_lua.h
Original file line number Diff line number Diff line change
Expand Up @@ -154,13 +154,15 @@ int grid_lua_serialize_evaluation_results(lua_State* L, struct grid_msg* msg, ui
#define GRID_LUA_DECODE_RESULT_MIDI "_decoded_midi"
#define GRID_LUA_DECODE_RESULT_SYSEX "_decoded_sysex"
#define GRID_LUA_DECODE_RESULT_EVIEW "_decoded_eview"
#define GRID_LUA_DECODE_RESULT_RTM "_decoded_rtm"

// clang-format on

enum {
GRID_LUA_DECODE_ORDER_MIDI = 1,
GRID_LUA_DECODE_ORDER_SYSEX = 2,
GRID_LUA_DECODE_ORDER_EVIEW = 3,
GRID_LUA_DECODE_ORDER_RTM = 4,
};

#endif /* GRID_LUA_H */
69 changes: 34 additions & 35 deletions common/src/c/grid_lua_api.c
Original file line number Diff line number Diff line change
Expand Up @@ -831,54 +831,39 @@ int l_grid_cat(lua_State* L) {
return 0;
}

/*static*/ int l_grid_midirx_enabled(lua_State* L) {
/*static*/ int l_grid_rx_mode(lua_State* L) {

int nargs = lua_gettop(L);

if (nargs != 1) {
// error
if (nargs < 1 || nargs > 2 || !lua_isnumber(L, 1)) {
grid_lua_append_stde(&grid_lua_state, "#GTV.invalidParams");
return 0;
}

int32_t param[1] = {0};
// uint8_t isgetter = 0;

for (int i = 1; i <= nargs; ++i) {

if (lua_isnumber(L, i)) {
param[i - 1] = lua_tointeger(L, i);
}
lua_Integer type_raw = lua_tointeger(L, 1);
if (type_raw < 0 || type_raw >= GRID_RX_TYPE_COUNT) {
grid_lua_append_stde(&grid_lua_state, "#GTV.invalidParams");
return 0;
}
uint8_t type = (uint8_t)type_raw;

grid_sys_set_midirx_any_state(&grid_sys_state, (uint8_t)param[0]);

return 1;
}

/*static*/ int l_grid_midirx_sync(lua_State* L) {

int nargs = lua_gettop(L);
if (nargs == 1) {
lua_pushinteger(L, grid_sys_get_rx_mode(&grid_sys_state, type));
return 1;
}

if (nargs != 1) {
// error
if (!lua_isnumber(L, 2)) {
grid_lua_append_stde(&grid_lua_state, "#GTV.invalidParams");
return 0;
}

int32_t param[1] = {0};
// uint8_t isgetter = 0;

for (int i = 1; i <= nargs; ++i) {

if (lua_isnumber(L, i)) {
param[i - 1] = lua_tointeger(L, i);
}
lua_Integer mode_raw = lua_tointeger(L, 2);
if (mode_raw < 0 || mode_raw > (GRID_RX_MODE_HANDLE | GRID_RX_MODE_FORWARD)) {
grid_lua_append_stde(&grid_lua_state, "#GTV.invalidParams");
return 0;
}

grid_sys_set_midirx_sync_state(&grid_sys_state, (uint8_t)param[0]);

return 1;
grid_sys_set_rx_mode(&grid_sys_state, type, (uint8_t)mode_raw);
return 0;
}

/*static*/ int l_grid_midi_send(lua_State* L) {
Expand Down Expand Up @@ -1412,6 +1397,20 @@ int l_grid_cat(lua_State* L) {
return 1;
}

/*static*/ int l_grid_hwcfg_has_lcd(lua_State* L) {

int nargs = lua_gettop(L);

if (nargs != 0) {
grid_lua_append_stde(&grid_lua_state, "#GTV.invalidParams");
return 0;
}

lua_pushboolean(L, grid_hwcfg_module_has_lcd(&grid_sys_state));

return 1;
}

/*static*/ int l_grid_random8(lua_State* L) {

int nargs = lua_gettop(L);
Expand Down Expand Up @@ -2224,8 +2223,7 @@ GRID_LUA_FNC_META_DEFI(ggen, l_grid_elementname_get)
{GRID_LUA_FNC_G_MIDI_SEND_short, GRID_LUA_FNC_G_MIDI_SEND_fnptr},
{GRID_LUA_FNC_G_MIDISYSEX_SEND_short, GRID_LUA_FNC_G_MIDISYSEX_SEND_fnptr},

{GRID_LUA_FNC_G_MIDIRX_ENABLED_short, GRID_LUA_FNC_G_MIDIRX_ENABLED_fnptr},
{GRID_LUA_FNC_G_MIDIRX_SYNC_short, GRID_LUA_FNC_G_MIDIRX_SYNC_fnptr},
{GRID_LUA_FNC_G_RX_MODE_short, GRID_LUA_FNC_G_RX_MODE_fnptr},

{GRID_LUA_FNC_G_KEYBOARD_SEND_short, GRID_LUA_FNC_G_KEYBOARD_SEND_fnptr},

Expand Down Expand Up @@ -2255,6 +2253,7 @@ GRID_LUA_FNC_META_DEFI(ggen, l_grid_elementname_get)
{GRID_LUA_FNC_G_EVENT_TRIGGER_short, GRID_LUA_FNC_G_EVENT_TRIGGER_fnptr},

{GRID_LUA_FNC_G_HWCFG_short, GRID_LUA_FNC_G_HWCFG_fnptr},
{GRID_LUA_FNC_G_HWCFG_HAS_LCD_short, GRID_LUA_FNC_G_HWCFG_HAS_LCD_fnptr},

{GRID_LUA_FNC_G_RANDOM_short, GRID_LUA_FNC_G_RANDOM_fnptr},
{GRID_LUA_FNC_G_ELEMENTNAME_SEND_short, GRID_LUA_FNC_G_ELEMENTNAME_SEND_fnptr},
Expand Down
3 changes: 1 addition & 2 deletions common/src/c/grid_lua_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,7 @@ extern void grid_platform_delay_ms(uint32_t delay_milliseconds);

// ==== MIDI ====

/*static*/ int l_grid_midirx_enabled(lua_State* L);
/*static*/ int l_grid_midirx_sync(lua_State* L);
/*static*/ int l_grid_rx_mode(lua_State* L);

/*static*/ int l_grid_midi_send(lua_State* L);
/*static*/ int l_grid_midi_sysex_send(lua_State* L);
Expand Down
25 changes: 19 additions & 6 deletions common/src/c/grid_protocol.h
Original file line number Diff line number Diff line change
Expand Up @@ -315,6 +315,10 @@
#define GRID_LUA_FNC_G_HWCFG_human "hardware_configuration"
#define GRID_LUA_FNC_G_HWCFG_fnptr l_grid_hwcfg

#define GRID_LUA_FNC_G_HWCFG_HAS_LCD_short "ghaslcd"
#define GRID_LUA_FNC_G_HWCFG_HAS_LCD_human "hardware_has_lcd"
#define GRID_LUA_FNC_G_HWCFG_HAS_LCD_fnptr l_grid_hwcfg_has_lcd

#define GRID_LUA_FNC_G_VERSION_MAJOR_short "gvmaj"
#define GRID_LUA_FNC_G_VERSION_MAJOR_human "version_major"
#define GRID_LUA_FNC_G_VERSION_MAJOR_fnptr l_grid_version_major
Expand Down Expand Up @@ -371,13 +375,16 @@
#define GRID_LUA_FNC_G_EVENT_TRIGGER_human "event_trigger"
#define GRID_LUA_FNC_G_EVENT_TRIGGER_fnptr l_grid_event_trigger

#define GRID_LUA_FNC_G_MIDIRX_ENABLED_short "mre"
#define GRID_LUA_FNC_G_MIDIRX_ENABLED_human "midirx_enabled"
#define GRID_LUA_FNC_G_MIDIRX_ENABLED_fnptr l_grid_midirx_enabled
#define GRID_LUA_FNC_G_RX_MODE_short "grxm"
#define GRID_LUA_FNC_G_RX_MODE_human "rx_mode"
#define GRID_LUA_FNC_G_RX_MODE_usage "rx_mode(int type [, int mode]) Get or set RX routing. type: 0=MIDIVOICE 1=MIDISYSEX 2=MIDIRTM. mode: bitmask 0x01=handle 0x02=forward"
#define GRID_LUA_FNC_G_RX_MODE_fnptr l_grid_rx_mode

#define GRID_LUA_FNC_G_MIDIRX_SYNC_short "mrs"
#define GRID_LUA_FNC_G_MIDIRX_SYNC_human "midirx_sync"
#define GRID_LUA_FNC_G_MIDIRX_SYNC_fnptr l_grid_midirx_sync
#define GRID_LUA_FNC_G_MIDIRX_REGISTER_short "gmrr"
#define GRID_LUA_FNC_G_MIDIRX_REGISTER_human "midirx_register"
#define GRID_LUA_FNC_G_MIDIRX_REGISTER_usage \
"midi_rx_register(string event, int channel, int command, int parameter1, table features) Registers a MIDI RX callback on this element. Pass -1 for auto values. features = {bool set_value, bool " \
"set_led}"

#define GRID_LUA_FNC_G_ELEMENTNAME_SEND_short "gens"
#define GRID_LUA_FNC_G_ELEMENTNAME_SEND_human "element_name_send"
Expand Down Expand Up @@ -856,6 +863,12 @@
#define GRID_CLASS_MIDISYSEX_PAYLOAD_offset 9
#define GRID_CLASS_MIDISYSEX_PAYLOAD_length 2

#define GRID_CLASS_MIDIRTM_code 0x002
#define GRID_CLASS_MIDIRTM_frame "%c%03x...%c", GRID_CONST_STX, GRID_CLASS_MIDIRTM_code, GRID_CONST_ETX

#define GRID_CLASS_MIDIRTM_BYTE_offset 5
#define GRID_CLASS_MIDIRTM_BYTE_length 2

// HEARTBEAT (type=0 grid, type=1 gridmaster, type=255 editor)
#define GRID_CLASS_HEARTBEAT_code 0x010
#define GRID_CLASS_HEARTBEAT_frame "%c%03x_..............%c", GRID_CONST_STX, GRID_CLASS_HEARTBEAT_code, GRID_CONST_ETX
Expand Down
19 changes: 13 additions & 6 deletions common/src/c/grid_sys.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include "grid_sys.h"

#include <assert.h>
#include <string.h>

#include "grid_platform.h"
#include "grid_protocol.h"
Expand All @@ -24,8 +25,7 @@ void grid_sys_init(struct grid_sys_model* sys) {

// LOCAL INITIALIZERS

sys->midirx_any_enabled = 1;
sys->midirx_sync_enabled = 0;
memset(sys->rx_mode, 0, sizeof(sys->rx_mode));

sys->module_x = 0; // 0 because this is signed int
sys->module_y = 0; // 0 because this is signed int
Expand Down Expand Up @@ -73,11 +73,16 @@ uint8_t grid_sys_get_bank_num(struct grid_sys_model* sys) { return sys->bank_act
uint8_t grid_sys_get_editor_connected_state(struct grid_sys_model* sys) { return sys->editor_connected; }
void grid_sys_set_editor_connected_state(struct grid_sys_model* sys, uint8_t state) { sys->editor_connected = state; }

uint8_t grid_sys_get_midirx_any_state(struct grid_sys_model* sys) { return sys->midirx_any_enabled; }
uint8_t grid_sys_get_midirx_sync_state(struct grid_sys_model* sys) { return sys->midirx_sync_enabled; }
uint8_t grid_sys_get_rx_mode(struct grid_sys_model* sys, uint8_t type) {
assert(type < GRID_RX_TYPE_COUNT);
return sys->rx_mode[type];
}

void grid_sys_set_midirx_any_state(struct grid_sys_model* sys, uint8_t state) { sys->midirx_any_enabled = state; }
void grid_sys_set_midirx_sync_state(struct grid_sys_model* sys, uint8_t state) { sys->midirx_sync_enabled = state; }
void grid_sys_set_rx_mode(struct grid_sys_model* sys, uint8_t type, uint8_t mode) {
assert(type < GRID_RX_TYPE_COUNT);
assert(mode <= (GRID_RX_MODE_HANDLE | GRID_RX_MODE_FORWARD));
sys->rx_mode[type] = mode;
}

int8_t grid_sys_get_module_x(struct grid_sys_model* sys) { return sys->module_x; }
int8_t grid_sys_get_module_y(struct grid_sys_model* sys) { return sys->module_y; }
Expand Down Expand Up @@ -415,6 +420,8 @@ int grid_hwcfg_module_has_lcd1(struct grid_sys_model* sys) {
}
}

int grid_hwcfg_module_has_lcd(struct grid_sys_model* sys) { return grid_hwcfg_module_has_lcd0(sys) || grid_hwcfg_module_has_lcd1(sys); }

int grid_hwcfg_module_is_po16_reverse_polarity(struct grid_sys_model* sys) {

switch (grid_sys_get_hwcfg(sys)) {
Expand Down
Loading
Loading