def _update_features(self, char_handle, data, notify_update=False): """Update the features related to a given characteristic. Args: char_handle (int): The characteristic's handle to look for. data (str): The data read from the given characteristic. notify_update (bool, optional): If True all the registered listeners are notified about the new data. Returns: bool: True if the characteristic has some features associated to it and they have been updated, False otherwise. """ # Getting the features corresponding to the given characteristic. features = self._get_corresponding_features(char_handle) if features is None: return False # Computing the timestamp. timestamp = self._unwrap_timestamp.unwrap( LittleEndian.bytesToUInt16(data)) # Updating the features. offset = TIMESTAMP_OFFSET_BYTES # Timestamp's bytes. for feature in features: offset += feature.update(timestamp, data, offset, notify_update) return True
def extract_data(self, timestamp, data, offset): """Extract the data from the feature's raw data. Args: timestamp (int): Data's timestamp. data (str): The data read from the feature. offset (int): Offset where to start reading data. Returns: :class:`blue_st_sdk.feature.ExtractedData`: Container of the number of bytes read and the extracted data. Raises: :exc:`Exception` if the data array has not enough data to read. """ if len(data) - offset < self.DATA_LENGTH_BYTES: raise Exception('There are no %d bytes available to read.' \ % (self.DATA_LENGTH_BYTES)) sample = None value = LittleEndian.bytesToUInt16(data, offset) if self._is_low_range_sensor(value): sample = self._get_low_range_sample(timestamp, value) else: sample = self._get_high_range_sample(timestamp, value) return ExtractedData(sample, self.DATA_LENGTH_BYTES)
def extract_data(self, timestamp, data, offset): """Extract the data from the feature's raw data. In this case it reads a 16-bit signed integer value. Args: timestamp (int): Data's timestamp. data (str): The data read from the feature. offset (int): Offset where to start reading data. Returns: :class:`blue_st_sdk.feature.ExtractedData`: Container of the number of bytes read and the extracted data. Raises: :exc:`Exception` if the data array has not enough data to read. """ if (len(data) - offset < self.DATA_LENGTH_BYTES): raise Exception('There are no %d bytes available to read.' % (self.DATA_LENGTH_BYTES)) offset = offset flags = data[offset] offset += 1 if self.has8BitHeartRate(flags): hr = data[offset] offset += 1 else: hr = LittleEndian.bytesToUInt16(data, offset) offset += 2 if self.hasEnergyExpended(flags): ee = LittleEndian.bytesToUInt16(data, offset) offset += 2 else: ee = -1 if self.hasRRInterval(flags): rri = LittleEndian.bytesToUInt16(data, offset) / 1024.0 offset += 2 else: rri = float('nan') return ExtractedData( Sample(timestamp, [hr, ee, rri], getFieldsDescription()), offset - offset)