auto-sync

This commit is contained in:
rusEfi 2015-04-07 23:04:53 -05:00
parent 8087cbd567
commit c84fa2ec2e
5 changed files with 65 additions and 16 deletions

View File

@ -177,15 +177,15 @@ static void adcConfigListener(Engine *engine) {
calcFastAdcIndexes();
}
void turnOnHardware(void) {
void turnOnHardware(Logging *sharedLogger) {
#if EFI_SHAFT_POSITION_INPUT || defined(__DOXYGEN__)
turnOnTriggerInputPins();
turnOnTriggerInputPins(sharedLogger);
#endif /* EFI_SHAFT_POSITION_INPUT */
}
void turnOffHardware(void) {
void applyNewHardwareSettings(engine_configuration_s *oldConfiguration) {
#if EFI_SHAFT_POSITION_INPUT || defined(__DOXYGEN__)
turnOffTriggerInputPins();
applyNewTriggerInputPins(oldConfiguration);
#endif /* EFI_SHAFT_POSITION_INPUT */
}
@ -291,7 +291,7 @@ void initHardware(Logging *l, Engine *engine) {
initTriggerCentral(sharedLogger, engine);
#endif /* EFI_SHAFT_POSITION_INPUT */
turnOnHardware();
turnOnHardware(sharedLogger);
#if HAL_USE_SPI || defined(__DOXYGEN__)
initSpiModules(boardConfiguration);

View File

@ -44,6 +44,7 @@ void unlockSpi(void);
#if EFI_PROD_CODE
#include "engine.h"
void applyNewHardwareSettings(engine_configuration_s *oldConfiguration);
void initHardware(Logging *logging, Engine *engine);
#endif /* EFI_PROD_CODE */

View File

@ -18,9 +18,13 @@
#include "engine_configuration.h"
#include "wave_analyzer_hw.h"
#define TRIGGER_SUPPORTED_CHANNELS 2
static ICUDriver *primaryCrankDriver;
EXTERN_ENGINE;
EXTERN_ENGINE
;
static Logging *logger;
/**
* that's hardware timer input capture IRQ entry point
@ -64,7 +68,7 @@ static ICUDriver *turnOnTriggerInputPin(brain_pin_e hwPin) {
shaft_icucfg.channel = ICU_CHANNEL_1;
ICUDriver *driver = getInputCaptureDriver(hwPin);
print("initShaftPositionInputCapture %s\r\n", hwPortname(hwPin));
scheduleMsg(logger, "turnOnTriggerInputPin %s", hwPortname(hwPin));
// todo: reuse 'setWaveReaderMode' method here?
if (driver != NULL) {
efiIcuStart(driver, &shaft_icucfg);
@ -73,15 +77,45 @@ static ICUDriver *turnOnTriggerInputPin(brain_pin_e hwPin) {
return driver;
}
void turnOnTriggerInputPins(void) {
primaryCrankDriver = turnOnTriggerInputPin(boardConfiguration->triggerInputPins[0]);
turnOnTriggerInputPin(boardConfiguration->triggerInputPins[1]);
print("crank input disabled\r\n");
static void turnOffTriggerInputPin(brain_pin_e hwPin) {
ICUDriver *driver = getInputCaptureDriver(hwPin);
if (driver != NULL) {
icuDisable(driver);
icuStop(driver);
scheduleMsg(logger, "turnOffTriggerInputPin %s", hwPortname(hwPin));
unmarkPin(hwPin);
}
}
void turnOffTriggerInputPins(void) {
static void rememberPrimaryChannel(void) {
primaryCrankDriver = getInputCaptureDriver(boardConfiguration->triggerInputPins[0]);
}
void turnOnTriggerInputPins(Logging *sharedLogger) {
logger = sharedLogger;
for (int i = 0; i < TRIGGER_SUPPORTED_CHANNELS; i++) {
turnOnTriggerInputPin(boardConfiguration->triggerInputPins[i]);
}
rememberPrimaryChannel();
}
void applyNewTriggerInputPins(engine_configuration_s *oldConfiguration) {
// first we will turn off all the changed pins
for (int i = 0; i < TRIGGER_SUPPORTED_CHANNELS; i++) {
if (boardConfiguration->triggerInputPins[i] != oldConfiguration->bc.triggerInputPins[i]) {
turnOffTriggerInputPin(oldConfiguration->bc.triggerInputPins[i]);
}
}
// then we will enable all the changed pins
for (int i = 0; i < TRIGGER_SUPPORTED_CHANNELS; i++) {
if (boardConfiguration->triggerInputPins[i] != oldConfiguration->bc.triggerInputPins[i]) {
turnOnTriggerInputPin(boardConfiguration->triggerInputPins[i]);
}
}
turnOffTriggerInputPin(oldConfiguration->bc.triggerInputPins[1]);
rememberPrimaryChannel();
}
#endif /* EFI_SHAFT_POSITION_INPUT */

View File

@ -9,7 +9,9 @@
#ifndef CRANK_INPUT_H_
#define CRANK_INPUT_H_
void turnOnTriggerInputPins(void);
void turnOffTriggerInputPins(void);
#include "engine.h"
void turnOnTriggerInputPins(Logging *sharedLogger);
void applyNewTriggerInputPins(engine_configuration_s *oldConfiguration);
#endif /* CRANK_INPUT_H_ */

View File

@ -168,6 +168,16 @@ void swo_init() {
// *((volatile unsigned *)(ITM_BASE + 0x40304)) = 0x00000100; // Formatter and Flush Control Register
}
static engine_configuration_s activeConfiguration;
static void rememberCurrentConfiguration(void) {
memcpy(&activeConfiguration, engineConfiguration, sizeof(engine_configuration_s));
}
void applyNewConfiguration() {
applyNewHardwareSettings(&activeConfiguration);
}
void runRusEfi(void) {
msObjectInit(&firmwareErrorMessageStream, errorMessageBuffer, sizeof(errorMessageBuffer), 0);
@ -214,13 +224,15 @@ void runRusEfi(void) {
#endif
startStatusThreads(engine);
rememberCurrentConfiguration();
print("Running main loop\r\n");
main_loop_started = true;
/**
* This loop is the closes we have to 'main loop' - but here we only publish the status. The main logic of engine
* control is around main_trigger_callback
*/
while (TRUE) {
while (true) {
efiAssertVoid(getRemainingStack(chThdSelf()) > 128, "stack#1");
#if (EFI_CLI_SUPPORT && !EFI_UART_ECHO_TEST_MODE) || defined(__DOXYGEN__)