diff --git a/firmware/controllers/idle_thread.cpp b/firmware/controllers/idle_thread.cpp index 49dbb617f9..236819fd94 100644 --- a/firmware/controllers/idle_thread.cpp +++ b/firmware/controllers/idle_thread.cpp @@ -36,6 +36,11 @@ #if EFI_IDLE_CONTROL || defined(__DOXYGEN__) #include "allsensors.h" +#ifndef STEPPER_DIRECTION_PIN_MODE +// todo: migrate this to boardConfiguration->idle.stepperDirectionPinMode +#define STEPPER_DIRECTION_PIN_MODE OM_DEFAULT +#endif /* STEPPER_DIRECTION_PIN_MODE */ + static THD_WORKING_AREA(ivThreadStack, UTILITY_THREAD_STACK_SIZE); static Logging *logger; @@ -315,9 +320,9 @@ static void applyIdleSolenoidPinState(PwmConfig *state, int stateIndex) { static void initIdleHardware() { if (boardConfiguration->useStepperIdle) { - iacMotor.initialize(boardConfiguration->idle.stepperStepPin, boardConfiguration->idle.stepperDirectionPin, - engineConfiguration->idleStepperReactionTime, engineConfiguration->idleStepperTotalSteps, - engineConfiguration->stepperEnablePin); + iacMotor.initialize(boardConfiguration->idle.stepperStepPin, boardConfiguration->idle.stepperDirectionPin, + STEPPER_DIRECTION_PIN_MODE, engineConfiguration->idleStepperReactionTime, + engineConfiguration->idleStepperTotalSteps, engineConfiguration->stepperEnablePin); } else { /** * Start PWM for idleValvePin diff --git a/firmware/hw_layer/stepper.cpp b/firmware/hw_layer/stepper.cpp index 408aed3182..894cd31ca3 100644 --- a/firmware/hw_layer/stepper.cpp +++ b/firmware/hw_layer/stepper.cpp @@ -16,7 +16,7 @@ EXTERN_ENGINE; static msg_t stThread(StepperMotor *motor) { chRegSetThreadName("stepper"); - palWritePad(motor->directionPort, motor->directionPin, false); + motor->directionPin.setValue(false); /** * let's park the motor in a known position to begin with @@ -37,7 +37,7 @@ static msg_t stThread(StepperMotor *motor) { continue; } bool isIncrementing = targetPosition > currentPosition; - palWritePad(motor->directionPort, motor->directionPin, isIncrementing); + motor->directionPin.setValue(isIncrementing); if (isIncrementing) { motor->currentPosition++; } else { @@ -57,8 +57,6 @@ static msg_t stThread(StepperMotor *motor) { StepperMotor::StepperMotor() { currentPosition = 0; targetPosition = 0; - directionPort = NULL; - directionPin = 0; enablePort = NULL; enablePin = 0; stepPort = NULL; @@ -86,8 +84,8 @@ void StepperMotor::pulse() { palWritePad(enablePort, enablePin, true); // disable stepper } -void StepperMotor::initialize(brain_pin_e stepPin, brain_pin_e directionPin, float reactionTime, int totalSteps, - brain_pin_e enablePin) { +void StepperMotor::initialize(brain_pin_e stepPin, brain_pin_e directionPin, pin_output_mode_e directionPinMode, + float reactionTime, int totalSteps, brain_pin_e enablePin) { this->reactionTime = maxF(1, reactionTime); this->totalSteps = maxI(3, totalSteps); if (stepPin == GPIO_UNASSIGNED || directionPin == GPIO_UNASSIGNED) { @@ -97,14 +95,13 @@ void StepperMotor::initialize(brain_pin_e stepPin, brain_pin_e directionPin, flo stepPort = getHwPort(stepPin); this->stepPin = getHwPin(stepPin); - directionPort = getHwPort(directionPin); - this->directionPin = getHwPin(directionPin); + this->directionPinMode = directionPinMode; + this->directionPin.initPin("stepper dir", directionPin, &this->directionPinMode); enablePort = getHwPort(enablePin); this->enablePin = getHwPin(enablePin); efiSetPadMode("stepper step", stepPin, PAL_MODE_OUTPUT_PUSHPULL); - efiSetPadMode("stepper dir", directionPin, PAL_MODE_OUTPUT_PUSHPULL); efiSetPadMode("stepper enable", enablePin, PAL_MODE_OUTPUT_PUSHPULL); palWritePad(this->enablePort, enablePin, true); // disable stepper diff --git a/firmware/hw_layer/stepper.h b/firmware/hw_layer/stepper.h index 24c07b0ca4..1bd0fb1867 100644 --- a/firmware/hw_layer/stepper.h +++ b/firmware/hw_layer/stepper.h @@ -8,18 +8,18 @@ #define STEPPER_H_ #include "main.h" +#include "efiGpio.h" class StepperMotor { public: StepperMotor(); - void initialize(brain_pin_e stepPin, brain_pin_e directionPin, float reactionTime, int totalSteps, + void initialize(brain_pin_e stepPin, brain_pin_e directionPin, pin_output_mode_e directionPinMode, float reactionTime, int totalSteps, brain_pin_e enablePin); void pulse(); void setTargetPosition(int targetPosition); int getTargetPosition(); - ioportid_t directionPort; - ioportmask_t directionPin; + OutputPin directionPin; int currentPosition; float reactionTime; int totalSteps; @@ -31,6 +31,8 @@ private: ioportid_t enablePort; ioportmask_t enablePin; + pin_output_mode_e directionPinMode; + THD_WORKING_AREA(stThreadStack, UTILITY_THREAD_STACK_SIZE); };