11 #include <spdlog/spdlog.h>
15 #define READ_INTERVAL 20000
16 #define RESPONSES_AVG_CNT 200
35 std::unique_ptr<SPI>
my_spi =
nullptr;
44 void push_event(uint16_t scancode, uint8_t flags);
62 std::lock_guard<std::mutex> eq_guard(
eq_mutex);
86 int init(
const char* device, uint8_t mode, uint32_t speed, uint16_t delay, uint8_t bits_per_word) {
87 spi_config = std::unique_ptr<spi_config_t>(
new spi_config_t());
93 spdlog::info(
"keyboard.cpp - Initializing SPI keyboard (through parameters, enable debug to print config");
94 spdlog::debug(
"keyboard.cpp - SPI conf dev: {0}" , device);
95 spdlog::debug(
"keyboard.cpp - SPI conf mode: {0}" ,
spi_config->mode);
96 spdlog::debug(
"keyboard.cpp - SPI conf bits_p_w: {0}" ,
spi_config->bits_per_word);
97 spdlog::debug(
"keyboard.cpp - SPI conf speed: {0}" ,
spi_config->speed);
98 spdlog::debug(
"keyboard.cpp - SPI conf delay: {0}" ,
spi_config->delay);
103 spdlog::critical(
"keyboard.cpp - Failed to start SPI communication for keyboard");
107 spdlog::info(
"keyboard.cpp - Successfully initialized SPI keyboard");
118 spdlog::info(
"keyboard.cpp - Initializing SPI keyboard with config (enable debug to print config)");
119 spdlog::debug(
"keyboard.cpp - SPI conf dev: {0}" , config->
dev);
120 spdlog::debug(
"keyboard.cpp - SPI conf mode: {0}" , config->
config->mode);
121 spdlog::debug(
"keyboard.cpp - SPI conf bits_p_w: {0}", config->
config->bits_per_word);
122 spdlog::debug(
"keyboard.cpp - SPI conf speed: {0}" , config->
config->speed);
123 spdlog::debug(
"keyboard.cpp - SPI conf delay: {0}" , config->
config->delay);
125 my_spi = std::unique_ptr<SPI>(
new SPI(config->
dev.c_str(), config->
config.get()));
128 spdlog::critical(
"keyboard.cpp - Failed to start SPI communication for keyboard");
132 spdlog::info(
"keyboard.cpp - Successfully initialized SPI keyboard");
143 uint8_t rx_buffer[4] = {0};
144 uint8_t event_flags = 0;
146 uint16_t prev_scancode = 0, cur_scancode = 0;
147 std::chrono::time_point<std::chrono::high_resolution_clock> last_read;
150 spdlog::info(
"keyboard.cpp - Starting event capturing.");
153 prev_scancode = cur_scancode;
156 memset(rx_buffer, 0, 4);
157 my_spi->read(rx_buffer, 4);
161 if (prev_scancode != 0x0000 || cur_scancode != 0x0000) {
162 if (cur_scancode != 0x0000)
164 if (cur_scancode == prev_scancode)
167 std::chrono::time_point<std::chrono::high_resolution_clock> now =
168 std::chrono::high_resolution_clock::now();
169 unsigned long us_diff =
170 std::chrono::duration_cast<std::chrono::microseconds>(now - last_read).count();
171 unsigned long ms_diff = us_diff / 1000;
179 spdlog::info(
"event_keyboard.cpp - keyboard delay test: {0} ms ({1} us)", ms_diff, us_diff);
182 spdlog::warn(
"event_keyboard.cpp - avarage delay over {0} samples is: {1} ms ({2} us)",
195 if (cur_scancode == 0x0000)
210 spdlog::info(
"keyboard.cpp - Cleaning SPI keyboard");
217 std::lock_guard<std::mutex> kb_guard(
test_mtx);
223 std::lock_guard<std::mutex> kb_guard(
test_mtx);
241 key = (key | rx_buffer[1]) << 8;
253 std::lock_guard<std::mutex> eq_guard(
eq_mutex);
static std::unique_ptr< app_workspace > & get_instance()
Get the instance app_workspace which is a singleton.
#define RESPONSES_AVG_CNT
void clear_event_queue()
With this the event queue can be cleared but all events are discarded. This can be used if limiting t...
void push_event(uint16_t scancode, uint8_t flags)
Creates and pushes event into event_queue.
uint16_t buffer_to_keycode(const uint8_t *rx_buffer)
Concats keycode from rx_buffer into one (uint16_t) variable. rx_buffer is 4 bytes (this is assumed to...
void start_capturing_events()
Infinite loop that reads SPI keyboard. Runs in it's own thread!
void set_kb_testing_inner(bool val)
bool get_kb_testing_inner()
int init(const char *device, uint8_t mode, uint32_t speed, uint16_t delay, uint8_t bits_per_word)
Initializes spi_config and my_spi global variables and starts SPI.
std::unique_ptr< SPI > my_spi
std::queue< kb_event > event_queue
unsigned long responses_sum
void clean()
Stops event capturing and closes SPI.
std::unique_ptr< spi_config_t > spi_config
int init_from_conf()
Initializes my_spi with config loaded from config file into app_workspace. Starts SPI.
kb_event * poll_event()
Polls event from queue into param event Returns 1 on success because it is inteded to return "true" o...
Structure holding SPI device and SPI config which is a library structure "spi_config_t".
std::unique_ptr< spi_config_t > config
Structure of SPI keyboard event, Contains pressed scancode, flags and timestamp of event creation.