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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
from time import time
"""Error tree module
"""
# Exception hierarchy
class VSError(Exception):
"""StitchingBox Error Base class
Args:
expr(string): Context or expression where the error occurred.
msg(string): Explanation of the error.
Exceptions tree::
VSError
- InternalError
- FatalError
- APIError
- InvalidParameter
- MissingParameter
- InvalidMessageFormat
- ConfigurationError
- LogError
- LogBackupNoSpace
- LogBackupNoDrive
- LogBackupCopyError
- OutputError
- OutputAlreadyStarted
- OutputAlreadyStopped
- MultipleOutputsForbidden
- RecordingError
- RecordingPathInvalid
- RecordingDriveUnplugged
- RecordingDriveFull
- StreamingError
- StreamingInvalidURL
- StreamingAuthFailed
- StreamingConnectionLost
- StitcherError
- StitcherVideoModeInvalidError
- StitcherVideoModeUnsupportedError
- StitcherVideoModeChangeForbiddenError
- StitcherCannotBeStarted
- StitcherCannotBeStopped
- StitcherNotStarted
- AudioError
- AudioInvalidSourceError
- AudioSourceChangeForbiddenError
- PresetsError
- PresetAlreadyCreated
- PresetDoesNotExist
- PresetInvalidName
- PresetCannotBeDeleted
- AlgorithmError
- AlgorithmRunningError
- CameraError
- CameraDisconnected
- CameraVideoFail
- SocialError
- WebsocketError (only for debug)
- AlreadyConnected
- NotConnected
- CannotConnect
- InvalidParameter
- SystemError
- WifiError
- BadPassword
- InternalError
"""
id = 0
def __init__(self, msg=""):
Exception.__init__(self)
self.payload = {'message': msg,
'code': self.__class__.__name__,
'time': int(time()),
'id': VSError.id}
VSError.id += 1
#
class InternalError(VSError):
"""Some other event that cannot be handled from the client side.
"""
class FatalError(VSError):
"""This error depicts the worst case and should block the rest of the
execustion requested by the client.
"""
#
class APIError(VSError):
"""This describes possible API calls errors.
"""
class InvalidParameter(APIError):
"""The parameter/s of the API call is not the expected one. (Type)
"""
class MissingParameter(APIError):
"""Missing parameter in the API call.
"""
class InvalidMessageFormat(APIError):
"""The JSON message is not valid. (Syntax error)
"""
class InvalidReturnValue(APIError):
"""Missing parameter in the API call.
"""
#
class ConfigurationError(VSError):
"""Error related with the project configuration.
"""
#
class LogError(VSError):
"""Error related with the Box error management
"""
class LogBackupNoSpace(LogError):
"""The backup unit for the log copy has not enough space
"""
class LogBackupNoDrive(LogError):
"""The destination drive for the log backup is not available.
"""
class LogBackupCopyError(LogError):
"""Error during log backup
"""
#
class OutputError(VSError):
"""Generic output error
"""
class OutputAlreadyStarted(OutputError):
"""The output is already started.
"""
class OutputAlreadyStopped(OutputError):
"""The output is already stopped.
"""
class MultipleOutputsForbidden(OutputError):
"""The output cannot be started as another one is already started
"""
class RecordingError(OutputError):
"""Errors related with the recording feature.
"""
class RecordingPathInvalid(RecordingError):
"""The path of recording is not valid in the server.
"""
class RecordingDriveUnplugged(RecordingError):
"""The recording drive is not valid anymore.
For example: SDCARD extracted during recording.
"""
class RecordingDriveFull(RecordingError):
"""The recording drive has no more space available.
"""
#
class StreamingError(OutputError):
"""Errors related with the streaming.
"""
class StreamingInvalidURL(StreamingError):
"""The streaming URL is not valid. (Server responding 404)
"""
class StreamingAuthFailed(StreamingError):
"""The credentials provided to login are not valid.
"""
class StreamingConnectionLost(StreamingError):
"""The connection to the server is lost.
"""
#
class StitcherError(VSError):
"""Errors comming from the stitching process.
"""
class StitcherVideoModeInvalidError(StitcherError):
""" A video mode cannot be applied to the stitcher because it is invalid
"""
class StitcherVideoModeUnsupportedError(StitcherError):
""" A video mode cannot be applied to the stitcher because it is not supported
"""
class StitcherVideoModeChangeForbiddenError(StitcherError):
""" The current video mode cannot be changed because server is currently streaming or recording
"""
class StitcherCannotBeStarted(StitcherError):
""" The stitching can't be started.
"""
class StitcherCannotBeStopped(StitcherError):
"""The stitching can't be stopped.
"""
class StitcherNotStarted(StitcherError):
"""The stitcher cannot start (libvideostitch error)
"""
#
class AudioError(VSError):
"""Errors related to audio
"""
class AudioInvalidSourceError(AudioError):
""" The specified audio source is not valid
"""
class AudioSourceChangeForbiddenError(AudioError):
""" Audio source cannot be changed while streaming or recording is ongoing
"""
class AudioDelaySourceError(AudioError):
""" The specified audio source has not an adjustable delay
"""
class AudioInvalidDelayValueError(AudioError):
""" The delay value is out of acceptable range
"""
#
class PresetError(VSError):
"""Preset errors
"""
def __init__(self, msg=""):
VSError.__init__(self, msg)
class PresetDoesNotExist(PresetError):
"""Cannot find preset for removing it
"""
class PresetAlreadyCreated(PresetError):
"""Preset name already exists
"""
class PresetInvalidName(PresetError):
"""Preset name not valid
"""
#
class PresetCannotBeDeleted(PresetError):
"""This preset cannot be deleted
"""
#
class CameraError(VSError):
"""Camera errors
"""
class CameraIsNotConnected(CameraError):
"""Trying to do something while camera is disconnected
"""
class CameraVideoFail(CameraError):
"""The camera indicated a video fail
"""
class CameraInvalidCalibration(CameraError):
"""The calibration is not valid
"""
def __init__(self, msg, calibrationFile):
CameraError.__init__(self, msg)
self.payload['file'] = calibrationFile
#
class SocialError(VSError):
"""social networks related errors
"""
#
class WebSocketError(VSError):
"""Websockets errors
"""
class AlreadyConnected(WebSocketError):
"""The socket is already connected
"""
class NotConnected(WebSocketError):
"""The socket is not connected
"""
class CannotConnect(WebSocketError):
"""Cannot connect to server
"""
class InvalidParameter(WebSocketError):
"""The message has invalid / missing paramters
"""
class AlgorithmError(VSError):
"""Generic Algorithm Error"""
class AlgorithmRunningError(AlgorithmError):
"""Error while running the algorithm"""
class FirmwareError(VSError):
"""Generic Firmware Error"""
class FirmwareUpdateNotAvailable(FirmwareError):
"""Cannot update firmware at this time"""
class FirmwareUpdateFailed(FirmwareError):
"""Firmware update failed"""
class InternalFirmwareError(FirmwareError):
"""Internal error while updating firmware"""
class ParserError(VSError):
"""Generic Parser Error"""
class ParserFileNotFound(ParserError):
"""Parser could not find the file"""
class SystemError(VSError):
"""Generic system conf error
"""
class WifiError(SystemError):
"""The wifi management failed.
"""
class WrongWifiPassword(WifiError):
"""The user provided password doesn't match the system one.
"""
class InternalWifiError(WifiError):
"""Something went wrong during config modification.
"""