Files
trmnl_server_cpp/TRMNL.cpp
2026-06-25 16:04:56 +03:00

208 lines
3.4 KiB
C++

#include "TRMNL.h"
#include "helpers.h"
using std::list;
using std::map;
using std::optional;
using std::string;
using nlohmann::json;
TRMNL::TRMNL(const string& id,
const string& api_key,
const string& friendly_id,
int refresh_rate)
: m_id(id),
m_api_key(api_key),
m_friendly_id(friendly_id),
m_refresh_rate(refresh_rate),
m_update_handler()
{}
TRMNL::TRMNL(const nlohmann::json& j)
: m_id(""),
m_api_key(""),
m_friendly_id(""),
m_refresh_rate(DEFAULT_REFRESH_RATE),
m_update_handler()
{
json_extract(j, "ID", m_id);
json_extract(j, "api_key", m_api_key);
json_extract(j, "friendly_id", m_friendly_id);
json_extract(j, "refresh_rate", m_refresh_rate);
}
const string& TRMNL::id() const
{
return m_id;
}
const string& TRMNL::api_key() const
{
return m_api_key;
}
const string& TRMNL::friendly_id() const
{
return m_friendly_id;
}
int TRMNL::refresh_rate() const
{
return m_refresh_rate;
}
void TRMNL::id(const std::string& id)
{
m_id = id;
if (m_update_handler)
{
m_update_handler(*this);
}
}
void TRMNL::api_key(const std::string& api_key)
{
m_api_key = api_key;
if (m_update_handler)
{
m_update_handler(*this);
}
}
void TRMNL::friendly_id(const std::string& friendly_id)
{
m_friendly_id = friendly_id;
if (m_update_handler)
{
m_update_handler(*this);
}
}
void TRMNL::refresh_rate(int refresh_rate)
{
m_refresh_rate = refresh_rate;
if (m_update_handler)
{
m_update_handler(*this);
}
}
void TRMNL::set_update_handler(std::function<void (const TRMNL& trmnl)> handler)
{
m_update_handler = handler;
}
string TRMNL::friendly_from_id(string id)
{
size_t pos = id.find(':');
while (pos != string::npos)
{
id.erase(pos, 1);
pos = id.find(':');
}
if (id.size() <= 6)
{
return id;
}
else
{
return id.substr(id.size() - 6);
}
}
void to_json(json& j, const TRMNL& trmnl)
{
j = json{
{"ID", trmnl.m_id},
{"api_key", trmnl.m_api_key},
{"friendly_id", trmnl.m_friendly_id},
{"refresh_rate", trmnl.m_refresh_rate},
};
}
void TRMNLContainer::TRMNL_update_handler(const TRMNL& trmnl)
{
auto it = m_by_id.find(trmnl.m_id);
if (it == m_by_id.end())
{
return;
}
// An update is needed only if friendly ID changes
if (0 == m_by_friendly.count(trmnl.m_friendly_id))
{
m_by_friendly[trmnl.m_friendly_id] = it->second;
}
}
TRMNLContainer& TRMNLContainer::operator=(const TRMNLContainer& other)
{
m_devices = other.m_devices;
m_by_id = other.m_by_id;
m_by_friendly = other.m_by_friendly;
for (TRMNL& device : m_devices)
{
device.set_update_handler([this](const TRMNL& trmnl){ TRMNL_update_handler(trmnl); });
}
return *this;
}
void TRMNLContainer::add_device(TRMNL trmnl)
{
if (trmnl.m_id.empty())
{
return;
}
auto it = m_devices.insert(m_devices.end(), trmnl);
m_by_id[trmnl.m_id] = it;
if (!trmnl.m_friendly_id.empty())
{
m_by_friendly[trmnl.m_friendly_id] = it;
}
it->set_update_handler([this](const TRMNL& trmnl){ TRMNL_update_handler(trmnl); });
}
TRMNL* TRMNLContainer::get_device_by_id(const string& id)
{
TRMNL* result = nullptr;
if (0 != m_by_id.count(id))
{
result = &(*m_by_id[id]);
}
return result;
}
TRMNL* TRMNLContainer::get_device_by_friendly(const string& friendly)
{
TRMNL* result = nullptr;
if (0 != m_by_friendly.count(friendly))
{
result = &(*m_by_friendly[friendly]);
}
return result;
}
void TRMNLContainer::clear()
{
m_by_friendly.clear();
m_by_id.clear();
m_devices.clear();
}
void to_json(json& j, const TRMNLContainer& cont)
{
j = cont.m_devices;
}