Projekt

Obecné

Profil

Stáhnout (5.69 KB) Statistiky
| Větev: | Tag: | Revize:
1
#include "curvedataserver.h"
2

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

    
7
static QByteArray message8(uint16_t messageId, uint8_t content = 0) {
8
    QByteArray result(2 + 1, 0);
9
    result[0] = ((uint8_t*) &messageId)[0];
10
    result[1] = ((uint8_t*) &messageId)[1];
11
    result[2] = content;
12
    return result;
13
}
14

    
15
static QByteArray message16(uint16_t messageId, uint16_t content = 0) {
16
    QByteArray result(2 + 2, 0);
17
    result[0] = ((uint8_t*) &messageId)[0];
18
    result[1] = ((uint8_t*) &messageId)[1];
19
    result[2] = ((uint8_t*) &content)[0];
20
    result[3] = ((uint8_t*) &content)[1];
21
    return result;
22
}
23

    
24
static QByteArray message32(uint16_t messageId, uint32_t content = 0) {
25
    QByteArray result(2 + 4, 0);
26
    result[0] = ((uint8_t*) &messageId)[0];
27
    result[1] = ((uint8_t*) &messageId)[1];
28
    result[2] = ((uint8_t*) &content)[0];
29
    result[3] = ((uint8_t*) &content)[1];
30
    result[4] = ((uint8_t*) &content)[2];
31
    result[5] = ((uint8_t*) &content)[3];
32
    return result;
33
}
34

    
35
static QByteArray message64(uint16_t messageId, uint64_t content = 0) {
36
    QByteArray result(2 + 8, 0);
37
    result[0] = ((uint8_t*) &messageId)[0];
38
    result[1] = ((uint8_t*) &messageId)[1];
39
    result[2] = ((uint8_t*) &content)[0];
40
    result[3] = ((uint8_t*) &content)[1];
41
    result[4] = ((uint8_t*) &content)[2];
42
    result[5] = ((uint8_t*) &content)[3];
43
    result[6] = ((uint8_t*) &content)[4];
44
    result[7] = ((uint8_t*) &content)[5];
45
    result[8] = ((uint8_t*) &content)[6];
46
    result[9] = ((uint8_t*) &content)[7];
47
    return result;
48
}
49

    
50
static QByteArray message128(uint16_t messageId,
51
                             uint32_t contentX = 0,
52
                             uint32_t contentY = 0,
53
                             uint32_t contentZ = 0,
54
                             uint32_t contentW = 0)
55
{
56
    QByteArray result(2 + 16, 0);
57
    result[0] = ((uint8_t*) &messageId)[0];
58
    result[1] = ((uint8_t*) &messageId)[1];
59

    
60
    result[2] = ((uint8_t*) &contentX)[0];
61
    result[3] = ((uint8_t*) &contentX)[1];
62
    result[4] = ((uint8_t*) &contentX)[2];
63
    result[5] = ((uint8_t*) &contentX)[3];
64

    
65
    result[6] = ((uint8_t*) &contentY)[0];
66
    result[7] = ((uint8_t*) &contentY)[1];
67
    result[8] = ((uint8_t*) &contentY)[2];
68
    result[9] = ((uint8_t*) &contentY)[3];
69

    
70
    result[10] = ((uint8_t*) &contentZ)[0];
71
    result[11] = ((uint8_t*) &contentZ)[1];
72
    result[12] = ((uint8_t*) &contentZ)[2];
73
    result[13] = ((uint8_t*) &contentZ)[3];
74

    
75
    result[14] = ((uint8_t*) &contentW)[0];
76
    result[15] = ((uint8_t*) &contentW)[1];
77
    result[16] = ((uint8_t*) &contentW)[2];
78
    result[17] = ((uint8_t*) &contentW)[3];
79
    return result;
80
}
81

    
82
static QByteArray messageVarLength(uint16_t messageId, uint32_t length) {
83
    QByteArray result(2 + 4 + length, 0);
84
    result[0] = ((uint8_t*) &messageId)[0];
85
    result[1] = ((uint8_t*) &messageId)[1];
86
    result[2] = ((uint8_t*) &length)[0];
87
    result[3] = ((uint8_t*) &length)[1];
88
    result[4] = ((uint8_t*) &length)[2];
89
    result[5] = ((uint8_t*) &length)[3];
90
    return result;
91
}
92

    
93
CurveDataServer::CurveDataServer() :
94
    _server(this),
95
    _sockets()
96
{
97
    _server.listen(QHostAddress::Any, 4242);
98
    connect(&_server, SIGNAL(newConnection()), this, SLOT(onNewConnection()));
99
}
100

    
101
void CurveDataServer::onNewConnection()
102
{
103
    QTcpSocket *clientSocket = _server.nextPendingConnection();
104
    connect(clientSocket, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
105
    connect(clientSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(onSocketStateChanged(QAbstractSocket::SocketState)));
106

    
107
    _sockets.push_back(clientSocket);
108

    
109
    sendPreamble(clientSocket);
110
}
111

    
112
void CurveDataServer::onSocketStateChanged(QAbstractSocket::SocketState socketState)
113
{
114
    if (socketState == QAbstractSocket::UnconnectedState)
115
    {
116
        QTcpSocket* sender = static_cast<QTcpSocket*>(QObject::sender());
117
        _sockets.removeOne(sender);
118
    }
119
}
120

    
121
void CurveDataServer::onReadyRead()
122
{
123
    // tady actually nakonec switch zpracovani ruznych zprav dle identifikatoru
124
    QTcpSocket* sender = static_cast<QTcpSocket*>(QObject::sender());
125
    QByteArray data = sender->readAll();
126
    for (QTcpSocket* socket : _sockets) {
127
        if (socket != sender)
128
            socket->write(QByteArray::fromStdString(sender->peerAddress().toString().toStdString() + ": " + data.toStdString()));
129
    }
130
}
131

    
132
QByteArray *CurveDataServer::putFloatIntoMessage(QByteArray *message, int index, float f)
133
{
134
    if (!message || message->size() < index + 4)
135
        return message;
136

    
137
    unsigned char *c = reinterpret_cast<unsigned char *>(&f);
138

    
139
    for (int i = 0; i < 4; i++)
140
    {
141
        (*message)[index + i] = c[i];
142
    }
143

    
144
    return message;
145
}
146

    
147

    
148
void CurveDataServer::sendActuatorPosition(float x, float y, float z)
149
{
150
    QByteArray message = message128(0x4003,
151
                                    *((uint32_t*) &x),
152
                                    *((uint32_t*) &y),
153
                                    *((uint32_t*) &z));
154

    
155
    for (QTcpSocket* socket : _sockets) {
156
            socket->write(message);
157
    }
158
    //qDebug() << message.toHex();
159
    //qDebug() << x << " " << y << " " << z;
160
}
161

    
162

    
163
void CurveDataServer::sendPreamble(QTcpSocket *socket)
164
{
165
    sendProtocolMagic(socket);
166
    sendVersion(socket);
167
}
168

    
169
void CurveDataServer::sendProtocolMagic(QTcpSocket *socket)
170
{
171
    char *messageContent = "DeltaRVr";
172
    QByteArray message = message64(0x3001, *((uint64_t*) messageContent));
173

    
174
    socket->write(message);
175

    
176
    qDebug() << "Sent Protocol Magic to" << socket->peerAddress();
177
    //qDebug() << message.toHex();
178
}
179

    
180
void CurveDataServer::sendVersion(QTcpSocket *socket)
181
{
182
    QByteArray message = message32(0x2002, 1);
183

    
184
    socket->write(message);
185

    
186
    qDebug() << "Sent Protocol Version to" << socket->peerAddress();
187
    //qDebug() << message.toHex();
188
}
(2-2/19)