chan buffer and --bug
[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 // ---------- Serial TTY Code -------------
15
16 func openTTY(name string) (*os.File, error) {
17     file, err := os.OpenFile(name,os.O_RDWR, 0600) // For read access.
18     if err != nil {
19         log.Println(err.Error())
20         return nil, err
21     }
22     termios.Ttyfd(file.Fd())
23     termios.SetRaw()
24     return file, nil
25 }
26
27 func serialWriter(in <- chan string, serial * os.File) {
28     for totty := range(in) {
29         serial.WriteString(totty)
30         serial.Sync()
31     }
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(fmt.Sprintf("Error in read from serial: %v\n",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 }