Decode the data while collection the data, the step 1

This commit is contained in:
dreamsourcelabTAI 2022-12-21 17:55:12 +08:00
parent 21799ffe00
commit bf05fdf055
5 changed files with 63 additions and 16 deletions

View File

@ -65,7 +65,8 @@ DecoderStack::DecoderStack(pv::SigSession *session,
_no_memory = false;
_mark_index = -1;
_decoder_status = decoder_status;
_stask_stauts = NULL;
_stask_stauts = NULL;
_is_capture_end = true;
_stack.push_back(new decode::Decoder(dec));
@ -609,8 +610,6 @@ void DecoderStack::execute_decode_stack()
// Get the intial sample count
_sample_count = _snapshot->get_sample_count();
dsv_info("%s%llu", "decoder sample count: ", _sample_count);
// Create the decoders
for(auto dec : _stack)
@ -630,9 +629,15 @@ void DecoderStack::execute_decode_stack()
prev_di = di;
decode_start = dec->decode_start();
decode_end = min(dec->decode_end(), _sample_count-1);
if (_session->is_realtime_mode() == false)
decode_end = min(dec->decode_end(), _sample_count-1);
else
decode_end = max(dec->decode_end(), decode_end);
}
dsv_info("decoder start sample:%llu, end sample:%llu, count:%llu", decode_start, decode_end, decode_end - decode_start + 1);
// Start the session
srd_session_metadata_set(session, SRD_CONF_SAMPLERATE,
g_variant_new_uint64((uint64_t)_samplerate));

View File

@ -164,6 +164,14 @@ public:
return _decoder_status;
}
inline bool is_capture_end(){
return _is_capture_end;
}
inline void set_capture_end_flag(bool isEnd){
_is_capture_end = isEnd;
}
private:
void decode_data(const uint64_t decode_start, const uint64_t decode_end, srd_session *const session);
void execute_decode_stack();
@ -196,6 +204,7 @@ private:
decode_task_status *_stask_stauts;
mutable std::mutex _output_mutex;
bool _is_capture_end;
friend class DecoderStackTest::TwoDecoderStack;
};

View File

@ -74,6 +74,7 @@ public:
#define DSV_MSG_COLLECT_END 5004
#define DSV_MSG_END_COLLECT_WORK_PREV 5005
#define DSV_MSG_END_COLLECT_WORK 5006
#define DSV_MSG_REV_END_PACKET 5007
#define DSV_MSG_DEVICE_LIST_UPDATED 6000
#define DSV_MSG_BEGIN_DEVICE_OPTIONS 6001 //Begin show device options dialog.

View File

@ -478,6 +478,23 @@ namespace pv
_is_working = true;
_callback->trigger_message(DSV_MSG_START_COLLECT_WORK);
if (_device_agent.get_work_mode() == LOGIC)
{
for (auto de : _decode_traces)
{
de->decoder()->set_capture_end_flag(false);
// On real-time mode, create the decode task when capture started.
if (is_realtime_mode())
{
de->decoder()->frame_ended();
de->frame_ended();
add_decode_task(de);
}
}
}
// Start a timer, for able to refresh the view per (1000 / 30)ms
if (is_realtime_mode()){
_refresh_rt_timer.Start(1000 / 30);
}
@ -1251,12 +1268,11 @@ namespace pv
_dso_data->snapshot()->capture_ended();
_analog_data->snapshot()->capture_ended();
for (auto trace : _decode_traces)
{
trace->decoder()->frame_ended();
trace->frame_ended();
add_decode_task(trace);
}
int mode = _device_agent.get_work_mode();
// Post a message to start all decode tasks.
if (mode == LOGIC)
_callback->trigger_message(DSV_MSG_REV_END_PACKET);
if (packet->status != SR_PKT_OK)
{
@ -1266,10 +1282,8 @@ namespace pv
_callback->frame_ended();
if (_device_agent.get_work_mode() != LOGIC)
{
if (mode != LOGIC)
set_session_time(QDateTime::currentDateTime());
}
break;
}
@ -1876,7 +1890,7 @@ namespace pv
case DS_EV_INACTIVE_DEVICE_DETACH:
_callback->trigger_message(DSV_MSG_DEVICE_LIST_UPDATED); // Update list only.
break;
break;
default:
dsv_err("%s", "Error!Unknown device event.");
@ -1943,7 +1957,7 @@ namespace pv
case DSV_MSG_TRIG_NEXT_COLLECT:
{
if (_is_working)
if (_is_working && is_repeat_mode())
{
if (_repeat_intvl > 0)
{
@ -1974,6 +1988,25 @@ namespace pv
}
break;
case DSV_MSG_REV_END_PACKET:
{
if (_device_agent.get_work_mode() == LOGIC)
{
for (auto de : _decode_traces)
{
de->decoder()->set_capture_end_flag(true);
// If is not the real-time mode, try to create all decode tasks.
if (is_realtime_mode() == false){
de->decoder()->frame_ended();
de->frame_ended();
add_decode_task(de);
}
}
}
}
break;
case DSV_MSG_COLLECT_END:
break;
}

View File

@ -374,7 +374,6 @@ private:
void set_cur_snap_samplerate(uint64_t samplerate);
void math_disable();
private:
bool exec_capture();
void exit_capture();