Files
2026-08-20 06:17:39 +08:00

155 lines
4.5 KiB
Python
Executable File

#!/usr/bin/env python3
import linuxcnc, hal
import sys, os
# Set up pins
h = hal.component("test-ui")
h.newpin('d_out', hal.HAL_BIT, hal.HAL_IN) # pin for reading digital out
h.newpin('a_out', hal.HAL_FLOAT, hal.HAL_IN) # pin for reading analog out
h.newpin('d_in', hal.HAL_BIT, hal.HAL_OUT) # pin for setting digital in
h.newpin('a_in', hal.HAL_FLOAT, hal.HAL_OUT) # pin for setting analog in
h.ready() # mark the component as 'ready'
os.system('halcmd source postgui.hal') # Net above pins to motion I/O pins
# Initialization
c = linuxcnc.command()
s = linuxcnc.stat()
c.state(linuxcnc.STATE_ESTOP_RESET)
c.state(linuxcnc.STATE_ON)
c.mode(linuxcnc.MODE_MDI)
###################################################
# M62-M65 digital out
def do_dout(on=True, mpos=None):
# Set up command
#
# for sanity, specify output 1, changed to 0 in remap
code = 64 + int(not on) - 2*int(mpos is not None)
cmd = 'M%d P1' % code
# Print pre-test values
s.poll() # Update status channel
c.mdi('(print,cmd: "%s")' % cmd)
c.mdi('(print, M%d remapping pre: motion dout0=%d; hal d_out=%d)' %
(code, s.dout[0], h['d_out']))
# Run test command
c.mdi(cmd)
if mpos is not None:
c.mdi('G0 X%.2f' % mpos)
c.wait_complete()
# Print post-test values
s.poll() # Update status channel
c.mdi('(print, M%d remapping post: motion dout0=%d; hal d_out=%d)' %
(code, s.dout[0], h['d_out']))
# M62/M63 test: toggle DIO w/motion & verify
c.mdi('(print,----Testing M62/M63 digital output w/motion----)')
do_dout(on=True, mpos=1.0) # M62
do_dout(on=False, mpos=2.0) # M63
do_dout(on=True, mpos=3.0) # M62
do_dout(on=False, mpos=4.0) # M63
# M64/M65 test: toggle DIO & verify
c.mdi('(print,----Testing M64/M65 digital output, immediate----)')
do_dout(on=True) # M64
do_dout(on=False) # M65
do_dout(on=True) # M64
do_dout(on=False) # M65
###################################################
# M66 wait on input
# These tests don't exercise the L- and Q-words, despite partial
# plumbing being there
def do_in(inp, d_in=True, wait_mode=None, timeout=None):
# Set up M66 command
cmd = 'M66 %(ad_in)s%(wait_mode)s%(timeout)s' % dict(
# for sanity, specify input 1, changed to 0 in remap
ad_in = ('P1' if d_in else 'E1'),
wait_mode = (' L%d' % wait_mode if wait_mode is not None else ''),
timeout = (' Q%d' % timeout if timeout is not None else ''),
)
# Set input pin
if d_in:
h['d_in'] = inp
else:
h['a_in'] = inp
# Print pre-test values
s.poll() # Update status channel
c.mdi('(print,cmd: "%s"; input: %.4f)' % (cmd, inp))
c.mdi('(print, M66 remapping pre: 5399=#5399; 100=#100; '
'ain0=%.2f; din0=%d)' % (s.ain[0], s.din[0]))
# Run test command and wait for it
c.mdi(cmd)
c.wait_complete()
# Print post-test values
s.poll() # Update status channel
c.mdi('(print, M66 remapping post: 5399=#5399; 100=#100; '
'ain0=%.2f; din0=%d)' % (s.ain[0], s.din[0]))
# Run test cases
#
# Digital input
c.mdi('(print,----Testing M66 digital input----)')
do_in(1, d_in=True)
do_in(0, d_in=True)
# Analog input
c.mdi('(print,----Testing M66 analog input----)')
do_in(42.13, d_in=False, wait_mode=0)
do_in(-13.42, d_in=False, wait_mode=0)
###################################################
# M67-M68 analog out
def do_aout(out_val, mpos=None):
# Set up command
#
# for sanity, specify output 1, changed to 0 in remap
code = 67 + int(mpos is None)
cmd = 'M%d E1 Q%.2f' % (code, out_val)
# Print pre-test values
s.poll() # Update status channel
c.mdi('(print,cmd: "%s")' % cmd)
c.mdi('(print, M%d remapping pre: motion aout0=%.2f; hal a_out=%.2f)' %
(code, s.aout[0], h['a_out']))
# Run test command
c.mdi(cmd)
if mpos is not None:
c.mdi('G0 X%.2f' % mpos)
c.wait_complete()
# Print post-test values
s.poll() # Update status channel
c.mdi('(print, M%d remapping post: motion aout0=%.2f; hal a_out=%.2f)' %
(code, s.aout[0], h['a_out']))
# M67 test: set AIO w/motion & verify
c.mdi('(print,----Testing M67 analog output w/motion----)')
do_aout(42.13, mpos=-1.0)
do_aout(-13.42, mpos=-2.0)
do_aout(0.0, mpos=-3.0)
# M68 test: set AIO (immed.) & verify
c.mdi('(print,----Testing M68 analog output, immediate----)')
do_aout(42.13)
do_aout(-13.42)
do_aout(0.0)
###################################################
# Shutdown
c.wait_complete()
sys.exit(0)