diff options
Diffstat (limited to 'src/DisplayApp/Screens')
-rw-r--r-- | src/DisplayApp/Screens/Clock.cpp | 133 | ||||
-rw-r--r-- | src/DisplayApp/Screens/Clock.h | 65 | ||||
-rw-r--r-- | src/DisplayApp/Screens/Message.cpp | 14 | ||||
-rw-r--r-- | src/DisplayApp/Screens/Message.h | 26 | ||||
-rw-r--r-- | src/DisplayApp/Screens/Screen.cpp | 2 | ||||
-rw-r--r-- | src/DisplayApp/Screens/Screen.h | 18 |
6 files changed, 258 insertions, 0 deletions
diff --git a/src/DisplayApp/Screens/Clock.cpp b/src/DisplayApp/Screens/Clock.cpp new file mode 100644 index 00000000..153f4f2e --- /dev/null +++ b/src/DisplayApp/Screens/Clock.cpp @@ -0,0 +1,133 @@ +#include <cstdio> +#include <libs/date/includes/date/date.h> +#include <Components/DateTime/DateTimeController.h> +#include <Version.h> +#include "Clock.h" + +using namespace Pinetime::Applications::Screens; + +void Clock::Refresh(bool fullRefresh) { + if(fullRefresh) { + gfx.FillRectangle(0,0,240,240,0x0000); + currentChar[0] = 0; + currentChar[1] = 0; + currentChar[2] = 0; + currentChar[3] = 0; + auto dummy = currentDateTime.Get(); + } + + if (fullRefresh || batteryPercentRemaining.IsUpdated()) { + char batteryChar[11]; + auto newBatteryValue = batteryPercentRemaining.Get(); + newBatteryValue = (newBatteryValue > 100) ? 100 : newBatteryValue; + newBatteryValue = (newBatteryValue < 0) ? 0 : newBatteryValue; + + sprintf(batteryChar, "BAT: %d%%", newBatteryValue); + gfx.DrawString((240 - 108), 0, 0xffff, batteryChar, &smallFont, false); + } + + if (fullRefresh || bleState.IsUpdated()) { + uint16_t color = (bleState.Get() == BleConnectionStates::Connected) ? 0xffff : 0x0000; + gfx.DrawString(10, 0, color, "BLE", &smallFont, false); + } + + if(fullRefresh || currentDateTime.IsUpdated()) { + auto newDateTime = currentDateTime.Get(); + + auto dp = date::floor<date::days>(newDateTime); + auto time = date::make_time(newDateTime-dp); + auto yearMonthDay = date::year_month_day(dp); + + auto year = (int)yearMonthDay.year(); + auto month = static_cast<Pinetime::Controllers::DateTime::Months>((unsigned)yearMonthDay.month()); + auto day = (unsigned)yearMonthDay.day(); + auto dayOfWeek = static_cast<Pinetime::Controllers::DateTime::Days>(date::weekday(yearMonthDay).iso_encoding()); + + auto hour = time.hours().count(); + auto minute = time.minutes().count(); + auto second = time.seconds().count(); + + char minutesChar[3]; + sprintf(minutesChar, "%02d", minute); + + char hoursChar[3]; + sprintf(hoursChar, "%02d", hour); + + uint8_t x = 7; + if (hoursChar[0] != currentChar[0]) { + gfx.DrawChar(&largeFont, hoursChar[0], &x, 78, 0xffff); + currentChar[0] = hoursChar[0]; + } + + x = 61; + if (hoursChar[1] != currentChar[1]) { + gfx.DrawChar(&largeFont, hoursChar[1], &x, 78, 0xffff); + currentChar[1] = hoursChar[1]; + } + + x = 127; + if (minutesChar[0] != currentChar[2]) { + gfx.DrawChar(&largeFont, minutesChar[0], &x, 78, 0xffff); + currentChar[2] = minutesChar[0]; + } + + x = 181; + if (minutesChar[1] != currentChar[3]) { + gfx.DrawChar(&largeFont, minutesChar[1], &x, 78, 0xffff); + currentChar[3] = minutesChar[1]; + } + + if ((year != currentYear) || (month != currentMonth) || (dayOfWeek != currentDayOfWeek) || (day != currentDay)) { + gfx.FillRectangle(0,180, 240, 15, 0x0000); + char dateStr[22]; + sprintf(dateStr, "%s %d %s %d", DayOfWeekToString(dayOfWeek), day, MonthToString(month), year); + gfx.DrawString(10, 180, 0xffff, dateStr, &smallFont, false); + + currentYear = year; + currentMonth = month; + currentDayOfWeek = dayOfWeek; + currentDay = day; + } + } + + if(fullRefresh || version.IsUpdated()) { + char version[20]; + sprintf(version, "VERSION: %d.%d.%d", Version::Major(), Version::Minor(), Version::Patch()); + gfx.DrawString(20, 220, 0xffff, version, &smallFont, false); + } +} + +const char *Clock::MonthToString(Pinetime::Controllers::DateTime::Months month) { + return Clock::MonthsString[static_cast<uint8_t>(month)]; +} + +const char *Clock::DayOfWeekToString(Pinetime::Controllers::DateTime::Days dayOfWeek) { + return Clock::DaysString[static_cast<uint8_t>(dayOfWeek)]; +} + +char const *Clock::DaysString[] = { + "", + "MONDAY", + "TUESDAY", + "WEDNESDAY", + "THURSDAY", + "FRIDAY", + "SATURDAY", + "SUNDAY" +}; + +char const *Clock::MonthsString[] = { + "", + "JAN", + "FEB", + "MAR", + "APR", + "MAY", + "JUN", + "JUL", + "AUG", + "SEP", + "OCT", + "NOV", + "DEC" +}; diff --git a/src/DisplayApp/Screens/Clock.h b/src/DisplayApp/Screens/Clock.h new file mode 100644 index 00000000..12dd8850 --- /dev/null +++ b/src/DisplayApp/Screens/Clock.h @@ -0,0 +1,65 @@ +#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" + +namespace Pinetime { + namespace Applications { + namespace Screens { + + template <class T> + class DirtyValue { + public: + explicit DirtyValue(T v) { value = v; } + explicit DirtyValue(T& v) { value = v; } + bool IsUpdated() const { return isUpdated; } + T& Get() { return value; this->isUpdated = false;} + + DirtyValue& operator=(const T& other) { + this->value = other; + this->isUpdated = true; + return *this; + } + private: + T value; + bool isUpdated = true; + }; + class Clock : public Screen{ + public: + enum class BleConnectionStates{ NotConnected, Connected}; + Clock(Components::Gfx& gfx) : Screen(gfx), currentDateTime{{}}, version {{}} {} + void Refresh(bool fullRefresh) override; + + void SetBatteryPercentRemaining(uint8_t percent) { batteryPercentRemaining = percent; } + void SetBleConnectionState(BleConnectionStates state) { bleState = state; } + void SetCurrentDateTime(const std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds>& tp) { currentDateTime = tp;} + + private: + static const char* MonthToString(Pinetime::Controllers::DateTime::Months month); + static const char* DayOfWeekToString(Pinetime::Controllers::DateTime::Days dayOfWeek); + static char const *DaysString[]; + static char const *MonthsString[]; + + 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}; + + char currentChar[4]; + uint16_t currentYear = 1970; + Pinetime::Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown; + Pinetime::Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown; + uint8_t currentDay = 0; + + DirtyValue<uint8_t> batteryPercentRemaining {0}; + DirtyValue<BleConnectionStates> bleState {BleConnectionStates::NotConnected}; + DirtyValue<std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds>> currentDateTime; + DirtyValue<Pinetime::Version> version; + }; + } + } +} diff --git a/src/DisplayApp/Screens/Message.cpp b/src/DisplayApp/Screens/Message.cpp new file mode 100644 index 00000000..2ade4349 --- /dev/null +++ b/src/DisplayApp/Screens/Message.cpp @@ -0,0 +1,14 @@ +#include <cstdio> +#include <libs/date/includes/date/date.h> +#include <Components/DateTime/DateTimeController.h> +#include <Version.h> +#include "Message.h" + +using namespace Pinetime::Applications::Screens; + +void Message::Refresh(bool fullRefresh) { + if(fullRefresh) { + gfx.FillRectangle(0,0,240,240,0xffff); + gfx.DrawString(120, 10, 0x0000, "COUCOU", &smallFont, false); + } +} diff --git a/src/DisplayApp/Screens/Message.h b/src/DisplayApp/Screens/Message.h new file mode 100644 index 00000000..ac300faf --- /dev/null +++ b/src/DisplayApp/Screens/Message.h @@ -0,0 +1,26 @@ +#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" + +namespace Pinetime { + namespace Applications { + namespace Screens { + class Message : public Screen{ + public: + Message(Components::Gfx& gfx) : Screen(gfx) {} + void Refresh(bool fullRefresh) override; + + 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}; + }; + } + } +} diff --git a/src/DisplayApp/Screens/Screen.cpp b/src/DisplayApp/Screens/Screen.cpp new file mode 100644 index 00000000..1467df33 --- /dev/null +++ b/src/DisplayApp/Screens/Screen.cpp @@ -0,0 +1,2 @@ +#include "Screen.h" +using namespace Pinetime::Applications::Screens;
\ No newline at end of file diff --git a/src/DisplayApp/Screens/Screen.h b/src/DisplayApp/Screens/Screen.h new file mode 100644 index 00000000..5e2fa43e --- /dev/null +++ b/src/DisplayApp/Screens/Screen.h @@ -0,0 +1,18 @@ +#pragma once + +#include <Components/Gfx/Gfx.h> + +namespace Pinetime { + namespace Applications { + namespace Screens { + class Screen { + public: + Screen(Components::Gfx& gfx) : gfx{gfx} {} + virtual void Refresh(bool fullRefresh) = 0; + + protected: + Components::Gfx& gfx; + }; + } + } +} |