#!/usr/bin/ python import gtk import gobject import linuxcnc import hal import hal_glib import xml.etree.ElementTree as ET debug = 0 class ToolTableParser: def __init__(self, f): self.f = open(f, 'r') self.list = gtk.ListStore(int, str, str) self._parse_file() self.f.close() def __repr__(self): ret_str = '' for l in self.list: ret_str += str(l) + '\n' return ret_str def get_parsed_data(self): return self.list def _parse_file(self): lines = self.f.readlines() i = 0 for line in lines: tool_nbr = line.split(' ')[0] tool_descr = tool_nbr + ' ' + line.split(';')[1] self.list.append([i, tool_descr, tool_nbr]) i = i+1 class XmlParser: def __init__(self, f): self.tree = [] self.list = gtk.ListStore(int, str, str) self._parse_file(f) def get_parsed_data(self): return self.list def _parse_file(self, f): self.tree = ET.parse(f) root = self.tree.getroot() i = 0 for func in root.iter('function'): gcode = func.find('gcode') # create the LinuxCNC hal pin and create mapping dictionary binding incomming events with data and the hal pins if gcode is not None: self.list.append([i, func.text, gcode.text]) i = i+1 class HandlerClass: def on_destroy(self,obj,data=None): print "on_destroy, combobox active=%d" %(self.combo.get_active()) self.halcomp.exit() # avoid lingering HAL component gtk.main_quit() def on_changed(self, combobox, data=None): if self.tool_combo_initiated: model = combobox.get_model() tool_change_cmd = 'M6' + ' ' + model[combobox.get_active()][2] + ' ' + 'G43' self._send_mdi(tool_change_cmd) print tool_change_cmd def __init__(self, halcomp, builder, useropts): self.linuxcnc_status = linuxcnc.stat() self.linuxcnc_cmd = linuxcnc.command() self.halcomp = halcomp self.builder = builder self.useropts = useropts self.trigger1 = hal_glib.GPin(halcomp.newpin('trigger_pin', hal.HAL_BIT, hal.HAL_IN)) self.trigger1.connect('value-changed', self._trigger_change) self.trigger2 = hal_glib.GPin(halcomp.newpin('saved-tool-pin', hal.HAL_U32, hal.HAL_IN)) self.trigger2.connect('value-changed', self._init_tool_combo) func_list = XmlParser('func-btn.xml').get_parsed_data() self.func_combo = self.builder.get_object('func-btn-combo') self.func_combo.set_model(func_list) self.func_combo.set_entry_text_column(1) self.func_combo.set_active(0) tool_list = ToolTableParser('tool.tbl').get_parsed_data() self.tool_combo = self.builder.get_object('tool-combo') self.tool_combo.set_model(tool_list) self.tool_combo.set_entry_text_column(2) self.tool_combo.set_active(0) renderer_text = gtk.CellRendererText() self.func_combo.pack_start(renderer_text, True) self.tool_combo.pack_start(renderer_text, True) self.tool_combo_initiated = False def _trigger_change(self, pin, userdata = None): #setp gladevcp.trigger_pin 1 #print "pin value changed to: " + str(pin.get()) #print "pin name= " + pin.get_name() #print "pin type= " + str(pin.get_type()) #print "active " + str(self.combo.get_active()) if pin.get() is True: model = self.func_combo.get_model() self._send_mdi(model[self.func_combo.get_active()][2]) def _init_tool_combo(self, pin, userdata = None): #setp gladevcp.saved_tool_pin 2 self.tool_combo.set_active(pin.get()) self.tool_combo_initiated = True def _ok_for_mdi(self): self.linuxcnc_status.poll() return not self.linuxcnc_status.estop and self.linuxcnc_status.enabled and (self.linuxcnc_status.homed.count(1) == self.linuxcnc_status.joints) and (self.linuxcnc_status.interp_state == linuxcnc.INTERP_IDLE) def _send_mdi(self, mdi_cmd_str): if self._ok_for_mdi(): self.linuxcnc_cmd.mode(linuxcnc.MODE_MDI) self.linuxcnc_cmd.wait_complete() # wait until mode switch executed self.linuxcnc_cmd.mdi(mdi_cmd_str) def get_handlers(halcomp, builder, useropts): global debug for cmd in useropts: exec cmd in globals() return [HandlerClass(halcomp, builder, useropts)]