@@ -12,6 +12,7 @@ const maxDatagramSize = 8192
1212
1313// Publisher can publish state and commands to the teams
1414type Publisher struct {
15+ address string
1516 conn * net.UDPConn
1617 message RefMessage
1718}
@@ -23,7 +24,22 @@ type RefMessage struct {
2324
2425// NewPublisher creates a new publisher that publishes referee messages via UDP to the teams
2526func 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 )
2743 if err != nil {
2844 return
2945 }
@@ -36,16 +52,16 @@ func NewPublisher(address string) (publisher Publisher, err error) {
3652 if err := conn .SetWriteBuffer (maxDatagramSize ); err != nil {
3753 log .Printf ("Could not set write buffer to %v." , maxDatagramSize )
3854 }
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 )
4556
57+ p .conn = conn
4658 return
4759}
4860
61+ func (p * Publisher ) disconnect () {
62+ p .conn = nil
63+ }
64+
4965func initRefereeMessage (m * refproto.Referee ) {
5066 m .PacketTimestamp = new (uint64 )
5167 m .Stage = new (refproto.Referee_Stage )
@@ -88,6 +104,7 @@ func (p *RefMessage) Publish(state *State) {
88104
89105func (p * Publisher ) send () {
90106 if p .conn == nil {
107+ go p .connect ()
91108 return
92109 }
93110
@@ -99,6 +116,7 @@ func (p *Publisher) send() {
99116 _ , err = p .conn .Write (bytes )
100117 if err != nil {
101118 log .Printf ("Could not write message: %v" , err )
119+ p .disconnect ()
102120 }
103121}
104122
0 commit comments