sensors: support AEM X series EGT CAN gauge

Same protocol is implemented on RusEFI WBOx2

Currently only 0x000A0305 and 0x000A0306 IDs are supported
These two will be mapped to EGT1 and EGT2
This commit is contained in:
Andrey Gusakov 2024-03-17 15:15:22 +03:00 committed by rusefillc
parent 0db2ed0d85
commit fe116f07ae
9 changed files with 112 additions and 22 deletions

View File

@ -0,0 +1,27 @@
#include "pch.h"
#if EFI_CAN_SUPPORT || EFI_UNIT_TEST
#include "AemXSeriesEgt.h"
static constexpr uint32_t aem_egt_base = 0x000A0305;
#define AEM_EGT_DEFAULT_PERIOD_MS 100 /* 10 Hz */
AemXSeriesEgt::AemXSeriesEgt(uint8_t sensorIndex, SensorType type)
: CanSensorBase(
aem_egt_base + sensorIndex,
type,
MS2NT(3 * AEM_EGT_DEFAULT_PERIOD_MS) // sensor transmits at 10hz, allow a frame to be missed
)
, m_sensorIndex(sensorIndex)
{
// nope
}
void AemXSeriesEgt::decodeFrame(const CANRxFrame& frame, efitick_t nowNt) {
// No status flags, just a value
uint16_t egt = SWAP_UINT16(frame.data16[0]);
setValidValue((float)egt, nowNt);
}
#endif

View File

@ -0,0 +1,14 @@
#pragma once
#include "can_sensor.h"
class AemXSeriesEgt final : public CanSensorBase {
public:
AemXSeriesEgt(uint8_t sensorIndex, SensorType type);
protected:
void decodeFrame(const CANRxFrame& frame, efitick_t nowNt) override;
private:
const uint8_t m_sensorIndex;
};

View File

@ -6,6 +6,7 @@ CONTROLLERS_SENSORS_SRC_CPP = \
$(PROJECT_DIR)/controllers/sensors/allsensors.cpp \
$(PROJECT_DIR)/controllers/sensors/auto_generated_sensor.cpp \
$(PROJECT_DIR)/controllers/sensors/impl/AemXSeriesLambda.cpp \
$(PROJECT_DIR)/controllers/sensors/impl/AemXSeriesEgt.cpp \
$(PROJECT_DIR)/controllers/sensors/impl/map.cpp \
$(PROJECT_DIR)/controllers/sensors/impl/maf.cpp \
$(PROJECT_DIR)/controllers/sensors/impl/Lps25Sensor.cpp \

View File

@ -26,6 +26,7 @@ void initFluidPressure();
void initThermistors();
void initCanSensors();
void initLambda();
void initEgt();
void initFlexSensor(bool isFirstTime);
void initFuelLevel();
void initBaro();
@ -47,4 +48,8 @@ void deinitMap();
void deinitAuxSpeedSensors();
void deinitInputShaftSpeedSensor();
void stopEgt(void);
void startEgt(void);
void pokeAuxDigital();

View File

@ -5,6 +5,7 @@ INIT_SRC_CPP = $(PROJECT_DIR)/init/sensor/init_sensors.cpp \
$(PROJECT_DIR)/init/sensor/init_can_sensors.cpp \
$(PROJECT_DIR)/init/sensor/init_thermistors.cpp \
$(PROJECT_DIR)/init/sensor/init_lambda.cpp \
$(PROJECT_DIR)/init/sensor/init_egt.cpp \
$(PROJECT_DIR)/init/sensor/init_maf.cpp \
$(PROJECT_DIR)/init/sensor/init_map.cpp \
$(PROJECT_DIR)/init/sensor/init_flex.cpp \
@ -15,4 +16,4 @@ INIT_SRC_CPP = $(PROJECT_DIR)/init/sensor/init_sensors.cpp \
$(PROJECT_DIR)/init/sensor/init_vehicle_speed_sensor.cpp \
$(PROJECT_DIR)/init/sensor/init_aux_speed_sensor.cpp \
$(PROJECT_DIR)/init/sensor/init_turbocharger_speed_sensor.cpp \
$(PROJECT_DIR)/init/sensor/init_input_shaft_speed_sensor.cpp \
$(PROJECT_DIR)/init/sensor/init_input_shaft_speed_sensor.cpp

View File

@ -0,0 +1,46 @@
#include "pch.h"
#include "init.h"
#include "AemXSeriesEgt.h"
#include "max3185x.h"
#if EFI_CAN_SUPPORT
static AemXSeriesEgt aemEgt1(0, SensorType::EGT1);
static AemXSeriesEgt aemEgt2(1, SensorType::EGT2);
#endif
void initEgt() {
#if EFI_CAN_SUPPORT
if (engineConfiguration->enableAemXSeriesEgt) {
if (!engineConfiguration->canWriteEnabled || !engineConfiguration->canReadEnabled) {
criticalError("CAN read and write are required to use CAN EGT.");
return;
}
registerCanSensor(aemEgt1);
registerCanSensor(aemEgt2);
return;
}
#endif
#if EFI_MAX_31855
initMax3185x(engineConfiguration->max31855spiDevice, engineConfiguration->max31855_cs);
#endif /* EFI_MAX_31855 */
}
void stopEgt(void)
{
/* TODO: also stop CAN sensors */
#if EFI_MAX_31855
stopMax3185x();
#endif /* EFI_MAX_31855 */
}
void startEgt(void)
{
/* TODO: also start CAN sensors */
#if EFI_MAX_31855
startMax3185x(engineConfiguration->max31855spiDevice, engineConfiguration->max31855_cs);
#endif /* EFI_MAX_31855 */
}

View File

@ -8,7 +8,6 @@
#include "cli_registry.h"
#include "io_pins.h"
#include "lua_hooks.h"
#include "max3185x.h"
static void initSensorCli();
@ -90,6 +89,7 @@ void initNewSensors() {
initFluidPressure();
initThermistors();
initLambda();
initEgt();
initFlexSensor(true);
initBaro();
initAuxSensors();
@ -106,10 +106,6 @@ void initNewSensors() {
initOldAnalogInputs();
initAuxDigital();
#if EFI_MAX_31855
initMax3185x(engineConfiguration->max31855spiDevice, engineConfiguration->max31855_cs);
#endif /* EFI_MAX_31855 */
// Init CLI functionality for sensors (mocking)
initSensorCli();
@ -142,9 +138,7 @@ void stopSensors() {
deinitAuxSpeedSensors();
deinitMap();
deinitInputShaftSpeedSensor();
#if EFI_MAX_31855
stopMax3185x();
#endif /* EFI_MAX_31855 */
stopEgt();
}
void reconfigureSensors() {
@ -158,11 +152,9 @@ void reconfigureSensors() {
initTurbochargerSpeedSensor();
initAuxSpeedSensors();
initInputShaftSpeedSensor();
startEgt();
initOldAnalogInputs();
#if EFI_MAX_31855
startMax3185x(engineConfiguration->max31855spiDevice, engineConfiguration->max31855_cs);
#endif /* EFI_MAX_31855 */
}
// Mocking/testing helpers

View File

@ -1172,7 +1172,7 @@ int16_t tps2Max;Full throttle#2. tpsMax value as 10 bit ADC value. Not Voltage!\
bit useVssAsSecondWheelSpeed;VSS and auxSpeed1 or auxSpeed1 with auxSpeed2?
bit is_enabled_spi_5
bit is_enabled_spi_6
bit unusedBit_503_15
bit enableAemXSeriesEgt;AEM X-Series EGT gauge kit or rusEFI EGT sensor from Wideband controller
bit unusedBit_503_16
bit unusedBit_503_17
int16_t afterCrankingIACtaperDuration;This is the duration in cycles that the IAC will take to reach its normal idle position, it can be used to hold the idle higher for a few seconds after cranking to improve startup.\Should be 100 once tune is better;"cycles", 1, 0, 0, 5000, 0

View File

@ -308,6 +308,7 @@ enable2ndByteCanID = false
requiresPowerCycle = startStopButtonMode
requiresPowerCycle = enableAemXSeries
requiresPowerCycle = enableAemXSeriesEgt
requiresPowerCycle = etb_use_two_wires
requiresPowerCycle = etbSplit
@ -3432,15 +3433,18 @@ cmd_set_engine_type_default = "@@TS_IO_TEST_COMMAND_char@@@@ts_command_e_TS_
; Engine->EGT inputs
dialog = egtInputs, "EGT inputs"
field = "SPI", max31855spiDevice
field = "CS #1", max31855_cs1
field = "CS #2", max31855_cs2
field = "CS #3", max31855_cs3
field = "CS #4", max31855_cs4
field = "CS #5", max31855_cs5
field = "CS #6", max31855_cs6
field = "CS #7", max31855_cs7
field = "CS #8", max31855_cs8
field = "CAN support only EGT1 and EGT2"
field = "CAN EGT (AEM X series of RusEFI)" enableAemXSeriesEgt, { canReadEnabled }
field = "If both CAN and SPI EGT sensors are used, please leave two first for CAN"
field = "MAX31855/MAX31856 SPI", max31855spiDevice
field = "CS for EGT1", max31855_cs1
field = "CS for EGT2", max31855_cs2
field = "CS for EGT3", max31855_cs3
field = "CS for EGT4", max31855_cs4
field = "CS for EGT5", max31855_cs5
field = "CS for EGT6", max31855_cs6
field = "CS for EGT7", max31855_cs7
field = "CS for EGT8", max31855_cs8
; Engine->idle Settings
dialog = idleSolenoid, "Solenoid"