svghmi/svghmi.c
branchsvghmi
changeset 2805 e521e0d133d5
parent 2802 64e6f73b9859
child 2809 b9c540253263
--- a/svghmi/svghmi.c	Thu Oct 24 11:20:04 2019 +0200
+++ b/svghmi/svghmi.c	Sun Oct 27 21:38:10 2019 +0100
@@ -31,6 +31,7 @@
 
 typedef enum {
     buf_free = 0,
+    buf_new,
     buf_set,
     buf_tosend
 } buf_state_t;
@@ -89,6 +90,7 @@
                     dsc->age_ms += ticktime_ms;
                 }else{
                     dsc->wstate = buf_tosend;
+                    global_write_dirty = 1;
                 }
             }
         }
@@ -100,14 +102,18 @@
 
         /* if new value differs from previous one */
         USINT sz = __get_type_enum_size(dsc->type);
-        if(memcmp(dest_p, visible_value_p, sz) != 0){
+        if(dsc->wstate == buf_new || memcmp(dest_p, visible_value_p, sz) != 0){
             /* copy and flag as set */
             memcpy(dest_p, visible_value_p, sz);
-            if(dsc->wstate == buf_free) {
-                dsc->wstate = buf_set;
+            if(dsc->wstate == buf_new || dsc->wstate == buf_free) {
+                if(dsc->wstate == buf_new || ticktime_ms > dsc->refresh_period_ms){
+                    dsc->wstate = buf_tosend;
+                    global_write_dirty = 1;
+                } else {
+                    dsc->wstate = buf_set;
+                }
                 dsc->age_ms = 0;
             }
-            global_write_dirty = 1;
         }
 
         AtomicCompareExchange(&dsc->wlock, 1, 0);
@@ -168,6 +174,11 @@
 {
     while(AtomicCompareExchange(&dsc->wlock, 0, 1)) sched_yield();
     dsc->refresh_period_ms = refresh_period_ms;
+    if(refresh_period_ms) {
+        dsc->wstate = buf_new;
+    } else {
+        dsc->wstate = buf_free;
+    }
     AtomicCompareExchange(&dsc->wlock, 1, 0);
 }