// // dolmetschctl // // // Copyright (C) 2019 Christian Pointner // // This file is part of dolmetschctl. // // dolmetschctl is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // any later version. // // dolmetschctl is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with dolmetschctl. If not, see . // package main import ( "encoding/json" "fmt" "io" "io/ioutil" "log" "os" "time" "github.com/gorilla/websocket" "spreadspace.org/dolmetschctl/pkg/controller" "spreadspace.org/dolmetschctl/pkg/types" ) func wsReader(ws *websocket.Conn, ch chan<- types.WebSocketResponseFull) { defer close(ch) for { t, r, err := ws.NextReader() if err != nil { log.Println("websocket disconnected:", err) return } switch t { case websocket.TextMessage: var msg types.WebSocketResponseFull dec := json.NewDecoder(r) dec.DisallowUnknownFields() if err := dec.Decode(&msg); err != nil { if err == io.EOF { err = io.ErrUnexpectedEOF } log.Println("webclient response parse error:", err) return } ch <- msg case websocket.BinaryMessage: io.Copy(ioutil.Discard, r) // consume all the data } } return } func run(ctrl *controller.Controller, ws *websocket.Conn) error { ctrlCh := make(chan controller.Event, 100) ctrl.Subscribe(ctrlCh) wsCh := make(chan types.WebSocketResponseFull) go wsReader(ws, wsCh) if err := ws.WriteJSON(types.WebSocketRequest{Command: "subscribe"}); err != nil { return err } for { select { case ev, ok := <-ctrlCh: if !ok { return fmt.Errorf("controller channel was closed.") } if ev.Type != controller.ButtonPressed { continue } lang := "" switch ev.Button { case 0: lang = "en" case 1: lang = "de" default: lang = "none" } if err := ws.WriteJSON(types.WebSocketRequest{Command: "language", Args: []string{lang}}); err != nil { return err } case msg, ok := <-wsCh: if !ok { return fmt.Errorf("websocket channel was closed.") } log.Printf("got message from websocket: %v", msg) } } return nil } func main() { log.Println("hello world.") c, err := controller.NewController(controller.Config{Dev: "dolmetsch controller"}) if err != nil { log.Printf("Error opening the controller: %v", err) os.Exit(1) } defer c.Shutdown() if err = c.Init(); err != nil { log.Printf("Error initializeing the controller: %v", err) os.Exit(1) } log.Printf("controller successfully initialized!") for { ws, _, err := websocket.DefaultDialer.Dial("ws://127.0.0.1:8234/api/v1/socket", nil) if err != nil { log.Printf("Error connecting to daemon: %v", err) } else { err := run(c, ws) log.Printf("run() returned: %v", err) } log.Printf("will retry in one second...") time.Sleep(time.Second) } log.Printf("exiting.") }