X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=logicdatasnapshot.cpp;h=032d9c81e464f2dd3311fd31a076a83073aa34a1;hp=ac8d4d28adc7094a733bfa2f81802f1e193348af;hb=7cd5faf8cfed1871195aed7a4c325342172944b3;hpb=28a4c9c5eb20296199fc3496bb40b7733dffac75 diff --git a/logicdatasnapshot.cpp b/logicdatasnapshot.cpp index ac8d4d28..032d9c81 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 - 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( + final_index, final_sample)); + + // Continue to sampling + i = final_index; + last_sample = final_sample; + } + } + + // Add the final state + edges.push_back(pair(end - 1, + get_sample(end - 1) & sig_mask)); }