diff --git a/python/libopenimu/db/DBManager.py b/python/libopenimu/db/DBManager.py index ff4ed026..41a5bc8b 100644 --- a/python/libopenimu/db/DBManager.py +++ b/python/libopenimu/db/DBManager.py @@ -115,7 +115,7 @@ def delete_group(self, group): # Check if we have orphan items dandling around self.clean_db() - #self.engine.execute("VACUUM") + # self.engine.execute("VACUUM") def get_group(self, id_group): query = self.session.query(Group).filter(Group.id_group == id_group) @@ -173,8 +173,7 @@ def delete_participant(self, part): # Check if we have orphan items dandling around self.clean_db() - - #self.engine.execute("VACUUM") + # self.engine.execute("VACUUM") ##################### def add_sensor(self, _id_sensor_type, _name, _hw_name, _location, _sampling_rate, _data_rate): @@ -295,6 +294,7 @@ def clean_db(self): self.delete_orphan_channels() self.delete_orphan_sensors() self.delete_orphan_processed_data() + self.engine.execute("VACUUM") def get_all_recordsets(self, participant=Participant()): diff --git a/python/libopenimu/importers/AppleWatchImporter.py b/python/libopenimu/importers/AppleWatchImporter.py index b16bec62..f21fa3b6 100644 --- a/python/libopenimu/importers/AppleWatchImporter.py +++ b/python/libopenimu/importers/AppleWatchImporter.py @@ -29,6 +29,7 @@ import os import zipfile import struct +import json # For file header config from collections import defaultdict @@ -52,6 +53,7 @@ def load(self, filename): print('AppleWatchImporter.load') results = {} + # Removed zip loading for now, if 'zip' in filename: results = self.load_zip(filename) else: @@ -101,10 +103,6 @@ def load_zip(self, filename): if len(values[timestamp]['motion']) > 0: results[timestamp]['motion'] = values[timestamp]['motion'] - # if len(values[timestamp]['location']) > 0: - # results[timestamp]['location'] = values[timestamp]['location'] - # pass - if len(values[timestamp]['coordinates']) > 0: results[timestamp]['coordinates'] = values[timestamp]['coordinates'] else: @@ -164,7 +162,40 @@ def import_motion_to_database(self, sample_rate, timestamp, recordset, sensors, for i in range(len(channels['gyro'])): self.add_sensor_data_to_db(recordset, sensors['gyro'], channels['gyro'][i], datetime.datetime.fromtimestamp(timestamp), - datetime.datetime.fromtimestamp(end_timestamp), values[0:real_size, i + 6]) + datetime.datetime.fromtimestamp(end_timestamp), values[0:real_size, i + 3]) + + #self.db.commit() + + def import_raw_motion_to_database(self, sample_rate, timestamp, recordset, sensors, channels, data: list): + + # print('import_motion_to_database') + # print('data', data, len(data)) + + values = np.array(data, dtype=np.float32) + # print("Values shape: ", values.shape) + end_timestamp = timestamp + int(np.floor(len(values) / sample_rate)) + # print("timestamps, ", timestamp, end_timestamp) + + # Calculate last index to remove extra values + real_size = int(np.floor(len(values) / sample_rate) * sample_rate) + # print('real size:', real_size) + + # Update end_timestamp if required + if end_timestamp > recordset.end_timestamp.timestamp(): + recordset.end_timestamp = datetime.datetime.fromtimestamp(end_timestamp) + + if real_size > 0: + # Acc + for i in range(len(channels['raw_acc'])): + self.add_sensor_data_to_db(recordset, sensors['raw_acc'], channels['raw_acc'][i], + datetime.datetime.fromtimestamp(timestamp), + datetime.datetime.fromtimestamp(end_timestamp), values[0:real_size, i]) + + # Gyro + for i in range(len(channels['raw_gyro'])): + self.add_sensor_data_to_db(recordset, sensors['raw_gyro'], channels['raw_gyro'][i], + datetime.datetime.fromtimestamp(timestamp), + datetime.datetime.fromtimestamp(end_timestamp), values[0:real_size, i + 3]) #self.db.commit() @@ -304,18 +335,13 @@ def import_sensoria_to_database(self, sample_rate, timestamp, recordset, sensors #self.db.commit() def import_beacons_to_database(self, sample_rate, timestamp, recordset, sensors, channels, data: list): - """end_timestamp = timestamp + int(np.floor(len(data) / sample_rate)) - - # Update end_timestamp if required - if end_timestamp > recordset.end_timestamp.timestamp(): - recordset.end_timestamp = datetime.datetime.fromtimestamp(end_timestamp)""" # Creates list of unique beacons ids (built from namespace and instance id) namespaces = [val[0:16] for val in data] txs = [val[16] for val in data] rssi = [val[17] for val in data] namespaces = [[str(format(x, 'x')).rjust(2, '0') for x in tup] for tup in namespaces] - #names = [] + beacons = defaultdict(list) index = 0 for name in namespaces: @@ -331,19 +357,19 @@ def import_beacons_to_database(self, sample_rate, timestamp, recordset, sensors, beacon_data.rssi = np.int8(rssi[index]) beacons[beacon_id].append(beacon_data) - index+=1 + index += 1 for beacon_id in beacons.keys(): beacon_channel = [x for x in channels['beacons'] if x.label == beacon_id] beacon_data = np.array(beacons[beacon_id]) - end_timestamp = timestamp + int(np.floor(len(beacon_data.tobytes()) / sample_rate / 8)) + # TODO: Should be more precise and use "real" timestamps... + end_timestamp = timestamp + 1 #int(np.floor(len(beacon_data.tobytes()) / sample_rate / 8)) # Update end_timestamp if required if end_timestamp > recordset.end_timestamp.timestamp(): recordset.end_timestamp = datetime.datetime.fromtimestamp(end_timestamp) - #TODO: Serialize and save more than one sample - #for beacon_data in beacons[beacon_id]: + self.add_sensor_data_to_db(recordset, sensors['beacons'], beacon_channel[0], datetime.datetime.fromtimestamp(timestamp), datetime.datetime.fromtimestamp(end_timestamp), beacon_data) @@ -352,107 +378,174 @@ def import_beacons_to_database(self, sample_rate, timestamp, recordset, sensors, def import_to_database(self, result): print('AppleWatchImporter.import_to_database') + sensors = {} + channels = {} - # Sample rate is hardcoded for now - sample_rate = 50 + if result is None: + return # Create sensors - accelerometer_sensor = self.add_sensor_to_db(SensorType.ACCELEROMETER, 'Accelerometer', - 'AppleWatch', - 'Unknown', sample_rate, 1) + if result['sampling_rate'].__contains__(self.PROCESSED_MOTION_ID): + accelerometer_sensor = self.add_sensor_to_db(SensorType.ACCELEROMETER, 'Accelerometer', + 'AppleWatch', + 'Unknown', result['sampling_rate'][self.PROCESSED_MOTION_ID], 1) - accelerometer_channels = list() + accelerometer_channels = list() - # Create channels - accelerometer_channels.append(self.add_channel_to_db(accelerometer_sensor, Units.GRAVITY_G, - DataFormat.FLOAT32, 'Accelerometer_X')) + # Create channels + accelerometer_channels.append(self.add_channel_to_db(accelerometer_sensor, Units.GRAVITY_G, + DataFormat.FLOAT32, 'Accelerometer_X')) - accelerometer_channels.append(self.add_channel_to_db(accelerometer_sensor, Units.GRAVITY_G, - DataFormat.FLOAT32, 'Accelerometer_Y')) + accelerometer_channels.append(self.add_channel_to_db(accelerometer_sensor, Units.GRAVITY_G, + DataFormat.FLOAT32, 'Accelerometer_Y')) - accelerometer_channels.append(self.add_channel_to_db(accelerometer_sensor, Units.GRAVITY_G, - DataFormat.FLOAT32, 'Accelerometer_Z')) + accelerometer_channels.append(self.add_channel_to_db(accelerometer_sensor, Units.GRAVITY_G, + DataFormat.FLOAT32, 'Accelerometer_Z')) - # Create sensor - gyro_sensor = self.add_sensor_to_db(SensorType.GYROMETER, 'Gyro', - 'AppleWatch', - 'Unknown', sample_rate, 1) + # Create sensor + gyro_sensor = self.add_sensor_to_db(SensorType.GYROMETER, 'Gyro', + 'AppleWatch', + 'Unknown', result['sampling_rate'][self.PROCESSED_MOTION_ID], 1) - gyro_channels = list() + gyro_channels = list() - # Create channels - gyro_channels.append(self.add_channel_to_db(gyro_sensor, Units.DEG_PER_SEC, - DataFormat.FLOAT32, 'Gyro_X')) + # Create channels + gyro_channels.append(self.add_channel_to_db(gyro_sensor, Units.DEG_PER_SEC, + DataFormat.FLOAT32, 'Gyro_X')) - gyro_channels.append(self.add_channel_to_db(gyro_sensor, Units.DEG_PER_SEC, - DataFormat.FLOAT32, 'Gyro_Y')) + gyro_channels.append(self.add_channel_to_db(gyro_sensor, Units.DEG_PER_SEC, + DataFormat.FLOAT32, 'Gyro_Y')) - gyro_channels.append(self.add_channel_to_db(gyro_sensor, Units.DEG_PER_SEC, - DataFormat.FLOAT32, 'Gyro_Z')) + gyro_channels.append(self.add_channel_to_db(gyro_sensor, Units.DEG_PER_SEC, + DataFormat.FLOAT32, 'Gyro_Z')) - # Battery - battery_sensor = self.add_sensor_to_db(SensorType.BATTERY, 'Battery', 'AppleWatch', 'Unknown', 1, 1) + sensors['acc'] = accelerometer_sensor + sensors['gyro'] = gyro_sensor + channels['acc'] = accelerometer_channels + channels['gyro'] = gyro_channels - battery_channel = self.add_channel_to_db(battery_sensor, Units.VOLTS, DataFormat.FLOAT32, 'Battery Percentage') + # Battery + if result['sampling_rate'].__contains__(self.BATTERY_ID): + battery_sensor = self.add_sensor_to_db(SensorType.BATTERY, 'Battery', 'AppleWatch', 'Unknown', result['sampling_rate'][self.BATTERY_ID], 1) + battery_channel = self.add_channel_to_db(battery_sensor, Units.VOLTS, DataFormat.FLOAT32, 'Battery Percentage') + sensors['batt'] = battery_sensor + channels['batt'] = battery_channel # Heartrate - heartrate_sensor = self.add_sensor_to_db(SensorType.HEARTRATE, 'Heartrate', 'AppleWatch', 'Unknown', 1, 1) - - heartrate_channel = self.add_channel_to_db(heartrate_sensor, Units.BPM, DataFormat.FLOAT32, 'Heartrate') + if result['sampling_rate'].__contains__(self.HEARTRATE_ID): + heartrate_sensor = self.add_sensor_to_db(SensorType.HEARTRATE, 'Heartrate', 'AppleWatch', 'Unknown', result['sampling_rate'][self.HEARTRATE_ID], 1) + heartrate_channel = self.add_channel_to_db(heartrate_sensor, Units.BPM, DataFormat.FLOAT32, 'Heartrate') + sensors['heartrate'] = heartrate_sensor + channels['heartrate'] = heartrate_channel # Coordinates - coordinates_sensor = self.add_sensor_to_db(SensorType.GPS, 'Coordinates', 'AppleWatch', 'Unknown', 1, 1) - - coordinates_channel = self.add_channel_to_db(coordinates_sensor, Units.NONE, DataFormat.UINT8, 'Coordinates') + if result['sampling_rate'].__contains__(self.COORDINATES_ID): + coordinates_sensor = self.add_sensor_to_db(SensorType.GPS, 'Coordinates', 'AppleWatch', 'Unknown', result['sampling_rate'][self.COORDINATES_ID], 1) + coordinates_channel = self.add_channel_to_db(coordinates_sensor, Units.NONE, DataFormat.UINT8, 'Coordinates') + sensors['coordinates'] = coordinates_sensor + channels['coordinates'] = coordinates_channel # Sensoria - sensoria_acc_sensor = self.add_sensor_to_db(SensorType.ACCELEROMETER, 'Accelerometer', 'Sensoria', 'Foot', - sample_rate, 1) - - sensoria_acc_channels = list() - sensoria_acc_channels.append(self.add_channel_to_db(sensoria_acc_sensor, Units.GRAVITY_G, - DataFormat.FLOAT32, 'Accelerometer_X')) - sensoria_acc_channels.append(self.add_channel_to_db(sensoria_acc_sensor, Units.GRAVITY_G, - DataFormat.FLOAT32, 'Accelerometer_Y')) - sensoria_acc_channels.append(self.add_channel_to_db(sensoria_acc_sensor, Units.GRAVITY_G, - DataFormat.FLOAT32, 'Accelerometer_Z')) - - sensoria_gyro_sensor = self.add_sensor_to_db(SensorType.GYROMETER, 'Gyrometer', 'Sensoria', 'Foot', - sample_rate, 1) - sensoria_gyro_channels = list() - sensoria_gyro_channels.append(self.add_channel_to_db(sensoria_gyro_sensor, Units.DEG_PER_SEC, - DataFormat.FLOAT32, 'Gyro_X')) - sensoria_gyro_channels.append(self.add_channel_to_db(sensoria_gyro_sensor, Units.DEG_PER_SEC, - DataFormat.FLOAT32, 'Gyro_Y')) - sensoria_gyro_channels.append(self.add_channel_to_db(sensoria_gyro_sensor, Units.DEG_PER_SEC, - DataFormat.FLOAT32, 'Gyro_Z')) - - sensoria_mag_sensor = self.add_sensor_to_db(SensorType.MAGNETOMETER, 'Magnetometer', 'Sensoria', 'Foot', - sample_rate, 1) - sensoria_mag_channels = list() - sensoria_mag_channels.append(self.add_channel_to_db(sensoria_mag_sensor, Units.GAUSS, - DataFormat.FLOAT32, 'Mag_X')) - sensoria_mag_channels.append(self.add_channel_to_db(sensoria_mag_sensor, Units.GAUSS, - DataFormat.FLOAT32, 'Mag_Y')) - sensoria_mag_channels.append(self.add_channel_to_db(sensoria_mag_sensor, Units.GAUSS, - DataFormat.FLOAT32, 'Mag_Z')) - - sensoria_fsr_sensor = self.add_sensor_to_db(SensorType.FSR, 'FSR', 'Sensoria', 'Foot', - sample_rate, 1) - sensoria_fsr_channels = list() - sensoria_fsr_channels.append(self.add_channel_to_db(sensoria_fsr_sensor, Units.NONE, - DataFormat.SINT16, 'META-1')) - sensoria_fsr_channels.append(self.add_channel_to_db(sensoria_fsr_sensor, Units.NONE, - DataFormat.SINT16, 'META-5')) - sensoria_fsr_channels.append(self.add_channel_to_db(sensoria_fsr_sensor, Units.NONE, - DataFormat.SINT16, 'HEEL')) + if result['sampling_rate'].__contains__(self.SENSORIA_ID): + sensoria_acc_sensor = self.add_sensor_to_db(SensorType.ACCELEROMETER, 'Accelerometer', 'Sensoria', 'Foot', + result['sampling_rate'][self.SENSORIA_ID], 1) + + sensoria_acc_channels = list() + sensoria_acc_channels.append(self.add_channel_to_db(sensoria_acc_sensor, Units.GRAVITY_G, + DataFormat.FLOAT32, 'Accelerometer_X')) + sensoria_acc_channels.append(self.add_channel_to_db(sensoria_acc_sensor, Units.GRAVITY_G, + DataFormat.FLOAT32, 'Accelerometer_Y')) + sensoria_acc_channels.append(self.add_channel_to_db(sensoria_acc_sensor, Units.GRAVITY_G, + DataFormat.FLOAT32, 'Accelerometer_Z')) + + sensoria_gyro_sensor = self.add_sensor_to_db(SensorType.GYROMETER, 'Gyrometer', 'Sensoria', 'Foot', + result['sampling_rate'][self.SENSORIA_ID], 1) + sensoria_gyro_channels = list() + sensoria_gyro_channels.append(self.add_channel_to_db(sensoria_gyro_sensor, Units.DEG_PER_SEC, + DataFormat.FLOAT32, 'Gyro_X')) + sensoria_gyro_channels.append(self.add_channel_to_db(sensoria_gyro_sensor, Units.DEG_PER_SEC, + DataFormat.FLOAT32, 'Gyro_Y')) + sensoria_gyro_channels.append(self.add_channel_to_db(sensoria_gyro_sensor, Units.DEG_PER_SEC, + DataFormat.FLOAT32, 'Gyro_Z')) + + sensoria_mag_sensor = self.add_sensor_to_db(SensorType.MAGNETOMETER, 'Magnetometer', 'Sensoria', 'Foot', + result['sampling_rate'][self.SENSORIA_ID], 1) + sensoria_mag_channels = list() + sensoria_mag_channels.append(self.add_channel_to_db(sensoria_mag_sensor, Units.GAUSS, + DataFormat.FLOAT32, 'Mag_X')) + sensoria_mag_channels.append(self.add_channel_to_db(sensoria_mag_sensor, Units.GAUSS, + DataFormat.FLOAT32, 'Mag_Y')) + sensoria_mag_channels.append(self.add_channel_to_db(sensoria_mag_sensor, Units.GAUSS, + DataFormat.FLOAT32, 'Mag_Z')) + + sensoria_fsr_sensor = self.add_sensor_to_db(SensorType.FSR, 'FSR', 'Sensoria', 'Foot', + result['sampling_rate'][self.SENSORIA_ID], 1) + sensoria_fsr_channels = list() + sensoria_fsr_channels.append(self.add_channel_to_db(sensoria_fsr_sensor, Units.NONE, + DataFormat.SINT16, 'META-1')) + sensoria_fsr_channels.append(self.add_channel_to_db(sensoria_fsr_sensor, Units.NONE, + DataFormat.SINT16, 'META-5')) + sensoria_fsr_channels.append(self.add_channel_to_db(sensoria_fsr_sensor, Units.NONE, + DataFormat.SINT16, 'HEEL')) + + sensors['sensoria_acc'] = sensoria_acc_sensor + sensors['sensoria_gyro'] = sensoria_gyro_sensor + sensors['sensoria_mag'] = sensoria_mag_sensor + sensors['sensoria_fsr'] = sensoria_fsr_sensor + channels['sensoria_acc'] = sensoria_acc_channels + channels['sensoria_gyro'] = sensoria_gyro_channels + channels['sensoria_mag'] = sensoria_mag_channels + channels['sensoria_fsr'] = sensoria_fsr_channels #Beacons - beacons_sensor = self.add_sensor_to_db(SensorType.BEACON, 'Beacons', 'Kontact', 'Environment', 1, 1) - beacons_channels = list() + if result['sampling_rate'].__contains__(self.BEACONS_ID): + beacons_sensor = self.add_sensor_to_db(SensorType.BEACON, 'Beacons', 'Kontact', 'Environment', result['sampling_rate'][self.BEACONS_ID], 1) + beacons_channels = list() + sensors['beacons'] = beacons_sensor + channels['beacons'] = beacons_channels + + # Raw Motion + if result['sampling_rate'].__contains__(self.RAW_MOTION_ID): + raw_accelerometer_sensor = self.add_sensor_to_db(SensorType.ACCELEROMETER, 'Raw Accelerometer', + 'AppleWatch', + 'Unknown', result['sampling_rate'][self.RAW_MOTION_ID], 1) + + raw_accelerometer_channels = list() + + # Create channels + raw_accelerometer_channels.append(self.add_channel_to_db(raw_accelerometer_sensor, Units.GRAVITY_G, + DataFormat.FLOAT32, 'Accelerometer_X')) + + raw_accelerometer_channels.append(self.add_channel_to_db(raw_accelerometer_sensor, Units.GRAVITY_G, + DataFormat.FLOAT32, 'Accelerometer_Y')) + + raw_accelerometer_channels.append(self.add_channel_to_db(raw_accelerometer_sensor, Units.GRAVITY_G, + DataFormat.FLOAT32, 'Accelerometer_Z')) + + # Create sensor + raw_gyro_sensor = self.add_sensor_to_db(SensorType.GYROMETER, 'Raw Gyro', + 'AppleWatch', + 'Unknown', result['sampling_rate'][self.RAW_MOTION_ID], 1) + + raw_gyro_channels = list() + + # Create channels + raw_gyro_channels.append(self.add_channel_to_db(raw_gyro_sensor, Units.DEG_PER_SEC, + DataFormat.FLOAT32, 'Gyro_X')) + + raw_gyro_channels.append(self.add_channel_to_db(raw_gyro_sensor, Units.DEG_PER_SEC, + DataFormat.FLOAT32, 'Gyro_Y')) + + raw_gyro_channels.append(self.add_channel_to_db(raw_gyro_sensor, Units.DEG_PER_SEC, + DataFormat.FLOAT32, 'Gyro_Z')) + + sensors['raw_acc'] = raw_accelerometer_sensor + sensors['raw_gyro'] = raw_gyro_sensor + channels['raw_acc'] = raw_accelerometer_channels + channels['raw_gyro'] = raw_gyro_channels # Create sensor and channels dict - sensors = {'acc': accelerometer_sensor, + """sensors = {'acc': accelerometer_sensor, 'gyro': gyro_sensor, 'batt': battery_sensor, 'heartrate': heartrate_sensor, @@ -461,7 +554,10 @@ def import_to_database(self, result): 'sensoria_gyro': sensoria_gyro_sensor, 'sensoria_mag': sensoria_mag_sensor, 'sensoria_fsr': sensoria_fsr_sensor, - 'beacons': beacons_sensor} + 'beacons': beacons_sensor, + 'raw_acc': raw_accelerometer_sensor, + 'raw_gyro': raw_gyro_sensor + } channels = {'acc': accelerometer_channels, 'gyro': gyro_channels, @@ -472,12 +568,11 @@ def import_to_database(self, result): 'sensoria_gyro': sensoria_gyro_channels, 'sensoria_mag': sensoria_mag_channels, 'sensoria_fsr': sensoria_fsr_channels, - 'beacons': beacons_channels + 'beacons': beacons_channels, + 'raw_acc': raw_accelerometer_channels, + 'raw_gyro': raw_gyro_channels } - - if result is None: - return - + """ for timestamp in result: # Change recordset each day recordset = self.get_recordset(timestamp) @@ -488,47 +583,95 @@ def import_to_database(self, result): if result[timestamp].__contains__('battery'): # print('battery') if result[timestamp]['battery']: - self.import_battery_to_database(1, timestamp, recordset, sensors, channels, + self.import_battery_to_database(result['sampling_rate'][self.BATTERY_ID], timestamp, recordset, sensors, channels, result[timestamp]['battery']) if result[timestamp].__contains__('beacons'): # print('beacons') if result[timestamp]['beacons']: - self.import_beacons_to_database(1, timestamp, recordset, sensors, channels, - result[timestamp]['beacons']) + self.import_beacons_to_database(result['sampling_rate'][self.BEACONS_ID], timestamp, recordset, sensors, channels, + result[timestamp]['beacons']) pass if result[timestamp].__contains__('sensoria'): # print('sensoria') if result[timestamp]['sensoria']: - self.import_sensoria_to_database(sample_rate, timestamp, recordset, sensors, channels, + self.import_sensoria_to_database(result['sampling_rate'][self.SENSORIA_ID], timestamp, recordset, sensors, channels, result[timestamp]['sensoria']) pass if result[timestamp].__contains__('heartrate'): # print('heartrate') if result[timestamp]['heartrate']: - self.import_heartrate_to_database(1, timestamp, recordset, sensors, channels, - result[timestamp]['heartrate']) + self.import_heartrate_to_database(result['sampling_rate'][self.HEARTRATE_ID], timestamp, recordset, sensors, channels, + result[timestamp]['heartrate']) if result[timestamp].__contains__('motion'): # print('motion') if result[timestamp]['motion']: - self.import_motion_to_database(sample_rate, timestamp, recordset, sensors, channels, - result[timestamp]['motion']) + self.import_motion_to_database(result['sampling_rate'][self.PROCESSED_MOTION_ID], timestamp, recordset, sensors, channels, + result[timestamp]['motion']) if result[timestamp].__contains__('coordinates'): # print('coordinates') if result[timestamp]['coordinates']: - self.import_coordinates_to_database(1, timestamp, recordset, sensors, channels, - result[timestamp]['coordinates']) + self.import_coordinates_to_database(result['sampling_rate'][self.COORDINATES_ID], timestamp, recordset, sensors, channels, + result[timestamp]['coordinates']) + + if result[timestamp].__contains__('raw_motion'): + # print('coordinates') + if result[timestamp]['raw_motion']: + self.import_raw_motion_to_database(result['sampling_rate'][self.RAW_MOTION_ID], timestamp, recordset, sensors, channels, + result[timestamp]['raw_motion']) # Commit to DB self.db.commit() + def get_sampling_rate_from_header(self, sensor_id, header): #header = string of json + sample_rate = 0 + json_settings = json.loads(header) # converts to json + + if sensor_id == self.BATTERY_ID: + sample_rate = 1 / 3 # Default value (if file version = 1) + # Sampling rate + if header != "": + interval = json_settings.get('check_interval') + if interval: + sample_rate = 1 / interval + + if sensor_id == self.COORDINATES_ID: + sample_rate = 1 / 10 # Default value (if file version = 1) + # Sampling rate + if header != "": + interval = json_settings.get('period') + if interval: + sample_rate = 1 / interval + + if sensor_id == self.RAW_MOTION_ID or sensor_id == self.PROCESSED_MOTION_ID: + sample_rate = 50 + if header != "": + interval = json_settings.get('frequency') + if interval: + sample_rate = interval + + if sensor_id == self.HEARTRATE_ID: + sample_rate = 1 / 3 # Default value (if file version = 1) + # Sampling rate + if header != "": + interval = json_settings.get('sampling_interval') + if interval: + sample_rate = 1 / interval + + if sensor_id == self.BEACONS_ID: + sample_rate = 1 #No sampling rate in beacons config + + if sensor_id == self.SENSORIA_ID: + sample_rate = 32 #TODO: check header config for sensoria + + return sample_rate def readDataFile(self, file, debug=False): - ''' + """ All binary files have a similar header • Two bytes for file identifier (based on Wimu format): 0xEA, 0xEA • File Version byte: eg. 0x01 @@ -541,9 +684,12 @@ def readDataFile(self, file, debug=False): * Location : 5 ◦ Beacons: 6 ◦ Coordinates: 7 - ''' + """ results = {} + results['sampling_rate'] = {} + + settings_json_str = "" [file_header_id, version, participant_id, sensor_id] = struct.unpack("