tests/python/c_code@c_ext/cfile.xml
author Edouard Tisserant
Fri, 15 Jun 2018 09:48:05 +0200
changeset 2188 7f59aa398669
parent 1463 de311ffe3961
permissions -rw-r--r--
WxGlade HMI extension now does only instanciate wx object who's name match extension's name. If no object match the name and no code is provided in 'start' user python code section, then a warning is issued
<?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 *PLC_ID;

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("PLC_ID id %s\n",PLC_ID);
  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>