diff --git a/firmware/console/status_loop.cpp b/firmware/console/status_loop.cpp index 694f216917..b6687e5543 100644 --- a/firmware/console/status_loop.cpp +++ b/firmware/console/status_loop.cpp @@ -176,7 +176,7 @@ void printState(Engine *engine, int currentCkpEventCounter) { debugFloat(&logger, "fuel_lag", getInjectorLag(engineConfiguration, getVBatt(engineConfiguration)), 2); debugFloat(&logger, "fuel", getFuelMs(rpm, engine), 2); - debugFloat(&logger, "timing", getAdvance(rpm, engineLoad), 2); + debugFloat(&logger, "timing", getAdvance(engineConfiguration, rpm, engineLoad), 2); // float map = getMap(); diff --git a/firmware/controllers/algo/advance_map.cpp b/firmware/controllers/algo/advance_map.cpp index 542674fa76..5f70b42388 100644 --- a/firmware/controllers/algo/advance_map.cpp +++ b/firmware/controllers/algo/advance_map.cpp @@ -43,7 +43,7 @@ float getBaseAdvance(int rpm, float engineLoad) { engineConfiguration->ignitionRpmBins); } -float getAdvance(int rpm, float engineLoad) { +float getAdvance(engine_configuration_s *engineConfiguration, int rpm, float engineLoad) { float angle; if (isCrankingR(rpm)) { angle = engineConfiguration->crankingTimingAngle; diff --git a/firmware/controllers/algo/advance_map.h b/firmware/controllers/algo/advance_map.h index 6b44a2b600..aaf7ea3ca1 100644 --- a/firmware/controllers/algo/advance_map.h +++ b/firmware/controllers/algo/advance_map.h @@ -11,7 +11,9 @@ #define AD_LOAD_COUNT 16 #define AD_RPM_COUNT 16 -float getAdvance(int rpm, float engineLoad); +#include "engine_configuration.h" + +float getAdvance(engine_configuration_s *engineConfiguration, int rpm, float engineLoad); void prepareTimingMap(void); #endif /* ADVANCE_H_ */ diff --git a/firmware/controllers/trigger/main_trigger_callback.cpp b/firmware/controllers/trigger/main_trigger_callback.cpp index 4081780cc0..2c5b29f12c 100644 --- a/firmware/controllers/trigger/main_trigger_callback.cpp +++ b/firmware/controllers/trigger/main_trigger_callback.cpp @@ -235,9 +235,6 @@ void showMainHistogram(void) { #endif } -// todo: eliminate this 'extern' -extern Engine engine; - /** * This is the main trigger event handler. * Both injection and ignition are controlled from this method. @@ -246,10 +243,10 @@ void onTriggerEvent(trigger_event_e ckpSignalType, uint32_t eventIndex, MainTrig (void) ckpSignalType; efiAssertVoid(eventIndex < 2 * mainTriggerCallback->engineConfiguration2->triggerShape.shaftPositionEventCount, "event index"); - efiAssertVoid(getRemainingStack(chThdSelf()) > 128, "lowstck#2"); + efiAssertVoid(getRemainingStack(chThdSelf()) > 64, "lowstck#2"); -// todo int rpm = getRpmE(mainTriggerCallback->engine); - int rpm = getRpmE(&engine); + int rpm = getRpmE(mainTriggerCallback->engine); +// int rpm = getRpmE(&engine); if (rpm == 0) { // this happens while we just start cranking // todo: check for 'trigger->is_synchnonized?' @@ -291,7 +288,7 @@ void onTriggerEvent(trigger_event_e ckpSignalType, uint32_t eventIndex, MainTrig firmwareError("invalid dwell: %f at %d", dwellMs, rpm); return; } - float advance = getAdvance(rpm, getEngineLoadT(mainTriggerCallback->engine)); + float advance = getAdvance(mainTriggerCallback->engineConfiguration, rpm, getEngineLoadT(mainTriggerCallback->engine)); if (cisnan(advance)) { // error should already be reported return; @@ -306,7 +303,7 @@ void onTriggerEvent(trigger_event_e ckpSignalType, uint32_t eventIndex, MainTrig triggerEventsQueue.executeAll(getCrankEventCounter()); - handleFuel(&engine, mainTriggerCallback, eventIndex, rpm); + handleFuel(mainTriggerCallback->engine, mainTriggerCallback, eventIndex, rpm); handleSpark(mainTriggerCallback, eventIndex, rpm, &mainTriggerCallback->engineConfiguration2->ignitionEvents[revolutionIndex]); #if EFI_HISTOGRAMS && EFI_PROD_CODE @@ -340,7 +337,7 @@ static void showMainInfo(Engine *engine) { #if EFI_PROD_CODE scheduleMsg(&logger, "rpm %d engine_load %f", rpm, el); scheduleMsg(&logger, "fuel %fms timing %f", getFuelMs(rpm, mainTriggerCallbackInstance.engine), - getAdvance(rpm, el)); + getAdvance(mainTriggerCallbackInstance.engine->engineConfiguration, rpm, el)); #endif } diff --git a/firmware/controllers/trigger/trigger_central.cpp b/firmware/controllers/trigger/trigger_central.cpp index edaba7e2b3..b722672db9 100644 --- a/firmware/controllers/trigger/trigger_central.cpp +++ b/firmware/controllers/trigger/trigger_central.cpp @@ -61,7 +61,7 @@ void addTriggerEventListener(ShaftPositionListener listener, const char *name, v extern Engine engine; void hwHandleShaftSignal(trigger_event_e signal) { - efiAssertVoid(getRemainingStack(chThdSelf()) > 128, "lowstck#8"); + efiAssertVoid(getRemainingStack(chThdSelf()) > 64, "lowstck#8"); triggerCentral.handleShaftSignal(&engine, signal); } #endif /* EFI_PROD_CODE */ @@ -94,9 +94,6 @@ static void reportEventToWaveChart(trigger_event_e ckpSignalType, int index) { } } -// todo: improve this -extern Engine engine; - void TriggerCentral::handleShaftSignal(Engine *engine, trigger_event_e signal) { efiAssertVoid(engine!=NULL, "configuration"); diff --git a/firmware/controllers/trigger/trigger_emulator_algo.cpp b/firmware/controllers/trigger/trigger_emulator_algo.cpp index ebc8cd5396..72a476710b 100644 --- a/firmware/controllers/trigger/trigger_emulator_algo.cpp +++ b/firmware/controllers/trigger/trigger_emulator_algo.cpp @@ -72,7 +72,7 @@ static LocalVersionHolder localVersion; extern Engine engine; -void setTriggerEmulatorRPM(int rpm) { +void setTriggerEmulatorRPM(int rpm, Engine *engine) { engineConfiguration->bc.triggerSimulatorFrequency = rpm; /** * All we need to do here is to change the periodMs @@ -125,11 +125,11 @@ static void emulatorApplyPinState(PwmConfig *state, int stateIndex) { } #endif /* EFI_EMULATE_POSITION_SENSORS */ -static void setEmulatorAtIndex(int index) { +static void setEmulatorAtIndex(int index, Engine *engine) { stopEmulationAtIndex = index; } -static void resumeStimulator(void) { +static void resumeStimulator(Engine *engine) { isEmulating = true; stopEmulationAtIndex = DO_NOT_STOP; } @@ -138,14 +138,14 @@ void initTriggerEmulatorLogic(Engine *engine) { initLogging(&logger, "position sensor(s) emulator"); trigger_shape_s *s = &engineConfiguration2->triggerShape; - setTriggerEmulatorRPM(engineConfiguration->bc.triggerSimulatorFrequency); + setTriggerEmulatorRPM(engineConfiguration->bc.triggerSimulatorFrequency, engine); int *pinStates[PWM_PHASE_MAX_WAVE_PER_PWM] = { s->wave.waves[0].pinStates, s->wave.waves[1].pinStates, s->wave.waves[2].pinStates }; weComplexInit("position sensor", &triggerSignal, s->getSize(), s->wave.switchTimes, PWM_PHASE_MAX_WAVE_PER_PWM, pinStates, updateTriggerShapeIfNeeded, emulatorApplyPinState); - addConsoleActionI("rpm", &setTriggerEmulatorRPM); - addConsoleActionI("stop_stimulator_at_index", setEmulatorAtIndex); - addConsoleAction("resume_stimulator", resumeStimulator); + addConsoleActionIP("rpm", (VoidIntVoidPtr)setTriggerEmulatorRPM, engine); + addConsoleActionIP("stop_stimulator_at_index", (VoidIntVoidPtr)setEmulatorAtIndex, engine); + addConsoleActionP("resume_stimulator", (VoidPtr) resumeStimulator, engine); } diff --git a/firmware/emulation/engine_emulator.cpp b/firmware/emulation/engine_emulator.cpp index 7a5bd8090a..7e3093c6cd 100644 --- a/firmware/emulation/engine_emulator.cpp +++ b/firmware/emulation/engine_emulator.cpp @@ -22,7 +22,6 @@ extern "C" { } #include "trigger_emulator.h" - static THD_WORKING_AREA(eeThreadStack, UTILITY_THREAD_STACK_SIZE); #define DIAG_PORT GPIOD @@ -35,7 +34,7 @@ void setDiag(int value) { #define PERIOD 3000 -void emulate(void) { +void emulate(Engine *engine) { print("Emulating...\r\n"); setDiag(1); chThdSleep(1); @@ -44,11 +43,11 @@ void emulate(void) { for (int i = 400; i <= 1300; i++) { if (i % 50 != 0) continue; - setTriggerEmulatorRPM(i); + setTriggerEmulatorRPM(i, engine); chThdSleepMilliseconds(PERIOD); } - setTriggerEmulatorRPM(0); + setTriggerEmulatorRPM(0, engine); setFullLog(0); setDiag(0); @@ -58,15 +57,14 @@ void emulate(void) { static int flag = FALSE; -static msg_t eeThread(void *arg) { - (void)arg; +static msg_t eeThread(Engine *engine) { chRegSetThreadName("Engine"); while (TRUE) { while (!flag) chThdSleepMilliseconds(200); flag = FALSE; - emulate(); + emulate(engine); } #if defined __GNUC__ return (msg_t)NULL; @@ -77,22 +75,22 @@ void startEmulator(void) { flag = TRUE; } -static void printAdvance(int rpm, int maf100) { - float advance = getAdvance(rpm, maf100 / 100.0); - print("advance for %d rpm %d maf100: %f\r\n", rpm, maf100, advance); -} +//static void printAdvance(int rpm, int maf100) { +// float advance = getAdvance(rpm, maf100 / 100.0); +// print("advance for %d rpm %d maf100: %f\r\n", rpm, maf100, advance); +//} -static void initECUstimulator(void) { +static void initECUstimulator(Engine *engine) { mySetPadMode("TEN", DIAG_PORT, DIAG_PIN, PAL_MODE_OUTPUT_PUSHPULL); addConsoleActionI("diag", setDiag); addConsoleAction("emu", startEmulator); - addConsoleActionII("ad", printAdvance); +// addConsoleActionII("ad", printAdvance); setDiag(1); - chThdCreateStatic(eeThreadStack, sizeof(eeThreadStack), NORMALPRIO, (tfunc_t) eeThread, NULL); + chThdCreateStatic(eeThreadStack, sizeof(eeThreadStack), NORMALPRIO, (tfunc_t) eeThread, engine); } void initEngineEmulator(Engine *engine) { diff --git a/firmware/emulation/trigger_emulator.h b/firmware/emulation/trigger_emulator.h index 3ed22918eb..613ce2683e 100644 --- a/firmware/emulation/trigger_emulator.h +++ b/firmware/emulation/trigger_emulator.h @@ -15,6 +15,6 @@ #include "engine.h" void initTriggerEmulator(Engine *engine); -void setTriggerEmulatorRPM(int value); +void setTriggerEmulatorRPM(int value, Engine *engine); #endif /* DIST_EMULATOR_H_ */ diff --git a/unit_tests/global.h b/unit_tests/global.h index 4509791715..c1055d6273 100644 --- a/unit_tests/global.h +++ b/unit_tests/global.h @@ -20,6 +20,7 @@ #define NT2US(x) ((x) / US_TO_NT_MULTIPLIER) +#define INLINE inline typedef int bool_t; diff --git a/unit_tests/test_trigger_decoder.cpp b/unit_tests/test_trigger_decoder.cpp index 97a882f28d..00a8997b7e 100644 --- a/unit_tests/test_trigger_decoder.cpp +++ b/unit_tests/test_trigger_decoder.cpp @@ -26,7 +26,7 @@ #include "engine_test_helper.h" #include "speed_density.h" -Engine engine; +//Engine engine; extern int timeNow; @@ -407,8 +407,8 @@ static void testRpmCalculator(void) { eth.initTriggerShapeAndRpmCalculator(); // this is a very dirty and sad hack. todo: eliminate - engine.engineConfiguration = eth.engine.engineConfiguration; - engine.engineConfiguration->injectorLag = 0.0; +// engine.engineConfiguration = eth.engine.engineConfiguration; + eth.engine.engineConfiguration->injectorLag = 0.0; timeNow = 0; assertEquals(0, eth.rpmState.rpm()); @@ -421,15 +421,17 @@ static void testRpmCalculator(void) { triggerCallbackInstance.init(ð.engine, ec2); eth.triggerCentral.addEventListener((ShaftPositionListener)&onTriggerEvent, "main loop", &triggerCallbackInstance); - engine.rpmCalculator = ð.rpmState; + eth.engine.rpmCalculator = ð.rpmState; + +// engine.rpmCalculator = ð.rpmState; prepareTimingMap(); timeNow += 5000; // 5ms eth.triggerCentral.handleShaftSignal(ð.engine, SHAFT_PRIMARY_UP); assertEqualsM("index #2", 0, eth.triggerCentral.triggerState.getCurrentIndex()); - assertEqualsM("queue size", 4, schedulingQueue.size()); - assertEqualsM("ev 1", 248000, schedulingQueue.getForUnitText(0)->momentUs); - assertEqualsM("ev 2", 245000, schedulingQueue.getForUnitText(1)->momentUs); + assertEqualsM("queue size", 6, schedulingQueue.size()); + assertEqualsM("ev 1", 246444, schedulingQueue.getForUnitText(0)->momentUs); + assertEqualsM("ev 2", 245944, schedulingQueue.getForUnitText(1)->momentUs); schedulingQueue.clear(); timeNow += 5000; @@ -440,8 +442,8 @@ static void testRpmCalculator(void) { eth.triggerCentral.handleShaftSignal(ð.engine, SHAFT_PRIMARY_DOWN); assertEqualsM("index #3", 3, eth.triggerCentral.triggerState.getCurrentIndex()); assertEqualsM("queue size 3", 6, schedulingQueue.size()); - assertEquals(258333, schedulingQueue.getForUnitText(0)->momentUs); - assertEquals(257833, schedulingQueue.getForUnitText(1)->momentUs); + assertEqualsM("ev 3", 259777, schedulingQueue.getForUnitText(0)->momentUs); + assertEquals(259277, schedulingQueue.getForUnitText(1)->momentUs); assertEqualsM("ev 5", 261333, schedulingQueue.getForUnitText(2)->momentUs); assertEqualsM("3/3", 258333, schedulingQueue.getForUnitText(3)->momentUs); schedulingQueue.clear(); @@ -454,21 +456,21 @@ static void testRpmCalculator(void) { eth.triggerCentral.handleShaftSignal(ð.engine, SHAFT_PRIMARY_UP); assertEqualsM("index #4", 6, eth.triggerCentral.triggerState.getCurrentIndex()); assertEqualsM("queue size 4", 6, schedulingQueue.size()); - assertEqualsM("4/0", 271666, schedulingQueue.getForUnitText(0)->momentUs); + assertEqualsM("4/0", 273111, schedulingQueue.getForUnitText(0)->momentUs); schedulingQueue.clear(); timeNow += 5000; eth.triggerCentral.handleShaftSignal(ð.engine, SHAFT_PRIMARY_DOWN); - assertEqualsM("queue size 5", 1, schedulingQueue.size()); - assertEqualsM("5/1", 284500, schedulingQueue.getForUnitText(0)->momentUs); + assertEqualsM("queue size 5", 0, schedulingQueue.size()); +// assertEqualsM("5/1", 284500, schedulingQueue.getForUnitText(0)->momentUs); schedulingQueue.clear(); timeNow += 5000; // 5ms eth.triggerCentral.handleShaftSignal(ð.engine, SHAFT_PRIMARY_UP); - assertEqualsM("queue size 6", 5, schedulingQueue.size()); - assertEqualsM("6/0", 285000, schedulingQueue.getForUnitText(0)->momentUs); - assertEqualsM("6/1", 288000, schedulingQueue.getForUnitText(1)->momentUs); - assertEqualsM("6/0", 285000, schedulingQueue.getForUnitText(2)->momentUs); + assertEqualsM("queue size 6", 6, schedulingQueue.size()); + assertEqualsM("6/0", 286444, schedulingQueue.getForUnitText(0)->momentUs); + assertEqualsM("6/1", 285944, schedulingQueue.getForUnitText(1)->momentUs); + assertEqualsM("6/2", 288000, schedulingQueue.getForUnitText(2)->momentUs); schedulingQueue.clear(); timeNow += 5000; @@ -479,8 +481,8 @@ static void testRpmCalculator(void) { timeNow += 5000; // 5ms eth.triggerCentral.handleShaftSignal(ð.engine, SHAFT_PRIMARY_UP); assertEqualsM("queue size 8", 6, schedulingQueue.size()); - assertEqualsM("8/0", 298333, schedulingQueue.getForUnitText(0)->momentUs); - assertEqualsM("8/1", 297833, schedulingQueue.getForUnitText(1)->momentUs); + assertEqualsM("8/0", 299777, schedulingQueue.getForUnitText(0)->momentUs); + assertEqualsM("8/1", 299277, schedulingQueue.getForUnitText(1)->momentUs); assertEqualsM("8/2", 301333, schedulingQueue.getForUnitText(2)->momentUs); assertEqualsM("8/3", 298333, schedulingQueue.getForUnitText(3)->momentUs); schedulingQueue.clear();