#include <QDebug>
#include <QMessageBox>
-RobomonAtlantis::RobomonAtlantis(QWidget *parent)
- : QWidget(parent), motorSimulation(orte)
+RobomonAtlantis::RobomonAtlantis(QStatusBar *_statusBar)
- : QWidget(0), statusBar(_statusBar)
++ : QWidget(0), statusBar(_statusBar), motorSimulation(orte)
{
QFont font;
font.setPointSize(7);
obstacleSimulationCheckBox = new QCheckBox(tr("&Obstacle simulation"));
obstacleSimulationCheckBox->setShortcut(tr("o"));
+ obstacleSimulationCheckBox->setToolTip("When enabled, simulates an obstacle,\npublishes simlated hokuyo data and \ndisplays robot's map by using shared memory.");
layout->addWidget(obstacleSimulationCheckBox);
- // startPlug = new QCheckBox("&Start plug");
- // layout->addWidget(startPlug);
+ motorSimulationCheckBox = new QCheckBox(tr("&Motor simulation"));
+ motorSimulationCheckBox->setShortcut(tr("m"));
+ motorSimulationCheckBox->setToolTip("Subscribes to motion_speed and\nbased on this publishes motion_irc.");
+ layout->addWidget(motorSimulationCheckBox);
+
- startPlug = new QCheckBox("&Start plug");
- layout->addWidget(startPlug);
++// startPlug = new QCheckBox("&Start plug");
++// layout->addWidget(startPlug);
+
+ colorChoser = new QCheckBox("&Team color");
+ layout->addWidget(colorChoser);
+
miscGroupBox->setLayout(layout);
}
void RobomonAtlantis::createActuatorsGroupBox()
{
- actuatorsGroupBox = new QGroupBox(tr("Actuators"));
- actuatorsGroupBox->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);
- QHBoxLayout *layout = new QHBoxLayout();
-// vidle = new QDial();
-
-// vidle->setMinimum(VIDLE_VYSIP);
-// vidle->setMaximum((VIDLE_UP-VIDLE_VYSIP)+VIDLE_VYSIP);
-// vidle->setEnabled(true);
+ actuatorsGroupBox = new QGroupBox(tr("Status"));
+ actuatorsGroupBox->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Maximum);
+ QGridLayout *layout = new QGridLayout();
- //createMotorsGroupBox();
+ layout->addWidget(MiscGui::createLabel("APP:"), 1, 0);
+ system_status = new QLabel();
+ system_status->setMinimumWidth(100);
+ system_status->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+ layout->addWidget(system_status, 1, 1);
-
+
- layout->setAlignment(Qt::AlignLeft);
-// layout->addWidget(vidle);
- //layout->addWidget(enginesGroupBox);
- actuatorsGroupBox->setLayout(layout);
+ actuatorsGroupBox->setLayout(layout);
}
void RobomonAtlantis::createPowerGroupBox()
rcv_fsm_motion_cb, this);
robottype_subscriber_fsm_act_create(&orte,
rcv_fsm_act_cb, this);
-
- /* motors */
- orte.motion_speed.left = 0xffff;
- orte.motion_speed.right = 0xffff;
- robottype_subscriber_motion_speed_create(&orte, NULL, NULL);
++ robottype_subscriber_motion_speed_create(&orte, NULL, NULL);
/* power management */
orte.pwr_ctrl.voltage33 = true;
ORTEPublicationSend(orte.publication_robot_cmd);
}
-void RobomonAtlantis::setTeamColor(int plug)
-{
- orte.robot_switches.team_color = plug ? 1 : 0;
- ORTEPublicationSend(orte.publication_robot_switches);
-}
-
+ void RobomonAtlantis::setMotorSimulation(int state)
+ {
+ if (state) {
+ motorSimulation.start();
+ } else {
+ motorSimulation.stop();
+ }
+ }
+
void RobomonAtlantis::resetTrails()
{
trailRefPos->reset();
class QSlider;
class QProgressBar;
class QFont;
+class QImage;
+ class MotorSimulation : QObject {
+ Q_OBJECT
+
+ QTimer timer;
+ qint64 last_time;
+ struct robottype_orte_data &orte;
+ public:
+ MotorSimulation(struct robottype_orte_data &orte) : QObject(), timer(this), orte(orte) {}
+ void start()
+ {
+ robottype_publisher_motion_irc_create(&orte, 0, 0);
+ connect(&timer, SIGNAL(timeout()), this, SLOT(updateIRC()));
+ timer.start(50);
+ }
+
+ void stop()
+ {
+ robottype_publisher_motion_irc_destroy(&orte);
+ timer.stop();
+ disconnect(&timer, SIGNAL(timeout()), this, SLOT(updateIRC()));
+ }
+ private slots:
+ void updateIRC()
+ {
+ qint64 now = QDateTime::currentMSecsSinceEpoch();
+ orte.motion_irc.left += orte.motion_speed.left * (now - last_time); // TODO: Find constant for speed to irc conversion
+ orte.motion_irc.right+= orte.motion_speed.right * (now - last_time);
+ ORTEPublicationSend(orte.publication_motion_irc);
+ last_time = now;
+ }
+ };
+
+
class RobomonAtlantis : public QWidget
{
Q_OBJECT
void simulateObstaclesHokuyo();
void changeObstacle(QPointF position);
void sendStart(int plug);
- void setTeamColor(int plug);
+ void setMotorSimulation(int state);
/************************************************************
- * ORTE
+ * ORTE
************************************************************/
void motionStatusReceived();
void actualPositionReceived();
QTimer *obstacleSimulationTimer;
Point simulatedObstacle;
+ class MotorSimulation motorSimulation;
+
/************************************************************
- * ORTE
+ * ORTE
************************************************************/
void createOrte();