auto-sync

This commit is contained in:
rusEfi 2014-11-11 14:03:07 -06:00
parent 5f7ed9c6a0
commit ef09927db9
11 changed files with 33 additions and 32 deletions

View File

@ -29,7 +29,7 @@ public:
}; };
void initMainEventListener(Engine *engine, engine_configuration2_s *engineConfiguration2); void initMainEventListener(Engine *engine, engine_configuration2_s *engineConfiguration2);
void onTriggerEvent(trigger_event_e ckpSignalType, uint32_t eventIndex, MainTriggerCallback *mainTriggerCallback); void mainTriggerCallback(trigger_event_e ckpSignalType, uint32_t eventIndex, Engine *engine);
#endif #endif
int isIgnitionTimingError(void); int isIgnitionTimingError(void);

View File

@ -53,7 +53,7 @@ void turnPinLow(io_pin_e pin);
void initSignalExecutor(void); void initSignalExecutor(void);
void initSignalExecutorImpl(void); void initSignalExecutorImpl(void);
void scheduleByAngle(scheduling_s *timer, float angle, schfunc_t callback, void *param); void scheduleByAngle(int rpm, scheduling_s *timer, float angle, schfunc_t callback, void *param);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -126,13 +126,13 @@ static void endAveraging(void *arg) {
/** /**
* Shaft Position callback used to schedule start and end of MAP averaging * Shaft Position callback used to schedule start and end of MAP averaging
*/ */
static void shaftPositionCallback(trigger_event_e ckpEventType, uint32_t index, void *arg) { static void shaftPositionCallback(trigger_event_e ckpEventType, uint32_t index, Engine *arg) {
// this callback is invoked on interrupt thread // this callback is invoked on interrupt thread
if (index != 0) if (index != 0)
return; return;
int rpm = getRpm(); int rpm = getRpmE(engine);
if (!isValidRpm(rpm)) if (!isValidRpm(rpm))
return; return;
@ -150,8 +150,8 @@ static void shaftPositionCallback(trigger_event_e ckpEventType, uint32_t index,
int structIndex = getRevolutionCounter() % 2; int structIndex = getRevolutionCounter() % 2;
// todo: schedule this based on closest trigger event, same as ignition works // todo: schedule this based on closest trigger event, same as ignition works
scheduleByAngle(&startTimer[structIndex], startAngle, startAveraging, NULL); scheduleByAngle(rpm, &startTimer[structIndex], startAngle, startAveraging, NULL);
scheduleByAngle(&endTimer[structIndex], startAngle + windowAngle, endAveraging, NULL); scheduleByAngle(rpm, &endTimer[structIndex], startAngle + windowAngle, endAveraging, NULL);
} }
static void showMapStats(void) { static void showMapStats(void) {

View File

@ -243,7 +243,7 @@ void showMainHistogram(void) {
* This is the main trigger event handler. * This is the main trigger event handler.
* Both injection and ignition are controlled from this method. * Both injection and ignition are controlled from this method.
*/ */
void onTriggerEvent(trigger_event_e ckpSignalType, uint32_t eventIndex, MainTriggerCallback *mtc) { void mainTriggerCallback(trigger_event_e ckpSignalType, uint32_t eventIndex, Engine *engine) {
if (hasFirmwareError()) { if (hasFirmwareError()) {
/** /**
* In case on a major error we should not process any more events. * In case on a major error we should not process any more events.
@ -252,7 +252,6 @@ void onTriggerEvent(trigger_event_e ckpSignalType, uint32_t eventIndex, MainTrig
return; return;
} }
Engine *engine = mtc->engine;
(void) ckpSignalType; (void) ckpSignalType;
efiAssertVoid(eventIndex < 2 * engine->engineConfiguration2->triggerShape.shaftPositionEventCount, "event index"); efiAssertVoid(eventIndex < 2 * engine->engineConfiguration2->triggerShape.shaftPositionEventCount, "event index");
efiAssertVoid(getRemainingStack(chThdSelf()) > 256, "lowstck#2"); efiAssertVoid(getRemainingStack(chThdSelf()) > 256, "lowstck#2");
@ -370,7 +369,7 @@ void initMainEventListener(Engine *engine, engine_configuration2_s *engineConfig
initHistogram(&mainLoopHisto, "main callback"); initHistogram(&mainLoopHisto, "main callback");
#endif /* EFI_HISTOGRAMS */ #endif /* EFI_HISTOGRAMS */
addTriggerEventListener((ShaftPositionListener) &onTriggerEvent, "main loop", &mainTriggerCallbackInstance); addTriggerEventListener(mainTriggerCallback, "main loop", engine);
} }
int isIgnitionTimingError(void) { int isIgnitionTimingError(void) {

View File

@ -136,7 +136,9 @@ bool isCranking(void) {
* updated here. * updated here.
* This callback is invoked on interrupt thread. * This callback is invoked on interrupt thread.
*/ */
void rpmShaftPositionCallback(trigger_event_e ckpSignalType, uint32_t index, RpmCalculator *rpmState) { void rpmShaftPositionCallback(trigger_event_e ckpSignalType, uint32_t index, Engine *engine) {
RpmCalculator *rpmState = engine->rpmCalculator;
efiAssertVoid(rpmState!=NULL, "NULL rpmState");
uint64_t nowNt = getTimeNowNt(); uint64_t nowNt = getTimeNowNt();
#if EFI_PROD_CODE #if EFI_PROD_CODE
efiAssertVoid(getRemainingStack(chThdSelf()) > 256, "lowstck#2z"); efiAssertVoid(getRemainingStack(chThdSelf()) > 256, "lowstck#2z");
@ -149,7 +151,6 @@ void rpmShaftPositionCallback(trigger_event_e ckpSignalType, uint32_t index, Rpm
#endif #endif
return; return;
} }
rpmState->onNewEngineCycle();
bool hadRpmRecently = rpmState->isRunning(); bool hadRpmRecently = rpmState->isRunning();
@ -170,6 +171,7 @@ void rpmShaftPositionCallback(trigger_event_e ckpSignalType, uint32_t index, Rpm
rpmState->setRpmValue(rpm > UNREALISTIC_RPM ? NOISY_RPM : rpm); rpmState->setRpmValue(rpm > UNREALISTIC_RPM ? NOISY_RPM : rpm);
} }
} }
rpmState->onNewEngineCycle();
rpmState->lastRpmEventTimeNt = nowNt; rpmState->lastRpmEventTimeNt = nowNt;
#if EFI_ANALOG_CHART || defined(__DOXYGEN__) #if EFI_ANALOG_CHART || defined(__DOXYGEN__)
if (engineConfiguration->analogChartMode == AC_TRIGGER) if (engineConfiguration->analogChartMode == AC_TRIGGER)
@ -194,14 +196,14 @@ static void onTdcCallback(void) {
/** /**
* This trigger callback schedules the actual physical TDC callback in relation to trigger synchronization point. * This trigger callback schedules the actual physical TDC callback in relation to trigger synchronization point.
*/ */
static void tdcMarkCallback(trigger_event_e ckpSignalType, uint32_t index0, void *arg) { static void tdcMarkCallback(trigger_event_e ckpSignalType, uint32_t index0, Engine *engine) {
(void) arg;
(void) ckpSignalType; (void) ckpSignalType;
bool isTriggerSynchronizationPoint = index0 == 0; bool isTriggerSynchronizationPoint = index0 == 0;
if (isTriggerSynchronizationPoint) { if (isTriggerSynchronizationPoint) {
int revIndex2 = getRevolutionCounter() % 2; int revIndex2 = getRevolutionCounter() % 2;
int rpm = getRpm();
// todo: use event-based scheduling, not just time-based scheduling // todo: use event-based scheduling, not just time-based scheduling
scheduleByAngle(&tdcScheduler[revIndex2], engineConfiguration->globalTriggerAngleOffset, scheduleByAngle(rpm, &tdcScheduler[revIndex2], engineConfiguration->globalTriggerAngleOffset,
(schfunc_t) onTdcCallback, NULL); (schfunc_t) onTdcCallback, NULL);
} }
} }
@ -238,10 +240,10 @@ void initRpmCalculator(Engine *engine) {
tdcScheduler[0].name = "tdc0"; tdcScheduler[0].name = "tdc0";
tdcScheduler[1].name = "tdc1"; tdcScheduler[1].name = "tdc1";
addTriggerEventListener(&tdcMarkCallback, "chart TDC mark", NULL); addTriggerEventListener(tdcMarkCallback, "chart TDC mark", engine);
#endif #endif
addTriggerEventListener((ShaftPositionListener) &rpmShaftPositionCallback, "rpm reporter", &rpmState); addTriggerEventListener((ShaftPositionListener) &rpmShaftPositionCallback, "rpm reporter", engine);
} }
#if (EFI_PROD_CODE || EFI_SIMULATOR) || defined(__DOXYGEN__) #if (EFI_PROD_CODE || EFI_SIMULATOR) || defined(__DOXYGEN__)
@ -250,8 +252,7 @@ void initRpmCalculator(Engine *engine) {
* The callback would be executed once after the duration of time which * The callback would be executed once after the duration of time which
* it takes the crankshaft to rotate to the specified angle. * it takes the crankshaft to rotate to the specified angle.
*/ */
void scheduleByAngle(scheduling_s *timer, float angle, schfunc_t callback, void *param) { void scheduleByAngle(int rpm, scheduling_s *timer, float angle, schfunc_t callback, void *param) {
int rpm = getRpm();
if (!isValidRpm(rpm)) { if (!isValidRpm(rpm)) {
/** /**
* this might happen in case of a single trigger event after a pause - this is normal, so no * this might happen in case of a single trigger event after a pause - this is normal, so no

View File

@ -59,7 +59,7 @@ private:
*/ */
int getRpmE(Engine *engine); int getRpmE(Engine *engine);
bool isCrankingE(Engine *engine); bool isCrankingE(Engine *engine);
void rpmShaftPositionCallback(trigger_event_e ckpSignalType, uint32_t index, RpmCalculator *rpmState); void rpmShaftPositionCallback(trigger_event_e ckpSignalType, uint32_t index, Engine *engine);
/** /**
* @brief Initialize RPM calculator * @brief Initialize RPM calculator
*/ */

View File

@ -43,9 +43,9 @@ uint64_t getStartOfRevolutionIndex() {
return triggerCentral.triggerState.getStartOfRevolutionIndex(); return triggerCentral.triggerState.getStartOfRevolutionIndex();
} }
void TriggerCentral::addEventListener(ShaftPositionListener listener, const char *name, void *arg) { void TriggerCentral::addEventListener(ShaftPositionListener listener, const char *name, Engine *engine) {
print("registerCkpListener: %s\r\n", name); print("registerCkpListener: %s\r\n", name);
registerCallback(&triggerListeneres, (IntListener) listener, arg); registerCallback(&triggerListeneres, (IntListener) listener, engine);
} }
/** /**
@ -54,8 +54,8 @@ void TriggerCentral::addEventListener(ShaftPositionListener listener, const char
* Trigger event listener would be invoked on each trigger event. For example, for a 60/2 wheel * Trigger event listener would be invoked on each trigger event. For example, for a 60/2 wheel
* that would be 116 events: 58 SHAFT_PRIMARY_UP and 58 SHAFT_PRIMARY_DOWN events. * that would be 116 events: 58 SHAFT_PRIMARY_UP and 58 SHAFT_PRIMARY_DOWN events.
*/ */
void addTriggerEventListener(ShaftPositionListener listener, const char *name, void *arg) { void addTriggerEventListener(ShaftPositionListener listener, const char *name, Engine *engine) {
triggerCentral.addEventListener(listener, name, arg); triggerCentral.addEventListener(listener, name, engine);
} }
#if (EFI_PROD_CODE || EFI_SIMULATOR) || defined(__DOXYGEN__) #if (EFI_PROD_CODE || EFI_SIMULATOR) || defined(__DOXYGEN__)

View File

@ -12,7 +12,8 @@
#include "listener_array.h" #include "listener_array.h"
#include "trigger_decoder.h" #include "trigger_decoder.h"
typedef void (*ShaftPositionListener)(trigger_event_e signal, uint32_t index, void *arg); class Engine;
typedef void (*ShaftPositionListener)(trigger_event_e signal, uint32_t index, Engine *engine);
#ifdef __cplusplus #ifdef __cplusplus
#include "ec2.h" #include "ec2.h"
@ -23,7 +24,7 @@ typedef void (*ShaftPositionListener)(trigger_event_e signal, uint32_t index, vo
class TriggerCentral { class TriggerCentral {
public: public:
TriggerCentral(); TriggerCentral();
void addEventListener(ShaftPositionListener handler, const char *name, void *arg); void addEventListener(ShaftPositionListener handler, const char *name, Engine *engine);
void handleShaftSignal(Engine *engine, trigger_event_e signal); void handleShaftSignal(Engine *engine, trigger_event_e signal);
int getHwEventCounter(int index); int getHwEventCounter(int index);
TriggerState triggerState; TriggerState triggerState;
@ -44,7 +45,7 @@ void printAllCallbacksHistogram(void);
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
void addTriggerEventListener(ShaftPositionListener handler, const char *name, void *arg); void addTriggerEventListener(ShaftPositionListener handler, const char *name, Engine *engine);
int isSignalDecoderError(void); int isSignalDecoderError(void);
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -137,7 +137,7 @@ static void initWave(const char *name, int index) {
} }
#endif #endif
static void waTriggerEventListener(trigger_event_e ckpSignalType, uint32_t index, void *arg) { static void waTriggerEventListener(trigger_event_e ckpSignalType, uint32_t index, Engine *arg) {
(void)ckpSignalType; (void)ckpSignalType;
(void)arg; (void)arg;
if (index != 0) { if (index != 0) {
@ -251,7 +251,7 @@ void initWaveAnalyzer(void) {
initWave(WA_CHANNEL_1, 0); initWave(WA_CHANNEL_1, 0);
initWave(WA_CHANNEL_2, 1); initWave(WA_CHANNEL_2, 1);
addTriggerEventListener(&waTriggerEventListener, "wave analyzer", (void*) NULL); addTriggerEventListener(waTriggerEventListener, "wave analyzer", NULL);
addConsoleActionII("set_logic_input_mode", setWaveModeSilent); addConsoleActionII("set_logic_input_mode", setWaveModeSilent);

View File

@ -20,6 +20,8 @@ EngineTestHelper::EngineTestHelper(engine_type_e engineType) {
engine.engineConfiguration2 = &ec2; engine.engineConfiguration2 = &ec2;
engine.rpmCalculator = &rpmState;
prepareFuelMap(engine.engineConfiguration); prepareFuelMap(engine.engineConfiguration);
@ -43,6 +45,6 @@ void EngineTestHelper::initTriggerShapeAndRpmCalculator() {
initializeTriggerShape(NULL, ec, &ec2); initializeTriggerShape(NULL, ec, &ec2);
incrementGlobalConfigurationVersion(); incrementGlobalConfigurationVersion();
triggerCentral.addEventListener((ShaftPositionListener) &rpmShaftPositionCallback, "rpm reporter", &rpmState); triggerCentral.addEventListener((ShaftPositionListener) &rpmShaftPositionCallback, "rpm reporter", &engine);
} }

View File

@ -403,9 +403,7 @@ static void testRpmCalculator(void) {
static MainTriggerCallback triggerCallbackInstance; static MainTriggerCallback triggerCallbackInstance;
triggerCallbackInstance.init(&eth.engine, ec2); triggerCallbackInstance.init(&eth.engine, ec2);
eth.triggerCentral.addEventListener((ShaftPositionListener)&onTriggerEvent, "main loop", &triggerCallbackInstance); eth.triggerCentral.addEventListener((ShaftPositionListener)&mainTriggerCallback, "main loop", &eth.engine);
eth.engine.rpmCalculator = &eth.rpmState;
// engine.rpmCalculator = &eth.rpmState; // engine.rpmCalculator = &eth.rpmState;
prepareTimingMap(); prepareTimingMap();