diff -r a6be58a1a8b7 -r e521e0d133d5 svghmi/svghmi.c --- 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); }