diff --git a/firmware/controllers/algo/rusefi_enums.h b/firmware/controllers/algo/rusefi_enums.h index 9d8a24280d..1688897c36 100644 --- a/firmware/controllers/algo/rusefi_enums.h +++ b/firmware/controllers/algo/rusefi_enums.h @@ -706,7 +706,8 @@ enum class GearControllerMode : uint8_t { enum class TransmissionControllerMode : uint8_t { None = 0, SimpleTransmissionController = 1, - Gm4l6x = 2, + Generic4 = 2, + Gm4l6x = 3, }; enum class InjectionTimingMode : uint8_t { diff --git a/firmware/controllers/controllers.mk b/firmware/controllers/controllers.mk index a01b351c0b..f11e803826 100644 --- a/firmware/controllers/controllers.mk +++ b/firmware/controllers/controllers.mk @@ -66,6 +66,7 @@ CONTROLLERS_SRC_CPP = \ $(CONTROLLERS_DIR)/tcu/gc_auto.cpp \ $(CONTROLLERS_DIR)/tcu/simple_tcu.cpp \ $(CONTROLLERS_DIR)/tcu/tc_4l6x.cpp \ + $(CONTROLLERS_DIR)/tcu/tc_4.cpp \ $(CONTROLLERS_DIR)/shutdown_controller.cpp \ $(CONTROLLERS_DIR)/limp_manager.cpp \ diff --git a/firmware/controllers/tcu/gear_controller.cpp b/firmware/controllers/tcu/gear_controller.cpp index 589368df84..89cdb61f52 100644 --- a/firmware/controllers/tcu/gear_controller.cpp +++ b/firmware/controllers/tcu/gear_controller.cpp @@ -12,6 +12,9 @@ void GearControllerBase::initTransmissionController() { case TransmissionControllerMode::SimpleTransmissionController : transmissionController = getSimpleTransmissionController(); break; + case TransmissionControllerMode::Generic4 : + transmissionController = getGeneric4TransmissionController(); + break; case TransmissionControllerMode::Gm4l6x : transmissionController = getGm4l6xTransmissionController(); break; diff --git a/firmware/controllers/tcu/tc_4.cpp b/firmware/controllers/tcu/tc_4.cpp new file mode 100644 index 0000000000..e21eea1b09 --- /dev/null +++ b/firmware/controllers/tcu/tc_4.cpp @@ -0,0 +1,123 @@ +#include "pch.h" + +#include "tc_4.h" + +#if EFI_TCU +Generic4TransmissionController generic4TransmissionController; +static SimplePwm pcPwm("Pressure Control"); + +void Generic4TransmissionController::init() { + SimpleTransmissionController::init(); + + enginePins.tcuTccOnoffSolenoid.initPin("TCC On/Off Solenoid", engineConfiguration->tcu_tcc_onoff_solenoid, engineConfiguration->tcu_tcc_onoff_solenoid_mode); + + enginePins.tcuPcSolenoid.initPin("Pressure Control Solenoid", engineConfiguration->tcu_pc_solenoid_pin, engineConfiguration->tcu_pc_solenoid_pin_mode); + startSimplePwm(&pcPwm, + "Line Pressure", + &engine->executor, + &enginePins.tcuPcSolenoid, + engineConfiguration->tcu_pc_solenoid_freq, + 0); +} + +void Generic4TransmissionController::update(gear_e gear) { + if (gear != getCurrentGear()) { + shiftingFrom = getCurrentGear(); + isShifting = true; + measureShiftTime(gear); + } + + setTccState(gear); + setPcState(gear); + + setCurrentGear(gear); + + SimpleTransmissionController::update(gear); + + float time = isShiftCompleted(); + if (time != 0) { + lastShiftTime = time; + isShifting = false; + } +} + +void Generic4TransmissionController::setTccState(gear_e gear) { + if (isShifting) { + enginePins.tcuTccOnoffSolenoid.setValue(0); + return; + } + + auto tps = Sensor::get(SensorType::DriverThrottleIntent); + auto vss = Sensor::get(SensorType::VehicleSpeed); + if (!tps.Valid || !vss.Valid) { + return; + } + if (gear == GEAR_4) { + int lockSpeed = interpolate2d(tps.Value, config->tcu_tccTpsBins, config->tcu_tccLockSpeed); + int unlockSpeed = interpolate2d(tps.Value, config->tcu_tccTpsBins, config->tcu_tccUnlockSpeed); + if (vss.Value > lockSpeed) { + enginePins.tcuTccOnoffSolenoid.setValue(1); + } else if (vss.Value < unlockSpeed) { + enginePins.tcuTccOnoffSolenoid.setValue(1); + } + } else { + enginePins.tcuTccOnoffSolenoid.setValue(0); + } +} + +void Generic4TransmissionController::setPcState(gear_e gear) { + uint8_t (*pcts)[sizeof(config->tcu_pcAirmassBins)/sizeof(config->tcu_pcAirmassBins[0])]; + + switch (gear) { + case REVERSE: + pcts = &config->tcu_pcValsR; + break; + case NEUTRAL: + pcts = &config->tcu_pcValsN; + break; + case GEAR_1: + if (isShifting && shiftingFrom == GEAR_2) { + pcts = &config->tcu_pcVals21; + } else { + pcts = &config->tcu_pcVals1; + } + break; + case GEAR_2: + if (isShifting && shiftingFrom == GEAR_1) { + pcts = &config->tcu_pcVals12; + } else if (isShifting && shiftingFrom == GEAR_3) { + pcts = &config->tcu_pcVals32; + } else { + pcts = &config->tcu_pcVals2; + } + break; + case GEAR_3: + if (isShifting && shiftingFrom == GEAR_2) { + pcts = &config->tcu_pcVals23; + } else if (isShifting && shiftingFrom == GEAR_4) { + pcts = &config->tcu_pcVals43; + } else { + pcts = &config->tcu_pcVals3; + } + break; + case GEAR_4: + if (isShifting && shiftingFrom == GEAR_3) { + pcts = &config->tcu_pcVals34; + } else { + pcts = &config->tcu_pcVals4; + } + break; + default: + break; + } + + if (pcts) { + float duty = 0.01f * interpolate2d(engine->fuelComputer.sdAirMassInOneCylinder, config->tcu_pcAirmassBins, *pcts); + pcPwm.setSimplePwmDutyCycle(duty); + } +} + +Generic4TransmissionController* getGeneric4TransmissionController() { + return &generic4TransmissionController; +} +#endif // EFI_TCU diff --git a/firmware/controllers/tcu/tc_4.h b/firmware/controllers/tcu/tc_4.h new file mode 100644 index 0000000000..c3c85dd4d1 --- /dev/null +++ b/firmware/controllers/tcu/tc_4.h @@ -0,0 +1,21 @@ +#pragma once + +#include "tcu.h" + +#if EFI_TCU +class Generic4TransmissionController: public SimpleTransmissionController { +public: + void update(gear_e); + void init(); + TransmissionControllerMode getMode() const { + return TransmissionControllerMode::Generic4; + } +private: + void setTccState(gear_e gear); + void setPcState(gear_e gear); + bool isShifting = false; + gear_e shiftingFrom; +}; + +Generic4TransmissionController* getGeneric4TransmissionController(); +#endif // EFI_TCU diff --git a/firmware/integration/rusefi_config.txt b/firmware/integration/rusefi_config.txt index 52edfd348a..11e5269607 100644 --- a/firmware/integration/rusefi_config.txt +++ b/firmware/integration/rusefi_config.txt @@ -1498,7 +1498,7 @@ uint8_t[TORQUE_CURVE_SIZE x TORQUE_CURVE_SIZE] autoscale torqueTable;;"Nm", 10, custom GearControllerMode 1 bits, U08, @OFFSET@, [0:1], @@gear_controller_e_enum@@ GearControllerMode gearControllerMode -#define transmission_controller_e_enum "None", "Simple Transmission", "GM 4L6X" +#define transmission_controller_e_enum "None", "Simple Transmission", "Generic 4-Speed", "GM 4L6X" custom TransmissionControllerMode 1 bits, U08, @OFFSET@, [0:1], @@transmission_controller_e_enum@@ TransmissionControllerMode transmissionControllerMode diff --git a/firmware/tunerstudio/tunerstudio.template.ini b/firmware/tunerstudio/tunerstudio.template.ini index 22cfa9568d..e62a27fbb0 100644 --- a/firmware/tunerstudio/tunerstudio.template.ini +++ b/firmware/tunerstudio/tunerstudio.template.ini @@ -4303,31 +4303,31 @@ cmd_set_engine_type_default = "@@TS_IO_TEST_COMMAND_char@@@@ts_command_e_TS_ field = "Transmission Controller" transmissionControllerMode, { tcuEnabled } dialog = shiftSolenoidPanel, "Shift Solenoids" - field = "Solenoid 1 output" tcu_solenoid1, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_SimpleTransmissionController@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } - field = "Solenoid 1 output Mode" tcu_solenoid_mode1, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_SimpleTransmissionController@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } - field = "Solenoid 2 output" tcu_solenoid2, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_SimpleTransmissionController@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } - field = "Solenoid 2 output Mode" tcu_solenoid_mode2, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_SimpleTransmissionController@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } - field = "Solenoid 3 output" tcu_solenoid3, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_SimpleTransmissionController@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } - field = "Solenoid 3 output Mode" tcu_solenoid_mode3, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_SimpleTransmissionController@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } - field = "Solenoid 4 output" tcu_solenoid4, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_SimpleTransmissionController@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } - field = "Solenoid 4 output Mode" tcu_solenoid_mode4, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_SimpleTransmissionController@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } - field = "Solenoid 5 output" tcu_solenoid5, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_SimpleTransmissionController@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } - field = "Solenoid 5 output Mode" tcu_solenoid_mode5, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_SimpleTransmissionController@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } - field = "Solenoid 6 output" tcu_solenoid6, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_SimpleTransmissionController@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } - field = "Solenoid 6 output Mode" tcu_solenoid_mode6, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_SimpleTransmissionController@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } + field = "Solenoid 1 output" tcu_solenoid1, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_SimpleTransmissionController@@ || transmissionControllerMode == @@TransmissionControllerMode_Generic4@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } + field = "Solenoid 1 output Mode" tcu_solenoid_mode1, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_SimpleTransmissionController@@ || transmissionControllerMode == @@TransmissionControllerMode_Generic4@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } + field = "Solenoid 2 output" tcu_solenoid2, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_SimpleTransmissionController@@ || transmissionControllerMode == @@TransmissionControllerMode_Generic4@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } + field = "Solenoid 2 output Mode" tcu_solenoid_mode2, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_SimpleTransmissionController@@ || transmissionControllerMode == @@TransmissionControllerMode_Generic4@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } + field = "Solenoid 3 output" tcu_solenoid3, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_SimpleTransmissionController@@ || transmissionControllerMode == @@TransmissionControllerMode_Generic4@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } + field = "Solenoid 3 output Mode" tcu_solenoid_mode3, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_SimpleTransmissionController@@ || transmissionControllerMode == @@TransmissionControllerMode_Generic4@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } + field = "Solenoid 4 output" tcu_solenoid4, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_SimpleTransmissionController@@ || transmissionControllerMode == @@TransmissionControllerMode_Generic4@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } + field = "Solenoid 4 output Mode" tcu_solenoid_mode4, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_SimpleTransmissionController@@ || transmissionControllerMode == @@TransmissionControllerMode_Generic4@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } + field = "Solenoid 5 output" tcu_solenoid5, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_SimpleTransmissionController@@ || transmissionControllerMode == @@TransmissionControllerMode_Generic4@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } + field = "Solenoid 5 output Mode" tcu_solenoid_mode5, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_SimpleTransmissionController@@ || transmissionControllerMode == @@TransmissionControllerMode_Generic4@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } + field = "Solenoid 6 output" tcu_solenoid6, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_SimpleTransmissionController@@ || transmissionControllerMode == @@TransmissionControllerMode_Generic4@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } + field = "Solenoid 6 output Mode" tcu_solenoid_mode6, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_SimpleTransmissionController@@ || transmissionControllerMode == @@TransmissionControllerMode_Generic4@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } field = "3-2 Solenoid output" tcu_32_solenoid_pin, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } field = "3-2 Solenoid output mode" tcu_32_solenoid_pin_mode, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } field = "3-2 Solenoid Frequency" tcu_32_solenoid_freq, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } dialog = otherSolenoidPanel, "Other Solenoids" - field = "TCC On/Off Solenoid Pin" tcu_tcc_onoff_solenoid, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } - field = "TCC On/Off Solenoid Pin Mode" tcu_tcc_onoff_solenoid_mode, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } + field = "TCC On/Off Solenoid Pin" tcu_tcc_onoff_solenoid, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_Generic4@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } + field = "TCC On/Off Solenoid Pin Mode" tcu_tcc_onoff_solenoid_mode, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_Generic4@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } field = "TCC PWM Solenoid Pin" tcu_tcc_pwm_solenoid, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } field = "TCC PWM Solenoid Pin Mode" tcu_tcc_pwm_solenoid_mode, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } field = "TCC PWM Solenoid Frequency" tcu_tcc_pwm_solenoid_freq, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } - field = "Pressure Control Solenoid Pin" tcu_pc_solenoid_pin, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } - field = "Pressure Control Solenoid Pin Mode" tcu_pc_solenoid_pin_mode, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } - field = "Pressure Control Solenoid Frequency" tcu_pc_solenoid_freq, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } + field = "Pressure Control Solenoid Pin" tcu_pc_solenoid_pin, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_Generic4@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } + field = "Pressure Control Solenoid Pin Mode" tcu_pc_solenoid_pin_mode, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_Generic4@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } + field = "Pressure Control Solenoid Frequency" tcu_pc_solenoid_freq, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_Generic4@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } dialog = shiftSettingsPanel, "Shift Settings" field = "Assumed Shift Time" tcu_shiftTime, { tcuEnabled }