29 #if !EFI_SHAFT_POSITION_INPUT
30 fail(
"EFI_SHAFT_POSITION_INPUT required to have EFI_EMULATE_POSITION_SENSORS")
48 #define MAX_MAP_BUFFER_LENGTH (MAX_CYLINDER_COUNT)
60 #if EFI_ENGINE_CONTROL && EFI_PROD_CODE
72 mapAveragingPin.setHigh();
75 { endAveraging, &averager });
80 chibios_rt::CriticalSectionLocker csl;
91 chibios_rt::CriticalSectionLocker csl;
94 m_sum += result.Value;
101 chibios_rt::CriticalSectionLocker csl;
145 float instantMap = mapResult.value_or(0);
152 #if EFI_ENGINE_CONTROL && EFI_PROD_CODE
156 mapAveragingPin.setLow();
179 if (isValidRpm(rpm)) {
194 float cylinderStart = start + cylinderOffset - offsetAngle + tdcPosition();
212 uint32_t index, efitick_t edgeTimestamp) {
213 #if EFI_ENGINE_CONTROL && EFI_PROD_CODE
219 if (!isValidRpm(rpm)) {
232 for (
int i = 0; i < samplingCount; i++) {
238 if (samplingDuration <= 0) {
243 angle_t samplingEnd = samplingStart + samplingDuration;
245 if (cisnan(samplingEnd)) {
254 int structIndex = getRevolutionCounter() % 2;
TriggerCentral triggerCentral
TunerStudioOutputChannels outputChannels
angle_t mapAveragingStart[MAX_CYLINDER_COUNT]
angle_t mapAveragingDuration
SensorResult submit(float sensorVolts)
SensorConverter * m_function
static float getOrZero(SensorType type)
void setValidValue(float value, efitick_t timestamp)
TriggerFormDetails triggerFormDetails
EngineRotationState * getEngineRotationState()
bool warning(ObdCode code, const char *fmt,...)
void mapAveragingTriggerCallback(uint32_t index, efitick_t edgeTimestamp)
static float averagedMapRunningBuffer[MAX_MAP_BUFFER_LENGTH]
void mapAveragingAdcCallback(float instantVoltage)
static scheduling_s startTimers[MAX_CYLINDER_COUNT][2]
static scheduling_s endTimers[MAX_CYLINDER_COUNT][2]
void postMapState(TunerStudioOutputChannels *tsOutputChannels)
static void endAveraging(MapAverager *arg)
static void applyMapMinBufferLength()
static size_t currentMapAverager
static int averagedMapBufIdx
static void startAveraging(scheduling_s *endAveragingScheduling)
void refreshMapAveragingPreCalc()
fail("EFI_SHAFT_POSITION_INPUT required to have EFI_EMULATE_POSITION_SENSORS") static NamedOutputPin mapAveragingPin("map")
MapAverager & getMapAvg(size_t idx)
@ CUSTOM_ERR_MAP_AVG_OFFSET
@ CUSTOM_UNEXPECTED_MAP_VALUE
@ CUSTOM_INSTANT_MAP_DECODING
@ CUSTOM_ERR_MAP_CYL_OFFSET
@ CUSTOM_ERR_MAP_START_ASSERT
@ MapAveragingTriggerCallback
engine_configuration_s * engineConfiguration
efitick_t scheduleByAngle(scheduling_s *timer, efitick_t edgeTimestamp, angle_t angle, action_s action)
expected< float > SensorResult
float samplingAngle[MAP_ANGLE_SIZE]
float samplingWindow[MAP_WINDOW_SIZE]
float samplingWindowBins[MAP_WINDOW_SIZE]
float samplingAngleBins[MAP_ANGLE_SIZE]
virtual SensorResult convert(float raw) const =0
bool measureMapOnlyInOneCylinder
int mapAveragingSchedulingAtIndex
scaled_channel< uint16_t, 30, 1 > instantMAPValue
static void wrapAngle(angle_t &angle, const char *msg, ObdCode code)
angle_t getEngineCycle(operation_mode_e operationMode)