X-Git-Url: https://git.realraum.at/?p=svn42.git;a=blobdiff_plain;f=go%2Fdoor_daemon_zmq%2Fserial_tty.go;fp=go%2Fdoor_daemon_zmq%2Fserial_tty.go;h=4ec786af41763a2c0388251992cc3e4a6baed156;hp=0000000000000000000000000000000000000000;hb=88e758b4025ef2a84acafc7b832a41028280c296;hpb=70bd6ea215fdd1dbd2eb9556ff4aa0a2acde24bc diff --git a/go/door_daemon_zmq/serial_tty.go b/go/door_daemon_zmq/serial_tty.go new file mode 100644 index 0000000..4ec786a --- /dev/null +++ b/go/door_daemon_zmq/serial_tty.go @@ -0,0 +1,60 @@ +// (c) Bernhard Tittelbach, 2013 + +package main + +import ( + "fmt" + "bufio" + "bytes" + "os" + "svn.spreadspace.org/realraum/go.svn/termios" + "log" +) + +// ---------- Serial TTY Code ------------- + +func openTTY(name string) (*os.File, error) { + file, err := os.OpenFile(name,os.O_RDWR, 0600) // For read access. + if err != nil { + log.Println(err.Error()) + return nil, err + } + termios.Ttyfd(file.Fd()) + termios.SetRaw() + return file, nil +} + +func SerialWriter(in <- chan string, serial * os.File) { + for totty := range(in) { + serial.WriteString(totty) + serial.Sync() + } +} + +func SerialReader(out chan <- [][]byte, topub chan <- [][]byte, serial * os.File) { + linescanner := bufio.NewScanner(serial) + linescanner.Split(bufio.ScanLines) + for linescanner.Scan() { + if err := linescanner.Err(); err != nil { + panic(fmt.Sprintf("Error in read from serial: %v\n",err.Error())) + } + text := bytes.Fields([]byte(linescanner.Text())) + if len(text) == 0 { + continue + } + out <- text + topub <- text + } +} + +func OpenAndHandleSerial(filename string, topub chan <- [][]byte) (chan string, chan [][]byte, error) { + serial, err :=openTTY(filename) + if err != nil { + return nil, nil, err + } + var wr chan string + var rd chan [][]byte + go SerialWriter(wr, serial) + go SerialReader(rd, topub, serial) + return wr, rd, nil +}