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