fome-fw/firmware/controllers/trigger/trigger_central.h

147 lines
4.0 KiB
C
Raw Normal View History

2015-07-10 06:01:56 -07:00
/*
* @file trigger_central.h
*
* @date Feb 23, 2014
2020-01-07 21:02:40 -08:00
* @author Andrey Belomutskiy, (c) 2012-2020
2015-07-10 06:01:56 -07:00
*/
2019-12-23 18:56:16 -08:00
#pragma once
2015-07-10 06:01:56 -07:00
#include "rusefi_enums.h"
#include "listener_array.h"
#include "trigger_decoder.h"
2019-09-03 16:30:51 -07:00
#include "trigger_central_generated.h"
#include "timer.h"
#include "pin_repository.h"
#include "local_version_holder.h"
2015-07-10 06:01:56 -07:00
2021-11-24 19:36:36 -08:00
#define MAP_CAM_BUFFER 8
2015-07-10 06:01:56 -07:00
class Engine;
typedef void (*ShaftPositionListener)(trigger_event_e signal, uint32_t index, efitick_t edgeTimestamp);
2015-07-10 06:01:56 -07:00
#define HAVE_CAM_INPUT() (isBrainPinValid(engineConfiguration->camInputs[0]))
2020-01-27 21:16:33 -08:00
class TriggerNoiseFilter {
public:
void resetAccumSignalData();
bool noiseFilter(efitick_t nowNt,
TriggerState * triggerState,
trigger_event_e signal);
2020-01-27 21:16:33 -08:00
efitick_t lastSignalTimes[HW_EVENT_TYPES];
efitick_t accumSignalPeriods[HW_EVENT_TYPES];
efitick_t accumSignalPrevPeriods[HW_EVENT_TYPES];
};
2021-11-24 19:36:36 -08:00
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(MAP_CAM_BUFFER);
}
bool isPeak() {
return previous > prevPrevious && previous >= current;
}
};
2017-05-18 13:16:55 -07:00
/**
* Maybe merge TriggerCentral and TriggerState classes into one class?
* Probably not: we have an instance of TriggerState which is used for trigger initialization,
* also composition probably better than inheritance here
*/
class TriggerCentral final : public trigger_central_s {
2015-07-10 06:01:56 -07:00
public:
TriggerCentral();
void handleShaftSignal(trigger_event_e signal, efitick_t timestamp);
int getHwEventCounter(int index) const;
2015-07-10 06:01:56 -07:00
void resetCounters();
2019-09-02 11:47:05 -07:00
void validateCamVvtCounters();
2021-11-24 19:36:36 -08:00
MapState mapState;
/**
* true if a recent configuration change has changed any of the trigger settings which
* we have not adjusted for yet
*/
bool triggerConfigChanged = false;
LocalVersionHolder triggerVersion;
bool checkIfTriggerConfigChanged();
bool isTriggerConfigChanged();
bool isTriggerDecoderError();
expected<float> getCurrentEnginePhase(efitick_t nowNt) const;
float getTimeSinceTriggerEvent(efitick_t nowNt) const {
return m_lastEventTimer.getElapsedSeconds(nowNt);
}
bool engineMovedRecently() const {
// Trigger event some time in the past second = engine moving
2021-05-02 20:46:30 -07:00
// distributor single tooth, large engines crank at close to 120 RPM
// todo: make this logic account current trigger to stop idle much faster if we have more teeth on trigger wheels?
return getTimeSinceTriggerEvent(getTimeNowNt()) < 1.0f;
}
2020-01-27 21:16:33 -08:00
TriggerNoiseFilter noiseFilter;
2021-10-23 16:01:31 -07:00
int vvtEventRiseCounter[CAM_INPUTS_COUNT];
int vvtEventFallCounter[CAM_INPUTS_COUNT];
2021-02-08 19:07:14 -08:00
trigger_type_e vvtTriggerType[CAMS_PER_BANK];
angle_t getVVTPosition(uint8_t bankIndex, uint8_t camIndex);
2021-01-26 19:54:25 -08:00
#if EFI_UNIT_TEST
2020-05-09 23:36:01 -07:00
// latest VVT event position (could be not synchronization event)
2021-02-08 17:38:38 -08:00
angle_t currentVVTEventPosition[BANKS_COUNT][CAMS_PER_BANK];
2021-01-26 19:54:25 -08:00
#endif // EFI_UNIT_TEST
2020-05-09 23:36:01 -07:00
// synchronization event position
2021-02-08 17:38:38 -08:00
angle_t vvtPosition[BANKS_COUNT][CAMS_PER_BANK];
2020-05-09 23:36:01 -07:00
2021-11-24 20:06:52 -08:00
// todo: convert to Timer!
2021-02-08 17:38:38 -08:00
efitick_t vvtSyncTimeNt[BANKS_COUNT][CAMS_PER_BANK];
2020-08-24 22:24:15 -07:00
TriggerStateWithRunningStatistics triggerState;
TriggerWaveform triggerShape;
2017-03-01 19:18:25 -08:00
2021-02-08 17:38:38 -08:00
TriggerState vvtState[BANKS_COUNT][CAMS_PER_BANK];
2021-02-08 18:28:57 -08:00
TriggerWaveform vvtShape[CAMS_PER_BANK];
2020-08-24 22:24:15 -07:00
2020-08-24 21:59:07 -07:00
TriggerFormDetails triggerFormDetails;
// Keep track of the last time we got a valid trigger event
Timer m_lastEventTimer;
private:
// Keep track of the last time we saw the sync tooth go by (trigger index 0)
Timer m_virtualZeroTimer;
2015-07-10 06:01:56 -07:00
};
void triggerInfo(void);
void hwHandleShaftSignal(int signalIndex, bool isRising, efitick_t timestamp);
void handleShaftSignal(int signalIndex, bool isRising, efitick_t timestamp);
void hwHandleVvtCamSignal(trigger_value_e front, efitick_t timestamp, int index);
2017-12-12 14:36:49 -08:00
void validateTriggerInputs();
void initTriggerCentral();
2015-07-10 06:01:56 -07:00
int isSignalDecoderError(void);
void onConfigurationChangeTriggerCallback();
2020-08-23 23:01:50 -07:00
#define SYMMETRICAL_CRANK_SENSOR_DIVIDER 4
#define SYMMETRICAL_THREE_TIMES_CRANK_SENSOR_DIVIDER 6