Этот код принимает UDP пакеты и рисует из них картинку на экране в real-time.
1 и 2 байт в дейтграмме — номер строки.
Вычисляется по формуле: d[0]*256 + (unsigned char) d[1]
Конец пикселей в дейтограмме обозначен значением 255.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
#include <QtWidgets> #include <QtNetwork> #include <QTimer> #include <QDebug> #include "receiver.h" static QRgb sMass[260]; static int MAX_X = 425; // кол-во пикселей по X static int MAX_Y = 475; // кол-во строк в изображении static int DATA_OFFSET = 2 + 1; static int MIN_DATAGRAM_SIZE = DATA_OFFSET + MAX_X; // минимальное значение размера дейтаграмы Receiver::Receiver(QWidget *parent) : QWidget(parent) , mImage(MAX_X, MAX_Y, QImage::Format_RGB32) { // обновляем раз в секунду QTimer * timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(update())); timer->start(1000); // заполняем изображение и таблицу цветов mImage.fill(Qt::black); for (int count = 0; count < 256; ++count) { QRgb rgb; int r = 0; int g = 0; int b = 0; if((count>=0)&& (count<=60)) {g=3*count; r= 255; b = 0; } if((count>60)&& (count<=128)){g=255; r= 255- ((count- 60) * 3) ; b = 0;} if((count>128)&&(count<=191)){g=255; r= 0 ; b = (count- 128) * 3;} if((count>191)&&(count<=255)){g= 255- ((count-192) * 3); r =0; b = 255;} if (count == 256){r=255;g=255;b=255;} rgb = qRgb(r,g,b); sMass[count] = rgb; } setFixedSize(MAX_X, MAX_Y); setWindowTitle(tr("Broadcast Receiver")); // начинаем прослушивание сокета connect(&mUdpSocket, SIGNAL(readyRead()), this, SLOT(processPendingDatagrams())); mUdpSocket.bind(2221, QUdpSocket::ShareAddress); } // читаем дейтаграмы void Receiver::processPendingDatagrams() { QByteArray d; while (mUdpSocket.hasPendingDatagrams()) { d.resize(mUdpSocket.pendingDatagramSize()); mUdpSocket.readDatagram(d.data(), d.size()); // игнорируем непрвильную дейтаграму if (d.size() < MIN_DATAGRAM_SIZE) continue; // вычисляем номер строки int y = ((unsigned char)d[0]*256 + (unsigned char) d[1]); Q_ASSERT(y >= 0 && y < MAX_Y); // применяем пиксели этой строки for (int x = 0; x < MAX_X*2; x++) { if(x%2==0) {mImage.setPixel(MAX_X - x/2,MAX_Y/2 - y, sMass[(unsigned char) d[x+DATA_OFFSET] ]); } else {mImage.setPixel(x/2,MAX_Y/2 + y, sMass[ (unsigned char)d[x+DATA_OFFSET] ]);} } } } // перерисовка содержимого виджета void Receiver::paintEvent(QPaintEvent * event) { Q_UNUSED(event); QPainter painter(this); painter.drawImage(0, 0, mImage); } |

