master.py
1 #!/usr/bin/env python 2 import hal,time,os,sys 3 import traceback 4 from configobj import ConfigObj 5 from pyui import widgets as WIDGETS 6 from pyui import commands 7 8 # path to the configuration the user requested 9 try: 10 CONFIGPATH = os.environ['CONFIG_DIR'] 11 CONFIGDIR = os.path.join(CONFIGPATH, '_panelui.ini') 12 except: 13 try: 14 CONFIGDIR = os.path.abspath(os.path.join(os.path.dirname( '..','_panelui.ini'))) 15 except: 16 try: 17 CONFIGPATH = os.path.expanduser("~") 18 CONFIGDIR = os.path.join(CONFIGPATH, '_panelui.ini') 19 except: 20 print 'PANELUI ERROR: No _panelui.ini found.' 21 sys.exit(0) 22 23 P='Pressed' 24 R='Released' 25 DBG_state = 0 26 def DBG(str,level=1): 27 if DBG_state >= level: 28 print str 29 30 class keyboard(): 31 def __init__(self, filename=CONFIGDIR): 32 self.filename = filename 33 34 def validate(self): 35 from pyui import panelui_validate 36 sys.exit(0) 37 38 def build(self,dbg_state=0): 39 global DBG_state 40 DBG_state = self._dbg = dbg_state 41 def build_widget(widget,array,idname): 42 # get attributes of the widget 43 metadata={} 44 for attribute in array: 45 value = array[attribute] 46 DBG( ' >> %s = %s'%(attribute,value),2) 47 # if attribute is a list, make it a single list 48 # the widgets.command method will decode that list later 49 if isinstance(value,list) and len(value) > 2: 50 temp=[];temp2=[] 51 temp.append(value[0]) 52 for i in range(1, len(value)): 53 temp2.append(value[i]) 54 temp.append(temp2) 55 value = temp 56 # key is how we sort the dict of commands 57 # by the unigue key position or group name 58 if attribute.upper() == 'KEY': 59 self.r_c[value] = idname 60 metadata[attribute.upper()] = value 61 # intialize the widget 62 widget.hal_init(self.hal, idname, metadata, 63 self.cmd, self.widgets, DBG_state) 64 self.widgets[idname] = widget 65 66 self.hal = hal.component('_panel_ui_py_') 67 self.widgets = {} 68 self.r_c = {} 69 self.config = ConfigObj(self.filename) 70 try: 71 self.hal.setprefix(self.config['HAL_PREFIX']['NAME']) 72 except: 73 self.hal.setprefix('panelui') 74 self.cmd = commands.CNC_COMMANDS(self) 75 for basewidget in self.config: 76 if basewidget == 'HAL_PREFIX': continue 77 DBG('\n List of %s:'% (basewidget),2 ) 78 if basewidget in dir(WIDGETS): 79 for idname in self.config[basewidget]: 80 DBG( ' > %s'%(idname),2) 81 # instantinate the widget 82 if basewidget =='TOGGLE_BUTTONS': 83 widget = WIDGETS.TOGGLE_BUTTONS() 84 build_widget(widget,self.config[basewidget][idname],idname) 85 elif basewidget =='MOMENTARY_BUTTONS': 86 widget = WIDGETS.MOMENTARY_BUTTONS() 87 build_widget(widget,self.config[basewidget][idname],idname) 88 elif basewidget =='RADIO_BUTTONS': 89 # look for groups 90 group_list=[] 91 for group in self.config[basewidget][idname]: 92 value = self.config[basewidget][idname][group] 93 if not isinstance(value,dict): continue 94 group_list.append(group) 95 DBG( 'GROUP: %s'% (group),2 ) 96 widget2 = WIDGETS.RADIO_BUTTONS() 97 build_widget(widget2,self.config[basewidget][idname][group],group) 98 DBG( group_list,2 ) 99 widget = WIDGETS.GROUP() 100 widget.add_list(group_list) 101 build_widget(widget,self.config[basewidget][idname],idname) 102 103 else: 104 continue 105 else: 106 print 'PANELUI INFO: %s not defined'% basewidget 107 108 self.hal.ready() 109 for k in self.r_c: 110 DBG('Keycode: %s <-> Widget: %s'%( k,self.r_c[k]),1) 111 112 def update(self, *arg): 113 raw=arg[0]; row=arg[1];column=arg[2];state=arg[3] 114 #print 'raw',raw,'row:',row,'column:',column,'state:',state 115 if raw == 0: return 116 button = 'R%dC%d'%(row,column) 117 try: 118 DBG('%s %s %s'% ( button, self.r_c[button], P if state else R ),1) 119 self.widgets[self.r_c[button]].toggle_state(state) 120 except Exception, e: 121 if DBG_state >1: 122 exc_type, exc_value, exc_traceback = sys.exc_info() 123 formatted_lines = traceback.format_exc().splitlines() 124 print 125 print "****PYUI verbose debugging:",formatted_lines[0] 126 traceback.print_tb(exc_traceback, limit=1, file=sys.stdout) 127 print formatted_lines[-1] 128 elif DBG_state >0: 129 print 'PYUI ERROR: no button or command assigned to keycode %s?'% button 130 print e 131 else: 132 pass 133 134 def periodic(self): 135 try: 136 self.cmd.handler_instance.periodic() 137 except: 138 self.cmd.periodic() 139 140 def exit(self): 141 print 'Python exit' 142 self.hal.exit() 143 144 def __getitem__(self, item): 145 return self.widgets[item] 146 def __setitem__(self, item, value): 147 self.widgets[item] = value 148 149 150 def main(): 151 print 'main' 152 key=keyboard() 153 a=key.build() 154 b=key.loop() 155 156 if __name__ == "__main__": 157 main() 158