From dce5bdf4d231d05dd6481a8877b0670edca9b417 Mon Sep 17 00:00:00 2001 From: Peter Hall <33176108+IamPete1@users.noreply.github.com> Date: Mon, 25 Nov 2019 16:21:31 +0000 Subject: [PATCH 1/5] AP_Param: add singleton --- libraries/AP_Param/AP_Param.cpp | 11 +++++++++++ libraries/AP_Param/AP_Param.h | 13 +++++++++++++ 2 files changed, 24 insertions(+) diff --git a/libraries/AP_Param/AP_Param.cpp b/libraries/AP_Param/AP_Param.cpp index 71e22a586bfc4..f2abcc13ece22 100644 --- a/libraries/AP_Param/AP_Param.cpp +++ b/libraries/AP_Param/AP_Param.cpp @@ -38,6 +38,9 @@ extern const AP_HAL::HAL &hal; uint16_t AP_Param::sentinal_offset; +// singleton instance +AP_Param *AP_Param::_singleton; + #define ENABLE_DEBUG 1 #if ENABLE_DEBUG @@ -379,6 +382,14 @@ bool AP_Param::get_base(const struct Info &info, ptrdiff_t &base) return true; } +namespace AP { + +AP_Param *param() +{ + return AP_Param::get_singleton(); +} + +} // find the info structure given a header and a group_info table // return the Info structure and a pointer to the variables storage diff --git a/libraries/AP_Param/AP_Param.h b/libraries/AP_Param/AP_Param.h index 86f84aac91330..9c892cc9126ae 100644 --- a/libraries/AP_Param/AP_Param.h +++ b/libraries/AP_Param/AP_Param.h @@ -197,6 +197,11 @@ class AP_Param uint16_t i; for (i=0; info[i].type != AP_PARAM_NONE; i++) ; _num_vars = i; + + if (_singleton != nullptr) { + AP_HAL::panic("AP_Param must be singleton"); + } + _singleton = this; } // empty constructor @@ -479,7 +484,11 @@ class AP_Param AP_HAL::BetterStream *port); #endif // AP_PARAM_KEY_DUMP + static AP_Param *get_singleton() { return _singleton; } + private: + static AP_Param *_singleton; + /// EEPROM header /// /// This structure is placed at the head of the EEPROM to indicate @@ -673,6 +682,10 @@ class AP_Param void save_io_handler(void); }; +namespace AP { + AP_Param *param(); +}; + /// Template class for scalar variables. /// /// Objects of this type have a value, and can be treated in many ways as though they From 04b9bca81f4bb004539d12f53dd73fe2ce9b6afb Mon Sep 17 00:00:00 2001 From: Peter Hall <33176108+IamPete1@users.noreply.github.com> Date: Mon, 25 Nov 2019 16:21:57 +0000 Subject: [PATCH 2/5] AP_Param: add get and set functions --- libraries/AP_Param/AP_Param.cpp | 33 +++++++++++++++++++++++++++++++++ libraries/AP_Param/AP_Param.h | 11 +++++++++++ 2 files changed, 44 insertions(+) diff --git a/libraries/AP_Param/AP_Param.cpp b/libraries/AP_Param/AP_Param.cpp index f2abcc13ece22..4be8a1b1165a0 100644 --- a/libraries/AP_Param/AP_Param.cpp +++ b/libraries/AP_Param/AP_Param.cpp @@ -2399,6 +2399,39 @@ bool AP_Param::set_by_name(const char *name, float value) return false; } +/* + get a value by name + */ +bool AP_Param::get(const char *name, float &value) +{ + enum ap_var_type vtype; + AP_Param *vp = find(name, &vtype); + if (vp == nullptr) { + return false; + } + switch (vtype) { + case AP_PARAM_INT8: + value = ((AP_Int8 *)vp)->get(); + break; + case AP_PARAM_INT16: + value = ((AP_Int16 *)vp)->get(); + break; + + case AP_PARAM_INT32: + value = ((AP_Int32 *)vp)->get(); + break; + + case AP_PARAM_FLOAT: + value = ((AP_Float *)vp)->get(); + break; + + default: + // not a supported type + return false; + } + return true; +} + /* set and save a value by name */ diff --git a/libraries/AP_Param/AP_Param.h b/libraries/AP_Param/AP_Param.h index 9c892cc9126ae..1fb5386288eab 100644 --- a/libraries/AP_Param/AP_Param.h +++ b/libraries/AP_Param/AP_Param.h @@ -286,6 +286,15 @@ class AP_Param /// @param value The new value /// @return true if the variable is found static bool set_by_name(const char *name, float value); + // name helper for scripting + static bool set(const char *name, float value) { return set_by_name(name, value); }; + + /// gat a value by name, used by scripting + /// + /// @param name The full name of the variable to be found. + /// @param value A refernce to the variable + /// @return true if the variable is found + static bool get(const char *name, float &value); /// set and save a value by name /// @@ -293,6 +302,8 @@ class AP_Param /// @param value The new value /// @return true if the variable is found static bool set_and_save_by_name(const char *name, float value); + // name helper for scripting + static bool set_and_save(const char *name, float value) { return set_and_save_by_name(name, value); }; /// Find a variable by index. /// From 1692295db0e32250a0e2898b6e710eeedeed6965 Mon Sep 17 00:00:00 2001 From: Peter Hall <33176108+IamPete1@users.noreply.github.com> Date: Mon, 25 Nov 2019 16:22:26 +0000 Subject: [PATCH 3/5] AP_Scripting: add param get, set and save bindings --- libraries/AP_Scripting/generator/description/bindings.desc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/libraries/AP_Scripting/generator/description/bindings.desc b/libraries/AP_Scripting/generator/description/bindings.desc index b02c033acfcc8..cc8328de7cbdd 100644 --- a/libraries/AP_Scripting/generator/description/bindings.desc +++ b/libraries/AP_Scripting/generator/description/bindings.desc @@ -183,3 +183,9 @@ singleton AP_Baro method get_external_temperature float include AP_ESC_Telem/AP_ESC_Telem.h singleton AP_ESC_Telem alias esc_telem singleton AP_ESC_Telem method get_usage_seconds boolean uint8_t 0 NUM_SERVO_CHANNELS uint32_t'Null + +include AP_Param/AP_Param.h +singleton AP_Param alias param +singleton AP_Param method get boolean string float'Null +singleton AP_Param method set boolean string float -FLT_MAX FLT_MAX +singleton AP_Param method set_and_save boolean string float -FLT_MAX FLT_MAX From b094bf58c4ba795bb8881c2f81003eac8ab2851a Mon Sep 17 00:00:00 2001 From: Peter Hall <33176108+IamPete1@users.noreply.github.com> Date: Mon, 25 Nov 2019 16:24:10 +0000 Subject: [PATCH 4/5] AP_Scripting: add param get and set example --- .../examples/param_get_set_test.lua | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 libraries/AP_Scripting/examples/param_get_set_test.lua diff --git a/libraries/AP_Scripting/examples/param_get_set_test.lua b/libraries/AP_Scripting/examples/param_get_set_test.lua new file mode 100644 index 0000000000000..6a93d077451d2 --- /dev/null +++ b/libraries/AP_Scripting/examples/param_get_set_test.lua @@ -0,0 +1,54 @@ +-- This script is a test of param set and get +local count = 0 + +function update() -- this is the loop which periodically runs + + -- get and print all the scripting parameters + local value = param:get('SCR_ENABLE') + if value then + gcs:send_text(6, string.format('LUA: SCR_ENABLE: %i',value)) + else + gcs:send_text(6, 'LUA: get SCR_ENABLE failed') + end + value = param:get('SCR_VM_I_COUNT') + if value then + gcs:send_text(6, string.format('LUA: SCR_VM_I_COUNT: %i',value)) + else + gcs:send_text(6, 'LUA: get SCR_VM_I_COUNT failed') + end + value = param:get('SCR_HEAP_SIZE') + if value then + gcs:send_text(6, string.format('LUA: SCR_HEAP_SIZE: %i',value)) + else + gcs:send_text(6, 'LUA: get SCR_HEAP_SIZE failed') + end + value = param:get('SCR_DEBUG_LVL') + if value then + gcs:send_text(6, string.format('LUA: SCR_DEBUG_LVL: %i',value)) + else + gcs:send_text(6, 'LUA: get SCR_DEBUG_LVL failed') + end + + -- increment the script heap size by one + local heap_size = param:get('SCR_HEAP_SIZE') + if heap_size then + if not(param:set('SCR_HEAP_SIZE',heap_size + 1)) then + gcs:send_text(6, 'LUA: param set failed') + end + else + gcs:send_text(6, 'LUA: get SCR_HEAP_SIZE failed') + end + + + count = count + 1; + + -- self terminate after 30 loops + if count > 30 then + gcs:send_text(0, 'LUA: goodbye, world') + param:set('SCR_ENABLE',0) + end + + return update, 1000 -- reschedules the loop +end + +return update() -- run immediately before starting to reschedule From 236aab7d588574726b2f801b3e637559d9aa6223 Mon Sep 17 00:00:00 2001 From: Peter Hall <33176108+IamPete1@users.noreply.github.com> Date: Fri, 14 Feb 2020 17:49:54 +0000 Subject: [PATCH 5/5] AP_Scripting: regenerate bindings --- .../AP_Scripting/lua_generated_bindings.cpp | 69 +++++++++++++++++++ .../AP_Scripting/lua_generated_bindings.h | 1 + 2 files changed, 70 insertions(+) diff --git a/libraries/AP_Scripting/lua_generated_bindings.cpp b/libraries/AP_Scripting/lua_generated_bindings.cpp index 23b368b1b11f9..cdcc03bd15973 100644 --- a/libraries/AP_Scripting/lua_generated_bindings.cpp +++ b/libraries/AP_Scripting/lua_generated_bindings.cpp @@ -1,6 +1,7 @@ // auto generated bindings, don't manually edit. See README.md for details. #include "lua_generated_bindings.h" #include "lua_boxed_numerics.h" +#include #include #include #include @@ -531,6 +532,65 @@ const luaL_Reg Location_meta[] = { {NULL, NULL} }; +static int AP_Param_set_and_save(lua_State *L) { + AP_Param * ud = AP_Param::get_singleton(); + if (ud == nullptr) { + return luaL_argerror(L, 1, "param not supported on this firmware"); + } + + binding_argcheck(L, 3); + const char * data_2 = luaL_checkstring(L, 2); + const float raw_data_3 = luaL_checknumber(L, 3); + luaL_argcheck(L, ((raw_data_3 >= MAX(-FLT_MAX, -INFINITY)) && (raw_data_3 <= MIN(FLT_MAX, INFINITY))), 3, "argument out of range"); + const float data_3 = raw_data_3; + const bool data = ud->set_and_save( + data_2, + data_3); + + lua_pushboolean(L, data); + return 1; +} + +static int AP_Param_set(lua_State *L) { + AP_Param * ud = AP_Param::get_singleton(); + if (ud == nullptr) { + return luaL_argerror(L, 1, "param not supported on this firmware"); + } + + binding_argcheck(L, 3); + const char * data_2 = luaL_checkstring(L, 2); + const float raw_data_3 = luaL_checknumber(L, 3); + luaL_argcheck(L, ((raw_data_3 >= MAX(-FLT_MAX, -INFINITY)) && (raw_data_3 <= MIN(FLT_MAX, INFINITY))), 3, "argument out of range"); + const float data_3 = raw_data_3; + const bool data = ud->set( + data_2, + data_3); + + lua_pushboolean(L, data); + return 1; +} + +static int AP_Param_get(lua_State *L) { + AP_Param * ud = AP_Param::get_singleton(); + if (ud == nullptr) { + return luaL_argerror(L, 1, "param not supported on this firmware"); + } + + binding_argcheck(L, 2); + const char * data_2 = luaL_checkstring(L, 2); + float data_5003 = {}; + const bool data = ud->get( + data_2, + data_5003); + + if (data) { + lua_pushnumber(L, data_5003); + } else { + lua_pushnil(L); + } + return 1; +} + static int AP_ESC_Telem_get_usage_seconds(lua_State *L) { AP_ESC_Telem * ud = AP_ESC_Telem::get_singleton(); if (ud == nullptr) { @@ -1928,6 +1988,13 @@ static int AP_AHRS_get_roll(lua_State *L) { return 1; } +const luaL_Reg AP_Param_meta[] = { + {"set_and_save", AP_Param_set_and_save}, + {"set", AP_Param_set}, + {"get", AP_Param_get}, + {NULL, NULL} +}; + const luaL_Reg AP_ESC_Telem_meta[] = { {"get_usage_seconds", AP_ESC_Telem_get_usage_seconds}, {NULL, NULL} @@ -2185,6 +2252,7 @@ const struct userdata_meta userdata_fun[] = { }; const struct userdata_meta singleton_fun[] = { + {"param", AP_Param_meta, NULL}, {"esc_telem", AP_ESC_Telem_meta, NULL}, {"baro", AP_Baro_meta, NULL}, {"serial", AP_SerialManager_meta, NULL}, @@ -2256,6 +2324,7 @@ void load_generated_bindings(lua_State *L) { } const char *singletons[] = { + "param", "esc_telem", "baro", "serial", diff --git a/libraries/AP_Scripting/lua_generated_bindings.h b/libraries/AP_Scripting/lua_generated_bindings.h index c9567df001152..07b40baa1f64d 100644 --- a/libraries/AP_Scripting/lua_generated_bindings.h +++ b/libraries/AP_Scripting/lua_generated_bindings.h @@ -1,5 +1,6 @@ #pragma once // auto generated bindings, don't manually edit. See README.md for details. +#include #include #include #include