]> sigrok.org Git - pulseview.git/blob - pv/data/segment.hpp
Only show sampling points when zoomed in far enough.
[pulseview.git] / pv / data / segment.hpp
1 /*
2  * This file is part of the PulseView project.
3  *
4  * Copyright (C) 2017 Soeren Apel <soeren@apelpie.net>
5  * Copyright (C) 2012 Joel Holdsworth <joel@airwebreathe.org.uk>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #ifndef PULSEVIEW_PV_DATA_SEGMENT_HPP
22 #define PULSEVIEW_PV_DATA_SEGMENT_HPP
23
24 #include "pv/util.hpp"
25
26 #include <thread>
27 #include <mutex>
28 #include <vector>
29
30 namespace SegmentTest {
31 struct SmallSize8Single;
32 struct MediumSize8Single;
33 struct MaxSize8Single;
34 struct MediumSize24Single;
35 struct MediumSize32Single;
36 struct MaxSize32Single;
37 struct MediumSize32Multi;
38 struct MaxSize32Multi;
39 struct MaxSize32MultiIterated;
40 }
41
42 namespace pv {
43 namespace data {
44
45 typedef struct {
46         uint64_t sample_index, chunk_num, chunk_offs;
47         uint8_t* chunk;
48         uint8_t* value;
49 } SegmentRawDataIterator;
50
51 class Segment
52 {
53 private:
54         static const uint64_t MaxChunkSize;
55
56 public:
57         Segment(uint64_t samplerate, unsigned int unit_size);
58
59         virtual ~Segment();
60
61         uint64_t get_sample_count() const;
62
63         const pv::util::Timestamp& start_time() const;
64
65         double samplerate() const;
66         void set_samplerate(double samplerate);
67
68         unsigned int unit_size() const;
69
70         void free_unused_memory();
71
72 protected:
73         void append_single_sample(void *data);
74         void append_samples(void *data, uint64_t samples);
75         uint8_t* get_raw_samples(uint64_t start, uint64_t count) const;
76
77         SegmentRawDataIterator* begin_raw_sample_iteration(uint64_t start);
78         void continue_raw_sample_iteration(SegmentRawDataIterator* it, uint64_t increase);
79         void end_raw_sample_iteration(SegmentRawDataIterator* it);
80
81         mutable std::recursive_mutex mutex_;
82         std::vector<uint8_t*> data_chunks_;
83         uint8_t* current_chunk_;
84         uint64_t used_samples_, unused_samples_;
85         uint64_t sample_count_;
86         pv::util::Timestamp start_time_;
87         double samplerate_;
88         uint64_t chunk_size_;
89         unsigned int unit_size_;
90         int iterator_count_;
91         bool mem_optimization_requested_;
92
93         friend struct SegmentTest::SmallSize8Single;
94         friend struct SegmentTest::MediumSize8Single;
95         friend struct SegmentTest::MaxSize8Single;
96         friend struct SegmentTest::MediumSize24Single;
97         friend struct SegmentTest::MediumSize32Single;
98         friend struct SegmentTest::MaxSize32Single;
99         friend struct SegmentTest::MediumSize32Multi;
100         friend struct SegmentTest::MaxSize32Multi;
101         friend struct SegmentTest::MaxSize32MultiIterated;
102 };
103
104 } // namespace data
105 } // namespace pv
106
107 #endif // PULSEVIEW_PV_DATA_SEGMENT_HPP