Python sdk for Synchroni
Project description
sensor-sdk
Synchroni sdk for Python
Brief
Synchroni SDK is the software development kit for developers to access Synchroni products.
Contributing
See the contributing guide to learn how to contribute to the repository and the development workflow.
License
MIT
Installation
pip install sensor-sdk
1. Permission
Application will obtain bluetooth permission by itself.
2. Import SDK
from sensor import *
SensorController methods
1. Initalize
SensorControllerInstance = SensorController()
# register scan listener
if not SensorControllerInstance.hasDeviceFoundCallback:
def on_device_callback(deviceList: List[BLEDevice]):
# return all devices doesn't connected
pass
SensorControllerInstance.onDeviceFoundCallback = on_device_callback
2. Start scan
Use def startScan(period_in_ms: int) -> bool to start scan
success = SensorControllerInstance.startScan(6000)
returns true if start scan success, periodInMS means onDeviceCallback will be called every periodInMS
Use def scan(period_in_ms: int) -> list[BLEDevice] to scan once time
bleDevices = SensorControllerInstance.scan(6000)
3. Stop scan
Use def stopScan() -> None to stop scan
SensorControllerInstance.stopScan()
4. Check scaning
Use property isScanning: bool to check scanning status
isScanning = SensorControllerInstance.isScanning
5. Check if bluetooth is enabled
Use property isEnable: bool to check if bluetooth is enable
isEnable = SensorControllerInstance.isEnable
6. Create SensorProfile
Use def requireSensor(device: BLEDevice) -> SensorProfile | None to create SensorProfile.
If bleDevice is invalid, result is None.
sensorProfile = SensorControllerInstance.requireSensor(bleDevice)
7. Get SensorProfile
Use def getSensor(device: BLEDevice) -> SensorProfile | None to get SensorProfile.
If SensorProfile didn't created, result is None.
sensorProfile = SensorControllerInstance.getSensor(bleDevice)
8. Get Connected SensorProfiles
Use def getConnectedSensors() -> list[SensorProfile] to get connected SensorProfiles.
sensorProfiles = SensorControllerInstance.getConnectedSensors()
9. Get Connected BLE Devices
Use def getConnectedDevices() -> list[BLEDevice] to get connected BLE Devices.
bleDevices = SensorControllerInstance.getConnectedDevices()
10. Terminate
Use def terminate() to terminate sdk
def terminate():
SensorControllerInstance.terminate()
exit()
def main():
signal.signal(signal.SIGINT, lambda signal, frame: terminate())
time.sleep(30)
SensorControllerInstance.terminate()
Please MAKE SURE to call terminate when exit main() or press Ctrl+C
SensorProfile methods
11. Initalize
Please register callbacks for SensorProfile
sensorProfile = SensorControllerInstance.requireSensor(bleDevice)
# register callbacks
def on_state_changed(sensor, newState):
# please do logic when device disconnected unexpected
pass
def on_error_callback(sensor, reason):
# called when error occurs
pass
def on_power_changed(sensor, power):
# callback for get battery level of device, power from 0 - 100, -1 is invalid
pass
def on_data_callback(sensor, data):
# called after start data transfer
pass
sensorProfile.onStateChanged = on_state_changed
sensorProfile.onErrorCallback = on_error_callback
sensorProfile.onPowerChanged = on_power_changed
sensorProfile.onDataCallback = on_data_callback
12. Connect device
Use def connect() -> bool to connect.
success = sensorProfile.connect()
13. Disconnect
Use def disconnect() -> bool to disconnect.
success = sensorProfile.disconnect()
14. Get device status
Use property deviceState: DeviceStateEx to get device status.
Please send command in 'Ready' state, should be after connect() return True.
deviceStateEx = sensorProfile.deviceState
# deviceStateEx has define:
# class DeviceStateEx(Enum):
# Disconnected = 0
# Connecting = 1
# Connected = 2
# Ready = 3
# Disconnecting = 4
# Invalid = 5
15. Get BLE device of SensorProfile
Use property BLEDevice: BLEDevice to get BLE device of SensorProfile.
bleDevice = sensorProfile.BLEDevice
16. Get device info of SensorProfile
Use def getDeviceInfo() -> dict | None to get device info of SensorProfile.
Please call after device in 'Ready' state, return None if it's not connected.
deviceInfo = sensorProfile.getDeviceInfo()
# deviceInfo has defines:
# deviceInfo = {
# "deviceName": str,
# "modelName": str,
# "hardwareVersion": str,
# "firmwareVersion": str,
# "emgChannelCount": int,
# "eegChannelCount": int,
# "ecgChannelCount": int,
# "accChannelCount": int,
# "gyroChannelCount": int,
# "brthChannelCount": int,
# "mtuSize": int
# }
17. Init data transfer
Use def init(packageSampleCount: int, powerRefreshInterval: int) -> bool.
Please call after device in 'Ready' state, return True if init succeed.
success = sensorProfile.init(5, 60*1000)
packageSampleCount: set sample counts of SensorData.channelSamples in onDataCallback() powerRefreshInterval: callback period for onPowerChanged()
18. Check if init data transfer succeed
Use property hasInited: bool to check if init data transfer succeed.
hasInited = sensorProfile.hasInited
19. DataNotify
Use def startDataNotification() -> bool to start data notification.
Please call if hasInited return True
19.1 Start data transfer
success = sensorProfile.startDataNotification()
Data type list:
class DataType(Enum):
NTF_ACC = 0x1 # unit is g
NTF_GYRO = 0x2 # unit is degree/s
NTF_EEG = 0x10 # unit is uV
NTF_ECG = 0x11 # unit is uV
NTF_BRTH = 0x15 # unit is uV
Process data in onDataCallback.
def on_data_callback(sensor, data):
if data.dataType == DataType.NTF_EEG:
pass
elif data.dataType == DataType.NTF_ECG:
pass
# process data as you wish
for oneChannelSamples in data.channelSamples:
for sample in oneChannelSamples:
if sample.isLost:
# do some logic
pass
else:
# draw with sample.data & sample.channelIndex
# print(f"{sample.channelIndex} | {sample.sampleIndex} | {sample.data} | {sample.impedance}")
pass
sensorProfile.onDataCallback = on_data_callback
19.2 Stop data transfer
Use def stopDataNotification() -> bool to stop data transfer.
success = sensorProfile.stopDataNotification()
19.3 Check if it's data transfering
Use property isDataTransfering: bool to check if it's data transfering.
isDataTransfering = sensorProfile.isDataTransfering
20. Get battery level
Use def getBatteryLevel() -> int to get battery level. Please call after device in 'Ready' state.
batteryPower = sensorProfile.getBatteryLevel()
# batteryPower is battery level returned, value ranges from 0 to 100, 0 means out of battery, while 100 means full.
Please check console.py in examples directory
Async methods
all methods start with async is async methods, they has same params and return result as sync methods.
Please check async_console.py in examples directory
setParam method
Use def setParam(self, key: str, value: str) -> str to set parameter of sensor profile. Please call after device in 'Ready' state.
Below is available key and value:
result = sensorProfile.setParam("NTF_EMG", "ON")
# set EMG data to ON or OFF, result is "OK" if succeed
result = sensorProfile.setParam("NTF_EEG", "ON")
# set EEG data to ON or OFF, result is "OK" if succeed
result = sensorProfile.setParam("NTF_ECG", "ON")
# set ECG data to ON or OFF, result is "OK" if succeed
result = sensorProfile.setParam("NTF_IMU", "ON")
# set IMU data to ON or OFF, result is "OK" if succeed
result = sensorProfile.setParam("NTF_BRTH", "ON")
# set BRTH data to ON or OFF, result is "OK" if succeed
result = sensorProfile.setParam("FILTER_50HZ", "ON")
# set 50Hz notch filter to ON or OFF, result is "OK" if succeed
result = sensorProfile.setParam("FILTER_60HZ", "ON")
# set 60Hz notch filter to ON or OFF, result is "OK" if succeed
result = sensorProfile.setParam("FILTER_HPF", "ON")
# set 0.5Hz hpf filter to ON or OFF, result is "OK" if succeed
result = sensorProfile.setParam("FILTER_LPF", "ON")
# set 80Hz lpf filter to ON or OFF, result is "OK" if succeed
result = sensorProfile.setParam("DEBUG_BLE_DATA_PATH", "d:/temp/test.csv")
# set debug ble data path, result is "OK" if succeed
# please give an absolute path and make sure it is valid and writeable by yourself
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sensor_sdk-0.0.33.tar.gz.
File metadata
- Download URL: sensor_sdk-0.0.33.tar.gz
- Upload date:
- Size: 27.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.16
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dc21130564104303f062a1850056532047b54f7d1d037bd59d6a4a4e6b43fb27
|
|
| MD5 |
1d7a0e73cc6ba5f90cbae8ced1f12bf5
|
|
| BLAKE2b-256 |
606de6cdb96cb6436e0546217c927c0a983f97abfcba4824646dc61623118305
|
File details
Details for the file sensor_sdk-0.0.33-py3-none-any.whl.
File metadata
- Download URL: sensor_sdk-0.0.33-py3-none-any.whl
- Upload date:
- Size: 27.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.16
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d410619c25614550f7d16458f3ae724ad09a7c098598ad25e47ecdbba5484a51
|
|
| MD5 |
4fb1ddfa0d6321478e0217eff96aeed9
|
|
| BLAKE2b-256 |
a2c15a8f7909a1d5e969628a8bc2e50e668af8fac004a0866b78c2218cef2d21
|