summaryrefslogtreecommitdiff
path: root/src/displayapp
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
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 028fc80..74b121d 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 6e3fd0b..ad58e13 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 531636e..4f6ad53 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 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
diff --git a/src/displayapp/screens/StopWatch.h b/src/displayapp/screens/StopWatch.h
new file mode 100644
index 0000000..ecc1f27
--- /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