4 Commits

Author SHA1 Message Date
Shin'ichiro Kawasaki
923c036cec Tag version 0.2.0
Signed-off-by: Shin'ichiro Kawasaki <kawasaki@juno.dti.ne.jp>
2020-12-27 21:09:05 +09:00
Shin'ichiro Kawasaki
8a69c2c917 README.md: Add "Issue Reporting" and Releases" sections
Signed-off-by: Shin'ichiro Kawasaki <kawasaki@juno.dti.ne.jp>
2020-12-27 20:57:09 +09:00
Shin'ichiro Kawasaki
1e7f81906e BLESession: Refactor cached characteristics handling
To improve readability a bit, introduce _get_characteristic_cached().
Added some failure handlings in the method for robustness.
Also rename _get_all_characteristics() to _cache_characteristics() for
simplification.

Signed-off-by: Shin'ichiro Kawasaki <kawasaki@juno.dti.ne.jp>
2020-12-19 11:43:45 +09:00
sza2
73523120b9 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.
2020-12-15 14:02:33 +01:00
3 changed files with 39 additions and 2 deletions

View File

@@ -186,3 +186,19 @@ In Case You Fail to Connect
3. If scratch_link.py says "failed to connect to BT device: [Errno 13] Permission denied", 3. If scratch_link.py says "failed to connect to BT device: [Errno 13] Permission denied",
make sure to pair the bluetooth device to your PC before connecting to Scratch. make sure to pair the bluetooth device to your PC before connecting to Scratch.
Issus Reporting
---------------
Please file issues to [GitHub issue tracker](https://github.com/kawasaki/pyscrlink/issues).
Releases
--------
Release 0.2.0
* Latency issue fix for BLE devices' write characteristics
Release 0.1.0
* Initial release

View File

@@ -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,25 @@ class BLESession(Session):
charas = self.perip.getCharacteristics(uuid=chara_id) charas = self.perip.getCharacteristics(uuid=chara_id)
return charas[0] return charas[0]
def _cache_characteristics(self):
if not self.perip:
return
with self.lock:
self.characteristics_cache = self.perip.getCharacteristics()
if not self.characteristics_cache:
logger.debug("Characteristics are not cached")
def _get_characteristic_cached(self, chara_id):
if not self.perip:
return None
if not self.characteristics_cache:
self._cache_characteristics()
if self.characteristics_cache:
for characteristic in self.characteristics_cache:
if characteristic.uuid == chara_id:
return characteristic
return _get_characteristic(chara_id)
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 +578,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._cache_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 +616,7 @@ 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 = self._get_characteristic_cached(chara_id)
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

View File

@@ -5,7 +5,7 @@ with open("README.md", "r") as fh:
setuptools.setup( setuptools.setup(
name="pyscrlink", name="pyscrlink",
version="0.1.0", version="0.2.0",
author="Shin'ichiro Kawasaki", author="Shin'ichiro Kawasaki",
author_email='kawasaki@juno.dti.ne.jp', author_email='kawasaki@juno.dti.ne.jp',
description='Scratch-link for Linux with Python', description='Scratch-link for Linux with Python',