keyboardio/Kaleidoscope-EEPROM-Settings

Name: Kaleidoscope-EEPROM-Settings

Owner: Keyboardio

Description: Basic EEPROM settings plugin for Kaleidoscope

Created: 2017-02-25 21:42:40.0

Updated: 2018-05-15 05:08:35.0

Pushed: 2018-05-15 05:08:36.0

Homepage: null

Size: 44

Language: C++

GitHub Committers

UserMost Recent Commit# Commits

Other Committers

UserEmailMost Recent Commit# Commits

README

Kaleidoscope-EEPROM-Settings

status Build Status

To be able to reliably store persistent configuration in EEPROM, we need to be able to split up the available space for plugins to use. We also want to make sure that we notice when the EEPROM contents and the firmware are out of sync. This plugin provides the tools to do that.

It does not guard against errors, it merely provides the means to discover them, and let the firmware Sketch handle the case in whatever way it finds reasonable. It's a building block, and not much else. All Kaleidoscope plugins that need to store data in EEPROM are encouraged to make use of this library.

Using the plugin

There are a few steps one needs to take to use the plugin: we must first register it, then either let other plugins request slices of EEPROM, or do so ourselves. And finally, seal it, to signal that we are done setting up. At that point, we can verify whether the contents of the EEPROM agree with our firmware.

lude <Kaleidoscope.h>
lude <Kaleidoscope-EEPROM-Settings.h>

ic uint16_t settingsBase;
ic struct {
ol someSettingFlag;
stSettings;

IDOSCOPE_INIT_PLUGINS(EEPROMSettings, /* Other plugins that use EEPROM... */);

 setup () {
leidoscope.setup();

ttingsBase = EEPROMSettings.requestSlice(sizeof(testSettings));

PROMSettings.seal();

 (!EEPROMSettings.isValid()) {
// Handle the case where the settings are out of sync...
// Flash LEDs, for example.

return;


PROM.get(settingsBase, testSettings);

Plugin methods

The plugin provides the EEPROMSettings object, which has the following methods:

requestSlice(size)

Requests a slice of the EEPROM, and returns the starting address (or 0 on error, including when the request arrived after sealing the layout).

Should only be called before calling seal().

seal()

Seal the EEPROM layout, so no new slices can be requested. The CRC checksum is considered final at this time, and the isValid(), crc(), used() and version() methods can be used from this point onwards.

update()

Updates the EEPROM header with the current status quo, including the version and the CRC checksum.

This should be called when upgrading from one version to another, or when fixing up an out-of-sync case.

isValid()

Returns whether the EEPROM header is valid, that is, if it has the expected CRC checksum.

Should only be called after calling seal().

invalidate()

Invalidates the EEPROM header. Use when the version does not match what the firmware would expect. This signals to other plugins that the contents of EEPROM should not be trusted.

version([newVersion])

Sets or returns the version of the EEPROM layout. This is purely for use by the firmware, so it can attempt to upgrade the contents, if need be, or alert the user in there's a mismatch. Plugins do not use this property.

Should only be called after calling seal().

crc()

Returns the CRC checksum of the layout. Should only be used after calling seal().

used()

Returns the amount of space requested so far.

Should only be used after calling seal().

Focus commands

The plugin provides two Focus hooks: FOCUS_HOOK_SETTINGS, and FOCUS_HOOK_EEPROM, that register commands that allow one to work with the settings, and with the contents of the EEPROM through Focus.

These provide the following Focus commands:

settings.crc

Returns the actual, and the expected checksum of the settings.

settings.valid?

Returns either true or false, depending on whether the sealed settings are to be considered valid or not.

settings.version

Returns the (user-set) version of the settings.

eeprom.contents

Without argument, displays the full contents of the EEPROM, including the settings header.

With arguments, the command updates as much of the EEPROM as arguments are provided. It will discard any unnecessary arguments.

eeprom.free

Returns the amount of free bytes in EEPROM.

Dependencies
Further reading

Starting from the example is the recommended way of getting started with the plugin.


This work is supported by the National Institutes of Health's National Center for Advancing Translational Sciences, Grant Number U24TR002306. This work is solely the responsibility of the creators and does not necessarily represent the official views of the National Institutes of Health.