[HAL] Implemented basic persistent storage
This commit is contained in:
parent
d5ce384bda
commit
e486829b8f
4 changed files with 121 additions and 1 deletions
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
#if defined(RADIOLIB_BUILD_ARDUINO)
|
#if defined(RADIOLIB_BUILD_ARDUINO)
|
||||||
|
|
||||||
|
#include <EEPROM.h>
|
||||||
|
|
||||||
ArduinoHal::ArduinoHal(): RadioLibHal(INPUT, OUTPUT, LOW, HIGH, RISING, FALLING), spi(&RADIOLIB_DEFAULT_SPI), initInterface(true) {}
|
ArduinoHal::ArduinoHal(): RadioLibHal(INPUT, OUTPUT, LOW, HIGH, RISING, FALLING), spi(&RADIOLIB_DEFAULT_SPI), initInterface(true) {}
|
||||||
|
|
||||||
ArduinoHal::ArduinoHal(SPIClass& spi, SPISettings spiSettings): RadioLibHal(INPUT, OUTPUT, LOW, HIGH, RISING, FALLING), spi(&spi), spiSettings(spiSettings) {}
|
ArduinoHal::ArduinoHal(SPIClass& spi, SPISettings spiSettings): RadioLibHal(INPUT, OUTPUT, LOW, HIGH, RISING, FALLING), spi(&spi), spiSettings(spiSettings) {}
|
||||||
|
@ -98,6 +100,31 @@ void inline ArduinoHal::spiEnd() {
|
||||||
spi->end();
|
spi->end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ArduinoHal::readPersistentStorage(uint32_t addr, uint8_t* buff, size_t len) {
|
||||||
|
#if defined(ESP32)
|
||||||
|
EEPROM.begin(RADIOLIB_HAL_PERSISTENT_STORAGE_SIZE);
|
||||||
|
#endif
|
||||||
|
for(size_t i = 0; i < len; i++) {
|
||||||
|
buff[i] = EEPROM.read(addr + i);
|
||||||
|
}
|
||||||
|
#if defined(ESP32)
|
||||||
|
EEPROM.end();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void ArduinoHal::writePersistentStorage(uint32_t addr, uint8_t* buff, size_t len) {
|
||||||
|
#if defined(ESP32)
|
||||||
|
EEPROM.begin(RADIOLIB_HAL_PERSISTENT_STORAGE_SIZE);
|
||||||
|
#endif
|
||||||
|
for(size_t i = 0; i < len; i++) {
|
||||||
|
EEPROM.write(addr + i, buff[i]);
|
||||||
|
}
|
||||||
|
#if defined(ESP32)
|
||||||
|
EEPROM.commit();
|
||||||
|
EEPROM.end();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void inline ArduinoHal::tone(uint32_t pin, unsigned int frequency, unsigned long duration) {
|
void inline ArduinoHal::tone(uint32_t pin, unsigned int frequency, unsigned long duration) {
|
||||||
#if !defined(RADIOLIB_TONE_UNSUPPORTED)
|
#if !defined(RADIOLIB_TONE_UNSUPPORTED)
|
||||||
if(pin == RADIOLIB_NC) {
|
if(pin == RADIOLIB_NC) {
|
||||||
|
|
|
@ -51,6 +51,9 @@ class ArduinoHal : public RadioLibHal {
|
||||||
void spiEndTransaction() override;
|
void spiEndTransaction() override;
|
||||||
void spiEnd() override;
|
void spiEnd() override;
|
||||||
|
|
||||||
|
void readPersistentStorage(uint32_t addr, uint8_t* buff, size_t len) override;
|
||||||
|
void writePersistentStorage(uint32_t addr, uint8_t* buff, size_t len) override;
|
||||||
|
|
||||||
// implementations of virtual RadioLibHal methods
|
// implementations of virtual RadioLibHal methods
|
||||||
void init() override;
|
void init() override;
|
||||||
void term() override;
|
void term() override;
|
||||||
|
|
29
src/Hal.cpp
29
src/Hal.cpp
|
@ -33,3 +33,32 @@ void RadioLibHal::yield() {
|
||||||
uint32_t RadioLibHal::pinToInterrupt(uint32_t pin) {
|
uint32_t RadioLibHal::pinToInterrupt(uint32_t pin) {
|
||||||
return(pin);
|
return(pin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RadioLibHal::wipePersistentStorage() {
|
||||||
|
uint8_t dummy = 0;
|
||||||
|
for(size_t i = 0; i < RADIOLIB_HAL_PERSISTENT_STORAGE_SIZE; i++) {
|
||||||
|
this->writePersistentStorage(RADIOLIB_HAL_PERSISTENT_STORAGE_BASE + i, &dummy, sizeof(uint8_t));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
void RadioLibHal::setPersistentParameter(uint32_t id, T val) {
|
||||||
|
uint8_t *ptr = (uint8_t*)&val;
|
||||||
|
this->writePersistentStorage(RADIOLIB_HAL_PERSISTENT_STORAGE_BASE + RadioLibPersistentParamTable[id], ptr, sizeof(T));
|
||||||
|
}
|
||||||
|
|
||||||
|
template void RadioLibHal::setPersistentParameter(uint32_t id, uint8_t val);
|
||||||
|
template void RadioLibHal::setPersistentParameter(uint32_t id, uint16_t val);
|
||||||
|
template void RadioLibHal::setPersistentParameter(uint32_t id, uint32_t val);
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
T RadioLibHal::getPersistentParameter(uint32_t id) {
|
||||||
|
T val = 0;
|
||||||
|
uint8_t *ptr = (uint8_t*)&val;
|
||||||
|
this->readPersistentStorage(RADIOLIB_HAL_PERSISTENT_STORAGE_BASE + RadioLibPersistentParamTable[id], ptr, sizeof(T));
|
||||||
|
return(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
template uint8_t RadioLibHal::getPersistentParameter(uint32_t id);
|
||||||
|
template uint16_t RadioLibHal::getPersistentParameter(uint32_t id);
|
||||||
|
template uint32_t RadioLibHal::getPersistentParameter(uint32_t id);
|
||||||
|
|
63
src/Hal.h
63
src/Hal.h
|
@ -4,8 +4,27 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#include "BuildOpt.h"
|
||||||
|
|
||||||
|
// list of persistent parameters
|
||||||
|
#define RADIOLIB_PERSISTENT_PARAM_LORAWAN_DEV_NONCE_ID (0)
|
||||||
|
#define RADIOLIB_PERSISTENT_PARAM_LORAWAN_DEV_ADDR_ID (1)
|
||||||
|
#define RADIOLIB_PERSISTENT_PARAM_LORAWAN_FCNT_UP_ID (2)
|
||||||
|
#define RADIOLIB_PERSISTENT_PARAM_LORAWAN_FCNT_DOWN_ID (3)
|
||||||
|
|
||||||
|
static const uint32_t RadioLibPersistentParamTable[] = {
|
||||||
|
0x00, // RADIOLIB_PERSISTENT_PARAM_LORAWAN_DEV_NONCE_ID
|
||||||
|
0x02, // RADIOLIB_PERSISTENT_PARAM_LORAWAN_DEV_ADDR_ID
|
||||||
|
0x06, // RADIOLIB_PERSISTENT_PARAM_LORAWAN_FCNT_UP_ID
|
||||||
|
0x0A, // RADIOLIB_PERSISTENT_PARAM_LORAWAN_FCNT_DOWN_ID
|
||||||
|
};
|
||||||
|
|
||||||
|
// static assert to make sure that the persistent parameter table will fit to the allocated storage space
|
||||||
|
#define RADIOLIB_STATIC_ASSERT(test) typedef char radiolib_static_assert[( !!(test) )*2-1 ]
|
||||||
|
RADIOLIB_STATIC_ASSERT( sizeof(RadioLibPersistentParamTable) <= RADIOLIB_HAL_PERSISTENT_STORAGE_SIZE );
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\class Hal
|
\class RadioLibHal
|
||||||
\brief Hardware abstraction library base interface.
|
\brief Hardware abstraction library base interface.
|
||||||
*/
|
*/
|
||||||
class RadioLibHal {
|
class RadioLibHal {
|
||||||
|
@ -205,6 +224,48 @@ class RadioLibHal {
|
||||||
\returns The interrupt number of a given pin.
|
\returns The interrupt number of a given pin.
|
||||||
*/
|
*/
|
||||||
virtual uint32_t pinToInterrupt(uint32_t pin);
|
virtual uint32_t pinToInterrupt(uint32_t pin);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Method to read from persistent storage (e.g. EEPROM).
|
||||||
|
\param addr Address to start reading at.
|
||||||
|
\param buff Buffer to read into.
|
||||||
|
\param len Number of bytes to read.
|
||||||
|
*/
|
||||||
|
virtual void readPersistentStorage(uint32_t addr, uint8_t* buff, size_t len) = 0;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Method to write to persistent storage (e.g. EEPROM).
|
||||||
|
\param addr Address to start writing to.
|
||||||
|
\param buff Buffer to write.
|
||||||
|
\param len Number of bytes to write.
|
||||||
|
*/
|
||||||
|
virtual void writePersistentStorage(uint32_t addr, uint8_t* buff, size_t len) = 0;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Method to wipe the persistent storage by writing to 0.
|
||||||
|
Will write at most RADIOLIB_HAL_PERSISTENT_STORAGE_SIZE bytes.
|
||||||
|
*/
|
||||||
|
void wipePersistentStorage();
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Method to set arbitrary parameter to persistent storage.
|
||||||
|
This method DOES NOT perform any endianness conversion, so the value
|
||||||
|
will be stored in the system endian!
|
||||||
|
\param id Parameter ID to save at.
|
||||||
|
\param val Value to set.
|
||||||
|
*/
|
||||||
|
template<typename T>
|
||||||
|
void setPersistentParameter(uint32_t id, T val);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\brief Method to get arbitrary parameter from persistent storage.
|
||||||
|
This method DOES NOT perform any endianness conversion, so the value
|
||||||
|
will be retrieved in the system endian!
|
||||||
|
\param id Parameter ID to load from.
|
||||||
|
\returns The lodaded value.
|
||||||
|
*/
|
||||||
|
template<typename T>
|
||||||
|
T getPersistentParameter(uint32_t id);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue