mirror of
https://github.com/kawasaki/pyscrlink.git
synced 2025-09-07 18:20:07 +02:00
Update scratch_link.py
Retrieve all characteristics value on connect and cache it to speed up characteristics write that was slow as the handle got by _get_characteristic() every time a write occurred.
This commit is contained in:
@@ -423,6 +423,7 @@ class BLESession(Session):
|
|||||||
self.deviceName = None
|
self.deviceName = None
|
||||||
self.perip = None
|
self.perip = None
|
||||||
self.delegate = None
|
self.delegate = None
|
||||||
|
self.characteristics_cache = []
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
self.status = self.DONE
|
self.status = self.DONE
|
||||||
@@ -490,6 +491,13 @@ class BLESession(Session):
|
|||||||
charas = self.perip.getCharacteristics(uuid=chara_id)
|
charas = self.perip.getCharacteristics(uuid=chara_id)
|
||||||
return charas[0]
|
return charas[0]
|
||||||
|
|
||||||
|
def _get_all_characteristics(self):
|
||||||
|
if not self.perip:
|
||||||
|
return None
|
||||||
|
with self.lock:
|
||||||
|
characteristics = self.perip.getCharacteristics()
|
||||||
|
return characteristics
|
||||||
|
|
||||||
def handle_request(self, method, params):
|
def handle_request(self, method, params):
|
||||||
"""Handle requests from Scratch"""
|
"""Handle requests from Scratch"""
|
||||||
if self.delegate:
|
if self.delegate:
|
||||||
@@ -558,6 +566,7 @@ class BLESession(Session):
|
|||||||
self.status = self.CONNECTED
|
self.status = self.CONNECTED
|
||||||
self.delegate = self.BLEDelegate(self)
|
self.delegate = self.BLEDelegate(self)
|
||||||
self.perip.withDelegate(self.delegate)
|
self.perip.withDelegate(self.delegate)
|
||||||
|
self.characteristics_cache = self._get_all_characteristics()
|
||||||
else:
|
else:
|
||||||
err_msg = f"BLE connect failed: {self.deviceName}"
|
err_msg = f"BLE connect failed: {self.deviceName}"
|
||||||
res["error"] = { "message": err_msg }
|
res["error"] = { "message": err_msg }
|
||||||
@@ -595,7 +604,11 @@ class BLESession(Session):
|
|||||||
logger.debug("handle write request")
|
logger.debug("handle write request")
|
||||||
service_id = params['serviceId']
|
service_id = params['serviceId']
|
||||||
chara_id = params['characteristicId']
|
chara_id = params['characteristicId']
|
||||||
c = self._get_characteristic(chara_id)
|
c = None
|
||||||
|
for characteristic in self.characteristics_cache:
|
||||||
|
if characteristic.uuid == chara_id:
|
||||||
|
c = characteristic
|
||||||
|
break
|
||||||
if not c or c.uuid != UUID(chara_id):
|
if not c or c.uuid != UUID(chara_id):
|
||||||
logger.error(f"Failed to get characteristic {chara_id}")
|
logger.error(f"Failed to get characteristic {chara_id}")
|
||||||
self.status = self.DONE
|
self.status = self.DONE
|
||||||
|
Reference in New Issue
Block a user