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 }