forked from Ivasoft/DSView
Fix issues of group function @ LA mode
This commit is contained in:
@@ -61,6 +61,37 @@ GroupSnapshot::GroupSnapshot(const boost::shared_ptr<LogicSnapshot> &_logic_snap
|
||||
_sample_count = _logic_snapshot->get_sample_count();
|
||||
_unit_size = _logic_snapshot->unit_size();
|
||||
_index_list = index_list;
|
||||
|
||||
_mask = 0;
|
||||
std::list<int>::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<boost::recursive_mutex> 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<int>::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<int>::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<int>::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<int>::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),
|
||||
|
||||
@@ -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<view::Signal> _signal;
|
||||
std::list<int> _index_list;
|
||||
uint16_t _mask;
|
||||
int _bubble_start[32];
|
||||
int _bubble_end[32];
|
||||
|
||||
friend class GroupSnapshotTest::Basic;
|
||||
};
|
||||
|
||||
@@ -467,6 +467,7 @@ set< boost::shared_ptr<data::SignalData> > 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<data::GroupSnapshot>(
|
||||
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<data::GroupSnapshot>(
|
||||
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();
|
||||
|
||||
Reference in New Issue
Block a user