summaryrefslogtreecommitdiff
path: root/src/displayapp/screens/StopWatch.cpp
diff options
context:
space:
mode:
authorpanky-codes <pankaj.sarathy1992@gmail.com>2021-03-11 09:54:14 (GMT)
committerpanky-codes <pankaj.sarathy1992@gmail.com>2021-03-11 09:54:14 (GMT)
commitcc58b635a34cf89fa6301096a19e0a816817aa50 (patch)
tree9098be9b77130108d40614b25bee709975730694 /src/displayapp/screens/StopWatch.cpp
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/screens/StopWatch.cpp')
-rw-r--r--src/displayapp/screens/StopWatch.cpp73
1 files changed, 73 insertions, 0 deletions
diff --git a/src/displayapp/screens/StopWatch.cpp b/src/displayapp/screens/StopWatch.cpp
new file mode 100644
index 0000000..834471e
--- /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