diff --git a/.gitconfig b/.gitconfig index b2274475..7e0aafbb 100644 --- a/.gitconfig +++ b/.gitconfig @@ -3,3 +3,16 @@ autocrlf = input [apply] whitespace = fix + +[diff] + tool = meld +[difftool] + prompt = false +[difftool "meld"] + cmd = meld "$LOCAL" "$REMOTE" +[merge] + tool = meld +[mergetool "meld"] + # Choose one of these two lines (not both!) explained below. + cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED" + cmd = meld "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED" diff --git a/.gitignore b/.gitignore index 81e49ae0..4613b1da 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ Makefile build tools + # Resulting binary files *.a *.so diff --git a/README.md b/README.md index 765d5d4b..e8bbf172 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,41 @@ -# [InfiniTime](https://github.com/InfiniTimeOrg/InfiniTime) +# [InfiniTime](https://github.com/Eve1374/InfiniTime) ![InfiniTime logo](doc/logo/infinitime-logo-small.jpg "InfiniTime Logo") Fast open-source firmware for the [PineTime smartwatch](https://pine64.org/devices/pinetime/) with many features, written in modern C++. +## Quick notes on this InfiniTime version + +- I copied the source code from this git repo : [InfiniTime](https://github.com/InfiniTimeOrg/InfiniTime) +- I added a watch face "WatchFaceMeow" whose main features are to be pink and have info about the alarm status +- I stored the compile commands in scripts compile.sh to run from InfiniTime/ folder, and make_pine_mcu.sh to build the image must be run from InfiniTime/build/ (compile.sh copies make_pine_mcu.sh to build/ +- The file to flash to the pinetime is InfiniTime/build/pinetime-mcuboot-app-dfu-1.14.0.zip : I didn't change the version compared to the one I downloaded from [InfiniTime](https://github.com/InfiniTimeOrg/InfiniTime) so make sure not to keep keep a copy of it + +Here are pictures with and without alarm set : + + +Original repo : [InfiniTime](https://github.com/InfiniTimeOrg/InfiniTime) + +- [Getting started with InfiniTime](doc/gettingStarted/gettingStarted-1.0.md) +- [Updating the software](doc/gettingStarted/updating-software.md) +- [About the firmware and bootloader](doc/gettingStarted/about-software.md) +- [Available apps](doc/gettingStarted/Applications.md) +- [Available watch faces](/doc/gettingStarted/Watchfaces.md) +- [PineTimeStyle Watch face](https://pine64.org/documentation/PineTime/Watchfaces/PineTimeStyle) + - [Weather integration](https://pine64.org/documentation/PineTime/Software/InfiniTime_weather/) + +## Welcome to my InfiniTime fork ?! + +Branches : + +- main : shows this doc +- alarm-status-on-infineat : shows the alarm status on infineat, can be enabled or disabled from the settigns menu that is updated accordingly : + +![Infineat settings](doc/ui/infineat_settings.png "Infineat settings") + +- my-custom-infinitime : branch were I put things that I want for myself, like a watchface with paw instead of shoe icon for steps counter : + + ## New to InfiniTime? - [Getting started with InfiniTime](doc/gettingStarted/gettingStarted-1.0.md) @@ -88,3 +120,4 @@ Here are some people I would like to highlight: - [Atc1441](https://github.com/atc1441/): He works on an Arduino based firmware for the Pinetime and many other smartwatches based on similar hardware. He was of great help when I was implementing support for the BMA421 motion sensor and I²C driver. - [Koen](https://github.com/bosmoment): He’s working on a firmware based on RiotOS. He integrated similar libs as me: NimBLE, LittleVGL,… His help was invaluable too! - [Lup Yuen Lee](https://github.com/lupyuen): He is everywhere: he works on a Rust firmware, builds a MCUBoot based bootloader for the Pinetime, designs a Flutter based companion app for smartphones and writes a lot of articles about the Pinetime! +>>>>>>>>> Temporary merge branch 2 diff --git a/compile.sh b/compile.sh new file mode 100755 index 00000000..fc3a6836 --- /dev/null +++ b/compile.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +rm -r build + +cmake -DARM_NONE_EABI_TOOLCHAIN_PATH=/home/eve/Work/gcc-arm-none-eabi-10.3-2021.10 -DNRF5_SDK_PATH=/home/eve/Work/nRF5_SDK_17.1.0_ddde560 -DTARGET_DEVICE=PINETIME -DBUILD_DFU=1 -DBUILD_RESOURCES=1 -B build -DCMAKE_BUILD_TYPE=Release + +cp make_pine_mcu.sh build/ + diff --git a/doc/alarmStatusOnInfineat/alarmStatusOnInfineat.md b/doc/alarmStatusOnInfineat/alarmStatusOnInfineat.md new file mode 100644 index 00000000..22885a84 --- /dev/null +++ b/doc/alarmStatusOnInfineat/alarmStatusOnInfineat.md @@ -0,0 +1,22 @@ +# [InfiniTime : show alarm status on infineat watchface](https://github.com/Eve1374/InfiniTime/tree/alarm-status-on-infineat) +- I forked from [InfiniTime](https://github.com/InfiniTimeOrg/InfiniTime) and added a branch alarm-status-on-infineat +- I modified the watchface settings to have the possibility to show alarm status on watchface + +Here are pictures with alarm set in 12 and 24hrs format : + +![alarm set and shown, 12hrs format](infineat_alarm_set_12hrs.png "alarm set and shown, 12hrs format") +![alarm set and shown, 24hrs format](infineat_alarm_set_24hrs.png "alarm set and shown, 24hrs format") + +Alarm not set : + +![alarm shown and not set](infineat_alarm_notset.png "alarm shown and not set") + +Settings view : + +![settings](infineat_settings.png "settings modified with a button to turn on or off alarm display") + + +## Possible further development : +- Move this setting to the Alarm app and include alarm display in all watchfaces ? + + diff --git a/doc/alarmStatusOnInfineat/infineat_alarm_notset.png b/doc/alarmStatusOnInfineat/infineat_alarm_notset.png new file mode 100644 index 00000000..a8883db0 Binary files /dev/null and b/doc/alarmStatusOnInfineat/infineat_alarm_notset.png differ diff --git a/doc/alarmStatusOnInfineat/infineat_alarm_set_12hrs.png b/doc/alarmStatusOnInfineat/infineat_alarm_set_12hrs.png new file mode 100644 index 00000000..259c0983 Binary files /dev/null and b/doc/alarmStatusOnInfineat/infineat_alarm_set_12hrs.png differ diff --git a/doc/alarmStatusOnInfineat/infineat_alarm_set_24hrs.png b/doc/alarmStatusOnInfineat/infineat_alarm_set_24hrs.png new file mode 100644 index 00000000..d31de798 Binary files /dev/null and b/doc/alarmStatusOnInfineat/infineat_alarm_set_24hrs.png differ diff --git a/doc/alarmStatusOnInfineat/infineat_settings.png b/doc/alarmStatusOnInfineat/infineat_settings.png new file mode 100644 index 00000000..0dffd5e7 Binary files /dev/null and b/doc/alarmStatusOnInfineat/infineat_settings.png differ diff --git a/doc/lvgl_align.png b/doc/lvgl_align.png new file mode 100644 index 00000000..189c573e Binary files /dev/null and b/doc/lvgl_align.png differ diff --git a/doc/palettes.xcf b/doc/palettes.xcf new file mode 100644 index 00000000..bfad74e0 Binary files /dev/null and b/doc/palettes.xcf differ diff --git a/doc/ui/infineat_settings.png b/doc/ui/infineat_settings.png new file mode 100644 index 00000000..0dffd5e7 Binary files /dev/null and b/doc/ui/infineat_settings.png differ diff --git a/doc/ui/meow_alarmnotset.png b/doc/ui/meow_alarmnotset.png new file mode 100644 index 00000000..ac11e47e Binary files /dev/null and b/doc/ui/meow_alarmnotset.png differ diff --git a/doc/ui/meow_alarmset.png b/doc/ui/meow_alarmset.png new file mode 100644 index 00000000..e0b4b3f7 Binary files /dev/null and b/doc/ui/meow_alarmset.png differ diff --git a/draft_pictures/cat.png b/draft_pictures/cat.png new file mode 100644 index 00000000..da3e6f72 Binary files /dev/null and b/draft_pictures/cat.png differ diff --git a/draft_pictures/cat.xcf b/draft_pictures/cat.xcf new file mode 100644 index 00000000..6bd6671c Binary files /dev/null and b/draft_pictures/cat.xcf differ diff --git a/draft_pictures/cat_clean.xcf b/draft_pictures/cat_clean.xcf new file mode 100644 index 00000000..b554ef17 Binary files /dev/null and b/draft_pictures/cat_clean.xcf differ diff --git a/draft_pictures/cat_small.xcf b/draft_pictures/cat_small.xcf new file mode 100644 index 00000000..254bdd31 Binary files /dev/null and b/draft_pictures/cat_small.xcf differ diff --git a/draft_pictures/coordinates.xcf b/draft_pictures/coordinates.xcf new file mode 100644 index 00000000..e9e6d040 Binary files /dev/null and b/draft_pictures/coordinates.xcf differ diff --git a/make_pine.sh b/make_pine.sh new file mode 100755 index 00000000..006c2421 --- /dev/null +++ b/make_pine.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +#cp ./displayapp/apps/Apps.h ../src/displayapp/apps/Apps.h + +make -j4 pinetime-app + diff --git a/make_pine_mcu.sh b/make_pine_mcu.sh new file mode 100755 index 00000000..87c00ff2 --- /dev/null +++ b/make_pine_mcu.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +#cp ./displayapp/apps/Apps.h ../src/displayapp/apps/Apps.h + +make clean -j4 pinetime-mcuboot-app + diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0a97a015..093d5491 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -371,6 +371,7 @@ list(APPEND SOURCE_FILES displayapp/screens/StopWatch.cpp displayapp/screens/BatteryIcon.cpp displayapp/screens/BleIcon.cpp + displayapp/screens/AlarmIcon.cpp displayapp/screens/NotificationIcon.cpp displayapp/screens/SystemInfo.cpp displayapp/screens/Label.cpp diff --git a/src/Version.h.in b/src/Version.h.in index 0d6219c0..dfeccdbc 100644 --- a/src/Version.h.in +++ b/src/Version.h.in @@ -19,4 +19,4 @@ namespace Pinetime { static constexpr const char* commitHash = "@PROJECT_GIT_COMMIT_HASH@"; static constexpr const char* versionString = "@PROJECT_VERSION_MAJOR@.@PROJECT_VERSION_MINOR@.@PROJECT_VERSION_PATCH@"; }; -} \ No newline at end of file +} diff --git a/src/components/settings/Settings.h b/src/components/settings/Settings.h index 602de3a5..ef43ff2f 100644 --- a/src/components/settings/Settings.h +++ b/src/components/settings/Settings.h @@ -47,7 +47,8 @@ namespace Pinetime { struct WatchFaceInfineat { bool showSideCover = true; - int colorIndex = 0; + bool showAlarmStatus = true; + int colorIndex = 0; }; Settings(Pinetime::Controllers::FS& fs); @@ -123,6 +124,18 @@ namespace Pinetime { return settings.watchFaceInfineat.showSideCover; }; + void SetInfineatShowAlarmStatus(bool show) { + if (show != settings.watchFaceInfineat.showAlarmStatus) { + settings.watchFaceInfineat.showAlarmStatus = show; + settingsChanged = true; + } + }; + + bool GetInfineatShowAlarmStatus() const { + return settings.watchFaceInfineat.showAlarmStatus; + }; + + void SetInfineatColorIndex(int index) { if (index != settings.watchFaceInfineat.colorIndex) { settings.watchFaceInfineat.colorIndex = index; diff --git a/src/displayapp/InfiniTimeTheme.h b/src/displayapp/InfiniTimeTheme.h index 0690b099..57680e87 100644 --- a/src/displayapp/InfiniTimeTheme.h +++ b/src/displayapp/InfiniTimeTheme.h @@ -8,6 +8,7 @@ namespace Colors { static constexpr lv_color_t green = LV_COLOR_MAKE(0x0, 0xb0, 0x0); static constexpr lv_color_t blue = LV_COLOR_MAKE(0x0, 0x50, 0xff); static constexpr lv_color_t lightGray = LV_COLOR_MAKE(0xb0, 0xb0, 0xb0); + static constexpr lv_color_t gray = LV_COLOR_MAKE(0x50, 0x50, 0x50); static constexpr lv_color_t bg = LV_COLOR_MAKE(0x5d, 0x69, 0x7e); static constexpr lv_color_t bgAlt = LV_COLOR_MAKE(0x38, 0x38, 0x38); diff --git a/src/displayapp/apps/Apps.h.in b/src/displayapp/apps/Apps.h.in index 2104a267..7f4d03fc 100644 --- a/src/displayapp/apps/Apps.h.in +++ b/src/displayapp/apps/Apps.h.in @@ -23,6 +23,7 @@ namespace Pinetime { Twos, HeartRate, Navigation, + Calendar, StopWatch, Metronome, Motion, @@ -51,6 +52,7 @@ namespace Pinetime { PineTimeStyle, Terminal, Infineat, + Meow, CasioStyleG7710, }; diff --git a/src/displayapp/fonts/fonts.json b/src/displayapp/fonts/fonts.json index 41c383c0..793b8851 100644 --- a/src/displayapp/fonts/fonts.json +++ b/src/displayapp/fonts/fonts.json @@ -7,7 +7,7 @@ }, { "file": "FontAwesome5-Solid+Brands+Regular.woff", - "range": "0xf294, 0xf242, 0xf54b, 0xf21e, 0xf1e6, 0xf017, 0xf129, 0xf03a, 0xf185, 0xf560, 0xf001, 0xf3fd, 0xf1fc, 0xf45d, 0xf59f, 0xf5a0, 0xf027, 0xf028, 0xf6a9, 0xf04b, 0xf04c, 0xf048, 0xf051, 0xf095, 0xf3dd, 0xf04d, 0xf2f2, 0xf024, 0xf252, 0xf569, 0xf06e, 0xf015, 0xf00c, 0xf0f3, 0xf522, 0xf743" + "range": "0xf294, 0xf242, 0xf54b, 0xf21e, 0xf1e6, 0xf017, 0xf129, 0xf03a, 0xf185, 0xf560, 0xf001, 0xf3fd, 0xf1fc, 0xf45d, 0xf59f, 0xf5a0, 0xf027, 0xf028, 0xf6a9, 0xf04b, 0xf04c, 0xf048, 0xf051, 0xf095, 0xf3dd, 0xf04d, 0xf2f2, 0xf024, 0xf252, 0xf569, 0xf06e, 0xf015, 0xf00c, 0xf0f3, 0xf522, 0xf743, 0xf0f3, 0xf1f6" } ], "bpp": 1, diff --git a/src/displayapp/screens/AlarmIcon.cpp b/src/displayapp/screens/AlarmIcon.cpp new file mode 100644 index 00000000..fda87130 --- /dev/null +++ b/src/displayapp/screens/AlarmIcon.cpp @@ -0,0 +1,11 @@ +#include "displayapp/screens/AlarmIcon.h" +#include "displayapp/screens/Symbols.h" +using namespace Pinetime::Applications::Screens; + +const char* AlarmIcon::GetIcon(bool isSet) { + if (isSet) { + return Symbols::bell; + } + + return Symbols::notbell; +} diff --git a/src/displayapp/screens/AlarmIcon.h b/src/displayapp/screens/AlarmIcon.h new file mode 100644 index 00000000..678a4cb7 --- /dev/null +++ b/src/displayapp/screens/AlarmIcon.h @@ -0,0 +1,14 @@ +#pragma once + +#include "components/alarm/AlarmController.h" + +namespace Pinetime { + namespace Applications { + namespace Screens { + class AlarmIcon { + public: + static const char* GetIcon(bool isSet); + }; + } + } +} diff --git a/src/displayapp/screens/README.md b/src/displayapp/screens/README.md new file mode 100644 index 00000000..f84a5fc6 --- /dev/null +++ b/src/displayapp/screens/README.md @@ -0,0 +1,10 @@ +# Add a new watchface : +## Modify the following files with the names of your source files : + +- /src/displayapp/apps/Apps.h.in +- /src/components/settings/Settings.h +- /src/displayapp/UserApps.h +- /src/displayapp/apps/CMakeLists.txt +- CMakelists.txt + + diff --git a/src/displayapp/screens/Symbols.h b/src/displayapp/screens/Symbols.h index bd958b28..cf1b8aad 100644 --- a/src/displayapp/screens/Symbols.h +++ b/src/displayapp/screens/Symbols.h @@ -12,6 +12,7 @@ namespace Pinetime { static constexpr const char* shoe = "\xEF\x95\x8B"; static constexpr const char* clock = "\xEF\x80\x97"; static constexpr const char* bell = "\xEF\x83\xB3"; + static constexpr const char* notbell = "\xEF\x87\xB6"; static constexpr const char* info = "\xEF\x84\xA9"; static constexpr const char* list = "\xEF\x80\xBA"; static constexpr const char* sun = "\xEF\x86\x85"; diff --git a/src/displayapp/screens/WatchFaceCasioStyleG7710.cpp b/src/displayapp/screens/WatchFaceCasioStyleG7710.cpp index c695f852..9fed69d7 100644 --- a/src/displayapp/screens/WatchFaceCasioStyleG7710.cpp +++ b/src/displayapp/screens/WatchFaceCasioStyleG7710.cpp @@ -4,10 +4,12 @@ #include #include "displayapp/screens/BatteryIcon.h" #include "displayapp/screens/BleIcon.h" +#include "displayapp/screens/AlarmIcon.h" #include "displayapp/screens/NotificationIcon.h" #include "displayapp/screens/Symbols.h" #include "components/battery/BatteryController.h" #include "components/ble/BleController.h" +#include "components/alarm/AlarmController.h" #include "components/ble/NotificationManager.h" #include "components/heartrate/HeartRateController.h" #include "components/motion/MotionController.h" @@ -17,6 +19,7 @@ using namespace Pinetime::Applications::Screens; WatchFaceCasioStyleG7710::WatchFaceCasioStyleG7710(Controllers::DateTime& dateTimeController, const Controllers::Battery& batteryController, const Controllers::Ble& bleController, + Controllers::AlarmController& alarmController, Controllers::NotificationManager& notificatioManager, Controllers::Settings& settingsController, Controllers::HeartRateController& heartRateController, @@ -27,6 +30,7 @@ WatchFaceCasioStyleG7710::WatchFaceCasioStyleG7710(Controllers::DateTime& dateTi dateTimeController {dateTimeController}, batteryController {batteryController}, bleController {bleController}, + alarmController {alarmController}, notificatioManager {notificatioManager}, settingsController {settingsController}, heartRateController {heartRateController}, @@ -168,6 +172,23 @@ WatchFaceCasioStyleG7710::WatchFaceCasioStyleG7710(Controllers::DateTime& dateTi lv_label_set_text_static(stepIcon, Symbols::shoe); lv_obj_align(stepIcon, stepValue, LV_ALIGN_OUT_LEFT_MID, -5, 0); + alarmIcon = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(alarmIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, color_text); + lv_label_set_text_static(alarmIcon, Symbols::notbell); + lv_obj_align(alarmIcon, lv_scr_act(), LV_ALIGN_IN_BOTTOM_LEFT, 5, -2); + + labelAlarm = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(labelAlarm, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, color_text); +// lv_obj_set_style_local_text_font(labelAlarm, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, font_teko); + lv_obj_align(labelAlarm, alarmIcon, LV_ALIGN_OUT_RIGHT_MID, 3, 0); + lv_label_set_text_static(labelAlarm, "00:00"); + + labelTimeAmPmAlarm = lv_label_create(lv_scr_act(), nullptr); +// lv_obj_set_style_local_text_font(labelTimeAmPmAlarm, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, font_teko); + lv_label_set_text_static(labelTimeAmPmAlarm, ""); + lv_obj_set_style_local_text_color(labelTimeAmPmAlarm, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, color_text); + lv_obj_align(labelTimeAmPmAlarm, labelAlarm, LV_ALIGN_OUT_RIGHT_MID, 3, 0); + taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this); Refresh(); } @@ -310,8 +331,6 @@ void WatchFaceCasioStyleG7710::Refresh() { lv_obj_realign(stepValue); lv_obj_realign(stepIcon); } -} - bool WatchFaceCasioStyleG7710::IsAvailable(Pinetime::Controllers::FS& filesystem) { lfs_file file = {}; diff --git a/src/displayapp/screens/WatchFaceInfineat.cpp b/src/displayapp/screens/WatchFaceInfineat.cpp index 4c6fc196..561899da 100644 --- a/src/displayapp/screens/WatchFaceInfineat.cpp +++ b/src/displayapp/screens/WatchFaceInfineat.cpp @@ -4,9 +4,11 @@ #include #include "displayapp/screens/Symbols.h" #include "displayapp/screens/BleIcon.h" +#include "displayapp/screens/AlarmIcon.h" #include "components/settings/Settings.h" #include "components/battery/BatteryController.h" #include "components/ble/BleController.h" +#include "components/alarm/AlarmController.h" #include "components/ble/NotificationManager.h" #include "components/motion/MotionController.h" @@ -122,6 +124,7 @@ namespace { WatchFaceInfineat::WatchFaceInfineat(Controllers::DateTime& dateTimeController, const Controllers::Battery& batteryController, const Controllers::Ble& bleController, + Controllers::AlarmController& alarmController, Controllers::NotificationManager& notificationManager, Controllers::Settings& settingsController, Controllers::MotionController& motionController, @@ -130,6 +133,7 @@ WatchFaceInfineat::WatchFaceInfineat(Controllers::DateTime& dateTimeController, dateTimeController {dateTimeController}, batteryController {batteryController}, bleController {bleController}, + alarmController {alarmController}, notificationManager {notificationManager}, settingsController {settingsController}, motionController {motionController} { @@ -144,6 +148,7 @@ WatchFaceInfineat::WatchFaceInfineat(Controllers::DateTime& dateTimeController, font_bebas = lv_font_load("F:/fonts/bebas.bin"); } + // Side Cover static constexpr lv_point_t linePoints[nLines][2] = {{{30, 25}, {68, -8}}, {{26, 167}, {43, 216}}, @@ -230,6 +235,31 @@ WatchFaceInfineat::WatchFaceInfineat(Controllers::DateTime& dateTimeController, lv_label_set_text_static(bleIcon, Symbols::bluetooth); lv_obj_align(bleIcon, dateContainer, LV_ALIGN_OUT_BOTTOM_MID, 0, 0); + labelAlarm = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(labelAlarm, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, grayColor); + lv_obj_set_style_local_text_font(labelAlarm, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, font_teko); + lv_obj_align(labelAlarm, dateContainer, LV_ALIGN_OUT_BOTTOM_MID, -10, 0); + lv_obj_align(labelAlarm, lv_scr_act(), LV_ALIGN_IN_BOTTOM_RIGHT, -3, 0); + lv_label_set_text_static(labelAlarm, "00:00"); + + labelTimeAmPmAlarm = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_font(labelTimeAmPmAlarm, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, font_teko); + lv_label_set_text_static(labelTimeAmPmAlarm, ""); + lv_obj_set_style_local_text_color(labelTimeAmPmAlarm, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, grayColor); + lv_obj_align(labelTimeAmPmAlarm, labelAlarm, LV_ALIGN_OUT_TOP_RIGHT, 0, 0); + + alarmIcon = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(alarmIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, grayColor); + lv_label_set_text_static(alarmIcon, Symbols::notbell); + lv_obj_align(alarmIcon, labelAlarm, LV_ALIGN_OUT_LEFT_MID, -3, 0); + + // don't show the icons just set if we don't show alarm status + if (!settingsController.GetInfineatShowAlarmStatus()) { + lv_obj_set_hidden(labelAlarm, true); + lv_obj_set_hidden(alarmIcon, true); + lv_obj_set_hidden(labelTimeAmPmAlarm, true); + } + stepValue = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_color(stepValue, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, grayColor); lv_obj_set_style_local_text_font(stepValue, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, font_teko); @@ -275,7 +305,7 @@ WatchFaceInfineat::WatchFaceInfineat(Controllers::DateTime& dateTimeController, btnToggleCover = lv_btn_create(lv_scr_act(), nullptr); btnToggleCover->user_data = this; lv_obj_set_size(btnToggleCover, 60, 60); - lv_obj_align(btnToggleCover, lv_scr_act(), LV_ALIGN_CENTER, 0, 80); + lv_obj_align(btnToggleCover, lv_scr_act(), LV_ALIGN_CENTER, 0,0); lv_obj_set_style_local_bg_opa(btnToggleCover, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_70); const char* labelToggle = settingsController.GetInfineatShowSideCover() ? "ON" : "OFF"; lblToggle = lv_label_create(btnToggleCover, nullptr); @@ -283,6 +313,17 @@ WatchFaceInfineat::WatchFaceInfineat(Controllers::DateTime& dateTimeController, lv_obj_set_event_cb(btnToggleCover, event_handler); lv_obj_set_hidden(btnToggleCover, true); + btnToggleAlarm = lv_btn_create(lv_scr_act(), nullptr); + btnToggleAlarm->user_data = this; + lv_obj_set_size(btnToggleAlarm, 60, 60); + lv_obj_align(btnToggleAlarm, lv_scr_act(), LV_ALIGN_CENTER, 0, 80); + lv_obj_set_style_local_bg_opa(btnToggleAlarm, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_70); + const char* labelToggleAlarm = settingsController.GetInfineatShowAlarmStatus() ? Symbols::bell : Symbols::notbell; + lblAlarm = lv_label_create(btnToggleAlarm, nullptr); + lv_label_set_text_static(lblAlarm, labelToggleAlarm); + lv_obj_set_event_cb(btnToggleAlarm, event_handler); + lv_obj_set_hidden(btnToggleAlarm, true); + // Button to access the settings btnSettings = lv_btn_create(lv_scr_act(), nullptr); btnSettings->user_data = this; @@ -332,6 +373,7 @@ void WatchFaceInfineat::CloseMenu() { lv_obj_set_hidden(btnNextColor, true); lv_obj_set_hidden(btnPrevColor, true); lv_obj_set_hidden(btnToggleCover, true); + lv_obj_set_hidden(btnToggleAlarm, true); } bool WatchFaceInfineat::OnButtonPushed() { @@ -346,6 +388,7 @@ void WatchFaceInfineat::UpdateSelected(lv_obj_t* object, lv_event_t event) { if (event == LV_EVENT_CLICKED) { bool showSideCover = settingsController.GetInfineatShowSideCover(); int colorIndex = settingsController.GetInfineatColorIndex(); + bool showAlarmStatus = settingsController.GetInfineatShowAlarmStatus(); if (object == btnSettings) { lv_obj_set_hidden(btnSettings, true); @@ -353,6 +396,7 @@ void WatchFaceInfineat::UpdateSelected(lv_obj_t* object, lv_event_t event) { lv_obj_set_hidden(btnNextColor, !showSideCover); lv_obj_set_hidden(btnPrevColor, !showSideCover); lv_obj_set_hidden(btnToggleCover, false); + lv_obj_set_hidden(btnToggleAlarm, false); } if (object == btnClose) { CloseMenu(); @@ -368,6 +412,18 @@ void WatchFaceInfineat::UpdateSelected(lv_obj_t* object, lv_event_t event) { const char* labelToggle = showSideCover ? "OFF" : "ON"; lv_label_set_text_static(lblToggle, labelToggle); } + + if (object == btnToggleAlarm) { + settingsController.SetInfineatShowAlarmStatus(!showAlarmStatus); + bool newShowAlarmStatus = settingsController.GetInfineatShowAlarmStatus(); + lv_obj_set_hidden(labelAlarm, !newShowAlarmStatus); + lv_obj_set_hidden(alarmIcon, !newShowAlarmStatus); + lv_obj_set_hidden(labelTimeAmPmAlarm, !newShowAlarmStatus); + const char* labelToggleAlarm = newShowAlarmStatus ? Symbols::bell : Symbols::notbell; + lv_label_set_text_static(lblAlarm, labelToggleAlarm); + } + + if (object == btnNextColor) { colorIndex = (colorIndex + 1) % nColors; settingsController.SetInfineatColorIndex(colorIndex); @@ -452,6 +508,43 @@ void WatchFaceInfineat::Refresh() { lv_obj_align(bleIcon, dateContainer, LV_ALIGN_OUT_BOTTOM_MID, 0, 3); } + if (settingsController.GetInfineatShowAlarmStatus()) { + isAlarmSet = alarmController.IsEnabled()==true; + // sets the icon as bell or barred bell + lv_label_set_text_static(alarmIcon, AlarmIcon::GetIcon(isAlarmSet.Get())); + //displays the time of the alarm or nothing if the alarm is not set + if (isAlarmSet.Get()) { + uint8_t alarmHours = alarmController.Hours(); + uint8_t alarmMinutes = alarmController.Minutes(); + //handles the am pm format. + if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) { + char ampmChar[3] = "AM"; + if (alarmHours == 0) { + alarmHours = 12; + } else if (alarmHours == 12) { + ampmChar[0]='P'; + } else if (alarmHours > 12) { + alarmHours = alarmHours - 12; + ampmChar[0]='P'; + } + lv_label_set_text(labelTimeAmPmAlarm, ampmChar); + lv_obj_set_style_local_text_font(labelTimeAmPmAlarm, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, font_teko); + lv_obj_align(labelTimeAmPmAlarm, labelAlarm, LV_ALIGN_OUT_TOP_RIGHT, 0, 0); + } + + lv_label_set_text_fmt(labelAlarm, "%02d:%02d", alarmHours, alarmMinutes); + + lv_obj_align(alarmIcon, labelAlarm, LV_ALIGN_OUT_LEFT_MID, -3, 0); + lv_obj_align(labelAlarm, dateContainer, LV_ALIGN_OUT_BOTTOM_MID, -10, 0); + lv_obj_align(labelAlarm, lv_scr_act(), LV_ALIGN_IN_BOTTOM_RIGHT, -3, 0); + + } + else { + lv_label_set_text_static(labelAlarm, Symbols::none); + lv_obj_align(alarmIcon, dateContainer, LV_ALIGN_OUT_BOTTOM_MID, 0, 0); + lv_obj_align(alarmIcon, lv_scr_act(), LV_ALIGN_IN_BOTTOM_RIGHT, -3, 0); + } + } stepCount = motionController.NbSteps(); if (stepCount.IsUpdated()) { lv_label_set_text_fmt(stepValue, "%lu", stepCount.Get()); diff --git a/src/displayapp/screens/WatchFaceInfineat.h b/src/displayapp/screens/WatchFaceInfineat.h index 55c43f98..9edb91b0 100644 --- a/src/displayapp/screens/WatchFaceInfineat.h +++ b/src/displayapp/screens/WatchFaceInfineat.h @@ -28,6 +28,7 @@ namespace Pinetime { WatchFaceInfineat(Controllers::DateTime& dateTimeController, const Controllers::Battery& batteryController, const Controllers::Ble& bleController, + Controllers::AlarmController& alarmController, Controllers::NotificationManager& notificationManager, Controllers::Settings& settingsController, Controllers::MotionController& motionController, @@ -52,6 +53,7 @@ namespace Pinetime { Utility::DirtyValue isCharging {}; Utility::DirtyValue bleState {}; Utility::DirtyValue bleRadioEnabled {}; + Utility::DirtyValue isAlarmSet{}; Utility::DirtyValue> currentDateTime {}; Utility::DirtyValue stepCount {}; Utility::DirtyValue notificationState {}; @@ -71,22 +73,28 @@ namespace Pinetime { lv_obj_t* dateContainer; lv_obj_t* labelDate; lv_obj_t* bleIcon; + lv_obj_t* labelAlarm; + lv_obj_t* labelTimeAmPmAlarm; + lv_obj_t* alarmIcon; lv_obj_t* stepIcon; lv_obj_t* stepValue; lv_obj_t* notificationIcon; lv_obj_t* btnClose; lv_obj_t* btnNextColor; lv_obj_t* btnToggleCover; + lv_obj_t* btnToggleAlarm; lv_obj_t* btnPrevColor; lv_obj_t* btnSettings; lv_obj_t* labelBtnSettings; lv_obj_t* lblToggle; + lv_obj_t* lblAlarm; lv_obj_t* lines[nLines]; Controllers::DateTime& dateTimeController; const Controllers::Battery& batteryController; const Controllers::Ble& bleController; + Controllers::AlarmController& alarmController; Controllers::NotificationManager& notificationManager; Controllers::Settings& settingsController; Controllers::MotionController& motionController; @@ -109,6 +117,7 @@ namespace Pinetime { return new Screens::WatchFaceInfineat(controllers.dateTimeController, controllers.batteryController, controllers.bleController, + controllers.alarmController, controllers.notificationManager, controllers.settingsController, controllers.motionController, diff --git a/src/displayapp/screens/addWatchface.md b/src/displayapp/screens/addWatchface.md new file mode 100644 index 00000000..aa8459e8 --- /dev/null +++ b/src/displayapp/screens/addWatchface.md @@ -0,0 +1,11 @@ +# Add a new watchface : +## Modify the following files with the names of your source files : + +- /src/displayapp/apps/Apps.h.in +- /src/components/settings/Settings.h +- /src/displayapp/screens/settings/SettingWatchFace.h +- /src/displayapp/UserApps.h +- /src/displayapp/apps/CMakeLists.txt +- CMakelists.txt + + diff --git a/src/displayapp/screens/settings/SettingWatchFace.h b/src/displayapp/screens/settings/SettingWatchFace.h index 9edc1f7a..8d9a6906 100644 --- a/src/displayapp/screens/settings/SettingWatchFace.h +++ b/src/displayapp/screens/settings/SettingWatchFace.h @@ -12,6 +12,8 @@ #include "displayapp/screens/WatchFaceInfineat.h" #include "displayapp/screens/WatchFaceCasioStyleG7710.h" + + namespace Pinetime { namespace Applications { diff --git a/src/libs/lv_conf.h b/src/libs/lv_conf.h index c23647f2..c884482b 100644 --- a/src/libs/lv_conf.h +++ b/src/libs/lv_conf.h @@ -589,7 +589,7 @@ typedef void* lv_obj_user_data_t; /*Calendar (dependencies: -)*/ #define LV_USE_CALENDAR 1 #if LV_USE_CALENDAR -#define LV_CALENDAR_WEEK_STARTS_MONDAY 0 +#define LV_CALENDAR_WEEK_STARTS_MONDAY 1 #endif /*Canvas (dependencies: lv_img)*/ diff --git a/src/resources/images.json b/src/resources/images.json index e4247188..2591bcbb 100644 --- a/src/resources/images.json +++ b/src/resources/images.json @@ -1,11 +1,18 @@ { - "pine_small" : { + "pine_small" : { "sources": "images/pine_logo.png", "color_format": "CF_TRUE_COLOR_ALPHA", "output_format": "bin", "binary_format": "ARGB8565_RBSWAP", "target_path": "/images/" }, + "cat_small" : { + "sources": "images/cat_clean.png", + "color_format": "CF_TRUE_COLOR_ALPHA", + "output_format": "bin", + "binary_format": "ARGB8565_RBSWAP", + "target_path": "/images/" + }, "navigation0" : { "sources": "images/navigation0.png", "color_format": "CF_INDEXED_1_BIT", diff --git a/src/resources/images/cat_clean.png b/src/resources/images/cat_clean.png new file mode 100644 index 00000000..e4d98e96 Binary files /dev/null and b/src/resources/images/cat_clean.png differ diff --git a/todo.log b/todo.log new file mode 100644 index 00000000..e7d50d9f --- /dev/null +++ b/todo.log @@ -0,0 +1,3 @@ +replace alarm info by timer info when timer is ongoing +add a shortcut for a 1min timer on the right +