PokittoEEPROM.h
only implements the Arduino EEPROM wrapper,
I’m using avr/eeprom.h
which is something different:
https://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html
I’ve written some wrapper code for most of what I need:
#pragma once
#include <Pokitto.h>
#include <cstdint>
/*template< typename T >
T eeprom_read_T(const std::uint16_t * index)
{
T data;
readEEPROM(index, &data, sizeof(T));
return data;
}
template< typename T >
void eeprom_write_T(const std::uint16_t * index, const T & data)
{
writeEEPROM(index, &data, sizeof(T));
}*/
std::uint8_t eeprom_read_byte(const std::uint8_t * index)
{
std::uint8_t value;
readEEPROM((std::uint16_t *)index, (std::uint8_t *)&value, sizeof(std::uint8_t));
return value;
}
std::uint16_t eeprom_read_word(const std::uint16_t * index)
{
std::uint16_t value;
readEEPROM((std::uint16_t *)index, (std::uint8_t *)&value, sizeof(std::uint16_t));
return value;
}
std::uint32_t eeprom_read_dword(const std::uint32_t * index)
{
std::uint32_t value;
readEEPROM((std::uint16_t *)index, (std::uint8_t *)&value, sizeof(std::uint32_t));
return value;
}
float eeprom_read_float(const float * index)
{
float value;
readEEPROM((std::uint16_t *)index, (std::uint8_t *)&value, sizeof(float));
return value;
}
void eeprom_read_block(void * destination, const void * source, size_t count)
{
readEEPROM((std::uint16_t *)source, (std::uint8_t *)destination, count);
}
void eeprom_write_byte(std::uint8_t * index, std::uint8_t value)
{
writeEEPROM((std::uint16_t *)index, (std::uint8_t *)&value, sizeof(std::uint8_t));
}
void eeprom_write_word(std::uint16_t * index, std::uint16_t value)
{
writeEEPROM((std::uint16_t *)index, (std::uint8_t *)&value, sizeof(std::uint16_t));
}
void eeprom_write_dword(std::uint32_t * index, std::uint32_t value)
{
writeEEPROM((std::uint16_t *)index, (std::uint8_t *)&value, sizeof(std::uint32_t));
}
void eeprom_write_float(float * index, float value)
{
writeEEPROM((std::uint16_t *)index, (std::uint8_t *)&value, sizeof(float));
}
void eeprom_write_block(void * destination, const void * source, size_t count)
{
writeEEPROM((std::uint16_t *)source, (std::uint8_t *)destination, count);
}
void eeprom_update_byte(std::uint8_t * index, std::uint8_t value)
{
auto current = eeprom_read_byte((std::uint16_t *)index);
if(current != value)
writeEEPROM((std::uint16_t *)index, (std::uint8_t *)&value, sizeof(std::uint8_t));
}
void eeprom_update_word(std::uint16_t * index, std::uint16_t value)
{
auto current = eeprom_read_word((std::uint16_t *)index);
if(current != value)
writeEEPROM((std::uint16_t *)index, (std::uint8_t *)&value, sizeof(std::uint16_t));
}
void eeprom_update_dword(std::uint32_t * index, std::uint32_t value)
{
auto current = eeprom_read_dword((std::uint16_t *)index);
if(current != value)
writeEEPROM((std::uint16_t *)index, (std::uint8_t *)&value, sizeof(std::uint32_t));
}
void eeprom_update_float(float * index, float value)
{
auto current = eeprom_read_float((std::uint16_t *)index);
if(current != value)
writeEEPROM((std::uint16_t *)index, (std::uint8_t *)&value, sizeof(float));
}
void eeprom_update_block(void * destination, const void * source, size_t count)
{
writeEEPROM((std::uint16_t *)source, (std::uint8_t *)destination, count);
}