19#if EFI_ELECTRONIC_THROTTLE_BODY
26static const char*
const sparkNames[] = {
"Coil 1",
"Coil 2",
"Coil 3",
"Coil 4",
"Coil 5",
"Coil 6",
"Coil 7",
"Coil 8",
27 "Coil 9",
"Coil 10",
"Coil 11",
"Coil 12"};
29static const char*
const trailNames[] = {
"Trail 1",
"Trail 2",
"Trail 3",
"Trail 4",
"Trail 5",
"Trail 6",
"Trail 7",
"Trail 8",
30 "Trail 9",
"Trail 10",
"Trail 11",
"Trail 12"};
32static const char*
const trailShortNames[] = {
"r1",
"r2",
"r3",
"r4",
"r5",
"r6",
"r7",
"r8",
"r9",
"rA",
"rB",
"rD" };
47static const char*
const sparkShortNames[] = { PROTOCOL_COIL_SHORT_PREFIX
"1", PROTOCOL_COIL_SHORT_PREFIX
"2",
"c3",
"c4",
"c5",
"c6",
"c7",
"c8",
48 "c9",
"cA",
"cB",
"cD"};
50static const char*
const injectorNames[] = {
"Injector 1",
"Injector 2",
"Injector 3",
"Injector 4",
"Injector 5",
"Injector 6",
51 "Injector 7",
"Injector 8",
"Injector 9",
"Injector 10",
"Injector 11",
"Injector 12"};
53static const char*
const injectorShortNames[] = { PROTOCOL_INJ_SHORT_PREFIX
"1", PROTOCOL_INJ_SHORT_PREFIX
"2",
"i3",
"i4",
"i5",
"i6",
"i7",
"i8",
54 "i9",
"iA",
"iB",
"iC"};
56static const char*
const injectorStage2Names[] = {
"Injector Second Stage 1",
"Injector Second Stage 2",
"Injector Second Stage 3",
"Injector Second Stage 4",
"Injector Second Stage 5",
"Injector Second Stage 6",
57 "Injector Second Stage 7",
"Injector Second Stage 8",
"Injector Second Stage 9",
"Injector Second Stage 10",
"Injector Second Stage 11",
"Injector Second Stage 12"};
59static const char*
const injectorStage2ShortNames[] = { PROTOCOL_INJ_STAGE2_SHORT_PREFIX
"1", PROTOCOL_INJ_STAGE2_SHORT_PREFIX
"2",
"j3",
"j4",
"j5",
"j6",
"j7",
"j8",
60 "j9",
"jA",
"jB",
"jC"};
77 , registrationName(p_registrationName)
78 , m_pinOffset(static_cast<uint16_t>(pinOffset))
80 , m_pinModeOffset(static_cast<uint16_t>(pinModeOffset))
88 , registrationName(p_registrationName)
89 , m_pinOffset(static_cast<uint16_t>(pinOffset))
100 bool pinChanged = curPin != newPin;
108 return pinChanged || curMode != newMode;
118 newMode = OM_DEFAULT;
132#define CONFIG_OFFSET(x) (offsetof(engine_configuration_s, x))
135#define CONFIG_PIN_OFFSETS(x) CONFIG_OFFSET(x##Pin), CONFIG_OFFSET(x##PinMode)
139#define CONFIG_OFFSET2(x, y) (offsetof(engine_configuration_s, x) + offsetof(decltype(engine_configuration_s::x), y))
140#define CONFIG_PIN_OFFSETS2(x, y) CONFIG_OFFSET2(x, y##Pin), CONFIG_OFFSET2(x, y##PinMode)
144 mainRelay(
"Main Relay", CONFIG_PIN_OFFSETS(mainRelay)),
145 hpfpValve(
"HPFP Valve", CONFIG_PIN_OFFSETS(hpfpValve)),
146 starterControl(
"Starter Relay", CONFIG_PIN_OFFSETS(starterControl)),
148 fanRelay(
"Fan Relay", CONFIG_PIN_OFFSETS(fan)),
149 fanRelay2(
"Fan Relay 2", CONFIG_PIN_OFFSETS(fan2)),
150 acRelay(
"A/C Relay", CONFIG_PIN_OFFSETS(acRelay)),
151 fuelPumpRelay(
"Fuel pump Relay", CONFIG_PIN_OFFSETS(fuelPump)),
152 nitrousRelay(
"Nitrous Relay", CONFIG_PIN_OFFSETS(nitrousRelay)),
153 vvlRelay(
"VVL Relay", CONFIG_PIN_OFFSETS(vvlRelay)),
155 harleyAcr(
"Harley ACR", CONFIG_OFFSET(acrPin)),
156 harleyAcr2(
"Harley ACR 2", CONFIG_OFFSET(acrPin2)),
158 boostPin(
"Boost", CONFIG_PIN_OFFSETS(boostControl)),
159 idleSolenoidPin(
"Idle Valve", CONFIG_OFFSET2(idle, solenoidPin), CONFIG_OFFSET2(idle, solenoidPinMode)),
160 secondIdleSolenoidPin(
"Idle Valve#2", CONFIG_OFFSET(secondSolenoidPin), CONFIG_OFFSET2(idle, solenoidPinMode)),
162 checkEnginePin(
"checkEnginePin", CONFIG_PIN_OFFSETS(malfunctionIndicator)),
163 tachOut(
"tachOut", CONFIG_PIN_OFFSETS(tachOutput)),
164 triggerDecoderErrorPin(
"led: trigger debug", CONFIG_PIN_OFFSETS(triggerError)),
165 speedoOut(
"speedoOut", CONFIG_OFFSET(speedometerOutputPin))
172 static_assert(efi::size(
sparkNames) >= MAX_CYLINDER_COUNT,
"Too many ignition pins");
173 static_assert(efi::size(
trailNames) >= MAX_CYLINDER_COUNT,
"Too many ignition pins");
174 static_assert(efi::size(
injectorNames) >= MAX_CYLINDER_COUNT,
"Too many injection pins");
175 for (
int i = 0; i < MAX_CYLINDER_COUNT;i++) {
192 static_assert(efi::size(
auxValveShortNames) >= AUX_DIGITAL_VALVE_COUNT,
"Too many aux valve pins");
193 for (
int i = 0; i < AUX_DIGITAL_VALVE_COUNT;i++) {
202#define unregisterOutputIfPinChanged(output, pin) { \
203 if (isConfigurationChanged(pin)) { \
208#define unregisterOutputIfPinOrModeChanged(output, pin, mode) { \
209 if (isPinOrModeChanged(pin, mode)) { \
216 for (
int i = 0; i < MAX_CYLINDER_COUNT; i++) {
222 for (
int i = 0; i < AUX_DIGITAL_VALVE_COUNT; i++) {
235#if EFI_ELECTRONIC_THROTTLE_BODY
240 unregisterOutputIfPinChanged(
sdCsPin, sdCardCsPin);
244 while (
pin !=
nullptr) {
252 while (
pin !=
nullptr) {
253 efiPrintf(
"%s %d",
pin->getRegistrationName(),
pin->currentLogicValue);
259#if EFI_ENGINE_CONTROL
269 while (
pin !=
nullptr) {
276 for (
int i = 0; i < MAX_CYLINDER_COUNT;i++) {
284 for (
int i = 0; i < MAX_CYLINDER_COUNT; i++) {
285 unregisterOutputIfPinOrModeChanged(
enginePins.
coils[i], ignitionPins[i], ignitionPinMode);
291 for (
int i = 0; i < MAX_CYLINDER_COUNT; i++) {
292 unregisterOutputIfPinOrModeChanged(
enginePins.
injectors[i], injectionPins[i], injectionPinMode);
299 for (
int i = 0; i < AUX_DIGITAL_VALVE_COUNT; i++) {
302 if (isConfigurationChanged(auxValves[i])) {
310 for (
int i = 0; i < AUX_DIGITAL_VALVE_COUNT; i++) {
313 if (isConfigurationChanged(auxValves[i])) {
325 if (isPinOrModeChanged(trailingCoilPins[i], ignitionPinMode)) {
330 if (isPinOrModeChanged(ignitionPins[i], ignitionPinMode)) {
342 if (isPinOrModeChanged(injectionPins[i], injectionPinMode)) {
348 if (isPinOrModeChanged(injectionPinsStage2[i], injectionPinMode)) {
393 criticalError(
"Unexpected bench pin %d", index);
408 while (
pin !=
nullptr) {
445 efiPrintf(
"pin %s goes high",
name);
448#if EFI_DETAILED_LOGGING
455#if EFI_ENGINE_SNIFFER
467 efiPrintf(
"pin %s goes low",
name);
474#if EFI_ENGINE_SNIFFER
483 efiPrintf(
"turning off %s",
name);
560#if EFI_GPIO_HARDWARE && EFI_PROD_CODE
561#if (BOARD_EXT_GPIOCHIPS > 0)
594 setValue(
nullptr, logicValue, isForce);
634 efiPrintf(
"pin goes %d", logicValue);
648 int electricalValue = getElectricalValue(logicValue,
mode);
651 #if (BOARD_EXT_GPIOCHIPS > 0)
674 this->
mode = outputMode;
680#if BOARD_EXT_GPIOCHIPS > 0
697#if EFI_SHAFT_POSITION_INPUT
708 initPin(p_msg, p_brainPin, OM_DEFAULT);
721 chibios_rt::CriticalSectionLocker csl;
723 if (!forceInitWithFatalError && hasFirmwareError()) {
736 if (outputMode > OM_OPENDRAIN_INVERTED) {
745#if EFI_GPIO_HARDWARE && EFI_PROD_CODE
746 iomode_t l_mode = (outputMode == OM_DEFAULT || outputMode == OM_INVERTED) ?
747 PAL_MODE_OUTPUT_PUSHPULL : PAL_MODE_OUTPUT_OPENDRAIN;
749 #if (BOARD_EXT_GPIOCHIPS > 0)
758 criticalError(
"OutputPin::initPin got invalid port for pin idx %d",
static_cast<int>(p_brainPin));
762 #if (BOARD_EXT_GPIOCHIPS > 0)
777#if EFI_GPIO_HARDWARE && EFI_PROD_CODE
781 if (outputMode == OM_DEFAULT || outputMode == OM_INVERTED) {
782#ifndef DISABLE_PIN_STATE_VALIDATION
786 const int logicalValue =
787 (outputMode == OM_INVERTED)
793 criticalError(
"HARDWARE VALIDATION FAILED %s: unexpected startup pin state %s actual value=%d logical value=%d mode=%s", msg,
hwPortname(
brainPin), actualValue, logicalValue,
getPin_output_mode_e(outputMode));
806 chibios_rt::CriticalSectionLocker csl;
813#if (BOARD_EXT_GPIOCHIPS > 0)
817#if EFI_GPIO_HARDWARE && EFI_PROD_CODE
855 for (
int i = 0; i < MAX_CYLINDER_COUNT; i++) {
863#if EFI_PROD_CODE && HW_HELLEN
static SimplePwm alternatorControl("alt")
const char * getPin_output_mode_e(pin_output_mode_e value)
const OutputPin * getOutputOnTheBenchTest()
Utility methods related to bench testing.
void efiSetPadMode(const char *msg, brain_pin_e brainPin, iomode_t mode)
TunerStudioOutputChannels outputChannels
RegisteredOutputPin harleyAcr2
RegisteredNamedOutputPin harleyAcr
OutputPin accelerometerCs
InjectorOutputPin injectorsStage2[MAX_CYLINDER_COUNT]
RegisteredOutputPin mainRelay
NamedOutputPin auxValve[AUX_DIGITAL_VALVE_COUNT]
RegisteredOutputPin fanRelay
IgnitionOutputPin trailingCoils[MAX_CYLINDER_COUNT]
RegisteredOutputPin starterControl
OutputPin debugTriggerSync
void startInjectionPins()
InjectorOutputPin injectors[MAX_CYLINDER_COUNT]
RegisteredOutputPin fuelPumpRelay
RegisteredOutputPin acRelay
OutputPin * getOutputPinForBenchMode(bench_mode_e idx)
IgnitionOutputPin coils[MAX_CYLINDER_COUNT]
RegisteredOutputPin checkEnginePin
RegisteredOutputPin idleSolenoidPin
RegisteredNamedOutputPin hpfpValve
int8_t overlappingCounter
const char * getName() const
void setName(const char *)
const char * getShortName() const
Single output pin reference and state.
brain_pin_diag_e getDiag() const
uint32_t durationsInStateMs[2]
void initPin(const char *msg, brain_pin_e brainPin, pin_output_mode_e outputMode, bool forceInitWithFatalError=false)
bool getLogicValue() const
void setOnchipValue(int electricalValue)
bool getAndSet(int logicValue)
void setValue(const char *msg, int logicValue, bool isForce=false)
bool isInitialized() const
void setDefaultPinState(pin_output_mode_e mode)
RegisteredNamedOutputPin(const char *name, size_t pinOffset, size_t pinModeOffset)
const char *const registrationName
RegisteredOutputPin(const char *registrationName, size_t pinOffset, size_t pinModeOffset)
const uint16_t m_pinModeOffset
bool isPinConfigurationChanged()
const uint16_t m_pinOffset
void addConsoleAction(const char *token, Void callback)
Register console action without parameters.
int gpiochips_writePad(brain_pin_e pin, int value)
Set value to gpio of gpiochip.
brain_pin_diag_e gpiochips_getDiag(brain_pin_e pin)
Get diagnostic for given gpio.
ioportmask_t criticalErrorLedPin
static const char *const auxValveShortNames[]
static const char *const trailNames[]
static const char *const injectorNames[]
static RegisteredOutputPin * registeredOutputHead
ioportid_t criticalErrorLedPort
static const char *const sparkShortNames[]
uint8_t criticalErrorLedState
static const char *const injectorStage2Names[]
static const char *const sparkNames[]
static const char *const injectorShortNames[]
static const char *const injectorStage2ShortNames[]
static void initErrorLed(Gpio led)
void initMiscOutputPins()
static const char *const trailShortNames[]
ioportid_t getHwPort(const char *msg, brain_pin_e brainPin)
ioportmask_t getHwPin(const char *msg, brain_pin_e brainPin)
static EngineAccessor engine
engine_configuration_s & activeConfiguration
static constexpr engine_configuration_s * engineConfiguration
void addEngineSnifferOutputPinEvent(NamedOutputPin *pin, FrontDirection frontDirection)
rusEfi console wave sniffer
@ BENCH_AC_COMPRESSOR_RELAY
@ BENCH_CHECK_ENGINE_LIGHT
@ BENCH_STARTER_ENABLE_RELAY
bool warning(ObdCode code, const char *fmt,...)
void firmwareError(ObdCode code, const char *fmt,...)
uint32_t ioportmask_t
Digital I/O port sized unsigned type.
GPIO_TypeDef * ioportid_t
Port Identifier.
uint32_t iomode_t
Digital I/O modes.
void hellenDisableEnSilently()
void efiSetPadUnused(brain_pin_e brainPin)
void setMockState(brain_pin_e pin, bool state)
UNUSED(samplingTimeSeconds)
@ CUSTOM_INVALID_MODE_SETTING
@ CUSTOM_OBD_PIN_CONFLICT
const char * hwPortname(brain_pin_e brainPin)
bool brain_pin_is_onchip(brain_pin_e brainPin)
bool isBrainPinValid(brain_pin_e brainPin)
starterRelayDisable("starterRelayDisable", SensorCategory.SENSOR_INPUTS, FieldType.INT8, 401, 1.0, 0.0, 100.0, "")
output_pin_e trailingCoilPins[MAX_CYLINDER_COUNT]
Gpio auxValves[AUX_DIGITAL_VALVE_COUNT]
output_pin_e injectionPins[MAX_CYLINDER_COUNT]
pin_output_mode_e ignitionPinMode
output_pin_e injectionPinsStage2[MAX_CYLINDER_COUNT]
pin_output_mode_e injectionPinMode
output_pin_e ignitionPins[MAX_CYLINDER_COUNT]
OutputPin * getVvtOutputPin(int index)