aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/motor
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/motor')
-rw-r--r--src/components/motor/MotorController.cpp16
-rw-r--r--src/components/motor/MotorController.h4
2 files changed, 20 insertions, 0 deletions
diff --git a/src/components/motor/MotorController.cpp b/src/components/motor/MotorController.cpp
index d3bd2cf3..3984a7b2 100644
--- a/src/components/motor/MotorController.cpp
+++ b/src/components/motor/MotorController.cpp
@@ -11,6 +11,7 @@ void MotorController::Init() {
shortVib = xTimerCreate("shortVib", 1, pdFALSE, nullptr, StopMotor);
longVib = xTimerCreate("longVib", pdMS_TO_TICKS(1000), pdTRUE, this, Ring);
+ pulse = xTimerCreate("pulse", 1, pdTRUE, this, RingWithLatch);
}
void MotorController::Ring(TimerHandle_t xTimer) {
@@ -18,12 +19,27 @@ void MotorController::Ring(TimerHandle_t xTimer) {
motorController->RunForDuration(50);
}
+void MotorController::RingWithLatch(TimerHandle_t xTimer) {
+ auto* motorController = static_cast<MotorController*>(pvTimerGetTimerID(xTimer));
+ if (--(motorController->pulseLatch) == 0) {
+ xTimerStop(motorController->pulse, 0);
+ }
+ motorController->RunForDuration(50);
+}
+
void MotorController::RunForDuration(uint8_t motorDuration) {
if (motorDuration > 0 && xTimerChangePeriod(shortVib, pdMS_TO_TICKS(motorDuration), 0) == pdPASS && xTimerStart(shortVib, 0) == pdPASS) {
nrf_gpio_pin_clear(PinMap::Motor);
}
}
+void MotorController::Pulse(uint32_t interval, uint8_t repetitions) {
+ pulseLatch = repetitions;
+ if (xTimerChangePeriod(pulse, pdMS_TO_TICKS(interval), 0) == pdPASS) {
+ xTimerStart(pulse, 0);
+ }
+}
+
void MotorController::StartRinging() {
RunForDuration(50);
xTimerStart(longVib, 0);
diff --git a/src/components/motor/MotorController.h b/src/components/motor/MotorController.h
index ab8c956e..04b08b08 100644
--- a/src/components/motor/MotorController.h
+++ b/src/components/motor/MotorController.h
@@ -13,15 +13,19 @@ namespace Pinetime {
void Init();
void RunForDuration(uint8_t motorDuration);
+ void Pulse(uint32_t interval, uint8_t repetitions);
void StartRinging();
void StopRinging();
bool IsRinging();
private:
static void Ring(TimerHandle_t xTimer);
+ static void RingWithLatch(TimerHandle_t xTimer);
static void StopMotor(TimerHandle_t xTimer);
TimerHandle_t shortVib;
TimerHandle_t longVib;
+ TimerHandle_t pulse;
+ uint8_t pulseLatch;
};
}
}