SingleReadWidget.py 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. # -*- coding: utf-8 -*-
  2. """
  3. This Module is the SingleRead window.
  4. """
  5. from PyQt4 import QtGui
  6. from ..base import kcgwidget as kcgw
  7. from ..base import backendinterface as bif
  8. from ..base.groupedelements import Elements
  9. from ..base.backend import board
  10. from ..base.backend.board import available_boards
  11. from ..base.storage import storage
  12. from ..base.globals import glob as global_objects
  13. from .. import config
  14. import time
  15. tr = kcgw.tr
  16. __widget_id__ = None
  17. class SingleReadWidget(kcgw.KCGWidgets):
  18. """
  19. The actual single read window.
  20. """
  21. def __init__(self, unique_id, parent=None):
  22. """
  23. Initialise the single read widget
  24. :param unique_id: the id for this widget
  25. :param parent: parent object
  26. :return: -
  27. """
  28. super(SingleReadWidget, self).__init__()
  29. self.id = unique_id
  30. self.par = parent
  31. self.layout = QtGui.QGridLayout()
  32. self.outerLayout = QtGui.QVBoxLayout()
  33. self.setLayout(self.outerLayout)
  34. # ---------[ Create Labels and corresponding Fields ]---------
  35. self.single_read_button = self.createButton(tr("Button", "Single Acquisition"), connect=self.on_single_read)
  36. self.continuous_read_button = self.createButton(tr("Button", "Continuous Acquisition"),
  37. connect=lambda: self.on_continuous_read(available_boards[0]))
  38. self.single_read_input = self.createInput()
  39. self.interval_spinbox = self.createSpinbox(0, 100000, start_value=1000)
  40. self.interval_spinbox.valueChanged.connect(self.set_interval)
  41. self.board_ticks = {board_id: self.createCheckbox(str(board_id), checked=True if board_id==0 else False) for board_id in available_boards}
  42. self.board_ticks_continuous_read = {
  43. board_id: self.createCheckbox(str(board_id),
  44. connect=lambda state, b_id=board_id:
  45. self.on_continuous_read(state, board_id=b_id))
  46. for board_id in available_boards
  47. }
  48. for board_id, tick in list(self.board_ticks_continuous_read.items()):
  49. Elements.addItem('acquireTrigger_{}'.format(board_id), tick)
  50. Elements.addItem(["acquire_{}".format(board_id), "no_board_{}".format(board_id)], tick)
  51. Elements.addItem('continuous_read_{}'.format(board_id), tick)
  52. for board_id, tick in self.board_ticks.items():
  53. Elements.addItem('acquireTrigger_{}'.format(board_id), tick)
  54. Elements.addItem(["acquire_{}".format(board_id), "no_board_{}".format(board_id)], tick)
  55. # --------[ Fill Grid ]----------------
  56. self.layout.addWidget(self.continuous_read_button, 0, 1)
  57. self.layout.addWidget(self.single_read_button, 1, 1)
  58. self.layout.addWidget(self.createLabel(tr("Label", "info:")), 2, 0)
  59. self.layout.addWidget(self.single_read_input, 2, 1)
  60. self.layout.addWidget(self.createLabel(tr("Label", "Interval:") + " (ms)"), 3, 0)
  61. self.layout.addWidget(self.interval_spinbox, 3, 1)
  62. self.setWindowTitle(tr("Heading", "Single and Continuous Read"))
  63. #01.04.2021 by Timo
  64. #We currently only support a single board.
  65. #However, this might change again in the future, so we only hide
  66. #the board selection checkbox until then, to avoid confusion
  67. '''
  68. self.tickLayout = QtGui.QHBoxLayout()
  69. self.tickLayout.addWidget(self.createLabel(
  70. tr("Label", "Boards"), tooltip=tr("Tooltip", "Check the board you want to select for single read"))
  71. )
  72. self.tickLayout.addStretch(1)
  73. for tick in list(self.board_ticks.values()):
  74. self.tickLayout.addWidget(tick)
  75. self.tickLayoutContinuousRead = QtGui.QHBoxLayout()
  76. self.tickLayoutContinuousRead.addWidget(self.createLabel(
  77. tr("Label", "Continuous Read"),
  78. tooltip=tr("Tooltip",
  79. "Tick the board you want to continuously read."
  80. "\nThe selected boards will continue reading until the checkbox is unticked.")
  81. )
  82. )
  83. self.tickLayoutContinuousRead.addStretch(1)
  84. for tick in list(self.board_ticks_continuous_read.values()):
  85. self.tickLayoutContinuousRead.addWidget(tick)
  86. self.outerLayout.addLayout(self.tickLayoutContinuousRead)
  87. self.outerLayout.addLayout(self.tickLayout)
  88. '''
  89. self.outerLayout.addLayout(self.layout)
  90. self.set_interval()
  91. def on_single_read(self):
  92. """
  93. Perform a single read on all boards which ticks are set
  94. :return:
  95. """
  96. for board_id, tick in self.board_ticks.items():
  97. if tick.isChecked() and tick.isEnabled():
  98. print(time.time(), 'on_single_read start')
  99. bif.bk_single_read(board_id, str(self.single_read_input.text()))
  100. print(time.time(), 'on_single_read stop')
  101. def on_continuous_read(self, board_id):
  102. """
  103. Toggle function to toggle continuous read when the corresponding button is pressed.
  104. :param bool state: True to activate and False to deactivate continuous read for board_id
  105. :param int? board_id: the id of the board to take action with
  106. :return: -
  107. """
  108. # if self.board_ticks_continuous_read[id].isChecked():
  109. self.set_interval()
  110. if not board.get_board_status(board_id).continuous_read:
  111. self.continuous_read_button.setText(tr("Button", "Stop Acquisition"))
  112. self.single_read_button.setEnabled(False)
  113. # self.continuous_read[id] = True
  114. # self.board_ticks_continuous_read[board_id].setStyleSheet("border-color: green; border-width: 3px;")
  115. else:
  116. self.continuous_read_button.setText(tr("Button", "Continuous Acquisition"))
  117. #self.board_ticks_continuous_read[board_id].setStyleSheet("")
  118. self.single_read_button.setEnabled(True)
  119. #Note:
  120. #bk_continuous_read is a toggle function.
  121. #Each call switches from off to on, and vice versa
  122. bif.bk_continuous_read(board_id) # interval=self.interval_spinbox.value())
  123. def set_interval(self):
  124. """
  125. Set the interval between reads
  126. """
  127. storage.continuous_interval = self.interval_spinbox.value()
  128. def closeEvent(self, event):
  129. """
  130. Event handler to handle the event of closing this window and gracefully delete ids and such
  131. :param event: the event to process (gets passed by PyQt)
  132. """
  133. global __widget_id__
  134. __widget_id__ = None
  135. del self.par.widgets[self.id]
  136. Elements.removeItem(['no_board', 'acquire'],
  137. [
  138. self.single_read_button,
  139. # self.continuous_read_button
  140. ])
  141. for board_id, tick in list(self.board_ticks_continuous_read.items()):
  142. Elements.removeItem(
  143. [
  144. "continuous_read_{}".format(board_id),
  145. "acquireTrigger_{}".format(board_id),
  146. "acquire_{}".format(board_id),
  147. "no_board_{}".format(board_id)
  148. ], tick)
  149. for board_id, tick in self.board_ticks.items():
  150. Elements.removeItem(
  151. [
  152. "acquireTrigger_{}".format(board_id),
  153. "acquire_{}".format(board_id),
  154. "no_board_{}".format(board_id)
  155. ], tick)
  156. super(SingleReadWidget, self).closeEvent(event)
  157. def addSingleReadWidget():
  158. """
  159. Add this widget to the gui.
  160. This function will actually open the subwindow.
  161. :return: -
  162. """
  163. global __widget_id__
  164. if __widget_id__:
  165. global_objects.get_global('area').widgets[__widget_id__].setFocus()
  166. else:
  167. nid = kcgw.idg.genid()
  168. __widget_id__ = nid
  169. w = SingleReadWidget(nid, global_objects.get_global('area'))
  170. global_objects.get_global('area').newWidget(w, "Single and Continuous Read", nid, widget_type=4, minSize=True) # TODO: proper type
  171. kcgw.register_widget(QtGui.QIcon(config.icon_path(config.singleReadIcon)),
  172. tr("Heading", "Single Read"),
  173. addSingleReadWidget,
  174. "Ctrl+i"
  175. )