plcopen/VariableInfoCollector.py
changeset 1951 bbd1e1744c91
child 1953 5736d25bb393
equal deleted inserted replaced
1950:752ec68da94d 1951:bbd1e1744c91
       
     1 #!/usr/bin/env python
       
     2 # -*- coding: utf-8 -*-
       
     3 # This file is part of Beremiz.
       
     4 # See COPYING file for copyrights details.
       
     5 
       
     6 from __future__ import absolute_import
       
     7 from plcopen.XSLTModelQuery import XSLTModelQuery, _StringValue, _BoolValue, _translate_args
       
     8 
       
     9 # -------------------------------------------------------------------------------
       
    10 #                 Helpers object for generating pou var list
       
    11 # -------------------------------------------------------------------------------
       
    12 
       
    13 class _VariableInfos(object):
       
    14     __slots__ = ["Name", "Class", "Option", "Location", "InitialValue",
       
    15                  "Edit", "Documentation", "Type", "Tree", "Number"]
       
    16 
       
    17     def __init__(self, *args):
       
    18         for attr, value in zip(self.__slots__, args):
       
    19             setattr(self, attr, value if value is not None else "")
       
    20 
       
    21     def copy(self):
       
    22         return _VariableInfos(*[getattr(self, attr) for attr in self.__slots__])
       
    23 
       
    24 
       
    25 class VariablesInfosFactory(object):
       
    26     """ Helpers object for generating pou var list """
       
    27 
       
    28     def __init__(self, variables):
       
    29         self.Variables = variables
       
    30         self.TreeStack = []
       
    31         self.Type = None
       
    32         self.Dimensions = None
       
    33 
       
    34     def SetType(self, context, *args):
       
    35         self.Type = args[0][0]
       
    36 
       
    37     def GetType(self):
       
    38         if len(self.Dimensions) > 0:
       
    39             return ("array", self.Type, self.Dimensions)
       
    40         return self.Type
       
    41 
       
    42     def GetTree(self):
       
    43         return (self.TreeStack.pop(-1), self.Dimensions)
       
    44 
       
    45     def AddDimension(self, context, *args):
       
    46         self.Dimensions.append(tuple(
       
    47             _translate_args([_StringValue] * 2, args)))
       
    48 
       
    49     def AddTree(self, context, *args):
       
    50         self.TreeStack.append([])
       
    51         self.Dimensions = []
       
    52 
       
    53     def AddVarToTree(self, context, *args):
       
    54         var = (args[0][0], self.Type, self.GetTree())
       
    55         self.TreeStack[-1].append(var)
       
    56 
       
    57     def AddVariable(self, context, *args):
       
    58         self.Variables.append(_VariableInfos(*(
       
    59             _translate_args([_StringValue] * 5 + [_BoolValue] + [_StringValue], args) +
       
    60             [self.GetType(), self.GetTree()])))
       
    61 
       
    62 
       
    63 class VariableInfoCollector(XSLTModelQuery):
       
    64     def __init__(self, controller):
       
    65         XSLTModelQuery.__init__(self,
       
    66                                 controller,
       
    67                                 "variables_infos.xslt",
       
    68                                 [(name, self.FactoryCaller(name)) 
       
    69                                     for name in [
       
    70                                         "SetType",
       
    71                                         "AddDimension",
       
    72                                         "AddTree",
       
    73                                         "AddVarToTree",
       
    74                                         "AddVariable"]])
       
    75 
       
    76     def FactoryCaller(self, funcname):
       
    77         def CallFactory(*args):
       
    78             return getattr(self.factory, funcname)(*args)
       
    79         return CallFactory
       
    80 
       
    81     def Collect(self, root, debug, variables, tree):
       
    82         self.factory = VariablesInfosFactory(variables)
       
    83         self._process_xslt(root, debug, tree=str(tree))
       
    84         res = self.factory
       
    85         self.factory = None
       
    86         return res
       
    87