diff --git a/cmd/client.go b/cmd/client.go index 7dc08eb..687b6f0 100644 --- a/cmd/client.go +++ b/cmd/client.go @@ -3,6 +3,7 @@ package cmd // code.bitsetter.de/fun/gosl/cmd import ( "encoding/gob" "fmt" + "log" "net" "os" "strconv" @@ -20,17 +21,27 @@ var cmdClient = &cobra.Command{ } var ( - ServerHost string + ServerHost string + renderQueue = make(chan data.Frame) ) func register(con net.Conn, id int) error { - w, h := data.TestNC() + w, h := 0, 0 //data.TestNC() enc := gob.NewEncoder(con) // Encoder err := enc.Encode(handshake{ID: id, H: h, W: w}) return err } +func render() { + var f data.Frame + for f = range renderQueue { + data.RenderFrame(&f) + } +} + func runClient(cmd *cobra.Command, args []string) { + data.InitNC() + defer data.ExitNC() fmt.Println("running client ...") if len(args) < 1 { @@ -43,8 +54,21 @@ func runClient(cmd *cobra.Command, args []string) { if err != nil { fmt.Println("connect error:", err) } - + defer con.Close() register(con, id) + + go render() + for { + var oFrame data.Frame + // always use new decoder - reusing may lead to errors + gd := gob.NewDecoder(con) + err = gd.Decode(&oFrame) + if err != nil { + log.Fatal("RGS:", err) + } + renderQueue <- oFrame + } + } func init() { diff --git a/cmd/server.go b/cmd/server.go index 8e57bf3..7c6a97a 100644 --- a/cmd/server.go +++ b/cmd/server.go @@ -8,6 +8,8 @@ import ( "time" "github.com/spf13/cobra" + + "code.bitsetter.de/fun/gosl/data" ) var cmdServer = &cobra.Command{ @@ -51,11 +53,23 @@ func handleConn(conn *net.TCPConn) { } func serveClients() { + var oFrame = data.Frame{ + 1, 10, + [][]rune{ + []rune("hallo"), + []rune("das"), + []rune("ist"), + []rune("einTest"), + }, + } for { // while true for _, k := range clientKeys { id, client := k, clients[k] if id > 0 { + enc := gob.NewEncoder(client.con) + enc.Encode(oFrame) log.Println("ID:", id, "Client:", client) + } } time.Sleep(time.Second) diff --git a/data/frame.go b/data/frame.go new file mode 100644 index 0000000..230ddb8 --- /dev/null +++ b/data/frame.go @@ -0,0 +1,6 @@ +package data // code.bitsetter.de/fun/gosl/data + +type Frame struct { + W, H int + Data [][]rune +} diff --git a/data/screen.go b/data/screen.go index 1b57dc4..d28e423 100644 --- a/data/screen.go +++ b/data/screen.go @@ -8,9 +8,31 @@ import ( nc "github.com/rthornton128/goncurses" ) -type Screen struct { - w, h int - data []rune +var ( + win *nc.Window +) + +func RenderFrame(f *Frame) { + win.Clear() + for k, _ := range f.Data { + win.MovePrint(k+1, 1, string(f.Data[k])) + } +} + +func InitNC() { + var err error + win, err = nc.Init() + if err != nil { + log.Fatal(err) + os.Exit(1) + } +} + +func ExitNC() { + //if win != nil { + + // } + nc.End() } func TestNC() (int, int) {