2020-10-21 09:26:21 +02:00
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
import (
|
2020-10-21 13:59:56 +02:00
|
|
|
"os"
|
|
|
|
|
|
2020-10-21 09:26:21 +02:00
|
|
|
"github.com/google/goterm/term"
|
|
|
|
|
"github.com/nonoo/kappanhang/log"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type serialPortStruct struct {
|
|
|
|
|
pty *term.PTY
|
2020-10-21 09:37:26 +02:00
|
|
|
|
|
|
|
|
// Read from this channel to receive serial data.
|
|
|
|
|
read chan []byte
|
|
|
|
|
// Write to this channel to send serial data.
|
|
|
|
|
write chan []byte
|
2020-10-21 09:26:21 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var serialPort serialPortStruct
|
|
|
|
|
|
2020-10-21 09:37:26 +02:00
|
|
|
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 {
|
2020-10-21 13:59:56 +02:00
|
|
|
if _, ok := err.(*os.PathError); !ok {
|
|
|
|
|
exit(err)
|
|
|
|
|
}
|
2020-10-21 09:37:26 +02:00
|
|
|
}
|
|
|
|
|
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 {
|
2020-10-21 13:59:56 +02:00
|
|
|
if _, ok := err.(*os.PathError); !ok {
|
|
|
|
|
exit(err)
|
|
|
|
|
}
|
2020-10-21 09:37:26 +02:00
|
|
|
}
|
|
|
|
|
s.read <- b[:n]
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-10-21 09:26:21 +02:00
|
|
|
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)
|
2020-10-21 09:37:26 +02:00
|
|
|
|
|
|
|
|
go s.readLoop()
|
|
|
|
|
go s.writeLoop()
|
2020-10-21 09:26:21 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (s *serialPortStruct) deinit() {
|
|
|
|
|
if s.pty != nil {
|
|
|
|
|
s.pty.Close()
|
|
|
|
|
}
|
|
|
|
|
}
|