From ad7478cb3187e2831278b8056e9f4f60aba4d545 Mon Sep 17 00:00:00 2001 From: Tyler Perkins Date: Mon, 20 Dec 2021 15:13:12 -0500 Subject: [PATCH] Add top/bottom bars --- src/board.cpp | 3 + src/config.cpp | 4 + src/config.def.hpp | 5 ++ src/panel/def_overlay.cpp | 137 +++++++++++++++++++++++++++++++ src/panel/def_overlay.hpp | 40 +++++++++ src/panel/def_overlay_config.hpp | 29 +++++++ src/panel/weather.cpp | 3 +- src/panel/weather_config.hpp | 2 +- 8 files changed, 221 insertions(+), 2 deletions(-) create mode 100644 src/panel/def_overlay.cpp create mode 100644 src/panel/def_overlay.hpp create mode 100644 src/panel/def_overlay_config.hpp diff --git a/src/board.cpp b/src/board.cpp index 80ad201..52f060a 100644 --- a/src/board.cpp +++ b/src/board.cpp @@ -395,6 +395,9 @@ void board::start(){ //call draw on the current panel PANELS[i]->draw(); + //draw the overlay panel + OVERLAY->draw(); + if(fcount % 10 == 0) std::cerr << "Frame : " << fcount << "\n"; diff --git a/src/config.cpp b/src/config.cpp index dd72a10..32048c0 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -13,6 +13,10 @@ dashboard::panel::panel* PANELS[] = { }; size_t PANELS_LENGTH = sizeof(PANELS)/sizeof(PANELS[0]); +// OVERLAY +// This is a special panel that is overlayed on top of all other panels +dashboard::panel::panel* OVERLAY = new dashboard::panel::def_overlay(); + // IMAGE_LOCATIONS // Locations of all static images used const char* IMAGE_LOCATIONS[] = { diff --git a/src/config.def.hpp b/src/config.def.hpp index 22013d7..c9ce9c3 100644 --- a/src/config.def.hpp +++ b/src/config.def.hpp @@ -76,9 +76,14 @@ constexpr int IMG_FLAGS = 0 // Be sure to include the panel definition below, then add it to the system #include "panel/panel.hpp" #include "panel/weather.hpp" +#include "panel/def_overlay.hpp" extern dashboard::panel::panel* PANELS[]; extern size_t PANELS_LENGTH; +// OVERLAY +// This is a special panel that is overlayed on top of all other panels +extern dashboard::panel::panel* OVERLAY; + // DATA_DIR // Where all resources will be // Keep this as DATA to use the install dir set in the makefile diff --git a/src/panel/def_overlay.cpp b/src/panel/def_overlay.cpp new file mode 100644 index 0000000..9c19a76 --- /dev/null +++ b/src/panel/def_overlay.cpp @@ -0,0 +1,137 @@ +/////////////////////////////////////////////////////////////////////////////// +// Tyler Perkins +// 20-12-21 +// def_overlay implementation +// + +#include "def_overlay.hpp" +#include "def_overlay_config.hpp" + +using namespace dashboard::panel; + +/////////////////////////////////////////////////////////////////////////////// +// Constructors /////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +def_overlay::def_overlay(){ + std::cerr << "DEF_OVERLAY CONSTRUCTOR\n"; + //dont init time on screen, its always on screen + _time_on_screen = 0; + _update_interval = std::chrono::milliseconds{DEF_OVERLAY_UPDATE_INTERVAL}; + _texture = nullptr; + //let set to default, will make it so it updates the texture ASAP + //_last_update; +} + +def_overlay::~def_overlay(){ + std::cerr << "DEF_OVERLAY DECONSTRUCTOR\n"; + if(_texture != nullptr){ + SDL_DestroyTexture(_texture); + } +} + +/////////////////////////////////////////////////////////////////////////////// +// Draw function ////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +void def_overlay::draw(){ + //create the texture if this is the first time running draw + if(_texture == nullptr){ + std::cerr << "IN FIRST SETUP\n"; + initTexture(); + update(); + update_texture(); + } + + //check if its time to update + if((std::chrono::high_resolution_clock::now() - _last_update) + > _update_interval){ + update(); + + update_texture(); + } + + SDL_RenderCopy(board::getRenderer(), _texture, NULL, NULL); +} + +/////////////////////////////////////////////////////////////////////////////// +// Helper functions /////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////// +// Update the information of the obj +// This DOES NOT update the display +void def_overlay::update() { + std::cerr << "DEF_OVERLAY::UPDATE\n"; + _last_update = std::chrono::high_resolution_clock::now(); + + //get current date and time + std::time_t curr_time = std::chrono::system_clock::to_time_t( + std::chrono::system_clock::now()); + date_time = std::ctime(&curr_time); +} + +/////////////////////////////////////// +// Update the texture that is being +// displayed, based on system data +void def_overlay::update_texture() { + std::cerr << "DEF_OVERLAY::UPDATE_TEXTURE\n"; + uint8_t o_red, o_green, o_blue, o_alpha; + SDL_Rect tgt; + + //save the old colors + SDL_GetRenderDrawColor(board::getRenderer(), &o_red, + &o_green, &o_blue, &o_alpha); + + SDL_SetRenderTarget(board::getRenderer(), _texture); + + //clear the texture as pure alpha + SDL_SetRenderDrawColor(board::getRenderer(), + 0x00, 0x00, 0x00, 0x00); + + //set the new color + SDL_SetRenderDrawColor(board::getRenderer(), + DEF_OVERLAY_BAR_RED, DEF_OVERLAY_BAR_GREEN, + DEF_OVERLAY_BAR_BLUE, DEF_OVERLAY_BAR_ALPHA); + + //draw the top rectangle + tgt.x = 0; tgt.y = 0; + tgt.w = SCREEN_WIDTH; + tgt.h = DEF_OVERLAY_BAR_HEIGHT; + SDL_RenderFillRect(board::getRenderer(), &tgt); + + //draw the bottom rectangle + tgt.x = 0; tgt.y = SCREEN_HEIGHT - DEF_OVERLAY_BAR_HEIGHT; + tgt.w = SCREEN_WIDTH; + tgt.h = DEF_OVERLAY_BAR_HEIGHT; + SDL_RenderFillRect(board::getRenderer(), &tgt); + + + + + + + + SDL_SetRenderTarget(board::getRenderer(), NULL); + + //reset back to the old render color + SDL_SetRenderDrawColor(board::getRenderer(), + o_red, o_green, o_blue, o_alpha); + + std::cerr << "Leaving overlay texture\n"; +} + +/////////////////////////////////////// +// Lazy load the texture object +// This is to make sure that all of SDL +// is init before we attempt to draw anything +void def_overlay::initTexture(){ + if(_texture == nullptr){ + _texture = SDL_CreateTexture(board::getRenderer(), + SDL_PIXELFORMAT_RGBA8888, + SDL_TEXTUREACCESS_TARGET, + SCREEN_WIDTH, SCREEN_HEIGHT); + + SDL_SetTextureBlendMode(_texture, SDL_BLENDMODE_BLEND); + } +} diff --git a/src/panel/def_overlay.hpp b/src/panel/def_overlay.hpp new file mode 100644 index 0000000..6cbe7f4 --- /dev/null +++ b/src/panel/def_overlay.hpp @@ -0,0 +1,40 @@ +/////////////////////////////////////////////////////////////////////////////// +// Tyler Perkins +// 20-12-21 +// def_overlay definition +// + +#pragma once + +#include "panel.hpp" + +#include +#include +#include +#include + +#include +#include +#include + +namespace dashboard::panel { + class def_overlay : public panel { + public: + def_overlay(); + ~def_overlay(); + + void draw(); + + private: + void update(); + void update_texture(); + void initTexture(); + + std::string date_time; + + std::chrono::time_point _last_update; + std::chrono::milliseconds _update_interval; + }; +} + +#include "../board.hpp" diff --git a/src/panel/def_overlay_config.hpp b/src/panel/def_overlay_config.hpp new file mode 100644 index 0000000..9ba9a7a --- /dev/null +++ b/src/panel/def_overlay_config.hpp @@ -0,0 +1,29 @@ +/////////////////////////////////////////////////////////////////////////////// +// Tyler Perkins +// 20-12-21 +// def overlay configuration +// + +#pragma once + +#include + +namespace dashboard::panel { + //How long should we wait between updates? in ms + //Default 10 s + constexpr size_t DEF_OVERLAY_UPDATE_INTERVAL = 10000; + + //Height of the bar on the top and bottom, in pixels + constexpr size_t DEF_OVERLAY_BAR_HEIGHT = 45; + + //Text color + constexpr uint8_t DEF_OVERLAY_TEXT_RED = 0xCC; + constexpr uint8_t DEF_OVERLAY_TEXT_GREEN = 0xCC; + constexpr uint8_t DEF_OVERLAY_TEXT_BLUE = 0xCC; + constexpr uint8_t DEF_OVERLAY_TEXT_ALPHA = 0xFF; + + constexpr uint8_t DEF_OVERLAY_BAR_RED = 0xAA; + constexpr uint8_t DEF_OVERLAY_BAR_GREEN = 0xAA; + constexpr uint8_t DEF_OVERLAY_BAR_BLUE = 0xAA; + constexpr uint8_t DEF_OVERLAY_BAR_ALPHA = 0xFF; +} diff --git a/src/panel/weather.cpp b/src/panel/weather.cpp index ac45e5e..b60651f 100644 --- a/src/panel/weather.cpp +++ b/src/panel/weather.cpp @@ -16,7 +16,7 @@ using namespace dashboard::panel; weather::weather(){ std::cerr << "WEATHER CONSTRUCTOR\n"; _time_on_screen = WEATHER_DEFAULT_ON_SCREEN_TIME; - _update_interval = std::chrono::milliseconds{UPDATE_INTERVAL}; + _update_interval = std::chrono::milliseconds{WEATHER_UPDATE_INTERVAL}; //let set to default, will make it so it updates the texture ASAP //_last_update; _rss = rss_utils::rss(WEATHER_URL_SOURCE); @@ -86,6 +86,7 @@ void weather::update_texture(){ SDL_Rect tgt; SDL_SetRenderTarget(board::getRenderer(), _texture); + SDL_RenderClear(board::getRenderer()); //title tgt.x = 50; diff --git a/src/panel/weather_config.hpp b/src/panel/weather_config.hpp index 35aa03b..cc4230f 100644 --- a/src/panel/weather_config.hpp +++ b/src/panel/weather_config.hpp @@ -16,5 +16,5 @@ namespace dashboard::panel { //How long should we wait between updates? in ms //Default 1 hour - constexpr size_t UPDATE_INTERVAL = 3600000; + constexpr size_t WEATHER_UPDATE_INTERVAL = 3600000; }