X-Git-Url: https://git.realraum.at/?a=blobdiff_plain;f=go%2Fuc_sensor_node_zmq%2Fserial_tty.go;fp=go%2Fuc_sensor_node_zmq%2Fserial_tty.go;h=de06bdd4bd0d7a191b186b962c9f55f22fc02295;hb=30c704726752c02121b3f453916a0a76dd5dcab8;hp=0000000000000000000000000000000000000000;hpb=8e73e942c082365269f650cf5a489aaa07452f28;p=svn42.git diff --git a/go/uc_sensor_node_zmq/serial_tty.go b/go/uc_sensor_node_zmq/serial_tty.go new file mode 100644 index 0000000..de06bdd --- /dev/null +++ b/go/uc_sensor_node_zmq/serial_tty.go @@ -0,0 +1,59 @@ +// (c) Bernhard Tittelbach, 2013 + +package main + +import ( + "bufio" + "bytes" + "os" + "svn.spreadspace.org/realraum/go.svn/termios" +) + + +// ---------- 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 { + Syslog_.Print(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() + } + serial.Close() +} + +func serialReader(out chan <- [][]byte, serial * os.File) { + linescanner := bufio.NewScanner(serial) + linescanner.Split(bufio.ScanLines) + for linescanner.Scan() { + if err := linescanner.Err(); err != nil { + panic(err.Error()) + } + text := bytes.Fields([]byte(linescanner.Text())) + if len(text) == 0 { + continue + } + out <- text + } +} + +func OpenAndHandleSerial(filename string) (chan string, chan [][]byte, error) { + serial, err :=openTTY(filename) + if err != nil { + return nil, nil, err + } + wr := make(chan string, 1) + rd := make(chan [][]byte, 20) + go serialWriter(wr, serial) + go serialReader(rd, serial) + return wr, rd, nil +}