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 { |