Skip to content

Commit 53c9eeb

Browse files
committed
feat: only publish updates when there are changes
Signed-off-by: Bartolome Jimenez Vera <bjv@capra.ooo>
1 parent 7d2d4f2 commit 53c9eeb

7 files changed

Lines changed: 68 additions & 19 deletions

File tree

micro_ros_diagnostic_bridge/src/micro_ros_diagnostic_bridge/micro_ros_diagnostic_bridge.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <rcl_yaml_param_parser/parser.h>
2727

2828
using micro_ros_diagnostic_msgs::msg::MicroROSDiagnosticStatus;
29+
using micro_ros_diagnostic_msgs::msg::MicroROSDiagnosticKeyValue;
2930
using diagnostic_msgs::msg::DiagnosticArray;
3031

3132
static inline std::string VALUE_NOT_FOUND = "NOTFOUND";
@@ -73,16 +74,16 @@ MicroROSDiagnosticBridge::MicroROSDiagnosticBridge(const std::string & path)
7374
msg_in->values[value_index].key);
7475
keyvalue.key = lookup_key(msg_in->updater_id, msg_in->values[value_index].key);
7576
switch (msg_in->values[value_index].value_type) {
76-
case MicroROSDiagnosticStatus::VALUE_BOOL:
77+
case MicroROSDiagnosticKeyValue::VALUE_BOOL:
7778
keyvalue.value = std::to_string(msg_in->values[value_index].bool_value);
7879
break;
79-
case MicroROSDiagnosticStatus::VALUE_INT:
80+
case MicroROSDiagnosticKeyValue::VALUE_INT:
8081
keyvalue.value = std::to_string(msg_in->values[value_index].int_value);
8182
break;
82-
case MicroROSDiagnosticStatus::VALUE_DOUBLE:
83+
case MicroROSDiagnosticKeyValue::VALUE_FLOAT:
8384
keyvalue.value = std::to_string(msg_in->values[value_index].double_value);
8485
break;
85-
case MicroROSDiagnosticStatus::VALUE_LOOKUP:
86+
case MicroROSDiagnosticKeyValue::VALUE_LOOKUP:
8687
keyvalue.value = lookup_value(
8788
msg_in->updater_id, msg_in->values[value_index].key,
8889
msg_in->values[value_index].value_id);

micro_ros_diagnostic_msgs/msg/MicroROSDiagnosticKeyValue.msg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ byte STALE=3
77
# Possible value types
88
byte VALUE_BOOL=1
99
byte VALUE_INT=2
10-
byte VALUE_DOUBLE=3
10+
byte VALUE_FLOAT=3
1111
byte VALUE_LOOKUP=10
1212

1313
# Level of operation enumerated above.

micro_ros_diagnostic_msgs/msg/MicroROSDiagnosticStatus.msg

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,6 @@ byte WARN=1
1212
byte ERROR=2
1313
byte STALE=3
1414

15-
# Possible value types
16-
byte VALUE_BOOL=1
17-
byte VALUE_INT=2
18-
byte VALUE_DOUBLE=3
19-
byte VALUE_LOOKUP=10
20-
2115
# Level of operation enumerated above.
2216
byte level
2317

micro_ros_diagnostic_updater/example/example_processor_updater.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ my_diagnostic_load(diagnostic_value_t * values, uint8_t * number_of_values)
6262
// Set the key to get translation
6363
values[0].key = PROCESSOR_LOAD_KEY;
6464
// Fake a processor load
65-
rclc_diagnostic_value_set_int(&values[0], my_diagnostic_temp / 2);
65+
rclc_diagnostic_value_set_float(&values[0], (float)my_diagnostic_temp / 2.0f);
6666

6767
// Calculate the diagnostic level
6868
if (my_diagnostic_temp > 46) {

micro_ros_diagnostic_updater/include/micro_ros_diagnostic_updater/micro_ros_diagnostic_updater.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ typedef struct diagnostic_value_t
3232
int16_t value_id;
3333

3434
int8_t level;
35+
bool value_has_changed;
3536
} diagnostic_value_t;
3637

3738
typedef struct diagnostic_task_t
@@ -58,6 +59,14 @@ void rclc_diagnostic_value_set_int(
5859
diagnostic_value_t * kv,
5960
int32_t value);
6061

62+
void rclc_diagnostic_value_set_float(
63+
diagnostic_value_t * kv,
64+
float value);
65+
66+
void rclc_diagnostic_value_set_bool(
67+
diagnostic_value_t * kv,
68+
bool value);
69+
6170
void rclc_diagnostic_value_lookup(
6271
diagnostic_value_t * kv,
6372
int16_t value_id);

micro_ros_diagnostic_updater/src/micro_ros_diagnostic_updater/micro_ros_diagnostic_updater.c

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,46 @@ rclc_diagnostic_value_set_int(
2727
diagnostic_value_t * kv,
2828
int32_t value)
2929
{
30-
kv->value_type = micro_ros_diagnostic_msgs__msg__MicroROSDiagnosticStatus__VALUE_INT;
30+
kv->value_type = micro_ros_diagnostic_msgs__msg__MicroROSDiagnosticKeyValue__VALUE_INT;
31+
if (kv->int_value != value) {
32+
kv->value_has_changed = true;
33+
}
3134
kv->int_value = value;
3235
}
3336

37+
void
38+
rclc_diagnostic_value_set_float(
39+
diagnostic_value_t * kv,
40+
float value)
41+
{
42+
kv->value_type = micro_ros_diagnostic_msgs__msg__MicroROSDiagnosticKeyValue__VALUE_FLOAT;
43+
if (kv->double_value != value) {
44+
kv->value_has_changed = true;
45+
}
46+
kv->double_value = value;
47+
}
48+
49+
void
50+
rclc_diagnostic_value_set_bool(
51+
diagnostic_value_t * kv,
52+
bool value)
53+
{
54+
kv->value_type = micro_ros_diagnostic_msgs__msg__MicroROSDiagnosticKeyValue__VALUE_BOOL;
55+
if (kv->bool_value != value) {
56+
kv->value_has_changed = true;
57+
}
58+
kv->bool_value = value;
59+
}
60+
3461
void
3562
rclc_diagnostic_value_lookup(
3663
diagnostic_value_t * kv,
3764
int16_t value_id)
3865
{
39-
kv->value_type = micro_ros_diagnostic_msgs__msg__MicroROSDiagnosticStatus__VALUE_LOOKUP;
66+
kv->value_type = micro_ros_diagnostic_msgs__msg__MicroROSDiagnosticKeyValue__VALUE_LOOKUP;
67+
if (kv->value_id != value_id) {
68+
kv->value_has_changed = true;
69+
}
4070
kv->value_id = value_id;
4171
}
4272

@@ -46,6 +76,9 @@ rclc_diagnostic_value_set_level(
4676
int8_t level)
4777
{
4878
kv->level = level;
79+
if (kv->level != level) {
80+
kv->value_has_changed = true;
81+
}
4982
}
5083

5184
rcl_ret_t
@@ -182,11 +215,21 @@ rclc_diagnostic_updater_update(
182215
updater->diag_status.hardware_id = updater->tasks[i]->hardware_id;
183216
updater->diag_status.number_of_values = updater->tasks[i]->number_of_values;
184217

185-
micro_ros_diagnostic_msgs__msg__MicroROSDiagnosticKeyValue key_value;
218+
updater->diag_status.values.size = updater->tasks[i]->number_of_values;
186219

220+
bool must_publish = false;
221+
micro_ros_diagnostic_msgs__msg__MicroROSDiagnosticKeyValue key_value;
187222
for (uint8_t value_index = 0u; value_index < updater->tasks[i]->number_of_values;
188223
value_index++)
189224
{
225+
// Quickly go to the next value if it has not changed
226+
if (!updater->tasks[i]->values[value_index].value_has_changed) {
227+
continue;
228+
}
229+
must_publish = true;
230+
// We reset the value_has_changed flag
231+
updater->tasks[i]->values[value_index].value_has_changed = false;
232+
190233
key_value.key = updater->tasks[i]->values[value_index].key;
191234
key_value.value_type = updater->tasks[i]->values[value_index].value_type;
192235
key_value.bool_value = updater->tasks[i]->values[value_index].bool_value;
@@ -197,8 +240,10 @@ rclc_diagnostic_updater_update(
197240

198241
memcpy(&updater->diag_status.values.data[value_index], &key_value, sizeof(key_value));
199242
}
200-
updater->diag_status.values.size = updater->tasks[i]->number_of_values;
201-
243+
// We only publish if at least one value has changed
244+
if (!must_publish) {
245+
continue;
246+
}
202247
rcl_ret_t rc = rcl_publish(&updater->diag_pub, &updater->diag_status, NULL);
203248
if (rc == RCL_RET_OK) {
204249
RCUTILS_LOG_DEBUG(

micro_ros_diagnostic_updater/test/test_diagnostic_updater.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,13 @@ TEST(TestDiagnosticUpdater, create_diagnostic_values) {
7373
EXPECT_EQ(value.int_value, 17);
7474
EXPECT_EQ(
7575
value.value_type,
76-
micro_ros_diagnostic_msgs__msg__MicroROSDiagnosticStatus__VALUE_INT);
76+
micro_ros_diagnostic_msgs__msg__MicroROSDiagnosticKeyValue__VALUE_INT);
7777

7878
rclc_diagnostic_value_lookup(&value, 17);
7979
EXPECT_EQ(value.value_id, 17);
8080
EXPECT_EQ(
8181
value.value_type,
82-
micro_ros_diagnostic_msgs__msg__MicroROSDiagnosticStatus__VALUE_LOOKUP);
82+
micro_ros_diagnostic_msgs__msg__MicroROSDiagnosticKeyValue__VALUE_LOOKUP);
8383

8484
rclc_diagnostic_value_set_level(
8585
&value,

0 commit comments

Comments
 (0)