diff --git a/files/images/devices/Shutter.png b/files/images/devices/Shutter.png
new file mode 100644
index 0000000000000000000000000000000000000000..0362734d5762771d2b98bcfe55fe6c08138cf412
Binary files /dev/null and b/files/images/devices/Shutter.png differ
diff --git a/files/images/devices/cameraGimalPitch1.png b/files/images/devices/cameraGimalPitch1.png
new file mode 100644
index 0000000000000000000000000000000000000000..158429893b5aa82506f4ca902b7d8acdec03253f
Binary files /dev/null and b/files/images/devices/cameraGimalPitch1.png differ
diff --git a/files/images/devices/cameraGimalRoll1.png b/files/images/devices/cameraGimalRoll1.png
new file mode 100644
index 0000000000000000000000000000000000000000..bff678c9e7adc2264732f2df1d2bdfd29e7e3368
Binary files /dev/null and b/files/images/devices/cameraGimalRoll1.png differ
diff --git a/files/images/devices/cameraGimalYaw.png b/files/images/devices/cameraGimalYaw.png
new file mode 100644
index 0000000000000000000000000000000000000000..0375add2c31bf2c7a5926ce864037bd43a550068
Binary files /dev/null and b/files/images/devices/cameraGimalYaw.png differ
diff --git a/qgroundcontrol.qrc b/qgroundcontrol.qrc
index 49cd25075def49b4f03abcde2509f1604c3e0474..2b356c0f28304795e892e9faf2c34d9684e32960 100644
--- a/qgroundcontrol.qrc
+++ b/qgroundcontrol.qrc
@@ -115,6 +115,10 @@
files/images/devices/BR-0004-03-2.jpg
files/images/devices/BR-0016-01-3T.jpg
files/images/devices/MinimOSD.jpg
+ files/images/devices/cameraGimalPitch1.png
+ files/images/devices/cameraGimalRoll1.png
+ files/images/devices/cameraGimalYaw.png
+ files/images/devices/Shutter.png
files/styles/Vera.ttf
diff --git a/src/ui/QGCParamWidget.cc b/src/ui/QGCParamWidget.cc
index 068dbebb9d1cdd7c0bf0971e47f23c8ca3722667..b0be69dbe901dd12ebf75da65503c2bfd8697f6b 100644
--- a/src/ui/QGCParamWidget.cc
+++ b/src/ui/QGCParamWidget.cc
@@ -1017,6 +1017,11 @@ void QGCParamWidget::setParameter(int component, QString parameterName, QVariant
statusLabel->setText(tr("REJ. %1 > max").arg(value.toDouble()));
return;
}
+ if (parameters.value(component)->value(parameterName) == value)
+ {
+ qDebug() << "Value not changed, not sending:" << parameterName << value;
+ return;
+ }
switch (parameters.value(component)->value(parameterName).type())
{
diff --git a/src/ui/configuration/CameraGimbalConfig.cc b/src/ui/configuration/CameraGimbalConfig.cc
index 377cbdd8f5b5a3eab4cf5719b2fd7677c6e12cc8..64b20d250f65d11121bdb4349181f2b0dec534f8 100644
--- a/src/ui/configuration/CameraGimbalConfig.cc
+++ b/src/ui/configuration/CameraGimbalConfig.cc
@@ -1,11 +1,218 @@
#include "CameraGimbalConfig.h"
+#include
+#include
+CameraGimbalConfig::CameraGimbalConfig(QWidget *parent) : AP2ConfigWidget(parent)
+{
+ ui.setupUi(this);
+ ui.tiltChannelComboBox->addItem("Disable");
+ ui.tiltChannelComboBox->addItem("RC5");
+ ui.tiltChannelComboBox->addItem("RC6");
+ ui.tiltChannelComboBox->addItem("RC7");
+ ui.tiltChannelComboBox->addItem("RC8");
+ ui.tiltChannelComboBox->addItem("RC10");
+ ui.tiltChannelComboBox->addItem("RC11");
+
+ ui.tiltInputChannelComboBox->addItem("Disable");
+ ui.tiltInputChannelComboBox->addItem("RC5");
+ ui.tiltInputChannelComboBox->addItem("RC6");
+ ui.tiltInputChannelComboBox->addItem("RC7");
+ ui.tiltInputChannelComboBox->addItem("RC8");
+
+ ui.rollChannelComboBox->addItem("Disable");
+ ui.rollChannelComboBox->addItem("RC5");
+ ui.rollChannelComboBox->addItem("RC6");
+ ui.rollChannelComboBox->addItem("RC7");
+ ui.rollChannelComboBox->addItem("RC8");
+ ui.rollChannelComboBox->addItem("RC10");
+ ui.rollChannelComboBox->addItem("RC11");
+
+ ui.rollInputChannelComboBox->addItem("Disable");
+ ui.rollInputChannelComboBox->addItem("RC5");
+ ui.rollInputChannelComboBox->addItem("RC6");
+ ui.rollInputChannelComboBox->addItem("RC7");
+ ui.rollInputChannelComboBox->addItem("RC8");
+
+
+ ui.panChannelComboBox->addItem("Disable");
+ ui.panChannelComboBox->addItem("RC5");
+ ui.panChannelComboBox->addItem("RC6");
+ ui.panChannelComboBox->addItem("RC7");
+ ui.panChannelComboBox->addItem("RC8");
+ ui.panChannelComboBox->addItem("RC10");
+ ui.panChannelComboBox->addItem("RC11");
+
+ ui.panInputChannelComboBox->addItem("Disable");
+ ui.panInputChannelComboBox->addItem("RC5");
+ ui.panInputChannelComboBox->addItem("RC6");
+ ui.panInputChannelComboBox->addItem("RC7");
+ ui.panInputChannelComboBox->addItem("RC8");
+
+
+ ui.shutterChannelComboBox->addItem("Disable");
+ ui.shutterChannelComboBox->addItem("Relay");
+ ui.shutterChannelComboBox->addItem("Transistor");
+ ui.shutterChannelComboBox->addItem("RC5");
+ ui.shutterChannelComboBox->addItem("RC6");
+ ui.shutterChannelComboBox->addItem("RC7");
+ ui.shutterChannelComboBox->addItem("RC8");
+ ui.shutterChannelComboBox->addItem("RC10");
+ ui.shutterChannelComboBox->addItem("RC11");
+
+ connect(ui.tiltServoMinSpinBox,SIGNAL(editingFinished()),this,SLOT(updateTilt()));
+ connect(ui.tiltServoMaxSpinBox,SIGNAL(editingFinished()),this,SLOT(updateTilt()));
+ connect(ui.tiltAngleMinSpinBox,SIGNAL(editingFinished()),this,SLOT(updateTilt()));
+ connect(ui.tiltAngleMaxSpinBox,SIGNAL(editingFinished()),this,SLOT(updateTilt()));
+ connect(ui.tiltChannelComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(updateTilt()));
+ connect(ui.tiltInputChannelComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(updateTilt()));
+ connect(ui.tiltReverseCheckBox,SIGNAL(clicked(bool)),this,SLOT(updateTilt()));
+ connect(ui.tiltStabilizeCheckBox,SIGNAL(clicked(bool)),this,SLOT(updateTilt()));
+
+ connect(ui.rollServoMinSpinBox,SIGNAL(editingFinished()),this,SLOT(updateTilt()));
+ connect(ui.rollServoMaxSpinBox,SIGNAL(editingFinished()),this,SLOT(updateTilt()));
+ connect(ui.rollAngleMinSpinBox,SIGNAL(editingFinished()),this,SLOT(updateTilt()));
+ connect(ui.rollAngleMaxSpinBox,SIGNAL(editingFinished()),this,SLOT(updateTilt()));
+ connect(ui.rollChannelComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(updateTilt()));
+ connect(ui.rollInputChannelComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(updateTilt()));
+ connect(ui.rollReverseCheckBox,SIGNAL(clicked(bool)),this,SLOT(updateTilt()));
+ connect(ui.rollStabilizeCheckBox,SIGNAL(clicked(bool)),this,SLOT(updateTilt()));
+
+ connect(ui.panServoMinSpinBox,SIGNAL(editingFinished()),this,SLOT(updateTilt()));
+ connect(ui.panServoMaxSpinBox,SIGNAL(editingFinished()),this,SLOT(updateTilt()));
+ connect(ui.panAngleMinSpinBox,SIGNAL(editingFinished()),this,SLOT(updateTilt()));
+ connect(ui.panAngleMaxSpinBox,SIGNAL(editingFinished()),this,SLOT(updateTilt()));
+ connect(ui.panChannelComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(updateTilt()));
+ connect(ui.panInputChannelComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(updateTilt()));
+ connect(ui.panReverseCheckBox,SIGNAL(clicked(bool)),this,SLOT(updateTilt()));
+ connect(ui.panStabilizeCheckBox,SIGNAL(clicked(bool)),this,SLOT(updateTilt()));
+
+
+ connect(ui.shutterServoMinSpinBox,SIGNAL(editingFinished()),this,SLOT(updateShutter()));
+ connect(ui.shutterServoMaxSpinBox,SIGNAL(editingFinished()),this,SLOT(updateShutter()));
+ connect(ui.shutterPushedSpinBox,SIGNAL(editingFinished()),this,SLOT(updateShutter()));
+ connect(ui.shutterNotPushedSpinBox,SIGNAL(editingFinished()),this,SLOT(updateShutter()));
+ connect(ui.shutterDurationSpinBox,SIGNAL(editingFinished()),this,SLOT(updateShutter()));
+ connect(ui.shutterChannelComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(updateShutter()));
+
+
+}
+void CameraGimbalConfig::updateTilt()
+{
+ if (!m_uas)
+ {
+ QMessageBox::information(0,tr("Error"),tr("Please connect to a MAV before attempting to set configuration"));
+ return;
+ }
+ if (ui.tiltChannelComboBox->currentIndex() == 0)
+ {
+ //Disabled
+ return;
+ }
+ for (QMap::const_iterator i = m_uas->getComponents().constBegin(); i != m_uas->getComponents().constEnd();i++)
+ {
+ qDebug() << "Component:" << i.key() << "Name:" << i.value();
+ }
+ m_uas->getParamManager()->setParameter(1,ui.tiltChannelComboBox->currentText() + "_FUNCTION",7);
+ m_uas->getParamManager()->setParameter(1,ui.tiltChannelComboBox->currentText() + "_MIN",ui.tiltServoMinSpinBox->value());
+ m_uas->getParamManager()->setParameter(1,ui.tiltChannelComboBox->currentText() + "_MAX",ui.tiltServoMaxSpinBox->value());
+ m_uas->getParamManager()->setParameter(1,"MNT_ANGMIN_TIL",ui.tiltAngleMinSpinBox->value());
+ m_uas->getParamManager()->setParameter(1,"MNT_ANGMAX_TIL",ui.tiltAngleMaxSpinBox->value());
+ m_uas->getParamManager()->setParameter(1,ui.tiltChannelComboBox->currentText() + "_REV",(ui.tiltReverseCheckBox->isChecked() ? 1 : 0));
+ if (ui.tiltInputChannelComboBox->currentIndex() == 0)
+ {
+ m_uas->getParamManager()->setParameter(1,"MNT_RC_IN_TILT",0);
+ }
+ else
+ {
+ m_uas->getParamManager()->setParameter(1,"MNT_RC_IN_TILT",ui.tiltInputChannelComboBox->currentIndex()+4);
+ }
+}
-CameraGimbalConfig::CameraGimbalConfig(QWidget *parent) : QWidget(parent)
+void CameraGimbalConfig::updateRoll()
{
- ui.setupUi(this);
+ if (!m_uas)
+ {
+ QMessageBox::information(0,tr("Error"),tr("Please connect to a MAV before attempting to set configuration"));
+ return;
+ }
+ m_uas->getParamManager()->setParameter(1,ui.rollChannelComboBox->currentText() + "_FUNCTION",8);
+ m_uas->getParamManager()->setParameter(1,ui.rollChannelComboBox->currentText() + "_MIN",ui.rollServoMinSpinBox->value());
+ m_uas->getParamManager()->setParameter(1,ui.rollChannelComboBox->currentText() + "_MAX",ui.rollServoMaxSpinBox->value());
+ m_uas->getParamManager()->setParameter(1,"MNT_ANGMIN_ROL",ui.rollAngleMinSpinBox->value());
+ m_uas->getParamManager()->setParameter(1,"MNT_ANGMAX_ROL",ui.rollAngleMaxSpinBox->value());
+ m_uas->getParamManager()->setParameter(1,ui.rollChannelComboBox->currentText() + "_REV",(ui.rollReverseCheckBox->isChecked() ? 1 : 0));
+ if (ui.rollInputChannelComboBox->currentIndex() == 0)
+ {
+ m_uas->getParamManager()->setParameter(1,"MNT_RC_IN_ROLL",0);
+ }
+ else
+ {
+ m_uas->getParamManager()->setParameter(1,"MNT_RC_IN_ROLL",ui.rollInputChannelComboBox->currentIndex()+4);
+ }
}
+void CameraGimbalConfig::updatePan()
+{
+ if (!m_uas)
+ {
+ QMessageBox::information(0,tr("Error"),tr("Please connect to a MAV before attempting to set configuration"));
+ return;
+ }
+ m_uas->getParamManager()->setParameter(1,ui.panChannelComboBox->currentText() + "_FUNCTION",6);
+ m_uas->getParamManager()->setParameter(1,ui.panChannelComboBox->currentText() + "_MIN",ui.panServoMinSpinBox->value());
+ m_uas->getParamManager()->setParameter(1,ui.panChannelComboBox->currentText() + "_MAX",ui.panServoMaxSpinBox->value());
+ m_uas->getParamManager()->setParameter(1,"MNT_ANGMIN_PAN",ui.panAngleMinSpinBox->value());
+ m_uas->getParamManager()->setParameter(1,"MNT_ANGMAX_PAN",ui.panAngleMaxSpinBox->value());
+ m_uas->getParamManager()->setParameter(1,ui.panChannelComboBox->currentText() + "_REV",(ui.panReverseCheckBox->isChecked() ? 1 : 0));
+ if (ui.panInputChannelComboBox->currentIndex() == 0)
+ {
+ m_uas->getParamManager()->setParameter(1,"MNT_RC_IN_PAN",0);
+ }
+ else
+ {
+ m_uas->getParamManager()->setParameter(1,"MNT_RC_IN_PAN",ui.panInputChannelComboBox->currentIndex()+4);
+ }
+}
+
+void CameraGimbalConfig::updateShutter()
+{
+ if (!m_uas)
+ {
+ QMessageBox::information(0,tr("Error"),tr("Please connect to a MAV before attempting to set configuration"));
+ return;
+ }
+ if (ui.shutterChannelComboBox->currentIndex() == 0) //Disabled
+ {
+ m_uas->getParamManager()->setParameter(1,"CAM_TRIGG_TYPE",0);
+ }
+ else if (ui.shutterChannelComboBox->currentIndex() == 1) //Relay
+ {
+ m_uas->getParamManager()->setParameter(1,"CAM_TRIGG_TYPE",1);
+ }
+ else if (ui.shutterChannelComboBox->currentIndex() == 2) //Transistor
+ {
+ m_uas->getParamManager()->setParameter(1,"CAM_TRIGG_TYPE",4);
+ }
+ else
+ {
+ m_uas->getParamManager()->setParameter(1,ui.shutterChannelComboBox->currentText() + "_FUNCTION",10);
+ m_uas->getParamManager()->setParameter(1,"CAM_TRIGG_TYPE",0);
+ }
+ m_uas->getParamManager()->setParameter(1,ui.shutterChannelComboBox->currentText() + "_MIN",ui.shutterServoMinSpinBox->value());
+ m_uas->getParamManager()->setParameter(1,ui.shutterChannelComboBox->currentText() + "_MAX",ui.shutterServoMaxSpinBox->value());
+ m_uas->getParamManager()->setParameter(1,"CAM_SERVO_ON",ui.shutterPushedSpinBox->value());
+ m_uas->getParamManager()->setParameter(1,"CAM_SERVO_OFF",ui.shutterNotPushedSpinBox->value());
+ m_uas->getParamManager()->setParameter(1,"CAM_DURATION",ui.shutterDurationSpinBox->value());
+
+
+}
+
+
CameraGimbalConfig::~CameraGimbalConfig()
{
}
+
+void CameraGimbalConfig::parameterChanged(int uas, int component, QString parameterName, QVariant value)
+{
+
+}
diff --git a/src/ui/configuration/CameraGimbalConfig.h b/src/ui/configuration/CameraGimbalConfig.h
index 4373fbf5f18f5d4301fc30186a1ed06aa62c9a09..92714f4fbfbaccfcf59c46bdb044e1d6cf6ec0e5 100644
--- a/src/ui/configuration/CameraGimbalConfig.h
+++ b/src/ui/configuration/CameraGimbalConfig.h
@@ -2,16 +2,23 @@
#define CAMERAGIMBALCONFIG_H
#include
+#include "AP2ConfigWidget.h"
#include "ui_CameraGimbalConfig.h"
-class CameraGimbalConfig : public QWidget
+class CameraGimbalConfig : public AP2ConfigWidget
{
Q_OBJECT
public:
explicit CameraGimbalConfig(QWidget *parent = 0);
~CameraGimbalConfig();
-
+private slots:
+ void parameterChanged(int uas, int component, QString parameterName, QVariant value);
+ void updateTilt();
+ void updateRoll();
+ void updatePan();
+ void updateShutter();
+
private:
Ui::CameraGimbalConfig ui;
};
diff --git a/src/ui/configuration/CameraGimbalConfig.ui b/src/ui/configuration/CameraGimbalConfig.ui
index b2b7f607b32dd140fb20b46ac4c05a361378c981..7b1feb4389300bcb3160c92e25d71b743ac543ed 100644
--- a/src/ui/configuration/CameraGimbalConfig.ui
+++ b/src/ui/configuration/CameraGimbalConfig.ui
@@ -6,8 +6,8 @@
0
0
- 400
- 300
+ 959
+ 813
@@ -29,7 +29,701 @@
false
+
+
+
+ 30
+ 60
+ 541
+ 151
+
+
+
+ -
+
+
+ Min
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+ Max
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+ <h3>Input Ch</h3>
+
+
+
+ -
+
+
+ Reverse
+
+
+
+ -
+
+
+ <h3>Angle Limits</h3>
+
+
+
+ -
+
+
+ <h3>Servo Limits</h3>
+
+
+
+ -
+
+
+ Max
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+ Min
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+ -
+
+
+ <h2>Tilt</h2>
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ CheckBox
+
+
+
+ -
+
+
+
+ 250
+ 120
+
+
+
+
+ 250
+ 120
+
+
+
+
+
+
+ :/files/images/devices/cameraGimalPitch1.png
+
+
+ true
+
+
+
+ -
+
+
+ 3000
+
+
+ 1000
+
+
+
+ -
+
+
+ 3000
+
+
+ 2000
+
+
+
+ -
+
+
+ 3000
+
+
+ 1000
+
+
+
+ -
+
+
+ 3000
+
+
+ 2000
+
+
+
+ -
+
+
+
+
+
+
+
+ 30
+ 230
+ 541
+ 149
+
+
+
+ -
+
+
+ Min
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+ Max
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+ -
+
+
+ <h3>Input Ch</h3>
+
+
+
+ -
+
+
+ Reverse
+
+
+
+ -
+
+
+ <h3>Angle Limits</h3>
+
+
+
+ -
+
+
+ <h3>Servo Limits</h3>
+
+
+
+ -
+
+
+ Max
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+ Min
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+ -
+
+
+ <h2>Roll</h2>
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ CheckBox
+
+
+
+ -
+
+
+
+ 250
+ 120
+
+
+
+
+ 250
+ 120
+
+
+
+
+
+
+ :/files/images/devices/cameraGimalRoll1.png
+
+
+ true
+
+
+
+ -
+
+
+ 3000
+
+
+ 1000
+
+
+
+ -
+
+
+ 3000
+
+
+ 2000
+
+
+
+ -
+
+
+ 3000
+
+
+ 1000
+
+
+
+ -
+
+
+ 3000
+
+
+ 2000
+
+
+
+
+
+
+
+
+ 30
+ 390
+ 541
+ 149
+
+
+
+ -
+
+
+ Min
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+ Max
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+ -
+
+
+ <h3>Input Ch</h3>
+
+
+
+ -
+
+
+ Reverse
+
+
+
+ -
+
+
+ <h3>Angle Limits</h3>
+
+
+
+ -
+
+
+ <h3>Servo Limits</h3>
+
+
+
+ -
+
+
+ Max
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+ Min
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+ -
+
+
+ <h2>Pan</h2>
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ CheckBox
+
+
+
+ -
+
+
+
+ 250
+ 120
+
+
+
+
+ 250
+ 120
+
+
+
+
+
+
+ :/files/images/devices/cameraGimalYaw.png
+
+
+ true
+
+
+
+ -
+
+
+ 3000
+
+
+ 1000
+
+
+
+ -
+
+
+ 3000
+
+
+ 1000
+
+
+
+ -
+
+
+ 3000
+
+
+ 2000
+
+
+
+ -
+
+
+ 3000
+
+
+ 2000
+
+
+
+
+
+
+
+
+ 30
+ 550
+ 541
+ 181
+
+
+
+ -
+
+
+
+ 250
+ 120
+
+
+
+
+ 250
+ 120
+
+
+
+
+
+
+ :/files/images/devices/Shutter.png
+
+
+ true
+
+
+
+ -
+
+
+ Duration
+(1/10th sec)
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+ Pushed
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+ Not Pushed
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+ <h3>Shutter</h3>
+
+
+
+ -
+
+
+ <h3>Servo Limits</h3>
+
+
+
+ -
+
+
+ Max
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+ Min
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+ -
+
+
+ <h2>Shutter</h2>
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ <h2>Please set the Ch7 Option to Camera Trigger</h2>
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ 3000
+
+
+ 1000
+
+
+
+ -
+
+
+ 3000
+
+
+ 2000
+
+
+
+ -
+
+
+ 100
+
+
+ 20
+
+
+
+ -
+
+
+ 3000
+
+
+ 1000
+
+
+
+ -
+
+
+ 3000
+
+
+ 2000
+
+
+
+
+
+
+
+
+ 720
+ 70
+ 120
+ 80
+
+
+
+ GroupBox
+
+
-
+
+
+