svghmi/svghmi.c
branchsvghmi
changeset 2775 3b93409ba22c
parent 2771 361366b891ca
child 2776 246ae685ab65
--- a/svghmi/svghmi.c	Thu Sep 12 12:56:47 2019 +0200
+++ b/svghmi/svghmi.c	Mon Sep 16 10:54:15 2019 +0200
@@ -118,9 +118,9 @@
     if(dsc->wstate == buf_tosend){
         // send 
 
-        // TODO call the python callback 
-
-        dsc->wstate = buf_free; 
+        // TODO pack data in buffer
+
+        dsc->wstate = buf_free;
     }
 
     AtomicCompareExchange(&dsc->wlock, 1, 0);
@@ -138,18 +138,24 @@
     memcpy(visible_value_p, src_p, __get_type_enum_size(dsc->type));
 }
 
+static pthread_cond_t UART_WakeCond = PTHREAD_COND_INITIALIZER;
+static pthread_mutex_t UART_WakeCondLock = PTHREAD_MUTEX_INITIALIZER;
+
 int __init_svghmi()
 {
     bzero(rbuf,sizeof(rbuf));
     bzero(wbuf,sizeof(wbuf));
-    
-    // TODO - sending pthread condition variable
+    continue_collect = 1;
 
     return 0;
 }
 
 void __cleanup_svghmi()
 {
+    pthread_mutex_lock(&UART_WakeCondLock);
+    continue_collect = 0;
+    pthread_cond_signal(&UART_WakeCond);
+    pthread_mutex_unlock(&UART_WakeCondLock);
 }
 
 void __retrieve_svghmi()
@@ -162,21 +168,37 @@
     global_write_dirty = 0;
     traverse_hmi_tree(write_iterator);
     if(global_write_dirty) {
-        // TODO : set condition variable to wakeup sending collector
-    }
-
-}
-
-void* collect_updates_to_send(void* args){
-
-    // TODO : get callback from args
-
-
-    // TODO : wait for 
-    //        - condition variable
-
-    // TODO add arg to traverse_hmi_tree to pass callback
-
-    traverse_hmi_tree(send_iterator);
-
-}
+        pthread_cond_signal(&UART_WakeCond);
+    }
+}
+
+/* PYTHON CALLS */
+int svghmi_send_collect(uint32_t *size, void *ptr){
+
+    pthread_mutex_lock(&UART_WakeCondLock);
+    do_collect = continue_collect;
+    if do_collect;
+        pthread_cond_wait(&UART_WakeCond, &UART_WakeCondLock);
+        do_collect = continue_collect;
+    pthread_mutex_unlock(&UART_WakeCondLock);
+
+
+    if(do_collect) {
+        traverse_hmi_tree(send_iterator);
+        /* TODO set ptr and size to something  */
+        return 0;
+    }
+    else
+    {
+        return EINTR;
+    }
+}
+
+int svghmi_recv_dispatch(uint32_t size, void* ptr){
+    /* TODO something with ptr and size
+        - subscribe
+         or
+        - spread values
+    */
+}
+