X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=logicdatasnapshot.cpp;h=e29a866e5fea444b735e5219835c1278b746bef5;hb=652010ea57ca43952d626f33ebf84fb01a663ed4;hp=ac8d4d28adc7094a733bfa2f81802f1e193348af;hpb=28a4c9c5eb20296199fc3496bb40b7733dffac75;p=pulseview.git diff --git a/logicdatasnapshot.cpp b/logicdatasnapshot.cpp index ac8d4d28..e29a866e 100644 --- a/logicdatasnapshot.cpp +++ b/logicdatasnapshot.cpp @@ -20,11 +20,75 @@ #include "logicdatasnapshot.h" -#include +#include + +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) { - 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 &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(start, last_sample)); + + for(int64_t i = start + 1; i < end; 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( + final_index, final_sample)); + + // Continue to sampling + i = final_index; + last_sample = final_sample; + } + } + + // Add the final state + edges.push_back(pair(end, + get_sample(end) & sig_mask)); }