The new plugin exposes some layer control functions over Focus, to be able to control layers from the host side. Fixes #780. Signed-off-by: Gergely Nagy <algernon@keyboard.io>pull/797/head
parent
01892f1262
commit
f18bcd35bb
@ -0,0 +1,46 @@
|
||||
# LayerFocus
|
||||
|
||||
The `LayerFocus` plugin exposes a number of layer-related commands via
|
||||
[Focus][plugin:focus], to allow controlling layers from the host side.
|
||||
|
||||
[plugin:focus]: FocusSerial.md
|
||||
|
||||
## Using the plugin
|
||||
|
||||
To use the plugin, we need to include the header, and let the firmware know we
|
||||
want to use it:
|
||||
|
||||
```c++
|
||||
#include <Kaleidoscope.h>
|
||||
#include <Kaleidoscope-FocusSerial.h>
|
||||
#include <Kaleidoscope-LayerFocus.h>
|
||||
|
||||
KALEIDOSCOPE_INIT_PLUGINS(
|
||||
Focus,
|
||||
LayerFocus
|
||||
);
|
||||
```
|
||||
|
||||
## Focus commands
|
||||
|
||||
The plugin provides the following Focus commands:
|
||||
|
||||
### `layer.activate N` / `layer.deactivate N` / `layer.isActive N`
|
||||
|
||||
> Activates, deactivates, or queries the state of layer `N`.
|
||||
|
||||
### `layer.moveTo N`
|
||||
|
||||
> Moves to layer `N`, deactivating all other layers in the process.
|
||||
|
||||
### `layer.state [STATE...]`
|
||||
|
||||
> Without arguments, display the state of all layers, from lower to higher. Each
|
||||
> active layer will be represented by `1`, while inactive layers will be
|
||||
> represented by `0`.
|
||||
>
|
||||
> With arguments, override the state of layers with the `STATE` given.
|
||||
|
||||
## Dependencies
|
||||
|
||||
* [Kaleidoscope-FocusSerial](FocusSerial.md)
|
@ -0,0 +1,21 @@
|
||||
/* -*- mode: c++ -*-
|
||||
* Kaleidoscope-LayerFocus -- Focus commands to work with layers
|
||||
* Copyright (C) 2020 Keyboard.io, Inc
|
||||
* Copyright (C) 2020 DygmaLab, SE.
|
||||
*
|
||||
* 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/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <kaleidoscope/plugin/LayerFocus.h>
|
@ -0,0 +1,83 @@
|
||||
/* -*- mode: c++ -*-
|
||||
* Kaleidoscope-LayerFocus -- Focus commands to work with layers
|
||||
* Copyright (C) 2020 Keyboard.io, Inc
|
||||
* Copyright (C) 2020 DygmaLab, SE.
|
||||
*
|
||||
* 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-LayerFocus.h"
|
||||
#include "Kaleidoscope-FocusSerial.h"
|
||||
|
||||
#include "kaleidoscope/layers.h"
|
||||
|
||||
namespace kaleidoscope {
|
||||
namespace plugin {
|
||||
|
||||
EventHandlerResult LayerFocus::onFocusEvent(const char *command) {
|
||||
if (::Focus.handleHelp(command, PSTR("layer.activate\nlayer.deactivate\nlayer.isActive"
|
||||
"\nlayer.moveTo\nlayer.state")))
|
||||
return EventHandlerResult::OK;
|
||||
|
||||
if (strncmp_P(command, PSTR("layer."), 6) != 0)
|
||||
return EventHandlerResult::OK;
|
||||
|
||||
if (strcmp_P(command + 6, PSTR("activate")) == 0) {
|
||||
if (!::Focus.isEOL()) {
|
||||
uint8_t layer;
|
||||
::Focus.read(layer);
|
||||
::Layer.activate(layer);
|
||||
}
|
||||
} else if (strcmp_P(command + 6, PSTR("deactivate")) == 0) {
|
||||
if (!::Focus.isEOL()) {
|
||||
uint8_t layer;
|
||||
::Focus.read(layer);
|
||||
::Layer.deactivate(layer);
|
||||
}
|
||||
} else if (strcmp_P(command + 6, PSTR("isActive")) == 0) {
|
||||
if (!::Focus.isEOL()) {
|
||||
uint8_t layer;
|
||||
::Focus.read(layer);
|
||||
::Focus.send(::Layer.isActive(layer));
|
||||
}
|
||||
} else if (strcmp_P(command + 6, PSTR("moveTo")) == 0) {
|
||||
if (!::Focus.isEOL()) {
|
||||
uint8_t layer;
|
||||
::Focus.read(layer);
|
||||
::Layer.move(layer);
|
||||
}
|
||||
} else if (strcmp_P(command + 6, PSTR("state")) == 0) {
|
||||
if (::Focus.isEOL()) {
|
||||
for (uint8_t i = 0; i < 32; i++) {
|
||||
::Focus.send(::Layer.isActive(i) ? 1 : 0);
|
||||
}
|
||||
} else {
|
||||
::Layer.move(0);
|
||||
::Layer.deactivate(0);
|
||||
|
||||
for (uint8_t i = 0; i < 32 && !::Focus.isEOL(); i++) {
|
||||
uint8_t b;
|
||||
::Focus.read(b);
|
||||
if (b)
|
||||
::Layer.activate(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return EventHandlerResult::EVENT_CONSUMED;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
kaleidoscope::plugin::LayerFocus LayerFocus;
|
@ -0,0 +1,36 @@
|
||||
/* -*- mode: c++ -*-
|
||||
* Kaleidoscope-LayerFocus -- Focus commands to work with layers
|
||||
* Copyright (C) 2020 Keyboard.io, Inc
|
||||
* Copyright (C) 2020 DygmaLab, SE.
|
||||
*
|
||||
* 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/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "kaleidoscope/Runtime.h"
|
||||
|
||||
namespace kaleidoscope {
|
||||
namespace plugin {
|
||||
|
||||
class LayerFocus: public kaleidoscope::Plugin {
|
||||
public:
|
||||
LayerFocus() {}
|
||||
|
||||
EventHandlerResult onFocusEvent(const char *command);
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
extern kaleidoscope::plugin::LayerFocus LayerFocus;
|
Loading…
Reference in new issue