Blame view

app/gui/oven_control/udphandler.cpp 3.99 KB
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
e24704e9e   고영탁   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
27e821e2e   고영탁   version 1.6.8 Rel...
20
      m_steamhighctr_enabled = false;
bae371454   김태훈   485 통신 오류 검출 루틴
21
22
      emitted = false;
      emitTimeoutTimer.setSingleShot(true);
e24704e9e   고영탁   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;
  }
27e821e2e   고영탁   version 1.6.8 Rel...
39
40
41
  void UdpHandler::set_steam_high_sv_onoff(bool onoff)
  {
      if(onoff){
d5cfcab0f   고영탁   스팀 과열 에러 발생시 ssv ...
42
43
44
          sendCommand(CMD_ONOFF, TG_MANUAL_RELAY, SWITCH_ON);
          sendCommand(CMD_ONOFF, TG_SSV, SWITCH_ON);
          m_steamhighctr_enabled = true;
27e821e2e   고영탁   version 1.6.8 Rel...
45
46
      }
      else{
d5cfcab0f   고영탁   스팀 과열 에러 발생시 ssv ...
47
48
49
          sendCommand(CMD_ONOFF, TG_SSV, SWITCH_OFF);
          sendCommand(CMD_ONOFF, TG_MANUAL_RELAY, SWITCH_OFF);
          m_steamhighctr_enabled = false;
27e821e2e   고영탁   version 1.6.8 Rel...
50
51
      }
  }
8c2952457   김태훈   응용 프로그램 추가
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
  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 패킷 전송 주소 변경
68
      sock->writeDatagram(datagram, QHostAddress("localhost"), 40001);
bae371454   김태훈   485 통신 오류 검출 루틴
69
70
71
72
73
      if (emitted)
      {
          emitted = false;
          emit recovered();
      }
8c2952457   김태훈   응용 프로그램 추가
74
75
76
77
      packet_t *packet = (packet_t *) datagram.data();
      switch (packet->header)
      {
      case HDR_OVEN_CONTROL:
d7c3a65b4   김태훈   - 디버깅 포트 변경(4000 ...
78
          qDebug() << "Received Control";
8c2952457   김태훈   응용 프로그램 추가
79
80
81
          processControl((oven_control_t *) packet->body);
          break;
      case HDR_OVEN_STATE:
d7c3a65b4   김태훈   - 디버깅 포트 변경(4000 ...
82
          qDebug() << "Received State";
8c2952457   김태훈   응용 프로그램 추가
83
84
85
          processState((oven_state_t *) packet->body);
          break;
      case HDR_ERROR_CODE:
d66d7f5b4   김태훈   GUI 버전 0.1.2
86
          qDebug() << "Received Error";
8c2952457   김태훈   응용 프로그램 추가
87
88
          break;
      }
bae371454   김태훈   485 통신 오류 검출 루틴
89
90
  
      emitTimeoutTimer.start();
8c2952457   김태훈   응용 프로그램 추가
91
92
93
94
95
96
97
98
99
100
101
102
103
  }
  
  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   김태훈   전기식 프로토콜 업데이트 반영
104
      if (memcmp(&this->state, state, sizeof(this->state)))
8c2952457   김태훈   응용 프로그램 추가
105
      {
eea7f2949   김태훈   전기식 프로토콜 업데이트 반영
106
107
          memcpy(&this->state, state, sizeof(this->state));
          emit changed();
8c2952457   김태훈   응용 프로그램 추가
108
109
110
111
112
      }
  }
  
  void UdpHandler::turnOn(int target)
  {
27e821e2e   고영탁   version 1.6.8 Rel...
113
114
115
116
      if(m_steamhighctr_enabled){
          sendCommand(CMD_ONOFF, TG_MANUAL_RELAY, SWITCH_OFF);
          m_steamhighctr_enabled = false;
      }
8c2952457   김태훈   응용 프로그램 추가
117
118
119
120
121
      sendCommand(CMD_ONOFF, target, SWITCH_ON);
  }
  
  void UdpHandler::turnOff(int target)
  {
27e821e2e   고영탁   version 1.6.8 Rel...
122
123
124
125
      if(m_steamhighctr_enabled){
          sendCommand(CMD_ONOFF, TG_MANUAL_RELAY, SWITCH_OFF);
          m_steamhighctr_enabled = false;
      }
8c2952457   김태훈   응용 프로그램 추가
126
127
128
129
130
      sendCommand(CMD_ONOFF, target, SWITCH_OFF);
  }
  
  void UdpHandler::set(int target, int value)
  {
d5cfcab0f   고영탁   스팀 과열 에러 발생시 ssv ...
131
      if(m_steamhighctr_enabled && target != TG_ERROR_CLEAR){
27e821e2e   고영탁   version 1.6.8 Rel...
132
133
134
          sendCommand(CMD_ONOFF, TG_MANUAL_RELAY, SWITCH_OFF);
          m_steamhighctr_enabled = false;
      }
8c2952457   김태훈   응용 프로그램 추가
135
136
137
138
139
140
141
142
143
      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 통신 오류 검출 루틴
144
145
146
147
148
  void UdpHandler::emitTimeout()
  {
      emitted = true;
      emit timeout();
  }
8c2952457   김태훈   응용 프로그램 추가
149
150
151
152
153
154
155
156
157
  void UdpHandler::fillControl(oven_control_t &container)
  {
      memcpy(&container, &control, sizeof(control));
  }
  
  void UdpHandler::fillData(oven_state_t &container)
  {
      memcpy(&container, &state, sizeof(state));
  }