auto-sync

This commit is contained in:
rusEfi 2015-01-07 18:03:45 -06:00
parent 2de4b7e839
commit 6d7b802996
15 changed files with 70 additions and 81 deletions

View File

@ -352,16 +352,28 @@ static THD_WORKING_AREA(lcdThreadStack, UTILITY_THREAD_STACK_SIZE);
*/
static THD_WORKING_AREA(comBlinkingStack, UTILITY_THREAD_STACK_SIZE);
static OutputPin *leds[] = { &outputs[(int)LED_WARNING], &outputs[(int)LED_RUNNING],
&outputs[(int)LED_ERROR],
&outputs[(int)LED_COMMUNICATION_1],
&outputs[(int)LED_EXT_1],
&outputs[(int)LED_CHECK_ENGINE] };
extern OutputPin errorLedPin;
static OutputPin communicationPin;
OutputPin checkEnginePin;
OutputPin warningPin;
OutputPin runningPin;
static OutputPin *leds[] = { &warningPin, &runningPin,
&errorLedPin,
&communicationPin,
&checkEnginePin };
/**
* This method would blink all the LEDs just to test them
*/
static void initialLedsBlink(void) {
outputPinRegister("communication status 1", &communicationPin, LED_COMMUNICATION_PORT, LED_COMMUNICATION_PIN);
#if EFI_WARNING_LED
outputPinRegister("warning", &warningPin, LED_WARNING_PORT, LED_WARNING_PIN);
outputPinRegister("is running status", &runningPin, LED_RUNNING_STATUS_PORT, LED_RUNNING_STATUS_PIN);
#endif /* EFI_WARNING_LED */
int size = sizeof(leds) / sizeof(leds[0]);
for (int i = 0; i < size; i++)
leds[i]->setValue(1);
@ -393,12 +405,10 @@ static void comBlinkingThread(void *arg) {
delay = isConsoleReady() ? 100 : 33;
}
outputs[(int)LED_COMMUNICATION_1].setValue(0);
outputs[(int)LED_EXT_1].setValue(1);
communicationPin.setValue(0);
chThdSleepMilliseconds(delay);
outputs[(int)LED_COMMUNICATION_1].setValue(1);
outputs[(int)LED_EXT_1].setValue(0);
communicationPin.setValue(1);
chThdSleepMilliseconds(delay);
}
}
@ -410,9 +420,9 @@ static void errBlinkingThread(void *arg) {
while (TRUE) {
int delay = 33;
if (isTriggerDecoderError() || isIgnitionTimingError())
outputs[(int)LED_WARNING].setValue(1);
warningPin.setValue(1);
chThdSleepMilliseconds(delay);
outputs[(int)LED_WARNING].setValue(0);
warningPin.setValue(0);
chThdSleepMilliseconds(delay);
}
#endif /* EFI_ENGINE_CONTROL */

View File

@ -81,22 +81,6 @@ case INJECTOR_9_OUTPUT:
return "INJECTOR_9_OUTPUT";
case IO_INVALID:
return "IO_INVALID";
case LED_CHECK_ENGINE:
return "LED_CHECK_ENGINE";
case LED_COMMUNICATION_1:
return "LED_COMMUNICATION_1";
case LED_DEBUG:
return "LED_DEBUG";
case LED_EMULATOR:
return "LED_EMULATOR";
case LED_ERROR:
return "LED_ERROR";
case LED_EXT_1:
return "LED_EXT_1";
case LED_EXT_2:
return "LED_EXT_2";
case LED_EXT_3:
return "LED_EXT_3";
case LED_HUGE_0:
return "LED_HUGE_0";
case LED_HUGE_1:
@ -139,12 +123,8 @@ case LED_HUGE_8:
return "LED_HUGE_8";
case LED_HUGE_9:
return "LED_HUGE_9";
case LED_RUNNING:
return "LED_RUNNING";
case LED_TRIGGER_ERROR:
return "LED_TRIGGER_ERROR";
case LED_WARNING:
return "LED_WARNING";
case MAIN_RELAY:
return "MAIN_RELAY";
case O2_HEATER:

View File

@ -62,15 +62,6 @@ typedef enum {
GPIO_15,
IO_INVALID,
LED_WARNING, // Orange on-board LED
LED_RUNNING, // Green on-board LED
LED_ERROR, // Red on-board LED
LED_COMMUNICATION_1, // Blue on-board LED
LED_EXT_1, // external board LED
LED_EXT_2, // external board LED
LED_EXT_3, // external board LED
LED_DEBUG,
LED_EMULATOR,
LED_TRIGGER_ERROR,
@ -117,9 +108,6 @@ typedef enum {
LED_HUGE_19,
LED_HUGE_20,
// malfunction LED indicator - CheckEngine
LED_CHECK_ENGINE,
FUEL_PUMP_RELAY,
FAN_RELAY,
O2_HEATER,
@ -159,7 +147,6 @@ void turnAllPinsOff(void);
#else
#define turnAllPinsOff() {}
#endif
void outputPinRegisterExt2(const char *msg, io_pin_e ioPin, brain_pin_e brainPin, pin_output_mode_e *outputMode);
#ifdef __cplusplus
}
#endif /* __cplusplus */

View File

@ -312,6 +312,8 @@ void runFsio(void) {
static pin_output_mode_e defa = OM_DEFAULT;
extern OutputPin outputs[IO_PIN_COUNT];
void initFsioImpl(Engine *engine) {
initLogging(&logger, "le");
@ -335,7 +337,7 @@ void initFsioImpl(Engine *engine) {
int frequency = boardConfiguration->fsioFrequency[i];
if (frequency == 0) {
outputPinRegisterExt2(getPinName(pin), pin, boardConfiguration->fsioPins[i], &defa);
outputPinRegisterExt2(getPinName(pin), &outputs[(int)pin], boardConfiguration->fsioPins[i], &defa);
} else {
startSimplePwmExt(&fsioPwm[i], "FSIO", brainPin, pin, frequency, 0.5f, applyPinState);
}

View File

@ -98,6 +98,8 @@ Engine * engine = &_engine;
*/
#define CLEANUP_MODE_TPS 95
extern OutputPin runningPin;
static msg_t csThread(void) {
chRegSetThreadName("status");
#if EFI_SHAFT_POSITION_INPUT || defined(__DOXYGEN__)
@ -107,13 +109,13 @@ static msg_t csThread(void) {
int is_running = rpm > 0 && !is_cranking;
if (is_running) {
// blinking while running
outputs[(int)LED_RUNNING].setValue(0);
runningPin.setValue(0);
chThdSleepMilliseconds(50);
outputs[(int)LED_RUNNING].setValue(1);
runningPin.setValue(1);
chThdSleepMilliseconds(50);
} else {
// constant on while cranking and off if engine is stopped
outputs[(int)LED_RUNNING].setValue(is_cranking);
runningPin.setValue(is_cranking);
chThdSleepMilliseconds(100);
}
}

View File

@ -122,10 +122,10 @@ static void setIdleRpmAction(int value) {
static void applyIdleSolenoidPinState(PwmConfig *state, int stateIndex) {
efiAssertVoid(stateIndex < PWM_PHASE_MAX_COUNT, "invalid stateIndex");
efiAssertVoid(state->multiWave.waveCount == 1, "invalid idle waveCount");
io_pin_e ioPin = state->outputPins[0];
OutputPin *output = state->outputPins[0];
int value = state->multiWave.waves[0].pinStates[stateIndex];
if (!value || engine->rpmCalculator.rpmValue != 0)
setOutputPinValue(ioPin, value);
output->setValue(value);
}
void startIdleThread(Engine *engine) {

View File

@ -43,11 +43,13 @@ static bool_t isRunningBench = false;
static int is_injector_enabled[MAX_INJECTOR_COUNT];
extern OutputPin outputs[IO_PIN_COUNT];
void initIgnitionCentral(void) {
for (int i = 0; i < engineConfiguration->cylindersCount; i++) {
io_pin_e pin = (io_pin_e)((int)SPARKOUT_1_OUTPUT + i);
outputPinRegisterExt2(getPinName(pin), pin, boardConfiguration->ignitionPins[i], &boardConfiguration->ignitionPinMode);
outputPinRegisterExt2(getPinName(pin), &outputs[(int)pin], boardConfiguration->ignitionPins[i], &boardConfiguration->ignitionPinMode);
}
}
@ -231,7 +233,7 @@ void initInjectorCentral(Engine *engine) {
for (int i = 0; i < engineConfiguration->cylindersCount; i++) {
io_pin_e pin = (io_pin_e) ((int) INJECTOR_1_OUTPUT + i);
outputPinRegisterExt2(getPinName(pin), pin, boardConfiguration->injectionPins[i],
outputPinRegisterExt2(getPinName(pin), &outputs[(int)pin], boardConfiguration->injectionPins[i],
&boardConfiguration->injectionPinMode);
}

View File

@ -42,11 +42,13 @@ static THD_WORKING_AREA(mfiThreadStack, UTILITY_THREAD_STACK_SIZE); // declare t
extern OutputPin outputs[IO_PIN_COUNT];
extern OutputPin checkEnginePin;
static void blink_digits(int digit, int duration) {
for (int iter = 0; iter < digit; iter++) {
outputs[(int)LED_CHECK_ENGINE].setValue(0);
checkEnginePin.setValue(0);
chThdSleepMilliseconds(duration);
outputs[(int)LED_CHECK_ENGINE].setValue(1);
checkEnginePin.setValue(1);
chThdSleepMilliseconds(MFI_BLINK_SEPARATOR);
}
}

View File

@ -113,6 +113,7 @@ const char *getPinName(io_pin_e io_pin);
#endif
#define doSetOutputPinValue(pin, logicValue) doSetOutputPinValue2((&outputs[pin]), logicValue)
void outputPinRegisterExt2(const char *msg, OutputPin *output, brain_pin_e brainPin, pin_output_mode_e *outputMode);
#ifdef __cplusplus
}

View File

@ -12,6 +12,7 @@
#include "EfiWave.h"
#include "io_pins.h"
#include "scheduler.h"
#include "efiGpio.h"
typedef struct {
/**
@ -47,7 +48,7 @@ public:
void handleCycleStart();
io_pin_e outputPins[PWM_PHASE_MAX_WAVE_PER_PWM];
OutputPin *outputPins[PWM_PHASE_MAX_WAVE_PER_PWM];
multi_wave_s multiWave;
const char *name;
/**

View File

@ -24,6 +24,8 @@
extern PwmConfig triggerSignal;
extern OutputPin outputs[IO_PIN_COUNT];
void initTriggerEmulator(Engine *engine) {
engine_configuration_s *engineConfiguration = engine->engineConfiguration;
@ -32,9 +34,9 @@ void initTriggerEmulator(Engine *engine) {
#if EFI_EMULATE_POSITION_SENSORS || defined(__DOXYGEN__)
print("Emulating %s\r\n", getConfigurationName(engineConfiguration->engineType));
triggerSignal.outputPins[0] = TRIGGER_EMULATOR_PRIMARY;
triggerSignal.outputPins[1] = TRIGGER_EMULATOR_SECONDARY;
triggerSignal.outputPins[2] = TRIGGER_EMULATOR_3RD;
triggerSignal.outputPins[0] = &outputs[(int)TRIGGER_EMULATOR_PRIMARY];
triggerSignal.outputPins[1] = &outputs[(int)TRIGGER_EMULATOR_SECONDARY];
triggerSignal.outputPins[2] = &outputs[(int)TRIGGER_EMULATOR_3RD];
#if EFI_PROD_CODE
// todo: refactor, make this a loop

View File

@ -36,6 +36,7 @@
#if EFI_HIP_9011 || defined(__DOXYGEN__)
#define HIP_DEBUG FALSE
extern OutputPin outputs[IO_PIN_COUNT];
extern pin_output_mode_e DEFAULT_OUTPUT;
@ -233,8 +234,8 @@ void initHip9011(void) {
spicfg.ssport = getHwPort(boardConfiguration->hip9011CsPin);
spicfg.sspad = getHwPin(boardConfiguration->hip9011CsPin);
outputPinRegisterExt2("hip int/hold", HIP9011_INT_HOLD, boardConfiguration->hip9011IntHoldPin, &DEFAULT_OUTPUT);
outputPinRegisterExt2("hip CS", SPI_CS_HIP9011, boardConfiguration->hip9011CsPin, &DEFAULT_OUTPUT);
outputPinRegisterExt2("hip int/hold", &outputs[(int)HIP9011_INT_HOLD], boardConfiguration->hip9011IntHoldPin, &DEFAULT_OUTPUT);
outputPinRegisterExt2("hip CS", &outputs[(int)SPI_CS_HIP9011], boardConfiguration->hip9011CsPin, &DEFAULT_OUTPUT);
scheduleMsg(&logger, "Starting HIP9011/TPIC8101 driver");
spiStart(driver, &spicfg);

View File

@ -75,21 +75,24 @@ ioportmask_t getHwPin(brain_pin_e brainPin) {
return brainPin % 16;
}
void outputPinRegisterExt2(const char *msg, io_pin_e ioPin, brain_pin_e brainPin, pin_output_mode_e *outputMode) {
void outputPinRegisterExt2(const char *msg, OutputPin *output, brain_pin_e brainPin, pin_output_mode_e *outputMode) {
if (brainPin == GPIO_UNASSIGNED)
return;
GPIO_TypeDef *hwPort = getHwPort(brainPin);
int hwPin = getHwPin(brainPin);
outputPinRegisterExt(msg, &outputs[(int)ioPin], hwPort, hwPin, outputMode);
outputPinRegisterExt(msg, output, hwPort, hwPin, outputMode);
}
void outputPinRegister(const char *msg, OutputPin *output, GPIO_TypeDef *port, uint32_t pin) {
outputPinRegisterExt(msg, output, port, pin, &DEFAULT_OUTPUT);
}
OutputPin errorLedPin;
extern OutputPin checkEnginePin;
void initPrimaryPins(void) {
outputPinRegister("LED_ERROR", &outputs[(int)LED_ERROR], LED_ERROR_PORT, LED_ERROR_PIN);
outputPinRegister("LED_ERROR", &errorLedPin, LED_ERROR_PORT, LED_ERROR_PIN);
}
static void getPinValue(const char *name) {
@ -105,13 +108,6 @@ static void getPinValue(const char *name) {
void initOutputPins(void) {
initLogging(&logger, "io_pins");
#if EFI_WARNING_LED
outputPinRegister("warning", &outputs[(int)LED_WARNING], LED_WARNING_PORT, LED_WARNING_PIN);
outputPinRegister("is running status", &outputs[(int)LED_RUNNING], LED_RUNNING_STATUS_PORT, LED_RUNNING_STATUS_PIN);
#endif /* EFI_WARNING_LED */
outputPinRegister("communication status 1", &outputs[(int)LED_COMMUNICATION_1], LED_COMMUNICATION_PORT, LED_COMMUNICATION_PIN);
/**
* want to make sure it's all zeros so that we can compare in initOutputPinExt() method
*/
@ -122,7 +118,7 @@ void initOutputPins(void) {
// outputPinRegister("ext led 2", LED_EXT_2, EXTRA_LED_2_PORT, EXTRA_LED_2_PIN);
// outputPinRegister("ext led 3", LED_EXT_3, EXTRA_LED_2_PORT, EXTRA_LED_3_PIN);
// outputPinRegister("alive1", LED_DEBUG, GPIOD, 6);
outputPinRegisterExt2("MalfunctionIndicator", LED_CHECK_ENGINE, boardConfiguration->malfunctionIndicatorPin, &DEFAULT_OUTPUT);
outputPinRegisterExt2("MalfunctionIndicator", &checkEnginePin, boardConfiguration->malfunctionIndicatorPin, &DEFAULT_OUTPUT);
// todo: are these needed here? todo: make configurable
// outputPinRegister("spi CS1", SPI_CS_1, SPI_CS1_PORT, SPI_CS1_PIN);
@ -134,14 +130,14 @@ void initOutputPins(void) {
#endif
// todo: should we move this code closer to the fuel pump logic?
outputPinRegisterExt2("fuel pump relay", FUEL_PUMP_RELAY, boardConfiguration->fuelPumpPin, &DEFAULT_OUTPUT);
outputPinRegisterExt2("fuel pump relay", &outputs[(int)FUEL_PUMP_RELAY], boardConfiguration->fuelPumpPin, &DEFAULT_OUTPUT);
outputPinRegisterExt2("main relay", MAIN_RELAY, boardConfiguration->mainRelayPin, &boardConfiguration->mainRelayPinMode);
outputPinRegisterExt2("main relay", &outputs[(int)MAIN_RELAY], boardConfiguration->mainRelayPin, &boardConfiguration->mainRelayPinMode);
outputPinRegisterExt2("fan relay", FAN_RELAY, boardConfiguration->fanPin, &DEFAULT_OUTPUT);
outputPinRegisterExt2("o2 heater", O2_HEATER, boardConfiguration->o2heaterPin, &DEFAULT_OUTPUT);
outputPinRegisterExt2("trg_err", LED_TRIGGER_ERROR, boardConfiguration->triggerErrorPin, &boardConfiguration->triggerErrorPinMode);
outputPinRegisterExt2("A/C relay", AC_RELAY, boardConfiguration->acRelayPin, &boardConfiguration->acRelayPinMode);
outputPinRegisterExt2("fan relay", &outputs[(int)FAN_RELAY], boardConfiguration->fanPin, &DEFAULT_OUTPUT);
outputPinRegisterExt2("o2 heater", &outputs[(int)O2_HEATER], boardConfiguration->o2heaterPin, &DEFAULT_OUTPUT);
outputPinRegisterExt2("trg_err", &outputs[(int)LED_TRIGGER_ERROR], boardConfiguration->triggerErrorPin, &boardConfiguration->triggerErrorPinMode);
outputPinRegisterExt2("A/C relay", &outputs[(int)AC_RELAY], boardConfiguration->acRelayPin, &boardConfiguration->acRelayPinMode);
// digit 1
/*

View File

@ -18,6 +18,7 @@
#include "datalogging.h"
static Logging logger;
extern OutputPin outputs[IO_PIN_COUNT];
/**
* This method controls the actual hardware pins
@ -28,9 +29,9 @@ void applyPinState(PwmConfig *state, int stateIndex) {
efiAssertVoid(stateIndex < PWM_PHASE_MAX_COUNT, "invalid stateIndex");
efiAssertVoid(state->multiWave.waveCount <= PWM_PHASE_MAX_WAVE_PER_PWM, "invalid waveCount");
for (int waveIndex = 0; waveIndex < state->multiWave.waveCount; waveIndex++) {
io_pin_e ioPin = state->outputPins[waveIndex];
OutputPin *output = state->outputPins[waveIndex];
int value = state->multiWave.waves[waveIndex].pinStates[stateIndex];
setOutputPinValue(ioPin, value);
output->setValue(value);
}
}
@ -42,7 +43,7 @@ void startSimplePwm(PwmConfig *state, const char *msg, io_pin_e ioPin, float fre
int *pinStates[1] = { pinStates0 };
state->outputPins[0] = ioPin;
state->outputPins[0] = &outputs[(int)ioPin];
state->periodNt = US2NT(frequency2periodUs(frequency));
weComplexInit(msg, state, 2, switchTimes, 1, pinStates, NULL, stateChangeCallback);

View File

@ -232,11 +232,13 @@ void chDbgStackOverflowPanic(Thread *otp) {
extern OutputPin outputs[IO_PIN_COUNT];
extern OutputPin errorLedPin;
// todo: why is this method here and not in error_handling.c ?
void firmwareError(const char *fmt, ...) {
if (hasFirmwareErrorFlag)
return;
outputs[(int)LED_ERROR].setValue(1);
errorLedPin.setValue(1);
turnAllPinsOff();
hasFirmwareErrorFlag = TRUE;
if (indexOf(fmt, '%') == -1) {