Signals and slots prepared to update content, received from UDP packet

This commit is contained in:
Ollo 2023-08-15 14:38:39 +02:00
parent 3a71ee786e
commit 536779910e
4 changed files with 55 additions and 11 deletions

View File

@ -14,8 +14,12 @@ MainWindow::MainWindow(QWidget *parent)
this->server = new UdpLedServer (); this->server = new UdpLedServer ();
this->mOffscreenPanel = new QImage(DEFAULT_WIDTH + LED_DISTANCE, DEFAULT_HEIGHT + LED_DISTANCE, QImage::Format_RGB32); this->mOffscreenPanel = new QImage(DEFAULT_WIDTH + LED_DISTANCE, DEFAULT_HEIGHT + LED_DISTANCE, QImage::Format_RGB32);
this->renderPanel(); for(int x=0; x < (PANEL_WIDTH * MAXIMUM_PANELSIZE); x++) {
this->drawImage(this->mOffscreenPanel); for(int y=0; y < PANEL_HEIGHT; y++) {
setLED(x, y);
}
}
updatePanel();
} }
MainWindow::~MainWindow() MainWindow::~MainWindow()
@ -34,17 +38,21 @@ void MainWindow::drawImage(QImage *target) {
this->ui->ledPanel->addWidget(graphicsView); this->ui->ledPanel->addWidget(graphicsView);
} }
void MainWindow::renderPanel(void) {
this->mOffscreenPanel->fill(COLOR_BACKGROUND);
void MainWindow::setLED(uint8_t x, uint8_t y) {
/* draw inital screen */ /* draw inital screen */
QPainter painter(this->mOffscreenPanel); QPainter painter(this->mOffscreenPanel);
painter.setRenderHint(QPainter::Antialiasing, true); painter.setRenderHint(QPainter::Antialiasing, true);
painter.setPen(QPen(COLOR_FOREGROUND, 1)); painter.setPen(QPen(COLOR_FOREGROUND, 1));
painter.setBrush(COLOR_FOREGROUND); painter.setBrush(COLOR_FOREGROUND);
for(int x=0; x < (PANEL_WIDTH * MAXIMUM_PANELSIZE); x++) {
for(int y=0; y < PANEL_HEIGHT; y++) {
painter.drawEllipse(LED_DIAMETER/2 + (x* LED_DISTANCE), LED_DIAMETER/2 + (y * LED_DISTANCE), LED_DIAMETER, LED_DIAMETER); painter.drawEllipse(LED_DIAMETER/2 + (x* LED_DISTANCE), LED_DIAMETER/2 + (y * LED_DISTANCE), LED_DIAMETER, LED_DIAMETER);
} }
}
void MainWindow::updatePanel(void) {
this->drawImage(this->mOffscreenPanel);
this->renderPanel();
}
void MainWindow::renderPanel(void) {
this->mOffscreenPanel->fill(COLOR_BACKGROUND);
} }

View File

@ -22,6 +22,10 @@ public:
MainWindow(QWidget *parent = nullptr); MainWindow(QWidget *parent = nullptr);
~MainWindow(); ~MainWindow();
public slots:
void setLED(uint8_t x, uint8_t y);
void updatePanel(void);
private: private:
Ui::MainWindow *ui; Ui::MainWindow *ui;
UdpLedServer *server; UdpLedServer *server;

View File

@ -2,6 +2,7 @@
#include "settings.h" #include "settings.h"
#include <QUdpSocket> #include <QUdpSocket>
#include <QNetworkDatagram> #include <QNetworkDatagram>
#include "mainwindow.h"
#define UDP_IMAGE_PORT 4242 #define UDP_IMAGE_PORT 4242
@ -9,6 +10,15 @@ UdpLedServer ::UdpLedServer (QObject *parent)
: QObject(parent) : QObject(parent)
{ {
initSocket(); initSocket();
connect(this,
&UdpLedServer::changeLEDstate,
(MainWindow*) parent,
&MainWindow::setLED);
connect(this,
&UdpLedServer::updatePanelContent,
(MainWindow*) parent,
&MainWindow::updatePanel);
} }
void UdpLedServer ::initSocket() void UdpLedServer ::initSocket()
@ -31,6 +41,25 @@ void UdpLedServer ::readPendingDatagrams()
void UdpLedServer::processTheDatagram(QNetworkDatagram datagram) { void UdpLedServer::processTheDatagram(QNetworkDatagram datagram) {
if (datagram.isValid() && datagram.data().length() == PACKET_LENGTH) { if (datagram.isValid() && datagram.data().length() == PACKET_LENGTH) {
qDebug() << "Received datagram:" << datagram.data().size(); uint8_t brightness = datagram.data().at(PACKET_INDEX_BRIGHTNESS);
int currentIndex = PACKET_INDEX_PANEL0;
uint16_t mask = 1;
for(int x=0; x < (PANEL_WIDTH * MAXIMUM_PANELSIZE); x++) {
for(int y=0; y < PANEL_HEIGHT; y++) {
if (datagram.data().at(currentIndex) & mask) {
this->changeLEDstate(x, y);
}
mask = (mask << 1);
if (mask >= 256) {
mask = 1;
currentIndex++;
}
}
}
this->updatePanelContent();
qDebug() << "Received datagram:" << brightness;
} }
} }

View File

@ -11,12 +11,15 @@ class UdpLedServer : public QObject
public: public:
explicit UdpLedServer (QObject *parent = nullptr); explicit UdpLedServer (QObject *parent = nullptr);
private: private:
void initSocket(); void initSocket();
void readPendingDatagrams(); void readPendingDatagrams();
QUdpSocket *mUdpSocket; QUdpSocket *mUdpSocket;
void processTheDatagram(QNetworkDatagram datagram); void processTheDatagram(QNetworkDatagram datagram);
signals:
void changeLEDstate(uint8_t x, uint8_t y);
void updatePanelContent(void);
}; };
#endif // UDPSERVER_H #endif // UDPSERVER_H