MultiPyVu 3.1.2__tar.gz → 3.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {multipyvu-3.1.2/src/MultiPyVu.egg-info → multipyvu-3.3.0}/PKG-INFO +13 -1
- {multipyvu-3.1.2 → multipyvu-3.3.0}/README.md +12 -0
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/BRT.py +1 -1
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/CommandChamber.py +5 -9
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/CommandField.py +5 -9
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/CommandMultiVu.py +5 -6
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/CommandSdo.py +13 -19
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/CommandTemperature.py +5 -9
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/CommandWaitFor.py +10 -16
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/Command_factory.py +3 -3
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/ICommand.py +10 -10
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/IServer.py +1 -1
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/MultiVuClient.py +14 -21
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/MultiVuClient_base.py +9 -18
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/MultiVuDataFile/MultiVuDataFile.py +6 -5
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/MultiVuServer.py +17 -24
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/ParseInputs.py +3 -5
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/SocketMessage.py +27 -13
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/SocketMessageClient.py +5 -8
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/__init__.py +18 -13
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/__main__.py +1 -1
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/__version.py +1 -1
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/exceptions.py +1 -1
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/generate_sdo_objects.py +1 -1
- multipyvu-3.3.0/src/MultiPyVu/gui/__init__.py +0 -0
- multipyvu-3.3.0/src/MultiPyVu/images/__init__.py +0 -0
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/instrument.py +26 -26
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/logging_config.py +6 -1
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/logging_config.yaml +2 -1
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/project_vars.py +2 -3
- multipyvu-3.3.0/src/MultiPyVu/scripts/__init__.py +0 -0
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/scripts/helper_scripts.py +2 -2
- {multipyvu-3.1.2 → multipyvu-3.3.0/src/MultiPyVu.egg-info}/PKG-INFO +13 -1
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu.egg-info/SOURCES.txt +3 -0
- {multipyvu-3.1.2 → multipyvu-3.3.0}/LICENSE +0 -0
- {multipyvu-3.1.2 → multipyvu-3.3.0}/pyproject.toml +0 -0
- {multipyvu-3.1.2 → multipyvu-3.3.0}/setup.cfg +0 -0
- {multipyvu-3.1.2 → multipyvu-3.3.0}/setup.py +0 -0
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/IEventManager.py +0 -0
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/MultiVuDataFile/__init__.py +0 -0
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/MultiVuDataFile/__version.py +0 -0
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/MultiVuDataFile/is_pathname_valid.py +0 -0
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/SocketMessageServer.py +10 -10
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/check_windows_esc.py +0 -0
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/font/Play-Bold.ttf +0 -0
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/font/Play-Regular.ttf +0 -0
- {multipyvu-3.1.2/src/MultiPyVu/gui → multipyvu-3.3.0/src/MultiPyVu/font}/__init__.py +0 -0
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/gui/Controller.py +7 -7
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/gui/IController.py +0 -0
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/gui/IView.py +0 -0
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/gui/ViewFactory.py +0 -0
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/gui/ViewTk.py +3 -3
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/images/Q.png +0 -0
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/images/QD_logo.jpg +0 -0
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/scripts/whats_my_ip_address.cmd +0 -0
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/sdo_object.py +0 -0
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu.egg-info/dependency_links.txt +0 -0
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu.egg-info/requires.txt +0 -0
- {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: MultiPyVu
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.3.0
|
|
4
4
|
Summary: Control MultiVu using Python
|
|
5
5
|
Author-email: Damon D Jackson <djackson@qdusa.com>
|
|
6
6
|
Maintainer-email: "Quantum Design, Inc." <apps@qdusa.com>
|
|
@@ -435,6 +435,18 @@ client = mpv.Client(port=6000)
|
|
|
435
435
|
- A log file named QdMultiVu.log shows the traffic between the server and client which can also be useful during troubleshooting.
|
|
436
436
|
|
|
437
437
|
## Changelog<a class="anchor" id="changelog"></a>
|
|
438
|
+
**3.3.0**
|
|
439
|
+
- April 2025
|
|
440
|
+
- Bugfix which didn't allow this to be run on Mac or Linux platforms.
|
|
441
|
+
- Refactored mpv.DataFile() so that if a script is saving data to a file,
|
|
442
|
+
it can later load the file into a Pandas Dataframe without specifying the
|
|
443
|
+
filename. This means the file path is now optional in
|
|
444
|
+
.parse_MVu_data_file().
|
|
445
|
+
|
|
446
|
+
**3.2.0**
|
|
447
|
+
- November 2024
|
|
448
|
+
- Improvements in determining the running version of MultiVu.
|
|
449
|
+
|
|
438
450
|
**3.1.2**
|
|
439
451
|
- October 2024
|
|
440
452
|
- Fixed a bug which truncated numbers
|
|
@@ -390,6 +390,18 @@ client = mpv.Client(port=6000)
|
|
|
390
390
|
- A log file named QdMultiVu.log shows the traffic between the server and client which can also be useful during troubleshooting.
|
|
391
391
|
|
|
392
392
|
## Changelog<a class="anchor" id="changelog"></a>
|
|
393
|
+
**3.3.0**
|
|
394
|
+
- April 2025
|
|
395
|
+
- Bugfix which didn't allow this to be run on Mac or Linux platforms.
|
|
396
|
+
- Refactored mpv.DataFile() so that if a script is saving data to a file,
|
|
397
|
+
it can later load the file into a Pandas Dataframe without specifying the
|
|
398
|
+
filename. This means the file path is now optional in
|
|
399
|
+
.parse_MVu_data_file().
|
|
400
|
+
|
|
401
|
+
**3.2.0**
|
|
402
|
+
- November 2024
|
|
403
|
+
- Improvements in determining the running version of MultiVu.
|
|
404
|
+
|
|
393
405
|
**3.1.2**
|
|
394
406
|
- October 2024
|
|
395
407
|
- Fixed a bug which truncated numbers
|
|
@@ -9,16 +9,12 @@ Created on Tue May 18 13:14:28 2021
|
|
|
9
9
|
|
|
10
10
|
from abc import abstractmethod
|
|
11
11
|
from enum import IntEnum
|
|
12
|
-
from typing import
|
|
13
|
-
|
|
14
|
-
from .ICommand import (ICommand,
|
|
15
|
-
ICommandImp,
|
|
16
|
-
ISimulateChange,
|
|
17
|
-
ICommandObserverSim,
|
|
18
|
-
catch_thread_error,
|
|
19
|
-
)
|
|
20
|
-
from .IEventManager import IObserver
|
|
12
|
+
from typing import Dict, List, Tuple, Union
|
|
13
|
+
|
|
21
14
|
from .exceptions import MultiPyVuError
|
|
15
|
+
from .ICommand import (ICommand, ICommandImp, ICommandObserverSim,
|
|
16
|
+
ISimulateChange, catch_thread_error)
|
|
17
|
+
from .IEventManager import IObserver
|
|
22
18
|
|
|
23
19
|
|
|
24
20
|
class modeEnum(IntEnum):
|
|
@@ -8,20 +8,16 @@ Created on Tue May 18 13:14:28 2021
|
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
10
|
import time
|
|
11
|
-
from enum import IntEnum
|
|
12
11
|
from abc import abstractmethod
|
|
13
|
-
from
|
|
12
|
+
from enum import IntEnum
|
|
13
|
+
from typing import Dict, List, Tuple, Union
|
|
14
14
|
|
|
15
15
|
from .check_windows_esc import _check_windows_esc
|
|
16
|
-
from .
|
|
17
|
-
|
|
18
|
-
ISimulateChange,
|
|
19
|
-
ICommandObserverSim,
|
|
20
|
-
catch_thread_error,
|
|
21
|
-
)
|
|
16
|
+
from .exceptions import MultiPyVuError
|
|
17
|
+
from .ICommand import (ICommand, ICommandImp, ICommandObserverSim,
|
|
18
|
+
ISimulateChange, catch_thread_error)
|
|
22
19
|
from .IEventManager import IObserver
|
|
23
20
|
from .project_vars import CLOCK_TIME
|
|
24
|
-
from .exceptions import MultiPyVuError
|
|
25
21
|
|
|
26
22
|
|
|
27
23
|
class ApproachEnum(IntEnum):
|
|
@@ -10,20 +10,19 @@ Created on Sat June 12 17:35:28 2021
|
|
|
10
10
|
@author: djackson
|
|
11
11
|
"""
|
|
12
12
|
|
|
13
|
-
from sys import platform
|
|
14
|
-
from abc import abstractmethod
|
|
15
|
-
from typing import Tuple, Dict
|
|
16
13
|
import logging
|
|
14
|
+
from abc import abstractmethod
|
|
15
|
+
from sys import platform
|
|
16
|
+
from typing import Dict, Tuple
|
|
17
17
|
|
|
18
|
+
from .exceptions import MultiPyVuError, PythoncomImportError
|
|
18
19
|
from .ICommand import ICommand
|
|
19
20
|
from .project_vars import SERVER_NAME
|
|
20
|
-
from .exceptions import MultiPyVuError, PythoncomImportError
|
|
21
|
-
|
|
22
21
|
|
|
23
22
|
if platform == 'win32':
|
|
24
23
|
try:
|
|
25
|
-
import win32com.client as win32
|
|
26
24
|
import pythoncom
|
|
25
|
+
import win32com.client as win32
|
|
27
26
|
except ImportError:
|
|
28
27
|
raise PythoncomImportError
|
|
29
28
|
|
|
@@ -4,29 +4,23 @@ CommandSdo.py is used to read and write SDOs
|
|
|
4
4
|
@author: djackson
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
-
from sys import platform
|
|
8
|
-
import struct
|
|
9
|
-
import re
|
|
10
7
|
import logging
|
|
8
|
+
import re
|
|
9
|
+
import struct
|
|
11
10
|
from abc import abstractmethod
|
|
12
|
-
from
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
can_err_enum,
|
|
18
|
-
abort_err_enum,
|
|
19
|
-
)
|
|
11
|
+
from sys import platform
|
|
12
|
+
from typing import Dict, Tuple, Union
|
|
13
|
+
|
|
14
|
+
from .exceptions import (CanError, MultiPyVuError, PwinComError,
|
|
15
|
+
PythoncomImportError, abort_err_enum, can_err_enum)
|
|
20
16
|
from .ICommand import ICommand
|
|
17
|
+
from .project_vars import CLIENT_NAME, SERVER_NAME
|
|
21
18
|
from .sdo_object import SdoObject, val_type
|
|
22
|
-
from .project_vars import SERVER_NAME, CLIENT_NAME
|
|
23
|
-
from .exceptions import PythoncomImportError
|
|
24
|
-
|
|
25
19
|
|
|
26
20
|
if platform == 'win32':
|
|
27
21
|
try:
|
|
28
|
-
import win32com.client as win32
|
|
29
22
|
import pythoncom
|
|
23
|
+
import win32com.client as win32
|
|
30
24
|
from pywintypes import com_error as pywin_com_error
|
|
31
25
|
except ImportError:
|
|
32
26
|
raise PythoncomImportError
|
|
@@ -85,9 +79,9 @@ class CommandSdoBase(ICommand):
|
|
|
85
79
|
can_err_as_str, abort_err_as_str = search_rslt
|
|
86
80
|
can_err_as_int = int(can_err_as_str)
|
|
87
81
|
abort_err_as_int = int(abort_err_as_str)
|
|
88
|
-
except BaseException:
|
|
82
|
+
except BaseException as e:
|
|
89
83
|
msg = 'String can not be converted into two numbers'
|
|
90
|
-
raise ValueError(f'{msg}: {err_str}')
|
|
84
|
+
raise ValueError(f'{msg}: {err_str}') from e
|
|
91
85
|
return can_err_as_int, abort_err_as_int
|
|
92
86
|
|
|
93
87
|
def convert_result(self, response: Dict) -> Tuple:
|
|
@@ -189,8 +183,8 @@ class CommandSdoImp(CommandSdoBase):
|
|
|
189
183
|
|
|
190
184
|
def _binary_to_value(self,
|
|
191
185
|
sdo: SdoObject,
|
|
192
|
-
length
|
|
193
|
-
val
|
|
186
|
+
length,
|
|
187
|
+
val) -> Union[str, int, float]:
|
|
194
188
|
"""
|
|
195
189
|
Convert a binary value from reading an SDO into its correct
|
|
196
190
|
type.
|
|
@@ -7,21 +7,17 @@ Created on Tue May 18 13:14:28 2021
|
|
|
7
7
|
@author: djackson
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
|
-
from enum import IntEnum
|
|
11
10
|
import time
|
|
12
|
-
from typing import Union, Tuple, Dict, List
|
|
13
11
|
from abc import abstractmethod
|
|
12
|
+
from enum import IntEnum
|
|
13
|
+
from typing import Dict, List, Tuple, Union
|
|
14
14
|
|
|
15
15
|
from .check_windows_esc import _check_windows_esc
|
|
16
|
-
from .
|
|
17
|
-
|
|
18
|
-
ISimulateChange,
|
|
19
|
-
ICommandObserverSim,
|
|
20
|
-
catch_thread_error,
|
|
21
|
-
)
|
|
16
|
+
from .exceptions import MultiPyVuError
|
|
17
|
+
from .ICommand import (ICommand, ICommandImp, ICommandObserverSim,
|
|
18
|
+
ISimulateChange, catch_thread_error)
|
|
22
19
|
from .IEventManager import IObserver
|
|
23
20
|
from .project_vars import CLOCK_TIME
|
|
24
|
-
from .exceptions import MultiPyVuError
|
|
25
21
|
|
|
26
22
|
|
|
27
23
|
class ApproachEnum(IntEnum):
|
|
@@ -6,32 +6,26 @@ Created on Tue May 18 13:14:28 2021
|
|
|
6
6
|
@author: djackson
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
|
-
from sys import platform
|
|
10
|
-
from enum import IntEnum
|
|
11
9
|
import time
|
|
12
|
-
from typing import Union, Tuple, Dict, List
|
|
13
10
|
from abc import abstractmethod
|
|
11
|
+
from enum import IntEnum
|
|
12
|
+
from sys import platform
|
|
13
|
+
from typing import Dict, List, Tuple, Union
|
|
14
14
|
|
|
15
15
|
from .check_windows_esc import _check_windows_esc
|
|
16
|
-
from .IEventManager import IObserver
|
|
17
|
-
from .ICommand import (ICommand,
|
|
18
|
-
ICommandImp,
|
|
19
|
-
ISimulateChange
|
|
20
|
-
)
|
|
21
|
-
from .CommandTemperature import SimulateTemperatureChange
|
|
22
|
-
from .CommandField import SimulateFieldChange
|
|
23
16
|
from .CommandChamber import SimulateChamberChange
|
|
17
|
+
from .CommandField import SimulateFieldChange
|
|
18
|
+
from .CommandTemperature import SimulateTemperatureChange
|
|
19
|
+
from .exceptions import (CanError, MultiPyVuError, PythoncomImportError,
|
|
20
|
+
can_err_enum)
|
|
21
|
+
from .ICommand import ICommand, ICommandImp, ISimulateChange
|
|
22
|
+
from .IEventManager import IObserver
|
|
24
23
|
from .project_vars import CLOCK_TIME
|
|
25
|
-
from .exceptions import (MultiPyVuError,
|
|
26
|
-
PythoncomImportError,
|
|
27
|
-
CanError,
|
|
28
|
-
can_err_enum,
|
|
29
|
-
)
|
|
30
24
|
|
|
31
25
|
if platform == 'win32':
|
|
32
26
|
try:
|
|
33
|
-
import win32com.client as win32
|
|
34
27
|
import pythoncom
|
|
28
|
+
import win32com.client as win32
|
|
35
29
|
except ImportError:
|
|
36
30
|
raise PythoncomImportError
|
|
37
31
|
|
|
@@ -5,12 +5,12 @@ simulated ICommand classes.
|
|
|
5
5
|
|
|
6
6
|
from typing import Union
|
|
7
7
|
|
|
8
|
-
from .CommandMultiVu import CommandMultiVuImp, CommandMultiVuSim
|
|
9
|
-
from . import CommandTemperature as temperature
|
|
10
|
-
from . import CommandField as field
|
|
11
8
|
from . import CommandChamber as chamber
|
|
9
|
+
from . import CommandField as field
|
|
12
10
|
from . import CommandSdo as sdo
|
|
11
|
+
from . import CommandTemperature as temperature
|
|
13
12
|
from . import CommandWaitFor as wait_for
|
|
13
|
+
from .CommandMultiVu import CommandMultiVuImp, CommandMultiVuSim
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
def create_command_mv(mvu_flavor,
|
|
@@ -13,20 +13,20 @@ Created on Tue May 18 12:59:24 2021
|
|
|
13
13
|
@author: djackson
|
|
14
14
|
"""
|
|
15
15
|
|
|
16
|
-
from sys import platform
|
|
17
|
-
from typing import Union, Dict, Tuple, Type
|
|
18
16
|
from abc import ABC, abstractmethod
|
|
19
|
-
from
|
|
20
|
-
from
|
|
17
|
+
from sys import platform
|
|
18
|
+
from threading import Lock, Thread, enumerate
|
|
19
|
+
from time import sleep, time
|
|
20
|
+
from typing import Dict, Tuple, Type, Union
|
|
21
21
|
|
|
22
|
-
from .IEventManager import Publisher, IObserver
|
|
23
|
-
from .project_vars import CLOCK_TIME
|
|
24
22
|
from .exceptions import PythoncomImportError
|
|
23
|
+
from .IEventManager import IObserver, Publisher
|
|
24
|
+
from .project_vars import CLOCK_TIME
|
|
25
25
|
|
|
26
26
|
if platform == 'win32':
|
|
27
27
|
try:
|
|
28
|
-
import win32com.client as win32
|
|
29
28
|
import pythoncom
|
|
29
|
+
import win32com.client as win32
|
|
30
30
|
from pywintypes import com_error as pywin_com_error
|
|
31
31
|
except ImportError:
|
|
32
32
|
raise PythoncomImportError
|
|
@@ -61,7 +61,7 @@ class ICommand(ABC):
|
|
|
61
61
|
self.units = ''
|
|
62
62
|
|
|
63
63
|
@abstractmethod
|
|
64
|
-
def convert_result(self,
|
|
64
|
+
def convert_result(self, response: Dict) -> Tuple:
|
|
65
65
|
raise NotImplementedError
|
|
66
66
|
|
|
67
67
|
@abstractmethod
|
|
@@ -74,8 +74,8 @@ class ICommand(ABC):
|
|
|
74
74
|
|
|
75
75
|
@abstractmethod
|
|
76
76
|
def get_state_server(self,
|
|
77
|
-
|
|
78
|
-
|
|
77
|
+
value_variant,
|
|
78
|
+
state_variant,
|
|
79
79
|
params: str = '') -> Tuple[float, int]:
|
|
80
80
|
raise NotImplementedError
|
|
81
81
|
|
|
@@ -13,36 +13,29 @@ with MultiVu.
|
|
|
13
13
|
@author: D. Jackson
|
|
14
14
|
"""
|
|
15
15
|
|
|
16
|
-
from sys import exc_info
|
|
17
|
-
from enum import IntEnum
|
|
18
16
|
import traceback
|
|
19
|
-
from
|
|
17
|
+
from enum import IntEnum
|
|
18
|
+
from sys import exc_info
|
|
19
|
+
from typing import Tuple, Union
|
|
20
20
|
|
|
21
|
-
from .MultiVuClient_base import ClientBase as _ClientBase
|
|
22
|
-
from .instrument import InstrumentList
|
|
23
21
|
from . import Command_factory as _Command_factory
|
|
24
|
-
from .
|
|
25
|
-
from .
|
|
26
|
-
from .
|
|
22
|
+
from .BRT import Brt as _brt
|
|
23
|
+
from .CommandChamber import modeEnum as _chamber_mode
|
|
24
|
+
from .CommandChamber import units as _chamber_units
|
|
27
25
|
from .CommandField import ApproachEnum as _field_approach_mode
|
|
28
26
|
from .CommandField import drivenEnum as _field_driven_mode
|
|
29
27
|
from .CommandField import units as _field_units
|
|
30
|
-
from .
|
|
31
|
-
from .
|
|
28
|
+
from .CommandTemperature import STATE_DICT as _temperature_state_dict
|
|
29
|
+
from .CommandTemperature import ApproachEnum as _temperature_approach_mode
|
|
30
|
+
from .CommandTemperature import units as _temperature_units
|
|
32
31
|
from .CommandWaitFor import MaskEnum as _wait_for_enum
|
|
32
|
+
from .exceptions import (CanError, MultiPyVuError, ServerCloseError,
|
|
33
|
+
abort_err_enum, can_err_enum)
|
|
34
|
+
from .instrument import InstrumentList
|
|
35
|
+
from .MultiVuClient_base import ClientBase as _ClientBase
|
|
36
|
+
from .project_vars import HOST_CLIENT, PORT, TIMEOUT_LENGTH
|
|
33
37
|
from .sdo_object import SdoObject
|
|
34
38
|
from .sdo_object import val_type as _sdo_val_type
|
|
35
|
-
from .BRT import Brt as _brt
|
|
36
|
-
from .project_vars import (HOST_CLIENT,
|
|
37
|
-
PORT,
|
|
38
|
-
TIMEOUT_LENGTH
|
|
39
|
-
)
|
|
40
|
-
from .exceptions import (MultiPyVuError,
|
|
41
|
-
ServerCloseError,
|
|
42
|
-
CanError,
|
|
43
|
-
can_err_enum,
|
|
44
|
-
abort_err_enum,
|
|
45
|
-
)
|
|
46
39
|
|
|
47
40
|
|
|
48
41
|
class Client(_ClientBase):
|
|
@@ -12,29 +12,20 @@ MultiVuClient class has specific commands to be used with this class.
|
|
|
12
12
|
@author: D. Jackson
|
|
13
13
|
"""
|
|
14
14
|
|
|
15
|
+
import logging
|
|
15
16
|
import sys
|
|
17
|
+
import traceback
|
|
16
18
|
from socket import timeout as sock_timeout
|
|
17
19
|
from time import sleep
|
|
18
|
-
import logging
|
|
19
|
-
import traceback
|
|
20
20
|
from typing import Dict, Union
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
from .SocketMessageClient import ClientMessage as _ClientMessage
|
|
24
|
-
from .logging_config import setup_logging, remove_logs
|
|
25
|
-
from .project_vars import (TIMEOUT_LENGTH,
|
|
26
|
-
CLIENT_NAME,
|
|
27
|
-
HOST_CLIENT,
|
|
28
|
-
PORT,
|
|
29
|
-
CLOCK_TIME,
|
|
30
|
-
)
|
|
31
|
-
from .exceptions import (MultiPyVuError,
|
|
32
|
-
ClientCloseError,
|
|
33
|
-
ServerCloseError,
|
|
34
|
-
SocketError
|
|
35
|
-
)
|
|
36
22
|
from .__version import __version__ as mpv_version
|
|
37
|
-
|
|
23
|
+
from .exceptions import (ClientCloseError, MultiPyVuError, ServerCloseError,
|
|
24
|
+
SocketError)
|
|
25
|
+
from .logging_config import remove_logs, setup_logging
|
|
26
|
+
from .project_vars import (CLIENT_NAME, CLOCK_TIME, HOST_CLIENT, PORT,
|
|
27
|
+
TIMEOUT_LENGTH)
|
|
28
|
+
from .SocketMessageClient import ClientMessage as _ClientMessage
|
|
38
29
|
|
|
39
30
|
MAX_TRIES = 3
|
|
40
31
|
|
|
@@ -100,6 +91,7 @@ class ClientBase():
|
|
|
100
91
|
raise self.__exit__(*sys.exc_info())
|
|
101
92
|
except BaseException:
|
|
102
93
|
raise self.__exit__(*sys.exc_info())
|
|
94
|
+
self._logger.debug(f'MultiPyVu Version: {mpv_version}')
|
|
103
95
|
self._logger.info(f'Starting connection to {self.address}')
|
|
104
96
|
# send a request to the sever to confirm a connection
|
|
105
97
|
action = 'START'
|
|
@@ -112,7 +104,6 @@ class ClientBase():
|
|
|
112
104
|
self._instr = self._message.instr
|
|
113
105
|
self.instrument_name = self._message.instr.name
|
|
114
106
|
# self._log_event.show_logger_name(self._instr.run_with_threading)
|
|
115
|
-
self._logger.debug(f'MultiPyVu Version: {mpv_version}')
|
|
116
107
|
ver = self.get_version()
|
|
117
108
|
if ver != mpv_version:
|
|
118
109
|
self._query_server('CLOSE')
|
|
@@ -9,13 +9,14 @@ files. This code was ported from MultiVuDataFile.vb.
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
import os
|
|
12
|
-
import time
|
|
13
12
|
import re
|
|
14
|
-
import
|
|
15
|
-
from threading import Lock
|
|
16
|
-
from enum import Enum, auto, IntEnum
|
|
13
|
+
import time
|
|
17
14
|
from datetime import datetime
|
|
18
|
-
from
|
|
15
|
+
from enum import Enum, IntEnum, auto
|
|
16
|
+
from threading import Lock
|
|
17
|
+
from typing import Dict, Union
|
|
18
|
+
|
|
19
|
+
import pandas as pd
|
|
19
20
|
|
|
20
21
|
from .is_pathname_valid import is_pathname_valid
|
|
21
22
|
|
|
@@ -8,37 +8,30 @@ be used with MultiVuClient.py to control a Quantum Design cryostat.
|
|
|
8
8
|
@author: D. Jackson
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
|
-
import sys
|
|
12
|
-
import selectors
|
|
13
|
-
import re
|
|
14
|
-
from time import sleep
|
|
15
11
|
import logging
|
|
12
|
+
import re
|
|
13
|
+
import selectors
|
|
14
|
+
import sys
|
|
16
15
|
import traceback
|
|
16
|
+
from time import sleep
|
|
17
17
|
from typing import List, Tuple
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
from .
|
|
21
|
-
from .
|
|
19
|
+
from .CommandChamber import SimulateChamberChange as _SimulateChamberChange
|
|
20
|
+
from .CommandField import SimulateFieldChange as _SimulateFieldChange
|
|
21
|
+
from .CommandTemperature import \
|
|
22
|
+
SimulateTemperatureChange as _SimulateTemperatureChange
|
|
23
|
+
from .exceptions import (ClientCloseError, MultiPyVuError, ServerCloseError,
|
|
24
|
+
SocketError)
|
|
22
25
|
from .IEventManager import IObserver as _IObserver
|
|
26
|
+
from .instrument import Instrument as _Instrument
|
|
27
|
+
from .IServer import IServer as _IServer
|
|
28
|
+
from .logging_config import remove_logs, setup_logging
|
|
29
|
+
from .ParseInputs import inputs_from_command_line
|
|
30
|
+
from .project_vars import (CLOCK_TIME, HOST_SERVER, PORT, SERVER_NAME,
|
|
31
|
+
TIMEOUT_LENGTH)
|
|
32
|
+
from .scripts.helper_scripts import force_quit
|
|
23
33
|
from .SocketMessageServer import ServerMessage as _ServerMessage
|
|
24
34
|
from .SocketMessageServer import ServerStatus as _ServerStatus
|
|
25
|
-
from .ParseInputs import inputs_from_command_line
|
|
26
|
-
from .instrument import Instrument as _Instrument
|
|
27
|
-
from .CommandTemperature import SimulateTemperatureChange as _SimulateTemperatureChange
|
|
28
|
-
from .CommandField import SimulateFieldChange as _SimulateFieldChange
|
|
29
|
-
from .CommandChamber import SimulateChamberChange as _SimulateChamberChange
|
|
30
|
-
from .exceptions import (MultiPyVuError,
|
|
31
|
-
ClientCloseError,
|
|
32
|
-
ServerCloseError,
|
|
33
|
-
SocketError,
|
|
34
|
-
)
|
|
35
|
-
from .logging_config import setup_logging, remove_logs
|
|
36
|
-
from .project_vars import (SERVER_NAME,
|
|
37
|
-
HOST_SERVER,
|
|
38
|
-
PORT,
|
|
39
|
-
TIMEOUT_LENGTH,
|
|
40
|
-
CLOCK_TIME,
|
|
41
|
-
)
|
|
42
35
|
|
|
43
36
|
|
|
44
37
|
class Server(_IServer):
|
|
@@ -5,15 +5,13 @@ command-line inputs
|
|
|
5
5
|
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
-
import sys
|
|
9
|
-
import re
|
|
10
8
|
import ntpath
|
|
9
|
+
import re
|
|
10
|
+
import sys
|
|
11
11
|
from typing import List
|
|
12
12
|
|
|
13
13
|
from .instrument import InstrumentList
|
|
14
|
-
from .project_vars import
|
|
15
|
-
PORT,
|
|
16
|
-
)
|
|
14
|
+
from .project_vars import HOST_SERVER, PORT
|
|
17
15
|
|
|
18
16
|
|
|
19
17
|
class ParsedInputs():
|
|
@@ -8,21 +8,20 @@ Created on Mon Jun 7 23:47:19 2021
|
|
|
8
8
|
@author: D. Jackson
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
|
-
import sys
|
|
12
|
-
from abc import ABC
|
|
13
|
-
import socket
|
|
14
|
-
import json
|
|
15
11
|
import io
|
|
12
|
+
import json
|
|
16
13
|
import logging
|
|
17
|
-
import struct
|
|
18
14
|
import re
|
|
19
|
-
|
|
15
|
+
import socket
|
|
16
|
+
import struct
|
|
17
|
+
import sys
|
|
18
|
+
import traceback
|
|
19
|
+
from abc import ABC
|
|
20
|
+
from typing import Dict, Tuple, Union
|
|
20
21
|
|
|
21
|
-
from .project_vars import PORT
|
|
22
|
-
from .exceptions import (ClientCloseError,
|
|
23
|
-
SocketError,
|
|
24
|
-
)
|
|
25
22
|
from .__version import __version__ as mpv_version
|
|
23
|
+
from .exceptions import ClientCloseError, SocketError
|
|
24
|
+
from .project_vars import PORT
|
|
26
25
|
|
|
27
26
|
|
|
28
27
|
class Message(ABC):
|
|
@@ -304,7 +303,8 @@ class Message(ABC):
|
|
|
304
303
|
"""
|
|
305
304
|
return json.dumps(dict_obj, ensure_ascii=False).encode(encoding)
|
|
306
305
|
|
|
307
|
-
def _json_decode(self,
|
|
306
|
+
def _json_decode(self,
|
|
307
|
+
json_bytes: bytes,
|
|
308
308
|
encoding: str = 'utf-8') -> Dict[str, str]:
|
|
309
309
|
"""
|
|
310
310
|
Takes a JSON formatted byte string and converts it to a dictionary
|
|
@@ -395,8 +395,22 @@ class Message(ABC):
|
|
|
395
395
|
# be longer if there is data.
|
|
396
396
|
if len(self._recv_buffer) >= header_len:
|
|
397
397
|
# parse the buffer to save the header
|
|
398
|
-
|
|
399
|
-
self.
|
|
398
|
+
try:
|
|
399
|
+
self.json_header = self._json_decode(
|
|
400
|
+
self._recv_buffer[:header_len])
|
|
401
|
+
except UnicodeDecodeError as e:
|
|
402
|
+
msg = f'\nFull received buffer = {self._recv_buffer}'
|
|
403
|
+
msg += '\nBuffer sent to ._json_decode = '
|
|
404
|
+
msg += f'{self._recv_buffer[:header_len]}'
|
|
405
|
+
self.log_message(msg)
|
|
406
|
+
|
|
407
|
+
original_traceback = traceback.format_exc()
|
|
408
|
+
traceback_with_msg = original_traceback + msg
|
|
409
|
+
raise UnicodeDecodeError(e.encoding,
|
|
410
|
+
e.object,
|
|
411
|
+
e.start,
|
|
412
|
+
e.end,
|
|
413
|
+
traceback_with_msg)
|
|
400
414
|
|
|
401
415
|
# This ensures that the header has all of the required fields
|
|
402
416
|
for required_header in (
|
|
@@ -8,21 +8,18 @@ Created on Mon Jun 7 23:47:19 2021
|
|
|
8
8
|
@author: D. Jackson
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
|
-
import re
|
|
12
11
|
import logging
|
|
12
|
+
import re
|
|
13
13
|
import socket
|
|
14
14
|
from time import sleep
|
|
15
|
-
from typing import
|
|
15
|
+
from typing import Dict, Tuple, Union
|
|
16
16
|
|
|
17
17
|
from .check_windows_esc import _check_windows_esc
|
|
18
|
-
from .
|
|
18
|
+
from .exceptions import (ClientCloseError, MultiPyVuError, ServerCloseError,
|
|
19
|
+
SocketError)
|
|
19
20
|
from .instrument import Instrument
|
|
20
21
|
from .project_vars import CLIENT_NAME, CLOCK_TIME
|
|
21
|
-
from .
|
|
22
|
-
ClientCloseError,
|
|
23
|
-
ServerCloseError,
|
|
24
|
-
SocketError
|
|
25
|
-
)
|
|
22
|
+
from .SocketMessage import Message
|
|
26
23
|
|
|
27
24
|
|
|
28
25
|
class ClientMessage(Message):
|
|
@@ -22,26 +22,28 @@ Import MultiPyVu as mpv
|
|
|
22
22
|
@author: Damon D Jackson
|
|
23
23
|
"""
|
|
24
24
|
|
|
25
|
-
from sys import exc_info
|
|
26
|
-
from os import path
|
|
27
25
|
import traceback
|
|
28
|
-
from pandas import DataFrame
|
|
29
26
|
from enum import IntEnum as _IntEnum
|
|
30
27
|
from enum import auto as _auto
|
|
31
|
-
from
|
|
28
|
+
from os import path
|
|
29
|
+
from sys import exc_info
|
|
30
|
+
from typing import Optional, Union
|
|
31
|
+
|
|
32
|
+
from pandas import DataFrame
|
|
32
33
|
|
|
33
34
|
from .__version import __version__
|
|
34
|
-
from .
|
|
35
|
+
from .exceptions import MultiPyVuError, SocketError
|
|
35
36
|
from .MultiVuClient import Client
|
|
36
|
-
from .MultiVuDataFile.MultiVuDataFile import
|
|
37
|
+
from .MultiVuDataFile.MultiVuDataFile import LabelResult
|
|
38
|
+
from .MultiVuDataFile.MultiVuDataFile import \
|
|
39
|
+
MultiVuDataFile as _MultiVuDataFile
|
|
40
|
+
from .MultiVuDataFile.MultiVuDataFile import MultiVuFileException
|
|
37
41
|
from .MultiVuDataFile.MultiVuDataFile import TScaleType as _TScaleType
|
|
38
|
-
from .MultiVuDataFile.MultiVuDataFile import
|
|
39
|
-
|
|
42
|
+
from .MultiVuDataFile.MultiVuDataFile import \
|
|
43
|
+
TStartupAxisType as _TStartupAxisType
|
|
40
44
|
from .MultiVuDataFile.MultiVuDataFile import TTimeMode as _TTimeMode
|
|
41
|
-
from .MultiVuDataFile.MultiVuDataFile import
|
|
42
|
-
from .
|
|
43
|
-
from .exceptions import MultiPyVuError, SocketError
|
|
44
|
-
|
|
45
|
+
from .MultiVuDataFile.MultiVuDataFile import TTimeUnits as _TTimeUnits
|
|
46
|
+
from .MultiVuServer import Server
|
|
45
47
|
|
|
46
48
|
__version__ = __version__
|
|
47
49
|
__author__ = 'Damon D Jackson'
|
|
@@ -421,7 +423,8 @@ class DataFile():
|
|
|
421
423
|
"""
|
|
422
424
|
return self.data_file.write_data_using_list(data_list, get_time_now)
|
|
423
425
|
|
|
424
|
-
def parse_MVu_data_file(self,
|
|
426
|
+
def parse_MVu_data_file(self,
|
|
427
|
+
file_path: Optional[str] = None) -> DataFrame:
|
|
425
428
|
"""
|
|
426
429
|
Returns a pandas DataFrame of all data points in the given file
|
|
427
430
|
|
|
@@ -440,6 +443,8 @@ class DataFile():
|
|
|
440
443
|
>>> parse_MVu_data_file('myMvFile.dat')
|
|
441
444
|
|
|
442
445
|
"""
|
|
446
|
+
if file_path is None:
|
|
447
|
+
file_path = self.data_file.full_path
|
|
443
448
|
try:
|
|
444
449
|
_df = self.data_file.parse_MVu_data_file(file_path)
|
|
445
450
|
except FileNotFoundError as e:
|
|
@@ -17,11 +17,11 @@ For example:
|
|
|
17
17
|
from sys import argv
|
|
18
18
|
|
|
19
19
|
from MultiPyVu.gui.Controller import Controller
|
|
20
|
+
from MultiPyVu.ParseInputs import parse_input
|
|
20
21
|
from MultiPyVu.scripts.helper_scripts import (get_ip,
|
|
21
22
|
run_status,
|
|
22
23
|
is_running,
|
|
23
24
|
force_quit)
|
|
24
|
-
from MultiPyVu.ParseInputs import parse_input
|
|
25
25
|
|
|
26
26
|
|
|
27
27
|
def run_gui():
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
|
-
__version__ = "3.
|
|
2
|
+
__version__ = "3.3.0"
|
|
File without changes
|
|
File without changes
|
|
@@ -8,22 +8,23 @@ Created on Tue May 18 13:14:28 2021
|
|
|
8
8
|
@author: djackson
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
|
-
from sys import platform
|
|
12
|
-
import subprocess
|
|
13
|
-
import time
|
|
14
|
-
import re
|
|
15
11
|
import logging
|
|
12
|
+
import time
|
|
16
13
|
from enum import Enum, auto
|
|
14
|
+
from os import path
|
|
15
|
+
from sys import platform
|
|
17
16
|
from typing import Tuple
|
|
18
17
|
|
|
19
|
-
from .project_vars import SERVER_NAME, PYWIN32_VERSION, MIN_PYWIN32_VERSION
|
|
20
|
-
from .exceptions import MultiPyVuError, PythoncomImportError
|
|
21
18
|
from .__version import __version__ as mpv_version
|
|
19
|
+
from .exceptions import MultiPyVuError, PythoncomImportError
|
|
20
|
+
from .project_vars import MIN_PYWIN32_VERSION, PYWIN32_VERSION, SERVER_NAME
|
|
22
21
|
|
|
23
22
|
if platform == 'win32':
|
|
24
23
|
try:
|
|
25
24
|
import pythoncom
|
|
25
|
+
import win32api
|
|
26
26
|
import win32com.client as win32
|
|
27
|
+
import win32process
|
|
27
28
|
except ImportError:
|
|
28
29
|
raise PythoncomImportError
|
|
29
30
|
|
|
@@ -218,28 +219,27 @@ class Instrument():
|
|
|
218
219
|
# declare these variables so that they are available to return
|
|
219
220
|
common_name = ''
|
|
220
221
|
exe_name = ''
|
|
222
|
+
open_mv_dict = {}
|
|
221
223
|
|
|
222
|
-
#
|
|
223
|
-
#
|
|
224
|
-
cmd = 'WMIC PROCESS WHERE "COMMANDLINE like \'%multivu%\'" GET '
|
|
225
|
-
cmd += 'Caption,Commandline,Processid'
|
|
226
|
-
proc = subprocess.run(cmd, capture_output=True, text=True)
|
|
227
|
-
if proc.returncode != 0:
|
|
228
|
-
raise Exception(proc.stderr)
|
|
229
|
-
# make a dictionary whose key is the MultiVu flavor, and the
|
|
224
|
+
# Find processes with 'MultiVu' in the name and make
|
|
225
|
+
# a dictionary whose key is the MultiVu flavor, and the
|
|
230
226
|
# value is a tuple with the exe path and process id
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
227
|
+
pids = win32process.EnumProcesses()
|
|
228
|
+
for pid in pids:
|
|
229
|
+
try:
|
|
230
|
+
# Open processes to query its executable path
|
|
231
|
+
h_process = win32api.OpenProcess(0x0410, False, pid)
|
|
232
|
+
exe_path = win32process.GetModuleFileNameEx(h_process, 0)
|
|
233
|
+
win32api.CloseHandle(h_process)
|
|
234
|
+
|
|
235
|
+
# Check if the path contains the keyword
|
|
236
|
+
if 'multivu' in exe_path.lower():
|
|
237
|
+
exe_name = path.basename(exe_path)
|
|
238
|
+
common_name = self._exe_to_common_name(exe_name)
|
|
239
|
+
open_mv_dict[common_name] = (exe_path, exe_name)
|
|
240
|
+
except Exception:
|
|
241
|
+
# Ignore processes that we don't have access to
|
|
242
|
+
pass
|
|
243
243
|
|
|
244
244
|
# Declare errors if no MultiVu instance is found
|
|
245
245
|
if len(open_mv_dict) == 0:
|
|
@@ -6,7 +6,8 @@ formatters:
|
|
|
6
6
|
no_name:
|
|
7
7
|
format: '%(message)s'
|
|
8
8
|
debug:
|
|
9
|
-
format: '%(asctime)
|
|
9
|
+
format: '%(asctime)s.%(msecs)03d %(name)-20s %(levelname)-8s %(message)s'
|
|
10
|
+
datefmt: '%Y-%m-%d %H:%M:%S'
|
|
10
11
|
gui:
|
|
11
12
|
format: '%(asctime)s - %(message)s'
|
|
12
13
|
datefmt: '%m-%d %H:%M'
|
|
@@ -7,13 +7,12 @@ Created on Mon Sep 27 10:53:06 2021
|
|
|
7
7
|
@author: D. Jackson
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
|
-
from sys import platform
|
|
11
|
-
import os
|
|
12
10
|
import distutils.sysconfig
|
|
11
|
+
import os
|
|
12
|
+
from sys import platform
|
|
13
13
|
|
|
14
14
|
from .exceptions import PythoncomImportError
|
|
15
15
|
|
|
16
|
-
|
|
17
16
|
py_win_version = 0.0
|
|
18
17
|
if platform == 'win32':
|
|
19
18
|
try:
|
|
File without changes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: MultiPyVu
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.3.0
|
|
4
4
|
Summary: Control MultiVu using Python
|
|
5
5
|
Author-email: Damon D Jackson <djackson@qdusa.com>
|
|
6
6
|
Maintainer-email: "Quantum Design, Inc." <apps@qdusa.com>
|
|
@@ -435,6 +435,18 @@ client = mpv.Client(port=6000)
|
|
|
435
435
|
- A log file named QdMultiVu.log shows the traffic between the server and client which can also be useful during troubleshooting.
|
|
436
436
|
|
|
437
437
|
## Changelog<a class="anchor" id="changelog"></a>
|
|
438
|
+
**3.3.0**
|
|
439
|
+
- April 2025
|
|
440
|
+
- Bugfix which didn't allow this to be run on Mac or Linux platforms.
|
|
441
|
+
- Refactored mpv.DataFile() so that if a script is saving data to a file,
|
|
442
|
+
it can later load the file into a Pandas Dataframe without specifying the
|
|
443
|
+
filename. This means the file path is now optional in
|
|
444
|
+
.parse_MVu_data_file().
|
|
445
|
+
|
|
446
|
+
**3.2.0**
|
|
447
|
+
- November 2024
|
|
448
|
+
- Improvements in determining the running version of MultiVu.
|
|
449
|
+
|
|
438
450
|
**3.1.2**
|
|
439
451
|
- October 2024
|
|
440
452
|
- Fixed a bug which truncated numbers
|
|
@@ -42,6 +42,7 @@ src/MultiPyVu/MultiVuDataFile/__version.py
|
|
|
42
42
|
src/MultiPyVu/MultiVuDataFile/is_pathname_valid.py
|
|
43
43
|
src/MultiPyVu/font/Play-Bold.ttf
|
|
44
44
|
src/MultiPyVu/font/Play-Regular.ttf
|
|
45
|
+
src/MultiPyVu/font/__init__.py
|
|
45
46
|
src/MultiPyVu/gui/Controller.py
|
|
46
47
|
src/MultiPyVu/gui/IController.py
|
|
47
48
|
src/MultiPyVu/gui/IView.py
|
|
@@ -50,5 +51,7 @@ src/MultiPyVu/gui/ViewTk.py
|
|
|
50
51
|
src/MultiPyVu/gui/__init__.py
|
|
51
52
|
src/MultiPyVu/images/Q.png
|
|
52
53
|
src/MultiPyVu/images/QD_logo.jpg
|
|
54
|
+
src/MultiPyVu/images/__init__.py
|
|
55
|
+
src/MultiPyVu/scripts/__init__.py
|
|
53
56
|
src/MultiPyVu/scripts/helper_scripts.py
|
|
54
57
|
src/MultiPyVu/scripts/whats_my_ip_address.cmd
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -8,23 +8,19 @@ Created on Mon Jun 7 23:47:19 2021
|
|
|
8
8
|
@author: D. Jackson
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
import logging
|
|
12
|
+
import re
|
|
13
|
+
import selectors
|
|
14
|
+
import socket
|
|
12
15
|
import threading
|
|
13
|
-
import traceback
|
|
14
16
|
import time
|
|
15
|
-
import
|
|
16
|
-
import selectors
|
|
17
|
-
import re
|
|
17
|
+
import traceback
|
|
18
18
|
from enum import IntEnum, auto, IntFlag
|
|
19
|
-
import
|
|
19
|
+
from sys import platform
|
|
20
20
|
from typing import Union, Dict, Tuple, List
|
|
21
21
|
|
|
22
22
|
from .check_windows_esc import _check_windows_esc
|
|
23
23
|
from .Command_factory import create_command_mv
|
|
24
|
-
from .SocketMessage import Message
|
|
25
|
-
from .instrument import Instrument
|
|
26
|
-
from .IEventManager import Publisher as _Publisher
|
|
27
|
-
from .IEventManager import IObserver as _IObserver
|
|
28
24
|
from .exceptions import (MultiPyVuError,
|
|
29
25
|
ClientCloseError,
|
|
30
26
|
ServerCloseError,
|
|
@@ -32,7 +28,11 @@ from .exceptions import (MultiPyVuError,
|
|
|
32
28
|
SocketError,
|
|
33
29
|
PythoncomImportError,
|
|
34
30
|
)
|
|
31
|
+
from .IEventManager import Publisher as _Publisher
|
|
32
|
+
from .IEventManager import IObserver as _IObserver
|
|
33
|
+
from .instrument import Instrument
|
|
35
34
|
from .project_vars import SERVER_NAME, CLOCK_TIME
|
|
35
|
+
from .SocketMessage import Message
|
|
36
36
|
|
|
37
37
|
|
|
38
38
|
if platform == 'win32':
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -6,19 +6,19 @@ pattern for MultiPyVu.py
|
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
8
|
|
|
9
|
+
import re
|
|
10
|
+
import subprocess
|
|
9
11
|
import os
|
|
10
12
|
from sys import platform
|
|
11
|
-
import subprocess
|
|
12
|
-
import re
|
|
13
|
-
from typing import List
|
|
14
13
|
from types import MethodType
|
|
14
|
+
from typing import List
|
|
15
15
|
|
|
16
|
-
from
|
|
16
|
+
from .IController import IController
|
|
17
|
+
from .ViewFactory import ViewType, ViewFactory
|
|
18
|
+
from ..IEventManager import IObserver
|
|
17
19
|
from ..instrument import InstrumentList
|
|
20
|
+
from ..MultiVuServer import Server
|
|
18
21
|
from ..ParseInputs import inputs_from_command_line
|
|
19
|
-
from ..IEventManager import IObserver
|
|
20
|
-
from .ViewFactory import ViewType, ViewFactory
|
|
21
|
-
from .IController import IController
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
class ServerInfo(IObserver):
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -5,13 +5,13 @@ View.py holds the code for a gui for MultiPyVu.Server
|
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
import sys
|
|
9
8
|
import io
|
|
10
|
-
from enum import IntEnum, auto
|
|
11
|
-
from threading import Lock
|
|
12
9
|
import logging
|
|
13
10
|
import logging.handlers
|
|
11
|
+
import sys
|
|
14
12
|
import tkinter as tk
|
|
13
|
+
from enum import IntEnum, auto
|
|
14
|
+
from threading import Lock
|
|
15
15
|
from tkinter import font
|
|
16
16
|
try:
|
|
17
17
|
from PIL import ImageTk, Image
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|