-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbatterymanager_csvconverter.py
More file actions
77 lines (65 loc) · 2.97 KB
/
Copy pathbatterymanager_csvconverter.py
File metadata and controls
77 lines (65 loc) · 2.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import pandas as pd
import numpy as np
import re
import os
RAW_DATA = './BeatSaber-W/PopStars-Easy/record/battery_manager.log'
HEADER_PATTERN = 'BatteryMgr:DataCollectionService: onStartCommand: rawFields => '
DATA_PATTERN = 'BatteryMgr:DataCollectionService: stats => '
def preprocess_values(df):
df['Timestamp'] = df['Timestamp'] - df['Timestamp'][0]
# conversion from microseconds to seconds
df['Timestamp'] = df['Timestamp'] / 1000
return df
def calculate_power(df):
df['power'] = (abs(df['BATTERY_PROPERTY_CURRENT_NOW']) / 1000 / 1000) * (df['EXTRA_VOLTAGE'] / 1000)
return df
def trapezoid_method(df):
return np.trapz(df['power'].values, df['Timestamp'].values)
def get_column_names(file):
pattern = re.compile(HEADER_PATTERN)
cols = []
for line in open(file, encoding='utf-16'):
if pattern.search(line):
cols = line.split(HEADER_PATTERN)[1].split(',')
cols = [col.strip() for col in cols]
break
return cols
def get_data(file):
pattern = re.compile(DATA_PATTERN)
data = []
for line in open(file, encoding='utf-16'):
if pattern.search(line):
data.append(line.split(DATA_PATTERN)[1].strip('\n').split(','))
return data
def generate_csv(data_path):
cols = get_column_names(data_path)
data = get_data(data_path)
df = pd.DataFrame(data, columns=cols)
# df.to_csv('test-paul-controls-bs3/batterymanager.csv', index=False)
df['Timestamp'] = np.int64(df['Timestamp'])
df['BATTERY_PROPERTY_CURRENT_NOW'] = np.int64(df['BATTERY_PROPERTY_CURRENT_NOW'])
df['EXTRA_VOLTAGE'] = np.int64(df['EXTRA_VOLTAGE'])
df = preprocess_values(df)
df = calculate_power(df)
# print(RAW_DATA)
# print("Energy (J) = ", trapezoid_method(df))
# df.to_csv(data_path.strip('.log') + '.csv', index=False)
return df
def main():
df_aggregated = pd.DataFrame(columns=['device', 'app', 'app_details', 'is_record', 'is_wireless', 'repetition', 'energy(J)'])
for root, dirs, files in os.walk(".", topdown=False):
for name in files:
if name == 'battery_manager.log':
# print(os.path.join(root, name))
energy = trapezoid_method(generate_csv(os.path.join(root, name)))
device = root.split('\\')[1]
app = root.split('\\')[2].strip('-W')
app_details = root.split('\\')[3]
is_record = 'record' in root.split('\\')[4]
is_wireless = '-W' in root.split('\\')[2]
repetition = root.split('\\')[4].strip('record') if 'record' in root.split('\\')[4] else root.split('\\')[4].strip('replay')
df_aggregated = pd.concat([df_aggregated, pd.DataFrame([[device, app, app_details, is_record, is_wireless, repetition, energy]], columns=['device', 'app', 'app_details', 'is_record', 'is_wireless', 'repetition', 'energy(J)'])])
print(df_aggregated)
df_aggregated.to_csv('energy.csv', index=False)
if __name__ == '__main__':
main()