From 6d7b802996c64a0f3fe1c45d874f12d4c5766b98 Mon Sep 17 00:00:00 2001 From: rusEfi Date: Wed, 7 Jan 2015 18:03:45 -0600 Subject: [PATCH] auto-sync --- firmware/console/status_loop.cpp | 32 ++++++++++++------- .../controllers/algo/auto_generated_enums.cpp | 20 ------------ firmware/controllers/algo/io_pins.h | 13 -------- firmware/controllers/core/fsio_impl.cpp | 4 ++- firmware/controllers/engine_controller.cpp | 8 +++-- firmware/controllers/idle_thread.cpp | 4 +-- firmware/controllers/injector_central.cpp | 6 ++-- .../controllers/malfunction_indicator.cpp | 6 ++-- firmware/controllers/system/efiGpio.h | 1 + .../controllers/system/pwm_generator_logic.h | 3 +- firmware/development/trigger_emulator.cpp | 8 +++-- firmware/hw_layer/HIP9011.cpp | 5 +-- firmware/hw_layer/io_pins.cpp | 30 ++++++++--------- firmware/hw_layer/pwm_generator.cpp | 7 ++-- firmware/rusefi.cpp | 4 ++- 15 files changed, 70 insertions(+), 81 deletions(-) diff --git a/firmware/console/status_loop.cpp b/firmware/console/status_loop.cpp index 19474da747..00b7ab54ec 100644 --- a/firmware/console/status_loop.cpp +++ b/firmware/console/status_loop.cpp @@ -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 */ diff --git a/firmware/controllers/algo/auto_generated_enums.cpp b/firmware/controllers/algo/auto_generated_enums.cpp index 95b05dcb5e..67ca06ddfd 100644 --- a/firmware/controllers/algo/auto_generated_enums.cpp +++ b/firmware/controllers/algo/auto_generated_enums.cpp @@ -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: diff --git a/firmware/controllers/algo/io_pins.h b/firmware/controllers/algo/io_pins.h index d2301be8bf..a7afd4f3c6 100644 --- a/firmware/controllers/algo/io_pins.h +++ b/firmware/controllers/algo/io_pins.h @@ -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 */ diff --git a/firmware/controllers/core/fsio_impl.cpp b/firmware/controllers/core/fsio_impl.cpp index 29e75576e0..380c44d84d 100644 --- a/firmware/controllers/core/fsio_impl.cpp +++ b/firmware/controllers/core/fsio_impl.cpp @@ -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); } diff --git a/firmware/controllers/engine_controller.cpp b/firmware/controllers/engine_controller.cpp index d72ae05592..861b38f55c 100644 --- a/firmware/controllers/engine_controller.cpp +++ b/firmware/controllers/engine_controller.cpp @@ -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); } } diff --git a/firmware/controllers/idle_thread.cpp b/firmware/controllers/idle_thread.cpp index 31194f11cb..aade5c10d3 100644 --- a/firmware/controllers/idle_thread.cpp +++ b/firmware/controllers/idle_thread.cpp @@ -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) { diff --git a/firmware/controllers/injector_central.cpp b/firmware/controllers/injector_central.cpp index 4a69b79eb8..a5b1b3359b 100644 --- a/firmware/controllers/injector_central.cpp +++ b/firmware/controllers/injector_central.cpp @@ -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); } diff --git a/firmware/controllers/malfunction_indicator.cpp b/firmware/controllers/malfunction_indicator.cpp index 331f2bc455..de7be560d5 100644 --- a/firmware/controllers/malfunction_indicator.cpp +++ b/firmware/controllers/malfunction_indicator.cpp @@ -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); } } diff --git a/firmware/controllers/system/efiGpio.h b/firmware/controllers/system/efiGpio.h index 82945b2e56..9a63e0ef63 100644 --- a/firmware/controllers/system/efiGpio.h +++ b/firmware/controllers/system/efiGpio.h @@ -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 } diff --git a/firmware/controllers/system/pwm_generator_logic.h b/firmware/controllers/system/pwm_generator_logic.h index b5f639cd7f..b985f5e40e 100644 --- a/firmware/controllers/system/pwm_generator_logic.h +++ b/firmware/controllers/system/pwm_generator_logic.h @@ -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; /** diff --git a/firmware/development/trigger_emulator.cpp b/firmware/development/trigger_emulator.cpp index ce9914f370..72d7dbb6e9 100644 --- a/firmware/development/trigger_emulator.cpp +++ b/firmware/development/trigger_emulator.cpp @@ -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 diff --git a/firmware/hw_layer/HIP9011.cpp b/firmware/hw_layer/HIP9011.cpp index bfbf298a9a..e46e634f68 100644 --- a/firmware/hw_layer/HIP9011.cpp +++ b/firmware/hw_layer/HIP9011.cpp @@ -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); diff --git a/firmware/hw_layer/io_pins.cpp b/firmware/hw_layer/io_pins.cpp index c1342d94e1..0d2fdc1fb5 100644 --- a/firmware/hw_layer/io_pins.cpp +++ b/firmware/hw_layer/io_pins.cpp @@ -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 /* diff --git a/firmware/hw_layer/pwm_generator.cpp b/firmware/hw_layer/pwm_generator.cpp index 518c9547fa..9f70dd27da 100644 --- a/firmware/hw_layer/pwm_generator.cpp +++ b/firmware/hw_layer/pwm_generator.cpp @@ -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); diff --git a/firmware/rusefi.cpp b/firmware/rusefi.cpp index 4bf782517b..e50334725d 100644 --- a/firmware/rusefi.cpp +++ b/firmware/rusefi.cpp @@ -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) {