fixed errors and run script
[svn42.git] / door_daemon_go / unix_socket_server.go
index aca60b8..61893ff 100644 (file)
@@ -2,64 +2,178 @@ package main
 import "fmt"
 import "net"
 import "bufio"
+import "strings"
+import "os"
+import "io"
+import "termios"
+import "flag"
+import "regexp"
+
+var cmdHandler = map[string]func([]string,string,*bufio.ReadWriter ) {
+  "test":handleCmdTest,
+  "open":handleCmdController,
+  "close":handleCmdController,
+  "toggle":handleCmdController,
+}
+
+
+func readLineSafe(rw *bufio.Reader) (string, error) {
+  wasPrefix:=false
+  var line string
+  for isPrefix:=true;isPrefix; {
+    var lineBuf []byte 
+    var err error
+    lineBuf,isPrefix,err = rw.ReadLine()
+    if err != nil {
+        return "",err
+    }
+    if isPrefix {
+      wasPrefix=true
+    } else {
+      line=string(lineBuf)
+    }
+  }
+  if wasPrefix {
+      fmt.Println("line too long")
+      //fmt.Fprintf(rw,"line too long\n")
+      //rw.Flush()
+      return "",nil
+  }
+  reg := regexp.MustCompile("\r")
+  safe := reg.ReplaceAllString(line, "")
+  return safe,nil
+}
+
+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,c)
     fmt.Println("new connection")
-    var client *bufio.ReadWriter;
-    {
-      client_r := bufio.NewReaderSize(c,14)
-      client_w := bufio.NewWriterSize(c,14)
-      client = bufio.NewReadWriter(client_r,client_w)
-    }
     for {
-          wasPrefix:=false
-          var line string
-          for isPrefix:=true;isPrefix; {
-            var lineBuf []byte 
-            var err error
-            lineBuf,isPrefix,err = client.ReadLine()
-            if err != nil {
-                fmt.Printf("Readline Error: %s\n",err.Error())
-                c.Close()
-                return
-            }
-            if isPrefix {
-              wasPrefix=true
-            } else {
-              line=string(lineBuf)
-            }
-          }
-          if wasPrefix {
-              fmt.Println("line too long")
-              fmt.Fprintf(client,"line too long\n")
-              client.Flush()
-              continue
+         line,err:=readLineSafe(bufio.NewReader(client))
+         if err != nil {
+          if err.Error() != "EOF" {
+            fmt.Printf("Error: readLineSafe returned %v\n",err.Error())
+          } else {
+            fmt.Printf("Connection closed by remote host\n");
           }
-          fmt.Printf("Received: %v\n", string(line))
-//
-//        data := buf[0:nr]
-//        fmt.Printf("Received: %v", string(data))
-//        _, err = c.Write(data)
-//        if err != nil {
-//            fmt.Println("Write: " + err.Error())
-//            return
-//        }
+          c.Close()
+          return
+         }
+         if line == "" {
+           continue
+         }
+         fmt.Printf("Received: %v\n", line)
+         tokens:=strings.Fields(line)
+         remainStr:=strings.Join(tokens[1:]," ")
+         handleCmd(tokens,remainStr,client)
     }
 }
 
+func handleCmd(tokens []string, remainStr string,client * bufio.ReadWriter) {
+  cmd:=tokens[0]
+  func_ptr,present := cmdHandler[cmd]
+  if present {
+    func_ptr(tokens, remainStr,client)
+  } else {
+    fmt.Printf("Error: unknown Cmd: %v\n", cmd)
+  }
+}
+
+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 Read: %s\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)
   }