diff options
author | tomaszduda23 <[email protected]> | 2022-07-11 11:59:56 +0900 |
---|---|---|
committer | GitHub <[email protected]> | 2022-07-11 05:59:56 +0300 |
commit | dc1bc121c89600e2d5a18458283aa5960aa39e24 (patch) | |
tree | 9c212046147cdea8a65973b3b0fd1405cbdeb5c4 /hid | |
parent | 89aff795fd7905aaf192428bb99814c13b98d5c2 (diff) |
add interface for storage (#99)
Diffstat (limited to 'hid')
-rw-r--r-- | hid/lib/drivers-avr/eeprom.h | 40 | ||||
-rw-r--r-- | hid/lib/drivers-avr/factory.cpp | 13 | ||||
-rw-r--r-- | hid/lib/drivers/driver.h | 1 | ||||
-rw-r--r-- | hid/lib/drivers/factory.h | 2 | ||||
-rw-r--r-- | hid/lib/drivers/storage.h | 34 | ||||
-rw-r--r-- | hid/src/main.cpp | 11 |
6 files changed, 95 insertions, 6 deletions
diff --git a/hid/lib/drivers-avr/eeprom.h b/hid/lib/drivers-avr/eeprom.h new file mode 100644 index 00000000..7868f03d --- /dev/null +++ b/hid/lib/drivers-avr/eeprom.h @@ -0,0 +1,40 @@ +/***************************************************************************** +# # +# 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/>. # +# # +*****************************************************************************/ + +#include "storage.h" +#ifdef HID_DYNAMIC +#include <avr/eeprom.h> +#endif + +namespace DRIVERS { + + struct Eeprom : public Storage { + using Storage::Storage; + + void read_block (void *_dst, const void *_src, size_t _n) override { + eeprom_read_block(_dst, _src, _n); + } + + void update_block (const void *_src, void *_dst, size_t _n) override { + eeprom_update_block(_src, _dst, _n); + } + }; +} diff --git a/hid/lib/drivers-avr/factory.cpp b/hid/lib/drivers-avr/factory.cpp index 26f10583..c6968777 100644 --- a/hid/lib/drivers-avr/factory.cpp +++ b/hid/lib/drivers-avr/factory.cpp @@ -23,6 +23,7 @@ #include "usb/hid.h" #include "ps2/hid.h" #include "factory.h" +#include "eeprom.h" namespace DRIVERS { @@ -56,4 +57,16 @@ namespace DRIVERS { return new Mouse(DRIVERS::DUMMY); } } + Storage* Factory::makeStorage(type _type) { + switch (_type) + { +# ifdef HID_DYNAMIC + case NON_VOLATILE_STORAGE: + return new Eeprom(DRIVERS::NON_VOLATILE_STORAGE); +# endif + default: + return new Storage(DRIVERS::DUMMY); + } + } + } diff --git a/hid/lib/drivers/driver.h b/hid/lib/drivers/driver.h index e720f7ac..046e19e0 100644 --- a/hid/lib/drivers/driver.h +++ b/hid/lib/drivers/driver.h @@ -33,6 +33,7 @@ namespace DRIVERS { USB_MOUSE_ABSOLUTE_WIN98, USB_KEYBOARD, PS2_KEYBOARD, + NON_VOLATILE_STORAGE, }; class Driver { diff --git a/hid/lib/drivers/factory.h b/hid/lib/drivers/factory.h index 0fb8e173..7dbafdd9 100644 --- a/hid/lib/drivers/factory.h +++ b/hid/lib/drivers/factory.h @@ -23,11 +23,13 @@ #include "keyboard.h" #include "mouse.h" +#include "storage.h" namespace DRIVERS { struct Factory { static Keyboard *makeKeyboard(type _type); static Mouse *makeMouse(type _type); + static Storage* makeStorage(type _type); }; } diff --git a/hid/lib/drivers/storage.h b/hid/lib/drivers/storage.h new file mode 100644 index 00000000..74c4f62a --- /dev/null +++ b/hid/lib/drivers/storage.h @@ -0,0 +1,34 @@ +/***************************************************************************** +# # +# 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 Storage : public Driver { + using Driver::Driver; + virtual void read_block (void *_dst, const void *_src, size_t _n) {} + virtual void update_block (const void *_src, void *_dst, size_t _n) {} + }; +} diff --git a/hid/src/main.cpp b/hid/src/main.cpp index f518fa25..99c533b3 100644 --- a/hid/src/main.cpp +++ b/hid/src/main.cpp @@ -32,9 +32,6 @@ #include <Arduino.h> -#ifdef HID_DYNAMIC -# include <avr/eeprom.h> -#endif #include "tools.h" #include "proto.h" @@ -49,14 +46,15 @@ // ----------------------------------------------------------------------------- static DRIVERS::Keyboard *_kbd = nullptr; -static DRIVERS::Mouse * _mouse = nullptr; +static DRIVERS::Mouse *_mouse = nullptr; #ifdef HID_DYNAMIC static bool _reset_required = false; +static DRIVERS::Storage *_storage = nullptr; static int _readOutputs(void) { uint8_t data[8]; - eeprom_read_block(data, 0, 8); + _storage->read_block(data, 0, 8); if (data[0] != PROTO::MAGIC || PROTO::crc16(data, 6) != PROTO::merge8(data[6], data[7])) { return -1; } @@ -75,13 +73,14 @@ static void _writeOutputs(uint8_t mask, uint8_t outputs, bool force) { data[0] = PROTO::MAGIC; data[1] = (old & ~mask) | outputs; PROTO::split16(PROTO::crc16(data, 6), &data[6], &data[7]); - eeprom_update_block(data, 0, 8); + _storage->read_block(data, 0, 8); } #endif static void _initOutputs() { int outputs; # ifdef HID_DYNAMIC + _storage = DRIVERS::Factory::makeStorage(DRIVERS::NON_VOLATILE_STORAGE); outputs = _readOutputs(); if (outputs < 0) { # endif |