diff --git a/firmware/controllers/core/fsio_core.cpp b/firmware/controllers/core/fsio_core.cpp index 760f5bb13c..134281d921 100644 --- a/firmware/controllers/core/fsio_core.cpp +++ b/firmware/controllers/core/fsio_core.cpp @@ -20,7 +20,6 @@ #include "fsio_core.h" #include "fsio_impl.h" -#include "adc_inputs.h" extern fsio8_Map3D_f32t fsioTable1; extern fsio8_Map3D_u8t fsioTable2; @@ -247,7 +246,8 @@ FsioResult LECalculator::processElement(const LEElement *element DECLARE_ENGINE_ case LE_METHOD_FSIO_ANALOG_INPUT: { int index = clampF(0, pop(LE_METHOD_FSIO_ANALOG_INPUT), FSIO_ANALOG_INPUT_COUNT - 1); - return getVoltage("fsio", engineConfiguration->fsioAdc[index] PASS_ENGINE_PARAMETER_SUFFIX); + int sensorIdx = static_cast(SensorType::Aux1) + index; + return Sensor::get(static_cast(sensorIdx)); } case LE_METHOD_KNOCK: return ENGINE(knockCount); diff --git a/firmware/controllers/lua/lua_hooks.cpp b/firmware/controllers/lua/lua_hooks.cpp index 113367fe63..371a9616ca 100644 --- a/firmware/controllers/lua/lua_hooks.cpp +++ b/firmware/controllers/lua/lua_hooks.cpp @@ -69,19 +69,6 @@ static int lua_fan(lua_State* l) { return 1; } -static int lua_getAnalog(lua_State* l) { - auto idx = luaL_checkinteger(l, 1); - - // Sanitize parameter - idx = clampI(0, idx, FSIO_ANALOG_INPUT_COUNT - 1); - - // Do the analog read - float voltage = getVoltage("lua", engineConfiguration->fsioAdc[idx]); - - lua_pushnumber(l, voltage); - return 1; -} - static int lua_getDigital(lua_State* l) { auto idx = luaL_checkinteger(l, 1); @@ -132,7 +119,6 @@ void configureRusefiLuaHooks(lua_State* l) { #if !EFI_UNIT_TEST lua_register(l, "getFan", lua_fan); - lua_register(l, "getAnalog", lua_getAnalog); lua_register(l, "getDigital", lua_getDigital); lua_register(l, "setDebug", lua_setDebug); #endif diff --git a/firmware/controllers/sensors/functional_sensor.h b/firmware/controllers/sensors/functional_sensor.h index 1879c687ab..14606944ba 100644 --- a/firmware/controllers/sensors/functional_sensor.h +++ b/firmware/controllers/sensors/functional_sensor.h @@ -25,7 +25,7 @@ */ class FunctionalSensor final : public StoredValueSensor { public: - explicit FunctionalSensor(SensorType type, efitick_t timeoutPeriod) + FunctionalSensor(SensorType type, efitick_t timeoutPeriod) : StoredValueSensor(type, timeoutPeriod) { } void postRawValue(float inputValue, efitick_t timestamp); diff --git a/firmware/controllers/sensors/sensor.cpp b/firmware/controllers/sensors/sensor.cpp index 9263720165..b2379f6a5a 100644 --- a/firmware/controllers/sensors/sensor.cpp +++ b/firmware/controllers/sensors/sensor.cpp @@ -47,6 +47,11 @@ static const char* s_sensorNames[] = { "Barometric Pressure", "Fuel Level %", + + "Aux 1", + "Aux 2", + "Aux 3", + "Aux 4", }; // This struct represents one sensor in the registry. diff --git a/firmware/controllers/sensors/sensor_type.h b/firmware/controllers/sensors/sensor_type.h index 1cf4e7c903..37118d0b85 100644 --- a/firmware/controllers/sensors/sensor_type.h +++ b/firmware/controllers/sensors/sensor_type.h @@ -68,6 +68,11 @@ enum class SensorType : unsigned char { FuelLevel = 29, + Aux1 = 30, + Aux2 = 31, + Aux3 = 32, + Aux4 = 33, + // Leave me at the end! - PlaceholderLast = 30, + PlaceholderLast = 34, }; diff --git a/firmware/hw_layer/adc/adc_inputs.cpp b/firmware/hw_layer/adc/adc_inputs.cpp index 4fdb60c5c8..f09fc00088 100644 --- a/firmware/hw_layer/adc/adc_inputs.cpp +++ b/firmware/hw_layer/adc/adc_inputs.cpp @@ -474,10 +474,6 @@ static void configureInputs(void) { addChannel("CJ125 UA", engineConfiguration->cj125ua, ADC_SLOW); } - for (int i = 0; i < FSIO_ANALOG_INPUT_COUNT ; i++) { - addChannel("FSIOadc", engineConfiguration->fsioAdc[i], ADC_SLOW); - } - setAdcChannelOverrides(); } diff --git a/firmware/init/init.h b/firmware/init/init.h index 07b358df4e..6bda9b0b32 100644 --- a/firmware/init/init.h +++ b/firmware/init/init.h @@ -27,6 +27,7 @@ void initLambda(DECLARE_ENGINE_PARAMETER_SIGNATURE); void initFlexSensor(DECLARE_CONFIG_PARAMETER_SIGNATURE); void initFuelLevel(DECLARE_CONFIG_PARAMETER_SIGNATURE); void initBaro(DECLARE_CONFIG_PARAMETER_SIGNATURE); +void initAuxSensors(DECLARE_CONFIG_PARAMETER_SIGNATURE); // Sensor reconfiguration void reconfigureVbatt(DECLARE_CONFIG_PARAMETER_SIGNATURE); diff --git a/firmware/init/init.mk b/firmware/init/init.mk index 8c2211b4f7..3c569b294c 100644 --- a/firmware/init/init.mk +++ b/firmware/init/init.mk @@ -10,3 +10,4 @@ INIT_SRC_CPP = $(PROJECT_DIR)/init/sensor/init_sensors.cpp \ $(PROJECT_DIR)/init/sensor/init_vbatt.cpp \ $(PROJECT_DIR)/init/sensor/init_baro.cpp \ $(PROJECT_DIR)/init/sensor/init_fuel_level.cpp \ + $(PROJECT_DIR)/init/sensor/init_aux.cpp \ diff --git a/firmware/init/sensor/init_aux.cpp b/firmware/init/sensor/init_aux.cpp new file mode 100644 index 0000000000..5c6ebd7c29 --- /dev/null +++ b/firmware/init/sensor/init_aux.cpp @@ -0,0 +1,43 @@ +#include "init.h" +#include "adc_inputs.h" +#include "adc_subscription.h" +#include "engine.h" +#include "global.h" +#include "functional_sensor.h" + +EXTERN_ENGINE; + +// These aux sensors just read voltage - so the converter function has nothing to do +struct IdentityFunction : public SensorConverter { + SensorResult convert(float raw) const { + return raw; + } +}; + +static IdentityFunction func; + +static FunctionalSensor auxSensors[] = { + { SensorType::Aux1, MS2NT(50) }, + { SensorType::Aux2, MS2NT(50) }, + { SensorType::Aux3, MS2NT(50) }, + { SensorType::Aux4, MS2NT(50) }, +}; + +static_assert(efi::size(auxSensors) == FSIO_ANALOG_INPUT_COUNT); + +void initAuxSensors(DECLARE_CONFIG_PARAMETER_SIGNATURE) { + for (size_t i = 0; i < efi::size(CONFIG(fsioAdc)); i++) { + auto channel = CONFIG(fsioAdc)[i]; + + // Skip unconfigured channels + if (!isAdcChannelValid(channel)) { + continue; + } + + auto& sensor = auxSensors[i]; + sensor.setFunction(func); + sensor.Register(); + + AdcSubscription::SubscribeSensor(sensor, channel, 10); + } +} diff --git a/firmware/init/sensor/init_sensors.cpp b/firmware/init/sensor/init_sensors.cpp index 92d3d2e639..1550a6b988 100644 --- a/firmware/init/sensor/init_sensors.cpp +++ b/firmware/init/sensor/init_sensors.cpp @@ -21,6 +21,7 @@ void initNewSensors(DECLARE_ENGINE_PARAMETER_SIGNATURE) { initLambda(PASS_ENGINE_PARAMETER_SIGNATURE); initFlexSensor(PASS_CONFIG_PARAMETER_SIGNATURE); initBaro(PASS_CONFIG_PARAMETER_SIGNATURE); + initAuxSensors(PASS_CONFIG_PARAMETER_SIGNATURE); #if !EFI_UNIT_TEST initFuelLevel(PASS_CONFIG_PARAMETER_SIGNATURE);