8c2952457
김태훈
응용 프로그램 추가
|
1
2
3
|
#include "udphandler.h"
#include <QtDebug>
|
89f0ad175
김태훈
전기식일 땐 모드버스 테이블을 ...
|
4
|
#include "config.h"
|
81bee1ec4
김태훈
원격 패킷 출력 프로그램 추가
|
5
|
#define IPC_UDP_SYS_HOST "127.0.0.1"
|
8c2952457
김태훈
응용 프로그램 추가
|
6
7
|
#define IPC_UDP_SYS_PORT 4001
#define IPC_UDP_GUI_PORT 4000
|
6f5f5fc90
고영탁
V2.02 통신 Timeout ...
|
8
|
#define COMM_TIMEOUT_SEC 30
|
8c2952457
김태훈
응용 프로그램 추가
|
9
10
11
12
13
|
typedef struct {
int header;
char body[];
} STRUCT_PACK packet_t;
|
538041ab9
김태훈
소스 코드 구조 개선
|
14
|
UdpHandler *UdpHandler::instance = 0;
|
8c2952457
김태훈
응용 프로그램 추가
|
15
16
|
UdpHandler::UdpHandler(QObject *parent) : QObject(parent)
{
|
6a965b9f1
고영탁
엔지니어 모드 2차 구현
|
17
18
|
bzero(&control, sizeof(control));
bzero(&state, sizeof(state));
|
bae371454
김태훈
485 통신 오류 검출 루틴
|
19
|
|
0964351ba
고영탁
스팀 과열 에러 발생 시 SSV...
|
20
|
m_steamhighctr_enabled = false;
|
bae371454
김태훈
485 통신 오류 검출 루틴
|
21
22
|
emitted = false;
emitTimeoutTimer.setSingleShot(true);
|
6f5f5fc90
고영탁
V2.02 통신 Timeout ...
|
23
|
emitTimeoutTimer.setInterval(COMM_TIMEOUT_SEC * 1000);
|
bae371454
김태훈
485 통신 오류 검출 루틴
|
24
25
26
|
connect(&emitTimeoutTimer, SIGNAL(timeout()), SLOT(emitTimeout()));
emitTimeoutTimer.start();
|
8c2952457
김태훈
응용 프로그램 추가
|
27
28
29
30
31
32
33
34
35
36
37
38
|
}
bool UdpHandler::init()
{
sock = new QUdpSocket(this);
if (!sock->bind(IPC_UDP_GUI_PORT))
return false;
connect(sock, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams()));
return true;
}
|
0964351ba
고영탁
스팀 과열 에러 발생 시 SSV...
|
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
void UdpHandler::set_steam_high_sv_onoff(bool onoff)
{
if(onoff){
if(!m_steamhighctr_enabled){
sendCommand(CMD_ONOFF, TG_MANUAL_RELAY, SWITCH_ON);
sendCommand(CMD_ONOFF, TG_SSV, SWITCH_ON);
m_steamhighctr_enabled = true;
}
}
else{
if(m_steamhighctr_enabled){
sendCommand(CMD_ONOFF, TG_SSV, SWITCH_OFF);
sendCommand(CMD_ONOFF, TG_MANUAL_RELAY, SWITCH_OFF);
m_steamhighctr_enabled = false;
}
}
}
|
8c2952457
김태훈
응용 프로그램 추가
|
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
void UdpHandler::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 UdpHandler::processDatagram(QByteArray &datagram)
{
|
fe9efe64f
김태훈
기본 UDP 패킷 전송 주소 변경
|
72
|
sock->writeDatagram(datagram, QHostAddress("localhost"), 40001);
|
bae371454
김태훈
485 통신 오류 검출 루틴
|
73
74
75
76
77
|
if (emitted)
{
emitted = false;
emit recovered();
}
|
8c2952457
김태훈
응용 프로그램 추가
|
78
79
80
81
|
packet_t *packet = (packet_t *) datagram.data();
switch (packet->header)
{
case HDR_OVEN_CONTROL:
|
d7c3a65b4
김태훈
- 디버깅 포트 변경(4000 ...
|
82
|
qDebug() << "Received Control";
|
8c2952457
김태훈
응용 프로그램 추가
|
83
84
85
|
processControl((oven_control_t *) packet->body);
break;
case HDR_OVEN_STATE:
|
d7c3a65b4
김태훈
- 디버깅 포트 변경(4000 ...
|
86
|
qDebug() << "Received State";
|
8c2952457
김태훈
응용 프로그램 추가
|
87
88
89
|
processState((oven_state_t *) packet->body);
break;
case HDR_ERROR_CODE:
|
d66d7f5b4
김태훈
GUI 버전 0.1.2
|
90
|
qDebug() << "Received Error";
|
8c2952457
김태훈
응용 프로그램 추가
|
91
92
|
break;
}
|
bae371454
김태훈
485 통신 오류 검출 루틴
|
93
94
|
emitTimeoutTimer.start();
|
8c2952457
김태훈
응용 프로그램 추가
|
95
96
97
98
99
100
101
102
103
104
105
106
107
|
}
void UdpHandler::processControl(oven_control_t *control)
{
if (memcmp(&this->control, control, sizeof(this->control)))
{
memcpy(&this->control, control, sizeof(this->control));
emit changed();
}
}
void UdpHandler::processState(oven_state_t *state)
{
|
eea7f2949
김태훈
전기식 프로토콜 업데이트 반영
|
108
|
if (memcmp(&this->state, state, sizeof(this->state)))
|
8c2952457
김태훈
응용 프로그램 추가
|
109
|
{
|
eea7f2949
김태훈
전기식 프로토콜 업데이트 반영
|
110
111
|
memcpy(&this->state, state, sizeof(this->state));
emit changed();
|
8c2952457
김태훈
응용 프로그램 추가
|
112
113
114
115
116
|
}
}
void UdpHandler::turnOn(int target)
{
|
0964351ba
고영탁
스팀 과열 에러 발생 시 SSV...
|
117
118
119
120
|
if(m_steamhighctr_enabled){
sendCommand(CMD_ONOFF, TG_MANUAL_RELAY, SWITCH_OFF);
m_steamhighctr_enabled = false;
}
|
8c2952457
김태훈
응용 프로그램 추가
|
121
122
123
124
125
|
sendCommand(CMD_ONOFF, target, SWITCH_ON);
}
void UdpHandler::turnOff(int target)
{
|
0964351ba
고영탁
스팀 과열 에러 발생 시 SSV...
|
126
127
128
129
|
if(m_steamhighctr_enabled){
sendCommand(CMD_ONOFF, TG_MANUAL_RELAY, SWITCH_OFF);
m_steamhighctr_enabled = false;
}
|
8c2952457
김태훈
응용 프로그램 추가
|
130
131
132
133
134
|
sendCommand(CMD_ONOFF, target, SWITCH_OFF);
}
void UdpHandler::set(int target, int value)
{
|
0964351ba
고영탁
스팀 과열 에러 발생 시 SSV...
|
135
136
137
138
|
if(m_steamhighctr_enabled){
sendCommand(CMD_ONOFF, TG_MANUAL_RELAY, SWITCH_OFF);
m_steamhighctr_enabled = false;
}
|
8c2952457
김태훈
응용 프로그램 추가
|
139
140
141
142
143
144
145
146
147
|
sendCommand(CMD_VALUE, target, value);
}
void UdpHandler::sendCommand(int cmd, int target, int value)
{
command_t command = { cmd, target, value };
qDebug() << "Send" << cmd << target << value;
sock->writeDatagram((const char *) &command, sizeof(command), QHostAddress(IPC_UDP_SYS_HOST), IPC_UDP_SYS_PORT);
}
|
bae371454
김태훈
485 통신 오류 검출 루틴
|
148
149
150
151
152
|
void UdpHandler::emitTimeout()
{
emitted = true;
emit timeout();
}
|
8c2952457
김태훈
응용 프로그램 추가
|
153
154
155
156
157
158
159
160
161
|
void UdpHandler::fillControl(oven_control_t &container)
{
memcpy(&container, &control, sizeof(control));
}
void UdpHandler::fillData(oven_state_t &container)
{
memcpy(&container, &state, sizeof(state));
}
|