ac6b1bb0b33ace26c33d354a968ea3dba14315a3
[svn42.git] / go / door_daemon_zmq / serial_tty.go
1 // (c) Bernhard Tittelbach, 2013
2
3 package main
4
5 import (
6     "bufio"
7     "bytes"
8     "os"
9     "errors"
10     "svn.spreadspace.org/realraum/go.svn/termios"
11 )
12
13
14 // ---------- Serial TTY Code -------------
15
16 func openTTY(name string, speed uint) (file *os.File, err error) {
17     file, err = os.OpenFile(name,os.O_RDWR, 0666)
18     if err != nil { return }
19     if err = termios.SetRawFile(file); err != nil { return }
20     switch speed {
21         case 0: // set no baudrate
22         case 1200: err = termios.SetSpeedFile(file, termios.B1200)
23         case 2400: err = termios.SetSpeedFile(file, termios.B2400)
24         case 4800: err = termios.SetSpeedFile(file, termios.B4800)
25         case 9600: err = termios.SetSpeedFile(file, termios.B9600)
26         case 19200: err = termios.SetSpeedFile(file, termios.B19200)
27         case 38400: err = termios.SetSpeedFile(file, termios.B38400)
28         case 57600: err = termios.SetSpeedFile(file, termios.B57600)
29         case 115200: err = termios.SetSpeedFile(file, termios.B115200)
30         case 230400: err = termios.SetSpeedFile(file, termios.B230400)
31         default:
32             file.Close()
33             err = errors.New("Unsupported Baudrate, use 0 to disable setting a baudrate")
34     }
35     return
36 }
37
38 func serialWriter(in <- chan string, serial * os.File) {
39     for totty := range(in) {
40         serial.WriteString(totty)
41         serial.Sync()
42     }
43     serial.Close()
44 }
45
46 func serialReader(out chan <- [][]byte, serial * os.File) {
47     linescanner := bufio.NewScanner(serial)
48     linescanner.Split(bufio.ScanLines)
49     for linescanner.Scan() {
50         if err := linescanner.Err(); err != nil {
51             panic(err.Error())
52         }
53         text := bytes.Fields([]byte(linescanner.Text()))
54         if len(text) == 0 {
55             continue
56         }
57         out <- text
58     }
59 }
60
61 func OpenAndHandleSerial(filename string, serspeed uint) (chan string, chan [][]byte, error) {
62     serial, err :=openTTY(filename, serspeed)
63     if err != nil {
64         return nil, nil, err
65     }
66     wr := make(chan string, 1)
67         rd := make(chan [][]byte, 20)
68     go serialWriter(wr, serial)
69     go serialReader(rd, serial)
70     return wr, rd, nil
71 }