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