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

Infineat external resources #1324

Merged
merged 38 commits into from
Sep 27, 2022
Merged
Show file tree
Hide file tree
Changes from 35 commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
ae705f2
Implement watchface Infineat
dmlls Feb 26, 2022
17d37d5
Add Infineat watchface to settings
dmlls Feb 26, 2022
a89fca7
Add 'circle' symbol & Pine64 logo
dmlls Feb 26, 2022
c2ecd4c
Add Infineat settings to settings controller
dmlls Mar 1, 2022
da2cf8e
Add 'Bebas Neue' and 'Teko' fonts
dmlls Mar 1, 2022
b5fbcf0
Add lowercase days of the week
dmlls Mar 1, 2022
8f54332
Fix typo
dmlls Mar 1, 2022
be16ef0
Update BLE controller in Infineat watchface
dmlls Mar 1, 2022
03790d4
Build on push to 'colors-rebase' branch
dmlls Mar 2, 2022
a890f85
Fixes in side cover toggling
dmlls Mar 3, 2022
f1f7fb7
Add whitespace char to Teko font
dmlls Mar 3, 2022
6eb5b99
Fix aligment of time labels
dmlls Mar 3, 2022
fcdf6de
Change Pine64 logo to grayscale
dmlls Mar 3, 2022
f9d2b78
Small color adjustments
dmlls Mar 3, 2022
b561e7f
Implement CheckboxList screen
dmlls Mar 5, 2022
a3bfbb5
Implement SettingWatchFace list
dmlls Mar 6, 2022
8942791
All ready for PR
dmlls Mar 6, 2022
b15f90a
Bump settings version (#1)
dmlls Mar 12, 2022
f5e9055
Make function DayOfWeekShortToStringLow const
dmlls Mar 18, 2022
dd0d2a4
Make Pine64 logo background transparent
dmlls Mar 20, 2022
a4c3558
Fix bleIcon in Infineat watchface after upstream rebase
dmlls Apr 3, 2022
f6f6f95
Use existing fonts in Infineat watchface
dmlls Mar 21, 2022
9122547
Make Pine64 logo darker
dmlls Apr 1, 2022
b5bf6c5
Implement battery indicator
dmlls Apr 1, 2022
cb2131e
Implement charging battery animation
dmlls Apr 3, 2022
603af7c
Better alignment of the date label
dmlls Apr 4, 2022
20b31fd
Show battery indicator when side cover hidden
dmlls May 21, 2022
4e9fe3f
Simplify code
dmlls May 21, 2022
2ad51e6
Fix date alignment
dmlls Jun 11, 2022
18cff28
Make notification color white when side cover off
dmlls Jun 11, 2022
ada2c09
Merge branch 'develop' into infineat-external-resources
JF002 Sep 11, 2022
4cf73fc
Infineat : Add support for external resources, and read the images an…
JF002 Sep 11, 2022
0cd1d6f
Fix recovery firmware : add FS in parameters of DisplayAppRecovery ctor.
JF002 Sep 11, 2022
970d5b3
Fix submodule for date library
JF002 Sep 11, 2022
58bb0e7
Fix formatting
JF002 Sep 11, 2022
56f315b
A few minors changes following the code review : rename fs -> filesys…
JF002 Sep 27, 2022
2400110
CheckBoxList : remove unused constant MAXLISTITEMS (replaced by MaxIt…
JF002 Sep 27, 2022
58586d0
Fix formatting in CheckBoxList.cpp.
JF002 Sep 27, 2022
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
3 changes: 3 additions & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -396,6 +396,7 @@ list(APPEND SOURCE_FILES
displayapp/screens/Motion.cpp
displayapp/screens/FlashLight.cpp
displayapp/screens/List.cpp
displayapp/screens/CheckboxList.cpp
displayapp/screens/BatteryInfo.cpp
displayapp/screens/Steps.cpp
displayapp/screens/Timer.cpp
Expand Down Expand Up @@ -426,6 +427,7 @@ list(APPEND SOURCE_FILES
displayapp/icons/bg_clock.c
displayapp/screens/WatchFaceAnalog.cpp
displayapp/screens/WatchFaceDigital.cpp
displayapp/screens/WatchFaceInfineat.cpp
displayapp/screens/WatchFaceTerminal.cpp
displayapp/screens/WatchFacePineTimeStyle.cpp

Expand Down Expand Up @@ -602,6 +604,7 @@ set(INCLUDE_FILES
displayapp/screens/FirmwareUpdate.h
displayapp/screens/FirmwareValidation.h
displayapp/screens/ApplicationList.h
displayapp/screens/CheckboxList.h
displayapp/Apps.h
displayapp/screens/Notifications.h
displayapp/screens/HeartRate.h
Expand Down
5 changes: 5 additions & 0 deletions src/components/datetime/DateTimeController.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ using namespace Pinetime::Controllers;

namespace {
char const* DaysStringShort[] = {"--", "MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"};
char const* DaysStringShortLow[] = {"--", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};
char const* MonthsString[] = {"--", "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"};
char const* MonthsStringLow[] = {"--", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
}
Expand Down Expand Up @@ -126,6 +127,10 @@ const char* DateTime::MonthShortToStringLow(Months month) {
return MonthsStringLow[static_cast<uint8_t>(month)];
}

const char* DateTime::DayOfWeekShortToStringLow() const {
return DaysStringShortLow[static_cast<uint8_t>(dayOfWeek)];
}

void DateTime::Register(Pinetime::System::SystemTask* systemTask) {
this->systemTask = systemTask;
}
Expand Down
1 change: 1 addition & 0 deletions src/components/datetime/DateTimeController.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ namespace Pinetime {
const char* MonthShortToString() const;
const char* DayOfWeekShortToString() const;
static const char* MonthShortToStringLow(Months month);
const char* DayOfWeekShortToStringLow() const;

std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds> CurrentDateTime() const {
return currentDateTime;
Expand Down
37 changes: 36 additions & 1 deletion src/components/settings/Settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,10 @@ namespace Pinetime {
Colors ColorBar = Colors::Teal;
Colors ColorBG = Colors::Black;
};
struct WatchFaceInfineat {
bool showSideCover = true;
int colorIndex = 0;
};

Settings(Pinetime::Controllers::FS& fs);

Expand Down Expand Up @@ -94,6 +98,26 @@ namespace Pinetime {
return settings.PTS.ColorBG;
};

void SetInfineatShowSideCover(bool show) {
if (show != settings.watchFaceInfineat.showSideCover) {
settings.watchFaceInfineat.showSideCover = show;
settingsChanged = true;
}
};
bool GetInfineatShowSideCover() const {
return settings.watchFaceInfineat.showSideCover;
};

void SetInfineatColorIndex(int index) {
if (index != settings.watchFaceInfineat.colorIndex) {
settings.watchFaceInfineat.colorIndex = index;
settingsChanged = true;
}
};
int GetInfineatColorIndex() const {
return settings.watchFaceInfineat.colorIndex;
};

void SetAppMenu(uint8_t menu) {
appMenu = menu;
};
Expand All @@ -109,6 +133,14 @@ namespace Pinetime {
return settingsMenu;
};

void SetWatchfacesMenu(uint8_t menu) {
watchFacesMenu = menu;
};

uint8_t GetWatchfacesMenu() const {
return watchFacesMenu;
};

void SetClockType(ClockType clocktype) {
if (clocktype != settings.clockType) {
settingsChanged = true;
Expand Down Expand Up @@ -212,7 +244,7 @@ namespace Pinetime {
private:
Pinetime::Controllers::FS& fs;

static constexpr uint32_t settingsVersion = 0x0003;
static constexpr uint32_t settingsVersion = 0x0004;
struct SettingsData {
uint32_t version = settingsVersion;
uint32_t stepsGoal = 10000;
Expand All @@ -226,6 +258,8 @@ namespace Pinetime {

PineTimeStyle PTS;

WatchFaceInfineat watchFaceInfineat;

std::bitset<4> wakeUpMode {0};
uint16_t shakeWakeThreshold = 150;
Controllers::BrightnessController::Levels brightLevel = Controllers::BrightnessController::Levels::Medium;
Expand All @@ -236,6 +270,7 @@ namespace Pinetime {

uint8_t appMenu = 0;
uint8_t settingsMenu = 0;
uint8_t watchFacesMenu = 0;
/* ble state is intentionally not saved with the other watch settings and initialized
* to off (false) on every boot because we always want ble to be enabled on startup
*/
Expand Down
9 changes: 6 additions & 3 deletions src/displayapp/DisplayApp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,8 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd,
Pinetime::Controllers::TimerController& timerController,
Pinetime::Controllers::AlarmController& alarmController,
Pinetime::Controllers::BrightnessController& brightnessController,
Pinetime::Controllers::TouchHandler& touchHandler)
Pinetime::Controllers::TouchHandler& touchHandler,
Pinetime::Controllers::FS& filesystem)
: lcd {lcd},
lvgl {lvgl},
touchPanel {touchPanel},
Expand All @@ -91,7 +92,8 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd,
timerController {timerController},
alarmController {alarmController},
brightnessController {brightnessController},
touchHandler {touchHandler} {
touchHandler {touchHandler},
filesystem {filesystem} {
}

void DisplayApp::Start(System::BootErrors error) {
Expand Down Expand Up @@ -324,7 +326,8 @@ void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction)
notificationManager,
settingsController,
heartRateController,
motionController);
motionController,
filesystem);
break;

case Apps::Error:
Expand Down
4 changes: 3 additions & 1 deletion src/displayapp/DisplayApp.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,8 @@ namespace Pinetime {
Pinetime::Controllers::TimerController& timerController,
Pinetime::Controllers::AlarmController& alarmController,
Pinetime::Controllers::BrightnessController& brightnessController,
Pinetime::Controllers::TouchHandler& touchHandler);
Pinetime::Controllers::TouchHandler& touchHandler,
Pinetime::Controllers::FS& filesystem);
void Start(System::BootErrors error);
void PushMessage(Display::Messages msg);

Expand Down Expand Up @@ -90,6 +91,7 @@ namespace Pinetime {
Pinetime::Controllers::AlarmController& alarmController;
Pinetime::Controllers::BrightnessController& brightnessController;
Pinetime::Controllers::TouchHandler& touchHandler;
Pinetime::Controllers::FS& filesystem;

Pinetime::Controllers::FirmwareValidator validator;

Expand Down
4 changes: 3 additions & 1 deletion src/displayapp/DisplayAppRecovery.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include <FreeRTOS.h>
#include <task.h>
#include <libraries/log/nrf_log.h>
#include <components/fs/FS.h>
Copy link
Contributor

Choose a reason for hiding this comment

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

including our headers should be done with "", excluding other libs (like lvgl, nrf, std-lib) should be done with <>

Suggested change
#include <components/fs/FS.h>
#include "components/fs/FS.h"

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Done

#include "components/rle/RleDecoder.h"
#include "touchhandler/TouchHandler.h"
#include "displayapp/icons/infinitime/infinitime-nb.c"
Expand All @@ -24,7 +25,8 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd,
Pinetime::Controllers::TimerController& timerController,
Pinetime::Controllers::AlarmController& alarmController,
Pinetime::Controllers::BrightnessController& brightnessController,
Pinetime::Controllers::TouchHandler& touchHandler)
Pinetime::Controllers::TouchHandler& touchHandler,
Pinetime::Controllers::FS& filesystem)
Copy link
Contributor

Choose a reason for hiding this comment

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

we're using fs for the filesystem controller everywhere else (I think). I like the explicitness of filesystem

would you suggest to use filesystem instead of fs in the future?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Yes, I agree with you, filesystem is more explicit!

: lcd {lcd}, bleController {bleController} {
}

Expand Down
4 changes: 3 additions & 1 deletion src/displayapp/DisplayAppRecovery.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ namespace Pinetime {
class TimerController;
class AlarmController;
class BrightnessController;
class FS;
}

namespace System {
Expand All @@ -59,7 +60,8 @@ namespace Pinetime {
Pinetime::Controllers::TimerController& timerController,
Pinetime::Controllers::AlarmController& alarmController,
Pinetime::Controllers::BrightnessController& brightnessController,
Pinetime::Controllers::TouchHandler& touchHandler);
Pinetime::Controllers::TouchHandler& touchHandler,
Pinetime::Controllers::FS& filesystem);
void Start();
void Start(Pinetime::System::BootErrors) {
Start();
Expand Down
117 changes: 117 additions & 0 deletions src/displayapp/screens/CheckboxList.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
#include "displayapp/screens/CheckboxList.h"
#include "displayapp/DisplayApp.h"
#include "displayapp/screens/Styles.h"

using namespace Pinetime::Applications::Screens;

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

}

CheckboxList::CheckboxList(const uint8_t screenID,
const uint8_t numScreens,
DisplayApp* app,
Controllers::Settings& settingsController,
const char* optionsTitle,
const char* optionsSymbol,
void (Controllers::Settings::*SetOptionIndex)(uint8_t),
uint8_t (Controllers::Settings::*GetOptionIndex)() const,
std::array<const char*, MAXLISTITEMS> options)
: Screen(app),
screenID {screenID},
settingsController {settingsController},
SetOptionIndex {SetOptionIndex},
GetOptionIndex {GetOptionIndex},
options {options} {

settingsController.SetWatchfacesMenu(screenID);

// Set the background to Black
lv_obj_set_style_local_bg_color(lv_scr_act(), LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);

if (numScreens > 1) {
pageIndicatorBasePoints[0].x = LV_HOR_RES - 1;
pageIndicatorBasePoints[0].y = 0;
pageIndicatorBasePoints[1].x = LV_HOR_RES - 1;
pageIndicatorBasePoints[1].y = LV_VER_RES;

pageIndicatorBase = lv_line_create(lv_scr_act(), NULL);
lv_obj_set_style_local_line_width(pageIndicatorBase, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, 3);
lv_obj_set_style_local_line_color(pageIndicatorBase, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x111111));
lv_line_set_points(pageIndicatorBase, pageIndicatorBasePoints, 2);

const uint16_t indicatorSize = LV_VER_RES / numScreens;
const uint16_t indicatorPos = indicatorSize * screenID;

pageIndicatorPoints[0].x = LV_HOR_RES - 1;
pageIndicatorPoints[0].y = indicatorPos;
pageIndicatorPoints[1].x = LV_HOR_RES - 1;
pageIndicatorPoints[1].y = indicatorPos + indicatorSize;

pageIndicator = lv_line_create(lv_scr_act(), NULL);
lv_obj_set_style_local_line_width(pageIndicator, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, 3);
lv_obj_set_style_local_line_color(pageIndicator, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY);
lv_line_set_points(pageIndicator, pageIndicatorPoints, 2);
}

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, optionsTitle);
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, optionsSymbol);
lv_label_set_align(icon, LV_LABEL_ALIGN_CENTER);
lv_obj_align(icon, title, LV_ALIGN_OUT_LEFT_MID, -10, 0);

for (unsigned int i = 0; i < options.size(); i++) {
if (strcmp(options[i], "")) {
cbOption[i] = lv_checkbox_create(container1, nullptr);
lv_checkbox_set_text(cbOption[i], options[i]);
cbOption[i]->user_data = this;
lv_obj_set_event_cb(cbOption[i], event_handler);
SetRadioButtonStyle(cbOption[i]);

if (static_cast<unsigned int>((settingsController.*GetOptionIndex)() - MAXLISTITEMS * screenID) == i) {
lv_checkbox_set_checked(cbOption[i], true);
}
}
}
}

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

void CheckboxList::UpdateSelected(lv_obj_t* object, lv_event_t event) {
if (event == LV_EVENT_VALUE_CHANGED) {
for (unsigned int i = 0; i < options.size(); i++) {
if (strcmp(options[i], "")) {
if (object == cbOption[i]) {
lv_checkbox_set_checked(cbOption[i], true);
(settingsController.*SetOptionIndex)(MAXLISTITEMS * screenID + i);
} else {
lv_checkbox_set_checked(cbOption[i], false);
}
}
}
}
}
49 changes: 49 additions & 0 deletions src/displayapp/screens/CheckboxList.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#pragma once

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

#define MAXLISTITEMS 4
Copy link
Contributor

Choose a reason for hiding this comment

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

we could make this define into a constexpr size_t and move it from the global namespace into the private CheckboxList one

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Done! However, since this constant is also used in the ctor(), I added it as a public field of the class.


namespace Pinetime {
namespace Applications {
namespace Screens {
class CheckboxList : public Screen {
public:
CheckboxList(const uint8_t screenID,
const uint8_t numScreens,
DisplayApp* app,
Controllers::Settings& settingsController,
const char* optionsTitle,
const char* optionsSymbol,
void (Controllers::Settings::*SetOptionIndex)(uint8_t),
uint8_t (Controllers::Settings::*GetOptionIndex)() const,
std::array<const char*, MAXLISTITEMS> options);

~CheckboxList() override;

void UpdateSelected(lv_obj_t* object, lv_event_t event);

private:
const uint8_t screenID;
Controllers::Settings& settingsController;
const char* optionsTitle;
const char* optionsSymbol;
void (Controllers::Settings::*SetOptionIndex)(uint8_t);
uint8_t (Controllers::Settings::*GetOptionIndex)() const;
std::array<const char*, MAXLISTITEMS> options;

lv_obj_t* cbOption[MAXLISTITEMS];
Copy link
Contributor

Choose a reason for hiding this comment

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

we could use a std::array here as well

Suggested change
lv_obj_t* cbOption[MAXLISTITEMS];
std::array<lv_obj_t*, MAXLISTITEMS> cbOption;

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Done


lv_point_t pageIndicatorBasePoints[2];
lv_point_t pageIndicatorPoints[2];
Copy link
Contributor

Choose a reason for hiding this comment

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

although more to type I like std::array 😁

Suggested change
lv_point_t pageIndicatorBasePoints[2];
lv_point_t pageIndicatorPoints[2];
std::array<lv_point_t, 2> pageIndicatorBasePoints;
std::array<lv_point_t, 2> pageIndicatorPoints;

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Done

lv_obj_t* pageIndicatorBase;
lv_obj_t* pageIndicator;
};
}
}
}
Loading