svghmi/svghmi.c
branchsvghmi
changeset 2863 e120d6985a2f
parent 2862 a108677bd3d0
child 3270 38f7122ccbf9
equal deleted inserted replaced
2862:a108677bd3d0 2863:e120d6985a2f
   103         /* if new value differs from previous one */
   103         /* if new value differs from previous one */
   104         USINT sz = __get_type_enum_size(dsc->type);
   104         USINT sz = __get_type_enum_size(dsc->type);
   105         if(__Is_a_string(dsc)){
   105         if(__Is_a_string(dsc)){
   106             sz = ((STRING*)visible_value_p)->len + 1;
   106             sz = ((STRING*)visible_value_p)->len + 1;
   107         }
   107         }
   108         if(dsc->wstate == buf_new || memcmp(dest_p, visible_value_p, sz) != 0){
   108         if(dsc->wstate == buf_new /* just subscribed 
       
   109            or already subscribed having value change */
       
   110            || (dsc->refresh_period_ms > 0 && memcmp(dest_p, visible_value_p, sz) != 0)){
   109             /* copy and flag as set */
   111             /* copy and flag as set */
   110             memcpy(dest_p, visible_value_p, sz);
   112             memcpy(dest_p, visible_value_p, sz);
   111             if(dsc->wstate == buf_new || dsc->wstate == buf_free) {
   113             /* if not already marked/signaled, do it */
       
   114             if(dsc->wstate != buf_set && dsc->wstate != buf_tosend) {
   112                 if(dsc->wstate == buf_new || ticktime_ms > dsc->refresh_period_ms){
   115                 if(dsc->wstate == buf_new || ticktime_ms > dsc->refresh_period_ms){
   113                     dsc->wstate = buf_tosend;
   116                     dsc->wstate = buf_tosend;
   114                     global_write_dirty = 1;
   117                     global_write_dirty = 1;
   115                 } else {
   118                 } else {
   116                     dsc->wstate = buf_set;
   119                     dsc->wstate = buf_set;
   177 }
   180 }
   178 
   181 
   179 void update_refresh_period(hmi_tree_item_t *dsc, uint16_t refresh_period_ms)
   182 void update_refresh_period(hmi_tree_item_t *dsc, uint16_t refresh_period_ms)
   180 {
   183 {
   181     while(AtomicCompareExchange(&dsc->wlock, 0, 1)) sched_yield();
   184     while(AtomicCompareExchange(&dsc->wlock, 0, 1)) sched_yield();
   182     dsc->refresh_period_ms = refresh_period_ms;
       
   183     if(refresh_period_ms) {
   185     if(refresh_period_ms) {
   184         /* TODO : maybe only if was null before for optimization */
   186         if(!dsc->refresh_period_ms)
   185         dsc->wstate = buf_new;
   187         {
       
   188             dsc->wstate = buf_new;
       
   189         }
   186     } else {
   190     } else {
   187         dsc->wstate = buf_free;
   191         dsc->wstate = buf_free;
   188     }
   192     }
       
   193     dsc->refresh_period_ms = refresh_period_ms;
   189     AtomicCompareExchange(&dsc->wlock, 1, 0);
   194     AtomicCompareExchange(&dsc->wlock, 1, 0);
   190 }
   195 }
   191 
   196 
   192 static int reset_iterator(uint32_t index, hmi_tree_item_t *dsc)
   197 static int reset_iterator(uint32_t index, hmi_tree_item_t *dsc)
   193 {
   198 {