mirror of
https://github.com/DreamSourceLab/DSView.git
synced 2025-01-23 13:42:55 +08:00
Write loop data, disable loop mode
This commit is contained in:
parent
f17bbc8461
commit
ac7e6acc73
@ -174,10 +174,14 @@ void LogicSnapshot::first_payload(const sr_datafeed_logic &logic, uint64_t total
|
|||||||
_ring_sample_count = 0;
|
_ring_sample_count = 0;
|
||||||
_mipmap_sample_count = 0;
|
_mipmap_sample_count = 0;
|
||||||
|
|
||||||
|
assert(logic.data);
|
||||||
|
uint64_t *rd_data = (uint64_t*)logic.data;
|
||||||
|
|
||||||
for (unsigned int i = 0; i < _channel_num; i++) {
|
for (unsigned int i = 0; i < _channel_num; i++) {
|
||||||
_last_sample[i] = 0;
|
_last_sample[i] = *rd_data++;
|
||||||
_last_calc_count[i] = 0;
|
_last_calc_count[i] = 0;
|
||||||
}
|
}
|
||||||
|
_wr_num = 0;
|
||||||
|
|
||||||
append_payload(logic);
|
append_payload(logic);
|
||||||
_last_ended = false;
|
_last_ended = false;
|
||||||
@ -209,32 +213,19 @@ void LogicSnapshot::append_cross_payload(const sr_datafeed_logic &logic)
|
|||||||
// _sample_count should be fixed in the last packet
|
// _sample_count should be fixed in the last packet
|
||||||
// so _total_sample_count must be align to LeafBlock
|
// so _total_sample_count must be align to LeafBlock
|
||||||
uint64_t samples = ceil(logic.length * 8.0 / _channel_num);
|
uint64_t samples = ceil(logic.length * 8.0 / _channel_num);
|
||||||
uint64_t det_loop_offset = 0;
|
|
||||||
|
|
||||||
if (_sample_count + samples < _total_sample_count){
|
if (_sample_count + samples < _total_sample_count){
|
||||||
_sample_count += samples;
|
_sample_count += samples;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if (!_is_loop){
|
if (_sample_count == _total_sample_count && !_is_loop)
|
||||||
if (_sample_count == _total_sample_count)
|
return;
|
||||||
return;
|
_sample_count = _total_sample_count;
|
||||||
_sample_count = _total_sample_count;
|
}
|
||||||
}
|
|
||||||
else{
|
if (_loop_offset >= LeafBlockSamples){
|
||||||
if (_sample_count == _total_sample_count)
|
dsv_info("---------buffer is full.");
|
||||||
det_loop_offset = samples;
|
return;
|
||||||
else{
|
|
||||||
det_loop_offset = _sample_count + samples - _total_sample_count;
|
|
||||||
_sample_count = _total_sample_count;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (det_loop_offset + _loop_offset >= LeafBlockSamples){
|
|
||||||
det_loop_offset = det_loop_offset + _loop_offset - LeafBlockSamples;
|
|
||||||
_loop_offset = 0;
|
|
||||||
move_first_node_to_last();
|
|
||||||
dsv_info("------------move node to last.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_ring_sample_count += _loop_offset;
|
_ring_sample_count += _loop_offset;
|
||||||
@ -242,6 +233,7 @@ void LogicSnapshot::append_cross_payload(const sr_datafeed_logic &logic)
|
|||||||
// bit align
|
// bit align
|
||||||
while ((_ch_fraction != 0 || _byte_fraction != 0) && len > 0)
|
while ((_ch_fraction != 0 || _byte_fraction != 0) && len > 0)
|
||||||
{
|
{
|
||||||
|
//assert(0);//!!!
|
||||||
if (_dest_ptr == NULL)
|
if (_dest_ptr == NULL)
|
||||||
assert(false);
|
assert(false);
|
||||||
|
|
||||||
@ -279,8 +271,7 @@ void LogicSnapshot::append_cross_payload(const sr_datafeed_logic &logic)
|
|||||||
if (_ring_sample_count % LeafBlockSamples == 0){
|
if (_ring_sample_count % LeafBlockSamples == 0){
|
||||||
calc_mipmap(_channel_num - 1, index0, index1, LeafBlockSamples, true);
|
calc_mipmap(_channel_num - 1, index0, index1, LeafBlockSamples, true);
|
||||||
_mipmap_sample_count = _ring_sample_count - _loop_offset;
|
_mipmap_sample_count = _ring_sample_count - _loop_offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -299,9 +290,9 @@ void LogicSnapshot::append_cross_payload(const sr_datafeed_logic &logic)
|
|||||||
uint64_t old_filled_sample = filled_sample;
|
uint64_t old_filled_sample = filled_sample;
|
||||||
uint64_t* chans_read_addr[CHANNEL_MAX_COUNT];
|
uint64_t* chans_read_addr[CHANNEL_MAX_COUNT];
|
||||||
|
|
||||||
for (unsigned int i=0; i<_channel_num; i++){
|
for (unsigned int i = 0; i < _channel_num; i++){
|
||||||
chans_read_addr[i] = (uint64_t*)data_src_ptr + i;
|
chans_read_addr[i] = (uint64_t*)data_src_ptr + i;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t fill_chan = _ch_fraction;
|
uint16_t fill_chan = _ch_fraction;
|
||||||
uint16_t last_chan = _ch_fraction;
|
uint16_t last_chan = _ch_fraction;
|
||||||
@ -321,17 +312,24 @@ void LogicSnapshot::append_cross_payload(const sr_datafeed_logic &logic)
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint64_t *write_ptr = (uint64_t*)lbp + offset / Scale;
|
uint64_t *write_ptr = (uint64_t*)lbp + offset / Scale;
|
||||||
|
|
||||||
|
|
||||||
if (_sample_count >= _total_sample_count){
|
|
||||||
// *read_ptr = 1;
|
|
||||||
|
|
||||||
dsv_info("_loop_offset:%llu", _loop_offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (len >= 8)
|
while (len >= 8)
|
||||||
{
|
{
|
||||||
*write_ptr++ = *read_ptr;
|
if (_is_loop)
|
||||||
|
{
|
||||||
|
if (fill_chan == 0){
|
||||||
|
*write_ptr++ = 0xfef0f0f0f0f0f0f1;
|
||||||
|
_wr_num++;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
*write_ptr++ = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
*write_ptr++ = *read_ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
//*write_ptr++ = *read_ptr;
|
||||||
read_ptr += _channel_num;
|
read_ptr += _channel_num;
|
||||||
len -= 8;
|
len -= 8;
|
||||||
filled_sample += Scale;
|
filled_sample += Scale;
|
||||||
@ -343,6 +341,7 @@ void LogicSnapshot::append_cross_payload(const sr_datafeed_logic &logic)
|
|||||||
|
|
||||||
if (filled_sample == LeafBlockSamples)
|
if (filled_sample == LeafBlockSamples)
|
||||||
{
|
{
|
||||||
|
// assert(0);//!!!
|
||||||
calc_mipmap(fill_chan, index0, index1, LeafBlockSamples, true);
|
calc_mipmap(fill_chan, index0, index1, LeafBlockSamples, true);
|
||||||
|
|
||||||
if (fill_chan + 1 == _channel_num)
|
if (fill_chan + 1 == _channel_num)
|
||||||
@ -406,6 +405,14 @@ void LogicSnapshot::append_cross_payload(const sr_datafeed_logic &logic)
|
|||||||
}
|
}
|
||||||
|
|
||||||
_ring_sample_count = align_sample_count;
|
_ring_sample_count = align_sample_count;
|
||||||
|
_ring_sample_count -= _loop_offset;
|
||||||
|
|
||||||
|
if (align_sample_count > _total_sample_count){
|
||||||
|
_loop_offset = align_sample_count - _total_sample_count;
|
||||||
|
_ring_sample_count = _total_sample_count;
|
||||||
|
dsv_info("---------_loop_offset:%llu", _loop_offset);
|
||||||
|
}
|
||||||
|
|
||||||
_ch_fraction = last_chan;
|
_ch_fraction = last_chan;
|
||||||
|
|
||||||
lbp = _ch_data[_ch_fraction][index0].lbp[index1];
|
lbp = _ch_data[_ch_fraction][index0].lbp[index1];
|
||||||
@ -424,15 +431,13 @@ void LogicSnapshot::append_cross_payload(const sr_datafeed_logic &logic)
|
|||||||
if (len > 0){
|
if (len > 0){
|
||||||
uint8_t *src_ptr = (uint8_t*)end_read_ptr - len;
|
uint8_t *src_ptr = (uint8_t*)end_read_ptr - len;
|
||||||
_byte_fraction += len;
|
_byte_fraction += len;
|
||||||
|
//assert(0);//!!!
|
||||||
|
|
||||||
while (len > 0){
|
while (len > 0){
|
||||||
*_dest_ptr++ = *src_ptr++;
|
*_dest_ptr++ = *src_ptr++;
|
||||||
len--;
|
len--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_ring_sample_count -= _loop_offset;
|
|
||||||
_loop_offset += det_loop_offset;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void LogicSnapshot::capture_ended()
|
void LogicSnapshot::capture_ended()
|
||||||
@ -473,7 +478,7 @@ void LogicSnapshot::capture_ended()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void LogicSnapshot::calc_mipmap(unsigned int order, uint8_t index0, uint8_t index1, uint64_t samples, bool isEnd)
|
void LogicSnapshot::calc_mipmap(unsigned int order, uint8_t index0, uint8_t index1, uint64_t samples, bool isEnd)
|
||||||
{
|
{
|
||||||
const uint64_t mask = 1ULL << (Scale - 1);
|
const uint64_t mask = 1ULL << (Scale - 1);
|
||||||
void *lbp = _ch_data[order][index0].lbp[index1];
|
void *lbp = _ch_data[order][index0].lbp[index1];
|
||||||
void *level1_ptr = (uint8_t*)lbp + LeafBlockSamples / 8;
|
void *level1_ptr = (uint8_t*)lbp + LeafBlockSamples / 8;
|
||||||
@ -552,6 +557,11 @@ void LogicSnapshot::calc_mipmap(unsigned int order, uint8_t index0, uint8_t inde
|
|||||||
|
|
||||||
if (*((uint64_t*)level3_ptr) != 0){
|
if (*((uint64_t*)level3_ptr) != 0){
|
||||||
_ch_data[order][index0].tog |= 1ULL << index1;
|
_ch_data[order][index0].tog |= 1ULL << index1;
|
||||||
|
/*
|
||||||
|
if (order == 0){
|
||||||
|
dsv_info("tog:%llu,index0:%d,index1:%d, offset:%llu",
|
||||||
|
_ch_data[order][index0].tog , index0, index1, _loop_offset);
|
||||||
|
}*/
|
||||||
}
|
}
|
||||||
else if (isEnd){
|
else if (isEnd){
|
||||||
free(_ch_data[order][index0].lbp[index1]);
|
free(_ch_data[order][index0].lbp[index1]);
|
||||||
|
@ -218,6 +218,7 @@ private:
|
|||||||
uint64_t _mipmap_sample_count;
|
uint64_t _mipmap_sample_count;
|
||||||
bool _is_loop;
|
bool _is_loop;
|
||||||
uint64_t _loop_offset;
|
uint64_t _loop_offset;
|
||||||
|
uint64_t _wr_num;
|
||||||
|
|
||||||
friend class LogicSnapshotTest::Pow2;
|
friend class LogicSnapshotTest::Pow2;
|
||||||
friend class LogicSnapshotTest::Basic;
|
friend class LogicSnapshotTest::Basic;
|
||||||
|
@ -760,6 +760,8 @@ namespace pv
|
|||||||
unsigned int dso_probe_count = 0;
|
unsigned int dso_probe_count = 0;
|
||||||
unsigned int analog_probe_count = 0;
|
unsigned int analog_probe_count = 0;
|
||||||
|
|
||||||
|
_capture_data->clear();
|
||||||
|
_view_data->clear();
|
||||||
set_cur_snap_samplerate(_device_agent.get_sample_rate());
|
set_cur_snap_samplerate(_device_agent.get_sample_rate());
|
||||||
set_cur_samplelimits(_device_agent.get_sample_limit());
|
set_cur_samplelimits(_device_agent.get_sample_limit());
|
||||||
|
|
||||||
|
@ -1067,8 +1067,8 @@ namespace pv
|
|||||||
_session->set_operation_mode(OPT_SINGLE);
|
_session->set_operation_mode(OPT_SINGLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_device_agent->is_stream_mode() || _device_agent->is_demo())
|
// if (_device_agent->is_stream_mode() || _device_agent->is_demo())
|
||||||
_action_loop->setVisible(true);
|
// _action_loop->setVisible(true);
|
||||||
}
|
}
|
||||||
_run_stop_action->setVisible(true);
|
_run_stop_action->setVisible(true);
|
||||||
_instant_action->setVisible(true);
|
_instant_action->setVisible(true);
|
||||||
@ -1102,7 +1102,7 @@ namespace pv
|
|||||||
}
|
}
|
||||||
else if (act == _action_repeat)
|
else if (act == _action_repeat)
|
||||||
{
|
{
|
||||||
if (_device_agent->is_hardware() && _device_agent->is_stream_mode())
|
if (_device_agent->is_stream_mode() || _device_agent->is_demo())
|
||||||
{
|
{
|
||||||
_session->set_repeat_intvl(0.1);
|
_session->set_repeat_intvl(0.1);
|
||||||
_session->set_operation_mode(OPT_REPEAT);
|
_session->set_operation_mode(OPT_REPEAT);
|
||||||
@ -1222,8 +1222,8 @@ namespace pv
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (_device_agent->have_instance()){
|
if (_device_agent->have_instance()){
|
||||||
if (_device_agent->is_stream_mode() || _device_agent->is_demo())
|
// if (_device_agent->is_stream_mode() || _device_agent->is_demo())
|
||||||
_action_loop->setVisible(true);
|
// _action_loop->setVisible(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user