#pragma once #include #include "JsonCoordinateMapping.h" struct HardwareConfig { uint8_t version = 3; uint8_t checksum = 0; struct Data { char loadedProfile[16] = {0}; uint8_t lastRed = 255; uint8_t lastGreen = 255; uint8_t lastBlue = 255; char lastScene[16] = {0}; }; Data data; static HardwareConfig load(); void save(); bool isValid() const; static constexpr uint16_t MAX_LED_NUM = 255; private: uint8_t getCRC() const; static constexpr uint8_t CRC7_POLY = 0x91; }; // A task that manages the EEPROM settings and coord mapping when modified via // Particle. This allows for multiple devices with wildly different displays to // run the same code struct ConfigService: public Task { ConfigService() : Task("Configuration") {state = Task::Running;} void onStart(); void loop() override; void handleEvent(const InputEvent &evt) override; const CoordinateMapping* coordMap() const { return &m_jsonMap; } const char* loadedProfile() const; void overrideProfile(const char* profileName); const char* getConfigValue(const char* key) const; private: HardwareConfig m_config; JsonCoordinateMapping m_jsonMap; const char* m_overrideProfile = nullptr; void loadProfile(const char* name); void loadMap(const String& mapName); };