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.
This commit is contained in:
parent
a44260aab0
commit
cc58b635a3
|
@ -474,6 +474,7 @@ list(APPEND SOURCE_FILES
|
||||||
displayapp/screens/Meter.cpp
|
displayapp/screens/Meter.cpp
|
||||||
displayapp/screens/InfiniPaint.cpp
|
displayapp/screens/InfiniPaint.cpp
|
||||||
displayapp/screens/Paddle.cpp
|
displayapp/screens/Paddle.cpp
|
||||||
|
displayapp/screens/StopWatch.cpp
|
||||||
displayapp/screens/BatteryIcon.cpp
|
displayapp/screens/BatteryIcon.cpp
|
||||||
displayapp/screens/BleIcon.cpp
|
displayapp/screens/BleIcon.cpp
|
||||||
displayapp/screens/NotificationIcon.cpp
|
displayapp/screens/NotificationIcon.cpp
|
||||||
|
@ -566,6 +567,7 @@ set(INCLUDE_FILES
|
||||||
displayapp/screens/Tile.h
|
displayapp/screens/Tile.h
|
||||||
displayapp/screens/Meter.h
|
displayapp/screens/Meter.h
|
||||||
displayapp/screens/InfiniPaint.h
|
displayapp/screens/InfiniPaint.h
|
||||||
|
displayapp/screens/StopWatch.h
|
||||||
displayapp/screens/Paddle.h
|
displayapp/screens/Paddle.h
|
||||||
displayapp/screens/DropDownDemo.h
|
displayapp/screens/DropDownDemo.h
|
||||||
displayapp/screens/BatteryIcon.h
|
displayapp/screens/BatteryIcon.h
|
||||||
|
|
|
@ -2,6 +2,6 @@
|
||||||
|
|
||||||
namespace Pinetime {
|
namespace Pinetime {
|
||||||
namespace Applications {
|
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};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include "displayapp/screens/FirmwareValidation.h"
|
#include "displayapp/screens/FirmwareValidation.h"
|
||||||
#include "displayapp/screens/InfiniPaint.h"
|
#include "displayapp/screens/InfiniPaint.h"
|
||||||
#include "displayapp/screens/Paddle.h"
|
#include "displayapp/screens/Paddle.h"
|
||||||
|
#include "displayapp/screens/StopWatch.h"
|
||||||
#include "displayapp/screens/Meter.h"
|
#include "displayapp/screens/Meter.h"
|
||||||
#include "displayapp/screens/Music.h"
|
#include "displayapp/screens/Music.h"
|
||||||
#include "displayapp/screens/Navigation.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::Meter: currentScreen.reset(new Screens::Meter(this)); break;
|
||||||
case Apps::Twos: currentScreen.reset(new Screens::Twos(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::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::Brightness : currentScreen.reset(new Screens::Brightness(this, brightnessController)); break;
|
||||||
case Apps::Music : currentScreen.reset(new Screens::Music(this, systemTask.nimble().music())); 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;
|
case Apps::Navigation : currentScreen.reset(new Screens::Navigation(this, systemTask.nimble().navigation())); break;
|
||||||
|
|
|
@ -60,7 +60,8 @@ std::unique_ptr<Screen> ApplicationList::CreateScreen2() {
|
||||||
{Symbols::asterisk, Apps::Meter},
|
{Symbols::asterisk, Apps::Meter},
|
||||||
{Symbols::paintbrush, Apps::Paint},
|
{Symbols::paintbrush, Apps::Paint},
|
||||||
{Symbols::info, Apps::Notifications},
|
{Symbols::info, Apps::Notifications},
|
||||||
{Symbols::paddle, Apps::Paddle},
|
//TODO: Change it back
|
||||||
|
{Symbols::paddle, Apps::StopWatch},
|
||||||
{"2", Apps::Twos}
|
{"2", Apps::Twos}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
73
src/displayapp/screens/StopWatch.cpp
Normal file
73
src/displayapp/screens/StopWatch.cpp
Normal file
|
@ -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;
|
||||||
|
}
|
33
src/displayapp/screens/StopWatch.h
Normal file
33
src/displayapp/screens/StopWatch.h
Normal file
|
@ -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;
|
||||||
|
};
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user