refactoring trigger system

This commit is contained in:
rusefi 2018-12-24 22:57:36 -05:00
parent 2df38cdd91
commit 5ccc3bbef5
4 changed files with 24 additions and 18 deletions

View File

@ -30,6 +30,7 @@ typedef int8_t pin_state_t;
*
* @brief PWM configuration for the specific output pin
*/
// todo: rename to SingleWave
class single_wave_s {
public:
single_wave_s();
@ -42,16 +43,20 @@ public:
int getState(int index);
void setState(int index, int state);
// todo: make this private
// todo: make this private by using 'getState' and 'setState' methods
pin_state_t *pinStates;
};
/**
* This class represents multi-channel logical signals with shared time axis
*
*/
class MultiWave {
public:
void baseConstructor();
MultiWave();
MultiWave(float *st, single_wave_s *waves);
void init(float *st, single_wave_s *waves);
MultiWave(float *switchTimes, single_wave_s *waves);
void init(float *switchTimes, single_wave_s *waves);
void reset(void);
float getSwitchTime(int phaseIndex) const;
void setSwitchTime(int phaseIndex, float value);

View File

@ -294,6 +294,14 @@ extern bool printTriggerDebug;
#endif
void TriggerShape::addEvent2(angle_t angle, trigger_wheel_e const waveIndex, trigger_value_e const stateParam DECLARE_ENGINE_PARAMETER_SUFFIX) {
/**
* While '720' value works perfectly it has not much sense for crank sensor-only scenario.
*/
addEvent(angle / getEngineCycle(operationMode), engineConfiguration->useOnlyRisingEdgeForTrigger, waveIndex, stateParam);
}
void TriggerShape::addEvent(angle_t angle, bool useOnlyRisingEdgeForTrigger, trigger_wheel_e const waveIndex, trigger_value_e const stateParam) {
efiAssertVoid(CUSTOM_OMODE_UNDEF, operationMode != OM_NONE, "operationMode not set");
efiAssertVoid(CUSTOM_ERR_6598, waveIndex!= T_SECONDARY || needSecondTriggerInput, "secondary needed or not?");
@ -316,15 +324,8 @@ void TriggerShape::addEvent2(angle_t angle, trigger_wheel_e const waveIndex, tri
triggerSignals[privateTriggerDefinitionSize] = signal;
#endif
float engineCycle = getEngineCycle(operationMode);
/**
* While '720' value works perfectly it has not much sense for crank sensor-only scenario.
* todo: accept angle as a value in the 0..1 range?
*/
angle /= engineCycle;
if (!engineConfiguration->useOnlyRisingEdgeForTrigger || stateParam == TV_RISE) {
if (!useOnlyRisingEdgeForTrigger || stateParam == TV_RISE) {
expectedEventCount[waveIndex]++;
}

View File

@ -11,6 +11,7 @@
#include "global.h"
#include "EfiWave.h"
// todo: this header should know nothing about engine or engine configuration. todo: refactor
#include "engine_configuration.h"
/**
@ -172,6 +173,7 @@ public:
*/
int privateTriggerDefinitionSize;
void addEvent(angle_t angle, bool useOnlyRisingEdgeForTrigger, trigger_wheel_e const waveIndex, trigger_value_e const state);
void addEvent2(angle_t angle, trigger_wheel_e const waveIndex, trigger_value_e const state DECLARE_ENGINE_PARAMETER_SUFFIX);
void addEvent2(angle_t angle, trigger_wheel_e const waveIndex, trigger_value_e const stateParam, float filterLeft, float filterRight DECLARE_ENGINE_PARAMETER_SUFFIX);

View File

@ -3,6 +3,11 @@
*
* Global utility header file for firmware
*
* Simulator and unit tests have their own version of this header
*
* While this header contains 'EXTERN_ENGINE' and 'DECLARE_ENGINE_PARAMETER_SIGNATURE' magic,
* this header is not allowed to actually include higher-level engine related headers
*
* @date May 27, 2013
* @author Andrey Belomutskiy, (c) 2012-2017
*/
@ -86,8 +91,6 @@ typedef unsigned int time_t;
#define CCM_OPTIONAL
#endif /* EFI_USE_CCM */
#if EFI_PROD_CODE || defined(__DOXYGEN__)
/**
* The following obscurantism is a hack to reduce stack usage, maybe even a questionable performance
* optimization.
@ -127,11 +130,6 @@ typedef unsigned int time_t;
#define CONFIG(x) persistentState.persistentConfiguration.engineConfiguration.x
#define ENGINE(x) _engine.x
#else
#define EXTERN_ENGINE
#endif
/**
* low-level function is used here to reduce stack usage
*/