]> sigrok.org Git - pulseview.git/blobdiff - logicdatasnapshot.cpp
Initial interractive zoom support
[pulseview.git] / logicdatasnapshot.cpp
index ac8d4d28adc7094a733bfa2f81802f1e193348af..032d9c81e464f2dd3311fd31a076a83073aa34a1 100644 (file)
 
 #include "logicdatasnapshot.h"
 
 
 #include "logicdatasnapshot.h"
 
-#include <QDebug>
+#include <assert.h>
+
+using namespace std;
+
+LogicDataSnapshot::LogicDataSnapshot(
+       const sr_datafeed_logic &logic) :
+       DataSnapshot(logic.unitsize)
+{
+       append_payload(logic);
+}
 
 void LogicDataSnapshot::append_payload(
        const sr_datafeed_logic &logic)
 {
 
 void LogicDataSnapshot::append_payload(
        const sr_datafeed_logic &logic)
 {
-       qDebug() << "SR_DF_LOGIC (length =" << logic.length
-               << ", unitsize = " << logic.unitsize << ")";
+       assert(_unit_size == logic.unitsize);
+
+       append_data(logic.data, logic.length);
+}
+
+uint64_t LogicDataSnapshot::get_sample(uint64_t index) const
+{
+       assert(_data);
+       assert(index >= 0 && index < _data_length);
+
+       return *(uint64_t*)((uint8_t*)_data + index * _unit_size);
+}
+
+void LogicDataSnapshot::get_subsampled_edges(
+       std::vector<EdgePair> &edges,
+       int64_t start, int64_t end,
+       int64_t quantization_length, int sig_index)
+{
+       assert(start >= 0);
+       assert(end < get_sample_count());
+       assert(start <= end);
+       assert(quantization_length > 0);
+       assert(sig_index >= 0);
+       assert(sig_index < SR_MAX_NUM_PROBES);
+
+       const uint64_t sig_mask = 1 << sig_index;
+
+       // Add the initial state
+       bool last_sample = get_sample(start) & sig_mask;
+       edges.push_back(pair<int64_t, bool>(start, last_sample));
+
+       for(int64_t i = start + 1; i < end - 1; i++)
+       {
+               const bool sample = get_sample(i) & sig_mask;
+
+               // Check if we hit an edge
+               if(sample != last_sample)
+               {
+                       // Take the last sample of the quanization block
+                       const int64_t final_index =
+                               min((i - (i % quantization_length) +
+                               quantization_length - 1), end);
+
+                       // Store the final state
+                       const bool final_sample = get_sample(final_index) & sig_mask;
+                       edges.push_back(pair<int64_t, bool>(
+                               final_index, final_sample));
+
+                       // Continue to sampling
+                       i = final_index;
+                       last_sample = final_sample;
+               }
+       }
+
+       // Add the final state
+       edges.push_back(pair<int64_t, bool>(end - 1,
+               get_sample(end - 1) & sig_mask));
 }
 }