Sergei Trofimov | 4adefec | 2017-06-06 14:26:50 +0100 | [diff] [blame] | 1 | from devlib.instrument import (Instrument, CONTINUOUS, |
| 2 | MeasurementsCsv, MeasurementType) |
| 3 | from devlib.utils.rendering import (GfxinfoFrameCollector, |
Sergei Trofimov | 1d3b4c8 | 2017-06-06 17:34:59 +0100 | [diff] [blame] | 4 | SurfaceFlingerFrameCollector, |
| 5 | SurfaceFlingerFrame, |
Sergei Trofimov | 4adefec | 2017-06-06 14:26:50 +0100 | [diff] [blame] | 6 | read_gfxinfo_columns) |
| 7 | |
| 8 | |
Sergei Trofimov | 1d3b4c8 | 2017-06-06 17:34:59 +0100 | [diff] [blame] | 9 | class FramesInstrument(Instrument): |
Sergei Trofimov | 4adefec | 2017-06-06 14:26:50 +0100 | [diff] [blame] | 10 | |
| 11 | mode = CONTINUOUS |
Sergei Trofimov | 1d3b4c8 | 2017-06-06 17:34:59 +0100 | [diff] [blame] | 12 | collector_cls = None |
Sergei Trofimov | 4adefec | 2017-06-06 14:26:50 +0100 | [diff] [blame] | 13 | |
Sergei Trofimov | 1d3b4c8 | 2017-06-06 17:34:59 +0100 | [diff] [blame] | 14 | def __init__(self, target, collector_target, period=2, keep_raw=True): |
| 15 | super(FramesInstrument, self).__init__(target) |
| 16 | self.collector_target = collector_target |
Sergei Trofimov | 4adefec | 2017-06-06 14:26:50 +0100 | [diff] [blame] | 17 | 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 Trofimov | 1d3b4c8 | 2017-06-06 17:34:59 +0100 | [diff] [blame] | 25 | super(FramesInstrument, self).reset(sites, kinds, channels) |
| 26 | self.collector = self.collector_cls(self.target, self.period, |
| 27 | self.collector_target, self.header) |
Sergei Trofimov | 4adefec | 2017-06-06 14:26:50 +0100 | [diff] [blame] | 28 | 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 Trofimov | 1d3b4c8 | 2017-06-06 17:34:59 +0100 | [diff] [blame] | 49 | raise NotImplementedError() |
| 50 | |
| 51 | |
| 52 | class GfxInfoFramesInstrument(FramesInstrument): |
| 53 | |
| 54 | mode = CONTINUOUS |
| 55 | collector_cls = GfxinfoFrameCollector |
| 56 | |
| 57 | def _init_channels(self): |
Sergei Trofimov | 4adefec | 2017-06-06 14:26:50 +0100 | [diff] [blame] | 58 | 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 Trofimov | 1d3b4c8 | 2017-06-06 17:34:59 +0100 | [diff] [blame] | 66 | |
| 67 | class 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()] |