Skip to content

Commit 41ecc9a

Browse files
committed
move the external trigger task to the daq
1 parent eb211b0 commit 41ecc9a

File tree

2 files changed

+52
-21
lines changed

2 files changed

+52
-21
lines changed

src/navigate/model/devices/daq/daq_ni.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import logging
3535
from threading import Lock
3636
import traceback
37+
import time
3738

3839
# Third Party Imports
3940
import nidaqmx
@@ -177,6 +178,53 @@ def set_external_trigger(self, external_trigger=None):
177178
task.register_done_event(None)
178179
task.register_done_event(self.restart_analog_task_callback_func(task))
179180

181+
def wait_for_external_trigger(
182+
self, trigger_channel, wait_internal=0.001, timeout=-1
183+
):
184+
"""Wait for a digital external trigger.
185+
186+
Parameters
187+
----------
188+
trigger_channel : str
189+
The name of the DAQ PFI digital input.
190+
wait_internal : float
191+
The internal waiting time to check the trigger
192+
timeout : float
193+
Continue on anyway if timeout is reached. timeout < 0 will
194+
run forever.
195+
196+
Returns
197+
-------
198+
result : bool
199+
True for the trigger, False for no trigger.
200+
"""
201+
if not trigger_channel:
202+
logger.info(
203+
"No external trigger channel is specified! Return from waiting!"
204+
)
205+
return False
206+
# Create a digital input task and wait until either a trigger is detected,
207+
# or the timeout is exceeded. If timeout < 0, wait forever...
208+
external_trigger_task = nidaqmx.Task("WaitDigitalEdge")
209+
external_trigger_task.di_channels.add_di_chan(self.trigger_channel)
210+
211+
total_wait_time = 0.0
212+
result = True
213+
214+
while not external_trigger_task.read():
215+
time.sleep(wait_internal)
216+
total_wait_time += wait_internal
217+
218+
if timeout > 0 and total_wait_time >= timeout:
219+
result = False
220+
break
221+
222+
# Close the task
223+
external_trigger_task.stop()
224+
external_trigger_task.close()
225+
226+
return result
227+
180228
@staticmethod
181229
def restart_analog_task_callback_func(task):
182230
"""Restart analog task callback function.

src/navigate/model/features/common_features.py

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,7 @@
3434
import time
3535
from functools import reduce
3636
from threading import Lock
37-
import copy
3837

39-
# Third party imports
40-
import nidaqmx
4138

4239
# Local application imports
4340
from .image_writer import ImageWriter
@@ -247,28 +244,14 @@ def signal_func(self):
247244
# Pause the data thread to prevent camera timeout
248245
self.model.pause_data_thread()
249246

250-
# Create a digital input task and wait until either a trigger is detected,
251-
# or the timeout is exceeded. If timeout < 0, wait forever...
252-
self.task = nidaqmx.Task('WaitDigitalEdge')
253-
self.task.di_channels.add_di_chan(self.trigger_channel)
254-
255-
total_wait_time = 0.
256-
257-
while not self.task.read():
258-
time.sleep(self.wait_interval)
259-
total_wait_time += self.wait_interval
260-
261-
if self.timeout > 0 and total_wait_time >= self.timeout:
262-
break
263-
264-
# Close the task
265-
self.task.stop()
266-
self.task.close()
247+
result = self.model.active_microscope.daq.wait_for_external_trigger(
248+
self.trigger_channel, self.wait_interval, self.timeout
249+
)
267250

268251
# Resume the data thread
269252
self.model.resume_data_thread()
270253

271-
return True
254+
return result
272255

273256
class WaitToContinue:
274257
"""WaitToContinue class for synchronizing signal and data acquisition.

0 commit comments

Comments
 (0)