rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
controllers
tcu
gc_generic.cpp
Go to the documentation of this file.
1
#include "
pch.h
"
2
3
#include "math.h"
4
#include "
gc_generic.h
"
5
6
#if EFI_TCU
7
GenericGearController
genericGearController
;
8
9
GenericGearController::GenericGearController
() {
10
}
11
12
void
GenericGearController::init
() {
13
#if EFI_PROD_CODE
14
for
(
size_t
i = 0; i < efi::size(
engineConfiguration
->
tcu_rangeInput
); i++) {
15
if
(
isBrainPinValid
(
engineConfiguration
->
tcu_rangeInput
[i])) {
16
efiSetPadMode
(
"Range Input"
,
engineConfiguration
->
tcu_rangeInput
[i],
getInputMode
(
engineConfiguration
->
tcu_rangeInputMode
[i]));
17
}
18
}
19
#endif
/* EFI_PROD_CODE */
20
21
GearControllerBase::init
();
22
}
23
24
SensorType
GenericGearController::getAnalogSensorType
(
int
zeroBasedSensorIndex) {
25
return
static_cast<
SensorType
>
(zeroBasedSensorIndex +
static_cast<
int
>
(
SensorType::RangeInput1
));
26
}
27
28
bool
GenericGearController::isNearest
(
float
value,
int
pinIndex,
float
* rangeStates) {
29
float
distance = fabs(rangeStates[pinIndex] - value);
30
for
(
int
i = 1; i <= TCU_RANGE_COUNT; i++) {
31
float
pinDistance = fabs(
getRangeStateArray
(i)[pinIndex] - value);
32
if
(pinDistance < distance) {
33
return
false
;
34
}
35
}
36
return
true
;
37
}
38
39
void
GenericGearController::update
() {
40
SelectedGear
gear =
SelectedGear::Invalid
;
41
// Loop through possible range states
42
// 1 based because 0 is SelectedGear::Invalid
43
for
(
int
i = 1; i <= TCU_RANGE_COUNT; i++) {
44
float
*rangeStates =
getRangeStateArray
(i);
45
// Loop through inputs
46
for
(
size_t
p = 0; p < efi::size(
engineConfiguration
->
tcu_rangeInput
); p++) {
47
float
cellState = rangeStates[p];
48
// We allow the user to configure either a digital input or an analog input for each pin,
49
// so we need to check which is valid.
50
if
(
isAdcChannelValid
(
engineConfiguration
->
tcu_rangeAnalogInput
[p])) {
51
float
pinState =
Sensor::getOrZero
(
getAnalogSensorType
(p));
52
if
(
getRangeStateArray
(i)[p] == 0 ||
isNearest
(pinState, p, rangeStates)) {
53
// Set the gear to the one we're checking, and continue to the next pin
54
gear =
static_cast<
SelectedGear
>
(i);
55
}
else
{
56
// This possibility doesn't match, set to invalid
57
gear =
SelectedGear::Invalid
;
58
break
;
59
}
60
}
else
if
(
isBrainPinValid
(
engineConfiguration
->
tcu_rangeInput
[p])) {
61
bool
pinState =
efiReadPin
(
engineConfiguration
->
tcu_rangeInput
[p]) ^ (
engineConfiguration
->
tcu_rangeInputMode
[p] == PI_PULLUP);
62
// If the pin doesn't matter, or if it matches the cellState
63
if
(cellState == 2 || (pinState && cellState == 1) || (!pinState && cellState == 0)) {
64
// Set the gear to the one we're checking, and continue to the next pin
65
gear =
static_cast<
SelectedGear
>
(i);
66
}
else
{
67
// This possibility doesn't match, set to invalid
68
gear =
SelectedGear::Invalid
;
69
break
;
70
}
71
}
72
}
73
// If we didn't find it, try the next range
74
if
(gear ==
SelectedGear::Invalid
) {
75
continue
;
76
// We found a match
77
}
else
{
78
break
;
79
}
80
}
81
if
(gear !=
SelectedGear::Invalid
) {
82
switch
(gear) {
83
case
SelectedGear::Manual3
:
84
setDesiredGear
(
GEAR_3
);
85
break
;
86
case
SelectedGear::Manual2
:
87
setDesiredGear
(
GEAR_2
);
88
break
;
89
case
SelectedGear::Manual1
:
90
setDesiredGear
(
GEAR_1
);
91
break
;
92
case
SelectedGear::Reverse
:
93
setDesiredGear
(
REVERSE
);
94
break
;
95
case
SelectedGear::Park
:
96
case
SelectedGear::Neutral
:
97
setDesiredGear
(
NEUTRAL
);
98
break
;
99
case
SelectedGear::ManualPlus
:
100
// Only allow manual shift once per 500 ms,
101
// and if the selected range was Manual prior to this update
102
if
(!
shiftTimer
.hasElapsedMs(500) ||
lastRange
!=
SelectedGear::Manual
) {
103
break
;
104
}
105
shiftTimer
.reset();
106
switch
(
getDesiredGear
()) {
107
case
GEAR_1
:
108
setDesiredGear
(
GEAR_2
);
109
break
;
110
case
GEAR_2
:
111
setDesiredGear
(
GEAR_3
);
112
break
;
113
case
GEAR_3
:
114
setDesiredGear
(
GEAR_4
);
115
break
;
116
default
:
117
break
;
118
}
119
break
;
120
case
SelectedGear::ManualMinus
:
121
// Only allow manual shift once per 500 ms,
122
// and if the selected range was Manual prior to this update
123
if
(!
shiftTimer
.hasElapsedMs(500) ||
lastRange
!=
SelectedGear::Manual
) {
124
break
;
125
}
126
shiftTimer
.reset();
127
switch
(
getDesiredGear
()) {
128
case
GEAR_2
:
129
setDesiredGear
(
GEAR_1
);
130
break
;
131
case
GEAR_3
:
132
setDesiredGear
(
GEAR_2
);
133
break
;
134
case
GEAR_4
:
135
setDesiredGear
(
GEAR_3
);
136
break
;
137
default
:
138
break
;
139
}
140
break
;
141
case
SelectedGear::Drive
:
142
// If the gear selector is in drive, let AutomaticGearController,
143
// which this class inherits from, decide what gear the transmission should be in.
144
AutomaticGearController::update
();
145
return
;
146
default
:
147
break
;
148
}
149
150
lastRange
= gear;
151
}
152
153
GearControllerBase::update
();
154
}
155
156
GenericGearController
*
getGenericGearController
() {
157
return
&
genericGearController
;
158
}
159
#endif
// EFI_TCU
isAdcChannelValid
bool isAdcChannelValid(adc_channel_e hwChannel)
Definition
adc_inputs.h:23
efiSetPadMode
void efiSetPadMode(const char *msg, brain_pin_e brainPin, iomode_t mode)
Definition
bootloader_main.cpp:207
AutomaticGearController::update
void update()
Definition
gc_auto.cpp:11
GearControllerBase::init
virtual void init()
Definition
gear_controller.cpp:6
GearControllerBase::update
virtual void update()
Definition
gear_controller.cpp:28
GearControllerBase::getRangeStateArray
float * getRangeStateArray(int)
Definition
gear_controller.cpp:77
GearControllerBase::getDesiredGear
virtual gear_e getDesiredGear() const
Definition
gear_controller.cpp:47
GearControllerBase::setDesiredGear
virtual gear_e setDesiredGear(gear_e)
Definition
gear_controller.cpp:51
GenericGearController
Definition
gc_generic.h:7
GenericGearController::isNearest
bool isNearest(float value, int pinIndex, float *rangeStates)
Definition
gc_generic.cpp:28
GenericGearController::lastRange
SelectedGear lastRange
Definition
gc_generic.h:18
GenericGearController::getAnalogSensorType
SensorType getAnalogSensorType(int zeroBasedSensorIndex)
Definition
gc_generic.cpp:24
GenericGearController::GenericGearController
GenericGearController()
Definition
gc_generic.cpp:9
GenericGearController::shiftTimer
Timer shiftTimer
Definition
gc_generic.h:17
GenericGearController::update
void update()
Definition
gc_generic.cpp:39
GenericGearController::init
void init()
Definition
gc_generic.cpp:12
Sensor::getOrZero
static float getOrZero(SensorType type)
Definition
sensor.h:83
engineConfiguration
static constexpr engine_configuration_s * engineConfiguration
Definition
engine_configuration.h:81
genericGearController
GenericGearController genericGearController
Definition
gc_generic.cpp:7
getGenericGearController
GenericGearController * getGenericGearController()
Definition
gc_generic.cpp:156
gc_generic.h
getInputMode
iomode_t getInputMode(pin_input_mode_e mode)
Definition
io_pins.cpp:103
efiReadPin
bool efiReadPin(brain_pin_e pin)
Definition
io_pins.cpp:89
pch.h
isBrainPinValid
bool isBrainPinValid(brain_pin_e brainPin)
Definition
pin_repository.cpp:25
GEAR_2
@ GEAR_2
Definition
rusefi_enums.h:498
REVERSE
@ REVERSE
Definition
rusefi_enums.h:495
GEAR_1
@ GEAR_1
Definition
rusefi_enums.h:497
GEAR_4
@ GEAR_4
Definition
rusefi_enums.h:500
NEUTRAL
@ NEUTRAL
Definition
rusefi_enums.h:496
GEAR_3
@ GEAR_3
Definition
rusefi_enums.h:499
SelectedGear
SelectedGear
Definition
rusefi_enums.h:844
SelectedGear::Invalid
@ Invalid
SelectedGear::Reverse
@ Reverse
SelectedGear::Park
@ Park
SelectedGear::Manual2
@ Manual2
SelectedGear::ManualMinus
@ ManualMinus
SelectedGear::ManualPlus
@ ManualPlus
SelectedGear::Manual
@ Manual
SelectedGear::Manual1
@ Manual1
SelectedGear::Neutral
@ Neutral
SelectedGear::Drive
@ Drive
SelectedGear::Manual3
@ Manual3
SensorType
SensorType
Definition
sensor_type.h:18
SensorType::RangeInput1
@ RangeInput1
engine_configuration_s::tcu_rangeAnalogInput
adc_channel_e tcu_rangeAnalogInput[RANGE_INPUT_COUNT]
Definition
engine_configuration_generated_structures_alphax-2chan.h:5138
engine_configuration_s::tcu_rangeInputMode
pin_input_mode_e tcu_rangeInputMode[RANGE_INPUT_COUNT]
Definition
engine_configuration_generated_structures_alphax-2chan.h:4892
engine_configuration_s::tcu_rangeInput
switch_input_pin_e tcu_rangeInput[RANGE_INPUT_COUNT]
Definition
engine_configuration_generated_structures_alphax-2chan.h:4888
Generated on Fri Nov 7 2025 00:09:20 for rusEFI by
1.9.8