blob: a2e06b3a3726b2171214c4d5cbc56af9de3a9e43 [file] [log] [blame]
Sergei Trofimov4593d862017-09-22 13:46:32 +01001from __future__ import division
Sergei Trofimov4adefec2017-06-06 14:26:50 +01002from devlib.instrument import (Instrument, CONTINUOUS,
3 MeasurementsCsv, MeasurementType)
4from devlib.utils.rendering import (GfxinfoFrameCollector,
Sergei Trofimov1d3b4c82017-06-06 17:34:59 +01005 SurfaceFlingerFrameCollector,
6 SurfaceFlingerFrame,
Sergei Trofimov4adefec2017-06-06 14:26:50 +01007 read_gfxinfo_columns)
8
9
Sergei Trofimov1d3b4c82017-06-06 17:34:59 +010010class FramesInstrument(Instrument):
Sergei Trofimov4adefec2017-06-06 14:26:50 +010011
12 mode = CONTINUOUS
Sergei Trofimov1d3b4c82017-06-06 17:34:59 +010013 collector_cls = None
Sergei Trofimov4adefec2017-06-06 14:26:50 +010014
Sergei Trofimov1d3b4c82017-06-06 17:34:59 +010015 def __init__(self, target, collector_target, period=2, keep_raw=True):
16 super(FramesInstrument, self).__init__(target)
17 self.collector_target = collector_target
Sergei Trofimov4adefec2017-06-06 14:26:50 +010018 self.period = period
19 self.keep_raw = keep_raw
Marc Bonnici7dd934a2017-08-03 16:41:10 +010020 self.sample_rate_hz = 1 / self.period
Sergei Trofimov4adefec2017-06-06 14:26:50 +010021 self.collector = None
22 self.header = None
23 self._need_reset = True
Sergei Trofimov823ce712017-08-30 14:55:42 +010024 self._raw_file = None
Sergei Trofimov4adefec2017-06-06 14:26:50 +010025 self._init_channels()
26
27 def reset(self, sites=None, kinds=None, channels=None):
Sergei Trofimov1d3b4c82017-06-06 17:34:59 +010028 super(FramesInstrument, self).reset(sites, kinds, channels)
29 self.collector = self.collector_cls(self.target, self.period,
30 self.collector_target, self.header)
Sergei Trofimov4adefec2017-06-06 14:26:50 +010031 self._need_reset = False
Sergei Trofimov823ce712017-08-30 14:55:42 +010032 self._raw_file = None
Sergei Trofimov4adefec2017-06-06 14:26:50 +010033
34 def start(self):
35 if self._need_reset:
36 self.reset()
37 self.collector.start()
38
39 def stop(self):
40 self.collector.stop()
41 self._need_reset = True
42
43 def get_data(self, outfile):
Sergei Trofimov4adefec2017-06-06 14:26:50 +010044 if self.keep_raw:
Sergei Trofimov823ce712017-08-30 14:55:42 +010045 self._raw_file = outfile + '.raw'
46 self.collector.process_frames(self._raw_file)
Sergei Trofimov4adefec2017-06-06 14:26:50 +010047 active_sites = [chan.label for chan in self.active_channels]
48 self.collector.write_frames(outfile, columns=active_sites)
Marc Bonnici049b2752017-08-03 16:43:32 +010049 return MeasurementsCsv(outfile, self.active_channels, self.sample_rate_hz)
Sergei Trofimov4adefec2017-06-06 14:26:50 +010050
Sergei Trofimov823ce712017-08-30 14:55:42 +010051 def get_raw(self):
52 return [self._raw_file] if self._raw_file else []
53
Sergei Trofimov4adefec2017-06-06 14:26:50 +010054 def _init_channels(self):
Sergei Trofimov1d3b4c82017-06-06 17:34:59 +010055 raise NotImplementedError()
56
57
58class GfxInfoFramesInstrument(FramesInstrument):
59
60 mode = CONTINUOUS
61 collector_cls = GfxinfoFrameCollector
62
63 def _init_channels(self):
Sergei Trofimov4adefec2017-06-06 14:26:50 +010064 columns = read_gfxinfo_columns(self.target)
65 for entry in columns:
66 if entry == 'Flags':
67 self.add_channel('Flags', MeasurementType('flags', 'flags'))
68 else:
69 self.add_channel(entry, 'time_us')
70 self.header = [chan.label for chan in self.channels.values()]
71
Sergei Trofimov1d3b4c82017-06-06 17:34:59 +010072
73class SurfaceFlingerFramesInstrument(FramesInstrument):
74
75 mode = CONTINUOUS
76 collector_cls = SurfaceFlingerFrameCollector
77
78 def _init_channels(self):
79 for field in SurfaceFlingerFrame._fields:
80 # remove the "_time" from filed names to avoid duplication
81 self.add_channel(field[:-5], 'time_us')
82 self.header = [chan.label for chan in self.channels.values()]