@@ -24,6 +24,20 @@ namespace opcua
2424 * FUNCTION DEFINITION
2525 **************************************************************************************/
2626
27+ static void
28+ pwm_output_on_read_request_pwm_period (
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+ PwmOutput * this_ptr = reinterpret_cast <PwmOutput *>(nodeContext);
38+ this_ptr->onReadRequestPwmPeriod (server, nodeid);
39+ }
40+
2741static void
2842pwm_output_on_write_request_pwm_period (
2943 UA_Server *server,
@@ -59,10 +73,12 @@ pwm_output_on_write_request_pwm_pulse_width(
5973 **************************************************************************************/
6074
6175PwmOutput::PwmOutput (
62- UA_NodeId const & node_id,
63- SetPwmFunc const set_pwm_func)
64- : _node_id{node_id}
76+ UA_NodeId const & pwm_period_node_id,
77+ SetPwmFunc const set_pwm_func,
78+ GetPwmPeriodFunc const get_pwm_period_func)
79+ : _pwm_period_node_id{pwm_period_node_id}
6580 , _set_pwm_func{set_pwm_func}
81+ , _get_pwm_period_func{get_pwm_period_func}
6682 , _pwm_period_ms{0 }
6783 , _pwm_pulse_width_ms{0 }
6884{
@@ -78,7 +94,8 @@ PwmOutput::create(
7894 UA_Server * server,
7995 UA_NodeId const & parent_node_id,
8096 const char * display_name,
81- SetPwmFunc const set_pwm_func)
97+ SetPwmFunc const set_pwm_func,
98+ GetPwmPeriodFunc const get_pwm_period_func)
8299{
83100 UA_StatusCode rc = UA_STATUSCODE_GOOD;
84101
@@ -103,26 +120,26 @@ PwmOutput::create(
103120
104121 UA_VariableAttributes pwm_out_period_value_attr = UA_VariableAttributes_default;
105122
106- UA_Boolean pwm_output_period_value = 0 ;
123+ UA_Boolean pwm_output_period_value = get_pwm_period_func () ;
107124 UA_Variant_setScalar (&pwm_out_period_value_attr.value , &pwm_output_period_value, &UA_TYPES[UA_TYPES_UINT32]);
108125
109- pwm_out_period_value_attr.displayName = UA_LOCALIZEDTEXT (" en-US" , ( char *)display_name );
126+ pwm_out_period_value_attr.displayName = UA_LOCALIZEDTEXT (" en-US" , " PWM Period / ms " );
110127 pwm_out_period_value_attr.dataType = UA_TYPES[UA_TYPES_UINT32].typeId ;
111128 pwm_out_period_value_attr.accessLevel =
112129 UA_ACCESSLEVELMASK_READ |
113130 UA_ACCESSLEVELMASK_WRITE | UA_ACCESSLEVELMASK_STATUSWRITE |
114131 UA_ACCESSLEVELMASK_TIMESTAMPWRITE; /* Status and timestamp write access necessary for opcua-client. */
115132
116- UA_NodeId node_id ;
133+ UA_NodeId pwm_period_node_id ;
117134 rc = UA_Server_addVariableNode (server,
118135 UA_NODEID_NULL,
119136 pwm_obj_node_id,
120137 UA_NODEID_NUMERIC (0 , UA_NS0ID_HASCOMPONENT),
121- UA_QUALIFIEDNAME (1 , " Value " ),
138+ UA_QUALIFIEDNAME (1 , " PWM Period / ms " ),
122139 UA_NODEID_NUMERIC (0 , UA_NS0ID_BASEDATAVARIABLETYPE),
123140 pwm_out_period_value_attr,
124141 NULL ,
125- &node_id );
142+ &pwm_period_node_id );
126143 if (UA_StatusCode_isBad (rc))
127144 {
128145 UA_LOG_ERROR (UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
@@ -131,38 +148,55 @@ PwmOutput::create(
131148 }
132149
133150 /* Create an instance of AnalogOutput here. */
134- auto const instance_ptr = std::make_shared<PwmOutput>(node_id , set_pwm_func);
151+ auto const instance_ptr = std::make_shared<PwmOutput>(pwm_period_node_id , set_pwm_func, get_pwm_period_func );
135152
136- rc = UA_Server_setNodeContext (server, node_id , reinterpret_cast <void *>(instance_ptr.get ()));
153+ rc = UA_Server_setNodeContext (server, pwm_period_node_id , reinterpret_cast <void *>(instance_ptr.get ()));
137154 if (UA_StatusCode_isBad (rc))
138155 {
139156 UA_LOG_ERROR (UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
140157 " %s: UA_Server_setNodeContext(...) failed with %s" , __PRETTY_FUNCTION__, UA_StatusCode_name (rc));
141158 return nullptr ;
142159 }
143160
144- UA_ValueCallback callback ;
145- callback .onRead = NULL ;
146- callback .onWrite = pwm_output_on_write_request_pwm_period;
147- rc = UA_Server_setVariableNode_valueCallback (server, node_id, callback );
161+ UA_ValueCallback pwm_period_callback ;
162+ pwm_period_callback .onRead = pwm_output_on_read_request_pwm_period ;
163+ pwm_period_callback .onWrite = pwm_output_on_write_request_pwm_period;
164+ rc = UA_Server_setVariableNode_valueCallback (server, pwm_period_node_id, pwm_period_callback );
148165 if (UA_StatusCode_isBad (rc))
149166 {
150167 UA_LOG_ERROR (UA_Log_Stdout, UA_LOGCATEGORY_SERVER,
151- " %s: UA_Server_setVariableNode_valueCallback(...) failed with %s" , __PRETTY_FUNCTION__, UA_StatusCode_name (rc));
168+ " %s: UA_Server_setVariableNode_valueCallback(pwm_period_node_id, ...) failed with %s" , __PRETTY_FUNCTION__, UA_StatusCode_name (rc));
152169 return nullptr ;
153170 }
154171
155172 return instance_ptr;
156173}
157174
175+ void
176+ PwmOutput::onReadRequestPwmPeriod (
177+ UA_Server * server,
178+ UA_NodeId const * node_id)
179+ {
180+ /* Obtain the value of the analog input pin. */
181+ uint32_t const in_x_val = _get_pwm_period_func ();
182+ /* Update the variable node. */
183+ UA_UInt32 in_x_val_opcua_value = in_x_val;
184+ UA_Variant in_x_val_opcua_variant;
185+ UA_Variant_init (&in_x_val_opcua_variant);
186+ UA_Variant_setScalar (&in_x_val_opcua_variant, &in_x_val_opcua_value, &UA_TYPES[UA_TYPES_UINT32]);
187+ UA_Server_writeValue (server, *node_id, in_x_val_opcua_variant);
188+ /* Some debug output. */
189+ UA_LOG_INFO (UA_Log_Stdout, UA_LOGCATEGORY_SERVER, " %s: value = %d" , __PRETTY_FUNCTION__, in_x_val);
190+ }
191+
158192void
159193PwmOutput::onWriteRequestPwmPeriod (
160194 UA_Server * server,
161- UA_NodeId const * node_id ,
195+ UA_NodeId const * pwm_period_node_id ,
162196 uint32_t const pwm_period_ms)
163197{
164198 _pwm_period_ms = pwm_period_ms;
165- UA_LOG_INFO (UA_Log_Stdout, UA_LOGCATEGORY_SERVER, " %s: pwm period = %d ms" , __PRETTY_FUNCTION__, _pwm_period_ms);
199+ UA_LOG_INFO (UA_Log_Stdout, UA_LOGCATEGORY_SERVER, " %s: pwm period = %d ms, pulse width = %d ms " , __PRETTY_FUNCTION__, _pwm_period_ms, _pwm_pulse_width_ms );
166200 _set_pwm_func (_pwm_period_ms, _pwm_pulse_width_ms);
167201}
168202
@@ -173,7 +207,7 @@ PwmOutput::onWriteRequestPwmPulseWidth(
173207 uint32_t const pwm_pulse_width_ms)
174208{
175209 _pwm_pulse_width_ms = pwm_pulse_width_ms;
176- UA_LOG_INFO (UA_Log_Stdout, UA_LOGCATEGORY_SERVER, " %s: pwm pulse width = %d ms" , __PRETTY_FUNCTION__, _pwm_pulse_width_ms);
210+ UA_LOG_INFO (UA_Log_Stdout, UA_LOGCATEGORY_SERVER, " %s: pwm period = %d ms, pulse width = %d ms" , __PRETTY_FUNCTION__, _pwm_period_ms , _pwm_pulse_width_ms);
177211 _set_pwm_func (_pwm_period_ms, _pwm_pulse_width_ms);
178212}
179213
0 commit comments