blob: 54869c181d4e6ad26799d72163ee321b8c3c0b16 [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
Marc Bonnici7dd934a2017-08-03 16:41:10 +010019 self.sample_rate_hz = 1 / self.period
Sergei Trofimov4adefec2017-06-06 14:26:50 +010020 self.collector = None
21 self.header = None
22 self._need_reset = True
Sergei Trofimov823ce712017-08-30 14:55:42 +010023 self._raw_file = None
Sergei Trofimov4adefec2017-06-06 14:26:50 +010024 self._init_channels()
25
26 def reset(self, sites=None, kinds=None, channels=None):
Sergei Trofimov1d3b4c82017-06-06 17:34:59 +010027 super(FramesInstrument, self).reset(sites, kinds, channels)
28 self.collector = self.collector_cls(self.target, self.period,
29 self.collector_target, self.header)
Sergei Trofimov4adefec2017-06-06 14:26:50 +010030 self._need_reset = False
Sergei Trofimov823ce712017-08-30 14:55:42 +010031 self._raw_file = None
Sergei Trofimov4adefec2017-06-06 14:26:50 +010032
33 def start(self):
34 if self._need_reset:
35 self.reset()
36 self.collector.start()
37
38 def stop(self):
39 self.collector.stop()
40 self._need_reset = True
41
42 def get_data(self, outfile):
Sergei Trofimov4adefec2017-06-06 14:26:50 +010043 if self.keep_raw:
Sergei Trofimov823ce712017-08-30 14:55:42 +010044 self._raw_file = outfile + '.raw'
45 self.collector.process_frames(self._raw_file)
Sergei Trofimov4adefec2017-06-06 14:26:50 +010046 active_sites = [chan.label for chan in self.active_channels]
47 self.collector.write_frames(outfile, columns=active_sites)
Marc Bonnici049b2752017-08-03 16:43:32 +010048 return MeasurementsCsv(outfile, self.active_channels, self.sample_rate_hz)
Sergei Trofimov4adefec2017-06-06 14:26:50 +010049
Sergei Trofimov823ce712017-08-30 14:55:42 +010050 def get_raw(self):
51 return [self._raw_file] if self._raw_file else []
52
Sergei Trofimov4adefec2017-06-06 14:26:50 +010053 def _init_channels(self):
Sergei Trofimov1d3b4c82017-06-06 17:34:59 +010054 raise NotImplementedError()
55
56
57class GfxInfoFramesInstrument(FramesInstrument):
58
59 mode = CONTINUOUS
60 collector_cls = GfxinfoFrameCollector
61
62 def _init_channels(self):
Sergei Trofimov4adefec2017-06-06 14:26:50 +010063 columns = read_gfxinfo_columns(self.target)
64 for entry in columns:
65 if entry == 'Flags':
66 self.add_channel('Flags', MeasurementType('flags', 'flags'))
67 else:
68 self.add_channel(entry, 'time_us')
69 self.header = [chan.label for chan in self.channels.values()]
70
Sergei Trofimov1d3b4c82017-06-06 17:34:59 +010071
72class SurfaceFlingerFramesInstrument(FramesInstrument):
73
74 mode = CONTINUOUS
75 collector_cls = SurfaceFlingerFrameCollector
76
77 def _init_channels(self):
78 for field in SurfaceFlingerFrame._fields:
79 # remove the "_time" from filed names to avoid duplication
80 self.add_channel(field[:-5], 'time_us')
81 self.header = [chan.label for chan in self.channels.values()]