Skip to content

Commit 14934f6

Browse files
committed
Hide AnalogInput/AnalogOutput/PwmOutput/LedOutput-Manager classes so that the user only directly adds those components.
1 parent 7d21101 commit 14934f6

File tree

15 files changed

+312
-182
lines changed

15 files changed

+312
-182
lines changed

examples/opcua_server/opcua_server.ino

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,13 @@ void setup()
287287
/* Expose analog inputs as readable OPC UA properties. */
288288
char analog_in_name[32] = {0};
289289
snprintf(analog_in_name, sizeof(analog_in_name), "Analog Input I%d", input_num);
290-
exp_analog->analog_input_mgr()->add_analog_input(opc_ua_server, analog_in_name, [i, a]() { return reinterpret_cast<AnalogExpansion *>(OptaController.getExpansionPtr(i))->pinVoltage(a); });
290+
exp_analog->add_analog_input(
291+
opc_ua_server,
292+
analog_in_name,
293+
[i, a]()
294+
{
295+
return reinterpret_cast<AnalogExpansion *>(OptaController.getExpansionPtr(i))->pinVoltage(a);
296+
});
291297
input_num++;
292298
}
293299

@@ -308,7 +314,13 @@ void setup()
308314
/* Expose analog inputs as readable OPC UA properties. */
309315
char analog_out_name[32] = {0};
310316
snprintf(analog_out_name, sizeof(analog_out_name), "Analog Output O%d", output_num);
311-
exp_analog->analog_output_mgr()->add_analog_output(opc_ua_server, analog_out_name, [i, a](float const voltage) { return reinterpret_cast<AnalogExpansion *>(OptaController.getExpansionPtr(i))->pinVoltage(a, voltage); });
317+
exp_analog->add_analog_output(
318+
opc_ua_server,
319+
analog_out_name,
320+
[i, a](float const voltage)
321+
{
322+
return reinterpret_cast<AnalogExpansion *>(OptaController.getExpansionPtr(i))->pinVoltage(a, voltage);
323+
});
312324
output_num++;
313325
}
314326

@@ -318,12 +330,13 @@ void setup()
318330
{
319331
char pwm_out_name[32] = {0};
320332
snprintf(pwm_out_name, sizeof(pwm_out_name), "PWM%d", pwm_output_num);
321-
exp_analog->pwm_output_mgr()->add_pwm_output(opc_ua_server,
322-
pwm_out_name,
323-
[i, p](uint32_t const pwm_period_ms, uint32_t const pwm_pulse_width_ms)
324-
{
325-
reinterpret_cast<AnalogExpansion *>(OptaController.getExpansionPtr(i))->setPwm(p, pwm_period_ms, pwm_pulse_width_ms);
326-
});
333+
exp_analog->add_pwm_output(
334+
opc_ua_server,
335+
pwm_out_name,
336+
[i, p](uint32_t const pwm_period_ms, uint32_t const pwm_pulse_width_ms)
337+
{
338+
reinterpret_cast<AnalogExpansion *>(OptaController.getExpansionPtr(i))->setPwm(p, pwm_period_ms, pwm_pulse_width_ms);
339+
});
327340
pwm_output_num++;
328341
}
329342

@@ -332,16 +345,17 @@ void setup()
332345
{
333346
char led_name[32] = {0};
334347
snprintf(led_name, sizeof(led_name), "LED%d", l + 1);
335-
exp_analog->led_mgr()->add_led_output(opc_ua_server,
336-
led_name,
337-
[i, l](bool const value)
338-
{
339-
AnalogExpansion * ana_exp_ptr = reinterpret_cast<AnalogExpansion *>(OptaController.getExpansionPtr(i));
340-
if (value)
341-
ana_exp_ptr->switchLedOn(l);
342-
else
343-
ana_exp_ptr->switchLedOff(l);
344-
});
348+
exp_analog->add_led_output(
349+
opc_ua_server,
350+
led_name,
351+
[i, l](bool const value)
352+
{
353+
AnalogExpansion * ana_exp_ptr = reinterpret_cast<AnalogExpansion *>(OptaController.getExpansionPtr(i));
354+
if (value)
355+
ana_exp_ptr->switchLedOn(l);
356+
else
357+
ana_exp_ptr->switchLedOff(l);
358+
});
345359
}
346360
}
347361
}

src/expansion/AnalogExpansion.cpp

Lines changed: 50 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,32 @@
2020
namespace opcua
2121
{
2222

23+
/**************************************************************************************
24+
* CTOR/DTOR
25+
**************************************************************************************/
26+
27+
AnalogExpansion::AnalogExpansion(
28+
UA_Server * server,
29+
UA_NodeId const parent_node_id,
30+
char * display_name,
31+
char * node_name,
32+
char * model_name)
33+
: Expansion(server, parent_node_id, display_name, node_name, model_name)
34+
, _analog_input_mgr{opcua::AnalogInputManager::create(_server, _node_id)}
35+
, _analog_output_mgr{opcua::AnalogOutputManager::create(_server, _node_id)}
36+
, _pwm_output_mgr{opcua::PwmOutputManager::create(_server, _node_id)}
37+
, _led_mgr{opcua::LedManager::create(_server, _node_id)}
38+
{
39+
if (!_analog_input_mgr)
40+
UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "%s: AnalogInputManager::create(...) failed.", __PRETTY_FUNCTION__);
41+
if (!_analog_output_mgr)
42+
UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "%s: AnalogOutputManager::create(...) failed.", __PRETTY_FUNCTION__);
43+
if (!_pwm_output_mgr)
44+
UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "%s: PwmOutputManager::create(...) failed.", __PRETTY_FUNCTION__);
45+
if (!_led_mgr)
46+
UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "%s: LedManager::create(...) failed.", __PRETTY_FUNCTION__);
47+
}
48+
2349
/**************************************************************************************
2450
* PUBLIC MEMBER FUNCTIONS
2551
**************************************************************************************/
@@ -42,58 +68,40 @@ AnalogExpansion::create(
4268
return instance_ptr;
4369
}
4470

45-
AnalogInputManager::SharedPtr
46-
AnalogExpansion::analog_input_mgr()
71+
void
72+
AnalogExpansion::add_analog_input(
73+
UA_Server * server,
74+
const char * display_name,
75+
AnalogInput::OnReadRequestFunc const on_read_request_func)
4776
{
48-
if (!_analog_input_mgr)
49-
{
50-
_analog_input_mgr = opcua::AnalogInputManager::create(_server, _node_id);
51-
if (!_analog_input_mgr)
52-
UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
53-
"%s: AnalogInputManager::create(...) failed.", __PRETTY_FUNCTION__);
54-
}
55-
56-
return _analog_input_mgr;
77+
_analog_input_mgr->add_analog_input(server, display_name, on_read_request_func);
5778
}
5879

59-
AnalogOutputManager::SharedPtr
60-
AnalogExpansion::analog_output_mgr()
80+
void
81+
AnalogExpansion::add_analog_output(
82+
UA_Server * server,
83+
const char * display_name,
84+
AnalogOutput::OnWriteRequestFunc const on_write_request_func)
6185
{
62-
if (!_analog_output_mgr)
63-
{
64-
_analog_output_mgr = opcua::AnalogOutputManager::create(_server, _node_id);
65-
if (!_analog_output_mgr)
66-
UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "%s: AnalogOutputManager::create(...) failed.", __PRETTY_FUNCTION__);
67-
}
68-
69-
return _analog_output_mgr;
86+
_analog_output_mgr->add_analog_output(server, display_name, on_write_request_func);
7087
}
7188

72-
PwmOutputManager::SharedPtr
73-
AnalogExpansion::pwm_output_mgr()
89+
void
90+
AnalogExpansion::add_pwm_output(
91+
UA_Server * server,
92+
const char * display_name,
93+
PwmOutput::SetPwmFunc const set_pwm_func)
7494
{
75-
if (!_pwm_output_mgr)
76-
{
77-
_pwm_output_mgr = opcua::PwmOutputManager::create(_server, _node_id);
78-
if (!_pwm_output_mgr)
79-
UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "%s: PwmOutputManager::create(...) failed.", __PRETTY_FUNCTION__);
80-
}
81-
82-
return _pwm_output_mgr;
95+
_pwm_output_mgr->add_pwm_output(server, display_name, set_pwm_func);
8396
}
8497

85-
LedManager::SharedPtr
86-
AnalogExpansion::led_mgr()
98+
void
99+
AnalogExpansion::add_led_output(
100+
UA_Server * server,
101+
const char * display_name,
102+
Led::OnSetLedStateFunc const on_set_led_state)
87103
{
88-
if (!_led_mgr)
89-
{
90-
_led_mgr = opcua::LedManager::create(_server, _node_id);
91-
if (!_led_mgr)
92-
UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
93-
"%s: LedManager::create(...) failed.", __PRETTY_FUNCTION__);
94-
}
95-
96-
return _led_mgr;
104+
_led_mgr->add_led_output(server, display_name, on_set_led_state);
97105
}
98106

99107
/**************************************************************************************

src/expansion/AnalogExpansion.h

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,16 +51,32 @@ class AnalogExpansion : public Expansion
5151
UA_NodeId const parent_node_id,
5252
char * display_name,
5353
char * node_name,
54-
char * model_name)
55-
: Expansion(server, parent_node_id, display_name, node_name, model_name)
56-
{ }
54+
char * model_name);
5755

5856

59-
AnalogInputManager::SharedPtr analog_input_mgr();
60-
AnalogOutputManager::SharedPtr analog_output_mgr();
61-
PwmOutputManager::SharedPtr pwm_output_mgr();
62-
LedManager::SharedPtr led_mgr();
57+
void
58+
add_analog_input(
59+
UA_Server * server,
60+
const char * display_name,
61+
AnalogInput::OnReadRequestFunc const on_read_request_func);
62+
63+
void
64+
add_analog_output(
65+
UA_Server * server,
66+
const char * display_name,
67+
AnalogOutput::OnWriteRequestFunc const on_write_request_func);
6368

69+
void
70+
add_pwm_output(
71+
UA_Server * server,
72+
const char * display_name,
73+
PwmOutput::SetPwmFunc const set_pwm_func);
74+
75+
void
76+
add_led_output(
77+
UA_Server * server,
78+
const char * display_name,
79+
Led::OnSetLedStateFunc const on_set_led_state);
6480

6581

6682
private:

src/io/analog/AnalogInput.cpp

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,15 @@ namespace opcua
2424
* FUNCTION DEFINITION
2525
**************************************************************************************/
2626

27-
static void analog_input_on_read_request(UA_Server *server,
28-
const UA_NodeId *sessionId,
29-
void *sessionContext,
30-
const UA_NodeId *nodeid,
31-
void *nodeContext,
32-
const UA_NumericRange *range,
33-
const UA_DataValue *data)
27+
static void
28+
analog_input_on_read_request(
29+
UA_Server *server,
30+
const UA_NodeId *sessionId,
31+
void *sessionContext,
32+
const UA_NodeId *nodeid,
33+
void *nodeContext,
34+
const UA_NumericRange *range,
35+
const UA_DataValue *data)
3436
{
3537
AnalogInput * this_ptr = reinterpret_cast<AnalogInput *>(nodeContext);
3638
this_ptr->onReadRequest(server, nodeid);
@@ -40,7 +42,9 @@ static void analog_input_on_read_request(UA_Server *server,
4042
* CTOR/DTOR
4143
**************************************************************************************/
4244

43-
AnalogInput::AnalogInput(UA_NodeId const & node_id, OnReadRequestFunc const on_read_request)
45+
AnalogInput::AnalogInput(
46+
UA_NodeId const & node_id,
47+
OnReadRequestFunc const on_read_request)
4448
: _node_id{node_id}
4549
, _on_read_request{on_read_request}
4650
{
@@ -51,10 +55,12 @@ AnalogInput::AnalogInput(UA_NodeId const & node_id, OnReadRequestFunc const on_r
5155
* PUBLIC MEMBER FUNCTIONS
5256
**************************************************************************************/
5357

54-
AnalogInput::SharedPtr AnalogInput::create(UA_Server * server,
55-
UA_NodeId const & parent_node_id,
56-
const char * display_name,
57-
OnReadRequestFunc const on_read_request)
58+
AnalogInput::SharedPtr
59+
AnalogInput::create(
60+
UA_Server * server,
61+
UA_NodeId const & parent_node_id,
62+
const char * display_name,
63+
OnReadRequestFunc const on_read_request)
5864
{
5965
UA_VariableAttributes analog_input_value_attr = UA_VariableAttributes_default;
6066

@@ -81,8 +87,7 @@ AnalogInput::SharedPtr AnalogInput::create(UA_Server * server,
8187
if (UA_StatusCode_isBad(rc))
8288
{
8389
UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
84-
"AnalogInput::create: UA_Server_addVariableNode(...) failed with %s",
85-
UA_StatusCode_name(rc));
90+
"%s: UA_Server_addVariableNode(...) failed with %s", __PRETTY_FUNCTION__, UA_StatusCode_name(rc));
8691
return nullptr;
8792
}
8893

@@ -93,8 +98,7 @@ AnalogInput::SharedPtr AnalogInput::create(UA_Server * server,
9398
if (UA_StatusCode_isBad(rc))
9499
{
95100
UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
96-
"AnalogInput::create: UA_Server_setNodeContext(...) failed with %s",
97-
UA_StatusCode_name(rc));
101+
"%s: UA_Server_setNodeContext(...) failed with %s", __PRETTY_FUNCTION__, UA_StatusCode_name(rc));
98102
return nullptr;
99103
}
100104

@@ -105,15 +109,17 @@ AnalogInput::SharedPtr AnalogInput::create(UA_Server * server,
105109
if (UA_StatusCode_isBad(rc))
106110
{
107111
UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
108-
"AnalogInput::create: UA_Server_setVariableNode_valueCallback(...) failed with %s",
109-
UA_StatusCode_name(rc));
112+
"%s: UA_Server_setVariableNode_valueCallback(...) failed with %s", __PRETTY_FUNCTION__, UA_StatusCode_name(rc));
110113
return nullptr;
111114
}
112115

113116
return instance_ptr;
114117
}
115118

116-
void AnalogInput::onReadRequest(UA_Server * server, UA_NodeId const * node_id)
119+
void
120+
AnalogInput::onReadRequest(
121+
UA_Server * server,
122+
UA_NodeId const * node_id)
117123
{
118124
/* Obtain the value of the analog input pin. */
119125
float const in_x_val = _on_read_request();
@@ -124,7 +130,7 @@ void AnalogInput::onReadRequest(UA_Server * server, UA_NodeId const * node_id)
124130
UA_Variant_setScalar(&in_x_val_opcua_variant, &in_x_val_opcua_value, &UA_TYPES[UA_TYPES_FLOAT]);
125131
UA_Server_writeValue(server, *node_id, in_x_val_opcua_variant);
126132
/* Some debug output. */
127-
UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "AnalogInput::onReadRequest: value = %f", in_x_val);
133+
UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "%s: value = %f", __PRETTY_FUNCTION__, in_x_val);
128134
}
129135

130136
/**************************************************************************************

src/io/analog/AnalogInput.h

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,23 @@ class AnalogInput
3737
typedef std::shared_ptr<AnalogInput> SharedPtr;
3838
typedef std::function<float(void)> OnReadRequestFunc;
3939

40-
static SharedPtr create(UA_Server * server,
41-
UA_NodeId const & parent_node_id,
42-
const char * display_name,
43-
OnReadRequestFunc const on_read_request);
4440

45-
AnalogInput(UA_NodeId const & node_id, OnReadRequestFunc const on_read_request);
41+
static SharedPtr
42+
create(
43+
UA_Server * server,
44+
UA_NodeId const & parent_node_id,
45+
const char * display_name,
46+
OnReadRequestFunc const on_read_request);
4647

47-
void onReadRequest(UA_Server * server, UA_NodeId const * node_id);
48+
49+
AnalogInput(
50+
UA_NodeId const & node_id,
51+
OnReadRequestFunc const on_read_request);
52+
53+
54+
void onReadRequest(
55+
UA_Server * server,
56+
UA_NodeId const * node_id);
4857

4958

5059
private:

0 commit comments

Comments
 (0)