Projekt

Obecné

Profil

« Předchozí | Další » 

Revize 681d1a97

Přidáno uživatelem Jakub Hejman před téměř 4 roky(ů)

Re #8629 - Server skeleton implementation

Zobrazit rozdíly:

deltarobot/curvedataserver.cpp
1
#include "curvedataserver.h"
2

  
3
#include <QDebug>
4
#include <QHostAddress>
5
#include <QAbstractSocket>
6

  
7
CurveDataServer::CurveDataServer() :
8
    _server(this),
9
    _sockets()
10
{
11
    _server.listen(QHostAddress::Any, 4242);
12
    connect(&_server, SIGNAL(newConnection()), this, SLOT(onNewConnection()));
13
}
14

  
15
CurveDataServer::~CurveDataServer()
16
{
17
    // asi vlastne neni co
18
}
19

  
20
void CurveDataServer::onNewConnection()
21
{
22
    QTcpSocket *clientSocket = _server.nextPendingConnection();
23
    connect(clientSocket, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
24
    connect(clientSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(onSocketStateChanged(QAbstractSocket::SocketState)));
25

  
26
    _sockets.push_back(clientSocket);
27
    for (QTcpSocket* socket : _sockets) {
28
        socket->write(QByteArray::fromStdString(clientSocket->peerAddress().toString().toStdString() + " connected to server !\n"));
29
    }
30
}
31

  
32
void CurveDataServer::onSocketStateChanged(QAbstractSocket::SocketState socketState)
33
{
34
    if (socketState == QAbstractSocket::UnconnectedState)
35
    {
36
        QTcpSocket* sender = static_cast<QTcpSocket*>(QObject::sender());
37
        _sockets.removeOne(sender);
38
    }
39
}
40

  
41
void CurveDataServer::onReadyRead()
42
{
43
    // tady actually nakonec switch zpracovani ruznych zprav dle identifikatoru
44
    QTcpSocket* sender = static_cast<QTcpSocket*>(QObject::sender());
45
    QByteArray data = sender->readAll();
46
    for (QTcpSocket* socket : _sockets) {
47
        if (socket != sender)
48
            socket->write(QByteArray::fromStdString(sender->peerAddress().toString().toStdString() + ": " + data.toStdString()));
49
    }
50
}
51

  
52
QByteArray *CurveDataServer::createMessageId(int sizeId, int typeId)
53
{
54
    QByteArray *id = new QByteArray();
55

  
56
    id->append((sizeId & 0x0F) << 4 + ((typeId & 0x0F00) >> 12));
57
    id->append(typeId & 0xFF);
58

  
59
    return id;
60
}
61
/*
62
QByteArray *CurveDataServer::appendFloatToMessage(QByteArray *message, float f)
63
{
64
    if (!message)
65
        return message;
66

  
67
    unsigned char *c = reinterpret_cast<unsigned char *>(&f);
68

  
69
    for (int i = 0; i < 4; i++)
70
    {
71
        message->append(c[3 - i]);
72
    }
73

  
74
    return message;
75
}
76
*/
77
QByteArray *CurveDataServer::putFloatIntoMessage(QByteArray *message, int index, float f)
78
{
79
    if (!message || message->size() < index + 4)
80
        return message;
81

  
82
    unsigned char *c = reinterpret_cast<unsigned char *>(&f);
83

  
84
    for (int i = 0; i < 4; i++)
85
    {
86
        (*message)[index + i] = c[i];
87
    }
88

  
89
    return message;
90
}
91

  
92

  
93
void CurveDataServer::sendApplicatorPoint(float x, float y, float z)
94
{
95
    QByteArray message(18, 0);
96
    message[0] = 0x40;
97
    message[1] = 0x03;
98

  
99
    putFloatIntoMessage(&message, 2, x);
100
    putFloatIntoMessage(&message, 6, y);
101
    putFloatIntoMessage(&message, 10, z);
102
    putFloatIntoMessage(&message, 14, 0.0);
103

  
104
    for (QTcpSocket* socket : _sockets) {
105
            socket->write(message);
106
    }
107
    qDebug() << message.toHex();
108
}
deltarobot/curvedataserver.h
1
#ifndef CURVEDATASERVER_H
2
#define CURVEDATASERVER_H
3

  
4
#include <QObject>
5
#include <QTcpServer>
6
#include <QTcpSocket>
7

  
8
class CurveDataServer : QObject
9
{
10
    Q_OBJECT
11

  
12
public:
13
    CurveDataServer();
14
    ~CurveDataServer();
15
    void sendApplicatorPoint(float x, float y, float z);
16

  
17
public slots:
18
    void onNewConnection();
19
    void onSocketStateChanged(QAbstractSocket::SocketState socketState);
20
    void onReadyRead();
21

  
22
private:
23
    QByteArray *createMessageId(int sizeId, int typId);
24
    //QByteArray *appendFloatToMessage(QByteArray *message, float f);
25
    QByteArray *putFloatIntoMessage(QByteArray *message, int index, float f);
26

  
27
    QTcpServer _server;
28
    QList<QTcpSocket*> _sockets;
29
};
30

  
31
#endif // CURVEDATASERVER_H
deltarobot/mainwindow.cpp
1 1
#include "mainwindow.h"
2 2
#include "curvedialog.h"
3 3
#include "infodialog.h"
4
#include "curvedataserver.h"
4 5
#include "selectpatientdlg.h"
5 6
#include "ui_mainwindow.h"
6 7
#include <QModbusTcpClient>
......
93 94

  
94 95
MainWindow::MainWindow(QWidget *parent) :
95 96
    QMainWindow(parent),
96
    ui(new Ui::MainWindow)
97
    ui(new Ui::MainWindow),
98
    cdServer(new CurveDataServer)
97 99
{
98 100
    ui->setupUi(this);
99 101

  
100 102
    mbClient = new QModbusTcpClient(this);
103

  
101 104
    pendingRead = pendingWrite = lastPacket = initStep = bSpeedUpdated = false;
102 105
    calcCurvePoints[0] = calcCurvePoints[1] = staticSpherePos = spherePos = QVector3D(0,0,0);
103 106
    dirArrow = QVector3D(0,0,0);
......
265 268
    }
266 269
    delete db;
267 270
    delete ui;
271
    delete cdServer;
268 272
}
269 273

  
270 274
//! Připojit/Odpojit modbus server
......
1067 1071
        connectionGuard->restart();
1068 1072
    }
1069 1073
#endif
1074
    cdServer->sendApplicatorPoint(spherePos.x(), spherePos.y(), spherePos.z());
1070 1075
}
1071 1076

  
1072 1077
//! Příjem dat ze stroje
deltarobot/mainwindow.h
7 7
#include "QsLog.h"
8 8
#include "../db_browser/dbaccess.h"
9 9

  
10
#include "curvedataserver.h"
11

  
10 12
#include <QFile>
11 13
#include <QTextStream>
12 14

  
......
98 100
    QModbusClient *mbClient;
99 101
    //! Databázové spojení
100 102
    dbAccess *db;
103

  
104
    //! TCP Server dat křivky
105
    CurveDataServer *cdServer;
106

  
101 107
    //! Status spojení s databází
102 108
    bool dbConnected;
103 109
    //! Proměnná obsahující info, má-li být databáze použita
deltarobot/modbusSlave.pro
4 4
#
5 5
#-------------------------------------------------
6 6

  
7
QT       += core gui serialbus opengl charts sql
7
QT       += core gui serialbus opengl charts sql network
8 8

  
9 9
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
10 10

  
......
31 31
}
32 32

  
33 33
SOURCES += \
34
    curvedataserver.cpp \
34 35
        main.cpp \
35 36
        mainwindow.cpp \
36 37
    curvedialog.cpp \
......
46 47
    selectpatientdlg.cpp
47 48

  
48 49
HEADERS += \
50
    curvedataserver.h \
49 51
        mainwindow.h \
50 52
    curvedialog.h \
51 53
    element/arrow.hpp \

Také k dispozici: Unified diff