diff --git a/firmware/controllers/PwmTester.cpp b/firmware/controllers/PwmTester.cpp index 53bdb2dfbe..54340ce578 100644 --- a/firmware/controllers/PwmTester.cpp +++ b/firmware/controllers/PwmTester.cpp @@ -22,19 +22,22 @@ static SimplePwm pwmTest[5]; extern board_configuration_s *boardConfiguration; +extern OutputPin warningPin; +extern OutputPin outputs[IO_PIN_COUNT]; + static void startPwmTest(int freq) { scheduleMsg(&logger, "running pwm test @%d", freq); // PD13, GPIO_UNASSIGNED because pin is initialized elsewhere already - startSimplePwm(&pwmTest[0], "tester", LED_WARNING, 10, 0.5f, applyPinState); + startSimplePwm(&pwmTest[0], "tester", &warningPin, 10, 0.5f, applyPinState); // currently this is PB9 by default - see boardConfiguration->injectionPins - startSimplePwm(&pwmTest[1], "tester", INJECTOR_1_OUTPUT, freq / 1.3333333333, 0.5f, applyPinState); + startSimplePwm(&pwmTest[1], "tester", &outputs[(int)INJECTOR_1_OUTPUT], freq / 1.3333333333, 0.5f, applyPinState); // currently this is PB8 by default - startSimplePwm(&pwmTest[2], "tester", INJECTOR_2_OUTPUT, freq / 1000, 0.5f, applyPinState); + startSimplePwm(&pwmTest[2], "tester", &outputs[(int)INJECTOR_2_OUTPUT], freq / 1000, 0.5f, applyPinState); // currently this is PE3 by default - startSimplePwm(&pwmTest[3], "tester", INJECTOR_3_OUTPUT, freq, 0.5, applyPinState); + startSimplePwm(&pwmTest[3], "tester", &outputs[(int)INJECTOR_3_OUTPUT], freq, 0.5, applyPinState); // currently this is PE5 by default - startSimplePwm(&pwmTest[4], "tester", INJECTOR_4_OUTPUT, freq / 33.33333333333, 0.5, applyPinState); + startSimplePwm(&pwmTest[4], "tester", &outputs[(int)INJECTOR_4_OUTPUT], freq / 33.33333333333, 0.5, applyPinState); } void initPwmTester(void) { diff --git a/firmware/controllers/system/pwm_generator_logic.cpp b/firmware/controllers/system/pwm_generator_logic.cpp index d390e8b263..2945574641 100644 --- a/firmware/controllers/system/pwm_generator_logic.cpp +++ b/firmware/controllers/system/pwm_generator_logic.cpp @@ -162,10 +162,10 @@ void copyPwmParameters(PwmConfig *state, int phaseCount, float *switchTimes, int } } -void weComplexInit(const char *msg, PwmConfig *state, int phaseCount, float *switchTimes, int waveCount, +void PwmConfig::weComplexInit(const char *msg, int phaseCount, float *switchTimes, int waveCount, int **pinStates, pwm_cycle_callback *cycleCallback, pwm_gen_callback *stateChangeCallback) { - efiAssertVoid(state->periodNt != 0, "period is not initialized"); + efiAssertVoid(periodNt != 0, "period is not initialized"); if (phaseCount == 0) { firmwareError("signal length cannot be zero"); return; @@ -181,18 +181,18 @@ void weComplexInit(const char *msg, PwmConfig *state, int phaseCount, float *swi efiAssertVoid(waveCount > 0, "waveCount should be positive"); checkSwitchTimes2(phaseCount, switchTimes); - state->multiWave.waveCount = waveCount; + this->cycleCallback = cycleCallback; + this->stateChangeCallback = stateChangeCallback; - copyPwmParameters(state, phaseCount, switchTimes, waveCount, pinStates); + multiWave.waveCount = waveCount; - state->cycleCallback = cycleCallback; - state->stateChangeCallback = stateChangeCallback; + copyPwmParameters(this, phaseCount, switchTimes, waveCount, pinStates); - state->safe.phaseIndex = 0; - state->safe.periodNt = -1; - state->safe.iteration = -1; - state->name = msg; + safe.phaseIndex = 0; + safe.periodNt = -1; + safe.iteration = -1; + name = msg; // let's start the indefinite callback loop of PWM generation - timerCallback(state); + timerCallback(this); } diff --git a/firmware/controllers/system/pwm_generator_logic.h b/firmware/controllers/system/pwm_generator_logic.h index b985f5e40e..426f101419 100644 --- a/firmware/controllers/system/pwm_generator_logic.h +++ b/firmware/controllers/system/pwm_generator_logic.h @@ -45,6 +45,12 @@ public: PwmConfig(float *switchTimes, single_wave_s *waves); void init(float *switchTimes, single_wave_s *waves); + void weComplexInit(const char *msg, + int phaseCount, float *swithcTimes, int waveCount, int **pinStates, + pwm_cycle_callback *cycleCallback, + pwm_gen_callback *callback); + + void handleCycleStart(); @@ -87,22 +93,7 @@ public: float _switchTimes[2]; }; -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - void copyPwmParameters(PwmConfig *state, int phaseCount, float *switchTimes, int waveCount, int **pinStates); -void weComplexInit(const char *msg, PwmConfig *state, - int phaseCount, float *swithcTimes, int waveCount, int **pinStates, - pwm_cycle_callback *cycleCallback, - pwm_gen_callback *callback); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - - #endif /* PWM_GENERATOR_LOGIC_H_ */ diff --git a/firmware/controllers/trigger/trigger_emulator_algo.cpp b/firmware/controllers/trigger/trigger_emulator_algo.cpp index 376f563111..cc25c6a5c3 100644 --- a/firmware/controllers/trigger/trigger_emulator_algo.cpp +++ b/firmware/controllers/trigger/trigger_emulator_algo.cpp @@ -140,7 +140,7 @@ void initTriggerEmulatorLogic(Engine *engine) { setTriggerEmulatorRPM(engineConfiguration->bc.triggerSimulatorFrequency, engine); int *pinStates[PWM_PHASE_MAX_WAVE_PER_PWM] = { s->wave.waves[0].pinStates, s->wave.waves[1].pinStates, s->wave.waves[2].pinStates }; - weComplexInit("position sensor", &triggerSignal, s->getSize(), s->wave.switchTimes, PWM_PHASE_MAX_WAVE_PER_PWM, + triggerSignal.weComplexInit("position sensor", s->getSize(), s->wave.switchTimes, PWM_PHASE_MAX_WAVE_PER_PWM, pinStates, updateTriggerShapeIfNeeded, emulatorApplyPinState); addConsoleActionIP("rpm", (VoidIntVoidPtr)setTriggerEmulatorRPM, engine); diff --git a/firmware/hw_layer/pwm_generator.cpp b/firmware/hw_layer/pwm_generator.cpp index 19ce4f0b3f..7c447397dc 100644 --- a/firmware/hw_layer/pwm_generator.cpp +++ b/firmware/hw_layer/pwm_generator.cpp @@ -17,9 +17,6 @@ #include "pin_repository.h" #include "datalogging.h" -static Logging logger; -extern OutputPin outputs[IO_PIN_COUNT]; - /** * This method controls the actual hardware pins * @@ -46,7 +43,7 @@ void startSimplePwm(PwmConfig *state, const char *msg, OutputPin *output, float state->outputPins[0] = output; state->periodNt = US2NT(frequency2periodUs(frequency)); - weComplexInit(msg, state, 2, switchTimes, 1, pinStates, NULL, stateChangeCallback); + state->weComplexInit(msg, 2, switchTimes, 1, pinStates, NULL, stateChangeCallback); } void startSimplePwmExt(PwmConfig *state, const char *msg, brain_pin_e brainPin, OutputPin *output, float frequency, @@ -60,6 +57,5 @@ void startSimplePwmExt(PwmConfig *state, const char *msg, brain_pin_e brainPin, } void initPwmGenerator(void) { - initLogging(&logger, "PWM gen"); } diff --git a/firmware/hw_layer/pwm_generator.h b/firmware/hw_layer/pwm_generator.h index 1d84bebd82..d959f1f160 100644 --- a/firmware/hw_layer/pwm_generator.h +++ b/firmware/hw_layer/pwm_generator.h @@ -15,13 +15,23 @@ #include "gpio_helper.h" -void startSimplePwm(PwmConfig *state, const char *msg, OutputPin *output, - float dutyCycle, float frequency, pwm_gen_callback *stateChangeCallback); -void applyPinState(PwmConfig *state, int stateIndex); - void initPwmGenerator(void); +/** + * start a one-channel PWM driver + */ +void startSimplePwm(PwmConfig *state, const char *msg, OutputPin *output, + float dutyCycle, float frequency, pwm_gen_callback *stateChangeCallback); + +/** + * initialize GPIO pin and start a one-channel PWM driver + */ void startSimplePwmExt(PwmConfig *state, const char *msg, brain_pin_e brainPin, OutputPin *output, float frequency, float dutyCycle, pwm_gen_callback *stateChangeCallback); +/** + * default implementation of pwm_gen_callback which simply toggles the pins + */ +void applyPinState(PwmConfig *state, int stateIndex); + #endif /* PWM_GENERATOR_H_ */ diff --git a/firmware/rusefi.cpp b/firmware/rusefi.cpp index e50334725d..04b327f80a 100644 --- a/firmware/rusefi.cpp +++ b/firmware/rusefi.cpp @@ -268,5 +268,5 @@ int getRusEfiVersion(void) { return 1; // this is here to make the compiler happy about the unused array if (UNUSED_CCM_SIZE == 0) return 1; // this is here to make the compiler happy about the unused array - return 20150107; + return 20150108; }