1package main23import (4 "bytes"5 "errors"67 "github.com/Lobaro/slip"8 "go.bug.st/serial"9)1011type Packet struct {12 FrameType byte13 Data []byte14}1516type SerialEndpoint struct {17 port serial.Port1819 RX <-chan Packet20 TX chan<- []byte21}2223func NewSerialEP(path string) (*SerialEndpoint, error) {24 mode := &serial.Mode{25 BaudRate: baudRate,26 DataBits: 8,27 Parity: serial.NoParity,28 StopBits: serial.OneStopBit,29 }3031 port, err := serial.Open(path, mode)32 if err != nil {33 return nil, err34 }3536 rx := make(chan Packet)37 tx := make(chan []byte)3839 ep := &SerialEndpoint{40 port: port,41 RX: rx,42 TX: tx,43 }4445 go ep.rcvLoop(rx)46 go ep.sndLoop(tx)4748 return ep, nil49}5051func (s *SerialEndpoint) sndLoop(ch <-chan []byte) {52 writer := slip.NewSlipMuxWriter(NewSlowWriter(s.port))5354 for {55 data := <-ch5657 err := writer.WritePacket(slip.FRAME_COAP, data)58 if err != nil {59 logger.Println("handleCoap:", err)60 continue61 }62 }63}6465func (s *SerialEndpoint) rcvLoop(ch chan<- Packet) {66 reader := slip.NewSlipMuxReader(s.port)6768 for {69 packet, frame, err := reader.ReadPacket()7071 var perr *serial.PortError72 if errors.As(err, &perr) && perr.Code() == serial.PortClosed {73 logger.Fatal("[SerialEndpoint]", err)74 } else if err != nil {75 logger.Println("[SerialEndpoint]", err)76 continue77 }7879 packet = bytes.TrimPrefix(packet, []byte{0})80 ch <- Packet{frame, packet}81 }82}8384func (s *SerialEndpoint) Close() {85 // close(s.Chan)86 // TODO: Close TTYIO87}