2 changed files with 194 additions and 5 deletions
@ -0,0 +1,93 @@ |
|||
#include <stdio.h> |
|||
#include <string.h> |
|||
#include <esp_partition.h> |
|||
// Debug buffer size |
|||
#define DEBUG_BUFFER_SIZE 130 |
|||
#define DEBUG false |
|||
|
|||
struct nvs_entry { |
|||
uint8_t Ns; // Namespace ID |
|||
uint8_t Type; // Type of value |
|||
uint8_t Span; // Number of entries used for this item |
|||
uint8_t Rvs; // Reserved, should be 0xFF |
|||
uint32_t CRC; // CRC |
|||
char Key[16]; // Key in Ascii |
|||
uint64_t Data; // Data in entry |
|||
}; |
|||
|
|||
struct nvs_page { // For nvs entries |
|||
uint32_t State; |
|||
uint32_t Seqnr; |
|||
|
|||
uint32_t Unused[5]; |
|||
uint32_t CRC; |
|||
uint8_t Bitmap[32]; |
|||
nvs_entry Entry[126]; |
|||
}; |
|||
|
|||
// Common data |
|||
nvs_page buf; |
|||
|
|||
//************************************************************************************************** |
|||
// D B G P R I N T * |
|||
//************************************************************************************************** |
|||
// Send a line of info to serial output. Works like vsprintf(), but checks the DEBUG flag. * |
|||
// Print only if DEBUG flag is true. Always returns the formatted string. * |
|||
//************************************************************************************************** |
|||
char* dbgprint (const char* format, ...) { |
|||
static char sbuf[DEBUG_BUFFER_SIZE]; // For debug lines |
|||
va_list varArgs; // For variable number of params |
|||
|
|||
va_start (varArgs, format); // Prepare parameters |
|||
vsnprintf (sbuf, sizeof(sbuf), format, varArgs); // Format the message |
|||
va_end (varArgs); // End of using parameters |
|||
if (DEBUG) { // DEBUG on? |
|||
Serial.print ("D: "); // Yes, print prefix |
|||
Serial.println (sbuf); // and the info |
|||
} |
|||
return sbuf; // Return stored string |
|||
} |
|||
|
|||
|
|||
//************************************************************************************************** |
|||
// F I N D N S I D * |
|||
//************************************************************************************************** |
|||
// Find the namespace ID for the namespace passed as parameter. * |
|||
//************************************************************************************************** |
|||
uint8_t FindNsID (const esp_partition_t* nvs, const char* ns) { |
|||
esp_err_t result = ESP_OK; // Result of reading partition |
|||
uint32_t offset = 0; // Offset in nvs partition |
|||
uint8_t i; // Index in Entry 0..125 |
|||
uint8_t bm; // Bitmap for an entry |
|||
uint8_t res = 0xFF; // Function result |
|||
|
|||
|
|||
while (offset < nvs->size) { |
|||
result = esp_partition_read ( nvs, offset, // Read 1 page in nvs partition |
|||
&buf, |
|||
sizeof(nvs_page) ); |
|||
if (result != ESP_OK) { |
|||
dbgprint ("Error reading NVS!"); |
|||
break; |
|||
} |
|||
i=0; |
|||
while (i < 126) { |
|||
bm = (buf.Bitmap[i/4] >> ((i % 4) * 2)) & 0x03 ; // Get bitmap for this entry |
|||
if ((bm == 2) && |
|||
(buf.Entry[i].Ns == 0) && |
|||
(strcmp (ns, buf.Entry[i].Key) == 0)) { |
|||
res = buf.Entry[i].Data & 0xFF; // Return the ID |
|||
offset = nvs->size; // Stop outer loop as well |
|||
break; |
|||
} else { |
|||
if (bm == 2) { |
|||
i += buf.Entry[i].Span ; // Next entry |
|||
} else { |
|||
i++; |
|||
} |
|||
} |
|||
} |
|||
offset += sizeof(nvs_page); // Prepare to read next page in nvs |
|||
} |
|||
return res; |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue