gobot.io/x/gobot/v2@v2.1.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/v2" 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 // 32 // "message" - Gets triggered when receiving a message from leap motion 33 // "hand" - Gets triggered per-message when leap motion detects a hand 34 // "gesture" - Gets triggered per-message when leap motion detects a gesture 35 func NewDriver(a *Adaptor) *Driver { 36 l := &Driver{ 37 name: gobot.DefaultName("LeapMotion"), 38 connection: a, 39 Eventer: gobot.NewEventer(), 40 receive: func(ws io.ReadWriteCloser, msg *[]byte) { 41 websocket.Message.Receive(ws.(*websocket.Conn), msg) 42 }, 43 } 44 45 l.AddEvent(MessageEvent) 46 l.AddEvent(HandEvent) 47 l.AddEvent(GestureEvent) 48 return l 49 } 50 51 // Name returns the Driver Name 52 func (l *Driver) Name() string { return l.name } 53 54 // SetName sets the Driver Name 55 func (l *Driver) SetName(n string) { l.name = n } 56 57 // Connection returns the Driver's Connection 58 func (l *Driver) Connection() gobot.Connection { return l.connection } 59 60 // adaptor returns leap motion adaptor 61 func (l *Driver) adaptor() *Adaptor { 62 return l.Connection().(*Adaptor) 63 } 64 65 func enableFeature(l *Driver, feature string) (err error) { 66 command := map[string]bool{feature: true} 67 b, e := json.Marshal(command) 68 if e != nil { 69 return e 70 } 71 _, e = l.adaptor().ws.Write(b) 72 if e != nil { 73 return e 74 } 75 76 return nil 77 } 78 79 // Start inits leap motion driver by enabling gestures 80 // and listening from incoming messages. 81 // 82 // Publishes the following events: 83 // 84 // "message" - Emits Frame on new message received from Leap. 85 // "hand" - Emits Hand when detected in message from Leap. 86 // "gesture" - Emits Gesture when detected in message from Leap. 87 func (l *Driver) Start() (err error) { 88 err = enableFeature(l, "enableGestures") 89 if err != nil { 90 return err 91 } 92 err = enableFeature(l, "background") 93 if err != nil { 94 return err 95 } 96 97 go func() { 98 var msg []byte 99 var frame Frame 100 for { 101 l.receive(l.adaptor().ws, &msg) 102 frame = l.ParseFrame(msg) 103 l.Publish(MessageEvent, frame) 104 105 for _, hand := range frame.Hands { 106 l.Publish(HandEvent, hand) 107 } 108 109 for _, gesture := range frame.Gestures { 110 l.Publish(GestureEvent, gesture) 111 } 112 } 113 }() 114 115 return 116 } 117 118 // Halt returns nil if driver is halted successfully 119 func (l *Driver) Halt() (errs error) { return }