add generic gear controller with range sensor inputs

This commit is contained in:
David Holdeman 2023-02-25 15:18:28 -06:00 committed by rusefillc
parent 0f98ad6837
commit ddc003cc04
11 changed files with 248 additions and 4 deletions

View File

@ -48,6 +48,7 @@
#include "fuel_schedule.h" #include "fuel_schedule.h"
#include "prime_injection.h" #include "prime_injection.h"
#include "throttle_model.h" #include "throttle_model.h"
#include "gc_generic.h"
#ifndef EFI_UNIT_TEST #ifndef EFI_UNIT_TEST
#error EFI_UNIT_TEST must be defined! #error EFI_UNIT_TEST must be defined!

View File

@ -61,6 +61,7 @@ CONTROLLERS_SRC_CPP = \
$(CONTROLLERS_DIR)/tcu/buttonshift.cpp \ $(CONTROLLERS_DIR)/tcu/buttonshift.cpp \
$(CONTROLLERS_DIR)/tcu/tcu.cpp \ $(CONTROLLERS_DIR)/tcu/tcu.cpp \
$(CONTROLLERS_DIR)/tcu/gear_controller.cpp \ $(CONTROLLERS_DIR)/tcu/gear_controller.cpp \
$(CONTROLLERS_DIR)/tcu/gc_generic.cpp \
$(CONTROLLERS_DIR)/tcu/simple_tcu.cpp \ $(CONTROLLERS_DIR)/tcu/simple_tcu.cpp \
$(CONTROLLERS_DIR)/tcu/tc_4l6x.cpp \ $(CONTROLLERS_DIR)/tcu/tc_4l6x.cpp \
$(CONTROLLERS_DIR)/shutdown_controller.cpp \ $(CONTROLLERS_DIR)/shutdown_controller.cpp \

View File

@ -60,6 +60,7 @@
#include "dynoview.h" #include "dynoview.h"
#include "vr_pwm.h" #include "vr_pwm.h"
#include "adc_subscription.h" #include "adc_subscription.h"
#include "gc_generic.h"
#if EFI_SENSOR_CHART #if EFI_SENSOR_CHART
#include "sensor_chart.h" #include "sensor_chart.h"

View File

@ -15,8 +15,8 @@ class ButtonShiftController: public GearControllerBase {
public: public:
ButtonShiftController(); ButtonShiftController();
void update() override; void update();
void init() override; void init();
GearControllerMode getMode() const { GearControllerMode getMode() const {
return GearControllerMode::ButtonShift; return GearControllerMode::ButtonShift;
} }

View File

@ -0,0 +1,107 @@
#include "pch.h"
#include "gc_generic.h"
#if EFI_TCU
GenericGearController genericGearController;
GenericGearController::GenericGearController() {
}
void GenericGearController::init() {
for (int i = 0; i < efi::size(engineConfiguration->tcu_rangeInput); i++) {
if (isBrainPinValid(engineConfiguration->tcu_rangeInput[i])) {
efiSetPadMode("Range Input", engineConfiguration->tcu_rangeInput[i], getInputMode(engineConfiguration->tcu_rangeInputMode[i]));
}
}
GearControllerBase::init();
}
void GenericGearController::update() {
SelectedGear gear = SelectedGear::Invalid;
// 1-9 because 0 is SelectedGear::Invalid
for (int i = 1; i <= 9; i++) {
uint8_t *rangeStates = getRangeStateArray(i);
for (int p = 0; p < efi::size(engineConfiguration->tcu_rangeInput); p++) {
int cellState = rangeStates[p];
if (!isBrainPinValid(engineConfiguration->tcu_rangeInput[p]) || cellState == 3) {
gear = SelectedGear::Invalid;
break;
}
bool pinState = efiReadPin(engineConfiguration->tcu_rangeInput[p]);
if (cellState == 2 || (pinState && cellState == 1) || (!pinState && cellState == 0)) {
gear = static_cast<SelectedGear>(i);
continue;
}
}
if (gear == SelectedGear::Invalid) {
continue;
} else {
break;
}
}
if (gear != SelectedGear::Invalid) {
switch (gear) {
case SelectedGear::Manual3 :
setDesiredGear(GEAR_3);
break;
case SelectedGear::Manual2 :
setDesiredGear(GEAR_2);
break;
case SelectedGear::Manual1 :
setDesiredGear(GEAR_1);
break;
case SelectedGear::Reverse :
setDesiredGear(REVERSE);
break;
case SelectedGear::Park :
case SelectedGear::Neutral :
setDesiredGear(NEUTRAL);
break;
case SelectedGear::ManualPlus :
switch (getDesiredGear()) {
case GEAR_1 :
setDesiredGear(GEAR_2);
break;
case GEAR_2 :
setDesiredGear(GEAR_3);
break;
case GEAR_3 :
setDesiredGear(GEAR_4);
break;
default:
break;
}
break;
case SelectedGear::ManualMinus :
switch (getDesiredGear()) {
case GEAR_2 :
setDesiredGear(GEAR_1);
break;
case GEAR_3 :
setDesiredGear(GEAR_2);
break;
case GEAR_4 :
setDesiredGear(GEAR_3);
break;
default:
break;
}
break;
case SelectedGear::Drive :
// TODO
// for Drive, need shift tables etc.
break;
default:
break;
}
}
GearControllerBase::update();
}
GenericGearController* getGenericGearController() {
return &genericGearController;
}
#endif // EFI_TCU

View File

@ -0,0 +1,18 @@
#pragma once
#include "gear_controller.h"
#if EFI_TCU
class GenericGearController: public GearControllerBase {
public:
GenericGearController();
void update();
void init();
GearControllerMode getMode() const {
return GearControllerMode::Generic;
}
};
GenericGearController* getGenericGearController();
#endif // EFI_TCU

View File

@ -55,10 +55,53 @@ void initGearController() {
case GearControllerMode::ButtonShift : case GearControllerMode::ButtonShift :
engine->gearController = getButtonShiftController(); engine->gearController = getButtonShiftController();
break; break;
case GearControllerMode::Generic :
engine->gearController = getGenericGearController();
break;
default : default :
engine->gearController = NULL; engine->gearController = NULL;
return; return;
} }
engine->gearController->init(); engine->gearController->init();
} }
uint8_t* GearControllerBase::getRangeStateArray(int i) {
switch (i) {
case 1 :
return config->tcu_rangePlus;
break;
case 2 :
return config->tcu_rangeMinus;
break;
case 3 :
return config->tcu_rangeP;
break;
case 4 :
return config->tcu_rangeR;
break;
case 5 :
return config->tcu_rangeN;
break;
case 6 :
return config->tcu_rangeD;
break;
case 7 :
return config->tcu_rangeM;
break;
case 8 :
return config->tcu_rangeM3;
break;
case 9 :
return config->tcu_rangeM2;
break;
case 10 :
return config->tcu_rangeM1;
break;
case 11 :
return config->tcu_rangeLow;
break;
default:
return NULL;
}
}
#endif // EFI_TCU #endif // EFI_TCU

View File

@ -20,6 +20,7 @@ protected:
virtual gear_e setDesiredGear(gear_e); virtual gear_e setDesiredGear(gear_e);
void initTransmissionController(); void initTransmissionController();
TransmissionControllerBase *transmissionController; TransmissionControllerBase *transmissionController;
uint8_t* getRangeStateArray(int);
private: private:
gear_e desiredGear = NEUTRAL; gear_e desiredGear = NEUTRAL;
void postState(); void postState();

View File

@ -30,7 +30,12 @@ gear_e TransmissionControllerBase::getCurrentGear() const {
void TransmissionControllerBase::postState() { void TransmissionControllerBase::postState() {
#if EFI_TUNER_STUDIO #if EFI_TUNER_STUDIO
engine->outputChannels.tcuCurrentGear = getCurrentGear(); auto iss = Sensor::get(SensorType::InputShaftSpeed);
auto rpm = Sensor::get(SensorType::Rpm);
if (iss.Valid && rpm.Valid) {
engine->outputChannels.tcRatio = rpm.Value / iss.Value;
}
engine->outputChannels.tcuCurrentGear = getCurrentGear();
#endif #endif
} }

View File

@ -160,6 +160,8 @@ struct_no_prefix engine_configuration_s
#define TCU_SOLENOID_COUNT 6 #define TCU_SOLENOID_COUNT 6
#define TCU_GEAR_COUNT 10 #define TCU_GEAR_COUNT 10
#define RANGE_INPUT_COUNT 6
! Matt says: The problem is the driver chip. Tle9201 can't do 20k. The drivers are too slow. On purpose to reduce EMI ! Matt says: The problem is the driver chip. Tle9201 can't do 20k. The drivers are too slow. On purpose to reduce EMI
! https://rusefi.com/forum/viewtopic.php?p=47307#p47307 ! https://rusefi.com/forum/viewtopic.php?p=47307#p47307
#define ETB_HW_MAX_FREQUENCY 3000 #define ETB_HW_MAX_FREQUENCY 3000
@ -1532,10 +1534,13 @@ pin_input_mode_e[LUA_DIGITAL_INPUT_COUNT iterate] luaDigitalInputPinModes;
uint32_t benchTestCount;How many test bench pulses do you want;"", 1, 0, 0, 10000000, 0 uint32_t benchTestCount;How many test bench pulses do you want;"", 1, 0, 0, 10000000, 0
uint8_t autoscale iacByTpsHoldTime;How long initial IAC adder is held before starting to decay.;"seconds", 0.1, 0, 0, 25, 1 uint8_t autoscale iacByTpsHoldTime;How long initial IAC adder is held before starting to decay.;"seconds", 0.1, 0, 0, 25, 1
uint8_t autoscale iacByTpsDecayTime;How long it takes to remove initial IAC adder to return to normal idle.;"seconds", 0.1, 0, 0, 25, 1 uint8_t autoscale iacByTpsDecayTime;How long it takes to remove initial IAC adder to return to normal idle.;"seconds", 0.1, 0, 0, 25, 1
switch_input_pin_e[RANGE_INPUT_COUNT iterate] tcu_rangeInput;
pin_input_mode_e[RANGE_INPUT_COUNT iterate] tcu_rangeInputMode;
! !
! Just a shortcut to facilitate compatible configuration changes, i.e. a change which does not touch FLASH_DATA_VERSION and thus does not require manual tune migration ! Just a shortcut to facilitate compatible configuration changes, i.e. a change which does not touch FLASH_DATA_VERSION and thus does not require manual tune migration
! !
uint8_t[214] mainUnusedEnd;;"units", 1, 0, 0, 1, 0 uint8_t[194] mainUnusedEnd;;"units", 1, 0, 0, 1, 0
! end of engine_configuration_s ! end of engine_configuration_s
end_struct end_struct
@ -1780,6 +1785,18 @@ uint16_t[12] autoscale throttleEstimateEffectiveAreaValues;In units of g/s norma
blend_table_s[BOOST_BLEND_COUNT iterate] boostOpenLoopBlends blend_table_s[BOOST_BLEND_COUNT iterate] boostOpenLoopBlends
blend_table_s[BOOST_BLEND_COUNT iterate] boostClosedLoopBlends blend_table_s[BOOST_BLEND_COUNT iterate] boostClosedLoopBlends
uint8_t[6] tcu_rangeP;;"level", 1, 0, 0, 3, 0
uint8_t[6] tcu_rangeR;;"level", 1, 0, 0, 3, 0
uint8_t[6] tcu_rangeN;;"level", 1, 0, 0, 3, 0
uint8_t[6] tcu_rangeD;;"level", 1, 0, 0, 3, 0
uint8_t[6] tcu_rangeM;;"level", 1, 0, 0, 3, 0
uint8_t[6] tcu_rangeM3;;"level", 1, 0, 0, 3, 0
uint8_t[6] tcu_rangeM2;;"level", 1, 0, 0, 3, 0
uint8_t[6] tcu_rangeM1;;"level", 1, 0, 0, 3, 0
uint8_t[6] tcu_rangePlus;;"level", 1, 0, 0, 3, 0
uint8_t[6] tcu_rangeMinus;;"level", 1, 0, 0, 3, 0
uint8_t[6] tcu_rangeLow;;"level", 1, 0, 0, 3, 0
end_struct end_struct
! Pedal Position Sensor ! Pedal Position Sensor

View File

@ -205,6 +205,9 @@ enable2ndByteCanID = false
gearCountArray = array, S08, [@@TCU_GEAR_COUNT@@], "Gear", 1, 0, -1, { @@TCU_GEAR_COUNT@@ - 2 }, 0, noMsqSave gearCountArray = array, S08, [@@TCU_GEAR_COUNT@@], "Gear", 1, 0, -1, { @@TCU_GEAR_COUNT@@ - 2 }, 0, noMsqSave
solenoidCountArray = array, U08, [@@TCU_SOLENOID_COUNT@@], "Solenoid", 1, 0, 1, @@TCU_SOLENOID_COUNT@@, 0, noMsqSave solenoidCountArray = array, U08, [@@TCU_SOLENOID_COUNT@@], "Solenoid", 1, 0, 1, @@TCU_SOLENOID_COUNT@@, 0, noMsqSave
rangeInputArray = array, U08, [6], "Input", 1, 0, 0, 6, 0, noMsqSave
rangeStateArray = array, U08, [9], "State", 1, 0, 0, 9, 0, noMsqSave
; wall of debug mode :) ; wall of debug mode :)
; https://rusefi.com/wiki/index.php?title=Manual:Debug_fields ; https://rusefi.com/wiki/index.php?title=Manual:Debug_fields
; Alternator TPS Acceleration Idle Engine Load Acc Trigger Counters VVT1 PID Cranking Ignition Timing Fu Corr VSS SD Card Knock Wall Wetting ETB PID Executor InstantRpm CJ125 CAN MAP TLE8888 Analog inputs 2 Start ETB Autotune DYNO_VIEW LOGIC_ANALYZER Wideband TCU Lua VVT2 PID VVT3 PID VVT4 PID ; Alternator TPS Acceleration Idle Engine Load Acc Trigger Counters VVT1 PID Cranking Ignition Timing Fu Corr VSS SD Card Knock Wall Wetting ETB PID Executor InstantRpm CJ125 CAN MAP TLE8888 Analog inputs 2 Start ETB Autotune DYNO_VIEW LOGIC_ANALYZER Wideband TCU Lua VVT2 PID VVT3 PID VVT4 PID
@ -314,6 +317,10 @@ enable2ndByteCanID = false
defaultValue = solenoidCountArray, 1 2 3 4 5 6 7 8 defaultValue = solenoidCountArray, 1 2 3 4 5 6 7 8
readOnly = solenoidCountArray readOnly = solenoidCountArray
defaultValue = rangeStateArray, 0 1 2 3 4 5 6 7 8
readOnly = rangeStateArray
defaultValue = rangeInputArray, 0 1 2 3 4 5
readOnly = solenoidCountArray
[CurveEditor] [CurveEditor]
; xAxis = leftValue, rightValue, step ; xAxis = leftValue, rightValue, step
@ -720,6 +727,34 @@ curve = 32Curve, "3-2 Shift Solenoid Percent by Speed"
xBins = tcu_32SpeedBins, vehicleSpeedKph xBins = tcu_32SpeedBins, vehicleSpeedKph
yBins = tcu_32Vals yBins = tcu_32Vals
curve = rangeMatrix, "Range Switch Input Matrix"
columnLabel = "Pin", ""
xAxis = 0, 6, 6
yAxis = 0, 3, 3
xBins = rangeInputArray
yBins = tcu_rangeP
yBins = tcu_rangeR
yBins = tcu_rangeN
yBins = tcu_rangeD
yBins = tcu_rangeM
yBins = tcu_rangeM3
yBins = tcu_rangeM2
yBins = tcu_rangeM1
yBins = tcu_rangePlus
yBins = tcu_rangeMinus
yBins = tcu_rangeLow
lineLabel = "Park"
lineLabel = "Reverse"
lineLabel = "Neutral"
lineLabel = "Drive"
lineLabel = "Manual"
lineLabel = "Manual 3rd"
lineLabel = "Manual 2nd"
lineLabel = "Manual 1st"
lineLabel = "Manual +"
lineLabel = "Manual -"
lineLabel = "Low"
curve = ignAdder1Bias, "Ignition adder 1 bias" curve = ignAdder1Bias, "Ignition adder 1 bias"
columnLabel = "param", "bias" columnLabel = "param", "bias"
xAxis = 0, 100, 11 xAxis = 0, 100, 11
@ -1869,6 +1904,7 @@ menuDialog = main
# subMenu = pcPerGearDialog, "Line Pressure Per Gear" # subMenu = pcPerGearDialog, "Line Pressure Per Gear"
# subMenu = pcPerShiftDialog, "Line Pressure Per Shift" # subMenu = pcPerShiftDialog, "Line Pressure Per Shift"
# subMenu = 32Dialog, "3-2 Shift Solenoid Percent by Speed" # subMenu = 32Dialog, "3-2 Shift Solenoid Percent by Speed"
# subMenu = rangeMatrixDialog, "Range Selector Input Matrix"
menu = "&Sensors" menu = "&Sensors"
# Base analog input settings # Base analog input settings
@ -3945,6 +3981,16 @@ cmd_set_engine_type_default = "@@TS_IO_TEST_COMMAND_char@@@@ts_command_e_TS_
field = "Filter parameter", issFilterReciprocal, { tcuInputSpeedSensorPin != @@ADC_CHANNEL_NONE@@ } field = "Filter parameter", issFilterReciprocal, { tcuInputSpeedSensorPin != @@ADC_CHANNEL_NONE@@ }
field = "Tooth Count", tcuInputSpeedSensorTeeth field = "Tooth Count", tcuInputSpeedSensorTeeth
dialog = rangeMatrixInputPanel, "Range Selector Inputs"
field = "Input 1 Pin", tcu_rangeInput1, { tcuEnabled }
field = "Input 1 Pin Mode", tcu_rangeInputMode1, { tcuEnabled }
field = "Input 2 Pin", tcu_rangeInput2, { tcuEnabled }
field = "Input 2 Pin Mode", tcu_rangeInputMode2, { tcuEnabled }
field = "Input 3 Pin", tcu_rangeInput3, { tcuEnabled }
field = "Input 3 Pin Mode", tcu_rangeInputMode3, { tcuEnabled }
field = "Input 4 Pin", tcu_rangeInput4, { tcuEnabled }
field = "Input 4 Pin Mode", tcu_rangeInputMode4, { tcuEnabled }
dialog = tcuControls, "Transmission Settings" dialog = tcuControls, "Transmission Settings"
panel = transmissionPanel panel = transmissionPanel
panel = shiftSolenoidPanel panel = shiftSolenoidPanel
@ -3952,6 +3998,7 @@ dialog = tcuControls, "Transmission Settings"
dialog = gearControls, "Gear Selection Settings" dialog = gearControls, "Gear Selection Settings"
panel = buttonShiftInputPanel panel = buttonShiftInputPanel
panel = rangeMatrixInputPanel
dialog = inputSpeedSensor, "Input Speed Sensor" dialog = inputSpeedSensor, "Input Speed Sensor"
panel = inputSpeedSensorPanel panel = inputSpeedSensorPanel
@ -3968,6 +4015,9 @@ dialog = tcuControls, "Transmission Settings"
dialog = 32Dialog, "3-2 Shift Solenoid Percent by Speed" dialog = 32Dialog, "3-2 Shift Solenoid Percent by Speed"
panel = 32Curve panel = 32Curve
dialog = rangeMatrixDialog, "Range Selector Input Matrix"
panel = rangeMatrix
;Boost Open Loop ;Boost Open Loop
dialog = boostDialog, "" dialog = boostDialog, ""