1d3742e14f
new navigation add some color to the apps redesign menus new settings menu new quick settings code clean up size reduction by converting navigation images to font and more...
87 lines
2.0 KiB
C++
87 lines
2.0 KiB
C++
#pragma once
|
|
|
|
#include "Screen.h"
|
|
#include "components/datetime/DateTimeController.h"
|
|
#include "../LittleVgl.h"
|
|
|
|
#include "FreeRTOS.h"
|
|
#include "portmacro_cmsis.h"
|
|
|
|
#include <array>
|
|
|
|
namespace Pinetime::Applications::Screens {
|
|
|
|
enum class States { Init, Running, Halted };
|
|
|
|
enum class Events { Play, Pause, Stop };
|
|
|
|
struct TimeSeparated_t {
|
|
int mins;
|
|
int secs;
|
|
int msecs;
|
|
};
|
|
|
|
// A simple buffer to hold the latest two laps
|
|
template <int N> struct LapTextBuffer_t {
|
|
LapTextBuffer_t() : buffer {}, currentSize {}, capacity {N}, head {-1} {
|
|
}
|
|
|
|
void addLaps(const TimeSeparated_t& timeVal) {
|
|
head++;
|
|
head %= capacity;
|
|
buffer[head] = timeVal;
|
|
|
|
if (currentSize < capacity) {
|
|
currentSize++;
|
|
}
|
|
}
|
|
|
|
void clearBuffer() {
|
|
buffer = {};
|
|
currentSize = 0;
|
|
head = -1;
|
|
}
|
|
|
|
TimeSeparated_t* operator[](std::size_t idx) {
|
|
// Sanity check for out-of-bounds
|
|
if (idx >= 0 && idx < capacity) {
|
|
if (idx < currentSize) {
|
|
// This transformation is to ensure that head is always pointing to index 0.
|
|
const auto transformed_idx = (head - idx) % capacity;
|
|
return (&buffer[transformed_idx]);
|
|
}
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
private:
|
|
std::array<TimeSeparated_t, N> buffer;
|
|
uint8_t currentSize;
|
|
uint8_t capacity;
|
|
int8_t head;
|
|
};
|
|
|
|
class StopWatch : public Screen {
|
|
public:
|
|
StopWatch(DisplayApp* app);
|
|
~StopWatch() override;
|
|
bool Refresh() override;
|
|
|
|
void playPauseBtnEventHandler(lv_event_t event);
|
|
void stopLapBtnEventHandler(lv_event_t event);
|
|
|
|
private:
|
|
bool running;
|
|
States currentState;
|
|
Events currentEvent;
|
|
TickType_t startTime;
|
|
TickType_t oldTimeElapsed;
|
|
TimeSeparated_t currentTimeSeparated; // Holds Mins, Secs, millisecs
|
|
LapTextBuffer_t<2> lapBuffer;
|
|
int lapNr;
|
|
bool lapPressed;
|
|
lv_obj_t *time, *msecTime, *btnPlayPause, *btnStopLap, *txtPlayPause, *txtStopLap;
|
|
lv_obj_t *lapOneText, *lapTwoText;
|
|
};
|
|
}
|