From dc410b14c49f40d53b38b45cc739ae7f055cdd25 Mon Sep 17 00:00:00 2001 From: dhavan Date: Wed, 22 Nov 2023 16:05:33 +0000 Subject: [PATCH] SET_REPORT and GET_REPORT implemented --- bumble/hid.py | 44 ++++++++++++++++++++++++++++++++++---- examples/run_hid_device.py | 39 ++++++++++++--------------------- 2 files changed, 54 insertions(+), 29 deletions(-) diff --git a/bumble/hid.py b/bumble/hid.py index 23fdfb3..9d77b5f 100644 --- a/bumble/hid.py +++ b/bumble/hid.py @@ -313,10 +313,10 @@ class HID(EventEmitter): self.handle_set_report(pdu) elif message_type == Message.MessageType.GET_PROTOCOL: logger.debug('<<< HID GET PROTOCOL') - self.emit('get_protocol') + self.handle_get_protocol(pdu) elif message_type == Message.MessageType.SET_PROTOCOL: logger.debug('<<< HID SET PROTOCOL') - self.emit('set_protocol', param) + self.handle_set_protocol(pdu) elif message_type == Message.MessageType.DATA: logger.debug('<<< HID CONTROL DATA') self.emit('control_data', pdu) @@ -426,6 +426,7 @@ class Device(HID): self.send_handshake_message(Message.Handshake.ERR_UNSUPPORTED_REQUEST) else: logger.debug("GetReport callback not registered !!") + self.send_handshake_message(Message.Handshake.ERR_UNSUPPORTED_REQUEST) def register_get_report_cb(self,cb): self.get_report_cb=cb @@ -439,12 +440,47 @@ class Device(HID): ret = self.set_report_cb(report_id, report_type, report_data) if(ret.status == self.ReportStatus.SUCCESS): self.send_handshake_message(Message.Handshake.SUCCESSFUL) - else: - self.send_handshake_message(Message.Handshake.ERR_INVALID_PARAMETER) + return + else: + logger.debug("SetReport callback not registered !!") + + self.send_handshake_message(Message.Handshake.ERR_UNSUPPORTED_REQUEST) def register_set_report_cb(self, cb): self.set_report_cb=cb logger.debug("SetReport callback registered successfully") + + def handle_get_protocol(self, pdu: bytes): + ret = self.GetReportStatus() + if(self.get_protocol_cb != None): + ret=self.get_protocol_cb() + if(ret.status == self.ReportStatus.SUCCESS): + self.send_control_data(Message.ReportType.OTHER_REPORT, ret.data) + return + else: + logger.debug("GetProtocol callback not registered !!") + + self.send_handshake_message(Message.Handshake.ERR_UNSUPPORTED_REQUEST) + + def register_get_protocol_cb(self, cb): + self.get_protocol_cb=cb + logger.debug("GetProtocol callback registered successfully") + + def handle_set_protocol(self, pdu: bytes): + ret = self.GetReportStatus() + if(self.set_protocol_cb != None): + ret=self.set_protocol_cb(pdu[0] & 0x01) + if(ret.status == self.ReportStatus.SUCCESS): + return + else: + logger.debug("SetProtocol callback not registered !!") + + self.send_handshake_message(Message.Handshake.ERR_UNSUPPORTED_REQUEST) + + + def register_set_protocol_cb(self, cb): + self.set_protocol_cb=cb + logger.debug("SetProtocol callback registered successfully") # ----------------------------------------------------------------------------- class Host(HID): diff --git a/examples/run_hid_device.py b/examples/run_hid_device.py index 6e855ce..a97faa9 100644 --- a/examples/run_hid_device.py +++ b/examples/run_hid_device.py @@ -502,22 +502,6 @@ async def main(): def on_hid_data_cb(pdu): print(f'Received Data, PDU: {pdu.hex()}') - def on_set_report_cb(report_id: int, report: bytes): - if (report_id > 2) or (report_id == 0): - hid_device.send_handshake_message(Message.Handshake.ERR_INVALID_REPORT_ID) - print("Warning: Report ID Not Supported") - else: - hid_device.send_handshake_message(Message.Handshake.SUCCESSFUL) - print('Set Report, Report ID: ', report_id) - print('Report:', report) - - def on_get_protocol_cb(): - if HID_BOOT_DEVICE: - data = protocol_mode.to_bytes() - hid_device.send_control_data(Message.ReportType.OTHER_REPORT, data) - else: - hid_device.send_handshake_message(Message.Handshake.ERR_UNSUPPORTED_REQUEST) - def on_get_report_cb(report_id,report_type, buffer_size): retValue = hid_device.GetReportStatus() print("GET_REPORT report_id: " + str(report_id) +"report_type: "+ str(report_type)+ @@ -558,13 +542,18 @@ async def main(): return retValue - def on_set_protocol_cb(param): - if HID_BOOT_DEVICE: - global protocol_mode - protocol_mode = Message.ProtocolMode(param) - hid_device.send_handshake_message(Message.Handshake.SUCCESSFUL) - else: - hid_device.send_handshake_message(Message.Handshake.ERR_UNSUPPORTED_REQUEST) + def on_get_protocol_cb(): + retValue = hid_device.GetReportStatus() + retValue.data=protocol_mode.to_bytes() + retValue.status=hid_device.ReportStatus.SUCCESS + return retValue + + def on_set_protocol_cb(protocol): + retValue = hid_device.GetReportStatus() + #We do not support SET_PROTOCOL + print("SET_PROTOCOL report_id: " + str(protocol)) + retValue.status=hid_device.ReportStatus.ERR_UNSUPPORTED_REQUEST + return retValue def on_virtual_cable_unplug_cb(): print(f'Received Virtual Cable Unplug') @@ -583,11 +572,11 @@ async def main(): # Register for call backs hid_device.on('interrupt_data', on_hid_data_cb) - hid_device.on('get_protocol', on_get_protocol_cb) - hid_device.on('set_protocol', on_set_protocol_cb) hid_device.register_get_report_cb(on_get_report_cb) hid_device.register_set_report_cb(on_set_report_cb) + hid_device.register_get_protocol_cb(on_get_protocol_cb) + hid_device.register_set_protocol_cb(on_set_protocol_cb) # Register for virtual cable unplug call back hid_device.on('virtual_cable_unplug', on_virtual_cable_unplug_cb)