6 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
Shin'ichiro Kawasaki
d8299a5b3c Tag version 0.1.0
Signed-off-by: Shin'ichiro Kawasaki <kawasaki@juno.dti.ne.jp>
2020-10-27 11:35:34 +09:00
Shin'ichiro Kawasaki
8bf23a8c77 README.md: Brush up description
Improved English of the description. Updated list of devices and distros
that work with pyscrlink. Replaced 'Lego' with 'LEGO'.

Signed-off-by: Shin'ichiro Kawasaki <kawasaki@juno.dti.ne.jp>
2020-10-27 11:32:57 +09:00
3 changed files with 88 additions and 38 deletions

101
README.md
View File

@@ -1,51 +1,63 @@
# pyscrlink # pyscrlink
Pyscrlink is [Scratch-link](https://github.com/LLK/scratch-link) for Linux. Pyscrlink is a [Scratch-link](https://github.com/LLK/scratch-link) for Linux.
Scratch-link is a software module which connects Scratch-link is a software module which connects
[Scratch](https://scratch.mit.edu/) and Bluetooth devices such as [Scratch](https://scratch.mit.edu/) to Bluetooth devices such as
[micro:bit](https://microbit.org/). However, as of October 2020, it works only [micro:bit](https://microbit.org/). However, as of October 2020, it only works
on Windows and MacOS, and cannot connect Scratch and micro:bit on Linux on Windows and MacOS, and Linux operating systems can not connect Scratch and
operating systems. micro:bit.
Pyscrlink allows Linux OSes to connect Scratch and bluetooth devices. It uses Pyscrlink allows you to connect Scratch and bluetooth devices with the Linux
Linux Bluetooth protocol stack [Bluez](http://www.bluez.org/) and its python OSes. It uses the Linux Bluetooth protocol stack [Bluez](http://www.bluez.org/)
interfaces [pybluez](https://github.com/pybluez/pybluez) to handle Bluetooth, and its python interfaces [pybluez](https://github.com/pybluez/pybluez) to
and [bluepy](https://github.com/IanHarvey/bluepy) to handle Bluetooth Low handle Bluetooth, and [bluepy](https://github.com/IanHarvey/bluepy) to handle
Energy, or BLE, connections. It is confirmed that pyscrlink connects Scratch Bluetooth Low Energy (BLE) connections. It has been reported that pyscrlink
3.0 and a micro:bit, Lego Mindstorms EV3, Lego WeDo and Lego Boost. connects Scratch 3.0 with micro:bit, LEGO Mindstorms EV3, LEGO WeDo, LEGO
Boost and Intelino Smart Train.
Pyscrlink requires python version 3.6 and later to use websockets. If your To use websockets, pyscrlink requires python version 3.6 or later. If your
system has python older than version 3.6, install newer version. If your Linux system has python older than version 3.6, install newer version. If your
system has explicit command names python3 and pip3 for python version 3, system has python 3 explicit command names python3 and pip3, use them in the
use them in the instructions below. steps below.
Pyscrlink started in 2019 as "bluepy-scratch-link", which was a small work only Pyscrlink was launched in 2019 as "bluepy-scratch-link". This was a small task
for micro:bit and bluepy for BLE connections. After many contributions, it dedicated to micro:bit and bluepy for BLE connection. After many contributions,
expanded coverage to other devices and pybluez for Bluetooth connections. The it expanded coverage to pybluez with other devices for Bluetooth connectivity.
name "bluepy-scratch-link" was misleading that it indicate that it would depend It was misleading that the name "bluepy-scratch-link" indicates that it depends
only on bluepy. As of October 2020, the project was renamed from only on bluepy. As of October 2020, name of the project has been changed from
"bluepy-scratch-link" to "pyscrlink" to avoid the confusion. "bluepy-scratch-link" to "pyscrlink" to avoid confusion.
Confirmed Environments Confirmed Environments
---------------------- ----------------------
The instructions below was confirmed with following devices and distros. The instructions below was confirmed with following devices and distros.
Trial with other distros and feed-backs will be appreciated. Trial with other distros and feed-backs will be appreciated.
The pyscrlink (former bluepy-scratch-link) was confirmed with following devices, Pyscrlink was confirmed with following devices, Linux distros and browsers.
Linux distros and browsers.
Devices: Devices:
* micro:bit by @kawasaki * micro:bit
* Lego Mindstorm EV3: by @chrisglencross
Linux distros: Linux distros:
* Arch Linux by @kawasaki * Arch Linux
* elementary OS 5.0 Juno by @kawasaki * elementary OS 5.1 Hera
* Raspbian by @chirsglencross
Browsers: Browsers:
* FireFox by @kawasaki * FireFox
* Chromium by @kawasaki * Chromium
It was reported that pyscrlink (former bluepy-scratch-link) working with
following devices and Linux distros.
Devices:
* LEGO Mindstorm EV3 by @chrisglencross
* LEGO WeDo by @zhaowe, @KingBBQ
* LEGO Boost by @laurentchar, @miguev, @jacquesdt
* Intelino Smart Train by @ErrorJan
Linux distros:
* Raspbian by @chrisglencross
* Ubuntu 16.04 @jacquesdt
* Ubuntu Studio 20.04 @miguev
Installation Installation
------------ ------------
@@ -93,7 +105,7 @@ Installation
Usage Usage
----- -----
1. For Lego Mindstorms EV3, pair your Linux PC to the EV3 brick. 1. For LEGO Mindstorms EV3, pair your Linux PC to the EV3 brick.
First, turn on the EV3 and ensure Bluetooth is enabled. First, turn on the EV3 and ensure Bluetooth is enabled.
@@ -147,11 +159,12 @@ Usage
$ scratch_link $ scratch_link
``` ```
3. Connect scratch to micro:bit or Lego Mindstorms: 3. Connect scratch to micro:bit or LEGO Mindstorms:
* Open FireFox or Chrome and access [Scratch 3.0](https://scratch.mit.edu/) * Open FireFox or Chrome. (Make sure to run as the same user for scratch-link python script.)
* Select the "Add Extension" button * Access [Scratch 3.0](https://scratch.mit.edu/) and create your project.
* Select the extension for your device (e.g., micro:bit or Lego Mindstorms EV3 extension) and follow the prompts to connect * Select the "Add Extension" button.
* Build your project with the extension blocks * Select the extension for your device (e.g., micro:bit or Lego Mindstorms EV3 extension) and follow the prompts to connect.
* Build your project with the extension blocks.
In Case You Fail to Connect In Case You Fail to Connect
--------------------------- ---------------------------
@@ -173,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.1b4", 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',