blob: d5a2147814a838fbef0592f993fec0cb4c6a3d9f [file] [log] [blame]
Sergei Trofimov4adefec2017-06-06 14:26:50 +01001from devlib.instrument import (Instrument, CONTINUOUS,
2 MeasurementsCsv, MeasurementType)
3from devlib.utils.rendering import (GfxinfoFrameCollector,
Sergei Trofimov1d3b4c82017-06-06 17:34:59 +01004 SurfaceFlingerFrameCollector,
5 SurfaceFlingerFrame,
Sergei Trofimov4adefec2017-06-06 14:26:50 +01006 read_gfxinfo_columns)
7
8
Sergei Trofimov1d3b4c82017-06-06 17:34:59 +01009class FramesInstrument(Instrument):
Sergei Trofimov4adefec2017-06-06 14:26:50 +010010
11 mode = CONTINUOUS
Sergei Trofimov1d3b4c82017-06-06 17:34:59 +010012 collector_cls = None
Sergei Trofimov4adefec2017-06-06 14:26:50 +010013
Sergei Trofimov1d3b4c82017-06-06 17:34:59 +010014 def __init__(self, target, collector_target, period=2, keep_raw=True):
15 super(FramesInstrument, self).__init__(target)
16 self.collector_target = collector_target
Sergei Trofimov4adefec2017-06-06 14:26:50 +010017 self.period = period
18 self.keep_raw = keep_raw
19 self.collector = None
20 self.header = None
21 self._need_reset = True
22 self._init_channels()
23
24 def reset(self, sites=None, kinds=None, channels=None):
Sergei Trofimov1d3b4c82017-06-06 17:34:59 +010025 super(FramesInstrument, self).reset(sites, kinds, channels)
26 self.collector = self.collector_cls(self.target, self.period,
27 self.collector_target, self.header)
Sergei Trofimov4adefec2017-06-06 14:26:50 +010028 self._need_reset = False
29
30 def start(self):
31 if self._need_reset:
32 self.reset()
33 self.collector.start()
34
35 def stop(self):
36 self.collector.stop()
37 self._need_reset = True
38
39 def get_data(self, outfile):
40 raw_outfile = None
41 if self.keep_raw:
42 raw_outfile = outfile + '.raw'
43 self.collector.process_frames(raw_outfile)
44 active_sites = [chan.label for chan in self.active_channels]
45 self.collector.write_frames(outfile, columns=active_sites)
46 return MeasurementsCsv(outfile, self.active_channels)
47
48 def _init_channels(self):
Sergei Trofimov1d3b4c82017-06-06 17:34:59 +010049 raise NotImplementedError()
50
51
52class GfxInfoFramesInstrument(FramesInstrument):
53
54 mode = CONTINUOUS
55 collector_cls = GfxinfoFrameCollector
56
57 def _init_channels(self):
Sergei Trofimov4adefec2017-06-06 14:26:50 +010058 columns = read_gfxinfo_columns(self.target)
59 for entry in columns:
60 if entry == 'Flags':
61 self.add_channel('Flags', MeasurementType('flags', 'flags'))
62 else:
63 self.add_channel(entry, 'time_us')
64 self.header = [chan.label for chan in self.channels.values()]
65
Sergei Trofimov1d3b4c82017-06-06 17:34:59 +010066
67class SurfaceFlingerFramesInstrument(FramesInstrument):
68
69 mode = CONTINUOUS
70 collector_cls = SurfaceFlingerFrameCollector
71
72 def _init_channels(self):
73 for field in SurfaceFlingerFrame._fields:
74 # remove the "_time" from filed names to avoid duplication
75 self.add_channel(field[:-5], 'time_us')
76 self.header = [chan.label for chan in self.channels.values()]