Skip to content

Commit 4e422f0

Browse files
committed
change: dynamic dev create changes
1 parent b2cbb0e commit 4e422f0

4 files changed

Lines changed: 56 additions & 78 deletions

File tree

configure.ac.in

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,8 @@ m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
1010

1111
# Checks for programs.
1212
m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
13-
AX_CHECK_COMPILE_FLAG([-std=gnu11], [CFLAGS+=" -std=gnu11"], [AC_PROG_CC_C99])
1413
AC_PROG_CXX
15-
AX_CXX_COMPILE_STDCXX_11([ext], [mandatory])
14+
AX_CXX_COMPILE_STDCXX(14, [ext], [mandatory])
1615
AC_PROG_AWK
1716
AC_PROG_INSTALL
1817
AC_PROG_LIBTOOL

m4/ax_cxx_compile_stdcxx_11.m4

Lines changed: 0 additions & 40 deletions
This file was deleted.

src/dsp402.cpp

Lines changed: 47 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -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

153153
void 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

188199
void 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) {

src/dsp402.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@
3232

3333
#include "yaml-cpp/yaml.h"
3434

35+
using namespace robotkernel;
36+
using namespace std;
37+
3538
namespace module_dsp402 { class dsp402_device; };
3639
YAML::Emitter& operator<<(YAML::Emitter& out, const module_dsp402::dsp402_device& dev);
3740

@@ -46,14 +49,14 @@ class trigger_cb : public robotkernel::trigger_base {
4649
trigger_cb(std::function<void(void)> cb) : cb(cb) {}
4750

4851
//! trigger function
49-
void tick() { cb(); }
52+
void do_trigger() override { cb(); }
5053
};
5154

5255
class dsp402_device :
5356
public std::enable_shared_from_this<dsp402_device>
5457
{
5558
public:
56-
dsp402 *parent;
59+
shared_ptr<dsp402> parent;
5760

5861
std::string name;
5962
std::string user_inputs_name;
@@ -67,12 +70,13 @@ class dsp402_device :
6770
YAML::Node config;
6871

6972
//! de-/construction
70-
dsp402_device(dsp402 *parent, const YAML::Node& node);
73+
dsp402_device(shared_ptr<dsp402> parent, const YAML::Node& node);
7174
~dsp402_device();
7275

7376
typedef struct {
7477
std::shared_ptr<trigger_cb> trigger;
75-
robotkernel::sp_process_data_t pd;
78+
shared_ptr<pd_device> pd_dev;
79+
shared_ptr<process_data> pd;
7680
robotkernel::sp_pd_provider_t provider;
7781
robotkernel::sp_pd_consumer_t consumer;
7882
} pd_t;

0 commit comments

Comments
 (0)