@@ -12,6 +12,7 @@ const maxDatagramSize = 8192
12
12
13
13
// Publisher can publish state and commands to the teams
14
14
type Publisher struct {
15
+ address string
15
16
conn * net.UDPConn
16
17
message RefMessage
17
18
}
@@ -23,7 +24,22 @@ type RefMessage struct {
23
24
24
25
// NewPublisher creates a new publisher that publishes referee messages via UDP to the teams
25
26
func NewPublisher (address string ) (publisher Publisher , err error ) {
26
- addr , err := net .ResolveUDPAddr ("udp" , address )
27
+
28
+ publisher .address = address
29
+
30
+ // initialize default referee message
31
+ publisher .message = RefMessage {send : publisher .send , referee : new (refproto.Referee )}
32
+ initRefereeMessage (publisher .message .referee )
33
+
34
+ err = publisher .connect ()
35
+
36
+ return
37
+ }
38
+
39
+ func (p * Publisher ) connect () (err error ) {
40
+ p .conn = nil
41
+
42
+ addr , err := net .ResolveUDPAddr ("udp" , p .address )
27
43
if err != nil {
28
44
return
29
45
}
@@ -36,16 +52,16 @@ func NewPublisher(address string) (publisher Publisher, err error) {
36
52
if err := conn .SetWriteBuffer (maxDatagramSize ); err != nil {
37
53
log .Printf ("Could not set write buffer to %v." , maxDatagramSize )
38
54
}
39
- log .Println ("Publishing to" , address )
40
-
41
- publisher .conn = conn
42
- publisher .message = RefMessage {send : publisher .send , referee : new (refproto.Referee )}
43
-
44
- initRefereeMessage (publisher .message .referee )
55
+ log .Println ("Publishing to" , p .address )
45
56
57
+ p .conn = conn
46
58
return
47
59
}
48
60
61
+ func (p * Publisher ) disconnect () {
62
+ p .conn = nil
63
+ }
64
+
49
65
func initRefereeMessage (m * refproto.Referee ) {
50
66
m .PacketTimestamp = new (uint64 )
51
67
m .Stage = new (refproto.Referee_Stage )
@@ -88,6 +104,7 @@ func (p *RefMessage) Publish(state *State) {
88
104
89
105
func (p * Publisher ) send () {
90
106
if p .conn == nil {
107
+ go p .connect ()
91
108
return
92
109
}
93
110
@@ -99,6 +116,7 @@ func (p *Publisher) send() {
99
116
_ , err = p .conn .Write (bytes )
100
117
if err != nil {
101
118
log .Printf ("Could not write message: %v" , err )
119
+ p .disconnect ()
102
120
}
103
121
}
104
122
0 commit comments