20 #ifndef PULSEVIEW_PV_DATA_DECODESIGNAL_HPP 21 #define PULSEVIEW_PV_DATA_DECODESIGNAL_HPP 25 #include <condition_variable> 26 #include <unordered_set> 32 #include <libsigrokdecode/libsigrokdecode.h> 41 using std::condition_variable;
46 using std::shared_ptr;
85 map<const Row*, RowData> annotation_rows;
109 virtual void set_name(QString name);
114 virtual void set_color(QColor color);
116 bool is_decode_signal()
const;
117 const vector< shared_ptr<Decoder> >& decoder_stack()
const;
119 void stack_decoder(
const srd_decoder *decoder,
bool restart_decode=
true);
120 void remove_decoder(
int index);
121 bool toggle_decoder_visibility(
int index);
123 void reset_decode(
bool shutting_down =
false);
126 void resume_decode();
127 bool is_paused()
const;
129 const vector<decode::DecodeChannel> get_channels()
const;
130 void auto_assign_signals(
const shared_ptr<Decoder> dec);
131 void assign_signal(
const uint16_t channel_id, shared_ptr<const SignalBase> signal);
132 int get_assigned_signal_count()
const;
134 void update_output_signals();
136 void set_initial_pin_state(
const uint16_t channel_id,
const int init_state);
138 virtual double get_samplerate()
const;
146 int64_t get_working_sample_count(uint32_t segment_id)
const;
156 int64_t get_decoded_sample_count(uint32_t segment_id,
157 bool include_processing)
const;
159 vector<Row*> get_rows(
bool visible_only=
false);
160 vector<const Row*> get_rows(
bool visible_only=
false)
const;
162 uint64_t get_annotation_count(
const Row* row, uint32_t segment_id)
const;
169 void get_annotation_subset(deque<const Annotation*> &dest,
const Row* row,
170 uint32_t segment_id, uint64_t start_sample, uint64_t end_sample)
const;
177 void get_annotation_subset(deque<const Annotation*> &dest, uint32_t segment_id,
178 uint64_t start_sample, uint64_t end_sample)
const;
180 uint32_t get_binary_data_chunk_count(uint32_t segment_id,
181 const Decoder* dec, uint32_t bin_class_id)
const;
182 void get_binary_data_chunk(uint32_t segment_id,
const Decoder* dec,
183 uint32_t bin_class_id, uint32_t chunk_id,
const vector<uint8_t> **dest,
185 void get_merged_binary_data_chunks_by_sample(uint32_t segment_id,
186 const Decoder* dec, uint32_t bin_class_id,
187 uint64_t start_sample, uint64_t end_sample,
188 vector<uint8_t> *dest)
const;
189 void get_merged_binary_data_chunks_by_offset(uint32_t segment_id,
190 const Decoder* dec, uint32_t bin_class_id,
191 uint64_t start, uint64_t end,
192 vector<uint8_t> *dest)
const;
194 const Decoder* dec, uint32_t bin_class_id)
const;
196 const deque<const Annotation*>* get_all_annotations_by_segment(uint32_t segment_id)
const;
198 virtual void save_settings(
QSettings &settings)
const;
200 virtual void restore_settings(
QSettings &settings);
203 bool all_input_segments_complete(uint32_t segment_id)
const;
204 uint32_t get_input_segment_count()
const;
205 double get_input_samplerate(uint32_t segment_id)
const;
207 Decoder* get_decoder_by_instance(
const srd_decoder *
const srd_dec);
209 void update_channel_list();
211 void commit_decoder_channels();
213 void mux_logic_samples(uint32_t segment_id,
const int64_t start,
const int64_t end);
214 void logic_mux_proc();
216 void decode_data(
const int64_t abs_start_samplenum,
const int64_t sample_count,
217 const shared_ptr<const LogicSegment> input_segment);
220 void start_srd_session();
221 void terminate_srd_session();
222 void stop_srd_session();
224 void connect_input_notifiers();
225 void disconnect_input_notifiers();
227 void create_decode_segment();
229 static void annotation_callback(srd_proto_data *pdata,
void *decode_signal);
230 static void binary_callback(srd_proto_data *pdata,
void *decode_signal);
231 static void logic_output_callback(srd_proto_data *pdata,
void *decode_signal);
234 void decoder_stacked(
void* decoder);
235 void decoder_removed(
void* decoder);
236 void new_annotations();
237 void new_binary_data(
unsigned int segment_id,
void* decoder,
unsigned int bin_class_id);
239 void decode_finished();
240 void channels_updated();
241 void annotation_visibility_changed();
244 void on_capture_state_changed(
int state);
245 void on_data_cleared();
246 void on_data_received();
247 void on_input_segment_completed();
249 void on_annotation_visibility_changed();
268 mutable mutex input_mutex_,
output_mutex_, decode_pause_mutex_, logic_mux_mutex_;
269 mutable condition_variable decode_input_cond_, decode_pause_cond_,
285 #endif // PULSEVIEW_PV_DATA_DECODESIGNAL_HPP map< const srd_decoder *, shared_ptr< Logic > > output_logic_
vector< decode::DecodeChannel > channels_
deque< const Annotation * > all_annotations
deque< DecodeSegment > segments_
vector< shared_ptr< Decoder > > stack_
uint32_t logic_mux_unit_size_
deque< DecodeBinaryDataChunk > chunks
vector< DecodeBinaryClass > binary_classes
static const double DecodeMargin
static const int64_t DecodeChunkLength
std::thread logic_mux_thread_
uint32_t current_segment_id_
static const double DecodeThreshold
map< const srd_decoder *, vector< uint8_t > > output_logic_muxed_data_
int64_t samples_decoded_incl
pv::util::Timestamp start_time
bool logic_mux_data_invalid_
atomic< bool > logic_mux_interrupt_
shared_ptr< Logic > logic_mux_data_
boost::multiprecision::number< boost::multiprecision::cpp_dec_float< 24 >, boost::multiprecision::et_off > Timestamp
Timestamp type providing yoctosecond resolution.
DecodeSegment(DecodeSegment &&ds)
condition_variable logic_mux_cond_
struct srd_session * srd_session_
const DecodeBinaryClassInfo * info
uint64_t sample
Number of the sample where this data was provided by the PD.
bool stack_config_changed_
vector< shared_ptr< SignalBase > > output_signals_