diff --git a/ble_interface.py b/ble_interface.py index b58a99e..70a086e 100644 --- a/ble_interface.py +++ b/ble_interface.py @@ -16,6 +16,7 @@ class ble_interface: CURRENT = "current" VOLTAGE = "volts" CONFIGURATION = "conf" + RANGE = "range" RFRSH_DELAY = "refresh_delay" ON_CONNECT = "on_connect" @@ -28,6 +29,7 @@ class ble_interface: self.services: Dict[str, BleakGATTService] = {} self.handlers = { self.CURRENT: self.__current_meas_handler, + self.RANGE: self.__range_handler, } async def __connect(self): @@ -61,18 +63,21 @@ class ble_interface: if(s.uuid == normalize_uuid_str(myUUIDs.CONFIGURATION_SERVICE)): self.services[self.CONFIGURATION] = s + + if(s.uuid == normalize_uuid_str(myUUIDs.METROLOGY_RANGE_SERVICE)): + self.services[self.RANGE] = s def connect(self): self.log.info("connecting") self.loop.create_task(self.__connect()) - def subscribe_to(self, to: str): - self.loop.create_task(self.__subscribe_to(to)) + def subscribe_to(self, to: str, char_uuid: str | None = None): + self.loop.create_task(self.__subscribe_to(to, char_uuid)) - async def __subscribe_to(self, to: str): + async def __subscribe_to(self, to: str, char_uuid: str | None): self.log.info("subscribing to %s", to) - for c in self.services[to].characteristics: + for c in filter(lambda c: (not char_uuid) or (c.uuid == char_uuid), self.services[to].characteristics): await self.client.start_notify(c, self.handlers[to]) def add_callback(self, id: str, callback): @@ -93,9 +98,125 @@ class ble_interface: handle = next(i for i,c in enumerate(self.services[self.CURRENT].characteristics) if c.handle == char.handle) self.call_callback(self.CURRENT, handle, val) - if(self.CURRENT in self.callbacks): - for c in self.callbacks[self.CURRENT]: - c(self, handle, val) + + def __range_handler(self, char: BleakGATTCharacteristic, data: bytearray): + val = struct.unpack(" int: + s = self.services[self.CONFIGURATION] + c = s.get_characteristic(myUUIDs.SAMPLING_RATE_CHAR); + if(not c): + return -1 + val = await self.client.read_gatt_char(c) + return struct.unpack(" int: + s = self.services[self.CONFIGURATION] + c = s.get_characteristic(myUUIDs.ZERO_CALI_NSAMP); + if(not c): + return -1 + val = await self.client.read_gatt_char(c) + return struct.unpack(" bool: + s = self.services[self.RANGE] + c = s.get_characteristic(myUUIDs.AUTO_RANGE_CHAR); + if(not c): + return False + val = await self.client.read_gatt_char(c) + self.log.info(val) + return struct.unpack(" bool: + s = self.services[self.RANGE] + c = s.get_characteristic(myUUIDs.ELECTRIC_CURRENT_RANGE_CHAR); + if(not c): + return False + val = await self.client.read_gatt_char(c) + self.log.info(val) + return struct.unpack("