Skip to content

Commit

Permalink
create parallel HID applications for USB and BLE
Browse files Browse the repository at this point in the history
  • Loading branch information
benedekkupper authored and kareltucek committed Jan 9, 2025
1 parent 5c07a46 commit fe16966
Show file tree
Hide file tree
Showing 21 changed files with 115 additions and 286 deletions.
1 change: 0 additions & 1 deletion device/src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ set(usb_cpp_sources
usb/command_app.cpp
usb/controls_app.cpp
usb/gamepad_app.cpp
usb/hid_battery_app.cpp
usb/keyboard_app.cpp
usb/mouse_app.cpp
usb/usb_compatibility.cpp
Expand Down
13 changes: 0 additions & 13 deletions device/src/bt_conn.c
Original file line number Diff line number Diff line change
Expand Up @@ -276,10 +276,6 @@ static void connectHid(struct bt_conn *conn, connection_id_t connectionId, conne

configureLatency(conn, LatencyMode_NUS);

#if DEVICE_IS_UHK80_RIGHT
USB_DisableHid();
#endif

// Assume that HOGP is ready
printf("Established HID connection with %s\n", GetPeerStringByConn(conn));
Connections_SetState(connectionId, ConnectionState_Ready);
Expand Down Expand Up @@ -416,9 +412,6 @@ static void connected(struct bt_conn *conn, uint8_t err) {
100 // connection timeout (*10ms)
);
bt_conn_le_param_update(conn, &conn_params);
#if DEVICE_IS_UHK80_RIGHT
USB_DisableHid();
#endif
}
if (connectionType == ConnectionType_Unknown) {
Expand Down Expand Up @@ -475,12 +468,6 @@ static void disconnected(struct bt_conn *conn, uint8_t reason) {
}

if (!BtPair_OobPairingInProgress && !BtManager_Restarting) {
if (DEVICE_IS_UHK80_RIGHT) {
if (connectionType == ConnectionType_BtHid) {
USB_EnableHid();
}
}

BtManager_StartScanningAndAdvertisingAsync();
}

Expand Down
4 changes: 0 additions & 4 deletions device/src/keyboard/charger.c
Original file line number Diff line number Diff line change
Expand Up @@ -126,10 +126,6 @@ void Charger_UpdateBatteryState() {

#ifdef CONFIG_BT_BAS
bt_bas_set_battery_level(batteryState.batteryPercentage);
#endif
#if DEVICE_HAS_BATTERY
extern void HID_SetBatteryStatus(uint8_t remaining_capacity, bool charging);
HID_SetBatteryStatus(batteryState.batteryPercentage, batteryState.batteryCharging);
#endif
}
}
Expand Down
2 changes: 1 addition & 1 deletion device/src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ int main(void) {
}
}

USB_EnableHid(); // has to be after USB_SetSerialNumber
USB_Enable(); // has to be after USB_SetSerialNumber

// has to be after InitSettings
BtManager_InitBt();
Expand Down
3 changes: 3 additions & 0 deletions device/src/usb/app_base.hpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
#ifndef __APP_BASE_HEADER__
#define __APP_BASE_HEADER__

extern "C" {
#include "device.h"
}
#include "hid/application.hpp"
#include "hid/rdf/descriptor.hpp"
#include "hid/report_protocol.hpp"
Expand Down
2 changes: 1 addition & 1 deletion device/src/usb/command_app.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ command_app &command_app::usb_handle()
}

#if DEVICE_IS_UHK80_RIGHT
command_app &command_app::handle()
command_app &command_app::ble_handle()
{
static command_app ble_app{};
return ble_app;
Expand Down
2 changes: 1 addition & 1 deletion device/src/usb/command_app.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ class command_app : public hid::application {

static command_app& usb_handle();
#if DEVICE_IS_UHK80_RIGHT
static command_app& handle();
static command_app& ble_handle();
#endif

void start(hid::protocol prot) override;
Expand Down
10 changes: 9 additions & 1 deletion device/src/usb/controls_app.cpp
Original file line number Diff line number Diff line change
@@ -1,11 +1,19 @@
#include "controls_app.hpp"

controls_app &controls_app::handle()
controls_app &controls_app::usb_handle()
{
static controls_app app{};
return app;
}

#if DEVICE_IS_UHK80_RIGHT
controls_app &controls_app::ble_handle()
{
static controls_app ble_app{};
return ble_app;
}
#endif

void controls_app::start(hid::protocol prot)
{
// TODO start handling controls events
Expand Down
7 changes: 5 additions & 2 deletions device/src/usb/controls_app.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,10 @@ class controls_app : public app_base {
// clang-format on
}

static controls_app &handle();
static controls_app &usb_handle();
#if DEVICE_IS_UHK80_RIGHT
static controls_app &ble_handle();
#endif

void set_report_state(const controls_report_base<0> &data);

Expand All @@ -82,7 +85,7 @@ class controls_app : public app_base {
void start(hid::protocol prot) override;

using controls_report = controls_report_base<report_ids::IN_CONTROLS>;
C2USB_USB_TRANSFER_ALIGN(controls_report, report_buffer_){};
C2USB_USB_TRANSFER_ALIGN(controls_report, report_buffer_) {};
};

using controls_buffer = controls_app::controls_report_base<0>;
Expand Down
9 changes: 8 additions & 1 deletion device/src/usb/gamepad_app.cpp
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
#include "gamepad_app.hpp"

gamepad_app &gamepad_app::handle()
gamepad_app &gamepad_app::usb_handle()
{
static gamepad_app app{};
return app;
}
#if DEVICE_IS_UHK80_RIGHT
gamepad_app &gamepad_app::ble_handle()
{
static gamepad_app ble_app{};
return ble_app;
}
#endif

void gamepad_app::start(hid::protocol prot)
{
Expand Down
5 changes: 4 additions & 1 deletion device/src/usb/gamepad_app.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,10 @@ class gamepad_app : public hid::application {
}
};

static gamepad_app &handle();
static gamepad_app &usb_handle();
#if DEVICE_IS_UHK80_RIGHT
static gamepad_app &ble_handle();
#endif

void set_report_state(const gamepad_report &data);

Expand Down
57 changes: 0 additions & 57 deletions device/src/usb/hid_battery_app.cpp

This file was deleted.

73 changes: 0 additions & 73 deletions device/src/usb/hid_battery_app.hpp

This file was deleted.

35 changes: 24 additions & 11 deletions device/src/usb/keyboard_app.cpp
Original file line number Diff line number Diff line change
@@ -1,15 +1,22 @@
#include "keyboard_app.hpp"
#include "zephyr/sys/printk.h"

extern "C" {
#include "usb/usb_compatibility.h"
#include "connections.h"
#include "usb_compatibility.h"
#include "zephyr/sys/printk.h"
}

keyboard_app &keyboard_app::handle()
keyboard_app &keyboard_app::usb_handle()
{
static keyboard_app app{};
return app;
}
#if DEVICE_IS_UHK80_RIGHT
keyboard_app &keyboard_app::ble_handle()
{
static keyboard_app ble_app{};
return ble_app;
}
#endif

void keyboard_app::set_rollover(rollover mode)
{
Expand Down Expand Up @@ -38,7 +45,10 @@ void keyboard_app::reset_keys()
}
}

extern void hidmgr_set_transport(const hid::transport *tp);
static inline connection_id_t usbHidConnId()
{
return DEVICE_IS_UHK80_LEFT ? ConnectionId_UsbHidLeft : ConnectionId_UsbHidRight;
}

void keyboard_app::start(hid::protocol prot)
{
Expand All @@ -51,14 +61,16 @@ void keyboard_app::start(hid::protocol prot)
// TODO start handling keyboard events
reset_keys();

hidmgr_set_transport(get_transport());
Connections_SetState(
(this == &usb_handle()) ? usbHidConnId() : ConnectionId_BtHid, ConnectionState_Ready);
}

void keyboard_app::stop()
{
sending_sem_.release();
// TODO stop handling keyboard events
hidmgr_set_transport(get_transport());
Connections_SetState((this == &usb_handle()) ? usbHidConnId() : ConnectionId_BtHid,
ConnectionState_Disconnected);
}

bool keyboard_app::using_nkro() const
Expand All @@ -82,15 +94,15 @@ void keyboard_app::set_report_state(const keys_nkro_report_base<> &data)
keys_6kro.modifiers = data.modifiers;
keys_6kro.scancodes.reset();
for (auto code = LOWEST_SCANCODE; code <= HIGHEST_SCANCODE;
code = static_cast<decltype(code)>(static_cast<uint8_t>(code) + 1)) {
code = static_cast<decltype(code)>(static_cast<uint8_t>(code) + 1)) {
keys_6kro.scancodes.set(code, data.test(code));
}
} else {
auto &keys_6kro = keys_.sixkro;
keys_6kro.modifiers = data.modifiers;
keys_6kro.scancodes.reset();
for (auto code = LOWEST_SCANCODE; code <= HIGHEST_SCANCODE;
code = static_cast<decltype(code)>(static_cast<uint8_t>(code) + 1)) {
code = static_cast<decltype(code)>(static_cast<uint8_t>(code) + 1)) {
keys_6kro.scancodes.set(code, data.test(code));
}
}
Expand Down Expand Up @@ -122,7 +134,7 @@ void keyboard_app::set_report_state(const keys_nkro_report_base<> &data)
keys_.sixkro.modifiers = data.modifiers;
keys_.sixkro.scancodes.reset();
for (auto code = LOWEST_SCANCODE; code <= HIGHEST_SCANCODE;
code = static_cast<decltype(code)>(static_cast<uint8_t>(code) + 1)) {
code = static_cast<decltype(code)>(static_cast<uint8_t>(code) + 1)) {
keys_.sixkro.scancodes.set(code, data.test(code));
}

Expand All @@ -149,7 +161,8 @@ void keyboard_app::set_report(hid::report::type type, const std::span<const uint
const uint8_t NumLockMask = 1;

UsbCompatibility_SetKeyboardLedsState(
leds & CapsLockMask, leds & NumLockMask, leds & ScrollLockMask);
(this == &usb_handle()) ? usbHidConnId() : ConnectionId_BtHid, leds & CapsLockMask,
leds & NumLockMask, leds & ScrollLockMask);

// always keep receiving new reports
// if the report data is processed immediately, the same buffer can be used
Expand Down
Loading

0 comments on commit fe16966

Please sign in to comment.