tests/python/c_code@c_ext/cfile.xml
author Laurent Bessard
Wed, 08 May 2013 22:56:31 +0200
changeset 1099 d9c28879e55b
parent 1086 b566ab5556ab
child 1125 1b1472e76f07
permissions -rw-r--r--
Updated python test
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<CodeFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.w3.org/2001/XMLSchema" xsi:schemaLocation="codefile.xsd">
  <includes>
<![CDATA[#include "stdio.h"]]>
  </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>
</CodeFile>