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 }