Laelaps  2.3.5
RoadNarrows Robotics Small Outdoor Mobile Robot Project
laelaps_tune_motors.window Class Reference

Window class supporting application. More...

Inheritance diagram for laelaps_tune_motors.window:

Public Member Functions

def __init__ (self, master=None, cnf={}, kw)
 Constructor. More...
 
def perfStart (self)
 
def perfMark (self, msg)
 
def initData (self, kw)
 Initialize class state data. More...
 
def dbgSeedFields (self)
 
def createWidgets (self)
 Create gui widgets with supporting data and show.
 
def createMenu (self)
 Create menu.
 
def createHeading (self)
 Create top gui heading.
 
def createLeftButtons (self)
 Create gui left hand side buttons.
 
def createCenterPanel (self)
 Create robot status and joint state center panel.
 
def createStatusPanel (self, parent, row, col)
 Create motor status panel. More...
 
def createMotorCtlrPanel (self, parent, row, col, ctlrpos)
 Create motor controller panel. More...
 
def createAlarmsPanel (self, parent, row, col, ctlrkey)
 Create motor controller alarm panel. More...
 
def createAlarmWidget (self, parent, row, col, ctlrkey, text, key)
 Create alarm widgets and initalize alarm db. More...
 
def createMotorPanel (self, parent, row, col, ctlrkey, motorpos)
 Create motor controller motor panel. More...
 
def createVelTuningPanel (self, parent, row, col)
 Create velocity tuning panel. More...
 
def createMotorsTuningPanel (self, parent, row, col, ctlrpos)
 Create motor controller motors tuning panel. More...
 
def createPidParamsPanel (self, parent, row, col, ctlrkey)
 Create motor controller motors PID parameters panel. More...
 
def createSetpointsPanel (self, parent, row, col, ctlrkey)
 Create motor controller motor velocity setpoints panel. More...
 
def createPlotPanel (self, parent, row, col, width)
 Create real-time plot panel. More...
 
def createPlotControls (self, parent, row, col)
 Create real-time plot controls. More...
 
def createPlotCanvas (self, parent, row, col, width)
 Create real-time plot canvas. More...
 
def makeWidgets (self, parent, wdescTbl)
 Make widgets from widget description table. More...
 
def makeWidget (self, parent, widget, wcfg, gcfg)
 Make widget. More...
 
def createStatusBar (self)
 Create gui status bar at bottom of gui window.
 
def updateButtonState (self, keys, state)
 Update button activation states.
 
def createButton (self, parent, text, imagefile, command, fg='black')
 Create button. More...
 
def destroy (self)
 Destroy window callback.
 
def notimpl (self)
 Not implemented callback.
 
def apply (self)
 Apply tuning tweaks to controllers callback.
 
def save (self)
 Save tuning to tuning file and controller EEPROM callback.
 
def stop (self)
 Stop Laelaps.
 
def about (self)
 Show about dialog callback.
 
def cbLinkAllPids (self)
 
def cbLinkCtlrPids (self, ck)
 
def cbLinkAllSetpoints (self)
 
def cbLinkCtlrSetpoints (self, ck)
 
def cbVelSetpoint (self, ck, mk, fk, v)
 Setpoint changed callback. More...
 
def cbEnDisVelPlot (self, ck, mk, fk)
 Enable/disable velocity plot. More...
 
def setPidParams (self, ck, mk, Kp, Ki, Kd, maxQpps, maxAccel)
 
def getProductInfo (self)
 Get product information. More...
 
def getLaelapsName (self)
 Get Laelaps name. More...
 
def updateStatus (self)
 Update motor status.
 
def showInfo (self, msg)
 Show information message on status bar. More...
 
def showError (self, msg)
 Show error message on status bar. More...
 
def showEntry (self, w, var, val, fg='black')
 Show text on read-only entry. More...
 
def alignToJustify (self, align)
 Map alignment value to justify equivalent. More...
 
def finalInits (self)
 Final window initializations. More...
 

Public Attributes

 m_wMaster
 
 m_imageLoader
 
 t0
 
 m_botName
 
 m_icons
 
 m_wBttn
 
 m_plotVel
 
 m_motorCtlrPos
 
 m_motorCtlrAddr
 
 m_motorPos
 
 m_powertrain
 
 m_var
 
 m_wMenuBar
 
 m_wMenuFile
 
 m_wMenuMove
 
 m_wMenuHelp
 
 m_wTopHeading
 
 m_varStatus
 
 m_wStatusBar
 

Detailed Description

Window class supporting application.

Definition at line 134 of file laelaps_tune_motors.py.

Constructor & Destructor Documentation

def laelaps_tune_motors.window.__init__ (   self,
  master = None,
  cnf = {},
  kw 
)

Constructor.

Parameters
masterWindow parent master widget.
cnfConfiguration dictionary.
kwKeyword options.

Definition at line 143 of file laelaps_tune_motors.py.

References laelaps_init.window.createWidgets(), laelaps_tune_motors.window.createWidgets(), laelaps_tune_motors.window.dbgSeedFields(), laelaps_init.window.initData(), laelaps_tune_motors.window.initData(), laelaps_init.window.m_icons, laelaps_tune_motors.window.m_icons, laelaps_init.window.m_imageLoader, laelaps_tune_motors.window.m_imageLoader, laelaps_tune_motors.window.m_wMaster, laelaps_tune_motors.window.perfStart(), and laelaps_tune_motors.window.t0.

143  def __init__(self, master=None, cnf={}, **kw):
144  self.m_wMaster = master
145 
146  self.perfStart()
147 
148  # intialize window data
149  kw = self.initData(kw)
150 
151  # initialize parent object frame
152  Frame.__init__(self, master=master, cnf=cnf, **kw)
153 
154  # window title
155  self.master.title("Laelaps Motors")
156 
157  self.m_imageLoader = Utils.ImageLoader(py_pkg='Laelaps.images',
158  image_paths=ImagePath)
159 
160  self.m_icons['app_icon'] = self.m_imageLoader.load("icons/LaelapsIcon.png")
161  #RDK self.master.tk.call('wm', 'iconphoto', self.master._w,
162  #RDK self.m_icons['app_icon'])
163 
164  #print 'DBG', self.m_var
165 
166  # create and show widgets
167  self.createWidgets()
168  self.grid(row=0, column=0, padx=5, pady=5)
169 
170  self.update_idletasks()
171  #width = self.winfo_width()
172  #print 'DBG: self.width =', width
173 
174  # RDK Comment out when done. Debug
175  self.dbgSeedFields()
176 
def createWidgets(self)
Create gui widgets with supporting data and show.
def initData(self, kw)
Initialize class state data.
def __init__(self, master=None, cnf={}, kw)
Constructor.

Member Function Documentation

def laelaps_tune_motors.window.alignToJustify (   self,
  align 
)

Map alignment value to justify equivalent.

Parameters
alignAlignment.
Returns
Tk justify.

Definition at line 1606 of file laelaps_tune_motors.py.

1606  def alignToJustify(self, align):
1607  if align == W:
1608  return LEFT
1609  elif align == E:
1610  return RIGHT
1611  else:
1612  return CENTER
1613 
def alignToJustify(self, align)
Map alignment value to justify equivalent.
def laelaps_tune_motors.window.cbEnDisVelPlot (   self,
  ck,
  mk,
  fk 
)

Enable/disable velocity plot.

Parameters
ckController key.
mkMotor key.
fkField key.

Definition at line 1486 of file laelaps_tune_motors.py.

References laelaps_tune_motors.window.m_plotVel, laelaps::LaeDbKin.m_powertrain, laelaps_tune_motors.window.m_powertrain, and laelaps_tune_motors.window.m_var.

Referenced by laelaps_tune_motors.window.createPlotControls().

1486  def cbEnDisVelPlot(self, ck, mk, fk):
1487  if self.m_plotVel is None:
1488  return
1489  name = self.m_powertrain[ck][mk]
1490  val = self.m_var[ck][mk][fk].get()
1491  sp = self.m_var[ck][mk]['setpoint_speed'].get()
1492  if val:
1493  self.m_plotVel.enable(name, sp)
1494  else:
1495  self.m_plotVel.disable(name)
1496 
def cbEnDisVelPlot(self, ck, mk, fk)
Enable/disable velocity plot.
def laelaps_tune_motors.window.cbVelSetpoint (   self,
  ck,
  mk,
  fk,
  v 
)

Setpoint changed callback.

Parameters
ckController key.
mkMotor key.
fkField key.
vValue (ignored).
Returns
True

Definition at line 1471 of file laelaps_tune_motors.py.

References laelaps_tune_motors.window.m_plotVel, laelaps::LaeDbKin.m_powertrain, laelaps_tune_motors.window.m_powertrain, and laelaps_tune_motors.window.m_var.

Referenced by laelaps_tune_motors.window.createSetpointsPanel().

1471  def cbVelSetpoint(self, ck, mk, fk, v):
1472  if self.m_plotVel is None:
1473  return True
1474  val = self.m_var[ck][mk][fk].get()
1475  pk = self.m_powertrain[ck][mk]
1476  self.m_plotVel.setpoint(pk, val)
1477  return True
1478 
def cbVelSetpoint(self, ck, mk, fk, v)
Setpoint changed callback.
def laelaps_tune_motors.window.createAlarmsPanel (   self,
  parent,
  row,
  col,
  ctlrkey 
)

Create motor controller alarm panel.

Parameters
parentParent widget.
rowRow in parent widget.
colColumn in parent widget.
ctlrkeyMotor controller db key.

Definition at line 640 of file laelaps_tune_motors.py.

References laelaps_tune_motors.window.createAlarmWidget(), and laelaps_tune_motors.window.makeWidget().

Referenced by laelaps_tune_motors.window.createMotorCtlrPanel().

640  def createAlarmsPanel(self, parent, row, col, ctlrkey):
641  wframe = Frame(parent)
642  wframe['relief'] = 'flat'
643  wframe.grid(row=row, column=col, padx=1, pady=3, sticky=N+W+E)
644 
645  row = 0
646  col = 0
647 
648  self.makeWidget(wframe, Label,
649  {'text': "Alarms:",
650  #'font': ('Helvetica', 10),
651  'fg': UIColors['focus'],
652  'borderwidth': 2},
653  {'row': row, 'column': col, 'padx': 1, 'pady': 2, 'sticky': E})
654 
655  col += 1
656 
657  # Left motor over current alarm
658  self.createAlarmWidget(wframe, row, col, ctlrkey,
659  'Left Motor\nOver Current', 'alarm_lmoc')
660 
661  col += 1
662 
663  # Right motor over current alarm
664  self.createAlarmWidget(wframe, row, col, ctlrkey,
665  'Right Motor\nOver Current', 'alarm_rmoc')
666 
667  col += 1
668 
669  # Battery low voltage alarm
670  self.createAlarmWidget(wframe, row, col, ctlrkey,
671  'Battery\nLow Volt', 'alarm_batt_low')
672 
673  col += 1
674 
675  # Battery high voltage alarm
676  self.createAlarmWidget(wframe, row, col, ctlrkey,
677  'Battery\nHigh Volt', 'alarm_batt_high')
678 
679  col += 1
680 
681  # Logic low voltage alarm
682  self.createAlarmWidget(wframe, row, col, ctlrkey,
683  'Logic\nLow Volt', 'alarm_logic_low')
684 
685  col += 1
686 
687  # Logic high voltage alarm
688  self.createAlarmWidget(wframe, row, col, ctlrkey,
689  'Logic\nHigh Volt', 'alarm_logic_high')
690 
691  col += 1
692 
693  # Temperature alarm
694  self.createAlarmWidget(wframe, row, col, ctlrkey,
695  'Over\nTemperature', 'alarm_temp')
696 
697  col += 1
698 
699  # Emergency stop alarm
700  self.createAlarmWidget(wframe, row, col, ctlrkey,
701  'Emergency\nStopped', 'alarm_estop')
702 
def createAlarmsPanel(self, parent, row, col, ctlrkey)
Create motor controller alarm panel.
def makeWidget(self, parent, widget, wcfg, gcfg)
Make widget.
def createAlarmWidget(self, parent, row, col, ctlrkey, text, key)
Create alarm widgets and initalize alarm db.
def laelaps_tune_motors.window.createAlarmWidget (   self,
  parent,
  row,
  col,
  ctlrkey,
  text,
  key 
)

Create alarm widgets and initalize alarm db.

Parameters
parentParent widget.
rowRow in parent widget.
colColumn in parent widget.
ctlrkeyMotor controller db key.
textAlarm label text.
keyAlarm db key.

Definition at line 713 of file laelaps_tune_motors.py.

References laelaps_init.window.m_icons, laelaps_tune_motors.window.m_icons, laelaps_tune_motors.window.m_var, and laelaps_tune_motors.window.makeWidget().

Referenced by laelaps_tune_motors.window.createAlarmsPanel().

713  def createAlarmWidget(self, parent, row, col, ctlrkey, text, key):
714  wframe = Frame(parent)
715  wframe['borderwidth'] = 1
716  wframe['relief'] = 'solid'
717  wframe.grid(row=row, column=col, padx=0, pady=1, sticky=N+W+E)
718 
719  row = 0
720  col = 0
721 
722  self.makeWidget(wframe, Label,
723  {'text': text, 'justify': CENTER, 'anchor': CENTER},
724  {'row':row, 'column':col, 'padx':(1, 1), 'pady':2, 'sticky':W+S+E})
725 
726  w = self.makeWidget(wframe, Label,
727  {'image': self.m_icons['led_dark'], 'justify': CENTER, 'anchor': CENTER},
728  {'row':row, 'column':col+1, 'padx':1, 'pady':(2,4), 'sticky':W+S+E})
729 
730  self.m_var[ctlrkey][key] = {'w': w, 'val': TriState['none']}
731 
732 
def makeWidget(self, parent, widget, wcfg, gcfg)
Make widget.
def createAlarmWidget(self, parent, row, col, ctlrkey, text, key)
Create alarm widgets and initalize alarm db.
def laelaps_tune_motors.window.createButton (   self,
  parent,
  text,
  imagefile,
  command,
  fg = 'black' 
)

Create button.

Parameters
parentParent widget.
textButton text.
imagefileImage file name. None for no image.
commandCallback for button push.
fgForeground text color.
Returns
Button widget.

Definition at line 1378 of file laelaps_tune_motors.py.

References laelaps_init.window.m_icons, laelaps_tune_motors.window.m_icons, laelaps_init.window.m_wBttn, and laelaps_tune_motors.window.m_wBttn.

Referenced by laelaps_tune_motors.window.createLeftButtons().

1378  def createButton(self, parent, text, imagefile, command, fg='black'):
1379  key = str.lower(text.replace("\n", "_"))
1380  self.m_icons[key] = self.m_imageLoader.load(imagefile)
1381  w = Button(parent)
1382  w['text'] = text
1383  if self.m_icons[key]:
1384  w['image'] = self.m_icons[key]
1385  w['compound'] = LEFT
1386  w['padx'] = 0
1387  w['pady'] = 0
1388  w['anchor'] = W
1389  w['width'] = 105
1390  else:
1391  w['anchor'] = CENTER
1392  w['width'] = 10
1393  w['fg'] = fg
1394  w['command'] = command
1395  self.m_wBttn[key] = w
1396  return self.m_wBttn[key]
1397 
def createButton(self, parent, text, imagefile, command, fg='black')
Create button.
def laelaps_tune_motors.window.createMotorCtlrPanel (   self,
  parent,
  row,
  col,
  ctlrpos 
)

Create motor controller panel.

Parameters
parentParent widget.
rowRow in parent widget.
colColumn in parent widget.
ctlrposMotor controller position string.

Definition at line 453 of file laelaps_tune_motors.py.

References laelaps_tune_motors.window.createAlarmsPanel(), laelaps_tune_motors.window.createMotorPanel(), laelaps_tune_motors.window.m_motorCtlrAddr, laelaps_tune_motors.window.m_motorPos, laelaps_tune_motors.window.m_var, and laelaps_tune_motors.window.makeWidget().

Referenced by laelaps_tune_motors.window.createStatusPanel().

453  def createMotorCtlrPanel(self, parent, row, col, ctlrpos):
454  wframe = LabelFrame(parent)
455  wframe['text'] = "%s Motor Controller State" % (ctlrpos)
456  wframe['font'] = ('Helvetica', 12)
457  wframe['fg'] = UIColors['focus']
458  wframe['borderwidth'] = 2
459  wframe['relief'] = 'ridge'
460  wframe.grid(row=row, column=col, padx=1, pady=1, sticky=N+W+E)
461 
462  addr = self.m_motorCtlrAddr[ctlrpos]
463 
464  ctlrkey = _ctlrkey(ctlrpos)
465 
466  # common widget and grid options
467  wcfgLabel = {'anchor': E, 'justify': RIGHT}
468  gcfgLabel = {'padx': (5,2), 'pady': 2, 'sticky': E}
469  wcfgValue = {'anchor': W, 'justify': LEFT, 'relief': 'solid'}
470  gcfgValue = {'padx': (0,2), 'pady': 1, 'sticky': W}
471 
472  col = 0
473 
474  # packet address label
475  self.makeWidget(wframe, Label,
476  dictConcat({'text': 'Address:'}, wcfgLabel),
477  dictConcat({'row': 0, 'column': col}, gcfgLabel))
478 
479  # packet address
480  self.m_var[ctlrkey]['addr'] = StringVar();
481  self.makeWidget(wframe, Label,
482  dictConcat({'textvariable': self.m_var[ctlrkey]['addr'], 'width': 8},
483  wcfgValue),
484  dictConcat({'row': 0, 'column': col+1}, gcfgValue))
485 
486  # baudrate label
487  self.makeWidget(wframe, Label,
488  dictConcat({'text': 'Baudrate:'}, wcfgLabel),
489  dictConcat({'row': 1, 'column': col}, gcfgLabel))
490 
491  # baudrate
492  self.m_var[ctlrkey]['baudrate'] = IntVar()
493  self.makeWidget(wframe, Label,
494  dictConcat({'textvariable': self.m_var[ctlrkey]['baudrate'],
495  'width': 8}, wcfgValue),
496  dictConcat({'row': 1, 'column': col+1}, gcfgValue))
497 
498  col += 2
499 
500  # motor controller model label
501  self.makeWidget(wframe, Label,
502  dictConcat({'text': 'Model:'}, wcfgLabel),
503  dictConcat({'row': 0, 'column': col}, gcfgLabel))
504 
505  # motor controller model
506  self.m_var[ctlrkey]['model'] = StringVar()
507  self.makeWidget(wframe, Label,
508  dictConcat({'textvariable': self.m_var[ctlrkey]['model'], 'width': 10},
509  wcfgValue),
510  dictConcat({'row': 0, 'column': col+1}, gcfgValue))
511 
512  # firmware version label
513  self.makeWidget(wframe, Label,
514  dictConcat({'text': 'Version:'}, wcfgLabel),
515  dictConcat({'row': 1, 'column': col}, gcfgLabel))
516 
517  # firmware version
518  self.m_var[ctlrkey]['version'] = StringVar()
519  self.makeWidget(wframe, Label,
520  dictConcat({'textvariable': self.m_var[ctlrkey]['version'],
521  'width': 10}, wcfgValue),
522  dictConcat({'row': 1, 'column': col+1}, gcfgValue))
523 
524  col += 2
525 
526  # maximum battery voltage label
527  self.makeWidget(wframe, Label,
528  dictConcat({'text': 'Max Battery (V):'}, wcfgLabel),
529  dictConcat({'row': 0, 'column': col}, gcfgLabel))
530 
531  # maximum battery voltage
532  self.m_var[ctlrkey]['batt_max'] = DoubleVar()
533  self.makeWidget(wframe, Label,
534  dictConcat({'textvariable': self.m_var[ctlrkey]['batt_max'],
535  'width': 5}, wcfgValue),
536  dictConcat({'row': 0, 'column': col+1}, gcfgValue))
537 
538  # minimum battery voltage label
539  self.makeWidget(wframe, Label,
540  dictConcat({'text': 'Min Battery (V):'}, wcfgLabel),
541  dictConcat({'row': 1, 'column': col}, gcfgLabel))
542 
543  # minimum battery voltage
544  self.m_var[ctlrkey]['batt_min'] = DoubleVar()
545  self.makeWidget(wframe, Label,
546  dictConcat({'textvariable': self.m_var[ctlrkey]['batt_min'],
547  'width': 5}, wcfgValue),
548  dictConcat({'row': 1, 'column': col+1}, gcfgValue))
549 
550  col += 2
551 
552  # maximum logic voltage label
553  self.makeWidget(wframe, Label,
554  dictConcat({'text': 'Max Logic (V):'}, wcfgLabel),
555  dictConcat({'row': 0, 'column': col}, gcfgLabel))
556 
557  # maximum logic voltage
558  self.m_var[ctlrkey]['logic_max'] = DoubleVar()
559  self.makeWidget(wframe, Label,
560  dictConcat({'textvariable': self.m_var[ctlrkey]['logic_max'],
561  'width': 5}, wcfgValue),
562  dictConcat({'row': 0, 'column': col+1}, gcfgValue))
563 
564  # minimum logic voltage label
565  self.makeWidget(wframe, Label,
566  dictConcat({'text': 'Min Logic (V):'}, wcfgLabel),
567  dictConcat({'row': 1, 'column': col}, gcfgLabel))
568 
569  # minimum logic voltage
570  self.m_var[ctlrkey]['logic_min'] = DoubleVar()
571  self.makeWidget(wframe, Label,
572  dictConcat({'textvariable': self.m_var[ctlrkey]['logic_min'],
573  'width': 5}, wcfgValue),
574  dictConcat({'row': 1, 'column': col+1}, gcfgValue))
575 
576  col += 2
577 
578  # battery voltage label
579  self.makeWidget(wframe, Label,
580  dictConcat({'text': 'Battery (V):'}, wcfgLabel),
581  dictConcat({'row': 0, 'column': col}, gcfgLabel))
582 
583  # battery voltage
584  self.m_var[ctlrkey]['battery'] = DoubleVar()
585  self.makeWidget(wframe, Label,
586  dictConcat({'textvariable': self.m_var[ctlrkey]['battery'], 'width': 5},
587  wcfgValue),
588  dictConcat({'row': 0, 'column': col+1}, gcfgValue))
589 
590  # logic voltage label
591  self.makeWidget(wframe, Label,
592  dictConcat({'text': 'Logic (V):'}, wcfgLabel),
593  dictConcat({'row': 1, 'column': col}, gcfgLabel))
594 
595  # logic voltage
596  self.m_var[ctlrkey]['logic'] = DoubleVar()
597  self.makeWidget(wframe, Label,
598  dictConcat({'textvariable': self.m_var[ctlrkey]['logic'],
599  'width': 5}, wcfgValue),
600  dictConcat({'row': 1, 'column': col+1}, gcfgValue))
601 
602  col += 2
603 
604  # temperature label
605  self.makeWidget(wframe, Label,
606  dictConcat({'text': 'Temp (C):'}, wcfgLabel),
607  dictConcat({'row': 0, 'column': col}, gcfgLabel))
608 
609  # temperature
610  self.m_var[ctlrkey]['temp'] = DoubleVar()
611  self.makeWidget(wframe, Label,
612  dictConcat({'textvariable': self.m_var[ctlrkey]['temp'],
613  'width': 6}, wcfgValue),
614  dictConcat({'row': 0, 'column': col+1}, gcfgValue))
615 
616  col += 2
617 
618  wframe = Frame(wframe)
619  wframe.grid(row=3, column=0, columnspan=col, padx=1, pady=5, sticky=N+W+E)
620 
621  row = 0
622 
623  for motorpos in self.m_motorPos:
624  self.createMotorPanel(wframe, row, 0, ctlrkey, motorpos)
625  row += 1
626 
627  wframe = Frame(wframe)
628  wframe.grid(row=row, column=0, columnspan=col, padx=1, pady=5, sticky=N+W+E)
629 
630  self.createAlarmsPanel(wframe, 0, 0, ctlrkey)
631 
def createMotorPanel(self, parent, row, col, ctlrkey, motorpos)
Create motor controller motor panel.
def createAlarmsPanel(self, parent, row, col, ctlrkey)
Create motor controller alarm panel.
def makeWidget(self, parent, widget, wcfg, gcfg)
Make widget.
def createMotorCtlrPanel(self, parent, row, col, ctlrpos)
Create motor controller panel.
def laelaps_tune_motors.window.createMotorPanel (   self,
  parent,
  row,
  col,
  ctlrkey,
  motorpos 
)

Create motor controller motor panel.

Parameters
parentParent widget.
rowRow in parent widget.
colColumn in parent widget.
ctlrkeyMotor controller db key.
motorposMotor position string.

Definition at line 742 of file laelaps_tune_motors.py.

References laelaps_tune_motors.window.m_var, and laelaps_tune_motors.window.makeWidget().

Referenced by laelaps_tune_motors.window.createMotorCtlrPanel().

742  def createMotorPanel(self, parent, row, col, ctlrkey, motorpos):
743  self.makeWidget(parent, Label,
744  {'text': "%s Motor:" % (motorpos),
745  'font': ('Helvetica', 10),
746  'fg': UIColors['focus'],
747  'borderwidth': 2},
748  {'row': row, 'column': col, 'padx': 1, 'pady': 2, 'sticky': N+W+E})
749 
750  motorkey = _motkey(motorpos)
751 
752  # common widget and grid options
753  wcfgLabel = {'anchor': E, 'justify': RIGHT}
754  gcfgLabel = {'padx': (5,2), 'pady': 2, 'sticky': E}
755  wcfgValue = {'anchor': W, 'justify': LEFT, 'relief': 'solid'}
756  gcfgValue = {'padx': (0,2), 'pady': 1, 'sticky': W}
757 
758  col = 1
759 
760  # encoder type label
761  self.makeWidget(parent, Label,
762  dictConcat({'text': 'Encoder Type:'}, wcfgLabel),
763  dictConcat({'row': row, 'column': col}, gcfgLabel))
764 
765  # encoder type
766  self.m_var[ctlrkey][motorkey]['enc_type'] = StringVar()
767  self.makeWidget(parent, Label,
768  dictConcat({'textvariable': self.m_var[ctlrkey][motorkey]['enc_type'],
769  'width': 10}, wcfgValue),
770  dictConcat({'row': row, 'column': col+1}, gcfgValue))
771 
772  col += 2
773 
774  # amps label
775  self.makeWidget(parent, Label,
776  dictConcat({'text': 'Amps:'}, wcfgLabel),
777  dictConcat({'row': row, 'column': col}, gcfgLabel))
778 
779  # amps
780  self.m_var[ctlrkey][motorkey]['amps'] = DoubleVar()
781  self.makeWidget(parent, Label,
782  dictConcat({'textvariable': self.m_var[ctlrkey][motorkey]['amps'],
783  'width': 8}, wcfgValue),
784  dictConcat({'row': row, 'column': col+1}, gcfgValue))
785 
786  col += 2
787 
788  # encoder label
789  self.makeWidget(parent, Label,
790  dictConcat({'text': 'Encoder:'}, wcfgLabel),
791  dictConcat({'row': row, 'column': col}, gcfgLabel))
792 
793  # encoder
794  self.m_var[ctlrkey][motorkey]['encoder'] = IntVar()
795  self.makeWidget(parent, Label,
796  dictConcat({'textvariable': self.m_var[ctlrkey][motorkey]['encoder'],
797  'width': 12}, wcfgValue),
798  dictConcat({'row': row, 'column': col+1}, gcfgValue))
799 
800  col += 2
801 
802  # speed label
803  self.makeWidget(parent, Label,
804  dictConcat({'text': 'Speed (QPPS):'}, wcfgLabel),
805  dictConcat({'row': row, 'column': col}, gcfgLabel))
806 
807  # speed
808  self.m_var[ctlrkey][motorkey]['speed'] = IntVar()
809  self.makeWidget(parent, Label,
810  dictConcat({'textvariable': self.m_var[ctlrkey][motorkey]['speed'],
811  'width': 8}, wcfgValue),
812  dictConcat({'row': row, 'column': col+1}, gcfgValue))
813 
814  col += 2
815 
def createMotorPanel(self, parent, row, col, ctlrkey, motorpos)
Create motor controller motor panel.
def makeWidget(self, parent, widget, wcfg, gcfg)
Make widget.
def laelaps_tune_motors.window.createMotorsTuningPanel (   self,
  parent,
  row,
  col,
  ctlrpos 
)

Create motor controller motors tuning panel.

Parameters
parentParent widget.
rowRow in parent widget.
colColumn in parent widget.
ctlrposMotor controller position name.

Definition at line 843 of file laelaps_tune_motors.py.

References laelaps_tune_motors.window.createPidParamsPanel(), and laelaps_tune_motors.window.createSetpointsPanel().

Referenced by laelaps_tune_motors.window.createVelTuningPanel().

843  def createMotorsTuningPanel(self, parent, row, col, ctlrpos):
844  wframe = LabelFrame(parent)
845  wframe['text'] = "%s Velocity Tuning" % (ctlrpos)
846  wframe['font'] = ('Helvetica', 12)
847  wframe['fg'] = UIColors['focus']
848  wframe['borderwidth'] = 2
849  wframe['relief'] = 'ridge'
850  wframe.grid(row=row, column=col, padx=1, pady=5, sticky=N+W+E)
851 
852  ctlrkey = _ctlrkey(ctlrpos)
853 
854  wcfgLabel = {'anchor': E, 'justify': RIGHT}
855  gcfgLabel = {'padx': (5,2), 'pady': 2, 'sticky': E}
856  wcfgValue = {'anchor': W, 'justify': LEFT, 'relief': 'solid'}
857  gcfgValue = {'padx': (0,5), 'pady': 1, 'sticky': W}
858 
859  row = 0
860  col = 0
861 
862  # PID subframe
863  self.createPidParamsPanel(wframe, row, col, ctlrkey)
864 
865  # Setpoint subframe
866  row = 1
867  col = 0
868 
869  self.createSetpointsPanel(wframe, row, col, ctlrkey)
870 
def createPidParamsPanel(self, parent, row, col, ctlrkey)
Create motor controller motors PID parameters panel.
def createMotorsTuningPanel(self, parent, row, col, ctlrpos)
Create motor controller motors tuning panel.
def createSetpointsPanel(self, parent, row, col, ctlrkey)
Create motor controller motor velocity setpoints panel.
def laelaps_tune_motors.window.createPidParamsPanel (   self,
  parent,
  row,
  col,
  ctlrkey 
)

Create motor controller motors PID parameters panel.

Parameters
parentParent widget.
rowRow in parent widget.
colColumn in parent widget.
ctlrkeyMotor controller db key.

Definition at line 879 of file laelaps_tune_motors.py.

References laelaps_tune_motors.window.cbLinkCtlrPids(), laelaps_init.window.m_icons, laelaps_tune_motors.window.m_icons, laelaps_tune_motors.window.m_motorPos, laelaps_tune_motors.window.m_var, and laelaps_tune_motors.window.makeWidget().

Referenced by laelaps_tune_motors.window.createMotorsTuningPanel().

879  def createPidParamsPanel(self, parent, row, col, ctlrkey):
880  wframe = LabelFrame(parent)
881  wframe['text'] = 'PID Parameters'
882  #wframe['font'] = ('Helvetica', 10),
883  wframe['fg'] = UIColors['focus'],
884  wframe['borderwidth'] = 2
885  wframe['relief'] = 'ridge'
886  wframe.grid(row=row, column=col, padx=(5,1), pady=(5,0), sticky=N+W+E)
887 
888  wcfgLabel = {'anchor': E, 'justify': RIGHT}
889  gcfgLabel = {'padx': (5,2), 'pady': 2, 'sticky': E}
890  wcfgValue = {'anchor': W, 'justify': LEFT, 'relief': 'solid'}
891  gcfgValue = {'padx': (0,5), 'pady': 1, 'sticky': W}
892 
893  #
894  # PID labels
895  #
896  row = 1
897  col = 0
898 
899  self.makeWidget(wframe, Label,
900  dictConcat({'text': 'P:'}, wcfgLabel),
901  dictConcat({'row': row, 'column': col}, gcfgLabel))
902 
903  row += 1
904 
905  self.makeWidget(wframe, Label,
906  dictConcat({'text': 'I:'}, wcfgLabel),
907  dictConcat({'row': row, 'column': col}, gcfgLabel))
908 
909  row += 1
910 
911  self.makeWidget(wframe, Label,
912  dictConcat({'text': 'D:'}, wcfgLabel),
913  dictConcat({'row': row, 'column': col}, gcfgLabel))
914 
915  row += 1
916 
917  self.makeWidget(wframe, Label,
918  dictConcat({'text': 'Max QPPS:'}, wcfgLabel),
919  dictConcat({'row': row, 'column': col}, gcfgLabel))
920 
921  row += 1
922 
923  self.makeWidget(wframe, Label,
924  dictConcat({'text': 'Max Accel:'}, wcfgLabel),
925  dictConcat({'row': row, 'column': col}, gcfgLabel))
926 
927  col = 1
928 
929  #
930  # Motor PID fields
931  #
932  for motorpos in self.m_motorPos:
933  motorkey = _motkey(motorpos)
934 
935  row = 0
936 
937  self.makeWidget(wframe, Label,
938  {'text': motorpos+' Motor', 'anchor': W, 'justify': LEFT},
939  {'row': row, 'column': col, 'padx': (0,1), 'pady': 2, 'sticky': W})
940 
941  # P
942  row += 1
943  key = 'vel_pid_p'
944 
945  self.m_var[ctlrkey][motorkey][key] = DoubleVar()
946 
947  self.makeWidget(wframe, Entry,
948  {'textvariable': self.m_var[ctlrkey][motorkey][key],
949  'width': 8, 'justify': LEFT, 'relief': 'sunken'},
950  dictConcat({'row': row, 'column': col}, gcfgValue))
951 
952  # I
953  row += 1
954  key = 'vel_pid_i'
955 
956  self.m_var[ctlrkey][motorkey][key] = DoubleVar()
957 
958  self.makeWidget(wframe, Entry,
959  {'textvariable': self.m_var[ctlrkey][motorkey][key],
960  'width': 8, 'justify': LEFT, 'relief': 'sunken'},
961  dictConcat({'row': row, 'column': col}, gcfgValue))
962 
963  # D
964  row += 1
965  key = 'vel_pid_d'
966 
967  self.m_var[ctlrkey][motorkey][key] = DoubleVar()
968 
969  self.makeWidget(wframe, Entry,
970  {'textvariable': self.m_var[ctlrkey][motorkey][key],
971  'width': 8, 'justify': LEFT, 'relief': 'sunken'},
972  dictConcat({'row': row, 'column': col}, gcfgValue))
973 
974  # QPPS
975  row += 1
976  key = 'vel_pid_qpps'
977 
978  self.m_var[ctlrkey][motorkey][key] = DoubleVar()
979 
980  self.makeWidget(wframe, Entry,
981  {'textvariable': self.m_var[ctlrkey][motorkey][key],
982  'width': 8, 'justify': LEFT, 'relief': 'sunken'},
983  dictConcat({'row': row, 'column': col}, gcfgValue))
984 
985  # acceleration
986  row += 1
987  key = 'vel_pid_max_accel'
988 
989  self.m_var[ctlrkey][motorkey][key] = DoubleVar()
990 
991  self.makeWidget(wframe, Entry,
992  {'textvariable': self.m_var[ctlrkey][motorkey][key],
993  'width': 8, 'justify': LEFT, 'relief': 'sunken'},
994  dictConcat({'row': row, 'column': col}, gcfgValue))
995 
996  row += 1
997  col += 1
998 
999  # current or new parameters in controller
1000  self.m_var[ctlrkey][motorkey]['vel_pid_params'] = PidParams.VelPidParams()
1001 
1002  # upwards arrow with left turn
1003  self.makeWidget(wframe, Label,
1004  dictConcat({'text': u'\u21b0'}, wcfgLabel),
1005  {'row': 1, 'column': col, 'padx': (2,2), 'pady': (1,1), 'sticky': W})
1006 
1007  # spacer
1008  self.makeWidget(wframe, Label,
1009  dictConcat({'text': ''}, wcfgLabel),
1010  {'row': 2, 'column': col, 'padx': (2,2), 'pady': (1,1), 'sticky': W})
1011 
1012  # link/unlink button
1013  def cblink(ck): return lambda: self.cbLinkCtlrPids(ck)
1014  icon_key = 'linked_v'
1015  w = Button(wframe)
1016  if self.m_icons[icon_key]:
1017  w['image'] = self.m_icons[icon_key]
1018  w['padx'] = 0
1019  w['pady'] = 0
1020  w['anchor'] = W
1021  w['width'] = 16
1022  else:
1023  w['text'] = 'link'
1024  w['anchor'] = CENTER
1025  w['width'] = 6
1026  self.m_var[ctlrkey]['pid_linked'] = {'w': w, 'val': True};
1027  w['command'] = cblink(ctlrkey)
1028  w.grid(row=3, column=col)
1029 
1030  # spacer
1031  self.makeWidget(wframe, Label,
1032  dictConcat({'text': ''}, wcfgLabel),
1033  {'row': 4, 'column': col, 'padx': (2,2), 'pady': (1,1), 'sticky': W})
1034 
1035  # downward arrow with left turn
1036  self.makeWidget(wframe, Label,
1037  dictConcat({'text': u'\u21b2'}, wcfgLabel),
1038  {'row': 5, 'column': col, 'padx': (2,2), 'pady': (1,1), 'sticky': W})
1039 
def createPidParamsPanel(self, parent, row, col, ctlrkey)
Create motor controller motors PID parameters panel.
def makeWidget(self, parent, widget, wcfg, gcfg)
Make widget.
def laelaps_tune_motors.window.createPlotCanvas (   self,
  parent,
  row,
  col,
  width 
)

Create real-time plot canvas.

Parameters
parentParent widget.
rowRow in parent widget.
colColumn in parent widget.
widthTotal available width of canvas in pixels.

Definition at line 1290 of file laelaps_tune_motors.py.

References laelaps_tune_motors.window.m_plotVel.

Referenced by laelaps_tune_motors.window.createPlotPanel().

1290  def createPlotCanvas(self, parent, row, col, width):
1291  wframe = Frame(parent)
1292  wframe['borderwidth'] = 0
1293  wframe['relief'] = 'ridge'
1294  wframe.grid(row=row, column=col, padx=1, pady=1, sticky=N+W+E)
1295 
1296  # width and height in pixels, subbing out margins
1297  width -= 40
1298  height = 400
1299 
1300  wCanvas = Canvas(wframe, height=height, width=width)
1301  wCanvas.grid(row=0, column=0)
1302 
1303  self.m_plotVel = VelPlot.VelPlot(wCanvas, width, height,
1304  ['left_front', 'right_front', 'left_rear', 'right_rear'],
1305  UIColors)
1306 
1307  self.update_idletasks()
1308 
def createPlotCanvas(self, parent, row, col, width)
Create real-time plot canvas.
def laelaps_tune_motors.window.createPlotControls (   self,
  parent,
  row,
  col 
)

Create real-time plot controls.

Parameters
parentParent widget.
rowRow in parent widget.
colColumn in parent widget.
Returns
Total available width of control frame in pixels.

Definition at line 1186 of file laelaps_tune_motors.py.

References laelaps_tune_motors.window.cbEnDisVelPlot(), laelaps_tune_motors.window.m_var, and laelaps_tune_motors.window.makeWidget().

Referenced by laelaps_tune_motors.window.createPlotPanel().

1186  def createPlotControls(self, parent, row, col):
1187  wframe = Frame(parent)
1188  wframe['borderwidth'] = 0
1189  wframe['relief'] = 'flat'
1190  wframe.grid(row=row, column=col, padx=1, pady=1, sticky=N+W+E)
1191 
1192  row = 0
1193  col = 0
1194 
1195  def cben(ck, mk, fk): return lambda: self.cbEnDisVelPlot(ck, mk, fk)
1196 
1197  ctlrkey = "front_ctlr"
1198  motorkey = "left_motor"
1199  fieldkey = "plotvel"
1200 
1201  # left front graph color
1202  self.makeWidget(wframe, Label,
1203  {'text': ' ', 'bg': UIColors['left_front'],
1204  'anchor': W, 'justify': LEFT},
1205  {'row': row, 'column': col, 'padx': (5,1), 'pady': (1,1), 'sticky': W})
1206 
1207  # left front motor checkbutton
1208  self.m_var[ctlrkey][motorkey][fieldkey] = IntVar();
1209 
1210  self.makeWidget(wframe, Checkbutton,
1211  {'text': 'Left Front', 'command': cben(ctlrkey, motorkey, fieldkey),
1212  'variable': self.m_var[ctlrkey][motorkey][fieldkey],
1213  'anchor': W, 'justify': LEFT},
1214  {'row': row, 'column': col+1, 'padx': (1,5), 'pady': (1,1), 'sticky': W})
1215 
1216  row += 1
1217 
1218  motorkey = "right_motor"
1219 
1220  # right front graph color
1221  self.makeWidget(wframe, Label,
1222  {'text': ' ', 'bg': UIColors['right_front'],
1223  'anchor': W, 'justify': LEFT},
1224  {'row': row, 'column': col, 'padx': (5,1), 'pady': (1,1), 'sticky': W})
1225 
1226  # right front motor checkbutton
1227  self.m_var[ctlrkey][motorkey][fieldkey] = IntVar();
1228 
1229  self.makeWidget(wframe, Checkbutton,
1230  {'text': 'Right Front', 'command': cben(ctlrkey, motorkey, fieldkey),
1231  'variable': self.m_var[ctlrkey][motorkey][fieldkey],
1232  'anchor': W, 'justify': LEFT},
1233  {'row': row, 'column': col+1, 'padx': (1,5), 'pady': (1,1), 'sticky': W})
1234 
1235  row += 1
1236 
1237  ctlrkey = "rear_ctlr"
1238  motorkey = "left_motor"
1239 
1240  # left rear graph color
1241  self.makeWidget(wframe, Label,
1242  {'text': ' ', 'bg': UIColors['left_rear'],
1243  'anchor': W, 'justify': LEFT},
1244  {'row': row, 'column': col, 'padx': (5,1), 'pady': (1,1), 'sticky': W})
1245 
1246  # left rear motor checkbutton
1247  self.m_var[ctlrkey][motorkey][fieldkey] = IntVar();
1248 
1249  self.makeWidget(wframe, Checkbutton,
1250  {'text': 'Left Rear', 'command': cben(ctlrkey, motorkey, fieldkey),
1251  'variable': self.m_var[ctlrkey][motorkey][fieldkey],
1252  'anchor': W, 'justify': LEFT},
1253  {'row': row, 'column': col+1, 'padx': (1,5), 'pady': (1,1), 'sticky': W})
1254 
1255  row += 1
1256 
1257  motorkey = "right_motor"
1258 
1259  # right rear graph color
1260  self.makeWidget(wframe, Label,
1261  {'text': ' ', 'bg': UIColors['right_rear'],
1262  'anchor': W, 'justify': LEFT},
1263  {'row': row, 'column': col, 'padx': (5,1), 'pady': (1,1), 'sticky': W})
1264 
1265  # right rear motor checkbutton
1266  self.m_var[ctlrkey][motorkey][fieldkey] = IntVar();
1267 
1268  self.makeWidget(wframe, Checkbutton,
1269  {'text': 'Right Rear', 'command': cben(ctlrkey, motorkey, fieldkey),
1270  'variable': self.m_var[ctlrkey][motorkey][fieldkey],
1271  'anchor': W, 'justify': LEFT},
1272  {'row': row, 'column': col+1, 'padx': (1,5), 'pady': (1,1), 'sticky': W})
1273 
1274  row += 1
1275 
1276  self.update_idletasks()
1277  width = wframe.winfo_width()
1278  #print 'DBG: plotcontrols width =', width
1279 
1280  return width
1281 
def cbEnDisVelPlot(self, ck, mk, fk)
Enable/disable velocity plot.
def createPlotControls(self, parent, row, col)
Create real-time plot controls.
def makeWidget(self, parent, widget, wcfg, gcfg)
Make widget.
def laelaps_tune_motors.window.createPlotPanel (   self,
  parent,
  row,
  col,
  width 
)

Create real-time plot panel.

Parameters
parentParent widget.
rowRow in parent widget.
colColumn in parent widget.
widthTotal available width of plot panel in pixels.

Definition at line 1162 of file laelaps_tune_motors.py.

References laelaps_tune_motors.window.createPlotCanvas(), laelaps_tune_motors.window.createPlotControls(), and laelaps_tune_motors.window.perfMark().

Referenced by laelaps_tune_motors.window.createCenterPanel().

1162  def createPlotPanel(self, parent, row, col, width):
1163  wframe = LabelFrame(parent)
1164  wframe['text'] = "Real-Time Velocity Plot"
1165  wframe['font'] = ('Helvetica', 12)
1166  wframe['fg'] = UIColors['focus']
1167  wframe['borderwidth'] = 2
1168  wframe['relief'] = 'ridge'
1169  wframe.grid(row=row, column=col, columnspan=2, padx=1, pady=1, sticky=N+W+E)
1170 
1171  subwidth = self.createPlotControls(wframe, 0, 0)
1172  self.perfMark("Created plot controls")
1173 
1174  self.createPlotCanvas(wframe, 0, 1, width-subwidth)
1175  self.perfMark("Created plot canvas")
1176 
def createPlotControls(self, parent, row, col)
Create real-time plot controls.
def createPlotCanvas(self, parent, row, col, width)
Create real-time plot canvas.
def createPlotPanel(self, parent, row, col, width)
Create real-time plot panel.
def laelaps_tune_motors.window.createSetpointsPanel (   self,
  parent,
  row,
  col,
  ctlrkey 
)

Create motor controller motor velocity setpoints panel.

Parameters
parentParent widget.
rowRow in parent widget.
colColumn in parent widget.
ctlrkeyMotor controller db key.

Definition at line 1048 of file laelaps_tune_motors.py.

References laelaps_tune_motors.window.cbLinkCtlrSetpoints(), laelaps_tune_motors.window.cbVelSetpoint(), laelaps_init.window.m_icons, laelaps_tune_motors.window.m_icons, laelaps_tune_motors.window.m_motorPos, laelaps_tune_motors.window.m_var, and laelaps_tune_motors.window.makeWidget().

Referenced by laelaps_tune_motors.window.createMotorsTuningPanel().

1048  def createSetpointsPanel(self, parent, row, col, ctlrkey):
1049  wframe = LabelFrame(parent)
1050  wframe['text'] = 'Setpoints'
1051  #wframe['font'] = ('Helvetica', 10),
1052  wframe['fg'] = UIColors['focus'],
1053  wframe['borderwidth'] = 2
1054  wframe['relief'] = 'ridge'
1055  wframe.grid(row=row, column=col, padx=(5,1), pady=(5,0),
1056  sticky=N+W+E+S)
1057 
1058  wcfgLabel = {'anchor': E, 'justify': RIGHT}
1059  gcfgLabel = {'padx': (5,2), 'pady': 2, 'sticky': E}
1060  wcfgValue = {'anchor': W, 'justify': LEFT, 'relief': 'solid'}
1061  gcfgValue = {'padx': (0,5), 'pady': 1, 'sticky': W}
1062 
1063  row = 0
1064 
1065  def cbspd(ck, mk, fk): return lambda: self.cbVelSetpoint(ck, mk, fk, 0)
1066  def cbpct(ck, mk, fk): return lambda v: self.cbVelSetpoint(ck, mk, fk, v)
1067 
1068  for motorpos in self.m_motorPos:
1069  motorkey = _motkey(motorpos)
1070 
1071  col = 0
1072 
1073  self.makeWidget(wframe, Label,
1074  dictConcat({'text': motorpos+' Motor:'}, wcfgLabel),
1075  {'row': row, 'column': col, 'padx': (2,2), 'pady': (1,0), 'sticky': W})
1076 
1077  col += 1
1078 
1079  key = 'setpoint_speed'
1080 
1081  self.m_var[ctlrkey][motorkey][key] = IntVar()
1082 
1083  self.makeWidget(wframe, Entry,
1084  {'textvariable': self.m_var[ctlrkey][motorkey][key],
1085  'validate': 'focusout',
1086  'validatecommand': cbspd(ctlrkey, motorkey, key),
1087  'width': 8, 'justify': LEFT, 'relief': 'sunken'},
1088  {'row': row, 'column': col,
1089  'padx': (2,2), 'pady': (1,0), 'sticky': E})
1090 
1091  row += 1
1092  col = 0
1093  key = 'setpoint_percent'
1094 
1095  self.m_var[ctlrkey][motorkey][key] = IntVar()
1096 
1097  # slider
1098  self.makeWidget(wframe, Scale,
1099  {'variable': self.m_var[ctlrkey][motorkey][key],
1100  'command': cbpct(ctlrkey, motorkey, key),
1101  'from_': -100, 'to': 100, 'resolution': 1, 'orient': HORIZONTAL,
1102  'tickinterval': 50, 'length': 210},
1103  {'row': row, 'column': col, 'columnspan': 2,
1104  'padx': (2,2), 'pady': (0,0), 'sticky': W})
1105 
1106  row += 1
1107 
1108  # spacer
1109  if motorpos == 'Left':
1110  self.makeWidget(wframe, Label,
1111  dictConcat({'text': ''}, wcfgLabel),
1112  {'row': row, 'column': col, 'padx': (2,2), 'pady': (1,1), 'sticky': W})
1113 
1114  row += 1
1115 
1116  # upwards arrow with left turn
1117  self.makeWidget(wframe, Label,
1118  dictConcat({'text': u'\u21b0'}, wcfgLabel),
1119  {'row': 0, 'column': 2, 'padx': (2,2), 'pady': (1,1), 'sticky': W})
1120 
1121  # spacer
1122  self.makeWidget(wframe, Label,
1123  dictConcat({'text': ''}, wcfgLabel),
1124  {'row': 1, 'column': 2, 'padx': (2,2), 'pady': (1,1), 'sticky': W})
1125 
1126  # link/unlink button
1127  def cblink(ck): return lambda: self.cbLinkCtlrSetpoints(ck)
1128  icon_key = 'linked_v'
1129  w = Button(wframe)
1130  if self.m_icons[icon_key]:
1131  w['image'] = self.m_icons[icon_key]
1132  w['padx'] = 0
1133  w['pady'] = 0
1134  w['anchor'] = W
1135  w['width'] = 16
1136  else:
1137  w['text'] = 'link'
1138  w['anchor'] = CENTER
1139  w['width'] = 6
1140  self.m_var[ctlrkey]['setpoint_linked'] = {'w': w, 'val': True};
1141  w['command'] = cblink(ctlrkey)
1142  w.grid(row=2, column=2)
1143 
1144  # spacer
1145  self.makeWidget(wframe, Label,
1146  dictConcat({'text': ''}, wcfgLabel),
1147  {'row': 3, 'column': 2, 'padx': (2,2), 'pady': (1,1), 'sticky': W})
1148 
1149  # downward arrow with left turn
1150  self.makeWidget(wframe, Label,
1151  dictConcat({'text': u'\u21b2'}, wcfgLabel),
1152  {'row': 4, 'column': 2, 'padx': (2,2), 'pady': (1,1), 'sticky': W})
1153 
def cbVelSetpoint(self, ck, mk, fk, v)
Setpoint changed callback.
def createSetpointsPanel(self, parent, row, col, ctlrkey)
Create motor controller motor velocity setpoints panel.
def makeWidget(self, parent, widget, wcfg, gcfg)
Make widget.
def laelaps_tune_motors.window.createStatusPanel (   self,
  parent,
  row,
  col 
)

Create motor status panel.

Parameters
parentParent widget.
rowRow in parent widget.
colColumn in parent widget.

Definition at line 433 of file laelaps_tune_motors.py.

References laelaps_tune_motors.window.createMotorCtlrPanel(), and laelaps_tune_motors.window.m_motorCtlrPos.

Referenced by laelaps_tune_motors.window.createCenterPanel().

433  def createStatusPanel(self, parent, row, col):
434  wframe = Frame(parent)
435  wframe['relief'] = 'flat'
436  wframe.grid(row=row, column=col, padx=1, pady=3, sticky=N+W+E)
437 
438  row = 0
439  col = 0
440 
441  for name in self.m_motorCtlrPos:
442  self.createMotorCtlrPanel(wframe, row, col, name)
443  row += 1
444 
def createStatusPanel(self, parent, row, col)
Create motor status panel.
def createMotorCtlrPanel(self, parent, row, col, ctlrpos)
Create motor controller panel.
def laelaps_tune_motors.window.createVelTuningPanel (   self,
  parent,
  row,
  col 
)

Create velocity tuning panel.

Parameters
parentParent widget.
rowRow in parent widget.
colColumn in parent widget.

Definition at line 823 of file laelaps_tune_motors.py.

References laelaps_tune_motors.window.createMotorsTuningPanel(), and laelaps_tune_motors.window.m_motorCtlrPos.

Referenced by laelaps_tune_motors.window.createCenterPanel().

823  def createVelTuningPanel(self, parent, row, col):
824  wframe = Frame(parent)
825  wframe['relief'] = 'flat'
826  wframe.grid(row=row, column=col, padx=1, pady=1, sticky=N+W+E)
827 
828  row = 0
829  col = 0
830 
831  for ctlrpos in self.m_motorCtlrPos:
832  self.createMotorsTuningPanel(wframe, row, col, ctlrpos)
833  col += 1
834 
def createVelTuningPanel(self, parent, row, col)
Create velocity tuning panel.
def createMotorsTuningPanel(self, parent, row, col, ctlrpos)
Create motor controller motors tuning panel.
def laelaps_tune_motors.window.finalInits (   self)

Final window initializations.

Both the window data and widgets, along with ROS node application, have been fully initialized.

Definition at line 1620 of file laelaps_tune_motors.py.

References laelaps_tune_motors.window.getLaelapsName(), laelaps_tune_motors.window.m_botName, and laelaps_tune_motors.window.m_wTopHeading.

1620  def finalInits(self):
1621  self.m_botName = self.getLaelapsName()
1622  self.master.title("Laelaps Control Panel - %s" % (self.m_botName))
1623  self.m_wTopHeading['text'] = "Laelaps Control Panel - %s" % \
1624  (self.m_botName)
1625 
1626 
1627 # ------------------------------------------------------------------------------
1628 # Exception Class usage
1629 # ------------------------------------------------------------------------------
1630 
def getLaelapsName(self)
Get Laelaps name.
def finalInits(self)
Final window initializations.
def laelaps_tune_motors.window.getLaelapsName (   self)

Get Laelaps name.

Returns
Returns name.

Definition at line 1539 of file laelaps_tune_motors.py.

Referenced by laelaps_tune_motors.window.finalInits().

1539  def getLaelapsName(self):
1540  name = "laelaps"
1541  try:
1542  rospy.wait_for_service("laelaps_control/get_product_info", timeout=5)
1543  except rospy.ROSException, e:
1544  rospy.logerr("Get product info: %s." % (e.message))
1545  else:
1546  try:
1547  get_product_info = rospy.ServiceProxy(
1548  'laelaps_control/get_product_info',
1549  GetProductInfo)
1550  rsp = get_product_info()
1551  name = rsp.i.hostname
1552  except rospy.ServiceException, e:
1553  rospy.logerr("Get product info request failed: %s." % (e.message))
1554  return name
1555 
def getLaelapsName(self)
Get Laelaps name.
def laelaps_tune_motors.window.getProductInfo (   self)

Get product information.

Returns
Returns product information on success, None on failure.

Definition at line 1517 of file laelaps_tune_motors.py.

References laelaps_tune_motors.window.showError().

Referenced by laelaps_tune_motors.window.about().

1517  def getProductInfo(self):
1518  prodInfo = None
1519  try:
1520  rospy.wait_for_service("laelaps_control/get_product_info", timeout=5)
1521  except rospy.ROSException, e:
1522  self.showError('Get product info: ' + e.message + '.')
1523  else:
1524  try:
1525  get_product_info = rospy.ServiceProxy(
1526  'laelaps_control/get_product_info',
1527  GetProductInfo)
1528  rsp = get_product_info()
1529  prodInfo = rsp.i
1530  except rospy.ServiceException, e:
1531  self.showError("Get product info request failed: %s." % (e.message))
1532  return prodInfo
1533 
def showError(self, msg)
Show error message on status bar.
def getProductInfo(self)
Get product information.
def laelaps_tune_motors.window.initData (   self,
  kw 
)

Initialize class state data.

Any keywords for this application specific window that are not supported by the Frame Tkinter class must be removed.

Parameters
kwKeyword options.
Returns
Modified keywords sans this specific class.

Definition at line 195 of file laelaps_tune_motors.py.

References laelaps_tune_motors.window.m_botName, laelaps_init.window.m_icons, laelaps_tune_motors.window.m_icons, laelaps_tune_motors.window.m_motorCtlrAddr, laelaps_tune_motors.window.m_motorCtlrPos, laelaps_tune_motors.window.m_motorPos, laelaps_tune_motors.window.m_plotVel, laelaps::LaeDbKin.m_powertrain, laelaps_tune_motors.window.m_powertrain, laelaps_tune_motors.window.m_var, laelaps_init.window.m_wBttn, laelaps_tune_motors.window.m_wBttn, and laelaps_tune_motors.window.setPidParams().

Referenced by laelaps_tune_motors.window.__init__().

195  def initData(self, kw):
196  self.m_botName = "laelaps"
197  #RDK self.m_cfgPanel = PanelConfigDlg.ConfigDft.copy() # panel config
198  self.m_icons = {} # must keep loaded icons referenced
199  self.m_wBttn = {} # button widgets
200  self.m_plotVel = None # no plot yet
201 
202  # fixed names, addresses, positions
203  self.m_motorCtlrPos = ['Front', 'Rear']
204  self.m_motorCtlrAddr = {'Front': SysConf.MotorCtlrAddrFront,
205  'Rear': SysConf.MotorCtlrAddrRear}
206  self.m_motorPos = ['Left', 'Right']
207  self.m_powertrain = {
208  'front_ctlr': {'left_motor': 'left_front', 'right_motor': 'right_front'},
209  'rear_ctlr': {'left_motor': 'left_rear', 'right_motor': 'right_rear'}
210  }
211 
212  # variable db
213  self.m_var = {
214  'front_ctlr': {'changes': False, 'left_motor': {}, 'right_motor': {}},
215  'rear_ctlr': {'changes': False, 'left_motor': {}, 'right_motor': {}}
216  }
217 
218  # override panel configuration
219  #RDK if kw.has_key('config'):
220  #RDK self.m_cfgPanel = kw['config'].copy()
221  #RDK del kw['config']
222  #RDK # or read configuration
223  #RDK else:
224  #RDK self.readPanelConfig()
225 
226  return kw
227 
def initData(self, kw)
Initialize class state data.
def laelaps_tune_motors.window.makeWidget (   self,
  parent,
  widget,
  wcfg,
  gcfg 
)

Make widget.

Parameters
parentParent widget.
widgetTkinter widget class.
wcfgDictionary of widget-specific configuration options.
gcfgDictionary of grid options.
Returns
Returns made widget.

Definition at line 1336 of file laelaps_tune_motors.py.

Referenced by laelaps_tune_motors.window.createAlarmsPanel(), laelaps_tune_motors.window.createAlarmWidget(), laelaps_tune_motors.window.createMotorCtlrPanel(), laelaps_tune_motors.window.createMotorPanel(), laelaps_tune_motors.window.createPidParamsPanel(), laelaps_tune_motors.window.createPlotControls(), laelaps_tune_motors.window.createSetpointsPanel(), and laelaps_tune_motors.window.makeWidgets().

1336  def makeWidget(self, parent, widget, wcfg, gcfg):
1337  w = widget(parent, **wcfg)
1338  w.grid(**gcfg)
1339  return w
1340 
def makeWidget(self, parent, widget, wcfg, gcfg)
Make widget.
def laelaps_tune_motors.window.makeWidgets (   self,
  parent,
  wdescTbl 
)

Make widgets from widget description table.

The description table is a list of wdesc widget description dictionaries. Each wdesc dictionary must have the following keys and values: 'widget': W - W is a Tkinter widget class (e.g. Label, button, listbox, etc). 'wcfg': D - D is a dictionary of widget-specific configuration options. 'gcfg': D - D is a dictionary of grid options.

Parameters
parentParent widget.
wdescTblList of [wdesc, wdesc,...].

Definition at line 1322 of file laelaps_tune_motors.py.

References laelaps_tune_motors.window.makeWidget().

1322  def makeWidgets(self, parent, wdescTbl):
1323  for wdesc in wdescTbl:
1324  self.makeWidget(parent, wdesc['widget'], wdesc['wcfg'], wdesc['gcfg'])
1325 
def makeWidgets(self, parent, wdescTbl)
Make widgets from widget description table.
def makeWidget(self, parent, widget, wcfg, gcfg)
Make widget.
def laelaps_tune_motors.window.showEntry (   self,
  w,
  var,
  val,
  fg = 'black' 
)

Show text on read-only entry.

Parameters
wEntry widget.
varBound entry variable.
valVariable value.
fgText foreground color.

Definition at line 1593 of file laelaps_tune_motors.py.

1593  def showEntry(self, w, var, val, fg='black'):
1594  w['state'] = 'normal'
1595  w['fg'] = fg
1596  var.set(val)
1597  w['state'] = 'readonly'
1598 
def showEntry(self, w, var, val, fg='black')
Show text on read-only entry.
def laelaps_tune_motors.window.showError (   self,
  msg 
)

Show error message on status bar.

Parameters
msgError message string.

Definition at line 1579 of file laelaps_tune_motors.py.

References laelaps_init.window.m_wStatusBar, and laelaps_tune_motors.window.m_wStatusBar.

Referenced by laelaps_tune_motors.window.getProductInfo(), and laelaps_tune_motors.window.notimpl().

1579  def showError(self, msg):
1580  self.m_wStatusBar["state"] = "normal"
1581  self.m_wStatusBar["fg"] = UIColors['error']
1582  self.m_varStatus.set(msg)
1583  self.m_wStatusBar["state"] = "readonly"
1584 
def showError(self, msg)
Show error message on status bar.
def laelaps_tune_motors.window.showInfo (   self,
  msg 
)

Show information message on status bar.

Parameters
msgInfo message string.

Definition at line 1568 of file laelaps_tune_motors.py.

References laelaps_init.window.m_wStatusBar, and laelaps_tune_motors.window.m_wStatusBar.

1568  def showInfo(self, msg):
1569  self.m_wStatusBar["state"] = "normal"
1570  self.m_wStatusBar["fg"] = UIColors['normal']
1571  self.m_varStatus.set(msg)
1572  self.m_wStatusBar["state"] = "readonly"
1573 
def showInfo(self, msg)
Show information message on status bar.

The documentation for this class was generated from the following file: