diff options
author | tomaszduda23 <[email protected]> | 2023-03-04 18:25:16 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2023-03-04 20:25:16 +0300 |
commit | 52ac8d93a18521f19dc45e9b4283417ed06f63d8 (patch) | |
tree | caf95bfe17db38067891d4ed958cdffe50ef4459 /hid/lib/drivers-avr | |
parent | 1f9e826f2fa9e27c705146254cf3597f531f0599 (diff) |
adds abstraction for connection (#111)
Diffstat (limited to 'hid/lib/drivers-avr')
-rw-r--r-- | hid/lib/drivers-avr/factory.cpp | 16 | ||||
-rw-r--r-- | hid/lib/drivers-avr/spi.cpp | 36 | ||||
-rw-r--r-- | hid/lib/drivers-avr/spi.h | 38 |
3 files changed, 70 insertions, 20 deletions
diff --git a/hid/lib/drivers-avr/factory.cpp b/hid/lib/drivers-avr/factory.cpp index b4c18273..3fc02582 100644 --- a/hid/lib/drivers-avr/factory.cpp +++ b/hid/lib/drivers-avr/factory.cpp @@ -24,6 +24,8 @@ #include "ps2/hid.h" #include "factory.h" #include "eeprom.h" +#include "serial.h" +#include "spi.h" #ifndef ARDUINO_ARCH_AVR # error "Only AVR is supported" @@ -70,13 +72,23 @@ namespace DRIVERS { # endif default: return new Storage(DRIVERS::DUMMY); - } + } } Board* Factory::makeBoard(type _type) { switch (_type) { default: return new Board(DRIVERS::DUMMY); - } + } + } + + Connection* Factory::makeConnection(type _type) { +# ifdef CMD_SERIAL + return new Serial(); +# elif defined(CMD_SPI) + return new Spi(); +# else +# error CMD phy is not defined +# endif } } diff --git a/hid/lib/drivers-avr/spi.cpp b/hid/lib/drivers-avr/spi.cpp index 66061692..ae54f545 100644 --- a/hid/lib/drivers-avr/spi.cpp +++ b/hid/lib/drivers-avr/spi.cpp @@ -21,7 +21,8 @@ #include "spi.h" - +#ifdef CMD_SPI +#include <SPI.h> static volatile uint8_t _spi_in[8] = {0}; static volatile uint8_t _spi_in_index = 0; @@ -29,28 +30,26 @@ static volatile uint8_t _spi_in_index = 0; static volatile uint8_t _spi_out[8] = {0}; static volatile uint8_t _spi_out_index = 0; +namespace DRIVERS { + void Spi::begin() { + pinMode(MISO, OUTPUT); + SPCR = (1 << SPE) | (1 << SPIE); // Slave, SPI En, IRQ En + } -void spiBegin() { - pinMode(MISO, OUTPUT); - SPCR = (1 << SPE) | (1 << SPIE); // Slave, SPI En, IRQ En -} - -bool spiReady() { - return (!_spi_out[0] && _spi_in_index == 8); -} - -const uint8_t *spiGet() { - return (const uint8_t *)_spi_in; -} + void Spi::periodic() { + if (!_spi_out[0] && _spi_in_index == 8) { + _data_cb((const uint8_t *)_spi_in, 8); + } + } -void spiWrite(const uint8_t *data) { - // Меджик в нулевом байте разрешает начать ответ - for (int index = 7; index >= 0; --index) { - _spi_out[index] = data[index]; + void Spi::write(const uint8_t *data, size_t size) { + // Меджик в нулевом байте разрешает начать ответ + for (int index = 7; index >= 0; --index) { + _spi_out[index] = data[index]; + } } } - ISR(SPI_STC_vect) { uint8_t in = SPDR; if (_spi_out[0] && _spi_out_index < 8) { @@ -78,3 +77,4 @@ ISR(SPI_STC_vect) { SPDR = 0; } } +#endif diff --git a/hid/lib/drivers-avr/spi.h b/hid/lib/drivers-avr/spi.h new file mode 100644 index 00000000..4fb43d89 --- /dev/null +++ b/hid/lib/drivers-avr/spi.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 <Arduino.h> +#include "connection.h" + +namespace DRIVERS { + struct Spi : public Connection { + Spi() : Connection(CONNECTION) {} + + void begin() override; + + void periodic() override; + + void write(const uint8_t *data, size_t size) override; + }; +} |