242 lines
7.6 KiB
Python
242 lines
7.6 KiB
Python
############################
|
|
# **** IMPORT SECTION **** #
|
|
############################
|
|
import sys
|
|
from qtpy.QtCore import *
|
|
from qtpy.QtGui import *
|
|
from qtpy.QtWidgets import *
|
|
from qtvcp.core import Status
|
|
from qtvcp.widgets.hal_selectionbox import HALSelectionBox
|
|
from qtvcp.widgets.led_widget import LED
|
|
from qtvcp.lib.aux_program_loader import Aux_program_loader
|
|
###########################################
|
|
# **** instantiate libraries section **** #
|
|
###########################################
|
|
STATUS = Status()
|
|
EXTPROG = Aux_program_loader()
|
|
###################################
|
|
# **** HANDLER CLASS SECTION **** #
|
|
###################################
|
|
|
|
class HandlerClass:
|
|
|
|
########################
|
|
# **** INITIALIZE **** #
|
|
########################
|
|
# widgets allows access to widgets from the qtvcp files
|
|
# at this point the widgets and hal pins are not instantiated
|
|
def __init__(self, halcomp,widgets,paths):
|
|
self.w = widgets
|
|
self.h = halcomp
|
|
self.ledDict = dict()
|
|
STATUS.connect('periodic', lambda w: self.watch_halpin())
|
|
##########################################
|
|
# Special Functions called from QTVCP
|
|
##########################################
|
|
|
|
# at this point:
|
|
# the widgets are instantiated.
|
|
# the HAL pins are built but HAL is not set ready
|
|
def initialized__(self):
|
|
geom = self.w.frameGeometry()
|
|
geom.moveCenter(QApplication.primaryScreen().availableGeometry().center())
|
|
self.w.setGeometry(geom)
|
|
|
|
if self.w.USEROPTIONS_ is not None:
|
|
try:
|
|
num = int(self.w.USEROPTIONS_[0])
|
|
except:
|
|
print('Error with test_led number selection - not a number - using 1')
|
|
num = 1
|
|
|
|
if num >1:
|
|
for i in range(num-1):
|
|
self.addLED()
|
|
# make window taller now
|
|
x = self.w.geometry().x()
|
|
y = self.w.geometry().y()
|
|
w = self.w.geometry().width()
|
|
h = self.w.geometry().height() + 37
|
|
self.w.setGeometry(x,y,w,h)
|
|
self.w.setMinimumHeight(h)
|
|
|
|
self.addLED()
|
|
self.w.setWindowFlags(Qt.WindowStaysOnTopHint)
|
|
self.w.setWindowTitle('{}'.format(self.h.comp.getprefix()))
|
|
|
|
# build a LED/controls line
|
|
def addLED(self):
|
|
|
|
# new toolbar added to window
|
|
toolbar = QToolBar(self.w)
|
|
self.w.addToolBar(Qt.LeftToolBarArea, toolbar)
|
|
|
|
# containers
|
|
w = QWidget()
|
|
w.setContentsMargins(0,0,0,0)
|
|
hbox = QHBoxLayout(w)
|
|
hbox.setContentsMargins(0,0,0,0)
|
|
|
|
# for led name
|
|
le = QLineEdit()
|
|
le.setText(self.h.comp.getprefix())
|
|
# speak text when return pressed
|
|
le.returnPressed.connect(lambda : self.announceText(le))
|
|
|
|
# LED to display state
|
|
led = LED()
|
|
led._halpin_option = False
|
|
led.hal_init('led')
|
|
led.setMaximumWidth(30)
|
|
|
|
hbox.addWidget(led)
|
|
hbox.addWidget(le)
|
|
|
|
# menu for controls
|
|
menu = QMenu()
|
|
menu.setMinimumWidth(259)
|
|
|
|
# sound option checkbutton
|
|
actionSound = QAction('Sound',menu)
|
|
actionSound.setCheckable(True)
|
|
actionSound.triggered.connect(lambda b: self.actionTriggered('Sound',None))
|
|
|
|
# remember signal watched, line edit widget, led widget and last state
|
|
self.ledDict[led] = [None,le,actionSound,led,False]
|
|
|
|
# color option launch button
|
|
actionColor = QAction('Color',menu)
|
|
actionColor.triggered.connect(lambda b: self.actionTriggered('Color', led))
|
|
|
|
menu.addAction(actionSound)
|
|
menu.addAction(actionColor)
|
|
|
|
# button to pop menu
|
|
btn = QPushButton('Opt')
|
|
btn.setMaximumWidth(50)
|
|
btn.setMenu(menu)
|
|
|
|
hbox.addWidget(btn)
|
|
|
|
# combo box for HAL pin selection
|
|
cb = HALSelectionBox()
|
|
cb.setShowTypes([cb.PINS,cb.SIGNALS])
|
|
cb.setPinTypes([cb.HAL_BIT])
|
|
cb.setSignalTypes([cb.HAL_BIT], driven = [False,True])
|
|
cb.hal_init()
|
|
cb.selectionUpdated.connect(lambda w: self.signalSelected(w,led))
|
|
|
|
# wrap combobox so as to add it to menu
|
|
action = QWidgetAction(menu)
|
|
action.setDefaultWidget(cb)
|
|
menu.addAction(action)
|
|
|
|
# Button option launch button
|
|
actionButton = QAction('Load Test Button',menu)
|
|
actionButton.triggered.connect(lambda w, b=(actionButton,led): self.actionTriggered('Button',b))
|
|
menu.addAction(actionButton)
|
|
|
|
# button to add another LED toolbar
|
|
actionAdd = QAction('Add LED',menu)
|
|
actionAdd.triggered.connect(lambda b: self.actionTriggered('Add', None))
|
|
menu.addAction(actionAdd)
|
|
|
|
toolbar.addWidget(w)
|
|
|
|
########################
|
|
# callbacks from STATUS #
|
|
########################
|
|
|
|
#######################
|
|
# callbacks from form #
|
|
#######################
|
|
|
|
def actionTriggered(self, widget,led):
|
|
if widget == 'Color':
|
|
# Get a color from the text dialog
|
|
color = QColorDialog.getColor()
|
|
led.setProperty('color',color)
|
|
|
|
elif widget == 'Add':
|
|
# add a toolbar with LED and controls
|
|
self.addLED()
|
|
# make window taller now
|
|
x = self.w.geometry().x()
|
|
y = self.w.geometry().y()
|
|
w = self.w.geometry().width()
|
|
h = self.w.geometry().height() + 37
|
|
self.w.setGeometry(x,y,w,h)
|
|
self.w.setMinimumHeight(h)
|
|
|
|
elif widget == 'Button':
|
|
EXTPROG.load_test_button()
|
|
|
|
def announceLEDText(self,ledstate,linetext,sound):
|
|
# speak led label contents on state change, if checked
|
|
if sound.isChecked():
|
|
name = linetext.text()
|
|
STATUS.emit('play-sound', 'SPEAK {} {}'.format(name,ledstate))
|
|
|
|
def announceText(self, widget):
|
|
STATUS.emit('play-sound', 'SPEAK {}'.format(widget.text()))
|
|
|
|
#####################
|
|
# general functions #
|
|
#####################
|
|
|
|
def updateLabel(self,v):
|
|
self.w.hallabel.setDisplay(v)
|
|
|
|
def signalSelected(self, sig,led):
|
|
#print('Watching:',sig)
|
|
if sig != '':
|
|
self.ledDict[led][0] = sig
|
|
return
|
|
|
|
def watch_halpin(self):
|
|
for i in self.ledDict:
|
|
sig = self.ledDict[i][0]
|
|
if sig is not None:
|
|
try:
|
|
state = self.h.hal.get_value(sig)
|
|
except:
|
|
return
|
|
lastState = self.ledDict[i][4]
|
|
if state != lastState:
|
|
lineEdit = self.ledDict[i][1]
|
|
actionSound = self.ledDict[i][2]
|
|
led = self.ledDict[i][3]
|
|
if actionSound:
|
|
self.announceLEDText(state,lineEdit,actionSound)
|
|
led.change_state(state)
|
|
self.ledDict[i][4] = state
|
|
else:
|
|
state = 'None'
|
|
|
|
#print(self.ledDict[i][0],state)
|
|
|
|
#####################
|
|
# KEY BINDING CALLS #
|
|
#####################
|
|
|
|
###########################
|
|
# **** closing event **** #
|
|
###########################
|
|
|
|
##############################
|
|
# required class boiler code #
|
|
##############################
|
|
|
|
def __getitem__(self, item):
|
|
return getattr(self, item)
|
|
def __setitem__(self, item, value):
|
|
return setattr(self, item, value)
|
|
|
|
|
|
################################
|
|
# required handler boiler code #
|
|
################################
|
|
|
|
def get_handlers(halcomp,widgets,paths):
|
|
return [HandlerClass(halcomp,widgets,paths)]
|