de06bdd4bd0d7a191b186b962c9f55f22fc02295
[svn42.git] / go / uc_sensor_node_zmq / serial_tty.go
1 // (c) Bernhard Tittelbach, 2013
2
3 package main
4
5 import (
6     "bufio"
7     "bytes"
8     "os"
9     "svn.spreadspace.org/realraum/go.svn/termios"
10 )
11
12
13 // ---------- Serial TTY Code -------------
14
15 func openTTY(name string) (*os.File, error) {
16     file, err := os.OpenFile(name,os.O_RDWR, 0600) // For read access.
17     if err != nil {
18         Syslog_.Print(err.Error())
19         return nil, err
20     }
21     termios.Ttyfd(file.Fd())
22     termios.SetRaw()
23     return file, nil
24 }
25
26 func serialWriter(in <- chan string, serial * os.File) {
27     for totty := range(in) {
28         serial.WriteString(totty)
29         serial.Sync()
30     }
31     serial.Close()
32 }
33
34 func serialReader(out chan <- [][]byte, serial * os.File) {
35     linescanner := bufio.NewScanner(serial)
36     linescanner.Split(bufio.ScanLines)
37     for linescanner.Scan() {
38         if err := linescanner.Err(); err != nil {
39             panic(err.Error())
40         }
41         text := bytes.Fields([]byte(linescanner.Text()))
42         if len(text) == 0 {
43             continue
44         }
45         out <- text
46     }
47 }
48
49 func OpenAndHandleSerial(filename string) (chan string, chan [][]byte, error) {
50     serial, err :=openTTY(filename)
51     if err != nil {
52         return nil, nil, err
53     }
54     wr := make(chan string, 1)
55         rd := make(chan [][]byte, 20)
56     go serialWriter(wr, serial)
57     go serialReader(rd, serial)
58     return wr, rd, nil
59 }