Blame view

app/gui/packet/mainwindow.cpp 10.7 KB
81bee1ec4   김태훈   원격 패킷 출력 프로그램 추가
1
2
3
4
5
6
  #include "mainwindow.h"
  #include "ui_mainwindow.h"
  
  #include <QTableWidgetItem>
  
  #include "tablevalue.h"
81bee1ec4   김태훈   원격 패킷 출력 프로그램 추가
7
8
9
10
11
12
  MainWindow::MainWindow(QWidget *parent) :
      QMainWindow(parent),
      ui(new Ui::MainWindow)
  {
      ui->setupUi(this);
      sock = new QUdpSocket(this);
d7c3a65b4   김태훈   - 디버깅 포트 변경(4000 ...
13
      if (!sock->bind(40001))
81bee1ec4   김태훈   원격 패킷 출력 프로그램 추가
14
          exit(EXIT_FAILURE);
e77a367ac   김태훈   모드버스 주소 설명 추가
15
16
      bzero(&control, sizeof(control));
      bzero(&state, sizeof(state));
f97982552   김태훈   가상 UDP 패킷 전송 기능 추가
17
81bee1ec4   김태훈   원격 패킷 출력 프로그램 추가
18
19
20
      connect(sock, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams()));
  
      ui->controlTable->setRowCount(sizeof(oven_control_t) / sizeof(U16));
f97982552   김태훈   가상 UDP 패킷 전송 기능 추가
21
      ui->controlTable->setColumnCount(5);
26fa00c5f   김태훈   출력 형식 변경
22
      ui->controlTable->setHorizontalHeaderLabels(QString("Addr,Value,Value,Description").split(","));
81bee1ec4   김태훈   원격 패킷 출력 프로그램 추가
23
24
25
  
      for (int row = 0; row < ui->controlTable->rowCount(); row++)
      {
26fa00c5f   김태훈   출력 형식 변경
26
27
28
29
          QTableWidgetItem *witem = new QTableWidgetItem(QString("").sprintf("0x%04X", row));
          witem->setTextAlignment(Qt::AlignCenter);
  
          ui->controlTable->setItem(row, 0, witem);
81bee1ec4   김태훈   원격 패킷 출력 프로그램 추가
30
31
32
  
          TableValue *item = new TableValue;
          item->setText("0x0000");
26fa00c5f   김태훈   출력 형식 변경
33
34
          item->setMargin(3);
          item->setAlignment(Qt::AlignCenter);
81bee1ec4   김태훈   원격 패킷 출력 프로그램 추가
35
          ui->controlTable->setCellWidget(row, 1, item);
26fa00c5f   김태훈   출력 형식 변경
36
37
38
39
40
41
  
          item = new TableValue;
          item->setText("0");
          item->setMargin(3);
          item->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
          ui->controlTable->setCellWidget(row, 2, item);
81bee1ec4   김태훈   원격 패킷 출력 프로그램 추가
42
      }
26fa00c5f   김태훈   출력 형식 변경
43
44
      ui->controlTable->resizeColumnToContents(0);
      ui->controlTable->resizeColumnToContents(1);
81bee1ec4   김태훈   원격 패킷 출력 프로그램 추가
45
      ui->stateTable->setRowCount(sizeof(oven_state_t) / sizeof(U16));
f97982552   김태훈   가상 UDP 패킷 전송 기능 추가
46
      ui->stateTable->setColumnCount(5);
26fa00c5f   김태훈   출력 형식 변경
47
      ui->stateTable->setHorizontalHeaderLabels(QString("Addr,Value,Value,Description").split(","));
81bee1ec4   김태훈   원격 패킷 출력 프로그램 추가
48
49
50
  
      for (int row = 0; row < ui->stateTable->rowCount(); row++)
      {
26fa00c5f   김태훈   출력 형식 변경
51
52
53
          QTableWidgetItem *witem = new QTableWidgetItem(QString("").sprintf("0x%04X", row));
          witem->setTextAlignment(Qt::AlignCenter);
          ui->stateTable->setItem(row, 0, witem);
81bee1ec4   김태훈   원격 패킷 출력 프로그램 추가
54
55
56
  
          TableValue *item = new TableValue;
          item->setText("0x0000");
26fa00c5f   김태훈   출력 형식 변경
57
58
          item->setMargin(3);
          item->setAlignment(Qt::AlignCenter);
81bee1ec4   김태훈   원격 패킷 출력 프로그램 추가
59
          ui->stateTable->setCellWidget(row, 1, item);
26fa00c5f   김태훈   출력 형식 변경
60
61
62
63
64
65
  
          item = new TableValue;
          item->setText("0");
          item->setMargin(3);
          item->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
          ui->stateTable->setCellWidget(row, 2, item);
81bee1ec4   김태훈   원격 패킷 출력 프로그램 추가
66
      }
26fa00c5f   김태훈   출력 형식 변경
67
68
69
  
      ui->stateTable->resizeColumnToContents(0);
      ui->stateTable->resizeColumnToContents(1);
02f864212   김태훈   출력 번지 별 설명 추가
70
71
72
73
74
75
76
77
78
79
80
81
82
83
  
      ui->controlTable->setItem(0x05, 3, new QTableWidgetItem("Oven Mode"));
      ui->controlTable->setItem(0x06, 3, new QTableWidgetItem("Cook On/Off"));
      ui->controlTable->setItem(0x07, 3, new QTableWidgetItem("Wash On/Off"));
      ui->controlTable->setItem(0x08, 3, new QTableWidgetItem("System On/Off"));
      ui->controlTable->setItem(0x09, 3, new QTableWidgetItem("Temp"));
      ui->controlTable->setItem(0x0A, 3, new QTableWidgetItem("Humidity"));
      ui->controlTable->setItem(0x0B, 3, new QTableWidgetItem("Time"));
      ui->controlTable->setItem(0x0C, 3, new QTableWidgetItem("Preheat On/Off"));
  //    ui->controlTable->setItem(0x0D, 3, new QTableWidgetItem(""));
  //    ui->controlTable->setItem(0x0E, 3, new QTableWidgetItem(""));
      ui->controlTable->setItem(0x0F, 3, new QTableWidgetItem("Convection RPM"));
      ui->controlTable->setItem(0x10, 3, new QTableWidgetItem("Cool Down On/Off"));
      ui->controlTable->setItem(0x11, 3, new QTableWidgetItem("InterTemp"));
e77a367ac   김태훈   모드버스 주소 설명 추가
84
85
86
87
88
89
  //    ui->controlTable->setItem(0x12, 3, new QTableWidgetItem("InterTemp"));
  //    ui->controlTable->setItem(0x13, 3, new QTableWidgetItem("InterTemp"));
      ui->controlTable->setItem(0x14, 3, new QTableWidgetItem("Wash Type"));
      ui->controlTable->setItem(0x15, 3, new QTableWidgetItem("Wash Total"));
      ui->controlTable->setItem(0x16, 3, new QTableWidgetItem("Wash Steps"));
      ui->controlTable->setItem(0x17, 3, new QTableWidgetItem("Wash Step Type"));
02f864212   김태훈   출력 번지 별 설명 추가
90
91
92
93
94
95
96
97
98
99
100
101
102
  
      ui->stateTable->setItem(0x00, 3, new QTableWidgetItem("Firmware V"));
      ui->stateTable->setItem(0x01, 3, new QTableWidgetItem("Firmware Y"));
      ui->stateTable->setItem(0x02, 3, new QTableWidgetItem("Firmware M"));
      ui->stateTable->setItem(0x03, 3, new QTableWidgetItem("Firmware D"));
      ui->stateTable->setItem(0x04, 3, new QTableWidgetItem("Cook State"));
      ui->stateTable->setItem(0x05, 3, new QTableWidgetItem("Setting Temp"));
      ui->stateTable->setItem(0x06, 3, new QTableWidgetItem("Setting Humidity"));
      ui->stateTable->setItem(0x07, 3, new QTableWidgetItem("Setting Time"));
      ui->stateTable->setItem(0x08, 3, new QTableWidgetItem("Current Temp"));
      ui->stateTable->setItem(0x09, 3, new QTableWidgetItem("Current Humidity"));
      ui->stateTable->setItem(0x0A, 3, new QTableWidgetItem("Current Time"));
      ui->stateTable->setItem(0x0B, 3, new QTableWidgetItem("Wash State"));
e77a367ac   김태훈   모드버스 주소 설명 추가
103
104
      ui->stateTable->setItem(0x0C, 3, new QTableWidgetItem("Wash Type"));
      ui->stateTable->setItem(0x0D, 3, new QTableWidgetItem("Wash Steps"));
02f864212   김태훈   출력 번지 별 설명 추가
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
  //    ui->stateTable->setItem(0x0E, 3, new QTableWidgetItem("Oven Mode"));
  //    ui->stateTable->setItem(0x0F, 3, new QTableWidgetItem("Oven Mode"));
      ui->stateTable->setItem(0x10, 3, new QTableWidgetItem("Door Open/Close"));
  //    ui->stateTable->setItem(0x11, 3, new QTableWidgetItem("Oven Mode"));
      ui->stateTable->setItem(0x12, 3, new QTableWidgetItem("Burner 1"));
      ui->stateTable->setItem(0x13, 3, new QTableWidgetItem("Burner 2"));
      ui->stateTable->setItem(0x14, 3, new QTableWidgetItem("Burner 3"));
  //    ui->stateTable->setItem(0x15, 3, new QTableWidgetItem("Oven Mode"));
  //    ui->stateTable->setItem(0x16, 3, new QTableWidgetItem("Oven Mode"));
  //    ui->stateTable->setItem(0x17, 3, new QTableWidgetItem("Oven Mode"));
  //    ui->stateTable->setItem(0x18, 3, new QTableWidgetItem("Oven Mode"));
  //    ui->stateTable->setItem(0x19, 3, new QTableWidgetItem("Oven Mode"));
  //    ui->stateTable->setItem(0x1A, 3, new QTableWidgetItem("Burner 3"));
      ui->stateTable->setItem(0x1B, 3, new QTableWidgetItem("Sensor 1 Cab"));
      ui->stateTable->setItem(0x1C, 3, new QTableWidgetItem("Sensor 2"));
      ui->stateTable->setItem(0x1D, 3, new QTableWidgetItem("Sensor 3"));
      ui->stateTable->setItem(0x1E, 3, new QTableWidgetItem("Sensor 4"));
      ui->stateTable->setItem(0x1F, 3, new QTableWidgetItem("Sensor 5"));
      ui->stateTable->setItem(0x20, 3, new QTableWidgetItem("Sensor 6 Food 1"));
      ui->stateTable->setItem(0x21, 3, new QTableWidgetItem("Sensor 7 Food 2"));
      ui->stateTable->setItem(0x22, 3, new QTableWidgetItem("Sensor 8 Food 3"));
      ui->stateTable->setItem(0x23, 3, new QTableWidgetItem("Sensor 9 Food 4"));
      ui->stateTable->setItem(0x24, 3, new QTableWidgetItem("Sensor 10"));
      ui->stateTable->setItem(0x25, 3, new QTableWidgetItem("Sensor 11 mbar"));
      ui->stateTable->setItem(0x26, 3, new QTableWidgetItem("Sensor 12 mbar"));
      ui->stateTable->setItem(0x27, 3, new QTableWidgetItem("Sensor 13 PCB"));
      ui->stateTable->setItem(0x28, 3, new QTableWidgetItem("Sensor 14 ADC"));
      ui->stateTable->setItem(0x29, 3, new QTableWidgetItem("Sensor 15 Conv 1 RPM"));
      ui->stateTable->setItem(0x2A, 3, new QTableWidgetItem("Sensor 16 Burner 1 RPM"));
  
  
      ui->controlTable->resizeColumnToContents(3);
      ui->stateTable->resizeColumnToContents(3);
f97982552   김태훈   가상 UDP 패킷 전송 기능 추가
138
81bee1ec4   김태훈   원격 패킷 출력 프로그램 추가
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
  }
  
  MainWindow::~MainWindow()
  {
      delete ui;
  }
  
  void MainWindow::readPendingDatagrams()
  {
      while (sock->hasPendingDatagrams()) {
          QByteArray datagram;
          datagram.resize(sock->pendingDatagramSize());
          QHostAddress sender;
          quint16 senderPort;
  
          sock->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);
  
          processDatagram(datagram);
      }
  }
  
  void MainWindow::processDatagram(QByteArray &datagram)
  {
      packet_t *packet = (packet_t *) datagram.data();
      switch (packet->header)
      {
      case HDR_OVEN_CONTROL:
e77a367ac   김태훈   모드버스 주소 설명 추가
166
          qDebug() << "Received Control";
81bee1ec4   김태훈   원격 패킷 출력 프로그램 추가
167
168
169
          processControl((oven_control_t *) packet->body);
          break;
      case HDR_OVEN_STATE:
e77a367ac   김태훈   모드버스 주소 설명 추가
170
          qDebug() << "Received State";
81bee1ec4   김태훈   원격 패킷 출력 프로그램 추가
171
172
173
          processState((oven_state_t *) packet->body);
          break;
      case HDR_ERROR_CODE:
e77a367ac   김태훈   모드버스 주소 설명 추가
174
          qDebug() << "Received Error";
81bee1ec4   김태훈   원격 패킷 출력 프로그램 추가
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
          break;
      }
  }
  
  void MainWindow::processControl(oven_control_t *control)
  {
      if (memcmp(&this->control, control, sizeof(this->control)))
          updateControl(control);
  }
  
  void MainWindow::processState(oven_state_t *state)
  {
      if (memcmp(&this->state, state, sizeof(this->state)))
          updateState(state);
  }
  
  void MainWindow::updateControl(oven_control_t *control)
  {
      U16 *base = (U16 *) &this->control;
      U16 *operand = (U16 *) control;
      for (int row = 0; row < ui->controlTable->rowCount(); row++)
      {
e77a367ac   김태훈   모드버스 주소 설명 추가
197
          qDebug() << "Diff";
81bee1ec4   김태훈   원격 패킷 출력 프로그램 추가
198
199
200
201
202
203
          U16 b = *(base + row);
          U16 o = *(operand + row);
          if (b != o)
          {
              *(base + row) = o;
              TableValue *val = (TableValue *) ui->controlTable->cellWidget(row, 1);
a75fc5aca   김태훈   출력 형식 변경
204
205
206
207
              val->setText(QString().sprintf("0x%04X", o));
  
              val = (TableValue *) ui->controlTable->cellWidget(row, 2);
              val->setText(QString::number(o));
81bee1ec4   김태훈   원격 패킷 출력 프로그램 추가
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
          }
      }
  }
  
  void MainWindow::updateState(oven_state_t *state)
  {
      U16 *base = (U16 *) &this->state;
      U16 *operand = (U16 *) state;
      for (int row = 0; row < ui->stateTable->rowCount(); row++)
      {
          U16 b = *(base + row);
          U16 o = *(operand + row);
          if (b != o)
          {
              *(base + row) = o;
              TableValue *val = (TableValue *) ui->stateTable->cellWidget(row, 1);
a75fc5aca   김태훈   출력 형식 변경
224
225
226
227
              val->setText(QString().sprintf("0x%04X", o));
  
              val = (TableValue *) ui->stateTable->cellWidget(row, 2);
              val->setText(QString::number(o));
81bee1ec4   김태훈   원격 패킷 출력 프로그램 추가
228
229
230
          }
      }
  }
f97982552   김태훈   가상 UDP 패킷 전송 기능 추가
231
232
233
  
  void MainWindow::on_pushControlButton_clicked()
  {
e77a367ac   김태훈   모드버스 주소 설명 추가
234
235
      oven_control_t control = this->control;
      U16 *base = (U16 *) &control;
f97982552   김태훈   가상 UDP 패킷 전송 기능 추가
236
237
238
239
240
241
242
243
244
      for (int row = 0; row < ui->controlTable->rowCount(); row++)
      {
          QTableWidgetItem *val = (QTableWidgetItem *) ui->controlTable->item(row, 4);
          if (val)
              *(base + row) = val->text().toUShort(nullptr, 10);
      }
  
      gui_oven_control_t c;
      c.header = HDR_OVEN_CONTROL;
e77a367ac   김태훈   모드버스 주소 설명 추가
245
      memcpy(&c.control, &control, sizeof(this->control));
f97982552   김태훈   가상 UDP 패킷 전송 기능 추가
246
247
  
      QByteArray datagram = QByteArray::fromRawData((char *) &c, sizeof(c));
d7c3a65b4   김태훈   - 디버깅 포트 변경(4000 ...
248
      sock->writeDatagram(datagram, QHostAddress(ui->lineEdit->text()), 4000);
f97982552   김태훈   가상 UDP 패킷 전송 기능 추가
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
  }
  
  void MainWindow::on_pushStateButton_clicked()
  {
      oven_state_t state = this->state;
      U16 *base = (U16 *) &state;
      for (int row = 0; row < ui->stateTable->rowCount(); row++)
      {
          QTableWidgetItem *val = (QTableWidgetItem *) ui->stateTable->item(row, 4);
          if (val)
              *(base + row) = val->text().toUShort(nullptr, 10);
      }
  
      gui_oven_state_t c;
      c.header = HDR_OVEN_STATE;
      memcpy(&c.state, &state, sizeof(state));
  
      QByteArray datagram = QByteArray::fromRawData((char *) &c, sizeof(c));
d7c3a65b4   김태훈   - 디버깅 포트 변경(4000 ...
267
      sock->writeDatagram(datagram, QHostAddress(ui->lineEdit->text()), 4000);
f97982552   김태훈   가상 UDP 패킷 전송 기능 추가
268
  }