gobot.io/x/gobot@v1.16.0/platforms/leap/leap_motion_driver.go (about) 1 package leap 2 3 import ( 4 "encoding/json" 5 "io" 6 7 "gobot.io/x/gobot" 8 "golang.org/x/net/websocket" 9 ) 10 11 const ( 12 // MessageEvent event 13 MessageEvent = "message" 14 // HandEvent event 15 HandEvent = "hand" 16 // GestureEvent event 17 GestureEvent = "gesture" 18 ) 19 20 // Driver the Gobot software device to the Leap Motion 21 type Driver struct { 22 name string 23 connection gobot.Connection 24 receive func(ws io.ReadWriteCloser, msg *[]byte) 25 gobot.Eventer 26 } 27 28 // NewDriver creates a new leap motion driver 29 // 30 // Adds the following events: 31 // "message" - Gets triggered when receiving a message from leap motion 32 // "hand" - Gets triggered per-message when leap motion detects a hand 33 // "gesture" - Gets triggered per-message when leap motion detects a gesture 34 func NewDriver(a *Adaptor) *Driver { 35 l := &Driver{ 36 name: gobot.DefaultName("LeapMotion"), 37 connection: a, 38 Eventer: gobot.NewEventer(), 39 receive: func(ws io.ReadWriteCloser, msg *[]byte) { 40 websocket.Message.Receive(ws.(*websocket.Conn), msg) 41 }, 42 } 43 44 l.AddEvent(MessageEvent) 45 l.AddEvent(HandEvent) 46 l.AddEvent(GestureEvent) 47 return l 48 } 49 50 // Name returns the Driver Name 51 func (l *Driver) Name() string { return l.name } 52 53 // SetName sets the Driver Name 54 func (l *Driver) SetName(n string) { l.name = n } 55 56 // Connection returns the Driver's Connection 57 func (l *Driver) Connection() gobot.Connection { return l.connection } 58 59 // adaptor returns leap motion adaptor 60 func (l *Driver) adaptor() *Adaptor { 61 return l.Connection().(*Adaptor) 62 } 63 64 func enableFeature(l *Driver, feature string) (err error) { 65 command := map[string]bool{feature: true} 66 b, e := json.Marshal(command) 67 if e != nil { 68 return e 69 } 70 _, e = l.adaptor().ws.Write(b) 71 if e != nil { 72 return e 73 } 74 75 return nil 76 } 77 78 // Start inits leap motion driver by enabling gestures 79 // and listening from incoming messages. 80 // 81 // Publishes the following events: 82 // "message" - Emits Frame on new message received from Leap. 83 // "hand" - Emits Hand when detected in message from Leap. 84 // "gesture" - Emits Gesture when detected in message from Leap. 85 func (l *Driver) Start() (err error) { 86 err = enableFeature(l,"enableGestures") 87 if err != nil { 88 return err 89 } 90 err = enableFeature(l,"background") 91 if err != nil { 92 return err 93 } 94 95 go func() { 96 var msg []byte 97 var frame Frame 98 for { 99 l.receive(l.adaptor().ws, &msg) 100 frame = l.ParseFrame(msg) 101 l.Publish(MessageEvent, frame) 102 103 for _, hand := range frame.Hands { 104 l.Publish(HandEvent, hand) 105 } 106 107 for _, gesture := range frame.Gestures { 108 l.Publish(GestureEvent, gesture) 109 } 110 } 111 }() 112 113 return 114 } 115 116 // Halt returns nil if driver is halted successfully 117 func (l *Driver) Halt() (errs error) { return }