summaryrefslogtreecommitdiffstats
path: root/examples/bluetooth/pingpong/pingpong.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/bluetooth/pingpong/pingpong.cpp')
-rw-r--r--examples/bluetooth/pingpong/pingpong.cpp440
1 files changed, 0 insertions, 440 deletions
diff --git a/examples/bluetooth/pingpong/pingpong.cpp b/examples/bluetooth/pingpong/pingpong.cpp
deleted file mode 100644
index abea85dc..00000000
--- a/examples/bluetooth/pingpong/pingpong.cpp
+++ /dev/null
@@ -1,440 +0,0 @@
-// Copyright (C) 2014 BlackBerry Limited. All rights reserved.
-// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-
-#include "pingpong.h"
-#include <QDebug>
-#include <QCoreApplication>
-
-PingPong::PingPong()
-{
- m_timer = new QTimer(this);
- connect(m_timer, &QTimer::timeout, this, &PingPong::update);
-}
-
-PingPong::~PingPong()
-{
- m_timer->stop();
- delete socket;
- delete discoveryAgent;
-}
-
-void PingPong::startGame()
-{
- m_resultLeft = m_resultRight = 0;
- emit resultChanged();
- m_showDialog = false;
- emit showDialogChanged();
- //! [Start the game]
- m_timer->start(10);
- //! [Start the game]
-}
-
-void PingPong::update()
-{
- QByteArray size;
- // Server is only updating the coordinates
- //! [Updating coordinates]
- if (m_role == 1) {
- checkBoundaries();
- m_ballY += m_speedy;
- m_ballX += m_speedx;
-
- size.setNum(m_ballX);
- size.append(' ');
- QByteArray size1;
- size1.setNum(m_ballY);
- size.append(size1);
- size.append(' ');
- size1.setNum(m_leftBlockY);
- size.append(size1);
- size.append(" \n");
- socket->write(size.constData());
- emit ballChanged();
- }
- else if (m_role == 2) {
- size.setNum(m_rightBlockY);
- size.append(" \n");
- socket->write(size.constData());
- }
- //! [Updating coordinates]
-}
-
-void PingPong::updateBall(const float &bX, const float &bY)
-{
- m_ballX = bX;
- m_ballY = bY;
-}
-
-void PingPong::updateLeftBlock(const float &lY)
-{
- m_leftBlockY = lY;
-}
-
-void PingPong::updateRightBlock(const float &rY)
-{
- m_rightBlockY = rY;
-}
-
-void PingPong::checkBoundaries()
-{
- float ballWidth = 1.f / 27;
- float blockSize = 1.f / 27;
- float blockHeight = 1.f / 5;
-
- float ballCenterY = m_ballY + ballWidth / 2.;
- //! [Checking the boundaries]
- if (((m_ballX + ballWidth) > (1. - blockSize)) && (ballCenterY < (m_rightBlockY + blockHeight))
- && (ballCenterY > m_rightBlockY)) {
- // right paddle collision
- // simulating paddle surface to be a quarter of a circle
- float paddlecenter = m_rightBlockY + blockHeight / 2.;
- float relpos = (ballCenterY - paddlecenter) / (blockHeight / 2.); // [-1 : 1]
- float surfaceangle = M_PI_4 * relpos;
-
- // calculation of surface normal
- float normalx = -cos(surfaceangle);
- float normaly = sin(surfaceangle);
-
- // calculation of surface tangent
- float tangentx = sin(surfaceangle);
- float tangenty = cos(surfaceangle);
-
- // calculation of tangentialspeed
- float tangentialspeed = tangentx * m_speedx + tangenty * m_speedy;
- // calculation of normal speed
- float normalspeed = normalx * m_speedx + normaly * m_speedy;
-
- // speed increase of 10%
- normalspeed *= 1.1f;
-
- if (normalspeed < 0) { // if we are coming from the left. To avoid double reflections
- m_speedx = tangentialspeed * tangentx - normalspeed * normalx;
- m_speedy = tangentialspeed * tangenty - normalspeed * normaly;
- }
- } else if ((m_ballX < blockSize) && (ballCenterY < (m_leftBlockY + blockHeight))
- && (ballCenterY > m_leftBlockY)) {
- // left paddle collision
- // simulating paddle surface to be a quarter of a circle
- float paddlecenter = m_leftBlockY + blockHeight / 2.;
- float relpos = (ballCenterY - paddlecenter) / (blockHeight / 2.); // [-1 : 1]
- float surfaceangle = M_PI_4 * relpos;
-
- // calculation of surface normal
- float normalx = cos(surfaceangle);
- float normaly = sin(surfaceangle);
-
- // calculation of surface tangent
- float tangentx = -sin(surfaceangle);
- float tangenty = cos(surfaceangle);
-
- // calculation of tangentialspeed
- float tangentialspeed = tangentx * m_speedx + tangenty * m_speedy;
- // calculation of normal speed
- float normalspeed = normalx * m_speedx + normaly * m_speedy;
-
- // speed increase of 10%
- normalspeed *= 1.1f;
-
- if (normalspeed < 0) { // if we are coming from the left. To avoid double reflections
- m_speedx = tangentialspeed * tangentx - normalspeed * normalx;
- m_speedy = tangentialspeed * tangenty - normalspeed * normaly;
- }
- } else if (m_ballY < 0) {
- m_speedy = std::abs(m_speedy);
- } else if (m_ballY + ballWidth > 1.f) {
- m_speedy = -std::abs(m_speedy);
- }
- //! [Checking the boundaries]
- else if ((m_ballX + ballWidth) > 1.f) {
- m_resultLeft++;
- m_speedx = -0.002f;
- m_speedy = -0.002f;
- m_ballX = 0.5f;
- m_ballY = 0.9f;
-
- checkResult();
- QByteArray result;
- result.append("result ");
- QByteArray res;
- res.setNum(m_resultLeft);
- result.append(res);
- result.append(' ');
- res.setNum(m_resultRight);
- result.append(res);
- result.append(" \n");
- socket->write(result);
- qDebug() << result;
- emit resultChanged();
- } else if (m_ballX < 0) {
- m_resultRight++;
- m_speedx = 0.002f;
- m_speedy = -0.002f;
- m_ballX = 0.5f;
- m_ballY = 0.9f;
-
- checkResult();
- QByteArray result;
- result.append("result ");
- QByteArray res;
- res.setNum(m_resultLeft);
- result.append(res);
- result.append(' ');
- res.setNum(m_resultRight);
- result.append(res);
- result.append(" \n");
- socket->write(result);
- emit resultChanged();
- }
-}
-
-void PingPong::checkResult()
-{
- if (m_resultRight < 10 && m_resultLeft < 10)
- return;
-
- if (m_resultRight == 10 && m_role == 2) {
- setMessage("Game over. You win! Next game starts in 10s");
- }
- else if (m_resultRight == 10 && m_role == 1) {
- setMessage("Game over. You lose! Next game starts in 10s");
- }
- else if (m_resultLeft == 10 && m_role == 1) {
- setMessage("Game over. You win! Next game starts in 10s");
- }
- else if (m_resultLeft == 10 && m_role == 2) {
- setMessage("Game over. You lose! Next game starts in 10s");
- }
- m_timer->stop();
- QTimer::singleShot(10000, this, &PingPong::startGame);
-}
-
-void PingPong::startServer()
-{
- setMessage(QStringLiteral("Starting the server"));
-
- // make discoverable
- QBluetoothLocalDevice().setHostMode(QBluetoothLocalDevice::HostDiscoverable);
-
- //! [Starting the server]
- m_serverInfo = new QBluetoothServer(QBluetoothServiceInfo::RfcommProtocol, this);
- connect(m_serverInfo, &QBluetoothServer::newConnection,
- this, &PingPong::clientConnected);
- connect(m_serverInfo, &QBluetoothServer::errorOccurred, this, &PingPong::serverError);
- const QBluetoothUuid uuid(serviceUuid);
-
- m_serviceInfo = m_serverInfo->listen(uuid, QStringLiteral("PingPong server"));
- //! [Starting the server]
- if (m_serviceInfo.isValid()) {
- setMessage(QStringLiteral("Server started, waiting for the client."
- "You are the left player."));
- }
- // m_role is set to 1 if it is a server
- m_role = 1;
- emit roleChanged();
-}
-
-void PingPong::startClient()
-{
- //! [Searching for the service]
- discoveryAgent = new QBluetoothServiceDiscoveryAgent(QBluetoothAddress());
-
- connect(discoveryAgent, &QBluetoothServiceDiscoveryAgent::serviceDiscovered,
- this, &PingPong::addService);
- connect(discoveryAgent, &QBluetoothServiceDiscoveryAgent::finished,
- this, &PingPong::done);
- connect(discoveryAgent, &QBluetoothServiceDiscoveryAgent::errorOccurred, this,
- &PingPong::serviceScanError);
-#ifdef Q_OS_ANDROID
- // QTBUG-61392
- discoveryAgent->setUuidFilter(QBluetoothUuid(androidUuid));
-#else
- discoveryAgent->setUuidFilter(QBluetoothUuid(serviceUuid));
-#endif
- discoveryAgent->start(QBluetoothServiceDiscoveryAgent::FullDiscovery);
-
- //! [Searching for the service]
- if (discoveryAgent->error() == QBluetoothServiceDiscoveryAgent::NoError)
- setMessage(QStringLiteral("Starting server discovery. You are the right player"));
- // m_role is set to 2 if it is a client
- m_role = 2;
- emit roleChanged();
-}
-
-void PingPong::clientConnected()
-{
- //! [Initiating server socket]
- if (!m_serverInfo->hasPendingConnections()) {
- setMessage("FAIL: expected pending server connection");
- return;
- }
- socket = m_serverInfo->nextPendingConnection();
- if (!socket)
- return;
- socket->setParent(this);
- connect(socket, &QBluetoothSocket::readyRead,
- this, &PingPong::readSocket);
- connect(socket, &QBluetoothSocket::disconnected,
- this, &PingPong::clientDisconnected);
- connect(socket, &QBluetoothSocket::errorOccurred, this, &PingPong::socketError);
-
- //! [Initiating server socket]
- setMessage(QStringLiteral("Client connected. Get ready!"));
- QTimer::singleShot(3000, this, &PingPong::startGame);
-}
-
-void PingPong::clientDisconnected()
-{
- setMessage(QStringLiteral("Client disconnected"));
- m_timer->stop();
-}
-
-void PingPong::socketError(QBluetoothSocket::SocketError error)
-{
- Q_UNUSED(error);
- m_timer->stop();
-}
-
-void PingPong::serverError(QBluetoothServer::Error error)
-{
- setMessage(QStringLiteral("Server error occurred: ") + QVariant::fromValue(error).toString());
- m_timer->stop();
-}
-
-void PingPong::done()
-{
- qDebug() << "Service scan done";
- if (!m_serviceFound && discoveryAgent->error() == QBluetoothServiceDiscoveryAgent::NoError)
- setMessage("PingPong service not found");
-}
-
-void PingPong::addService(const QBluetoothServiceInfo &service)
-{
- if (m_serviceFound)
- return;
- m_serviceFound = true;
-
- setMessage("Service found. Stopping discovery and creating connection...");
- discoveryAgent->stop();
- //! [Connecting the socket]
- socket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol);
- socket->connectToService(service);
-
- connect(socket, &QBluetoothSocket::readyRead, this, &PingPong::readSocket);
- connect(socket, &QBluetoothSocket::connected, this, &PingPong::serverConnected);
- connect(socket, &QBluetoothSocket::disconnected, this, &PingPong::serverDisconnected);
- //! [Connecting the socket]
-}
-
-void PingPong::serviceScanError(QBluetoothServiceDiscoveryAgent::Error error)
-{
- Q_UNUSED(error);
- setMessage(QStringLiteral("Scanning error: ") + discoveryAgent->errorString());
-}
-
-bool PingPong::showDialog() const
-{
- return m_showDialog;
-}
-
-QString PingPong::message() const
-{
- return m_message;
-}
-
-void PingPong::serverConnected()
-{
- setMessage("Server Connected. Get ready!");
- QTimer::singleShot(3000, this, &PingPong::startGame);
-}
-
-void PingPong::serverDisconnected()
-{
- setMessage("Server Disconnected");
- m_timer->stop();
-}
-
-void PingPong::readSocket()
-{
- if (!socket)
- return;
- const char sep = ' ';
- QByteArray line;
- while (socket->canReadLine()) {
- line = socket->readLine();
- //qDebug() << QString::fromUtf8(line.constData(), line.length());
- if (line.contains("result")) {
- QList<QByteArray> result = line.split(sep);
- if (result.size() > 2) {
- QByteArray leftSide = result.at(1);
- QByteArray rightSide = result.at(2);
- m_resultLeft = leftSide.toInt();
- m_resultRight = rightSide.toInt();
- emit resultChanged();
- checkResult();
- }
- }
- }
- if (m_role == 1) {
- QList<QByteArray> boardSize = line.split(sep);
- if (boardSize.size() > 1) {
- QByteArray rightBlockY = boardSize.at(0);
- m_rightBlockY = rightBlockY.toFloat();
- emit rightBlockChanged();
- }
- } else if (m_role == 2) {
- QList<QByteArray> boardSize = line.split(sep);
- if (boardSize.size() > 2) {
- QByteArray ballX = boardSize.at(0);
- QByteArray ballY = boardSize.at(1);
- QByteArray leftBlockY = boardSize.at(2);
- m_ballX = ballX.toFloat();
- m_ballY = ballY.toFloat();
- m_leftBlockY = leftBlockY.toFloat();
- emit leftBlockChanged();
- emit ballChanged();
- }
- }
-}
-
-void PingPong::setMessage(const QString &message)
-{
- m_showDialog = true;
- m_message = message;
- emit showDialogChanged();
-}
-
-int PingPong::role() const
-{
- return m_role;
-}
-
-int PingPong::leftResult() const
-{
- return m_resultLeft;
-}
-
-int PingPong::rightResult() const
-{
- return m_resultRight;
-}
-
-float PingPong::ballX() const
-{
- return m_ballX;
-}
-
-float PingPong::ballY() const
-{
- return m_ballY;
-}
-
-
-float PingPong::leftBlockY() const
-{
- return m_leftBlockY;
-}
-
-float PingPong::rightBlockY() const
-{
- return m_rightBlockY;
-}