119 lines
3.9 KiB
C++
119 lines
3.9 KiB
C++
//
|
|
// Created by kifir on 9/27/24.
|
|
//
|
|
|
|
#include "pch.h"
|
|
|
|
#if EFI_LAUNCH_CONTROL
|
|
#include "shift_torque_reduction_controller.h"
|
|
#include "boost_control.h"
|
|
#include "launch_control.h"
|
|
#include "advance_map.h"
|
|
#include "engine_state.h"
|
|
#include "advance_map.h"
|
|
#include "tinymt32.h"
|
|
|
|
void ShiftTorqueReductionController::update() {
|
|
if (engineConfiguration->torqueReductionEnabled) {
|
|
updateTriggerPinState();
|
|
updateTimeConditionSatisfied();
|
|
updateRpmConditionSatisfied();
|
|
updateAppConditionSatisfied();
|
|
|
|
isFlatShiftConditionSatisfied = torqueReductionTriggerPinState && isTimeConditionSatisfied
|
|
&& isRpmConditionSatisfied && isAppConditionSatisfied;
|
|
}
|
|
}
|
|
|
|
float ShiftTorqueReductionController::getSparkSkipRatio() const {
|
|
float result = 0.0f;
|
|
if (engineConfiguration->torqueReductionEnabled && isFlatShiftConditionSatisfied) {
|
|
result = engineConfiguration->torqueReductionIgnitionCut / 100.0f;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
void ShiftTorqueReductionController::updateTriggerPinState() {
|
|
switch (engineConfiguration->torqueReductionActivationMode) {
|
|
case TORQUE_REDUCTION_BUTTON: {
|
|
updateTriggerPinState(
|
|
engineConfiguration->torqueReductionTriggerPin,
|
|
engineConfiguration->torqueReductionTriggerPinInverted,
|
|
engine->engineState.lua.torqueReductionState
|
|
);
|
|
break;
|
|
}
|
|
case LAUNCH_BUTTON: {
|
|
updateTriggerPinState(
|
|
engineConfiguration->launchActivatePin,
|
|
engineConfiguration->launchActivateInverted,
|
|
false
|
|
);
|
|
break;
|
|
}
|
|
case TORQUE_REDUCTION_CLUTCH_DOWN_SWITCH: {
|
|
updateTriggerPinState(
|
|
engineConfiguration->clutchDownPin,
|
|
engineConfiguration->clutchDownPinInverted,
|
|
engine->engineState.lua.clutchDownState
|
|
);
|
|
break;
|
|
}
|
|
case TORQUE_REDUCTION_CLUTCH_UP_SWITCH: {
|
|
updateTriggerPinState(
|
|
engineConfiguration->clutchUpPin,
|
|
engineConfiguration->clutchUpPinInverted,
|
|
engine->engineState.lua.clutchUpState
|
|
);
|
|
break;
|
|
}
|
|
default: {
|
|
break; // we shouldn't be here!
|
|
}
|
|
}
|
|
}
|
|
|
|
void ShiftTorqueReductionController::updateTriggerPinState(
|
|
const switch_input_pin_e pin,
|
|
const bool isPinInverted,
|
|
const bool invalidPinState
|
|
) {
|
|
#if !EFI_SIMULATOR
|
|
isTorqueReductionTriggerPinValid = isBrainPinValid(pin);
|
|
const bool previousTorqueReductionTriggerPinState = torqueReductionTriggerPinState;
|
|
if (isTorqueReductionTriggerPinValid) {
|
|
torqueReductionTriggerPinState = isPinInverted ^ efiReadPin(pin);
|
|
} else {
|
|
torqueReductionTriggerPinState = invalidPinState;
|
|
}
|
|
if (!previousTorqueReductionTriggerPinState && torqueReductionTriggerPinState) {
|
|
m_pinTriggeredTimer.reset();
|
|
}
|
|
#endif // !EFI_SIMULATOR
|
|
}
|
|
|
|
void ShiftTorqueReductionController::updateTimeConditionSatisfied() {
|
|
isTimeConditionSatisfied = torqueReductionTriggerPinState
|
|
? !engineConfiguration->limitTorqueReductionTime ||
|
|
((0.0f < engineConfiguration->torqueReductionTime)
|
|
&& !m_pinTriggeredTimer.hasElapsedMs(engineConfiguration->torqueReductionTime)
|
|
)
|
|
: false;
|
|
}
|
|
|
|
void ShiftTorqueReductionController::updateRpmConditionSatisfied() {
|
|
const float currentRpm = Sensor::getOrZero(SensorType::Rpm);
|
|
isRpmConditionSatisfied = (engineConfiguration->torqueReductionArmingRpm <= currentRpm);
|
|
}
|
|
|
|
void ShiftTorqueReductionController::updateAppConditionSatisfied() {
|
|
const SensorResult currentApp = Sensor::get(SensorType::DriverThrottleIntent);
|
|
|
|
if (currentApp.Valid) {
|
|
isAppConditionSatisfied = (engineConfiguration->torqueReductionArmingApp <= currentApp.Value);
|
|
} else {
|
|
isAppConditionSatisfied = false;
|
|
}
|
|
}
|
|
|
|
#endif // EFI_LAUNCH_CONTROL
|