Sergei Trofimov | 4593d86 | 2017-09-22 13:46:32 +0100 | [diff] [blame] | 1 | from __future__ import division |
Sergei Trofimov | 4adefec | 2017-06-06 14:26:50 +0100 | [diff] [blame] | 2 | from devlib.instrument import (Instrument, CONTINUOUS, |
| 3 | MeasurementsCsv, MeasurementType) |
| 4 | from devlib.utils.rendering import (GfxinfoFrameCollector, |
Sergei Trofimov | 1d3b4c8 | 2017-06-06 17:34:59 +0100 | [diff] [blame] | 5 | SurfaceFlingerFrameCollector, |
| 6 | SurfaceFlingerFrame, |
Sergei Trofimov | 4adefec | 2017-06-06 14:26:50 +0100 | [diff] [blame] | 7 | read_gfxinfo_columns) |
| 8 | |
| 9 | |
Sergei Trofimov | 1d3b4c8 | 2017-06-06 17:34:59 +0100 | [diff] [blame] | 10 | class FramesInstrument(Instrument): |
Sergei Trofimov | 4adefec | 2017-06-06 14:26:50 +0100 | [diff] [blame] | 11 | |
| 12 | mode = CONTINUOUS |
Sergei Trofimov | 1d3b4c8 | 2017-06-06 17:34:59 +0100 | [diff] [blame] | 13 | collector_cls = None |
Sergei Trofimov | 4adefec | 2017-06-06 14:26:50 +0100 | [diff] [blame] | 14 | |
Sergei Trofimov | 1d3b4c8 | 2017-06-06 17:34:59 +0100 | [diff] [blame] | 15 | def __init__(self, target, collector_target, period=2, keep_raw=True): |
| 16 | super(FramesInstrument, self).__init__(target) |
| 17 | self.collector_target = collector_target |
Sergei Trofimov | 4adefec | 2017-06-06 14:26:50 +0100 | [diff] [blame] | 18 | self.period = period |
| 19 | self.keep_raw = keep_raw |
Marc Bonnici | 7dd934a | 2017-08-03 16:41:10 +0100 | [diff] [blame] | 20 | self.sample_rate_hz = 1 / self.period |
Sergei Trofimov | 4adefec | 2017-06-06 14:26:50 +0100 | [diff] [blame] | 21 | self.collector = None |
| 22 | self.header = None |
| 23 | self._need_reset = True |
Sergei Trofimov | 823ce71 | 2017-08-30 14:55:42 +0100 | [diff] [blame] | 24 | self._raw_file = None |
Sergei Trofimov | 4adefec | 2017-06-06 14:26:50 +0100 | [diff] [blame] | 25 | self._init_channels() |
| 26 | |
| 27 | def reset(self, sites=None, kinds=None, channels=None): |
Sergei Trofimov | 1d3b4c8 | 2017-06-06 17:34:59 +0100 | [diff] [blame] | 28 | super(FramesInstrument, self).reset(sites, kinds, channels) |
| 29 | self.collector = self.collector_cls(self.target, self.period, |
| 30 | self.collector_target, self.header) |
Sergei Trofimov | 4adefec | 2017-06-06 14:26:50 +0100 | [diff] [blame] | 31 | self._need_reset = False |
Sergei Trofimov | 823ce71 | 2017-08-30 14:55:42 +0100 | [diff] [blame] | 32 | self._raw_file = None |
Sergei Trofimov | 4adefec | 2017-06-06 14:26:50 +0100 | [diff] [blame] | 33 | |
| 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 Trofimov | 4adefec | 2017-06-06 14:26:50 +0100 | [diff] [blame] | 44 | if self.keep_raw: |
Sergei Trofimov | 823ce71 | 2017-08-30 14:55:42 +0100 | [diff] [blame] | 45 | self._raw_file = outfile + '.raw' |
| 46 | self.collector.process_frames(self._raw_file) |
Sergei Trofimov | 4adefec | 2017-06-06 14:26:50 +0100 | [diff] [blame] | 47 | active_sites = [chan.label for chan in self.active_channels] |
| 48 | self.collector.write_frames(outfile, columns=active_sites) |
Marc Bonnici | 049b275 | 2017-08-03 16:43:32 +0100 | [diff] [blame] | 49 | return MeasurementsCsv(outfile, self.active_channels, self.sample_rate_hz) |
Sergei Trofimov | 4adefec | 2017-06-06 14:26:50 +0100 | [diff] [blame] | 50 | |
Sergei Trofimov | 823ce71 | 2017-08-30 14:55:42 +0100 | [diff] [blame] | 51 | def get_raw(self): |
| 52 | return [self._raw_file] if self._raw_file else [] |
| 53 | |
Sergei Trofimov | 4adefec | 2017-06-06 14:26:50 +0100 | [diff] [blame] | 54 | def _init_channels(self): |
Sergei Trofimov | 1d3b4c8 | 2017-06-06 17:34:59 +0100 | [diff] [blame] | 55 | raise NotImplementedError() |
| 56 | |
| 57 | |
| 58 | class GfxInfoFramesInstrument(FramesInstrument): |
| 59 | |
| 60 | mode = CONTINUOUS |
| 61 | collector_cls = GfxinfoFrameCollector |
| 62 | |
| 63 | def _init_channels(self): |
Sergei Trofimov | 4adefec | 2017-06-06 14:26:50 +0100 | [diff] [blame] | 64 | 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 Trofimov | 1d3b4c8 | 2017-06-06 17:34:59 +0100 | [diff] [blame] | 72 | |
| 73 | class 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()] |