import sys, os, time import logging import struct from bluepy.btle import ( Peripheral, DefaultDelegate, ADDR_TYPE_RANDOM, ADDR_TYPE_PUBLIC, BTLEException, BTLEDisconnectError ) from datetime import datetime, timedelta from Crypto.Cipher import AES from datetime import datetime from constants import ( UUIDS, AUTH_STATES, QUEUE_TYPES, BYTEPATTERNS ) from queue import Queue, Empty class Delegate(DefaultDelegate): def __init__(self, device): DefaultDelegate.__init__(self) self.device = device self.pkg = 0 def handleNotification(self, hnd, data): if hnd == self.device._char_auth.getHandle(): if data[:3] == BYTEPATTERNS.fetch_begin: self.device._req_rdn() elif data[:3] == BYTEPATTERNS.fetch_error: self.device.state = AUTH_STATES.KEY_SENDING_FAILED elif data[:3] == BYTEPATTERNS.fetch_continue: random_nr = data[3:] self.device._send_enc_rdn(random_nr) elif data[:3] == BYTEPATTERNS.fetch_complete: self.device.state = AUTH_STATES.REQUEST_RN_ERROR elif data[:3] == BYTEPATTERNS.auth_ok: self.device.state = AUTH_STATES.AUTH_OK else: self.device.state = AUTH_STATES.AUTH_FAILED elif hnd == self.device._char_heart_measure.getHandle(): self.device.queue.put((QUEUE_TYPES.HEART, data)) elif hnd == 0x38: if len(data) == 20 and struct.unpack('b', data[0:1])[0] == 1: self.device.queue.put((QUEUE_TYPES.RAW_ACCEL, data)) elif len(data) == 16: self.device.queue.put((QUEUE_TYPES.RAW_HEART, data)) else: print("Unhandled data on handle 0x38: {}".format(data)) elif hnd == self.device._char_hz.getHandle(): if len(data) == 20 and struct.unpack('b', data[0:1])[0] == 1: self.device.queue.put((QUEUE_TYPES.RAW_GYRO, data)) elif len(data) == 11: #print("Unknown data: {}".format(bytes.hex(data, " "))) #print(struct.unpack('BBBBBBBBBB', data[1:])) # Seems to be a counter of the time the gyro is enabled. #print(struct.unpack(">x2L", data)) #print(struct.unpack("= 12: heartbeat_time = time.time() self.send_heart_measure_keepalive() self.send_gyro_start(sensitivity)