Commit 81bee1ec404df2ebd4ced30537aab469c8f07dbd

Authored by 김태훈
1 parent d5dc2c4f41
Exists in master and in 2 other branches fhd, fhd-demo

원격 패킷 출력 프로그램 추가

app/gui/oven_control/udphandler.cpp
... ... @@ -2,7 +2,7 @@
2 2  
3 3 #include <QtDebug>
4 4  
5   -#define IPC_UDP_SYS_HOST "192.168.2.110"
  5 +#define IPC_UDP_SYS_HOST "127.0.0.1"
6 6 #define IPC_UDP_SYS_PORT 4001
7 7 #define IPC_UDP_GUI_PORT 4000
8 8  
... ... @@ -45,6 +45,8 @@ void UdpHandler::readPendingDatagrams()
45 45  
46 46 void UdpHandler::processDatagram(QByteArray &datagram)
47 47 {
  48 + qDebug() << "Received";
  49 + sock->writeDatagram(datagram, QHostAddress("192.168.4.191"), 4000);
48 50 packet_t *packet = (packet_t *) datagram.data();
49 51 switch (packet->header)
50 52 {
... ...
app/gui/packet/main.cpp
... ... @@ -0,0 +1,11 @@
  1 +#include "mainwindow.h"
  2 +#include <QApplication>
  3 +
  4 +int main(int argc, char *argv[])
  5 +{
  6 + QApplication a(argc, argv);
  7 + MainWindow w;
  8 + w.show();
  9 +
  10 + return a.exec();
  11 +}
... ...
app/gui/packet/mainwindow.cpp
... ... @@ -0,0 +1,130 @@
  1 +#include "mainwindow.h"
  2 +#include "ui_mainwindow.h"
  3 +
  4 +#include <QTableWidgetItem>
  5 +
  6 +#include "tablevalue.h"
  7 +
  8 +typedef struct {
  9 + int header;
  10 + char body[];
  11 +} STRUCT_PACK packet_t;
  12 +
  13 +MainWindow::MainWindow(QWidget *parent) :
  14 + QMainWindow(parent),
  15 + ui(new Ui::MainWindow)
  16 +{
  17 + ui->setupUi(this);
  18 + sock = new QUdpSocket(this);
  19 + if (!sock->bind(4000))
  20 + exit(EXIT_FAILURE);
  21 +
  22 + connect(sock, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams()));
  23 +
  24 + ui->controlTable->setRowCount(sizeof(oven_control_t) / sizeof(U16));
  25 + ui->controlTable->setColumnCount(3);
  26 + ui->controlTable->setHorizontalHeaderLabels(QString("Address,Value,Description").split(","));
  27 +
  28 + for (int row = 0; row < ui->controlTable->rowCount(); row++)
  29 + {
  30 + ui->controlTable->setItem(row, 0, new QTableWidgetItem(QString("").sprintf("0x%04X", row)));
  31 +
  32 + TableValue *item = new TableValue;
  33 + item->setText("0x0000");
  34 + ui->controlTable->setCellWidget(row, 1, item);
  35 + }
  36 +
  37 + ui->stateTable->setRowCount(sizeof(oven_state_t) / sizeof(U16));
  38 + ui->stateTable->setColumnCount(3);
  39 + ui->stateTable->setHorizontalHeaderLabels(QString("Address,Value,Description").split(","));
  40 +
  41 + for (int row = 0; row < ui->stateTable->rowCount(); row++)
  42 + {
  43 + ui->stateTable->setItem(row, 0, new QTableWidgetItem(QString().sprintf("0x%04X", row)));
  44 +
  45 + TableValue *item = new TableValue;
  46 + item->setText("0x0000");
  47 + ui->stateTable->setCellWidget(row, 1, item);
  48 + }
  49 +}
  50 +
  51 +MainWindow::~MainWindow()
  52 +{
  53 + delete ui;
  54 +}
  55 +
  56 +void MainWindow::readPendingDatagrams()
  57 +{
  58 + while (sock->hasPendingDatagrams()) {
  59 + QByteArray datagram;
  60 + datagram.resize(sock->pendingDatagramSize());
  61 + QHostAddress sender;
  62 + quint16 senderPort;
  63 +
  64 + sock->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);
  65 +
  66 + processDatagram(datagram);
  67 + }
  68 +}
  69 +
  70 +void MainWindow::processDatagram(QByteArray &datagram)
  71 +{
  72 + packet_t *packet = (packet_t *) datagram.data();
  73 + switch (packet->header)
  74 + {
  75 + case HDR_OVEN_CONTROL:
  76 + processControl((oven_control_t *) packet->body);
  77 + break;
  78 + case HDR_OVEN_STATE:
  79 + processState((oven_state_t *) packet->body);
  80 + break;
  81 + case HDR_ERROR_CODE:
  82 + break;
  83 + }
  84 +}
  85 +
  86 +void MainWindow::processControl(oven_control_t *control)
  87 +{
  88 + if (memcmp(&this->control, control, sizeof(this->control)))
  89 + updateControl(control);
  90 +}
  91 +
  92 +void MainWindow::processState(oven_state_t *state)
  93 +{
  94 + if (memcmp(&this->state, state, sizeof(this->state)))
  95 + updateState(state);
  96 +}
  97 +
  98 +void MainWindow::updateControl(oven_control_t *control)
  99 +{
  100 + U16 *base = (U16 *) &this->control;
  101 + U16 *operand = (U16 *) control;
  102 + for (int row = 0; row < ui->controlTable->rowCount(); row++)
  103 + {
  104 + U16 b = *(base + row);
  105 + U16 o = *(operand + row);
  106 + if (b != o)
  107 + {
  108 + *(base + row) = o;
  109 + TableValue *val = (TableValue *) ui->controlTable->cellWidget(row, 1);
  110 + val->setText(QString().sprintf("0x%04X", o));
  111 + }
  112 + }
  113 +}
  114 +
  115 +void MainWindow::updateState(oven_state_t *state)
  116 +{
  117 + U16 *base = (U16 *) &this->state;
  118 + U16 *operand = (U16 *) state;
  119 + for (int row = 0; row < ui->stateTable->rowCount(); row++)
  120 + {
  121 + U16 b = *(base + row);
  122 + U16 o = *(operand + row);
  123 + if (b != o)
  124 + {
  125 + *(base + row) = o;
  126 + TableValue *val = (TableValue *) ui->stateTable->cellWidget(row, 1);
  127 + val->setText(QString().sprintf("0x%04X", o));
  128 + }
  129 + }
  130 +}
... ...
app/gui/packet/mainwindow.h
... ... @@ -0,0 +1,36 @@
  1 +#ifndef MAINWINDOW_H
  2 +#define MAINWINDOW_H
  3 +
  4 +#include <QMainWindow>
  5 +#include <QUdpSocket>
  6 +
  7 +#include "../oven_control/all_share.h"
  8 +
  9 +namespace Ui {
  10 +class MainWindow;
  11 +}
  12 +
  13 +class MainWindow : public QMainWindow
  14 +{
  15 + Q_OBJECT
  16 +
  17 +public:
  18 + explicit MainWindow(QWidget *parent = 0);
  19 + ~MainWindow();
  20 +
  21 +private:
  22 + Ui::MainWindow *ui;
  23 + QUdpSocket *sock;
  24 + oven_control_t control;
  25 + oven_state_t state;
  26 +
  27 +private slots:
  28 + void readPendingDatagrams();
  29 + void processDatagram(QByteArray &datagram);
  30 + void processControl(oven_control_t *control);
  31 + void processState(oven_state_t *state);
  32 + void updateControl(oven_control_t *control);
  33 + void updateState(oven_state_t *state);
  34 +};
  35 +
  36 +#endif // MAINWINDOW_H
... ...
app/gui/packet/mainwindow.ui
... ... @@ -0,0 +1,30 @@
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<ui version="4.0">
  3 + <class>MainWindow</class>
  4 + <widget class="QMainWindow" name="MainWindow">
  5 + <property name="geometry">
  6 + <rect>
  7 + <x>0</x>
  8 + <y>0</y>
  9 + <width>818</width>
  10 + <height>300</height>
  11 + </rect>
  12 + </property>
  13 + <property name="windowTitle">
  14 + <string>Data Viewer</string>
  15 + </property>
  16 + <widget class="QWidget" name="centralWidget">
  17 + <layout class="QHBoxLayout" name="horizontalLayout">
  18 + <item>
  19 + <widget class="QTableWidget" name="controlTable"/>
  20 + </item>
  21 + <item>
  22 + <widget class="QTableWidget" name="stateTable"/>
  23 + </item>
  24 + </layout>
  25 + </widget>
  26 + </widget>
  27 + <layoutdefault spacing="6" margin="11"/>
  28 + <resources/>
  29 + <connections/>
  30 +</ui>
... ...
app/gui/packet/packet.pro
... ... @@ -0,0 +1,22 @@
  1 +#-------------------------------------------------
  2 +#
  3 +# Project created by QtCreator 2017-03-03T21:21:48
  4 +#
  5 +#-------------------------------------------------
  6 +
  7 +QT += core gui network
  8 +
  9 +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
  10 +
  11 +TARGET = packet
  12 +TEMPLATE = app
  13 +
  14 +
  15 +SOURCES += main.cpp\
  16 + mainwindow.cpp \
  17 + tablevalue.cpp
  18 +
  19 +HEADERS += mainwindow.h \
  20 + tablevalue.h
  21 +
  22 +FORMS += mainwindow.ui
... ...
app/gui/packet/tablevalue.cpp
... ... @@ -0,0 +1,34 @@
  1 +#include "tablevalue.h"
  2 +
  3 +#include <QColor>
  4 +
  5 +#include <QtDebug>
  6 +
  7 +void TableValue::setText(const QString &str)
  8 +{
  9 + QLabel::setText(str);
  10 + timer.start(2000);
  11 + animationTimer.start(33);
  12 +
  13 + updateColor();
  14 +}
  15 +
  16 +void TableValue::updateColor()
  17 +{
  18 + int remain = timer.remainingTime();
  19 + if (remain < 0)
  20 + remain = 0;
  21 +
  22 + if (remain > 2000)
  23 + remain = 2000;
  24 +
  25 + qreal percentage = ((qreal) remain / 2000) * 0.5;
  26 + int b = 255 * percentage;
  27 + if (b < 0)
  28 + b = 0;
  29 +
  30 + if (b > 255)
  31 + b = 255;
  32 +
  33 + setStyleSheet(QString().sprintf("background-color: rgba(255, 0, 0, %d); color: rgb(0, 0, 0)", b));
  34 +}
... ...
app/gui/packet/tablevalue.h
... ... @@ -0,0 +1,33 @@
  1 +#ifndef TABLEVALUE_H
  2 +#define TABLEVALUE_H
  3 +
  4 +#include <QObject>
  5 +#include <QWidget>
  6 +#include <QLabel>
  7 +#include <QTableWidgetItem>
  8 +#include <QTimer>
  9 +
  10 +class TableValue : public QLabel
  11 +{
  12 + Q_OBJECT
  13 +
  14 +public:
  15 + explicit TableValue()
  16 + {
  17 + timer.setSingleShot(true);
  18 + connect(&animationTimer, SIGNAL(timeout()), this, SLOT(updateColor()));
  19 + connect(&timer, SIGNAL(timeout()), &animationTimer, SLOT(stop()));
  20 + connect(&timer, SIGNAL(timeout()), this, SLOT(updateColor()));
  21 + }
  22 +
  23 + void setText(const QString &text);
  24 +
  25 +private:
  26 + QTimer timer;
  27 + QTimer animationTimer;
  28 +
  29 +private slots:
  30 + void updateColor();
  31 +};
  32 +
  33 +#endif // TABLEVALUE_H
... ...