]> sigrok.org Git - pulseview.git/blob - pv/data/analogsegment.hpp
Implement autoranging for analog channels
[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         const std::pair<float, float> get_min_max() const;
85
86         SegmentAnalogDataIterator* begin_sample_iteration(uint64_t start) const;
87         void continue_sample_iteration(SegmentAnalogDataIterator* it, uint64_t increase) const;
88         void end_sample_iteration(SegmentAnalogDataIterator* it) const;
89
90         void get_envelope_section(EnvelopeSection &s,
91                 uint64_t start, uint64_t end, float min_length) const;
92
93 private:
94         void reallocate_envelope(Envelope &e);
95
96         void append_payload_to_envelope_levels();
97
98 private:
99         struct Envelope envelope_levels_[ScaleStepCount];
100
101         float min_value_, max_value_;
102
103         friend struct AnalogSegmentTest::Basic;
104 };
105
106 } // namespace data
107 } // namespace pv
108
109 #endif // PULSEVIEW_PV_DATA_ANALOGSEGMENT_HPP