rusefi-1/firmware/hw_layer/digital_input/trigger/trigger_input.cpp

209 lines
5.7 KiB
C++
Raw Normal View History

2019-11-11 18:25:40 -08:00
/*
2019-04-12 05:05:53 -07:00
* @file trigger_input.cpp
2015-07-10 06:01:56 -07:00
*
2019-11-11 18:25:40 -08:00
* @date Nov 11, 2019
* @author Andrey Belomutskiy, (c) 2012-2021
2015-07-10 06:01:56 -07:00
*/
2018-09-16 19:26:57 -07:00
#include "global.h"
2015-07-10 06:01:56 -07:00
#include "trigger_input.h"
2019-04-12 05:05:53 -07:00
/* TODO:
* - merge comparator trigger
*/
2021-07-14 19:02:28 -07:00
#if (EFI_SHAFT_POSITION_INPUT) || defined(__DOXYGEN__)
2015-07-10 06:01:56 -07:00
2019-11-11 19:19:35 -08:00
#if (HAL_USE_ICU == TRUE) || (HAL_TRIGGER_USE_PAL == TRUE)
#if (HAL_USE_ICU == TRUE)
void icuTriggerTurnOnInputPins();
int icuTriggerTurnOnInputPin(const char *msg, int index, bool isTriggerShaft);
void icuTriggerTurnOffInputPin(brain_pin_e brainPin);
#else
#define icuTriggerTurnOnInputPins() ((void)0)
int icuTriggerTurnOnInputPin(const char *msg, int index, bool isTriggerShaft) {
UNUSED(msg);
UNUSED(index);
UNUSED(isTriggerShaft);
return -2;
}
#define icuTriggerTurnOffInputPin(brainPin) ((void)0)
#endif
#if (HAL_TRIGGER_USE_PAL == TRUE)
void extiTriggerTurnOnInputPins();
int extiTriggerTurnOnInputPin(const char *msg, int index, bool isTriggerShaft);
void extiTriggerTurnOffInputPin(brain_pin_e brainPin);
#else
#define extiTriggerTurnOnInputPins() ((void)0)
int extiTriggerTurnOnInputPin(const char *msg, int index, bool isTriggerShaft) {
UNUSED(msg);
UNUSED(index);
UNUSED(isTriggerShaft);
return -2;
}
#define extiTriggerTurnOffInputPin(brainPin) ((void)0)
#endif
enum triggerType {
TRIGGER_NONE,
TRIGGER_ICU,
TRIGGER_EXTI
};
static triggerType shaftTriggerType[TRIGGER_SUPPORTED_CHANNELS];
static triggerType camTriggerType[CAM_INPUTS_COUNT];
static int turnOnTriggerInputPin(const char *msg, int index, bool isTriggerShaft) {
brain_pin_e brainPin = isTriggerShaft ?
CONFIG(triggerInputPins)[index] : engineConfiguration->camInputs[index];
2021-01-31 18:45:01 -08:00
if (isTriggerShaft) {
shaftTriggerType[index] = TRIGGER_NONE;
2021-01-31 18:45:01 -08:00
} else {
camTriggerType[index] = TRIGGER_NONE;
2021-01-31 18:45:01 -08:00
}
2021-01-31 18:45:01 -08:00
if (!isBrainPinValid(brainPin)) {
return 0;
2021-01-31 18:45:01 -08:00
}
/* try ICU first */
#if EFI_ICU_INPUTS
if (icuTriggerTurnOnInputPin(msg, index, isTriggerShaft) >= 0) {
2021-01-31 18:45:01 -08:00
if (isTriggerShaft) {
shaftTriggerType[index] = TRIGGER_ICU;
2021-01-31 18:45:01 -08:00
} else {
camTriggerType[index] = TRIGGER_ICU;
2021-01-31 18:45:01 -08:00
}
return 0;
}
#endif
/* ... then EXTI */
if (extiTriggerTurnOnInputPin(msg, index, isTriggerShaft) >= 0) {
2021-01-31 18:45:01 -08:00
if (isTriggerShaft) {
shaftTriggerType[index] = TRIGGER_EXTI;
2021-01-31 18:45:01 -08:00
} else {
camTriggerType[index] = TRIGGER_EXTI;
2021-01-31 18:45:01 -08:00
}
return 0;
}
firmwareError(CUSTOM_ERR_NOT_INPUT_PIN, "%s: Not input pin %s", msg, hwPortname(brainPin));
return -1;
}
static void turnOffTriggerInputPin(int index, bool isTriggerShaft) {
brain_pin_e brainPin = isTriggerShaft ?
activeConfiguration.triggerInputPins[index] : activeConfiguration.camInputs[index];
if (isTriggerShaft) {
#if EFI_ICU_INPUTS
2021-01-31 18:45:01 -08:00
if (shaftTriggerType[index] == TRIGGER_ICU) {
icuTriggerTurnOffInputPin(brainPin);
2021-01-31 18:45:01 -08:00
}
2021-07-14 19:02:28 -07:00
#endif /* EFI_ICU_INPUTS */
2021-01-31 18:45:01 -08:00
if (shaftTriggerType[index] == TRIGGER_EXTI) {
extiTriggerTurnOffInputPin(brainPin);
2021-01-31 18:45:01 -08:00
}
shaftTriggerType[index] = TRIGGER_NONE;
} else {
#if EFI_ICU_INPUTS
2021-01-31 18:45:01 -08:00
if (camTriggerType[index] == TRIGGER_ICU) {
icuTriggerTurnOffInputPin(brainPin);
2021-01-31 18:45:01 -08:00
}
2021-07-14 19:02:28 -07:00
#endif /* EFI_ICU_INPUTS */
2021-01-31 18:45:01 -08:00
if (camTriggerType[index] == TRIGGER_EXTI) {
extiTriggerTurnOffInputPin(brainPin);
2021-01-31 18:45:01 -08:00
}
camTriggerType[index] = TRIGGER_NONE;
}
}
/*==========================================================================*/
/* Exported functions. */
/*==========================================================================*/
void stopTriggerInputPins(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
2019-11-11 19:19:35 -08:00
for (int i = 0; i < TRIGGER_SUPPORTED_CHANNELS; i++) {
if (isConfigurationChanged(triggerInputPins[i])) {
turnOffTriggerInputPin(i, true);
2019-11-11 19:19:35 -08:00
}
}
for (int i = 0; i < CAM_INPUTS_COUNT; i++) {
if (isConfigurationChanged(camInputs[i])) {
turnOffTriggerInputPin(i, false);
2019-11-11 19:19:35 -08:00
}
}
}
void startTriggerInputPins(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
2019-11-11 19:19:35 -08:00
for (int i = 0; i < TRIGGER_SUPPORTED_CHANNELS; i++) {
if (isConfigurationChanged(triggerInputPins[i])) {
const char * msg = (i == 0 ? "Trigger #1" : (i == 1 ? "Trigger #2" : "Trigger #3"));
turnOnTriggerInputPin(msg, i, true);
2019-11-11 19:19:35 -08:00
}
}
for (int i = 0; i < CAM_INPUTS_COUNT; i++) {
if (isConfigurationChanged(camInputs[i])) {
turnOnTriggerInputPin("Cam", i, false);
2019-11-11 19:19:35 -08:00
}
}
}
void turnOnTriggerInputPins(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
/* init all trigger HW available */
icuTriggerTurnOnInputPins();
extiTriggerTurnOnInputPins();
applyNewTriggerInputPins(PASS_ENGINE_PARAMETER_SIGNATURE);
2019-11-11 19:19:35 -08:00
}
#endif /* (HAL_USE_ICU == TRUE) || (HAL_TRIGGER_USE_PAL == TRUE) */
2019-11-11 19:19:35 -08:00
void stopTriggerDebugPins(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
for (int i = 0; i < TRIGGER_INPUT_PIN_COUNT; i++) {
if (isConfigurationChanged(triggerInputDebugPins[i])) {
efiSetPadUnused(activeConfiguration.triggerInputDebugPins[i] PASS_ENGINE_PARAMETER_SUFFIX);
}
}
for (int i = 0; i < CAM_INPUTS_COUNT; i++) {
if (isConfigurationChanged(camInputsDebug[i])) {
efiSetPadUnused(activeConfiguration.camInputsDebug[i] PASS_ENGINE_PARAMETER_SUFFIX);
}
}
}
void startTriggerDebugPins(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
for (int i = 0; i < TRIGGER_INPUT_PIN_COUNT; i++) {
if (isConfigurationChanged(triggerInputDebugPins[i])) {
efiSetPadMode("trigger debug", CONFIG(triggerInputDebugPins[i]), PAL_MODE_OUTPUT_PUSHPULL PASS_ENGINE_PARAMETER_SUFFIX);
}
}
for (int i = 0; i < CAM_INPUTS_COUNT; i++) {
if (isConfigurationChanged(camInputsDebug[i])) {
efiSetPadMode("cam debug", CONFIG(camInputsDebug[i]), PAL_MODE_OUTPUT_PUSHPULL PASS_ENGINE_PARAMETER_SUFFIX);
}
}
}
void applyNewTriggerInputPins(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
#if EFI_PROD_CODE
2019-04-12 05:05:53 -07:00
// first we will turn off all the changed pins
stopTriggerInputPins(PASS_ENGINE_PARAMETER_SIGNATURE);
2019-04-12 05:05:53 -07:00
// then we will enable all the changed pins
startTriggerInputPins(PASS_ENGINE_PARAMETER_SIGNATURE);
#endif /* EFI_PROD_CODE */
}
2019-11-11 18:25:40 -08:00
#endif /* EFI_SHAFT_POSITION_INPUT */