door_daemon_zmq
[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, topub 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         topub <- text
47     }
48 }
49
50 func OpenAndHandleSerial(filename string, topub chan <- [][]byte) (chan string, chan [][]byte, error) {
51     serial, err :=openTTY(filename)
52     if err != nil {
53         return nil, nil, err
54     }
55     var wr chan string
56     var rd chan [][]byte
57     go SerialWriter(wr, serial)
58     go SerialReader(rd, topub, serial)
59     return wr, rd, nil
60 }