@@ -24,6 +24,10 @@ Adafruit_LSM9DS0::Adafruit_LSM9DS0( int32_t sensorID ) {
24
24
_lsm9dso_sensorid_mag = sensorID + 2 ;
25
25
_lsm9dso_sensorid_gyro = sensorID + 3 ;
26
26
_lsm9dso_sensorid_temp = sensorID + 4 ;
27
+ _accelSensor = Sensor (this , &Adafruit_LSM9DS0::readAccel, &Adafruit_LSM9DS0::getAccelEvent, &Adafruit_LSM9DS0::getAccelSensor);
28
+ _magSensor = Sensor (this , &Adafruit_LSM9DS0::readMag, &Adafruit_LSM9DS0::getMagEvent, &Adafruit_LSM9DS0::getMagSensor);
29
+ _gyroSensor = Sensor (this , &Adafruit_LSM9DS0::readGyro, &Adafruit_LSM9DS0::getGyroEvent, &Adafruit_LSM9DS0::getGyroSensor);
30
+ _tempSensor = Sensor (this , &Adafruit_LSM9DS0::readTemp, &Adafruit_LSM9DS0::getTempEvent, &Adafruit_LSM9DS0::getTempSensor);
27
31
}
28
32
29
33
Adafruit_LSM9DS0::Adafruit_LSM9DS0 (int8_t xmcs, int8_t gcs, int32_t sensorID ) {
@@ -36,6 +40,10 @@ Adafruit_LSM9DS0::Adafruit_LSM9DS0(int8_t xmcs, int8_t gcs, int32_t sensorID ) {
36
40
_lsm9dso_sensorid_mag = sensorID + 2 ;
37
41
_lsm9dso_sensorid_gyro = sensorID + 3 ;
38
42
_lsm9dso_sensorid_temp = sensorID + 4 ;
43
+ _accelSensor = Sensor (this , &Adafruit_LSM9DS0::readAccel, &Adafruit_LSM9DS0::getAccelEvent, &Adafruit_LSM9DS0::getAccelSensor);
44
+ _magSensor = Sensor (this , &Adafruit_LSM9DS0::readMag, &Adafruit_LSM9DS0::getMagEvent, &Adafruit_LSM9DS0::getMagSensor);
45
+ _gyroSensor = Sensor (this , &Adafruit_LSM9DS0::readGyro, &Adafruit_LSM9DS0::getGyroEvent, &Adafruit_LSM9DS0::getGyroSensor);
46
+ _tempSensor = Sensor (this , &Adafruit_LSM9DS0::readTemp, &Adafruit_LSM9DS0::getTempEvent, &Adafruit_LSM9DS0::getTempSensor);
39
47
}
40
48
41
49
Adafruit_LSM9DS0::Adafruit_LSM9DS0 (int8_t clk, int8_t miso, int8_t mosi, int8_t xmcs, int8_t gcs, int32_t sensorID ) {
@@ -50,6 +58,10 @@ Adafruit_LSM9DS0::Adafruit_LSM9DS0(int8_t clk, int8_t miso, int8_t mosi, int8_t
50
58
_lsm9dso_sensorid_mag = sensorID + 2 ;
51
59
_lsm9dso_sensorid_gyro = sensorID + 3 ;
52
60
_lsm9dso_sensorid_temp = sensorID + 4 ;
61
+ _accelSensor = Sensor (this , &Adafruit_LSM9DS0::readAccel, &Adafruit_LSM9DS0::getAccelEvent, &Adafruit_LSM9DS0::getAccelSensor);
62
+ _magSensor = Sensor (this , &Adafruit_LSM9DS0::readMag, &Adafruit_LSM9DS0::getMagEvent, &Adafruit_LSM9DS0::getMagSensor);
63
+ _gyroSensor = Sensor (this , &Adafruit_LSM9DS0::readGyro, &Adafruit_LSM9DS0::getGyroEvent, &Adafruit_LSM9DS0::getGyroSensor);
64
+ _tempSensor = Sensor (this , &Adafruit_LSM9DS0::readTemp, &Adafruit_LSM9DS0::getTempEvent, &Adafruit_LSM9DS0::getTempSensor);
53
65
}
54
66
55
67
bool Adafruit_LSM9DS0::begin ()
@@ -123,12 +135,19 @@ bool Adafruit_LSM9DS0::begin()
123
135
***************************************************************************/
124
136
void Adafruit_LSM9DS0::read ()
125
137
{
126
- byte buffer[6 ];
138
+ /* Read all the sensors. */
139
+ readAccel ();
140
+ readMag ();
141
+ readGyro ();
142
+ readTemp ();
143
+ }
127
144
145
+ void Adafruit_LSM9DS0::readAccel () {
128
146
// Read the accelerometer
147
+ byte buffer[6 ];
129
148
readBuffer (XMTYPE,
130
- 0x80 | LSM9DS0_REGISTER_OUT_X_L_A,
131
- 6 , buffer);
149
+ 0x80 | LSM9DS0_REGISTER_OUT_X_L_A,
150
+ 6 , buffer);
132
151
133
152
uint8_t xlo = buffer[0 ];
134
153
int16_t xhi = buffer[1 ];
@@ -144,19 +163,21 @@ void Adafruit_LSM9DS0::read()
144
163
accelData.x = xhi;
145
164
accelData.y = yhi;
146
165
accelData.z = zhi;
147
-
148
-
166
+ }
167
+
168
+ void Adafruit_LSM9DS0::readMag () {
149
169
// Read the magnetometer
170
+ byte buffer[6 ];
150
171
readBuffer (XMTYPE,
151
- 0x80 | LSM9DS0_REGISTER_OUT_X_L_M,
152
- 6 , buffer);
172
+ 0x80 | LSM9DS0_REGISTER_OUT_X_L_M,
173
+ 6 , buffer);
153
174
154
- xlo = buffer[0 ];
155
- xhi = buffer[1 ];
156
- ylo = buffer[2 ];
157
- yhi = buffer[3 ];
158
- zlo = buffer[4 ];
159
- zhi = buffer[5 ];
175
+ uint8_t xlo = buffer[0 ];
176
+ int16_t xhi = buffer[1 ];
177
+ uint8_t ylo = buffer[2 ];
178
+ int16_t yhi = buffer[3 ];
179
+ uint8_t zlo = buffer[4 ];
180
+ int16_t zhi = buffer[5 ];
160
181
161
182
// Shift values to create properly formed integer (low byte first)
162
183
xhi <<= 8 ; xhi |= xlo;
@@ -165,18 +186,21 @@ void Adafruit_LSM9DS0::read()
165
186
magData.x = xhi;
166
187
magData.y = yhi;
167
188
magData.z = zhi;
189
+ }
168
190
191
+ void Adafruit_LSM9DS0::readGyro () {
169
192
// Read gyro
193
+ byte buffer[6 ];
170
194
readBuffer (GYROTYPE,
171
- 0x80 | LSM9DS0_REGISTER_OUT_X_L_G,
172
- 6 , buffer);
195
+ 0x80 | LSM9DS0_REGISTER_OUT_X_L_G,
196
+ 6 , buffer);
173
197
174
- xlo = buffer[0 ];
175
- xhi = buffer[1 ];
176
- ylo = buffer[2 ];
177
- yhi = buffer[3 ];
178
- zlo = buffer[4 ];
179
- zhi = buffer[5 ];
198
+ uint8_t xlo = buffer[0 ];
199
+ int16_t xhi = buffer[1 ];
200
+ uint8_t ylo = buffer[2 ];
201
+ int16_t yhi = buffer[3 ];
202
+ uint8_t zlo = buffer[4 ];
203
+ int16_t zhi = buffer[5 ];
180
204
181
205
// Shift values to create properly formed integer (low byte first)
182
206
xhi <<= 8 ; xhi |= xlo;
@@ -186,24 +210,23 @@ void Adafruit_LSM9DS0::read()
186
210
gyroData.x = xhi;
187
211
gyroData.y = yhi;
188
212
gyroData.z = zhi;
189
-
213
+ }
214
+
215
+ void Adafruit_LSM9DS0::readTemp () {
190
216
// Read temp sensor
217
+ byte buffer[2 ];
191
218
readBuffer (XMTYPE,
192
- 0x80 | LSM9DS0_REGISTER_TEMP_OUT_L_XM,
193
- 2 , buffer);
194
- xlo = buffer[0 ];
195
- xhi = buffer[1 ];
219
+ 0x80 | LSM9DS0_REGISTER_TEMP_OUT_L_XM,
220
+ 2 , buffer);
221
+ uint8_t xlo = buffer[0 ];
222
+ int16_t xhi = buffer[1 ];
196
223
197
224
xhi <<= 8 ; xhi |= xlo;
198
225
199
226
// Shift values to create properly formed integer (low byte first)
200
227
temperature = xhi;
201
-
202
-
203
228
}
204
229
205
-
206
-
207
230
void Adafruit_LSM9DS0::setupAccel ( lsm9ds0AccelRange_t range )
208
231
{
209
232
uint8_t reg = read8 (XMTYPE, LSM9DS0_REGISTER_CTRL_REG2_XM);
@@ -290,64 +313,15 @@ void Adafruit_LSM9DS0::getEvent(sensors_event_t *accelEvent,
290
313
sensors_event_t *gyroEvent,
291
314
sensors_event_t *tempEvent )
292
315
{
293
- /* Clear the events */
294
- if (accelEvent) memset (accelEvent, 0 , sizeof (sensors_event_t ));
295
- if (magEvent) memset (magEvent, 0 , sizeof (sensors_event_t ));
296
- if (gyroEvent) memset (gyroEvent, 0 , sizeof (sensors_event_t ));
297
- if (tempEvent) memset (tempEvent, 0 , sizeof (sensors_event_t ));
298
-
299
- /* update the sensor data */
316
+ /* Grab new sensor reading and timestamp. */
300
317
read ();
301
318
uint32_t timestamp = millis ();
302
319
303
- /* Update the accelerometer data */
304
- if (accelEvent) {
305
- accelEvent->version = sizeof (sensors_event_t );
306
- accelEvent->sensor_id = _lsm9dso_sensorid_accel;
307
- accelEvent->type = SENSOR_TYPE_ACCELEROMETER;
308
- accelEvent->timestamp = timestamp;
309
- accelEvent->acceleration .x = accelData.x * _accel_mg_lsb;
310
- accelEvent->acceleration .x /= 1000 ;
311
- accelEvent->acceleration .y = accelData.y * _accel_mg_lsb;
312
- accelEvent->acceleration .y /= 1000 ;
313
- accelEvent->acceleration .z = accelData.z * _accel_mg_lsb;
314
- accelEvent->acceleration .z /= 1000 ;
315
- }
316
-
317
- /* Update the magnetometer data */
318
- if (magEvent) {
319
- magEvent->version = sizeof (sensors_event_t );
320
- magEvent->sensor_id = _lsm9dso_sensorid_mag;
321
- magEvent->type = SENSOR_TYPE_MAGNETIC_FIELD;
322
- magEvent->timestamp = timestamp;
323
- magEvent->magnetic .x = magData.x * _mag_mgauss_lsb;
324
- magEvent->magnetic .x /= 1000 ;
325
- magEvent->magnetic .y = magData.y * _mag_mgauss_lsb;
326
- magEvent->magnetic .y /= 1000 ;
327
- magEvent->magnetic .z = magData.z * _mag_mgauss_lsb;
328
- magEvent->magnetic .z /= 1000 ;
329
- }
330
-
331
- /* Update the gyroscope data */
332
- if (gyroEvent) {
333
- gyroEvent->version = sizeof (sensors_event_t );
334
- gyroEvent->sensor_id = _lsm9dso_sensorid_accel;
335
- gyroEvent->type = SENSOR_TYPE_GYROSCOPE;
336
- gyroEvent->timestamp = timestamp;
337
- gyroEvent->gyro .x = gyroData.x * _gyro_dps_digit;
338
- gyroEvent->gyro .y = gyroData.y * _gyro_dps_digit;
339
- gyroEvent->gyro .z = gyroData.z * _gyro_dps_digit;
340
- }
341
-
342
- /* Update the temperature data */
343
- if (tempEvent) {
344
- tempEvent->version = sizeof (sensors_event_t );
345
- tempEvent->sensor_id = _lsm9dso_sensorid_temp;
346
- tempEvent->type = SENSOR_TYPE_AMBIENT_TEMPERATURE;
347
- tempEvent->timestamp = timestamp;
348
- tempEvent->temperature = temperature;
349
- // tempEvent->temperature /= LSM9DS0_TEMP_LSB_DEGREE_CELSIUS;
350
- }
320
+ /* Update appropriate sensor events. */
321
+ if (accelEvent) getAccelEvent (accelEvent, timestamp);
322
+ if (magEvent) getMagEvent (magEvent, timestamp);
323
+ if (gyroEvent) getGyroEvent (gyroEvent, timestamp);
324
+ if (tempEvent) getTempEvent (tempEvent, timestamp);
351
325
}
352
326
353
327
/* *************************************************************************/
@@ -358,55 +332,11 @@ void Adafruit_LSM9DS0::getEvent(sensors_event_t *accelEvent,
358
332
void Adafruit_LSM9DS0::getSensor (sensor_t *accel, sensor_t *mag,
359
333
sensor_t *gyro, sensor_t *temp )
360
334
{
361
- /* Clear the sensor_t objects */
362
- memset (accel, 0 , sizeof (sensor_t ));
363
- memset (mag, 0 , sizeof (sensor_t ));
364
- memset (gyro, 0 , sizeof (sensor_t ));
365
- memset (temp, 0 , sizeof (sensor_t ));
366
-
367
- /* Insert the sensor name in the fixed length char array */
368
- strncpy (accel->name , " LSM9DS0_A" , sizeof (accel->name ) - 1 );
369
- accel->name [sizeof (accel->name )- 1 ] = 0 ;
370
- accel->version = 1 ;
371
- accel->sensor_id = _lsm9dso_sensorid_accel;
372
- accel->type = SENSOR_TYPE_ACCELEROMETER;
373
- accel->min_delay = 0 ;
374
- accel->max_value = 0.0 ; // ToDo
375
- accel->min_value = 0.0 ; // ToDo
376
- accel->resolution = 0.0 ; // ToDo
377
-
378
- /* Insert the sensor name in the fixed length char array */
379
- strncpy (mag->name , " LSM9DS0_M" , sizeof (mag->name ) - 1 );
380
- mag->name [sizeof (mag->name )- 1 ] = 0 ;
381
- mag->version = 1 ;
382
- mag->sensor_id = _lsm9dso_sensorid_mag;
383
- mag->type = SENSOR_TYPE_MAGNETIC_FIELD;
384
- mag->min_delay = 0 ;
385
- mag->max_value = 0.0 ; // ToDo
386
- mag->min_value = 0.0 ; // ToDo
387
- mag->resolution = 0.0 ; // ToDo
388
-
389
- /* Insert the sensor name in the fixed length char array */
390
- strncpy (gyro->name , " LSM9DS0_G" , sizeof (gyro->name ) - 1 );
391
- gyro->name [sizeof (gyro->name )- 1 ] = 0 ;
392
- gyro->version = 1 ;
393
- gyro->sensor_id = _lsm9dso_sensorid_gyro;
394
- gyro->type = SENSOR_TYPE_GYROSCOPE;
395
- gyro->min_delay = 0 ;
396
- gyro->max_value = 0.0 ; // ToDo
397
- gyro->min_value = 0.0 ; // ToDo
398
- gyro->resolution = 0.0 ; // ToDo
399
-
400
- /* Insert the sensor name in the fixed length char array */
401
- strncpy (temp->name , " LSM9DS0_T" , sizeof (temp->name ) - 1 );
402
- temp->name [sizeof (temp->name )- 1 ] = 0 ;
403
- temp->version = 1 ;
404
- temp->sensor_id = _lsm9dso_sensorid_temp;
405
- temp->type = SENSOR_TYPE_AMBIENT_TEMPERATURE;
406
- temp->min_delay = 0 ;
407
- temp->max_value = 0.0 ; // ToDo
408
- temp->min_value = 0.0 ; // ToDo
409
- temp->resolution = 0.0 ; // ToDo
335
+ /* Update appropriate sensor metadata. */
336
+ if (accel) getAccelSensor (accel);
337
+ if (mag) getMagSensor (mag);
338
+ if (gyro) getGyroSensor (gyro);
339
+ if (temp) getTempSensor (temp);
410
340
}
411
341
412
342
/* **************************************************************************
@@ -516,3 +446,104 @@ uint8_t Adafruit_LSM9DS0::spixfer(uint8_t data) {
516
446
return reply;
517
447
}
518
448
}
449
+
450
+ void Adafruit_LSM9DS0::getAccelEvent (sensors_event_t * event, uint32_t timestamp) {
451
+ memset (event, 0 , sizeof (sensors_event_t ));
452
+ event->version = sizeof (sensors_event_t );
453
+ event->sensor_id = _lsm9dso_sensorid_accel;
454
+ event->type = SENSOR_TYPE_ACCELEROMETER;
455
+ event->timestamp = timestamp;
456
+ event->acceleration .x = accelData.x * _accel_mg_lsb;
457
+ event->acceleration .x /= 1000 ;
458
+ event->acceleration .y = accelData.y * _accel_mg_lsb;
459
+ event->acceleration .y /= 1000 ;
460
+ event->acceleration .z = accelData.z * _accel_mg_lsb;
461
+ event->acceleration .z /= 1000 ;
462
+ }
463
+
464
+ void Adafruit_LSM9DS0::getMagEvent (sensors_event_t * event, uint32_t timestamp) {
465
+ memset (event, 0 , sizeof (sensors_event_t ));
466
+ event->version = sizeof (sensors_event_t );
467
+ event->sensor_id = _lsm9dso_sensorid_mag;
468
+ event->type = SENSOR_TYPE_MAGNETIC_FIELD;
469
+ event->timestamp = timestamp;
470
+ event->magnetic .x = magData.x * _mag_mgauss_lsb;
471
+ event->magnetic .x /= 1000 ;
472
+ event->magnetic .y = magData.y * _mag_mgauss_lsb;
473
+ event->magnetic .y /= 1000 ;
474
+ event->magnetic .z = magData.z * _mag_mgauss_lsb;
475
+ event->magnetic .z /= 1000 ;
476
+ }
477
+
478
+ void Adafruit_LSM9DS0::getGyroEvent (sensors_event_t * event, uint32_t timestamp) {
479
+ memset (event, 0 , sizeof (sensors_event_t ));
480
+ event->version = sizeof (sensors_event_t );
481
+ event->sensor_id = _lsm9dso_sensorid_accel;
482
+ event->type = SENSOR_TYPE_GYROSCOPE;
483
+ event->timestamp = timestamp;
484
+ event->gyro .x = gyroData.x * _gyro_dps_digit;
485
+ event->gyro .y = gyroData.y * _gyro_dps_digit;
486
+ event->gyro .z = gyroData.z * _gyro_dps_digit;
487
+ }
488
+
489
+ void Adafruit_LSM9DS0::getTempEvent (sensors_event_t * event, uint32_t timestamp) {
490
+ memset (event, 0 , sizeof (sensors_event_t ));
491
+ event->version = sizeof (sensors_event_t );
492
+ event->sensor_id = _lsm9dso_sensorid_temp;
493
+ event->type = SENSOR_TYPE_AMBIENT_TEMPERATURE;
494
+ event->timestamp = timestamp;
495
+ event->temperature = temperature;
496
+ // event->temperature /= LSM9DS0_TEMP_LSB_DEGREE_CELSIUS;
497
+ }
498
+
499
+ void Adafruit_LSM9DS0::getAccelSensor (sensor_t * sensor) {
500
+ memset (sensor, 0 , sizeof (sensor_t ));
501
+ strncpy (sensor->name , " LSM9DS0_A" , sizeof (sensor->name ) - 1 );
502
+ sensor->name [sizeof (sensor->name )- 1 ] = 0 ;
503
+ sensor->version = 1 ;
504
+ sensor->sensor_id = _lsm9dso_sensorid_accel;
505
+ sensor->type = SENSOR_TYPE_ACCELEROMETER;
506
+ sensor->min_delay = 0 ;
507
+ sensor->max_value = 0.0 ; // ToDo
508
+ sensor->min_value = 0.0 ; // ToDo
509
+ sensor->resolution = 0.0 ; // ToDo
510
+ }
511
+
512
+ void Adafruit_LSM9DS0::getMagSensor (sensor_t * sensor) {
513
+ memset (sensor, 0 , sizeof (sensor_t ));
514
+ strncpy (sensor->name , " LSM9DS0_M" , sizeof (sensor->name ) - 1 );
515
+ sensor->name [sizeof (sensor->name )- 1 ] = 0 ;
516
+ sensor->version = 1 ;
517
+ sensor->sensor_id = _lsm9dso_sensorid_mag;
518
+ sensor->type = SENSOR_TYPE_MAGNETIC_FIELD;
519
+ sensor->min_delay = 0 ;
520
+ sensor->max_value = 0.0 ; // ToDo
521
+ sensor->min_value = 0.0 ; // ToDo
522
+ sensor->resolution = 0.0 ; // ToDo
523
+ }
524
+
525
+ void Adafruit_LSM9DS0::getGyroSensor (sensor_t * sensor) {
526
+ memset (sensor, 0 , sizeof (sensor_t ));
527
+ strncpy (sensor->name , " LSM9DS0_G" , sizeof (sensor->name ) - 1 );
528
+ sensor->name [sizeof (sensor->name )- 1 ] = 0 ;
529
+ sensor->version = 1 ;
530
+ sensor->sensor_id = _lsm9dso_sensorid_gyro;
531
+ sensor->type = SENSOR_TYPE_GYROSCOPE;
532
+ sensor->min_delay = 0 ;
533
+ sensor->max_value = 0.0 ; // ToDo
534
+ sensor->min_value = 0.0 ; // ToDo
535
+ sensor->resolution = 0.0 ; // ToDo
536
+ }
537
+
538
+ void Adafruit_LSM9DS0::getTempSensor (sensor_t * sensor) {
539
+ memset (sensor, 0 , sizeof (sensor_t ));
540
+ strncpy (sensor->name , " LSM9DS0_T" , sizeof (sensor->name ) - 1 );
541
+ sensor->name [sizeof (sensor->name )- 1 ] = 0 ;
542
+ sensor->version = 1 ;
543
+ sensor->sensor_id = _lsm9dso_sensorid_temp;
544
+ sensor->type = SENSOR_TYPE_AMBIENT_TEMPERATURE;
545
+ sensor->min_delay = 0 ;
546
+ sensor->max_value = 0.0 ; // ToDo
547
+ sensor->min_value = 0.0 ; // ToDo
548
+ sensor->resolution = 0.0 ; // ToDo
549
+ }
0 commit comments