Subversion Repositories Code-Repo

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
287 Kevin 1
#include "RobotControl.h"
2
 
3
RobotControl::RobotControl(QWidget *parent)
4
	: QWidget(parent)
5
{
6
	connected = false;
7
 
8
	connectBtn = new QPushButton();
9
	connectBtn->setText("Connect");
10
	connectBtn->setFocusPolicy(Qt::NoFocus);
11
 
12
	refreshBtn = new QPushButton();
13
	refreshBtn->setText("Refresh");
14
	refreshBtn->setFocusPolicy(Qt::NoFocus);
15
 
16
	statusLabel = new QLabel();
17
	statusLabel->setText("Status: Disconnected");
18
 
19
	speedLabel = new QLabel();
20
	speedLabel->setText("Speed (0-255):");
21
 
22
	speedBox = new QSpinBox();
23
	speedBox->setRange(0, 255);
24
	speedBox->setValue(255);
25
	speedBox->setSingleStep(51);
26
	speedBox->setFocusPolicy(Qt::NoFocus);
27
 
28
	portSelect = new QComboBox();
29
	portSelect->setFocusPolicy(Qt::NoFocus);
30
	refreshPorts();
31
 
32
	port = new QSerialPort();
33
 
34
	QHBoxLayout *layout = new QHBoxLayout();
35
	layout->addWidget(connectBtn);
36
	layout->addWidget(portSelect);
37
	layout->addWidget(refreshBtn);
38
	layout->addWidget(statusLabel);
39
	layout->addStretch();
40
	layout->addWidget(speedLabel);
41
	layout->addWidget(speedBox);
42
	setLayout(layout);
43
 
44
	connect(connectBtn, SIGNAL(pressed()), this, SLOT(toggleConnect()));
45
	connect(refreshBtn, SIGNAL(pressed()), this, SLOT(refreshPorts()));
46
 
47
}
48
 
49
RobotControl::~RobotControl()
50
{
51
	port->close();
52
	delete(connectBtn);
53
	delete(refreshBtn);
54
	delete(statusLabel);
55
	delete(portSelect);
56
	delete(port);
57
}
58
 
59
void RobotControl::refreshPorts() {
60
	ports = QSerialPortInfo::availablePorts();
61
	portSelect->clear();
62
	for (int i = 0; i < ports.size(); i++) {
63
		portSelect->addItem(ports[i].portName());
64
	}
65
}
66
 
67
void RobotControl::toggleConnect() {
68
	if (!connected) {
69
		port->setPortName(portSelect->currentText());
70
		if (!port->open(QIODevice::ReadWrite)) {
71
			port->close();
72
			statusLabel->setText("Status: Unable to Connect");
73
		} else {
74
			port->setBaudRate(QSerialPort::Baud115200);
75
			port->setDataBits(QSerialPort::Data8);
76
			port->setParity(QSerialPort::NoParity);
77
			port->setFlowControl(QSerialPort::NoFlowControl);
78
			port->setStopBits(QSerialPort::OneStop);
79
			statusLabel->setText("Status: Connected");
80
			connectBtn->setText("Disconnect");
81
			refreshBtn->setEnabled(false);
82
			portSelect->setEnabled(false);
83
			connected = true;
84
		}
85
	} else {
86
		port->close();
87
		statusLabel->setText("Status: Disconnected");
88
		connectBtn->setText("Connect");
89
		refreshBtn->setEnabled(true);
90
		portSelect->setEnabled(true);
91
		connected = false;
92
	}
93
}
94
 
95
void RobotControl::handleKeyPress(QKeyEvent *event) {
96
	if (connected) {
97
		if (!event->isAutoRepeat()) {
98
			switch (event->key()) {
99
			case Qt::Key_W:
100
			case Qt::Key_Up:
101
				moveForward = true;
102
				break;
103
			case Qt::Key_S:
104
			case Qt::Key_Down:
105
				moveBackward = true;
106
				break;
107
			case Qt::Key_A:
108
			case Qt::Key_Left:
109
				turnLeft = true;
110
				break;
111
			case Qt::Key_D:
112
			case Qt::Key_Right:
113
				turnRight = true;
114
				break;
115
			}
116
 
117
			processMove();
118
		}
119
	}
120
}
121
 
122
void RobotControl::handleKeyRelease(QKeyEvent *event) {
123
	if (connected) {
124
		if (!event->isAutoRepeat()) {
125
			switch (event->key()) {
126
			case Qt::Key_W:
127
			case Qt::Key_Up:
128
				moveForward = false;
129
				break;
130
			case Qt::Key_S:
131
			case Qt::Key_Down:
132
				moveBackward = false;
133
				break;
134
			case Qt::Key_A:
135
			case Qt::Key_Left:
136
				turnLeft = false;
137
				break;
138
			case Qt::Key_D:
139
			case Qt::Key_Right:
140
				turnRight = false;
141
				break;
142
			}
143
 
144
			processMove();
145
		}
146
	}
147
}
148
 
149
void RobotControl::processMove() {
150
	char buffer[4];
151
 
152
	// 0x01 = Reset
153
	// 0x02 = Left Forward
154
	// 0x03 = Left Backward
155
	// 0x04 = Right Forward
156
	// 0x05 = Right Backward
157
 
158
	char speed = speedBox->value();
159
 
160
	if (connected) {
161
		if (moveForward) {
162
			if (turnLeft) {
163
				buffer[0] = 0x02;
164
				buffer[1] = 0x00;
165
				buffer[2] = 0x04;
166
				buffer[3] = speed;
167
			} else if (turnRight) {
168
				buffer[0] = 0x02;
169
				buffer[1] = speed;
170
				buffer[2] = 0x04;
171
				buffer[3] = 0x00;
172
			} else {
173
				buffer[0] = 0x02;
174
				buffer[1] = speed;
175
				buffer[2] = 0x04;
176
				buffer[3] = speed;
177
			}
178
		} else if (moveBackward) {
179
			if (turnLeft) {
180
				buffer[0] = 0x03;
181
				buffer[1] = 0x00;
182
				buffer[2] = 0x05;
183
				buffer[3] = speed;
184
			} else if (turnRight) {
185
				buffer[0] = 0x03;
186
				buffer[1] = speed;
187
				buffer[2] = 0x05;
188
				buffer[3] = 0x00;
189
			} else {
190
				buffer[0] = 0x03;
191
				buffer[1] = speed;
192
				buffer[2] = 0x05;
193
				buffer[3] = speed;
194
			}
195
		} else if (turnLeft) {
196
			buffer[0] = 0x03;
197
			buffer[1] = speed;
198
			buffer[2] = 0x04;
199
			buffer[3] = speed;
200
		} else if (turnRight) {
201
			buffer[0] = 0x02;
202
			buffer[1] = speed;
203
			buffer[2] = 0x05;
204
			buffer[3] = speed;
205
		} else {
206
			buffer[0] = 0x02;
207
			buffer[1] = 0x00;
208
			buffer[2] = 0x04;
209
			buffer[3] = 0x00;
210
		}
211
 
212
		port->write(buffer, 4);
213
		port->flush();
214
	}
215
}