Merge pull request #1189 from keyboardio/plugin/persistent-led-mode-with-config

PersistentLEDMode: Add a Focus hook, and a way to disable the auto-save
pull/1191/head
Jesse Vincent 3 years ago committed by GitHub
commit 854f621703
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1,6 +1,6 @@
/* -*- mode: c++ -*- /* -*- mode: c++ -*-
* kaleidoscope::plugin::PersistentLEDMode -- Persist the current LED mode to Storage * kaleidoscope::plugin::PersistentLEDMode -- Persist the current LED mode to Storage
* Copyright (C) 2019 Keyboard.io, Inc. * Copyright (C) 2019-2022 Keyboard.io, Inc.
* Copyright (C) 2019 Dygma, Inc. * Copyright (C) 2019 Dygma, Inc.
* *
* This program is free software: you can redistribute it and/or modify it under * This program is free software: you can redistribute it and/or modify it under
@ -19,6 +19,7 @@
#include "kaleidoscope/plugin/PersistentLEDMode.h" #include "kaleidoscope/plugin/PersistentLEDMode.h"
#include <Kaleidoscope-EEPROM-Settings.h> // for EEPROMSettings #include <Kaleidoscope-EEPROM-Settings.h> // for EEPROMSettings
#include <Kaleidoscope-FocusSerial.h> // for Focus
#include <stdint.h> // for uint8_t, uint16_t #include <stdint.h> // for uint8_t, uint16_t
#include "kaleidoscope/Runtime.h" // for Runtime, Runtime_ #include "kaleidoscope/Runtime.h" // for Runtime, Runtime_
@ -30,32 +31,96 @@ namespace kaleidoscope {
namespace plugin { namespace plugin {
uint16_t PersistentLEDMode::settings_base_; uint16_t PersistentLEDMode::settings_base_;
uint8_t PersistentLEDMode::cached_mode_index_; struct PersistentLEDMode::settings PersistentLEDMode::settings_;
EventHandlerResult PersistentLEDMode::onSetup() { EventHandlerResult PersistentLEDMode::onSetup() {
settings_base_ = ::EEPROMSettings.requestSlice(sizeof(cached_mode_index_)); settings_base_ = ::EEPROMSettings.requestSlice(sizeof(settings_));
Runtime.storage().get(settings_base_, cached_mode_index_); Runtime.storage().get(settings_base_, settings_);
// If the index is max, assume an uninitialized EEPROM, and don't set the LED // If our slice is uninitialized, then return early, without touching the
// mode. We don't change the cached index here, `onLEDModeChange()` will do // current mode. We want auto_save by default, but because EEPROM is
// that whenever a led mode change happens. // uninitialized (0xff), that'll be set anyway, so we don't need to. This
if (cached_mode_index_ != 0xff) // saves us a storage commit.
if (Runtime.storage().isSliceUninitialized(settings_base_, sizeof(settings_)))
return EventHandlerResult::OK; return EventHandlerResult::OK;
::LEDControl.set_mode(cached_mode_index_); ::LEDControl.set_mode(settings_.default_mode_index);
return EventHandlerResult::OK; return EventHandlerResult::OK;
} }
EventHandlerResult PersistentLEDMode::onLEDModeChange() { EventHandlerResult PersistentLEDMode::onLEDModeChange() {
if (cached_mode_index_ == ::LEDControl.get_mode_index()) if (!settings_.auto_save)
return EventHandlerResult::OK; return EventHandlerResult::OK;
cached_mode_index_ = ::LEDControl.get_mode_index(); if (settings_.default_mode_index == ::LEDControl.get_mode_index())
Runtime.storage().put(settings_base_, cached_mode_index_); return EventHandlerResult::OK;
settings_.default_mode_index = ::LEDControl.get_mode_index();
Runtime.storage().put(settings_base_, settings_);
Runtime.storage().commit(); Runtime.storage().commit();
return EventHandlerResult::OK;
}
EventHandlerResult PersistentLEDMode::onFocusEvent(const char *command) {
enum {
AUTO_SAVE,
DEFAULT_MODE,
} sub_command;
if (::Focus.handleHelp(command, PSTR("led_mode.default\nled_mode.auto_save")))
return EventHandlerResult::OK; return EventHandlerResult::OK;
if (strncmp_P(command, PSTR("led_mode."), 9) != 0)
return EventHandlerResult::OK;
if (strcmp_P(command + 9, PSTR("default")) == 0)
sub_command = DEFAULT_MODE;
else if (strcmp_P(command + 9, PSTR("auto_save")) == 0)
sub_command = AUTO_SAVE;
else
return EventHandlerResult::OK;
switch (sub_command) {
case DEFAULT_MODE: {
if (::Focus.isEOL()) {
::Focus.send(settings_.default_mode_index);
} else {
uint8_t idx;
::Focus.read(idx);
settings_.default_mode_index = idx;
::LEDControl.set_mode(idx);
Runtime.storage().put(settings_base_, settings_);
Runtime.storage().commit();
}
break;
}
case AUTO_SAVE: {
if (::Focus.isEOL()) {
::Focus.send(settings_.auto_save);
} else {
uint8_t v;
::Focus.read(v);
setAutoSave(v != 0);
}
break;
}
}
return EventHandlerResult::EVENT_CONSUMED;
}
void PersistentLEDMode::setAutoSave(bool state) {
settings_.auto_save = state;
Runtime.storage().put(settings_base_, settings_);
Runtime.storage().commit();
}
EventHandlerResult PersistentLEDMode::onNameQuery() {
return ::Focus.sendName(F("PersistentLEDMode"));
} }
} // namespace plugin } // namespace plugin

@ -1,6 +1,6 @@
/* -*- mode: c++ -*- /* -*- mode: c++ -*-
* kaleidoscope::plugin::PersistentLEDMode -- Persist the current LED mode to Storage * kaleidoscope::plugin::PersistentLEDMode -- Persist the current LED mode to Storage
* Copyright (C) 2019 Keyboard.io, Inc. * Copyright (C) 2019-2022 Keyboard.io, Inc.
* Copyright (C) 2019 Dygma, Inc. * Copyright (C) 2019 Dygma, Inc.
* *
* This program is free software: you can redistribute it and/or modify it under * This program is free software: you can redistribute it and/or modify it under
@ -31,11 +31,21 @@ class PersistentLEDMode : public kaleidoscope::Plugin {
PersistentLEDMode() {} PersistentLEDMode() {}
EventHandlerResult onSetup(); EventHandlerResult onSetup();
EventHandlerResult onNameQuery();
EventHandlerResult onLEDModeChange(); EventHandlerResult onLEDModeChange();
EventHandlerResult onFocusEvent(const char *command);
void setAutoSave(bool state);
bool getAutoSave() {
return settings_.auto_save == 1;
}
private: private:
static uint16_t settings_base_; static uint16_t settings_base_;
static uint8_t cached_mode_index_; static struct settings {
uint8_t auto_save : 1;
uint8_t default_mode_index : 7;
} settings_;
}; };
} // namespace plugin } // namespace plugin

Loading…
Cancel
Save