X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=pv%2Fdata%2Flogicsnapshot.cpp;h=754a456cc8f2e6c078cfd5a46e8b1c756571f79a;hb=27d7c96b57d967edd8bcde9bb5570d573a0ef474;hp=e6fd26e33b68f742a8547894487ddf7f719a5bd3;hpb=023887ca1d8a104b4bef287b7cea8d403044a41b;p=pulseview.git diff --git a/pv/data/logicsnapshot.cpp b/pv/data/logicsnapshot.cpp index e6fd26e3..754a456c 100644 --- a/pv/data/logicsnapshot.cpp +++ b/pv/data/logicsnapshot.cpp @@ -29,8 +29,11 @@ #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 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 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 lock(_mutex); @@ -347,8 +369,10 @@ void LogicSnapshot::get_subsampled_edges( } // Add the final state - edges.push_back(pair(end, - get_sample(end) & sig_mask)); + const bool end_sample = get_sample(end) & sig_mask; + if (last_sample != end_sample) + edges.push_back(pair(end, end_sample)); + edges.push_back(pair(end + 1, end_sample)); } uint64_t LogicSnapshot::get_subsample(int level, uint64_t offset) const