Skip to content

Commit 482e02b

Browse files
author
CCranney
committed
Lucid Dream chime option w/ custom vibration created.
1 parent aa9e5de commit 482e02b

9 files changed

Lines changed: 145 additions & 17 deletions

File tree

src/components/motor/MotorController.cpp

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ void MotorController::Init() {
99
nrf_gpio_cfg_output(PinMap::Motor);
1010
nrf_gpio_pin_set(PinMap::Motor);
1111

12-
shortVib = xTimerCreate("shortVib", 1, pdFALSE, nullptr, StopMotor);
12+
shortVib = xTimerCreate("shortVib", 1, pdFALSE, this, Vibrate);
1313
longVib = xTimerCreate("longVib", pdMS_TO_TICKS(1000), pdTRUE, this, Ring);
14+
step = 0;
1415
}
1516

1617
void MotorController::Ring(TimerHandle_t xTimer) {
@@ -19,9 +20,13 @@ void MotorController::Ring(TimerHandle_t xTimer) {
1920
}
2021

2122
void MotorController::RunForDuration(uint8_t motorDuration) {
22-
if (motorDuration > 0 && xTimerChangePeriod(shortVib, pdMS_TO_TICKS(motorDuration), 0) == pdPASS && xTimerStart(shortVib, 0) == pdPASS) {
23-
nrf_gpio_pin_clear(PinMap::Motor);
24-
}
23+
StopTune();
24+
ScheduleVibrateTimer(motorDuration, true);
25+
}
26+
27+
void MotorController::RunTest() {
28+
StopTune();
29+
ScheduleVibrateTimer(step, true);
2530
}
2631

2732
void MotorController::StartRinging() {
@@ -34,6 +39,43 @@ void MotorController::StopRinging() {
3439
nrf_gpio_pin_set(PinMap::Motor);
3540
}
3641

42+
void MotorController::StopTune() {
43+
step =255;
44+
}
45+
46+
void MotorController::StartTune() {
47+
step = 0;
48+
}
49+
50+
void MotorController::VibrateTune() {
51+
StartTune();
52+
ScheduleVibrateTimer(250, true);
53+
//RunForDuration(5);
54+
}
55+
56+
57+
void MotorController::ScheduleVibrateTimer(uint8_t motorDuration, bool vibrate) {
58+
if (vibrate) {
59+
nrf_gpio_pin_clear(PinMap::Motor);
60+
} else {
61+
nrf_gpio_pin_set(PinMap::Motor);
62+
}
63+
xTimerChangePeriod(shortVib, pdMS_TO_TICKS(motorDuration), 0);
64+
xTimerStart(shortVib, 0);
65+
}
66+
3767
void MotorController::StopMotor(TimerHandle_t xTimer) {
3868
nrf_gpio_pin_set(PinMap::Motor);
3969
}
70+
71+
void MotorController::Vibrate(TimerHandle_t xTimer) {
72+
auto* motorController = static_cast<MotorController*>(pvTimerGetTimerID(xTimer));
73+
74+
if (motorController->step < 13){
75+
motorController->step++;
76+
bool vibrate = motorController->step % 2;
77+
motorController->ScheduleVibrateTimer(50, vibrate);
78+
} else {
79+
nrf_gpio_pin_set(PinMap::Motor);
80+
}
81+
}

src/components/motor/MotorController.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,22 @@ namespace Pinetime {
1515
void RunForDuration(uint8_t motorDuration);
1616
void StartRinging();
1717
void StopRinging();
18+
void VibrateTune();
19+
void RunTest();
1820

1921
private:
2022
static void Ring(TimerHandle_t xTimer);
2123
static void StopMotor(TimerHandle_t xTimer);
24+
static void Vibrate(TimerHandle_t xTimer);
25+
26+
void StopTune();
27+
void StartTune();
28+
void ScheduleVibrateTimer(uint8_t motorDuration, bool vibrate);
29+
2230
TimerHandle_t shortVib;
2331
TimerHandle_t longVib;
32+
uint8_t step;
33+
2434
};
2535
}
2636
}

src/components/settings/Settings.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace Pinetime {
1010
public:
1111
enum class ClockType : uint8_t { H24, H12 };
1212
enum class Notification : uint8_t { On, Off, Sleep };
13-
enum class ChimesOption : uint8_t { None, Hours, HalfHours };
13+
enum class ChimesOption : uint8_t { None, Hours, HalfHours, LucidDream };
1414
enum class WakeUpMode : uint8_t {
1515
SingleTap = 0,
1616
DoubleTap = 1,

src/displayapp/DisplayApp.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,7 @@ void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction)
469469
currentScreen = std::make_unique<Screens::PlaceholderApp>(this);
470470
break;
471471
case Apps::LucidDreamer:
472-
currentScreen = std::make_unique<Screens::LucidDreamer>(this);
472+
currentScreen = std::make_unique<Screens::LucidDreamer>(this, motorController);
473473
break;
474474
case Apps::Navigation:
475475
currentScreen = std::make_unique<Screens::Navigation>(this, systemTask->nimble().navigation());
Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,69 @@
11
#include "displayapp/screens/LucidDreamer.h"
22
#include "displayapp/DisplayApp.h"
3+
#include "displayapp/screens/Symbols.h"
34

45
using namespace Pinetime::Applications::Screens;
56

6-
LucidDreamer::LucidDreamer(DisplayApp* app) : Screen(app) {
7+
namespace {
8+
void eventHandler(lv_obj_t* obj, lv_event_t event) {
9+
auto* screen = static_cast<LucidDreamer*>(obj->user_data);
10+
screen->OnEvent(obj, event);
11+
}
12+
}
13+
14+
LucidDreamer::LucidDreamer(DisplayApp* app,
15+
Pinetime::Controllers::MotorController& motor)
16+
: Screen(app), motor {motor} {
717
lv_obj_t* title = lv_label_create(lv_scr_act(), nullptr);
818
lv_label_set_text_static(title, "lucid\ndreamer");
919
lv_label_set_align(title, LV_LABEL_ALIGN_CENTER);
1020
lv_obj_align(title, lv_scr_act(), LV_ALIGN_CENTER, 0, 0);
21+
22+
play1 = lv_btn_create(lv_scr_act(), nullptr);
23+
play1->user_data = this;
24+
lv_obj_set_event_cb(play1, eventHandler);
25+
lv_obj_set_size(play1, 75, 50);
26+
lv_obj_align(play1, lv_scr_act(), LV_ALIGN_IN_BOTTOM_LEFT, 0, 0);
27+
lblplay1 = lv_label_create(play1, nullptr);
28+
lv_label_set_text_static(lblplay1, Symbols::play);
29+
30+
play2 = lv_btn_create(lv_scr_act(), nullptr);
31+
play2->user_data = this;
32+
lv_obj_set_event_cb(play2, eventHandler);
33+
lv_obj_set_size(play2, 75, 50);
34+
lv_obj_align(play2, lv_scr_act(), LV_ALIGN_IN_BOTTOM_MID, 0, 0);
35+
lblplay2 = lv_label_create(play2, nullptr);
36+
lv_label_set_text_static(lblplay2, Symbols::play);
37+
38+
play3 = lv_btn_create(lv_scr_act(), nullptr);
39+
play3->user_data = this;
40+
lv_obj_set_event_cb(play3, eventHandler);
41+
lv_obj_set_size(play3, 75, 50);
42+
lv_obj_align(play3, lv_scr_act(), LV_ALIGN_IN_BOTTOM_RIGHT, 0, 0);
43+
lblplay3 = lv_label_create(play3, nullptr);
44+
lv_label_set_text_static(lblplay3, Symbols::play);
45+
1146
}
1247

1348
LucidDreamer::~LucidDreamer() {
1449
lv_obj_clean(lv_scr_act());
1550
}
51+
52+
void LucidDreamer::OnEvent(lv_obj_t* obj, lv_event_t event) {
53+
switch (event) {
54+
case LV_EVENT_CLICKED: {
55+
if (obj == play1) {
56+
motor.RunForDuration(50);
57+
}
58+
if (obj == play2) {
59+
motor.RunTest();
60+
}
61+
if (obj == play3) {
62+
motor.VibrateTune();
63+
}
64+
break;
65+
}
66+
default:
67+
break;
68+
}
69+
}

src/displayapp/screens/LucidDreamer.h

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,29 @@
22

33
#include "displayapp/screens/Screen.h"
44
#include <lvgl/lvgl.h>
5+
#include "components/motor/MotorController.h"
6+
57

68
namespace Pinetime {
79
namespace Applications {
810
namespace Screens {
911
class LucidDreamer : public Screen {
1012
public:
11-
LucidDreamer(DisplayApp* app);
13+
LucidDreamer(DisplayApp* app, Controllers::MotorController& motor);
1214
~LucidDreamer() override;
15+
void OnEvent(lv_obj_t* obj, lv_event_t event);
16+
17+
private:
18+
Controllers::MotorController& motor;
19+
lv_obj_t* play1;
20+
lv_obj_t* lblplay1;
21+
lv_obj_t* play2;
22+
lv_obj_t* lblplay2;
23+
lv_obj_t* play3;
24+
lv_obj_t* lblplay3;
25+
26+
27+
1328
};
1429
}
1530
}

src/displayapp/screens/settings/SettingChimes.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ namespace {
1414
}
1515
}
1616

17-
constexpr std::array<SettingChimes::Option, 3> SettingChimes::options;
17+
constexpr std::array<SettingChimes::Option, 4> SettingChimes::options;
1818

1919
SettingChimes::SettingChimes(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settingsController)
2020
: Screen(app), settingsController {settingsController} {

src/displayapp/screens/settings/SettingChimes.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,11 @@ namespace Pinetime {
2323
Controllers::Settings::ChimesOption chimesOption;
2424
const char* name;
2525
};
26-
static constexpr std::array<Option, 3> options = {{
26+
static constexpr std::array<Option, 4> options = {{
2727
{Controllers::Settings::ChimesOption::None, " Off"},
2828
{Controllers::Settings::ChimesOption::Hours, " Every hour"},
29-
{Controllers::Settings::ChimesOption::HalfHours, " Every 30 mins"}
29+
{Controllers::Settings::ChimesOption::HalfHours, " Every 30 mins"},
30+
{Controllers::Settings::ChimesOption::LucidDream, " Lucid Dream Setting"}
3031
}};
3132

3233
std::array<lv_obj_t*, options.size()> cbOption;

src/systemtask/SystemTask.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -390,25 +390,31 @@ void SystemTask::Work() {
390390
case Messages::OnNewHour:
391391
using Pinetime::Controllers::AlarmController;
392392
if (settingsController.GetNotificationStatus() != Controllers::Settings::Notification::Sleep &&
393-
settingsController.GetChimeOption() == Controllers::Settings::ChimesOption::Hours &&
394-
alarmController.State() != AlarmController::AlarmState::Alerting) {
393+
alarmController.State() != AlarmController::AlarmState::Alerting &&
394+
(settingsController.GetChimeOption() == Controllers::Settings::ChimesOption::Hours ||
395+
(settingsController.GetChimeOption() == Controllers::Settings::ChimesOption::LucidDream &&
396+
dateTimeController.Hours() >= 8 &&
397+
dateTimeController.Hours() < 21))) {
395398
if (state == SystemTaskState::Sleeping) {
396399
GoToRunning();
397400
displayApp.PushMessage(Pinetime::Applications::Display::Messages::Clock);
398401
}
399-
motorController.RunForDuration(35);
402+
motorController.VibrateTune();
400403
}
401404
break;
402405
case Messages::OnNewHalfHour:
403406
using Pinetime::Controllers::AlarmController;
404407
if (settingsController.GetNotificationStatus() != Controllers::Settings::Notification::Sleep &&
405-
settingsController.GetChimeOption() == Controllers::Settings::ChimesOption::HalfHours &&
406-
alarmController.State() != AlarmController::AlarmState::Alerting) {
408+
alarmController.State() != AlarmController::AlarmState::Alerting &&
409+
(settingsController.GetChimeOption() == Controllers::Settings::ChimesOption::HalfHours ||
410+
(settingsController.GetChimeOption() == Controllers::Settings::ChimesOption::LucidDream &&
411+
dateTimeController.Hours() > 4 &&
412+
dateTimeController.Hours() < 8))) {
407413
if (state == SystemTaskState::Sleeping) {
408414
GoToRunning();
409415
displayApp.PushMessage(Pinetime::Applications::Display::Messages::Clock);
410416
}
411-
motorController.RunForDuration(35);
417+
motorController.VibrateTune();
412418
}
413419
break;
414420
case Messages::OnChargingEvent:

0 commit comments

Comments
 (0)