From 8a841bb52c4ea00bd0c857571e1e42fb69ee67fa Mon Sep 17 00:00:00 2001 From: Matthew Kennedy Date: Fri, 22 Oct 2021 13:36:29 -0700 Subject: [PATCH] lua can set sensors (#3389) * add sensor unsubscribe * sensor hook * test it! * virtual destructor makes us sad * ensure deinit --- firmware/controllers/lua/lua_hooks.cpp | 30 +++++++++++++++++++++++++ firmware/controllers/sensors/sensor.cpp | 8 +++++++ firmware/controllers/sensors/sensor.h | 2 ++ unit_tests/tests/lua/test_lua_hooks.cpp | 27 ++++++++++++++++++++++ 4 files changed, 67 insertions(+) diff --git a/firmware/controllers/lua/lua_hooks.cpp b/firmware/controllers/lua/lua_hooks.cpp index c236344cf7..1f4e77d5fe 100644 --- a/firmware/controllers/lua/lua_hooks.cpp +++ b/firmware/controllers/lua/lua_hooks.cpp @@ -340,6 +340,30 @@ static int lua_setFuelMult(lua_State* l) { } #endif // EFI_UNIT_TEST +struct LuaSensor : public StoredValueSensor { + LuaSensor() : LuaSensor("Invalid") { } + + ~LuaSensor() { + unregister(); + } + + LuaSensor(const char* name) + : StoredValueSensor(findSensorTypeByName(name), MS2NT(100)) + { + Register(); + } + + void set(float value) { + setValidValue(value, getTimeNowNt()); + } + + void invalidate() { + StoredValueSensor::invalidate(); + } + + void showInfo(const char*) const {} +}; + void configureRusefiLuaHooks(lua_State* l) { LuaClass luaTimer(l, "Timer"); @@ -348,6 +372,12 @@ void configureRusefiLuaHooks(lua_State* l) { .fun("reset", static_cast(&Timer::reset )) .fun("getElapsedSeconds", static_cast(&Timer::getElapsedSeconds)); + LuaClass luaSensor(l, "Sensor"); + luaSensor + .ctor() + .fun("set", &LuaSensor::set) + .fun("invalidate", &LuaSensor::invalidate); + lua_register(l, "print", lua_efi_print); lua_register(l, "readPin", lua_readpin); lua_register(l, "getAuxAnalog", lua_getAuxAnalog); diff --git a/firmware/controllers/sensors/sensor.cpp b/firmware/controllers/sensors/sensor.cpp index 18e1153201..e88fc7e366 100644 --- a/firmware/controllers/sensors/sensor.cpp +++ b/firmware/controllers/sensors/sensor.cpp @@ -40,6 +40,10 @@ public: } } + void unregister() { + m_sensor = nullptr; + } + SensorResult get() const { // Check if mock if (m_useMock) { @@ -118,6 +122,10 @@ bool Sensor::Register() { return s_sensorRegistry[getIndex()].Register(this); } +void Sensor::unregister() { + s_sensorRegistry[getIndex()].unregister(); +} + /*static*/ void Sensor::resetRegistry() { // Clear all entries for (size_t i = 0; i < efi::size(s_sensorRegistry); i++) { diff --git a/firmware/controllers/sensors/sensor.h b/firmware/controllers/sensors/sensor.h index a23f02a4d9..0dab8fac5e 100644 --- a/firmware/controllers/sensors/sensor.h +++ b/firmware/controllers/sensors/sensor.h @@ -168,6 +168,8 @@ public: return false; } + void unregister(); + protected: // Protected constructor - only subclasses call this explicit Sensor(SensorType type) diff --git a/unit_tests/tests/lua/test_lua_hooks.cpp b/unit_tests/tests/lua/test_lua_hooks.cpp index 9de11be9d7..99031e5410 100644 --- a/unit_tests/tests/lua/test_lua_hooks.cpp +++ b/unit_tests/tests/lua/test_lua_hooks.cpp @@ -103,3 +103,30 @@ end TEST(LuaHooks, TestLuaTimer) { EXPECT_EQ(testLuaReturnsNumber(timerTest), 0); } + +static const char* sensorTest = R"( +function testFunc() + local sens = Sensor.new("CLT") + + -- Check valid sensor + sens:set(33) + if getSensor("CLT") ~= 33 then + return 1 + end + + -- Check invalidation + sens:invalidate() + if getSensor("CLT") then + return 2 + end + + return 0 +end +)"; + +TEST(LuaHooks, LuaSensor) { + EXPECT_EQ(testLuaReturnsNumber(sensorTest), 0); + + // Ensure that the sensor got unregistered on teardown of the Lua interpreter + EXPECT_FALSE(Sensor::hasSensor(SensorType::Clt)); +}