@@ -84,31 +84,20 @@ func (d *Device) doConfigure(cfg Configuration) (err error) {
8484 }
8585
8686 // Configure accelerometer
87- d .buf [0 ] = CTRL1_XL
88- d .buf [1 ] = uint8 (d .accelRange ) | uint8 (d .accelSampleRate )
87+ d .writeValue (CTRL1_XL , uint8 (d .accelRange )| uint8 (d .accelSampleRate ))
8988 err = d .bus .Tx (d .Address , d .buf [0 :2 ], nil )
9089 if err != nil {
9190 return
9291 }
9392
94- // Set ODR bit
95- d .buf [0 ] = CTRL4_C
96- err = d .bus .Tx (d .Address , d .buf [0 :1 ], d .buf [1 :2 ])
97- if err != nil {
98- return
99- }
100- d .buf [0 ] = CTRL4_C
101- d .buf [1 ] = d .buf [1 ] &^ BW_SCAL_ODR_ENABLED
102- d .buf [1 ] |= BW_SCAL_ODR_ENABLED
103- err = d .bus .Tx (d .Address , d .buf [0 :2 ], nil )
93+ // Enable ODR scaling
94+ err = d .setBits (CTRL4_C , BW_SCAL_ODR_ENABLED )
10495 if err != nil {
10596 return
10697 }
10798
10899 // Configure gyroscope
109- d .buf [0 ] = CTRL2_G
110- d .buf [1 ] = uint8 (d .gyroRange ) | uint8 (d .gyroSampleRate )
111- err = d .bus .Tx (d .Address , d .buf [0 :2 ], nil )
100+ err = d .writeValue (CTRL2_G , uint8 (d .gyroRange )| uint8 (d .gyroSampleRate ))
112101 if err != nil {
113102 return
114103 }
@@ -119,8 +108,10 @@ func (d *Device) doConfigure(cfg Configuration) (err error) {
119108// Connected returns whether a LSM6DS3TR has been found.
120109// It does a "who am I" request and checks the response.
121110func (d * Device ) Connected () bool {
122- d .buf [0 ] = WHO_AM_I
123- d .bus .Tx (d .Address , d .buf [0 :1 ], d .buf [1 :2 ])
111+ err := d .readValue (WHO_AM_I , 1 )
112+ if err != nil {
113+ return false
114+ }
124115 return d .buf [1 ] == 0x6A
125116}
126117
@@ -129,8 +120,7 @@ func (d *Device) Connected() bool {
129120// and the sensor is not moving the returned value will be around 1000000 or
130121// -1000000.
131122func (d * Device ) ReadAcceleration () (x , y , z int32 , err error ) {
132- d .buf [0 ] = OUTX_L_XL
133- err = d .bus .Tx (d .Address , d .buf [0 :1 ], d .buf [1 :7 ])
123+ err = d .readValue (OUTX_L_XL , 6 )
134124 if err != nil {
135125 return
136126 }
@@ -154,8 +144,7 @@ func (d *Device) ReadAcceleration() (x, y, z int32, err error) {
154144// rotation along one axis and while doing so integrate all values over time,
155145// you would get a value close to 360000000.
156146func (d * Device ) ReadRotation () (x , y , z int32 , err error ) {
157- d .buf [0 ] = OUTX_L_G
158- err = d .bus .Tx (d .Address , d .buf [0 :1 ], d .buf [1 :7 ])
147+ err = d .readValue (OUTX_L_G , 6 )
159148 if err != nil {
160149 return
161150 }
@@ -178,8 +167,7 @@ func (d *Device) ReadRotation() (x, y, z int32, err error) {
178167
179168// ReadTemperature returns the temperature in celsius milli degrees (°C/1000)
180169func (d * Device ) ReadTemperature () (t int32 , err error ) {
181- d .buf [0 ] = OUT_TEMP_L
182- err = d .bus .Tx (d .Address , d .buf [0 :1 ], d .buf [1 :3 ])
170+ err = d .readValue (OUT_TEMP_L , 2 )
183171 if err != nil {
184172 return
185173 }
@@ -188,3 +176,22 @@ func (d *Device) ReadTemperature() (t int32, err error) {
188176 t = 25000 + (int32 (int16 ((int16 (d .buf [2 ])<< 8 )| int16 (d .buf [1 ])))* 125 )/ 32
189177 return
190178}
179+
180+ func (d * Device ) readValue (reg , size uint8 ) error {
181+ d .buf [0 ] = reg
182+ return d .bus .Tx (d .Address , d .buf [0 :1 ], d .buf [1 :size + 1 ])
183+ }
184+
185+ func (d * Device ) writeValue (reg , value uint8 ) error {
186+ d .buf [0 ] = reg
187+ d .buf [1 ] = value
188+ return d .bus .Tx (d .Address , d .buf [0 :2 ], nil )
189+ }
190+
191+ func (d * Device ) setBits (reg , bits uint8 ) (err error ) {
192+ err = d .readValue (reg , 1 )
193+ if err != nil {
194+ return
195+ }
196+ return d .writeValue (reg , (d .buf [1 ]&^bits )| bits )
197+ }
0 commit comments