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.
Files changed (59) hide show
  1. {multipyvu-3.1.2/src/MultiPyVu.egg-info → multipyvu-3.3.0}/PKG-INFO +13 -1
  2. {multipyvu-3.1.2 → multipyvu-3.3.0}/README.md +12 -0
  3. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/BRT.py +1 -1
  4. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/CommandChamber.py +5 -9
  5. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/CommandField.py +5 -9
  6. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/CommandMultiVu.py +5 -6
  7. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/CommandSdo.py +13 -19
  8. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/CommandTemperature.py +5 -9
  9. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/CommandWaitFor.py +10 -16
  10. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/Command_factory.py +3 -3
  11. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/ICommand.py +10 -10
  12. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/IServer.py +1 -1
  13. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/MultiVuClient.py +14 -21
  14. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/MultiVuClient_base.py +9 -18
  15. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/MultiVuDataFile/MultiVuDataFile.py +6 -5
  16. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/MultiVuServer.py +17 -24
  17. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/ParseInputs.py +3 -5
  18. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/SocketMessage.py +27 -13
  19. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/SocketMessageClient.py +5 -8
  20. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/__init__.py +18 -13
  21. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/__main__.py +1 -1
  22. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/__version.py +1 -1
  23. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/exceptions.py +1 -1
  24. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/generate_sdo_objects.py +1 -1
  25. multipyvu-3.3.0/src/MultiPyVu/gui/__init__.py +0 -0
  26. multipyvu-3.3.0/src/MultiPyVu/images/__init__.py +0 -0
  27. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/instrument.py +26 -26
  28. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/logging_config.py +6 -1
  29. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/logging_config.yaml +2 -1
  30. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/project_vars.py +2 -3
  31. multipyvu-3.3.0/src/MultiPyVu/scripts/__init__.py +0 -0
  32. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/scripts/helper_scripts.py +2 -2
  33. {multipyvu-3.1.2 → multipyvu-3.3.0/src/MultiPyVu.egg-info}/PKG-INFO +13 -1
  34. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu.egg-info/SOURCES.txt +3 -0
  35. {multipyvu-3.1.2 → multipyvu-3.3.0}/LICENSE +0 -0
  36. {multipyvu-3.1.2 → multipyvu-3.3.0}/pyproject.toml +0 -0
  37. {multipyvu-3.1.2 → multipyvu-3.3.0}/setup.cfg +0 -0
  38. {multipyvu-3.1.2 → multipyvu-3.3.0}/setup.py +0 -0
  39. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/IEventManager.py +0 -0
  40. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/MultiVuDataFile/__init__.py +0 -0
  41. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/MultiVuDataFile/__version.py +0 -0
  42. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/MultiVuDataFile/is_pathname_valid.py +0 -0
  43. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/SocketMessageServer.py +10 -10
  44. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/check_windows_esc.py +0 -0
  45. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/font/Play-Bold.ttf +0 -0
  46. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/font/Play-Regular.ttf +0 -0
  47. {multipyvu-3.1.2/src/MultiPyVu/gui → multipyvu-3.3.0/src/MultiPyVu/font}/__init__.py +0 -0
  48. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/gui/Controller.py +7 -7
  49. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/gui/IController.py +0 -0
  50. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/gui/IView.py +0 -0
  51. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/gui/ViewFactory.py +0 -0
  52. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/gui/ViewTk.py +3 -3
  53. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/images/Q.png +0 -0
  54. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/images/QD_logo.jpg +0 -0
  55. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/scripts/whats_my_ip_address.cmd +0 -0
  56. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu/sdo_object.py +0 -0
  57. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu.egg-info/dependency_links.txt +0 -0
  58. {multipyvu-3.1.2 → multipyvu-3.3.0}/src/MultiPyVu.egg-info/requires.txt +0 -0
  59. {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.1.2
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
@@ -2,8 +2,8 @@
2
2
  BRT.py is an abstraction of the BRT module.
3
3
  """
4
4
 
5
- from typing import Tuple
6
5
  import time
6
+ from typing import Tuple
7
7
 
8
8
  from .sdo_object import SdoObject, val_type
9
9
 
@@ -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 Union, Dict, Tuple, List
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 typing import Union, Dict, Tuple, List
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 .ICommand import (ICommand,
17
- ICommandImp,
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 typing import Union, Tuple, Dict
13
-
14
- from .exceptions import (MultiPyVuError,
15
- PwinComError,
16
- CanError,
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: win32.VARIANT,
193
- val: win32.VARIANT) -> Union[str, int, float]:
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 .ICommand import (ICommand,
17
- ICommandImp,
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 threading import Thread, Lock, enumerate
20
- from time import time, sleep
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, result: Dict) -> Tuple:
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
- statusCode,
78
- stateValue,
77
+ value_variant,
78
+ state_variant,
79
79
  params: str = '') -> Tuple[float, int]:
80
80
  raise NotImplementedError
81
81
 
@@ -7,8 +7,8 @@ It requires ABCplus (Abstract Base Class plus), which is found here:
7
7
  @author: djackson
8
8
  """
9
9
 
10
- from typing import Union, Tuple
11
10
  from abc import ABC, abstractmethod
11
+ from typing import Tuple, Union
12
12
 
13
13
  from .project_vars import PORT
14
14
 
@@ -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 typing import Union, Tuple
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 .CommandTemperature import STATE_DICT as _temperature_state_dict
25
- from .CommandTemperature import ApproachEnum as _temperature_approach_mode
26
- from .CommandTemperature import units as _temperature_units
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 .CommandChamber import modeEnum as _chamber_mode
31
- from .CommandChamber import units as _chamber_units
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 pandas as pd
15
- from threading import Lock
16
- from enum import Enum, auto, IntEnum
13
+ import time
17
14
  from datetime import datetime
18
- from typing import Union, Dict
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 .scripts.helper_scripts import force_quit
21
- from .IServer import IServer as _IServer
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 (HOST_SERVER,
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
- from typing import Union, Dict, Tuple
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, json_bytes: bytes,
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
- self.json_header = self._json_decode(
399
- self._recv_buffer[:header_len])
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 Union, Tuple, Dict
15
+ from typing import Dict, Tuple, Union
16
16
 
17
17
  from .check_windows_esc import _check_windows_esc
18
- from .SocketMessage import Message
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 .exceptions import (MultiPyVuError,
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 typing import Union
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 .MultiVuServer import Server
35
+ from .exceptions import MultiPyVuError, SocketError
35
36
  from .MultiVuClient import Client
36
- from .MultiVuDataFile.MultiVuDataFile import MultiVuDataFile as _MultiVuDataFile
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 TStartupAxisType as _TStartupAxisType
39
- from .MultiVuDataFile.MultiVuDataFile import TTimeUnits as _TTimeUnits
42
+ from .MultiVuDataFile.MultiVuDataFile import \
43
+ TStartupAxisType as _TStartupAxisType
40
44
  from .MultiVuDataFile.MultiVuDataFile import TTimeMode as _TTimeMode
41
- from .MultiVuDataFile.MultiVuDataFile import LabelResult
42
- from .MultiVuDataFile.MultiVuDataFile import MultiVuFileException
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, file_path: str) -> DataFrame:
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.1.2"
2
+ __version__ = "3.3.0"
@@ -3,8 +3,8 @@ Custom exceptions for MultiPyVu
3
3
  """
4
4
 
5
5
 
6
- from sys import exit, platform
7
6
  from enum import IntEnum
7
+ from sys import exit, platform
8
8
  from typing import Tuple
9
9
 
10
10
 
@@ -10,9 +10,9 @@ in the same location as the cop file and will have the same
10
10
  name with the .py ending.
11
11
  """
12
12
 
13
- from sys import argv, exit
14
13
  import os.path
15
14
  import re
15
+ from sys import argv, exit
16
16
 
17
17
  from MultiPyVu.CommandSdo import SdoObject, val_type
18
18
 
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
- # Use WMIC to get the list of running programs with 'multivu'
223
- # in their path
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
- exe_search = r'([\w]*).exe[ ]*\"([:\\\w]*.exe)"[ \/\-a-zA-Z]*([0-9]*)'
232
- open_mv_dict = {}
233
- for i in proc.stdout.split('\n\n'):
234
- exe_found = re.findall(exe_search, i)
235
- if len(exe_found) > 0:
236
- name, location, process_id = exe_found[0]
237
- exe_name = name + '.exe'
238
- common_name = self._exe_to_common_name(exe_name)
239
- open_mv_dict[common_name] = (location,
240
- exe_name,
241
- process_id,
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:
@@ -1,6 +1,11 @@
1
- from os import path
1
+ '''
2
+ logging_config.py is used to hold methods to help with the logging module
3
+ '''
4
+
2
5
  import logging.config
3
6
  from logging import Logger
7
+ from os import path
8
+
4
9
  import yaml
5
10
 
6
11
  from .project_vars import LOG_NAME
@@ -6,7 +6,8 @@ formatters:
6
6
  no_name:
7
7
  format: '%(message)s'
8
8
  debug:
9
- format: '%(asctime)-27s %(name)-20s %(levelname)-8s %(message)s'
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
@@ -2,10 +2,10 @@
2
2
  A few helpful scripts used in the MultiPyVu module
3
3
  """
4
4
 
5
+ import re
6
+ import subprocess
5
7
  from os import path
6
8
  from sys import platform
7
- import subprocess
8
- import re
9
9
 
10
10
  from MultiPyVu.MultiVuClient import Client
11
11
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: MultiPyVu
3
- Version: 3.1.2
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
@@ -8,23 +8,19 @@ Created on Mon Jun 7 23:47:19 2021
8
8
  @author: D. Jackson
9
9
  """
10
10
 
11
- from sys import platform
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 socket
16
- import selectors
17
- import re
17
+ import traceback
18
18
  from enum import IntEnum, auto, IntFlag
19
- import logging
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':
@@ -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 ..MultiVuServer import Server
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):
@@ -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