Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Chimes option #813

Merged
merged 8 commits into from
Jan 4, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -436,6 +436,7 @@ list(APPEND SOURCE_FILES
displayapp/screens/settings/SettingPineTimeStyle.cpp
displayapp/screens/settings/SettingSetDate.cpp
displayapp/screens/settings/SettingSetTime.cpp
displayapp/screens/settings/SettingChimes.cpp

## Watch faces
displayapp/icons/bg_clock.c
Expand Down
16 changes: 16 additions & 0 deletions src/components/datetime/DateTimeController.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,22 @@ void DateTime::UpdateTime(uint32_t systickCounter) {
minute = time.minutes().count();
second = time.seconds().count();

if(minute == 0 and not isHourAlreadyNotified) {
Avamander marked this conversation as resolved.
Show resolved Hide resolved
isHourAlreadyNotified = true;
if(systemTask != nullptr)
Avamander marked this conversation as resolved.
Show resolved Hide resolved
systemTask->PushMessage(System::Messages::OnNewHour);
} else if (minute != 0) {
isHourAlreadyNotified = false;
}

if((minute == 0 or minute == 30) and not isHalfHourAlreadyNotified) {
isHalfHourAlreadyNotified = true;
if(systemTask != nullptr)
systemTask->PushMessage(System::Messages::OnNewHalfHour);
} else if (minute != 0 and minute != 30) {
isHalfHourAlreadyNotified = false;
}

// Notify new day to SystemTask
if (hour == 0 and not isMidnightAlreadyNotified) {
isMidnightAlreadyNotified = true;
Expand Down
2 changes: 2 additions & 0 deletions src/components/datetime/DateTimeController.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,8 @@ namespace Pinetime {
std::chrono::seconds uptime {0};

bool isMidnightAlreadyNotified = false;
bool isHourAlreadyNotified = true;
bool isHalfHourAlreadyNotified = true;
System::SystemTask* systemTask = nullptr;
};
}
Expand Down
11 changes: 11 additions & 0 deletions src/components/settings/Settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,16 @@ namespace Pinetime {
return settings.clockFace;
};

void SetChimesState(uint8_t state) {
if (state != settings.chimesState) {
settingsChanged = true;
}
settings.chimesState = state;
};
uint8_t GetChimesState() const {
return settings.chimesState;
};

void SetPTSColorTime(Colors colorTime) {
if (colorTime != settings.PTS.ColorTime)
settingsChanged = true;
Expand Down Expand Up @@ -173,6 +183,7 @@ namespace Pinetime {
Notification notificationStatus = Notification::ON;

uint8_t clockFace = 0;
uint8_t chimesState = 0;
JF002 marked this conversation as resolved.
Show resolved Hide resolved

PineTimeStyle PTS;

Expand Down
1 change: 1 addition & 0 deletions src/displayapp/Apps.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ namespace Pinetime {
SettingPineTimeStyle,
SettingSetDate,
SettingSetTime,
SettingChimes,
Error,
};
}
Expand Down
8 changes: 8 additions & 0 deletions src/displayapp/DisplayApp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
#include "displayapp/screens/settings/SettingPineTimeStyle.h"
#include "displayapp/screens/settings/SettingSetDate.h"
#include "displayapp/screens/settings/SettingSetTime.h"
#include "displayapp/screens/settings/SettingChimes.h"

#include "libs/lv_conf.h"

Expand Down Expand Up @@ -268,6 +269,9 @@ void DisplayApp::Refresh() {
// Added to remove warning
// What should happen here?
break;
case Messages::Clock:
LoadApp(Apps::Clock, DisplayApp::FullRefreshDirections::None);
break;
}
}

Expand Down Expand Up @@ -386,6 +390,10 @@ void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction)
currentScreen = std::make_unique<Screens::SettingSetTime>(this, dateTimeController);
ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown);
break;
case Apps::SettingChimes:
currentScreen = std::make_unique<Screens::SettingChimes>(this, settingsController);
ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown);
break;
case Apps::SettingPineTimeStyle:
currentScreen = std::make_unique<Screens::SettingPineTimeStyle>(this, settingsController);
ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown);
Expand Down
3 changes: 2 additions & 1 deletion src/displayapp/Messages.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ namespace Pinetime {
UpdateTimeOut,
DimScreen,
RestoreBrightness,
AlarmTriggered
AlarmTriggered,
Clock
};
}
}
Expand Down
88 changes: 88 additions & 0 deletions src/displayapp/screens/settings/SettingChimes.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
#include "SettingChimes.h"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
#include "SettingChimes.h"
#include "displayapp/screens/settings/SettingChimes.h"

could you make the include relative to the src directory as done in the (not yet merged, but approved) PR #805

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

#include <lvgl/lvgl.h>
#include "displayapp/DisplayApp.h"
#include "displayapp/screens/Screen.h"
#include "displayapp/screens/Symbols.h"

using namespace Pinetime::Applications::Screens;

namespace {
static void event_handler(lv_obj_t* obj, lv_event_t event) {
SettingChimes* screen = static_cast<SettingChimes*>(obj->user_data);
screen->UpdateSelected(obj, event);
}
}

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

lv_obj_t* container1 = lv_cont_create(lv_scr_act(), nullptr);

lv_obj_set_style_local_bg_opa(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP);
lv_obj_set_style_local_pad_all(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 10);
lv_obj_set_style_local_pad_inner(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 5);
lv_obj_set_style_local_border_width(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 0);

lv_obj_set_pos(container1, 10, 60);
lv_obj_set_width(container1, LV_HOR_RES - 20);
lv_obj_set_height(container1, LV_VER_RES - 50);
lv_cont_set_layout(container1, LV_LAYOUT_COLUMN_LEFT);

lv_obj_t* title = lv_label_create(lv_scr_act(), nullptr);
lv_label_set_text_static(title, "Chimes");
lv_label_set_align(title, LV_LABEL_ALIGN_CENTER);
lv_obj_align(title, lv_scr_act(), LV_ALIGN_IN_TOP_MID, 10, 15);

lv_obj_t* icon = lv_label_create(lv_scr_act(), nullptr);
lv_obj_set_style_local_text_color(icon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_ORANGE);
lv_label_set_text_static(icon, Symbols::clock);
lv_label_set_align(icon, LV_LABEL_ALIGN_CENTER);
lv_obj_align(icon, title, LV_ALIGN_OUT_LEFT_MID, -10, 0);

optionsTotal = 0;
cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr);
lv_checkbox_set_text_static(cbOption[optionsTotal], " Off");
cbOption[optionsTotal]->user_data = this;
lv_obj_set_event_cb(cbOption[optionsTotal], event_handler);
if (settingsController.GetChimesState() == 0) {
lv_checkbox_set_checked(cbOption[optionsTotal], true);
}

optionsTotal++;
cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr);
lv_checkbox_set_text_static(cbOption[optionsTotal], " Every hour");
cbOption[optionsTotal]->user_data = this;
lv_obj_set_event_cb(cbOption[optionsTotal], event_handler);
if (settingsController.GetChimesState() == 1) {
lv_checkbox_set_checked(cbOption[optionsTotal], true);
}

optionsTotal++;
cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr);
lv_checkbox_set_text_static(cbOption[optionsTotal], " Every 30 mins");
cbOption[optionsTotal]->user_data = this;
lv_obj_set_event_cb(cbOption[optionsTotal], event_handler);
if (settingsController.GetChimesState() == 2) {
lv_checkbox_set_checked(cbOption[optionsTotal], true);
}

optionsTotal++;
}

SettingChimes::~SettingChimes() {
lv_obj_clean(lv_scr_act());
settingsController.SaveSettings();
}

void SettingChimes::UpdateSelected(lv_obj_t* object, lv_event_t event) {
if (event == LV_EVENT_VALUE_CHANGED) {
for (uint8_t i = 0; i < optionsTotal; i++) {
if (object == cbOption[i]) {
lv_checkbox_set_checked(cbOption[i], true);
settingsController.SetChimesState(i);
} else {
lv_checkbox_set_checked(cbOption[i], false);
}
}
}
}
27 changes: 27 additions & 0 deletions src/displayapp/screens/settings/SettingChimes.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#pragma once

#include <cstdint>
#include <lvgl/lvgl.h>
#include "components/settings/Settings.h"
#include "displayapp/screens/Screen.h"

namespace Pinetime {

namespace Applications {
namespace Screens {

class SettingChimes : public Screen {
public:
SettingChimes(DisplayApp* app, Pinetime::Controllers::Settings& settingsController);
~SettingChimes() override;

void UpdateSelected(lv_obj_t* object, lv_event_t event);

private:
Controllers::Settings& settingsController;
uint8_t optionsTotal;
lv_obj_t* cbOption[2];
};
}
}
}
2 changes: 1 addition & 1 deletion src/displayapp/screens/settings/Settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,10 @@ std::unique_ptr<Screen> Settings::CreateScreen2() {
std::unique_ptr<Screen> Settings::CreateScreen3() {

std::array<Screens::List::Applications, 4> applications {{
{Symbols::clock, "Chimes", Apps::SettingChimes},
{Symbols::paintbrush, "PTS Colors", Apps::SettingPineTimeStyle},
{Symbols::check, "Firmware", Apps::FirmwareValidation},
{Symbols::list, "About", Apps::SysInfo},
{Symbols::none, "None", Apps::None},
}};

return std::make_unique<Screens::List>(2, 3, app, settingsController, applications);
Expand Down
2 changes: 2 additions & 0 deletions src/systemtask/Messages.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ namespace Pinetime {
EnableSleeping,
DisableSleeping,
OnNewDay,
OnNewHour,
OnNewHalfHour,
OnChargingEvent,
SetOffAlarm,
StopRinging,
Expand Down
20 changes: 20 additions & 0 deletions src/systemtask/SystemTask.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -352,6 +352,26 @@ void SystemTask::Work() {
// Remember we'll have to reset the counter next time we're awake
stepCounterMustBeReset = true;
break;
case Messages::OnNewHour:
using Pinetime::Controllers::AlarmController;
if (settingsController.GetChimesState() == 1 and alarmController.State() != AlarmController::AlarmState::Alerting) {
if (isSleeping && !isWakingUp) {
GoToRunning();
displayApp.PushMessage(Pinetime::Applications::Display::Messages::Clock);
}
motorController.RunForDuration(35);
}
break;
case Messages::OnNewHalfHour:
using Pinetime::Controllers::AlarmController;
if (settingsController.GetChimesState() == 2 and alarmController.State() != AlarmController::AlarmState::Alerting) {
if (isSleeping && !isWakingUp) {
GoToRunning();
displayApp.PushMessage(Pinetime::Applications::Display::Messages::Clock);
}
motorController.RunForDuration(35);
}
break;
case Messages::OnChargingEvent:
batteryController.ReadPowerState();
motorController.RunForDuration(15);
Expand Down