diff options
author | tomaszduda23 <[email protected]> | 2022-09-12 11:53:52 +0200 |
---|---|---|
committer | GitHub <[email protected]> | 2022-09-12 12:53:52 +0300 |
commit | 615863a84846a5a26e5505bdd5e0d63d3baee6e0 (patch) | |
tree | 7d3c8e672dd4356d5b6e3c480c77d284e2845ba7 /hid | |
parent | ce43938d2810fb0bf5d9c89116cf5fc2d02ca40c (diff) |
add SW reset (#107)
Diffstat (limited to 'hid')
-rw-r--r-- | hid/lib/drivers-avr/factory.cpp | 7 | ||||
-rw-r--r-- | hid/lib/drivers-stm32/board-stm32.h | 38 | ||||
-rw-r--r-- | hid/lib/drivers-stm32/factory.cpp | 11 | ||||
-rw-r--r-- | hid/lib/drivers/board.h | 32 | ||||
-rw-r--r-- | hid/lib/drivers/driver.h | 1 | ||||
-rw-r--r-- | hid/lib/drivers/factory.h | 2 | ||||
-rw-r--r-- | hid/src/main.cpp | 18 |
7 files changed, 106 insertions, 3 deletions
diff --git a/hid/lib/drivers-avr/factory.cpp b/hid/lib/drivers-avr/factory.cpp index 35100431..a4934673 100644 --- a/hid/lib/drivers-avr/factory.cpp +++ b/hid/lib/drivers-avr/factory.cpp @@ -73,4 +73,11 @@ namespace DRIVERS { } } + Board* Factory::makeBoard(type _type) { + switch (_type) { + default: + return new Board(DRIVERS::DUMMY); + } + } + } diff --git a/hid/lib/drivers-stm32/board-stm32.h b/hid/lib/drivers-stm32/board-stm32.h new file mode 100644 index 00000000..212106b3 --- /dev/null +++ b/hid/lib/drivers-stm32/board-stm32.h @@ -0,0 +1,38 @@ +/***************************************************************************** +# # +# KVMD - The main PiKVM daemon. # +# # +# Copyright (C) 2018-2022 Maxim Devaev <[email protected]> # +# # +# 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, either version 3 of the License, or # +# (at your option) any later version. # +# # +# 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 <https://www.gnu.org/licenses/>. # +# # +*****************************************************************************/ + + +#pragma once + +#include "board.h" + + +namespace DRIVERS { + class BoardStm32 : public Board { + public: + BoardStm32() : Board(BOARD){ + } + + void reset() override { + nvic_sys_reset(); + } + }; +} diff --git a/hid/lib/drivers-stm32/factory.cpp b/hid/lib/drivers-stm32/factory.cpp index e41da67d..247f388f 100644 --- a/hid/lib/drivers-stm32/factory.cpp +++ b/hid/lib/drivers-stm32/factory.cpp @@ -26,6 +26,7 @@ #include "usb/mouse-absolute-stm32.h" #include "usb/mouse-relative-stm32.h" #include "backup-register.h" +#include "board-stm32.h" #ifndef __STM32F1__ # error "Only STM32F1 is supported" @@ -72,4 +73,14 @@ namespace DRIVERS { return new Storage(DRIVERS::DUMMY); } } + + Board* Factory::makeBoard(type _type) { + switch (_type) { + case BOARD: + return new BoardStm32(); + default: + return new Board(DRIVERS::DUMMY); + } + } + } diff --git a/hid/lib/drivers/board.h b/hid/lib/drivers/board.h new file mode 100644 index 00000000..0dfd425c --- /dev/null +++ b/hid/lib/drivers/board.h @@ -0,0 +1,32 @@ +/***************************************************************************** +# # +# KVMD - The main PiKVM daemon. # +# # +# Copyright (C) 2018-2022 Maxim Devaev <[email protected]> # +# # +# 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, either version 3 of the License, or # +# (at your option) any later version. # +# # +# 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 <https://www.gnu.org/licenses/>. # +# # +*****************************************************************************/ + + +#pragma once + +#include "driver.h" + +namespace DRIVERS { + struct Board : public Driver { + using Driver::Driver; + virtual void reset() {} + }; +} diff --git a/hid/lib/drivers/driver.h b/hid/lib/drivers/driver.h index 046e19e0..8890c5ec 100644 --- a/hid/lib/drivers/driver.h +++ b/hid/lib/drivers/driver.h @@ -34,6 +34,7 @@ namespace DRIVERS { USB_KEYBOARD, PS2_KEYBOARD, NON_VOLATILE_STORAGE, + BOARD, }; class Driver { diff --git a/hid/lib/drivers/factory.h b/hid/lib/drivers/factory.h index 7dbafdd9..b82c4e14 100644 --- a/hid/lib/drivers/factory.h +++ b/hid/lib/drivers/factory.h @@ -24,6 +24,7 @@ #include "keyboard.h" #include "mouse.h" #include "storage.h" +#include "board.h" namespace DRIVERS { @@ -31,5 +32,6 @@ namespace DRIVERS { static Keyboard *makeKeyboard(type _type); static Mouse *makeMouse(type _type); static Storage* makeStorage(type _type); + static Board* makeBoard(type _type); }; } diff --git a/hid/src/main.cpp b/hid/src/main.cpp index 5e01c6ed..791ec3ad 100644 --- a/hid/src/main.cpp +++ b/hid/src/main.cpp @@ -41,27 +41,35 @@ #ifdef AUM # include "aum.h" #endif +#include "board.h" #include "outputs.h" - +static DRIVERS::Board* _board; static Outputs _out; #ifdef HID_DYNAMIC static bool _reset_required = false; +static unsigned long _reset_timestamp; +#define RESET_TIMEOUT (500000) #endif // ----------------------------------------------------------------------------- +static void _resetRequest() { + _reset_required = true; + _reset_timestamp = micros(); +} + static void _cmdSetKeyboard(const uint8_t *data) { // 1 bytes # ifdef HID_DYNAMIC _out.writeOutputs(PROTO::OUTPUTS1::KEYBOARD::MASK, data[0], false); - _reset_required = true; + _resetRequest(); # endif } static void _cmdSetMouse(const uint8_t *data) { // 1 bytes # ifdef HID_DYNAMIC _out.writeOutputs(PROTO::OUTPUTS1::MOUSE::MASK, data[0], false); - _reset_required = true; + _resetRequest(); # endif } @@ -150,6 +158,9 @@ static void _sendResponse(uint8_t code) { # ifdef HID_DYNAMIC if (_reset_required) { response[1] |= PROTO::PONG::RESET_REQUIRED; + if (is_micros_timed_out(_reset_timestamp, RESET_TIMEOUT)) { + _board->reset(); + } } response[2] = PROTO::OUTPUTS1::DYNAMIC; # endif @@ -221,6 +232,7 @@ void setup() { # elif defined(CMD_SPI) spiBegin(); # endif + _board = DRIVERS::Factory::makeBoard(DRIVERS::BOARD); } void loop() { |