This new plugin will allow MouseKeys to be configured via Focus, and store and retrieve its config parameters from EEPROM, enabling Chrysalis to control it. Signed-off-by: Michael Richters <gedankenexperimenter@gmail.com>master^2^2
parent
789cc218c6
commit
c84aa58470
@ -0,0 +1,144 @@
|
||||
/* -*- mode: c++ -*-
|
||||
* Kaleidoscope-MouseKeys -- Mouse keys for Kaleidoscope.
|
||||
* Copyright (C) 2022 Keyboard.io, Inc
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License as published by the Free Software
|
||||
* Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||
* details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "kaleidoscope/plugin/MouseKeys.h" // IWYU pragma: associated
|
||||
|
||||
#include <Arduino.h> // for PSTR, strcmp_P, strncmp_P
|
||||
#include <Kaleidoscope-EEPROM-Settings.h> // for EEPROMSettings
|
||||
#include <Kaleidoscope-FocusSerial.h> // for Focus, FocusSerial
|
||||
#include <stdint.h> // for uint16_t, uint32_t, uint8_t
|
||||
|
||||
#include "kaleidoscope/Runtime.h" // for Runtime, Runtime_
|
||||
#include "kaleidoscope/device/device.h" // for VirtualProps::Storage, Base<>::Storage
|
||||
#include "kaleidoscope/event_handler_result.h" // for EventHandlerResult, EventHandlerResult::OK
|
||||
|
||||
namespace kaleidoscope {
|
||||
namespace plugin {
|
||||
|
||||
// =============================================================================
|
||||
// MouseKeys configurator
|
||||
|
||||
EventHandlerResult MouseKeysConfig::onSetup() {
|
||||
settings_addr_ = ::EEPROMSettings.requestSlice(sizeof(MouseKeys::Settings));
|
||||
uint32_t checker;
|
||||
|
||||
Runtime.storage().get(settings_addr_, checker);
|
||||
|
||||
// If the EEPROM is empty, storre the default settings.
|
||||
if (checker == 0xffffffff) {
|
||||
Runtime.storage().put(settings_addr_, ::MouseKeys.settings_);
|
||||
Runtime.storage().commit();
|
||||
}
|
||||
|
||||
Runtime.storage().get(settings_addr_, ::MouseKeys.settings_);
|
||||
return EventHandlerResult::OK;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
EventHandlerResult MouseKeysConfig::onFocusEvent(const char *command) {
|
||||
// If the focus command is a request for help, provide the list of valid
|
||||
// commands.
|
||||
if (::Focus.handleHelp(command, PSTR("mousekeys.scroll_interval\n"
|
||||
"mousekeys.init_speed\n"
|
||||
"mousekeys.base_speed\n"
|
||||
"mousekeys.accel_duration")))
|
||||
return EventHandlerResult::OK;
|
||||
|
||||
// The length of the string `mousekeys.`:
|
||||
constexpr uint8_t base_cmd_len = 10;
|
||||
|
||||
// If this is not a MouseKeys command, do nothing.
|
||||
if (strncmp_P(command, PSTR("mousekeys."), base_cmd_len) != 0)
|
||||
return EventHandlerResult::OK;
|
||||
// Otherwise, advance the pointer to the subcommand.
|
||||
command += base_cmd_len;
|
||||
|
||||
enum Command : uint8_t {
|
||||
SCROLL_INTERVAL,
|
||||
INIT_SPEED,
|
||||
BASE_SPEED,
|
||||
ACCEL_DURATION,
|
||||
};
|
||||
Command cmd;
|
||||
|
||||
// Parse the (sub)command. If it's not a valid command, abort.
|
||||
if (strcmp_P(command, PSTR("scroll_interval")) == 0)
|
||||
cmd = Command::SCROLL_INTERVAL;
|
||||
else if (strcmp_P(command, PSTR("init_speed")) == 0)
|
||||
cmd = Command::INIT_SPEED;
|
||||
else if (strcmp_P(command, PSTR("base_speed")) == 0)
|
||||
cmd = Command::BASE_SPEED;
|
||||
else if (strcmp_P(command, PSTR("accel_duration")) == 0)
|
||||
cmd = Command::ACCEL_DURATION;
|
||||
else
|
||||
return EventHandlerResult::ABORT;
|
||||
|
||||
if (::Focus.isEOL()) {
|
||||
// If there is no argument given, we send back the current value of the
|
||||
// setting that was requested.
|
||||
uint16_t val;
|
||||
switch (cmd) {
|
||||
case Command::SCROLL_INTERVAL:
|
||||
val = ::MouseKeys.getScrollInterval();
|
||||
break;
|
||||
case Command::INIT_SPEED:
|
||||
val = ::MouseKeys.getCursorInitSpeed();
|
||||
break;
|
||||
case Command::BASE_SPEED:
|
||||
val = ::MouseKeys.getCursorBaseSpeed();
|
||||
break;
|
||||
case Command::ACCEL_DURATION:
|
||||
val = ::MouseKeys.getCursorAccelDuration();
|
||||
break;
|
||||
default:
|
||||
return EventHandlerResult::ABORT;
|
||||
}
|
||||
::Focus.send(val);
|
||||
return EventHandlerResult::EVENT_CONSUMED;
|
||||
} else {
|
||||
// If there is an argument, we read it, then pass it to the corresponding
|
||||
// setter method of MouseKeys.
|
||||
uint16_t arg;
|
||||
::Focus.read(arg);
|
||||
|
||||
switch (cmd) {
|
||||
case Command::SCROLL_INTERVAL:
|
||||
::MouseKeys.setScrollInterval(arg);
|
||||
break;
|
||||
case Command::INIT_SPEED:
|
||||
::MouseKeys.setCursorInitSpeed(arg);
|
||||
break;
|
||||
case Command::BASE_SPEED:
|
||||
::MouseKeys.setCursorBaseSpeed(arg);
|
||||
break;
|
||||
case Command::ACCEL_DURATION:
|
||||
::MouseKeys.setCursorAccelDuration(arg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Update settings stored in EEPROM, and indicate that this Focus event has
|
||||
// been handled successfully.
|
||||
Runtime.storage().put(settings_addr_, ::MouseKeys.settings_);
|
||||
Runtime.storage().commit();
|
||||
return EventHandlerResult::EVENT_CONSUMED;
|
||||
}
|
||||
|
||||
} // namespace plugin
|
||||
} // namespace kaleidoscope
|
||||
|
||||
kaleidoscope::plugin::MouseKeysConfig MouseKeysConfig;
|
Loading…
Reference in new issue