X-Git-Url: https://git.realraum.at/?a=blobdiff_plain;f=door_daemon_go%2Funix_socket_server.go;h=14b9226ac2f0c521935685361167c7b984e662a6;hb=fa5cf2acaacf73e4848f1f29d235e681a495e9f5;hp=ee5429f13047741afc8fdbfbe4b52b1978e62dd3;hpb=bbbad3e45ac405f5511349d4fdf2d8af5240ac44;p=svn42.git diff --git a/door_daemon_go/unix_socket_server.go b/door_daemon_go/unix_socket_server.go index ee5429f..14b9226 100644 --- a/door_daemon_go/unix_socket_server.go +++ b/door_daemon_go/unix_socket_server.go @@ -3,13 +3,20 @@ import "fmt" import "net" import "bufio" import "strings" +import "os" +import "io" +import "termios" +import "flag" -var cmdHandler = map[string]func([]string,string) { +var cmdHandler = map[string]func([]string,string,*bufio.ReadWriter ) { "test":handleCmdTest, + "open":handleCmdController, + "close":handleCmdController, + "toggle":handleCmdController, } -func readLineSafe(rw *bufio.ReadWriter) (string, error) { +func readLineSafe(rw *bufio.Reader) (string, error) { wasPrefix:=false var line string for isPrefix:=true;isPrefix; { @@ -27,24 +34,24 @@ func readLineSafe(rw *bufio.ReadWriter) (string, error) { } if wasPrefix { fmt.Println("line too long") - fmt.Fprintf(rw,"line too long\n") - rw.Flush() + //fmt.Fprintf(rw,"line too long\n") + //rw.Flush() return "",nil } return line,nil } -func connToReadWriter(c net.Conn) (*bufio.ReadWriter) { - client_r := bufio.NewReaderSize(c,14) - client_w := bufio.NewWriterSize(c,14) +func connToReadWriter(c io.Reader,cw io.Writer) (*bufio.ReadWriter) { + client_r := bufio.NewReaderSize(c,1024) + client_w := bufio.NewWriterSize(cw,1024) return bufio.NewReadWriter(client_r,client_w) } func handleConnection(c net.Conn) () { - client:=connToReadWriter(c) + client:=connToReadWriter(c,c) fmt.Println("new connection") for { - line,err:=readLineSafe(client) + line,err:=readLineSafe(bufio.NewReader(client)) if err != nil { if err.Error() != "EOF" { fmt.Printf("Error: readLineSafe returned %v\n",err.Error()) @@ -60,37 +67,110 @@ func handleConnection(c net.Conn) () { fmt.Printf("Received: %v\n", line) tokens:=strings.Fields(line) remainStr:=strings.Join(tokens[1:]," ") - handleCmd(tokens,remainStr) + handleCmd(tokens,remainStr,client) } } -func handleCmd(tokens []string, remainStr string) { +func handleCmd(tokens []string, remainStr string,client * bufio.ReadWriter) { cmd:=tokens[0] func_ptr,present := cmdHandler[cmd] if present { - func_ptr(tokens, remainStr) + func_ptr(tokens, remainStr,client) } else { fmt.Printf("Error: unknown Cmd: %v\n", cmd) } } -func handleCmdTest(tokens []string, remainStr string) { +func handleCmdTest(tokens []string, remainStr string, client * bufio.ReadWriter) { //cmd:=tokens[0] fmt.Printf("Test: %v\n", remainStr) } +func handleCmdController(tokens []string, remainStr string, client * bufio.ReadWriter) { + cmd:=tokens[0] + s_r:=strings.NewReader(cmd) + char := make([]byte,1) + s_r.Read(char) + fmt.Println(string(char)) +} + + +func openTTY(name string) *os.File { + file, err := os.OpenFile(name,os.O_RDWR ,0600) // For read access. + if err != nil { + fmt.Println(err.Error()) + } + termios.Ttyfd(file.Fd()) + termios.SetRaw() + return file +} +func usage() { + fmt.Fprintf(os.Stderr, "usage: myprog [inputfile]\n") + flag.PrintDefaults() + os.Exit(2) +} + +func SerialWriter(c chan string, serial * os.File ) { + for { + serial.WriteString(<-c) + serial.Sync() + } +} + +func SerialReader(c chan string , serial * bufio.Reader) { + for { + s,err := readLineSafe(serial) + if (s=="") { + continue + } + if (err!=nil) { + fmt.Printf("Error in read from serial: %v\n",err.Error()) + os.Exit(1) + } + fmt.Printf("Serial: Read %v\n",s); + c<-s + } +} + +func openSerial(filename string) (chan string,chan string) { + serial:=openTTY(filename) + in:=make(chan string) + out:=make(chan string) + //go SerialWriter(out,serial) + go SerialReader(in,bufio.NewReaderSize(serial,128)) + return in,out +} + +func SerialHandler(serial_i chan string) { + for { + fmt.Printf("Serial said: %v\n",<-serial_i); + } +} func main() { + flag.Usage = usage + flag.Parse() + + args := flag.Args() + if len(args) < 1 { + fmt.Println("Input file is missing."); + os.Exit(1); + } ln, err := net.Listen("unix", "/tmp/test.sock") if err != nil { fmt.Printf("Error: %s\n",err.Error()) return } fmt.Printf("Listener started\n") + + serial_i,serial_o:=openSerial(args[0]) + go SerialHandler(serial_i) + serial_o<-"f" + for { conn, err := ln.Accept() if err != nil { // handle error - continue + continue } go handleConnection(conn) }