aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-12-13 01:18:14 +0100
committerDimitri Sokolyuk <demon@dim13.org>2017-12-13 01:18:14 +0100
commit732860bb71bc8295de46dbed539672a22a60d87d (patch)
treefe254dbf0d1696b42237880858c4cbd2b7d37154
parent156a9a2271d47934a97ff00f33b8a61c8a49f125 (diff)
Add NewComm
-rw-r--r--elegoo.go30
-rw-r--r--fsm.go15
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
}