lua can set sensors (#3389)
* add sensor unsubscribe * sensor hook * test it! * virtual destructor makes us sad * ensure deinit
This commit is contained in:
parent
78e3c0c760
commit
8a841bb52c
|
@ -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<Timer> luaTimer(l, "Timer");
|
||||
|
@ -348,6 +372,12 @@ void configureRusefiLuaHooks(lua_State* l) {
|
|||
.fun("reset", static_cast<void (Timer::*)() >(&Timer::reset ))
|
||||
.fun("getElapsedSeconds", static_cast<float(Timer::*)()const>(&Timer::getElapsedSeconds));
|
||||
|
||||
LuaClass<LuaSensor> luaSensor(l, "Sensor");
|
||||
luaSensor
|
||||
.ctor<const char*>()
|
||||
.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);
|
||||
|
|
|
@ -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++) {
|
||||
|
|
|
@ -168,6 +168,8 @@ public:
|
|||
return false;
|
||||
}
|
||||
|
||||
void unregister();
|
||||
|
||||
protected:
|
||||
// Protected constructor - only subclasses call this
|
||||
explicit Sensor(SensorType type)
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue