#!/usr/bin/env python3 import linuxcnc import hal import math import time import sys import subprocess import os import signal import glob import re def wait_for_linuxcnc_startup(status, timeout=10.0): """Poll the Status buffer waiting for it to look initialized, rather than just allocated (all-zero). Returns on success, throws RuntimeError on failure.""" start_time = time.time() while time.time() - start_time < timeout: status.poll() if (status.angular_units == 0.0) \ or (status.axis_mask == 0) \ or (status.cycle_time == 0.0) \ or (status.exec_state != linuxcnc.EXEC_DONE) \ or (status.interp_state != linuxcnc.INTERP_IDLE) \ or (status.inpos == False) \ or (status.linear_units == 0.0) \ or (status.max_acceleration == 0.0) \ or (status.max_velocity == 0.0) \ or (status.program_units == 0.0) \ or (status.rapidrate == 0.0) \ or (status.state != linuxcnc.RCS_DONE) \ or (status.task_state != linuxcnc.STATE_ESTOP): time.sleep(0.1) else: # looks good return # timeout, throw an exception raise RuntimeError c = linuxcnc.command() s = linuxcnc.stat() e = linuxcnc.error_channel() # Wait for LinuxCNC to initialize itself so the Status buffer stabilizes. wait_for_linuxcnc_startup(s) #time.sleep(9999) c.state(linuxcnc.STATE_ESTOP_RESET) c.state(linuxcnc.STATE_ON) c.home(-1) c.wait_complete() c.mode(linuxcnc.MODE_MDI) c.mdi('g0 x0.1 y0.2 z0.3') c.mdi('g41.1 d0.1') c.mdi('g40') c.mdi('g0 x0.9 ; surprise motion on Y and Z, to 0!!') c.wait_complete() s.poll() print("position: {}".format(s.position)) assert(math.fabs(s.position[0] - 0.9) < 0.0000001) assert(math.fabs(s.position[1] - 0.2) < 0.0000001) assert(math.fabs(s.position[2] - 0.3) < 0.0000001) sys.exit(0)