X-Git-Url: https://git.realraum.at/?a=blobdiff_plain;f=go%2Fdoor_daemon_zmq%2Fserial_tty.go;h=ac6b1bb0b33ace26c33d354a968ea3dba14315a3;hb=a87c91b7d4544703879b7ef6e472b863765e3949;hp=4ec786af41763a2c0388251992cc3e4a6baed156;hpb=88e758b4025ef2a84acafc7b832a41028280c296;p=svn42.git diff --git a/go/door_daemon_zmq/serial_tty.go b/go/door_daemon_zmq/serial_tty.go index 4ec786a..ac6b1bb 100644 --- a/go/door_daemon_zmq/serial_tty.go +++ b/go/door_daemon_zmq/serial_tty.go @@ -3,58 +3,69 @@ package main import ( - "fmt" "bufio" "bytes" "os" + "errors" "svn.spreadspace.org/realraum/go.svn/termios" - "log" ) + // ---------- Serial TTY Code ------------- -func openTTY(name string) (*os.File, error) { - file, err := os.OpenFile(name,os.O_RDWR, 0600) // For read access. - if err != nil { - log.Println(err.Error()) - return nil, err +func openTTY(name string, speed uint) (file *os.File, err error) { + file, err = os.OpenFile(name,os.O_RDWR, 0666) + if err != nil { return } + if err = termios.SetRawFile(file); err != nil { return } + switch speed { + case 0: // set no baudrate + case 1200: err = termios.SetSpeedFile(file, termios.B1200) + case 2400: err = termios.SetSpeedFile(file, termios.B2400) + case 4800: err = termios.SetSpeedFile(file, termios.B4800) + case 9600: err = termios.SetSpeedFile(file, termios.B9600) + case 19200: err = termios.SetSpeedFile(file, termios.B19200) + case 38400: err = termios.SetSpeedFile(file, termios.B38400) + case 57600: err = termios.SetSpeedFile(file, termios.B57600) + case 115200: err = termios.SetSpeedFile(file, termios.B115200) + case 230400: err = termios.SetSpeedFile(file, termios.B230400) + default: + file.Close() + err = errors.New("Unsupported Baudrate, use 0 to disable setting a baudrate") } - termios.Ttyfd(file.Fd()) - termios.SetRaw() - return file, nil + return } -func SerialWriter(in <- chan string, serial * os.File) { +func serialWriter(in <- chan string, serial * os.File) { for totty := range(in) { serial.WriteString(totty) serial.Sync() } + serial.Close() } -func SerialReader(out chan <- [][]byte, topub chan <- [][]byte, serial * os.File) { +func serialReader(out chan <- [][]byte, serial * os.File) { linescanner := bufio.NewScanner(serial) linescanner.Split(bufio.ScanLines) for linescanner.Scan() { if err := linescanner.Err(); err != nil { - panic(fmt.Sprintf("Error in read from serial: %v\n",err.Error())) + panic(err.Error()) } text := bytes.Fields([]byte(linescanner.Text())) if len(text) == 0 { continue } out <- text - topub <- text } } -func OpenAndHandleSerial(filename string, topub chan <- [][]byte) (chan string, chan [][]byte, error) { - serial, err :=openTTY(filename) +func OpenAndHandleSerial(filename string, serspeed uint) (chan string, chan [][]byte, error) { + serial, err :=openTTY(filename, serspeed) if err != nil { return nil, nil, err } - var wr chan string - var rd chan [][]byte - go SerialWriter(wr, serial) - go SerialReader(rd, topub, serial) + wr := make(chan string, 1) + rd := make(chan [][]byte, 20) + go serialWriter(wr, serial) + go serialReader(rd, serial) return wr, rd, nil }