From 64a552f7a69e20c174f929c5d4e800aa24b480f3 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sun, 27 Aug 2017 00:49:24 +0200 Subject: Make go getable --- main.go | 143 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 main.go (limited to 'main.go') diff --git a/main.go b/main.go new file mode 100644 index 0000000..837fa6a --- /dev/null +++ b/main.go @@ -0,0 +1,143 @@ +package main + +//go:generate sh -c "protoc --go_out=. --nanopb_out=elegoo/ *.proto" + +import ( + "bufio" + "io" + "log" + + "github.com/dim13/cobs" + "github.com/golang/protobuf/proto" + "github.com/tarm/serial" +) + +func Write(w io.Writer, pb proto.Message) error { + buf := new(proto.Buffer) + err := buf.EncodeMessage(pb) + if err != nil { + return err + } + block := cobs.Encode(buf.Bytes()) + _, err = w.Write(block) + return err +} + +func Read(buf *bufio.Reader, pb proto.Message) error { + block, err := buf.ReadBytes(0) + if err != nil { + return err + } + block = cobs.Decode(block) + return proto.NewBuffer(block).DecodeMessage(pb) +} + +// /dev/cu.Elegoo-DevB +// /dev/cu.usbmodem1421 +// /dev/cu.usbmodem1411 + +func Reader(r io.Reader) chan *Events { + c := make(chan *Events) + buf := bufio.NewReader(r) + go func() { + for { + evt := &Events{} + if err := Read(buf, evt); err != nil { + if err == io.ErrUnexpectedEOF { + continue + } + log.Println("ERR", err) + return + } + c <- evt + } + }() + return c +} + +func Writer(w io.Writer) chan *Command { + c := make(chan *Command) + go func() { + for cmd := range c { + log.Println("send", cmd) + Write(w, cmd) + } + }() + return c +} + +func main() { + c := &serial.Config{ + //Name: "/dev/tty.usbmodem1421", + //Name: "/dev/tty.usbmodem1411", + Name: "/dev/tty.Elegoo-DevB", + Baud: 57600, + } + s, err := serial.OpenPort(c) + if err != nil { + log.Fatal(err) + } + defer s.Close() + + w := Writer(s) + + w <- &Command{Direction: 80} + + for e := range Reader(s) { + log.Println("event", e) + if e.SensorC || e.Distance < 20 { + w <- &Command{Stop: true} + } + } + + /* log.Println("send -45") + time.Sleep(3 * time.Second) + Write(s, &Command{Direction: 5}) + + log.Println("send +45") + time.Sleep(3 * time.Second) + Write(s, &Command{Direction: 175}) + + log.Println("send +0") + time.Sleep(3 * time.Second) + Write(s, &Command{Direction: 90}) + */ + + /* log.Println("send motor") + Write(s, &Command{SpeedL: 200, SpeedR: 200, StopAfter: 1000}) + time.Sleep(time.Second) + + log.Println("send motor turn") + time.Sleep(time.Second) + Write(s, &Command{SpeedL: -250, SpeedR: 250, StopAfter: 500}) + + log.Println("send motor turn") + time.Sleep(time.Second) + Write(s, &Command{SpeedL: 250, SpeedR: -250, StopAfter: 500}) + */ + + /* MOTOR + cmd.SpeedL = 200 + cmd.SpeedR = 0 + cmd.Stop = false + Write(s, cmd) + time.Sleep(3 * time.Second) + + cmd.SpeedL = 0 + cmd.SpeedR = 0 + cmd.Stop = true + Write(s, cmd) + time.Sleep(3 * time.Second) + + cmd.SpeedL = 0 + cmd.SpeedR = 200 + cmd.Stop = false + Write(s, cmd) + time.Sleep(3 * time.Second) + + cmd.SpeedL = 0 + cmd.SpeedR = 0 + cmd.Stop = true + Write(s, cmd) + */ +} -- cgit v1.2.3