--- a/svghmi/svghmi.c Tue Sep 13 16:31:52 2022 +0200
+++ b/svghmi/svghmi.c Wed Sep 14 12:41:44 2022 +0200
@@ -103,12 +103,14 @@
while(session_index < MAX_CONNECTIONS) {
if(dsc->wstate[session_index] == buf_set){
/* if being subscribed */
if(dsc->refresh_period_ms[session_index]){
- if(dsc->age_ms[session_index] + ticktime_ms < dsc->refresh_period_ms[session_index]){
- dsc->age_ms[session_index] += ticktime_ms;
+ uint16_t new_age_ms = dsc->age_ms[session_index] + ticktime_ms; + if(new_age_ms < dsc->refresh_period_ms[session_index]){ + dsc->age_ms[session_index] = new_age_ms; dsc->wstate[session_index] = buf_tosend;
@@ -116,33 +118,30 @@
- /* variable is sample only if just subscribed
+ /* variable is sampled if just subscribed (initial value) or already subscribed and having value change */
+ int sample_session = 0; int just_subscribed = dsc->wstate[session_index] == buf_new;
int already_subscribed = dsc->refresh_period_ms[session_index] > 0;
- UnpackVar(dsc, &value_p, NULL, &sz);
- if(__Is_a_string(dsc)){
- sz = ((STRING*)value_p)->len + 1;
- dest_p = &wbuf[dsc->buf_index];
+ /* compute value_changed once only */ + UnpackVar(dsc, &value_p, NULL, &sz); + if(__Is_a_string(dsc)){ + sz = ((STRING*)value_p)->len + 1; + dest_p = &wbuf[dsc->buf_index]; value_changed = memcmp(dest_p, value_p, sz) != 0;
- do_sample = value_changed;
+ sample_session = value_changed;
if(dsc->wstate[session_index] != buf_set && dsc->wstate[session_index] != buf_tosend) {
if(dsc->wstate[session_index] == buf_new \
|| ticktime_ms > dsc->refresh_period_ms[session_index]){
@@ -153,13 +152,23 @@
dsc->age_ms[session_index] = 0;
- /* copy value if changed (and subscribed) */
+ /* copy value if one at least one session did sample */ + UnpackVar(dsc, &value_p, NULL, &sz); + if(__Is_a_string(dsc)){ + sz = ((STRING*)value_p)->len + 1; + dest_p = &wbuf[dsc->buf_index]; memcpy(dest_p, value_p, sz);