tests/python/c_code@c_ext/cfile.xml
branch1.1 Korean release
changeset 968 eee7625de1f7
parent 953 1fb6cf5a4c4d
child 1086 b566ab5556ab
--- a/tests/python/c_code@c_ext/cfile.xml	Wed Aug 29 21:14:23 2012 +0200
+++ b/tests/python/c_code@c_ext/cfile.xml	Thu Mar 07 11:47:43 2013 +0900
@@ -1,16 +1,50 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <CFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.w3.org/2001/XMLSchema" xsi:schemaLocation="cext_xsd.xsd">
   <includes>
-<![CDATA[]]>
+<![CDATA[#include "stdio.h"]]>
   </includes>
-  <variables/>
+  <variables>
+    <variable name="TestInput" type="SINT" class="input"/>
+    <variable name="TestOutput" type="SINT" class="output"/>
+  </variables>
   <globals>
-<![CDATA[void Python_to_C_Call(int value){
-  /* That code should never touch to 
-     variables modified by PLC thread */
-  printf("C code called by Python: %d\n",value);
+<![CDATA[volatile long Lock=0;
+volatile char PtoC=1,CtoP=2;
+
+int Simple_C_Call(int val){
+  return val+1;
 }
-]]>
+
+int Python_to_C_Call(char toC, char *fromC){
+  /* Code called by python should never touch to 
+     variables modified by PLC thread directly
+
+     AtomicCompareExchange comes from 
+     beremiz' runtime implementation */
+
+  int res = 0;
+  if(!AtomicCompareExchange(&Lock, 0, 1)){
+    PtoC=toC;
+    *fromC=CtoP;
+    AtomicCompareExchange(&Lock, 1, 0);
+    res=1;
+  }
+  printf("C code called by Python: toC %d fromC %d\n",toC,*fromC);
+  return res;
+}
+
+int PLC_C_Call(char fromPLC, char *toPLC){
+  /* PLC also have to be realy carefull not to 
+     conflict with asynchronous python access */
+  int res;
+  if(!AtomicCompareExchange(&Lock, 0, 1)){
+      CtoP = fromPLC;
+      *toPLC = PtoC;
+      AtomicCompareExchange(&Lock, 1, 0);
+      return 1;
+  }
+  return 0;
+}]]>
   </globals>
   <initFunction>
 <![CDATA[]]>
@@ -22,6 +56,9 @@
 <![CDATA[]]>
   </retrieveFunction>
   <publishFunction>
-<![CDATA[]]>
+<![CDATA[if(!AtomicCompareExchange(&Lock, 0, 1)){
+    TestInput = CtoP + PtoC + TestOutput;
+    AtomicCompareExchange(&Lock, 1, 0);
+}]]>
   </publishFunction>
 </CFile>