Add plex/tautili panel boilerplate
This commit is contained in:
parent
e729794009
commit
a17dd5eb56
123
src/panel/plex.cpp
Normal file
123
src/panel/plex.cpp
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Tyler Perkins
|
||||||
|
// 23-12-21
|
||||||
|
// Plex stats panel (tautilli)
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "plex.hpp"
|
||||||
|
#include "plex_config.hpp"
|
||||||
|
|
||||||
|
using namespace dashboard::panel;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Constructors ///////////////////////////////////////////////////////////////
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
plex::plex(){
|
||||||
|
std::cerr << "PLEX CONSTRUCTOR\n";
|
||||||
|
_time_on_screen = PLEX_DEFAULT_ON_SCREEN_TIME;
|
||||||
|
_update_interval = std::chrono::milliseconds{PLEX_UPDATE_INTERVAL};
|
||||||
|
_texture = nullptr;
|
||||||
|
_title = PLEX_TITLE;
|
||||||
|
|
||||||
|
api_curl = curl_easy_init();
|
||||||
|
curl_easy_setopt(api_curl, CURLOPT_URL, PLEX_URL_SOURCE);
|
||||||
|
curl_easy_setopt(api_curl, CURLOPT_WRITEFUNCTION,
|
||||||
|
dashboard::panel::plex::curl_callback);
|
||||||
|
curl_easy_setopt(api_curl, CURLOPT_WRITEDATA, &json_string);
|
||||||
|
}
|
||||||
|
|
||||||
|
plex::~plex(){
|
||||||
|
std::cerr << "PLEX DECONSTRUCTOR\n";
|
||||||
|
if(_texture != nullptr){
|
||||||
|
SDL_DestroyTexture(_texture);
|
||||||
|
}
|
||||||
|
if(api_curl != nullptr){
|
||||||
|
curl_easy_cleanup(api_curl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Draw function //////////////////////////////////////////////////////////////
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void plex::draw(){
|
||||||
|
//create the texture if this is the first time running draw
|
||||||
|
if(_texture == nullptr){
|
||||||
|
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 plex::update(){
|
||||||
|
std::cerr << "PLEX::UPDATE\n";
|
||||||
|
_last_update = std::chrono::high_resolution_clock::now();
|
||||||
|
|
||||||
|
//fetch updates
|
||||||
|
//CURL object has been setup in the constructor
|
||||||
|
CURLcode res = curl_easy_perform(api_curl);
|
||||||
|
|
||||||
|
//parse the result
|
||||||
|
json_doc.Parse(json_string.c_str());
|
||||||
|
|
||||||
|
//update internal state
|
||||||
|
//const rapidjson::Value& curr_entry = json_doc["value"];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////
|
||||||
|
// Update the texture that is being
|
||||||
|
// displayed, based on data in the json feed
|
||||||
|
void plex::update_texture(){
|
||||||
|
std::cerr << "PLEX::UPDATE_TEXTURE\n";
|
||||||
|
SDL_Rect tgt;
|
||||||
|
|
||||||
|
SDL_SetRenderTarget(board::getRenderer(), _texture);
|
||||||
|
SDL_RenderClear(board::getRenderer());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
SDL_SetRenderTarget(board::getRenderer(), NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////
|
||||||
|
// Lazy load the texture object
|
||||||
|
// This is to make sure that all of SDL
|
||||||
|
// is init before we attempt to draw anything
|
||||||
|
void plex::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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////
|
||||||
|
// Curl callback function
|
||||||
|
size_t dashboard::panel::plex::curl_callback(void* contents, size_t size,
|
||||||
|
size_t nmemb, void* userp){
|
||||||
|
((std::string*)userp)->append((char*)contents, size * nmemb);
|
||||||
|
return size * nmemb;
|
||||||
|
}
|
45
src/panel/plex.hpp
Normal file
45
src/panel/plex.hpp
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Tyler Perkins
|
||||||
|
// 23-12-21
|
||||||
|
// Plex stats panel (tautilli)
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "panel.hpp"
|
||||||
|
|
||||||
|
#include <SDL.h>
|
||||||
|
#include <SDL2/SDL_image.h>
|
||||||
|
#include <SDL2/SDL_ttf.h>
|
||||||
|
|
||||||
|
#include <curl/curl.h>
|
||||||
|
#include "../util/rapidjson/document.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
|
namespace dashboard::panel {
|
||||||
|
class plex : public panel {
|
||||||
|
public:
|
||||||
|
plex();
|
||||||
|
~plex();
|
||||||
|
|
||||||
|
static size_t curl_callback(void*, size_t, size_t, void*);
|
||||||
|
|
||||||
|
void draw();
|
||||||
|
private:
|
||||||
|
void update();
|
||||||
|
void update_texture();
|
||||||
|
void initTexture();
|
||||||
|
|
||||||
|
CURL* api_curl;
|
||||||
|
std::string json_string;
|
||||||
|
rapidjson::Document json_doc;
|
||||||
|
|
||||||
|
std::chrono::time_point<std::chrono::high_resolution_clock> _last_update;
|
||||||
|
std::chrono::milliseconds _update_interval;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "../board.hpp"
|
25
src/panel/plex_config.hpp
Normal file
25
src/panel/plex_config.hpp
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Tyler Perkins
|
||||||
|
// 23-22-21
|
||||||
|
// Plex panel configuration
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace dashboard::panel {
|
||||||
|
//This will be displayed at the top left on the status bar. Set to a blank
|
||||||
|
//string to not show anything
|
||||||
|
constexpr char PLEX_TITLE[] = "Plex";
|
||||||
|
|
||||||
|
//Tautili endpoint
|
||||||
|
constexpr char PLEX_URL_SOURCE[] = "http://192.168.1.104:8181/api/v2?apikey=<KEY_GOES_HERE>&cmd=";
|
||||||
|
|
||||||
|
//Default time the slid is shown on screen, in ms
|
||||||
|
//Default 15s
|
||||||
|
constexpr size_t PLEX_DEFAULT_ON_SCREEN_TIME = 15000;
|
||||||
|
|
||||||
|
//How long should we wait between updates? in ms
|
||||||
|
//Default 30s
|
||||||
|
constexpr size_t PLEX_UPDATE_INTERVAL = 30000;
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user