svghmi/svghmi.c
branchsvghmi
changeset 2805 e521e0d133d5
parent 2802 64e6f73b9859
child 2809 b9c540253263
equal deleted inserted replaced
2804:a6be58a1a8b7 2805:e521e0d133d5
    29                      ticktime_ns/1000000:
    29                      ticktime_ns/1000000:
    30                      1;
    30                      1;
    31 
    31 
    32 typedef enum {
    32 typedef enum {
    33     buf_free = 0,
    33     buf_free = 0,
       
    34     buf_new,
    34     buf_set,
    35     buf_set,
    35     buf_tosend
    36     buf_tosend
    36 } buf_state_t;
    37 } buf_state_t;
    37 
    38 
    38 static int global_write_dirty = 0;
    39 static int global_write_dirty = 0;
    87             if(dsc->refresh_period_ms){
    88             if(dsc->refresh_period_ms){
    88                 if(dsc->age_ms + ticktime_ms < dsc->refresh_period_ms){
    89                 if(dsc->age_ms + ticktime_ms < dsc->refresh_period_ms){
    89                     dsc->age_ms += ticktime_ms;
    90                     dsc->age_ms += ticktime_ms;
    90                 }else{
    91                 }else{
    91                     dsc->wstate = buf_tosend;
    92                     dsc->wstate = buf_tosend;
       
    93                     global_write_dirty = 1;
    92                 }
    94                 }
    93             }
    95             }
    94         }
    96         }
    95 
    97 
    96         void *dest_p = &wbuf[dsc->buf_index];
    98         void *dest_p = &wbuf[dsc->buf_index];
    98         char flags = 0;
   100         char flags = 0;
    99         void *visible_value_p = UnpackVar(dsc, &real_value_p, &flags);
   101         void *visible_value_p = UnpackVar(dsc, &real_value_p, &flags);
   100 
   102 
   101         /* if new value differs from previous one */
   103         /* if new value differs from previous one */
   102         USINT sz = __get_type_enum_size(dsc->type);
   104         USINT sz = __get_type_enum_size(dsc->type);
   103         if(memcmp(dest_p, visible_value_p, sz) != 0){
   105         if(dsc->wstate == buf_new || memcmp(dest_p, visible_value_p, sz) != 0){
   104             /* copy and flag as set */
   106             /* copy and flag as set */
   105             memcpy(dest_p, visible_value_p, sz);
   107             memcpy(dest_p, visible_value_p, sz);
   106             if(dsc->wstate == buf_free) {
   108             if(dsc->wstate == buf_new || dsc->wstate == buf_free) {
   107                 dsc->wstate = buf_set;
   109                 if(dsc->wstate == buf_new || ticktime_ms > dsc->refresh_period_ms){
       
   110                     dsc->wstate = buf_tosend;
       
   111                     global_write_dirty = 1;
       
   112                 } else {
       
   113                     dsc->wstate = buf_set;
       
   114                 }
   108                 dsc->age_ms = 0;
   115                 dsc->age_ms = 0;
   109             }
   116             }
   110             global_write_dirty = 1;
       
   111         }
   117         }
   112 
   118 
   113         AtomicCompareExchange(&dsc->wlock, 1, 0);
   119         AtomicCompareExchange(&dsc->wlock, 1, 0);
   114     }
   120     }
   115     // else ... : PLC can't wait, variable will be updated next turn
   121     // else ... : PLC can't wait, variable will be updated next turn
   166 
   172 
   167 inline void update_refresh_period(hmi_tree_item_t *dsc, uint16_t refresh_period_ms)
   173 inline void update_refresh_period(hmi_tree_item_t *dsc, uint16_t refresh_period_ms)
   168 {
   174 {
   169     while(AtomicCompareExchange(&dsc->wlock, 0, 1)) sched_yield();
   175     while(AtomicCompareExchange(&dsc->wlock, 0, 1)) sched_yield();
   170     dsc->refresh_period_ms = refresh_period_ms;
   176     dsc->refresh_period_ms = refresh_period_ms;
       
   177     if(refresh_period_ms) {
       
   178         dsc->wstate = buf_new;
       
   179     } else {
       
   180         dsc->wstate = buf_free;
       
   181     }
   171     AtomicCompareExchange(&dsc->wlock, 1, 0);
   182     AtomicCompareExchange(&dsc->wlock, 1, 0);
   172 }
   183 }
   173 
   184 
   174 static int reset_iterator(uint32_t index, hmi_tree_item_t *dsc)
   185 static int reset_iterator(uint32_t index, hmi_tree_item_t *dsc)
   175 {
   186 {