something is over-complicated here? looks like two classes should become one?

This commit is contained in:
rusefi 2019-10-08 02:56:19 -04:00
parent a65c8c9295
commit 2acdbf308b
7 changed files with 42 additions and 85 deletions

View File

@ -17,28 +17,6 @@
class Engine; class Engine;
class InjectionEvent;
class InjectionSignalPair {
public:
InjectionSignalPair();
scheduling_s signalTimerUp;
scheduling_s endOfInjectionEvent;
/**
* we need atomic flag so that we do not schedule a new pair of up/down before previous down was executed.
*
* That's because we want to be sure that no 'down' side callback would be ignored since we are counting to see
* overlaps so we need the end counter to always have zero.
* TODO: make watchdog decrement relevant counter
*/
bool isScheduled;
InjectorOutputPin *outputs[MAX_WIRES_COUNT];
InjectionEvent *event;
};
class InjectionEvent { class InjectionEvent {
public: public:
InjectionEvent(); InjectionEvent();
@ -54,7 +32,17 @@ public:
#endif #endif
event_trigger_position_s injectionStart; event_trigger_position_s injectionStart;
InjectionSignalPair pair; scheduling_s signalTimerUp;
scheduling_s endOfInjectionEvent;
/**
* we need atomic flag so that we do not schedule a new pair of up/down before previous down was executed.
*
* That's because we want to be sure that no 'down' side callback would be ignored since we are counting to see
* overlaps so we need the end counter to always have zero.
* TODO: make watchdog decrement relevant counter
*/
bool isScheduled = false;
}; };

View File

@ -12,7 +12,6 @@ CONTROLLERS_SRC_CPP = \
$(CONTROLLERS_DIR)/actuators/algo/aux_pid.cpp \ $(CONTROLLERS_DIR)/actuators/algo/aux_pid.cpp \
$(CONTROLLERS_DIR)/actuators/lcd_controller.cpp \ $(CONTROLLERS_DIR)/actuators/lcd_controller.cpp \
$(CONTROLLERS_DIR)/scheduling/signal_executor_sleep.cpp \ $(CONTROLLERS_DIR)/scheduling/signal_executor_sleep.cpp \
$(CONTROLLERS_DIR)/scheduling/signal_executor.cpp \
$(CONTROLLERS_DIR)/scheduling/single_timer_executor.cpp \ $(CONTROLLERS_DIR)/scheduling/single_timer_executor.cpp \
$(CONTROLLERS_DIR)/scheduling/pwm_generator_logic.cpp \ $(CONTROLLERS_DIR)/scheduling/pwm_generator_logic.cpp \
$(CONTROLLERS_DIR)/scheduling/event_queue.cpp \ $(CONTROLLERS_DIR)/scheduling/event_queue.cpp \

View File

@ -22,27 +22,4 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "global.h"
#include "signal_executor.h"
#include "efi_gpio.h"
#include "engine.h"
/**
* Signal executors feed digital events right into WaveChart used by Engine Sniffer tab of rusEfi Console
*/
#include "rpm_calculator.h"
EXTERN_ENGINE;
#if EFI_ENGINE_SNIFFER
#include "engine_sniffer.h"
extern WaveChart waveChart;
#endif /* EFI_ENGINE_SNIFFER */
#include "efi_gpio.h"
InjectionSignalPair::InjectionSignalPair() {
isScheduled = false;
memset(outputs, 0, sizeof(outputs));
event = nullptr;
}

View File

@ -129,9 +129,9 @@ static inline void tempTurnPinHigh(InjectorOutputPin *output) {
} }
// todo: make these macro? kind of a penny optimization if compiler is not smart to inline // todo: make these macro? kind of a penny optimization if compiler is not smart to inline
void seTurnPinHigh(InjectionSignalPair *pair) { void seTurnPinHigh(InjectionEvent *event) {
for (int i = 0;i < MAX_WIRES_COUNT;i++) { for (int i = 0;i < MAX_WIRES_COUNT;i++) {
InjectorOutputPin *output = pair->outputs[i]; InjectorOutputPin *output = event->outputs[i];
if (output != NULL) { if (output != NULL) {
tempTurnPinHigh(output); tempTurnPinHigh(output);
} }
@ -177,25 +177,24 @@ static inline void tempTurnPinLow(InjectorOutputPin *output) {
} }
} }
void seTurnPinLow(InjectionSignalPair *pair) { void seTurnPinLow(InjectionEvent *event) {
pair->isScheduled = false; event->isScheduled = false;
for (int i = 0;i<MAX_WIRES_COUNT;i++) { for (int i = 0;i<MAX_WIRES_COUNT;i++) {
InjectorOutputPin *output = pair->outputs[i]; InjectorOutputPin *output = event->outputs[i];
if (output != NULL) { if (output != NULL) {
tempTurnPinLow(output); tempTurnPinLow(output);
} }
} }
efiAssertVoid(CUSTOM_EVENT_6626, pair->event != NULL, "pair event");
#if EFI_UNIT_TEST #if EFI_UNIT_TEST
Engine *engine = pair->event->engine; Engine *engine = event->engine;
EXPAND_Engine; EXPAND_Engine;
#endif #endif
ENGINE(injectionEvents.addFuelEventsForCylinder(pair->event->ownIndex PASS_ENGINE_PARAMETER_SUFFIX)); ENGINE(injectionEvents.addFuelEventsForCylinder(event->ownIndex PASS_ENGINE_PARAMETER_SUFFIX));
} }
static void sescheduleByTimestamp(scheduling_s *scheduling, efitimeus_t time, schfunc_t callback, InjectionSignalPair *pair DECLARE_ENGINE_PARAMETER_SUFFIX) { static void sescheduleByTimestamp(scheduling_s *scheduling, efitimeus_t time, schfunc_t callback, InjectionEvent *event DECLARE_ENGINE_PARAMETER_SUFFIX) {
#if FUEL_MATH_EXTREME_LOGGING #if FUEL_MATH_EXTREME_LOGGING
InjectorOutputPin *param = pair->outputs[0]; InjectorOutputPin *param = event->outputs[0];
// scheduleMsg(&sharedLogger, "schX %s %x %d", prefix, scheduling, time); // scheduleMsg(&sharedLogger, "schX %s %x %d", prefix, scheduling, time);
// scheduleMsg(&sharedLogger, "schX %s", param->name); // scheduleMsg(&sharedLogger, "schX %s", param->name);
@ -203,7 +202,7 @@ static void sescheduleByTimestamp(scheduling_s *scheduling, efitimeus_t time, sc
printf("seScheduleByTime %s %s %d sch=%d\r\n", direction, param->name, (int)time, (int)scheduling); printf("seScheduleByTime %s %s %d sch=%d\r\n", direction, param->name, (int)time, (int)scheduling);
#endif /* FUEL_MATH_EXTREME_LOGGING || EFI_UNIT_TEST */ #endif /* FUEL_MATH_EXTREME_LOGGING || EFI_UNIT_TEST */
engine->executor.scheduleByTimestamp(scheduling, time, callback, pair); engine->executor.scheduleByTimestamp(scheduling, time, callback, event);
} }
static ALWAYS_INLINE void handleFuelInjectionEvent(int injEventIndex, InjectionEvent *event, static ALWAYS_INLINE void handleFuelInjectionEvent(int injEventIndex, InjectionEvent *event,
@ -271,7 +270,6 @@ static ALWAYS_INLINE void handleFuelInjectionEvent(int injEventIndex, InjectionE
getRevolutionCounter()); getRevolutionCounter());
#endif /* EFI_DEFAILED_LOGGING */ #endif /* EFI_DEFAILED_LOGGING */
InjectionSignalPair *pair = &event->pair;
if (event->isSimultanious) { if (event->isSimultanious) {
/** /**
@ -280,9 +278,9 @@ static ALWAYS_INLINE void handleFuelInjectionEvent(int injEventIndex, InjectionE
* changed into 'scheduleInjection' and unified? todo: think about it. * changed into 'scheduleInjection' and unified? todo: think about it.
*/ */
scheduling_s * sUp = &pair->signalTimerUp; scheduling_s * sUp = &event->signalTimerUp;
// todo: sequential need this logic as well, just do not forget to clear flag pair->isScheduled = true; // todo: sequential need this logic as well, just do not forget to clear flag event->isScheduled = true;
scheduling_s * sDown = &pair->endOfInjectionEvent; scheduling_s * sDown = &event->endOfInjectionEvent;
engine->executor.scheduleForLater(sUp, (int) injectionStartDelayUs, (schfunc_t) &startSimultaniousInjection, engine); engine->executor.scheduleForLater(sUp, (int) injectionStartDelayUs, (schfunc_t) &startSimultaniousInjection, engine);
engine->executor.scheduleForLater(sDown, (int) injectionStartDelayUs + durationUs, engine->executor.scheduleForLater(sDown, (int) injectionStartDelayUs + durationUs,
@ -314,19 +312,16 @@ static ALWAYS_INLINE void handleFuelInjectionEvent(int injEventIndex, InjectionE
#endif /*EFI_PRINTF_FUEL_DETAILS */ #endif /*EFI_PRINTF_FUEL_DETAILS */
if (pair->isScheduled) { if (event->isScheduled) {
#if EFI_UNIT_TEST || EFI_SIMULATOR #if EFI_UNIT_TEST || EFI_SIMULATOR
printf("still used1 %s %d\r\n", output->name, (int)getTimeNowUs()); printf("still used1 %s %d\r\n", output->name, (int)getTimeNowUs());
#endif /* EFI_UNIT_TEST || EFI_SIMULATOR */ #endif /* EFI_UNIT_TEST || EFI_SIMULATOR */
return; // this InjectionSignalPair is still needed for an extremely long injection scheduled previously return; // this InjectionEvent is still needed for an extremely long injection scheduled previously
} }
pair->outputs[0] = output; scheduling_s * sUp = &event->signalTimerUp;
pair->outputs[1] = event->outputs[1]; scheduling_s * sDown = &event->endOfInjectionEvent;
scheduling_s * sUp = &pair->signalTimerUp;
scheduling_s * sDown = &pair->endOfInjectionEvent;
pair->isScheduled = true; event->isScheduled = true;
pair->event = event;
efitimeus_t turnOnTime = nowUs + (int) injectionStartDelayUs; efitimeus_t turnOnTime = nowUs + (int) injectionStartDelayUs;
bool isSecondaryOverlapping = turnOnTime < output->overlappingScheduleOffTime; bool isSecondaryOverlapping = turnOnTime < output->overlappingScheduleOffTime;
@ -336,10 +331,10 @@ static ALWAYS_INLINE void handleFuelInjectionEvent(int injEventIndex, InjectionE
printf("please cancel %s %d %d\r\n", output->name, (int)getTimeNowUs(), output->overlappingCounter); printf("please cancel %s %d %d\r\n", output->name, (int)getTimeNowUs(), output->overlappingCounter);
#endif /* EFI_UNIT_TEST || EFI_SIMULATOR */ #endif /* EFI_UNIT_TEST || EFI_SIMULATOR */
} else { } else {
sescheduleByTimestamp(sUp, turnOnTime, (schfunc_t) &seTurnPinHigh, pair PASS_ENGINE_PARAMETER_SUFFIX); sescheduleByTimestamp(sUp, turnOnTime, (schfunc_t) &seTurnPinHigh, event PASS_ENGINE_PARAMETER_SUFFIX);
} }
efitimeus_t turnOffTime = nowUs + (int) (injectionStartDelayUs + durationUs); efitimeus_t turnOffTime = nowUs + (int) (injectionStartDelayUs + durationUs);
sescheduleByTimestamp(sDown, turnOffTime, (schfunc_t) &seTurnPinLow, pair PASS_ENGINE_PARAMETER_SUFFIX); sescheduleByTimestamp(sDown, turnOffTime, (schfunc_t) &seTurnPinLow, event PASS_ENGINE_PARAMETER_SUFFIX);
} }
} }
@ -582,7 +577,7 @@ void startPrimeInjectionPulse(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
primeInjEvent.ownIndex = 0; primeInjEvent.ownIndex = 0;
primeInjEvent.isSimultanious = true; primeInjEvent.isSimultanious = true;
scheduling_s *sDown = &ENGINE(injectionEvents.elements[0].pair).endOfInjectionEvent; scheduling_s *sDown = &ENGINE(injectionEvents.elements[0]).endOfInjectionEvent;
// When the engine is hot, basically we don't need prime inj.pulse, so we use an interpolation over temperature (falloff). // When the engine is hot, basically we don't need prime inj.pulse, so we use an interpolation over temperature (falloff).
// If 'primeInjFalloffTemperature' is not specified (by default), we have a prime pulse deactivation at zero celsius degrees, which is okay. // If 'primeInjFalloffTemperature' is not specified (by default), we have a prime pulse deactivation at zero celsius degrees, which is okay.
const float maxPrimeInjAtTemperature = -40.0f; // at this temperature the pulse is maximal. const float maxPrimeInjAtTemperature = -40.0f; // at this temperature the pulse is maximal.

View File

@ -24,8 +24,8 @@ void showMainHistogram(void);
void startSimultaniousInjection(Engine *engine); void startSimultaniousInjection(Engine *engine);
void endSimultaniousInjection(InjectionEvent *event); void endSimultaniousInjection(InjectionEvent *event);
void seTurnPinHigh(InjectionSignalPair *pair); void seTurnPinHigh(InjectionEvent *event);
void seTurnPinLow(InjectionSignalPair *pair); void seTurnPinLow(InjectionEvent *event);
float getFuel(int rpm, float key); float getFuel(int rpm, float key);

View File

@ -152,13 +152,13 @@ void EngineTestHelper::fireTriggerEvents(int count) {
} }
void EngineTestHelper::assertInjectorUpEvent(const char *msg, int eventIndex, efitime_t momentX, long injectorIndex) { void EngineTestHelper::assertInjectorUpEvent(const char *msg, int eventIndex, efitime_t momentX, long injectorIndex) {
InjectionSignalPair *pair = &engine.injectionEvents.elements[injectorIndex].pair; InjectionEvent *event = &engine.injectionEvents.elements[injectorIndex];
assertEvent(msg, eventIndex, (void*)seTurnPinHigh, momentX, (long)pair); assertEvent(msg, eventIndex, (void*)seTurnPinHigh, momentX, event);
} }
void EngineTestHelper::assertInjectorDownEvent(const char *msg, int eventIndex, efitime_t momentX, long injectorIndex) { void EngineTestHelper::assertInjectorDownEvent(const char *msg, int eventIndex, efitime_t momentX, long injectorIndex) {
InjectionSignalPair *pair = &engine.injectionEvents.elements[injectorIndex].pair; InjectionEvent *event = &engine.injectionEvents.elements[injectorIndex];
assertEvent(msg, eventIndex, (void*)seTurnPinLow, momentX, (long)pair); assertEvent(msg, eventIndex, (void*)seTurnPinLow, momentX, event);
} }
scheduling_s * EngineTestHelper::assertEvent5(const char *msg, int index, void *callback, efitime_t expectedTimestamp) { scheduling_s * EngineTestHelper::assertEvent5(const char *msg, int index, void *callback, efitime_t expectedTimestamp) {
@ -171,14 +171,12 @@ scheduling_s * EngineTestHelper::assertEvent5(const char *msg, int index, void *
return event; return event;
} }
void EngineTestHelper::assertEvent(const char *msg, int index, void *callback, efitime_t momentX, long param) { void EngineTestHelper::assertEvent(const char *msg, int index, void *callback, efitime_t momentX, InjectionEvent *expectedEvent) {
scheduling_s *event = assertEvent5(msg, index, callback, momentX); scheduling_s *event = assertEvent5(msg, index, callback, momentX);
InjectionSignalPair *eventPair = (InjectionSignalPair *)event->param; InjectionEvent *actualEvent = (InjectionEvent *)event->param;
InjectionSignalPair *expectedPair = (InjectionSignalPair *)param; assertEqualsLM(msg, expectedEvent->outputs[0], (long)actualEvent->outputs[0]);
assertEqualsLM(msg, expectedPair->outputs[0], (long)eventPair->outputs[0]);
// but this would not work assertEqualsLM(msg, expectedPair, (long)eventPair); // but this would not work assertEqualsLM(msg, expectedPair, (long)eventPair);
} }

View File

@ -47,7 +47,7 @@ public:
void clearQueue(); void clearQueue();
scheduling_s * assertEvent5(const char *msg, int index, void *callback, efitime_t expectedTimestamp); scheduling_s * assertEvent5(const char *msg, int index, void *callback, efitime_t expectedTimestamp);
void assertEvent(const char *msg, int index, void *callback, efitime_t momentX, long param); void assertEvent(const char *msg, int index, void *callback, efitime_t momentX, InjectionEvent *event);
void assertInjectorUpEvent(const char *msg, int eventIndex, efitime_t momentX, long injectorIndex); void assertInjectorUpEvent(const char *msg, int eventIndex, efitime_t momentX, long injectorIndex);
void assertInjectorDownEvent(const char *msg, int eventIndex, efitime_t momentX, long injectorIndex); void assertInjectorDownEvent(const char *msg, int eventIndex, efitime_t momentX, long injectorIndex);
// todo: open question if this is worth a helper method or should be inlined? // todo: open question if this is worth a helper method or should be inlined?