Exemplo n.º 1
0
    def __init__(self, parent=None, motor=None):
        wx.Frame.__init__(self,
                          parent,
                          wx.ID_ANY,
                          size=MAINSIZE,
                          style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL)

        self.motor = motor
        devtype = motor.get('DTYP', as_string=True)
        motor_pvname = self.motor._prefix
        if motor_pvname.endswith('.'):
            motor_pvname = motor_pvname[:-1]

        self.SetTitle("Motor Details: %s  | %s | (%s)" %
                      (motor_pvname, self.motor.DESC, devtype))

        sizer = wx.BoxSizer(wx.VERTICAL)
        panel = MotorDetailPanel(parent=self, motor=motor)

        sizer.Add(panel, 1, wx.EXPAND)

        # self.createMenu()
        set_sizer(self, sizer)

        self.Show()
        self.Raise()
Exemplo n.º 2
0
    def __init__(self, parent=None, motor=None):
        wx.Frame.__init__(self, parent, wx.ID_ANY, size=MAINSIZE, style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL)

        self.motor = motor
        devtype = motor.get("DTYP", as_string=True)
        motor_pvname = self.motor._prefix
        if motor_pvname.endswith("."):
            motor_pvname = motor_pvname[:-1]

        self.SetTitle("Motor Details: %s  | %s | (%s)" % (motor_pvname, self.motor.DESC, devtype))

        sizer = wx.BoxSizer(wx.VERTICAL)
        panel = MotorDetailPanel(parent=self, motor=motor)

        sizer.Add(panel, 1, wx.EXPAND)

        # self.createMenu()
        set_sizer(self, sizer)

        self.Show()
        self.Raise()
Exemplo n.º 3
0
    def __init__(self, parent=None, motor=None):
        ScrolledPanel.__init__(self,
                               parent,
                               size=MAINSIZE,
                               name='',
                               style=wx.EXPAND | wx.GROW | wx.TAB_TRAVERSAL)

        self.Freeze()
        self.motor = motor
        prec = motor.PREC

        sizer = wx.BoxSizer(wx.VERTICAL)

        ds = wx.GridBagSizer(1, 6)
        dp = wx.Panel(self)

        ds.Add(xLabel(dp, 'Label'), (0, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorTextCtrl(dp, 'DESC', size=(180, -1)), (0, 1), (1, 1),
               LCEN, 5)

        ds.Add(xLabel(dp, 'units'), (0, 2), (1, 1), LCEN, 5)
        ds.Add(self.MotorTextCtrl(dp, 'EGU', size=(90, -1)), (0, 3), (1, 1),
               LCEN, 5)
        ds.Add(xLabel(dp, "Precision"), (0, 4), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'PREC', size=(30, -1)), (0, 5), (1, 1), CEN)

        set_sizer(dp, ds)
        sizer.Add(dp, 0)

        sizer.Add((3, 3), 0)
        sizer.Add(wx.StaticLine(self, size=(100, 2)), 0, wx.EXPAND)
        sizer.Add((3, 3), 0)

        ds = wx.GridBagSizer(6, 4)
        dp = wx.Panel(self)
        nrow = 0
        ds.Add(xTitle(dp, "Drive"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(xLabel(dp, "User"), (nrow, 1), (1, 1), CEN, 5)
        ds.Add(xLabel(dp, "Dial"), (nrow, 2), (1, 1), CEN, 5)
        ds.Add(xLabel(dp, "Raw"), (nrow, 3), (1, 1), CEN, 5)

        ####
        nrow += 1
        self.info = wx.StaticText(dp, label='', size=(55, 20), style=CEN)
        self.info.SetForegroundColour("Red")

        ds.Add(xLabel(dp, "High Limit"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'HLM'), (nrow, 1), (1, 1), CEN, 5)
        ds.Add(self.MotorCtrl(dp, 'DHLM'), (nrow, 2), (1, 1), CEN, 5)
        ds.Add(self.info, (nrow, 3), (1, 1), CEN, 5)

        ####
        nrow += 1
        ostyle = RCEN | wx.EXPAND
        ds.Add(xLabel(dp, "Readback"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorText(dp, 'RBV'), (nrow, 1), (1, 1), ostyle, 5)
        ds.Add(self.MotorText(dp, 'DRBV'), (nrow, 2), (1, 1), ostyle, 5)
        ds.Add(self.MotorText(dp, 'RRBV'), (nrow, 3), (1, 1), ostyle, 5)

        ####
        nrow += 1
        self.drives = [
            self.MotorCtrl(dp, 'VAL'),
            self.MotorCtrl(dp, 'DVAL'),
            self.MotorCtrl(dp, 'RVAL')
        ]

        ds.Add(xLabel(dp, "Move"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.drives[0], (nrow, 1), (1, 1), CEN, 5)
        ds.Add(self.drives[1], (nrow, 2), (1, 1), CEN, 5)
        ds.Add(self.drives[2], (nrow, 3), (1, 1), CEN, 5)

        nrow += 1
        ds.Add(xLabel(dp, "Low Limit"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'LLM'), (nrow, 1), (1, 1), CEN, 5)
        ds.Add(self.MotorCtrl(dp, 'DLLM'), (nrow, 2), (1, 1), CEN, 5)

        ####

        twk_sizer = wx.BoxSizer(wx.HORIZONTAL)
        twk_panel = wx.Panel(dp)
        twk_val = PVFloatCtrl(twk_panel, size=(110, -1), precision=prec)
        twk_val.SetPV(self.motor.PV('TWV'))

        twk_left = wx.Button(twk_panel, label='<', size=(30, 30))
        twk_right = wx.Button(twk_panel, label='>', size=(30, 30))
        twk_left.Bind(wx.EVT_BUTTON, self.OnLeftButton)
        twk_right.Bind(wx.EVT_BUTTON, self.OnRightButton)
        twk_sizer.AddMany([(twk_left, 0, CEN), (twk_val, 0, CEN),
                           (twk_right, 0, CEN)])

        set_sizer(twk_panel, twk_sizer)

        nrow += 1
        ds.Add(xLabel(dp, "Tweak"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(twk_panel, (nrow, 1), (1, 2), wx.ALIGN_LEFT, 5)

        epv = self.motor.PV('disabled')

        able_btns = PVEnumButtons(dp,
                                  pv=epv,
                                  orientation=wx.VERTICAL,
                                  size=(80, 60))

        ds.Add(able_btns, (nrow - 1, 3), (2, 1), CEN, 5)

        stop_btns = PVEnumButtons(dp,
                                  pv=self.motor.PV('SPMG'),
                                  orientation=wx.VERTICAL,
                                  size=(100, 125))

        ds.Add(stop_btns, (2, 4), (4, 1), wx.ALIGN_RIGHT, 5)

        for attr in ('LLM', 'HLM', 'DLLM', 'DHLM'):
            pv = self.motor.PV(attr)
            pv.add_callback(self.OnLimitChange, wid=self.GetId(), attr=attr)

        #
        set_sizer(dp, ds)  # ,fit=True)
        sizer.Add(dp, 0)

        ####
        sizer.Add((3, 3), 0)
        sizer.Add(wx.StaticLine(self, size=(100, 2)), 0, wx.EXPAND)
        sizer.Add((3, 3), 0)
        sizer.Add(xTitle(self, 'Calibration'), 0, LCEN, 25)

        ds = wx.GridBagSizer(6, 5)
        dp = wx.Panel(self)

        ds.Add(xLabel(dp, 'Mode: '), (0, 0), (1, 1), LCEN, 5)

        ds.Add(
            PVEnumButtons(dp,
                          pv=self.motor.PV('SET'),
                          orientation=wx.HORIZONTAL,
                          size=(175, 25)), (0, 1), (1, 2), wx.ALIGN_LEFT)

        ds.Add(xLabel(dp, 'Direction: '), (1, 0), (1, 1), LCEN, 5)
        ds.Add(
            PVEnumButtons(dp,
                          pv=self.motor.PV('DIR'),
                          orientation=wx.HORIZONTAL,
                          size=(175, 25)), (1, 1), (1, 2), wx.ALIGN_LEFT)

        ds.Add(xLabel(dp, 'Freeze Offset: '), (0, 4), (1, 1), LCEN, 5)
        ds.Add(PVEnumChoice(dp, pv=self.motor.PV('FOFF'), size=(110, -1)),
               (0, 5), (1, 1), CEN)

        ds.Add(xLabel(dp, 'Offset Value: '), (1, 4), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'OFF'), (1, 5), (1, 1), CEN)

        set_sizer(dp, ds)
        sizer.Add(dp, 0)
        #####

        sizer.Add((3, 3), 0)
        sizer.Add(wx.StaticLine(self, size=(100, 2)), 0, wx.EXPAND)
        sizer.Add((3, 3), 0)
        #
        ds = wx.GridBagSizer(6, 3)
        dp = wx.Panel(self)
        nrow = 0

        ds.Add(xTitle(dp, "Dynamics"), (nrow, 0), (1, 1), LCEN, 55)
        ds.Add(xLabel(dp, "Normal"), (nrow, 1), (1, 1), CEN)
        ds.Add(xLabel(dp, "Backlash"), (nrow, 2), (1, 1), CEN)

        ####
        nrow += 1
        ds.Add(xLabel(dp, "Max Speed"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'VMAX'), (nrow, 1), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Speed"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'VELO'), (nrow, 1), (1, 1), CEN)
        ds.Add(self.MotorCtrl(dp, 'BVEL'), (nrow, 2), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Base Speed"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'VBAS'), (nrow, 1), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Accel (s)"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'ACCL'), (nrow, 1), (1, 1), CEN)
        ds.Add(self.MotorCtrl(dp, 'BACC'), (nrow, 2), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Backslash Distance"), (nrow, 0), (1, 2), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'BDST'), (nrow, 2), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Move Fraction"), (nrow, 0), (1, 2), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'FRAC'), (nrow, 2), (1, 1), CEN)

        set_sizer(dp, ds)  # ,fit=True)

        sizer.Add(dp, 0)

        sizer.Add((3, 3), 0)
        sizer.Add(wx.StaticLine(self, size=(100, 2)), 0, wx.EXPAND)
        sizer.Add((3, 3), 0)
        sizer.Add(xTitle(self, 'Resolution, Readback, and Retries'), 0, LCEN,
                  5)

        ds = wx.GridBagSizer(4, 4)
        dp = wx.Panel(self)
        nrow = 0

        ds.Add(xLabel(dp, "Motor Res"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'MRES'), (nrow, 1), (1, 1), CEN)
        ds.Add(xLabel(dp, "Encoder Res"), (nrow, 2), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'ERES'), (nrow, 3), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Steps / Rev"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'SREV'), (nrow, 1), (1, 1), CEN)
        ds.Add(xLabel(dp, "Units / Rev"), (nrow, 2), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'UREV'), (nrow, 3), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Readback Res"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'RRES'), (nrow, 1), (1, 1), CEN)
        ds.Add(xLabel(dp, "Readback Delay (s)"), (nrow, 2), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'DLY'), (nrow, 3), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Retry Deadband"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'RDBD'), (nrow, 1), (1, 1), CEN)
        ds.Add(xLabel(dp, "Max Retries"), (nrow, 2), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'RTRY'), (nrow, 3), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Use Encoder"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(PVEnumChoice(dp, pv=self.motor.PV('UEIP'), size=(110, -1)),
               (nrow, 1), (1, 1), CEN)
        ds.Add(xLabel(dp, "Use Readback"), (nrow, 2), (1, 1), LCEN, 5)
        ds.Add(PVEnumChoice(dp, pv=self.motor.PV('URIP'), size=(110, -1)),
               (nrow, 3), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Use NTM"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(PVEnumChoice(dp, pv=self.motor.PV('NTM'), size=(110, -1)),
               (nrow, 1), (1, 1), CEN)
        ds.Add(xLabel(dp, "NTM Factor"), (nrow, 2), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'NTMF'), (nrow, 3), (1, 1), CEN)

        set_sizer(dp, ds)
        sizer.Add(dp, 0)
        sizer.Add(wx.StaticLine(self, size=(100, 2)), 0, wx.EXPAND)

        for attr in self.__motor_fields:
            self.motor.PV(attr).add_callback(self.OnMotorEvent,
                                             wid=self.GetId(),
                                             field=attr)

        self.info.SetLabel('')
        for f in ('HLS', 'LLS', 'LVIO', 'SET'):
            if self.motor.get(f):
                wx.CallAfter(self.OnMotorEvent,
                             pvname=self.motor.PV(f).pvname,
                             field=f)

        set_sizer(self, sizer, fit=True)
        self.SetupScrolling()
        self.Thaw()
Exemplo n.º 4
0
    def __init__(self, parent=None, motor=None):
        ScrolledPanel.__init__(self, parent, size=MAINSIZE, name='',
                               style=wx.EXPAND|wx.GROW|wx.TAB_TRAVERSAL)

        self.Freeze()
        self.motor = motor
        prec = motor.PREC

        sizer = wx.BoxSizer(wx.VERTICAL)


        ds = wx.GridBagSizer(1, 6)
        dp = wx.Panel(self)

        ds.Add(xLabel(dp, 'Label'), (0, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorTextCtrl(dp, 'DESC',  size=(180, -1)), 
               (0, 1), (1, 1), LCEN, 5)
        
        ds.Add(xLabel(dp, 'units'), (0, 2), (1, 1), LCEN, 5)
        ds.Add(self.MotorTextCtrl(dp, 'EGU',  size=(90, -1)), 
               (0, 3), (1, 1), LCEN, 5)
        ds.Add(xLabel(dp, "Precision"),      (0, 4), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'PREC', size=(30, -1)),  (0, 5), (1, 1), CEN)

        set_sizer(dp, ds) 
        sizer.Add(dp, 0)

        sizer.Add((3, 3), 0)
        sizer.Add(wx.StaticLine(self, size=(100, 2)),  0, wx.EXPAND)
        sizer.Add((3, 3), 0)

        ds = wx.GridBagSizer(6, 4)
        dp = wx.Panel(self)
        nrow = 0
        ds.Add(xTitle(dp,"Drive"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(xLabel(dp,"User" ), (nrow, 1), (1, 1), CEN, 5)
        ds.Add(xLabel(dp,"Dial" ), (nrow, 2), (1, 1), CEN, 5)
        ds.Add(xLabel(dp,"Raw"  ), (nrow, 3), (1, 1), CEN, 5)

        ####
        nrow += 1
        self.info = wx.StaticText(dp, label='', size=(55, 20), style=CEN)
        self.info.SetForegroundColour("Red")

        ds.Add(xLabel(dp,"High Limit"),     (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp,'HLM'),   (nrow, 1), (1, 1), CEN, 5)
        ds.Add(self.MotorCtrl(dp,'DHLM'),  (nrow, 2), (1, 1), CEN, 5)
        ds.Add(self.info,                   (nrow, 3), (1, 1), CEN, 5)

        ####
        nrow += 1
        ostyle = RCEN|wx.EXPAND
        ds.Add(xLabel(dp,"Readback"),       (nrow, 0),  (1, 1), LCEN, 5)
        ds.Add(self.MotorText(dp, 'RBV'),  (nrow, 1),  (1, 1), ostyle, 5)
        ds.Add(self.MotorText(dp, 'DRBV'), (nrow, 2),  (1, 1), ostyle, 5)
        ds.Add(self.MotorText(dp, 'RRBV'), (nrow, 3),  (1, 1), ostyle, 5)

        ####
        nrow += 1
        self.drives  = [self.MotorCtrl(dp, 'VAL'),
                        self.MotorCtrl(dp, 'DVAL'),
                        self.MotorCtrl(dp, 'RVAL')]

        ds.Add(xLabel(dp,"Move"),  (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.drives[0],     (nrow, 1), (1, 1), CEN, 5)
        ds.Add(self.drives[1],     (nrow, 2), (1, 1), CEN, 5)
        ds.Add(self.drives[2],     (nrow, 3), (1, 1), CEN, 5)

        nrow += 1
        ds.Add(xLabel(dp,"Low Limit"),      (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'LLM'),  (nrow, 1), (1, 1), CEN, 5)
        ds.Add(self.MotorCtrl(dp, 'DLLM'), (nrow, 2), (1, 1), CEN, 5)

        ####

        twk_sizer = wx.BoxSizer(wx.HORIZONTAL)
        twk_panel = wx.Panel(dp)
        twk_val = PVFloatCtrl(twk_panel, size=(110, -1), precision=prec)
        twk_val.SetPV(self.motor.PV('TWV'))

        twk_left = wx.Button(twk_panel, label='<',  size=(30, 30))
        twk_right = wx.Button(twk_panel, label='>',  size=(30, 30))
        twk_left.Bind(wx.EVT_BUTTON,  self.OnLeftButton)
        twk_right.Bind(wx.EVT_BUTTON, self.OnRightButton)
        twk_sizer.AddMany([(twk_left,   0, CEN),
                           (twk_val,    0, CEN),
                           (twk_right,  0, CEN)])

        set_sizer(twk_panel, twk_sizer)

        nrow += 1
        ds.Add(xLabel(dp,"Tweak"),    (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(twk_panel,             (nrow, 1), (1, 2), wx.ALIGN_LEFT, 5)

        epv = self.motor.PV('disabled')

        able_btns = PVEnumButtons(dp, pv=epv, orientation = wx.VERTICAL,
                                  size=(80, 60))

        ds.Add(able_btns,   (nrow-1, 3), (2, 1), CEN, 5)

        stop_btns = PVEnumButtons(dp, pv=self.motor.PV('SPMG'),
                                  orientation = wx.VERTICAL,
                                  size=(100, 125))

        ds.Add(stop_btns,     (2, 4), (4, 1), wx.ALIGN_RIGHT, 5)

        for attr in ('LLM', 'HLM', 'DLLM', 'DHLM'):
            pv = self.motor.PV(attr)
            pv.add_callback(self.OnLimitChange, wid=self.GetId(), attr=attr)

        #
        set_sizer(dp, ds) # ,fit=True)
        sizer.Add(dp, 0)

        ####
        sizer.Add((3, 3), 0)
        sizer.Add(wx.StaticLine(self, size=(100, 2)),  0, wx.EXPAND)
        sizer.Add((3, 3), 0)
        sizer.Add(xTitle(self, 'Calibration'), 0, LCEN, 25)

        ds = wx.GridBagSizer(6, 5)
        dp = wx.Panel(self)

        ds.Add(xLabel(dp, 'Mode: '),  (0, 0), (1, 1), LCEN, 5)

        ds.Add(PVEnumButtons(dp, pv=self.motor.PV('SET'),
                             orientation = wx.HORIZONTAL,
                             size=(175, 25)), (0, 1), (1, 2), wx.ALIGN_LEFT)

        ds.Add(xLabel(dp, 'Direction: '), (1, 0), (1, 1), LCEN, 5)
        ds.Add(PVEnumButtons(dp, pv=self.motor.PV('DIR'),
                             orientation=wx.HORIZONTAL,
                             size=(175, 25)), (1, 1), (1, 2), wx.ALIGN_LEFT)

        ds.Add(xLabel(dp, 'Freeze Offset: '), (0, 4), (1, 1), LCEN, 5)
        ds.Add(PVEnumChoice(dp, pv=self.motor.PV('FOFF'),
                            size=(110, -1)),  (0, 5), (1, 1), CEN)

        ds.Add(xLabel(dp, 'Offset Value: '), (1, 4), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp,'OFF'),    (1, 5), (1, 1), CEN)

        set_sizer(dp, ds)
        sizer.Add(dp, 0)
        #####

        sizer.Add((3, 3), 0)
        sizer.Add(wx.StaticLine(self, size=(100, 2)),  0, wx.EXPAND)
        sizer.Add((3, 3), 0)
        #
        ds = wx.GridBagSizer(6, 3)
        dp = wx.Panel(self)
        nrow = 0

        ds.Add(xTitle(dp, "Dynamics"),  (nrow, 0), (1, 1), LCEN, 55)
        ds.Add(xLabel(dp, "Normal" ),   (nrow, 1), (1, 1), CEN)
        ds.Add(xLabel(dp, "Backlash" ), (nrow, 2), (1, 1), CEN)

        ####
        nrow += 1
        ds.Add(xLabel(dp, "Max Speed"),      (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'VMAX'),  (nrow, 1), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Speed"),           (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'VELO'),   (nrow, 1), (1, 1), CEN)
        ds.Add(self.MotorCtrl(dp, 'BVEL'),   (nrow, 2), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Base Speed"),     (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'VBAS'),  (nrow, 1), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Accel (s)"),      (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'ACCL'),  (nrow, 1), (1, 1), CEN)
        ds.Add(self.MotorCtrl(dp, 'BACC'),  (nrow, 2), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Backslash Distance"), (nrow, 0), (1, 2), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'BDST'),     (nrow, 2), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Move Fraction"),  (nrow, 0), (1, 2), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'FRAC'),  (nrow, 2), (1, 1), CEN)

        set_sizer(dp, ds) # ,fit=True)

        sizer.Add(dp, 0)

        sizer.Add((3, 3), 0)
        sizer.Add(wx.StaticLine(self, size=(100, 2)),  0, wx.EXPAND)
        sizer.Add((3, 3), 0)
        sizer.Add(xTitle(self, 'Resolution, Readback, and Retries'), 0, LCEN, 5)

        ds = wx.GridBagSizer(4, 4)
        dp = wx.Panel(self)
        nrow = 0

        ds.Add(xLabel(dp, "Motor Res"),     (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'MRES'),  (nrow, 1), (1, 1), CEN)
        ds.Add(xLabel(dp, "Encoder Res"),   (nrow, 2), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'ERES'),  (nrow, 3), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Steps / Rev"),    (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'SREV'),  (nrow, 1), (1, 1), CEN)
        ds.Add(xLabel(dp, "Units / Rev"),    (nrow, 2), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'UREV'),  (nrow, 3), (1, 1), CEN)


        nrow += 1
        ds.Add(xLabel(dp, "Readback Res"),        (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'RRES'),        (nrow, 1), (1, 1), CEN)
        ds.Add(xLabel(dp, "Readback Delay (s)"),  (nrow, 2), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'DLY'),         (nrow, 3), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Retry Deadband"),      (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'RDBD'),        (nrow, 1), (1, 1), CEN)
        ds.Add(xLabel(dp, "Max Retries"),         (nrow, 2), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'RTRY'),        (nrow, 3), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Use Encoder"),      (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(PVEnumChoice(dp, pv=self.motor.PV('UEIP'),
                            size=(110, -1)),  (nrow, 1), (1, 1), CEN)
        ds.Add(xLabel(dp, "Use Readback"),      (nrow, 2), (1, 1), LCEN, 5)
        ds.Add(PVEnumChoice(dp, pv=self.motor.PV('URIP'),
                            size=(110, -1)),  (nrow, 3), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Use NTM"),      (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(PVEnumChoice(dp, pv=self.motor.PV('NTM'),
                            size=(110, -1)),  (nrow, 1), (1, 1), CEN)
        ds.Add(xLabel(dp, "NTM Factor"),      (nrow, 2), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'NTMF'),    (nrow, 3), (1, 1), CEN)


        set_sizer(dp, ds)
        sizer.Add(dp, 0)
        sizer.Add(wx.StaticLine(self, size=(100, 2)),  0, wx.EXPAND)


        for attr in self.__motor_fields:
            self.motor.PV(attr).add_callback(self.OnMotorEvent,
                                             wid=self.GetId(), field=attr)

        self.info.SetLabel('')
        for f in ('HLS', 'LLS', 'LVIO', 'SET'):
            if self.motor.get(f):
                wx.CallAfter(self.OnMotorEvent,
                             pvname=self.motor.PV(f).pvname, field=f)

        set_sizer(self, sizer, fit=True)
        self.SetupScrolling()
        self.Thaw()
Exemplo n.º 5
0
    def __init__(self, parent=None, motor=None):
        wx.Frame.__init__(self, parent, wx.ID_ANY,
                          style=wx.DEFAULT_FRAME_STYLE, size=(500, 775))
        self.motor = motor
        prec = motor.PREC
        motor_pvname = self.motor._prefix
        devtype = motor.get('DTYP', as_string=True)

        if motor_pvname.endswith('.'):
            motor_pvname = motor_pvname[:-1]
            
        self.SetTitle("Motor Details: %s  | %s | (%s)" % (motor_pvname,
                                                          self.motor.DESC,
                                                          devtype))

        panel = wx.Panel(self) 
        sizer = wx.BoxSizer(wx.VERTICAL)

        spanel = wx.Panel(panel, -1, size=(500, 50))
        ssizer = wx.BoxSizer(wx.HORIZONTAL)
        ssizer.AddMany([(wx.StaticText(spanel, label=' Label ',
                                       size=(65, -1)), 0,  RCEN),
                        (self.MotorTextCtrl(spanel, 'DESC',
                                             size=(210, -1)), 1,  LCEN),
                        (wx.StaticText(spanel, label='  units ',
                                       size=(75, -1)), 0, RCEN), 
                        (self.MotorTextCtrl(spanel, 'EGU',
                                             size=(95, -1)), 0,  LCEN)
                        ])

        set_sizer(spanel, ssizer)
        sizer.Add(spanel, 0, wx.EXPAND)
        sizer.Add(wx.StaticLine(panel, size=(100, 2)),  0, wx.EXPAND)

        ds = wx.GridBagSizer(6, 4)
        dp = wx.Panel(panel)
        nrow = 0
        
        nrow += 1
        ds.Add(xTitle(dp,"Drive"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(xLabel(dp,"User" ), (nrow, 1), (1, 1), CEN)
        ds.Add(xLabel(dp,"Dial" ), (nrow, 2), (1, 1), CEN)
        ds.Add(xLabel(dp,"Raw"  ), (nrow, 3), (1, 1), CEN)

        ####
        nrow += 1
        self.info = wx.StaticText(dp, label='', size=(55, 20), style=CEN)
        self.info.SetForegroundColour("Red")

        ds.Add(xLabel(dp,"High Limit"),     (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp,'HLM'),   (nrow, 1), (1, 1), CEN)
        ds.Add(self.MotorCtrl(dp,'DHLM'),  (nrow, 2), (1, 1), CEN)
        ds.Add(self.info,                   (nrow, 3), (1, 1), CEN)        

        ####
        nrow += 1
        ostyle = RCEN|wx.EXPAND
        ds.Add(xLabel(dp,"Readback"),       (nrow, 0),  (1, 1), LCEN, 5)
        ds.Add(self.MotorText(dp, 'RBV'),  (nrow, 1),  (1, 1), ostyle, 5)
        ds.Add(self.MotorText(dp, 'DRBV'), (nrow, 2),  (1, 1), ostyle, 5)
        ds.Add(self.MotorText(dp, 'RRBV'), (nrow, 3),  (1, 1), ostyle, 5)

        ####
        nrow += 1
        self.drives  = [self.MotorCtrl(dp, 'VAL'),
                        self.MotorCtrl(dp, 'DVAL'),
                        self.MotorCtrl(dp, 'RVAL')]

        ds.Add(xLabel(dp,"Move"),  (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.drives[0],     (nrow, 1), (1, 1), CEN)
        ds.Add(self.drives[1],     (nrow, 2), (1, 1), CEN)
        ds.Add(self.drives[2],     (nrow, 3), (1, 1), CEN)        

        nrow += 1
        ds.Add(xLabel(dp,"Low Limit"),      (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'LLM'),  (nrow, 1), (1, 1), CEN)
        ds.Add(self.MotorCtrl(dp, 'DLLM'), (nrow, 2), (1, 1), CEN)

        ####

        twk_sizer = wx.BoxSizer(wx.HORIZONTAL)
        twk_panel = wx.Panel(dp)
        twk_val = pvFloatCtrl(twk_panel, size=(110, -1), precision=prec)
        twk_val.SetPV(self.motor.PV('TWV'))                
         
        twk_left = wx.Button(twk_panel, label='<',  size=(30, 30))
        twk_right = wx.Button(twk_panel, label='>',  size=(30, 30))
        twk_left.Bind(wx.EVT_BUTTON,  self.OnLeftButton)
        twk_right.Bind(wx.EVT_BUTTON, self.OnRightButton)
        twk_sizer.AddMany([(twk_left,   0, CEN),
                           (twk_val,    0, CEN),
                           (twk_right,  0, CEN)])
         
        set_sizer(twk_panel, twk_sizer)

        nrow += 1
        ds.Add(xLabel(dp,"Tweak"),    (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(twk_panel,             (nrow, 1), (1, 2), wx.ALIGN_LEFT)

        epv = self.motor.PV('disabled')

        able_btns = pvEnumButtons(dp, pv=epv, orientation = wx.VERTICAL, 
                                  size=(110, -1))

        ds.Add(able_btns,   (nrow-1, 3), (2, 1), CEN)

        stop_btns = pvEnumButtons(dp, pv=self.motor.PV('SPMG'),
                                  orientation = wx.VERTICAL, 
                                  size=(110,-1))

        ds.Add(stop_btns,     (2, 4), (4, 1), wx.ALIGN_RIGHT)

        for attr in ('LLM', 'HLM', 'DLLM', 'DHLM'):
            pv = self.motor.PV(attr)
            pv.add_callback(self.OnLimitChange, wid=self.GetId(), attr=attr)
            
        #
        set_sizer(dp, ds) # ,fit=True)
        sizer.Add(dp, 0)

        ####
        sizer.Add(wx.StaticLine(panel, size=(100, 2)),  0, wx.EXPAND)
        sizer.Add((5, 5), 0)
        sizer.Add(xTitle(panel, 'Calibration'), 0, LCEN, 5)        

        ds = wx.GridBagSizer(6, 4)
        dp = wx.Panel(panel)
                   
        ds.Add(xLabel(dp, 'Mode: '),  (0, 0), (1, 1), LCEN, 5)
        
        ds.Add(pvEnumButtons(dp, pv=self.motor.PV('SET'),
                              orientation = wx.HORIZONTAL, 
                              size=(110, -1)), (0, 1), (1, 1), wx.ALIGN_LEFT)

        ds.Add(xLabel(dp, 'Direction: '), (1, 0), (1, 1), LCEN, 5)
        ds.Add(pvEnumButtons(dp, pv=self.motor.PV('DIR'),
                              orientation=wx.HORIZONTAL, 
                              size=(110, -1)), (1, 1), (1, 1), wx.ALIGN_LEFT)

        ds.Add(xLabel(dp, 'Freeze Offset: '), (0, 2), (1, 1), LCEN, 5)
        ds.Add(pvEnumChoice(dp, pv=self.motor.PV('FOFF'),
                            size=(110, -1)),  (0, 3), (1, 1), CEN)
        
        ds.Add(xLabel(dp, 'Offset Value: '), (1, 2), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp,'OFF'),    (1, 3), (1, 1), CEN)

        set_sizer(dp, ds)
        sizer.Add(dp, 0)
        #####
        
        sizer.Add((5, 5), 0)        
        sizer.Add(wx.StaticLine(panel, size=(100, 2)),  0, wx.EXPAND)
        sizer.Add((5, 5), 0)                
        #
        ds = wx.GridBagSizer(6, 3)
        dp = wx.Panel(panel)
        nrow = 0

        ds.Add(xTitle(dp, "Dynamics"),  (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(xLabel(dp, "Normal" ),   (nrow, 1), (1, 1), CEN)
        ds.Add(xLabel(dp, "Backlash" ), (nrow, 2), (1, 1), CEN)

        ####
        nrow += 1
        ds.Add(xLabel(dp, "Max Speed"),      (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'SMAX'),  (nrow, 1), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Speed"),           (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'VELO'),   (nrow, 1), (1, 1), CEN)
        ds.Add(self.MotorCtrl(dp, 'BVEL'),   (nrow, 2), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Base Speed"),     (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'VBAS'),  (nrow, 1), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Accel (s)"),      (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'ACCL'),  (nrow, 1), (1, 1), CEN)
        ds.Add(self.MotorCtrl(dp, 'BACC'),  (nrow, 2), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Backslash Distance"), (nrow, 0), (1, 2), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'BDST'),     (nrow, 2), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Move Fraction"),  (nrow, 0), (1, 2), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'FRAC'),  (nrow, 2), (1, 1), CEN)

        set_sizer(dp, ds) # ,fit=True)
        
        sizer.Add(dp, 0)
        sizer.Add(wx.StaticLine(panel, size=(100, 2)),  0, wx.EXPAND)

        sizer.Add((5, 5), 0)                
        sizer.Add(xTitle(panel, 'Resolution'), 0, LCEN, 5)

        ds = wx.GridBagSizer(4, 4)
        dp = wx.Panel(panel)
        nrow = 0
        ds.Add(xLabel(dp, "Motor Res"),      (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'MRES'),  (nrow, 1), (1, 1), CEN)
        ds.Add(xLabel(dp, "Encoder Res"),    (nrow, 2), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'ERES'),  (nrow, 3), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Steps / Rev"),    (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'SREV'),  (nrow, 1), (1, 1), CEN)
        ds.Add(xLabel(dp, "Units / Rev"),    (nrow, 2), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'UREV'),  (nrow, 3), (1, 1), CEN)        

        nrow += 1
        ds.Add(xLabel(dp, "Precision"),      (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, 'PREC'),  (nrow, 1), (1, 1), CEN)        

        set_sizer(dp, ds) 
        sizer.Add(dp, 0)
        sizer.Add(wx.StaticLine(panel, size=(100, 2)),  0, wx.EXPAND)        
        

        for attr in self.__motor_fields:
            self.motor.PV(attr).add_callback(self.OnMotorEvent,
                                             wid=self.GetId(), field=attr)


        self.info.SetLabel('')
        for f in ('HLS', 'LLS', 'LVIO', 'SET'):
            if self.motor.get(f):
                wx.CallAfter(self.OnMotorEvent,
                             pvname=self.motor.PV(f).pvname, field=f)

        set_sizer(panel, sizer, fit=True)
        self.Show()
        self.Raise()
Exemplo n.º 6
0
    def __init__(self, parent=None, motor=None):
        ScrolledPanel.__init__(self, parent, size=MAINSIZE, name="", style=wx.EXPAND | wx.GROW | wx.TAB_TRAVERSAL)

        self.motor = motor
        prec = motor.PREC

        sizer = wx.BoxSizer(wx.VERTICAL)

        ds = wx.GridBagSizer(1, 6)
        dp = wx.Panel(self)

        ds.Add(xLabel(dp, "Label"), (0, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorTextCtrl(dp, "DESC", size=(180, -1)), (0, 1), (1, 1), LCEN, 5)

        ds.Add(xLabel(dp, "units"), (0, 2), (1, 1), LCEN, 5)
        ds.Add(self.MotorTextCtrl(dp, "EGU", size=(90, -1)), (0, 3), (1, 1), LCEN, 5)
        ds.Add(xLabel(dp, "Precision"), (0, 4), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, "PREC", size=(30, -1)), (0, 5), (1, 1), CEN)

        set_sizer(dp, ds)
        sizer.Add(dp, 0)

        sizer.Add((3, 3), 0)
        sizer.Add(wx.StaticLine(self, size=(100, 2)), 0, wx.EXPAND)
        sizer.Add((3, 3), 0)

        ds = wx.GridBagSizer(6, 4)
        dp = wx.Panel(self)
        nrow = 0
        ds.Add(xTitle(dp, "Drive"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(xLabel(dp, "User"), (nrow, 1), (1, 1), CEN, 5)
        ds.Add(xLabel(dp, "Dial"), (nrow, 2), (1, 1), CEN, 5)
        ds.Add(xLabel(dp, "Raw"), (nrow, 3), (1, 1), CEN, 5)

        ####
        nrow += 1
        self.info = wx.StaticText(dp, label="", size=(55, 20), style=CEN)
        self.info.SetForegroundColour("Red")

        ds.Add(xLabel(dp, "High Limit"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, "HLM"), (nrow, 1), (1, 1), CEN, 5)
        ds.Add(self.MotorCtrl(dp, "DHLM"), (nrow, 2), (1, 1), CEN, 5)
        ds.Add(self.info, (nrow, 3), (1, 1), CEN, 5)

        ####
        nrow += 1
        ostyle = RCEN | wx.EXPAND
        ds.Add(xLabel(dp, "Readback"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorText(dp, "RBV"), (nrow, 1), (1, 1), ostyle, 5)
        ds.Add(self.MotorText(dp, "DRBV"), (nrow, 2), (1, 1), ostyle, 5)
        ds.Add(self.MotorText(dp, "RRBV"), (nrow, 3), (1, 1), ostyle, 5)

        ####
        nrow += 1
        self.drives = [self.MotorCtrl(dp, "VAL"), self.MotorCtrl(dp, "DVAL"), self.MotorCtrl(dp, "RVAL")]

        ds.Add(xLabel(dp, "Move"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.drives[0], (nrow, 1), (1, 1), CEN, 5)
        ds.Add(self.drives[1], (nrow, 2), (1, 1), CEN, 5)
        ds.Add(self.drives[2], (nrow, 3), (1, 1), CEN, 5)

        nrow += 1
        ds.Add(xLabel(dp, "Low Limit"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, "LLM"), (nrow, 1), (1, 1), CEN, 5)
        ds.Add(self.MotorCtrl(dp, "DLLM"), (nrow, 2), (1, 1), CEN, 5)

        ####

        twk_sizer = wx.BoxSizer(wx.HORIZONTAL)
        twk_panel = wx.Panel(dp)
        twk_val = PVFloatCtrl(twk_panel, size=(110, -1), precision=prec)
        twk_val.SetPV(self.motor.PV("TWV"))

        twk_left = wx.Button(twk_panel, label="<", size=(30, 30))
        twk_right = wx.Button(twk_panel, label=">", size=(30, 30))
        twk_left.Bind(wx.EVT_BUTTON, self.OnLeftButton)
        twk_right.Bind(wx.EVT_BUTTON, self.OnRightButton)
        twk_sizer.AddMany([(twk_left, 0, CEN), (twk_val, 0, CEN), (twk_right, 0, CEN)])

        set_sizer(twk_panel, twk_sizer)

        nrow += 1
        ds.Add(xLabel(dp, "Tweak"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(twk_panel, (nrow, 1), (1, 2), wx.ALIGN_LEFT, 5)

        epv = self.motor.PV("disabled")

        able_btns = PVEnumButtons(dp, pv=epv, orientation=wx.VERTICAL, size=(90, -1))

        ds.Add(able_btns, (nrow - 1, 3), (2, 1), CEN, 5)

        stop_btns = PVEnumButtons(dp, pv=self.motor.PV("SPMG"), orientation=wx.VERTICAL, size=(110, -1))

        ds.Add(stop_btns, (2, 4), (4, 1), wx.ALIGN_RIGHT, 5)

        for attr in ("LLM", "HLM", "DLLM", "DHLM"):
            pv = self.motor.PV(attr)
            pv.add_callback(self.OnLimitChange, wid=self.GetId(), attr=attr)

        #
        set_sizer(dp, ds)  # ,fit=True)
        sizer.Add(dp, 0)

        ####
        sizer.Add((3, 3), 0)
        sizer.Add(wx.StaticLine(self, size=(100, 2)), 0, wx.EXPAND)
        sizer.Add((3, 3), 0)
        sizer.Add(xTitle(self, "Calibration"), 0, LCEN, 25)

        ds = wx.GridBagSizer(6, 5)
        dp = wx.Panel(self)

        ds.Add(xLabel(dp, "Mode: "), (0, 0), (1, 1), LCEN, 5)

        ds.Add(
            PVEnumButtons(dp, pv=self.motor.PV("SET"), orientation=wx.HORIZONTAL, size=(-1, -1)),
            (0, 1),
            (1, 2),
            wx.ALIGN_LEFT,
        )

        ds.Add(xLabel(dp, "Direction: "), (1, 0), (1, 1), LCEN, 5)
        ds.Add(
            PVEnumButtons(dp, pv=self.motor.PV("DIR"), orientation=wx.HORIZONTAL, size=(-1, -1)),
            (1, 1),
            (1, 2),
            wx.ALIGN_LEFT,
        )

        ds.Add(xLabel(dp, "Freeze Offset: "), (0, 4), (1, 1), LCEN, 5)
        ds.Add(PVEnumChoice(dp, pv=self.motor.PV("FOFF"), size=(110, -1)), (0, 5), (1, 1), CEN)

        ds.Add(xLabel(dp, "Offset Value: "), (1, 4), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, "OFF"), (1, 5), (1, 1), CEN)

        set_sizer(dp, ds)
        sizer.Add(dp, 0)
        #####

        sizer.Add((3, 3), 0)
        sizer.Add(wx.StaticLine(self, size=(100, 2)), 0, wx.EXPAND)
        sizer.Add((3, 3), 0)
        #
        ds = wx.GridBagSizer(6, 3)
        dp = wx.Panel(self)
        nrow = 0

        ds.Add(xTitle(dp, "Dynamics"), (nrow, 0), (1, 1), LCEN, 55)
        ds.Add(xLabel(dp, "Normal"), (nrow, 1), (1, 1), CEN)
        ds.Add(xLabel(dp, "Backlash"), (nrow, 2), (1, 1), CEN)

        ####
        nrow += 1
        ds.Add(xLabel(dp, "Max Speed"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, "SMAX"), (nrow, 1), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Speed"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, "VELO"), (nrow, 1), (1, 1), CEN)
        ds.Add(self.MotorCtrl(dp, "BVEL"), (nrow, 2), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Base Speed"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, "VBAS"), (nrow, 1), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Accel (s)"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, "ACCL"), (nrow, 1), (1, 1), CEN)
        ds.Add(self.MotorCtrl(dp, "BACC"), (nrow, 2), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Backslash Distance"), (nrow, 0), (1, 2), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, "BDST"), (nrow, 2), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Move Fraction"), (nrow, 0), (1, 2), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, "FRAC"), (nrow, 2), (1, 1), CEN)

        set_sizer(dp, ds)  # ,fit=True)

        sizer.Add(dp, 0)

        sizer.Add((3, 3), 0)
        sizer.Add(wx.StaticLine(self, size=(100, 2)), 0, wx.EXPAND)
        sizer.Add((3, 3), 0)
        sizer.Add(xTitle(self, "Resolution, Readback, and Retries"), 0, LCEN, 5)

        ds = wx.GridBagSizer(4, 4)
        dp = wx.Panel(self)
        nrow = 0

        ds.Add(xLabel(dp, "Motor Res"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, "MRES"), (nrow, 1), (1, 1), CEN)
        ds.Add(xLabel(dp, "Encoder Res"), (nrow, 2), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, "ERES"), (nrow, 3), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Steps / Rev"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, "SREV"), (nrow, 1), (1, 1), CEN)
        ds.Add(xLabel(dp, "Units / Rev"), (nrow, 2), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, "UREV"), (nrow, 3), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Readback Res"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, "RRES"), (nrow, 1), (1, 1), CEN)
        ds.Add(xLabel(dp, "Readback Delay (s)"), (nrow, 2), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, "DLY"), (nrow, 3), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Retry Deadband"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, "RDBD"), (nrow, 1), (1, 1), CEN)
        ds.Add(xLabel(dp, "Max Retries"), (nrow, 2), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, "RTRY"), (nrow, 3), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Use Encoder"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(PVEnumChoice(dp, pv=self.motor.PV("UEIP"), size=(110, -1)), (nrow, 1), (1, 1), CEN)
        ds.Add(xLabel(dp, "Use Readback"), (nrow, 2), (1, 1), LCEN, 5)
        ds.Add(PVEnumChoice(dp, pv=self.motor.PV("URIP"), size=(110, -1)), (nrow, 3), (1, 1), CEN)

        nrow += 1
        ds.Add(xLabel(dp, "Use NTM"), (nrow, 0), (1, 1), LCEN, 5)
        ds.Add(PVEnumChoice(dp, pv=self.motor.PV("NTM"), size=(110, -1)), (nrow, 1), (1, 1), CEN)
        ds.Add(xLabel(dp, "NTM Factor"), (nrow, 2), (1, 1), LCEN, 5)
        ds.Add(self.MotorCtrl(dp, "NTMF"), (nrow, 3), (1, 1), CEN)

        set_sizer(dp, ds)
        sizer.Add(dp, 0)
        sizer.Add(wx.StaticLine(self, size=(100, 2)), 0, wx.EXPAND)

        for attr in self.__motor_fields:
            self.motor.PV(attr).add_callback(self.OnMotorEvent, wid=self.GetId(), field=attr)

        self.info.SetLabel("")
        for f in ("HLS", "LLS", "LVIO", "SET"):
            if self.motor.get(f):
                wx.CallAfter(self.OnMotorEvent, pvname=self.motor.PV(f).pvname, field=f)

        set_sizer(self, sizer, fit=True)
        self.SetupScrolling()