gobot.io/x/gobot/v2@v2.1.0/platforms/microbit/accelerometer_driver.go (about)

     1  package microbit
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/binary"
     6  
     7  	"gobot.io/x/gobot/v2"
     8  	"gobot.io/x/gobot/v2/platforms/ble"
     9  )
    10  
    11  // AccelerometerDriver is the Gobot driver for the Microbit's built-in accelerometer
    12  type AccelerometerDriver struct {
    13  	name       string
    14  	connection gobot.Connection
    15  	gobot.Eventer
    16  }
    17  
    18  type RawAccelerometerData struct {
    19  	X int16
    20  	Y int16
    21  	Z int16
    22  }
    23  
    24  type AccelerometerData struct {
    25  	X float32
    26  	Y float32
    27  	Z float32
    28  }
    29  
    30  const (
    31  	// BLE services
    32  	accelerometerService = "e95d0753251d470aa062fa1922dfa9a8"
    33  
    34  	// BLE characteristics
    35  	accelerometerCharacteristic = "e95dca4b251d470aa062fa1922dfa9a8"
    36  
    37  	// Accelerometer event
    38  	Accelerometer = "accelerometer"
    39  )
    40  
    41  // NewAccelerometerDriver creates a Microbit AccelerometerDriver
    42  func NewAccelerometerDriver(a ble.BLEConnector) *AccelerometerDriver {
    43  	n := &AccelerometerDriver{
    44  		name:       gobot.DefaultName("Microbit Accelerometer"),
    45  		connection: a,
    46  		Eventer:    gobot.NewEventer(),
    47  	}
    48  
    49  	n.AddEvent(Accelerometer)
    50  
    51  	return n
    52  }
    53  
    54  // Connection returns the BLE connection
    55  func (b *AccelerometerDriver) Connection() gobot.Connection { return b.connection }
    56  
    57  // Name returns the Driver Name
    58  func (b *AccelerometerDriver) Name() string { return b.name }
    59  
    60  // SetName sets the Driver Name
    61  func (b *AccelerometerDriver) SetName(n string) { b.name = n }
    62  
    63  // adaptor returns BLE adaptor
    64  func (b *AccelerometerDriver) adaptor() ble.BLEConnector {
    65  	return b.Connection().(ble.BLEConnector)
    66  }
    67  
    68  // Start tells driver to get ready to do work
    69  func (b *AccelerometerDriver) Start() (err error) {
    70  	// subscribe to accelerometer notifications
    71  	b.adaptor().Subscribe(accelerometerCharacteristic, func(data []byte, e error) {
    72  		a := &RawAccelerometerData{X: 0, Y: 0, Z: 0}
    73  
    74  		buf := bytes.NewBuffer(data)
    75  		binary.Read(buf, binary.LittleEndian, &a.X)
    76  		binary.Read(buf, binary.LittleEndian, &a.Y)
    77  		binary.Read(buf, binary.LittleEndian, &a.Z)
    78  
    79  		result := &AccelerometerData{
    80  			X: float32(a.X) / 1000.0,
    81  			Y: float32(a.Y) / 1000.0,
    82  			Z: float32(a.Z) / 1000.0}
    83  
    84  		b.Publish(b.Event(Accelerometer), result)
    85  	})
    86  
    87  	return
    88  }
    89  
    90  // Halt stops LED driver (void)
    91  func (b *AccelerometerDriver) Halt() (err error) {
    92  	return
    93  }