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