|
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 |