48afd33373ad1ff2bc896d3b6037ae9a4c03a9ec
[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 }
34
35 func serialReader(out chan <- [][]byte, serial * os.File) {
36     linescanner := bufio.NewScanner(serial)
37     linescanner.Split(bufio.ScanLines)
38     for linescanner.Scan() {
39         if err := linescanner.Err(); err != nil {
40             panic(fmt.Sprintf("Error in read from serial: %v\n",err.Error()))
41         }
42         text := bytes.Fields([]byte(linescanner.Text()))
43         if len(text) == 0 {
44             continue
45         }
46         out <- text
47     }
48 }
49
50 func OpenAndHandleSerial(filename string) (chan string, chan [][]byte, error) {
51     serial, err :=openTTY(filename)
52     if err != nil {
53         return nil, nil, err
54     }
55     wr := make(chan string, 1)
56         rd := make(chan [][]byte, 20)
57     go serialWriter(wr, serial)
58     go serialReader(rd, serial)
59     return wr, rd, nil
60 }