Skip to content

Commit 2d24af8

Browse files
committed
bugfixes for allowing parallel HOGP connections
1 parent a91d3b5 commit 2d24af8

11 files changed

Lines changed: 41 additions & 28 deletions

File tree

right/src/hid/ble_app.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class ble_session : public keyboard_base_session {
1313
using mouse_report = mouse_app::mouse_report_base<report_ids::IN_MOUSE>;
1414
using controls_report = controls_app::controls_report_base<report_ids::IN_CONTROLS>;
1515

16-
ble_session()
16+
ble_session(const hid::session::params &params) : keyboard_base_session(params)
1717
{
1818
receive_report(&resolution_buffer_);
1919
receive_report(&out_buffer_);
@@ -56,6 +56,6 @@ class ble_app : public hid::application {
5656
private:
5757
ble_app(const hid::report_protocol &rp) : hid::application(rp) {}
5858

59-
hid::session &start(const hid::session_params &params) override;
59+
hid::session &start(const hid::session::params &params) override;
6060
void stop(hid::session &sess) override;
6161
};

right/src/hid/command_app.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
#include <zephyr/sys/printk.h>
66
#endif
77

8-
hid::session &command_app::start(const hid::session_params &params)
8+
hid::session &command_app::start(const hid::session::params &params)
99
{
1010
assert(!session_.has_value());
11-
return session_.emplace();
11+
return session_.emplace(params);
1212
}
1313

1414
void command_app::stop(hid::session &sess)

right/src/hid/command_app.hpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,10 @@ class command_session : public hid::session {
3434
using report_in = report_base<hid::report::type::INPUT, report_ids::IN_COMMAND>;
3535
using report_out = report_base<hid::report::type::OUTPUT, report_ids::OUT_COMMAND>;
3636

37-
command_session() { receive_report(&out_buffer_); }
37+
command_session(const hid::session::params &params) : hid::session(params)
38+
{
39+
receive_report(&out_buffer_);
40+
}
3841

3942
private:
4043
C2USB_USB_TRANSFER_ALIGN(report_in, in_buffer_) {};
@@ -88,6 +91,6 @@ class command_app : public hid::application {
8891
std::optional<command_session> session_{};
8992

9093
command_app() : application(report_protocol()) {}
91-
hid::session &start(const hid::session_params &params) override;
94+
hid::session &start(const hid::session::params &params) override;
9295
void stop(hid::session &sess) override;
9396
};

right/src/hid/controls_app.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
#include "controls_app.hpp"
22

3-
hid::session &controls_app::start(const hid::session_params &params)
3+
hid::session &controls_app::start(const hid::session::params &params)
44
{
55
assert(!session_.has_value());
6-
auto &sess = session_.emplace();
6+
auto &sess = session_.emplace(params);
77
return sess;
88
}
99

right/src/hid/controls_app.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ using consumer_code = hid::page::consumer;
1717

1818
class controls_session : public hid::session {
1919
public:
20-
controls_session() = default;
20+
using hid::session::session;
2121

2222
protected:
2323
void report_sent(const std::span<const uint8_t> &data) override;
@@ -91,7 +91,7 @@ class controls_app : public hid::application {
9191
private:
9292
controls_app() : hid::application(hid::report_protocol::from_descriptor<report_desc()>()) {}
9393

94-
hid::session &start(const hid::session_params &params) override;
94+
hid::session &start(const hid::session::params &params) override;
9595
void stop(hid::session &sess) override;
9696

9797
std::optional<controls_session> session_{};

right/src/hid/keyboard_app.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ void keyboard_app::set_rollover(rollover_t mode)
1515
mode == rollover_t::ROLLOVER_N_KEY ? nkro_report_protocol() : default_report_protocol();
1616
}
1717

18-
hid::session &keyboard_app::start(const hid::session_params &params)
18+
hid::session &keyboard_app::start(const hid::session::params &params)
1919
{
2020
assert(!session_.has_value());
21-
return session_.emplace();
21+
return session_.emplace(params);
2222
}
2323

2424
void keyboard_app::stop(hid::session &sess)

right/src/hid/keyboard_app.hpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ using scancode = hid::page::keyboard_keypad;
1313

1414
class keyboard_base_session : public hid::session {
1515
public:
16+
using hid::session::session;
1617
using leds_boot_report = hid::app::keyboard::output_report<0>;
1718
using leds_report = hid::app::keyboard::output_report<report_ids::OUT_KEYBOARD_LEDS>;
1819
virtual leds_boot_report get_leds_report() const = 0;
@@ -27,7 +28,10 @@ class keyboard_session : public keyboard_base_session {
2728
void set_report(hid::report::type type, const std::span<const uint8_t> &data) override;
2829

2930
public:
30-
keyboard_session() { receive_report(&leds_buffer_); }
31+
keyboard_session(const hid::session::params &params) : keyboard_base_session(params)
32+
{
33+
receive_report(&leds_buffer_);
34+
}
3135

3236
leds_boot_report get_leds_report() const override;
3337
};
@@ -181,7 +185,7 @@ class keyboard_app : public hid::application {
181185
std::optional<keyboard_session> session_{};
182186

183187
keyboard_app(const hid::report_protocol &rp) : hid::application(rp) {}
184-
hid::session &start(const hid::session_params &params) override;
188+
hid::session &start(const hid::session::params &params) override;
185189
void stop(hid::session &sess) override;
186190
};
187191

right/src/hid/mouse_app.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
using mouse_report = mouse_app::mouse_report_base<report_ids::IN_MOUSE>;
44

5-
hid::session &mouse_app::start(const hid::session_params &params)
5+
hid::session &mouse_app::start(const hid::session::params &params)
66
{
77
assert(!session_.has_value());
8-
auto &sess = session_.emplace();
8+
auto &sess = session_.emplace(params);
99
mouse_resolution_changed_callback(sess, sess.resolution_report());
1010
return sess;
1111
}

right/src/hid/mouse_app.hpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ class mouse_session : public hid::session {
1717
hid::app::mouse::resolution_multiplier_report<MAX_SCROLL_RESOLUTION,
1818
report_ids::FEATURE_MOUSE>;
1919

20-
mouse_session() { receive_report(&resolution_buffer_); }
20+
mouse_session(const hid::session::params &params) : hid::session(params)
21+
{
22+
receive_report(&resolution_buffer_);
23+
}
2124

2225
const auto &resolution_report() const { return resolution_buffer_; }
2326

@@ -97,7 +100,7 @@ class mouse_app : public hid::application {
97100
private:
98101
mouse_app() : application(hid::report_protocol::from_descriptor<report_desc()>()) {}
99102

100-
hid::session &start(const hid::session_params &params) override;
103+
hid::session &start(const hid::session::params &params) override;
101104
void stop(hid::session &sess) override;
102105

103106
std::optional<mouse_session> session_{};

right/src/hid/transport_ble.cpp

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
#include "ble_app.hpp"
22
#include <bluetooth/hid_over_gatt.hpp>
3+
#include <new>
34
#include <zephyr/bluetooth/conn.h>
45
#include <zephyr/kernel.h>
5-
#include <new>
66
extern "C" {
77
#include "bt_conn.h"
88
}
99

1010
using namespace magic_enum::bitwise_operators;
1111

12-
static_assert(sizeof(ble_session) <= BLE_HID_SESSION_STORAGE_SIZE, "BLE_HID_SESSION_STORAGE_SIZE too small for ble_session");
12+
static_assert(sizeof(ble_session) <= BLE_HID_SESSION_STORAGE_SIZE,
13+
"BLE_HID_SESSION_STORAGE_SIZE too small for ble_session");
1314
static_assert(alignof(ble_session) <= 8, "ble_session alignment exceeds peer storage alignment");
1415

1516
static ble_session *peerSession(peer_t *peer)
@@ -44,14 +45,15 @@ ::bt_conn *ble_session::get_conn()
4445
return hog_service().get_session_conn(*this);
4546
}
4647

47-
hid::session &ble_app::start(const hid::session_params &params)
48+
hid::session &ble_app::start(const hid::session::params &params)
4849
{
4950
::bt_conn *conn = static_cast<const bluetooth::hid_over_gatt::session_params &>(params).conn;
5051
int8_t peerId = GetPeerIdByConn(conn);
5152
if (peerId < PeerIdFirstHost || peerId > PeerIdLastHost) {
52-
// A HOGP session should only ever start for a connected host peer
53+
// A HOGP session should only ever start for a connected host peer
5354
printk("ble_app::start: no host peer for conn (peerId %d)\n", peerId);
54-
static ble_session fallback;
55+
assert(false && "ble_app::start: no host peer for conn");
56+
static ble_session fallback{params};
5557
return fallback;
5658
}
5759
peer_t *peer = &Peers[peerId];
@@ -62,15 +64,15 @@ hid::session &ble_app::start(const hid::session_params &params)
6264
peer->hidSessionActive = false;
6365
}
6466

65-
ble_session *sess = new (peer->hidSessionStorage) ble_session();
67+
ble_session *sess = new (peer->hidSessionStorage) ble_session(params);
6668
peer->hidSessionActive = true;
6769

6870
// Mirror mouse_app::start: initialise the scroll multiplier from the new session.
6971
mouse_resolution_changed_callback(*sess, sess->resolution_report());
7072

7173
if (peer->connectionId != ConnectionId_Invalid) {
72-
printk("ble_app::start: marking BtHid connection %d (peer %d) ready\n",
73-
peer->connectionId, peerId);
74+
printk("ble_app::start: marking BtHid connection %d (peer %d) ready\n", peer->connectionId,
75+
peerId);
7476
Connections_SetStateAsync((connection_id_t)peer->connectionId, ConnectionState_Ready);
7577
} else {
7678
printk("ble_app::start: peer %d has invalid connectionId, cannot mark ready\n", peerId);
@@ -126,7 +128,8 @@ extern "C" int HOGP_HealthCheck()
126128
struct bt_conn_info info;
127129
int err = bt_conn_get_info(peer->conn, &info);
128130
if (err) {
129-
printk("HOGP HealthCheck: peer %s has INVALID conn pointer (err %d)\n", peer->name, err);
131+
printk(
132+
"HOGP HealthCheck: peer %s has INVALID conn pointer (err %d)\n", peer->name, err);
130133
return -3;
131134
}
132135
}

0 commit comments

Comments
 (0)