SingleReadWidget.py 8.3 KB

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