diff --git a/hardwarelibrary/__init__.py b/hardwarelibrary/__init__.py index d3c83453..9e86fa70 100644 --- a/hardwarelibrary/__init__.py +++ b/hardwarelibrary/__init__.py @@ -33,6 +33,6 @@ import hardwarelibrary.oscilloscope import hardwarelibrary.motion -# import hardwarelibrary.cameras -# import sources #TODO: Not much to see here yet +# import hardwarelibrary.cameras +# import hardwarelibrary.sources diff --git a/hardwarelibrary/daq/labjackdevice.py b/hardwarelibrary/daq/labjackdevice.py index 8c762c74..f4a52d7b 100644 --- a/hardwarelibrary/daq/labjackdevice.py +++ b/hardwarelibrary/daq/labjackdevice.py @@ -5,8 +5,8 @@ class LabjackDevice(PhysicalDevice, AnalogIOProtocol, DigitalIOProtocol): classIdVendor = 0x0cd5 classIdProduct = 0x003 - def __init__(self, serialNumber="*"): - super().__init__(serialNumber, idProduct=0x003, idVendor=0x0cd5) + def __init__(self, serialNumber="*", idProduct=0x003, idVendor=0x0cd5): + super().__init__(serialNumber, idProduct=idProduct, idVendor=idVendor) self.dev = None def doInitializeDevice(self): diff --git a/hardwarelibrary/devicemanager.py b/hardwarelibrary/devicemanager.py index f31f0fc8..05b3c988 100644 --- a/hardwarelibrary/devicemanager.py +++ b/hardwarelibrary/devicemanager.py @@ -218,7 +218,7 @@ def usbDeviceConnected(self, usbDevice): # This may throw if incompat: # deviceInstanceible try: - candidateClass(serialNumber=descriptor.serialNumber, + deviceInstance = candidateClass(serialNumber=descriptor.serialNumber, idProduct=descriptor.idProduct, idVendor=descriptor.idVendor) deviceInstance.initializeDevice() diff --git a/hardwarelibrary/spectrometers/oceaninsight.py b/hardwarelibrary/spectrometers/oceaninsight.py index 15edc678..b051d94f 100644 --- a/hardwarelibrary/spectrometers/oceaninsight.py +++ b/hardwarelibrary/spectrometers/oceaninsight.py @@ -815,6 +815,12 @@ class USB2000Plus(USB4000_2000Plus): def __init__(self, serialNumber=None, idProduct:int = None, idVendor:int = None): USB4000_2000Plus.__init__(self, serialNumber=serialNumber, idProduct=idProduct, idVendor=idVendor, model="USB2000+") +class SAS(USB4000_2000Plus): + classIdProduct = 0x1006 + + def __init__(self, serialNumber=None, idProduct:int = None, idVendor:int = None): + USB4000_2000Plus.__init__(self, serialNumber=serialNumber, idProduct=idProduct, idVendor=idVendor) + class DebugSpectro: class Emitter(NamedTuple): diff --git a/hardwarelibrary/tests/testIntegraDevice.py b/hardwarelibrary/tests/testIntegraDevice.py index 5bf4280f..9246de32 100644 --- a/hardwarelibrary/tests/testIntegraDevice.py +++ b/hardwarelibrary/tests/testIntegraDevice.py @@ -12,7 +12,10 @@ class TestIntegraDevice(unittest.TestCase): def setUp(self): self.device = IntegraDevice() self.assertIsNotNone(self.device) - self.device.initializeDevice() + try: + self.device.initializeDevice() + except Exception as err: + self.skipTest("No IntegraDevice connected") def tearDown(self): self.device.shutdownDevice() @@ -39,8 +42,8 @@ def setUp(self): self.port = USBPort(idVendor=0x1ad5, idProduct=0x0300, interfaceNumber=0, defaultEndPoints=(1,2)) try: self.port.open() - except: - raise (unittest.SkipTest("No devices connected")) + except Exception as err: + self.skipTest("No IntegraDevice connected") def tearDown(self): self.port.close() diff --git a/hardwarelibrary/tests/testIntellidrive.py b/hardwarelibrary/tests/testIntellidrive.py index 272419cb..00eeeb4f 100644 --- a/hardwarelibrary/tests/testIntellidrive.py +++ b/hardwarelibrary/tests/testIntellidrive.py @@ -13,7 +13,7 @@ def setUp(self): self.portPath = None ports = serial.tools.list_ports.comports() for port in ports: - if port.vid == 0x0403 and port.pid == 0x6001: # Sutter Instruments + if port.vid == 0x0403 and port.pid == 0x6001: self.portPath = "/dev/cu.usbserial-{0}".format(serialNumber) if self.portPath is None: @@ -63,6 +63,10 @@ def testPySerialPortHome(self): class TestIntellidriveDeviceWithSerialPort(unittest.TestCase): + def setUp(self): + ports = SerialPort.matchPorts(serialNumber=serialNumber, idVendor=0x0403, idProduct=0x6001) + if not ports: + self.skipTest("No Intellidrive connected") def testPort(self): port = SerialPort.matchPorts(serialNumber=serialNumber, idVendor=0x0403, idProduct = 0x6001) @@ -126,48 +130,37 @@ def testHomeWithCommands(self): port.close() class TestIntellidrivePhysicalDevice(unittest.TestCase): + def setUp(self): + try: + self.dev = IntellidriveDevice(serialNumber=serialNumber) + self.dev.initializeDevice() + except Exception: + self.skipTest("No Intellidrive connected") + + def tearDown(self): + self.dev.shutdownDevice() + def testDeviceCreate(self): self.assertIsNotNone(IntellidriveDevice(serialNumber="AH06UKI3")) def testDeviceInitialize(self): - dev = IntellidriveDevice(serialNumber=serialNumber) - self.assertIsNotNone(dev) - dev.initializeDevice() - dev.shutdownDevice() + self.assertIsNotNone(self.dev) def testDeviceHome(self): - dev = IntellidriveDevice(serialNumber=serialNumber) - self.assertIsNotNone(dev) - dev.initializeDevice() - dev.doHome() - dev.shutdownDevice() + self.dev.doHome() def testDeviceMove(self): - dev = IntellidriveDevice(serialNumber=serialNumber) - self.assertIsNotNone(dev) - dev.initializeDevice() - dev.doMoveTo(1000) - dev.shutdownDevice() + self.dev.doMoveTo(1000) def testOrientation(self): - dev = IntellidriveDevice(serialNumber=serialNumber) - self.assertIsNotNone(dev) - dev.initializeDevice() - print(dev.orientation()) - dev.shutdownDevice() + print(self.dev.orientation()) def testSpinAround(self): - dev = IntellidriveDevice(serialNumber=serialNumber) - self.assertIsNotNone(dev) - dev.initializeDevice() - for angle in [0, 180, 360, 720]: - dev.moveTo(angle) - actualOrientation = dev.orientation() + self.dev.moveTo(angle) + actualOrientation = self.dev.orientation() self.assertAlmostEqual(angle, actualOrientation, 2) - dev.shutdownDevice() - if __name__ == '__main__': unittest.main() diff --git a/hardwarelibrary/tests/testLabjackU3.py b/hardwarelibrary/tests/testLabjackU3.py index 04c61fc8..0b6b8481 100644 --- a/hardwarelibrary/tests/testLabjackU3.py +++ b/hardwarelibrary/tests/testLabjackU3.py @@ -11,9 +11,12 @@ class TestLabjackDevice(unittest.TestCase): def setUp(self): super().setUp() - self.device = LabjackDevice() - self.assertIsNotNone(self.device) - self.device.initializeDevice() + try: + self.device = LabjackDevice() + self.assertIsNotNone(self.device) + self.device.initializeDevice() + except Exception as err: + self.skipTest("No Labjack connected") def tearDown(self): super().tearDown() diff --git a/hardwarelibrary/tests/testLinearMotionDevice.py b/hardwarelibrary/tests/testLinearMotionDevice.py index 7bdb9e96..f7187b53 100644 --- a/hardwarelibrary/tests/testLinearMotionDevice.py +++ b/hardwarelibrary/tests/testLinearMotionDevice.py @@ -174,8 +174,14 @@ def setUp(self): class TestRealSutterDeviceBase(BaseTestCases.TestLinearMotionDevice): def setUp(self): - self.device = SutterDevice() + + try: + self.device = SutterDevice() + except Exception as err: + self.skipTest("No Sutter device connected") + super().setUp() + if __name__ == '__main__': unittest.main() diff --git a/hardwarelibrary/tests/testOscilloscope.py b/hardwarelibrary/tests/testOscilloscope.py index afedc801..7481788c 100644 --- a/hardwarelibrary/tests/testOscilloscope.py +++ b/hardwarelibrary/tests/testOscilloscope.py @@ -10,34 +10,26 @@ from hardwarelibrary.oscilloscope import * class TestTektronik(unittest.TestCase): - - def testCreate(self): + def setUp(self) -> None: self.device = OscilloscopeDevice() self.assertIsNotNone(self.device) + try : + self.device.initializeDevice() + except Exception as err: + self.skipTest("No Tektronik connected") - def testInit(self): - self.device = OscilloscopeDevice() - self.device.initializeDevice() + def tearDown(self) -> None: self.device.shutdownDevice() def testGetWaveform(self): - self.device = OscilloscopeDevice() - self.device.initializeDevice() self.device.getWaveform(Channels.CH1) self.device.getWaveform(Channels.CH2) - self.device.shutdownDevice() def testDisplayWaveform(self): - self.device = OscilloscopeDevice() - self.device.initializeDevice() self.device.displayWaveforms([Channels.CH1, Channels.CH2]) - self.device.shutdownDevice() def testDisplayWaveform(self): - self.device = OscilloscopeDevice() - self.device.initializeDevice() self.device.displayWaveforms([Channels.CH1, Channels.CH2]) - self.device.shutdownDevice() @unittest.skip("For understanding earlier on, not necessary anymore") diff --git a/hardwarelibrary/tests/testPhysicalDevice.py b/hardwarelibrary/tests/testPhysicalDevice.py index b5d58c8c..85bd1083 100644 --- a/hardwarelibrary/tests/testPhysicalDevice.py +++ b/hardwarelibrary/tests/testPhysicalDevice.py @@ -33,13 +33,13 @@ class BaseTestCases: class TestPhysicalDeviceBase(unittest.TestCase): def setUp(self): super().setUp() - DeviceManager().updateConnectedDevices() + # DeviceManager().updateConnectedDevices() self.device = None self.isRunning = False self.notificationReceived = None - DeviceManager().destroy() + # DeviceManager().destroy() NotificationCenter().destroy() def tearDown(self): @@ -47,7 +47,7 @@ def tearDown(self): self.device.shutdownDevice() self.device = None - DeviceManager().removeAllDevices() + # DeviceManager().removeAllDevices() super().tearDown() def testIsRunning(self): @@ -191,7 +191,11 @@ def setUp(self): class TestIntellidrivePhysicalDevice(BaseTestCases.TestPhysicalDeviceBase): def setUp(self): super().setUp() - self.device = IntellidriveDevice("AH06UKI3") + try: + self.device = IntellidriveDevice("AH06UKI3") + self.device.initializeDevice() + except Exception as err: + self.skipTest("No Intellidrive connected") class TestSpectrometerPhysicalDevice(BaseTestCases.TestPhysicalDeviceBase): def setUp(self): @@ -200,34 +204,34 @@ def setUp(self): self.device = DeviceManager().anySpectrometerDevice() self.assertIsNotNone(self.device) except Exception as err: - raise (unittest.SkipTest("No spectrometer connected")) + self.skipTest("No Spectro connected") class TestPowerMeterPhysicalDevice(BaseTestCases.TestPhysicalDeviceBase): def setUp(self): super().setUp() try: self.device = IntegraDevice() - self.assertIsNotNone(self.device) + self.device.initializeDevice() except Exception as err: - raise (unittest.SkipTest("No powermeter connected")) + self.skipTest("No powermeter connected") class TestTektronikPhysicalDevice(BaseTestCases.TestPhysicalDeviceBase): def setUp(self): super().setUp() try: self.device = OscilloscopeDevice() - self.assertIsNotNone(self.device) + self.device.initializeDevice() except Exception as err: - raise (unittest.SkipTest("No oscilloscope connected")) + self.skipTest("No Oscilloscope connected") class TestEchoPhysicalDevice(BaseTestCases.TestPhysicalDeviceBase): def setUp(self): super().setUp() try: self.device = EchoDevice() - self.assertIsNotNone(self.device) + self.device.initializeDevice() except Exception as err: - raise (unittest.SkipTest("No ECHO connected")) + self.skipTest("No ECHO connected") def testEchoCommands(self): self.device.initializeDevice() @@ -245,7 +249,7 @@ def setUp(self): self.device = DebugEchoDevice() self.assertIsNotNone(self.device) except Exception as err: - raise (unittest.SkipTest("No ECHO connected")) + self.skipTest("No ECHO connected") class TestCameraPhysicalDevice(BaseTestCases.TestPhysicalDeviceBase): @@ -255,7 +259,7 @@ def setUp(self): self.device = OpenCVCamera() self.assertIsNotNone(self.device) except Exception as err: - raise (unittest.SkipTest("No Facetime Camera connected")) + self.skipTest("No Facetime connected") class TestPhysicalDeviceCompatibilityClasses(unittest.TestCase): def testGetDeviceClasses(self): @@ -287,26 +291,33 @@ def testGetAllUSBVendorProductWithSpectrometers(self): usbIds = getAllUSBIds(Spectrometer) allIdVendors = set([ usbId[0] for usbId in usbIds ]) self.assertTrue(0x2457 in allIdVendors) - self.assertTrue(0x0bd7 in allIdVendors) self.assertTrue(debugClassIdVendor not in allIdVendors) def testGetConnectedDevices(self): - devices = PhysicalDevice.connectedDevices() - for idVendor, idProduct, possibleClasses in devices: - print("{0:x} {1:x} {2}".format(idVendor, idProduct, possibleClasses)) + try: + devices = PhysicalDevice.connectedDevices() + for idVendor, idProduct, possibleClasses in devices: + print("{0:x} {1:x} {2}".format(idVendor, idProduct, possibleClasses)) + except Exception: + self.skipTest("Unable to enumerate connected devices") def testGetStellarNetDevices(self): - devices = PhysicalDevice.connectedDevices() + try: + devices = PhysicalDevice.connectedDevices() + except Exception: + self.skipTest("Unable to enumerate connected devices") + if len(devices) == 0: + self.skipTest("No devices connected") self.assertEqual(len(devices), 1) def testInstantiateStellarNetDevice(self): - # devices = PhysicalDevice.connectedDevices() - # for idVendor, idProduct, possibleClasses in devices: - # print("{0:x} {1:x} {2}".format(idVendor, idProduct, possibleClasses)) - StellarNet.loadFirmwareOnConnectedDevices() - dev = StellarNet() - self.assertIsNotNone(dev) - dev.display() + try: + StellarNet.loadFirmwareOnConnectedDevices() + dev = StellarNet() + self.assertIsNotNone(dev) + dev.display() + except Exception: + self.skipTest("No StellarNet connected") if __name__ == '__main__': unittest.main() diff --git a/hardwarelibrary/tests/testPyUSB.py b/hardwarelibrary/tests/testPyUSB.py index ae8770f0..0e7dbe52 100644 --- a/hardwarelibrary/tests/testPyUSB.py +++ b/hardwarelibrary/tests/testPyUSB.py @@ -27,24 +27,33 @@ def testValidateBackendVerbose(self): def testUtilsConnectedDevices(self): devices = utils.connectedUSBDevices() - print(devices) - self.assertTrue(len(devices) > 0) + if len(devices) == 0: + self.skipTest("No USB devices connected") def testUtilsAppleConnectedDevices(self): devices = utils.connectedUSBDevices( [(0x05ac,0x8104)]) - self.assertTrue(len(devices) > 0) + if len(devices) == 0: + self.skipTest("No Apple USB device connected") def testUtilsRazrConnectedDevices(self): devices = utils.connectedUSBDevices( [(0x1532,0x0067)]) + if len(devices) == 0: + self.skipTest("No Razer device connected") self.assertTrue(len(devices) == 1) def testUtilsUniqueRazrConnectedDevices(self): - device = utils.uniqueUSBDevice( [(0x1532,0x0067)]) - self.assertIsNotNone(device) + try: + device = utils.uniqueUSBDevice( [(0x1532,0x0067)]) + self.assertIsNotNone(device) + except Exception: + self.skipTest("No Razer device connected") def testUtilsAnyRazrConnectedDevices(self): - device = utils.anyUSBDevice( [(0x1532,0x0067)]) - self.assertIsNotNone(device) + try: + device = utils.anyUSBDevice( [(0x1532,0x0067)]) + self.assertIsNotNone(device) + except Exception: + self.skipTest("No Razer device connected") def testUtilsFakeConnectedDevices(self): devices = utils.connectedUSBDevices( [(0x1532,0x0000)]) diff --git a/hardwarelibrary/tests/testSutterSerialPort.py b/hardwarelibrary/tests/testSutterSerialPort.py index 2567d49c..d506dc6f 100644 --- a/hardwarelibrary/tests/testSutterSerialPort.py +++ b/hardwarelibrary/tests/testSutterSerialPort.py @@ -6,62 +6,63 @@ from hardwarelibrary.motion.sutterdevice import SutterDevice -class TestSutterSerialPortBase: - port = None - - def testCreate(self): - self.assertIsNotNone(self.port) - - def testCantReopen(self): - self.assertIsNotNone(self.port) - self.assertTrue(self.port.isOpen) - with self.assertRaises(Exception) as context: +class BaseTestCases: + class TestSutterSerialPortBase(unittest.TestCase): + port = None + + def testCreate(self): + self.assertIsNotNone(self.port) + + def testCantReopen(self): + self.assertIsNotNone(self.port) + self.assertTrue(self.port.isOpen) + with self.assertRaises(Exception) as context: + self.port.open() + + def testCloseReopen(self): + self.assertIsNotNone(self.port) + self.assertTrue(self.port.isOpen) + self.port.close() self.port.open() - def testCloseReopen(self): - self.assertIsNotNone(self.port) - self.assertTrue(self.port.isOpen) - self.port.close() - self.port.open() - - def testCloseTwice(self): - self.assertIsNotNone(self.port) - self.assertTrue(self.port.isOpen) - self.port.close() - self.port.close() - - def testCantReadEmptyPort(self): - self.assertIsNotNone(self.port) - self.assertTrue(self.port.isOpen) - with self.assertRaises(CommunicationReadTimeout) as context: - self.port.readString() + def testCloseTwice(self): + self.assertIsNotNone(self.port) + self.assertTrue(self.port.isOpen) + self.port.close() + self.port.close() - def testMove(self): - self.assertIsNotNone(self.port) - payload = bytearray('m',encoding='utf-8') - payload.extend(pack("