Skip to content

Commit c08428c

Browse files
Merge pull request #942 from annie-xd-wang/fix-bug-in-loading-multiple-sutter-filter-wheels
2 parents 9bef995 + 61dc326 commit c08428c

File tree

2 files changed

+25
-11
lines changed

2 files changed

+25
-11
lines changed

src/navigate/model/devices/filter_wheel/sutter.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,10 +237,14 @@ def set_filter(self, filter_name, wait_until_done=True):
237237
)
238238
output_command = output_command.to_bytes(1, "little")
239239
self.serial.write(output_command)
240+
# read echoing back
241+
self.read(1)
240242

241243
# Wheel Position Change Delay
242244
if wait_until_done:
243245
time.sleep(self.wait_until_done_delay)
246+
# read 0D back.
247+
self.read(1)
244248

245249
def read(self, num_bytes):
246250
"""Reads the specified number of bytes from the serial port.
@@ -263,7 +267,8 @@ def read(self, num_bytes):
263267
"""
264268
for i in range(100):
265269
num_waiting = self.serial.inWaiting()
266-
if num_waiting == num_bytes:
270+
# if there are unread returns from previous commands
271+
if num_waiting >= num_bytes:
267272
break
268273
time.sleep(0.02)
269274
else:

test/model/devices/filter_wheel/test_sutter.py

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -111,15 +111,19 @@ def test_set_filter_init_not_finished(self):
111111
self.filter_wheel.init_finished = True
112112

113113
def test_set_filter_init_finished(self):
114-
self.mock_device_connection.reset_mock()
115-
self.filter_wheel.init_finished = True
116-
for i in range(6):
117-
self.filter_wheel.set_filter(
118-
list(self.filter_wheel.filter_dictionary.keys())[i],
119-
wait_until_done=True,
120-
)
121-
self.mock_device_connection.write.assert_called()
122-
self.mock_device_connection.read.assert_not_called()
114+
for wait_flag, read_num in [(True, 2), (False, 1)]:
115+
self.mock_device_connection.reset_mock()
116+
self.filter_wheel.init_finished = True
117+
read_count = 0
118+
for i in range(6):
119+
self.filter_wheel.set_filter(
120+
list(self.filter_wheel.filter_dictionary.keys())[i],
121+
wait_until_done=wait_flag,
122+
)
123+
self.mock_device_connection.write.assert_called()
124+
self.mock_device_connection.read.assert_called()
125+
read_count += read_num
126+
assert self.mock_device_connection.read.call_count == read_count
123127

124128
def test_set_filter_without_waiting(self):
125129
self.mock_device_connection.reset_mock()
@@ -138,9 +142,14 @@ def test_set_filter_without_waiting(self):
138142

139143
def test_read_wrong_number_bytes_returned(self):
140144
self.mock_device_connection.reset_mock()
145+
# fewer response bytes than expected
141146
with self.assertRaises(UserWarning):
142-
self.mock_device_connection.inWaiting.return_value = b"0x"
147+
# in_waiting() returns an integer.
148+
self.mock_device_connection.inWaiting.return_value = 1
143149
self.filter_wheel.read(num_bytes=10)
150+
# more response bytes than expected
151+
self.mock_device_connection.inWaiting.return_value = 12
152+
self.filter_wheel.read(num_bytes=10)
144153

145154
def test_read_correct_number_bytes_returned(self):
146155
# Mocked device connection expected to return 2 bytes

0 commit comments

Comments
 (0)