a4dc633063
Lots of things "ported" over from the "enhanced" fork. With some adjustments here and there. KeyboardBacklight driver (for T-Deck only currently) Trackball driver (for T-Deck only currently) Keyboard backlight sleep/wake (for T-Deck only currently...also requires keyboard firmware update) Display sleep/wake Files - create file/folder Keyboard settings (for T-Deck only currently) Time & Date settings tweaks Locale settings tweaks Systeminfo additions Espnow wifi coexist initI2cDevices - moved to T-deck init.cpp / initBoot KeyboardInitService - removed, moved to T-deck init.cpp / initBoot Adjusted TIMER_UPDATE_INTERVAL to 2 seconds. Added lock to ActionCreateFolder Maybe missed some things in the list. Display wake could do with some kind of block on wake first touch to prevent UI elements being hit when waking device with touch. Same with encoder/trackball/keyboard press i guess. The original code was written by @cscott0108 at https://github.com/cscott0108/tactility-enhanced-t-deck
76 lines
2.8 KiB
C++
76 lines
2.8 KiB
C++
#include "Tactility/file/PropertiesFile.h"
|
|
|
|
#include <Tactility/StringUtils.h>
|
|
#include <Tactility/file/File.h>
|
|
#include <Tactility/file/FileLock.h>
|
|
|
|
namespace tt::file {
|
|
|
|
static auto TAG = "PropertiesFile";
|
|
|
|
bool getKeyValuePair(const std::string& input, std::string& key, std::string& value) {
|
|
auto index = input.find('=');
|
|
if (index == std::string::npos) {
|
|
return false;
|
|
}
|
|
key = input.substr(0, index);
|
|
value = input.substr(index + 1);
|
|
return true;
|
|
}
|
|
|
|
bool loadPropertiesFile(const std::string& filePath, std::function<void(const std::string& key, const std::string& value)> callback) {
|
|
// Reading properties is a common operation; make this debug-level to avoid
|
|
// flooding the serial console under frequent polling.
|
|
TT_LOG_D(TAG, "Reading properties file %s", filePath.c_str());
|
|
uint16_t line_count = 0;
|
|
std::string key_prefix = "";
|
|
// Malformed lines are skipped, valid lines are loaded and callback is called
|
|
return readLines(filePath, true, [&key_prefix, &line_count, &filePath, &callback](const std::string& line) {
|
|
line_count++;
|
|
std::string key, value;
|
|
// Trim all whitespace including \r\n (Windows line endings)
|
|
auto trimmed_line = string::trim(line, " \t\r\n");
|
|
if (!trimmed_line.starts_with("#") && !trimmed_line.empty()) {
|
|
if (trimmed_line.starts_with("[")) {
|
|
key_prefix = trimmed_line;
|
|
} else {
|
|
if (getKeyValuePair(trimmed_line, key, value)) {
|
|
std::string trimmed_key = key_prefix + string::trim(key, " \t");
|
|
std::string trimmed_value = string::trim(value, " \t");
|
|
callback(trimmed_key, trimmed_value);
|
|
} else {
|
|
TT_LOG_E(TAG, "Failed to parse line %d of %s (skipped)", line_count, filePath.c_str());
|
|
// Continue loading other lines
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
bool loadPropertiesFile(const std::string& filePath, std::map<std::string, std::string>& outProperties) {
|
|
return loadPropertiesFile(filePath, [&outProperties](const std::string& key, const std::string& value) {
|
|
outProperties[key] = value;
|
|
});
|
|
}
|
|
|
|
bool savePropertiesFile(const std::string& filePath, const std::map<std::string, std::string>& properties) {
|
|
bool result = false;
|
|
getLock(filePath)->withLock([&result, filePath, &properties] {
|
|
TT_LOG_I(TAG, "Saving properties file %s", filePath.c_str());
|
|
|
|
FILE* file = fopen(filePath.c_str(), "w");
|
|
if (file == nullptr) {
|
|
TT_LOG_E(TAG, "Failed to open %s", filePath.c_str());
|
|
return;
|
|
}
|
|
|
|
for (const auto& [key, value]: properties) { fprintf(file, "%s=%s\n", key.c_str(), value.c_str()); }
|
|
|
|
fclose(file);
|
|
result = true;
|
|
});
|
|
return result;
|
|
}
|
|
|
|
}
|