@@ -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+
2741static void
2842analog_output_on_write_request (
2943 UA_Server *server,
@@ -45,8 +59,10 @@ analog_output_on_write_request(
4559
4660AnalogOutput::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+
122156void
123157AnalogOutput::onWriteRequest (
124158 UA_Server * server,
0 commit comments