Connect PyQt Button to HAL

  • JT
  • JT's Avatar Topic Author
  • Away
  • Administrator
  • Administrator
More
10 Feb 2024 12:26 #292986 by JT
I'm a bit stumped on how to connect a PyQt button clicked signal to a HAL pin.

I can create a HAL pin and see it in showhal.
    parent.hal_test = hal.component('test')
    parent.hal_test.newpin('out', hal.HAL_BIT, hal.HAL_OUT)
    parent.hal_test.ready()

After a lot of grepping in src/emc/usr_intf I'm still at a loss how to connect the hal component to the clicked signal of a QPushButton.

After creating the hal component do you need to install it?

JT

 

Please Log in or Create an account to join the conversation.

  • JT
  • JT's Avatar Topic Author
  • Away
  • Administrator
  • Administrator
More
10 Feb 2024 13:28 #292991 by JT
Replied by JT on topic Connect PyQt Button to HAL
I did just figure out that my component is loaded and I can make a net connection to it in the postgui.hal file.
 

JT
Attachments:
The following user(s) said Thank You: tommylight

Please Log in or Create an account to join the conversation.

More
10 Feb 2024 20:50 #293038 by cmorley
Replied by cmorley on topic Connect PyQt Button to HAL
How are you defining the clicked signal? from designer? in code?
Can you post your sample code for reference?

usually something like this:
button.clicked.connect(my_function)

def my_function(state):
print(state)
if state:
parent.hal_test.out.set(10)
else:
parent.hal_test.out.set(0)
The following user(s) said Thank You: JT

Please Log in or Create an account to join the conversation.

  • JT
  • JT's Avatar Topic Author
  • Away
  • Administrator
  • Administrator
More
10 Feb 2024 23:47 #293046 by JT
Replied by JT on topic Connect PyQt Button to HAL
Hi Chris,

I'm trying to connect a PyQt native signal from a QPushButton like clicked, pressed etc and have that set a HAL pin.

I "think" you have given me enough clues to try and make this work. I'll give it a whirl in the morning.

Thanks
JT

Please Log in or Create an account to join the conversation.

  • JT
  • JT's Avatar Topic Author
  • Away
  • Administrator
  • Administrator
More
11 Feb 2024 12:28 #293084 by JT
Replied by JT on topic Connect PyQt Button to HAL
With some help from the IRC this is some code:
#!/usr/bin/env python3

from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton
from PyQt6.QtWidgets import QSpinBox
import hal, linuxcnc

'''
HAL_BIT
HAL_FLOAT
HAL_U32
HAL_S32
HAL_U64
HAL_S64
'''

class TestWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.halcomp = hal.component('mytest')
        self.halcomp.newpin('out', hal.HAL_BIT, hal.HAL_OUT)
        self.halcomp.newpin('in', hal.HAL_BIT, hal.HAL_IN)
        self.halcomp.newpin('value', hal.HAL_U32, hal.HAL_IN)
        self.halcomp.ready()

        self.setWindowTitle('Test Widget')
        self.setGeometry(300, 300, 250, 150)

        self.layout = QVBoxLayout()
        self.setLayout(self.layout)

        self.test_out = QPushButton('Test Out')
        self.test_out.setCheckable(True)
        self.test_out.clicked.connect(self.set_out_pin)

        self.test_in = QPushButton('Test In')
        self.test_in.setCheckable(True)
        self.test_in.clicked.connect(self.set_in_pin)

        self.number_in = QSpinBox()
        self.number_in.valueChanged.connect(lambda: hal.set_p('mytest.value', f'{self.number_in.value()}'))

        self.layout.addWidget(self.test_out)
        self.layout.addWidget(self.test_in)
        self.layout.addWidget(self.number_in)

        self.test_hal = QPushButton('Test HAL')
        self.test_hal.clicked.connect(lambda: hal.set_p('halui.mode.teleop', "true"))
        self.layout.addWidget(self.test_hal)
        self.show()

    def set_out_pin(self, data):
        self.halcomp['out'] = data

    def set_in_pin(self, data):
        self.halcomp['in'] = data

    def closeEvent(self, event):
        event.accept()
        self.halcomp.exit()

app = QApplication([])
w = TestWidget()
app.exec()

and a video


JT
 
The following user(s) said Thank You: tommylight

Please Log in or Create an account to join the conversation.

  • JT
  • JT's Avatar Topic Author
  • Away
  • Administrator
  • Administrator
More
11 Feb 2024 13:16 #293088 by JT
Replied by JT on topic Connect PyQt Button to HAL
I tried this minimal example using your suggestion:
#!/usr/bin/env python3

from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout

import hal

class test(QWidget):
	def __init__(self):
		super().__init__()
		self.layout = QVBoxLayout()
		self.setLayout(self.layout)

		self.hal_test = hal.component('test')
		self.hal_test.newpin('out', hal.HAL_BIT, hal.HAL_OUT)
		self.hal_test.ready()

		self.test_out = QPushButton('Test Out')
		self.test_out.setCheckable(True)
		self.test_out.clicked.connect(self.set_out_pin)

		self.layout.addWidget(self.test_out)

		self.show()

	def set_out_pin(self, state):
		print(state)
		if state:
			self.hal_test.out.set(10)
		else:
			self.hal_test.out.set(0) 

	def closeEvent(self, event):
		event.accept()
		self.hal_test.exit()

app = QApplication([])
x = test()
app.exec()

And I get this error:
john@cave:~/github/hal$ ./hal_test_2.py
True
Traceback (most recent call last):
  File "/home/john/github/hal/./hal_test_2.py", line 28, in set_out_pin
    self.hal_test.out.set(10)
    ^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'bool' object has no attribute 'set'
Aborted

If you don't have PyQt6 just use PyQt5 and change app.exec() to app.exec_().

Thanks for your time and help
JT

Please Log in or Create an account to join the conversation.

  • JT
  • JT's Avatar Topic Author
  • Away
  • Administrator
  • Administrator
More
11 Feb 2024 14:01 #293090 by JT
Replied by JT on topic Connect PyQt Button to HAL
This is working
#!/usr/bin/env python3

from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout

import hal

class test(QWidget):
	def __init__(self):
		super().__init__()
		self.layout = QVBoxLayout()
		self.setLayout(self.layout)

		self.hal_test = hal.component('test')
		self.hal_test.newpin('out', hal.HAL_BIT, hal.HAL_OUT)
		self.hal_test.newpin('speed', hal.HAL_U32, hal.HAL_IN)
		self.hal_test.ready()
		print(f'test exists {hal.component_exists("test")}')
		print(f'test ready {hal.component_is_ready("test")}')
		hal.new_sig("out_signal",hal.HAL_BIT)
		hal.connect('test.out','out_signal')
		#print(f'Pin Dir {test.out.get_dir()}')

		self.test_value = QPushButton('Test Value')
		self.test_value.setCheckable(True)
		self.test_value.clicked.connect(self.set_value)

		self.layout.addWidget(self.test_value)

		self.test_state = QPushButton('Test State')
		self.test_state.setCheckable(True)
		self.test_state.clicked.connect(self.set_state)

		self.layout.addWidget(self.test_state)

		self.show()

	def set_value(self, state):
		print(state)
		if state:
			self.hal_test['speed'] = 10
		else:
			self.hal_test['speed'] = 0 

	def set_state(self, state):
		print(state)
		if state:
			self.hal_test['out'] = True
		else:
			self.hal_test['out'] = False 

	def closeEvent(self, event):
		print('by by')
		event.accept()
		self.hal_test.exit()

app = QApplication([])
x = test()
app.exec()

Looks like the The HAL Python module docs are not correct...

JT
The following user(s) said Thank You: Aciera

Please Log in or Create an account to join the conversation.

Time to create page: 0.122 seconds
Powered by Kunena Forum