Skip to content

Commit 1d301d5

Browse files
committed
implement hid keyboard led set #166
1 parent c44725b commit 1d301d5

File tree

5 files changed

+64
-56
lines changed

5 files changed

+64
-56
lines changed

libraries/Bluefruit52Lib/examples/Peripheral/hid_keyboard/hid_keyboard.ino

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ void setup()
5252
*/
5353
blehid.begin();
5454

55+
// Set callback for set LED from central
56+
blehid.setKeyboardLedCallback(set_keyboard_led);
57+
5558
/* Set connection interval (min, max) to your perferred value.
5659
* Note: It is already set by BLEHidAdafruit::begin() to 11.25ms - 15ms
5760
* min = 9*1.25=11.25 ms, max = 12*1.25= 15 ms
@@ -122,22 +125,21 @@ void loop()
122125
}
123126

124127
/**
125-
* RTOS Idle callback is automatically invoked by FreeRTOS
126-
* when there are no active threads. E.g when loop() calls delay() and
127-
* there is no bluetooth or hw event. This is the ideal place to handle
128-
* background data.
129-
*
130-
* NOTE: FreeRTOS is configured as tickless idle mode. After this callback
131-
* is executed, if there is time, freeRTOS kernel will go into low power mode.
132-
* Therefore waitForEvent() should not be called in this callback.
133-
* http://www.freertos.org/low-power-tickless-rtos.html
134-
*
135-
* WARNING: This function MUST NOT call any blocking FreeRTOS API
136-
* such as delay(), xSemaphoreTake() etc ... for more information
137-
* http://www.freertos.org/a00016.html
128+
* Callback invoked when received Set LED from central.
129+
* Must be set previously with setKeyboardLedCallback()
130+
*
131+
* The LED bit map is as follows: (also defined by KEYBOARD_LED_* )
132+
* Kana (4) | Compose (3) | ScrollLock (2) | CapsLock (1) | Numlock (0)
138133
*/
139-
void rtos_idle_callback(void)
134+
void set_keyboard_led(uint8_t led_bitmap)
140135
{
141-
// Don't call any other FreeRTOS blocking API()
142-
// Perform background task(s) here
136+
// light up Red Led if any bits is set
137+
if ( led_bitmap )
138+
{
139+
ledOn( LED_RED );
140+
}
141+
else
142+
{
143+
ledOff( LED_RED );
144+
}
143145
}

libraries/Bluefruit52Lib/src/services/BLEHidAdafruit.cpp

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ BLEHidAdafruit::BLEHidAdafruit(void)
197197
: BLEHidGeneric(3, 1, 0)
198198
{
199199
_mse_buttons = 0;
200+
_kbd_led_cb = NULL;
200201
}
201202

202203
err_t BLEHidAdafruit::begin(void)
@@ -211,7 +212,7 @@ err_t BLEHidAdafruit::begin(void)
211212

212213
VERIFY_STATUS( BLEHidGeneric::begin() );
213214

214-
// Attemp to change the connection interval to 11.25-15 ms when starting HID
215+
// Attempt to change the connection interval to 11.25-15 ms when starting HID
215216
Bluefruit.setConnInterval(9, 12);
216217

217218
return ERROR_NONE;
@@ -220,6 +221,27 @@ err_t BLEHidAdafruit::begin(void)
220221
/*------------------------------------------------------------------*/
221222
/* Keyboard
222223
*------------------------------------------------------------------*/
224+
225+
void blehid_ada_keyboard_output_cb(BLECharacteristic& chr, uint8_t* data, uint16_t len, uint16_t offset)
226+
{
227+
LOG_LV2("HID", "Keyboard LED : 0x%02X", data[0]);
228+
VERIFY(len == 1, );
229+
230+
BLEHidAdafruit& svc = (BLEHidAdafruit&) chr.parentService();
231+
if ( svc._kbd_led_cb ) svc._kbd_led_cb(data[0]);
232+
}
233+
234+
void BLEHidAdafruit::setKeyboardLedCallback(kbd_led_cb_t fp)
235+
{
236+
_kbd_led_cb = fp;
237+
238+
// Report mode
239+
this->setOutputReportCallback(REPORT_ID_KEYBOARD, fp ? blehid_ada_keyboard_output_cb : NULL);
240+
241+
// Boot mode
242+
_chr_boot_keyboard_output->setWriteCallback(fp ? blehid_ada_keyboard_output_cb : NULL);
243+
}
244+
223245
bool BLEHidAdafruit::keyboardReport(hid_keyboard_report_t* report)
224246
{
225247
if ( isBootMode() )

libraries/Bluefruit52Lib/src/services/BLEHidAdafruit.h

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,10 @@
4545

4646
class BLEHidAdafruit : public BLEHidGeneric
4747
{
48-
protected:
49-
uint8_t _mse_buttons;
50-
5148
public:
49+
/*--------- Callback Signatures ----------*/
50+
typedef void (*kbd_led_cb_t) (uint8_t leds_bitmap);
51+
5252
BLEHidAdafruit(void);
5353

5454
virtual err_t begin(void);
@@ -58,6 +58,8 @@ class BLEHidAdafruit : public BLEHidGeneric
5858
bool keyboardReport(uint8_t modifier, uint8_t keycode[6]);
5959
bool keyboardReport(uint8_t modifier, uint8_t keycode0, uint8_t keycode1=0, uint8_t keycode2=0, uint8_t keycode3=0, uint8_t keycode4=0, uint8_t keycode5=0);
6060

61+
void setKeyboardLedCallback(kbd_led_cb_t fp);
62+
6163
bool keyPress(char ch);
6264
bool keyRelease(void);
6365
bool keySequence(const char* str, int interal=5);
@@ -77,6 +79,12 @@ class BLEHidAdafruit : public BLEHidGeneric
7779
bool mouseMove(int8_t x, int8_t y);
7880
bool mouseScroll(int8_t scroll);
7981
bool mousePan(int8_t pan);
82+
83+
protected:
84+
uint8_t _mse_buttons;
85+
kbd_led_cb_t _kbd_led_cb;
86+
87+
friend void blehid_ada_keyboard_output_cb(BLECharacteristic& chr, uint8_t* data, uint16_t len, uint16_t offset);
8088
};
8189

8290
#endif /* BLEHIDADAFRUIT_H_ */

libraries/Bluefruit52Lib/src/services/BLEHidGeneric.cpp

Lines changed: 11 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,6 @@ BLEHidGeneric::BLEHidGeneric(uint8_t num_input, uint8_t num_output, uint8_t num_
6969
_chr_inputs = _chr_outputs = _chr_features = NULL;
7070
_chr_boot_keyboard_input = _chr_boot_keyboard_output = _chr_boot_mouse_input = NULL;
7171

72-
_output_cbs = NULL;
73-
7472
if ( _num_input )
7573
{
7674
_chr_inputs = new BLECharacteristic[_num_input];
@@ -79,9 +77,6 @@ BLEHidGeneric::BLEHidGeneric(uint8_t num_input, uint8_t num_output, uint8_t num_
7977
if ( _num_output )
8078
{
8179
_chr_outputs = new BLECharacteristic[_num_output];
82-
_output_cbs = new output_report_cb_t[_num_output];
83-
84-
for (uint8_t i=0; i<_num_output; i++) _output_cbs[i] = NULL;
8580
}
8681

8782
if ( _num_feature )
@@ -123,25 +118,18 @@ void BLEHidGeneric::setReportLen(uint16_t input_len[], uint16_t output_len[], ui
123118
_feature_len = feature_len;
124119
}
125120

126-
void BLEHidGeneric::setOutputReportCallback(uint8_t reportID, output_report_cb_t fp)
121+
void BLEHidGeneric::setOutputReportCallback(uint8_t reportID, BLECharacteristic::write_cb_t fp)
127122
{
128-
_output_cbs[reportID] = fp;
123+
// index is ID-1
124+
uint8_t const idx = ( reportID ? (reportID-1) : 0 );
125+
126+
// report mode
127+
if ( idx < _num_output ) _chr_outputs[idx].setWriteCallback(fp);
129128
}
130129

131130
/*------------------------------------------------------------------*/
132131
/* Callbacks
133132
*------------------------------------------------------------------*/
134-
// TODO output report
135-
COMMENT_OUT (
136-
void blehidgeneric_output_cb(BLECharacteristic& chr, ble_gatts_evt_write_t* request)
137-
{
138-
(void) chr;
139-
(void) request;
140-
// BLEHidGeneric& hid = (BLEHidGeneric&) chr.parentService();
141-
// PRINT_BUFFER(request->data, request->len);
142-
}
143-
)
144-
145133
void blehid_generic_protocol_mode_cb(BLECharacteristic& chr, uint8_t* data, uint16_t len, uint16_t offset)
146134
{
147135
BLEHidGeneric& svc = (BLEHidGeneric&) chr.parentService();
@@ -192,13 +180,9 @@ err_t BLEHidGeneric::begin(void)
192180
{
193181
_chr_outputs[i].setUuid(UUID16_CHR_REPORT);
194182
_chr_outputs[i].setProperties(CHR_PROPS_READ | CHR_PROPS_WRITE | CHR_PROPS_WRITE_WO_RESP);
195-
_chr_outputs[i].setPermission(SECMODE_ENC_NO_MITM, SECMODE_NO_ACCESS);
183+
_chr_outputs[i].setPermission(SECMODE_ENC_NO_MITM, SECMODE_ENC_NO_MITM);
196184
_chr_outputs[i].setReportRefDescriptor(i+1, REPORT_TYPE_OUTPUT);
197185

198-
COMMENT_OUT(
199-
_chr_outputs[i].setWriteCallback(blehidgeneric_output_cb);
200-
)
201-
202186
// Input report len is configured, else variable len up to 255
203187
if ( _output_len ) _chr_outputs[i].setFixedLen( _output_len[i] );
204188

@@ -228,7 +212,7 @@ err_t BLEHidGeneric::begin(void)
228212
_chr_boot_keyboard_output = new BLECharacteristic(UUID16_CHR_BOOT_KEYBOARD_OUTPUT_REPORT);
229213
_chr_boot_keyboard_output->setProperties(CHR_PROPS_READ | CHR_PROPS_WRITE | CHR_PROPS_WRITE_WO_RESP);
230214
_chr_boot_keyboard_output->setFixedLen(1); // boot keyboard is 1 byte
231-
_chr_boot_keyboard_output->setPermission(SECMODE_ENC_NO_MITM, SECMODE_NO_ACCESS);
215+
_chr_boot_keyboard_output->setPermission(SECMODE_ENC_NO_MITM, SECMODE_ENC_NO_MITM);
232216
VERIFY_STATUS(_chr_boot_keyboard_output->begin());
233217
_chr_boot_keyboard_output->write8(0);
234218
}
@@ -267,10 +251,10 @@ err_t BLEHidGeneric::begin(void)
267251
*------------------------------------------------------------------*/
268252
bool BLEHidGeneric::inputReport(uint8_t reportID, void const* data, int len)
269253
{
270-
// 0 will treated as report ID = 1
271-
if ( reportID == 0 ) reportID++;
254+
// index is ID-1
255+
uint8_t const idx = ( reportID ? (reportID-1) : 0 );
272256

273-
return _chr_inputs[reportID-1].notify( (uint8_t const*) data, len);
257+
return _chr_inputs[idx].notify( (uint8_t const*) data, len);
274258
}
275259

276260
bool BLEHidGeneric::bootKeyboardReport(void const* data, int len)

libraries/Bluefruit52Lib/src/services/BLEHidGeneric.h

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,6 @@ typedef ATTR_PACKED_STRUCT(struct)
9999
class BLEHidGeneric : public BLEService
100100
{
101101
public:
102-
typedef void (*output_report_cb_t) (uint8_t reportID, uint8_t* data, uint16_t len);
103-
104102
BLEHidGeneric(uint8_t num_input, uint8_t num_output = 0, uint8_t num_feature = 0);
105103

106104
void enableKeyboard(bool enable);
@@ -111,7 +109,7 @@ class BLEHidGeneric : public BLEService
111109
void setReportLen(uint16_t input_len[], uint16_t output_len[] = NULL, uint16_t feature_len[] = NULL);
112110
void setReportMap(const uint8_t* report_map, size_t len);
113111

114-
void setOutputReportCallback(uint8_t reportID, output_report_cb_t fp);
112+
void setOutputReportCallback(uint8_t reportID, BLECharacteristic::write_cb_t fp);
115113

116114
virtual err_t begin(void);
117115

@@ -139,8 +137,6 @@ class BLEHidGeneric : public BLEService
139137
uint16_t* _output_len;
140138
uint16_t* _feature_len;
141139

142-
output_report_cb_t* _output_cbs;
143-
144140
BLECharacteristic* _chr_protocol;
145141

146142
BLECharacteristic* _chr_inputs;
@@ -154,10 +150,6 @@ class BLEHidGeneric : public BLEService
154150
BLECharacteristic _chr_control;
155151

156152
friend void blehid_generic_protocol_mode_cb(BLECharacteristic& chr, uint8_t* data, uint16_t len, uint16_t offset);
157-
158-
COMMENT_OUT (
159-
friend void blehidgeneric_output_cb(BLECharacteristic& chr, ble_gatts_evt_write_t* request);
160-
)
161153
};
162154

163155
//--------------------------------------------------------------------+

0 commit comments

Comments
 (0)