preparing for #974

code comments & refactoring
This commit is contained in:
rusefi 2019-10-14 06:18:08 -04:00
parent 38db34fe58
commit 12137fc7cd
9 changed files with 43 additions and 39 deletions

View File

@ -236,6 +236,9 @@ void refreshMapAveragingPreCalc(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
for (int i = 0; i < engineConfiguration->specs.cylindersCount; i++) {
angle_t cylinderOffset = getEngineCycle(engine->getOperationMode(PASS_ENGINE_PARAMETER_SIGNATURE)) * i / engineConfiguration->specs.cylindersCount;
efiAssertVoid(CUSTOM_ERR_6692, !cisnan(cylinderOffset), "cylinderOffset");
// part of this formula related to specific cylinder offset is never changing - we can
// move the loop into start-up calculation and not have this loop as part of periodic calculation
// todo: change the logic as described above in order to reduce periodic CPU usage?
float cylinderStart = start + cylinderOffset - offsetAngle + tdcPosition();
fixAngle(cylinderStart, "cylinderStart", CUSTOM_ERR_6562);
engine->engineState.mapAveragingStart[i] = cylinderStart;
@ -297,7 +300,9 @@ static void mapAveragingTriggerCallback(trigger_event_e ckpEventType,
fixAngle(samplingEnd, "samplingEnd", CUSTOM_ERR_6563);
// only if value is already prepared
int structIndex = engine->rpmCalculator.getRevolutionCounter() % 2;
int structIndex = getRevolutionCounter() % 2;
// at the moment we schedule based on time prediction based on current RPM and angle
// we are loosing precision in case of changing RPM - the further away is the event the worse is precision
// todo: schedule this based on closest trigger event, same as ignition works
scheduleByAngle(rpm, &startTimer[i][structIndex], samplingStart,
startAveraging, NULL, &engine->rpmCalculator);

View File

@ -18,7 +18,10 @@ void mapAveragingAdcCallback(adcsample_t newValue);
void initMapAveraging(Logging *sharedLogger, Engine *engine);
void refreshMapAveragingPreCalc(DECLARE_ENGINE_PARAMETER_SIGNATURE);
#if EFI_TUNER_STUDIO
void postMapState(TunerStudioOutputChannels *tsOutputChannels);
#endif
#endif /* EFI_MAP_AVERAGING */

View File

@ -6,8 +6,11 @@
* Actual getRpm() is calculated once per crankshaft revolution, based on the amount of time passed
* since the start of previous shaft revolution.
*
* We also have 'instant RPM' logic separate from this 'cycle RPM' logic. Open question is why do we not use
* instant RPM instead of cycle RPM more often.
*
* @date Jan 1, 2013
* @author Andrey Belomutskiy, (c) 2012-2018
* @author Andrey Belomutskiy, (c) 2012-2019
*/
#include "global.h"
@ -21,8 +24,7 @@
#if EFI_PROD_CODE
#include "os_util.h"
#include "engine.h"
#endif
#endif /* EFI_PROD_CODE */
#if EFI_SENSOR_CHART
#include "sensor_chart.h"
@ -85,8 +87,6 @@ extern bool hasFirmwareErrorFlag;
static Logging * logger;
int revolutionCounterSinceBootForUnitTest = 0;
RpmCalculator::RpmCalculator() {
#if !EFI_PROD_CODE
mockRpm = MOCK_UNDEFINED;
@ -96,7 +96,6 @@ RpmCalculator::RpmCalculator() {
// we need this initial to have not_running at first invocation
lastRpmEventTimeNt = (efitime_t) -10 * US2NT(US_PER_SECOND_LL);
revolutionCounterSinceBootForUnitTest = 0;
}
/**
@ -178,12 +177,9 @@ spinning_state_e RpmCalculator::getState() const {
void RpmCalculator::onNewEngineCycle() {
revolutionCounterSinceBoot++;
revolutionCounterSinceStart++;
#if EFI_UNIT_TEST
revolutionCounterSinceBootForUnitTest = revolutionCounterSinceBoot;
#endif /* EFI_UNIT_TEST */
}
uint32_t RpmCalculator::getRevolutionCounter(void) const {
uint32_t RpmCalculator::getRevolutionCounterM(void) const {
return revolutionCounterSinceBoot;
}
@ -230,9 +226,7 @@ void RpmCalculator::setSpinningUp(efitime_t nowNt DECLARE_ENGINE_PARAMETER_SUFFI
void rpmShaftPositionCallback(trigger_event_e ckpSignalType,
uint32_t index DECLARE_ENGINE_PARAMETER_SUFFIX) {
efitick_t nowNt = getTimeNowNt();
#if EFI_PROD_CODE
efiAssertVoid(CUSTOM_ERR_6632, getCurrentRemainingStack() > 256, "lowstckRCL");
#endif
RpmCalculator *rpmState = &engine->rpmCalculator;
@ -315,7 +309,7 @@ static void tdcMarkCallback(trigger_event_e ckpSignalType,
(void) ckpSignalType;
bool isTriggerSynchronizationPoint = index0 == 0;
if (isTriggerSynchronizationPoint && ENGINE(isEngineChartEnabled)) {
int revIndex2 = engine->rpmCalculator.getRevolutionCounter() % 2;
int revIndex2 = getRevolutionCounter() % 2;
int rpm = GET_RPM();
// todo: use tooth event-based scheduling, not just time-based scheduling
if (isValidRpm(rpm)) {
@ -326,12 +320,6 @@ static void tdcMarkCallback(trigger_event_e ckpSignalType,
}
#endif
#if EFI_PROD_CODE || EFI_SIMULATOR
int getRevolutionCounter() {
return engine->rpmCalculator.getRevolutionCounter();
}
#endif
/**
* @return Current crankshaft angle, 0 to 720 for four-stroke
*/
@ -361,7 +349,6 @@ void initRpmCalculator(Logging *sharedLogger DECLARE_ENGINE_PARAMETER_SUFFIX) {
addTriggerEventListener(rpmShaftPositionCallback, "rpm reporter", engine);
}
#if EFI_PROD_CODE || EFI_SIMULATOR
/**
* Schedules a callback 'angle' degree of crankshaft from now.
* The callback would be executed once after the duration of time which
@ -369,14 +356,14 @@ void initRpmCalculator(Logging *sharedLogger DECLARE_ENGINE_PARAMETER_SUFFIX) {
*/
void scheduleByAngle(int rpm, scheduling_s *timer, angle_t angle,
schfunc_t callback, void *param, RpmCalculator *calc DECLARE_ENGINE_PARAMETER_SUFFIX) {
// todo: remove 'calc' parameter
UNUSED(rpm);
efiAssertVoid(CUSTOM_ANGLE_NAN, !cisnan(angle), "NaN angle?");
efiAssertVoid(CUSTOM_ERR_6634, isValidRpm(rpm), "RPM check expected");
float delayUs = calc->oneDegreeUs * angle;
float delayUs = ENGINE(rpmCalculator.oneDegreeUs) * angle;
efiAssertVoid(CUSTOM_ERR_6635, !cisnan(delayUs), "NaN delay?");
engine->executor.scheduleForLater(timer, (int) delayUs, callback, param);
ENGINE(executor.scheduleForLater(timer, (int) delayUs, callback, param));
}
#endif
#else
RpmCalculator::RpmCalculator() {

View File

@ -89,7 +89,7 @@ public:
* This method is invoked once per engine cycle right after we calculate new RPM value
*/
void onNewEngineCycle();
uint32_t getRevolutionCounter(void) const;
uint32_t getRevolutionCounterM(void) const;
void setRpmValue(int value DECLARE_ENGINE_PARAMETER_SUFFIX);
/**
* The same as setRpmValue() but without state change.
@ -158,7 +158,7 @@ void initRpmCalculator(Logging *sharedLogger DECLARE_ENGINE_PARAMETER_SUFFIX);
float getCrankshaftAngleNt(efitime_t timeNt DECLARE_ENGINE_PARAMETER_SUFFIX);
int getRevolutionCounter(void);
#define getRevolutionCounter() ENGINE(rpmCalculator.getRevolutionCounterM())
#if EFI_ENGINE_SNIFFER
#define addEngineSnifferEvent(name, msg) if (ENGINE(isEngineChartEnabled)) { waveChart.addEvent3((name), (msg)); }

View File

@ -36,6 +36,10 @@ int isIgnitionTimingError(void) {
}
static void fireSparkBySettingPinLow(IgnitionEvent *event, IgnitionOutputPin *output) {
#if EFI_UNIT_TEST
Engine *engine = event->engine;
#endif /* EFI_UNIT_TEST */
#if SPARK_EXTREME_LOGGING
scheduleMsg(logger, "spark goes low %d %s %d current=%d cnt=%d id=%d", getRevolutionCounter(), output->name, (int)getTimeNowUs(),
output->currentLogicValue, output->outOfOrder, event->sparkId);
@ -161,7 +165,12 @@ if (engineConfiguration->debugMode == DBG_DWELL_METRIC) {
}
static void startDwellByTurningSparkPinHigh(IgnitionEvent *event, IgnitionOutputPin *output) {
#if EFI_UNIT_TEST
Engine *engine = event->engine;
EXPAND_Engine;
#endif /* EFI_UNIT_TEST */
// todo: no reason for this to be disabled in unit_test mode?!
#if ! EFI_UNIT_TEST
if (GET_RPM_VALUE > 2 * engineConfiguration->cranking.rpm) {

View File

@ -77,7 +77,7 @@ static uint32_t skipUntilEngineCycle = 0;
#if ! EFI_UNIT_TEST
extern WaveChart waveChart;
static void resetNow(void) {
skipUntilEngineCycle = engine->rpmCalculator.getRevolutionCounter() + 3;
skipUntilEngineCycle = getRevolutionCounter() + 3;
waveChart.reset();
}
#endif
@ -169,7 +169,7 @@ void WaveChart::addEvent3(const char *name, const char * msg) {
if (!ENGINE(isEngineChartEnabled)) {
return;
}
if (skipUntilEngineCycle != 0 && ENGINE(rpmCalculator.getRevolutionCounter()) < skipUntilEngineCycle)
if (skipUntilEngineCycle != 0 && getRevolutionCounter() < skipUntilEngineCycle)
return;
#if EFI_SIMULATOR
// todo: add UI control to enable this for firmware if desired

View File

@ -39,7 +39,7 @@ void scAddData(float angle, float value) {
return;
}
if (engine->rpmCalculator.getRevolutionCounter() % engineConfiguration->sensorChartFrequency != 0) {
if (getRevolutionCounter() % engineConfiguration->sensorChartFrequency != 0) {
/**
* We are here if we do NOT need to add an event to the analog chart
*/

View File

@ -80,7 +80,7 @@ void WaveReader::onFallEvent() {
efitick_t width = nowUs - widthEventTimeUs;
last_wave_high_widthUs = width;
int revolutionCounter = engine->rpmCalculator.getRevolutionCounter();
int revolutionCounter = getRevolutionCounter();
totalOnTimeAccumulatorUs += width;
if (currentRevolutionCounter != revolutionCounter) {

View File

@ -584,7 +584,7 @@ static void setTestBug299(EngineTestHelper *eth) {
// inj #0 |.......#|........|.......#|........|
// inj #1 |........|.......#|........|.......#|
ASSERT_EQ( 4, engine->executor.size()) << "qs#00";
ASSERT_EQ( 3, engine->rpmCalculator.getRevolutionCounter()) << "rev cnt#3";
ASSERT_EQ( 3, getRevolutionCounter()) << "rev cnt#3";
eth->assertInjectorUpEvent("setTestBug299: 1@0", 0, MS2US(8.5), 0);
eth->assertInjectorDownEvent("@1", 1, MS2US(10), 0);
eth->assertInjectorUpEvent("1@2", 2, MS2US(18.5), 1);
@ -607,7 +607,7 @@ static void setTestBug299(EngineTestHelper *eth) {
// inj #0 |.......#|........|.......#|........|
// inj #1 |........|.......#|........|.......#|
ASSERT_EQ( 8, engine->executor.size()) << "qs#0";
ASSERT_EQ( 3, engine->rpmCalculator.getRevolutionCounter()) << "rev cnt#3";
ASSERT_EQ( 3, getRevolutionCounter()) << "rev cnt#3";
eth->assertInjectorUpEvent("02@0", 0, MS2US(-11.5), 0);
eth->assertInjectorDownEvent("@1", 1, MS2US(-10), 0);
eth->assertInjectorUpEvent("@2", 2, MS2US(-1.5), 1);
@ -650,7 +650,7 @@ static void setTestBug299(EngineTestHelper *eth) {
// inj #0 |.......#|........|........|........|
// inj #1 |........|.......#|........|........|
ASSERT_EQ( 4, engine->executor.size()) << "qs#0-2";
ASSERT_EQ( 4, engine->rpmCalculator.getRevolutionCounter()) << "rev cnt#4";
ASSERT_EQ( 4, getRevolutionCounter()) << "rev cnt#4";
eth->assertInjectorUpEvent("0@0", 0, MS2US(8.5), 0);
eth->assertInjectorDownEvent("0@1", 1, MS2US(10), 0);
eth->assertInjectorUpEvent("0@2", 2, MS2US(18.5), 1);
@ -706,9 +706,9 @@ void doTestFuelSchedulerBug299smallAndMedium(int startUpDelayMs) {
ASSERT_EQ( 0, engine->executor.size()) << "qs#1#2";
ASSERT_EQ( 4, engine->rpmCalculator.getRevolutionCounter()) << "rev cnt#4#0";
ASSERT_EQ( 4, getRevolutionCounter()) << "rev cnt#4#0";
eth.firePrimaryTriggerRise();
ASSERT_EQ( 5, engine->rpmCalculator.getRevolutionCounter()) << "rev cnt#4#1";
ASSERT_EQ( 5, getRevolutionCounter()) << "rev cnt#4#1";
// time...|0.......|10......|20......|30......|40......|50......|60......|
// inj #0 |########|##...###|########|.....###|########|........|........|
// inj #1 |.....###|########|....####|########|........|........|........|
@ -726,7 +726,7 @@ void doTestFuelSchedulerBug299smallAndMedium(int startUpDelayMs) {
// {
// scheduling_s *ev = engine->executor.getForUnitTest(9);
// ASSERT_EQ( 5, engine->rpmCalculator.getRevolutionCounter()) << "rev cnt#4#2";
// ASSERT_EQ( 5, getRevolutionCounter()) << "rev cnt#4#2";
// ASSERT_TRUE(ev == &engineConfiguration->fuelActuators[2].signalPair[1].signalTimerDown) << "down 50";
// }
@ -736,7 +736,7 @@ void doTestFuelSchedulerBug299smallAndMedium(int startUpDelayMs) {
eth.fireFall(20);
ASSERT_EQ( 8, engine->executor.size()) << "qs#2#1";
ASSERT_EQ( 5, engine->rpmCalculator.getRevolutionCounter()) << "rev cnt#5";
ASSERT_EQ( 5, getRevolutionCounter()) << "rev cnt#5";
// using old fuel schedule - but already wider pulses
// time...|-20.....|-10.....|0.......|10......|20......|30......|40......|
// inj #0 |........|.....###|########|.....###|########|........|........|
@ -781,7 +781,7 @@ void doTestFuelSchedulerBug299smallAndMedium(int startUpDelayMs) {
eth.firePrimaryTriggerRise();
ASSERT_EQ( 4, engine->executor.size()) << "qs#2#2";
ASSERT_EQ( 6, engine->rpmCalculator.getRevolutionCounter()) << "rev cnt6";
ASSERT_EQ( 6, getRevolutionCounter()) << "rev cnt6";
// time...|-20.....|-10.....|0.......|10......|20......|30......|40......|
// inj #0 |########|.....###|########|....####|........|........|........|
// inj #1 |.....###|########|.....###|########|........|........|........|
@ -821,7 +821,7 @@ void doTestFuelSchedulerBug299smallAndMedium(int startUpDelayMs) {
eth.firePrimaryTriggerFall();
ASSERT_EQ( 5, engine->executor.size()) << "qs#3";
ASSERT_EQ( 6, engine->rpmCalculator.getRevolutionCounter()) << "rev cnt6";
ASSERT_EQ( 6, getRevolutionCounter()) << "rev cnt6";
ASSERT_EQ( 0, eth.executeActions()) << "executed #6";