#include "tennisclient.h"
#include <qbluetoothsocket.h>
#include <QtCore/QDataStream>
#include <QtCore/QByteArray>
#include <QtCore/QStringList>
TennisClient::TennisClient(QObject *parent)
: QObject(parent), socket(0), stream(0), elapsed(new QTime), lagTimeout(0)
{
lagTimer.setInterval(1000);
connect(&lagTimer, SIGNAL(timeout()), this, SLOT(sendEcho()));
}
TennisClient::~TennisClient()
{
stopClient();
}
void TennisClient::startClient(const QBluetoothServiceInfo &remoteService)
{
if (socket)
return;
serviceInfo = remoteService;
socket = new QBluetoothSocket(QBluetoothSocket::L2capSocket);
qDebug() << "Create socket";
socket->connectToService(remoteService);
qDebug() << "ConnecttoService done";
connect(socket, SIGNAL(readyRead()), this, SLOT(readSocket()));
connect(socket, SIGNAL(connected()), this, SLOT(connected()));
connect(socket, SIGNAL(disconnected()), this, SIGNAL(disconnected()));
connect(socket, SIGNAL(disconnected()), this, SLOT(socketDisconnected()));
connect(socket, SIGNAL(error(QBluetoothSocket::SocketError)), this, SLOT(error(QBluetoothSocket::SocketError)));
lagTimer.start();
}
void TennisClient::stopClient()
{
if (socket == 0)
return;
qDebug() << Q_FUNC_INFO << "closing client!";
lagTimer.stop();
delete stream;
stream = 0;
socket->deleteLater();
socket = 0;
}
void TennisClient::socketDisconnected()
{
qDebug() << "Got socketDisconnected";
stopClient();
}
void TennisClient::readSocket()
{
if (!socket)
return;
while (socket->bytesAvailable()) {
QString str;
*stream >> str;
QStringList args = str.split(QChar(' '));
QString s = args.takeFirst();
if (s == "m" && args.count() == 2) {
emit moveBall(args.at(0).toInt(), args.at(1).toInt());
}
else if (s == "s" && args.count() == 2){
emit score(args.at(0).toInt(), args.at(1).toInt());
}
else if (s == "l" && args.count() == 1){
emit moveLeftPaddle(args.at(0).toInt());
}
else if (s == "e"){
QByteArray b;
QDataStream s(&b, QIODevice::WriteOnly);
s << str;
socket->write(b);
}
else if (s == "E"){
lagTimeout = 0;
QTime then = QTime::fromString(args.at(0), "hh:mm:ss.zzz");
if (then.isValid()) {
emit lag(then.msecsTo(QTime::currentTime()));
}
}
else {
qDebug() << Q_FUNC_INFO << "Unknown command" << str;
}
}
}
void TennisClient::moveRightPaddle(int y)
{
int msec = elapsed->elapsed();
if (stream && msec > 50) {
QByteArray b;
QDataStream s(&b, QIODevice::WriteOnly);
s << QString("r %1").arg(y);
socket->write(b);
elapsed->restart();
}
}
void TennisClient::connected()
{
stream = new QDataStream(socket);
emit connected(socket->peerName());
}
void TennisClient::error(QBluetoothSocket::SocketError err)
{
qDebug() << "Got socket error" <<Q_FUNC_INFO << "error" << err;
emit disconnected();
}
void TennisClient::sendEcho()
{
if (lagTimeout) {
lagTimeout--;
return;
}
if (stream) {
QByteArray b;
QDataStream s(&b, QIODevice::WriteOnly);
s << QString("E %1").arg(QTime::currentTime().toString("hh:mm:ss.zzz"));
socket->write(b);
lagTimeout = 10;
}
}