From 5cb659a7b005a07674bdc9be39b41219457620db Mon Sep 17 00:00:00 2001 From: Matthew Kennedy Date: Thu, 20 May 2021 16:01:17 -0700 Subject: [PATCH] lua pwm hooks (#2687) * pwm hook * dedicated pins * write hook * UI * more info * zero based, clamp * memory * don't compile lua in bootloader at all --- firmware/Makefile | 1 + firmware/controllers/controllers.mk | 1 - firmware/controllers/engine_controller.cpp | 2 +- firmware/controllers/lua/lua_hooks.cpp | 65 ++++++++++++++++++++++ firmware/integration/rusefi_config.txt | 6 +- firmware/tunerstudio/rusefi.input | 16 ++++++ misc/www/s/lua/index.shtml | 17 ++++++ simulator/Makefile | 1 + unit_tests/Makefile | 1 + 9 files changed, 107 insertions(+), 3 deletions(-) create mode 100644 misc/www/s/lua/index.shtml diff --git a/firmware/Makefile b/firmware/Makefile index 29fff00cd8..bc2c8844fc 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -176,6 +176,7 @@ endif include $(PROJECT_DIR)/config/engines/engines.mk include $(PROJECT_DIR)/console/console.mk include $(PROJECT_DIR)/controllers/controllers.mk +include $(PROJECT_DIR)/controllers/lua/lua.mk include $(PROJECT_DIR)/development/development.mk include $(PROJECT_DIR)/hw_layer/hw_layer.mk include $(PROJECT_DIR)/hw_layer/drivers/drivers.mk diff --git a/firmware/controllers/controllers.mk b/firmware/controllers/controllers.mk index f226dabd03..54ca37cb3b 100644 --- a/firmware/controllers/controllers.mk +++ b/firmware/controllers/controllers.mk @@ -4,7 +4,6 @@ include $(PROJECT_DIR)/controllers/math/math.mk include $(PROJECT_DIR)/controllers/trigger/trigger.mk include $(PROJECT_DIR)/controllers/sensors/sensors.mk include $(PROJECT_DIR)/controllers/system/system.mk -include $(PROJECT_DIR)/controllers/lua/lua.mk #include $(PROJECT_DIR)/controllers/gauges/gauges.mk CONTROLLERS_DIR=$(PROJECT_DIR)/controllers diff --git a/firmware/controllers/engine_controller.cpp b/firmware/controllers/engine_controller.cpp index a73fe51004..ea89893920 100644 --- a/firmware/controllers/engine_controller.cpp +++ b/firmware/controllers/engine_controller.cpp @@ -702,7 +702,7 @@ void initEngineContoller(DECLARE_ENGINE_PARAMETER_SUFFIX) { * UNUSED_SIZE constants. */ #ifndef RAM_UNUSED_SIZE -#define RAM_UNUSED_SIZE 1800 +#define RAM_UNUSED_SIZE 1500 #endif #ifndef CCM_UNUSED_SIZE #define CCM_UNUSED_SIZE 300 diff --git a/firmware/controllers/lua/lua_hooks.cpp b/firmware/controllers/lua/lua_hooks.cpp index 371a9616ca..431e248ce0 100644 --- a/firmware/controllers/lua/lua_hooks.cpp +++ b/firmware/controllers/lua/lua_hooks.cpp @@ -7,6 +7,7 @@ #include "adc_inputs.h" #include "efilib.h" #include "tunerstudio_outputs.h" +#include "pwm_generator_logic.h" // Some functions lean on existing FSIO implementation #include "fsio_impl.h" @@ -64,6 +65,66 @@ static int lua_table3d(lua_State* l) { } #if !EFI_UNIT_TEST +static SimplePwm pwms[LUA_PWM_COUNT]; +static OutputPin pins[LUA_PWM_COUNT]; + +struct P { + SimplePwm& pwm; + lua_Integer idx; +}; + +static P luaL_checkPwmIndex(lua_State* l, int pos) { + auto channel = luaL_checkinteger(l, pos); + + // Ensure channel is valid + if (channel < 0 || channel >= FSIO_COMMAND_COUNT) { + luaL_error(l, "setPwmDuty invalid channel %d", channel); + } + + return { pwms[channel], channel }; +} + +static int lua_startPwm(lua_State* l) { + auto p = luaL_checkPwmIndex(l, 1); + auto freq = luaL_checknumber(l, 2); + auto duty = luaL_checknumber(l, 2); + + // clamp to 1..1000 hz + freq = clampF(1, freq, 1000); + + startSimplePwmExt( + &p.pwm, "lua", &engine->executor, + CONFIG(luaOutputPins[p.idx]), &pins[p.idx], + freq, duty + ); + + return 0; +} + +static int lua_setPwmDuty(lua_State* l) { + auto p = luaL_checkPwmIndex(l, 1); + auto duty = luaL_checknumber(l, 2); + + // clamp to 0..1 + duty = clampF(0, duty, 1); + + p.pwm.setSimplePwmDutyCycle(duty); + + return 0; +} + +static int lua_setPwmFreq(lua_State* l) { + auto p = luaL_checkPwmIndex(l, 1); + auto freq = luaL_checknumber(l, 2); + + // clamp to 1..1000 hz + freq = clampF(1, freq, 1000); + + p.pwm.setFrequency(freq); + + return 0; +} + static int lua_fan(lua_State* l) { lua_pushboolean(l, enginePins.fanRelay.getLogicValue()); return 1; @@ -118,6 +179,10 @@ void configureRusefiLuaHooks(lua_State* l) { lua_register(l, "table3d", lua_table3d); #if !EFI_UNIT_TEST + lua_register(l, "startPwm", lua_startPwm); + lua_register(l, "setPwmDuty", lua_setPwmDuty); + lua_register(l, "setPwmFreq", lua_setPwmFreq); + lua_register(l, "getFan", lua_fan); lua_register(l, "getDigital", lua_getDigital); lua_register(l, "setDebug", lua_setDebug); diff --git a/firmware/integration/rusefi_config.txt b/firmware/integration/rusefi_config.txt index 71a1cac11a..85231e1908 100644 --- a/firmware/integration/rusefi_config.txt +++ b/firmware/integration/rusefi_config.txt @@ -77,6 +77,8 @@ struct_no_prefix engine_configuration_s #define FSIO_ANALOG_INPUT_COUNT 4 +#define LUA_PWM_COUNT 8 + ! V engines or flat engines would have pairs of shafts with same trigger shape and target position #define BANKS_COUNT 2 #define CAMS_PER_BANK 2 @@ -1045,7 +1047,9 @@ custom maf_sensor_type_e 4 bits, S32, @OFFSET@, [0:1], @@maf_sensor_type_e_enum@ uint16_t[FUEL_LEVEL_TABLE_COUNT] fuelLevelBins;;"volt", {1/@@PACK_MULT_VOLTAGE@@}, 0, 0, 5, 3 - int[59] unusedAtOldBoardConfigurationEnd;;"units", 1, 0, -20, 100, 0 + output_pin_e[LUA_PWM_COUNT iterate] luaOutputPins + + int[57] unusedAtOldBoardConfigurationEnd;;"units", 1, 0, -20, 100, 0 uint16_t vehicleWeight;;"kg", 1, 0, 0, 10000, 0 brain_pin_e lps25BaroSensorScl brain_pin_e lps25BaroSensorSda diff --git a/firmware/tunerstudio/rusefi.input b/firmware/tunerstudio/rusefi.input index aa55662a36..ffe02049d4 100644 --- a/firmware/tunerstudio/rusefi.input +++ b/firmware/tunerstudio/rusefi.input @@ -1505,6 +1505,9 @@ menuDialog = main subMenu = fsioCurve3, "FSIO Curve #3" subMenu = fsioCurve4, "FSIO Curve #4" + subMenu = std_separator + subMenu = luaOutputs, "Lua PWM Outputs" + subMenu = std_separator subMenu = tcuControls, "Transmission Settings" subMenu = tcuSolenoidTableTbl, "TCU Solenoids" @@ -3201,6 +3204,19 @@ cmd_set_engine_type_default = "@@TS_IO_TEST_COMMAND_char@@\x00\x31\x00\x00" field = "ADC #3", fsioAdc3 field = "ADC #4", fsioAdc4 + dialog = luaOutputs, "Lua Outputs" + field = "#Call startPwm to initialize, then call" + field = "#setPwmDuty and setPwmFreq to vary duty/freq" + field = "#See rusefi.com/s/lua for more info" + field = "output #0", luaOutputPins1 + field = "output #1", luaOutputPins2 + field = "output #2", luaOutputPins3 + field = "output #3", luaOutputPins4 + field = "output #4", luaOutputPins5 + field = "output #5", luaOutputPins6 + field = "output #6", luaOutputPins7 + field = "output #7", luaOutputPins8 + dialog = transmissionPanel field = "TCU Enabled" tcuEnabled diff --git a/misc/www/s/lua/index.shtml b/misc/www/s/lua/index.shtml new file mode 100644 index 0000000000..4e2df0cd53 --- /dev/null +++ b/misc/www/s/lua/index.shtml @@ -0,0 +1,17 @@ + + + + + + + +
+ +




+ +https://github.com/rusefi/rusefi/wiki/Lua-Scripting + +
+ + + diff --git a/simulator/Makefile b/simulator/Makefile index b1f8094a4f..19ba6eee49 100644 --- a/simulator/Makefile +++ b/simulator/Makefile @@ -138,6 +138,7 @@ include $(PROJECT_DIR)/console/binary/tunerstudio.mk include $(PROJECT_DIR)/console/console.mk include $(PROJECT_DIR)/config/engines/engines.mk include $(PROJECT_DIR)/controllers/controllers.mk +include $(PROJECT_DIR)/controllers/lua/lua.mk include $(PROJECT_DIR)/development/development.mk include $(PROJECT_DIR)/hw_layer/hw_layer.mk include $(PROJECT_DIR)/hw_layer/drivers/drivers.mk diff --git a/unit_tests/Makefile b/unit_tests/Makefile index 280095e589..427a94430c 100644 --- a/unit_tests/Makefile +++ b/unit_tests/Makefile @@ -9,6 +9,7 @@ UNIT_TESTS_DIR=$(PROJECT_DIR)/../unit_tests # Imported source files and paths include $(PROJECT_DIR)/config/engines/engines.mk include $(PROJECT_DIR)/controllers/controllers.mk +include $(PROJECT_DIR)/controllers/lua/lua.mk include $(PROJECT_DIR)/development/development.mk include $(PROJECT_DIR)/console/console.mk include $(PROJECT_DIR)/console/binary/tunerstudio.mk