Blame view

app/modbus-data-viewer/src/service-web/main.go 3.21 KB
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)
  }