void mtsIntuitiveResearchKitArmQtWidget::setupUi(void) { QVBoxLayout * mainLayout = new QVBoxLayout; QHBoxLayout * topLayout = new QHBoxLayout; mainLayout->addLayout(topLayout); // 3D position QFRPositionWidget = new vctQtWidgetFrameDoubleRead(vctQtWidgetRotationDoubleRead::OPENGL_WIDGET); topLayout->addWidget(QFRPositionWidget, 0, 0); // timing QVBoxLayout * timingLayout = new QVBoxLayout(); QMIntervalStatistics = new mtsQtWidgetIntervalStatistics(); timingLayout->addWidget(QMIntervalStatistics); timingLayout->addStretch(); topLayout->addLayout(timingLayout); // state QHBoxLayout * stateLayout = new QHBoxLayout; mainLayout->addLayout(stateLayout); QCBEnableDirectControl = new QCheckBox("Direct control"); stateLayout->addWidget(QCBEnableDirectControl); QPBHome = new QPushButton("Home"); stateLayout->addWidget(QPBHome); QLabel * stateLabel = new QLabel("State:"); stateLayout->addWidget(stateLabel); QLEState = new QLineEdit(""); QLEState->setReadOnly(true); stateLayout->addWidget(QLEState); // messages QTEMessages = new QTextEdit(); QTEMessages->setReadOnly(true); QTEMessages->ensureCursorVisible(); mainLayout->addWidget(QTEMessages); setLayout(mainLayout); setWindowTitle("Manipulator"); resize(sizeHint()); connect(this, SIGNAL(SignalAppendMessage(QString)), QTEMessages, SLOT(append(QString))); connect(this, SIGNAL(SignalSetColor(QColor)), QTEMessages, SLOT(setTextColor(QColor))); connect(QTEMessages, SIGNAL(textChanged()), this, SLOT(SlotTextChanged())); connect(QCBEnableDirectControl, SIGNAL(toggled(bool)), this, SLOT(SlotEnableDirectControl(bool))); connect(QPBHome, SIGNAL(clicked()), this, SLOT(SlotHome())); // set initial values QCBEnableDirectControl->setChecked(DirectControl); SlotEnableDirectControl(DirectControl); }
////------------ Private Methods ---------------- void mtsPIDQtWidget::setupUi(void) { QFont font; font.setBold(true); font.setPointSize(12); const double maximum = 30000; QGridLayout * gridLayout = new QGridLayout(); gridLayout->setSpacing(1); int row = 0; QLabel * currentPosLabel = new QLabel("Current position (deg)"); currentPosLabel->setAlignment(Qt::AlignRight); gridLayout->addWidget(currentPosLabel, row, 0); QVRCurrentPositionWidget = new vctQtWidgetDynamicVectorDoubleRead(); QVRCurrentPositionWidget->SetPrecision(3); gridLayout->addWidget(QVRCurrentPositionWidget, row, 1); row++; QLabel * desiredPosLabel = new QLabel("Desired position (deg)"); desiredPosLabel->setAlignment(Qt::AlignRight); gridLayout->addWidget(desiredPosLabel, row, 0); QVWDesiredPositionWidget = new vctQtWidgetDynamicVectorDoubleWrite(vctQtWidgetDynamicVectorDoubleWrite::SPINBOX_WIDGET); QVWDesiredPositionWidget->SetStep(0.1); QVWDesiredPositionWidget->SetRange(-360.0, 360.0); gridLayout->addWidget(QVWDesiredPositionWidget, row, 1); row++; QLabel * currentEffortLabel = new QLabel("Current effort (Nm)"); currentEffortLabel->setAlignment(Qt::AlignRight); gridLayout->addWidget(currentEffortLabel, row, 0); QVRCurrentEffortWidget = new vctQtWidgetDynamicVectorDoubleRead(); QVRCurrentEffortWidget->SetPrecision(3); gridLayout->addWidget(QVRCurrentEffortWidget, row, 1); row++; QLabel * desiredEffortLabel = new QLabel("Desired effort (Nm)"); desiredEffortLabel->setAlignment(Qt::AlignRight); gridLayout->addWidget(desiredEffortLabel, row, 0); QVWDesiredEffortWidget = new vctQtWidgetDynamicVectorDoubleRead(); QVWDesiredEffortWidget->SetPrecision(3); gridLayout->addWidget(QVWDesiredEffortWidget, row, 1); row++; QLabel * pLabel = new QLabel("PGain"); pLabel->setAlignment(Qt::AlignRight); gridLayout->addWidget(pLabel); QVWPGainWidget = new vctQtWidgetDynamicVectorDoubleWrite(vctQtWidgetDynamicVectorDoubleWrite::SPINBOX_WIDGET); QVWPGainWidget->SetStep(0.01); QVWPGainWidget->SetPrecision(3); QVWPGainWidget->SetRange(-maximum, maximum); gridLayout->addWidget(QVWPGainWidget, row, 1); row++; QLabel * dLabel = new QLabel("DGain"); dLabel->setAlignment(Qt::AlignRight); gridLayout->addWidget(dLabel); QVWDGainWidget = new vctQtWidgetDynamicVectorDoubleWrite(vctQtWidgetDynamicVectorDoubleWrite::SPINBOX_WIDGET); QVWDGainWidget->SetStep(0.01); QVWDGainWidget->SetPrecision(3); QVWDGainWidget->SetRange(-maximum, maximum); gridLayout->addWidget(QVWDGainWidget, row, 1); row++; QLabel * iLabel = new QLabel("IGain"); iLabel->setAlignment(Qt::AlignRight); gridLayout->addWidget(iLabel); QVWIGainWidget = new vctQtWidgetDynamicVectorDoubleWrite(vctQtWidgetDynamicVectorDoubleWrite::SPINBOX_WIDGET); QVWIGainWidget->SetStep(0.001); QVWIGainWidget->SetPrecision(5); QVWIGainWidget->SetRange(-maximum, maximum); gridLayout->addWidget(QVWIGainWidget, row, 1); row++; // plot QHBoxLayout * plotLayout = new QHBoxLayout; // plot control QVBoxLayout * plotButtonsLayout = new QVBoxLayout; // - pick axis to display QLabel * plotIndexLabel = new QLabel("Index"); plotButtonsLayout->addWidget(plotIndexLabel); QSBPlotIndex = new QSpinBox(); QSBPlotIndex->setRange(0, NumberOfAxis); plotButtonsLayout->addWidget(QSBPlotIndex); // legend QLabel * label; QPalette palette; palette.setColor(QPalette::Window, Qt::black); label = new QLabel("Current position"); label->setAutoFillBackground(true); palette.setColor(QPalette::WindowText, Qt::red); label->setPalette(palette); plotButtonsLayout->addWidget(label); label = new QLabel("Desired position"); label->setAutoFillBackground(true); palette.setColor(QPalette::WindowText, Qt::green); label->setPalette(palette); plotButtonsLayout->addWidget(label); label = new QLabel("Current velocity"); label->setAutoFillBackground(true); palette.setColor(QPalette::WindowText, Qt::gray); label->setPalette(palette); plotButtonsLayout->addWidget(label); label = new QLabel("Current effort"); label->setAutoFillBackground(true); palette.setColor(QPalette::WindowText, Qt::cyan); label->setPalette(palette); plotButtonsLayout->addWidget(label); label = new QLabel("Desired effort"); label->setAutoFillBackground(true); palette.setColor(QPalette::WindowText, Qt::white); label->setPalette(palette); plotButtonsLayout->addWidget(label); plotButtonsLayout->addStretch(); plotLayout->addLayout(plotButtonsLayout); // plotting area QVPlot = new vctPlot2DOpenGLQtWidget(); vctPlot2DBase::Scale * scalePosition = QVPlot->AddScale("positions"); CurrentPositionSignal = scalePosition->AddSignal("current"); CurrentPositionSignal->SetColor(vctDouble3(1.0, 0.0, 0.0)); DesiredPositionSignal = scalePosition->AddSignal("desired"); DesiredPositionSignal->SetColor(vctDouble3(0.0, 1.0, 0.0)); vctPlot2DBase::Scale * scaleVelocity = QVPlot->AddScale("velocities"); CurrentVelocitySignal = scaleVelocity->AddSignal("current"); CurrentVelocitySignal->SetColor(vctDouble3(0.5, 0.5, 0.5)); vctPlot2DBase::Scale * scaleEffort = QVPlot->AddScale("efforts"); CurrentEffortSignal = scaleEffort->AddSignal("-current"); CurrentEffortSignal->SetColor(vctDouble3(0.0, 1.0, 1.0)); DesiredEffortSignal = scaleEffort->AddSignal("-desired"); DesiredEffortSignal->SetColor(vctDouble3(1.0, 1.0, 1.0)); QVPlot->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); plotLayout->addWidget(QVPlot); // control QCBEnableDirectControl = new QCheckBox("Direct control"); QCBEnablePID = new QCheckBox("Enable PID"); QCBEnableTorqueMode = new QCheckBox("Enable torque mode"); QPBMaintainPosition = new QPushButton("Maintain position"); QPBZeroPosition = new QPushButton("Zero position"); QPBResetPIDGain = new QPushButton("Reset PID gains"); QHBoxLayout * controlLayout = new QHBoxLayout; controlLayout->addWidget(QCBEnableDirectControl); controlLayout->addWidget(QCBEnablePID); controlLayout->addWidget(QCBEnableTorqueMode); controlLayout->addWidget(QPBMaintainPosition); controlLayout->addWidget(QPBZeroPosition); controlLayout->addWidget(QPBResetPIDGain); controlLayout->addStretch(); QGroupBox * controlGroupBox = new QGroupBox("Control"); controlGroupBox->setLayout(controlLayout); connect(QCBEnableDirectControl, SIGNAL(toggled(bool)), this, SLOT(SlotEnableDirectControl(bool))); connect(QCBEnablePID, SIGNAL(clicked(bool)), this, SLOT(SlotEnablePID(bool))); connect(this, SIGNAL(SignalEnablePID(bool)), this, SLOT(SlotEnableEventHandler(bool))); connect(QCBEnableTorqueMode, SIGNAL(toggled(bool)), this, SLOT(SlotEnableTorqueMode(bool))); connect(QPBMaintainPosition, SIGNAL(clicked()), this, SLOT(SlotMaintainPosition())); connect(QPBZeroPosition, SIGNAL(clicked()), this, SLOT(SlotZeroPosition())); connect(QPBResetPIDGain, SIGNAL(clicked()), this, SLOT(SlotResetPIDGain())); connect(QSBPlotIndex, SIGNAL(valueChanged(int)), this, SLOT(SlotPlotIndex(int))); // main layout QVBoxLayout * mainLayout = new QVBoxLayout; mainLayout->addLayout(gridLayout); mainLayout->addLayout(plotLayout); mainLayout->addWidget(controlGroupBox); setLayout(mainLayout); setWindowTitle(this->GetName().c_str()); setMinimumWidth(750); resize(sizeHint()); // connect signals & slots connect(QVWDesiredPositionWidget, SIGNAL(valueChanged()), this, SLOT(SlotPositionChanged())); connect(QVWPGainWidget, SIGNAL(valueChanged()), this, SLOT(SlotPGainChanged())); connect(QVWDGainWidget, SIGNAL(valueChanged()), this, SLOT(SlotDGainChanged())); connect(QVWIGainWidget, SIGNAL(valueChanged()), this, SLOT(SlotIGainChanged())); // set initial values QCBEnableDirectControl->setChecked(DirectControl); SlotEnableDirectControl(DirectControl); }
void mtsRobotIO1394QtWidget::setupUi(void) { QFont font; font.setBold(true); // Power commands QVBoxLayout * powerLayout = new QVBoxLayout; QFrame * powerFrame = new QFrame; QLabel * powerTitle = new QLabel("Power"); powerTitle->setFont(font); powerTitle->setAlignment(Qt::AlignCenter); powerLayout->addWidget(powerTitle); QCBEnableAll = new QCheckBox("Enable all"); powerLayout->addWidget(QCBEnableAll); QCBEnableAmps = new QCheckBox("Enable boards"); powerLayout->addWidget(QCBEnableAmps); powerLayout->addSpacing(5); QLAmpStatus = new QLabel("Actuators ON"); QLAmpStatus->setAlignment(Qt::AlignCenter); powerLayout->addWidget(QLAmpStatus); QLPowerStatus = new QLabel("Boards ON"); QLPowerStatus->setAlignment(Qt::AlignCenter); powerLayout->addWidget(QLPowerStatus); powerLayout->addStretch(); powerFrame->setLayout(powerLayout); powerFrame->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken); // watchdog commands QVBoxLayout * watchdogLayout = new QVBoxLayout; QFrame * watchdogFrame = new QFrame; QLabel * watchdogTitle = new QLabel("Watchdog"); watchdogTitle->setFont(font); watchdogTitle->setAlignment(Qt::AlignCenter); watchdogLayout->addWidget(watchdogTitle); QHBoxLayout * watchdogSetLayout = new QHBoxLayout; { QLabel * wdogLabel = new QLabel("Wdog period (ms)"); QSBWatchdogPeriod = new QDoubleSpinBox; QSBWatchdogPeriod->setMaximum(340.0); // max wdog_period = 340 ms QSBWatchdogPeriod->setMinimum(0.0); QSBWatchdogPeriod->setSingleStep(0.05); QSBWatchdogPeriod->setValue(cmnInternalTo_ms(WatchdogPeriodInSeconds)); watchdogSetLayout->addWidget(wdogLabel); watchdogSetLayout->addWidget(QSBWatchdogPeriod); } watchdogLayout->addLayout(watchdogSetLayout); watchdogLayout->addSpacing(5); QLSafetyRelay = new QLabel("Safety relay ON"); QLSafetyRelay->setAlignment(Qt::AlignCenter); watchdogLayout->addWidget(QLSafetyRelay); QLWatchdog = new QLabel("Watchdog Timeout FALSE"); QLWatchdog->setAlignment(Qt::AlignCenter); QLWatchdog->setStyleSheet("QLabel { background-color: green }"); watchdogLayout->addWidget(QLWatchdog); QLWatchdogLastTimeout = new QLabel("Last timeout: n/a"); QLWatchdogLastTimeout->setAlignment(Qt::AlignCenter); watchdogLayout->addWidget(QLWatchdogLastTimeout); watchdogLayout->addStretch(); watchdogFrame->setLayout(watchdogLayout); watchdogFrame->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken); // Encoder commands QVBoxLayout * encoderLayout = new QVBoxLayout; QFrame * encoderFrame = new QFrame; QLabel * encoderTitle = new QLabel("Encoders"); encoderTitle->setFont(font); encoderTitle->setAlignment(Qt::AlignCenter); encoderLayout->addWidget(encoderTitle); QPBResetEncAll = new QPushButton("Reset all"); encoderLayout->addWidget(QPBResetEncAll); QPBBiasEncAll = new QPushButton("Bias from potentiometers"); encoderLayout->addWidget(QPBBiasEncAll); encoderLayout->addStretch(); encoderFrame->setLayout(encoderLayout); encoderFrame->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken); // Current comands QVBoxLayout * currentLayout = new QVBoxLayout; QFrame * currentFrame = new QFrame; QLabel * currentTitle = new QLabel("Current"); currentTitle->setFont(font); currentTitle->setAlignment(Qt::AlignCenter); currentLayout->addWidget(currentTitle); QCBEnableDirectControl = new QCheckBox("Direct control"); currentLayout->addWidget(QCBEnableDirectControl); currentLayout->addStretch(); QLabel * serialTitle = new QLabel("Serial Number"); serialTitle->setFont(font); serialTitle->setAlignment(Qt::AlignCenter); currentLayout->addWidget(serialTitle); QLSerialNumber = new QLabel("-----"); QLSerialNumber->setAlignment(Qt::AlignCenter); currentLayout->addWidget(QLSerialNumber); currentLayout->addStretch(); currentFrame->setLayout(currentLayout); currentFrame->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken); // Timing QVBoxLayout * timingLayout = new QVBoxLayout; QFrame * timingFrame = new QFrame; QLabel * timingTitle = new QLabel("Timing"); timingTitle->setFont(font); timingTitle->setAlignment(Qt::AlignCenter); timingLayout->addWidget(timingTitle); QMIntervalStatistics = new mtsQtWidgetIntervalStatistics(); timingLayout->addWidget(QMIntervalStatistics); timingLayout->addStretch(); timingFrame->setLayout(timingLayout); timingFrame->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken); // Commands layout QHBoxLayout * commandLayout = new QHBoxLayout; commandLayout->addWidget(powerFrame); commandLayout->addWidget(watchdogFrame); commandLayout->addWidget(encoderFrame); commandLayout->addWidget(currentFrame); commandLayout->addWidget(timingFrame); // Feedbacks Label QGridLayout * gridLayout = new QGridLayout; gridLayout->setSpacing(1); int row = 0; if (NumberOfActuators != 0) { vctBoolVec defaultEnable(NumberOfActuators, false); vctDoubleVec defaultCurrent(NumberOfActuators, 0.0); gridLayout->addWidget(new QLabel("Actuator power"), row, 0); QVWActuatorCurrentEnableEachWidget = new vctQtWidgetDynamicVectorBoolWrite(); QVWActuatorCurrentEnableEachWidget->SetValue(defaultEnable); gridLayout->addWidget(QVWActuatorCurrentEnableEachWidget, row, 1); row++; gridLayout->addWidget(new QLabel("Desired current (mA)"), row, 0); QVWActuatorCurrentSpinBoxWidget = new vctQtWidgetDynamicVectorDoubleWrite(vctQtWidgetDynamicVectorDoubleWrite::SPINBOX_WIDGET); QVWActuatorCurrentSpinBoxWidget->SetValue(defaultCurrent); gridLayout->addWidget(QVWActuatorCurrentSpinBoxWidget, row, 1); row++; QPBResetCurrentAll = new QPushButton("Reset current"); gridLayout->addWidget(QPBResetCurrentAll, row, 0); QVWActuatorCurrentSliderWidget = new vctQtWidgetDynamicVectorDoubleWrite(vctQtWidgetDynamicVectorDoubleWrite::SLIDER_WIDGET); QVWActuatorCurrentSliderWidget->SetValue(defaultCurrent); gridLayout->addWidget(QVWActuatorCurrentSliderWidget, row, 1); row++; gridLayout->addWidget(new QLabel("Current feedback (mA)"), row, 0); QVRActuatorCurrentFeedbackWidget = new vctQtWidgetDynamicVectorDoubleRead(); gridLayout->addWidget(QVRActuatorCurrentFeedbackWidget, row, 1); row++; gridLayout->addWidget(new QLabel("Joint positions (deg)"), row, 0); QVRJointPositionWidget = new vctQtWidgetDynamicVectorDoubleRead(); gridLayout->addWidget(QVRJointPositionWidget, row, 1); row++; gridLayout->addWidget(new QLabel("Actuator positions (deg)"), row, 0); QVRActuatorPositionWidget = new vctQtWidgetDynamicVectorDoubleRead(); gridLayout->addWidget(QVRActuatorPositionWidget, row, 1); row++; gridLayout->addWidget(new QLabel("Velocities (deg/s)"), row, 0); QVRActuatorVelocityWidget = new vctQtWidgetDynamicVectorDoubleRead(); gridLayout->addWidget(QVRActuatorVelocityWidget, row, 1); row++; gridLayout->addWidget(new QLabel("Analog inputs (V)"), row, 0); QVRPotVoltsWidget = new vctQtWidgetDynamicVectorDoubleRead(); gridLayout->addWidget(QVRPotVoltsWidget, row, 1); row++; gridLayout->addWidget(new QLabel("Potentiometers (deg)"), row, 0); QVRPotPositionWidget = new vctQtWidgetDynamicVectorDoubleRead(); gridLayout->addWidget(QVRPotPositionWidget, row, 1); row++; gridLayout->addWidget(new QLabel("Amp temperature (C)"), row, 0); QVRActuatorAmpTemperature = new vctQtWidgetDynamicVectorDoubleRead(); gridLayout->addWidget(QVRActuatorAmpTemperature, row, 1); row++; } if (NumberOfBrakes != 0) { vctBoolVec defaultEnable(NumberOfBrakes, false); gridLayout->addWidget(new QLabel("Brakes"), row, 0); QHBoxLayout * brakeButtonsLayout = new QHBoxLayout(); QPBBrakeRelease = new QPushButton("Release"); brakeButtonsLayout->addWidget(QPBBrakeRelease); QPBBrakeEngage = new QPushButton("Engage"); brakeButtonsLayout->addWidget(QPBBrakeEngage); gridLayout->addLayout(brakeButtonsLayout, row, 1); row++; gridLayout->addWidget(new QLabel("Brake power"), row, 0); QVWBrakeCurrentEnableEachWidget = new vctQtWidgetDynamicVectorBoolWrite(); QVWBrakeCurrentEnableEachWidget->SetValue(defaultEnable); gridLayout->addWidget(QVWBrakeCurrentEnableEachWidget, row, 1); row++; gridLayout->addWidget(new QLabel("Current desired (mA)"), row, 0); QVRBrakeCurrentCommandWidget = new vctQtWidgetDynamicVectorDoubleRead(); gridLayout->addWidget(QVRBrakeCurrentCommandWidget, row, 1); row++; gridLayout->addWidget(new QLabel("Current feedback (mA)"), row, 0); QVRBrakeCurrentFeedbackWidget = new vctQtWidgetDynamicVectorDoubleRead(); gridLayout->addWidget(QVRBrakeCurrentFeedbackWidget, row, 1); row++; gridLayout->addWidget(new QLabel("Amp temperature (C)"), row, 0); QVRBrakeAmpTemperature = new vctQtWidgetDynamicVectorDoubleRead(); gridLayout->addWidget(QVRBrakeAmpTemperature, row, 1); row++; } // main layout QVBoxLayout * mainLayout = new QVBoxLayout; mainLayout->addLayout(commandLayout); mainLayout->addLayout(gridLayout); mainLayout->addStretch(); setLayout(mainLayout); setWindowTitle(QString(this->GetName().c_str())); resize(sizeHint()); // connect signals & slots connect(QCBEnableAmps, SIGNAL(toggled(bool)), this, SLOT(SlotEnableAmps(bool))); connect(QCBEnableAll, SIGNAL(toggled(bool)), this, SLOT(SlotEnableAll(bool))); connect(QCBEnableDirectControl, SIGNAL(toggled(bool)), this, SLOT(SlotEnableDirectControl(bool))); connect(QPBResetCurrentAll, SIGNAL(clicked()), this, SLOT(SlotResetCurrentAll())); connect(QPBResetEncAll, SIGNAL(clicked()), this, SLOT(SlotResetEncodersAll())); connect(QPBBiasEncAll, SIGNAL(clicked()), this, SLOT(SlotBiasEncodersAll())); connect(QSBWatchdogPeriod, SIGNAL(valueChanged(double)), this, SLOT(SlotWatchdogPeriod(double))); connect(QVWActuatorCurrentEnableEachWidget, SIGNAL(valueChanged()), this, SLOT(SlotActuatorAmpEnable())); connect(QVWActuatorCurrentSpinBoxWidget, SIGNAL(valueChanged()), this, SLOT(SlotActuatorCurrentValueChanged())); connect(QVWActuatorCurrentSliderWidget, SIGNAL(valueChanged()), this, SLOT(SlotSliderActuatorCurrentValueChanged())); if (NumberOfBrakes != 0) { connect(QPBBrakeRelease, SIGNAL(clicked()), this, SLOT(SlotBrakeRelease())); connect(QPBBrakeEngage, SIGNAL(clicked()), this, SLOT(SlotBrakeEngage())); connect(QVWBrakeCurrentEnableEachWidget, SIGNAL(valueChanged()), this, SLOT(SlotBrakeAmpEnable())); } // connect cisstMultiTask events connect(this, SIGNAL(SignalPowerStatus(bool)), this, SLOT(SlotPowerStatus(bool))); connect(this, SIGNAL(SignalWatchdogStatus(bool)), this, SLOT(SlotWatchdogStatus(bool))); // set initial value QCBEnableAmps->setChecked(false); QCBEnableAll->setChecked(false); QCBEnableDirectControl->setChecked(DirectControl); SlotEnableDirectControl(DirectControl); }