есть же Естоп?
Аналогичным образом сделать другую "железную" кнопку, к входу в котрой в хал привязать halui.mdi-command-10(например), на который в ини задать запуск скрипта..
Код: Выделить всё
// sudo halcompile --install jogaxisget.comp
component jogaxisget "determines which axis jogging";
pin in bit Xin0 "axis.0.kb-jog-active";
pin in bit Xin1;
pin in bit Yin0 "axis.1.kb-jog-active";
pin in bit Yin1;
pin in bit Zin0 "axis.2.kb-jog-active";
pin in bit Zin1;
pin out bit Xtrigger  ;
pin out bit Ytrigger  ;
pin out bit Ztrigger  ;
pin out bit activeX     ;
pin out bit activeY     ;
pin out bit activeZ     ;
pin in bit Xverify =FALSE "axisui.Xisactive";
pin in bit Yverify =FALSE "axisui.Yisactive";
pin in bit Zverify =FALSE "axisui.Zisactive";
variable hal_bit_t  prev_Xtrigger = FALSE;
variable hal_bit_t  prev_Ytrigger = FALSE;
variable hal_bit_t  prev_Ztrigger = FALSE;
license "GPL";
function _;
;;
FUNCTION(_) {
    if (( Xin0 && !Xin1 ) || ( Xin1 && !Xin0 )) {/* XOR2 axisX */
    Xtrigger = 1;
    } else {
    Xtrigger = 0;
    }
    if (( Yin0 && !Yin1 ) || ( Yin1 && !Yin0 )) {/* XOR2 axisY */
    Ytrigger = 1;
    } else {
    Ytrigger = 0;
    }
    if (( Zin0 && !Zin1 ) || ( Zin1 && !Zin0 )) {/* XOR2 axisZ */
    Ztrigger = 1;
    } else {
    Ztrigger = 0;
    }
    if(!!Xtrigger != !!prev_Xtrigger) /* Xtrigger has changed */
    {
        activeX = 1;
        if(!!Xverify) {prev_Xtrigger = Xtrigger; activeX = 0;}
    }
    if(!!Ytrigger != !!prev_Ytrigger) /* Ytrigger has changed */
    {
        activeY = 1;
        if(!!Yverify) {prev_Ytrigger = Ytrigger; activeY = 0;}
    }
    if(!!Ztrigger != !!prev_Ztrigger) /* Ztrigger has changed */
    {
        activeZ = 1;
        if(!!Zverify) {prev_Ztrigger = Ztrigger; activeZ = 0;}
    }
}Код: Выделить всё
if hal_present == 1 :
    ucomp = hal.component("axisui.user")
    ucomp.newpin("activeX",hal.HAL_BIT,hal.HAL_IN)
    ucomp.newpin("activeY",hal.HAL_BIT,hal.HAL_IN)
    ucomp.newpin("activeZ",hal.HAL_BIT,hal.HAL_IN)
    ucomp.newpin("Xisactive",hal.HAL_BIT,hal.HAL_IN)
    ucomp.newpin("Yisactive",hal.HAL_BIT,hal.HAL_IN)
    ucomp.newpin("Zisactive",hal.HAL_BIT,hal.HAL_IN)
    ucomp.ready()
def fun(pin,act):
    global flag
    if pin:
        if flag :
            flag = 0
            try:
                act()
            except:
                print "except flag = ", flag
    else:
        flag = 1
def activate_axisX():
    print "activate_axisX"
    activate_axis(0)
def activate_axisY():
    print "activate_axisY"
    activate_axis(1)
def activate_axisZ():
    print "activate_axisZ"
    activate_axis(2)
def user_live_update():
    if "xyzabcuvw".index(vars.current_axis.get())!=0:
        fun(ucomp["activeX"],activate_axisX)
    if "xyzabcuvw".index(vars.current_axis.get())!=1:
        fun(ucomp["activeY"],activate_axisY)
    if "xyzabcuvw".index(vars.current_axis.get())!=2:
        fun(ucomp["activeZ"],activate_axisZ)
    if "xyzabcuvw".index(vars.current_axis.get())==0:
        ucomp["Xisactive"] = 1
        ucomp["Yisactive"] = 0
        ucomp["Zisactive"] = 0
    if "xyzabcuvw".index(vars.current_axis.get())==1:
        ucomp["Xisactive"] = 0
        ucomp["Yisactive"] = 1
        ucomp["Zisactive"] = 0
    if "xyzabcuvw".index(vars.current_axis.get())==2:
        ucomp["Xisactive"] = 0
        ucomp["Yisactive"] = 0
        ucomp["Zisactive"] = 1Код: Выделить всё
loadrt jogaxisget
addf jogaxisget.0       servo-thread
net    activeX     jogaxisget.0.activeX   axisui.user.activeX
net    activeY     jogaxisget.0.activeY   axisui.user.activeY
net    activeZ     jogaxisget.0.activeZ   axisui.user.activeZ
net    axis:0:kb   jogaxisget.0.Xin0   axis.0.kb-jog-active
net    axis:1:kb   jogaxisget.0.Yin0   axis.1.kb-jog-active
net    axis:2:kb   jogaxisget.0.Zin0   axis.2.kb-jog-active
net    Xisactive     jogaxisget.0.Xverify  axisui.user.Xisactive
net    Yisactive     jogaxisget.0.Yverify  axisui.user.Yisactive
net    Zisactive     jogaxisget.0.Zverify  axisui.user.ZisactiveКод: Выделить всё
flag = 0Код: Выделить всё
forget(widgets.homebutton, "halui.home-all")Код: Выделить всё
def my_start_button_function(event):
    if s.task_mode != linuxcnc.MODE_AUTO:
        commands.task_run()
        return
    if s.task_mode == linuxcnc.MODE_AUTO:
        if not s.paused:
	        commands.task_pause()
	        return
        if s.paused:
	        commands.task_resume()
	        return
	        
root_window.bind("<XF86AudioPlay>", my_start_button_function)
	        
Код: Выделить всё
def my_button_function(event):
    ensure_mode(linuxcnc.MODE_MDI)
    c.mdi("o<touch_only> call")
    
root_window.bind("<XF86Search>", my_button_function)
Код: Выделить всё
root_window.bind("<XF86HomePage>", commands.touch_off_system)