tests/python/c_code@c_ext/cfile.xml
author Laurent Bessard
Mon, 13 May 2013 14:36:54 +0200
changeset 1125 1b1472e76f07
parent 1099 d9c28879e55b
child 1401 611fded24ce4
permissions -rw-r--r--
Updated python example
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<CFile>
  <includes>
<![CDATA[
]]>
  </includes>
  <variables>
    <variable name="TestInput" type="SINT" initial="0"/>
    <variable name="TestOutput" type="SINT"/>
  </variables>
  <globals>
<![CDATA[
volatile long Lock=0;
volatile char PtoC=1,CtoP=2;

extern long AtomicCompareExchange(long*,long, long);

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((long*)&Lock, 0, 1)){
    PtoC=toC;
    *fromC=CtoP;
    AtomicCompareExchange((long*)&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 */
  if(!AtomicCompareExchange((long*)&Lock, 0, 1)){
      CtoP = fromPLC;
      *toPLC = PtoC;
      AtomicCompareExchange((long*)&Lock, 1, 0);
      return 1;
  }
  return 0;
}
]]>
  </globals>
  <initFunction>
<![CDATA[
]]>
  </initFunction>
  <cleanUpFunction>
<![CDATA[
]]>
  </cleanUpFunction>
  <retrieveFunction>
<![CDATA[
]]>
  </retrieveFunction>
  <publishFunction>
<![CDATA[
if(!AtomicCompareExchange((long*)&Lock, 0, 1)){
    TestInput = CtoP + PtoC + TestOutput;
    AtomicCompareExchange((long*)&Lock, 1, 0);
}
]]>
  </publishFunction>
</CFile>