fome-fw/firmware/controllers/system/injection_gpio.cpp

71 lines
1.8 KiB
C++

/*
* injection_gpio.cpp
*/
#include "pch.h"
extern bool printFuelDebug;
InjectorOutputPin::InjectorOutputPin() : NamedOutputPin() {
m_overlappingCounter = 1; // Force update in reset
reset();
injectorIndex = -1;
}
void InjectorOutputPin::open(efitick_t nowNt) {
// per-output counter for error detection
m_overlappingCounter++;
// global counter for logging
getEngineState()->fuelInjectionCounter++;
#if FUEL_MATH_EXTREME_LOGGING
if (printFuelDebug) {
printf("InjectorOutputPin::open %s %d now=%0.1fms\r\n", getName(), m_overlappingCounter, (int)getTimeNowUs() / 1000.0);
}
#endif /* FUEL_MATH_EXTREME_LOGGING */
if (m_overlappingCounter > 1) {
// /**
// * #299
// * this is another kind of overlap which happens in case of a small duty cycle after a large duty cycle
// */
#if FUEL_MATH_EXTREME_LOGGING
if (printFuelDebug) {
printf("overlapping, no need to touch pin %s %d\r\n", getName(), (int)getTimeNowUs());
}
#endif /* FUEL_MATH_EXTREME_LOGGING */
} else {
#if EFI_TOOTH_LOGGER
LogTriggerInjectorState(nowNt, true);
#endif // EFI_TOOTH_LOGGER
setHigh();
}
}
void InjectorOutputPin::close(efitick_t nowNt) {
#if FUEL_MATH_EXTREME_LOGGING
if (printFuelDebug) {
printf("InjectorOutputPin::close %s %d %d\r\n", getName(), m_overlappingCounter, (int)getTimeNowUs());
}
#endif /* FUEL_MATH_EXTREME_LOGGING */
m_overlappingCounter--;
if (m_overlappingCounter > 0) {
#if FUEL_MATH_EXTREME_LOGGING
if (printFuelDebug) {
printf("was overlapping, no need to touch pin %s %d\r\n", getName(), (int)getTimeNowUs());
}
#endif /* FUEL_MATH_EXTREME_LOGGING */
} else {
#if EFI_TOOTH_LOGGER
LogTriggerInjectorState(nowNt, false);
#endif // EFI_TOOTH_LOGGER
setLow();
}
// Don't allow negative overlap count
if (m_overlappingCounter < 0) {
m_overlappingCounter = 0;
}
}