Skip to content
Open
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
2 changes: 0 additions & 2 deletions common/src/c/grid_decode.c
Original file line number Diff line number Diff line change
Expand Up @@ -1362,8 +1362,6 @@ int grid_port_decode_class(struct grid_decoder_collection* coll, uint16_t class,

void grid_port_decode_msg(struct grid_decoder_collection* coll, struct grid_msg* msg) {

grid_lua_decode_clear_results(&grid_lua_state);

for (uint32_t i = 0; i < msg->length; ++i) {

if (msg->data[i] != GRID_CONST_STX) {
Expand Down
90 changes: 40 additions & 50 deletions common/src/c/grid_lua.c
Original file line number Diff line number Diff line change
Expand Up @@ -247,100 +247,90 @@ bool grid_lua_do_event(struct grid_lua_model* lua, uint8_t index, const char* fu
return ret;
}

void grid_lua_decode_clear_results(struct grid_lua_model* lua) {
bool grid_lua_decode_results_get_unsafe(struct grid_lua_model* lua) {

grid_lua_semaphore_lock(lua);

// Get lengths of decode result tables
lua_getglobal(lua->L, GRID_LUA_DECODE_RESULT_MIDI);
if (lua_type(lua->L, -1) != LUA_TTABLE) {
goto grid_lua_decode_clear_results_cleanup;
return false;
}
size_t midi_len = lua_rawlen(lua->L, -1);

lua_getglobal(lua->L, GRID_LUA_DECODE_RESULT_SYSEX);
if (lua_type(lua->L, -1) != LUA_TTABLE) {
goto grid_lua_decode_clear_results_cleanup;
return false;
}
size_t sysex_len = lua_rawlen(lua->L, -1);

lua_getglobal(lua->L, GRID_LUA_DECODE_RESULT_EVIEW);
if (lua_type(lua->L, -1) != LUA_TTABLE) {
goto grid_lua_decode_clear_results_cleanup;
return false;
}
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;
return false;
}
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 && rtm_len == 0) {
goto grid_lua_decode_clear_results_cleanup;
}
return true;
}

if (lua_getglobal(lua->L, GRID_LUA_DECODE_CLEARER) != LUA_TFUNCTION) {
goto grid_lua_decode_clear_results_cleanup;
}
bool grid_lua_decode_results_check_unsafe(struct grid_lua_model* lua, bool* empty) {

// Invoke decode result clearing function
if (lua_pcall(lua->L, 0, 0, 0) != LUA_OK) {
grid_lua_clear_stde(lua);
grid_lua_append_stde(lua, lua_tostring(lua->L, -1));
goto grid_lua_decode_clear_results_cleanup;
int top = lua_gettop(lua->L);

if (!grid_lua_decode_results_get_unsafe(lua)) {
goto grid_lua_decode_results_check_unsafe_failure;
}

grid_lua_decode_clear_results_cleanup:
size_t midi_len = lua_rawlen(lua->L, -4);
size_t sysex_len = lua_rawlen(lua->L, -3);
size_t eview_len = lua_rawlen(lua->L, -2);
size_t rtm_len = lua_rawlen(lua->L, -1);

lua_pop(lua->L, lua_gettop(lua->L));
grid_lua_semaphore_release(lua);
*empty = !(midi_len || sysex_len || eview_len || rtm_len);

goto grid_lua_decode_results_check_unsafe_success;

grid_lua_decode_results_check_unsafe_failure:
lua_pop(lua->L, lua_gettop(lua->L) - top);
return false;
grid_lua_decode_results_check_unsafe_success:
// leave result tables on the lua stack
return true;
}

void grid_lua_decode_process_results(struct grid_lua_model* lua) {

grid_lua_semaphore_lock(lua);

// Get lengths of decode result tables and leave them on the stack
lua_getglobal(lua->L, GRID_LUA_DECODE_RESULT_MIDI);
if (lua_type(lua->L, -1) != LUA_TTABLE) {
goto grid_lua_decode_process_results_cleanup;
}
size_t midi_len = lua_rawlen(lua->L, -1);
bool empty;

lua_getglobal(lua->L, GRID_LUA_DECODE_RESULT_SYSEX);
if (lua_type(lua->L, -1) != LUA_TTABLE) {
if (!grid_lua_decode_results_check_unsafe(lua, &empty) || empty) {
goto grid_lua_decode_process_results_cleanup;
}
size_t sysex_len = lua_rawlen(lua->L, -1);

lua_getglobal(lua->L, GRID_LUA_DECODE_RESULT_EVIEW);
if (lua_type(lua->L, -1) != LUA_TTABLE) {
if (lua_getglobal(lua->L, GRID_LUA_DECODE_PROCESSOR) != LUA_TFUNCTION) {
goto grid_lua_decode_process_results_cleanup;
}
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) {
// Move the processor function below the result tables
lua_insert(lua->L, -5);

// Invoke decode result processor function
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;
}
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 && rtm_len == 0) {
if (!grid_lua_decode_results_check_unsafe(lua, &empty) || empty) {
goto grid_lua_decode_process_results_cleanup;
}

if (lua_getglobal(lua->L, GRID_LUA_DECODE_PROCESSOR) != LUA_TFUNCTION) {
if (lua_getglobal(lua->L, GRID_LUA_DECODE_CLEARER) != LUA_TFUNCTION) {
goto grid_lua_decode_process_results_cleanup;
}

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

// Invoke decode result processor function
if (lua_pcall(lua->L, 4, 0, 0) != LUA_OK) {
// Invoke decode result clearing function
if (lua_pcall(lua->L, 0, 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
1 change: 0 additions & 1 deletion common/src/c/grid_lua.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,6 @@ uint32_t grid_lua_dostring(struct grid_lua_model* lua, const char* code);
bool grid_lua_dostring_begin(struct grid_lua_model* lua, const char* code);
void grid_lua_dostring_end(struct grid_lua_model* lua);
bool grid_lua_do_event(struct grid_lua_model* lua, uint8_t index, const char* function_name);
void grid_lua_decode_clear_results(struct grid_lua_model* lua);
void grid_lua_decode_process_results(struct grid_lua_model* lua);

void grid_lua_broadcast_stdo(struct grid_lua_model* lua);
Expand Down
Loading