fd05639c9
김태훈
웹으로 모드버스 테이블 보여주는...
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
package main
import (
"bytes"
"encoding/binary"
"fmt"
"html/template"
"log"
"net"
"sync"
"github.com/codegangsta/martini"
"github.com/codegangsta/martini-contrib/render"
)
type Header int32
|
222bf65b5
김태훈
프로토콜 변경 대응 수정
|
17
18
|
type ControlPacket [50]uint16
type StatePacket [73]uint16
|
fd05639c9
김태훈
웹으로 모드버스 테이블 보여주는...
|
19
20
21
|
var mutex sync.Mutex
var templateMap = make(map[string]interface{})
|
222bf65b5
김태훈
프로토콜 변경 대응 수정
|
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
var controlDesc [50]string
var stateDesc [73]string
func init() {
controlDesc[5] = "Oven Mode"
controlDesc[6] = "Cook On/Off"
controlDesc[7] = "Wash On/Off"
controlDesc[8] = "System On/Off"
controlDesc[9] = "Temp"
controlDesc[10] = "Humidity"
controlDesc[11] = "Time"
controlDesc[12] = "Preheat On/Off"
controlDesc[15] = "Convection RPM"
controlDesc[16] = "Cooldown On/Off"
controlDesc[17] = "Core Temp"
controlDesc[20] = "Wash Type"
controlDesc[21] = "Wash Total"
controlDesc[22] = "Wash Steps"
controlDesc[23] = "Wash Step Type"
stateDesc[0] = "Firmware Y"
stateDesc[1] = "Firmware Y"
stateDesc[2] = "Firmware M"
stateDesc[3] = "Firmware D"
stateDesc[4] = "Cook State"
stateDesc[5] = "Temp Setting"
stateDesc[6] = "Humidity Setting"
stateDesc[7] = "Time Setting"
stateDesc[8] = "Temp Value"
stateDesc[9] = "Humidity Value"
stateDesc[10] = "Time Value"
stateDesc[11] = "Wash State"
stateDesc[12] = "Wash Type"
stateDesc[13] = "Wash Steps"
stateDesc[16] = "Door Open/Close"
stateDesc[32] = "Core Temp 1"
stateDesc[33] = "Core Temp 2"
stateDesc[34] = "Core Temp 3"
stateDesc[35] = "Core Temp 4"
}
|
fd05639c9
김태훈
웹으로 모드버스 테이블 보여주는...
|
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
func main() {
go ListenUDP()
m := martini.Classic()
m.Use(render.Renderer())
m.Get("/", func(r render.Render) {
mutex.Lock()
defer mutex.Unlock()
r.HTML(200, "main", templateMap)
})
m.Run()
}
func ListenUDP() {
addr, err := net.ResolveUDPAddr("udp", ":40001")
if err != nil {
log.Fatal(err)
}
conn, err := net.ListenUDP("udp", addr)
if err != nil {
log.Fatal(err)
}
defer conn.Close()
for {
b := make([]byte, 1024)
_, _, err := conn.ReadFromUDP(b)
if err != nil {
log.Fatal(err)
}
buf := bytes.NewReader(b)
var header Header
err = binary.Read(buf, binary.LittleEndian, &header)
if err != nil {
log.Fatal(err)
}
|
fd05639c9
김태훈
웹으로 모드버스 테이블 보여주는...
|
106
107
|
switch header {
case 0:
|
222bf65b5
김태훈
프로토콜 변경 대응 수정
|
108
109
110
111
112
|
var packet ControlPacket
err = binary.Read(buf, binary.LittleEndian, &packet)
if err != nil {
log.Fatal(err)
}
|
fd05639c9
김태훈
웹으로 모드버스 테이블 보여주는...
|
113
114
|
mapControl(packet)
case 1:
|
222bf65b5
김태훈
프로토콜 변경 대응 수정
|
115
116
117
118
119
|
var packet StatePacket
err = binary.Read(buf, binary.LittleEndian, &packet)
if err != nil {
log.Fatal(err)
}
|
fd05639c9
김태훈
웹으로 모드버스 테이블 보여주는...
|
120
121
122
123
|
mapState(packet)
}
}
}
|
222bf65b5
김태훈
프로토콜 변경 대응 수정
|
124
|
func mapControl(packet ControlPacket) {
|
fd05639c9
김태훈
웹으로 모드버스 테이블 보여주는...
|
125
126
|
mutex.Lock()
defer mutex.Unlock()
|
222bf65b5
김태훈
프로토콜 변경 대응 수정
|
127
|
var controlTable string
|
fd05639c9
김태훈
웹으로 모드버스 테이블 보여주는...
|
128
|
for i, v := range packet {
|
222bf65b5
김태훈
프로토콜 변경 대응 수정
|
129
130
131
132
133
134
135
|
class := "odd"
if i%2 == 0 {
class = "even"
}
controlTable += fmt.Sprintf("<tr class=\"%v\"><td>%v</td><td>0x%04X</td><td>0x%04X</td><td>%d</td><td>%v</td></tr>
", class, 40001+i, i, v, v, controlDesc[i])
|
fd05639c9
김태훈
웹으로 모드버스 테이블 보여주는...
|
136
137
138
139
|
}
templateMap["Table_Control"] = template.HTML(controlTable)
}
|
222bf65b5
김태훈
프로토콜 변경 대응 수정
|
140
|
func mapState(packet StatePacket) {
|
fd05639c9
김태훈
웹으로 모드버스 테이블 보여주는...
|
141
142
|
mutex.Lock()
defer mutex.Unlock()
|
222bf65b5
김태훈
프로토콜 변경 대응 수정
|
143
|
var stateTable string
|
fd05639c9
김태훈
웹으로 모드버스 테이블 보여주는...
|
144
|
for i, v := range packet {
|
222bf65b5
김태훈
프로토콜 변경 대응 수정
|
145
146
147
148
149
150
151
|
class := "odd"
if i%2 == 0 {
class = "even"
}
stateTable += fmt.Sprintf("<tr class=\"%v\"><td>%v</td><td>0x%04X</td><td>0x%04X</td><td>%d</td><td>%v</td></tr>
", class, 30001+i, i, v, v, stateDesc[i])
|
fd05639c9
김태훈
웹으로 모드버스 테이블 보여주는...
|
152
153
154
155
|
}
templateMap["Table_State"] = template.HTML(stateTable)
}
|