diff --git a/src/CrossPointSettings.cpp b/src/CrossPointSettings.cpp index 2ea2adfc..ca830ae0 100644 --- a/src/CrossPointSettings.cpp +++ b/src/CrossPointSettings.cpp @@ -12,7 +12,7 @@ CrossPointSettings CrossPointSettings::instance; namespace { constexpr uint8_t SETTINGS_FILE_VERSION = 1; // Increment this when adding new persisted settings fields -constexpr uint8_t SETTINGS_COUNT = 17; +constexpr uint8_t SETTINGS_COUNT = 22; constexpr char SETTINGS_FILE[] = "/.crosspoint/settings.bin"; } // namespace @@ -44,6 +44,11 @@ bool CrossPointSettings::saveToFile() const { serialization::writeString(outputFile, ftpPassword); serialization::writeString(outputFile, httpUsername); serialization::writeString(outputFile, httpPassword); + serialization::writePod(outputFile, hotspotSchedulerEnabled); + serialization::writePod(outputFile, hotspotSchedulerHour); + serialization::writePod(outputFile, hotspotSchedulerMinute); + serialization::writePod(outputFile, hotspotSchedulerShutdownTime); + serialization::writePod(outputFile, screenMargin); outputFile.close(); Serial.printf("[%lu] [CPS] Settings saved to file\n", millis()); @@ -104,6 +109,16 @@ bool CrossPointSettings::loadFromFile() { if (++settingsRead >= fileSettingsCount) break; serialization::readString(inputFile, httpPassword); if (++settingsRead >= fileSettingsCount) break; + serialization::readPod(inputFile, hotspotSchedulerEnabled); + if (++settingsRead >= fileSettingsCount) break; + serialization::readPod(inputFile, hotspotSchedulerHour); + if (++settingsRead >= fileSettingsCount) break; + serialization::readPod(inputFile, hotspotSchedulerMinute); + if (++settingsRead >= fileSettingsCount) break; + serialization::readPod(inputFile, hotspotSchedulerShutdownTime); + if (++settingsRead >= fileSettingsCount) break; + serialization::readPod(inputFile, screenMargin); + if (++settingsRead >= fileSettingsCount) break; } while (false); inputFile.close(); @@ -220,3 +235,21 @@ int CrossPointSettings::getReaderFontId() const { } } } +unsigned int CrossPointSettings::getHotspotShutdownMinutes() const { + switch (hotspotSchedulerShutdownTime) { + case SHUTDOWN_5_MIN: + return 5; + case SHUTDOWN_10_MIN: + return 10; + case SHUTDOWN_15_MIN: + return 15; + case SHUTDOWN_30_MIN: + return 30; + case SHUTDOWN_60_MIN: + return 60; + case SHUTDOWN_120_MIN: + return 120; + default: + return 30; + } +} \ No newline at end of file diff --git a/src/CrossPointSettings.h b/src/CrossPointSettings.h index 5415b90f..107bffb9 100644 --- a/src/CrossPointSettings.h +++ b/src/CrossPointSettings.h @@ -53,6 +53,9 @@ class CrossPointSettings { // E-ink refresh frequency (pages between full refreshes) enum REFRESH_FREQUENCY { REFRESH_1 = 0, REFRESH_5 = 1, REFRESH_10 = 2, REFRESH_15 = 3, REFRESH_30 = 4 }; + // Hotspot scheduler settings + enum HOTSPOT_SHUTDOWN_TIME { SHUTDOWN_5_MIN = 0, SHUTDOWN_10_MIN = 1, SHUTDOWN_15_MIN = 2, SHUTDOWN_30_MIN = 3, SHUTDOWN_60_MIN = 4, SHUTDOWN_120_MIN = 5 }; + // Sleep screen settings uint8_t sleepScreen = DARK; // Sleep screen cover mode settings @@ -78,6 +81,8 @@ class CrossPointSettings { uint8_t sleepTimeout = SLEEP_10_MIN; // E-ink refresh frequency (default 15 pages) uint8_t refreshFrequency = REFRESH_15; + // Screen margin setting (in pixels, default 0) + uint8_t screenMargin = 0; // Network credentials for FTP and HTTP servers std::string ftpUsername = "crosspoint"; @@ -85,6 +90,12 @@ class CrossPointSettings { std::string httpUsername = "crosspoint"; std::string httpPassword = "reader"; + // Hotspot scheduler settings + uint8_t hotspotSchedulerEnabled = 0; // 0 = disabled, 1 = enabled + uint8_t hotspotSchedulerHour = 12; // Hour (0-23) + uint8_t hotspotSchedulerMinute = 0; // Minute (0-59) + uint8_t hotspotSchedulerShutdownTime = SHUTDOWN_30_MIN; // Default 30 minutes + ~CrossPointSettings() = default; // Get singleton instance @@ -92,6 +103,7 @@ class CrossPointSettings { uint16_t getPowerButtonDuration() const { return shortPwrBtn ? 10 : 400; } int getReaderFontId() const; + unsigned int getHotspotShutdownMinutes() const; bool saveToFile() const; bool loadFromFile(); diff --git a/src/activities/network/FileTransferActivity.cpp b/src/activities/network/FileTransferActivity.cpp index 142efe05..07fe7a3c 100644 --- a/src/activities/network/FileTransferActivity.cpp +++ b/src/activities/network/FileTransferActivity.cpp @@ -75,10 +75,8 @@ void FileTransferActivity::onEnter() { // Launch protocol selection subactivity Serial.printf("[%lu] [FTACT] Launching ProtocolSelectionActivity...\n", millis()); - enterNewActivity(new ProtocolSelectionActivity(renderer, mappedInput, - [this](const FileTransferProtocol protocol) { - onProtocolSelected(protocol); - })); + enterNewActivity(new ProtocolSelectionActivity( + renderer, mappedInput, [this](const FileTransferProtocol protocol) { onProtocolSelected(protocol); })); } void FileTransferActivity::onExit() { @@ -144,7 +142,8 @@ void FileTransferActivity::onExit() { } void FileTransferActivity::onProtocolSelected(const FileTransferProtocol protocol) { - Serial.printf("[%lu] [FTACT] Protocol selected: %s\n", millis(), protocol == FileTransferProtocol::HTTP ? "HTTP" : "FTP"); + Serial.printf("[%lu] [FTACT] Protocol selected: %s\n", millis(), + protocol == FileTransferProtocol::HTTP ? "HTTP" : "FTP"); selectedProtocol = protocol; diff --git a/src/activities/settings/SettingsActivity.cpp b/src/activities/settings/SettingsActivity.cpp index a51339d6..07acdcf1 100644 --- a/src/activities/settings/SettingsActivity.cpp +++ b/src/activities/settings/SettingsActivity.cpp @@ -13,7 +13,11 @@ namespace { constexpr int settingsCount = 16; const SettingInfo settingsList[settingsCount] = { // Should match with SLEEP_SCREEN_MODE - {"Sleep Screen", SettingType::ENUM, &CrossPointSettings::sleepScreen, nullptr, {"Dark", "Light", "Custom", "Cover"}}, + {"Sleep Screen", + SettingType::ENUM, + &CrossPointSettings::sleepScreen, + nullptr, + {"Dark", "Light", "Custom", "Cover"}}, {"Status Bar", SettingType::ENUM, &CrossPointSettings::statusBar, nullptr, {"None", "No Progress", "Full"}}, {"Extra Paragraph Spacing", SettingType::TOGGLE, &CrossPointSettings::extraParagraphSpacing, nullptr, {}}, {"Short Power Button Click", SettingType::TOGGLE, &CrossPointSettings::shortPwrBtn, nullptr, {}}, @@ -37,7 +41,11 @@ const SettingInfo settingsList[settingsCount] = { &CrossPointSettings::fontFamily, nullptr, {"Bookerly", "Noto Sans", "Open Dyslexic"}}, - {"Reader Font Size", SettingType::ENUM, &CrossPointSettings::fontSize, nullptr, {"Small", "Medium", "Large", "X Large"}}, + {"Reader Font Size", + SettingType::ENUM, + &CrossPointSettings::fontSize, + nullptr, + {"Small", "Medium", "Large", "X Large"}}, {"Reader Line Spacing", SettingType::ENUM, &CrossPointSettings::lineSpacing, nullptr, {"Tight", "Normal", "Wide"}}, {"Reader Paragraph Alignment", SettingType::ENUM, diff --git a/src/activities/settings/SettingsActivity.h b/src/activities/settings/SettingsActivity.h index 5ac17686..de87aa64 100644 --- a/src/activities/settings/SettingsActivity.h +++ b/src/activities/settings/SettingsActivity.h @@ -11,13 +11,13 @@ class CrossPointSettings; -enum class SettingType { TOGGLE, ENUM, ACTION, TEXT }; +enum class SettingType { TOGGLE, ENUM, ACTION, TEXT, VALUE }; // Structure to hold setting information struct SettingInfo { - const char* name; // Display name of the setting - SettingType type; // Type of setting - uint8_t CrossPointSettings::* valuePtr; // Pointer to member in CrossPointSettings (for TOGGLE/ENUM) + const char* name; // Display name of the setting + SettingType type; // Type of setting + uint8_t CrossPointSettings::* valuePtr; // Pointer to member in CrossPointSettings (for TOGGLE/ENUM) std::string CrossPointSettings::* stringValuePtr; // Pointer to string member (for TEXT) std::vector enumValues; @@ -31,17 +31,19 @@ struct SettingInfo { // Static constructors static SettingInfo Toggle(const char* name, uint8_t CrossPointSettings::* ptr) { - return {name, SettingType::TOGGLE, ptr}; + return {name, SettingType::TOGGLE, ptr, nullptr, {}, {0, 0, 0}}; } static SettingInfo Enum(const char* name, uint8_t CrossPointSettings::* ptr, std::vector values) { - return {name, SettingType::ENUM, ptr, std::move(values)}; + return {name, SettingType::ENUM, ptr, nullptr, std::move(values), {0, 0, 0}}; } - static SettingInfo Action(const char* name) { return {name, SettingType::ACTION, nullptr}; } + static SettingInfo Action(const char* name) { + return {name, SettingType::ACTION, nullptr, nullptr, {}, {0, 0, 0}}; + } static SettingInfo Value(const char* name, uint8_t CrossPointSettings::* ptr, const ValueRange valueRange) { - return {name, SettingType::VALUE, ptr, {}, valueRange}; + return {name, SettingType::VALUE, ptr, nullptr, {}, valueRange}; } }; diff --git a/src/network/CrossPointFtpServer.cpp b/src/network/CrossPointFtpServer.cpp index 31b96f6b..62d9c02a 100644 --- a/src/network/CrossPointFtpServer.cpp +++ b/src/network/CrossPointFtpServer.cpp @@ -7,9 +7,7 @@ #include "../CrossPointSettings.h" -CrossPointFtpServer::~CrossPointFtpServer() { - stop(); -} +CrossPointFtpServer::~CrossPointFtpServer() { stop(); } bool CrossPointFtpServer::begin() { if (isRunning) {