aboutsummaryrefslogtreecommitdiffstats
path: root/src/displayapp
diff options
context:
space:
mode:
authorpanky-codes <pankaj.sarathy1992@gmail.com>2021-03-11 10:54:14 +0100
committerpanky-codes <pankaj.sarathy1992@gmail.com>2021-03-11 10:54:14 +0100
commitcc58b635a34cf89fa6301096a19e0a816817aa50 (patch)
tree9098be9b77130108d40614b25bee709975730694 /src/displayapp
parenta44260aab0fbe72bd1f93b256c5c045e95dddbd6 (diff)
Basic logic done. Need to change the timer source to get ms. Also need to replace with paddle app in displayApp.cpp and ApplicationList.cpp later.
Diffstat (limited to 'src/displayapp')
-rw-r--r--src/displayapp/Apps.h2
-rw-r--r--src/displayapp/DisplayApp.cpp4
-rw-r--r--src/displayapp/screens/ApplicationList.cpp3
-rw-r--r--src/displayapp/screens/StopWatch.cpp73
-rw-r--r--src/displayapp/screens/StopWatch.h33
5 files changed, 112 insertions, 3 deletions
diff --git a/src/displayapp/Apps.h b/src/displayapp/Apps.h
index 028fc80c..74b121df 100644
--- a/src/displayapp/Apps.h
+++ b/src/displayapp/Apps.h
@@ -2,6 +2,6 @@
namespace Pinetime {
namespace Applications {
- enum class Apps {None, Launcher, Clock, SysInfo, Meter, Brightness, Music, FirmwareValidation, Paint, Paddle, Notifications, Twos, HeartRate, Navigation};
+ enum class Apps {None, Launcher, Clock, SysInfo, Meter, Brightness, Music, FirmwareValidation, Paint, Paddle, Notifications, Twos, HeartRate, Navigation, StopWatch};
}
}
diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp
index 6e3fd0bf..ad58e13d 100644
--- a/src/displayapp/DisplayApp.cpp
+++ b/src/displayapp/DisplayApp.cpp
@@ -12,6 +12,7 @@
#include "displayapp/screens/FirmwareValidation.h"
#include "displayapp/screens/InfiniPaint.h"
#include "displayapp/screens/Paddle.h"
+#include "displayapp/screens/StopWatch.h"
#include "displayapp/screens/Meter.h"
#include "displayapp/screens/Music.h"
#include "displayapp/screens/Navigation.h"
@@ -203,7 +204,8 @@ void DisplayApp::RunningState() {
case Apps::Meter: currentScreen.reset(new Screens::Meter(this)); break;
case Apps::Twos: currentScreen.reset(new Screens::Twos(this)); break;
case Apps::Paint: currentScreen.reset(new Screens::InfiniPaint(this, lvgl)); break;
- case Apps::Paddle: currentScreen.reset(new Screens::Paddle(this, lvgl)); break;
+ //TODO: Change it back
+ case Apps::StopWatch: currentScreen.reset(new Screens::StopWatch(this, dateTimeController)); break;
case Apps::Brightness : currentScreen.reset(new Screens::Brightness(this, brightnessController)); break;
case Apps::Music : currentScreen.reset(new Screens::Music(this, systemTask.nimble().music())); break;
case Apps::Navigation : currentScreen.reset(new Screens::Navigation(this, systemTask.nimble().navigation())); break;
diff --git a/src/displayapp/screens/ApplicationList.cpp b/src/displayapp/screens/ApplicationList.cpp
index 531636eb..4f6ad53d 100644
--- a/src/displayapp/screens/ApplicationList.cpp
+++ b/src/displayapp/screens/ApplicationList.cpp
@@ -60,7 +60,8 @@ std::unique_ptr<Screen> ApplicationList::CreateScreen2() {
{Symbols::asterisk, Apps::Meter},
{Symbols::paintbrush, Apps::Paint},
{Symbols::info, Apps::Notifications},
- {Symbols::paddle, Apps::Paddle},
+ //TODO: Change it back
+ {Symbols::paddle, Apps::StopWatch},
{"2", Apps::Twos}
}
};
diff --git a/src/displayapp/screens/StopWatch.cpp b/src/displayapp/screens/StopWatch.cpp
new file mode 100644
index 00000000..834471e0
--- /dev/null
+++ b/src/displayapp/screens/StopWatch.cpp
@@ -0,0 +1,73 @@
+#include "StopWatch.h"
+
+#include "Screen.h"
+#include "lvgl/lvgl.h"
+
+#include <tuple>
+
+// Anonymous namespace for local functions
+namespace {
+ std::tuple<int, int, int> convertMilliSecsToSegments(const int64_t& currentTime) {
+ const int milliSecs = (currentTime % 1000); // Get only the first two digits and ignore the last
+ const int secs = (currentTime / 1000) % 60;
+ const int mins = (currentTime / 1000) / 60;
+ return std::make_tuple(mins, secs, milliSecs);
+ }
+}
+using namespace Pinetime::Applications::Screens;
+
+StopWatch::StopWatch(DisplayApp* app, const Pinetime::Controllers::DateTime& dateTime)
+ : Screen(app), dateTime {dateTime}, running {true}, currentState {States::INIT}, currentEvent {Events::PLAY}, startTime {},
+ timeElapsed {} {
+
+ time = lv_label_create(lv_scr_act(), nullptr);
+ lv_obj_set_style_local_text_font(time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_extrabold_compressed);
+ lv_obj_align(time, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, 0);
+
+ msecTime = lv_label_create(lv_scr_act(), nullptr);
+ lv_obj_set_style_local_text_font(msecTime, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_bold_20);
+ lv_obj_align(msecTime, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 115, 60);
+}
+
+StopWatch::~StopWatch() {
+ lv_obj_clean(lv_scr_act());
+}
+
+bool StopWatch::Refresh() {
+
+ switch (currentState) {
+ // Init state when an user first opens the app
+ // and when a stop/reset button is pressed
+ case States::INIT: {
+ // The initial default value
+ lv_label_set_text(time, "00:00");
+ lv_label_set_text(msecTime, "00");
+ if (currentEvent == Events::PLAY) {
+ startTime = dateTime.CurrentDateTime();
+ currentState = States::RUNNING;
+ }
+ break;
+ }
+ case States::RUNNING: {
+ auto delta = std::chrono::duration_cast<std::chrono::microseconds>(dateTime.CurrentDateTime() - startTime);
+ timeElapsed = delta.count();
+ auto timeSeparated = convertMilliSecsToSegments(timeElapsed);
+ lv_label_set_text_fmt(time, "%02d:%02d", std::get<0>(timeSeparated), std::get<1>(timeSeparated));
+ break;
+ }
+ case States::HALTED: {
+
+ break;
+ }
+ }
+ return running;
+}
+
+bool StopWatch::OnButtonPushed() {
+ running = false;
+ return true;
+}
+
+bool StopWatch::OnTouchEvent(uint16_t x, uint16_t y) {
+ return true;
+} \ No newline at end of file
diff --git a/src/displayapp/screens/StopWatch.h b/src/displayapp/screens/StopWatch.h
new file mode 100644
index 00000000..ecc1f276
--- /dev/null
+++ b/src/displayapp/screens/StopWatch.h
@@ -0,0 +1,33 @@
+#pragma once
+
+#include "Screen.h"
+#include "components/datetime/DateTimeController.h"
+#include "../LittleVgl.h"
+
+#include <chrono>
+
+namespace Pinetime::Applications::Screens {
+
+ enum class States { INIT, RUNNING, HALTED };
+
+ enum class Events { PLAY, PAUSE, STOP };
+
+ class StopWatch : public Screen {
+ public:
+ StopWatch(DisplayApp* app, const Pinetime::Controllers::DateTime& dateTime);
+ ~StopWatch() override;
+ bool Refresh() override;
+ bool OnButtonPushed() override;
+ bool OnTouchEvent(uint16_t x, uint16_t y) override;
+
+ private:
+ using timeUnit = std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds>;
+ const Pinetime::Controllers::DateTime& dateTime;
+ bool running;
+ States currentState;
+ Events currentEvent;
+ timeUnit startTime;
+ int64_t timeElapsed;
+ lv_obj_t *time, *msecTime;
+ };
+} \ No newline at end of file