Add generic 4-speed trans controller

This commit is contained in:
David Holdeman 2024-04-03 22:02:51 -05:00 committed by rusefillc
parent 5d59799533
commit b6ccc6d5d2
7 changed files with 168 additions and 19 deletions

View File

@ -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 {

View File

@ -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 \

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 }