Do not compile GFX and older fonts anymore.
Refactor SystemTask in its own class. Refactor Screen to be able to close current screen and open a new one. Re-enable sleep/wake up and propagate button event to Screens.
This commit is contained in:
parent
2bdff7ed2b
commit
02772b996f
|
@ -156,17 +156,15 @@ list(APPEND SOURCE_FILES
|
||||||
Logging/NrfLogger.cpp
|
Logging/NrfLogger.cpp
|
||||||
BlinkApp/BlinkApp.cpp
|
BlinkApp/BlinkApp.cpp
|
||||||
DisplayApp/DisplayApp.cpp
|
DisplayApp/DisplayApp.cpp
|
||||||
DisplayApp/Fonts/lcdfont70.c
|
|
||||||
DisplayApp/Fonts/lcdfont14.c
|
|
||||||
DisplayApp/Screens/Screen.cpp
|
DisplayApp/Screens/Screen.cpp
|
||||||
DisplayApp/Screens/Clock.cpp
|
DisplayApp/Screens/Clock.cpp
|
||||||
DisplayApp/Screens/Message.cpp
|
# DisplayApp/Screens/Message.cpp
|
||||||
DisplayApp/Screens/Tile.cpp
|
DisplayApp/Screens/Tile.cpp
|
||||||
DisplayApp/Screens/Tab.cpp
|
# DisplayApp/Screens/Tab.cpp
|
||||||
main.cpp
|
main.cpp
|
||||||
drivers/St7789.cpp
|
drivers/St7789.cpp
|
||||||
drivers/SpiMaster.cpp
|
drivers/SpiMaster.cpp
|
||||||
Components/Gfx/Gfx.cpp
|
# Components/Gfx/Gfx.cpp
|
||||||
BLE/BleManager.c
|
BLE/BleManager.c
|
||||||
Components/Battery/BatteryController.cpp
|
Components/Battery/BatteryController.cpp
|
||||||
Components/Ble/BleController.cpp
|
Components/Ble/BleController.cpp
|
||||||
|
@ -180,6 +178,8 @@ list(APPEND SOURCE_FILES
|
||||||
DisplayApp/LittleVgl.cpp
|
DisplayApp/LittleVgl.cpp
|
||||||
DisplayApp/Fonts/jetbrains_mono_extrabold_compressed.c
|
DisplayApp/Fonts/jetbrains_mono_extrabold_compressed.c
|
||||||
DisplayApp/Fonts/jetbrains_mono_bold_20.c
|
DisplayApp/Fonts/jetbrains_mono_bold_20.c
|
||||||
|
|
||||||
|
SystemTask/SystemTask.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
set(INCLUDE_FILES
|
set(INCLUDE_FILES
|
||||||
|
@ -187,16 +187,13 @@ set(INCLUDE_FILES
|
||||||
Logging/NrfLogger.h
|
Logging/NrfLogger.h
|
||||||
BlinkApp/BlinkApp.h
|
BlinkApp/BlinkApp.h
|
||||||
DisplayApp/DisplayApp.h
|
DisplayApp/DisplayApp.h
|
||||||
DisplayApp/Fonts/lcdfont70.h
|
|
||||||
DisplayApp/Fonts/lcdfont14.h
|
|
||||||
DisplayApp/Screens/Screen.h
|
DisplayApp/Screens/Screen.h
|
||||||
DisplayApp/Screens/Clock.h
|
DisplayApp/Screens/Clock.h
|
||||||
DisplayApp/Screens/Message.h
|
# DisplayApp/Screens/Message.h
|
||||||
DisplayApp/Screens/Tile.h
|
DisplayApp/Screens/Tile.h
|
||||||
DisplayApp/Screens/Tab.h
|
# DisplayApp/Screens/Tab.h
|
||||||
drivers/St7789.h
|
drivers/St7789.h
|
||||||
drivers/SpiMaster.h
|
drivers/SpiMaster.h
|
||||||
Components/Gfx/Gfx.h
|
|
||||||
BLE/BleManager.h
|
BLE/BleManager.h
|
||||||
Components/Battery/BatteryController.h
|
Components/Battery/BatteryController.h
|
||||||
Components/Ble/BleController.h
|
Components/Ble/BleController.h
|
||||||
|
@ -214,6 +211,8 @@ set(INCLUDE_FILES
|
||||||
libs/date/includes/date/tz_private.h
|
libs/date/includes/date/tz_private.h
|
||||||
|
|
||||||
DisplayApp/LittleVgl.h
|
DisplayApp/LittleVgl.h
|
||||||
|
|
||||||
|
SystemTask/SystemTask.h
|
||||||
)
|
)
|
||||||
|
|
||||||
include_directories(
|
include_directories(
|
||||||
|
|
|
@ -13,25 +13,26 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <lvgl/lvgl.h>
|
#include <lvgl/lvgl.h>
|
||||||
#include <DisplayApp/Screens/Tile.h>
|
#include <DisplayApp/Screens/Tile.h>
|
||||||
#include <DisplayApp/Screens/Tab.h>
|
#include "../SystemTask/SystemTask.h"
|
||||||
|
//#include <DisplayApp/Screens/Tab.h>
|
||||||
|
|
||||||
using namespace Pinetime::Applications;
|
using namespace Pinetime::Applications;
|
||||||
|
|
||||||
DisplayApp::DisplayApp(Pinetime::Drivers::St7789& lcd,
|
DisplayApp::DisplayApp(Pinetime::Drivers::St7789& lcd,
|
||||||
Pinetime::Components::Gfx& gfx,
|
|
||||||
Pinetime::Components::LittleVgl& lvgl,
|
Pinetime::Components::LittleVgl& lvgl,
|
||||||
Pinetime::Drivers::Cst816S& touchPanel,
|
Pinetime::Drivers::Cst816S& touchPanel,
|
||||||
Controllers::Battery &batteryController,
|
Controllers::Battery &batteryController,
|
||||||
Controllers::Ble &bleController,
|
Controllers::Ble &bleController,
|
||||||
Controllers::DateTime &dateTimeController) :
|
Controllers::DateTime &dateTimeController,
|
||||||
|
Pinetime::System::SystemTask& systemTask) :
|
||||||
lcd{lcd},
|
lcd{lcd},
|
||||||
gfx{gfx},
|
|
||||||
lvgl{lvgl},
|
lvgl{lvgl},
|
||||||
touchPanel{touchPanel},
|
touchPanel{touchPanel},
|
||||||
batteryController{batteryController},
|
batteryController{batteryController},
|
||||||
bleController{bleController},
|
bleController{bleController},
|
||||||
dateTimeController{dateTimeController},
|
dateTimeController{dateTimeController},
|
||||||
currentScreen{new Screens::Clock(this, gfx, dateTimeController) } {
|
currentScreen{new Screens::Clock(this, dateTimeController) },
|
||||||
|
systemTask{systemTask} {
|
||||||
msgQueue = xQueueCreate(queueSize, itemSize);
|
msgQueue = xQueueCreate(queueSize, itemSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,7 +49,7 @@ void DisplayApp::Process(void *instance) {
|
||||||
while (1) {
|
while (1) {
|
||||||
|
|
||||||
app->Refresh();
|
app->Refresh();
|
||||||
lv_task_handler();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,36 +115,28 @@ void DisplayApp::Refresh() {
|
||||||
OnTouchEvent();
|
OnTouchEvent();
|
||||||
break;
|
break;
|
||||||
case Messages::ButtonPushed:
|
case Messages::ButtonPushed:
|
||||||
currentScreen->OnButtonPushed();
|
if(!currentScreen->OnButtonPushed()) {
|
||||||
|
systemTask.PushMessage(System::SystemTask::Messages::GoToSleep);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool first = true;
|
|
||||||
|
|
||||||
void DisplayApp::RunningState() {
|
void DisplayApp::RunningState() {
|
||||||
// clockScreen.SetCurrentDateTime(dateTimeController.CurrentDateTime());
|
// clockScreen.SetCurrentDateTime(dateTimeController.CurrentDateTime());
|
||||||
|
|
||||||
if(currentScreen != nullptr) {
|
if(!currentScreen->Refresh(true)) {
|
||||||
currentScreen->Refresh(first);
|
|
||||||
if(currentScreen->GetNextScreen() != Screens::Screen::NextScreen::None) {
|
|
||||||
switch(currentScreen->GetNextScreen()) {
|
|
||||||
case Screens::Screen::NextScreen::Clock:
|
|
||||||
currentScreen.reset(nullptr);
|
currentScreen.reset(nullptr);
|
||||||
currentScreen.reset(new Screens::Clock(this, gfx, dateTimeController));
|
switch(nextApp) {
|
||||||
break;
|
case Apps::None:
|
||||||
case Screens::Screen::NextScreen::Menu:
|
case Apps::Launcher: currentScreen.reset(new Screens::Tile(this)); break;
|
||||||
currentScreen.reset(nullptr);
|
case Apps::Clock: currentScreen.reset(new Screens::Clock(this, dateTimeController)); break;
|
||||||
currentScreen.reset(new Screens::Tile(this, gfx));
|
// case Apps::Test: currentScreen.reset(new Screens::Message(this)); break;
|
||||||
break;
|
|
||||||
case Screens::Screen::NextScreen::App:
|
|
||||||
currentScreen.reset(nullptr);
|
|
||||||
currentScreen.reset(new Screens::Message(this, gfx));
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
nextApp = Apps::None;
|
||||||
}
|
}
|
||||||
first = false;
|
lv_task_handler();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DisplayApp::IdleState() {
|
void DisplayApp::IdleState() {
|
||||||
|
@ -169,3 +162,7 @@ void DisplayApp::OnTouchEvent() {
|
||||||
// pointColor+=10;
|
// pointColor+=10;
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DisplayApp::StartApp(DisplayApp::Apps app) {
|
||||||
|
nextApp = app;
|
||||||
|
}
|
||||||
|
|
|
@ -14,35 +14,37 @@
|
||||||
#include "LittleVgl.h"
|
#include "LittleVgl.h"
|
||||||
#include <date/date.h>
|
#include <date/date.h>
|
||||||
#include <DisplayApp/Screens/Clock.h>
|
#include <DisplayApp/Screens/Clock.h>
|
||||||
#include <DisplayApp/Screens/Message.h>
|
//#include <DisplayApp/Screens/Message.h>
|
||||||
|
|
||||||
extern const FONT_INFO lCD_70ptFontInfo;
|
|
||||||
|
|
||||||
namespace Pinetime {
|
namespace Pinetime {
|
||||||
|
namespace System {
|
||||||
|
class SystemTask;
|
||||||
|
};
|
||||||
namespace Applications {
|
namespace Applications {
|
||||||
class DisplayApp {
|
class DisplayApp {
|
||||||
public:
|
public:
|
||||||
enum class States {Idle, Running};
|
enum class States {Idle, Running};
|
||||||
enum class Messages : uint8_t {GoToSleep, GoToRunning, UpdateDateTime, UpdateBleConnection, UpdateBatteryLevel, TouchEvent, SwitchScreen,ButtonPushed} ;
|
enum class Messages : uint8_t {GoToSleep, GoToRunning, UpdateDateTime, UpdateBleConnection, UpdateBatteryLevel, TouchEvent, SwitchScreen,ButtonPushed} ;
|
||||||
DisplayApp(Pinetime::Drivers::St7789& lcd,
|
DisplayApp(Pinetime::Drivers::St7789& lcd,
|
||||||
Pinetime::Components::Gfx& gfx,
|
|
||||||
Pinetime::Components::LittleVgl& lvgl,
|
Pinetime::Components::LittleVgl& lvgl,
|
||||||
Pinetime::Drivers::Cst816S&,
|
Pinetime::Drivers::Cst816S&,
|
||||||
Controllers::Battery &batteryController,
|
Controllers::Battery &batteryController,
|
||||||
Controllers::Ble &bleController,
|
Controllers::Ble &bleController,
|
||||||
Controllers::DateTime& dateTimeController);
|
Controllers::DateTime& dateTimeController,
|
||||||
|
Pinetime::System::SystemTask& systemTask);
|
||||||
void Start();
|
void Start();
|
||||||
void PushMessage(Messages msg);
|
void PushMessage(Messages msg);
|
||||||
|
|
||||||
|
enum class Apps {None, Launcher, Clock, Test};
|
||||||
|
void StartApp(Apps app);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
TaskHandle_t taskHandle;
|
TaskHandle_t taskHandle;
|
||||||
static void Process(void* instance);
|
static void Process(void* instance);
|
||||||
void InitHw();
|
void InitHw();
|
||||||
Pinetime::Drivers::St7789& lcd;
|
Pinetime::Drivers::St7789& lcd;
|
||||||
Pinetime::Components::Gfx& gfx;
|
|
||||||
Pinetime::Components::LittleVgl lvgl;
|
Pinetime::Components::LittleVgl lvgl;
|
||||||
const FONT_INFO largeFont {lCD_70ptFontInfo.height, lCD_70ptFontInfo.startChar, lCD_70ptFontInfo.endChar, lCD_70ptFontInfo.spacePixels, lCD_70ptFontInfo.charInfo, lCD_70ptFontInfo.data};
|
|
||||||
const FONT_INFO smallFont {lCD_14ptFontInfo.height, lCD_14ptFontInfo.startChar, lCD_14ptFontInfo.endChar, lCD_14ptFontInfo.spacePixels, lCD_14ptFontInfo.charInfo, lCD_14ptFontInfo.data};
|
|
||||||
void Refresh();
|
void Refresh();
|
||||||
|
|
||||||
States state = States::Running;
|
States state = States::Running;
|
||||||
|
@ -66,6 +68,9 @@ namespace Pinetime {
|
||||||
static constexpr uint8_t pinLcdBacklight3 = 23;
|
static constexpr uint8_t pinLcdBacklight3 = 23;
|
||||||
|
|
||||||
bool isClock = true;
|
bool isClock = true;
|
||||||
|
|
||||||
|
Pinetime::System::SystemTask& systemTask;
|
||||||
|
Apps nextApp = Apps::None;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) {
|
||||||
screen->OnObjectEvent(obj, event);
|
screen->OnObjectEvent(obj, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
Clock::Clock(DisplayApp* app, Pinetime::Components::Gfx &gfx, Controllers::DateTime& dateTimeController) : Screen(app, gfx), currentDateTime{{}}, version {{}}, dateTimeController{dateTimeController} {
|
Clock::Clock(DisplayApp* app, Controllers::DateTime& dateTimeController) : Screen(app), currentDateTime{{}}, version {{}}, dateTimeController{dateTimeController} {
|
||||||
displayedChar[0] = 0;
|
displayedChar[0] = 0;
|
||||||
displayedChar[1] = 0;
|
displayedChar[1] = 0;
|
||||||
displayedChar[2] = 0;
|
displayedChar[2] = 0;
|
||||||
|
@ -65,7 +65,7 @@ Clock::~Clock() {
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_obj_clean(lv_scr_act());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Clock::Refresh(bool fullRefresh) {
|
bool Clock::Refresh(bool fullRefresh) {
|
||||||
if(fullRefresh) {
|
if(fullRefresh) {
|
||||||
auto currentDateTime = dateTimeController.CurrentDateTime();
|
auto currentDateTime = dateTimeController.CurrentDateTime();
|
||||||
}
|
}
|
||||||
|
@ -145,6 +145,7 @@ void Clock::Refresh(bool fullRefresh) {
|
||||||
lv_label_set_text(label_version, versionStr);
|
lv_label_set_text(label_version, versionStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return running;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *Clock::MonthToString(Pinetime::Controllers::DateTime::Months month) {
|
const char *Clock::MonthToString(Pinetime::Controllers::DateTime::Months month) {
|
||||||
|
@ -185,9 +186,14 @@ char const *Clock::MonthsString[] = {
|
||||||
void Clock::OnObjectEvent(lv_obj_t *obj, lv_event_t event) {
|
void Clock::OnObjectEvent(lv_obj_t *obj, lv_event_t event) {
|
||||||
if(obj == backgroundLabel) {
|
if(obj == backgroundLabel) {
|
||||||
if (event == LV_EVENT_CLICKED) {
|
if (event == LV_EVENT_CLICKED) {
|
||||||
nextScreen = NextScreen::Menu;
|
|
||||||
|
running = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Clock::OnButtonPushed() {
|
||||||
|
return Screen::OnButtonPushed();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -35,9 +35,11 @@ namespace Pinetime {
|
||||||
class Clock : public Screen{
|
class Clock : public Screen{
|
||||||
public:
|
public:
|
||||||
enum class BleConnectionStates{ NotConnected, Connected};
|
enum class BleConnectionStates{ NotConnected, Connected};
|
||||||
Clock(DisplayApp* app, Components::Gfx& gfx, Controllers::DateTime& dateTimeController);
|
Clock(DisplayApp* app, Controllers::DateTime& dateTimeController);
|
||||||
~Clock() override;
|
~Clock() override;
|
||||||
void Refresh(bool fullRefresh) override;
|
|
||||||
|
bool Refresh(bool fullRefresh) override;
|
||||||
|
bool OnButtonPushed() override;
|
||||||
|
|
||||||
void SetBatteryPercentRemaining(uint8_t percent) { batteryPercentRemaining = percent; }
|
void SetBatteryPercentRemaining(uint8_t percent) { batteryPercentRemaining = percent; }
|
||||||
void SetBleConnectionState(BleConnectionStates state) { bleState = state; }
|
void SetBleConnectionState(BleConnectionStates state) { bleState = state; }
|
||||||
|
@ -52,9 +54,6 @@ namespace Pinetime {
|
||||||
|
|
||||||
char displayedChar[5];
|
char displayedChar[5];
|
||||||
|
|
||||||
const FONT_INFO largeFont {lCD_70ptFontInfo.height, lCD_70ptFontInfo.startChar, lCD_70ptFontInfo.endChar, lCD_70ptFontInfo.spacePixels, lCD_70ptFontInfo.charInfo, lCD_70ptFontInfo.data};
|
|
||||||
const FONT_INFO smallFont {lCD_14ptFontInfo.height, lCD_14ptFontInfo.startChar, lCD_14ptFontInfo.endChar, lCD_14ptFontInfo.spacePixels, lCD_14ptFontInfo.charInfo, lCD_14ptFontInfo.data};
|
|
||||||
|
|
||||||
uint16_t currentYear = 1970;
|
uint16_t currentYear = 1970;
|
||||||
Pinetime::Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown;
|
Pinetime::Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown;
|
||||||
Pinetime::Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown;
|
Pinetime::Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown;
|
||||||
|
@ -77,6 +76,8 @@ namespace Pinetime {
|
||||||
|
|
||||||
Controllers::DateTime& dateTimeController;
|
Controllers::DateTime& dateTimeController;
|
||||||
|
|
||||||
|
bool running = true;
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,16 +9,18 @@ namespace Pinetime {
|
||||||
class Screen {
|
class Screen {
|
||||||
public:
|
public:
|
||||||
enum class NextScreen {None, Clock, Menu, App};
|
enum class NextScreen {None, Clock, Menu, App};
|
||||||
Screen(DisplayApp* app, Components::Gfx& gfx) : app{app}, gfx{gfx} {}
|
|
||||||
|
Screen(DisplayApp* app) : app{app} {}
|
||||||
virtual ~Screen() = default;
|
virtual ~Screen() = default;
|
||||||
virtual void Refresh(bool fullRefresh) = 0;
|
|
||||||
NextScreen GetNextScreen() {return nextScreen;}
|
// Return false if the app can be closed, true if it must continue to run
|
||||||
virtual void OnButtonPushed() {};
|
virtual bool Refresh(bool fullRefresh) = 0;
|
||||||
|
|
||||||
|
// Return false if the button hasn't been handled by the app, true if it has been handled
|
||||||
|
virtual bool OnButtonPushed() { return false; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
DisplayApp* app;
|
DisplayApp* app;
|
||||||
Components::Gfx& gfx;
|
|
||||||
NextScreen nextScreen = NextScreen::None;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,8 +22,7 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) {
|
||||||
|
|
||||||
static const char * btnm_map1[] = {"App1", "App2", "App3", "\n", "App4", "App5", "App11", ""};
|
static const char * btnm_map1[] = {"App1", "App2", "App3", "\n", "App4", "App5", "App11", ""};
|
||||||
|
|
||||||
Tile::Tile(DisplayApp* app, Pinetime::Components::Gfx &gfx) : Screen(app, gfx) {
|
Tile::Tile(DisplayApp* app) : Screen(app) {
|
||||||
|
|
||||||
static lv_point_t valid_pos[] = {{0,0}, {LV_COORD_MIN, LV_COORD_MIN}};
|
static lv_point_t valid_pos[] = {{0,0}, {LV_COORD_MIN, LV_COORD_MIN}};
|
||||||
tileview = lv_tileview_create(lv_scr_act(), NULL);
|
tileview = lv_tileview_create(lv_scr_act(), NULL);
|
||||||
lv_tileview_set_valid_positions(tileview, valid_pos, 1);
|
lv_tileview_set_valid_positions(tileview, valid_pos, 1);
|
||||||
|
@ -38,11 +37,16 @@ Tile::Tile(DisplayApp* app, Pinetime::Components::Gfx &gfx) : Screen(app, gfx) {
|
||||||
lv_btnm_set_map(btnm1, btnm_map1);
|
lv_btnm_set_map(btnm1, btnm_map1);
|
||||||
lv_obj_set_size(btnm1, LV_HOR_RES, LV_VER_RES);
|
lv_obj_set_size(btnm1, LV_HOR_RES, LV_VER_RES);
|
||||||
|
|
||||||
labelStyle = const_cast<lv_style_t *>(lv_label_get_style(btnm1, LV_BTNM_STYLE_BTN_REL));
|
labelRelStyle = const_cast<lv_style_t *>(lv_label_get_style(btnm1, LV_BTNM_STYLE_BTN_REL));
|
||||||
labelStyle->text.font = &jetbrains_mono_bold_20;
|
labelRelStyle->text.font = &jetbrains_mono_bold_20;
|
||||||
labelStyle->body.grad_color = labelStyle->body.main_color;
|
labelRelStyle->body.grad_color = labelRelStyle->body.main_color;
|
||||||
lv_btnm_set_style(btnm1, LV_BTNM_STYLE_BTN_REL, labelStyle);
|
lv_btnm_set_style(btnm1, LV_BTNM_STYLE_BTN_REL, labelRelStyle);
|
||||||
lv_btnm_set_style(btnm1, LV_BTNM_STYLE_BTN_PR, labelStyle);
|
|
||||||
|
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);
|
lv_obj_align(btnm1, tile1, LV_ALIGN_CENTER, 0, 0);
|
||||||
btnm1->user_data = this;
|
btnm1->user_data = this;
|
||||||
|
@ -100,17 +104,28 @@ Tile::~Tile() {
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_obj_clean(lv_scr_act());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Tile::Refresh(bool fullRefresh) {
|
bool Tile::Refresh(bool fullRefresh) {
|
||||||
|
return running;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Tile::OnObjectEvent(lv_obj_t *obj, lv_event_t event) {
|
void Tile::OnObjectEvent(lv_obj_t *obj, lv_event_t event) {
|
||||||
|
auto* tile = static_cast<Tile*>(obj->user_data);
|
||||||
if(event == LV_EVENT_CLICKED) {
|
if(event == LV_EVENT_CLICKED) {
|
||||||
NRF_LOG_INFO("Clicked");
|
|
||||||
nextScreen = Screen::NextScreen::App;
|
tile->StartApp();
|
||||||
clickCount++;
|
clickCount++;
|
||||||
}
|
}
|
||||||
else if(event == LV_EVENT_VALUE_CHANGED) {
|
else if(event == LV_EVENT_VALUE_CHANGED) {
|
||||||
NRF_LOG_INFO("Toggled");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Tile::OnButtonPushed() {
|
||||||
|
app->StartApp(DisplayApp::Apps::Clock);
|
||||||
|
running = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Tile::StartApp() {
|
||||||
|
app->StartApp(DisplayApp::Apps::Clock);
|
||||||
|
running = false;
|
||||||
|
}
|
||||||
|
|
|
@ -15,18 +15,18 @@ namespace Pinetime {
|
||||||
namespace Screens {
|
namespace Screens {
|
||||||
class Tile : public Screen {
|
class Tile : public Screen {
|
||||||
public:
|
public:
|
||||||
explicit Tile(DisplayApp* app, Components::Gfx& gfx);
|
explicit Tile(DisplayApp* app);
|
||||||
~Tile() override;
|
~Tile() override;
|
||||||
void Refresh(bool fullRefresh) override;
|
|
||||||
|
bool Refresh(bool fullRefresh) override;
|
||||||
|
bool OnButtonPushed() override;
|
||||||
|
|
||||||
void OnObjectEvent(lv_obj_t* obj, lv_event_t event);
|
void OnObjectEvent(lv_obj_t* obj, lv_event_t event);
|
||||||
|
|
||||||
void OnButtonPushed() override {nextScreen = NextScreen::Clock;}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const FONT_INFO largeFont {lCD_70ptFontInfo.height, lCD_70ptFontInfo.startChar, lCD_70ptFontInfo.endChar, lCD_70ptFontInfo.spacePixels, lCD_70ptFontInfo.charInfo, lCD_70ptFontInfo.data};
|
|
||||||
const FONT_INFO smallFont {lCD_14ptFontInfo.height, lCD_14ptFontInfo.startChar, lCD_14ptFontInfo.endChar, lCD_14ptFontInfo.spacePixels, lCD_14ptFontInfo.charInfo, lCD_14ptFontInfo.data};
|
|
||||||
|
|
||||||
lv_style_t* labelStyle;
|
lv_style_t* labelRelStyle;
|
||||||
|
lv_style_t* labelPrStyle;
|
||||||
lv_obj_t * label1;
|
lv_obj_t * label1;
|
||||||
lv_obj_t * label2;
|
lv_obj_t * label2;
|
||||||
lv_obj_t * label3;
|
lv_obj_t * label3;
|
||||||
|
@ -50,6 +50,8 @@ namespace Pinetime {
|
||||||
|
|
||||||
uint32_t clickCount = 0 ;
|
uint32_t clickCount = 0 ;
|
||||||
uint32_t previousClickCount = 0;
|
uint32_t previousClickCount = 0;
|
||||||
|
void StartApp();
|
||||||
|
bool running = true;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
115
src/SystemTask/SystemTask.cpp
Normal file
115
src/SystemTask/SystemTask.cpp
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
#include <libraries/log/nrf_log.h>
|
||||||
|
#include <libraries/gpiote/app_gpiote.h>
|
||||||
|
#include <drivers/Cst816s.h>
|
||||||
|
#include <DisplayApp/LittleVgl.h>
|
||||||
|
#include <hal/nrf_rtc.h>
|
||||||
|
#include "SystemTask.h"
|
||||||
|
#include "../main.h"
|
||||||
|
using namespace Pinetime::System;
|
||||||
|
|
||||||
|
SystemTask::SystemTask(Pinetime::Drivers::SpiMaster &spi, Pinetime::Drivers::St7789 &lcd,
|
||||||
|
Pinetime::Drivers::Cst816S &touchPanel, Pinetime::Components::LittleVgl &lvgl,
|
||||||
|
Pinetime::Controllers::Battery &batteryController, Pinetime::Controllers::Ble &bleController,
|
||||||
|
Pinetime::Controllers::DateTime& dateTimeController) :
|
||||||
|
spi{spi}, lcd{lcd}, touchPanel{touchPanel}, lvgl{lvgl}, batteryController{batteryController}, bleController{bleController}, dateTimeController{dateTimeController} {
|
||||||
|
systemTaksMsgQueue = xQueueCreate(10, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SystemTask::Start() {
|
||||||
|
if (pdPASS != xTaskCreate(SystemTask::Process, "MAIN", 256, this, 0, &taskHandle))
|
||||||
|
APP_ERROR_HANDLER(NRF_ERROR_NO_MEM);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SystemTask::Process(void *instance) {
|
||||||
|
auto *app = static_cast<SystemTask *>(instance);
|
||||||
|
NRF_LOG_INFO("SystemTask task started!");
|
||||||
|
app->Work();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SystemTask::Work() {
|
||||||
|
APP_GPIOTE_INIT(2);
|
||||||
|
bool erase_bonds=false;
|
||||||
|
// nrf_sdh_freertos_init(ble_manager_start_advertising, &erase_bonds);
|
||||||
|
|
||||||
|
spi.Init();
|
||||||
|
lcd.Init();
|
||||||
|
touchPanel.Init();
|
||||||
|
batteryController.Init();
|
||||||
|
|
||||||
|
displayApp.reset(new Pinetime::Applications::DisplayApp(lcd, lvgl, touchPanel, batteryController, bleController, dateTimeController, *this));
|
||||||
|
displayApp->Start();
|
||||||
|
|
||||||
|
batteryController.Update();
|
||||||
|
displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::UpdateBatteryLevel);
|
||||||
|
|
||||||
|
nrf_gpio_cfg_sense_input(pinButton, (nrf_gpio_pin_pull_t)GPIO_PIN_CNF_PULL_Pulldown, (nrf_gpio_pin_sense_t)GPIO_PIN_CNF_SENSE_High);
|
||||||
|
nrf_gpio_cfg_output(15);
|
||||||
|
nrf_gpio_pin_set(15);
|
||||||
|
|
||||||
|
nrfx_gpiote_in_config_t pinConfig;
|
||||||
|
pinConfig.skip_gpio_setup = true;
|
||||||
|
pinConfig.hi_accuracy = false;
|
||||||
|
pinConfig.is_watcher = false;
|
||||||
|
pinConfig.sense = (nrf_gpiote_polarity_t)NRF_GPIOTE_POLARITY_HITOLO;
|
||||||
|
pinConfig.pull = (nrf_gpio_pin_pull_t)GPIO_PIN_CNF_PULL_Pulldown;
|
||||||
|
|
||||||
|
nrfx_gpiote_in_init(pinButton, &pinConfig, nrfx_gpiote_evt_handler);
|
||||||
|
|
||||||
|
nrf_gpio_cfg_sense_input(pinTouchIrq, (nrf_gpio_pin_pull_t)GPIO_PIN_CNF_PULL_Pullup, (nrf_gpio_pin_sense_t)GPIO_PIN_CNF_SENSE_Low);
|
||||||
|
|
||||||
|
pinConfig.skip_gpio_setup = true;
|
||||||
|
pinConfig.hi_accuracy = false;
|
||||||
|
pinConfig.is_watcher = false;
|
||||||
|
pinConfig.sense = (nrf_gpiote_polarity_t)NRF_GPIOTE_POLARITY_HITOLO;
|
||||||
|
pinConfig.pull = (nrf_gpio_pin_pull_t)GPIO_PIN_CNF_PULL_Pullup;
|
||||||
|
|
||||||
|
nrfx_gpiote_in_init(pinTouchIrq, &pinConfig, nrfx_gpiote_evt_handler);
|
||||||
|
|
||||||
|
|
||||||
|
while(true) {
|
||||||
|
uint8_t msg;
|
||||||
|
if (xQueueReceive(systemTaksMsgQueue, &msg, isSleeping?3600000 : 1000)) {
|
||||||
|
Messages message = static_cast<Messages >(msg);
|
||||||
|
switch(message) {
|
||||||
|
case Messages::GoToRunning: isSleeping = false; break;
|
||||||
|
case Messages::GoToSleep:
|
||||||
|
NRF_LOG_INFO("[SystemTask] Going to sleep");
|
||||||
|
displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::GoToSleep);
|
||||||
|
isSleeping = true; break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
uint32_t systick_counter = nrf_rtc_counter_get(portNRF_RTC_REG);
|
||||||
|
dateTimeController.UpdateTime(systick_counter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SystemTask::OnButtonPushed() {
|
||||||
|
|
||||||
|
if(!isSleeping) {
|
||||||
|
NRF_LOG_INFO("[SystemTask] Button pushed");
|
||||||
|
displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::ButtonPushed);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
NRF_LOG_INFO("[SystemTask] Button pushed, waking up");
|
||||||
|
displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::GoToRunning);
|
||||||
|
isSleeping = false;
|
||||||
|
batteryController.Update();
|
||||||
|
displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::UpdateBatteryLevel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SystemTask::OnTouchEvent() {
|
||||||
|
NRF_LOG_INFO("[SystemTask] Touch event");
|
||||||
|
displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::TouchEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SystemTask::PushMessage(SystemTask::Messages msg) {
|
||||||
|
BaseType_t xHigherPriorityTaskWoken;
|
||||||
|
xHigherPriorityTaskWoken = pdFALSE;
|
||||||
|
xQueueSendFromISR(systemTaksMsgQueue, &msg, &xHigherPriorityTaskWoken);
|
||||||
|
if (xHigherPriorityTaskWoken) {
|
||||||
|
/* Actual macro used here is port specific. */
|
||||||
|
// TODO : should I do something here?
|
||||||
|
}
|
||||||
|
}
|
60
src/SystemTask/SystemTask.h
Normal file
60
src/SystemTask/SystemTask.h
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <FreeRTOS.h>
|
||||||
|
#include <task.h>
|
||||||
|
#include <memory>
|
||||||
|
#include <drivers/SpiMaster.h>
|
||||||
|
#include <drivers/St7789.h>
|
||||||
|
#include <Components/Battery/BatteryController.h>
|
||||||
|
#include <DisplayApp/DisplayApp.h>
|
||||||
|
|
||||||
|
namespace Pinetime {
|
||||||
|
namespace System {
|
||||||
|
class SystemTask {
|
||||||
|
public:
|
||||||
|
enum class Messages {GoToSleep, GoToRunning};
|
||||||
|
|
||||||
|
SystemTask(Pinetime::Drivers::SpiMaster& spi,
|
||||||
|
Pinetime::Drivers::St7789& lcd,
|
||||||
|
Pinetime::Drivers::Cst816S& touchPanel,
|
||||||
|
Pinetime::Components::LittleVgl& lvgl,
|
||||||
|
Pinetime::Controllers::Battery& batteryController,
|
||||||
|
Pinetime::Controllers::Ble& bleController,
|
||||||
|
Pinetime::Controllers::DateTime& dateTimeController);
|
||||||
|
|
||||||
|
|
||||||
|
void Start();
|
||||||
|
void PushMessage(Messages msg);
|
||||||
|
|
||||||
|
void OnButtonPushed();
|
||||||
|
void OnTouchEvent();
|
||||||
|
private:
|
||||||
|
TaskHandle_t taskHandle;
|
||||||
|
|
||||||
|
Pinetime::Drivers::SpiMaster& spi;
|
||||||
|
Pinetime::Drivers::St7789& lcd;
|
||||||
|
Pinetime::Drivers::Cst816S& touchPanel;
|
||||||
|
Pinetime::Components::LittleVgl& lvgl;
|
||||||
|
Pinetime::Controllers::Battery& batteryController;
|
||||||
|
std::unique_ptr<Pinetime::Applications::DisplayApp> displayApp;
|
||||||
|
Pinetime::Controllers::Ble& bleController;
|
||||||
|
Pinetime::Controllers::DateTime& dateTimeController;
|
||||||
|
QueueHandle_t systemTaksMsgQueue;
|
||||||
|
bool isSleeping = false;
|
||||||
|
|
||||||
|
|
||||||
|
static constexpr uint8_t pinSpiSck = 2;
|
||||||
|
static constexpr uint8_t pinSpiMosi = 3;
|
||||||
|
static constexpr uint8_t pinSpiMiso = 4;
|
||||||
|
static constexpr uint8_t pinSpiCsn = 25;
|
||||||
|
static constexpr uint8_t pinLcdDataCommand = 18;
|
||||||
|
static constexpr uint8_t pinButton = 13;
|
||||||
|
static constexpr uint8_t pinTouchIrq = 28;
|
||||||
|
|
||||||
|
static void Process(void* instance);
|
||||||
|
void Work();
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
|
@ -123,7 +123,7 @@ typedef int16_t lv_coord_t;
|
||||||
*==================*/
|
*==================*/
|
||||||
|
|
||||||
/*1: Enable the Animations */
|
/*1: Enable the Animations */
|
||||||
#define LV_USE_ANIMATION 0
|
#define LV_USE_ANIMATION 1
|
||||||
#if LV_USE_ANIMATION
|
#if LV_USE_ANIMATION
|
||||||
|
|
||||||
/*Declare the type of the user data of animations (can be e.g. `void *`, `int`, `struct`)*/
|
/*Declare the type of the user data of animations (can be e.g. `void *`, `int`, `struct`)*/
|
||||||
|
@ -563,7 +563,7 @@ typedef void * lv_obj_user_data_t;
|
||||||
#define LV_USE_TILEVIEW 1
|
#define LV_USE_TILEVIEW 1
|
||||||
#if LV_USE_TILEVIEW
|
#if LV_USE_TILEVIEW
|
||||||
/*Time of slide animation [ms] (0: no animation)*/
|
/*Time of slide animation [ms] (0: no animation)*/
|
||||||
# define LV_TILEVIEW_DEF_ANIM_TIME 0
|
# define LV_TILEVIEW_DEF_ANIM_TIME 300
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*Window (dependencies: lv_cont, lv_btn, lv_label, lv_img, lv_page)*/
|
/*Window (dependencies: lv_cont, lv_btn, lv_label, lv_img, lv_page)*/
|
||||||
|
|
146
src/main.cpp
146
src/main.cpp
|
@ -18,10 +18,10 @@
|
||||||
#include "../drivers/Cst816s.h"
|
#include "../drivers/Cst816s.h"
|
||||||
#include <drivers/St7789.h>
|
#include <drivers/St7789.h>
|
||||||
#include <drivers/SpiMaster.h>
|
#include <drivers/SpiMaster.h>
|
||||||
#include <Components/Gfx/Gfx.h>
|
|
||||||
|
|
||||||
#include <lvgl/lvgl.h>
|
#include <lvgl/lvgl.h>
|
||||||
#include <DisplayApp/LittleVgl.h>
|
#include <DisplayApp/LittleVgl.h>
|
||||||
|
#include <SystemTask/SystemTask.h>
|
||||||
|
|
||||||
#if NRF_LOG_ENABLED
|
#if NRF_LOG_ENABLED
|
||||||
#include "Logging/NrfLogger.h"
|
#include "Logging/NrfLogger.h"
|
||||||
|
@ -33,8 +33,6 @@ Pinetime::Logging::DummyLogger logger;
|
||||||
|
|
||||||
std::unique_ptr<Pinetime::Drivers::SpiMaster> spi;
|
std::unique_ptr<Pinetime::Drivers::SpiMaster> spi;
|
||||||
std::unique_ptr<Pinetime::Drivers::St7789> lcd;
|
std::unique_ptr<Pinetime::Drivers::St7789> lcd;
|
||||||
Pinetime::Drivers::St7789* ptrLcd;
|
|
||||||
std::unique_ptr<Pinetime::Components::Gfx> gfx;
|
|
||||||
std::unique_ptr<Pinetime::Components::LittleVgl> lvgl;
|
std::unique_ptr<Pinetime::Components::LittleVgl> lvgl;
|
||||||
std::unique_ptr<Pinetime::Drivers::Cst816S> touchPanel;
|
std::unique_ptr<Pinetime::Drivers::Cst816S> touchPanel;
|
||||||
|
|
||||||
|
@ -45,27 +43,19 @@ static constexpr uint8_t pinSpiCsn = 25;
|
||||||
static constexpr uint8_t pinLcdDataCommand = 18;
|
static constexpr uint8_t pinLcdDataCommand = 18;
|
||||||
|
|
||||||
|
|
||||||
std::unique_ptr<Pinetime::Applications::DisplayApp> displayApp;
|
|
||||||
TaskHandle_t systemThread;
|
|
||||||
bool isSleeping = false;
|
|
||||||
TimerHandle_t debounceTimer;
|
TimerHandle_t debounceTimer;
|
||||||
Pinetime::Controllers::Battery batteryController;
|
Pinetime::Controllers::Battery batteryController;
|
||||||
Pinetime::Controllers::Ble bleController;
|
Pinetime::Controllers::Ble bleController;
|
||||||
Pinetime::Controllers::DateTime dateTimeController;
|
Pinetime::Controllers::DateTime dateTimeController;
|
||||||
|
|
||||||
|
|
||||||
void ble_manager_set_ble_connection_callback(void (*connection)());
|
void ble_manager_set_ble_connection_callback(void (*connection)());
|
||||||
void ble_manager_set_ble_disconnection_callback(void (*disconnection)());
|
void ble_manager_set_ble_disconnection_callback(void (*disconnection)());
|
||||||
static constexpr uint8_t pinButton = 13;
|
|
||||||
static constexpr uint8_t pinTouchIrq = 28;
|
static constexpr uint8_t pinTouchIrq = 28;
|
||||||
QueueHandle_t systemTaksMsgQueue;
|
std::unique_ptr<Pinetime::System::SystemTask> systemTask;
|
||||||
enum class SystemTaskMessages {GoToSleep, GoToRunning};
|
|
||||||
void SystemTask_PushMessage(SystemTaskMessages message);
|
|
||||||
|
|
||||||
void nrfx_gpiote_evt_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action) {
|
void nrfx_gpiote_evt_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action) {
|
||||||
if(pin == pinTouchIrq) {
|
if(pin == pinTouchIrq) {
|
||||||
displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::TouchEvent);
|
systemTask->OnTouchEvent();
|
||||||
if(!isSleeping) return;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
|
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
|
||||||
|
@ -73,7 +63,6 @@ void nrfx_gpiote_evt_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action
|
||||||
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
|
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
void vApplicationIdleHook(void) {
|
void vApplicationIdleHook(void) {
|
||||||
lv_tick_inc(1);
|
lv_tick_inc(1);
|
||||||
|
@ -82,118 +71,17 @@ extern "C" {
|
||||||
|
|
||||||
void DebounceTimerCallback(TimerHandle_t xTimer) {
|
void DebounceTimerCallback(TimerHandle_t xTimer) {
|
||||||
xTimerStop(xTimer, 0);
|
xTimerStop(xTimer, 0);
|
||||||
/*if(isSleeping) {
|
systemTask->OnButtonPushed();
|
||||||
SystemTask_PushMessage(SystemTaskMessages::GoToRunning);
|
|
||||||
displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::GoToRunning);
|
|
||||||
isSleeping = false;
|
|
||||||
batteryController.Update();
|
|
||||||
displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::UpdateBatteryLevel);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
SystemTask_PushMessage(SystemTaskMessages::GoToSleep);
|
|
||||||
displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::GoToSleep);
|
|
||||||
isSleeping = true;
|
|
||||||
}*/
|
|
||||||
displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::ButtonPushed);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SystemTask_PushMessage(SystemTaskMessages message) {
|
|
||||||
BaseType_t xHigherPriorityTaskWoken;
|
|
||||||
xHigherPriorityTaskWoken = pdFALSE;
|
|
||||||
xQueueSendFromISR(systemTaksMsgQueue, &message, &xHigherPriorityTaskWoken);
|
|
||||||
if (xHigherPriorityTaskWoken) {
|
|
||||||
/* Actual macro used here is port specific. */
|
|
||||||
// TODO : should I do something here?
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO The whole SystemTask should go in its own class
|
|
||||||
// BUT... it has to work with pure C callback (nrfx_gpiote_evt_handler) and i've still not found
|
|
||||||
// a good design for that (the callback does not allow to pass a pointer to an instance...)
|
|
||||||
void SystemTask(void *) {
|
|
||||||
APP_GPIOTE_INIT(2);
|
|
||||||
bool erase_bonds=false;
|
|
||||||
// nrf_sdh_freertos_init(ble_manager_start_advertising, &erase_bonds);
|
|
||||||
|
|
||||||
spi.reset(new Pinetime::Drivers::SpiMaster {Pinetime::Drivers::SpiMaster::SpiModule::SPI0, {
|
|
||||||
Pinetime::Drivers::SpiMaster::BitOrder::Msb_Lsb,
|
|
||||||
Pinetime::Drivers::SpiMaster::Modes::Mode3,
|
|
||||||
Pinetime::Drivers::SpiMaster::Frequencies::Freq8Mhz,
|
|
||||||
pinSpiSck,
|
|
||||||
pinSpiMosi,
|
|
||||||
pinSpiMiso,
|
|
||||||
pinSpiCsn
|
|
||||||
}});
|
|
||||||
|
|
||||||
lcd.reset(new Pinetime::Drivers::St7789(*spi, pinLcdDataCommand));
|
|
||||||
gfx.reset(new Pinetime::Components::Gfx(*lcd));
|
|
||||||
touchPanel.reset(new Pinetime::Drivers::Cst816S());
|
|
||||||
|
|
||||||
lvgl.reset(new Pinetime::Components::LittleVgl(*lcd, *touchPanel));
|
|
||||||
ptrLcd = lcd.get();
|
|
||||||
|
|
||||||
spi->Init();
|
|
||||||
lcd->Init();
|
|
||||||
touchPanel->Init();
|
|
||||||
batteryController.Init();
|
|
||||||
|
|
||||||
displayApp.reset(new Pinetime::Applications::DisplayApp(*lcd, *gfx, *lvgl, *touchPanel, batteryController, bleController, dateTimeController));
|
|
||||||
displayApp->Start();
|
|
||||||
|
|
||||||
batteryController.Update();
|
|
||||||
displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::UpdateBatteryLevel);
|
|
||||||
|
|
||||||
debounceTimer = xTimerCreate ("debounceTimer", 200, pdFALSE, (void *) 0, DebounceTimerCallback);
|
|
||||||
|
|
||||||
nrf_gpio_cfg_sense_input(pinButton, (nrf_gpio_pin_pull_t)GPIO_PIN_CNF_PULL_Pulldown, (nrf_gpio_pin_sense_t)GPIO_PIN_CNF_SENSE_High);
|
|
||||||
nrf_gpio_cfg_output(15);
|
|
||||||
nrf_gpio_pin_set(15);
|
|
||||||
|
|
||||||
nrfx_gpiote_in_config_t pinConfig;
|
|
||||||
pinConfig.skip_gpio_setup = true;
|
|
||||||
pinConfig.hi_accuracy = false;
|
|
||||||
pinConfig.is_watcher = false;
|
|
||||||
pinConfig.sense = (nrf_gpiote_polarity_t)NRF_GPIOTE_POLARITY_HITOLO;
|
|
||||||
pinConfig.pull = (nrf_gpio_pin_pull_t)GPIO_PIN_CNF_PULL_Pulldown;
|
|
||||||
|
|
||||||
nrfx_gpiote_in_init(pinButton, &pinConfig, nrfx_gpiote_evt_handler);
|
|
||||||
|
|
||||||
nrf_gpio_cfg_sense_input(pinTouchIrq, (nrf_gpio_pin_pull_t)GPIO_PIN_CNF_PULL_Pullup, (nrf_gpio_pin_sense_t)GPIO_PIN_CNF_SENSE_Low);
|
|
||||||
|
|
||||||
pinConfig.skip_gpio_setup = true;
|
|
||||||
pinConfig.hi_accuracy = false;
|
|
||||||
pinConfig.is_watcher = false;
|
|
||||||
pinConfig.sense = (nrf_gpiote_polarity_t)NRF_GPIOTE_POLARITY_HITOLO;
|
|
||||||
pinConfig.pull = (nrf_gpio_pin_pull_t)GPIO_PIN_CNF_PULL_Pullup;
|
|
||||||
|
|
||||||
nrfx_gpiote_in_init(pinTouchIrq, &pinConfig, nrfx_gpiote_evt_handler);
|
|
||||||
|
|
||||||
systemTaksMsgQueue = xQueueCreate(10, 1);
|
|
||||||
bool systemTaskSleeping = false;
|
|
||||||
|
|
||||||
while(true) {
|
|
||||||
uint8_t msg;
|
|
||||||
if (xQueueReceive(systemTaksMsgQueue, &msg, systemTaskSleeping?3600000 : 1000)) {
|
|
||||||
SystemTaskMessages message = static_cast<SystemTaskMessages >(msg);
|
|
||||||
switch(message) {
|
|
||||||
case SystemTaskMessages::GoToRunning: systemTaskSleeping = false; break;
|
|
||||||
case SystemTaskMessages::GoToSleep: systemTaskSleeping = true; break;
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
uint32_t systick_counter = nrf_rtc_counter_get(portNRF_RTC_REG);
|
|
||||||
dateTimeController.UpdateTime(systick_counter);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnBleConnection() {
|
void OnBleConnection() {
|
||||||
bleController.Connect();
|
bleController.Connect();
|
||||||
displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::UpdateBleConnection);
|
// TODO Notify system/Display app
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnBleDisconnection() {
|
void OnBleDisconnection() {
|
||||||
bleController.Disconnect();
|
bleController.Disconnect();
|
||||||
displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::UpdateBleConnection);
|
// TODO Notify system/Display app
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnNewTime(current_time_char_t* currentTime) {
|
void OnNewTime(current_time_char_t* currentTime) {
|
||||||
|
@ -224,12 +112,28 @@ void SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler(void) {
|
||||||
NRF_SPIM0->EVENTS_STOPPED = 0;
|
NRF_SPIM0->EVENTS_STOPPED = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
logger.Init();
|
logger.Init();
|
||||||
nrf_drv_clock_init();
|
nrf_drv_clock_init();
|
||||||
|
|
||||||
if (pdPASS != xTaskCreate(SystemTask, "MAIN", 256, nullptr, 0, &systemThread))
|
spi.reset(new Pinetime::Drivers::SpiMaster {Pinetime::Drivers::SpiMaster::SpiModule::SPI0, {
|
||||||
APP_ERROR_HANDLER(NRF_ERROR_NO_MEM);
|
Pinetime::Drivers::SpiMaster::BitOrder::Msb_Lsb,
|
||||||
|
Pinetime::Drivers::SpiMaster::Modes::Mode3,
|
||||||
|
Pinetime::Drivers::SpiMaster::Frequencies::Freq8Mhz,
|
||||||
|
pinSpiSck,
|
||||||
|
pinSpiMosi,
|
||||||
|
pinSpiMiso,
|
||||||
|
pinSpiCsn
|
||||||
|
}});
|
||||||
|
lcd.reset(new Pinetime::Drivers::St7789(*spi, pinLcdDataCommand));
|
||||||
|
touchPanel.reset(new Pinetime::Drivers::Cst816S());
|
||||||
|
lvgl.reset(new Pinetime::Components::LittleVgl(*lcd, *touchPanel));
|
||||||
|
debounceTimer = xTimerCreate ("debounceTimer", 200, pdFALSE, (void *) 0, DebounceTimerCallback);
|
||||||
|
|
||||||
|
systemTask.reset(new Pinetime::System::SystemTask(*spi, *lcd, *touchPanel, *lvgl, batteryController, bleController, dateTimeController));
|
||||||
|
systemTask->Start();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ble_manager_init();
|
ble_manager_init();
|
||||||
ble_manager_set_new_time_callback(OnNewTime);
|
ble_manager_set_new_time_callback(OnNewTime);
|
||||||
|
|
7
src/main.h
Normal file
7
src/main.h
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <FreeRTOS.h>
|
||||||
|
#include <timers.h>
|
||||||
|
|
||||||
|
void nrfx_gpiote_evt_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action);
|
||||||
|
void DebounceTimerCallback(TimerHandle_t xTimer);
|
Loading…
Reference in a new issue