In [11]:
import numpy as np
import pandas as pd
import seaborn as sns
%matplotlib inline
Сценарий:
- заранее выдвигаем шторку с фонариком и запускаем браузер
- включаем мониторинг
- мигаем фонариком пять раз
- задвигаем шторку, ждем чуть больше минуты
- жмем на загрузку файла, ждем окончания
- ждем еще несколько секунд, стопаем мониторинг
Читаем данные из порта USB в файл:
cat /dev/cu.usbmodem1421 > browser_download.bin
Они будут в бинарном формате, прочитаем их в DataFrame и сконвертируем в миллиамперы:
In [2]:
df = pd.DataFrame(np.fromfile(
"./browser_download.bin",
dtype=np.uint16).astype(np.float32) * (3300 / 2**12))
Группируем по миллисекундам и усредняем:
In [3]:
df_r1000 = df.groupby(df.index//1000).mean()
fig = sns.plt.figure(figsize=(16, 6))
ax = sns.plt.subplot()
df_r1000.plot(ax=ax)
Out[3]:
Интересные нам всплески потребления кончаются где-то на 10000-ной миллисекунде (их пять подряд, мы моргали лампочкой пять раз).
In [4]:
fig = sns.plt.figure(figsize=(16, 6))
ax = sns.plt.subplot()
df_r1000[:12000].plot(ax=ax)
Out[4]:
Синхронизируемся по 4-му всплеску, кажется, он самый острый:
In [5]:
fig = sns.plt.figure(figsize=(16, 6))
ax = sns.plt.subplot()
df_r1000[5000:5200].plot(ax=ax)
sns.plt.axvline(5078)
sync = 5078
Грузим события из лога (adb logcat -d |egrep "DownloadTracking|onTorchStatusChanged"
):
In [6]:
from datetime import datetime
with open("browser_download.log") as eventlog:
events = [
datetime.strptime(
l.split()[1], "%H:%M:%S.%f")
for l in eventlog.readlines()]
offsets = [(ev - events[0]).total_seconds() for ev in events]
И построим их на нашем графике:
In [7]:
fig = sns.plt.figure(figsize=(16, 6))
ax = sns.plt.subplot()
df_r1000.plot(ax=ax)
for o in offsets:
sns.plt.axvline(sync + (o - offsets[7]) * 1000)
Seems like ok. Нас интересует первый стабильный период в районе 15000 - 75000 и период скачивания -- последние две метки.
In [8]:
fig = sns.plt.figure(figsize=(16, 6))
ax = sns.plt.subplot()
df_r1000[15000:75000].plot(ax=ax)
for o in offsets:
sns.plt.axvline(sync + (o - offsets[7]) * 1000)
In [9]:
fig = sns.plt.figure(figsize=(16, 6))
ax = sns.plt.subplot()
df_r1000[
int(sync + (offsets[-2] - offsets[7]) * 1000):int(
sync + (offsets[-1] - offsets[7]) * 1000)].plot(ax=ax)
for o in offsets:
sns.plt.axvline(sync + (o - offsets[7]) * 1000)
Сравниваем средние:
In [10]:
curr_mean_idle = df_r1000[15000:75000].mean()
curr_mean_download = df_r1000[
int(sync + (offsets[-2] - offsets[7]) * 1000):int(
sync + (offsets[-1] - offsets[7]) * 1000)].mean()
print("Среднее значение тока в покое, мА: %.2f" % curr_mean_idle)
print("Среднее значение тока во время загрузки, мА: %.2f" % curr_mean_download)
print("Разница, мА: %.2f" % (curr_mean_download - curr_mean_idle))