Compare commits

...

2 Commits

Author SHA1 Message Date
JF 0aa636834c Switch from clock to rainbow using touchscreen. 2020-02-15 15:05:39 +01:00
JF 7785e3bcfe Add vertical scrolling support in st7789 driver
Demo of vertical scrolling in screen Clock.
2020-02-06 21:38:02 +01:00
10 changed files with 132 additions and 8 deletions

View File

@ -36,6 +36,7 @@ list(APPEND SOURCE_FILES
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/Rainbow.cpp
main.cpp main.cpp
drivers/St7789.cpp drivers/St7789.cpp
drivers/SpiMaster.cpp drivers/SpiMaster.cpp
@ -60,6 +61,7 @@ set(INCLUDE_FILES
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/Rainbow.h
drivers/St7789.h drivers/St7789.h
drivers/SpiMaster.h drivers/SpiMaster.h
Components/Gfx/Gfx.h Components/Gfx/Gfx.h

View File

@ -30,7 +30,7 @@ void Gfx::ClearScreen() {
void Gfx::FillRectangle(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint16_t color) { void Gfx::FillRectangle(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint16_t color) {
SetBackgroundColor(color); SetBackgroundColor(color);
state.remainingIterations = 240 + 1; state.remainingIterations = h;
state.currentIteration = 0; state.currentIteration = 0;
state.busy = true; state.busy = true;
state.action = Action::FillRectangle; state.action = Action::FillRectangle;
@ -183,4 +183,12 @@ void Gfx::WaitTransfertFinished() const {
ulTaskNotifyTake(pdTRUE, 500); ulTaskNotifyTake(pdTRUE, 500);
} }
void Gfx::SetScrollArea(uint16_t topFixedLines, uint16_t scrollLines, uint16_t bottomFixedLines) {
lcd.VerticalScrollDefinition(topFixedLines, scrollLines, bottomFixedLines);
}
void Gfx::SetScrollStartLine(uint16_t line) {
lcd.VerticalScrollStartAddress(line);
}

View File

@ -19,6 +19,8 @@ namespace Pinetime {
void DrawString(uint8_t x, uint8_t y, uint16_t color, const char* text, const FONT_INFO *p_font, bool wrap); void DrawString(uint8_t x, uint8_t y, uint16_t color, const char* text, const FONT_INFO *p_font, bool wrap);
void DrawChar(const FONT_INFO *font, uint8_t c, uint8_t *x, uint8_t y, uint16_t color); void DrawChar(const FONT_INFO *font, uint8_t c, uint8_t *x, uint8_t y, uint16_t color);
void FillRectangle(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint16_t color); void FillRectangle(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint16_t color);
void SetScrollArea(uint16_t topFixedLines, uint16_t scrollLines, uint16_t bottomFixedLines);
void SetScrollStartLine(uint16_t line);
void Sleep(); void Sleep();
void Wakeup(); void Wakeup();

View File

@ -26,9 +26,10 @@ DisplayApp::DisplayApp(Pinetime::Drivers::St7789& lcd,
batteryController{batteryController}, batteryController{batteryController},
bleController{bleController}, bleController{bleController},
dateTimeController{dateTimeController}, dateTimeController{dateTimeController},
clockScreen{gfx} { clockScreen{gfx},
rainbowScreen{gfx} {
msgQueue = xQueueCreate(queueSize, itemSize); msgQueue = xQueueCreate(queueSize, itemSize);
currentScreen = &clockScreen; currentScreen = &rainbowScreen;
} }
void DisplayApp::Start() { void DisplayApp::Start() {
@ -68,7 +69,7 @@ void DisplayApp::Refresh() {
break; break;
case States::Running: case States::Running:
RunningState(); RunningState();
queueTimeout = 1000; queueTimeout = 50;
break; break;
} }
@ -139,7 +140,12 @@ void DisplayApp::OnTouchEvent() {
auto info = touchPanel.GetTouchInfo(); auto info = touchPanel.GetTouchInfo();
if(info.isTouch) { if(info.isTouch) {
gfx.FillRectangle(info.x-10, info.y-10, 20,20, pointColor); if(currentScreen == &clockScreen)
pointColor+=10; currentScreen = &rainbowScreen;
else {
gfx.SetScrollStartLine(0);
currentScreen = &clockScreen;
}
currentScreen->Refresh(true);
} }
} }

View File

@ -14,6 +14,7 @@
#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>
#include <DisplayApp/Screens/Rainbow.h>
extern const FONT_INFO lCD_70ptFontInfo; extern const FONT_INFO lCD_70ptFontInfo;
@ -58,6 +59,7 @@ namespace Pinetime {
void OnTouchEvent(); void OnTouchEvent();
Screens::Clock clockScreen; Screens::Clock clockScreen;
Screens::Rainbow rainbowScreen;
Screens::Screen* currentScreen = nullptr; Screens::Screen* currentScreen = nullptr;
static constexpr uint8_t pinLcdBacklight1 = 14; static constexpr uint8_t pinLcdBacklight1 = 14;
static constexpr uint8_t pinLcdBacklight2 = 22; static constexpr uint8_t pinLcdBacklight2 = 22;

View File

@ -5,7 +5,6 @@
#include "Clock.h" #include "Clock.h"
using namespace Pinetime::Applications::Screens; using namespace Pinetime::Applications::Screens;
void Clock::Refresh(bool fullRefresh) { void Clock::Refresh(bool fullRefresh) {
if(fullRefresh) { if(fullRefresh) {
gfx.FillRectangle(0,0,240,240,0x0000); gfx.FillRectangle(0,0,240,240,0x0000);
@ -16,6 +15,7 @@ void Clock::Refresh(bool fullRefresh) {
auto dummy = currentDateTime.Get(); auto dummy = currentDateTime.Get();
} }
if (fullRefresh || batteryPercentRemaining.IsUpdated()) { if (fullRefresh || batteryPercentRemaining.IsUpdated()) {
char batteryChar[11]; char batteryChar[11];
auto newBatteryValue = batteryPercentRemaining.Get(); auto newBatteryValue = batteryPercentRemaining.Get();

View File

@ -0,0 +1,58 @@
#include "Rainbow.h"
using namespace Pinetime::Applications::Screens;
void Rainbow::Refresh(bool fullRefresh) {
if(fullRefresh) {
gfx.FillRectangle(0, 0, 240, 240, 0x0000);
gfx.SetScrollArea(0, 240, 320 - 240);
scrollLine = 0;
b = 31;
r = 0;
g = 0;
step = 0;
}
gfx.SetScrollStartLine(scrollLine);
switch(step) {
case 0:
if(r == 31) step = 1;
else r++;
break;
case 1:
if(b == 0) step = 2;
else b--;
break;
case 2:
if(g == 31) step = 3;
else g++;
break;
case 3:
if(r == 0) step = 4;
else r--;
break;
case 4:
if(b == 31) step = 5;
else b++;
break;
case 5:
if(g == 0) step = 0;
else g--;
break;
}
uint16_t color = (g & 0x1f) | ((r & 0x1f) << 6) | ((b & 0x1f) << 11);
// Invert the 2 byte from color to adapt to the lcd controller
uint8_t l = color & 0x00ffu;
uint8_t h = (color >> 8u) & 0x00ffu;
uint16_t c = h + (l << 8);
gfx.FillRectangle(0, scrollLine,240,1, c);
scrollLine+=1;
if(scrollLine == 240) scrollLine = 0;
}

View File

@ -0,0 +1,24 @@
#pragma once
#include "Screen.h"
namespace Pinetime {
namespace Applications {
namespace Screens {
class Rainbow : public Screen{
public:
explicit Rainbow(Components::Gfx& gfx) : Screen(gfx) {}
void Refresh(bool fullRefresh) override;
private:
uint16_t scrollLine = 0;
uint8_t r = 0;
uint8_t g = 0;
uint8_t b = 0;
uint8_t step = 0;
};
}
}
}

View File

@ -120,6 +120,22 @@ void St7789::DisplayOff() {
nrf_delay_ms(500); nrf_delay_ms(500);
} }
void St7789::VerticalScrollDefinition(uint16_t topFixedLines, uint16_t scrollLines, uint16_t bottomFixedLines) {
WriteCommand(static_cast<uint8_t>(Commands::VerticalScrollDefinition));
WriteData(topFixedLines >> 8u);
WriteData(topFixedLines & 0x00ffu);
WriteData(scrollLines >> 8u);
WriteData(scrollLines & 0x00ffu);
WriteData(bottomFixedLines >> 8u);
WriteData(bottomFixedLines & 0x00ffu);
}
void St7789::VerticalScrollStartAddress(uint16_t line) {
WriteCommand(static_cast<uint8_t>(Commands::VerticalScrollStartAddress));
WriteData(line >> 8u);
WriteData(line & 0x00ffu);
}
void St7789::Uninit() { void St7789::Uninit() {
} }

View File

@ -11,6 +11,10 @@ namespace Pinetime {
void Uninit(); void Uninit();
void DrawPixel(uint16_t x, uint16_t y, uint32_t color); void DrawPixel(uint16_t x, uint16_t y, uint32_t color);
void VerticalScrollDefinition(uint16_t topFixedLines, uint16_t scrollLines, uint16_t bottomFixedLines);
void VerticalScrollStartAddress(uint16_t line);
void BeginDrawBuffer(uint16_t x, uint16_t y, uint16_t width, uint16_t height); void BeginDrawBuffer(uint16_t x, uint16_t y, uint16_t width, uint16_t height);
void NextDrawBuffer(const uint8_t* data, size_t size); void NextDrawBuffer(const uint8_t* data, size_t size);
@ -47,7 +51,9 @@ namespace Pinetime {
ColumnAddressSet = 0x2a, ColumnAddressSet = 0x2a,
RowAddressSet = 0x2b, RowAddressSet = 0x2b,
WriteToRam = 0x2c, WriteToRam = 0x2c,
MemoryDataAccessControl = 036, MemoryDataAccessControl = 0x36,
VerticalScrollDefinition = 0x33,
VerticalScrollStartAddress = 0x37,
ColMod = 0x3a, ColMod = 0x3a,
}; };
void WriteData(uint8_t data); void WriteData(uint8_t data);