ESP8266使用EERPOM保存配置

接上文的保存类定义如下

// 保存和读取配置
class CConfigMgr
{
    bool m_bMotify = false;
    String m_strSSID, m_strPSW;
    // 从EEPROM读取配置文件addr为保存配置文件地址
    bool Init()
    {
        /*
        uint16_t   uint16_t     content----------------------content---------
        magic_num  config_size  ssid psw other------------uint8_t--ssidsize ssid uint8_t--pswsize password
        */
        Serial.println("开始读取配置文件");
        uint16_t magic_num;
        EEPROM.begin(sizeof(magic_num));
        if (EEPROM.get(0, magic_num) != CONFIG_MAGIC_NUM)
        {
            Serial.println("非法的配置文件");
            return false;
        }
        // 正常的配置文件读取配置文件尺寸
        uint16_t config_size = 0;
        EEPROM.begin(sizeof(magic_num) * 2);
        EEPROM.get(sizeof(config_size), config_size);
        if (config_size > 0)
        {
            // 真实尺寸
            EEPROM.begin(sizeof(magic_num) * 2 + config_size);
            const uint8_t *pCur = EEPROM.getDataPtr();
            pCur += sizeof(magic_num) * 2;
            uint8_t stringsize = pCur[0];
            pCur++;
            if (stringsize > 0 && stringsize <= MAX_SSID_SIZE)
            {
                char *ssid = new char[stringsize + 1];
                m_strSSID.reserve(stringsize);
                memcpy(ssid, pCur, stringsize);
                ssid[stringsize] = '\0';
                m_strSSID = ssid;
                delete[] ssid;

                pCur += stringsize;
                Serial.print("ssid:");
                Serial.print(stringsize);
                Serial.print("------");
                Serial.println(m_strSSID);
            }
            stringsize = pCur[0];
            pCur++;
            if (stringsize > 0 && stringsize <= MAX_PSW_SIZE)
            {
                char *psw = new char[stringsize + 1];
                memcpy(psw, pCur, stringsize);
                psw[stringsize] = '\0';
                m_strPSW = psw;
                delete[] psw;

                Serial.print("psw:");
                Serial.print(stringsize);
                Serial.print("------");
                Serial.println(m_strPSW);
            }
            return true;
        }
        return false;
    }

public:
    CConfigMgr()
    {
        Init();
    }
    ~CConfigMgr()
    {
        if (m_bMotify)
        {
            SaveConfig();
        }
    }

    void SaveConfig()
    {
        uint16_t needsize = 0;
        needsize += 2; // 两个uint8_t的尺寸
        needsize += m_strSSID.length() + m_strPSW.length();
        uint16_t magic_num = CONFIG_MAGIC_NUM;
        EEPROM.begin(sizeof(magic_num) * 2 + needsize);
        EEPROM.put(0, magic_num);
        EEPROM.put(sizeof(uint16_t), needsize);

        uint8_t *pCur = EEPROM.getDataPtr();
        pCur += sizeof(magic_num) * 2;

        pCur[0] = (uint8_t)m_strSSID.length();
        pCur++;
        memcpy(pCur, m_strSSID.begin(), m_strSSID.length());
        pCur += m_strSSID.length();

        pCur[0] = (uint8_t)m_strPSW.length();
        pCur++;
        memcpy(pCur, m_strPSW.begin(), m_strPSW.length());

        EEPROM.end();
    }

    void SetSSID(const char *SSID)
    {
        if (SSID)
        {
            m_strSSID = SSID;
        }
        else
        {
            m_strSSID.clear();
        }
        m_bMotify = true;
    }

    void SetPSW(const char *PSW)
    {
        if (PSW)
        {
            m_strPSW = PSW;
        }
        else
        {
            m_strPSW.clear();
        }
        m_bMotify = true;
    }

    const String &SSID()
    {
        return m_strSSID;
    }

    const String &PSW()
    {
        return m_strPSW;
    }
    bool IsValid()
    {
        return !(m_strSSID.isEmpty() || m_strPSW.isEmpty());
    }

private:
};

当然这是完全硬解,主要是说明其用法,这里只保存了两个数据SSID和密码。这里可以参见这个方法把它做成更通用方法。

你可能感兴趣的:(ESP01S,arduino,c++,esp8266)