kappanhang/serial-linux.go
2020-10-21 13:59:56 +02:00

76 lines
1.2 KiB
Go

package main
import (
"os"
"github.com/google/goterm/term"
"github.com/nonoo/kappanhang/log"
)
type serialPortStruct struct {
pty *term.PTY
// Read from this channel to receive serial data.
read chan []byte
// Write to this channel to send serial data.
write chan []byte
}
var serialPort serialPortStruct
func (s *serialPortStruct) writeLoop() {
s.write = make(chan []byte)
var b []byte
for {
b = <-s.write
bytesToWrite := len(b)
for bytesToWrite > 0 {
written, err := s.pty.Master.Write(b)
if err != nil {
if _, ok := err.(*os.PathError); !ok {
exit(err)
}
}
b = b[written:]
bytesToWrite -= written
}
}
}
func (s *serialPortStruct) readLoop() {
s.read = make(chan []byte)
b := make([]byte, 1500)
for {
n, err := s.pty.Master.Read(b)
if err != nil {
if _, ok := err.(*os.PathError); !ok {
exit(err)
}
}
s.read <- b[:n]
}
}
func (s *serialPortStruct) init() {
var err error
s.pty, err = term.OpenPTY()
if err != nil {
exit(err)
}
n, err := s.pty.PTSName()
if err != nil {
exit(err)
}
log.Print("opened ", n)
go s.readLoop()
go s.writeLoop()
}
func (s *serialPortStruct) deinit() {
if s.pty != nil {
s.pty.Close()
}
}