targets/Xenomai/plc_Xenomai_main.c
branchsvghmi
changeset 2820 d9b5303d43dc
parent 1990 2e0fbdd152de
child 3294 e3db472b0dfb
--- a/targets/Xenomai/plc_Xenomai_main.c	Mon Dec 09 10:43:54 2019 +0100
+++ b/targets/Xenomai/plc_Xenomai_main.c	Mon Dec 09 14:53:42 2019 +0100
@@ -26,6 +26,8 @@
 #define PLC_STATE_WAITDEBUG_PIPE_CREATED       64
 #define PLC_STATE_WAITPYTHON_FILE_OPENED       128
 #define PLC_STATE_WAITPYTHON_PIPE_CREATED      256
+#define PLC_STATE_SVGHMI_FILE_OPENED           512
+#define PLC_STATE_SVGHMI_PIPE_CREATED          1024
 
 #define WAITDEBUG_PIPE_DEVICE        "/dev/rtp0"
 #define WAITDEBUG_PIPE_MINOR         0
@@ -35,6 +37,8 @@
 #define WAITPYTHON_PIPE_MINOR        2
 #define PYTHON_PIPE_DEVICE           "/dev/rtp3"
 #define PYTHON_PIPE_MINOR            3
+#define SVGHMI_PIPE_DEVICE           "/dev/rtp4"
+#define SVGHMI_PIPE_MINOR            4
 #define PIPE_SIZE                    1 
 
 // rt-pipes commands
@@ -68,10 +72,12 @@
 RT_PIPE WaitPython_pipe;
 RT_PIPE Debug_pipe;
 RT_PIPE Python_pipe;
+RT_PIPE svghmi_pipe;
 int WaitDebug_pipe_fd;
 int WaitPython_pipe_fd;
 int Debug_pipe_fd;
 int Python_pipe_fd;
+int svghmi_pipe_fd;
 
 int PLC_shutdown = 0;
 
@@ -114,6 +120,16 @@
         PLC_state &= ~PLC_STATE_TASK_CREATED;
     }
 
+    if (PLC_state & PLC_STATE_SVGHMI_PIPE_CREATED) {
+        rt_pipe_delete(&svghmi_pipe);
+        PLC_state &= ~PLC_STATE_SVGHMI_PIPE_CREATED;
+    }
+
+    if (PLC_state & PLC_STATE_SVGHMI_FILE_OPENED) {
+        close(svghmi_pipe_fd);
+        PLC_state &= ~PLC_STATE_SVGHMI_FILE_OPENED;
+    }
+
     if (PLC_state & PLC_STATE_WAITDEBUG_PIPE_CREATED) {
         rt_pipe_delete(&WaitDebug_pipe);
         PLC_state &= ~PLC_STATE_WAITDEBUG_PIPE_CREATED;
@@ -240,6 +256,16 @@
         _startPLCLog(FO WAITPYTHON_PIPE_DEVICE);
     PLC_state |= PLC_STATE_WAITPYTHON_FILE_OPENED;
 
+    /* create svghmi_pipe */
+    if(rt_pipe_create(&svghmi_pipe, "svghmi_pipe", SVGHMI_PIPE_MINOR, PIPE_SIZE) < 0)
+        _startPLCLog(FO "svghmi_pipe real-time end");
+    PLC_state |= PLC_STATE_SVGHMI_PIPE_CREATED;
+
+    /* open svghmi_pipe*/
+    if((svghmi_pipe_fd = open(SVGHMI_PIPE_DEVICE, O_RDWR)) == -1)
+        _startPLCLog(FO SVGHMI_PIPE_DEVICE);
+    PLC_state |= PLC_STATE_SVGHMI_FILE_OPENED;
+
     /*** create PLC task ***/
     if(rt_task_create(&PLC_task, "PLC_task", 0, 50, T_JOINABLE))
         _startPLCLog("Failed creating PLC task");
@@ -395,6 +421,18 @@
     }    /* as plc does not wait for lock. */
 }
 
+void SVGHMI_SuspendFromPythonThread(void)
+{
+    char cmd = 1; /*whatever*/
+    read(svghmi_pipe_fd, &cmd, sizeof(cmd));
+}
+
+void SVGHMI_WakeupFromRTThread(void)
+{
+    char cmd;
+    rt_pipe_write(&svghmi_pipe, &cmd, sizeof(cmd), P_NORMAL);
+}
+
 #ifndef HAVE_RETAIN
 int CheckRetainBuffer(void)
 {