def _on_write_auth_request(self, write_event): """ :type write_event: nrf_events.GattsEvtWrite """ if write_event.write_op in [nrf_events.BLEGattsWriteOperation.exec_write_req_cancel, nrf_events.BLEGattsWriteOperation.exec_write_req_now]: self._execute_queued_write(write_event.write_op) # Reply should already be handled in database since this can span multiple characteristics and services return if not self._handle_in_characteristic(write_event.attribute_handle): # Handle is not for this characteristic, do nothing return # Build out the reply params = nrf_types.BLEGattsAuthorizeParams(nrf_types.BLEGattStatusCode.success, True, write_event.offset, write_event.data) reply = nrf_types.BLEGattsRwAuthorizeReplyParams(write=params) # Check that the write length is valid if write_event.offset + len(write_event.data) > self._properties.max_len: params.gatt_status = nrf_types.BLEGattStatusCode.invalid_att_val_length self.ble_device.ble_driver.ble_gatts_rw_authorize_reply(write_event.conn_handle, reply) else: # Send reply before processing write, in case user sets data in gatts_write handler try: self.ble_device.ble_driver.ble_gatts_rw_authorize_reply(write_event.conn_handle, reply) except Exception as e: pass if write_event.write_op == nrf_events.BLEGattsWriteOperation.prep_write_req: self._write_queued = True self._queued_write_chunks.append(self._QueuedChunk(write_event.offset, write_event.data)) elif write_event.write_op in [nrf_events.BLEGattsWriteOperation.write_req, nrf_types.BLEGattsWriteOperation.write_cmd]: self._on_gatts_write(None, write_event)
def _on_rw_auth_request(self, driver, event): """ :type event: nrf_events.GattsEvtReadWriteAuthorizeRequest """ if not event.write: return # execute writes can span multiple services and characteristics. Should only reply at the top-level here if event.write.write_op not in [nrf_events.BLEGattsWriteOperation.exec_write_req_now, nrf_events.BLEGattsWriteOperation.exec_write_req_cancel]: return params = nrf_types.BLEGattsAuthorizeParams(nrf_types.BLEGattStatusCode.success, False) reply = nrf_types.BLEGattsRwAuthorizeReplyParams(write=params) self.ble_device.ble_driver.ble_gatts_rw_authorize_reply(event.conn_handle, reply)
def _on_read_auth_request(self, read_event): """ :type read_event: nrf_events.GattsEvtRead """ if not self._handle_in_characteristic(read_event.attribute_handle): # Don't care about handles outside of this characteristic return params = nrf_types.BLEGattsAuthorizeParams(nrf_types.BLEGattStatusCode.success, False, read_event.offset) reply = nrf_types.BLEGattsRwAuthorizeReplyParams(read=params) if read_event.offset > len(self.value): params.gatt_status = nrf_types.BLEGattStatusCode.invalid_offset else: self._read_in_process = True # If the client is reading from the beginning, notify handlers in case an update needs to be made if read_event.offset == 0: self._on_read.notify(self) self._read_in_process = False self.ble_device.ble_driver.ble_gatts_rw_authorize_reply(read_event.conn_handle, reply)