author | Edouard Tisserant |
Thu, 05 Feb 2015 01:35:02 +0100 | |
changeset 1438 | 19ebe96b41c0 |
parent 1437 | 04177743b066 |
child 1439 | a68cd4253259 |
permissions | -rwxr-xr-x |
641 | 1 |
#!/usr/bin/env python |
2 |
# -*- coding: utf-8 -*- |
|
3 |
||
4 |
#This file is part of Beremiz, a Integrated Development Environment for |
|
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
5 |
#programming IEC 61131-3 automates supporting plcopen standard and CanFestival. |
641 | 6 |
# |
7 |
#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD |
|
8 |
# |
|
9 |
#See COPYING file for copyrights details. |
|
10 |
# |
|
11 |
#This library is free software; you can redistribute it and/or |
|
12 |
#modify it under the terms of the GNU General Public |
|
13 |
#License as published by the Free Software Foundation; either |
|
14 |
#version 2.1 of the License, or (at your option) any later version. |
|
15 |
# |
|
16 |
#This library is distributed in the hope that it will be useful, |
|
17 |
#but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
18 |
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
19 |
#General Public License for more details. |
|
20 |
# |
|
21 |
#You should have received a copy of the GNU General Public |
|
22 |
#License along with this library; if not, write to the Free Software |
|
23 |
#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
24 |
||
25 |
import os, sys, getopt |
|
1067
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
26 |
from threading import Thread |
641 | 27 |
|
28 |
def usage(): |
|
29 |
print """ |
|
30 |
Usage of Beremiz PLC execution service :\n |
|
644
b511cab580eb
Better naming of IP address related variables in Beremiz_service.py, Ignore errors that occur on shutdown in Zeroconf.py, fixed discovery dialog crash due to asynchronous call from zeroconf
Edouard Tisserant
parents:
641
diff
changeset
|
31 |
%s {[-n servicename] [-i IP] [-p port] [-x enabletaskbar] [-a autostart]|-h|--help} working_dir |
641 | 32 |
-n - zeroconf service name (default:disabled) |
644
b511cab580eb
Better naming of IP address related variables in Beremiz_service.py, Ignore errors that occur on shutdown in Zeroconf.py, fixed discovery dialog crash due to asynchronous call from zeroconf
Edouard Tisserant
parents:
641
diff
changeset
|
33 |
-i - IP address of interface to bind to (default:localhost) |
641 | 34 |
-p - port number default:3000 |
35 |
-h - print this help text and quit |
|
36 |
-a - autostart PLC (0:disable 1:enable) (default:0) |
|
37 |
-x - enable/disable wxTaskbarIcon (0:disable 1:enable) (default:1) |
|
38 |
-t - enable/disable Twisted web interface (0:disable 1:enable) (default:1) |
|
1437
04177743b066
Added Beremiz_service.py command line switch to load python extention for runtime independently from PLC program
Edouard Tisserant
parents:
1434
diff
changeset
|
39 |
-e - python extension (absolute path .py) |
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
40 |
|
641 | 41 |
working_dir - directory where are stored PLC files |
42 |
"""%sys.argv[0] |
|
43 |
||
44 |
try: |
|
1437
04177743b066
Added Beremiz_service.py command line switch to load python extention for runtime independently from PLC program
Edouard Tisserant
parents:
1434
diff
changeset
|
45 |
opts, argv = getopt.getopt(sys.argv[1:], "i:p:n:x:t:a:e:h") |
641 | 46 |
except getopt.GetoptError, err: |
47 |
# print help information and exit: |
|
48 |
print str(err) # will print something like "option -a not recognized" |
|
49 |
usage() |
|
50 |
sys.exit(2) |
|
51 |
||
52 |
# default values |
|
644
b511cab580eb
Better naming of IP address related variables in Beremiz_service.py, Ignore errors that occur on shutdown in Zeroconf.py, fixed discovery dialog crash due to asynchronous call from zeroconf
Edouard Tisserant
parents:
641
diff
changeset
|
53 |
given_ip = None |
641 | 54 |
port = 3000 |
55 |
servicename = None |
|
56 |
autostart = False |
|
57 |
enablewx = True |
|
58 |
havewx = False |
|
59 |
enabletwisted = True |
|
60 |
havetwisted = False |
|
61 |
||
1437
04177743b066
Added Beremiz_service.py command line switch to load python extention for runtime independently from PLC program
Edouard Tisserant
parents:
1434
diff
changeset
|
62 |
extensions=[] |
04177743b066
Added Beremiz_service.py command line switch to load python extention for runtime independently from PLC program
Edouard Tisserant
parents:
1434
diff
changeset
|
63 |
|
641 | 64 |
for o, a in opts: |
65 |
if o == "-h": |
|
66 |
usage() |
|
67 |
sys.exit() |
|
68 |
elif o == "-i": |
|
69 |
if len(a.split(".")) == 4 or a == "localhost": |
|
644
b511cab580eb
Better naming of IP address related variables in Beremiz_service.py, Ignore errors that occur on shutdown in Zeroconf.py, fixed discovery dialog crash due to asynchronous call from zeroconf
Edouard Tisserant
parents:
641
diff
changeset
|
70 |
given_ip = a |
b511cab580eb
Better naming of IP address related variables in Beremiz_service.py, Ignore errors that occur on shutdown in Zeroconf.py, fixed discovery dialog crash due to asynchronous call from zeroconf
Edouard Tisserant
parents:
641
diff
changeset
|
71 |
else: |
b511cab580eb
Better naming of IP address related variables in Beremiz_service.py, Ignore errors that occur on shutdown in Zeroconf.py, fixed discovery dialog crash due to asynchronous call from zeroconf
Edouard Tisserant
parents:
641
diff
changeset
|
72 |
usage() |
b511cab580eb
Better naming of IP address related variables in Beremiz_service.py, Ignore errors that occur on shutdown in Zeroconf.py, fixed discovery dialog crash due to asynchronous call from zeroconf
Edouard Tisserant
parents:
641
diff
changeset
|
73 |
sys.exit() |
641 | 74 |
elif o == "-p": |
75 |
# port: port that the service runs on |
|
76 |
port = int(a) |
|
77 |
elif o == "-n": |
|
78 |
servicename = a |
|
79 |
elif o == "-x": |
|
80 |
enablewx = int(a) |
|
81 |
elif o == "-t": |
|
82 |
enabletwisted = int(a) |
|
83 |
elif o == "-a": |
|
84 |
autostart = int(a) |
|
1437
04177743b066
Added Beremiz_service.py command line switch to load python extention for runtime independently from PLC program
Edouard Tisserant
parents:
1434
diff
changeset
|
85 |
elif o == "-e": |
04177743b066
Added Beremiz_service.py command line switch to load python extention for runtime independently from PLC program
Edouard Tisserant
parents:
1434
diff
changeset
|
86 |
extensions.append(a) |
641 | 87 |
else: |
88 |
usage() |
|
89 |
sys.exit() |
|
90 |
||
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
91 |
CWD = os.path.split(os.path.realpath(__file__))[0] |
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
92 |
|
641 | 93 |
if len(argv) > 1: |
94 |
usage() |
|
95 |
sys.exit() |
|
96 |
elif len(argv) == 1: |
|
97 |
WorkingDir = argv[0] |
|
98 |
os.chdir(WorkingDir) |
|
99 |
elif len(argv) == 0: |
|
100 |
WorkingDir = os.getcwd() |
|
101 |
argv=[WorkingDir] |
|
102 |
||
103 |
import __builtin__ |
|
104 |
if __name__ == '__main__': |
|
105 |
__builtin__.__dict__['_'] = lambda x: x |
|
106 |
||
107 |
if enablewx: |
|
108 |
try: |
|
109 |
import wx, re |
|
110 |
from threading import Thread, currentThread |
|
111 |
from types import * |
|
112 |
havewx = True |
|
113 |
except: |
|
114 |
print "Wx unavailable !" |
|
115 |
havewx = False |
|
116 |
||
117 |
if havewx: |
|
118 |
app=wx.App(redirect=False) |
|
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
119 |
|
641 | 120 |
# Import module for internationalization |
121 |
import gettext |
|
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
122 |
|
1067
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
123 |
def Bpath(*args): |
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
124 |
return os.path.join(CWD,*args) |
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
125 |
|
641 | 126 |
# Get folder containing translation files |
127 |
localedir = os.path.join(CWD,"locale") |
|
128 |
# Get the default language |
|
129 |
langid = wx.LANGUAGE_DEFAULT |
|
130 |
# Define translation domain (name of translation files) |
|
131 |
domain = "Beremiz" |
|
132 |
||
133 |
# Define locale for wx |
|
134 |
loc = __builtin__.__dict__.get('loc', None) |
|
135 |
if loc is None: |
|
136 |
loc = wx.Locale(langid) |
|
137 |
__builtin__.__dict__['loc'] = loc |
|
138 |
# Define location for searching translation files |
|
139 |
loc.AddCatalogLookupPathPrefix(localedir) |
|
140 |
# Define locale domain |
|
141 |
loc.AddCatalog(domain) |
|
142 |
||
143 |
def unicode_translation(message): |
|
144 |
return wx.GetTranslation(message).encode("utf-8") |
|
145 |
||
146 |
if __name__ == '__main__': |
|
147 |
__builtin__.__dict__['_'] = wx.GetTranslation#unicode_translation |
|
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
148 |
|
1067
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
149 |
defaulticon = wx.Image(Bpath("images", "brz.png")) |
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
150 |
starticon = wx.Image(Bpath("images", "icoplay24.png")) |
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
151 |
stopicon = wx.Image(Bpath("images", "icostop24.png")) |
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
152 |
|
641 | 153 |
class ParamsEntryDialog(wx.TextEntryDialog): |
154 |
if wx.VERSION < (2, 6, 0): |
|
155 |
def Bind(self, event, function, id = None): |
|
156 |
if id is not None: |
|
157 |
event(self, id, function) |
|
158 |
else: |
|
159 |
event(self, function) |
|
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
160 |
|
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
161 |
|
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
162 |
def __init__(self, parent, message, caption = "Please enter text", defaultValue = "", |
641 | 163 |
style = wx.OK|wx.CANCEL|wx.CENTRE, pos = wx.DefaultPosition): |
164 |
wx.TextEntryDialog.__init__(self, parent, message, caption, defaultValue, style, pos) |
|
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
165 |
|
641 | 166 |
self.Tests = [] |
167 |
if wx.VERSION >= (2, 8, 0): |
|
168 |
self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetAffirmativeId()) |
|
169 |
elif wx.VERSION >= (2, 6, 0): |
|
170 |
self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(3).GetSizer().GetAffirmativeButton().GetId()) |
|
171 |
else: |
|
172 |
self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(3).GetSizer().GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId()) |
|
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
173 |
|
641 | 174 |
def OnOK(self, event): |
175 |
value = self.GetValue() |
|
176 |
texts = {"value" : value} |
|
177 |
for function, message in self.Tests: |
|
178 |
if not function(value): |
|
179 |
message = wx.MessageDialog(self, message%texts, _("Error"), wx.OK|wx.ICON_ERROR) |
|
180 |
message.ShowModal() |
|
181 |
message.Destroy() |
|
182 |
return |
|
183 |
self.EndModal(wx.ID_OK) |
|
184 |
event.Skip() |
|
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
185 |
|
641 | 186 |
def GetValue(self): |
187 |
return self.GetSizer().GetItem(1).GetWindow().GetValue() |
|
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
188 |
|
641 | 189 |
def SetTests(self, tests): |
190 |
self.Tests = tests |
|
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
191 |
|
641 | 192 |
class BeremizTaskBarIcon(wx.TaskBarIcon): |
193 |
TBMENU_START = wx.NewId() |
|
194 |
TBMENU_STOP = wx.NewId() |
|
195 |
TBMENU_CHANGE_NAME = wx.NewId() |
|
196 |
TBMENU_CHANGE_PORT = wx.NewId() |
|
197 |
TBMENU_CHANGE_INTERFACE = wx.NewId() |
|
198 |
TBMENU_LIVE_SHELL = wx.NewId() |
|
199 |
TBMENU_WXINSPECTOR = wx.NewId() |
|
200 |
TBMENU_CHANGE_WD = wx.NewId() |
|
201 |
TBMENU_QUIT = wx.NewId() |
|
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
202 |
|
835
8145be14a2ae
Fixed runtime GUI freeze when stopping PLC from the menu. Added -x 2 argument to Beremiz_service.py to restrict content of systray icon menu.
Edouard Tisserant
parents:
719
diff
changeset
|
203 |
def __init__(self, pyroserver, level): |
641 | 204 |
wx.TaskBarIcon.__init__(self) |
205 |
self.pyroserver = pyroserver |
|
206 |
# Set the image |
|
207 |
self.UpdateIcon(None) |
|
835
8145be14a2ae
Fixed runtime GUI freeze when stopping PLC from the menu. Added -x 2 argument to Beremiz_service.py to restrict content of systray icon menu.
Edouard Tisserant
parents:
719
diff
changeset
|
208 |
self.level = level |
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
209 |
|
641 | 210 |
# bind some events |
211 |
self.Bind(wx.EVT_MENU, self.OnTaskBarStartPLC, id=self.TBMENU_START) |
|
212 |
self.Bind(wx.EVT_MENU, self.OnTaskBarStopPLC, id=self.TBMENU_STOP) |
|
213 |
self.Bind(wx.EVT_MENU, self.OnTaskBarChangeName, id=self.TBMENU_CHANGE_NAME) |
|
214 |
self.Bind(wx.EVT_MENU, self.OnTaskBarChangeInterface, id=self.TBMENU_CHANGE_INTERFACE) |
|
215 |
self.Bind(wx.EVT_MENU, self.OnTaskBarLiveShell, id=self.TBMENU_LIVE_SHELL) |
|
216 |
self.Bind(wx.EVT_MENU, self.OnTaskBarWXInspector, id=self.TBMENU_WXINSPECTOR) |
|
217 |
self.Bind(wx.EVT_MENU, self.OnTaskBarChangePort, id=self.TBMENU_CHANGE_PORT) |
|
218 |
self.Bind(wx.EVT_MENU, self.OnTaskBarChangeWorkingDir, id=self.TBMENU_CHANGE_WD) |
|
219 |
self.Bind(wx.EVT_MENU, self.OnTaskBarQuit, id=self.TBMENU_QUIT) |
|
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
220 |
|
641 | 221 |
def CreatePopupMenu(self): |
222 |
""" |
|
223 |
This method is called by the base class when it needs to popup |
|
224 |
the menu for the default EVT_RIGHT_DOWN event. Just create |
|
225 |
the menu how you want it and return it from this function, |
|
226 |
the base class takes care of the rest. |
|
227 |
""" |
|
228 |
menu = wx.Menu() |
|
229 |
menu.Append(self.TBMENU_START, _("Start PLC")) |
|
230 |
menu.Append(self.TBMENU_STOP, _("Stop PLC")) |
|
835
8145be14a2ae
Fixed runtime GUI freeze when stopping PLC from the menu. Added -x 2 argument to Beremiz_service.py to restrict content of systray icon menu.
Edouard Tisserant
parents:
719
diff
changeset
|
231 |
if self.level==1: |
8145be14a2ae
Fixed runtime GUI freeze when stopping PLC from the menu. Added -x 2 argument to Beremiz_service.py to restrict content of systray icon menu.
Edouard Tisserant
parents:
719
diff
changeset
|
232 |
menu.AppendSeparator() |
8145be14a2ae
Fixed runtime GUI freeze when stopping PLC from the menu. Added -x 2 argument to Beremiz_service.py to restrict content of systray icon menu.
Edouard Tisserant
parents:
719
diff
changeset
|
233 |
menu.Append(self.TBMENU_CHANGE_NAME, _("Change Name")) |
8145be14a2ae
Fixed runtime GUI freeze when stopping PLC from the menu. Added -x 2 argument to Beremiz_service.py to restrict content of systray icon menu.
Edouard Tisserant
parents:
719
diff
changeset
|
234 |
menu.Append(self.TBMENU_CHANGE_INTERFACE, _("Change IP of interface to bind")) |
8145be14a2ae
Fixed runtime GUI freeze when stopping PLC from the menu. Added -x 2 argument to Beremiz_service.py to restrict content of systray icon menu.
Edouard Tisserant
parents:
719
diff
changeset
|
235 |
menu.Append(self.TBMENU_CHANGE_PORT, _("Change Port Number")) |
8145be14a2ae
Fixed runtime GUI freeze when stopping PLC from the menu. Added -x 2 argument to Beremiz_service.py to restrict content of systray icon menu.
Edouard Tisserant
parents:
719
diff
changeset
|
236 |
menu.Append(self.TBMENU_CHANGE_WD, _("Change working directory")) |
8145be14a2ae
Fixed runtime GUI freeze when stopping PLC from the menu. Added -x 2 argument to Beremiz_service.py to restrict content of systray icon menu.
Edouard Tisserant
parents:
719
diff
changeset
|
237 |
menu.AppendSeparator() |
8145be14a2ae
Fixed runtime GUI freeze when stopping PLC from the menu. Added -x 2 argument to Beremiz_service.py to restrict content of systray icon menu.
Edouard Tisserant
parents:
719
diff
changeset
|
238 |
menu.Append(self.TBMENU_LIVE_SHELL, _("Launch a live Python shell")) |
8145be14a2ae
Fixed runtime GUI freeze when stopping PLC from the menu. Added -x 2 argument to Beremiz_service.py to restrict content of systray icon menu.
Edouard Tisserant
parents:
719
diff
changeset
|
239 |
menu.Append(self.TBMENU_WXINSPECTOR, _("Launch WX GUI inspector")) |
641 | 240 |
menu.AppendSeparator() |
241 |
menu.Append(self.TBMENU_QUIT, _("Quit")) |
|
242 |
return menu |
|
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
243 |
|
641 | 244 |
def MakeIcon(self, img): |
245 |
""" |
|
246 |
The various platforms have different requirements for the |
|
247 |
icon size... |
|
248 |
""" |
|
249 |
if "wxMSW" in wx.PlatformInfo: |
|
250 |
img = img.Scale(16, 16) |
|
251 |
elif "wxGTK" in wx.PlatformInfo: |
|
252 |
img = img.Scale(22, 22) |
|
253 |
# wxMac can be any size upto 128x128, so leave the source img alone.... |
|
254 |
icon = wx.IconFromBitmap(img.ConvertToBitmap() ) |
|
255 |
return icon |
|
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
256 |
|
641 | 257 |
def OnTaskBarStartPLC(self, evt): |
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
258 |
if self.pyroserver.plcobj is not None: |
641 | 259 |
self.pyroserver.plcobj.StartPLC() |
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
260 |
|
641 | 261 |
def OnTaskBarStopPLC(self, evt): |
262 |
if self.pyroserver.plcobj is not None: |
|
835
8145be14a2ae
Fixed runtime GUI freeze when stopping PLC from the menu. Added -x 2 argument to Beremiz_service.py to restrict content of systray icon menu.
Edouard Tisserant
parents:
719
diff
changeset
|
263 |
Thread(target=self.pyroserver.plcobj.StopPLC).start() |
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
264 |
|
641 | 265 |
def OnTaskBarChangeInterface(self, evt): |
644
b511cab580eb
Better naming of IP address related variables in Beremiz_service.py, Ignore errors that occur on shutdown in Zeroconf.py, fixed discovery dialog crash due to asynchronous call from zeroconf
Edouard Tisserant
parents:
641
diff
changeset
|
266 |
dlg = ParamsEntryDialog(None, _("Enter the IP of the interface to bind"), defaultValue=self.pyroserver.ip_addr) |
641 | 267 |
dlg.SetTests([(re.compile('\d{1,3}(?:\.\d{1,3}){3}$').match, _("IP is not valid!")), |
644
b511cab580eb
Better naming of IP address related variables in Beremiz_service.py, Ignore errors that occur on shutdown in Zeroconf.py, fixed discovery dialog crash due to asynchronous call from zeroconf
Edouard Tisserant
parents:
641
diff
changeset
|
268 |
( lambda x :len([x for x in x.split(".") if 0 <= int(x) <= 255]) == 4, _("IP is not valid!")) |
641 | 269 |
]) |
270 |
if dlg.ShowModal() == wx.ID_OK: |
|
644
b511cab580eb
Better naming of IP address related variables in Beremiz_service.py, Ignore errors that occur on shutdown in Zeroconf.py, fixed discovery dialog crash due to asynchronous call from zeroconf
Edouard Tisserant
parents:
641
diff
changeset
|
271 |
self.pyroserver.ip_addr = dlg.GetValue() |
641 | 272 |
self.pyroserver.Stop() |
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
273 |
|
641 | 274 |
def OnTaskBarChangePort(self, evt): |
275 |
dlg = ParamsEntryDialog(None, _("Enter a port number "), defaultValue=str(self.pyroserver.port)) |
|
276 |
dlg.SetTests([(UnicodeType.isdigit, _("Port number must be an integer!")), (lambda port : 0 <= int(port) <= 65535 , _("Port number must be 0 <= port <= 65535!"))]) |
|
277 |
if dlg.ShowModal() == wx.ID_OK: |
|
278 |
self.pyroserver.port = int(dlg.GetValue()) |
|
279 |
self.pyroserver.Stop() |
|
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
280 |
|
641 | 281 |
def OnTaskBarChangeWorkingDir(self, evt): |
282 |
dlg = wx.DirDialog(None, _("Choose a working directory "), self.pyroserver.workdir, wx.DD_NEW_DIR_BUTTON) |
|
283 |
if dlg.ShowModal() == wx.ID_OK: |
|
284 |
self.pyroserver.workdir = dlg.GetPath() |
|
285 |
self.pyroserver.Stop() |
|
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
286 |
|
641 | 287 |
def OnTaskBarChangeName(self, evt): |
288 |
dlg = ParamsEntryDialog(None, _("Enter a name "), defaultValue=self.pyroserver.name) |
|
289 |
dlg.SetTests([(lambda name : len(name) is not 0 , _("Name must not be null!"))]) |
|
290 |
if dlg.ShowModal() == wx.ID_OK: |
|
291 |
self.pyroserver.name = dlg.GetValue() |
|
292 |
self.pyroserver.Restart() |
|
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
293 |
|
959
046aeae0d71c
Python shell and wx inspector now both available even when PLC not started
Edouard Tisserant
parents:
867
diff
changeset
|
294 |
def _LiveShellLocals(self): |
046aeae0d71c
Python shell and wx inspector now both available even when PLC not started
Edouard Tisserant
parents:
867
diff
changeset
|
295 |
if self.pyroserver.plcobj is not None: |
1049 | 296 |
return {"locals":self.pyroserver.plcobj.python_runtime_vars} |
959
046aeae0d71c
Python shell and wx inspector now both available even when PLC not started
Edouard Tisserant
parents:
867
diff
changeset
|
297 |
else: |
046aeae0d71c
Python shell and wx inspector now both available even when PLC not started
Edouard Tisserant
parents:
867
diff
changeset
|
298 |
return {} |
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
299 |
|
641 | 300 |
def OnTaskBarLiveShell(self, evt): |
959
046aeae0d71c
Python shell and wx inspector now both available even when PLC not started
Edouard Tisserant
parents:
867
diff
changeset
|
301 |
from wx import py |
046aeae0d71c
Python shell and wx inspector now both available even when PLC not started
Edouard Tisserant
parents:
867
diff
changeset
|
302 |
frame = py.crust.CrustFrame(**self._LiveShellLocals()) |
046aeae0d71c
Python shell and wx inspector now both available even when PLC not started
Edouard Tisserant
parents:
867
diff
changeset
|
303 |
frame.Show() |
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
304 |
|
641 | 305 |
def OnTaskBarWXInspector(self, evt): |
306 |
# Activate the widget inspection tool |
|
307 |
from wx.lib.inspection import InspectionTool |
|
308 |
if not InspectionTool().initialized: |
|
959
046aeae0d71c
Python shell and wx inspector now both available even when PLC not started
Edouard Tisserant
parents:
867
diff
changeset
|
309 |
InspectionTool().Init(**self._LiveShellLocals()) |
046aeae0d71c
Python shell and wx inspector now both available even when PLC not started
Edouard Tisserant
parents:
867
diff
changeset
|
310 |
|
046aeae0d71c
Python shell and wx inspector now both available even when PLC not started
Edouard Tisserant
parents:
867
diff
changeset
|
311 |
wnd = wx.GetApp() |
641 | 312 |
InspectionTool().Show(wnd, True) |
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
313 |
|
641 | 314 |
def OnTaskBarQuit(self, evt): |
1121
d3838e8f1b90
Fixed Beremiz_service not closing on Windows
Laurent Bessard
parents:
1067
diff
changeset
|
315 |
if wx.Platform == '__WXMSW__': |
d3838e8f1b90
Fixed Beremiz_service not closing on Windows
Laurent Bessard
parents:
1067
diff
changeset
|
316 |
Thread(target=self.pyroserver.Quit).start() |
641 | 317 |
self.RemoveIcon() |
1121
d3838e8f1b90
Fixed Beremiz_service not closing on Windows
Laurent Bessard
parents:
1067
diff
changeset
|
318 |
wx.CallAfter(wx.GetApp().ExitMainLoop) |
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
319 |
|
641 | 320 |
def UpdateIcon(self, plcstatus): |
321 |
if plcstatus is "Started" : |
|
1067
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
322 |
currenticon = self.MakeIcon(starticon) |
641 | 323 |
elif plcstatus is "Stopped": |
1067
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
324 |
currenticon = self.MakeIcon(stopicon) |
641 | 325 |
else: |
1067
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
326 |
currenticon = self.MakeIcon(defaulticon) |
641 | 327 |
self.SetIcon(currenticon, "Beremiz Service") |
328 |
||
329 |
from runtime import PLCObject, PLCprint, ServicePublisher |
|
330 |
import Pyro.core as pyro |
|
331 |
||
332 |
if not os.path.isdir(WorkingDir): |
|
333 |
os.mkdir(WorkingDir) |
|
334 |
||
867
06495975e8a4
Added caching for python eval (avoid compiling when same code called, but still execute). Cleaned up some evaluator related code.
Edouard Tisserant
parents:
850
diff
changeset
|
335 |
def default_evaluator(tocall, *args, **kwargs): |
06495975e8a4
Added caching for python eval (avoid compiling when same code called, but still execute). Cleaned up some evaluator related code.
Edouard Tisserant
parents:
850
diff
changeset
|
336 |
try: |
06495975e8a4
Added caching for python eval (avoid compiling when same code called, but still execute). Cleaned up some evaluator related code.
Edouard Tisserant
parents:
850
diff
changeset
|
337 |
res=(tocall(*args,**kwargs), None) |
1051
847d68c3e7ff
Extended exception info from evaluator. Problems in python runtime init/cleanup code now more readable
Edouard Tisserant
parents:
1049
diff
changeset
|
338 |
except Exception: |
847d68c3e7ff
Extended exception info from evaluator. Problems in python runtime init/cleanup code now more readable
Edouard Tisserant
parents:
1049
diff
changeset
|
339 |
res=(None, sys.exc_info()) |
867
06495975e8a4
Added caching for python eval (avoid compiling when same code called, but still execute). Cleaned up some evaluator related code.
Edouard Tisserant
parents:
850
diff
changeset
|
340 |
return res |
641 | 341 |
|
342 |
class Server(): |
|
1438
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
343 |
def __init__(self, servicename, ip_addr, port, |
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
344 |
workdir, argv, autostart=False, |
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
345 |
statuschange=None, evaluator=default_evaluator, |
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
346 |
website=None): |
641 | 347 |
self.continueloop = True |
348 |
self.daemon = None |
|
349 |
self.servicename = servicename |
|
644
b511cab580eb
Better naming of IP address related variables in Beremiz_service.py, Ignore errors that occur on shutdown in Zeroconf.py, fixed discovery dialog crash due to asynchronous call from zeroconf
Edouard Tisserant
parents:
641
diff
changeset
|
350 |
self.ip_addr = ip_addr |
641 | 351 |
self.port = port |
352 |
self.workdir = workdir |
|
353 |
self.argv = argv |
|
354 |
self.plcobj = None |
|
355 |
self.servicepublisher = None |
|
356 |
self.autostart = autostart |
|
357 |
self.statuschange = statuschange |
|
358 |
self.evaluator = evaluator |
|
359 |
self.website = website |
|
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
360 |
|
641 | 361 |
def Loop(self): |
362 |
while self.continueloop: |
|
363 |
self.Start() |
|
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
364 |
|
641 | 365 |
def Restart(self): |
366 |
self.Stop() |
|
367 |
||
368 |
def Quit(self): |
|
369 |
self.continueloop = False |
|
1045
a220a27defe5
Runtime now unloads and cleanup PLC before exit (created threads was preventing exit)
Edouard Tisserant
parents:
1034
diff
changeset
|
370 |
if self.plcobj is not None: |
a220a27defe5
Runtime now unloads and cleanup PLC before exit (created threads was preventing exit)
Edouard Tisserant
parents:
1034
diff
changeset
|
371 |
self.plcobj.UnLoadPLC() |
641 | 372 |
self.Stop() |
373 |
||
374 |
def Start(self): |
|
375 |
pyro.initServer() |
|
644
b511cab580eb
Better naming of IP address related variables in Beremiz_service.py, Ignore errors that occur on shutdown in Zeroconf.py, fixed discovery dialog crash due to asynchronous call from zeroconf
Edouard Tisserant
parents:
641
diff
changeset
|
376 |
self.daemon=pyro.Daemon(host=self.ip_addr, port=self.port) |
1438
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
377 |
self.plcobj = PLCObject(self.workdir, self.daemon, self.argv, |
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
378 |
self.statuschange, self.evaluator, |
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
379 |
self.website) |
641 | 380 |
uri = self.daemon.connect(self.plcobj,"PLCObject") |
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
381 |
|
641 | 382 |
print "Pyro port :",self.port |
383 |
print "Pyro object's uri :",uri |
|
384 |
print "Current working directory :",self.workdir |
|
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
385 |
|
641 | 386 |
# Configure and publish service |
387 |
# Not publish service if localhost in address params |
|
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
388 |
if (self.servicename is not None and |
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
389 |
self.ip_addr is not None and |
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
390 |
self.ip_addr != "localhost" and |
648
73295e742da2
Avoid starting Zeroconf if ip unspecified or set to localhost. Pick one interface address when given IP is 0.0.0.0
Edouard Tisserant
parents:
644
diff
changeset
|
391 |
self.ip_addr != "127.0.0.1"): |
641 | 392 |
print "Publishing service on local network" |
393 |
self.servicepublisher = ServicePublisher.ServicePublisher() |
|
644
b511cab580eb
Better naming of IP address related variables in Beremiz_service.py, Ignore errors that occur on shutdown in Zeroconf.py, fixed discovery dialog crash due to asynchronous call from zeroconf
Edouard Tisserant
parents:
641
diff
changeset
|
394 |
self.servicepublisher.RegisterService(self.servicename, self.ip_addr, self.port) |
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
395 |
|
1034
078bf153fb8c
Fix bug when launching Beremiz_service with autostart option and working dir doesn't contain any program
Laurent Bessard
parents:
1027
diff
changeset
|
396 |
if self.autostart and self.plcobj.GetPLCstatus()[0] != "Empty": |
641 | 397 |
self.plcobj.StartPLC() |
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
398 |
|
641 | 399 |
sys.stdout.flush() |
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
400 |
|
641 | 401 |
self.daemon.requestLoop() |
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
402 |
|
641 | 403 |
def Stop(self): |
1045
a220a27defe5
Runtime now unloads and cleanup PLC before exit (created threads was preventing exit)
Edouard Tisserant
parents:
1034
diff
changeset
|
404 |
if self.plcobj is not None: |
a220a27defe5
Runtime now unloads and cleanup PLC before exit (created threads was preventing exit)
Edouard Tisserant
parents:
1034
diff
changeset
|
405 |
self.plcobj.StopPLC() |
641 | 406 |
if self.servicepublisher is not None: |
407 |
self.servicepublisher.UnRegisterService() |
|
408 |
self.servicepublisher = None |
|
409 |
self.daemon.shutdown(True) |
|
410 |
||
411 |
if enabletwisted: |
|
412 |
import warnings |
|
413 |
with warnings.catch_warnings(): |
|
414 |
warnings.simplefilter("ignore") |
|
415 |
try: |
|
416 |
from threading import Thread, currentThread |
|
417 |
if havewx: |
|
418 |
from twisted.internet import wxreactor |
|
419 |
wxreactor.install() |
|
1438
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
420 |
from twisted.internet import reactor |
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
421 |
|
641 | 422 |
havetwisted = True |
423 |
except: |
|
1438
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
424 |
print "Twisted unavailable." |
641 | 425 |
havetwisted = False |
426 |
||
1438
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
427 |
pyruntimevars = {} |
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
428 |
statuschange = [] |
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
429 |
registerserverto = [] |
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
430 |
|
641 | 431 |
if havetwisted: |
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
432 |
|
641 | 433 |
if havewx: |
434 |
reactor.registerWxApp(app) |
|
1438
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
435 |
|
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
436 |
# TODO add command line switch |
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
437 |
try: |
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
438 |
import runtime.NevowServer as NS |
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
439 |
website = NS.RegisterWebsite(reactor) |
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
440 |
pyruntimevars["website"] = website |
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
441 |
statuschange.append(NS.website_statuslistener_factory(website)) |
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
442 |
except: |
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
443 |
print "Nevow Web service failed." |
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
444 |
|
641 | 445 |
|
446 |
if havewx: |
|
447 |
from threading import Semaphore |
|
448 |
wx_eval_lock = Semaphore(0) |
|
867
06495975e8a4
Added caching for python eval (avoid compiling when same code called, but still execute). Cleaned up some evaluator related code.
Edouard Tisserant
parents:
850
diff
changeset
|
449 |
main_thread = currentThread() |
835
8145be14a2ae
Fixed runtime GUI freeze when stopping PLC from the menu. Added -x 2 argument to Beremiz_service.py to restrict content of systray icon menu.
Edouard Tisserant
parents:
719
diff
changeset
|
450 |
|
1438
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
451 |
def statuschangeTskBar(status): |
641 | 452 |
wx.CallAfter(taskbar_instance.UpdateIcon,status) |
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
453 |
|
1438
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
454 |
statuschange.append(statuschangeTskBar) |
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
455 |
|
867
06495975e8a4
Added caching for python eval (avoid compiling when same code called, but still execute). Cleaned up some evaluator related code.
Edouard Tisserant
parents:
850
diff
changeset
|
456 |
def wx_evaluator(obj, *args, **kwargs): |
06495975e8a4
Added caching for python eval (avoid compiling when same code called, but still execute). Cleaned up some evaluator related code.
Edouard Tisserant
parents:
850
diff
changeset
|
457 |
tocall,args,kwargs = obj.call |
06495975e8a4
Added caching for python eval (avoid compiling when same code called, but still execute). Cleaned up some evaluator related code.
Edouard Tisserant
parents:
850
diff
changeset
|
458 |
obj.res = default_evaluator(tocall, *args, **kwargs) |
06495975e8a4
Added caching for python eval (avoid compiling when same code called, but still execute). Cleaned up some evaluator related code.
Edouard Tisserant
parents:
850
diff
changeset
|
459 |
wx_eval_lock.release() |
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
460 |
|
867
06495975e8a4
Added caching for python eval (avoid compiling when same code called, but still execute). Cleaned up some evaluator related code.
Edouard Tisserant
parents:
850
diff
changeset
|
461 |
def evaluator(tocall, *args, **kwargs): |
06495975e8a4
Added caching for python eval (avoid compiling when same code called, but still execute). Cleaned up some evaluator related code.
Edouard Tisserant
parents:
850
diff
changeset
|
462 |
global main_thread |
06495975e8a4
Added caching for python eval (avoid compiling when same code called, but still execute). Cleaned up some evaluator related code.
Edouard Tisserant
parents:
850
diff
changeset
|
463 |
if(main_thread == currentThread()): |
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
464 |
# avoid dead lock if called from the wx mainloop |
867
06495975e8a4
Added caching for python eval (avoid compiling when same code called, but still execute). Cleaned up some evaluator related code.
Edouard Tisserant
parents:
850
diff
changeset
|
465 |
return default_evaluator(tocall, *args, **kwargs) |
641 | 466 |
else: |
867
06495975e8a4
Added caching for python eval (avoid compiling when same code called, but still execute). Cleaned up some evaluator related code.
Edouard Tisserant
parents:
850
diff
changeset
|
467 |
o=type('',(object,),dict(call=(tocall, args, kwargs), res=None)) |
06495975e8a4
Added caching for python eval (avoid compiling when same code called, but still execute). Cleaned up some evaluator related code.
Edouard Tisserant
parents:
850
diff
changeset
|
468 |
wx.CallAfter(wx_evaluator,o) |
641 | 469 |
wx_eval_lock.acquire() |
867
06495975e8a4
Added caching for python eval (avoid compiling when same code called, but still execute). Cleaned up some evaluator related code.
Edouard Tisserant
parents:
850
diff
changeset
|
470 |
return o.res |
1434
6e0cd0ceabb7
Added runtime side trace buffer, handled in a separate thread, limited to 1MB, and dropped after 3 seconds if not used by IDE. GetTraceVariables is not anymore blocking on next PLC cycle
Edouard Tisserant
parents:
1270
diff
changeset
|
471 |
|
1438
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
472 |
pyroserver = Server(servicename, given_ip, port, |
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
473 |
WorkingDir, argv, autostart, |
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
474 |
statuschange, evaluator, pyruntimevars) |
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
475 |
|
835
8145be14a2ae
Fixed runtime GUI freeze when stopping PLC from the menu. Added -x 2 argument to Beremiz_service.py to restrict content of systray icon menu.
Edouard Tisserant
parents:
719
diff
changeset
|
476 |
taskbar_instance = BeremizTaskBarIcon(pyroserver, enablewx) |
641 | 477 |
else: |
1438
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
478 |
pyroserver = Server(servicename, given_ip, port, |
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
479 |
WorkingDir, argv, autostart, |
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
480 |
statuschange, pyruntimevars=pyruntimevars) |
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
481 |
|
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
482 |
for registrar in registerserverto : |
19ebe96b41c0
Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
1437
diff
changeset
|
483 |
registrar(pyroserver) |
641 | 484 |
|
1067
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
485 |
# Exception hooks s |
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
486 |
import threading, traceback |
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
487 |
def LogException(*exp): |
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
488 |
if pyroserver.plcobj is not None: |
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
489 |
pyroserver.plcobj.LogMessage(0,'\n'.join(traceback.format_exception(*exp))) |
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
490 |
else: |
1270 | 491 |
traceback.print_exception(*exp) |
1067
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
492 |
|
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
493 |
sys.excepthook = LogException |
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
494 |
def installThreadExcepthook(): |
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
495 |
init_old = threading.Thread.__init__ |
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
496 |
def init(self, *args, **kwargs): |
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
497 |
init_old(self, *args, **kwargs) |
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
498 |
run_old = self.run |
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
499 |
def run_with_except_hook(*args, **kw): |
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
500 |
try: |
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
501 |
run_old(*args, **kw) |
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
502 |
except (KeyboardInterrupt, SystemExit): |
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
503 |
raise |
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
504 |
except: |
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
505 |
sys.excepthook(*sys.exc_info()) |
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
506 |
self.run = run_with_except_hook |
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
507 |
threading.Thread.__init__ = init |
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
508 |
installThreadExcepthook() |
4f460c1dffb5
Added exception hook to Beremiz_service, so that exception go in PLC log. Extended Beremiz.py exception hook to threads. Stripped images embedded in Beremiz_service.py, user real images instead.
Edouard Tisserant
parents:
1051
diff
changeset
|
509 |
|
1437
04177743b066
Added Beremiz_service.py command line switch to load python extention for runtime independently from PLC program
Edouard Tisserant
parents:
1434
diff
changeset
|
510 |
# Load extensions |
04177743b066
Added Beremiz_service.py command line switch to load python extention for runtime independently from PLC program
Edouard Tisserant
parents:
1434
diff
changeset
|
511 |
for extfilename in extensions: |
04177743b066
Added Beremiz_service.py command line switch to load python extention for runtime independently from PLC program
Edouard Tisserant
parents:
1434
diff
changeset
|
512 |
extension_folder = os.path.split(os.path.realpath(extfilename))[0] |
04177743b066
Added Beremiz_service.py command line switch to load python extention for runtime independently from PLC program
Edouard Tisserant
parents:
1434
diff
changeset
|
513 |
sys.path.append(extension_folder) |
04177743b066
Added Beremiz_service.py command line switch to load python extention for runtime independently from PLC program
Edouard Tisserant
parents:
1434
diff
changeset
|
514 |
execfile(extfilename, locals()) |
04177743b066
Added Beremiz_service.py command line switch to load python extention for runtime independently from PLC program
Edouard Tisserant
parents:
1434
diff
changeset
|
515 |
|
641 | 516 |
if havetwisted or havewx: |
517 |
pyro_thread=Thread(target=pyroserver.Loop) |
|
518 |
pyro_thread.start() |
|
519 |
||
520 |
if havetwisted: |
|
521 |
reactor.run() |
|
522 |
elif havewx: |
|
523 |
app.MainLoop() |
|
524 |
else: |
|
525 |
try : |
|
526 |
pyroserver.Loop() |
|
527 |
except KeyboardInterrupt,e: |
|
528 |
pass |
|
529 |
pyroserver.Quit() |
|
530 |
sys.exit(0) |