parent
82c061a8e0
commit
06ccf524dd
|
@ -809,7 +809,7 @@ void proteusHarley() {
|
||||||
|
|
||||||
// for now we need non wired camInput to keep TS field enable/disable logic happy
|
// for now we need non wired camInput to keep TS field enable/disable logic happy
|
||||||
engineConfiguration->camInputs[0] = PROTEUS_DIGITAL_6;
|
engineConfiguration->camInputs[0] = PROTEUS_DIGITAL_6;
|
||||||
engineConfiguration->vvtMode[0] = VVT_MAP_V_TWIN;
|
engineConfiguration->vvtMode[0] = VVT_MAP_V_TWIN_ANOTHER;
|
||||||
|
|
||||||
engineConfiguration->mapCamAveragingLength = 16;
|
engineConfiguration->mapCamAveragingLength = 16;
|
||||||
engineConfiguration->mapCamSkipFactor = 50;
|
engineConfiguration->mapCamSkipFactor = 50;
|
||||||
|
|
|
@ -109,12 +109,7 @@ typedef enum __attribute__ ((__packed__)) {
|
||||||
|
|
||||||
VVT_NISSAN_MR = 11,
|
VVT_NISSAN_MR = 11,
|
||||||
|
|
||||||
/**
|
VVT_12 = 12,
|
||||||
* MAP sensor gives us pressure drop corresponding to intake stroke of individual cylinder
|
|
||||||
* Due to uneven cylinder firing on a V-Twin this gives us a decodable virtual two tooth cam sensor.
|
|
||||||
* Most HD are 45 degrees with some 60 degree twin.
|
|
||||||
*/
|
|
||||||
VVT_MAP_V_TWIN = 12,
|
|
||||||
|
|
||||||
VVT_MAP_V_TWIN_ANOTHER = 13,
|
VVT_MAP_V_TWIN_ANOTHER = 13,
|
||||||
|
|
||||||
|
|
|
@ -108,24 +108,6 @@ void mapAveragingAdcCallback(adcsample_t adcValue) {
|
||||||
engine->outputChannels.instantMAPValue = instantMap;
|
engine->outputChannels.instantMAPValue = instantMap;
|
||||||
#endif // EFI_TUNER_STUDIO
|
#endif // EFI_TUNER_STUDIO
|
||||||
|
|
||||||
if (engineConfiguration->vvtMode[0] == VVT_MAP_V_TWIN &&
|
|
||||||
((fastMapCounter++ % engineConfiguration->mapCamSkipFactor) == 0)) {
|
|
||||||
engine->triggerCentral.mapState.add(instantMap);
|
|
||||||
bool isPeak = engine->triggerCentral.mapState.isPeak(engineConfiguration->mapCamLookForLowPeaks);
|
|
||||||
#if EFI_TUNER_STUDIO
|
|
||||||
engine->outputChannels.TEMPLOG_map_length = MAP_CAM_BUFFER;
|
|
||||||
engine->outputChannels.TEMPLOG_MAP_INSTANT_AVERAGE = engine->triggerCentral.mapState.current;
|
|
||||||
if (isPeak) {
|
|
||||||
engine->outputChannels.TEMPLOG_map_peak++;
|
|
||||||
}
|
|
||||||
#endif //EFI_TUNER_STUDIO
|
|
||||||
if (isPeak) {
|
|
||||||
efitick_t stamp = getTimeNowNt();
|
|
||||||
hwHandleVvtCamSignal(TV_RISE, stamp, /*index*/0);
|
|
||||||
hwHandleVvtCamSignal(TV_FALL, stamp, /*index*/0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Calculates the average values from the ADC samples.*/
|
/* Calculates the average values from the ADC samples.*/
|
||||||
if (isAveraging) {
|
if (isAveraging) {
|
||||||
// with locking we will have a consistent state
|
// with locking we will have a consistent state
|
||||||
|
|
|
@ -34,32 +34,6 @@ public:
|
||||||
efitick_t accumSignalPrevPeriods[HW_EVENT_TYPES];
|
efitick_t accumSignalPrevPeriods[HW_EVENT_TYPES];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct MapState {
|
|
||||||
float current, previous, prevPrevious;
|
|
||||||
cyclic_buffer<float, MAP_CAM_BUFFER> mapBuffer;
|
|
||||||
|
|
||||||
void add(float value) {
|
|
||||||
// rotate state
|
|
||||||
prevPrevious = previous;
|
|
||||||
previous = current;
|
|
||||||
|
|
||||||
// add new value
|
|
||||||
mapBuffer.add(value);
|
|
||||||
current = mapBuffer.sum(engineConfiguration->mapCamAveragingLength);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isPeak(bool lookForLowPeak) {
|
|
||||||
if (mapBuffer.getCount() < MAP_CAM_BUFFER + 3)
|
|
||||||
return false;
|
|
||||||
if (lookForLowPeak) {
|
|
||||||
return previous < prevPrevious && previous <= current;
|
|
||||||
} else {
|
|
||||||
return previous > prevPrevious && previous >= current;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Maybe merge TriggerCentral and TriggerState classes into one class?
|
* Maybe merge TriggerCentral and TriggerState classes into one class?
|
||||||
* Probably not: we have an instance of TriggerState which is used for trigger initialization,
|
* Probably not: we have an instance of TriggerState which is used for trigger initialization,
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,53 +0,0 @@
|
||||||
/*
|
|
||||||
* test_instant_map.cpp
|
|
||||||
*
|
|
||||||
* Created on: Nov 30, 2021
|
|
||||||
* @author Andrey Belomutskiy, (c) 2012-2021
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "pch.h"
|
|
||||||
|
|
||||||
static char buffer[255];
|
|
||||||
static FILE *fp;
|
|
||||||
static int m_lineIndex = -1;
|
|
||||||
|
|
||||||
bool haveMore() {
|
|
||||||
bool result = fgets(buffer, sizeof(buffer), fp) != nullptr;
|
|
||||||
m_lineIndex++;
|
|
||||||
if (m_lineIndex == 0) {
|
|
||||||
// skip header
|
|
||||||
return haveMore();
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(trigger, instantMap) {
|
|
||||||
const char s[2] = ",";
|
|
||||||
|
|
||||||
fp = fopen("tests/resources/instant_map.csv", "r");
|
|
||||||
ASSERT_TRUE(fp != nullptr);
|
|
||||||
|
|
||||||
MapState mapState;
|
|
||||||
EngineTestHelper eth(TEST_ENGINE);
|
|
||||||
|
|
||||||
while (haveMore()) {
|
|
||||||
strtok(buffer, s);
|
|
||||||
strtok(NULL, s);
|
|
||||||
char *map = strtok(NULL, s);
|
|
||||||
if (map == nullptr) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
double mapValue = std::stod(map);
|
|
||||||
printf("map %f\n", mapValue);
|
|
||||||
|
|
||||||
if (m_lineIndex != 105 && m_lineIndex != 183 && m_lineIndex < 289) {
|
|
||||||
ASSERT_FALSE(mapState.isPeak(false)) << m_lineIndex << " " << mapValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
mapState.add(mapValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASSERT_TRUE(m_lineIndex > 10);
|
|
||||||
|
|
||||||
}
|
|
|
@ -3,73 +3,6 @@
|
||||||
#include "pch.h"
|
#include "pch.h"
|
||||||
#include "trigger_central.h"
|
#include "trigger_central.h"
|
||||||
|
|
||||||
static int getZigZag(int index) {
|
|
||||||
index = index % 1000;
|
|
||||||
|
|
||||||
if (index < 400) {
|
|
||||||
// going up from 0 to 400
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
if (index < 500) {
|
|
||||||
// going down from 400 to 300
|
|
||||||
return 800 - index;
|
|
||||||
}
|
|
||||||
if (index < 600) {
|
|
||||||
// going up from 300 to 400
|
|
||||||
return index - 200;
|
|
||||||
}
|
|
||||||
// going down from 400 to 0
|
|
||||||
return 1000 - index;
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(trigger, map_cam) {
|
|
||||||
EngineTestHelper eth(TEST_ENGINE);
|
|
||||||
|
|
||||||
engineConfiguration->mapCamAveragingLength = 8;
|
|
||||||
MapState state;
|
|
||||||
|
|
||||||
int i = 0;
|
|
||||||
for (;i<403;i++) {
|
|
||||||
state.add(getZigZag(i));
|
|
||||||
|
|
||||||
if (state.mapBuffer.getCount() > engineConfiguration->mapCamAveragingLength) {
|
|
||||||
ASSERT_FALSE(state.isPeak(false)) << "high At " << i;
|
|
||||||
ASSERT_FALSE(state.isPeak(true)) << "low At " << i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
state.add(getZigZag(i));
|
|
||||||
ASSERT_FALSE(state.isPeak(false)) << "high At " << i;
|
|
||||||
ASSERT_FALSE(state.isPeak(true)) << "low At " << i;
|
|
||||||
i++;
|
|
||||||
|
|
||||||
|
|
||||||
state.add(getZigZag(i));
|
|
||||||
ASSERT_TRUE(state.isPeak(false)) << "high At " << i;
|
|
||||||
ASSERT_FALSE(state.isPeak(true)) << "low At " << i;
|
|
||||||
|
|
||||||
for (;i<504;i++) {
|
|
||||||
state.add(getZigZag(i));
|
|
||||||
ASSERT_FALSE(state.isPeak(false)) << "high At " << i;
|
|
||||||
ASSERT_FALSE(state.isPeak(true)) << "low At " << i;
|
|
||||||
}
|
|
||||||
|
|
||||||
state.add(getZigZag(i));
|
|
||||||
ASSERT_FALSE(state.isPeak(false)) << "high At " << i;
|
|
||||||
ASSERT_TRUE(state.isPeak(true)) << "low At " << i;
|
|
||||||
i++;
|
|
||||||
|
|
||||||
for (;i<604;i++) {
|
|
||||||
state.add(getZigZag(i));
|
|
||||||
ASSERT_FALSE(state.isPeak(false)) << "high At " << i;
|
|
||||||
ASSERT_FALSE(state.isPeak(true)) << "low At " << i;
|
|
||||||
}
|
|
||||||
|
|
||||||
state.add(getZigZag(i));
|
|
||||||
ASSERT_TRUE(state.isPeak(false)) << "high At " << i;
|
|
||||||
ASSERT_TRUE(state.isPeak(false)) << "low At " << i;
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(trigger, map_cam_by_magic_point) {
|
TEST(trigger, map_cam_by_magic_point) {
|
||||||
|
|
||||||
EngineTestHelper eth(TEST_CRANK_ENGINE);
|
EngineTestHelper eth(TEST_CRANK_ENGINE);
|
||||||
|
|
Loading…
Reference in New Issue