Skip to content

Commit af92c09

Browse files
authored
Merge pull request #849 from RobertDaleSmith/hid-generic-feature-reports
Adds feature reports support on Bluefruit52Lib's BLEHidGeneric service
2 parents a7835c6 + c8af184 commit af92c09

2 files changed

Lines changed: 33 additions & 0 deletions

File tree

libraries/Bluefruit52Lib/src/services/BLEHidGeneric.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,14 @@ 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+
if ( idx < _num_feature ) _chr_features[idx].setWriteCallback(fp);
136+
}
137+
130138
/*------------------------------------------------------------------*/
131139
/* Callbacks
132140
*------------------------------------------------------------------*/
@@ -193,6 +201,21 @@ err_t BLEHidGeneric::begin(void)
193201
_chr_outputs[i].write8(0);
194202
}
195203

204+
// Feature reports
205+
for (uint8_t i = 0; i < _num_feature; i++)
206+
{
207+
_chr_features[i].setUuid(UUID16_CHR_REPORT);
208+
_chr_features[i].setProperties(CHR_PROPS_READ | CHR_PROPS_WRITE | CHR_PROPS_WRITE_WO_RESP);
209+
_chr_features[i].setPermission(SECMODE_ENC_NO_MITM, SECMODE_ENC_NO_MITM);
210+
_chr_features[i].setReportRefDescriptor(i+1, REPORT_TYPE_FEATURE);
211+
212+
// Feature report len is configured, else variable len up to 255
213+
if ( _feature_len ) _chr_features[i].setFixedLen( _feature_len[i] );
214+
215+
VERIFY_STATUS( _chr_features[i].begin() );
216+
_chr_features[i].write8(0);
217+
}
218+
196219
// Report Map (HID Report Descriptor)
197220
BLECharacteristic report_map(UUID16_CHR_REPORT_MAP);
198221
report_map.setTempMemory();
@@ -283,6 +306,13 @@ bool BLEHidGeneric::bootMouseReport(void const* data, int len)
283306
return bootMouseReport(BLE_CONN_HANDLE_INVALID, data, len);
284307
}
285308

309+
bool BLEHidGeneric::featureReport(uint8_t reportID, void const* data, int len)
310+
{
311+
// index is ID-1
312+
uint8_t const 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)