Run servo movement on different core
This commit is contained in:
parent
6256b6ef33
commit
4a88d1a380
@ -65,7 +65,7 @@ public:
|
|||||||
/**
|
/**
|
||||||
* @brief Update the servo state periodically
|
* @brief Update the servo state periodically
|
||||||
*
|
*
|
||||||
* This function should be periodically called to update the servo state,
|
* This function will be periodically called to update the servo state,
|
||||||
* specifically to release the button after the opening time has elapsed.
|
* specifically to release the button after the opening time has elapsed.
|
||||||
*
|
*
|
||||||
* There is no required interval to call this function, but the accuracy of
|
* There is no required interval to call this function, but the accuracy of
|
||||||
@ -78,16 +78,14 @@ public:
|
|||||||
*/
|
*/
|
||||||
void pressButton();
|
void pressButton();
|
||||||
|
|
||||||
/**
|
|
||||||
* Release the door opener button by moving the servo arm.
|
|
||||||
*/
|
|
||||||
void releaseButton();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
// Indicator that the door button is pushed
|
// Indicator that the door button is pushed
|
||||||
bool buttonIsPressed = false;
|
bool buttonIsPressed = false;
|
||||||
|
|
||||||
|
// Indicate that the button should be pressed
|
||||||
|
bool shouldPressButton = false;
|
||||||
|
|
||||||
uint32_t openDuration = 0;
|
uint32_t openDuration = 0;
|
||||||
|
|
||||||
int pressedValue = 0;
|
int pressedValue = 0;
|
||||||
@ -103,4 +101,12 @@ private:
|
|||||||
// PWM Module needed for the servo
|
// PWM Module needed for the servo
|
||||||
ESP32PWM pwm;
|
ESP32PWM pwm;
|
||||||
|
|
||||||
|
// The task on core 1 that resets the servo
|
||||||
|
TaskHandle_t servoResetTask;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Release the door opener button by moving the servo arm.
|
||||||
|
*/
|
||||||
|
void releaseButton();
|
||||||
|
|
||||||
};
|
};
|
@ -64,7 +64,6 @@ void SesameController::configure(ServoConfiguration servoConfig, ServerConfigura
|
|||||||
void SesameController::loop(uint32_t millis) {
|
void SesameController::loop(uint32_t millis) {
|
||||||
currentTime = millis;
|
currentTime = millis;
|
||||||
server.loop(millis);
|
server.loop(millis);
|
||||||
servo.loop(millis);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: Local
|
// MARK: Local
|
||||||
|
@ -4,7 +4,28 @@
|
|||||||
|
|
||||||
ServoController::ServoController() { }
|
ServoController::ServoController() { }
|
||||||
|
|
||||||
|
void performReset(void * pvParameters) {
|
||||||
|
ServoController* servo = (ServoController *) pvParameters;
|
||||||
|
for(;;){
|
||||||
|
servo->loop(millis());
|
||||||
|
delay(50);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ServoController::configure(ServoConfiguration configuration) {
|
void ServoController::configure(ServoConfiguration configuration) {
|
||||||
|
|
||||||
|
// Create a task that runs on a different core,
|
||||||
|
// So that it's always executed
|
||||||
|
xTaskCreatePinnedToCore(
|
||||||
|
performReset, /* Task function. */
|
||||||
|
"Servo", /* name of task. */
|
||||||
|
1000, /* Stack size of task */
|
||||||
|
this, /* parameter of the task */
|
||||||
|
1, /* priority of the task */
|
||||||
|
&servoResetTask,
|
||||||
|
1); /* pin task to core 1 */
|
||||||
|
|
||||||
|
|
||||||
openDuration = configuration.openDuration;
|
openDuration = configuration.openDuration;
|
||||||
pressedValue = configuration.pressedValue;
|
pressedValue = configuration.pressedValue;
|
||||||
releasedValue = configuration.releasedValue;
|
releasedValue = configuration.releasedValue;
|
||||||
@ -15,9 +36,7 @@ void ServoController::configure(ServoConfiguration configuration) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ServoController::pressButton() {
|
void ServoController::pressButton() {
|
||||||
servo.write(pressedValue);
|
shouldPressButton = true;
|
||||||
buttonIsPressed = true;
|
|
||||||
openingEndTime = millis() + openDuration;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ServoController::releaseButton() {
|
void ServoController::releaseButton() {
|
||||||
@ -26,7 +45,12 @@ void ServoController::releaseButton() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ServoController::loop(uint32_t millis) {
|
void ServoController::loop(uint32_t millis) {
|
||||||
if (buttonIsPressed && millis > openingEndTime) {
|
if (shouldPressButton) {
|
||||||
|
servo.write(pressedValue);
|
||||||
|
openingEndTime = millis + openDuration;
|
||||||
|
buttonIsPressed = true;
|
||||||
|
shouldPressButton = false;
|
||||||
|
} else if (buttonIsPressed && millis > openingEndTime) {
|
||||||
releaseButton();
|
releaseButton();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user