tests/python/c_code@c_ext/cfile.xml
author Andrey Skvortsov <andrej.skvortzov@gmail.com>
Sat, 09 Jun 2018 17:13:16 +0300
changeset 2181 52630996e51b
parent 1463 de311ffe3961
permissions -rw-r--r--
Add command line argument to run linter only on changed files

./tests/tools/check_source.sh --only-changes

It's recommended to run check_source.sh automatically on each commit,
so the rules are always enforced.
Even better is to use docker for that, so the versions of pep8 and
pylint are the same as on pipeline server.

To do this couple of lines should be added into repository's hgrc file.

[----------- cut from .hg/hgrc------------------]

[hooks]
precommit.linter = ./tests/tools/check_source.sh --only-changes
# precommit.linter = docker run -it --volume=$PWD:/beremiz --workdir="/beremiz" --volume=$PWD/../CanFestival-3:/CanFestival-3 --memory=1g --entrypoint=/beremiz/tests/tools/check_source.sh skvorl/beremiz-requirements --only-changes

[-----------------------------------------------]
<?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>