From d76fe584daf86ac5a377ba11f6c016704241c463 Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 17 Jun 2021 11:48:40 -0400 Subject: [PATCH 1/7] Update testOptotune.py --- hardwarelibrary/tests/testOptotune.py | 96 +++++++-------------------- 1 file changed, 23 insertions(+), 73 deletions(-) diff --git a/hardwarelibrary/tests/testOptotune.py b/hardwarelibrary/tests/testOptotune.py index 11a071d..ac78134 100644 --- a/hardwarelibrary/tests/testOptotune.py +++ b/hardwarelibrary/tests/testOptotune.py @@ -1,84 +1,34 @@ -import usb.core -import usb.util import unittest -from usbport import * from communicationport import SerialPort -import time class TestOptotune(unittest.TestCase): idVendor = 0x03eb idProduct = 0x2018 + port = None - # def asString(self, bytesRead): - # return bytes(bytesRead[:-2]).decode() - - # def testGetAnyDevice(self): - # self.assertIsNotNone(usb.core.find()) - - # def testGetThisDevice(self): - # dev = usb.core.find(idVendor=self.idVendor, idProduct=self.idProduct) - # self.assertIsNotNone(dev) - - # def testUSBPort(self): - # self.assertIsNotNone(USBPort(idVendor=self.idVendor, interfaceNumber=1)) - - # def testOptotuneManual(self): - # dev = usb.core.find(idVendor=self.idVendor) - # dev.reset() - # for config in dev: - # for i in range(config.bNumInterfaces): - # if dev.is_kernel_driver_active(i): - # print("Detaching") - # dev.detach_kernel_driver(i) - # else: - # print("Not attached") - # # dev.reset() - # dev.set_configuration() - # # usb.util.claim_interface(dev, 1) - # conf = dev.get_active_configuration() - - # # dev.set_configuration() - # # print(conf) - # intf0 = conf[(0,0)] - # intf1 = conf[(1,0)] - # # #print(intf) - # epOut = intf1[0] - # # print(epOut) - # epIn = intf1[1] - # # print(epIn) - # self.assertEqual(epOut.write(b'Start\r'), 6) - # print(epIn.read(size_or_buffer=7, timeout=5000)) - # # print(intf0[0].read(size_or_buffer=7, timeout=5000)) - # usb.util.dispose_resources(dev) def testSerialPort(self): - port = SerialPort(bsdPath='/dev/tty.usbmodem143101') - self.assertIsNotNone(port) - port.open() - self.assertTrue(port.isOpen) - reply = port.writeStringExpectMatchingString(string='Start', replyPattern='.*') - print(reply) - port.close() - # def testOptotuneUSBPort(self): - # optotune = USBPort(idVendor=self.idVendor, interfaceNumber=1) - # intf = optotune.interface - # #print(intf) - # epOut = intf[0] - # print(epOut) - # epIn = intf[1] - # print(epIn) - # self.assertEqual(epOut.write(b'Start\r'), 6) - # print(epIn.read(size_or_buffer=7, timeout=1000)) - - # def testOptotuneCommand(self): - # optotune = USBPort(idVendor=self.idVendor, interfaceNumber=1) - # intf = optotune.interface - # #print(intf) - # epOut = intf[0] - # print(epOut) - # epIn = intf[1] - # print(epIn) - # self.assertEqual(epOut.write(b'Start\r'), 6) - # print(epIn.read(size_or_buffer=7, timeout=1000)) + self.port = SerialPort(bsdPath='/dev/tty.usbmodem143101') + self.assertIsNotNone(self.port) + self.port = None + + def testOpenPort(self): + self.port = SerialPort(bsdPath='/dev/tty.usbmodem143101') + self.port.open(baudRate=38000) + self.assertTrue(self.port.isOpen) + self.port.close() + self.port = None + + def testWriteSimpleCommandToPort(self): + self.port = SerialPort(bsdPath='/dev/tty.usbmodem143101') + self.port.open() + self.assertTrue(self.port.isOpen) + + data = bytearray(b'') + self.port.writeData(data) + reply = self.port.readData(length=1) + + self.port.close() + self.port = None From a9a9b18786388f8bace815d34c04ee4e4e58a3bc Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 17 Jun 2021 11:51:37 -0400 Subject: [PATCH 2/7] Improved env.py, modified optotune --- hardwarelibrary/tests/env.py | 8 ++++---- hardwarelibrary/tests/testOptotune.py | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/hardwarelibrary/tests/env.py b/hardwarelibrary/tests/env.py index 977d263..e70c06d 100644 --- a/hardwarelibrary/tests/env.py +++ b/hardwarelibrary/tests/env.py @@ -10,8 +10,8 @@ ) # append module root directory to sys.path -sys.path.insert(0, "{0}/hardwarelibrary/communication".format(root)) -sys.path.insert(0, "{0}/hardwarelibrary/spectrometers".format(root)) -sys.path.insert(0, "{0}/hardwarelibrary/lasersources".format(root)) -sys.path.insert(0, "{0}/hardwarelibrary".format(root)) sys.path.insert(0, root) +# sys.path.insert(0, "{0}/hardwarelibrary/communication".format(root)) +# sys.path.insert(0, "{0}/hardwarelibrary/spectrometers".format(root)) +# sys.path.insert(0, "{0}/hardwarelibrary/lasersources".format(root)) +# sys.path.insert(0, "{0}/hardwarelibrary".format(root)) diff --git a/hardwarelibrary/tests/testOptotune.py b/hardwarelibrary/tests/testOptotune.py index ac78134..07668e3 100644 --- a/hardwarelibrary/tests/testOptotune.py +++ b/hardwarelibrary/tests/testOptotune.py @@ -1,5 +1,6 @@ import unittest -from communicationport import SerialPort +import env +from hardwarelibrary.communication import SerialPort class TestOptotune(unittest.TestCase): idVendor = 0x03eb From 964d524846014a107af59d365d95607a2301e27f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Val=C3=A9rie?= Date: Thu, 17 Jun 2021 12:51:21 -0400 Subject: [PATCH 3/7] Added tests for optotune --- hardwarelibrary/tests/testOptotune.py | 45 ++++++++++++++++++++------- 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/hardwarelibrary/tests/testOptotune.py b/hardwarelibrary/tests/testOptotune.py index 07668e3..869de6b 100644 --- a/hardwarelibrary/tests/testOptotune.py +++ b/hardwarelibrary/tests/testOptotune.py @@ -1,5 +1,6 @@ import unittest import env +import struct from hardwarelibrary.communication import SerialPort class TestOptotune(unittest.TestCase): @@ -7,30 +8,52 @@ class TestOptotune(unittest.TestCase): idProduct = 0x2018 port = None - def testSerialPort(self): - self.port = SerialPort(bsdPath='/dev/tty.usbmodem143101') + def test01SerialPort(self): + self.port = SerialPort(bsdPath='/dev/tty.usbmodem144201') self.assertIsNotNone(self.port) self.port = None - def testOpenPort(self): - self.port = SerialPort(bsdPath='/dev/tty.usbmodem143101') - self.port.open(baudRate=38000) + def test02OpenPort(self): + self.port = SerialPort(bsdPath='/dev/tty.usbmodem144201') + self.port.open(baudRate=115200) self.assertTrue(self.port.isOpen) self.port.close() + self.assertFalse(self.port.isOpen) self.port = None - def testWriteSimpleCommandToPort(self): - self.port = SerialPort(bsdPath='/dev/tty.usbmodem143101') - self.port.open() + def test03WriteStartCommandToPort(self): + self.port = SerialPort(bsdPath='/dev/tty.usbmodem144201') + self.port.open(baudRate=115200) self.assertTrue(self.port.isOpen) - data = bytearray(b'') - self.port.writeData(data) - reply = self.port.readData(length=1) + command = 'Start' + self.port.writeString(command) + reply = self.port.readString() + self.assertTrue(reply == 'Ready\r\n') self.port.close() self.port = None + def calculateCRC16bit(self, data) -> bytearray: + crc = 1234 + crcBytes = struct.pack('= 5) + self.port.close() + self.port = None if __name__ == '__main__': From a58971a8f28555159967eeb29c14fd3d52733f06 Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 17 Jun 2021 13:25:10 -0400 Subject: [PATCH 4/7] Checksum added --- hardwarelibrary/tests/testOptotune.py | 133 +++++++++++++++++--------- 1 file changed, 89 insertions(+), 44 deletions(-) diff --git a/hardwarelibrary/tests/testOptotune.py b/hardwarelibrary/tests/testOptotune.py index 869de6b..9e408c0 100644 --- a/hardwarelibrary/tests/testOptotune.py +++ b/hardwarelibrary/tests/testOptotune.py @@ -8,52 +8,97 @@ class TestOptotune(unittest.TestCase): idProduct = 0x2018 port = None - def test01SerialPort(self): - self.port = SerialPort(bsdPath='/dev/tty.usbmodem144201') - self.assertIsNotNone(self.port) - self.port = None - - def test02OpenPort(self): - self.port = SerialPort(bsdPath='/dev/tty.usbmodem144201') - self.port.open(baudRate=115200) - self.assertTrue(self.port.isOpen) - self.port.close() - self.assertFalse(self.port.isOpen) - self.port = None - - def test03WriteStartCommandToPort(self): - self.port = SerialPort(bsdPath='/dev/tty.usbmodem144201') - self.port.open(baudRate=115200) - self.assertTrue(self.port.isOpen) - - command = 'Start' - self.port.writeString(command) - reply = self.port.readString() - self.assertTrue(reply == 'Ready\r\n') - - self.port.close() - self.port = None + # def test01SerialPort(self): + # self.port = SerialPort(bsdPath='/dev/tty.usbmodem144201') + # self.assertIsNotNone(self.port) + # self.port = None + + # def test02OpenPort(self): + # self.port = SerialPort(bsdPath='/dev/tty.usbmodem144201') + # self.port.open(baudRate=115200) + # self.assertTrue(self.port.isOpen) + # self.port.close() + # self.assertFalse(self.port.isOpen) + # self.port = None + + # def test03WriteStartCommandToPort(self): + # self.port = SerialPort(bsdPath='/dev/tty.usbmodem144201') + # self.port.open(baudRate=115200) + # self.assertTrue(self.port.isOpen) + + # command = 'Start' + # self.port.writeString(command) + # reply = self.port.readString() + # self.assertTrue(reply == 'Ready\r\n') + + # self.port.close() + # self.port = None + + def createCRCTable(self): + # Create table, translated from C from https://static1.squarespace.com/static/5d9dde8d550f0a5f20b60b6a/t/601bc9aa063cc13aef894231/1612433909005/Optotune+Lens+Driver+4+manual.pdf + length = 256 + table = [0]*length + polynomial = 0xa001 + for i in range(length): + value = 0 + temp = i + for j in range(8): + if (value ^ temp) & 0x0001 != 0: + value = (value >> 1) ^ polynomial + else: + value = value >> 1 + temp = temp >> 1 + table[i] = value + return table + + def testTableCreation(self): + table = self.createCRCTable() + self.assertTrue(len(table) == 256) + self.assertTrue(sum(table) != 0) def calculateCRC16bit(self, data) -> bytearray: - crc = 1234 - crcBytes = struct.pack('= 5) - self.port.close() - self.port = None + """ + The C implementation is like this from the manual: + ushort crc = 0; // initial CRC value + for (int i = 0; i < bytes.Length; ++i) { + byte index = (byte)(crc ^ bytes[i]); + crc = (ushort)((crc >> 8) ^ table[index]); + } + """ + table = self.createCRCTable() + + crc = 0 + for byte in data: + index = (crc ^ byte) & 0xff + crc = (crc >> 8) ^ table[index] + + crcBytes = struct.pack('= 5) + # self.port.close() + # self.port = None if __name__ == '__main__': From d75d4d2a2aba81edb5812a27b49c0f4e13898c0d Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 17 Jun 2021 13:51:11 -0400 Subject: [PATCH 5/7] Update env.py --- hardwarelibrary/tests/env.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/hardwarelibrary/tests/env.py b/hardwarelibrary/tests/env.py index e70c06d..d1c4a99 100644 --- a/hardwarelibrary/tests/env.py +++ b/hardwarelibrary/tests/env.py @@ -11,7 +11,3 @@ # append module root directory to sys.path sys.path.insert(0, root) -# sys.path.insert(0, "{0}/hardwarelibrary/communication".format(root)) -# sys.path.insert(0, "{0}/hardwarelibrary/spectrometers".format(root)) -# sys.path.insert(0, "{0}/hardwarelibrary/lasersources".format(root)) -# sys.path.insert(0, "{0}/hardwarelibrary".format(root)) From a693dd81b98eb001e7dcb33514e59a0d7076ad34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Val=C3=A9rie?= Date: Thu, 17 Jun 2021 14:52:43 -0400 Subject: [PATCH 6/7] Add unpacking of the reply response --- hardwarelibrary/tests/testOptotune.py | 96 +++++++++++++++------------ 1 file changed, 55 insertions(+), 41 deletions(-) diff --git a/hardwarelibrary/tests/testOptotune.py b/hardwarelibrary/tests/testOptotune.py index 9e408c0..18ce45a 100644 --- a/hardwarelibrary/tests/testOptotune.py +++ b/hardwarelibrary/tests/testOptotune.py @@ -8,31 +8,31 @@ class TestOptotune(unittest.TestCase): idProduct = 0x2018 port = None - # def test01SerialPort(self): - # self.port = SerialPort(bsdPath='/dev/tty.usbmodem144201') - # self.assertIsNotNone(self.port) - # self.port = None - - # def test02OpenPort(self): - # self.port = SerialPort(bsdPath='/dev/tty.usbmodem144201') - # self.port.open(baudRate=115200) - # self.assertTrue(self.port.isOpen) - # self.port.close() - # self.assertFalse(self.port.isOpen) - # self.port = None - - # def test03WriteStartCommandToPort(self): - # self.port = SerialPort(bsdPath='/dev/tty.usbmodem144201') - # self.port.open(baudRate=115200) - # self.assertTrue(self.port.isOpen) - - # command = 'Start' - # self.port.writeString(command) - # reply = self.port.readString() - # self.assertTrue(reply == 'Ready\r\n') - - # self.port.close() - # self.port = None + def test01SerialPort(self): + self.port = SerialPort(bsdPath='/dev/tty.usbmodem144201') + self.assertIsNotNone(self.port) + self.port = None + + def test02OpenPort(self): + self.port = SerialPort(bsdPath='/dev/tty.usbmodem144201') + self.port.open(baudRate=115200) + self.assertTrue(self.port.isOpen) + self.port.close() + self.assertFalse(self.port.isOpen) + self.port = None + + def test03WriteStartCommandToPort(self): + self.port = SerialPort(bsdPath='/dev/tty.usbmodem144201') + self.port.open(baudRate=115200) + self.assertTrue(self.port.isOpen) + + command = 'Start' + self.port.writeString(command) + reply = self.port.readString() + self.assertTrue(reply == 'Ready\r\n') + + self.port.close() + self.port = None def createCRCTable(self): # Create table, translated from C from https://static1.squarespace.com/static/5d9dde8d550f0a5f20b60b6a/t/601bc9aa063cc13aef894231/1612433909005/Optotune+Lens+Driver+4+manual.pdf @@ -84,22 +84,36 @@ def testValidateChecksum(self): self.assertEqual(crc[0], 0x26) self.assertEqual(crc[1], 0x93) - # def test04WriteSetCurrent(self): - # self.port = SerialPort(bsdPath='/dev/tty.usbmodem144201') - # self.port.open(baudRate=115200) - # self.assertTrue(self.port.isOpen) - - # dataSetCurrent = bytearray(b'Aw\x02\xbb') - # crc16 = self.calculateCRC16bit(dataSetCurrent) - # dataSetCurrent.extend(crc16) - # self.port.writeData(dataSetCurrent) - # error = self.port.readString() - # self.assertTrue(error[0] == 'E') - # self.assertTrue(error[1] == '1') - # self.assertTrue(len(error) >= 5) - # self.port.close() - # self.port = None - + def test04WriteSetCurrent(self): + self.port = SerialPort(bsdPath='/dev/tty.usbmodem144201') + self.port.open(baudRate=115200) + self.assertTrue(self.port.isOpen) + + dataSetCurrent = bytearray(b'Aw\x02\xbb') + crc16 = self.calculateCRC16bit(dataSetCurrent) + dataSetCurrent.extend(crc16) + self.port.writeData(dataSetCurrent) + self.port.close() + self.port = None + + def test05WriteSetCurrent(self): + self.port = SerialPort(bsdPath='/dev/tty.usbmodem144201') + self.port.open(baudRate=115200) + self.assertTrue(self.port.isOpen) + + dataSetCurrent = bytearray(b'CrMA\x00\x00') + crc16 = self.calculateCRC16bit(dataSetCurrent) + dataSetCurrent.extend(crc16) + self.port.writeData(dataSetCurrent) + + reply = self.port.readData(length=9) + print(reply) + print(len(reply)) + unpackReply = struct.unpack('!ccchHcc', reply) + self.assertTrue(len(reply) == 9) + print(unpackReply) + self.port.close() + self.port = None if __name__ == '__main__': unittest.main() From a3e7185f24917dfadff9181686ef6d03eaf23bbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Val=C3=A9rie?= Date: Thu, 17 Jun 2021 15:03:40 -0400 Subject: [PATCH 7/7] Add comments for better comprehension of the script --- hardwarelibrary/tests/testOptotune.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/hardwarelibrary/tests/testOptotune.py b/hardwarelibrary/tests/testOptotune.py index 18ce45a..aabbc3a 100644 --- a/hardwarelibrary/tests/testOptotune.py +++ b/hardwarelibrary/tests/testOptotune.py @@ -8,11 +8,13 @@ class TestOptotune(unittest.TestCase): idProduct = 0x2018 port = None +# Test 1 : Verify is the port tty.usbmodem144201 exists and is detected genre. def test01SerialPort(self): self.port = SerialPort(bsdPath='/dev/tty.usbmodem144201') self.assertIsNotNone(self.port) self.port = None +# Test 2 : By using the function open(), is the port open? By using the function close(), is the port closed? def test02OpenPort(self): self.port = SerialPort(bsdPath='/dev/tty.usbmodem144201') self.port.open(baudRate=115200) @@ -21,6 +23,7 @@ def test02OpenPort(self): self.assertFalse(self.port.isOpen) self.port = None +# Test 3 : By using the function open(), is the port open? By sending the command "Start", is the driver replying the right command "Ready\r\n"? def test03WriteStartCommandToPort(self): self.port = SerialPort(bsdPath='/dev/tty.usbmodem144201') self.port.open(baudRate=115200) @@ -34,8 +37,9 @@ def test03WriteStartCommandToPort(self): self.port.close() self.port = None +# Calculates the crc for the optotune part 1 (create a table). Translated from C from https://static1.squarespace.com/static/5d9dde8d550f0a5f20b60b6a/t/601bc9aa063cc13aef894231/1612433909005/Optotune+Lens+Driver+4+manual.pdf def createCRCTable(self): - # Create table, translated from C from https://static1.squarespace.com/static/5d9dde8d550f0a5f20b60b6a/t/601bc9aa063cc13aef894231/1612433909005/Optotune+Lens+Driver+4+manual.pdf + # Create table length = 256 table = [0]*length polynomial = 0xa001 @@ -51,11 +55,13 @@ def createCRCTable(self): table[i] = value return table +# Test 6 : Is the table produced with the previous function is of 256 characters and not only zeros? def testTableCreation(self): table = self.createCRCTable() self.assertTrue(len(table) == 256) self.assertTrue(sum(table) != 0) +# Calculates the crc for the optotune part 2. def calculateCRC16bit(self, data) -> bytearray: """ The C implementation is like this from the manual: @@ -75,15 +81,15 @@ def calculateCRC16bit(self, data) -> bytearray: crcBytes = struct.pack('