tests/python/c_code@c_ext/cfile.xml
author Laurent Bessard
Fri, 05 Apr 2013 08:11:27 +0200
changeset 1019 e5686874eaef
parent 953 1fb6cf5a4c4d
child 1086 b566ab5556ab
permissions -rw-r--r--
Fixed bug when closing Beremiz
<?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[#include "stdio.h"]]>
  </includes>
  <variables>
    <variable name="TestInput" type="SINT" class="input"/>
    <variable name="TestOutput" type="SINT" class="output"/>
  </variables>
  <globals>
<![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[]]>
  </initFunction>
  <cleanUpFunction>
<![CDATA[]]>
  </cleanUpFunction>
  <retrieveFunction>
<![CDATA[]]>
  </retrieveFunction>
  <publishFunction>
<![CDATA[if(!AtomicCompareExchange(&Lock, 0, 1)){
    TestInput = CtoP + PtoC + TestOutput;
    AtomicCompareExchange(&Lock, 1, 0);
}]]>
  </publishFunction>
</CFile>