plumbing for multiple vvt (#2488)

* plumb multiple vvt

* fix test

* s

* fix barra while we're at it

Co-authored-by: Matthew Kennedy <makenne@microsoft.com>
This commit is contained in:
Matthew Kennedy 2021-03-25 04:39:23 -07:00 committed by GitHub
parent ce033e04bb
commit 1c473934b9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 37 additions and 24 deletions

View File

@ -595,7 +595,7 @@ void updateTunerStudioState(TunerStudioOutputChannels *tsOutputChannels DECLARE_
#if EFI_SHAFT_POSITION_INPUT #if EFI_SHAFT_POSITION_INPUT
// 248 // 248
tsOutputChannels->vvtPosition = engine->triggerCentral.getVVTPosition(); tsOutputChannels->vvtPosition = engine->triggerCentral.getVVTPosition(0, 0);
#endif #endif
// 252 // 252

View File

@ -27,9 +27,14 @@ static fsio8_Map3D_u8t vvtTable2("vvt#2");
static Logging *logger; static Logging *logger;
void VvtController::init(int index, const ValueProvider3D* targetMap) { void VvtController::init(int index, int bankIndex, int camIndex, const ValueProvider3D* targetMap) {
this->index = index; this->index = index;
m_pid.initPidClass(&CONFIG(auxPid[index])); m_bank = bankIndex;
m_cam = camIndex;
// Use the same settings for the Nth cam in every bank (ie, all exhaust cams use the same PID)
m_pid.initPidClass(&CONFIG(auxPid[camIndex]));
m_targetMap = targetMap; m_targetMap = targetMap;
} }
@ -47,7 +52,7 @@ void VvtController::PeriodicTask() {
} }
expected<angle_t> VvtController::observePlant() const { expected<angle_t> VvtController::observePlant() const {
return engine->triggerCentral.getVVTPosition(); return engine->triggerCentral.getVVTPosition(m_bank, m_cam);
} }
expected<angle_t> VvtController::getSetpoint() const { expected<angle_t> VvtController::getSetpoint() const {
@ -138,10 +143,10 @@ void initAuxPid(Logging *sharedLogger) {
for (int i = 0;i < CAM_INPUTS_COUNT;i++) { for (int i = 0;i < CAM_INPUTS_COUNT;i++) {
INJECT_ENGINE_REFERENCE(&instances[i]); INJECT_ENGINE_REFERENCE(&instances[i]);
// TODO: this is wrong for cams 3/4 int camIndex = i % CAMS_PER_BANK;
int indexInBank = i % CAMS_PER_BANK; int bankIndex = i / CAMS_PER_BANK;
auto targetMap = indexInBank == 0 ? &vvtTable1 : &vvtTable2; auto targetMap = camIndex == 0 ? &vvtTable1 : &vvtTable2;
instances[i].init(i, targetMap); instances[i].init(i, bankIndex, camIndex, targetMap);
} }
startVvtControlPins(); startVvtControlPins();

View File

@ -24,7 +24,7 @@ class VvtController : public PeriodicTimerController, public ClosedLoopControlle
public: public:
DECLARE_ENGINE_PTR; DECLARE_ENGINE_PTR;
void init(int index, const ValueProvider3D* targetMap); void init(int index, int bankIndex, int camIndex, const ValueProvider3D* targetMap);
// PeriodicTimerController implementation // PeriodicTimerController implementation
int getPeriodMs() override; int getPeriodMs() override;
@ -43,6 +43,12 @@ private:
const ValueProvider3D* m_targetMap = nullptr; const ValueProvider3D* m_targetMap = nullptr;
int index = 0; int index = 0;
// Bank index, 0 or 1
uint8_t m_bank = 0;
// Cam index, 0 = intake, 1 = exhaust
uint8_t m_cam = 0;
public: public:
// todo: encapsulate or inject these // todo: encapsulate or inject these
SimplePwm m_pwm; SimplePwm m_pwm;

View File

@ -120,7 +120,7 @@ struct Sensors2 {
static void populateFrame(Sensors2& msg) { static void populateFrame(Sensors2& msg) {
msg.afr = Sensor::get(SensorType::Lambda1).value_or(0) * 14.7f; msg.afr = Sensor::get(SensorType::Lambda1).value_or(0) * 14.7f;
msg.oilPressure = Sensor::get(SensorType::OilPressure).value_or(-1); msg.oilPressure = Sensor::get(SensorType::OilPressure).value_or(-1);
msg.vvtPos = engine->triggerCentral.getVVTPosition(); msg.vvtPos = engine->triggerCentral.getVVTPosition(0, 0);
msg.vbatt = Sensor::get(SensorType::BatteryVoltage).value_or(0); msg.vbatt = Sensor::get(SensorType::BatteryVoltage).value_or(0);
} }

View File

@ -138,8 +138,9 @@ FsioResult getEngineValue(le_action_e action DECLARE_ENGINE_PARAMETER_SUFFIX) {
return Sensor::get(SensorType::Map).value_or(0); return Sensor::get(SensorType::Map).value_or(0);
#if EFI_SHAFT_POSITION_INPUT #if EFI_SHAFT_POSITION_INPUT
case LE_METHOD_INTAKE_VVT: case LE_METHOD_INTAKE_VVT:
return engine->triggerCentral.getVVTPosition(0, 0);
case LE_METHOD_EXHAUST_VVT: case LE_METHOD_EXHAUST_VVT:
return engine->triggerCentral.getVVTPosition(); return engine->triggerCentral.getVVTPosition(0, 1);
#endif #endif
case LE_METHOD_TIME_SINCE_TRIGGER_EVENT: case LE_METHOD_TIME_SINCE_TRIGGER_EVENT:
return engine->triggerCentral.getTimeSinceTriggerEvent(getTimeNowNt()); return engine->triggerCentral.getTimeSinceTriggerEvent(getTimeNowNt());

View File

@ -79,8 +79,8 @@ EXTERN_ENGINE;
static Logging *logger; static Logging *logger;
angle_t TriggerCentral::getVVTPosition() { angle_t TriggerCentral::getVVTPosition(uint8_t bankIndex, uint8_t camIndex) {
return vvtPosition[0][0]; return vvtPosition[bankIndex][camIndex];
} }
#define miataNbIndex (0) #define miataNbIndex (0)
@ -89,7 +89,8 @@ static bool vvtWithRealDecoder(vvt_mode_e vvtMode) {
return vvtMode == VVT_MIATA_NB2 return vvtMode == VVT_MIATA_NB2
|| vvtMode == VVT_BOSCH_QUICK_START || vvtMode == VVT_BOSCH_QUICK_START
|| vvtMode == VVT_FORD_ST170 || vvtMode == VVT_FORD_ST170
|| vvtMode == VVT_4_1; || vvtMode == VVT_4_1
|| vvtMode == VVT_BARRA_3_PLUS_1;
} }
void hwHandleVvtCamSignal(trigger_value_e front, efitick_t nowNt, int index DECLARE_ENGINE_PARAMETER_SUFFIX) { void hwHandleVvtCamSignal(trigger_value_e front, efitick_t nowNt, int index DECLARE_ENGINE_PARAMETER_SUFFIX) {

View File

@ -57,7 +57,7 @@ public:
TriggerNoiseFilter noiseFilter; TriggerNoiseFilter noiseFilter;
trigger_type_e vvtTriggerType[CAMS_PER_BANK]; trigger_type_e vvtTriggerType[CAMS_PER_BANK];
angle_t getVVTPosition(); angle_t getVVTPosition(uint8_t bankIndex, uint8_t camIndex);
#if EFI_UNIT_TEST #if EFI_UNIT_TEST
// latest VVT event position (could be not synchronization event) // latest VVT event position (could be not synchronization event)

View File

@ -19,7 +19,7 @@ TEST(Vvt, setpoint) {
VvtController dut; VvtController dut;
INJECT_ENGINE_REFERENCE(&dut); INJECT_ENGINE_REFERENCE(&dut);
dut.init(0, &targetMap); dut.init(0, 0, 0, &targetMap);
// Test dut // Test dut
EXPECT_EQ(20, dut.getSetpoint().value_or(0)); EXPECT_EQ(20, dut.getSetpoint().value_or(0));
@ -32,7 +32,7 @@ TEST(Vvt, observePlant) {
VvtController dut; VvtController dut;
INJECT_ENGINE_REFERENCE(&dut); INJECT_ENGINE_REFERENCE(&dut);
dut.init(0, nullptr); dut.init(0, 0, 0, nullptr);
EXPECT_EQ(23, dut.observePlant().value_or(0)); EXPECT_EQ(23, dut.observePlant().value_or(0));
} }

View File

@ -114,7 +114,7 @@ TEST(trigger, testCamInput) {
// asserting that error code has cleared // asserting that error code has cleared
ASSERT_EQ(0, unitTestWarningCodeState.recentWarnings.getCount()) << "warningCounter#testCamInput #3"; ASSERT_EQ(0, unitTestWarningCodeState.recentWarnings.getCount()) << "warningCounter#testCamInput #3";
ASSERT_NEAR(720 - 181, engine->triggerCentral.getVVTPosition(), EPS3D); ASSERT_NEAR(720 - 181, engine->triggerCentral.getVVTPosition(0, 0), EPS3D);
} }
TEST(sensors, testNB2CamInput) { TEST(sensors, testNB2CamInput) {
@ -153,14 +153,14 @@ TEST(sensors, testNB2CamInput) {
// this second important front would give us first real VVT gap duration // this second important front would give us first real VVT gap duration
hwHandleVvtCamSignal(TV_RISE, getTimeNowNt(), 0 PASS_ENGINE_PARAMETER_SUFFIX); hwHandleVvtCamSignal(TV_RISE, getTimeNowNt(), 0 PASS_ENGINE_PARAMETER_SUFFIX);
ASSERT_FLOAT_EQ(0, engine->triggerCentral.getVVTPosition()); ASSERT_FLOAT_EQ(0, engine->triggerCentral.getVVTPosition(0, 0));
ASSERT_EQ(totalRevolutionCountBeforeVvtSync, engine->triggerCentral.triggerState.getTotalRevolutionCounter()); ASSERT_EQ(totalRevolutionCountBeforeVvtSync, engine->triggerCentral.triggerState.getTotalRevolutionCounter());
eth.moveTimeForwardUs(MS2US(130)); eth.moveTimeForwardUs(MS2US(130));
// this third important front would give us first comparison between two real gaps // this third important front would give us first comparison between two real gaps
hwHandleVvtCamSignal(TV_RISE, getTimeNowNt(), 0 PASS_ENGINE_PARAMETER_SUFFIX); hwHandleVvtCamSignal(TV_RISE, getTimeNowNt(), 0 PASS_ENGINE_PARAMETER_SUFFIX);
ASSERT_NEAR(-67.6 - 720 - 720, engine->triggerCentral.getVVTPosition(), EPS3D); ASSERT_NEAR(-67.6 - 720 - 720, engine->triggerCentral.getVVTPosition(0, 0), EPS3D);
// actually position based on VVT! // actually position based on VVT!
ASSERT_EQ(totalRevolutionCountBeforeVvtSync + 2, engine->triggerCentral.triggerState.getTotalRevolutionCounter()); ASSERT_EQ(totalRevolutionCountBeforeVvtSync + 2, engine->triggerCentral.triggerState.getTotalRevolutionCounter());
} }

View File

@ -53,14 +53,14 @@ TEST(trigger, testQuadCam) {
// this second important front would give us first real VVT gap duration // this second important front would give us first real VVT gap duration
hwHandleVvtCamSignal(TV_RISE, getTimeNowNt(), secondCam PASS_ENGINE_PARAMETER_SUFFIX); hwHandleVvtCamSignal(TV_RISE, getTimeNowNt(), secondCam PASS_ENGINE_PARAMETER_SUFFIX);
ASSERT_FLOAT_EQ(0, engine->triggerCentral.getVVTPosition()); ASSERT_FLOAT_EQ(0, engine->triggerCentral.getVVTPosition(0, 0));
ASSERT_EQ(totalRevolutionCountBeforeVvtSync, engine->triggerCentral.triggerState.getTotalRevolutionCounter()); ASSERT_EQ(totalRevolutionCountBeforeVvtSync, engine->triggerCentral.triggerState.getTotalRevolutionCounter());
eth.moveTimeForwardUs(MS2US(130 / d)); eth.moveTimeForwardUs(MS2US(130 / d));
// this third important front would give us first comparison between two real gaps // this third important front would give us first comparison between two real gaps
hwHandleVvtCamSignal(TV_RISE, getTimeNowNt(), secondCam PASS_ENGINE_PARAMETER_SUFFIX); hwHandleVvtCamSignal(TV_RISE, getTimeNowNt(), secondCam PASS_ENGINE_PARAMETER_SUFFIX);
ASSERT_NEAR(-67.6 - 720 - 720 + 160.2, engine->triggerCentral.vvtPosition[0][secondCam], EPS3D); ASSERT_NEAR(-67.6 - 720 - 720 + 160.2, engine->triggerCentral.getVVTPosition(0, 1), EPS3D);
// actually position based on VVT! // actually position based on VVT!
ASSERT_EQ(totalRevolutionCountBeforeVvtSync, engine->triggerCentral.triggerState.getTotalRevolutionCounter()); ASSERT_EQ(totalRevolutionCountBeforeVvtSync, engine->triggerCentral.triggerState.getTotalRevolutionCounter());
@ -78,14 +78,14 @@ TEST(trigger, testQuadCam) {
// this second important front would give us first real VVT gap duration // this second important front would give us first real VVT gap duration
hwHandleVvtCamSignal(TV_RISE, getTimeNowNt(), secondCamSecondBank PASS_ENGINE_PARAMETER_SUFFIX); hwHandleVvtCamSignal(TV_RISE, getTimeNowNt(), secondCamSecondBank PASS_ENGINE_PARAMETER_SUFFIX);
ASSERT_FLOAT_EQ(0, engine->triggerCentral.getVVTPosition()); ASSERT_FLOAT_EQ(0, engine->triggerCentral.getVVTPosition(0, 0));
ASSERT_EQ(totalRevolutionCountBeforeVvtSync, engine->triggerCentral.triggerState.getTotalRevolutionCounter()); ASSERT_EQ(totalRevolutionCountBeforeVvtSync, engine->triggerCentral.triggerState.getTotalRevolutionCounter());
eth.moveTimeForwardUs(MS2US(130 / d)); eth.moveTimeForwardUs(MS2US(130 / d));
// this third important front would give us first comparison between two real gaps // this third important front would give us first comparison between two real gaps
hwHandleVvtCamSignal(TV_RISE, getTimeNowNt(), secondCamSecondBank PASS_ENGINE_PARAMETER_SUFFIX); hwHandleVvtCamSignal(TV_RISE, getTimeNowNt(), secondCamSecondBank PASS_ENGINE_PARAMETER_SUFFIX);
ASSERT_NEAR(-2571.4, engine->triggerCentral.vvtPosition[secondBank][secondCam], EPS3D); ASSERT_NEAR(-2571.4, engine->triggerCentral.getVVTPosition(secondBank, secondCam), EPS3D);
// actually position based on VVT! // actually position based on VVT!
ASSERT_EQ(totalRevolutionCountBeforeVvtSync, engine->triggerCentral.triggerState.getTotalRevolutionCounter()); ASSERT_EQ(totalRevolutionCountBeforeVvtSync, engine->triggerCentral.triggerState.getTotalRevolutionCounter());