# HG changeset patch
# User Edouard Tisserant
# Date 1583757814 -3600
# Node ID e120d6985a2f905233a7e6891b6ab2c62d65f26d
# Parent  a108677bd3d0b2b5cff147383adcdd94f0a1fe99
SVGHMI: fix wrong updates of HMI variables on each change, especially when not subscribed.

diff -r a108677bd3d0 -r e120d6985a2f svghmi/svghmi.c
--- a/svghmi/svghmi.c	Mon Mar 09 13:40:45 2020 +0100
+++ b/svghmi/svghmi.c	Mon Mar 09 13:43:34 2020 +0100
@@ -105,10 +105,13 @@
         if(__Is_a_string(dsc)){
             sz = ((STRING*)visible_value_p)->len + 1;
         }
-        if(dsc->wstate == buf_new || memcmp(dest_p, visible_value_p, sz) != 0){
+        if(dsc->wstate == buf_new /* just subscribed 
+           or already subscribed having value change */
+           || (dsc->refresh_period_ms > 0 && memcmp(dest_p, visible_value_p, sz) != 0)){
             /* copy and flag as set */
             memcpy(dest_p, visible_value_p, sz);
-            if(dsc->wstate == buf_new || dsc->wstate == buf_free) {
+            /* if not already marked/signaled, do it */
+            if(dsc->wstate != buf_set && dsc->wstate != buf_tosend) {
                 if(dsc->wstate == buf_new || ticktime_ms > dsc->refresh_period_ms){
                     dsc->wstate = buf_tosend;
                     global_write_dirty = 1;
@@ -179,13 +182,15 @@
 void update_refresh_period(hmi_tree_item_t *dsc, uint16_t refresh_period_ms)
 {
     while(AtomicCompareExchange(&dsc->wlock, 0, 1)) sched_yield();
-    dsc->refresh_period_ms = refresh_period_ms;
     if(refresh_period_ms) {
-        /* TODO : maybe only if was null before for optimization */
-        dsc->wstate = buf_new;
+        if(!dsc->refresh_period_ms)
+        {
+            dsc->wstate = buf_new;
+        }
     } else {
         dsc->wstate = buf_free;
     }
+    dsc->refresh_period_ms = refresh_period_ms;
     AtomicCompareExchange(&dsc->wlock, 1, 0);
 }