static ALWAYS_INLINE void reportEventToWaveChart(trigger_event_e ckpSignalType, int index DECLARE_ENGINE_PARAMETER_S) { itoa10(&shaft_signal_msg_index[2], index); bool_t isUp = isUpEvent[(int) ckpSignalType]; shaft_signal_msg_index[0] = isUp ? 'u' : 'd'; addWaveChartEvent(eventId[(int )ckpSignalType], (char* ) shaft_signal_msg_index); if (engineConfiguration->useOnlyFrontForTrigger) { // let's add the opposite event right away shaft_signal_msg_index[0] = isUp ? 'd' : 'u'; addWaveChartEvent(eventId[(int )ckpSignalType], (char* ) shaft_signal_msg_index); } }
void WaveReader::onFallEvent() { uint64_t nowUs = getTimeNowUs(); eventCounter++; lastActivityTimeUs = nowUs; addWaveChartEvent(name, WC_DOWN, ""); uint64_t width = nowUs - widthEventTimeUs; last_wave_high_widthUs = width; int revolutionCounter = getRevolutionCounter(); totalOnTimeAccumulatorUs += width; if (currentRevolutionCounter != revolutionCounter) { /** * We are here in case of a new engine cycle */ currentRevolutionCounter = revolutionCounter; prevTotalOnTimeUs = totalOnTimeAccumulatorUs; totalOnTimeAccumulatorUs = 0; waveOffsetUs = nowUs - previousEngineCycleTimeUs; } periodEventTimeUs = nowUs; // uint32_t period = engineCycleDurationUs; // local copy of volatile variable }
/** * @brief Shaft position callback used by RPM calculation logic. * * This callback is invoked on interrupt thread. */ static void shaftPositionCallback(ShaftEvents ckpSignalType, int index) { itoa10(&shaft_signal_msg_index[1], index); if (ckpSignalType == SHAFT_PRIMARY_UP) { addWaveChartEvent("crank", "up", shaft_signal_msg_index); } else if (ckpSignalType == SHAFT_PRIMARY_DOWN) { addWaveChartEvent("crank", "down", shaft_signal_msg_index); } else if (ckpSignalType == SHAFT_SECONDARY_UP) { addWaveChartEvent("crank2", "up", shaft_signal_msg_index); } else if (ckpSignalType == SHAFT_SECONDARY_DOWN) { addWaveChartEvent("crank2", "down", shaft_signal_msg_index); } if (index != 0) { #if EFI_PROD_CODE || EFI_SIMULATOR if (engineConfiguration->analogChartMode == AC_TRIGGER) acAddData(getCrankshaftAngle(chTimeNow()), 1000 * ckpSignalType + index); #endif return; } rpmState.revolutionCounter++; time_t now = chTimeNow(); int hadRpmRecently = isRunning(); if (hadRpmRecently) { if (isNoisySignal(&rpmState, now)) { // unexpected state. Noise? rpmState.rpm = NOISY_RPM; } else { int diff = now - rpmState.lastRpmEventTime; // 60000 because per minute // * 2 because each revolution of crankshaft consists of two camshaft revolutions // / 4 because each cylinder sends a signal // need to measure time from the previous non-skipped event int rpm = (int)(60000 * TICKS_IN_MS / engineConfiguration->rpmMultiplier / diff); rpmState.rpm = rpm > UNREALISTIC_RPM ? NOISY_RPM : rpm; } } rpmState.lastRpmEventTime = now; #if EFI_PROD_CODE || EFI_SIMULATOR if (engineConfiguration->analogChartMode == AC_TRIGGER) acAddData(getCrankshaftAngle(now), index); #endif }
static void waAnaWidthCallback(WaveReader *reader) { uint64_t nowUs = getTimeNowUs(); reader->eventCounter++; reader->lastActivityTimeUs = nowUs; addWaveChartEvent(reader->name, WC_UP, ""); uint32_t width = nowUs - reader->periodEventTimeUs; reader->last_wave_low_widthUs = width; reader->signalPeriodUs = nowUs - reader->widthEventTimeUs; reader->widthEventTimeUs = nowUs; }
void turnPinLow(io_pin_e pin) { // turn off the output // todo: this XOR should go inside the setOutputPinValue method setOutputPinValue(pin, false); #if EFI_DEFAILED_LOGGING systime_t after = hTimeNow(); debugInt(&signal->logging, "a_time", after - signal->hi_time); scheduleLogging(&signal->logging); #endif /* EFI_DEFAILED_LOGGING */ #if EFI_WAVE_CHART addWaveChartEvent(getPinName(pin), WC_DOWN, ""); #endif /* EFI_WAVE_ANALYZER */ }
void turnPinLow(NamedOutputPin *output) { efiAssertVoid(output!=NULL, "NULL turnPinLow"); #if EFI_GPIO // turn off the output doSetOutputPinValue2(output, false); #endif #if EFI_DEFAILED_LOGGING systime_t after = hTimeNow(); debugInt(&signal->logging, "a_time", after - signal->hi_time); scheduleLogging(&signal->logging); #endif /* EFI_DEFAILED_LOGGING */ #if EFI_WAVE_CHART if (CONFIG(isDigitalChartEnabled)) { // this is a performance optimization - array index is cheaper then invoking a method with 'switch' const char *pinName = output->name; addWaveChartEvent(pinName, WC_DOWN); } #endif /* EFI_WAVE_ANALYZER */ }
void turnPinHigh(io_pin_e pin) { #if EFI_DEFAILED_LOGGING // signal->hi_time = hTimeNow(); #endif /* EFI_DEFAILED_LOGGING */ // turn the output level ACTIVE // todo: this XOR should go inside the setOutputPinValue method setOutputPinValue(pin, TRUE); // sleep for the needed duration #if EFI_PROD_CODE || EFI_SIMULATOR if (pin == SPARKOUT_1_OUTPUT || pin == SPARKOUT_3_OUTPUT) { // time_t now = hTimeNow(); // float an = getCrankshaftAngle(now); // scheduleMsg(&logger, "spark up%d %d", pin, now); // scheduleMsg(&logger, "spark angle %d %f", (int)an, an); } #endif #if EFI_WAVE_CHART addWaveChartEvent(getPinName(pin), WC_UP, ""); #endif /* EFI_WAVE_ANALYZER */ }
void turnPinHigh(NamedOutputPin *output) { efiAssertVoid(output!=NULL, "NULL @ turnPinHigh"); #if EFI_DEFAILED_LOGGING // signal->hi_time = hTimeNow(); #endif /* EFI_DEFAILED_LOGGING */ #if EFI_GPIO // turn the output level ACTIVE // todo: this XOR should go inside the setOutputPinValue method doSetOutputPinValue2(output, true); // sleep for the needed duration #endif #if EFI_WAVE_CHART // explicit check here is a performance optimization to speed up no-chart mode if (CONFIG(isDigitalChartEnabled)) { // this is a performance optimization - array index is cheaper then invoking a method with 'switch' const char *pinName = output->name; // dbgDurr = hal_lld_get_counter_value() - dbgStart; addWaveChartEvent(pinName, WC_UP); } #endif /* EFI_WAVE_ANALYZER */ // dbgDurr = hal_lld_get_counter_value() - dbgStart; }
static ALWAYS_INLINE void reportEventToWaveChart(trigger_event_e ckpSignalType, int index) { itoa10(&shaft_signal_msg_index[2], index); if (ckpSignalType == SHAFT_PRIMARY_UP) { shaft_signal_msg_index[0] = 'u'; addWaveChartEvent(WC_CRANK1, (char* ) shaft_signal_msg_index); } else if (ckpSignalType == SHAFT_PRIMARY_DOWN) { shaft_signal_msg_index[0] = 'd'; addWaveChartEvent(WC_CRANK1, (char* ) shaft_signal_msg_index); } else if (ckpSignalType == SHAFT_SECONDARY_UP) { shaft_signal_msg_index[0] = 'u'; addWaveChartEvent(WC_CRANK2, (char* ) shaft_signal_msg_index); } else if (ckpSignalType == SHAFT_SECONDARY_DOWN) { shaft_signal_msg_index[0] = 'd'; addWaveChartEvent(WC_CRANK2, (char* ) shaft_signal_msg_index); } else if (ckpSignalType == SHAFT_3RD_UP) { shaft_signal_msg_index[0] = 'u'; addWaveChartEvent(WC_CRANK3, (char* ) shaft_signal_msg_index); } else if (ckpSignalType == SHAFT_3RD_DOWN) { shaft_signal_msg_index[0] = 'd'; addWaveChartEvent(WC_CRANK3, (char* ) shaft_signal_msg_index); } }
static void onTdcCallback(void) { itoa10(rpmBuffer, getRpm()); addWaveChartEvent(TOP_DEAD_CENTER_MESSAGE, rpmBuffer, ""); }