tests/python/c_code@c_ext/cfile.xml
author Edouard Tisserant
Fri, 13 Mar 2015 22:36:52 +0100
changeset 1457 ff7cfce737ca
parent 1401 611fded24ce4
child 1463 de311ffe3961
permissions -rw-r--r--
Added PLCID variable accessible from C side, set with binarie's MD5. Added retain init and cleanup calls. Extended tests/python to test PLCID
<?xml version='1.0' encoding='utf-8'?>
<CFile xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <includes>
    <xhtml:p><![CDATA[
]]></xhtml:p>
  </includes>
  <variables>
    <variable name="TestInput" type="SINT" initial="0"/>
    <variable name="TestOutput" type="SINT"/>
  </variables>
  <globals>
    <xhtml:p><![CDATA[
volatile long Lock=0;
volatile char PtoC=1,CtoP=2;

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

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);
  printf("PLCID id %s\n",PLCID);
  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;
}
]]></xhtml:p>
  </globals>
  <initFunction>
    <xhtml:p><![CDATA[
]]></xhtml:p>
  </initFunction>
  <cleanUpFunction>
    <xhtml:p><![CDATA[
]]></xhtml:p>
  </cleanUpFunction>
  <retrieveFunction>
    <xhtml:p><![CDATA[
]]></xhtml:p>
  </retrieveFunction>
  <publishFunction>
    <xhtml:p><![CDATA[
if(!AtomicCompareExchange((long*)&Lock, 0, 1)){
    TestInput = CtoP + PtoC + TestOutput;
    AtomicCompareExchange((long*)&Lock, 1, 0);
}
]]></xhtml:p>
  </publishFunction>
</CFile>