import "termios"
import "flag"
import "regexp"
+import "sync"
+import "time"
+
+var lock sync.RWMutex
+
+type DoorConnection struct {
+ rw * bufio.ReadWriter
+ c net.Conn
+ wchan chan string
+}
+
+var DoorConnectionMap = map[uint]DoorConnection {
+}
var cmdHandler = map[string]func([]string,string,*bufio.ReadWriter ) {
"test":handleCmdTest,
return bufio.NewReadWriter(client_r,client_w)
}
-func handleConnection(c net.Conn) () {
- client:=connToReadWriter(c,c)
+func handleConnection(c net.Conn, client * bufio.ReadWriter, connID uint) () {
fmt.Println("new connection")
+ defer func () {
+ lock.Lock()
+ delete(DoorConnectionMap,connID)
+ lock.Unlock()
+ }()
for {
line,err:=readLineSafe(bufio.NewReader(client))
if err != nil {
serial:=openTTY(filename)
in:=make(chan string)
out:=make(chan string)
- //go SerialWriter(out,serial)
+ 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);
+ line:=<-serial_i
+ fmt.Printf("Serial Read: %s\n",line)
+ lock.RLock()
+ for _, v := range DoorConnectionMap{
+ select {
+ case v.wchan<-line:
+
+ case <-time.After(2):
+
+ }
+ }
+ lock.RUnlock()
+ }
+}
+
+func chanWriter(c chan string, w io.Writer) {
+ for {
+ line := <-c
+ w.Write([]byte(line))
+ w.Write([]byte("\n"))
}
}
func main() {
+// lock = make(sync.RWMutex)
flag.Usage = usage
flag.Parse()
fmt.Println("Input file is missing.");
os.Exit(1);
}
+ serial_i,serial_o:=openSerial(args[0])
+ go SerialHandler(serial_i)
+ serial_o<-"f"
+
ln, err := net.Listen("unix", "/tmp/test.sock")
if err != nil {
fmt.Printf("Error: %s\n",err.Error())
}
fmt.Printf("Listener started\n")
- serial_i,serial_o:=openSerial(args[0])
- go SerialHandler(serial_i)
- serial_o<-"f"
-
+ var connectionID uint =0
for {
conn, err := ln.Accept()
if err != nil {
// handle error
continue
}
- go handleConnection(conn)
+ client:=connToReadWriter(conn,conn)
+ connectionID++
+ writeChan := make(chan string)
+ lock.Lock()
+ DoorConnectionMap[connectionID]= DoorConnection{ rw:client,c:conn, wchan:writeChan }
+ lock.Unlock()
+ go handleConnection(conn,client,connectionID)
+ go chanWriter(writeChan,conn)
}
}