def test_Worker_jobs__quit_without_start(): print_title("Worker_jobs - quit without start") app = create_QApplication() qdev = QDeviceIO(FakeDevice()) qdev.create_worker_jobs() tprint("About to quit") app.processEvents() assert qdev.quit() == True app.quit()
def test_Worker_jobs__no_device_attached(): print_title("Worker_jobs - no device attached") import pytest qdev = QDeviceIO() with pytest.raises(SystemExit) as pytest_wrapped_e: qdev.create_worker_jobs() assert pytest_wrapped_e.type == SystemExit dprint("Exit code: %i" % pytest_wrapped_e.value.code) assert pytest_wrapped_e.value.code == 99
def test_Worker_DAQ___lose_connection(): print_title("Worker_DAQ - INTERNAL_TIMER - lose connection") def DAQ_function(): # Must return True when successful, False otherwise if qdev.update_counter_DAQ == 10: dev.is_alive = False reply = dev.fake_query_1() return reply[-4:] == "0101" # NOTE: The global 'go' mechanism used here is a quick and dirty way to # pytest. In production, it should be implemented by an boolean external # class member. global go go = True @QtCore.pyqtSlot() def process_connection_lost(): tprint("---> received: connection_lost") global go go = False app = create_QApplication() dev = FakeDevice() # Forcefully remove members as extra test del dev.name del dev.is_alive qdev = QDeviceIO(dev) # fmt: off qdev.create_worker_DAQ(DAQ_trigger=DAQ_TRIGGER.INTERNAL_TIMER, DAQ_function=DAQ_function, DAQ_interval_ms=20, critical_not_alive_count=3, debug=DEBUG) # fmt: on qdev.create_worker_jobs(debug=DEBUG) qdev.signal_connection_lost.connect(process_connection_lost) assert qdev.start() == True # Simulate device runtime while go: app.processEvents() time.sleep(0.001) # Do not hog the CPU tprint("About to quit") app.processEvents() assert qdev.quit() == True assert qdev.quit() == True # Twice, to check for msg 'already closed'. app.quit()
def test_Worker_jobs__jobs_function(): print_title("Worker_jobs - jobs_function") def jobs_function(func, args): if func == "special command": dev.fake_query_2() else: # Default job handling where, e.g. # func = self.dev.write # args = ("toggle LED",) func(*args) app = create_QApplication() dev = FakeDevice() qdev = QDeviceIO(dev) qdev.create_worker_jobs( jobs_function=jobs_function, debug=DEBUG, ) qdev.signal_jobs_updated.connect(process_jobs_updated) assert qdev.start() == True # Immediately fire a call to test if the worker is ready for it qdev.send(dev.fake_query_2) # fmt: off # Simulate device runtime start_time = time.perf_counter() QtCore.QTimer.singleShot(100, lambda: qdev.send("special command")) QtCore.QTimer.singleShot( 200, lambda: qdev.send(dev.fake_command_with_argument, 0)) # fmt: on while time.perf_counter() - start_time < 0.5: app.processEvents() time.sleep(0.001) # Do not hog the CPU tprint("About to quit") app.processEvents() assert qdev.quit() == True app.quit() assert dev.count_commands == 3 assert dev.count_replies == 2 assert cnt_jobs_updated == 3
def test_Worker_jobs(start_alive=True): print_title("Worker_jobs" + ("" if start_alive else " - start dead")) app = create_QApplication() dev = FakeDevice(start_alive=start_alive) qdev = QDeviceIO(dev) qdev.create_worker_jobs(debug=DEBUG) qdev.signal_jobs_updated.connect(process_jobs_updated) assert qdev.start() == start_alive # Immediately fire a call to test if the worker is ready for it qdev.add_to_jobs_queue(dev.fake_query_2) # fmt: off # Simulate device runtime start_time = time.perf_counter() QtCore.QTimer.singleShot(100, qdev.process_jobs_queue) QtCore.QTimer.singleShot(200, lambda: qdev.send(dev.fake_query_2)) QtCore.QTimer.singleShot( 300, lambda: qdev.add_to_jobs_queue(dev.fake_command_with_argument, 0)) QtCore.QTimer.singleShot( 400, lambda: qdev.add_to_jobs_queue(dev.fake_command_with_argument, 0)) QtCore.QTimer.singleShot( 500, lambda: qdev.add_to_jobs_queue(dev.fake_command_with_argument, 0)) QtCore.QTimer.singleShot(600, qdev.process_jobs_queue) QtCore.QTimer.singleShot( 700, lambda: qdev.send("trigger_illegal_function_call_error")) # fmt: on while time.perf_counter() - start_time < 1: app.processEvents() time.sleep(0.001) # Do not hog the CPU tprint("About to quit") app.processEvents() assert qdev.quit() == True app.quit() if start_alive: assert dev.count_commands == 5 assert dev.count_replies == 2 assert cnt_jobs_updated == 4
# -------------------------------------------------------------------------- # Set up multithreaded communication with the Arduino # -------------------------------------------------------------------------- # Create QDeviceIO qdev_ard = QDeviceIO(ard) # Create workers qdev_ard.create_worker_DAQ( DAQ_function=DAQ_function, DAQ_interval_ms=DAQ_INTERVAL_MS, critical_not_alive_count=1, debug=DEBUG, ) qdev_ard.create_worker_jobs(debug=DEBUG) # Connect signals to slots qdev_ard.signal_DAQ_updated.connect(window.update_GUI) qdev_ard.signal_connection_lost.connect(notify_connection_lost) # Hack. TODO: Implement start/stop in `QDeviceIO` def start_stop(): qdev_ard.worker_DAQ.DAQ_function = ( DAQ_function if window.qpbt_running.isChecked() else None) window.qpbt_running.clicked.connect(start_stop) # Start workers qdev_ard.start(DAQ_priority=QtCore.QThread.TimeCriticalPriority)