Output pin init/deinit needs a linked list #1803

This commit is contained in:
rusefillc 2020-11-05 17:23:09 -05:00
parent 310998d0ae
commit e7b1b80ce9
2 changed files with 39 additions and 11 deletions

View File

@ -62,15 +62,34 @@ RegisteredOutputPin::RegisteredOutputPin(const char *name, short pinOffset,
registeredOutputHead = this; registeredOutputHead = this;
} }
void RegisteredOutputPin::unregister() { bool RegisteredOutputPin::isPinConfigurationChanged() {
#if EFI_PROD_CODE #if EFI_PROD_CODE
brain_pin_e curPin = *(brain_pin_e *) ((void *) (&((char*)&activeConfiguration)[pinOffset])); brain_pin_e curPin = *(brain_pin_e *) ((void *) (&((char*)&activeConfiguration)[pinOffset]));
brain_pin_e newPin = *(brain_pin_e *) ((void *) (&((char*) engineConfiguration)[pinOffset])); brain_pin_e newPin = *(brain_pin_e *) ((void *) (&((char*) engineConfiguration)[pinOffset]));
pin_output_mode_e curMode = *(pin_output_mode_e *) ((void *) (&((char*)&activeConfiguration)[pinModeOffset])); pin_output_mode_e curMode = *(pin_output_mode_e *) ((void *) (&((char*)&activeConfiguration)[pinModeOffset]));
pin_output_mode_e newMode = *(pin_output_mode_e *) ((void *) (&((char*) engineConfiguration)[pinModeOffset])); pin_output_mode_e newMode = *(pin_output_mode_e *) ((void *) (&((char*) engineConfiguration)[pinModeOffset]));
return curPin != newPin || curMode != newMode;
#else
return false;
#endif // EFI_PROD_CODE
}
if (curPin != newPin || curMode != newMode) { void RegisteredOutputPin::init() {
#if EFI_PROD_CODE
brain_pin_e newPin = *(brain_pin_e *) ((void *) (&((char*) engineConfiguration)[pinOffset]));
pin_output_mode_e newMode = *(pin_output_mode_e *) ((void *) (&((char*) engineConfiguration)[pinModeOffset]));
if (isPinConfigurationChanged()) {
}
#endif // EFI_PROD_CODE
}
void RegisteredOutputPin::unregister() {
#if EFI_PROD_CODE
brain_pin_e curPin = *(brain_pin_e *) ((void *) (&((char*)&activeConfiguration)[pinOffset]));
if (isPinConfigurationChanged()) {
unregisterOutput(curPin); unregisterOutput(curPin);
} }
#endif // EFI_PROD_CODE #endif // EFI_PROD_CODE
@ -83,21 +102,21 @@ void RegisteredOutputPin::unregister() {
EnginePins::EnginePins() : EnginePins::EnginePins() :
mainRelay("mainRelay", CONFIG_PIN_OFFSETS(mainRelay)), mainRelay("Main relay", CONFIG_PIN_OFFSETS(mainRelay)),
hpfpValve("hpfpValve", CONFIG_PIN_OFFSETS(hpfpValve)), hpfpValve("hpfpValve", CONFIG_PIN_OFFSETS(hpfpValve)),
starterControl("starterControl", CONFIG_PIN_OFFSETS(starterControl)), starterControl("starterControl", CONFIG_PIN_OFFSETS(starterControl)),
starterRelayDisable("starterRelayDisable", CONFIG_PIN_OFFSETS(starterRelayDisable)), starterRelayDisable("starterRelayDisable", CONFIG_PIN_OFFSETS(starterRelayDisable)),
fanRelay("fanRelay", CONFIG_PIN_OFFSETS(fan)), fanRelay("Fan", CONFIG_PIN_OFFSETS(fan)),
acRelay("acRelay", CONFIG_PIN_OFFSETS(acRelay)), acRelay("A/C relay", CONFIG_PIN_OFFSETS(acRelay)),
fuelPumpRelay("fuelPump", CONFIG_PIN_OFFSETS(fuelPump)), fuelPumpRelay("Fuel pump", CONFIG_PIN_OFFSETS(fuelPump)),
boostPin("boostPin", CONFIG_PIN_OFFSETS(boostControl)), boostPin("Boost", CONFIG_PIN_OFFSETS(boostControl)),
idleSolenoidPin("idleSolenoid", idle_solenoidPin_offset, idle_solenoidPinMode_offset), idleSolenoidPin("Idle Valve", idle_solenoidPin_offset, idle_solenoidPinMode_offset),
secondIdleSolenoidPin("secondIdleSolenoid", CONFIG_OFFSET(secondSolenoidPin), idle_solenoidPinMode_offset), secondIdleSolenoidPin("Idle Valve#2", CONFIG_OFFSET(secondSolenoidPin), idle_solenoidPinMode_offset),
alternatorPin("alternatorPin", CONFIG_PIN_OFFSETS(alternatorControl)), alternatorPin("Alternator control", CONFIG_PIN_OFFSETS(alternatorControl)),
checkEnginePin("checkEnginePin", CONFIG_PIN_OFFSETS(malfunctionIndicator)), checkEnginePin("checkEnginePin", CONFIG_PIN_OFFSETS(malfunctionIndicator)),
// todo: NamedOutputPin vs RegisteredOutputPin // todo: NamedOutputPin vs RegisteredOutputPin
// tachOut("tachOut", CONFIG_PIN_OFFSETS(tachOutput)), // tachOut("tachOut", CONFIG_PIN_OFFSETS(tachOutput)),
triggerDecoderErrorPin("triggerDecoderErrorPin", CONFIG_PIN_OFFSETS(triggerError)), triggerDecoderErrorPin("led: trigger debug", CONFIG_PIN_OFFSETS(triggerError)),
hipCs("hipCs", CONFIG_PIN_OFFSETS(hip9011Cs)) hipCs("hipCs", CONFIG_PIN_OFFSETS(hip9011Cs))
{ {
tachOut.name = PROTOCOL_TACH_NAME; tachOut.name = PROTOCOL_TACH_NAME;
@ -212,6 +231,13 @@ void EnginePins::startPins(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
starterControl.initPin("Starter control", CONFIG(starterControlPin)); starterControl.initPin("Starter control", CONFIG(starterControlPin));
#endif /* EFI_ENGINE_CONTROL */ #endif /* EFI_ENGINE_CONTROL */
RegisteredOutputPin * pin = registeredOutputHead;
while (pin != nullptr) {
pin->init();
pin = pin->next;
}
initIfPinOrModeChanged(mainRelay, "Main relay", mainRelayPin, mainRelayPinMode); initIfPinOrModeChanged(mainRelay, "Main relay", mainRelayPin, mainRelayPinMode);
initIfPinOrModeChanged(fanRelay, "Fan", fanPin, fanPinMode); initIfPinOrModeChanged(fanRelay, "Fan", fanPin, fanPinMode);

View File

@ -132,12 +132,14 @@ public:
class RegisteredOutputPin : public OutputPin { class RegisteredOutputPin : public OutputPin {
public: public:
RegisteredOutputPin(const char *name, short pinOffset, short pinModeOffset); RegisteredOutputPin(const char *name, short pinOffset, short pinModeOffset);
void init();
void unregister(); void unregister();
RegisteredOutputPin *next; RegisteredOutputPin *next;
private: private:
const char *name; const char *name;
short pinOffset; short pinOffset;
short pinModeOffset; short pinModeOffset;
bool isPinConfigurationChanged();
}; };
class EnginePins { class EnginePins {