--- 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);
}