From 732860bb71bc8295de46dbed539672a22a60d87d Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Wed, 13 Dec 2017 01:18:14 +0100 Subject: Add NewComm --- elegoo.go | 30 +++++++++++++++++++----------- fsm.go | 15 +++++++-------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/elegoo.go b/elegoo.go index c2d19c7..b13f4da 100644 --- a/elegoo.go +++ b/elegoo.go @@ -10,25 +10,33 @@ import ( //go:generate sh -c "protoc --go_out=. --nanopb_out=firmware/ *.proto" -func Send(w io.Writer, pb proto.Message) error { +type ProtoComm interface { + Send(pb proto.Message) error + Recv(pb proto.Message) error +} + +type Comm struct { + w *bufio.Writer + r *bufio.Reader +} + +func NewComm(rw io.ReadWriter) Comm { + return Comm{w: bufio.NewWriter(rw), r: bufio.NewReader(rw)} +} + +func (c Comm) Send(pb proto.Message) error { buf := new(proto.Buffer) if err := buf.EncodeMessage(pb); err != nil { return err } - _, err := w.Write(cobs.Encode(buf.Bytes())) - return err -} - -func RecvR(r io.Reader, pb proto.Message) error { - block, err := bufio.NewReader(r).ReadBytes(0) - if err != nil { + if _, err := c.w.Write(cobs.Encode(buf.Bytes())); err != nil { return err } - return proto.NewBuffer(cobs.Decode(block)).DecodeMessage(pb) + return c.w.Flush() } -func Recv(buf *bufio.Reader, pb proto.Message) error { - block, err := buf.ReadBytes(0) +func (c Comm) Recv(pb proto.Message) error { + block, err := c.r.ReadBytes(0) if err != nil { return err } diff --git a/fsm.go b/fsm.go index d061995..768e566 100644 --- a/fsm.go +++ b/fsm.go @@ -1,7 +1,6 @@ package elegoo import ( - "bufio" "io" "log" ) @@ -16,16 +15,16 @@ type FSM struct { func NewFSM(rw io.ReadWriter) *FSM { events := make(chan *Event) commands := make(chan *Command) - go readEvents(rw, events) - go writeCommands(rw, commands) + comm := NewComm(rw) + go readEvents(comm, events) + go writeCommands(comm, commands) return &FSM{events: events, commands: commands} } -func readEvents(r io.Reader, ch chan<- *Event) { - buf := bufio.NewReader(r) +func readEvents(c ProtoComm, ch chan<- *Event) { for { event := new(Event) - if err := Recv(buf, event); err != nil { + if err := c.Recv(event); err != nil { if err == io.ErrUnexpectedEOF { continue } @@ -36,9 +35,9 @@ func readEvents(r io.Reader, ch chan<- *Event) { } } -func writeCommands(w io.Writer, ch <-chan *Command) { +func writeCommands(c ProtoComm, ch <-chan *Command) { for command := range ch { - if err := Send(w, command); err != nil { + if err := c.Send(command); err != nil { if err == io.ErrUnexpectedEOF { continue } -- cgit v1.2.3