Skip to content

Commit 9805a64

Browse files
feat: implements feature reports logic on Bluefruit52Lib's BLEHidGeneric service
1 parent aa0f46c commit 9805a64

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

libraries/Bluefruit52Lib/src/services/BLEHidGeneric.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,15 @@ void BLEHidGeneric::setOutputReportCallback(uint8_t reportID, BLECharacteristic:
127127
if ( idx < _num_output ) _chr_outputs[idx].setWriteCallback(fp);
128128
}
129129

130+
void BLEHidGeneric::setFeatureReportCallback(uint8_t reportID, BLECharacteristic::write_cb_t fp)
131+
{
132+
// index is ID-1
133+
uint8_t const idx = ( reportID ? (reportID - 1) : 0 );
134+
135+
// report mode
136+
if (idx < _num_feature) _chr_features[idx].setWriteCallback(fp);
137+
}
138+
130139
/*------------------------------------------------------------------*/
131140
/* Callbacks
132141
*------------------------------------------------------------------*/
@@ -193,6 +202,21 @@ err_t BLEHidGeneric::begin(void)
193202
_chr_outputs[i].write8(0);
194203
}
195204

205+
// Feature reports
206+
for (uint8_t i = 0; i < _num_feature; i++)
207+
{
208+
_chr_features[i].setUuid(UUID16_CHR_REPORT);
209+
_chr_features[i].setProperties(CHR_PROPS_READ | CHR_PROPS_WRITE | CHR_PROPS_WRITE_WO_RESP);
210+
_chr_features[i].setPermission(SECMODE_OPEN, SECMODE_OPEN);
211+
_chr_features[i].setReportRefDescriptor(i+1, REPORT_TYPE_FEATURE);
212+
213+
// Input report len is configured, else variable len up to 255
214+
if ( _feature_len ) _chr_features[i].setFixedLen( _feature_len[i] );
215+
216+
VERIFY_STATUS(_chr_features[i].begin());
217+
_chr_features[i].write8(0); // default value
218+
}
219+
196220
// Report Map (HID Report Descriptor)
197221
BLECharacteristic report_map(UUID16_CHR_REPORT_MAP);
198222
report_map.setTempMemory();
@@ -283,6 +307,12 @@ bool BLEHidGeneric::bootMouseReport(void const* data, int len)
283307
return bootMouseReport(BLE_CONN_HANDLE_INVALID, data, len);
284308
}
285309

310+
bool BLEHidGeneric::featureReport(uint8_t reportID, void const* data, int len)
311+
{
312+
uint8_t idx = reportID ? reportID - 1 : 0;
313+
if (idx >= _num_feature) return false;
314+
return _chr_features[idx].write((uint8_t const*) data, len);
315+
}
286316

287317
// Conversion table from Ascii to keycode (shift, keycode)
288318
const uint8_t hid_ascii_to_keycode[128][2] = { HID_ASCII_TO_KEYCODE };

libraries/Bluefruit52Lib/src/services/BLEHidGeneric.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,15 @@ class BLEHidGeneric : public BLEService
6363

6464
void setOutputReportCallback(uint8_t reportID, BLECharacteristic::write_cb_t fp);
6565

66+
void setFeatureReportCallback(uint8_t reportID, BLECharacteristic::write_cb_t fp);
67+
6668
virtual err_t begin(void);
6769

6870
bool isBootMode(void) { return !_report_mode; }
6971

7072
// Send Report to default connection
7173
bool inputReport(uint8_t reportID, void const* data, int len);
74+
bool featureReport(uint8_t reportID, void const* data, int len);
7275
bool bootKeyboardReport(void const* data, int len);
7376
bool bootMouseReport(void const* data, int len);
7477

0 commit comments

Comments
 (0)