Skip to content

Commit 049a0af

Browse files
committed
enhance blehid generic to support protocol boot mode
1 parent 7cead72 commit 049a0af

File tree

3 files changed

+59
-6
lines changed

3 files changed

+59
-6
lines changed

libraries/Bluefruit52Lib/src/services/BLEHidAdafruit.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,13 @@ err_t BLEHidAdafruit::begin(void)
222222
*------------------------------------------------------------------*/
223223
bool BLEHidAdafruit::keyboardReport(hid_keyboard_report_t* report)
224224
{
225-
return inputReport( REPORT_ID_KEYBOARD, report, sizeof(hid_keyboard_report_t));
225+
if ( isBootMode() )
226+
{
227+
return bootKeyboardReport(report, sizeof(hid_keyboard_report_t));
228+
}else
229+
{
230+
return inputReport( REPORT_ID_KEYBOARD, report, sizeof(hid_keyboard_report_t));
231+
}
226232
}
227233

228234
bool BLEHidAdafruit::keyboardReport(uint8_t modifier, uint8_t keycode[6])
@@ -314,7 +320,13 @@ bool BLEHidAdafruit::consumerKeyRelease(void)
314320
*------------------------------------------------------------------*/
315321
bool BLEHidAdafruit::mouseReport(hid_mouse_report_t* report)
316322
{
317-
return inputReport( REPORT_ID_MOUSE, report, sizeof(hid_mouse_report_t));
323+
if ( isBootMode() )
324+
{
325+
return bootMouseReport(report, sizeof(hid_mouse_report_t));
326+
}else
327+
{
328+
return inputReport( REPORT_ID_MOUSE, report, sizeof(hid_mouse_report_t));
329+
}
318330
}
319331

320332
bool BLEHidAdafruit::mouseReport(uint8_t buttons, int8_t x, int8_t y, int8_t wheel, int8_t pan)

libraries/Bluefruit52Lib/src/services/BLEHidGeneric.cpp

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ BLEHidGeneric::BLEHidGeneric(uint8_t num_input, uint8_t num_output, uint8_t num_
4646
: BLEService(UUID16_SVC_HUMAN_INTERFACE_DEVICE), _chr_control(UUID16_CHR_HID_CONTROL_POINT)
4747
{
4848
_has_keyboard = _has_mouse = false;
49+
_protocol_mode = 1; // report mode
50+
4951
_report_map = NULL;
5052
_report_map_len = 0;
5153

@@ -88,6 +90,9 @@ BLEHidGeneric::BLEHidGeneric(uint8_t num_input, uint8_t num_output, uint8_t num_
8890
}
8991
}
9092

93+
/*------------------------------------------------------------------*/
94+
/* CONFIG
95+
*------------------------------------------------------------------*/
9196
void BLEHidGeneric::enableKeyboard(bool enable)
9297
{
9398
_has_keyboard = enable;
@@ -98,7 +103,6 @@ void BLEHidGeneric::enableMouse(bool enable)
98103
_has_mouse = enable;
99104
}
100105

101-
102106
void BLEHidGeneric::setHidInfo(uint16_t bcd, uint8_t country, uint8_t flags)
103107
{
104108
memcpy(_hid_info, &bcd, 2);
@@ -124,6 +128,10 @@ void BLEHidGeneric::setOutputReportCallback(uint8_t reportID, output_report_cb_t
124128
_output_cbs[reportID] = fp;
125129
}
126130

131+
/*------------------------------------------------------------------*/
132+
/* Callbacks
133+
*------------------------------------------------------------------*/
134+
// TODO output report
127135
COMMENT_OUT (
128136
void blehidgeneric_output_cb(BLECharacteristic& chr, ble_gatts_evt_write_t* request)
129137
{
@@ -134,6 +142,17 @@ void blehidgeneric_output_cb(BLECharacteristic& chr, ble_gatts_evt_write_t* requ
134142
}
135143
)
136144

145+
void blehid_generic_protocol_mode_cb(BLECharacteristic& chr, uint8_t* data, uint16_t len, uint16_t offset)
146+
{
147+
BLEHidGeneric& svc = (BLEHidGeneric&) chr.parentService();
148+
svc._protocol_mode = *data;
149+
150+
LOG_LV2("HID", "Protocol Mode : %d (0 Boot, 1 Report)", *data);
151+
}
152+
153+
/*------------------------------------------------------------------*/
154+
/* Begin
155+
*------------------------------------------------------------------*/
137156
err_t BLEHidGeneric::begin(void)
138157
{
139158
VERIFY ( (_report_map != NULL) && _report_map_len, NRF_ERROR_INVALID_PARAM);
@@ -149,8 +168,9 @@ err_t BLEHidGeneric::begin(void)
149168

150169
_chr_protocol->setProperties(CHR_PROPS_READ | CHR_PROPS_WRITE_WO_RESP);
151170
_chr_protocol->setFixedLen(1);
171+
_chr_protocol->setWriteCallback(blehid_generic_protocol_mode_cb);
152172
VERIFY_STATUS( _chr_protocol->begin() );
153-
_chr_protocol->write8(1);
173+
_chr_protocol->write8(_protocol_mode);
154174
}
155175

156176
// Input reports
@@ -242,6 +262,9 @@ err_t BLEHidGeneric::begin(void)
242262
return ERROR_NONE;
243263
}
244264

265+
/*------------------------------------------------------------------*/
266+
/* Input Report
267+
*------------------------------------------------------------------*/
245268
bool BLEHidGeneric::inputReport(uint8_t reportID, void const* data, int len)
246269
{
247270
// 0 will treated as report ID = 1
@@ -250,6 +273,16 @@ bool BLEHidGeneric::inputReport(uint8_t reportID, void const* data, int len)
250273
return _chr_inputs[reportID-1].notify( (uint8_t const*) data, len);
251274
}
252275

276+
bool BLEHidGeneric::bootKeyboardReport(void const* data, int len)
277+
{
278+
return _chr_boot_keyboard_input->notify(data, len);
279+
}
280+
281+
bool BLEHidGeneric::bootMouseReport(void const* data, int len)
282+
{
283+
return _chr_boot_mouse_input->notify(data, len);
284+
}
285+
253286
/*------------------------------------------------------------------*/
254287
/*
255288
*------------------------------------------------------------------*/

libraries/Bluefruit52Lib/src/services/BLEHidGeneric.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,15 +103,21 @@ class BLEHidGeneric : public BLEService
103103

104104
virtual err_t begin(void);
105105

106+
bool isBootMode(void) { return _protocol_mode == 0; }
107+
108+
// Report
106109
bool inputReport(uint8_t reportID, void const* data, int len);
110+
bool bootKeyboardReport(void const* data, int len);
111+
bool bootMouseReport(void const* data, int len);
107112

108113
protected:
109114
uint8_t _num_input;
110115
uint8_t _num_output;
111116
uint8_t _num_feature;
112117

113-
bool _has_keyboard;
114-
bool _has_mouse;
118+
bool _has_keyboard;
119+
bool _has_mouse;
120+
bool _protocol_mode; // 0 boot, 1 report (default)
115121

116122
uint8_t _hid_info[4];
117123
const uint8_t* _report_map;
@@ -135,6 +141,8 @@ class BLEHidGeneric : public BLEService
135141

136142
BLECharacteristic _chr_control;
137143

144+
friend void blehid_generic_protocol_mode_cb(BLECharacteristic& chr, uint8_t* data, uint16_t len, uint16_t offset);
145+
138146
COMMENT_OUT (
139147
friend void blehidgeneric_output_cb(BLECharacteristic& chr, ble_gatts_evt_write_t* request);
140148
)

0 commit comments

Comments
 (0)