/ src / emc / usr_intf / pyui / master.py
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