@@ -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)
288318const uint8_t hid_ascii_to_keycode[128 ][2 ] = { HID_ASCII_TO_KEYCODE };
0 commit comments