--- 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 */
+/* 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;\
+ break;
+
+#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;\
+ break;
+
+static void* UnpackVar(hmi_tree_item_t *dsc, void **real_value_p, char *flags)
+{
+ void *varp = dsc->ptr;
+ void *forced_value_p = NULL;
+ *flags = 0;
+ /* find data to copy*/
+ switch(dsc->type){
+ __ANY(__Unpack_case_t)
+ __ANY(__Unpack_case_p)
+ default:
+ break;
+ }
+ if (*flags & __IEC_FORCE_FLAG)
+ return forced_value_p;
+ return *real_value_p;
}
-void write_iterator(hmi_tree_item_t *dsc){
- /* todo */
+void write_iterator(hmi_tree_item_t *dsc)
+{
+ void *dest_p = &wbuf[dsc->buf_index];
+ void *real_value_p = NULL;
+ char flags = 0;
+
+ 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;
+ char flags = 0;
+
+ void *visible_value_p = UnpackVar(dsc, &real_value_p, &flags);
+
+ memcpy(visible_value_p, src_p, __get_type_enum_size(dsc->type));
}
int __init_svghmi()
@@ -62,6 +110,7 @@
void __retrieve_svghmi()
{
if(!pthread_mutex_lock(&rbuf_mutex)){
+ traverse_hmi_tree(read_iterator);
pthread_mutex_unlock(&rbuf_mutex);
}
}