Rev 287 | Blame | Compare with Previous | Last modification | View Log | RSS feed
#include "RobotControl.h"
RobotControl::RobotControl(QWidget *parent)
: QWidget(parent)
{
connected = false;
connectBtn = new QPushButton();
connectBtn->setText("Connect");
connectBtn->setFocusPolicy(Qt::NoFocus);
refreshBtn = new QPushButton();
refreshBtn->setText("Refresh");
refreshBtn->setFocusPolicy(Qt::NoFocus);
statusLabel = new QLabel();
statusLabel->setText("Status: Disconnected");
speedLabel = new QLabel();
speedLabel->setText("Speed (0-255):");
speedBox = new QSpinBox();
speedBox->setRange(0, 255);
speedBox->setValue(255);
speedBox->setSingleStep(51);
speedBox->setFocusPolicy(Qt::NoFocus);
portSelect = new QComboBox();
portSelect->setFocusPolicy(Qt::NoFocus);
refreshPorts();
port = new QSerialPort();
QHBoxLayout *layout = new QHBoxLayout();
layout->addWidget(connectBtn);
layout->addWidget(portSelect);
layout->addWidget(refreshBtn);
layout->addWidget(statusLabel);
layout->addStretch();
layout->addWidget(speedLabel);
layout->addWidget(speedBox);
setLayout(layout);
connect(connectBtn, SIGNAL(pressed()), this, SLOT(toggleConnect()));
connect(refreshBtn, SIGNAL(pressed()), this, SLOT(refreshPorts()));
}
RobotControl::~RobotControl()
{
port->close();
delete(connectBtn);
delete(refreshBtn);
delete(statusLabel);
delete(portSelect);
delete(port);
}
void RobotControl::refreshPorts() {
ports = QSerialPortInfo::availablePorts();
portSelect->clear();
for (int i = 0; i < ports.size(); i++) {
portSelect->addItem(ports[i].portName());
}
}
void RobotControl::toggleConnect() {
if (!connected) {
port->setPortName(portSelect->currentText());
if (!port->open(QIODevice::ReadWrite)) {
port->close();
statusLabel->setText("Status: Unable to Connect");
} else {
port->setBaudRate(QSerialPort::Baud115200);
port->setDataBits(QSerialPort::Data8);
port->setParity(QSerialPort::NoParity);
port->setFlowControl(QSerialPort::NoFlowControl);
port->setStopBits(QSerialPort::OneStop);
statusLabel->setText("Status: Connected");
connectBtn->setText("Disconnect");
refreshBtn->setEnabled(false);
portSelect->setEnabled(false);
connected = true;
}
} else {
port->close();
statusLabel->setText("Status: Disconnected");
connectBtn->setText("Connect");
refreshBtn->setEnabled(true);
portSelect->setEnabled(true);
connected = false;
}
}
void RobotControl::handleKeyPress(QKeyEvent *event) {
if (connected) {
if (!event->isAutoRepeat()) {
switch (event->key()) {
case Qt::Key_W:
case Qt::Key_Up:
moveForward = true;
break;
case Qt::Key_S:
case Qt::Key_Down:
moveBackward = true;
break;
case Qt::Key_A:
case Qt::Key_Left:
turnLeft = true;
break;
case Qt::Key_D:
case Qt::Key_Right:
turnRight = true;
break;
}
processMove();
}
}
}
void RobotControl::handleKeyRelease(QKeyEvent *event) {
if (connected) {
if (!event->isAutoRepeat()) {
switch (event->key()) {
case Qt::Key_W:
case Qt::Key_Up:
moveForward = false;
break;
case Qt::Key_S:
case Qt::Key_Down:
moveBackward = false;
break;
case Qt::Key_A:
case Qt::Key_Left:
turnLeft = false;
break;
case Qt::Key_D:
case Qt::Key_Right:
turnRight = false;
break;
}
processMove();
}
}
}
void RobotControl::processMove() {
char buffer[4];
// 0x01 = Reset
// 0x02 = Left Forward
// 0x03 = Left Backward
// 0x04 = Right Forward
// 0x05 = Right Backward
char speed = speedBox->value();
if (connected) {
if (moveForward) {
if (turnLeft) {
buffer[0] = 0x02;
buffer[1] = 0x00;
buffer[2] = 0x04;
buffer[3] = speed;
} else if (turnRight) {
buffer[0] = 0x02;
buffer[1] = speed;
buffer[2] = 0x04;
buffer[3] = 0x00;
} else {
buffer[0] = 0x02;
buffer[1] = speed;
buffer[2] = 0x04;
buffer[3] = speed;
}
} else if (moveBackward) {
if (turnLeft) {
buffer[0] = 0x03;
buffer[1] = 0x00;
buffer[2] = 0x05;
buffer[3] = speed;
} else if (turnRight) {
buffer[0] = 0x03;
buffer[1] = speed;
buffer[2] = 0x05;
buffer[3] = 0x00;
} else {
buffer[0] = 0x03;
buffer[1] = speed;
buffer[2] = 0x05;
buffer[3] = speed;
}
} else if (turnLeft) {
buffer[0] = 0x03;
buffer[1] = speed;
buffer[2] = 0x04;
buffer[3] = speed;
} else if (turnRight) {
buffer[0] = 0x02;
buffer[1] = speed;
buffer[2] = 0x05;
buffer[3] = speed;
} else {
buffer[0] = 0x02;
buffer[1] = 0x00;
buffer[2] = 0x04;
buffer[3] = 0x00;
}
port->write(buffer, 4);
port->flush();
}
}