Skip to content

Commit d54d655

Browse files
committed
Add function to obtain the current value of the PWM period.
1 parent 096b4a5 commit d54d655

File tree

7 files changed

+81
-30
lines changed

7 files changed

+81
-30
lines changed

examples/opcua_server/opcua_server.ino

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,10 @@ void setup()
357357
[i, p](uint32_t const pwm_period_ms, uint32_t const pwm_pulse_width_ms)
358358
{
359359
reinterpret_cast<AnalogExpansion *>(OptaController.getExpansionPtr(i))->setPwm(p, pwm_period_ms, pwm_pulse_width_ms);
360+
},
361+
[i, p](void) -> uint32_t
362+
{
363+
return reinterpret_cast<AnalogExpansion *>(OptaController.getExpansionPtr(i))->getPwmPeriod(p);
360364
});
361365
pwm_output_num++;
362366
}

src/expansion/AnalogExpansion.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,10 @@ void
9191
AnalogExpansion::add_pwm_output(
9292
UA_Server * server,
9393
const char * display_name,
94-
PwmOutput::SetPwmFunc const set_pwm_func)
94+
PwmOutput::SetPwmFunc const set_pwm_func,
95+
PwmOutput::GetPwmPeriodFunc const get_pwm_period_func)
9596
{
96-
_pwm_output_mgr->add_pwm_output(server, display_name, set_pwm_func);
97+
_pwm_output_mgr->add_pwm_output(server, display_name, set_pwm_func, get_pwm_period_func);
9798
}
9899

99100
void

src/expansion/AnalogExpansion.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ class AnalogExpansion : public Expansion
7171
add_pwm_output(
7272
UA_Server * server,
7373
const char * display_name,
74-
PwmOutput::SetPwmFunc const set_pwm_func);
74+
PwmOutput::SetPwmFunc const set_pwm_func,
75+
PwmOutput::GetPwmPeriodFunc const get_pwm_period_func);
7576

7677
void
7778
add_led_output(

src/io/pwm/PwmOutput.cpp

Lines changed: 53 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
2741
static void
2842
pwm_output_on_write_request_pwm_period(
2943
UA_Server *server,
@@ -59,10 +73,12 @@ pwm_output_on_write_request_pwm_pulse_width(
5973
**************************************************************************************/
6074

6175
PwmOutput::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+
158192
void
159193
PwmOutput::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

src/io/pwm/PwmOutput.h

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,25 +36,33 @@ class PwmOutput
3636
public:
3737
typedef std::shared_ptr<PwmOutput> SharedPtr;
3838
typedef std::function<void(uint32_t const, uint32_t const)> SetPwmFunc;
39+
typedef std::function<uint32_t(void)> GetPwmPeriodFunc;
3940

4041

4142
static SharedPtr
4243
create(
4344
UA_Server * server,
4445
UA_NodeId const & parent_node_id,
4546
const char * display_name,
46-
SetPwmFunc const set_pwm_func);
47+
SetPwmFunc const set_pwm_func,
48+
GetPwmPeriodFunc const get_pwm_period_func);
4749

4850

4951
PwmOutput(
50-
UA_NodeId const & node_id,
51-
SetPwmFunc const set_pwm_func);
52+
UA_NodeId const & pwm_period_node_id,
53+
SetPwmFunc const set_pwm_func,
54+
GetPwmPeriodFunc const get_pwm_period_func);
5255

5356

57+
void
58+
onReadRequestPwmPeriod(
59+
UA_Server * server,
60+
UA_NodeId const * node_id);
61+
5462
void
5563
onWriteRequestPwmPeriod(
5664
UA_Server * server,
57-
UA_NodeId const * node_id,
65+
UA_NodeId const * pwm_period_node_id,
5866
uint32_t const pwm_period_ms);
5967

6068
void
@@ -65,8 +73,9 @@ class PwmOutput
6573

6674

6775
private:
68-
UA_NodeId _node_id;
76+
UA_NodeId _pwm_period_node_id;
6977
SetPwmFunc const _set_pwm_func;
78+
GetPwmPeriodFunc const _get_pwm_period_func;
7079
uint32_t _pwm_period_ms, _pwm_pulse_width_ms;
7180
};
7281

src/io/pwm/PwmOutputManager.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,10 @@ void
7373
PwmOutputManager::add_pwm_output(
7474
UA_Server * server,
7575
const char * display_name,
76-
PwmOutput::SetPwmFunc const set_pwm_func)
76+
PwmOutput::SetPwmFunc const set_pwm_func,
77+
PwmOutput::GetPwmPeriodFunc const get_pwm_period_func)
7778
{
78-
auto const pwm_output = PwmOutput::create(server, _node_id, display_name, set_pwm_func);
79+
auto const pwm_output = PwmOutput::create(server, _node_id, display_name, set_pwm_func, get_pwm_period_func);
7980
if (!pwm_output)
8081
{
8182
UA_LOG_ERROR(UA_Log_Stdout, UA_LOGCATEGORY_SERVER,

src/io/pwm/PwmOutputManager.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ class PwmOutputManager
5050
add_pwm_output(
5151
UA_Server * server,
5252
const char * display_name,
53-
PwmOutput::SetPwmFunc const set_pwm_func);
53+
PwmOutput::SetPwmFunc const set_pwm_func,
54+
PwmOutput::GetPwmPeriodFunc const get_pwm_period_func);
5455

5556

5657
private:

0 commit comments

Comments
 (0)