This is a quick hack if what I had in mind with templated functions
start by running this once on a UNO to establish EEPROM values for addresses between 10 and 21 #include <EEPROM.h>
void setup() {
const uint32_t v1 = 0xDEADBEEF;
const uint32_t v2 = 0xBADCAFFE;
const uint32_t v3 = 0xFEE4ABED;
// do this once to establish EEPROM values
EEPROM.put(10, v1);
EEPROM.put(14, v2);
EEPROM.put(18, v3);
}
void loop() {}
then run this code
// -------------------------------------------------
// TEMPLATE DECLARATION
// -------------------------------------------------
#include <EEPROM.h>
template<typename T>
int memcmp_E(const T* source, int eeprom_start, size_t len )
{
int result = 0;
uint8_t sample[sizeof(T)];
int eeAddress = eeprom_start;
for (size_t i = 0; i < len * sizeof(T); i += sizeof(T)) {
EEPROM.get( eeAddress + i, sample);
Serial.print(F("Reading EEPROM @ address:")); Serial.print((int) eeAddress + i); Serial.print(F("\t0x"));
for (int j = sizeof(T) - 1; j >= 0 ; --j) {
Serial.print(sample[j], HEX);
}
Serial.println();
result = memcmp ( ((uint8_t *) source) + i, (uint8_t *) sample, sizeof(T) );
if (result) break;
}
return result;
}
// teach the compiler about byte or unsigned long comparisons
template int memcmp_E<>(const uint8_t*, int, size_t);
template int memcmp_E<>(const uint32_t*, int, size_t);
// -------------------------------------------------
const uint32_t v1 = 0xDEADBEEF;
const uint32_t v2 = 0xBADCAFFE;
const uint32_t v3 = 0xFEE4ABED;
uint8_t aByte = 0xEF;
uint8_t aBadByte = 0xFE;
uint8_t aByteArray[] = {0xEF, 0xBE, 0xAD, 0xDE}; // because of LITTLE ENDIAN architecture
const size_t nbItemsInaByteArray = sizeof(aByteArray) / sizeof(aByteArray[0]);
uint32_t anUnsignedLongArray[] = {v1, v2, v3};
const size_t nbItemsInanUnsignedLongArray = sizeof(anUnsignedLongArray) / sizeof(anUnsignedLongArray[0]);
uint32_t aBadUnsignedLongArray[] = {v1, v3};
const size_t nbItemsInaBadUnsignedLongArray = sizeof(aBadUnsignedLongArray) / sizeof(aBadUnsignedLongArray[0]);
void setup() {
Serial.begin(115200);
if (!memcmp_E(&aByte, 10, 1)) Serial.println(F("test on aByte OK")); else Serial.println(F("test on aByte NOT OK"));
Serial.println();
if (!memcmp_E(&aBadByte, 10, 1)) Serial.println(F("test on aBadByte OK")); else Serial.println(F("test on aBadByte NOT OK"));
Serial.println();
if (!memcmp_E(aByteArray, 10, nbItemsInaByteArray)) Serial.println(F("test on aByteArray OK")); else Serial.println(F("test on aByteArray NOT OK"));
Serial.println();
if (!memcmp_E(anUnsignedLongArray, 10, nbItemsInanUnsignedLongArray)) Serial.println(F("test on anUnsignedLongArray OK")); else Serial.println(F("test on anUnsignedLongArray NOT OK"));
Serial.println();
if (!memcmp_E(aBadUnsignedLongArray, 10, nbItemsInaBadUnsignedLongArray)) Serial.println(F("test on aBadUnsignedLongArray OK")); else Serial.println(F("test on aBadUnsignedLongArray NOT OK"));
}
void loop() {}
You should see this in the Serial Console:
Reading EEPROM @ address:10 0xEF
test on aByte OK
Reading EEPROM @ address:10 0xEF
test on aBadByte NOT OK
Reading EEPROM @ address:10 0xEF
Reading EEPROM @ address:11 0xBE
Reading EEPROM @ address:12 0xAD
Reading EEPROM @ address:13 0xDE
test on aByteArray OK
Reading EEPROM @ address:10 0xDEADBEEF
Reading EEPROM @ address:14 0xBADCAFFE
Reading EEPROM @ address:18 0xFEE4ABED
test on anUnsignedLongArray OK
Reading EEPROM @ address:10 0xDEADBEEF
Reading EEPROM @ address:14 0xBADCAFFE
test on aBadUnsignedLongArray NOT OK