py_ext/PythonFileCTNMixin.py
author Andrey Skvortsov <andrej.skvortzov@gmail.com>
Thu, 17 Aug 2017 09:55:39 +0300
changeset 1758 845ca626db09
parent 1751 c28db6f7616b
child 1764 d5df428640ff
permissions -rw-r--r--
clean-up: fix PEP8 E222 multiple spaces after operator
1511
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1503
diff changeset
     1
#!/usr/bin/env python
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1503
diff changeset
     2
# -*- coding: utf-8 -*-
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1503
diff changeset
     3
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1503
diff changeset
     4
# This file is part of Beremiz, a Integrated Development Environment for
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1503
diff changeset
     5
# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1503
diff changeset
     6
#
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1503
diff changeset
     7
# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
1680
6db967480b7d make run Beremiz and PLCOpen Editor, if full path contain non-lating
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1511
diff changeset
     8
# Copyright (C) 2017: Andrey Skvortsov
1511
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1503
diff changeset
     9
#
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1503
diff changeset
    10
# See COPYING file for copyrights details.
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1503
diff changeset
    11
#
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1503
diff changeset
    12
# This program is free software; you can redistribute it and/or
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1503
diff changeset
    13
# modify it under the terms of the GNU General Public License
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1503
diff changeset
    14
# as published by the Free Software Foundation; either version 2
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1503
diff changeset
    15
# of the License, or (at your option) any later version.
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1503
diff changeset
    16
#
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1503
diff changeset
    17
# This program is distributed in the hope that it will be useful,
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1503
diff changeset
    18
# but WITHOUT ANY WARRANTY; without even the implied warranty of
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1503
diff changeset
    19
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1503
diff changeset
    20
# GNU General Public License for more details.
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1503
diff changeset
    21
#
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1503
diff changeset
    22
# You should have received a copy of the GNU General Public License
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1503
diff changeset
    23
# along with this program; if not, write to the Free Software
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1503
diff changeset
    24
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1503
diff changeset
    25
1732
94ffe74e6895 clean-up: fix PEP8 E401 multiple imports on one line
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1680
diff changeset
    26
import os
94ffe74e6895 clean-up: fix PEP8 E401 multiple imports on one line
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1680
diff changeset
    27
import re
1315
ff14a66bbd12 Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents: 1160
diff changeset
    28
from lxml import etree
1680
6db967480b7d make run Beremiz and PLCOpen Editor, if full path contain non-lating
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1511
diff changeset
    29
import util.paths as paths
1315
ff14a66bbd12 Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents: 1160
diff changeset
    30
ff14a66bbd12 Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents: 1160
diff changeset
    31
from xmlclass import GenerateParserFromXSD
ff14a66bbd12 Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents: 1160
diff changeset
    32
ff14a66bbd12 Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents: 1160
diff changeset
    33
from CodeFileTreeNode import CodeFile
657
340c0b9caeca Adding support for integrating Python code Editor into Beremiz frame.
laurent
parents: 654
diff changeset
    34
from PythonEditor import PythonEditor
366
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents:
diff changeset
    35
1736
7e61baa047f0 clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1734
diff changeset
    36
1097
233681f2a00e Fixed Python editor adding variable panel
Laurent Bessard
parents: 1061
diff changeset
    37
class PythonFileCTNMixin(CodeFile):
1436
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
    38
1124
b1705000eba1 Fixed support for defining python runtime code using sections like in c_ext
Laurent Bessard
parents: 1120
diff changeset
    39
    CODEFILE_NAME = "PyFile"
b1705000eba1 Fixed support for defining python runtime code using sections like in c_ext
Laurent Bessard
parents: 1120
diff changeset
    40
    SECTIONS_NAMES = [
b1705000eba1 Fixed support for defining python runtime code using sections like in c_ext
Laurent Bessard
parents: 1120
diff changeset
    41
        "globals",
b1705000eba1 Fixed support for defining python runtime code using sections like in c_ext
Laurent Bessard
parents: 1120
diff changeset
    42
        "init",
b1705000eba1 Fixed support for defining python runtime code using sections like in c_ext
Laurent Bessard
parents: 1120
diff changeset
    43
        "cleanup",
b1705000eba1 Fixed support for defining python runtime code using sections like in c_ext
Laurent Bessard
parents: 1120
diff changeset
    44
        "start",
b1705000eba1 Fixed support for defining python runtime code using sections like in c_ext
Laurent Bessard
parents: 1120
diff changeset
    45
        "stop"]
657
340c0b9caeca Adding support for integrating Python code Editor into Beremiz frame.
laurent
parents: 654
diff changeset
    46
    EditorType = PythonEditor
1436
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
    47
366
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents:
diff changeset
    48
    def __init__(self):
1097
233681f2a00e Fixed Python editor adding variable panel
Laurent Bessard
parents: 1061
diff changeset
    49
        CodeFile.__init__(self)
1436
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
    50
366
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents:
diff changeset
    51
        filepath = self.PythonFileName()
1436
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
    52
366
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents:
diff changeset
    53
        if os.path.isfile(filepath):
1680
6db967480b7d make run Beremiz and PLCOpen Editor, if full path contain non-lating
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1511
diff changeset
    54
            PythonParser = GenerateParserFromXSD(paths.AbsNeighbourFile(__file__, "py_ext_xsd.xsd"))
1436
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
    55
366
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents:
diff changeset
    56
            xmlfile = open(filepath, 'r')
1315
ff14a66bbd12 Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents: 1160
diff changeset
    57
            pythonfile_xml = xmlfile.read()
366
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents:
diff changeset
    58
            xmlfile.close()
1436
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
    59
1315
ff14a66bbd12 Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents: 1160
diff changeset
    60
            pythonfile_xml = pythonfile_xml.replace(
1436
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
    61
                'xmlns="http://www.w3.org/2001/XMLSchema"',
1315
ff14a66bbd12 Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents: 1160
diff changeset
    62
                'xmlns:xhtml="http://www.w3.org/1999/xhtml"')
ff14a66bbd12 Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents: 1160
diff changeset
    63
            for cre, repl in [
ff14a66bbd12 Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents: 1160
diff changeset
    64
                (re.compile("(?<!<xhtml:p>)(?:<!\[CDATA\[)"), "<xhtml:p><![CDATA["),
ff14a66bbd12 Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents: 1160
diff changeset
    65
                (re.compile("(?:]]>)(?!</xhtml:p>)"), "]]></xhtml:p>")]:
ff14a66bbd12 Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents: 1160
diff changeset
    66
                pythonfile_xml = cre.sub(repl, pythonfile_xml)
1436
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
    67
1330
96b242e4c59d Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 1315
diff changeset
    68
            try:
96b242e4c59d Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 1315
diff changeset
    69
                python_code, error = PythonParser.LoadXMLString(pythonfile_xml)
1436
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
    70
                if error is None:
1330
96b242e4c59d Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 1315
diff changeset
    71
                    self.CodeFile.globals.setanyText(python_code.getanyText())
96b242e4c59d Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 1315
diff changeset
    72
                    os.remove(filepath)
96b242e4c59d Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 1315
diff changeset
    73
                    self.CreateCodeFileBuffer(False)
96b242e4c59d Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 1315
diff changeset
    74
                    self.OnCTNSave()
96b242e4c59d Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 1315
diff changeset
    75
            except Exception, exc:
96b242e4c59d Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 1315
diff changeset
    76
                error = unicode(exc)
1436
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
    77
1330
96b242e4c59d Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 1315
diff changeset
    78
            if error is not None:
96b242e4c59d Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents: 1315
diff changeset
    79
                self.GetCTRoot().logger.write_error(
1436
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
    80
                    _("Couldn't import old %s file.") % self.CTNName())
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
    81
1097
233681f2a00e Fixed Python editor adding variable panel
Laurent Bessard
parents: 1061
diff changeset
    82
    def CodeFileName(self):
233681f2a00e Fixed Python editor adding variable panel
Laurent Bessard
parents: 1061
diff changeset
    83
        return os.path.join(self.CTNPath(), "pyfile.xml")
1436
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
    84
366
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents:
diff changeset
    85
    def PythonFileName(self):
721
ecf4d203c4d4 refactoring
Edouard Tisserant
parents: 718
diff changeset
    86
        return os.path.join(self.CTNPath(), "py_ext.xml")
366
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents:
diff changeset
    87
1132
28f96aa9c070 Rewrote py_ext and wxglade generators in a clean factored way, added C skeleton for python access to PLC global vars
Edouard Tisserant
parents: 1124
diff changeset
    88
    PreSectionsTexts = {}
28f96aa9c070 Rewrote py_ext and wxglade generators in a clean factored way, added C skeleton for python access to PLC global vars
Edouard Tisserant
parents: 1124
diff changeset
    89
    PostSectionsTexts = {}
1751
c28db6f7616b clean-up: fix PEP8 E301 expected 1 blank line, found 0
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1748
diff changeset
    90
1740
b789b695b5c6 clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1739
diff changeset
    91
    def GetSection(self, section):
b789b695b5c6 clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1739
diff changeset
    92
        return self.PreSectionsTexts.get(section, "") + "\n" + \
1315
ff14a66bbd12 Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents: 1160
diff changeset
    93
               getattr(self.CodeFile, section).getanyText() + "\n" + \
1740
b789b695b5c6 clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1739
diff changeset
    94
               self.PostSectionsTexts.get(section, "")
1436
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
    95
1132
28f96aa9c070 Rewrote py_ext and wxglade generators in a clean factored way, added C skeleton for python access to PLC global vars
Edouard Tisserant
parents: 1124
diff changeset
    96
    def CTNGenerate_C(self, buildpath, locations):
1436
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
    97
        # location string for that CTN
1740
b789b695b5c6 clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1739
diff changeset
    98
        location_str = "_".join(map(lambda x: str(x),
1144
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
    99
                                self.GetCurrentLocation()))
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   100
        configname = self.GetCTRoot().GetProjectConfigNames()[0]
1436
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
   101
1447
d6b878525ceb Fixed systematically loading PLC binary at startup even without -a parameter. Extended py_ext extensions instances variable description (PLCGlobalsDesc). Now contains list of variables organizd by extension, with extension name
Edouard Tisserant
parents: 1436
diff changeset
   102
        pyextname = self.CTNName()
1739
ec153828ded2 clean-up: fix PEP8 E203 whitespace before ':' and whitespace before ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1736
diff changeset
   103
        varinfos = map(lambda variable: {
1448
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   104
                    "name": variable.getname(),
1739
ec153828ded2 clean-up: fix PEP8 E203 whitespace before ':' and whitespace before ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1736
diff changeset
   105
                    "desc": repr(variable.getdesc()),
1742
92932cd370a4 clean-up: fix PEP8 E225 missing whitespace around operator
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1740
diff changeset
   106
                    "onchangecode": '"'+variable.getonchange() + \
1449
5f09fa31d7b0 Added __ext_name__ variable accessible from user python code, reflecting extension name. Fixed contend of OnChange field in PLCGlobalsDesc
Edouard Tisserant
parents: 1448
diff changeset
   107
                                         "('"+variable.getname()+"')\"" \
5f09fa31d7b0 Added __ext_name__ variable accessible from user python code, reflecting extension name. Fixed contend of OnChange field in PLCGlobalsDesc
Edouard Tisserant
parents: 1448
diff changeset
   108
                                     if variable.getonchange() else '""',
1739
ec153828ded2 clean-up: fix PEP8 E203 whitespace before ':' and whitespace before ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1736
diff changeset
   109
                    "onchange": repr(variable.getonchange()) \
1449
5f09fa31d7b0 Added __ext_name__ variable accessible from user python code, reflecting extension name. Fixed contend of OnChange field in PLCGlobalsDesc
Edouard Tisserant
parents: 1448
diff changeset
   110
                                 if variable.getonchange() else None,
1739
ec153828ded2 clean-up: fix PEP8 E203 whitespace before ':' and whitespace before ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1736
diff changeset
   111
                    "opts": repr(variable.getopts()),
ec153828ded2 clean-up: fix PEP8 E203 whitespace before ':' and whitespace before ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1736
diff changeset
   112
                    "configname": configname.upper(),
ec153828ded2 clean-up: fix PEP8 E203 whitespace before ':' and whitespace before ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1736
diff changeset
   113
                    "uppername": variable.getname().upper(),
ec153828ded2 clean-up: fix PEP8 E203 whitespace before ':' and whitespace before ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1736
diff changeset
   114
                    "IECtype": variable.gettype(),
ec153828ded2 clean-up: fix PEP8 E203 whitespace before ':' and whitespace before ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1736
diff changeset
   115
                    "pyextname": pyextname},
1448
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   116
                    self.CodeFile.variables.variable)
1144
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   117
        # python side PLC global variables access stub
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   118
        globalstubs = "\n".join(["""\
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   119
_%(name)s_ctype, _%(name)s_unpack, _%(name)s_pack = \\
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   120
    TypeTranslator["%(IECtype)s"]
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   121
_PySafeGetPLCGlob_%(name)s = PLCBinary.__SafeGetPLCGlob_%(name)s
1145
203f4eff3313 Fixed PLC global var access from python. Added test in tests/python
Edouard Tisserant
parents: 1144
diff changeset
   122
_PySafeGetPLCGlob_%(name)s.restype = None
1436
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
   123
_PySafeGetPLCGlob_%(name)s.argtypes = [ctypes.POINTER(_%(name)s_ctype)]
1144
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   124
_PySafeSetPLCGlob_%(name)s = PLCBinary.__SafeSetPLCGlob_%(name)s
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   125
_PySafeSetPLCGlob_%(name)s.restype = None
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   126
_PySafeSetPLCGlob_%(name)s.argtypes = [ctypes.POINTER(_%(name)s_ctype)]
1448
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   127
_%(pyextname)sGlobalsDesc.append((
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   128
    "%(name)s",
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   129
    "%(IECtype)s",
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   130
    %(desc)s,
1449
5f09fa31d7b0 Added __ext_name__ variable accessible from user python code, reflecting extension name. Fixed contend of OnChange field in PLCGlobalsDesc
Edouard Tisserant
parents: 1448
diff changeset
   131
    %(onchange)s,
1448
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   132
    %(opts)s))
1452
7a2b344de8cf Fixed build of tests/python.
Edouard Tisserant
parents: 1449
diff changeset
   133
""" % varinfo
1449
5f09fa31d7b0 Added __ext_name__ variable accessible from user python code, reflecting extension name. Fixed contend of OnChange field in PLCGlobalsDesc
Edouard Tisserant
parents: 1448
diff changeset
   134
      for varinfo in varinfos])
1132
28f96aa9c070 Rewrote py_ext and wxglade generators in a clean factored way, added C skeleton for python access to PLC global vars
Edouard Tisserant
parents: 1124
diff changeset
   135
28f96aa9c070 Rewrote py_ext and wxglade generators in a clean factored way, added C skeleton for python access to PLC global vars
Edouard Tisserant
parents: 1124
diff changeset
   136
        # Runtime calls (start, stop, init, and cleanup)
28f96aa9c070 Rewrote py_ext and wxglade generators in a clean factored way, added C skeleton for python access to PLC global vars
Edouard Tisserant
parents: 1124
diff changeset
   137
        rtcalls = ""
1124
b1705000eba1 Fixed support for defining python runtime code using sections like in c_ext
Laurent Bessard
parents: 1120
diff changeset
   138
        for section in self.SECTIONS_NAMES:
b1705000eba1 Fixed support for defining python runtime code using sections like in c_ext
Laurent Bessard
parents: 1120
diff changeset
   139
            if section != "globals":
1132
28f96aa9c070 Rewrote py_ext and wxglade generators in a clean factored way, added C skeleton for python access to PLC global vars
Edouard Tisserant
parents: 1124
diff changeset
   140
                rtcalls += "def _runtime_%s_%s():\n" % (location_str, section)
28f96aa9c070 Rewrote py_ext and wxglade generators in a clean factored way, added C skeleton for python access to PLC global vars
Edouard Tisserant
parents: 1124
diff changeset
   141
                sectiontext = self.GetSection(section).strip()
28f96aa9c070 Rewrote py_ext and wxglade generators in a clean factored way, added C skeleton for python access to PLC global vars
Edouard Tisserant
parents: 1124
diff changeset
   142
                if sectiontext:
28f96aa9c070 Rewrote py_ext and wxglade generators in a clean factored way, added C skeleton for python access to PLC global vars
Edouard Tisserant
parents: 1124
diff changeset
   143
                    rtcalls += '    ' + \
1154
da9ccfceff31 Fixed build error with python <-> PLCglobals variables declared with no initial value
Edouard Tisserant
parents: 1148
diff changeset
   144
                        sectiontext.replace('\n', '\n    ')+"\n\n"
1132
28f96aa9c070 Rewrote py_ext and wxglade generators in a clean factored way, added C skeleton for python access to PLC global vars
Edouard Tisserant
parents: 1124
diff changeset
   145
                else:
28f96aa9c070 Rewrote py_ext and wxglade generators in a clean factored way, added C skeleton for python access to PLC global vars
Edouard Tisserant
parents: 1124
diff changeset
   146
                    rtcalls += "    pass\n\n"
1144
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   147
1436
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
   148
        globalsection = self.GetSection("globals")
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
   149
1144
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   150
        PyFileContent = """\
1132
28f96aa9c070 Rewrote py_ext and wxglade generators in a clean factored way, added C skeleton for python access to PLC global vars
Edouard Tisserant
parents: 1124
diff changeset
   151
#!/usr/bin/env python
28f96aa9c070 Rewrote py_ext and wxglade generators in a clean factored way, added C skeleton for python access to PLC global vars
Edouard Tisserant
parents: 1124
diff changeset
   152
# -*- coding: utf-8 -*-
28f96aa9c070 Rewrote py_ext and wxglade generators in a clean factored way, added C skeleton for python access to PLC global vars
Edouard Tisserant
parents: 1124
diff changeset
   153
## Code generated by Beremiz python mixin confnode
1436
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
   154
##
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
   155
1132
28f96aa9c070 Rewrote py_ext and wxglade generators in a clean factored way, added C skeleton for python access to PLC global vars
Edouard Tisserant
parents: 1124
diff changeset
   156
## Code for PLC global variable access
1144
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   157
from targets.typemapping import TypeTranslator
1436
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
   158
import ctypes
1447
d6b878525ceb Fixed systematically loading PLC binary at startup even without -a parameter. Extended py_ext extensions instances variable description (PLCGlobalsDesc). Now contains list of variables organizd by extension, with extension name
Edouard Tisserant
parents: 1436
diff changeset
   159
_%(pyextname)sGlobalsDesc = []
1449
5f09fa31d7b0 Added __ext_name__ variable accessible from user python code, reflecting extension name. Fixed contend of OnChange field in PLCGlobalsDesc
Edouard Tisserant
parents: 1448
diff changeset
   160
__ext_name__ = "%(pyextname)s"
1452
7a2b344de8cf Fixed build of tests/python.
Edouard Tisserant
parents: 1449
diff changeset
   161
PLCGlobalsDesc.append(( "%(pyextname)s" , _%(pyextname)sGlobalsDesc ))
1144
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   162
%(globalstubs)s
1436
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
   163
1132
28f96aa9c070 Rewrote py_ext and wxglade generators in a clean factored way, added C skeleton for python access to PLC global vars
Edouard Tisserant
parents: 1124
diff changeset
   164
## User code in "global" scope
1144
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   165
%(globalsection)s
366
cd90e4c10261 Move python evaluator to create a python plugin containing any related python module
laurent
parents:
diff changeset
   166
1132
28f96aa9c070 Rewrote py_ext and wxglade generators in a clean factored way, added C skeleton for python access to PLC global vars
Edouard Tisserant
parents: 1124
diff changeset
   167
## Beremiz python runtime calls
1144
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   168
%(rtcalls)s
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   169
1449
5f09fa31d7b0 Added __ext_name__ variable accessible from user python code, reflecting extension name. Fixed contend of OnChange field in PLCGlobalsDesc
Edouard Tisserant
parents: 1448
diff changeset
   170
del __ext_name__
5f09fa31d7b0 Added __ext_name__ variable accessible from user python code, reflecting extension name. Fixed contend of OnChange field in PLCGlobalsDesc
Edouard Tisserant
parents: 1448
diff changeset
   171
1144
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   172
""" % locals()
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   173
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   174
        # write generated content to python file
1436
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
   175
        runtimefile_path = os.path.join(buildpath,
1734
750eeb7230a1 clean-up: fix some PEP8 E228 missing whitespace around modulo operator
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1732
diff changeset
   176
            "runtime_%s.py" % location_str)
1132
28f96aa9c070 Rewrote py_ext and wxglade generators in a clean factored way, added C skeleton for python access to PLC global vars
Edouard Tisserant
parents: 1124
diff changeset
   177
        runtimefile = open(runtimefile_path, 'w')
1144
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   178
        runtimefile.write(PyFileContent.encode('utf-8'))
1132
28f96aa9c070 Rewrote py_ext and wxglade generators in a clean factored way, added C skeleton for python access to PLC global vars
Edouard Tisserant
parents: 1124
diff changeset
   179
        runtimefile.close()
28f96aa9c070 Rewrote py_ext and wxglade generators in a clean factored way, added C skeleton for python access to PLC global vars
Edouard Tisserant
parents: 1124
diff changeset
   180
1144
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   181
        # C code for safe global variables access
1436
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
   182
1144
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   183
        vardecfmt = """\
1154
da9ccfceff31 Fixed build error with python <-> PLCglobals variables declared with no initial value
Edouard Tisserant
parents: 1148
diff changeset
   184
extern  __IEC_%(IECtype)s_t %(configname)s__%(uppername)s;
da9ccfceff31 Fixed build error with python <-> PLCglobals variables declared with no initial value
Edouard Tisserant
parents: 1148
diff changeset
   185
IEC_%(IECtype)s __%(name)s_rbuffer = __INIT_%(IECtype)s;
da9ccfceff31 Fixed build error with python <-> PLCglobals variables declared with no initial value
Edouard Tisserant
parents: 1148
diff changeset
   186
IEC_%(IECtype)s __%(name)s_wbuffer;
1144
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   187
long __%(name)s_rlock = 0;
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   188
long __%(name)s_wlock = 0;
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   189
int __%(name)s_wbuffer_written = 0;
1154
da9ccfceff31 Fixed build error with python <-> PLCglobals variables declared with no initial value
Edouard Tisserant
parents: 1148
diff changeset
   190
void __SafeGetPLCGlob_%(name)s(IEC_%(IECtype)s *pvalue){
1144
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   191
    while(AtomicCompareExchange(&__%(name)s_rlock, 0, 1));
1145
203f4eff3313 Fixed PLC global var access from python. Added test in tests/python
Edouard Tisserant
parents: 1144
diff changeset
   192
    *pvalue = __%(name)s_rbuffer;
1144
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   193
    AtomicCompareExchange((long*)&__%(name)s_rlock, 1, 0);
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   194
}
1160
e9e9d3193894 Fixed GCC warnings when building stub code for python PLC globals access
Edouard Tisserant
parents: 1154
diff changeset
   195
void __SafeSetPLCGlob_%(name)s(IEC_%(IECtype)s *value){
1144
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   196
    while(AtomicCompareExchange(&__%(name)s_wlock, 0, 1));
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   197
    __%(name)s_wbuffer = *value;
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   198
    __%(name)s_wbuffer_written = 1;
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   199
    AtomicCompareExchange((long*)&__%(name)s_wlock, 1, 0);
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   200
}
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   201
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   202
"""
1448
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   203
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   204
        vardeconchangefmt = """\
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   205
PYTHON_POLL* __%(name)s_notifier;
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   206
"""
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   207
1144
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   208
        varretfmt = """\
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   209
    if(!AtomicCompareExchange(&__%(name)s_wlock, 0, 1)){
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   210
        if(__%(name)s_wbuffer_written == 1){
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   211
            %(configname)s__%(uppername)s.value = __%(name)s_wbuffer;
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   212
            __%(name)s_wbuffer_written = 0;
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   213
        }
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   214
        AtomicCompareExchange((long*)&__%(name)s_wlock, 1, 0);
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   215
    }
1436
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
   216
"""
1144
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   217
        varpubfmt = """\
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   218
    if(!AtomicCompareExchange(&__%(name)s_rlock, 0, 1)){
1448
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   219
        __%(name)s_rbuffer = __GET_VAR(%(configname)s__%(uppername)s);
1144
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   220
        AtomicCompareExchange((long*)&__%(name)s_rlock, 1, 0);
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   221
    }
1436
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
   222
"""
1144
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   223
1448
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   224
        varpubonchangefmt = """\
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   225
    if(!AtomicCompareExchange(&__%(name)s_rlock, 0, 1)){
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   226
        IEC_%(IECtype)s tmp = __GET_VAR(%(configname)s__%(uppername)s);
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   227
        if(__%(name)s_rbuffer != tmp){
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   228
            __%(name)s_rbuffer = %(configname)s__%(uppername)s.value;
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   229
            PYTHON_POLL_body__(__%(name)s_notifier);
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   230
        }
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   231
        AtomicCompareExchange((long*)&__%(name)s_rlock, 1, 0);
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   232
    }
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   233
"""
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   234
        varinitonchangefmt = """\
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   235
    __%(name)s_notifier = __GET_GLOBAL_ON%(uppername)sCHANGE();
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   236
    __SET_VAR(__%(name)s_notifier->,TRIG,,__BOOL_LITERAL(TRUE));
1449
5f09fa31d7b0 Added __ext_name__ variable accessible from user python code, reflecting extension name. Fixed contend of OnChange field in PLCGlobalsDesc
Edouard Tisserant
parents: 1448
diff changeset
   237
    __SET_VAR(__%(name)s_notifier->,CODE,,__STRING_LITERAL(%(onchangelen)d,%(onchangecode)s));
1448
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   238
"""
1452
7a2b344de8cf Fixed build of tests/python.
Edouard Tisserant
parents: 1449
diff changeset
   239
        vardec = "\n".join([(vardecfmt + vardeconchangefmt
1742
92932cd370a4 clean-up: fix PEP8 E225 missing whitespace around operator
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1740
diff changeset
   240
                             if varinfo["onchange"] else vardecfmt) % varinfo
1448
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   241
                            for varinfo in varinfos])
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   242
        varret = "\n".join([varretfmt % varinfo for varinfo in varinfos])
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   243
        varpub = "\n".join([(varpubonchangefmt if varinfo["onchange"] else
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   244
                             varpubfmt) % varinfo
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   245
                            for varinfo in varinfos])
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   246
        varinit = "\n".join([varinitonchangefmt % dict(
1744
69dfdb26f600 clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1742
diff changeset
   247
                                onchangelen=len(varinfo["onchangecode"]), **varinfo)
1448
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   248
                            for varinfo in varinfos if varinfo["onchange"]])
1436
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
   249
1452
7a2b344de8cf Fixed build of tests/python.
Edouard Tisserant
parents: 1449
diff changeset
   250
        # TODO : use config name obtained from model instead of default
7a2b344de8cf Fixed build of tests/python.
Edouard Tisserant
parents: 1449
diff changeset
   251
        # "config.h". User cannot change config name, but project imported
7a2b344de8cf Fixed build of tests/python.
Edouard Tisserant
parents: 1449
diff changeset
   252
        # or created in older beremiz vesion could use different name.
1144
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   253
        PyCFileContent = """\
1436
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
   254
/*
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
   255
 * Code generated by Beremiz py_ext confnode
1132
28f96aa9c070 Rewrote py_ext and wxglade generators in a clean factored way, added C skeleton for python access to PLC global vars
Edouard Tisserant
parents: 1124
diff changeset
   256
 * for safe global variables access
28f96aa9c070 Rewrote py_ext and wxglade generators in a clean factored way, added C skeleton for python access to PLC global vars
Edouard Tisserant
parents: 1124
diff changeset
   257
 */
28f96aa9c070 Rewrote py_ext and wxglade generators in a clean factored way, added C skeleton for python access to PLC global vars
Edouard Tisserant
parents: 1124
diff changeset
   258
#include "iec_types_all.h"
1448
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   259
#include "POUS.h"
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   260
#include "config.h"
1144
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   261
#include "beremiz.h"
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   262
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   263
/* User variables reference */
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   264
%(vardec)s
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   265
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   266
/* Beremiz confnode functions */
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   267
int __init_%(location_str)s(int argc,char **argv){
1448
20ff66dcc31d Added more columns in variable list of extensions' code editors - updating python's PLCGlobals from PLC logic can trigger asynchronous 'OnChange' python call
Edouard Tisserant
parents: 1447
diff changeset
   268
%(varinit)s
1144
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   269
    return 0;
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   270
}
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   271
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   272
void __cleanup_%(location_str)s(void){
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   273
}
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   274
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   275
void __retrieve_%(location_str)s(void){
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   276
%(varret)s
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   277
}
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   278
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   279
void __publish_%(location_str)s(void){
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   280
%(varpub)s
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   281
}
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   282
""" % locals()
1436
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
   283
1734
750eeb7230a1 clean-up: fix some PEP8 E228 missing whitespace around modulo operator
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1732
diff changeset
   284
        Gen_PyCfile_path = os.path.join(buildpath, "PyCFile_%s.c" % location_str)
1740
b789b695b5c6 clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1739
diff changeset
   285
        pycfile = open(Gen_PyCfile_path, 'w')
1144
21475ee0e688 Added stub code and declarations for bidirectional access to PLC globals from python code (untested)
Edouard Tisserant
parents: 1132
diff changeset
   286
        pycfile.write(PyCFileContent)
1132
28f96aa9c070 Rewrote py_ext and wxglade generators in a clean factored way, added C skeleton for python access to PLC global vars
Edouard Tisserant
parents: 1124
diff changeset
   287
        pycfile.close()
1436
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
   288
1734
750eeb7230a1 clean-up: fix some PEP8 E228 missing whitespace around modulo operator
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1732
diff changeset
   289
        matiec_CFLAGS = '"-I%s"' % os.path.abspath(
1132
28f96aa9c070 Rewrote py_ext and wxglade generators in a clean factored way, added C skeleton for python access to PLC global vars
Edouard Tisserant
parents: 1124
diff changeset
   290
            self.GetCTRoot().GetIECLibPath())
1436
e15ca67197b9 py_ext user python code can now know about global variables shared with PLC. updated tests/python accordingly
Edouard Tisserant
parents: 1330
diff changeset
   291
1503
3a238c0c5993 fix regression introduced by changeset: 1431:28e9d479aa65 [Use '-p' command line option when running matiec (iec2c)]
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1475
diff changeset
   292
        return ([(Gen_PyCfile_path, matiec_CFLAGS)],
1132
28f96aa9c070 Rewrote py_ext and wxglade generators in a clean factored way, added C skeleton for python access to PLC global vars
Edouard Tisserant
parents: 1124
diff changeset
   293
                "",
1145
203f4eff3313 Fixed PLC global var access from python. Added test in tests/python
Edouard Tisserant
parents: 1144
diff changeset
   294
                True,
1740
b789b695b5c6 clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1739
diff changeset
   295
                ("runtime_%s.py" % location_str, file(runtimefile_path, "rb")))