show language count

This commit is contained in:
proddy
2025-11-05 20:50:29 +01:00
parent 5c07a2c0cc
commit 5908fd9d9c
4 changed files with 42 additions and 7 deletions

View File

@@ -52,22 +52,39 @@ using string_vector = std::vector<const char *>;
#define F_(string_name) (__pstr__##string_name) #define F_(string_name) (__pstr__##string_name)
#define FL_(list_name) (__pstr__L_##list_name) #define FL_(list_name) (__pstr__L_##list_name)
// Counter for translations created by MAKE_TRANSLATION
extern uint32_t translation_count_;
#include <set>
#include <string>
inline void increment_translation_count_impl(const char * translation_name) {
// Use a static set to track which translations we've already counted by name
// Using std::string ensures we compare by value, not by pointer address
// This ensures we only count each unique translation once, even if included in multiple files
static std::set<std::string> counted_translations;
std::string name(translation_name);
if (counted_translations.find(name) == counted_translations.end()) {
extern uint32_t translation_count_;
translation_count_++;
counted_translations.insert(name);
}
}
// The language settings below must match system.cpp // The language settings below must match system.cpp
#if defined(EMSESP_TEST) #if defined(EMSESP_TEST)
// in Test mode use two languages (en & de) to save flash memory needed for the tests // in Test mode use two languages (en & de) to save flash memory needed for the tests
#define MAKE_WORD_TRANSLATION(list_name, en, de, ...) static const char * const __pstr__L_##list_name[] = {en, de, nullptr}; #define MAKE_WORD_TRANSLATION(list_name, en, de, ...) static const char * const __pstr__L_##list_name[] = {en, de, nullptr};
#define MAKE_TRANSLATION(list_name, shortname, en, de, ...) static const char * const __pstr__L_##list_name[] = {shortname, en, de, nullptr}; #define MAKE_TRANSLATION(list_name, shortname, en, de, ...) static const char * const __pstr__L_##list_name[] = {shortname, en, de, nullptr}; static int __translation_counter_##list_name = (increment_translation_count_impl(#list_name), 0);
#elif defined(EMSESP_EN_ONLY) #elif defined(EMSESP_EN_ONLY)
// EN only // EN only
#define MAKE_WORD_TRANSLATION(list_name, en, ...) static const char * const __pstr__L_##list_name[] = {en, nullptr}; #define MAKE_WORD_TRANSLATION(list_name, en, ...) static const char * const __pstr__L_##list_name[] = {en, nullptr};
#define MAKE_TRANSLATION(list_name, shortname, en, ...) static const char * const __pstr__L_##list_name[] = {shortname, en, nullptr}; #define MAKE_TRANSLATION(list_name, shortname, en, ...) static const char * const __pstr__L_##list_name[] = {shortname, en, nullptr}; static int __translation_counter_##list_name = (increment_translation_count_impl(#list_name), 0);
#elif defined(EMSESP_DE_ONLY) #elif defined(EMSESP_DE_ONLY)
// EN + DE // EN + DE
#define MAKE_WORD_TRANSLATION(list_name, en, de, ...) static const char * const __pstr__L_##list_name[] = {en, de, nullptr}; #define MAKE_WORD_TRANSLATION(list_name, en, de, ...) static const char * const __pstr__L_##list_name[] = {en, de, nullptr};
#define MAKE_TRANSLATION(list_name, shortname, en, de, ...) static const char * const __pstr__L_##list_name[] = {shortname, en, de, nullptr}; #define MAKE_TRANSLATION(list_name, shortname, en, de, ...) static const char * const __pstr__L_##list_name[] = {shortname, en, de, nullptr}; static int __translation_counter_##list_name = (increment_translation_count_impl(#list_name), 0);
#else #else
#define MAKE_WORD_TRANSLATION(list_name, ...) static const char * const __pstr__L_##list_name[] = {__VA_ARGS__, nullptr}; #define MAKE_WORD_TRANSLATION(list_name, ...) static const char * const __pstr__L_##list_name[] = {__VA_ARGS__, nullptr};
#define MAKE_TRANSLATION(list_name, ...) static const char * const __pstr__L_##list_name[] = {__VA_ARGS__, nullptr}; #define MAKE_TRANSLATION(list_name, ...) static const char * const __pstr__L_##list_name[] = {__VA_ARGS__, nullptr}; static int __translation_counter_##list_name = (increment_translation_count_impl(#list_name), 0);
#endif #endif
#define MAKE_NOTRANSLATION(list_name, ...) static const char * const __pstr__L_##list_name[] = {__VA_ARGS__, nullptr}; #define MAKE_NOTRANSLATION(list_name, ...) static const char * const __pstr__L_##list_name[] = {__VA_ARGS__, nullptr};

View File

@@ -26,6 +26,9 @@ static_assert(uuid::thread_safe, "uuid-common must be thread-safe");
static_assert(uuid::log::thread_safe, "uuid-log must be thread-safe"); static_assert(uuid::log::thread_safe, "uuid-log must be thread-safe");
static_assert(uuid::console::thread_safe, "uuid-console must be thread-safe"); static_assert(uuid::console::thread_safe, "uuid-console must be thread-safe");
// Translation counter - incremented by MAKE_TRANSLATION macro (must be global, not in namespace)
uint32_t translation_count_ = 0;
namespace emsesp { namespace emsesp {
// Static member definitions // Static member definitions
@@ -288,7 +291,7 @@ void EMSESP::show_ems(uuid::console::Shell & shell) {
shell.printfln(" #read fails (after %d retries): %d", TxService::MAXIMUM_TX_RETRIES, txservice_.telegram_read_fail_count()); shell.printfln(" #read fails (after %d retries): %d", TxService::MAXIMUM_TX_RETRIES, txservice_.telegram_read_fail_count());
shell.printfln(" #write fails (after %d retries): %d", TxService::MAXIMUM_TX_RETRIES, txservice_.telegram_write_fail_count()); shell.printfln(" #write fails (after %d retries): %d", TxService::MAXIMUM_TX_RETRIES, txservice_.telegram_write_fail_count());
shell.printfln(" Rx line quality: %d%%", rxservice_.quality()); shell.printfln(" Rx line quality: %d%%", rxservice_.quality());
shell.printfln(" Tx line quality: %d%%", (txservice_.read_quality() + txservice_.read_quality()) / 2); shell.printfln(" Tx line quality: %d%%", (txservice_.read_quality() + txservice_.write_quality()) / 2);
shell.println(); shell.println();
} }
@@ -1691,7 +1694,7 @@ void EMSESP::start() {
device_library_ = { device_library_ = {
#include "device_library.h" #include "device_library.h"
}; };
LOG_INFO("Loaded EMS device library (%d entries)", device_library_.size()); LOG_INFO("Library loaded: %d EMS devices, %d device entities, %s", device_library_.size(), ::translation_count_, system_.languages_string().c_str());
system_.reload_settings(); // ... and store some of the settings locally system_.reload_settings(); // ... and store some of the settings locally

View File

@@ -107,6 +107,19 @@ bool System::command_send(const char * value, const int8_t id) {
return EMSESP::txservice_.send_raw(value); // ignore id return EMSESP::txservice_.send_raw(value); // ignore id
} }
// return string of languages and count
std::string System::languages_string() {
std::string languages_string = std::to_string(NUM_LANGUAGES) + " languages (";
for (uint8_t i = 0; i < NUM_LANGUAGES; i++) {
languages_string += languages[i];
if (i != NUM_LANGUAGES - 1) {
languages_string += ",";
}
}
languages_string += ")";
return languages_string;
}
// returns last response from MQTT // returns last response from MQTT
bool System::command_response(const char * value, const int8_t id, JsonObject output) { bool System::command_response(const char * value, const int8_t id, JsonObject output) {
JsonDocument doc; JsonDocument doc;
@@ -1779,7 +1792,7 @@ bool System::command_info(const char * value, const int8_t id, JsonObject output
node["busReadsFailed"] = EMSESP::txservice_.telegram_read_fail_count(); node["busReadsFailed"] = EMSESP::txservice_.telegram_read_fail_count();
node["busWritesFailed"] = EMSESP::txservice_.telegram_write_fail_count(); node["busWritesFailed"] = EMSESP::txservice_.telegram_write_fail_count();
node["busRxLineQuality"] = EMSESP::rxservice_.quality(); node["busRxLineQuality"] = EMSESP::rxservice_.quality();
node["busTxLineQuality"] = (EMSESP::txservice_.read_quality() + EMSESP::txservice_.read_quality()) / 2; node["busTxLineQuality"] = (EMSESP::txservice_.read_quality() + EMSESP::txservice_.write_quality()) / 2;
// Settings // Settings
node = output["settings"].to<JsonObject>(); node = output["settings"].to<JsonObject>();

View File

@@ -291,6 +291,8 @@ class System {
void wifi_reconnect(); void wifi_reconnect();
void show_users(uuid::console::Shell & shell); void show_users(uuid::console::Shell & shell);
static std::string languages_string();
uint32_t FStotal() { uint32_t FStotal() {
return fstotal_; return fstotal_;
} }