From 0cd8982a904a53ad280657f9047edf9ed06743b0 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sat, 23 May 2015 17:51:25 +0200 Subject: OS-dependent build --- usb_darwin.go | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 usb_darwin.go (limited to 'usb_darwin.go') diff --git a/usb_darwin.go b/usb_darwin.go new file mode 100644 index 0000000..96612b6 --- /dev/null +++ b/usb_darwin.go @@ -0,0 +1,97 @@ +package robo + +import ( + "bufio" + "errors" + "log" + + "github.com/kylelemons/gousb/usb" +) + +type USB struct { + ctx *usb.Context + dev *usb.Device +} + +var ( + craftRobo = "Craft ROBO" + graphtec = usb.ID(0x0b4d) + cc200_20 = usb.ID(0x110a) + cc300_20 = usb.ID(0x111a) + silhouette_sd_1 = usb.ID(0x111c) + silhouette_sd_2 = usb.ID(0x111d) + silhouette_portrait = usb.ID(0x1123) + debug = 3 +) + +func init() { + // bump timeouts + usb.DefaultReadTimeout *= 60 + usb.DefaultWriteTimeout *= 300 +} + +func cc100(desc *usb.Descriptor) bool { + if desc.Vendor == graphtec { + switch desc.Product { + case cc200_20, cc300_20, + silhouette_sd_1, + silhouette_sd_2, + silhouette_portrait: + return true + } + } + return false +} + +func NewUSB() (USB, error) { + ctx := usb.NewContext() + ctx.Debug(debug) + devs, err := ctx.ListDevices(cc100) + if err != nil { + log.Fatal(err) + } + if len(devs) != 1 { + for _, dev := range devs { + dev.Close() + } + return USB{}, errors.New("Cannot find " + craftRobo) + } + return USB{ctx, devs[0]}, nil +} + +func (d USB) Close() { + d.dev.Close() + d.ctx.Close() +} + +func (d USB) Handle() *bufio.ReadWriter { + var ( + r *bufio.Reader + w *bufio.Writer + ) + + for _, c := range d.dev.Configs { + for _, i := range c.Interfaces { + for _, s := range i.Setups { + for _, ep := range s.Endpoints { + e, err := d.dev.OpenEndpoint( + c.Config, + i.Number, + s.Number, + ep.Address) + if err != nil { + log.Fatal(err) + } + switch ep.Direction() { + case usb.ENDPOINT_DIR_OUT: + w = bufio.NewWriter(e) + case usb.ENDPOINT_DIR_IN: + r = bufio.NewReader(e) + } + } + } + } + } + + return bufio.NewReadWriter(r, w) +} -- cgit v1.2.3