gobot.io/x/gobot/v2@v2.1.0/platforms/microbit/magnetometer_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 // MagnetometerDriver is the Gobot driver for the Microbit's built-in magnetometer 12 type MagnetometerDriver struct { 13 name string 14 connection gobot.Connection 15 gobot.Eventer 16 } 17 18 type RawMagnetometerData struct { 19 X int16 20 Y int16 21 Z int16 22 } 23 24 type MagnetometerData struct { 25 X float32 26 Y float32 27 Z float32 28 } 29 30 const ( 31 // BLE services 32 magnetometerService = "e95df2d8251d470aa062fa1922dfa9a8" 33 34 // BLE characteristics 35 magnetometerCharacteristic = "e95dfb11251d470aa062fa1922dfa9a8" 36 37 // Magnetometer event 38 Magnetometer = "magnetometer" 39 ) 40 41 // NewMagnetometerDriver creates a Microbit MagnetometerDriver 42 func NewMagnetometerDriver(a ble.BLEConnector) *MagnetometerDriver { 43 n := &MagnetometerDriver{ 44 name: gobot.DefaultName("Microbit Magnetometer"), 45 connection: a, 46 Eventer: gobot.NewEventer(), 47 } 48 49 n.AddEvent(Magnetometer) 50 51 return n 52 } 53 54 // Connection returns the BLE connection 55 func (b *MagnetometerDriver) Connection() gobot.Connection { return b.connection } 56 57 // Name returns the Driver Name 58 func (b *MagnetometerDriver) Name() string { return b.name } 59 60 // SetName sets the Driver Name 61 func (b *MagnetometerDriver) SetName(n string) { b.name = n } 62 63 // adaptor returns BLE adaptor 64 func (b *MagnetometerDriver) adaptor() ble.BLEConnector { 65 return b.Connection().(ble.BLEConnector) 66 } 67 68 // Start tells driver to get ready to do work 69 func (b *MagnetometerDriver) Start() (err error) { 70 // subscribe to magnetometer notifications 71 b.adaptor().Subscribe(magnetometerCharacteristic, func(data []byte, e error) { 72 a := &RawMagnetometerData{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 := &MagnetometerData{ 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(Magnetometer), result) 85 }) 86 87 return 88 } 89 90 // Halt stops LED driver (void) 91 func (b *MagnetometerDriver) Halt() (err error) { 92 return 93 }