]> sigrok.org Git - pulseview.git/blob - pv/data/analogsegment.hpp
Switch segment storage from single vector to vector of arrays
[pulseview.git] / pv / data / analogsegment.hpp
1 /*
2  * This file is part of the PulseView project.
3  *
4  * Copyright (C) 2012 Joel Holdsworth <joel@airwebreathe.org.uk>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #ifndef PULSEVIEW_PV_DATA_ANALOGSEGMENT_HPP
21 #define PULSEVIEW_PV_DATA_ANALOGSEGMENT_HPP
22
23 #include "segment.hpp"
24
25 #include <utility>
26 #include <vector>
27
28 namespace AnalogSegmentTest {
29 struct Basic;
30 }
31
32 namespace pv {
33 namespace data {
34
35 typedef struct {
36         uint64_t sample_index, chunk_num, chunk_offs;
37         uint8_t* chunk;
38         float* value;
39 } SegmentAnalogDataIterator;
40
41 class AnalogSegment : public Segment
42 {
43 public:
44         struct EnvelopeSample
45         {
46                 float min;
47                 float max;
48         };
49
50         struct EnvelopeSection
51         {
52                 uint64_t start;
53                 unsigned int scale;
54                 uint64_t length;
55                 EnvelopeSample *samples;
56         };
57
58 private:
59         struct Envelope
60         {
61                 uint64_t length;
62                 uint64_t data_length;
63                 EnvelopeSample *samples;
64         };
65
66 private:
67         static const unsigned int ScaleStepCount = 10;
68         static const int EnvelopeScalePower;
69         static const int EnvelopeScaleFactor;
70         static const float LogEnvelopeScaleFactor;
71         static const uint64_t EnvelopeDataUnit;
72
73 public:
74         AnalogSegment(uint64_t samplerate);
75
76         virtual ~AnalogSegment();
77
78         void append_interleaved_samples(const float *data,
79                 size_t sample_count, size_t stride);
80
81         const float* get_samples(int64_t start_sample,
82                 int64_t end_sample) const;
83
84         SegmentAnalogDataIterator* begin_sample_iteration(uint64_t start) const;
85         void continue_sample_iteration(SegmentAnalogDataIterator* it, uint64_t increase) const;
86         void end_sample_iteration(SegmentAnalogDataIterator* it) const;
87
88         void get_envelope_section(EnvelopeSection &s,
89                 uint64_t start, uint64_t end, float min_length) const;
90
91 private:
92         void reallocate_envelope(Envelope &e);
93
94         void append_payload_to_envelope_levels();
95
96 private:
97         struct Envelope envelope_levels_[ScaleStepCount];
98
99         friend struct AnalogSegmentTest::Basic;
100 };
101
102 } // namespace data
103 } // namespace pv
104
105 #endif // PULSEVIEW_PV_DATA_ANALOGSEGMENT_HPP