1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
# -*- coding: utf-8 -*-
#
# AWL simulator - Exceptions
#
# Copyright 2012-2013 Michael Buesch <m@bues.ch>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
from awlsim.enumeration import *
class AwlSimError(Exception):
def __init__(self, message, cpu=None,
rawInsn=None, insn=None, lineNr=None):
Exception.__init__(self, message)
self.cpu = cpu
self.rawInsn = rawInsn
self.insn = insn
self.lineNr = lineNr
def setCpu(self, cpu):
self.cpu = cpu
def getCpu(self):
return self.cpu
def setRawInsn(self, rawInsn):
self.rawInsn = rawInsn
def getRawInsn(self):
return self.rawInsn
def setInsn(self, insn):
self.insn = insn
def getInsn(self):
return self.insn
def setLineNr(self, lineNr):
self.lineNr = lineNr
# Try to get the AWL-code line number where the
# exception occurred. Returns None on failure.
def getLineNr(self):
if self.lineNr is not None:
return self.lineNr
if self.rawInsn:
return self.rawInsn.getLineNr()
if self.insn:
return self.insn.getLineNr()
if self.cpu:
curInsn = self.cpu.getCurrentInsn()
if curInsn:
return curInsn.getLineNr()
return None
def getLineNrStr(self, errorStr="<unknown>"):
lineNr = self.getLineNr()
if lineNr is not None:
return "%d" % lineNr
return errorStr
def getFailingInsnStr(self, errorStr=""):
if self.rawInsn:
return str(self.rawInsn)
if self.insn:
return str(self.insn)
if self.cpu:
curInsn = self.cpu.getCurrentInsn()
if curInsn:
return str(curInsn)
return errorStr
def doGetReport(self, title):
ret = [ "-- %s --\n" % title ]
ret.append("ERROR at line %s:\n" % self.getLineNrStr())
ret.append(" \n%s\n" % str(self))
cpu = self.getCpu()
if cpu:
ret.append("\n%s\n" % str(cpu))
return "".join(ret)
def getReport(self):
return self.doGetReport("AWL simulator error")
class AwlParserError(AwlSimError):
def __init__(self, message, lineNr=None):
AwlSimError.__init__(self,
message = message,
lineNr = lineNr)
def getReport(self):
return self.doGetReport("AWL parser error")
class AwlSimErrorText(AwlSimError):
def __init__(self, errorText):
AwlSimError.__init__(self, message = errorText)
def getReport(self):
return str(self)
class MaintenanceRequest(Exception):
enum.start
# Soft-reboot request, handled by the simulator core.
# On soft-reboot, the upstart-OBs are executed.
# Memory is not cleared.
TYPE_SOFTREBOOT = enum.item
# Regular-shutdown request, handled by toplevel simulator.
# This exception is handed up to the toplevel loop.
TYPE_SHUTDOWN = enum.item
enum.end
def __init__(self, requestType, message=""):
Exception.__init__(self, message)
self.requestType = requestType
|