rusefi-1/firmware/hw_layer/trigger_input_comp.cpp

118 lines
3.3 KiB
C++
Raw Normal View History

2019-07-27 06:52:01 -07:00
/**
* @file trigger_input_comp.cpp
* @brief Position sensor hardware layer, Using hardware comparator
*
* @date Apr 13, 2019
* @author Andrey Belomutskiy, (c) 2012-2019
* @author andreika <prometheus.pcb@gmail.com>
*/
#include "global.h"
#if (EFI_SHAFT_POSITION_INPUT && HAL_USE_COMP) || defined(__DOXYGEN__)
#include "hal_comp.h"
#include "trigger_input.h"
#include "digital_input_icu.h"
2019-11-11 19:19:35 -08:00
2019-07-27 06:52:01 -07:00
extern bool hasFirmwareErrorFlag;
EXTERN_ENGINE
;
static Logging *logger;
static void comp_shaft_callback(COMPDriver *comp) {
bool isRising = (comp_lld_get_status(comp) & COMP_IRQ_RISING) != 0;
int isPrimary = (comp == EFI_COMP_PRIMARY_DEVICE);
if (!isPrimary && !TRIGGER_SHAPE(needSecondTriggerInput)) {
return;
}
trigger_event_e signal;
if (isRising) {
signal = isPrimary ? (engineConfiguration->invertPrimaryTriggerSignal ? SHAFT_PRIMARY_FALLING : SHAFT_PRIMARY_RISING) :
(engineConfiguration->invertSecondaryTriggerSignal ? SHAFT_SECONDARY_FALLING : SHAFT_SECONDARY_RISING);
} else {
signal = isPrimary ? (engineConfiguration->invertPrimaryTriggerSignal ? SHAFT_PRIMARY_RISING : SHAFT_PRIMARY_FALLING) :
(engineConfiguration->invertSecondaryTriggerSignal ? SHAFT_SECONDARY_RISING : SHAFT_SECONDARY_FALLING);
}
hwHandleShaftSignal(signal);
#ifdef EFI_TRIGGER_DEBUG_BLINK
__blink(1);
#endif
}
// todo: add cam support?
#if 0
static void comp_cam_callback(COMPDriver *comp) {
if (isRising) {
hwHandleVvtCamSignal(TV_RISE);
} else {
hwHandleVvtCamSignal(TV_FALL);
}
}
#endif
static COMPConfig comp_shaft_cfg = {
COMP_OUTPUT_NORMAL, COMP_IRQ_BOTH,
comp_shaft_callback,
0
};
static bool isCompEnabled = false;
void turnOnTriggerInputPins(Logging *sharedLogger) {
logger = sharedLogger;
compInit();
compStart(EFI_COMP_PRIMARY_DEVICE, &comp_shaft_cfg);
applyNewTriggerInputPins();
}
void startTriggerInputPins(void) {
//efiAssertVoid(CUSTOM_ERR_, !isCompEnabled, "isCompEnabled");
const float vRef = 5.0f;
const float vSensorRef = 2.5f; // 2.5V resistor divider
// when VR sensor is silent, there's still some noise around vRef, so we need a small threshold to avoid false triggering
const float noSignalThreshold = 0.05f;
const int maxDacValue = 255;
const int vDac = (int)(int)efiRound(maxDacValue * (vSensorRef - noSignalThreshold) / vRef, 1.0f);
int channel = EFI_COMP_TRIGGER_CHANNEL; // todo: use getInputCaptureChannel(hwPin);
// todo: set pin mode to default (analog/comparator)
//palSetPadMode(comp_channel_port[channel], comp_channel_pad[channel], PAL_MODE_INPUT_ANALOG);
// no generic hal support for extended COMP configuration, so we use hal_lld layer...
osalSysLock();
comp_lld_set_dac_value(EFI_COMP_PRIMARY_DEVICE, vDac);
comp_lld_channel_enable(EFI_COMP_PRIMARY_DEVICE, channel);
osalSysUnlock();
compEnable(EFI_COMP_PRIMARY_DEVICE);
isCompEnabled = true;
}
void stopTriggerInputPins(void) {
if (!isCompEnabled)
return;
compDisable(EFI_COMP_PRIMARY_DEVICE);
isCompEnabled = false;
#if 0
for (int i = 0; i < TRIGGER_SUPPORTED_CHANNELS; i++) {
2019-10-18 15:54:32 -07:00
if (isConfigurationChanged(bc.triggerInputPins[i])) {
2019-07-27 06:52:01 -07:00
turnOffTriggerInputPin(activeConfiguration.bc.triggerInputPins[i]);
}
}
2019-10-18 15:54:32 -07:00
if (isConfigurationChanged(camInput)) {
2019-07-27 06:52:01 -07:00
turnOffTriggerInputPin(activeConfiguration.camInput);
}
#endif
}
#endif /* EFI_SHAFT_POSITION_INPUT && HAL_USE_COMP */