Commit 0030ae48 authored by DreamSourceLab's avatar DreamSourceLab

Fix issues of group function @ LA mode

parent 48ab8049
......@@ -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();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment