diff --git a/main/managementinterface.go b/main/managementinterface.go index 9c94449d..a82142b2 100755 --- a/main/managementinterface.go +++ b/main/managementinterface.go @@ -35,6 +35,25 @@ type SettingMessage struct { // Weather updates channel. var weatherUpdate *uibroadcaster var trafficUpdate *uibroadcaster +var gdl90Update *uibroadcaster + +func handleGdl90WS(conn *websocket.Conn) { + // Subscribe the socket to receive updates. + gdl90Update.AddSocket(conn) + + // Connection closes when function returns. Since uibroadcast is writing and we don't need to read anything (for now), just keep it busy. + for { + buf := make([]byte, 1024) + _, err := conn.Read(buf) + if err != nil { + break + } + if buf[0] != 0 { // Dummy. + continue + } + time.Sleep(1 * time.Second) + } +} // Situation updates channel. var situationUpdate *uibroadcaster @@ -520,11 +539,18 @@ func managementInterface() { trafficUpdate = NewUIBroadcaster() situationUpdate = NewUIBroadcaster() weatherRawUpdate = NewUIBroadcaster() + gdl90Update = NewUIBroadcaster() http.HandleFunc("/", defaultServer) http.Handle("/logs/", http.StripPrefix("/logs/", http.FileServer(http.Dir("/var/log")))) http.HandleFunc("/view_logs/", viewLogs) + http.HandleFunc("/gdl90", + func(w http.ResponseWriter, req *http.Request) { + s := websocket.Server{ + Handler: websocket.Handler(handleGdl90WS)} + s.ServeHTTP(w, req) + }) http.HandleFunc("/status", func(w http.ResponseWriter, req *http.Request) { s := websocket.Server{ diff --git a/main/network.go b/main/network.go old mode 100755 new mode 100644 index 17fe3f5e..1fe8ea45 --- a/main/network.go +++ b/main/network.go @@ -15,6 +15,7 @@ import ( "golang.org/x/net/icmp" "golang.org/x/net/ipv4" "io/ioutil" + "encoding/json" "log" "math" "math/rand" @@ -143,6 +144,7 @@ func sendToAllConnectedClients(msg networkMessage) { if (msg.msgType & NETWORK_GDL90_STANDARD) != 0 { // It's a GDL90 message. Send to serial output channel (which may or may not cause something to happen). serialOutputChan <- msg.msg + networkGDL90Chan <- msg.msg } netMutex.Lock() @@ -192,6 +194,19 @@ func sendToAllConnectedClients(msg networkMessage) { } var serialOutputChan chan []byte +var networkGDL90Chan chan []byte + +func networkOutWatcher() { + //ticker := time.NewTicker(10 * time.Second) + //var nmsg gdl90NetMessage + for { + select { + case ch := <-networkGDL90Chan: + gdlJSON, _ := json.Marshal(ch) + gdl90Update.Send(gdlJSON) + } + } +} // Monitor serial output channel, send to serial port. func serialOutWatcher() { @@ -603,6 +618,7 @@ func ffMonitor() { func initNetwork() { messageQueue = make(chan networkMessage, 1024) // Buffered channel, 1024 messages. serialOutputChan = make(chan []byte, 1024) // Buffered channel, 1024 GDL90 messages. + networkGDL90Chan = make(chan []byte, 1024) outSockets = make(map[string]networkConnection) pingResponse = make(map[string]time.Time) netMutex = &sync.Mutex{} @@ -612,4 +628,5 @@ func initNetwork() { go sleepMonitor() go networkStatsCounter() go serialOutWatcher() + go networkOutWatcher() }