Total Complexity | 10 |
Total Lines | 57 |
Duplicated Lines | 0 % |
Changes | 0 |
1 | """ |
||
2 | * PyDMXControl: A Python 3 module to control DMX via Python. Featuring fixture profiles and working with uDMX. |
||
3 | * <https://github.com/MattIPv4/PyDMXControl/> |
||
4 | * Copyright (C) 2018 Matt Cowley (MattIPv4) ([email protected]) |
||
5 | """ |
||
6 | |||
7 | from pyudmx import pyudmx |
||
8 | |||
9 | from ._transmittingController import transmittingController |
||
10 | |||
11 | |||
12 | class uDMXController(transmittingController): |
||
13 | |||
14 | def __init__(self, *args, **kwargs): |
||
15 | self.udmx = None |
||
16 | self.__connect() |
||
17 | |||
18 | super().__init__(*args, **kwargs) |
||
19 | |||
20 | def close(self): |
||
21 | # uDMX |
||
22 | self.udmx.close() |
||
23 | print("CLOSE: uDMX closed") |
||
24 | |||
25 | # Parent |
||
26 | super().close() |
||
27 | |||
28 | def __connect(self): |
||
29 | # Try to close if exists |
||
30 | if self.udmx is not None: |
||
31 | try: |
||
32 | self.udmx.close() |
||
33 | except Exception: |
||
34 | pass |
||
35 | # Get new device |
||
36 | self.udmx = pyudmx.uDMXDevice() |
||
37 | self.udmx.open() |
||
38 | |||
39 | def _send_data(self): |
||
40 | # Get the data |
||
41 | data = self.get_frame() |
||
42 | |||
43 | # Attempt to send data max 5 times, then 2 more with reconnect to device |
||
44 | # Thanks to Dave Hocker (pyudmx author) for giving me this solution to the random usb errors |
||
45 | success = False |
||
46 | retry_count = 0 |
||
47 | while not success: |
||
48 | try: |
||
49 | if retry_count > 5: |
||
50 | self.__connect() |
||
51 | self.udmx.send_multi_value(1, data) |
||
52 | success = True |
||
53 | except Exception as e: |
||
54 | retry_count += 1 |
||
55 | if retry_count > 7: |
||
56 | raise e |
||
57 |