#include <utility>
#include <vector>
+namespace AnalogSnapshotTest {
+class Basic;
+}
+
namespace pv {
namespace data {
class AnalogSnapshot : public Snapshot
{
+public:
+ struct EnvelopeSample
+ {
+ float min;
+ float max;
+ };
+
+ struct EnvelopeSection
+ {
+ uint64_t start;
+ unsigned int scale;
+ uint64_t length;
+ EnvelopeSample *samples;
+ };
+
+private:
+ struct Envelope
+ {
+ uint64_t length;
+ uint64_t data_length;
+ EnvelopeSample *samples;
+ };
+
+private:
+ static const unsigned int ScaleStepCount = 10;
+ static const int EnvelopeScalePower;
+ static const int EnvelopeScaleFactor;
+ static const float LogEnvelopeScaleFactor;
+ static const uint64_t EnvelopeDataUnit;
+
public:
AnalogSnapshot(const sr_datafeed_analog &analog);
+ virtual ~AnalogSnapshot();
+
void append_payload(const sr_datafeed_analog &analog);
- const float* get_samples() const;
+ const float* get_samples(int64_t start_sample,
+ int64_t end_sample) const;
+
+ void get_envelope_section(EnvelopeSection &s,
+ uint64_t start, uint64_t end, float min_length) const;
+
+private:
+ void reallocate_envelope(Envelope &l);
+
+ void append_payload_to_envelope_levels();
+
+private:
+ struct Envelope _envelope_levels[ScaleStepCount];
+
+ friend class AnalogSnapshotTest::Basic;
};
} // namespace data