]> sigrok.org Git - pulseview.git/blobdiff - pv/data/logicsnapshot.cpp
Preallocate memory before samples are received.
[pulseview.git] / pv / data / logicsnapshot.cpp
index e6fd26e33b68f742a8547894487ddf7f719a5bd3..754a456cc8f2e6c078cfd5a46e8b1c756571f79a 100644 (file)
 
 #include "logicsnapshot.h"
 
-using namespace boost;
-using namespace std;
+using boost::lock_guard;
+using boost::recursive_mutex;
+using std::max;
+using std::min;
+using std::pair;
 
 namespace pv {
 namespace data {
@@ -40,10 +43,13 @@ const int LogicSnapshot::MipMapScaleFactor = 1 << MipMapScalePower;
 const float LogicSnapshot::LogMipMapScaleFactor = logf(MipMapScaleFactor);
 const uint64_t LogicSnapshot::MipMapDataUnit = 64*1024;        // bytes
 
-LogicSnapshot::LogicSnapshot(const sr_datafeed_logic &logic) :
+LogicSnapshot::LogicSnapshot(const sr_datafeed_logic &logic,
+                             const uint64_t expected_num_samples) :
        Snapshot(logic.unitsize),
        _last_append_sample(0)
 {
+       set_capacity(expected_num_samples);
+
        lock_guard<recursive_mutex> lock(_mutex);
        memset(_mip_map, 0, sizeof(_mip_map));
        append_payload(logic);
@@ -70,6 +76,22 @@ void LogicSnapshot::append_payload(
        append_payload_to_mipmap();
 }
 
+void LogicSnapshot::get_samples(uint8_t *const data,
+       int64_t start_sample, int64_t end_sample) const
+{
+       assert(data);
+       assert(start_sample >= 0);
+       assert(start_sample <= (int64_t)_sample_count);
+       assert(end_sample >= 0);
+       assert(end_sample <= (int64_t)_sample_count);
+       assert(start_sample <= end_sample);
+
+       lock_guard<recursive_mutex> lock(_mutex);
+
+       const size_t size = (end_sample - start_sample) * _unit_size;
+       memcpy(data, (const uint8_t*)_data + start_sample, size);
+}
+
 void LogicSnapshot::reallocate_mipmap_level(MipMapLevel &m)
 {
        const uint64_t new_data_length = ((m.length + MipMapDataUnit - 1) /
@@ -188,7 +210,7 @@ void LogicSnapshot::get_subsampled_edges(
        assert(start <= end);
        assert(min_length > 0);
        assert(sig_index >= 0);
-       assert(sig_index < SR_MAX_NUM_PROBES);
+       assert(sig_index < 64);
 
        lock_guard<recursive_mutex> lock(_mutex);
 
@@ -347,8 +369,10 @@ void LogicSnapshot::get_subsampled_edges(
        }
 
        // Add the final state
-       edges.push_back(pair<int64_t, bool>(end,
-               get_sample(end) & sig_mask));
+       const bool end_sample = get_sample(end) & sig_mask;
+       if (last_sample != end_sample)
+               edges.push_back(pair<int64_t, bool>(end, end_sample));
+       edges.push_back(pair<int64_t, bool>(end + 1, end_sample));
 }
 
 uint64_t LogicSnapshot::get_subsample(int level, uint64_t offset) const