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 }