static void manualIdleController(int positionPercent) { // todo: this is not great that we have to write into configuration here boardConfiguration->manIdlePosition = positionPercent; if (isCranking()) { positionPercent += engineConfiguration->crankingIdleAdjustment; } percent_t cltCorrectedPosition = interpolate2d(engine->engineState.clt, config->cltIdleCorrBins, config->cltIdleCorr, CLT_CURVE_SIZE) / PERCENT_MULT * positionPercent; // let's put the value into the right range cltCorrectedPosition = maxF(cltCorrectedPosition, 0.01); cltCorrectedPosition = minF(cltCorrectedPosition, 99.9); if (engineConfiguration->debugMode == IDLE) { tsOutputChannels.debugFloatField1 = actualIdlePosition; } if (absF(cltCorrectedPosition - actualIdlePosition) < 1) { return; // value is pretty close, let's leave the poor valve alone } actualIdlePosition = cltCorrectedPosition; if (boardConfiguration->useStepperIdle) { iacMotor.setTargetPosition(cltCorrectedPosition / 100 * engineConfiguration->idleStepperTotalSteps); } else { setIdleValvePwm(cltCorrectedPosition); } }
/** * now - current time in seconds */ int getIdle(IdleValveState *idle, int currentRpm, int now) { if (currentRpm == 0 || isCranking()) { return setNewValue(idle, currentRpm, now, "cranking value: ", DEFAULT_IDLE_DUTY); } if (currentRpm < 0.7 * idle->targetRpmRangeLeft) { return setNewValue(idle, currentRpm, now, "RPMs are seriously low: ", lastGoodValue); } if (now - idle->timeOfLastIdleChange < IDLE_PERIOD) { // too soon to adjust anything - exiting return idle->value; } if (currentRpm > idle->targetRpmRangeLeft && currentRpm < idle->targetRpmRangeRight) { // current RPM is good enough // todo: need idle signal input //lastGoodValue = idle->value; return idle->value; } if (currentRpm >= idle->targetRpmRangeRight + 100) return changeValue(idle, currentRpm, now, "idle control: rpm is too high: ", -IDLE_DECREASE_STEP); if (currentRpm >= idle->targetRpmRangeRight) return changeValue(idle, currentRpm, now, "idle control: rpm is a bit too high: ", -1); // we are here if RPM is low, let's see how low // if (currentRpm < 0.7 * idle->targetRpmRangeLeft) { // // todo: act faster in case of really low RPM? // return setNewValue(idle, currentRpm, now, "RPMs are seriously low: ", 15 * IDLE_INCREASE_STEP); // } else if (currentRpm < idle->targetRpmRangeLeft - 100) { return changeValue(idle, currentRpm, now, "idle control: RPMs are low: ", IDLE_INCREASE_STEP); } return changeValue(idle, currentRpm, now, "idle control: RPMs are a bit low: ", 1); }