155 lines
4.5 KiB
Python
Executable File
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)
|
|
|