Add new App : Sysinfo. It displays various info about the running system : version, date/time, battery, brightness and resetreason. It contains placeholder for future use (like mac address, uptime,...).
parent
8ed6ffaaf8
commit
fb64ba8fb6
@ -0,0 +1,28 @@
|
||||
#include <libs/lvgl/lvgl.h>
|
||||
#include "Label.h"
|
||||
|
||||
using namespace Pinetime::Applications::Screens;
|
||||
|
||||
|
||||
Label::Label(const char* text) : text{text} {
|
||||
|
||||
}
|
||||
|
||||
Label::~Label() {
|
||||
|
||||
}
|
||||
|
||||
void Label::Refresh() {
|
||||
|
||||
}
|
||||
|
||||
void Label::Show() {
|
||||
label = lv_label_create(lv_scr_act(), NULL);
|
||||
lv_label_set_align(label, LV_LABEL_ALIGN_LEFT);
|
||||
lv_obj_set_size(label, 240, 240);
|
||||
lv_label_set_text(label, text);
|
||||
}
|
||||
|
||||
void Label::Hide() {
|
||||
lv_obj_clean(lv_scr_act());
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
#pragma once
|
||||
|
||||
#include <vector>
|
||||
#include "Screen.h"
|
||||
|
||||
namespace Pinetime {
|
||||
namespace Applications {
|
||||
namespace Screens {
|
||||
class Label {
|
||||
public:
|
||||
Label() = default;
|
||||
explicit Label(const char* text);
|
||||
~Label();
|
||||
void Refresh();
|
||||
|
||||
void Hide();
|
||||
void Show();
|
||||
private:
|
||||
lv_obj_t * label = nullptr;
|
||||
const char* text = nullptr;
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,125 @@
|
||||
#include <libs/lvgl/lvgl.h>
|
||||
#include <DisplayApp/DisplayApp.h>
|
||||
#include "ScreenList.h"
|
||||
|
||||
using namespace Pinetime::Applications::Screens;
|
||||
|
||||
// TODO this class must be improved to receive the list of "sub screens" via pointer or
|
||||
// move operation.
|
||||
// It should accept many type of "sub screen" (it only supports Label for now).
|
||||
// The number of sub screen it supports must be dynamic.
|
||||
ScreenList::ScreenList(Pinetime::Applications::DisplayApp *app, Pinetime::Controllers::DateTime &dateTimeController,
|
||||
Pinetime::Controllers::Battery& batteryController, Pinetime::Controllers::BrightnessController& brightnessController, Pinetime::Drivers::WatchdogView& watchdog) :
|
||||
Screen(app),
|
||||
dateTimeController{dateTimeController}, batteryController{batteryController}, brightnessController{brightnessController}, watchdog{watchdog} {
|
||||
screens.reserve(3);
|
||||
|
||||
// TODO all of this is far too heavy (string processing). This should be improved.
|
||||
// TODO the info (battery, time,...) should be updated in the Refresh method.
|
||||
char t1[200];
|
||||
|
||||
auto batteryPercent = static_cast<int16_t>(batteryController.PercentRemaining());
|
||||
if(batteryPercent > 100) batteryPercent = 100;
|
||||
else if(batteryPercent < 0) batteryPercent = 0;
|
||||
|
||||
uint8_t brightness = 0;
|
||||
switch(brightnessController.Level()) {
|
||||
case Controllers::BrightnessController::Levels::Low: brightness = 1; break;
|
||||
case Controllers::BrightnessController::Levels::Medium: brightness = 2; break;
|
||||
case Controllers::BrightnessController::Levels::High: brightness = 3; break;
|
||||
}
|
||||
auto resetReason = [&watchdog]() {
|
||||
switch (watchdog.ResetReason()) {
|
||||
case Drivers::Watchdog::ResetReasons::Watchdog: return "wtdg";
|
||||
case Drivers::Watchdog::ResetReasons::HardReset: return "hardr";
|
||||
case Drivers::Watchdog::ResetReasons::NFC: return "nfc";
|
||||
case Drivers::Watchdog::ResetReasons::SoftReset: return "softr";
|
||||
case Drivers::Watchdog::ResetReasons::CpuLockup: return "cpulock";
|
||||
case Drivers::Watchdog::ResetReasons::SystemOff: return "off";
|
||||
case Drivers::Watchdog::ResetReasons::LpComp: return "lpcomp";
|
||||
case Drivers::Watchdog::ResetReasons::DebugInterface: return "dbg";
|
||||
case Drivers::Watchdog::ResetReasons::ResetPin: return "rst";
|
||||
default: return "?";
|
||||
}
|
||||
}();
|
||||
|
||||
|
||||
sprintf(t1, "Pinetime\n"
|
||||
"Version:%d.%d.%d\n"
|
||||
"Build: xx/xx/xxxx\n"
|
||||
"Time: %02d:%02d:%02d\n"
|
||||
"date: %02d/%02d/%04d\n"
|
||||
"Uptime: xd xxhxx:xx\n"
|
||||
"Battery: %d%%\n"
|
||||
"Backlight: %d/3\n"
|
||||
"Last reset: %s\n"
|
||||
"BLE MAC: \n AA:BB:CC:DD:EE:FF", Version::Major(), Version::Minor(), Version::Patch(),
|
||||
dateTimeController.Hours(), dateTimeController.Minutes(), dateTimeController.Seconds(),
|
||||
dateTimeController.Day(), dateTimeController.Month(), dateTimeController.Year(),
|
||||
batteryPercent, brightness, resetReason);
|
||||
/*
|
||||
auto t1 = "Pinetime\n"
|
||||
"Version:\n"
|
||||
"Build: 23/03/2020\n"
|
||||
"Time: 17:23:12\n"
|
||||
"date: 23/03/2020\n"
|
||||
"Uptime: 2d 13h52:21\n"
|
||||
"Battery: 3.56v/82%\n"
|
||||
"Backlight: 2/3\n"
|
||||
"Last reset: wtdg\n"
|
||||
"BLE MAC: \n AA:BB:CC:DD:EE:FF";*/
|
||||
screens.emplace_back(t1);
|
||||
|
||||
auto t2 = "Hello from\nthe developper!";
|
||||
screens.emplace_back(t2);
|
||||
|
||||
auto t3 = "Place holder\nin case we need\nmore room!";
|
||||
screens.emplace_back(t3);
|
||||
|
||||
auto &screen = screens[screenIndex];
|
||||
screen.Show();
|
||||
}
|
||||
|
||||
ScreenList::~ScreenList() {
|
||||
lv_obj_clean(lv_scr_act());
|
||||
}
|
||||
|
||||
bool ScreenList::Refresh() {
|
||||
auto &screen = screens[screenIndex];
|
||||
screen.Refresh();
|
||||
|
||||
return running;
|
||||
}
|
||||
|
||||
bool ScreenList::OnButtonPushed() {
|
||||
running = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ScreenList::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
|
||||
switch (event) {
|
||||
case TouchEvents::SwipeDown:
|
||||
if (screenIndex > 0) {
|
||||
app->SetFullRefresh(DisplayApp::FullRefreshDirections::Down);
|
||||
auto &oldScreen = screens[screenIndex];
|
||||
oldScreen.Hide();
|
||||
screenIndex--;
|
||||
auto &newScreen = screens[screenIndex];
|
||||
newScreen.Show();
|
||||
}
|
||||
return true;
|
||||
case TouchEvents::SwipeUp:
|
||||
app->SetFullRefresh(DisplayApp::FullRefreshDirections::Up);
|
||||
if (screenIndex < screens.size() - 1) {
|
||||
auto &oldScreen = screens[screenIndex];
|
||||
oldScreen.Hide();
|
||||
screenIndex++;
|
||||
auto &newScreen = screens[screenIndex];
|
||||
newScreen.Show();
|
||||
}
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
#pragma once
|
||||
|
||||
#include <vector>
|
||||
#include "Screen.h"
|
||||
#include "Label.h"
|
||||
|
||||
namespace Pinetime {
|
||||
namespace Applications {
|
||||
namespace Screens {
|
||||
class ScreenList : public Screen {
|
||||
public:
|
||||
explicit ScreenList(DisplayApp* app,
|
||||
Pinetime::Controllers::DateTime& dateTimeController,
|
||||
Pinetime::Controllers::Battery& batteryController,
|
||||
Pinetime::Controllers::BrightnessController& brightnessController,
|
||||
Pinetime::Drivers::WatchdogView& watchdog);
|
||||
~ScreenList() override;
|
||||
bool Refresh() override;
|
||||
bool OnButtonPushed() override;
|
||||
bool OnTouchEvent(TouchEvents event) override;
|
||||
private:
|
||||
bool running = true;
|
||||
uint8_t screenIndex = 0;
|
||||
|
||||
// TODO choose another container without dynamic alloc
|
||||
std::vector<Screens::Label> screens;
|
||||
Pinetime::Controllers::DateTime& dateTimeController;
|
||||
Pinetime::Controllers::Battery& batteryController;
|
||||
Pinetime::Controllers::BrightnessController& brightnessController;
|
||||
Pinetime::Drivers::WatchdogView& watchdog;
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue