--- a/svghmi/svghmi.c Fri Aug 23 13:01:37 2019 +0200
+++ b/svghmi/svghmi.c Fri Aug 23 14:01:31 2019 +0200
@@ -39,12 +39,60 @@
-void read_iterator(hmi_tree_item_t *dsc){
+/* TODO : deduplicate that code with plc_debug.c */ +#define __Unpack_case_t(TYPENAME) \ + case TYPENAME##_ENUM :\ + *flags = ((__IEC_##TYPENAME##_t *)varp)->flags;\ + forced_value_p = *real_value_p = &((__IEC_##TYPENAME##_t *)varp)->value;\ +#define __Unpack_case_p(TYPENAME)\ + case TYPENAME##_O_ENUM :\ + *flags = __IEC_OUTPUT_FLAG;\ + case TYPENAME##_P_ENUM :\ + *flags |= ((__IEC_##TYPENAME##_p *)varp)->flags;\ + *real_value_p = ((__IEC_##TYPENAME##_p *)varp)->value;\ + forced_value_p = &((__IEC_##TYPENAME##_p *)varp)->fvalue;\ +static void* UnpackVar(hmi_tree_item_t *dsc, void **real_value_p, char *flags) + void *forced_value_p = NULL; + if (*flags & __IEC_FORCE_FLAG) -void write_iterator(hmi_tree_item_t *dsc){
+void write_iterator(hmi_tree_item_t *dsc) + void *dest_p = &wbuf[dsc->buf_index]; + void *real_value_p = NULL; + void *visible_value_p = UnpackVar(dsc, &real_value_p, &flags); + memcpy(dest_p, visible_value_p, __get_type_enum_size(dsc->type)); +void read_iterator(hmi_tree_item_t *dsc) + void *src_p = &rbuf[dsc->buf_index]; + void *real_value_p = NULL; + void *visible_value_p = UnpackVar(dsc, &real_value_p, &flags); + memcpy(visible_value_p, src_p, __get_type_enum_size(dsc->type)); @@ -62,6 +110,7 @@
if(!pthread_mutex_lock(&rbuf_mutex)){
+ traverse_hmi_tree(read_iterator); pthread_mutex_unlock(&rbuf_mutex);