Skip to content

Commit 40b7787

Browse files
committed
Read back configured DAC value when queried via OPC/UA.
1 parent f11a82b commit 40b7787

File tree

7 files changed

+60
-8
lines changed

7 files changed

+60
-8
lines changed

examples/opcua_server/opcua_server.ino

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,9 +334,13 @@ void setup()
334334
exp_analog->add_analog_output(
335335
opc_ua_server,
336336
analog_out_name,
337+
[i, a]()
338+
{
339+
return reinterpret_cast<AnalogExpansion *>(OptaController.getExpansionPtr(i))->pinVoltage(a);
340+
},
337341
[i, a](float const voltage)
338342
{
339-
return reinterpret_cast<AnalogExpansion *>(OptaController.getExpansionPtr(i))->pinVoltage(a, voltage);
343+
reinterpret_cast<AnalogExpansion *>(OptaController.getExpansionPtr(i))->pinVoltage(a, voltage);
340344
});
341345
output_num++;
342346
}

src/expansion/AnalogExpansion.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,10 @@ void
8181
AnalogExpansion::add_analog_output(
8282
UA_Server * server,
8383
const char * display_name,
84+
AnalogOutput::OnReadRequestFunc const on_read_request,
8485
AnalogOutput::OnWriteRequestFunc const on_write_request_func)
8586
{
86-
_analog_output_mgr->add_analog_output(server, display_name, on_write_request_func);
87+
_analog_output_mgr->add_analog_output(server, display_name, on_read_request, on_write_request_func);
8788
}
8889

8990
void

src/expansion/AnalogExpansion.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ class AnalogExpansion : public Expansion
6464
add_analog_output(
6565
UA_Server * server,
6666
const char * display_name,
67+
AnalogOutput::OnReadRequestFunc const on_read_request,
6768
AnalogOutput::OnWriteRequestFunc const on_write_request_func);
6869

6970
void

src/io/analog/AnalogOutput.cpp

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

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)
36+
{
37+
AnalogOutput * this_ptr = reinterpret_cast<AnalogOutput *>(nodeContext);
38+
this_ptr->onReadRequest(server, nodeid);
39+
}
40+
2741
static void
2842
analog_output_on_write_request(
2943
UA_Server *server,
@@ -45,8 +59,10 @@ analog_output_on_write_request(
4559

4660
AnalogOutput::AnalogOutput(
4761
UA_NodeId const & node_id,
62+
OnReadRequestFunc const on_read_request,
4863
OnWriteRequestFunc const on_write_request)
4964
: _node_id{node_id}
65+
, _on_read_request{on_read_request}
5066
, _on_write_request{on_write_request}
5167
{
5268

@@ -61,13 +77,14 @@ AnalogOutput::create(
6177
UA_Server * server,
6278
UA_NodeId const & parent_node_id,
6379
const char * display_name,
80+
OnReadRequestFunc const on_read_request,
6481
OnWriteRequestFunc const on_write_request)
6582
{
6683
UA_StatusCode rc = UA_STATUSCODE_GOOD;
6784

6885
UA_VariableAttributes analog_output_value_attr = UA_VariableAttributes_default;
6986

70-
UA_Float analog_output_value = 0.;
87+
UA_Float analog_output_value = on_read_request();
7188
UA_Variant_setScalar(&analog_output_value_attr.value, &analog_output_value, &UA_TYPES[UA_TYPES_FLOAT]);
7289

7390
analog_output_value_attr.displayName = UA_LOCALIZEDTEXT("en-US", (char *)display_name);
@@ -95,7 +112,7 @@ AnalogOutput::create(
95112
}
96113

97114
/* Create an instance of AnalogOutput here. */
98-
auto const instance_ptr = std::make_shared<AnalogOutput>(node_id, on_write_request);
115+
auto const instance_ptr = std::make_shared<AnalogOutput>(node_id, on_read_request, on_write_request);
99116

100117
rc = UA_Server_setNodeContext(server, node_id, reinterpret_cast<void *>(instance_ptr.get()));
101118
if (UA_StatusCode_isBad(rc))
@@ -106,7 +123,7 @@ AnalogOutput::create(
106123
}
107124

108125
UA_ValueCallback callback;
109-
callback.onRead = NULL;
126+
callback.onRead = analog_input_on_read_request;
110127
callback.onWrite = analog_output_on_write_request;
111128
rc = UA_Server_setVariableNode_valueCallback(server, node_id, callback);
112129
if (UA_StatusCode_isBad(rc))
@@ -119,6 +136,23 @@ AnalogOutput::create(
119136
return instance_ptr;
120137
}
121138

139+
void
140+
AnalogOutput::onReadRequest(
141+
UA_Server * server,
142+
UA_NodeId const * node_id)
143+
{
144+
/* Obtain the value of the analog input pin. */
145+
float const in_x_val = _on_read_request();
146+
/* Update the variable node. */
147+
UA_Float in_x_val_opcua_value = in_x_val;
148+
UA_Variant in_x_val_opcua_variant;
149+
UA_Variant_init(&in_x_val_opcua_variant);
150+
UA_Variant_setScalar(&in_x_val_opcua_variant, &in_x_val_opcua_value, &UA_TYPES[UA_TYPES_FLOAT]);
151+
UA_Server_writeValue(server, *node_id, in_x_val_opcua_variant);
152+
/* Some debug output. */
153+
UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "%s: value = %f", __PRETTY_FUNCTION__, in_x_val);
154+
}
155+
122156
void
123157
AnalogOutput::onWriteRequest(
124158
UA_Server * server,

src/io/analog/AnalogOutput.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class AnalogOutput
3535
{
3636
public:
3737
typedef std::shared_ptr<AnalogOutput> SharedPtr;
38+
typedef std::function<float(void)> OnReadRequestFunc;
3839
typedef std::function<void(float)> OnWriteRequestFunc;
3940

4041

@@ -43,23 +44,32 @@ class AnalogOutput
4344
UA_Server * server,
4445
UA_NodeId const & parent_node_id,
4546
const char * display_name,
47+
OnReadRequestFunc const on_read_request,
4648
OnWriteRequestFunc const on_write_request);
4749

4850

4951
AnalogOutput(
5052
UA_NodeId const & node_id,
53+
OnReadRequestFunc const on_read_request,
5154
OnWriteRequestFunc const on_write_request);
5255

5356

54-
void onWriteRequest(
57+
void
58+
onReadRequest(
59+
UA_Server * server,
60+
UA_NodeId const * node_id);
61+
62+
void
63+
onWriteRequest(
5564
UA_Server * server,
5665
UA_NodeId const * node_id,
5766
float const voltage);
5867

5968

6069
private:
6170
UA_NodeId _node_id;
62-
OnWriteRequestFunc _on_write_request;
71+
OnReadRequestFunc const _on_read_request;
72+
OnWriteRequestFunc const _on_write_request;
6373
};
6474

6575
/**************************************************************************************

src/io/analog/AnalogOutputManager.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,10 @@ void
7373
AnalogOutputManager::add_analog_output(
7474
UA_Server * server,
7575
const char * display_name,
76+
AnalogOutput::OnReadRequestFunc const on_read_request,
7677
AnalogOutput::OnWriteRequestFunc const on_write_request_func)
7778
{
78-
auto const analog_output = AnalogOutput::create(server, _node_id, display_name, on_write_request_func);
79+
auto const analog_output = AnalogOutput::create(server, _node_id, display_name, on_read_request, on_write_request_func);
7980
if (!analog_output) {
8081
UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "%s: AnalogOutput::create(...) failed: returned nullptr", __PRETTY_FUNCTION__);
8182
return;

src/io/analog/AnalogOutputManager.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ class AnalogOutputManager
5151
add_analog_output(
5252
UA_Server * server,
5353
const char * display_name,
54+
AnalogOutput::OnReadRequestFunc const on_read_request,
5455
AnalogOutput::OnWriteRequestFunc const on_write_request_func);
5556

5657

0 commit comments

Comments
 (0)