File: logicsegment.hpp

package info (click to toggle)
pulseview 0.4.2-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,064 kB
  • sloc: cpp: 25,958; xml: 215; java: 42; makefile: 2
file content (137 lines) | stat: -rw-r--r-- 3,693 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/*
 * This file is part of the PulseView project.
 *
 * Copyright (C) 2012 Joel Holdsworth <joel@airwebreathe.org.uk>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
 */

#ifndef PULSEVIEW_PV_DATA_LOGICSEGMENT_HPP
#define PULSEVIEW_PV_DATA_LOGICSEGMENT_HPP

#include "segment.hpp"

#include <utility>
#include <vector>

#include <QObject>

using std::pair;
using std::shared_ptr;
using std::vector;

namespace sigrok {
	class Logic;
}

namespace LogicSegmentTest {
struct Pow2;
struct Basic;
struct LargeData;
struct Pulses;
struct LongPulses;
}

namespace pv {
namespace data {

class Logic;

class LogicSegment : public Segment
{
	Q_OBJECT

public:
	typedef pair<int64_t, bool> EdgePair;

	static const unsigned int ScaleStepCount = 10;
	static const int MipMapScalePower;
	static const int MipMapScaleFactor;
	static const float LogMipMapScaleFactor;
	static const uint64_t MipMapDataUnit;

private:
	struct MipMapLevel
	{
		uint64_t length;
		uint64_t data_length;
		void *data;
	};

public:
	LogicSegment(pv::data::Logic& owner, uint32_t segment_id,
		unsigned int unit_size, uint64_t samplerate);

	virtual ~LogicSegment();

	void append_payload(shared_ptr<sigrok::Logic> logic);
	void append_payload(void *data, uint64_t data_size);

	void get_samples(int64_t start_sample, int64_t end_sample, uint8_t* dest) const;

	/**
	 * Parses a logic data segment to generate a list of transitions
	 * in a time interval to a given level of detail.
	 * @param[out] edges The vector to place the edges into.
	 * @param[in] start The start sample index.
	 * @param[in] end The end sample index.
	 * @param[in] min_length The minimum number of samples that
	 * can be resolved at this level of detail.
	 * @param[in] sig_index The index of the signal.
	 */
	void get_subsampled_edges(vector<EdgePair> &edges,
		uint64_t start, uint64_t end,
		float min_length, int sig_index, bool first_change_only = false);

	void get_surrounding_edges(vector<EdgePair> &dest,
		uint64_t origin_sample, float min_length, int sig_index);

private:
	uint64_t unpack_sample(const uint8_t *ptr) const;
	void pack_sample(uint8_t *ptr, uint64_t value);

	void reallocate_mipmap_level(MipMapLevel &m);

	void append_payload_to_mipmap();

	uint64_t get_unpacked_sample(uint64_t index) const;

	template <class T> void downsampleTmain(const T*&in, T &acc, T &prev);
	template <class T> void downsampleT(const uint8_t *in, uint8_t *&out, uint64_t len);
	void downsampleGeneric(const uint8_t *in, uint8_t *&out, uint64_t len);

private:
	uint64_t get_subsample(int level, uint64_t offset) const;

	static uint64_t pow2_ceil(uint64_t x, unsigned int power);

private:
	Logic& owner_;

	struct MipMapLevel mip_map_[ScaleStepCount];
	uint64_t last_append_sample_;
	uint64_t last_append_accumulator_;
	uint64_t last_append_extra_;

	friend struct LogicSegmentTest::Pow2;
	friend struct LogicSegmentTest::Basic;
	friend struct LogicSegmentTest::LargeData;
	friend struct LogicSegmentTest::Pulses;
	friend struct LogicSegmentTest::LongPulses;
};

} // namespace data
} // namespace pv

#endif // PULSEVIEW_PV_DATA_LOGICSEGMENT_HPP