From 117e98b753992b9b371338c920c5f7a92f219299 Mon Sep 17 00:00:00 2001 From: rusefi Date: Mon, 20 Jul 2020 12:45:26 -0400 Subject: [PATCH] unit test framework improvements for smoother event execution --- firmware/console/binary/tooth_logger.cpp | 7 ++-- unit_tests/engine_test_helper.cpp | 32 +++++++++++++++---- unit_tests/global_execution_queue.cpp | 4 +++ unit_tests/global_execution_queue.h | 3 +- unit_tests/logicdata.cpp | 4 +-- unit_tests/logicdata.h | 2 +- unit_tests/logicdata_sandbox.cpp | 8 ++--- .../injection_mode_transition.cpp | 5 +-- 8 files changed, 43 insertions(+), 22 deletions(-) diff --git a/firmware/console/binary/tooth_logger.cpp b/firmware/console/binary/tooth_logger.cpp index 86313f8739..e1acef8a3e 100644 --- a/firmware/console/binary/tooth_logger.cpp +++ b/firmware/console/binary/tooth_logger.cpp @@ -28,7 +28,7 @@ typedef struct __attribute__ ((packed)) { // unfortunately all these fields are required by TS... bool priLevel : 1; bool secLevel : 1; - bool trigger : 1; + bool isTDC : 1; bool sync : 1; bool coil : 1; bool injector : 1; @@ -64,7 +64,7 @@ int copyCompositeEvents(CompositeEvent *events) { event->timestamp = SWAP_UINT32(buffer[i].timestamp); event->primaryTrigger = buffer[i].priLevel; event->secondaryTrigger = buffer[i].secLevel; - event->trg = buffer[i].trigger; + event->isTDC = buffer[i].isTDC; event->sync = buffer[i].sync; event->coil = buffer[i].coil; event->injector = buffer[i].injector; @@ -81,7 +81,7 @@ static void SetNextCompositeEntry(efitick_t timestamp, bool trigger1, bool trigg buffer[NextIdx].timestamp = SWAP_UINT32(nowUs); buffer[NextIdx].priLevel = trigger1; buffer[NextIdx].secLevel = trigger2; - buffer[NextIdx].trigger = isTDC; + buffer[NextIdx].isTDC = isTDC; buffer[NextIdx].sync = engine->triggerCentral.triggerState.shaft_is_synchronized; buffer[NextIdx].coil = coil; buffer[NextIdx].injector = injector; @@ -144,6 +144,7 @@ void LogTriggerTopDeadCenter(efitick_t timestamp DECLARE_ENGINE_PARAMETER_SUFFIX return; } SetNextCompositeEntry(timestamp, trigger1, trigger2, true PASS_ENGINE_PARAMETER_SUFFIX); + SetNextCompositeEntry(timestamp + 10, trigger1, trigger2, false PASS_ENGINE_PARAMETER_SUFFIX); } void LogTriggerCoilState(efitick_t timestamp, bool state DECLARE_ENGINE_PARAMETER_SUFFIX) { diff --git a/unit_tests/engine_test_helper.cpp b/unit_tests/engine_test_helper.cpp index 437e5104df..0ac210e7e8 100644 --- a/unit_tests/engine_test_helper.cpp +++ b/unit_tests/engine_test_helper.cpp @@ -111,7 +111,7 @@ void EngineTestHelper::fireRise(float delayMs) { } void EngineTestHelper::smartFireRise(float delayMs) { - moveTimeForwardUs(MS2US(delayMs)); + smartMoveTimeForwardUs(MS2US(delayMs)); firePrimaryTriggerRise(); } @@ -121,7 +121,7 @@ void EngineTestHelper::fireFall(float delayMs) { } void EngineTestHelper::smartFireFall(float delayMs) { - moveTimeForwardUs(MS2US(delayMs)); + smartMoveTimeForwardUs(MS2US(delayMs)); firePrimaryTriggerFall(); } @@ -187,11 +187,31 @@ void EngineTestHelper::moveTimeForwardUs(int deltaTimeUs) { timeNowUs += deltaTimeUs; } +/** + * this method executed all pending events wile + */ void EngineTestHelper::smartMoveTimeForwardUs(int deltaTimeUs) { if (printTriggerDebug || printFuelDebug) { - printf("moveTimeForwardUs %.1fms\r\n", deltaTimeUs / 1000.0); + printf("smartMoveTimeForwardUs %.1fms\r\n", deltaTimeUs / 1000.0); } - timeNowUs += deltaTimeUs; + int targetTime = timeNowUs + deltaTimeUs; + + while (true) { + scheduling_s* nextScheduledEvent = engine.executor.getHead(); + if (nextScheduledEvent == nullptr) { + // nothing pending - we are done here + break; + } + int nextEventTime = nextScheduledEvent->momentX; + if (nextEventTime > targetTime) { + // next event is too far in the future + break; + } + timeNowUs = nextEventTime; + engine.executor.executeAll(timeNowUs); + } + + timeNowUs = targetTime; } efitimeus_t EngineTestHelper::getTimeNowUs(void) { @@ -233,9 +253,9 @@ static AngleBasedEvent * getElementAtIndexForUnitText(int index, Engine *engine) index--; } #if EFI_UNIT_TEST - firmwareError(OBD_PCM_Processor_Fault, "getForUnitText: null"); + firmwareError(OBD_PCM_Processor_Fault, "getElementAtIndexForUnitText: null"); #endif /* EFI_UNIT_TEST */ - return NULL; + return nullptr; } AngleBasedEvent * EngineTestHelper::assertTriggerEvent(const char *msg, diff --git a/unit_tests/global_execution_queue.cpp b/unit_tests/global_execution_queue.cpp index 4b20117b3d..3b8ca5bd4e 100644 --- a/unit_tests/global_execution_queue.cpp +++ b/unit_tests/global_execution_queue.cpp @@ -35,6 +35,10 @@ int TestExecutor::size() { return schedulingQueue.size(); } +scheduling_s* TestExecutor::getHead() { + return schedulingQueue.getHead(); +} + scheduling_s* TestExecutor::getForUnitTest(int index) { return schedulingQueue.getElementAtIndexForUnitText(index); } diff --git a/unit_tests/global_execution_queue.h b/unit_tests/global_execution_queue.h index c5ecec4435..f52cf0875a 100644 --- a/unit_tests/global_execution_queue.h +++ b/unit_tests/global_execution_queue.h @@ -18,7 +18,8 @@ public: void clear(); int executeAll(efitime_t now); int size(); - scheduling_s* getForUnitTest(int index); + scheduling_s * getHead(); + scheduling_s * getForUnitTest(int index); void setMockExecutor(ExecutorInterface* exec); private: diff --git a/unit_tests/logicdata.cpp b/unit_tests/logicdata.cpp index cd7b5f629e..b2da4a2d85 100644 --- a/unit_tests/logicdata.cpp +++ b/unit_tests/logicdata.cpp @@ -37,7 +37,7 @@ #define MAX_STRING_SIZE 40 -static char channelNames[][MAX_STRING_SIZE] = { "Primary", "Secondary", "Trg", +static char channelNames[][MAX_STRING_SIZE] = { "Primary", "Secondary", "TDC", "Sync", "Coil", "Injector", "Channel 6", "Channel 7" }; static int CHANNEL_FLAGS[] = { 0x13458b, 0x0000ff, 0x00a0f9, 0x00ffff, 0x00ff00, @@ -378,7 +378,7 @@ static int getChannelState(int ch, CompositeEvent *event) { case 1: return event->secondaryTrigger; case 2: - return event->trg; + return event->isTDC; case 3: return event->sync; case 4: diff --git a/unit_tests/logicdata.h b/unit_tests/logicdata.h index 249877487d..b29be49a9b 100644 --- a/unit_tests/logicdata.h +++ b/unit_tests/logicdata.h @@ -11,7 +11,7 @@ struct CompositeEvent { int timestamp; bool primaryTrigger; bool secondaryTrigger; - bool trg; + bool isTDC; bool sync; bool coil; bool injector; diff --git a/unit_tests/logicdata_sandbox.cpp b/unit_tests/logicdata_sandbox.cpp index 57a871d577..2f5056296d 100644 --- a/unit_tests/logicdata_sandbox.cpp +++ b/unit_tests/logicdata_sandbox.cpp @@ -8,13 +8,12 @@ static CompositeEvent events[100]; - -void setEvent(CompositeEvent *events, int index, - int timestamp, bool primaryTrigger, bool secondaryTrigger, bool trg, bool sync, bool coil, bool injector) { +static void setEvent(CompositeEvent *events, int index, + int timestamp, bool primaryTrigger, bool secondaryTrigger, bool isTDC, bool sync, bool coil, bool injector) { events[index].timestamp = timestamp; events[index].primaryTrigger = primaryTrigger; events[index].secondaryTrigger = secondaryTrigger; - events[index].trg = trg; + events[index].isTDC = isTDC; events[index].sync = sync; events[index].coil = coil; events[index].injector = injector; @@ -23,7 +22,6 @@ void setEvent(CompositeEvent *events, int index, void runLogicdataSandbox() { printf(".logicdata Sandbox 20200719\n"); - int index = 0; setEvent(events, index++, 10, false, false, false, false, false, false); setEvent(events, index++, 20, true, false, true, false, false, false); diff --git a/unit_tests/tests/ignition_injection/injection_mode_transition.cpp b/unit_tests/tests/ignition_injection/injection_mode_transition.cpp index 71d6799169..1a39069b4a 100644 --- a/unit_tests/tests/ignition_injection/injection_mode_transition.cpp +++ b/unit_tests/tests/ignition_injection/injection_mode_transition.cpp @@ -36,8 +36,5 @@ TEST(fuelControl, transitionIssue1592) { ASSERT_EQ(IM_SIMULTANEOUS, ENGINE(getCurrentInjectionMode(PASS_ENGINE_PARAMETER_SIGNATURE))); - eth.writeEvents("transitionIssue1592.logicdata"); - + eth.writeEvents("fuel_schedule_transition_issue_1592.logicdata"); } - -