Replace bitmap icons by font icons (provided by AwesomeFont and LVGL). These icons are smaller in memory and quicker to draw.

BLE and battery icon replaced in Clock screen.
Added heartbeat and step icons in Clock screen.
Replace all labels in Menu by icons.

Add doc to generate new font.
This commit is contained in:
JF
2020-07-04 13:58:15 +02:00
parent bb11891b6e
commit da39f402e5
24 changed files with 343 additions and 9275 deletions

View File

@@ -1,62 +1,21 @@
#include "BatteryIcon.h"
#include "Symbols.h"
using namespace Pinetime::Applications::Screens;
extern lv_img_dsc_t ck_os_battery_error;
extern lv_img_dsc_t ck_os_batterycharging_100;
extern lv_img_dsc_t ck_os_batterycharging_090;
extern lv_img_dsc_t ck_os_batterycharging_080;
extern lv_img_dsc_t ck_os_batterycharging_070;
extern lv_img_dsc_t ck_os_batterycharging_060;
extern lv_img_dsc_t ck_os_batterycharging_050;
extern lv_img_dsc_t ck_os_batterycharging_040;
extern lv_img_dsc_t ck_os_batterycharging_030;
extern lv_img_dsc_t ck_os_batterycharging_020;
extern lv_img_dsc_t ck_os_batterycharging_010;
extern lv_img_dsc_t ck_os_batterycharging_005;
extern lv_img_dsc_t ck_os_battery_100;
extern lv_img_dsc_t ck_os_battery_090;
extern lv_img_dsc_t ck_os_battery_080;
extern lv_img_dsc_t ck_os_battery_070;
extern lv_img_dsc_t ck_os_battery_060;
extern lv_img_dsc_t ck_os_battery_050;
extern lv_img_dsc_t ck_os_battery_040;
extern lv_img_dsc_t ck_os_battery_030;
extern lv_img_dsc_t ck_os_battery_020;
extern lv_img_dsc_t ck_os_battery_010;
extern lv_img_dsc_t ck_os_battery_005;
lv_img_dsc_t *BatteryIcon::GetIcon(bool isCharging, float batteryPercent) {
if(isCharging) {
if(batteryPercent > 90.0f) return &ck_os_batterycharging_100;
else if(batteryPercent > 80.0f) return &ck_os_batterycharging_090;
else if(batteryPercent > 70.0f) return &ck_os_batterycharging_080;
else if(batteryPercent > 60.0f) return &ck_os_batterycharging_070;
else if(batteryPercent > 50.0f) return &ck_os_batterycharging_060;
else if(batteryPercent > 40.0f) return &ck_os_batterycharging_050;
else if(batteryPercent > 30.0f) return &ck_os_batterycharging_040;
else if(batteryPercent > 20.0f) return &ck_os_batterycharging_030;
else if(batteryPercent > 10.0f) return &ck_os_batterycharging_020;
else if(batteryPercent > 5.0f) return &ck_os_batterycharging_010;
else return &ck_os_batterycharging_005;
} else {
if(batteryPercent > 90.0f) return &ck_os_battery_100;
else if(batteryPercent > 80.0f) return &ck_os_battery_090;
else if(batteryPercent > 70.0f) return &ck_os_battery_080;
else if(batteryPercent > 60.0f) return &ck_os_battery_070;
else if(batteryPercent > 50.0f) return &ck_os_battery_060;
else if(batteryPercent > 40.0f) return &ck_os_battery_050;
else if(batteryPercent > 30.0f) return &ck_os_battery_040;
else if(batteryPercent > 20.0f) return &ck_os_battery_030;
else if(batteryPercent > 10.0f) return &ck_os_battery_020;
else if(batteryPercent > 5.0f) return &ck_os_battery_010;
else return &ck_os_battery_005;
}
const char* BatteryIcon::GetBatteryIcon(float batteryPercent) {
if(batteryPercent > 90.0f) return Symbols::batteryFull;
if(batteryPercent > 75.0f) return Symbols::batteryThreeQuarter;
if(batteryPercent > 50.0f) return Symbols::batteryHalf;
if(batteryPercent > 25.0f) return Symbols::batteryOneQuarter;
return Symbols::batteryEmpty;
}
lv_img_dsc_t *BatteryIcon::GetUnknownIcon() {
return &ck_os_battery_error;
const char* BatteryIcon::GetUnknownIcon() {
return Symbols::batteryEmpty;
}
const char *BatteryIcon::GetPlugIcon(bool isCharging) {
if(isCharging)
return Symbols::plug;
else return "";
}

View File

@@ -7,8 +7,9 @@ namespace Pinetime {
namespace Screens {
class BatteryIcon {
public:
static lv_img_dsc_t* GetUnknownIcon();
static lv_img_dsc_t* GetIcon(bool isCharging, float batteryPercent);
static const char* GetUnknownIcon();
static const char* GetBatteryIcon(float batteryPercent);
static const char* GetPlugIcon(bool isCharging);
};
}
}

View File

@@ -1,12 +1,8 @@
#include "BleIcon.h"
#include "Symbols.h"
using namespace Pinetime::Applications::Screens;
extern lv_img_dsc_t ck_os_bt_connected;
extern lv_img_dsc_t ck_os_bt_disconnected;
lv_img_dsc_t *BleIcon::GetIcon(bool isConnected) {
if(isConnected) return &ck_os_bt_connected;
else return &ck_os_bt_disconnected;
const char* BleIcon::GetIcon(bool isConnected) {
if(isConnected) return Symbols::bluetooth;
else return "";
}

View File

@@ -1,13 +1,11 @@
#pragma once
#include <libs/lvgl/src/lv_draw/lv_img_decoder.h>
namespace Pinetime {
namespace Applications {
namespace Screens {
class BleIcon {
public:
static lv_img_dsc_t* GetIcon(bool isConnected);
static const char* GetIcon(bool isConnected);
};
}
}

View File

@@ -1,13 +1,12 @@
#include <cstdio>
#include <libs/date/includes/date/date.h>
#include <Components/DateTime/DateTimeController.h>
#include <Version.h>
#include <libs/lvgl/lvgl.h>
#include "Clock.h"
#include "../DisplayApp.h"
#include "BatteryIcon.h"
#include "BleIcon.h"
#include "Symbols.h"
using namespace Pinetime::Applications::Screens;
extern lv_font_t jetbrains_mono_extrabold_compressed;
extern lv_font_t jetbrains_mono_bold_20;
@@ -21,7 +20,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) {
Clock::Clock(DisplayApp* app,
Controllers::DateTime& dateTimeController,
Controllers::Battery& batteryController,
Controllers::Ble& bleController) : Screen(app), currentDateTime{{}}, version {{}},
Controllers::Ble& bleController) : Screen(app), currentDateTime{{}},
dateTimeController{dateTimeController}, batteryController{batteryController}, bleController{bleController} {
displayedChar[0] = 0;
displayedChar[1] = 0;
@@ -29,13 +28,18 @@ Clock::Clock(DisplayApp* app,
displayedChar[3] = 0;
displayedChar[4] = 0;
batteryIcon = lv_img_create(lv_scr_act(), NULL);
lv_img_set_src(batteryIcon, BatteryIcon::GetUnknownIcon());
lv_obj_align(batteryIcon, lv_scr_act(), LV_ALIGN_IN_TOP_RIGHT, 0, 0);
batteryIcon = lv_label_create(lv_scr_act(), NULL);
lv_label_set_text(batteryIcon, Symbols::batteryFull);
lv_obj_align(batteryIcon, lv_scr_act(), LV_ALIGN_IN_TOP_RIGHT, -5, 2);
batteryPlug = lv_label_create(lv_scr_act(), NULL);
lv_label_set_text(batteryPlug, Symbols::plug);
lv_obj_align(batteryPlug, batteryIcon, LV_ALIGN_OUT_LEFT_MID, -5, 0);
bleIcon = lv_label_create(lv_scr_act(), NULL);
lv_label_set_text(bleIcon, Symbols::bluetooth);
lv_obj_align(bleIcon, batteryPlug, LV_ALIGN_OUT_LEFT_MID, -5, 0);
bleIcon = lv_img_create(lv_scr_act(), NULL);
lv_img_set_src(bleIcon, BleIcon::GetIcon(false));
lv_obj_align(bleIcon, batteryIcon, LV_ALIGN_OUT_LEFT_MID, 0, 0);
label_date = lv_label_create(lv_scr_act(), NULL);
@@ -53,6 +57,27 @@ Clock::Clock(DisplayApp* app,
lv_obj_set_size(backgroundLabel, 240, 240);
lv_obj_set_pos(backgroundLabel, 0, 0);
lv_label_set_text(backgroundLabel, "");
heartbeatIcon = lv_label_create(lv_scr_act(), NULL);
lv_label_set_text(heartbeatIcon, Symbols::heartBeat);
lv_obj_align(heartbeatIcon, lv_scr_act(), LV_ALIGN_IN_BOTTOM_LEFT, 5, -2);
heartbeatValue = lv_label_create(lv_scr_act(), NULL);
lv_label_set_text(heartbeatValue, "0");
lv_obj_align(heartbeatValue, heartbeatIcon, LV_ALIGN_OUT_RIGHT_MID, 5, 0);
heartbeatBpm = lv_label_create(lv_scr_act(), NULL);
lv_label_set_text(heartbeatBpm, "BPM");
lv_obj_align(heartbeatBpm, heartbeatValue, LV_ALIGN_OUT_RIGHT_MID, 5, 0);
stepValue = lv_label_create(lv_scr_act(), NULL);
lv_label_set_text(stepValue, "0");
lv_obj_align(stepValue, lv_scr_act(), LV_ALIGN_IN_BOTTOM_RIGHT, -5, -2);
stepIcon = lv_label_create(lv_scr_act(), NULL);
lv_label_set_text(stepIcon, Symbols::shoe);
lv_obj_align(stepIcon, stepValue, LV_ALIGN_OUT_LEFT_MID, -5, 0);
}
Clock::~Clock() {
@@ -63,17 +88,22 @@ bool Clock::Refresh() {
batteryPercentRemaining = batteryController.PercentRemaining();
if (batteryPercentRemaining.IsUpdated()) {
auto batteryPercent = batteryPercentRemaining.Get();
lv_img_set_src(batteryIcon, BatteryIcon::GetIcon(batteryController.IsCharging() || batteryController.IsPowerPresent(), batteryPercent));
lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(batteryPercent));
auto isCharging = batteryController.IsCharging() || batteryController.IsPowerPresent();
lv_label_set_text(batteryPlug, BatteryIcon::GetPlugIcon(isCharging));
}
bleState = bleController.IsConnected();
if (bleState.IsUpdated()) {
if(bleState.Get() == true) {
lv_img_set_src(bleIcon, BleIcon::GetIcon(true));
lv_label_set_text(bleIcon, BleIcon::GetIcon(true));
} else {
lv_img_set_src(bleIcon, BleIcon::GetIcon(false));
lv_label_set_text(bleIcon, BleIcon::GetIcon(false));
}
}
lv_obj_align(batteryIcon, lv_scr_act(), LV_ALIGN_IN_TOP_RIGHT, -5, 5);
lv_obj_align(batteryPlug, batteryIcon, LV_ALIGN_OUT_LEFT_MID, -5, 0);
lv_obj_align(bleIcon, batteryPlug, LV_ALIGN_OUT_LEFT_MID, -5, 0);
currentDateTime = dateTimeController.CurrentDateTime();
@@ -124,6 +154,25 @@ bool Clock::Refresh() {
}
}
// TODO heartbeat = heartBeatController.GetValue();
if(heartbeat.IsUpdated()) {
char heartbeatBuffer[4];
sprintf(heartbeatBuffer, "%d", heartbeat.Get());
lv_label_set_text(heartbeatValue, heartbeatBuffer);
lv_obj_align(heartbeatIcon, lv_scr_act(), LV_ALIGN_IN_BOTTOM_LEFT, 5, -2);
lv_obj_align(heartbeatValue, heartbeatIcon, LV_ALIGN_OUT_RIGHT_MID, 5, 0);
lv_obj_align(heartbeatBpm, heartbeatValue, LV_ALIGN_OUT_RIGHT_MID, 5, 0);
}
// TODO stepCount = stepController.GetValue();
if(stepCount.IsUpdated()) {
char stepBuffer[5];
sprintf(stepBuffer, "%lu", stepCount.Get());
lv_label_set_text(stepValue, stepBuffer);
lv_obj_align(stepValue, lv_scr_act(), LV_ALIGN_IN_BOTTOM_RIGHT, -5, -2);
lv_obj_align(stepIcon, stepValue, LV_ALIGN_OUT_LEFT_MID, -5, 0);
}
return running;
}

View File

@@ -2,16 +2,12 @@
#include <cstdint>
#include <chrono>
#include <Components/Gfx/Gfx.h>
#include "Screen.h"
#include <bits/unique_ptr.h>
#include <libs/lvgl/src/lv_core/lv_style.h>
#include <libs/lvgl/src/lv_core/lv_obj.h>
#include <Components/Battery/BatteryController.h>
#include <Components/Ble/BleController.h>
#include "../Fonts/lcdfont14.h"
#include "../Fonts/lcdfont70.h"
#include "../../Version.h"
namespace Pinetime {
namespace Applications {
@@ -64,13 +60,21 @@ namespace Pinetime {
DirtyValue<uint8_t> batteryPercentRemaining {0};
DirtyValue<bool> bleState {false};
DirtyValue<std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds>> currentDateTime;
DirtyValue<Pinetime::Version> version;
DirtyValue<uint32_t> stepCount {0};
DirtyValue<uint8_t> heartbeat {0};
lv_obj_t* label_time;
lv_obj_t* label_date;
lv_obj_t* backgroundLabel;
lv_obj_t * batteryIcon;
lv_obj_t * bleIcon;
lv_obj_t* batteryPlug;
lv_obj_t* heartbeatIcon;
lv_obj_t* heartbeatValue;
lv_obj_t* heartbeatBpm;
lv_obj_t* stepIcon;
lv_obj_t* stepValue;
Controllers::DateTime& dateTimeController;
Controllers::Battery& batteryController;

View File

@@ -2,16 +2,11 @@
#include <cstdint>
#include <chrono>
#include <Components/Gfx/Gfx.h>
#include "Screen.h"
#include <bits/unique_ptr.h>
#include <libs/lvgl/src/lv_core/lv_style.h>
#include <libs/lvgl/src/lv_core/lv_obj.h>
#include <Components/Battery/BatteryController.h>
#include <Components/Ble/BleController.h>
#include "../Fonts/lcdfont14.h"
#include "../Fonts/lcdfont70.h"
#include "../../Version.h"
namespace Pinetime {
namespace Applications {

View File

@@ -1,17 +1,10 @@
#pragma once
#include <cstdint>
#include <chrono>
#include <Components/Gfx/Gfx.h>
#include "Screen.h"
#include <bits/unique_ptr.h>
#include <libs/lvgl/src/lv_core/lv_style.h>
#include <libs/lvgl/src/lv_core/lv_obj.h>
#include <Components/Battery/BatteryController.h>
#include <Components/Ble/BleController.h>
#include "../Fonts/lcdfont14.h"
#include "../Fonts/lcdfont70.h"
#include "../../Version.h"
namespace Pinetime {
namespace Applications {

View File

@@ -1,13 +1,8 @@
#pragma once
#include <cstdint>
#include <chrono>
#include <Components/Gfx/Gfx.h>
#include "Screen.h"
#include <bits/unique_ptr.h>
#include "../Fonts/lcdfont14.h"
#include "../Fonts/lcdfont70.h"
#include "../../Version.h"
#include <lvgl/src/lv_core/lv_style.h>
namespace Pinetime {

View File

@@ -2,16 +2,10 @@
#include <cstdint>
#include <chrono>
#include <Components/Gfx/Gfx.h>
#include "Screen.h"
#include <bits/unique_ptr.h>
#include <libs/lvgl/src/lv_core/lv_style.h>
#include <libs/lvgl/src/lv_core/lv_obj.h>
#include <Components/Battery/BatteryController.h>
#include <Components/Ble/BleController.h>
#include "../Fonts/lcdfont14.h"
#include "../Fonts/lcdfont70.h"
#include "../../Version.h"
namespace Pinetime {
namespace Applications {

View File

@@ -2,16 +2,10 @@
#include <cstdint>
#include <chrono>
#include <Components/Gfx/Gfx.h>
#include "Screen.h"
#include <bits/unique_ptr.h>
#include <libs/lvgl/src/lv_core/lv_style.h>
#include <libs/lvgl/src/lv_core/lv_obj.h>
#include <Components/Battery/BatteryController.h>
#include <Components/Ble/BleController.h>
#include "../Fonts/lcdfont14.h"
#include "../Fonts/lcdfont70.h"
#include "../../Version.h"
namespace Pinetime {
namespace Applications {

View File

@@ -1,6 +1,7 @@
#include <libs/lvgl/lvgl.h>
#include <DisplayApp/DisplayApp.h>
#include "ScreenList.h"
#include "../../Version.h"
using namespace Pinetime::Applications::Screens;

View File

@@ -0,0 +1,24 @@
#pragma once
namespace Pinetime {
namespace Applications {
namespace Screens {
namespace Symbols {
static constexpr char* batteryFull = "\xEF\x89\x80";
static constexpr char* batteryEmpty = "\xEF\x89\x84";
static constexpr char* batteryThreeQuarter = "\xEF\x89\x81";
static constexpr char* batteryHalf = "\xEF\x89\x82";
static constexpr char* batteryOneQuarter = "\xEF\x89\x83";
static constexpr char* heartBeat = "\xEF\x88\x9E";
static constexpr char* bluetoothFull = "\xEF\x8A\x93";
static constexpr char* bluetooth = "\xEF\x8A\x94";
static constexpr char* plug = "\xEF\x87\xA6";
static constexpr char* shoe = "\xEF\x95\x8B";
static constexpr char* clock = "\xEF\x80\x97";
static constexpr char* info = "\xEF\x84\xA9";
static constexpr char* list = "\xEF\x80\xBA";
static constexpr char* sun = "\xEF\x86\x85";
}
}
}
}

View File

@@ -1,13 +1,8 @@
#pragma once
#include <cstdint>
#include <chrono>
#include <Components/Gfx/Gfx.h>
#include "Screen.h"
#include <bits/unique_ptr.h>
#include "../Fonts/lcdfont14.h"
#include "../Fonts/lcdfont70.h"
#include "../../Version.h"
#include <lvgl/src/lv_core/lv_style.h>
namespace Pinetime {

View File

@@ -3,7 +3,8 @@
#include <libs/lvgl/lvgl.h>
#include "Tile.h"
#include <DisplayApp/DisplayApp.h>
#include "Symbols.h"
#include "../../Version.h"
using namespace Pinetime::Applications::Screens;
@@ -16,89 +17,17 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) {
screen->OnObjectEvent(obj, event, eventData);
}
static const char * btnm_map1[] = {"Meter", "Gauge", "Clock", "\n", "Soft\nversion", "App2", "Brightness", ""};
static const char * btnm_map1[] = {Symbols::heartBeat, Symbols::shoe, Symbols::clock, "\n", Symbols::info, Symbols::list, Symbols::sun, ""};
Tile::Tile(DisplayApp* app) : Screen(app) {
modal.reset(new Modal(app));
/*
static lv_point_t valid_pos[] = {{0,0}, {LV_COORD_MIN, LV_COORD_MIN}};
tileview = lv_tileview_create(lv_scr_act(), NULL);
lv_tileview_set_valid_positions(tileview, valid_pos, 1);
lv_tileview_set_edge_flash(tileview, false);
tile1 = lv_obj_create(tileview, NULL);
lv_obj_set_pos(tile1, 0, 0);
lv_obj_set_size(tile1, LV_HOR_RES, LV_VER_RES);
lv_tileview_add_element(tileview, tile1);
*/
btnm1 = lv_btnm_create(lv_scr_act(), NULL);
lv_btnm_set_map(btnm1, btnm_map1);
lv_obj_set_size(btnm1, LV_HOR_RES, LV_VER_RES);
// labelRelStyle = const_cast<lv_style_t *>(lv_label_get_style(btnm1, LV_BTNM_STYLE_BTN_REL));
// labelRelStyle->text.font = &jetbrains_mono_bold_20;
// labelRelStyle->body.grad_color = labelRelStyle->body.main_color;
// lv_btnm_set_style(btnm1, LV_BTNM_STYLE_BTN_REL, labelRelStyle);
//
// labelPrStyle = const_cast<lv_style_t *>(lv_label_get_style(btnm1, LV_BTNM_STYLE_BTN_PR));
// labelPrStyle->text.font = &jetbrains_mono_bold_20;
// labelPrStyle->body.grad_color = labelPrStyle->body.shadow.color;
// lv_btnm_set_style(btnm1, LV_BTNM_STYLE_BTN_PR, labelPrStyle);
//TODO better style handling
// lv_obj_align(btnm1, tile1, LV_ALIGN_CENTER, 0, 0);
btnm1->user_data = this;
lv_obj_set_event_cb(btnm1, event_handler);
/*
tile2 = lv_obj_create(tileview, NULL);
lv_obj_set_pos(tile2, 0, LV_VER_RES);
lv_obj_set_size(tile2, LV_HOR_RES, LV_VER_RES);
lv_tileview_add_element(tileview, tile2);
btnm2 = lv_btnm_create(tileview, NULL);
lv_btnm_set_map(btnm2, btnm_map2);
lv_obj_align(btnm2, tile2, LV_ALIGN_CENTER, 0, 0);
*/
/*
tile1 = lv_obj_create(tileview, NULL);
lv_obj_set_pos(tile1, 0, 0);
lv_obj_set_size(tile1, LV_HOR_RES, LV_VER_RES);
lv_tileview_add_element(tileview, tile1);
btn1 = lv_btn_create(tile1, NULL);
lv_obj_align(btn1, tile1, LV_ALIGN_CENTER, 0, 0);
label1 = lv_label_create(btn1, NULL);
lv_label_set_text(label1, "Button1");
*/
/*
tile2 = lv_obj_create(tileview, NULL);
lv_obj_set_pos(tile2, 0, LV_VER_RES);
lv_obj_set_size(tile2, LV_HOR_RES, LV_VER_RES);
lv_tileview_add_element(tileview, tile2);
btn2 = lv_btn_create(tile2, NULL);
lv_obj_align(btn2, tile2, LV_ALIGN_CENTER, 0, 0);
label2 = lv_label_create(btn2, NULL);
lv_label_set_text(label2, "Button2");
tile3 = lv_obj_create(tileview, NULL);
lv_obj_set_pos(tile3, 0, LV_VER_RES*2);
lv_obj_set_size(tile3, LV_HOR_RES, LV_VER_RES);
lv_tileview_add_element(tileview, tile3);
btn3 = lv_btn_create(tile3, NULL);
lv_obj_align(btn3, tile3, LV_ALIGN_CENTER, 0, 0);
label3 = lv_label_create(btn3, NULL);
lv_label_set_text(label3, "Button3");
*/
}
Tile::~Tile() {

View File

@@ -1,13 +1,8 @@
#pragma once
#include <cstdint>
#include <chrono>
#include <Components/Gfx/Gfx.h>
#include "Screen.h"
#include <bits/unique_ptr.h>
#include "../Fonts/lcdfont14.h"
#include "../Fonts/lcdfont70.h"
#include "../../Version.h"
#include "Modal.h"
#include <lvgl/src/lv_core/lv_style.h>