@@ -75,7 +75,7 @@ static std::map<std::string, size_t> datatype_to_size = {
7575 { " double" , 8 },
7676};
7777
78- dsp402_device::dsp402_device (dsp402 * parent, const YAML::Node& node) :
78+ dsp402_device::dsp402_device (shared_ptr< dsp402> parent, const YAML::Node& node) :
7979 parent(parent)
8080{
8181 config = YAML::Clone (node);
@@ -151,66 +151,81 @@ std::string create_process_data_definition(const std::string& type_prefix, const
151151}
152152
153153void dsp402_device::open () {
154- user_inputs.pd = robotkernel::get_device<process_data>(user_inputs_name);
154+ auto tmp_name = decode_id<pd_device>(user_inputs_name);
155+ user_inputs.pd_dev = robotkernel::get_device<pd_device>(get<0 >(tmp_name), get<1 >(tmp_name));
155156 user_inputs.consumer = make_shared<pd_consumer>(parent->name + " ." + name + " .user_inputs" );
156- user_inputs.pd ->set_consumer (user_inputs.consumer );
157+ user_inputs.pd_dev ->set_consumer (user_inputs.consumer );
158+ user_inputs.pd = user_inputs.pd_dev ->inner ();
157159
158- user_outputs.pd = robotkernel::get_device<process_data>(user_outputs_name);
160+ tmp_name = decode_id<pd_device>(user_outputs_name);
161+ user_outputs.pd_dev = robotkernel::get_device<pd_device>(get<0 >(tmp_name), get<1 >(tmp_name));
159162 user_outputs.provider = make_shared<pd_provider>(parent->name + " ." + name + " .user_outputs" );
160- user_outputs.pd ->set_provider (user_outputs.provider );
163+ user_outputs.pd_dev ->set_provider (user_outputs.provider );
164+ user_outputs.pd = user_outputs.pd_dev ->inner ();
165+
166+ if (!user_inputs.pd ) {
167+ throw runtime_error (string_printf (" pd %s not ready yet, check depends!\n " , user_inputs.pd_dev ->id ().c_str ()));
168+ }
169+
170+ if (!user_outputs.pd ) {
171+ throw runtime_error (string_printf (" pd %s not ready yet, check depends!\n " , user_outputs.pd_dev ->id ().c_str ()));
172+ }
161173
162174 off_t inputs_length = 0 ;
163- std::string inputs_def = create_process_data_definition (prefix_entries ? user_inputs.pd ->id () : " " ,
164- user_inputs.pd ->process_data_definition , inputs_length,
165- status_word_name, status_word_offset);
175+ std::string inputs_def = create_process_data_definition (prefix_entries ? user_inputs.pd_dev ->id () : " " ,
176+ user_inputs.pd ->process_data_definition , inputs_length, status_word_name, status_word_offset);
166177 inputs.trigger = make_shared<trigger_cb>(std::bind (&dsp402_device::tick_inputs, shared_from_this ()));
178+ inputs.pd_dev = get_device<pd_device>(parent->name , name + " .inputs" );
167179 inputs.pd = make_shared<triple_buffer>(inputs_length, parent->name , name + " .inputs" , inputs_def);
180+ inputs.pd_dev ->set_inner (inputs.pd , parent);
168181 inputs.provider = make_shared<pd_provider>(parent->name + " ." + name + " .inputs" );
169- inputs.pd ->set_provider (inputs.provider );
170- robotkernel::add_device (inputs.pd );
182+ inputs.pd_dev ->set_provider (inputs.provider );
171183
172184 off_t outputs_length = 0 ;
173- std::string outputs_def = create_process_data_definition (prefix_entries ? user_outputs.pd ->id () : " " ,
174- user_outputs.pd ->process_data_definition , outputs_length,
175- control_word_name, control_word_offset);
185+ std::string outputs_def = create_process_data_definition (prefix_entries ? user_outputs.pd_dev ->id () : " " ,
186+ user_outputs.pd ->process_data_definition , outputs_length, control_word_name, control_word_offset);
176187 outputs.trigger = make_shared<trigger_cb>(std::bind (&dsp402_device::tick_outputs_update, shared_from_this ()));
177- outputs.pd = make_shared<triple_buffer>(outputs_length, parent->name , name + " .outputs" , outputs_def);
188+ outputs.pd_dev = get_device<pd_device>(parent->name , name + " .outputs" );
189+ outputs.pd = make_shared<triple_buffer>(outputs_length, outputs_def);
190+ outputs.pd_dev ->set_inner (outputs.pd , parent);
178191 outputs.consumer = make_shared<pd_consumer>(parent->name + " ." + name + " .outputs" );
179- outputs.pd ->set_consumer (outputs.consumer );
180-
181- parent->log (info, " %s: adding trigger to %s\n " , name.c_str (), user_inputs.pd ->trigger_dev ->id ().c_str ());
182- user_inputs.pd ->trigger_dev ->add_trigger (inputs.trigger );
183- outputs.pd ->trigger_dev ->add_trigger (outputs.trigger );
192+ outputs.pd_dev ->set_consumer (outputs.consumer );
184193
185- robotkernel::add_device (outputs.pd );
194+ parent->log (info, " %s: adding trigger to %s\n " , name.c_str (), user_inputs.pd_dev ->id ().c_str ());
195+ user_inputs.pd_dev ->add_trigger (inputs.trigger );
196+ outputs.pd_dev ->add_trigger (outputs.trigger );
186197}
187198
188199void dsp402_device::close () {
189- parent->log (info, " %s: removing trigger to %s\n " , name.c_str (), user_inputs.pd -> trigger_dev ->id ().c_str ());
190- user_inputs.pd -> trigger_dev ->remove_trigger (inputs.trigger );
200+ parent->log (info, " %s: removing trigger to %s\n " , name.c_str (), user_inputs.pd_dev ->id ().c_str ());
201+ user_inputs.pd_dev ->remove_trigger (inputs.trigger );
191202 inputs.trigger = nullptr ;
192203
193- parent->log (info, " %s: removing trigger to %s\n " , name.c_str (), outputs.pd -> trigger_dev ->id ().c_str ());
194- outputs.pd -> trigger_dev ->remove_trigger (outputs.trigger );
204+ parent->log (info, " %s: removing trigger to %s\n " , name.c_str (), outputs.pd_dev ->id ().c_str ());
205+ outputs.pd_dev ->remove_trigger (outputs.trigger );
195206 outputs.trigger = nullptr ;
196207
197- outputs.pd ->reset_consumer (outputs.consumer );
198- robotkernel::remove_device ( outputs.pd );
208+ outputs.pd_dev ->reset_consumer (outputs.consumer );
209+ outputs.pd_dev -> reset_inner (parent );
199210 outputs.consumer = nullptr ;
200211 outputs.pd = nullptr ;
212+ outputs.pd_dev = nullptr ;
201213
202- inputs.pd ->reset_provider (inputs.provider );
203- robotkernel::remove_device ( inputs.pd );
214+ inputs.pd_dev ->reset_provider (inputs.provider );
215+ inputs.pd_dev -> reset_inner (parent );
204216 inputs.provider = nullptr ;
205217 inputs.pd = nullptr ;
218+ inputs.pd_dev = nullptr ;
206219
207- user_inputs.pd ->reset_consumer (user_inputs.consumer );
220+ user_inputs.pd_dev ->reset_consumer (user_inputs.consumer );
208221 user_inputs.pd = nullptr ;
209222 user_inputs.consumer = nullptr ;
223+ user_inputs.pd_dev = nullptr ;
210224
211- user_outputs.pd ->reset_provider (user_outputs.provider );
225+ user_outputs.pd_dev ->reset_provider (user_outputs.provider );
212226 user_outputs.pd = nullptr ;
213227 user_outputs.provider = nullptr ;
228+ user_outputs.pd_dev = nullptr ;
214229}
215230
216231
@@ -343,14 +358,14 @@ void dsp402::init() {
343358 if (config[" devices" ]) {
344359 // backwards compability
345360 for (const auto & dev : config[" devices" ])
346- devices.push_back (make_shared<dsp402_device>(this , dev));
361+ devices.push_back (make_shared<dsp402_device>(shared_from_this () , dev));
347362 }
348363
349364 std::list<YAML::Node> device_instances_list;
350365 robotkernel::parse_templates (config, device_instances_list);
351366
352367 for (const auto & inst : device_instances_list) {
353- devices.push_back (make_shared<dsp402_device>(this , inst));
368+ devices.push_back (make_shared<dsp402_device>(shared_from_this () , inst));
354369 }
355370
356371 for (const auto & dev : devices) {
0 commit comments