From 0030ae48fd9b0d74f1d0c2406bdd5a70aa324b6e Mon Sep 17 00:00:00 2001 From: DreamSourceLab Date: Tue, 29 Sep 2015 10:05:12 +0800 Subject: [PATCH] Fix issues of group function @ LA mode --- DSView/pv/data/groupsnapshot.cpp | 155 ++++++++++++++++++++----------- DSView/pv/data/groupsnapshot.h | 5 +- DSView/pv/sigsession.cpp | 8 +- 3 files changed, 112 insertions(+), 56 deletions(-) diff --git a/DSView/pv/data/groupsnapshot.cpp b/DSView/pv/data/groupsnapshot.cpp index 8a1c4c8c..51dd70db 100644 --- a/DSView/pv/data/groupsnapshot.cpp +++ b/DSView/pv/data/groupsnapshot.cpp @@ -61,6 +61,37 @@ GroupSnapshot::GroupSnapshot(const boost::shared_ptr &_logic_snap _sample_count = _logic_snapshot->get_sample_count(); _unit_size = _logic_snapshot->unit_size(); _index_list = index_list; + + _mask = 0; + std::list::iterator j = _index_list.begin(); + while(j != _index_list.end()) + _mask |= value_mask[(*j++)]; + + for (int i=0; i<32; i++) { + _bubble_start[i] = -1; + _bubble_end[i] = -1; + } + uint16_t mask = _mask; + int i = 0; + int k = 0; + int zero = 0; + int zero_pre = 0; + // max bubble count: 31 + do { + if (mask & 0x1) { + if (_bubble_start[k] != -1 && + _bubble_end[k] == -1) + _bubble_end[k++] = i - zero_pre; + } else { + if (_bubble_start[k] == -1) { + _bubble_start[k] = i - zero; + zero_pre = zero; + } + zero++; + } + i++; + }while(mask >>= 1); + append_payload(); } @@ -96,20 +127,26 @@ const uint16_t* GroupSnapshot::get_samples( int64_t i; uint64_t pow; + uint16_t mask; + uint16_t tmpl, tmpr; boost::lock_guard lock(_mutex); uint16_t *const data = new uint16_t[end_sample - start_sample]; // memcpy(data, (uint16_t*)_data + start_sample, sizeof(uint16_t) * // (end_sample - start_sample)); - memset(data, 0, sizeof(uint16_t) * (end_sample - start_sample)); +// memset(data, 0, sizeof(uint16_t) * (end_sample - start_sample)); for(i = start_sample; i < end_sample; i++) { - std::list::iterator j = _index_list.begin(); - pow = 0; - while(j != _index_list.end()) { - *(data + i - start_sample) += ((*((uint16_t*)_data + i) & value_mask[(*j)]) >> ((*j) - pow)); - pow++; - j++; + if (_unit_size == 2) + tmpl = *((uint16_t*)_data + i) & _mask; + else + tmpl = *((uint8_t*)_data + i) & _mask; + for(int j=0; _bubble_start[j] != -1; j++) { + tmpr = tmpl & (0xffff >> (16 - _bubble_start[j])); + tmpl >>= _bubble_end[j]; + tmpl <<= _bubble_start[j]; + tmpl += tmpr; } + *(data + i - start_sample) = tmpl; } return data; } @@ -155,6 +192,7 @@ void GroupSnapshot::append_payload_to_envelope_levels() Envelope &e0 = _envelope_levels[0]; uint64_t prev_length; EnvelopeSample *dest_ptr; + uint16_t mask; // Expand the data buffer to fit the new samples prev_length = e0.length; @@ -170,61 +208,74 @@ void GroupSnapshot::append_payload_to_envelope_levels() // Iterate through the samples to populate the first level mipmap uint16_t group_value[EnvelopeScaleFactor]; - const uint16_t *const end_src_ptr = (uint16_t*)_data + - e0.length * EnvelopeScaleFactor; - for (const uint16_t *src_ptr = (uint16_t*)_data + - prev_length * EnvelopeScaleFactor; - src_ptr < end_src_ptr; src_ptr += EnvelopeScaleFactor) + const uint8_t *const end_src_ptr = (uint8_t*)_data + + e0.length * EnvelopeScaleFactor * _unit_size; + for (const uint8_t *src_ptr = (uint8_t*)_data + + prev_length * EnvelopeScaleFactor * _unit_size; + src_ptr < end_src_ptr; src_ptr += EnvelopeScaleFactor * _unit_size) { - int pow; -// for(i = 0; i < EnvelopeScaleFactor; i++) { + uint16_t tmpr; + for(int i = 0; i < EnvelopeScaleFactor; i++) { + if (_unit_size == 2) + group_value[i] = *((uint16_t*)src_ptr + i) & _mask; + else + group_value[i] = *((uint8_t*)src_ptr + i) & _mask; + for(int j=0; _bubble_start[j] != -1; j++) { + tmpr = group_value[i] & (0xffff >> (16 - _bubble_start[j])); + group_value[i] >>= _bubble_end[j]; + group_value[i] <<= _bubble_start[j]; + group_value[i] += tmpr; + } // group_value[i] = 0; // std::list::iterator j = _index_list.begin(); // pow = 0; // while(j != _index_list.end()) { +// mask = value_mask[(*j)]; +// if ( *(j+1) == (*j) + 1) +// mask |= value_mask[*(j+1)]; // group_value[i] += ((*(src_ptr + i) & value_mask[(*j)]) >> ((*j) - pow)); // pow++; // j++; // } -// } - group_value[0] = 0; - group_value[1] = 0; - group_value[2] = 0; - group_value[3] = 0; - group_value[4] = 0; - group_value[5] = 0; - group_value[6] = 0; - group_value[7] = 0; - group_value[8] = 0; - group_value[9] = 0; - group_value[10] = 0; - group_value[11] = 0; - group_value[12] = 0; - group_value[13] = 0; - group_value[14] = 0; - group_value[15] = 0; - std::list::iterator j = _index_list.begin(); - pow = 0; - while(j != _index_list.end()) { - group_value[0] += ((*(src_ptr + 0) & value_mask[(*j)]) >> ((*j) - pow)); - group_value[1] += ((*(src_ptr + 1) & value_mask[(*j)]) >> ((*j) - pow)); - group_value[2] += ((*(src_ptr + 2) & value_mask[(*j)]) >> ((*j) - pow)); - group_value[3] += ((*(src_ptr + 3) & value_mask[(*j)]) >> ((*j) - pow)); - group_value[4] += ((*(src_ptr + 4) & value_mask[(*j)]) >> ((*j) - pow)); - group_value[5] += ((*(src_ptr + 5) & value_mask[(*j)]) >> ((*j) - pow)); - group_value[6] += ((*(src_ptr + 6) & value_mask[(*j)]) >> ((*j) - pow)); - group_value[7] += ((*(src_ptr + 7) & value_mask[(*j)]) >> ((*j) - pow)); - group_value[8] += ((*(src_ptr + 8) & value_mask[(*j)]) >> ((*j) - pow)); - group_value[9] += ((*(src_ptr + 9) & value_mask[(*j)]) >> ((*j) - pow)); - group_value[10] += ((*(src_ptr + 10) & value_mask[(*j)]) >> ((*j) - pow)); - group_value[11] += ((*(src_ptr + 11) & value_mask[(*j)]) >> ((*j) - pow)); - group_value[12] += ((*(src_ptr + 12) & value_mask[(*j)]) >> ((*j) - pow)); - group_value[13] += ((*(src_ptr + 13) & value_mask[(*j)]) >> ((*j) - pow)); - group_value[14] += ((*(src_ptr + 14) & value_mask[(*j)]) >> ((*j) - pow)); - group_value[15] += ((*(src_ptr + 15) & value_mask[(*j)]) >> ((*j) - pow)); - pow++; - j++; } +// group_value[0] = 0; +// group_value[1] = 0; +// group_value[2] = 0; +// group_value[3] = 0; +// group_value[4] = 0; +// group_value[5] = 0; +// group_value[6] = 0; +// group_value[7] = 0; +// group_value[8] = 0; +// group_value[9] = 0; +// group_value[10] = 0; +// group_value[11] = 0; +// group_value[12] = 0; +// group_value[13] = 0; +// group_value[14] = 0; +// group_value[15] = 0; +// std::list::iterator j = _index_list.begin(); +// pow = 0; +// while(j != _index_list.end()) { +// group_value[0] += ((*(src_ptr + 0) & value_mask[(*j)]) >> ((*j) - pow)); +// group_value[1] += ((*(src_ptr + 1) & value_mask[(*j)]) >> ((*j) - pow)); +// group_value[2] += ((*(src_ptr + 2) & value_mask[(*j)]) >> ((*j) - pow)); +// group_value[3] += ((*(src_ptr + 3) & value_mask[(*j)]) >> ((*j) - pow)); +// group_value[4] += ((*(src_ptr + 4) & value_mask[(*j)]) >> ((*j) - pow)); +// group_value[5] += ((*(src_ptr + 5) & value_mask[(*j)]) >> ((*j) - pow)); +// group_value[6] += ((*(src_ptr + 6) & value_mask[(*j)]) >> ((*j) - pow)); +// group_value[7] += ((*(src_ptr + 7) & value_mask[(*j)]) >> ((*j) - pow)); +// group_value[8] += ((*(src_ptr + 8) & value_mask[(*j)]) >> ((*j) - pow)); +// group_value[9] += ((*(src_ptr + 9) & value_mask[(*j)]) >> ((*j) - pow)); +// group_value[10] += ((*(src_ptr + 10) & value_mask[(*j)]) >> ((*j) - pow)); +// group_value[11] += ((*(src_ptr + 11) & value_mask[(*j)]) >> ((*j) - pow)); +// group_value[12] += ((*(src_ptr + 12) & value_mask[(*j)]) >> ((*j) - pow)); +// group_value[13] += ((*(src_ptr + 13) & value_mask[(*j)]) >> ((*j) - pow)); +// group_value[14] += ((*(src_ptr + 14) & value_mask[(*j)]) >> ((*j) - pow)); +// group_value[15] += ((*(src_ptr + 15) & value_mask[(*j)]) >> ((*j) - pow)); +// pow++; +// j++; +// } const EnvelopeSample sub_sample = { *min_element(group_value, group_value + EnvelopeScaleFactor), *max_element(group_value, group_value + EnvelopeScaleFactor), diff --git a/DSView/pv/data/groupsnapshot.h b/DSView/pv/data/groupsnapshot.h index 0b66bf00..729b57a7 100644 --- a/DSView/pv/data/groupsnapshot.h +++ b/DSView/pv/data/groupsnapshot.h @@ -68,7 +68,7 @@ private: }; private: - static const unsigned int ScaleStepCount = 10; + static const unsigned int ScaleStepCount = 16; static const int EnvelopeScalePower; static const int EnvelopeScaleFactor; static const float LogEnvelopeScaleFactor; @@ -103,6 +103,9 @@ private: int _unit_size; boost::shared_ptr _signal; std::list _index_list; + uint16_t _mask; + int _bubble_start[32]; + int _bubble_end[32]; friend class GroupSnapshotTest::Basic; }; diff --git a/DSView/pv/sigsession.cpp b/DSView/pv/sigsession.cpp index 7c67795a..3550b4ae 100644 --- a/DSView/pv/sigsession.cpp +++ b/DSView/pv/sigsession.cpp @@ -467,6 +467,7 @@ set< boost::shared_ptr > SigSession::get_data() const assert(sig); data.insert(sig->data()); } + data.insert(_group_data); return data; } @@ -624,15 +625,15 @@ void SigSession::add_group() _group_cnt++; if (_capture_state == Stopped) { - if (!_cur_group_snapshot) - { + //if (!_cur_group_snapshot) + //{ // Create a new data snapshot _cur_group_snapshot = boost::shared_ptr( new data::GroupSnapshot(_logic_data->get_snapshots().front(), signal->get_index_list())); //_cur_group_snapshot->append_payload(); _group_data->push_snapshot(_cur_group_snapshot); _cur_group_snapshot.reset(); - } + //} } signals_changed(); @@ -1071,6 +1072,7 @@ void SigSession::data_feed_in(const struct sr_dev_inst *sdi, _cur_group_snapshot = boost::shared_ptr( new data::GroupSnapshot(_logic_data->get_snapshots().front(), g->get_index_list())); _group_data->push_snapshot(_cur_group_snapshot); + _cur_group_snapshot.reset(); } _cur_logic_snapshot.reset(); _cur_dso_snapshot.reset();