parent
763499cbe0
commit
fbfd693f5d
@ -0,0 +1,115 @@ |
|||||||
|
/*
|
||||||
|
CreditMigrate.ino |
||||||
|
Copyright (c) 2019, Hieromon Ikasamo |
||||||
|
https://github.com/Hieromon/AutoConnect
|
||||||
|
This software is released under the MIT License. |
||||||
|
https://opensource.org/licenses/MIT
|
||||||
|
This sketch migrates the credentials past saved to EEPROM in ESP32 to |
||||||
|
Preferences. |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef ARDUINO_ARCH_ESP32 |
||||||
|
#error This sketch should be compiled with the board of ESP32. |
||||||
|
#endif |
||||||
|
|
||||||
|
#include <Arduino.h> |
||||||
|
#include <EEPROM.h> |
||||||
|
#include <esp_partition.h> |
||||||
|
#include <AutoConnectCredential.h> |
||||||
|
#include <string.h> |
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve saved credentials from eeprom partition. |
||||||
|
* @param size Returns a size of the eeprom partition |
||||||
|
* @return Retrieved data buffered pointer |
||||||
|
*/ |
||||||
|
uint8_t* retrievePartition(size_t *size) { |
||||||
|
const esp_partition_t* eeprom = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_ANY, "eeprom"); |
||||||
|
|
||||||
|
if (!eeprom) { |
||||||
|
Serial.println("EEPROM partition not found"); |
||||||
|
return nullptr; |
||||||
|
} |
||||||
|
uint8_t* pBuf = (uint8_t*)malloc(eeprom->size); |
||||||
|
if (!pBuf) { |
||||||
|
Serial.println("Insufficient memory to retrieve EEPROM partition"); |
||||||
|
return nullptr; |
||||||
|
} |
||||||
|
if (esp_partition_read(eeprom, 0, (void*)pBuf, eeprom->size) != ESP_OK) { |
||||||
|
Serial.println("Unable to read EEPROM partition"); |
||||||
|
free(pBuf); |
||||||
|
return nullptr; |
||||||
|
} |
||||||
|
*size = eeprom->size; |
||||||
|
return pBuf; |
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
* Write credentials in retrieved buffer to Preferences. |
||||||
|
* @param eeprom Retrieved data buffered pointer |
||||||
|
* @param size Retrieved data size |
||||||
|
*/ |
||||||
|
void convert(uint8_t* eeprom, size_t size) { |
||||||
|
uint8_t* ac_credt = (uint8_t*)strstr((const char*)eeprom, "AC_CREDT"); |
||||||
|
if (!ac_credt) |
||||||
|
Serial.println("AC_CREDT identifier not found in EEPROM partition."); |
||||||
|
else { |
||||||
|
AutoConnectCredential credential; |
||||||
|
uint8_t* bp = ac_credt + sizeof("AC_CREDT") - 1; |
||||||
|
uint8_t* dp = bp; |
||||||
|
uint8_t entries = *dp++; |
||||||
|
size_t dpSize = *dp++; |
||||||
|
dpSize += *dp++ << 8; |
||||||
|
Serial.printf("%d stored credential(s), size:%d\n", (int)entries, dpSize); |
||||||
|
|
||||||
|
// Start EEPROM to Preferences migration
|
||||||
|
uint8_t* ep = dp + dpSize - 1; |
||||||
|
for (int ec = 1; dp <= ep; ec++) { |
||||||
|
|
||||||
|
// Skip erased entry
|
||||||
|
while (*dp == 0xff) { |
||||||
|
if (++dp > ep) |
||||||
|
break; |
||||||
|
} |
||||||
|
if (dp > ep) // It reached at the end of the credential region.
|
||||||
|
break; |
||||||
|
|
||||||
|
// Obtain each entry and store to Preferences
|
||||||
|
struct station_config config; |
||||||
|
Serial.printf("[%d] ", ec); |
||||||
|
uint8_t ei = 0; |
||||||
|
do { |
||||||
|
config.ssid[ei++] = *dp;
|
||||||
|
} while (*dp++); |
||||||
|
Serial.print((char*)config.ssid); |
||||||
|
ei = 0; |
||||||
|
do { |
||||||
|
config.password[ei++] = *dp; |
||||||
|
} while (*dp++); |
||||||
|
Serial.printf("(%s)", config.password); |
||||||
|
for (ei = 0; ei < sizeof(config.bssid); ei++) { |
||||||
|
config.bssid[ei] = *dp++; |
||||||
|
Serial.printf(":%02x", config.bssid[ei]); |
||||||
|
} |
||||||
|
bool rc = credential.save(&config); |
||||||
|
Serial.println(rc ? " saved" : " failed to save"); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void setup() { |
||||||
|
delay(1000); |
||||||
|
Serial.begin(115200); |
||||||
|
Serial.println(); |
||||||
|
|
||||||
|
size_t eepromSize; |
||||||
|
uint8_t* eepromData = retrievePartition(&eepromSize); |
||||||
|
if (eepromData) { |
||||||
|
Serial.println("Start EEPROM migration to Preferences"); |
||||||
|
convert(eepromData, eepromSize); |
||||||
|
Serial.println("Conversion ended"); |
||||||
|
free(eepromData); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void loop() {} |
Loading…
Reference in new issue