From 025cd56500619c6d6a8e4c34884644b5ec20a874 Mon Sep 17 00:00:00 2001 From: nedko Date: Thu, 25 Jun 2026 17:01:30 +0300 Subject: [PATCH] Some restructuring. Added structure for image finding --- config_example.json | 1 + main.cpp | 81 +++++++++++++++++++++++++++++++++++---------- 2 files changed, 65 insertions(+), 17 deletions(-) diff --git a/config_example.json b/config_example.json index e97841d..e7a4304 100644 --- a/config_example.json +++ b/config_example.json @@ -2,6 +2,7 @@ // Required "host": "localhost", "port": 0, + "base_url": "https://trmnl.com/", // Optional "devices_filename": "devices.json", diff --git a/main.cpp b/main.cpp index 2ddf2ab..c7ae04b 100644 --- a/main.cpp +++ b/main.cpp @@ -3,7 +3,9 @@ #include #include #include +#include #include +#include #include #include @@ -19,6 +21,8 @@ using nlohmann::json; using namespace std; constexpr int API_KEY_LENGHT = 16; +constexpr char DEFAULT_IMAGE_URL[] = "https://trmnl.com/images/setup/setup-logo.bmp"; +constexpr char DEFAULT_IMAGE_FNAME[] = "2024-09-20T00:00:00"; string generate_api_key(int len = API_KEY_LENGHT) { @@ -68,13 +72,13 @@ string generate_api_key(int len = API_KEY_LENGHT) return result; } -void reload_container(TRMNLContainer& container, const string& filename) +bool reload_container(TRMNLContainer& container, const string& filename) { json j; bool ok = read_file_json(j, filename, &cout); if (!ok) { - return; + return false; } container.clear(); if (j.is_array()) @@ -84,17 +88,35 @@ void reload_container(TRMNLContainer& container, const string& filename) container.add_device(j[i]); } } + + return true; +} + +// First string is image filename for URL +// Second string is timestamp for TRMNL filename +pair find_image_for_friendly(const string& folder_images, const string& friendly_id) +{ + pair result = {"", ""}; + set permitted_extensions = { ".bmp", ".png" }; + + // TODO: Implement + + return result; } int main(int argc, char **argv) { string config_filename = "config.json"; string devices_filename = "devices.json"; - string host = ""; string folder_images = "images"; + + string host = ""; + uint16_t port = 0; + string base_url = ""; + string cert_file = ""; string key_file = ""; - uint16_t port = 0; + shared_ptr server = nullptr; bool ok; @@ -113,10 +135,14 @@ int main(int argc, char **argv) return -1; } - json_extract(cfg, "devices_filename", devices_filename); json_extract(cfg, "host", host); json_extract(cfg, "port", port); + json_extract(cfg, "base_url", base_url); + + json_extract(cfg, "devices_filename", devices_filename); json_extract(cfg, "folder_images", folder_images); + + // TODO: Extract when SSL is ready // json_extract(cfg, "cert_file", cert_file); // json_extract(cfg, "key_file", cert_file); @@ -132,6 +158,12 @@ int main(int argc, char **argv) return -1; } + if (base_url.empty()) + { + cout << "base url not provided" << endl; + return -1; + } + if (folder_images.empty()) { cout << "folder for images is empty" << endl; @@ -147,14 +179,13 @@ int main(int argc, char **argv) server = make_shared(); } - ok = read_file_json(devs, devices_filename, &cout); + ok = reload_container(container, devices_filename); if (!ok) { + cout << "Could not read devices file" << endl; return -1; } - reload_container(container, devices_filename); - auto setup_handler = [&container, &devices_filename](const httplib::Request& req, httplib::Response& res) { json response; @@ -213,9 +244,8 @@ int main(int argc, char **argv) response["status"] = 200; response["api_key"] = trmnl->api_key(); response["friendly_id"] = trmnl->friendly_id(); - // TODO: Check for image in folder - response["image_url"] = "https://trmnl.com/images/setup/setup-logo.bmp"; - response["filename"] = "welcome"; + response["image_url"] = DEFAULT_IMAGE_URL; + response["filename"] = DEFAULT_IMAGE_FNAME; res.set_header("Content-Type", "application/json"); res.body = response.dump(); @@ -226,7 +256,8 @@ int main(int argc, char **argv) } }; - auto display_handler = [&container, &devices_filename](const httplib::Request& req, httplib::Response& res) + auto display_handler = [&container, &devices_filename, &folder_images, &base_url] + (const httplib::Request& req, httplib::Response& res) { json response; @@ -277,19 +308,35 @@ int main(int argc, char **argv) return; } - // TODO: Check for image in folder - // string image; + string image_fname; + string image_timestamp; + tie(image_fname, image_timestamp) = find_image_for_friendly(folder_images, trmnl->friendly_id()); // The ID and api_key match here res.status = 200; // From docs: will be 202 if no user_id is attached to device response["status"] = 0; - response["image_url"] = "https://trmnl.com/images/setup/setup-logo.bmp"; - response["filename"] = "2024-09-20T00:00:00"; + + if (image_fname.empty()) + { + response["image_url"] = DEFAULT_IMAGE_URL; + response["filename"] = DEFAULT_IMAGE_FNAME; + } + else + { + string full_url = base_url; + full_url += "/images/"; + full_url += image_fname; + response["image_url"] = full_url; + response["filename"] = image_timestamp; + } + + response["refresh_rate"] = to_string(trmnl->refresh_rate()); + + // TODO: Handle firmware updating response["update_firmware"] = false; response["firmware_url"] = nullptr; - response["refresh_rate"] = to_string(trmnl->refresh_rate()); response["reset_firmware"] = false; res.set_header("Content-Type", "application/json");