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:
panky-codes 2021-03-11 10:54:14 +01:00
parent a44260aab0
commit cc58b635a3
6 changed files with 114 additions and 3 deletions

View File

@ -474,6 +474,7 @@ list(APPEND SOURCE_FILES
displayapp/screens/Meter.cpp
displayapp/screens/InfiniPaint.cpp
displayapp/screens/Paddle.cpp
displayapp/screens/StopWatch.cpp
displayapp/screens/BatteryIcon.cpp
displayapp/screens/BleIcon.cpp
displayapp/screens/NotificationIcon.cpp
@ -566,6 +567,7 @@ set(INCLUDE_FILES
displayapp/screens/Tile.h
displayapp/screens/Meter.h
displayapp/screens/InfiniPaint.h
displayapp/screens/StopWatch.h
displayapp/screens/Paddle.h
displayapp/screens/DropDownDemo.h
displayapp/screens/BatteryIcon.h

View File

@ -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};
}
}

View File

@ -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;

View File

@ -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}
}
};

View 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;
}

View 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;
};
}