From ff765510db2b5087ca59313912a4e81e1f658043 Mon Sep 17 00:00:00 2001 From: Bartosz Nitka Date: Sun, 23 Feb 2025 17:05:38 +0100 Subject: [PATCH] setChannel(ch, v) in Berry --- src/berry | 1 + src/cmnds/cmd_main.c | 65 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 160000 src/berry diff --git a/src/berry b/src/berry new file mode 160000 index 000000000..d2214af3a --- /dev/null +++ b/src/berry @@ -0,0 +1 @@ +Subproject commit d2214af3a78eedad4957700163e49e0eab027a77 diff --git a/src/cmnds/cmd_main.c b/src/cmnds/cmd_main.c index e6f478cf9..91aab6bff 100644 --- a/src/cmnds/cmd_main.c +++ b/src/cmnds/cmd_main.c @@ -46,6 +46,10 @@ int g_sleepfactor = 1; #include "wlan_ui_pub.h" #endif +#include "../berry/src/berry.h" +#include "../berry/src/be_repl.h" +#include "../berry/src/be_vm.h" + #define HASH_SIZE 128 static int generateHashValue(const char* fname) { @@ -406,6 +410,62 @@ static commandResult_t CMD_Echo(const void* context, const char* cmd, const char return CMD_RES_OK; } + +static void be_ChannelSet(bvm *vm) { + int top = be_top(vm); + ADDLOG_INFO(LOG_FEATURE_CMD, "be_ChannelSet top = %d", top); + /* check the arguments are all integers */ + + if (top == 2 && be_isint(vm, 1) && be_isint(vm, 2)) { + int ch = be_toint(vm, 1); + int v = be_toint(vm, 2); + ADDLOG_INFO(LOG_FEATURE_CMD, "be_ChannelSet ch = %d, v = %d", ch, v); + CHANNEL_Set(ch, v, 0); + } + be_pushnil(vm); /* push the nil to the stack */ + be_return(vm); /* return calculation result */ +} + +static commandResult_t CMD_Berry(const void* context, const char* cmd, const char* args, int cmdFlags) { + + ADDLOG_INFO(LOG_FEATURE_CMD, "[berry start]"); + bvm *vm = be_vm_new(); /* create a virtual machine instance */ + be_regfunc(vm, "channelSet", be_ChannelSet); + int ret_code1 = be_loadstring(vm, args); + if (ret_code1 != 0) { + ADDLOG_INFO(LOG_FEATURE_CMD, "be_loadstring fail"); + goto err; + } + + int ret_code2 = be_pcall(vm, 0); + if (ret_code1 != 0) { + ADDLOG_INFO(LOG_FEATURE_CMD, "be_pcall fail"); + goto err; + } + + int top = be_top(vm); + ADDLOG_INFO(LOG_FEATURE_CMD, "top = %d", top); + for (int i = 0; i < top; ++i) { + ADDLOG_INFO(LOG_FEATURE_CMD, "stack[%d] = isnumber = %d", i, be_isnumber(vm, i)); + ADDLOG_INFO(LOG_FEATURE_CMD, "stack[%d] = isnil = %d", i, be_isnil(vm, i)); + ADDLOG_INFO(LOG_FEATURE_CMD, "stack[%d] = isbool = %d", i, be_isbool(vm, i)); + ADDLOG_INFO(LOG_FEATURE_CMD, "stack[%d] = isint = %d", i, be_isint(vm, i)); + ADDLOG_INFO(LOG_FEATURE_CMD, "stack[%d] = isreal = %d", i, be_isreal(vm, i)); + if (be_isint(vm, i)) { + ADDLOG_INFO(LOG_FEATURE_CMD, "stack[%d] = %d", i, be_toint(vm, i)); + } + } + +err: + be_vm_delete(vm); /* free all objects and vm */ + + ADDLOG_INFO(LOG_FEATURE_CMD, "[berry end]"); + return CMD_RES_OK; +} + + + + static commandResult_t CMD_StartupCommand(const void* context, const char* cmd, const char* args, int cmdFlags) { const char *cmdToSet; @@ -807,6 +867,11 @@ void CMD_Init_Early() { //cmddetail:"descr":"Sends given message back to console. This command expands variables, so writing $CH12 will print value of channel 12, etc. Remember that you can also use special channel indices to access persistant flash variables and to access LED variables like dimmer, etc.", //cmddetail:"fn":"CMD_Echo","file":"cmnds/cmd_main.c","requires":"", //cmddetail:"examples":""} + CMD_RegisterCommand("berry", CMD_Berry, NULL); + //cmddetail:{"name":"berry","args":"[Berry code]", + //cmddetail:"descr":"Execute Berry code", + //cmddetail:"fn":"CMD_Berry","file":"cmnds/cmd_main.c","requires":"", + //cmddetail:"examples":"berry 1+2"} CMD_RegisterCommand("echo", CMD_Echo, NULL); //cmddetail:{"name":"restart","args":"", //cmddetail:"descr":"Reboots the module",