"""
Load the 32-bit ``OL756SDKActiveXCtrl`` library using :ref:`msl-loadlib-welcome`.
"""
import os
import re
from msl.loadlib import Client64
from msl.loadlib import ConnectionTimeoutError
from msl.loadlib import Server32Error
from msl.equipment.connection import Connection
from msl.equipment.exceptions import OptronicLaboratoriesError
from msl.equipment.resources import register
[docs]@register(manufacturer=r'Optronic', model=r'(OL)?\s*756', flags=re.IGNORECASE)
class OL756(Connection):
def __init__(self, record=None):
"""A wrapper around the ``OL756SDKActiveXCtrl`` library.
.. attention::
See the :class:`.ol756ocx_32.OL756` class for all available methods.
This class can be used with either a 32- or 64-bit Python interpreter
to call the 32-bit functions in the ``OL756SDKActiveXCtrl`` library.
The :attr:`~msl.equipment.record_types.ConnectionRecord.properties`
for an OL756 connection supports the following key-value pairs in the
:ref:`connections-database`::
'mode': int, connection mode (0=RS232, 1=USB) [default: 1]
'com_port': int, the COM port number (RS232 mode only) [default: 1]
Do not instantiate this class directly. Use the :meth:`~.EquipmentRecord.connect`
method to connect to the equipment.
Parameters
----------
record : :class:`~.EquipmentRecord`
A record from an :ref:`equipment-database`.
"""
super(OL756, self).__init__(record)
self.set_exception_class(OptronicLaboratoriesError)
self._client = None
error = None
try:
self._client = Client64(
os.path.join(os.path.dirname(__file__), 'ol756ocx_32.py'),
prog_id=record.connection.address[5:],
mode=record.connection.properties.get('mode', 1),
com_port=record.connection.properties.get('com_port', 1),
)
except ConnectionTimeoutError as e:
error = e.reason
if error:
self.raise_exception('Cannot initialize the OL756 SDK.\n{}'.format(error))
self._request32 = self._client.request32
if self._request32('mode') == -1:
self.disconnect()
self.raise_exception(
'Cannot connect to the OL756 spectroradiometer. '
'Is it turned on and connected to the computer?'
)
self.log_debug('Connected to %s', record.connection)
def __getattr__(self, attr):
def send(*args, **kwargs):
try:
self.log_debug('%s.%s(%s, %s)', self.__class__.__name__, attr, args, kwargs)
return self._request32(attr, *args, **kwargs)
except Server32Error as e:
error = e
self.raise_exception(error)
return send
[docs] def disconnect(self):
"""Disconnect from the OL756 spectroradiometer."""
if not self._client:
return
try:
self._request32('connect_to_ol756', -1)
except:
pass
try:
stdout, stderr = self._client.shutdown_server32()
stdout.close()
stderr.close()
except:
pass
self._client = None
self.log_debug('Disconnected from %s', self.equipment_record.connection)