--- 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>